{"version":3,"file":"static/js/main.8678901a.js","mappings":"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BACT,KAAK,KACH,MAAO,uBACT,KAAK,KACH,MAAO,2BACT,KAAK,KACH,MAAO,qCACT,KAAK,KACH,MAAO,gCACT,KAAK,KACH,MAAO,iCACT,KAAK,KACH,MAAO,6BACT,KAAK,KACH,MAAO,iCACT,KAAK,KACH,MAAO,+BACT,KAAK,KACH,MAAO,0DACT,KAAK,KACH,MAAO,uCACT,KAAK,KACH,MAAO,yCACT,KAAK,KACH,MAAO,8BACT,KAAK,KACH,MAAO,iCACT,KAAK,KACH,MAAO,2BACT,KAAK,KACH,MAAO,yBACT,KAAK,KACH,MAAO,aACT,KAAK,KACH,MAAO,kCACT,KAAK,KACH,MAAO,mBACT,KAAK,KACH,MAAO,4BACT,KAAK,KACH,MAAO,kBACT,KAAK,KACH,MAAO,kBACT,KAAK,KACH,MAAO,mBACT,KAAK,KACH,MAAO,kBACT,KAAK,KACH,MAAO,6BACT,KAAK,KACH,MAAO,mBACT,KAAK,IACH,MAAO,sBACT,KAAK,KACH,MAAO,cACT,KAAK,KACH,MAAO,sBACT,KAAK,KACH,MAAO,gBACT,KAAK,KACH,MAAO,yBACT,KAAK,KACH,MAAO,4BACT,KAAK,IACH,MAAO,mBACT,KAAK,KACH,MAAO,iCACT,KAAK,KACH,MAAO,qBACT,KAAK,KACH,MAAO,wBACT,KAAK,KACH,MAAO,qBACT,KAAK,KACH,MAAO,gCACT,KAAK,KACH,MAAO,+BACT,KAAK,KACH,MAAO,uBACT,KAAK,KACH,MAAO,sBACT,KAAK,KACH,MAAO,iCACT,KAAK,KACH,MAAO,6BACT,KAAK,KACH,MAAO,8BACT,KAAK,KACH,MAAO,0BACT,KAAK,KACH,MAAO,kCACT,KAAK,KACH,MAAO,oBACT,KAAK,KACH,MAAO,2BACT,KAAK,KACH,MAAO,0BACT,KAAK,IACH,MAAO,4BACT,KAAK,KACH,MAAO,cACT,KAAK,KACH,MAAO,mBACT,KAAK,KACH,MAAO,oBACT,KAAK,KACH,MAAO,mBACT,KAAK,KACH,MAAO,0BACT,KAAK,KACH,MAAO,oBACT,KAAK,KACH,MAAO,2BACT,KAAK,KACH,MAAO,uBACT,K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,EAAiBr1D,KAAK21D,GAAAA,GAA2B,CACtDH,UACAC,SACAL,SACAl+D,QACAkT,KAAKwrD,EAAAA,GAAAA,IAAed,EAAQ,CAAEwpO,gBAAgBpnS,IAC9C,EA0COmnS,CAAkCz1R,EAAMo1R,EAAkBC,EAAiBF,EAAmB7mS,EAAOm+D,EAAkBD,EAAO,EChDzI,GAjBEmpO,CAAC3jN,EAAe/nE,EAAMuiD,IACtB,CAACzyD,EAAoBqkC,EAAkCquB,KACrD,MAAMn+D,EAAQ8vC,IAEd,OAAOquB,EAAiBr1D,KAAKw+R,GAAAA,GAAmC,CAC9DppO,SACAhrD,KAAKwrD,EAAAA,GAAAA,IACHglB,EACA,CACExd,QAASvqD,EAAKxe,GACdwe,QAEF3b,IAEF,kBCVN,IAAIunS,GAAmB,KAEvB,MAoCMxmS,GAAwBA,KACvBwmS,GAKLA,GAAiBxmS,aAJfmzB,EAAAA,EAAAA,IAAQ,4BAIkB,EAGxBszQ,GAAyDxyR,IAC7D,MAAMgC,EAA2B,kBAAVhC,EAAqBA,EAAQA,EAAMgC,QAC1DnO,EAAAA,UAAUC,KAAKC,EAAAA,gBAAgBuzE,cAAc35E,EAAAA,EAAAA,KAAA,OAAA9D,SAAMmY,IAAe,ECzD9DywR,GAAsB,CAE1B,CACEzyF,OAAQ,CACN,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,WACA,WACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,WACA,WACA,WACA,IACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,WACA,WACA,WACA,IACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAEF13L,KAAM,CAAE1Q,OAAQ,GAAIC,MAAO,KAG7B,CACEmoM,OAAQ,CACN,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,WACA,WACA,WACA,IACA,IACA,WACA,WACA,WACA,IACA,WACA,WACA,WACA,IACA,IACA,IACA,WACA,WACA,IACA,IACA,WACA,WACA,IACA,IACA,IACA,YAEF13L,KAAM,CAAE1Q,OAAQ,GAAIC,MAAO,KAG7B,CACEmoM,OAAQ,CACN,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,WACA,WACA,WACA,WACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,WACA,IACA,WACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,IACA,IACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAEF13L,KAAM,CAAE1Q,OAAQ,GAAIC,MAAO,KAG7B,CACEmoM,OAAQ,CACN,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,WACA,WACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,WACA,WACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,WACA,IACA,IACA,IACA,WACA,IACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,WACA,IACA,WACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,WACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,WACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,IACA,WACA,WACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,WACA,WACA,IACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,IACA,IACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,WACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,WACA,WACA,WACA,IACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,IACA,WACA,WACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,WACA,WACA,WACA,IACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,IACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,IACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,IACA,IACA,WACA,WACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAEF13L,KAAM,CAAE1Q,OAAQ,GAAIC,MAAO,KAG7B,CACEmoM,OAAQ,CACN,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,IACA,IACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,IACA,IACA,IACA,WACA,WACA,IACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,WACA,IACA,IACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,WACA,IACA,IACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,WACA,IACA,IACA,WACA,IACA,WACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,WACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,WACA,WACA,WACA,WACA,IACA,IACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,IACA,IACA,WACA,IACA,IACA,WACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,WACA,WACA,WACA,IACA,IACA,WACA,WACA,IACA,IACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,WACA,WACA,WACA,IACA,WACA,WACA,IACA,IACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,WACA,IACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,WACA,WACA,WACA,IACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,IACA,IACA,WACA,WACA,IACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,IACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,IACA,WACA,WACA,IACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,IACA,IACA,WACA,WACA,WACA,IACA,IACA,IACA,WACA,IACA,IACA,WACA,WACA,WACA,WACA,IACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,WACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,IACA,IACA,WACA,IACA,WACA,IACA,IACA,IACA,IACA,IACA,WACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,IACA,WACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,IACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,WACA,WACA,WACA,WACA,WACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,I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MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MACpE,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MACpE,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MACpE,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MACpE,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MACpE,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MACpE,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MACpE,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MACpE,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MACpE,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MACpE,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MACpE,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MACpE,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MACpE,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MACpE,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MACpE,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MACpE,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MACpE,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MACpE,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MACpE,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MACpE,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MACpE,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MACpE,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MACpE,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MACpE,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MACpE,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MACpE,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MACpE,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MACpE,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MACpE,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MACpE,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MACpE,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO,MAAO,CAAC,MAAO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","sources":["components/avenue/section/SectionConstsAndTypes.js","components/buttons/ButtonFX.js","components/buttons/types.js","components/loader/circleLoader.js","components/loader/infiniteCircleLoader.js","components/modal/confirmationModal/ConfirmationModal.js","components/modal/modal.js","components/modal/modalTypes.js","components/multipleChoices/MultipleChoices.js","components/player/helper.js","components/player/implementation/shakaStorage.js","components/player/implementation/types.js","webpack://@ntg/core/./src/components/progressBar/ProgressBar.module.css?f107","components/progressBar/ProgressBar.js","../node_modules/react-resize-detector/src/useResizeDetector.ts","../node_modules/react-resize-detector/src/utils.ts","components/resizeDetectorWrapper/ResizeDetectorWrapper.js","helpers/applicationCustomization/types.js","../../ntg-francechannel/dist/assets/images/header-logo.svg","../../ntg-gaumont/dist/assets/images/header-logo.svg","../../ntg-myvideofutur/dist/assets/images/header-logo.svg","../../ntg-post/dist/assets/images/header-logo.svg","../../ntg-premiere/dist/assets/images/header-logo.svg","../../ntg-viva/dist/assets/images/header-logo.svg","../../ntg-zeoptv/dist/assets/images/header-logo.svg","../../ntg-francechannel/dist/assets/images/mobile-app-logo.svg","../../ntg-gaumont/dist/assets/images/mobile-app-logo.svg","../../ntg-myvideofutur/dist/assets/images/mobile-app-logo.svg","../../ntg-post/dist/assets/images/mobile-app-logo.svg","../../ntg-premiere/dist/assets/images/mobile-app-logo.svg","../../ntg-viva/dist/assets/images/mobile-app-logo.svg","../../ntg-zeoptv/dist/assets/images/mobile-app-logo.svg","../../ntg-francechannel/dist/assets/images/store-logo-apple-en.svg","../../ntg-gaumont/dist/assets/images/store-logo-apple-fr.svg","../../ntg-myvideofutur/dist/assets/images/store-logo-apple-fr.svg","../../ntg-post/dist/assets/images/store-logo-apple-fr.svg","../../ntg-premiere/dist/assets/images/store-logo-apple-fr.svg","../../ntg-viva/dist/assets/images/store-logo-apple-fr.svg","../../ntg-zeoptv/dist/assets/images/store-logo-apple-fr.svg","../../ntg-francechannel/dist/assets/images/store-logo-google-en.svg","../../ntg-gaumont/dist/assets/images/store-logo-google-fr.svg","../../ntg-myvideofutur/dist/assets/images/store-logo-google-fr.svg","../../ntg-post/dist/assets/images/store-logo-google-fr.svg","../../ntg-premiere/dist/assets/images/store-logo-google-fr.svg","../../ntg-viva/dist/assets/images/store-logo-google-fr.svg","../../ntg-zeoptv/dist/assets/images/store-logo-google-fr.svg","helpers/applicationCustomization/ui.js","helpers/channel/helper.js","helpers/consent/didomi.js","helpers/dateTime/AccurateTimestamp.js","helpers/dateTime/Format.js","helpers/debug/debug.js","helpers/hotKeys/hotKeys.js","helpers/hotKeys/keysDefinition.js","helpers/jsHelpers/Drm.js","helpers/jsHelpers/parser.js","helpers/jsHelpers/promise.js","helpers/loadable/loadable.js","helpers/localStorage/keys.js","helpers/localStorage/localStorageManager.js","helpers/maths/maths.js","helpers/mediametrie/mu-7.3.1.js","helpers/npvr/scheduledRecording.js","helpers/playerError/PlayerError.js","helpers/request/cache.js","helpers/settings/subtitles.js","helpers/settings/types.js","helpers/ui/avenue/types.js","helpers/ui/browser.js","helpers/ui/constants.js","helpers/ui/item/distributor.js","helpers/ui/item/types.js","helpers/ui/language.js","helpers/ui/location/Format.js","libs/netgemLibrary/v8/types/Lang.js","helpers/ui/metadata/Format.js","helpers/ui/metadata/Types.js","helpers/ui/section/comparisons.js","helpers/ui/section/types.js","helpers/videofutur/metadata.js","helpers/wishlist/WishlistCache.js","helpers/rights/pendingOperations.js","helpers/jsHelpers/xhr.js","redux/appRegistration/constants/index.js","redux/appRegistration/actions/index.js","components/loader/infiniteCircleLoaderArc.js","../node_modules/@didomi/react/es/index.js","helpers/jsHelpers/dataStructure.js","helpers/epg/helper.js","redux/netgemApi/actions/v8/epg.js","helpers/epg/epgManager.js","libs/netgemLibrary/v8/types/Feed.js","redux/netgemApi/actions/v8/hub.js","helpers/ui/avenue/constants.js","components/buttons/ButtonBack.js","components/searchHistory/SearchHistoryTerm.js","components/searchHistory/SearchHistory.js","libs/netgemLibrary/v8/types/Section.js","components/avenue/sortAndFilter/type.js","components/avenue/section/helper.js","helpers/ui/section/tile.js","components/avenue/item/ItemConstsAndTypes.js","helpers/viewingHistory/ViewingHistory.js","components/avenue/item/helper.js","components/watchingStatus/WatchingStatus.js","components/avenue/item/ItemDecorationHelper.js","components/avenue/item/ItemDecoration.js","components/avenue/item/ItemOverlayConstsAndTypes.js","helpers/videofutur/pack.js","components/buttons/ButtonFXBicolor.js","components/pricingVod/PricingVod.js","components/modal/npvrModal/NpvrModal.js","helpers/npvr/Types.js","helpers/npvr/Constants.js","helpers/npvr/recording.js","redux/netgemApi/actions/v8/recorder.js","libs/netgemLibrary/v8/types/Rights.js","helpers/rights/rights.js","components/recordButton/RecordButton.js","helpers/rights/record.js","helpers/rights/wishlist.js","webpack://@ntg/core/./src/components/textScroller/TextScroller.module.scss?ad51","components/textScroller/TextScroller.js","redux/netgemApi/actions/videofutur/addFavorite.js","helpers/ui/item/time.js","helpers/rights/playback.js","components/avenue/item/ItemOverlay.js","helpers/ui/metadata/Exclusion.js","helpers/debug/deeplink.js","redux/netgemApi/actions/v8/purchaseInfo.js","libs/netgemLibrary/v8/helpers/CatchupForAsset.js","redux/netgemApi/actions/v8/catchupForAsset.js","components/avenue/item/Item.js","components/avenue/item/PlaceholderItem.js","components/avenue/sortAndFilter/SortAndFilter.js","../node_modules/react-swipeable/src/types.ts","../node_modules/react-swipeable/src/index.ts","components/swipeable/swipeable.js","helpers/viewingHistory/ViewingHistoryCache.js","helpers/ui/section/Pagination.js","redux/netgemApi/actions/v8/epgForAsset.js","redux/netgemApi/actions/v8/vodForAsset.js","redux/netgemApi/actions/v8/feed.js","components/avenue/section/Section.js","components/avenue/sectionCarousel/SectionConstsAndTypes.js","helpers/ui/metadata/image.js","components/equalizer/Equalizer.js","components/avenue/sectionCarousel/ItemIndex.js","components/statusPicto/StatusPicto.js","helpers/ui/item/channel.js","helpers/ui/item/metadata.js","components/avenue/sectionCarousel/Slide.js","components/avenue/sectionCarousel/Section.js","components/avenue/sectionChannelGrid/Section.js","components/avenue/sectionChannelGroup/Section.js","helpers/search/search.js","helpers/search/constants.js","components/avenue/Avenue.js","components/errorBoundary/ErrorBoundary.js","components/footer/Footer.js","components/header/HeaderHelper.js","components/navigationMenu/Item.js","components/navigationMenu/NavigationMenu.js","components/search/SearchBox.js","components/header/UserMenu.js","components/header/Header.js","components/header/HeaderConstsAndTypes.js","components/carousel/ImageCarousel.js","helpers/ui/types.js","helpers/ui/player.js","components/player/constantsAndTypes.js","libs/netgemLibrary/v8/types/DataCollection.js","components/player/keepAlive.js","libs/netgemLibrary/v8/types/Channel.js","helpers/debug/sentryTypes.js","components/player/implementation/shakaTypes.js","redux/netgemApi/actions/dataCollection/post.js","../node_modules/detect-browser/es/index.js","helpers/jsHelpers/environment.js","redux/netgemApi/actions/dataCollection/getCollectorId.js","helpers/dataCollection/collector.js","helpers/mediaSession/mediaController.js","helpers/mediametrie/types.js","helpers/mediametrie/Mediametrie.js","components/player/implementation/shakaHelpers.js","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils-hoist/worldwide.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils-hoist/time.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils-hoist/version.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/carrier.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils-hoist/is.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils-hoist/browser.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils-hoist/debug-build.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils-hoist/logger.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils-hoist/string.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils-hoist/object.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils-hoist/misc.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/session.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils-hoist/propagationContext.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils/merge.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils/spanOnScope.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/scope.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/asyncContext/stackStrategy.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/defaultScopes.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/asyncContext/index.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/currentScopes.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/semanticAttributes.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/tracing/spanstatus.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/tracing/utils.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils/parseSampleRate.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils-hoist/baggage.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils-hoist/tracing.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils/spanUtils.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/debug-build.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/tracing/measurement.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils-hoist/url.ts","../node_modules/@sentry/browser/node_modules/@sentry-internal/browser-utils/src/types.ts","../node_modules/@sentry/browser/node_modules/@sentry-internal/browser-utils/src/debug-build.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils-hoist/stacktrace.ts","../node_modules/@sentry/browser/node_modules/@sentry-internal/browser-utils/src/metrics/web-vitals/lib/bindReporter.ts","../node_modules/@sentry/browser/node_modules/@sentry-internal/browser-utils/src/metrics/web-vitals/lib/getNavigationEntry.ts","../node_modules/@sentry/browser/node_modules/@sentry-internal/browser-utils/src/metrics/web-vitals/lib/getActivationStart.ts","../node_modules/@sentry/browser/node_modules/@sentry-internal/browser-utils/src/metrics/web-vitals/lib/initMetric.ts","../node_modules/@sentry/browser/node_modules/@sentry-internal/browser-utils/src/metrics/web-vitals/lib/generateUniqueID.ts","../node_modules/@sentry/browser/node_modules/@sentry-internal/browser-utils/src/metrics/web-vitals/lib/observe.ts","../node_modules/@sentry/browser/node_modules/@sentry-internal/browser-utils/src/metrics/web-vitals/lib/onHidden.ts","../node_modules/@sentry/browser/node_modules/@sentry-internal/browser-utils/src/metrics/web-vitals/lib/runOnce.ts","../node_modules/@sentry/browser/node_modules/@sentry-internal/browser-utils/src/metrics/web-vitals/lib/getVisibilityWatcher.ts","../node_modules/@sentry/browser/node_modules/@sentry-internal/browser-utils/src/metrics/web-vitals/lib/whenActivated.ts","../node_modules/@sentry/browser/node_modules/@sentry-internal/browser-utils/src/metrics/web-vitals/onFCP.ts","../node_modules/@sentry/browser/node_modules/@sentry-internal/browser-utils/src/metrics/web-vitals/getCLS.ts","../node_modules/@sentry/browser/node_modules/@sentry-internal/browser-utils/src/metrics/web-vitals/getFID.ts","../node_modules/@sentry/browser/node_modules/@sentry-internal/browser-utils/src/metrics/web-vitals/lib/polyfills/interactionCountPolyfill.ts","../node_modules/@sentry/browser/node_modules/@sentry-internal/browser-utils/src/metrics/web-vitals/lib/interactions.ts","../node_modules/@sentry/browser/node_modules/@sentry-internal/browser-utils/src/metrics/web-vitals/lib/whenIdle.ts","../node_modules/@sentry/browser/node_modules/@sentry-internal/browser-utils/src/metrics/web-vitals/getINP.ts","../node_modules/@sentry/browser/node_modules/@sentry-internal/browser-utils/src/metrics/web-vitals/getLCP.ts","../node_modules/@sentry/browser/node_modules/@sentry-internal/browser-utils/src/metrics/web-vitals/onTTFB.ts","../node_modules/@sentry/browser/node_modules/@sentry-internal/browser-utils/src/metrics/instrument.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils/hasSpansEnabled.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/constants.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/tracing/dynamicSamplingContext.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/tracing/sentryNonRecordingSpan.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils-hoist/dsn.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils-hoist/normalize.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils-hoist/envelope.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/envelope.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/tracing/sentrySpan.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/tracing/logSpans.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/tracing/trace.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/tracing/sampling.ts","../node_modules/@sentry/browser/node_modules/@sentry-internal/browser-utils/src/metrics/utils.ts","../node_modules/@sentry/browser/node_modules/@sentry-internal/browser-utils/src/metrics/cls.ts","../node_modules/@sentry/browser/node_modules/@sentry-internal/browser-utils/src/metrics/browserMetrics.ts","../node_modules/@sentry/browser/node_modules/@sentry-internal/browser-utils/src/metrics/inp.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils-hoist/instrument/handlers.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils-hoist/supports.ts","../node_modules/@sentry/browser/node_modules/@sentry-internal/browser-utils/src/instrument/history.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/tracing/idleSpan.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils-hoist/instrument/globalError.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils-hoist/instrument/globalUnhandledRejection.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/tracing/errors.ts","../node_modules/@sentry/browser/src/debug-build.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils-hoist/syncpromise.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/eventProcessors.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils-hoist/debug-ids.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils/applyScopeDataToEvent.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils/prepareEvent.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/exports.ts","../node_modules/@sentry/browser/src/helpers.ts","../node_modules/@sentry/browser/node_modules/@sentry-internal/browser-utils/src/instrument/xhr.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils-hoist/instrument/fetch.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils/traceData.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/fetch.ts","../node_modules/@sentry/browser/src/tracing/request.ts","../node_modules/@sentry/browser/src/tracing/previousTrace.ts","../node_modules/@sentry/browser/src/tracing/browserTracingIntegration.ts","../node_modules/@sentry/browser/src/tracing/backgroundtab.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/integration.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils/eventUtils.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/integrations/eventFilters.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/integrations/functiontostring.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/integrations/dedupe.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/sdk.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/api.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils-hoist/error.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/client.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils/transactionEvent.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils-hoist/clientreport.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils/ipAddress.ts","../node_modules/@sentry/browser/src/eventbuilder.ts","../node_modules/@sentry/browser/src/client.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils/sdkMetadata.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils-hoist/env.ts","../node_modules/@sentry/browser/node_modules/@sentry-internal/browser-utils/src/instrument/dom.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils-hoist/instrument/console.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/breadcrumbs.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils-hoist/severity.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils-hoist/breadcrumb-log-level.ts","../node_modules/@sentry/browser/src/integrations/breadcrumbs.ts","../node_modules/@sentry/browser/src/integrations/browserapierrors.ts","../node_modules/@sentry/browser/src/integrations/browsersession.ts","../node_modules/@sentry/browser/src/integrations/globalhandlers.ts","../node_modules/@sentry/browser/src/integrations/httpcontext.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils-hoist/aggregate-errors.ts","../node_modules/@sentry/browser/src/integrations/linkederrors.ts","../node_modules/@sentry/browser/src/stack-parsers.ts","../node_modules/@sentry/browser/node_modules/@sentry-internal/browser-utils/src/getNativeImplementation.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils-hoist/promisebuffer.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/utils-hoist/ratelimit.ts","../node_modules/@sentry/browser/node_modules/@sentry/core/src/transports/base.ts","../node_modules/@sentry/browser/src/transports/fetch.ts","../node_modules/@sentry/browser/src/sdk.ts","../node_modules/@sentry/react/node_modules/@sentry/core/src/utils-hoist/version.ts","../node_modules/@sentry/react/src/sdk.ts","../node_modules/@sentry/react/node_modules/@sentry/core/src/utils/sdkMetadata.ts","helpers/debug/sentry.js","components/player/implementation/playerShaka.js","components/player/controller/zapper/Channel.js","components/player/controller/zapper/ChannelZapper.js","components/player/controller/progressBar/empty/EmptyProgressBar.js","components/player/controller/progressBar/live/LiveProgressBar.js","components/player/controller/options/Options.js","components/player/controller/volume/Volume.js","components/player/controller/progressBar/standard/StandardProgressBar.js","components/player/controller/progressBar/Common.js","components/player/controller/PlayerController.js","redux/netgemApi/actions/helpers/bo.js","../node_modules/fscreen/src/fscreen.js","redux/netgemApi/actions/videofutur/purchaseList.js","redux/netgemApi/actions/videofutur/helpers/purchaseList.js","redux/netgemApi/actions/videofutur/helpers/subtitles.js","redux/netgemApi/actions/videofutur/createStream.js","redux/netgemApi/actions/videofutur/purchase.js","../../../node_modules/@babel/runtime/helpers/esm/typeof.js","../../../node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","../../../node_modules/@babel/runtime/helpers/esm/toPrimitive.js","../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js","../node_modules/chart.js/node_modules/@kurkle/color/dist/color.esm.js","../node_modules/chart.js/src/helpers/helpers.core.ts","../node_modules/chart.js/src/helpers/helpers.math.ts","../node_modules/chart.js/src/helpers/helpers.collection.ts","../node_modules/chart.js/src/helpers/helpers.extras.ts","../node_modules/chart.js/src/helpers/helpers.easing.ts","../node_modules/chart.js/src/helpers/helpers.color.ts","../node_modules/chart.js/src/core/core.animations.defaults.js","../node_modules/chart.js/src/helpers/helpers.intl.ts","../node_modules/chart.js/src/core/core.ticks.js","../node_modules/chart.js/src/core/core.defaults.js","../node_modules/chart.js/src/core/core.layouts.defaults.js","../node_modules/chart.js/src/core/core.scale.defaults.js","../node_modules/chart.js/src/helpers/helpers.canvas.ts","../node_modules/chart.js/src/helpers/helpers.options.ts","../node_modules/chart.js/src/helpers/helpers.config.ts","../node_modules/chart.js/src/helpers/helpers.curve.ts","../node_modules/chart.js/src/helpers/helpers.dom.ts","../node_modules/chart.js/src/helpers/helpers.interpolation.ts","../node_modules/chart.js/src/helpers/helpers.rtl.ts","../node_modules/chart.js/src/helpers/helpers.segment.js","../node_modules/chart.js/src/core/core.animator.js","../node_modules/chart.js/src/core/core.animation.js","../node_modules/chart.js/src/core/core.animations.js","../node_modules/chart.js/src/core/core.datasetController.js","../node_modules/chart.js/src/controllers/controller.bar.js","../node_modules/chart.js/src/controllers/controller.bubble.js","../node_modules/chart.js/src/controllers/controller.doughnut.js","../node_modules/chart.js/src/controllers/controller.line.js","../node_modules/chart.js/src/controllers/controller.polarArea.js","../node_modules/chart.js/src/controllers/controller.pie.js","../node_modules/chart.js/src/controllers/controller.radar.js","../node_modules/chart.js/src/controllers/controller.scatter.js","../node_modules/chart.js/src/core/core.adapters.ts","../node_modules/chart.js/src/core/core.interaction.js","../node_modules/chart.js/src/core/core.layouts.js","../node_modules/chart.js/src/platform/platform.base.js","../node_modules/chart.js/src/platform/platform.basic.js","../node_modules/chart.js/src/platform/platform.dom.js","../node_modules/chart.js/src/core/core.element.ts","../node_modules/chart.js/src/core/core.scale.autoskip.js","../node_modules/chart.js/src/core/core.scale.js","../node_modules/chart.js/src/core/core.typedRegistry.js","../node_modules/chart.js/src/core/core.registry.js","../node_modules/chart.js/src/core/core.plugins.js","../node_modules/chart.js/src/core/core.config.js","../node_modules/chart.js/src/core/core.controller.js","../node_modules/chart.js/src/platform/index.js","../node_modules/chart.js/src/elements/element.arc.ts","../node_modules/chart.js/src/elements/element.line.js","../node_modules/chart.js/src/elements/element.point.ts","../node_modules/chart.js/src/elements/element.bar.js","../node_modules/chart.js/src/plugins/plugin.subtitle.js","../node_modules/chart.js/src/plugins/plugin.tooltip.js","../node_modules/chart.js/src/scales/scale.category.js","../node_modules/chart.js/src/scales/scale.linearbase.js","../node_modules/chart.js/src/scales/scale.linear.js","../node_modules/chart.js/src/scales/scale.logarithmic.js","../node_modules/chart.js/src/scales/scale.radialLinear.js","../node_modules/chart.js/src/scales/scale.time.js","../node_modules/chart.js/src/scales/scale.timeseries.js","../node_modules/chartjs-adapter-dayjs-3/src/index.ts","../node_modules/react-chartjs-2/src/utils.ts","../node_modules/react-chartjs-2/src/chart.tsx","../node_modules/react-chartjs-2/src/typedCharts.tsx","../node_modules/@robloche/chartjs-plugin-streaming/dist/chartjs-plugin-streaming.esm.js","components/player/Graph.js","components/player/debug.js","redux/netgemApi/actions/videofutur/streamStart.js","redux/netgemApi/actions/videofutur/streamStop.js","redux/netgemApi/actions/ntgEntitlement/get.js","redux/netgemApi/actions/ntgEntitlement/release.js","redux/netgemApi/actions/videofutur/getStreams.js","redux/netgemApi/actions/videofutur/helpers/stopOpenStreams.js","components/player/Player.js","components/player/implementation/metrics.js","redux/netgemApi/actions/videofutur/helpers/purchase.js","components/carousel/VideoCarousel.js","redux/ui/reducers/helpers.js","helpers/rights/userInfo.js","../node_modules/i18next/dist/esm/i18next.js","redux/netgemApi/actions/v8/search.js","redux/netgemApi/actions/v8/deeplink.js","redux/netgemApi/actions/v8/customStrategyRequest.js","helpers/applicationCustomization/externalPaymentSystem.js","helpers/debug/ee.js","components/mainView/MainLayout.js","helpers/ui/avenue/helpers.js","helpers/jsHelpers/metaTag.js","components/mainView/MainView.js","helpers/jsHelpers/robots.js","components/modal/authenticationRequiredModal/AuthenticationRequiredModal.js","components/modal/avenueModal/AvenueModal.js","components/modal/cardModal/CardModalConstsAndTypes.js","components/modal/cardModal/helper.js","components/avenue/sectionSeries/PlaceholderTVEpisode.js","components/avenue/sectionSeries/PlaceholderVodEpisode.js","components/avenue/sectionSeries/TVEpisode.js","components/avenue/sectionSeries/VodEpisode.js","components/avenue/sectionSeries/Section.js","components/modal/cardModal/CardModalAvenue.js","libs/netgemLibrary/v8/types/Credit.js","components/credits/helper.js","helpers/Wikipedia/Types.js","components/link/ExternalLink.js","helpers/Wikipedia/Wikipedia.js","components/credits/Credit.js","components/credits/CreditsByRole.js","components/credits/Credits.js","helpers/jsHelpers/linkedData.js","components/modal/cardModal/CardModal.js","components/modal/externalContentModal/ExternalContentModal.js","components/modal/keyboardShortcutsModal/KeyboardShortcutsModal.js","components/modal/legalNoticeModal/LegalNoticeModal.js","components/modal/messageModal/MessageModal.js","components/modal/newVersionModal/NewVersionModal.js","components/modal/npvrHelpModal/NpvrHelpModal.js","components/player/diagnosis/diagnosis.js","helpers/jsHelpers/url.js","redux/netgemApi/actions/videofutur/purchaseStatus.js","components/modal/vodPurchaseModal/VodPurchaseModal.js","components/modal/modalContainer.js","helpers/notification/types.js","../node_modules/react-toastify/src/style.css","../node_modules/react-toastify/src/utils/propValidator.ts","../node_modules/react-toastify/src/utils/cssTransition.tsx","../node_modules/react-toastify/src/utils/collapseToast.ts","../node_modules/react-toastify/src/utils/mapper.ts","../node_modules/react-toastify/src/components/ProgressBar.tsx","../node_modules/react-toastify/src/core/genToastId.ts","../node_modules/react-toastify/src/core/containerObserver.ts","../node_modules/react-toastify/src/core/store.ts","../node_modules/react-toastify/src/core/toast.ts","../node_modules/react-toastify/src/hooks/useToast.ts","../node_modules/react-toastify/src/hooks/useIsomorphicLayoutEffect.ts","../node_modules/react-toastify/src/components/Icons.tsx","../node_modules/react-toastify/src/components/Toast.tsx","../node_modules/react-toastify/src/components/CloseButton.tsx","../node_modules/react-toastify/src/components/Transitions.tsx","../node_modules/react-toastify/src/components/ToastContainer.tsx","../node_modules/react-toastify/src/hooks/useToastContainer.ts","helpers/notification/notifier.js","helpers/dms/helper.js","../../../node_modules/@babel/runtime/helpers/esm/classPrivateFieldInitSpec.js","../../../node_modules/@babel/runtime/helpers/esm/checkPrivateRedeclaration.js","../../../node_modules/@babel/runtime/helpers/esm/assertClassBrand.js","../../../node_modules/@babel/runtime/helpers/esm/classPrivateFieldGet2.js","../../../node_modules/@babel/runtime/helpers/esm/classPrivateFieldSet2.js","../node_modules/jose/dist/webapi/lib/buffer_utils.js","../node_modules/jose/dist/webapi/util/base64url.js","../node_modules/jose/dist/webapi/lib/base64.js","../node_modules/jose/dist/webapi/util/errors.js","../node_modules/jose/dist/webapi/lib/subtle_dsa.js","../node_modules/jose/dist/webapi/lib/check_key_length.js","../node_modules/jose/dist/webapi/lib/crypto_key.js","../node_modules/jose/dist/webapi/lib/invalid_key_input.js","../node_modules/jose/dist/webapi/lib/get_sign_verify_key.js","../node_modules/jose/dist/webapi/lib/is_disjoint.js","../node_modules/jose/dist/webapi/lib/is_key_like.js","../node_modules/jose/dist/webapi/lib/is_object.js","../node_modules/jose/dist/webapi/lib/is_jwk.js","../node_modules/jose/dist/webapi/lib/check_key_type.js","../node_modules/jose/dist/webapi/lib/validate_crit.js","../node_modules/jose/dist/webapi/lib/jwk_to_key.js","../node_modules/jose/dist/webapi/lib/normalize_key.js","../node_modules/jose/dist/webapi/jws/flattened/sign.js","../node_modules/jose/dist/webapi/lib/sign.js","../node_modules/jose/dist/webapi/jws/compact/sign.js","../node_modules/jose/dist/webapi/lib/epoch.js","../node_modules/jose/dist/webapi/lib/secs.js","../node_modules/jose/dist/webapi/lib/jwt_claims_set.js","../node_modules/jose/dist/webapi/jwt/sign.js","../node_modules/jose/dist/webapi/jws/flattened/verify.js","../node_modules/jose/dist/webapi/lib/validate_algorithms.js","../node_modules/jose/dist/webapi/lib/verify.js","../node_modules/jose/dist/webapi/jwt/verify.js","../node_modules/jose/dist/webapi/jws/compact/verify.js","helpers/crypto/crypto.js","components/mainView/RegistrationView.js","redux/netgemApi/actions/v8/listAlias.js","redux/netgemApi/actions/v8/rights.js","libs/netgemLibrary/dms/constants/NetworkCodesAndMessages.js","redux/netgemApi/actions/dms/channelList.js","redux/netgemApi/actions/dms/deviceSettings.js","redux/netgemApi/actions/dms/login.js","redux/netgemApi/actions/index.js","redux/netgemApi/actions/v8/discovery.js","redux/netgemApi/actions/v8/metadataChannels.js","libs/netgemLibrary/helpers/cancellablePromise/CancellablePromise.js","libs/netgemLibrary/helpers/CommonPromisedXMLHttpRequest.js","libs/netgemLibrary/videofutur/requests/bo.js","redux/netgemApi/actions/videofutur/authentication.js","redux/netgemApi/actions/videofutur/discovery.js","redux/netgemApi/actions/videofutur/helpers/discovery.js","redux/netgemApi/actions/videofutur/personalData.js","components/mainView/StartView.js","helpers/localStorage/optimisticData.js","libs/crm/userInfo.js","redux/netgemApi/actions/crm/userInfo.js","components/mainView/ApplicationContainer.js","helpers/version/version.js","helpers/request/eTag.js","libs/netgemLibrary/v8/helpers/PromisedXMLHttpRequest.js","libs/netgemLibrary/v8/requests/v8.js","libs/netgemLibrary/videofutur/requests/authentication.js","libs/netgemLibrary/videofutur/requests/discovery.js","libs/netgemLibrary/dms/helpers/CreateCommonRequestHeader.js","libs/netgemLibrary/dms/helpers/PromisedXMLHttpRequest.js","libs/netgemLibrary/dms/requests/associatedDevices.js","libs/netgemLibrary/dms/requests/deviceChannels.js","libs/netgemLibrary/dms/requests/deviceSettings.js","libs/netgemLibrary/dms/requests/login.js","libs/netgemLibrary/dms/requests/logout.js","libs/netgemLibrary/dms/requests/quotaPvr.js","libs/netgemLibrary/ntgEntitlement/requests/index.js","libs/netgemLibrary/personalData/requests/get.js","libs/netgemLibrary/personalData/requests/post.js","libs/netgemLibrary/v8/requests/generic.js","libs/netgemLibrary/v8/requests/listAlias.js","libs/netgemLibrary/v8/requests/feed.js","libs/netgemLibrary/index.js","helpers/videofutur/authenticationSettings.js","libs/netgemLibrary/v8/requests/scheduledRecordings.js","libs/netgemLibrary/dataCollection/requests/index.js","helpers/dataCollection/settings.js","redux/netgemApi/actions/emitter.js","../node_modules/react-i18next/node_modules/html-parse-stringify/src/parse.js","../node_modules/react-i18next/dist/es/i18nInstance.js","../node_modules/react-i18next/dist/es/context.js","../node_modules/react-i18next/dist/es/I18nextProvider.js","../node_modules/react-i18next/dist/es/useSSR.js","redux/netgemApi/reducers/index.js","redux/appConf/reducers/index.js","redux/appRegistration/reducers/index.js","redux/modal/reducers/index.js","redux/npvr/reducers/index.js","helpers/settings/defaultValues.js","helpers/settings/settings.js","redux/ui/reducers/index.js","../node_modules/redux/src/utils/formatProdErrorMessage.ts","../node_modules/redux/src/utils/symbol-observable.ts","../node_modules/redux/src/utils/actionTypes.ts","../node_modules/redux/src/utils/isPlainObject.ts","../node_modules/redux/src/createStore.ts","../node_modules/redux/src/combineReducers.ts","../node_modules/redux/src/compose.ts","redux/reducers/index.js","../node_modules/redux-thunk/dist/redux-thunk.mjs","../node_modules/@reduxjs/toolkit/src/devtoolsExtension.ts","../node_modules/@reduxjs/toolkit/src/utils.ts","../node_modules/@reduxjs/toolkit/src/getDefaultMiddleware.ts","../node_modules/@reduxjs/toolkit/src/autoBatchEnhancer.ts","../node_modules/@reduxjs/toolkit/src/getDefaultEnhancers.ts","../node_modules/@reduxjs/toolkit/src/listenerMiddleware/task.ts","../node_modules/@reduxjs/toolkit/src/listenerMiddleware/index.ts","../node_modules/@reduxjs/toolkit/src/combineSlices.ts","../node_modules/@reduxjs/toolkit/src/formatProdErrorMessage.ts","redux/netgemApi/actions/v8/appConfiguration.js","App.js","../node_modules/@reduxjs/toolkit/src/configureStore.ts","../node_modules/redux/src/applyMiddleware.ts","index.js","ku.js","libs/netgemLibrary/helpers/CreateCustomNetworkError.js","libs/netgemLibrary/helpers/CustomNetworkError.js","libs/netgemLibrary/helpers/cancellablePromise/promiseHelper.js","libs/netgemLibrary/personalData/constants/keys.js","libs/netgemLibrary/v8/constants/Headers.js","libs/netgemLibrary/v8/constants/NetworkCodesAndMessages.js","libs/netgemLibrary/v8/helpers/Date.js","libs/netgemLibrary/v8/helpers/Feed.js","libs/netgemLibrary/v8/helpers/Filter.js","libs/netgemLibrary/v8/helpers/Item.js","libs/netgemLibrary/v8/helpers/Lang.js","libs/netgemLibrary/v8/helpers/Npvr.js","libs/netgemLibrary/v8/helpers/RequestHeaders.js","libs/netgemLibrary/v8/helpers/Score.js","libs/netgemLibrary/v8/types/FeedItem.js","libs/netgemLibrary/v8/types/HttpMethod.js","libs/netgemLibrary/v8/types/MetadataProgram.js","libs/netgemLibrary/v8/types/MetadataSchedule.js","libs/netgemLibrary/v8/types/Npvr.js","libs/netgemLibrary/v8/types/Realm.js","libs/netgemLibrary/v8/types/WidgetConfig.js","libs/netgemLibrary/videofutur/types/ErrorCodes.js","redux/appConf/actions/index.js","redux/appConf/constants/index.js","redux/appConf/types/types.js","redux/appRegistration/types/types.js","redux/modal/actions/index.js","redux/modal/constants/index.js","redux/netgemApi/actions/helpers/api.js","helpers/ui/item/traverser.js","redux/netgemApi/actions/helpers/boSettings.js","redux/netgemApi/actions/helpers/settings.js","redux/netgemApi/actions/personalData/get.js","redux/netgemApi/actions/personalData/post.js","redux/netgemApi/actions/personalData/viewingHistory.js","redux/netgemApi/actions/personalData/delete.js","libs/netgemLibrary/v8/types/Wishlist.js","libs/netgemLibrary/v8/helpers/Wishlist.js","redux/netgemApi/actions/personalData/wishlist.js","redux/netgemApi/actions/v8/metadata.js","redux/netgemApi/actions/v8/metadataImage.js","redux/netgemApi/actions/v8/metadataLocation.js","redux/netgemApi/actions/v8/recordings.js","redux/netgemApi/actions/v8/scheduledRecordings.js","redux/netgemApi/actions/videofutur/deleteFavorite.js","redux/netgemApi/actions/videofutur/favoriteList.js","redux/netgemApi/actions/videofutur/helpers/requestCommon.js","redux/netgemApi/actions/videofutur/helpers/headers.js","redux/netgemApi/actions/videofutur/types/common.js","redux/netgemApi/actions/videofutur/types/purchase.js","redux/netgemApi/constants/index.js","redux/npvr/actions/index.js","redux/npvr/constants/index.js","redux/ui/actions/index.js","redux/ui/constants/index.js","../../../node_modules/clsx/dist/clsx.js","../../../node_modules/events/events.js","../../../node_modules/flow-enums-runtime/index.js","../../../node_modules/react/cjs/react.production.min.js","../../../node_modules/react/index.js","../../ntg-components/src/pictos/DebugPicto.js","../../ntg-components/src/pictos/Element.js","../../ntg-components/src/pictos/Picto.js","../node_modules/@didomi/react/node_modules/prop-types/factoryWithThrowingShims.js","../node_modules/@didomi/react/node_modules/prop-types/index.js","../node_modules/@didomi/react/node_modules/prop-types/lib/ReactPropTypesSecret.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/dom-utils/getWindow.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/utils/math.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/utils/userAgent.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/enums.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/utils/orderModifiers.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/utils/debounce.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/createPopper.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/utils/mergeByName.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/modifiers/eventListeners.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/utils/getBasePlacement.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/utils/getVariation.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/utils/computeOffsets.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/modifiers/computeStyles.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/modifiers/applyStyles.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/modifiers/offset.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/dom-utils/contains.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/utils/rectToClientRect.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/utils/expandToHashMap.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/utils/detectOverflow.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/utils/within.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/utils/getAltAxis.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/modifiers/arrow.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/modifiers/hide.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/popper.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/modifiers/flip.js","../node_modules/@tippyjs/react/node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","../node_modules/@tippyjs/react/node_modules/tippy.js/src/constants.ts","../node_modules/@tippyjs/react/node_modules/tippy.js/src/utils.ts","../node_modules/@tippyjs/react/node_modules/tippy.js/src/dom-utils.ts","../node_modules/@tippyjs/react/node_modules/tippy.js/src/bindGlobalEventListeners.ts","../node_modules/@tippyjs/react/node_modules/tippy.js/src/browser.ts","../node_modules/@tippyjs/react/node_modules/tippy.js/src/props.ts","../node_modules/@tippyjs/react/node_modules/tippy.js/src/template.ts","../node_modules/@tippyjs/react/node_modules/tippy.js/src/createTippy.ts","../node_modules/@tippyjs/react/node_modules/tippy.js/src/index.ts","../node_modules/@tippyjs/react/node_modules/tippy.js/src/addons/createSingleton.ts","../node_modules/@tippyjs/react/node_modules/tippy.js/build/base.js","../node_modules/@tippyjs/react/src/utils.js","../node_modules/@tippyjs/react/src/util-hooks.js","../node_modules/@tippyjs/react/src/className-plugin.js","../node_modules/@tippyjs/react/src/Tippy.js","../node_modules/@tippyjs/react/src/forwardRef.js","../node_modules/@tippyjs/react/src/index.js","../node_modules/crypto-js/aes.js","../node_modules/crypto-js/cipher-core.js","../node_modules/crypto-js/core.js","../node_modules/crypto-js/enc-base64.js","../node_modules/crypto-js/enc-hex.js","../node_modules/crypto-js/enc-utf8.js","../node_modules/crypto-js/evpkdf.js","../node_modules/crypto-js/hmac-sha1.js","../node_modules/crypto-js/hmac-sha256.js","../node_modules/crypto-js/hmac.js","../node_modules/crypto-js/md5.js","../node_modules/crypto-js/sha1.js","../node_modules/crypto-js/sha256.js","../node_modules/dayjs/dayjs.min.js","../node_modules/dayjs/plugin/advancedFormat.js","../node_modules/dayjs/plugin/customParseFormat.js","../node_modules/dayjs/plugin/isoWeek.js","../node_modules/dayjs/plugin/localizedFormat.js","../node_modules/dayjs/plugin/quarterOfYear.js","../node_modules/loglevel/lib/loglevel.js","../node_modules/lottie-web/build/player/lottie.js","../node_modules/react-dom/cjs/react-dom.production.min.js","../node_modules/react-dom/client.js","../node_modules/react-dom/index.js","../node_modules/react-dom/node_modules/scheduler/cjs/scheduler.production.min.js","../node_modules/react-dom/node_modules/scheduler/index.js","../node_modules/react-i18next/node_modules/void-elements/index.js","../node_modules/react-redux/node_modules/use-sync-external-store/cjs/use-sync-external-store-with-selector.production.js","../node_modules/react-redux/node_modules/use-sync-external-store/with-selector.js","../node_modules/react-resize-detector/node_modules/lodash/_Symbol.js","../node_modules/react-resize-detector/node_modules/lodash/_baseGetTag.js","../node_modules/react-resize-detector/node_modules/lodash/_baseTrim.js","../node_modules/react-resize-detector/node_modules/lodash/_freeGlobal.js","../node_modules/react-resize-detector/node_modules/lodash/_getRawTag.js","../node_modules/react-resize-detector/node_modules/lodash/_objectToString.js","../node_modules/react-resize-detector/node_modules/lodash/_root.js","../node_modules/react-resize-detector/node_modules/lodash/_trimmedEndIndex.js","../node_modules/react-resize-detector/node_modules/lodash/debounce.js","../node_modules/react-resize-detector/node_modules/lodash/isObject.js","../node_modules/react-resize-detector/node_modules/lodash/isObjectLike.js","../node_modules/react-resize-detector/node_modules/lodash/isSymbol.js","../node_modules/react-resize-detector/node_modules/lodash/now.js","../node_modules/react-resize-detector/node_modules/lodash/throttle.js","../node_modules/react-resize-detector/node_modules/lodash/toNumber.js","../node_modules/react-waypoint/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","../node_modules/react-waypoint/node_modules/consolidated-events/lib/index.esm.js","../node_modules/react-waypoint/es/index.js","../node_modules/react-waypoint/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","../node_modules/react-waypoint/node_modules/react-is/cjs/react-is.production.min.js","../node_modules/react-waypoint/node_modules/react-is/index.js","../node_modules/react/cjs/react-jsx-runtime.production.min.js","../node_modules/react/cjs/react.production.min.js","../node_modules/react/index.js","../node_modules/react/jsx-runtime.js","../node_modules/shaka-player/node_modules/eme-encryption-scheme-polyfill/index.js","../../node_modules/google-closure-library/closure/goog/base.js","com/google/javascript/jscomp/js/es6/util/arrayiterator.js","com/google/javascript/jscomp/js/util/defineproperty.js","com/google/javascript/jscomp/js/util/global.js","com/google/javascript/jscomp/js/util/polyfill.js","com/google/javascript/jscomp/js/es6/symbol.js","com/google/javascript/jscomp/js/es6/util/makeiterator.js","com/google/javascript/jscomp/js/es6/util/arrayfromiterable.js","com/google/javascript/jscomp/js/es6/util/arrayfromiterator.js","com/google/javascript/jscomp/js/util/objectcreate.js","com/google/javascript/jscomp/js/es6/util/setprototypeof.js","com/google/javascript/jscomp/js/es6/util/inherits.js","com/google/javascript/jscomp/js/es6/generator_engine.js","com/google/javascript/jscomp/js/es6/execute_async_generator.js","com/google/javascript/jscomp/js/es6/util/restarguments.js","com/google/javascript/jscomp/js/util/owns.js","com/google/javascript/jscomp/js/es6/util/iteratorfromarray.js","com/google/javascript/jscomp/js/util/checkstringargs.js","com/google/javascript/jscomp/js/util/findinternal.js","com/google/javascript/jscomp/js/es6/promise/promise.js","com/google/javascript/jscomp/js/es6/weakmap.js","com/google/javascript/jscomp/js/es6/map.js","com/google/javascript/jscomp/js/es6/set.js","com/google/javascript/jscomp/js/es6/array/values.js","com/google/javascript/jscomp/js/es6/array/from.js","com/google/javascript/jscomp/js/es6/array/keys.js","com/google/javascript/jscomp/js/es6/object/is.js","com/google/javascript/jscomp/js/es6/array/includes.js","com/google/javascript/jscomp/js/es6/string/includes.js","com/google/javascript/jscomp/js/es6/string/fromcodepoint.js","com/google/javascript/jscomp/js/es6/array/findindex.js","com/google/javascript/jscomp/js/es6/weakset.js","com/google/javascript/jscomp/js/es6/array/find.js","com/google/javascript/jscomp/js/es6/string/startswith.js","com/google/javascript/jscomp/js/es6/object/entries.js","com/google/javascript/jscomp/js/es6/util/assign.js","com/google/javascript/jscomp/js/es6/object/assign.js","com/google/javascript/jscomp/js/es6/promise/finally.js","com/google/javascript/jscomp/js/es6/array/entries.js","com/google/javascript/jscomp/js/es6/number/isnan.js","com/google/javascript/jscomp/js/es6/string/repeat.js","com/google/javascript/jscomp/js/es6/number/constants.js","com/google/javascript/jscomp/js/es6/number/isfinite.js","com/google/javascript/jscomp/js/es6/object/values.js","com/google/javascript/jscomp/js/es6/math/log2.js","com/google/javascript/jscomp/js/es6/string/endswith.js","com/google/javascript/jscomp/js/es6/math/trunc.js","../node_modules/shaka-player/lib/debug/asserts.js","../node_modules/shaka-player/lib/abr/ewma.js","../node_modules/shaka-player/lib/abr/ewma_bandwidth_estimator.js","../node_modules/shaka-player/lib/debug/log.js","../node_modules/shaka-player/lib/util/multi_map.js","../node_modules/shaka-player/lib/util/event_manager.js","../node_modules/shaka-player/lib/deprecate/version.js","../node_modules/shaka-player/lib/deprecate/deprecate.js","../node_modules/shaka-player/lib/lcevc/lcevc_dec.js","../node_modules/shaka-player/lib/deprecate/enforcer.js","../node_modules/shaka-player/lib/config/auto_show_text.js","../node_modules/shaka-player/third_party/closure-uri/utils.js","../node_modules/shaka-player/third_party/closure-uri/uri.js","../node_modules/shaka-player/lib/util/buffer_utils.js","../node_modules/shaka-player/lib/util/error.js","../node_modules/shaka-player/lib/util/lazy.js","../node_modules/shaka-player/lib/drm/drm_utils.js","../node_modules/shaka-player/lib/util/delayed_tick.js","../node_modules/shaka-player/lib/util/timer.js","../node_modules/shaka-player/lib/util/platform.js","../node_modules/shaka-player/lib/util/string_utils.js","../node_modules/shaka-player/lib/util/uint8array_utils.js","../node_modules/shaka-player/lib/util/manifest_parser_utils.js","../node_modules/shaka-player/lib/media/media_source_capabilities.js","../node_modules/shaka-player/lib/cea/dummy_caption_decoder.js","../node_modules/shaka-player/lib/cea/dummy_cea_parser.js","../node_modules/shaka-player/lib/media/closed_caption_parser.js","../node_modules/shaka-player/lib/text/cue_region.js","../node_modules/shaka-player/lib/util/array_utils.js","../node_modules/shaka-player/lib/util/text_parser.js","../node_modules/shaka-player/lib/util/object_utils.js","../node_modules/shaka-player/lib/util/tXml.js","../node_modules/shaka-player/lib/text/cue.js","../node_modules/shaka-player/lib/transmuxer/transmuxer_engine.js","../node_modules/shaka-player/lib/util/mime_utils.js","../node_modules/shaka-player/lib/text/text_engine.js","../node_modules/shaka-player/lib/util/functional.js","../node_modules/shaka-player/lib/util/language_utils.js","../node_modules/shaka-player/lib/util/stream_utils.js","../node_modules/shaka-player/lib/drm/drm_engine.js","../node_modules/shaka-player/lib/media/segment_reference.js","../node_modules/shaka-player/lib/abr/simple_abr_manager.js","../node_modules/shaka-player/lib/net/backoff.js","../node_modules/shaka-player/lib/util/public_promise.js","../node_modules/shaka-player/lib/util/abortable_operation.js","../node_modules/shaka-player/lib/util/fake_event.js","../node_modules/shaka-player/lib/config/cross_boundary_strategy.js","../node_modules/shaka-player/lib/util/fake_event_target.js","../node_modules/shaka-player/lib/util/operation_manager.js","../node_modules/shaka-player/lib/net/networking_engine.js","../node_modules/shaka-player/lib/util/destroyer.js","../node_modules/shaka-player/lib/util/iterables.js","../node_modules/shaka-player/lib/util/map_utils.js","../node_modules/shaka-player/lib/util/data_view_reader.js","../node_modules/shaka-player/lib/util/mp4_parser.js","../node_modules/shaka-player/lib/util/pssh.js","../node_modules/shaka-player/lib/media/adaptation_set.js","../node_modules/shaka-player/lib/media/adaptation_set_criteria.js","../node_modules/shaka-player/lib/media/buffering_observer.js","../node_modules/shaka-player/lib/player.js","../node_modules/shaka-player/lib/config/codec_switching_strategy.js","../node_modules/shaka-player/lib/media/manifest_filterer.js","../node_modules/shaka-player/lib/media/manifest_parser.js","../node_modules/shaka-player/lib/media/content_workarounds.js","../node_modules/shaka-player/lib/media/time_ranges_utils.js","../node_modules/shaka-player/lib/util/dom_utils.js","../node_modules/shaka-player/lib/util/id3_utils.js","../node_modules/shaka-player/lib/util/mp4_box_parsers.js","../node_modules/shaka-player/lib/util/exp_golomb.js","../node_modules/shaka-player/lib/util/ts_parser.js","../node_modules/shaka-player/lib/media/media_source_engine.js","../node_modules/shaka-player/lib/media/segment_index.js","../node_modules/shaka-player/lib/media/presentation_timeline.js","../node_modules/shaka-player/lib/media/gap_jumping_controller.js","../node_modules/shaka-player/lib/util/media_ready_state_utils.js","../node_modules/shaka-player/lib/media/video_wrapper.js","../node_modules/shaka-player/lib/media/playhead.js","../node_modules/shaka-player/lib/media/play_rate_controller.js","../node_modules/shaka-player/lib/media/playhead_observer.js","../node_modules/shaka-player/lib/media/quality_observer.js","../node_modules/shaka-player/lib/media/region_timeline.js","../node_modules/shaka-player/lib/media/segment_prefetch.js","../node_modules/shaka-player/lib/media/segment_utils.js","../node_modules/shaka-player/lib/util/networking.js","../node_modules/shaka-player/lib/media/streaming_engine.js","../node_modules/shaka-player/lib/util/config_utils.js","../node_modules/shaka-player/lib/drm/fairplay.js","../node_modules/shaka-player/lib/media/preference_based_criteria.js","../node_modules/shaka-player/lib/util/player_configuration.js","../node_modules/shaka-player/lib/util/state_history.js","../node_modules/shaka-player/lib/util/switch_history.js","../node_modules/shaka-player/lib/util/stats.js","../node_modules/shaka-player/lib/media/preload_manager.js","../node_modules/shaka-player/lib/media/region_observer.js","../node_modules/shaka-player/lib/net/networking_utils.js","../node_modules/shaka-player/lib/text/text_utils.js","../node_modules/shaka-player/lib/text/simple_text_displayer.js","../node_modules/shaka-player/lib/text/stub_text_displayer.js","../node_modules/shaka-player/lib/text/ui_text_displayer.js","../node_modules/shaka-player/lib/util/cmcd_manager.js","../node_modules/shaka-player/lib/text/web_vtt_generator.js","../node_modules/shaka-player/lib/util/cmsd_manager.js","../node_modules/shaka-player/lib/util/mutex.js","../node_modules/shaka-player/lib/util/number_utils.js","../node_modules/shaka-player/lib/ads/ads_stats.js","../node_modules/shaka-player/lib/ads/client_side_ad.js","../node_modules/shaka-player/lib/ads/ad_utils.js","../node_modules/shaka-player/lib/ads/client_side_ad_manager.js","../node_modules/shaka-player/lib/ads/interstitial_ad.js","../node_modules/shaka-player/lib/ads/interstitial_static_ad.js","../node_modules/shaka-player/lib/ads/interstitial_ad_manager.js","../node_modules/shaka-player/lib/ads/media_tailor_ad.js","../node_modules/shaka-player/lib/ads/media_tailor_ad_manager.js","../node_modules/shaka-player/lib/ads/server_side_ad.js","../node_modules/shaka-player/lib/ads/server_side_ad_manager.js","../node_modules/shaka-player/lib/ads/ad_manager.js","../node_modules/shaka-player/lib/cast/cast_utils.js","../node_modules/shaka-player/lib/cast/cast_sender.js","../node_modules/shaka-player/lib/cast/cast_proxy.js","../node_modules/shaka-player/lib/cast/cast_receiver.js","../node_modules/shaka-player/lib/cea/cea_utils.js","../node_modules/shaka-player/lib/cea/cea608_memory.js","../node_modules/shaka-player/lib/cea/cea608_data_channel.js","../node_modules/shaka-player/lib/cea/cea708_window.js","../node_modules/shaka-player/lib/cea/dtvcc_packet_builder.js","../node_modules/shaka-player/lib/cea/cea708_service.js","../node_modules/shaka-player/lib/cea/cea_decoder.js","../node_modules/shaka-player/lib/cea/sei_processor.js","../node_modules/shaka-player/lib/cea/mp4_cea_parser.js","../node_modules/shaka-player/lib/cea/ts_cea_parser.js","../node_modules/shaka-player/lib/drm/playready.js","../node_modules/shaka-player/lib/dash/content_protection.js","../node_modules/shaka-player/lib/dash/mpd_utils.js","../node_modules/shaka-player/lib/dash/mp4_segment_index_parser.js","../node_modules/shaka-player/lib/dash/ebml_parser.js","../node_modules/shaka-player/lib/dash/webm_segment_index_parser.js","../node_modules/shaka-player/lib/dash/segment_base.js","../node_modules/shaka-player/lib/dash/segment_list.js","../node_modules/shaka-player/lib/dash/segment_template.js","../node_modules/shaka-player/lib/util/content_steering_manager.js","../node_modules/shaka-player/lib/util/periods.js","../node_modules/shaka-player/lib/util/xml_utils.js","../node_modules/shaka-player/lib/dash/dash_parser.js","../node_modules/shaka-player/lib/dependencies/all.js","../node_modules/shaka-player/lib/hls/hls_classes.js","../node_modules/shaka-player/lib/hls/hls_utils.js","../node_modules/shaka-player/lib/hls/manifest_text_parser.js","../node_modules/shaka-player/lib/net/data_uri_plugin.js","../node_modules/shaka-player/lib/hls/hls_parser.js","../node_modules/shaka-player/lib/mss/content_protection.js","../node_modules/shaka-player/lib/transmuxer/mp4_generator.js","../node_modules/shaka-player/lib/mss/mss_parser.js","../node_modules/shaka-player/lib/net/http_plugin_utils.js","../node_modules/shaka-player/lib/net/http_fetch_plugin.js","../node_modules/shaka-player/lib/net/http_xhr_plugin.js","../node_modules/shaka-player/lib/offline/download_info.js","../node_modules/shaka-player/lib/offline/download_progress_estimator.js","../node_modules/shaka-player/lib/offline/download_manager.js","../node_modules/shaka-player/lib/offline/indexeddb/db_operation.js","../node_modules/shaka-player/lib/offline/indexeddb/db_connection.js","../node_modules/shaka-player/lib/offline/indexeddb/base_storage_cell.js","../node_modules/shaka-player/lib/offline/indexeddb/eme_session_storage_cell.js","../node_modules/shaka-player/lib/offline/storage_muxer.js","../node_modules/shaka-player/lib/offline/indexeddb/storage_mechanism.js","../node_modules/shaka-player/lib/offline/indexeddb/v1_storage_cell.js","../node_modules/shaka-player/lib/offline/indexeddb/v2_storage_cell.js","../node_modules/shaka-player/lib/offline/indexeddb/v5_storage_cell.js","../node_modules/shaka-player/lib/offline/offline_uri.js","../node_modules/shaka-player/lib/offline/manifest_converter.js","../node_modules/shaka-player/lib/offline/offline_manifest_parser.js","../node_modules/shaka-player/lib/offline/offline_scheme.js","../node_modules/shaka-player/lib/offline/session_deleter.js","../node_modules/shaka-player/lib/offline/stored_content_utils.js","../node_modules/shaka-player/lib/offline/stream_bandwidth_estimator.js","../node_modules/shaka-player/lib/offline/storage.js","../node_modules/shaka-player/lib/polyfill/all.js","../node_modules/shaka-player/lib/polyfill/aria.js","../node_modules/shaka-player/lib/polyfill/encryption_scheme.js","../node_modules/shaka-player/lib/polyfill/fullscreen.js","../node_modules/shaka-player/lib/polyfill/media_capabilities.js","../node_modules/shaka-player/lib/polyfill/patchedmediakeys_apple.js","../node_modules/shaka-player/lib/polyfill/mediasource.js","../node_modules/shaka-player/lib/polyfill/orientation.js","../node_modules/shaka-player/lib/polyfill/patchedmediakeys_cert.js","../node_modules/shaka-player/lib/polyfill/patchedmediakeys_webkit.js","../node_modules/shaka-player/lib/polyfill/pip_webkit.js","../node_modules/shaka-player/lib/polyfill/random_uuid.js","../node_modules/shaka-player/lib/polyfill/symbol.js","../node_modules/shaka-player/lib/polyfill/video_play_promise.js","../node_modules/shaka-player/lib/polyfill/videoplaybackquality.js","../node_modules/shaka-player/lib/polyfill/vttcue.js","../node_modules/shaka-player/lib/text/lrc_text_parser.js","../node_modules/shaka-player/lib/text/ttml_text_parser.js","../node_modules/shaka-player/lib/text/mp4_ttml_parser.js","../node_modules/shaka-player/lib/text/vtt_text_parser.js","../node_modules/shaka-player/lib/text/mp4_vtt_parser.js","../node_modules/shaka-player/lib/text/sbv_text_parser.js","../node_modules/shaka-player/lib/text/srt_text_parser.js","../node_modules/shaka-player/lib/text/ssa_text_parser.js","../node_modules/shaka-player/lib/transmuxer/adts.js","../node_modules/shaka-player/lib/transmuxer/aac_transmuxer.js","../node_modules/shaka-player/lib/transmuxer/ac3.js","../node_modules/shaka-player/lib/transmuxer/ac3_transmuxer.js","../node_modules/shaka-player/lib/transmuxer/ec3.js","../node_modules/shaka-player/lib/transmuxer/ec3_transmuxer.js","../node_modules/shaka-player/lib/transmuxer/h264.js","../node_modules/shaka-player/lib/transmuxer/h265.js","../node_modules/shaka-player/lib/transmuxer/mpeg_audio.js","../node_modules/shaka-player/lib/transmuxer/mp3_transmuxer.js","../node_modules/shaka-player/lib/transmuxer/mpeg_ts_transmuxer.js","../node_modules/shaka-player/lib/transmuxer/mss_transmuxer.js","../node_modules/shaka-player/lib/transmuxer/ts_transmuxer.js","../node_modules/shaka-player/lib/transmuxer/opus.js","../node_modules/shaka-player/lib/util/fairplay_utils.js","../../ntg-ui/src/theme/index.js","../../ntg-ui/src/tooltip/index.js","../../ntg-utils/src/footer/index.js","../../ntg-utils/src/localization/helper.js","../../ntg-utils/src/localization/index.js","../../ntg-utils/src/messenger/index.js","../../ntg-utils/src/messenger/messenger-events.js","../../ntg-utils/src/messenger/messenger.js","../../ntg-utils/src/string/index.js","../../ntg-utils/src/timer/index.js","../../ntg-utils/src/types/index.js","../../ntg-utils/node_modules/i18next-xhr-backend/node_modules/@babel/runtime/helpers/esm/typeof.js","../../ntg-utils/node_modules/i18next-xhr-backend/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","../../ntg-utils/node_modules/i18next-xhr-backend/node_modules/@babel/runtime/helpers/esm/toPrimitive.js","../../ntg-utils/node_modules/i18next-xhr-backend/node_modules/@babel/runtime/helpers/esm/createClass.js","../../ntg-utils/node_modules/i18next-xhr-backend/dist/esm/i18nextXHRBackend.js","../../ntg-utils/node_modules/i18next-xhr-backend/node_modules/@babel/runtime/helpers/esm/defineProperty.js","../../ntg-utils/node_modules/i18next-xhr-backend/node_modules/@babel/runtime/helpers/esm/classCallCheck.js","../../ntg-utils/node_modules/i18next/dist/cjs/i18next.js","../../ntg-utils/node_modules/react-i18next/node_modules/void-elements/index.js","../../ntg-utils/node_modules/react/cjs/react.production.min.js","../../ntg-utils/node_modules/react/index.js","webpack://@ntg/core/../ntg-components/dist/pictos/DebugPicto.css?eedf","webpack://@ntg/core/../ntg-components/dist/pictos/Picto.css?4c11","../../../node_modules/core-js/internals/a-callable.js","../../../node_modules/core-js/internals/add-to-unscopables.js","../../../node_modules/core-js/internals/an-object.js","../../../node_modules/core-js/internals/array-includes.js","../../../node_modules/core-js/internals/classof-raw.js","../../../node_modules/core-js/internals/copy-constructor-properties.js","../../../node_modules/core-js/internals/create-non-enumerable-property.js","../../../node_modules/core-js/internals/create-property-descriptor.js","../../../node_modules/core-js/internals/define-built-in.js","../../../node_modules/core-js/internals/define-global-property.js","../../../node_modules/core-js/internals/descriptors.js","../../../node_modules/core-js/internals/document-create-element.js","../../../node_modules/core-js/internals/enum-bug-keys.js","../../../node_modules/core-js/internals/environment-user-agent.js","../../../node_modules/core-js/internals/environment-v8-version.js","../../../node_modules/core-js/internals/export.js","../../../node_modules/core-js/internals/fails.js","../../../node_modules/core-js/internals/function-bind-native.js","../../../node_modules/core-js/internals/function-call.js","../../../node_modules/core-js/internals/function-name.js","../../../node_modules/core-js/internals/function-uncurry-this.js","../../../node_modules/core-js/internals/get-built-in.js","../../../node_modules/core-js/internals/get-method.js","../../../node_modules/core-js/internals/global-this.js","../../../node_modules/core-js/internals/has-own-property.js","../../../node_modules/core-js/internals/hidden-keys.js","../../../node_modules/core-js/internals/html.js","../../../node_modules/core-js/internals/ie8-dom-define.js","../../../node_modules/core-js/internals/indexed-object.js","../../../node_modules/core-js/internals/inspect-source.js","../../../node_modules/core-js/internals/internal-state.js","../../../node_modules/core-js/internals/is-callable.js","../../../node_modules/core-js/internals/is-forced.js","../../../node_modules/core-js/internals/is-null-or-undefined.js","../../../node_modules/core-js/internals/is-object.js","../../../node_modules/core-js/internals/is-pure.js","../../../node_modules/core-js/internals/is-symbol.js","../../../node_modules/core-js/internals/length-of-array-like.js","../../../node_modules/core-js/internals/make-built-in.js","../../../node_modules/core-js/internals/math-trunc.js","../../../node_modules/core-js/internals/object-create.js","../../../node_modules/core-js/internals/object-define-properties.js","../../../node_modules/core-js/internals/object-define-property.js","../../../node_modules/core-js/internals/object-get-own-property-descriptor.js","../../../node_modules/core-js/internals/object-get-own-property-names.js","../../../node_modules/core-js/internals/object-get-own-property-symbols.js","../../../node_modules/core-js/internals/object-is-prototype-of.js","../../../node_modules/core-js/internals/object-keys-internal.js","../../../node_modules/core-js/internals/object-keys.js","../../../node_modules/core-js/internals/object-property-is-enumerable.js","../../../node_modules/core-js/internals/ordinary-to-primitive.js","../../../node_modules/core-js/internals/own-keys.js","../../../node_modules/core-js/internals/require-object-coercible.js","../../../node_modules/core-js/internals/shared-key.js","../../../node_modules/core-js/internals/shared-store.js","../../../node_modules/core-js/internals/shared.js","../../../node_modules/core-js/internals/symbol-constructor-detection.js","../../../node_modules/core-js/internals/to-absolute-index.js","../../../node_modules/core-js/internals/to-indexed-object.js","../../../node_modules/core-js/internals/to-integer-or-infinity.js","../../../node_modules/core-js/internals/to-length.js","../../../node_modules/core-js/internals/to-object.js","../../../node_modules/core-js/internals/to-primitive.js","../../../node_modules/core-js/internals/to-property-key.js","../../../node_modules/core-js/internals/try-to-string.js","../../../node_modules/core-js/internals/uid.js","../../../node_modules/core-js/internals/use-symbol-as-uid.js","../../../node_modules/core-js/internals/v8-prototype-define-bug.js","../../../node_modules/core-js/internals/weak-map-basic-detection.js","../../../node_modules/core-js/internals/well-known-symbol.js","../../../node_modules/core-js/modules/es.array.includes.js","../node_modules/core-js/internals/a-callable.js","../node_modules/core-js/internals/a-map.js","../node_modules/core-js/internals/a-number.js","../node_modules/core-js/internals/a-possible-prototype.js","../node_modules/core-js/internals/a-set.js","../node_modules/core-js/internals/a-weak-map.js","../node_modules/core-js/internals/a-weak-set.js","../node_modules/core-js/internals/add-to-unscopables.js","../node_modules/core-js/internals/an-instance.js","../node_modules/core-js/internals/an-object.js","../node_modules/core-js/internals/array-buffer-basic-detection.js","../node_modules/core-js/internals/array-buffer-non-extensible.js","../node_modules/core-js/internals/array-buffer-view-core.js","../node_modules/core-js/internals/array-fill.js","../node_modules/core-js/internals/array-includes.js","../node_modules/core-js/internals/array-iteration.js","../node_modules/core-js/internals/array-slice.js","../node_modules/core-js/internals/array-sort.js","../node_modules/core-js/internals/array-species-constructor.js","../node_modules/core-js/internals/array-species-create.js","../node_modules/core-js/internals/array-unique-by.js","../node_modules/core-js/internals/check-correctness-of-iteration.js","../node_modules/core-js/internals/classof-raw.js","../node_modules/core-js/internals/classof.js","../node_modules/core-js/internals/collection-from.js","../node_modules/core-js/internals/collection-of.js","../node_modules/core-js/internals/collection-strong.js","../node_modules/core-js/internals/collection-weak.js","../node_modules/core-js/internals/collection.js","../node_modules/core-js/internals/composite-key.js","../node_modules/core-js/internals/copy-constructor-properties.js","../node_modules/core-js/internals/correct-prototype-getter.js","../node_modules/core-js/internals/create-iter-result-object.js","../node_modules/core-js/internals/create-non-enumerable-property.js","../node_modules/core-js/internals/create-property-descriptor.js","../node_modules/core-js/internals/define-built-in-accessor.js","../node_modules/core-js/internals/define-built-in.js","../node_modules/core-js/internals/define-built-ins.js","../node_modules/core-js/internals/define-global-property.js","../node_modules/core-js/internals/descriptors.js","../node_modules/core-js/internals/document-create-element.js","../node_modules/core-js/internals/enum-bug-keys.js","../node_modules/core-js/internals/environment-ff-version.js","../node_modules/core-js/internals/environment-is-ie-or-edge.js","../node_modules/core-js/internals/environment-is-ios.js","../node_modules/core-js/internals/environment-is-node.js","../node_modules/core-js/internals/environment-user-agent.js","../node_modules/core-js/internals/environment-v8-version.js","../node_modules/core-js/internals/environment-webkit-version.js","../node_modules/core-js/internals/environment.js","../node_modules/core-js/internals/export.js","../node_modules/core-js/internals/fails.js","../node_modules/core-js/internals/freezing.js","../node_modules/core-js/internals/function-apply.js","../node_modules/core-js/internals/function-bind-context.js","../node_modules/core-js/internals/function-bind-native.js","../node_modules/core-js/internals/function-call.js","../node_modules/core-js/internals/function-name.js","../node_modules/core-js/internals/function-uncurry-this-accessor.js","../node_modules/core-js/internals/function-uncurry-this-clause.js","../node_modules/core-js/internals/function-uncurry-this.js","../node_modules/core-js/internals/get-built-in.js","../node_modules/core-js/internals/get-iterator-direct.js","../node_modules/core-js/internals/get-iterator-method.js","../node_modules/core-js/internals/get-iterator.js","../node_modules/core-js/internals/get-method.js","../node_modules/core-js/internals/get-set-record.js","../node_modules/core-js/internals/global-this.js","../node_modules/core-js/internals/has-own-property.js","../node_modules/core-js/internals/hidden-keys.js","../node_modules/core-js/internals/host-report-errors.js","../node_modules/core-js/internals/html.js","../node_modules/core-js/internals/ie8-dom-define.js","../node_modules/core-js/internals/indexed-object.js","../node_modules/core-js/internals/inherit-if-required.js","../node_modules/core-js/internals/inspect-source.js","../node_modules/core-js/internals/internal-metadata.js","../node_modules/core-js/internals/internal-state.js","../node_modules/core-js/internals/is-array-iterator-method.js","../node_modules/core-js/internals/is-array.js","../node_modules/core-js/internals/is-callable.js","../node_modules/core-js/internals/is-constructor.js","../node_modules/core-js/internals/is-forced.js","../node_modules/core-js/internals/is-iterable.js","../node_modules/core-js/internals/is-null-or-undefined.js","../node_modules/core-js/internals/is-object.js","../node_modules/core-js/internals/is-possible-prototype.js","../node_modules/core-js/internals/is-pure.js","../node_modules/core-js/internals/is-symbol.js","../node_modules/core-js/internals/iterate-simple.js","../node_modules/core-js/internals/iterate.js","../node_modules/core-js/internals/iterator-close.js","../node_modules/core-js/internals/iterator-create-constructor.js","../node_modules/core-js/internals/iterator-define.js","../node_modules/core-js/internals/iterators-core.js","../node_modules/core-js/internals/iterators.js","../node_modules/core-js/internals/length-of-array-like.js","../node_modules/core-js/internals/make-built-in.js","../node_modules/core-js/internals/map-helpers.js","../node_modules/core-js/internals/map-iterate.js","../node_modules/core-js/internals/math-float-round.js","../node_modules/core-js/internals/math-fround.js","../node_modules/core-js/internals/math-round-ties-to-even.js","../node_modules/core-js/internals/math-scale.js","../node_modules/core-js/internals/math-sign.js","../node_modules/core-js/internals/math-trunc.js","../node_modules/core-js/internals/new-promise-capability.js","../node_modules/core-js/internals/not-a-nan.js","../node_modules/core-js/internals/number-is-finite.js","../node_modules/core-js/internals/object-create.js","../node_modules/core-js/internals/object-define-properties.js","../node_modules/core-js/internals/object-define-property.js","../node_modules/core-js/internals/object-get-own-property-descriptor.js","../node_modules/core-js/internals/object-get-own-property-names-external.js","../node_modules/core-js/internals/object-get-own-property-names.js","../node_modules/core-js/internals/object-get-own-property-symbols.js","../node_modules/core-js/internals/object-get-prototype-of.js","../node_modules/core-js/internals/object-is-extensible.js","../node_modules/core-js/internals/object-is-prototype-of.js","../node_modules/core-js/internals/object-keys-internal.js","../node_modules/core-js/internals/object-keys.js","../node_modules/core-js/internals/object-property-is-enumerable.js","../node_modules/core-js/internals/object-set-prototype-of.js","../node_modules/core-js/internals/ordinary-to-primitive.js","../node_modules/core-js/internals/own-keys.js","../node_modules/core-js/internals/path.js","../node_modules/core-js/internals/perform.js","../node_modules/core-js/internals/reflect-metadata.js","../node_modules/core-js/internals/regexp-flags.js","../node_modules/core-js/internals/require-object-coercible.js","../node_modules/core-js/internals/same-value-zero.js","../node_modules/core-js/internals/same-value.js","../node_modules/core-js/internals/schedulers-fix.js","../node_modules/core-js/internals/set-clone.js","../node_modules/core-js/internals/set-difference.js","../node_modules/core-js/internals/set-helpers.js","../node_modules/core-js/internals/set-intersection.js","../node_modules/core-js/internals/set-is-disjoint-from.js","../node_modules/core-js/internals/set-is-subset-of.js","../node_modules/core-js/internals/set-is-superset-of.js","../node_modules/core-js/internals/set-iterate.js","../node_modules/core-js/internals/set-size.js","../node_modules/core-js/internals/set-species.js","../node_modules/core-js/internals/set-symmetric-difference.js","../node_modules/core-js/internals/set-to-string-tag.js","../node_modules/core-js/internals/set-union.js","../node_modules/core-js/internals/shared-key.js","../node_modules/core-js/internals/shared-store.js","../node_modules/core-js/internals/shared.js","../node_modules/core-js/internals/string-multibyte.js","../node_modules/core-js/internals/symbol-constructor-detection.js","../node_modules/core-js/internals/task.js","../node_modules/core-js/internals/to-absolute-index.js","../node_modules/core-js/internals/to-big-int.js","../node_modules/core-js/internals/to-indexed-object.js","../node_modules/core-js/internals/to-integer-or-infinity.js","../node_modules/core-js/internals/to-length.js","../node_modules/core-js/internals/to-object.js","../node_modules/core-js/internals/to-offset.js","../node_modules/core-js/internals/to-positive-integer.js","../node_modules/core-js/internals/to-primitive.js","../node_modules/core-js/internals/to-property-key.js","../node_modules/core-js/internals/to-set-like.js","../node_modules/core-js/internals/to-string-tag-support.js","../node_modules/core-js/internals/to-string.js","../node_modules/core-js/internals/try-to-string.js","../node_modules/core-js/internals/uid.js","../node_modules/core-js/internals/use-symbol-as-uid.js","../node_modules/core-js/internals/v8-prototype-define-bug.js","../node_modules/core-js/internals/validate-arguments-length.js","../node_modules/core-js/internals/weak-map-basic-detection.js","../node_modules/core-js/internals/weak-map-helpers.js","../node_modules/core-js/internals/weak-set-helpers.js","../node_modules/core-js/internals/well-known-symbol-define.js","../node_modules/core-js/internals/well-known-symbol-wrapped.js","../node_modules/core-js/internals/well-known-symbol.js","../node_modules/core-js/modules/es.array.includes.js","../node_modules/core-js/modules/es.map.constructor.js","../node_modules/core-js/modules/es.map.group-by.js","../node_modules/core-js/modules/es.map.js","../node_modules/core-js/modules/es.promise.try.js","../node_modules/core-js/modules/es.regexp.flags.js","../node_modules/core-js/modules/es.typed-array.fill.js","../node_modules/core-js/modules/es.typed-array.set.js","../node_modules/core-js/modules/es.typed-array.sort.js","../node_modules/core-js/modules/es.weak-map.constructor.js","../node_modules/core-js/modules/es.weak-map.js","../node_modules/core-js/modules/esnext.array.last-index.js","../node_modules/core-js/modules/esnext.array.last-item.js","../node_modules/core-js/modules/esnext.composite-key.js","../node_modules/core-js/modules/esnext.composite-symbol.js","../node_modules/core-js/modules/esnext.map.delete-all.js","../node_modules/core-js/modules/esnext.map.every.js","../node_modules/core-js/modules/esnext.map.filter.js","../node_modules/core-js/modules/esnext.map.find-key.js","../node_modules/core-js/modules/esnext.map.find.js","../node_modules/core-js/modules/esnext.map.from.js","../node_modules/core-js/modules/esnext.map.group-by.js","../node_modules/core-js/modules/esnext.map.includes.js","../node_modules/core-js/modules/esnext.map.key-by.js","../node_modules/core-js/modules/esnext.map.key-of.js","../node_modules/core-js/modules/esnext.map.map-keys.js","../node_modules/core-js/modules/esnext.map.map-values.js","../node_modules/core-js/modules/esnext.map.merge.js","../node_modules/core-js/modules/esnext.map.of.js","../node_modules/core-js/modules/esnext.map.reduce.js","../node_modules/core-js/modules/esnext.map.some.js","../node_modules/core-js/modules/esnext.map.update.js","../node_modules/core-js/modules/esnext.math.clamp.js","../node_modules/core-js/modules/esnext.math.deg-per-rad.js","../node_modules/core-js/modules/esnext.math.degrees.js","../node_modules/core-js/modules/esnext.math.fscale.js","../node_modules/core-js/modules/esnext.math.iaddh.js","../node_modules/core-js/modules/esnext.math.imulh.js","../node_modules/core-js/modules/esnext.math.isubh.js","../node_modules/core-js/modules/esnext.math.rad-per-deg.js","../node_modules/core-js/modules/esnext.math.radians.js","../node_modules/core-js/modules/esnext.math.scale.js","../node_modules/core-js/modules/esnext.math.seeded-prng.js","../node_modules/core-js/modules/esnext.math.signbit.js","../node_modules/core-js/modules/esnext.math.umulh.js","../node_modules/core-js/modules/esnext.number.from-string.js","../node_modules/core-js/modules/esnext.observable.constructor.js","../node_modules/core-js/modules/esnext.observable.from.js","../node_modules/core-js/modules/esnext.observable.js","../node_modules/core-js/modules/esnext.observable.of.js","../node_modules/core-js/modules/esnext.promise.try.js","../node_modules/core-js/modules/esnext.reflect.define-metadata.js","../node_modules/core-js/modules/esnext.reflect.delete-metadata.js","../node_modules/core-js/modules/esnext.reflect.get-metadata-keys.js","../node_modules/core-js/modules/esnext.reflect.get-metadata.js","../node_modules/core-js/modules/esnext.reflect.get-own-metadata-keys.js","../node_modules/core-js/modules/esnext.reflect.get-own-metadata.js","../node_modules/core-js/modules/esnext.reflect.has-metadata.js","../node_modules/core-js/modules/esnext.reflect.has-own-metadata.js","../node_modules/core-js/modules/esnext.reflect.metadata.js","../node_modules/core-js/modules/esnext.set.add-all.js","../node_modules/core-js/modules/esnext.set.delete-all.js","../node_modules/core-js/modules/esnext.set.difference.js","../node_modules/core-js/modules/esnext.set.every.js","../node_modules/core-js/modules/esnext.set.filter.js","../node_modules/core-js/modules/esnext.set.find.js","../node_modules/core-js/modules/esnext.set.from.js","../node_modules/core-js/modules/esnext.set.intersection.js","../node_modules/core-js/modules/esnext.set.is-disjoint-from.js","../node_modules/core-js/modules/esnext.set.is-subset-of.js","../node_modules/core-js/modules/esnext.set.is-superset-of.js","../node_modules/core-js/modules/esnext.set.join.js","../node_modules/core-js/modules/esnext.set.map.js","../node_modules/core-js/modules/esnext.set.of.js","../node_modules/core-js/modules/esnext.set.reduce.js","../node_modules/core-js/modules/esnext.set.some.js","../node_modules/core-js/modules/esnext.set.symmetric-difference.js","../node_modules/core-js/modules/esnext.set.union.js","../node_modules/core-js/modules/esnext.string.at.js","../node_modules/core-js/modules/esnext.string.code-points.js","../node_modules/core-js/modules/esnext.symbol.dispose.js","../node_modules/core-js/modules/esnext.symbol.observable.js","../node_modules/core-js/modules/esnext.symbol.pattern-match.js","../node_modules/core-js/modules/esnext.weak-map.delete-all.js","../node_modules/core-js/modules/esnext.weak-map.from.js","../node_modules/core-js/modules/esnext.weak-map.of.js","../node_modules/core-js/modules/esnext.weak-set.add-all.js","../node_modules/core-js/modules/esnext.weak-set.delete-all.js","../node_modules/core-js/modules/esnext.weak-set.from.js","../node_modules/core-js/modules/esnext.weak-set.of.js","../node_modules/core-js/modules/web.clear-immediate.js","../node_modules/core-js/modules/web.immediate.js","../node_modules/core-js/modules/web.set-immediate.js","../node_modules/clsx/dist/clsx.mjs","../node_modules/immer/src/utils/env.ts","../node_modules/immer/src/utils/errors.ts","../node_modules/immer/src/utils/common.ts","../node_modules/immer/src/utils/plugins.ts","../node_modules/immer/src/core/scope.ts","../node_modules/immer/src/core/finalize.ts","../node_modules/immer/src/core/proxy.ts","../node_modules/immer/src/core/immerClass.ts","../node_modules/immer/src/core/current.ts","../node_modules/immer/src/plugins/mapset.ts","../node_modules/immer/src/immer.ts","../node_modules/react-redux/src/utils/react-is.ts","../node_modules/react-redux/src/connect/selectorFactory.ts","../node_modules/react-redux/src/connect/wrapMapToProps.ts","../node_modules/react-redux/src/connect/invalidArgFactory.ts","../node_modules/react-redux/src/connect/mergeProps.ts","../node_modules/react-redux/src/utils/batch.ts","../node_modules/react-redux/src/utils/Subscription.ts","../node_modules/react-redux/src/utils/useIsomorphicLayoutEffect.ts","../node_modules/react-redux/src/utils/shallowEqual.ts","../node_modules/react-redux/src/utils/hoistStatics.ts","../node_modules/react-redux/src/components/Context.ts","../node_modules/react-redux/src/components/connect.tsx","../node_modules/react-redux/src/connect/mapStateToProps.ts","../node_modules/react-redux/src/connect/mapDispatchToProps.ts","../node_modules/react-redux/src/utils/bindActionCreators.ts","../node_modules/react-redux/src/components/Provider.tsx","../node_modules/react-redux/src/hooks/useReduxContext.ts","../node_modules/react-redux/src/hooks/useStore.ts","../node_modules/react-redux/src/hooks/useDispatch.ts","../node_modules/react-redux/src/hooks/useSelector.ts","../../ntg-utils/node_modules/react-i18next/node_modules/html-parse-stringify/src/parse-tag.js","../../ntg-utils/node_modules/react-i18next/node_modules/html-parse-stringify/src/parse.js","../../ntg-utils/node_modules/react-i18next/node_modules/html-parse-stringify/src/stringify.js","../../ntg-utils/node_modules/react-i18next/node_modules/html-parse-stringify/src/index.js","../../ntg-utils/node_modules/react-i18next/dist/es/utils.js","../../ntg-utils/node_modules/react-i18next/dist/es/unescape.js","../../ntg-utils/node_modules/react-i18next/dist/es/defaults.js","../../ntg-utils/node_modules/react-i18next/dist/es/i18nInstance.js","../../ntg-utils/node_modules/react-i18next/dist/es/TransWithoutContext.js","../../ntg-utils/node_modules/react-i18next/dist/es/initReactI18next.js","../../ntg-utils/node_modules/react-i18next/dist/es/context.js","../../ntg-utils/node_modules/react-i18next/dist/es/Trans.js","../../ntg-utils/node_modules/react-i18next/dist/es/useTranslation.js","../../ntg-utils/node_modules/react-i18next/dist/es/withTranslation.js","../../ntg-utils/node_modules/react-i18next/dist/es/Translation.js","../../ntg-utils/node_modules/react-i18next/dist/es/I18nextProvider.js","../../ntg-utils/node_modules/react-i18next/dist/es/useSSR.js","../../ntg-utils/node_modules/react-i18next/dist/es/withSSR.js","../../ntg-utils/node_modules/react-i18next/dist/es/index.js","../webpack/bootstrap","../webpack/runtime/amd options","../webpack/runtime/compat get default export","../webpack/runtime/create fake namespace object","../webpack/runtime/define property getters","../webpack/runtime/ensure chunk","../webpack/runtime/get javascript chunk filename","../webpack/runtime/get mini-css chunk filename","../webpack/runtime/global","../webpack/runtime/hasOwnProperty shorthand","../webpack/runtime/load script","../webpack/runtime/make namespace object","../webpack/runtime/publicPath","../webpack/runtime/css loading","../webpack/runtime/jsonp chunk loading","../webpack/startup"],"sourcesContent":["/* @flow */\n\nimport type { BasicFunction, KeyValuePair } from '@ntg/utils/dist/types';\nimport type {\n NETGEM_API_V8_FEED,\n NETGEM_API_V8_FEED_ITEM,\n NETGEM_API_V8_FEED_RAW_ITEM,\n NETGEM_API_V8_ITEM_LOCATION,\n NETGEM_API_V8_ITEM_LOCATION_TYPE,\n} from '../../../libs/netgemLibrary/v8/types/FeedItem';\nimport type { NETGEM_API_VIEWINGHISTORY_LOCATION, VIEWING_HISTORY_TYPE } from '../../../libs/netgemLibrary/v8/types/ViewingHistory';\nimport type { BO_FAVORITE_LIST_TYPE } from '../../../redux/netgemApi/actions/videofutur/types/favorite';\nimport type { CARD_DATA_MODAL_TYPE } from '../../modal/cardModal/CardModalConstsAndTypes';\nimport type { ChannelMap } from '../../../libs/netgemLibrary/v8/types/Channel';\nimport type { CombinedReducers } from '../../../redux/reducers';\nimport type { FeedRequestFunction } from '../../../libs/netgemLibrary/v8/types/Feed';\nimport { ISO8601_DURATION_ZERO } from '../../../helpers/dateTime/Format';\nimport { LoadableStatus } from '../../../helpers/loadable/loadable';\nimport type { NETGEM_API_V8_RAW_FEED } from '../../../libs/netgemLibrary/v8/types/FeedResult';\nimport type { NETGEM_API_V8_SECTION } from '../../../libs/netgemLibrary/v8/types/Section';\nimport { type NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE } from '../../../libs/netgemLibrary/v8/types/WidgetConfig';\nimport type { NETGEM_API_WISHLIST } from '../../../libs/netgemLibrary/v8/types/Wishlist';\nimport { SectionDisplayType } from '../../../helpers/ui/section/types';\nimport type { SortAndFilterType } from '../sortAndFilter/type';\n\nexport const FAKE_LOCATION: $ReadOnly = Object.freeze({\n channelId: '',\n duration: ISO8601_DURATION_ZERO,\n id: 'scheduledevent://',\n score: [0],\n startDate: '',\n});\n\nexport const FAKE_SCHEDULED_EVENT_ITEM: $ReadOnly = Object.freeze({\n id: '',\n locations: undefined,\n parentalGuidance: {\n explanatoryText: [],\n minimumAge: 0,\n },\n score: [0],\n});\n\nexport const FAKE_CHANNEL_ITEM: NETGEM_API_V8_FEED_RAW_ITEM = {\n id: '',\n locations: undefined,\n score: [0],\n};\n\nexport type LocalPlayedItemType = {|\n ...NETGEM_API_VIEWINGHISTORY_LOCATION,\n id: string,\n|};\n\nexport const PAGE_DISPLAY_COUNT = 2;\n\n// Z-index will go from 200 (first section) to 200-n (last section) to ensure zoomed tiles go over next section's title\nexport const MAX_Z_INDEX = 200;\n\nexport const SWIPE = {\n // Time to wait before actually setting isSwiping to false after \"swiped\" event has been called (avoid card opening when swiping)\n CooldownTime: 10,\n // Used to transform velocity in a page step when swiping a section\n PageVelocityStep: 5,\n};\n\nexport const LOCAL_PROVIDER_QUERY = {\n Catchup: 'catchup',\n Est: 'est',\n Recording: 'recording',\n Scheduledevent: 'scheduledevent',\n Svod: 'svod',\n Tvod: 'tvod',\n};\n\nexport enum StandardSectionType {\n Regular,\n Live,\n ViewingHistory,\n Wishlist,\n}\n\n// Cannot be converted to enum because it's used as a key in an object\nexport type INTERVAL_TYPE = 'LIVE_STANDARD_SECTION' | 'LIVE_CACHED_STANDARD_SECTION';\n\nexport type ReduxSectionDispatchToPropsType = {|\n +localCleanUpViewingHistory: (viewingHistory: VIEWING_HISTORY_TYPE, feed: NETGEM_API_V8_FEED, locationTypes: Set) => Promise,\n +localResetGridSectionId: BasicFunction,\n +localSavePageIndex: (sectionId: string, index: number) => void,\n +localSendV8LocationCatchupForAssetRequest: FeedRequestFunction,\n +localSendV8LocationEpgForAssetRequest: FeedRequestFunction,\n +localSendV8LocationVodForAssetRequest: FeedRequestFunction,\n +localSendV8SectionFeedRequest: (section: NETGEM_API_V8_SECTION, searchString: ?string, signal?: AbortSignal) => Promise,\n +localUpdateGridSectionId: (gridSectionId: string | null) => void,\n|};\n\nexport type ReduxSectionReducerStateType = {|\n +channels: ChannelMap,\n +favoriteList: BO_FAVORITE_LIST_TYPE,\n +gridSectionId: ?string,\n +isDebugModeEnabled: boolean,\n +isRegisteredAsGuest: boolean,\n +recordingsListFeed: NETGEM_API_V8_RAW_FEED,\n +sectionPageIndices: KeyValuePair,\n +sessionId: string,\n +state: CombinedReducers,\n +viewingHistory: VIEWING_HISTORY_TYPE,\n +viewingHistoryStatus: LoadableStatus,\n +wishlist: NETGEM_API_WISHLIST,\n +wishlistStatus: LoadableStatus,\n|};\n\nexport type DefaultProps = {|\n +cardData?: CARD_DATA_MODAL_TYPE | null,\n +hubItem?: NETGEM_API_V8_FEED_ITEM | null,\n +isGridAvenue?: boolean,\n +isInExploreModal?: boolean,\n +onItemClick?: NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE,\n +searchString?: string | null,\n|};\n\nexport type SectionPropType = {|\n ...DefaultProps,\n +avenueIndex: number,\n +dataLoadedCallback: (sectionId: string, sectionIndex: number, avenueIndex: number, itemCount: number) => void,\n +section: NETGEM_API_V8_SECTION,\n +sectionIndex: number,\n|};\n\nexport type CompleteSectionPropType = {|\n ...SectionPropType,\n ...ReduxSectionReducerStateType,\n ...ReduxSectionDispatchToPropsType,\n|};\n\nexport type SectionStateType = {|\n displayType: SectionDisplayType,\n feed: ?NETGEM_API_V8_FEED,\n isCollapsed: boolean,\n isDebugModePlus: boolean,\n isLive: boolean,\n isLoading: boolean,\n isSwiping: boolean,\n itemCountPerPage: number,\n maxPageIndex: number,\n pageIndex: number,\n savedPageIndex?: number,\n sortAndFilter: SortAndFilterType | null,\n updateDimensionsNeeded: boolean,\n|};\n","/* @flow */\n\nimport './ButtonFX.css';\nimport * as React from 'react';\nimport { HeightKind, WidthKind } from './types';\nimport { Theme, type ThemeType } from '@ntg/ui/dist/theme';\nimport { useCallback, useMemo, useRef, useState } from 'react';\nimport { BUTTON_HOVER_COLORS } from '../../helpers/ui/constants';\nimport InfiniteCircleLoader from '../loader/infiniteCircleLoader';\nimport ProgressBar from '../progressBar/ProgressBar';\nimport clsx from 'clsx';\nimport { showDebug } from '../../helpers/debug/debug';\nimport { useSelector } from 'react-redux';\n\n/* eslint-disable react/require-default-props */\ntype PropType = {|\n +allowZeroProgress?: boolean,\n +children: React.Node,\n +className?: string,\n +data?: any,\n +hasPadding?: boolean,\n +heightKind?: HeightKind,\n +isDisabled?: boolean,\n +isEmpty?: boolean,\n +isLoading?: boolean,\n +progress?: number | null,\n +onClick?: (event: SyntheticMouseEvent | SyntheticTouchEvent, data: any) => Promise | void,\n +theme?: ThemeType,\n +widthKind?: WidthKind,\n|};\n/* eslint-enable react/require-default-props */\n\nconst ButtonFX = ({\n allowZeroProgress = true,\n children,\n className,\n data,\n hasPadding = false,\n heightKind = HeightKind.Large,\n isDisabled = false,\n isEmpty = false,\n isLoading = false,\n onClick,\n progress,\n theme = Theme.Dark,\n widthKind = WidthKind.Large,\n}: PropType): React.Node => {\n const isDebugModeEnabled = useSelector((state) => state.appConfiguration.isDebugModeEnabled);\n const [isButtonDown, setIsButtonDown] = useState(false);\n const [isHovered, setIsHovered] = useState(false);\n const [mousePosition, setMousePosition] = useState({ x: 0, y: 0 });\n const hoverLayerElt = useRef(null);\n\n const showDebugInfo = useCallback(() => {\n showDebug('ButtonFX', {\n props: { allowZeroProgress, children, className, data, hasPadding, heightKind, isDisabled, isEmpty, isLoading, onClick: onClick ? '' : '', progress, theme, widthKind },\n propsFields: ['allowZeroProgress', 'children', 'className', 'data', 'hasPadding', 'heightKind', 'isDisabled', 'isEmpty', 'isLoading', 'onClick', 'progress'],\n state: { isButtonDown, isHovered, mousePosition },\n stateFields: ['isButtonDown', 'isHovered', 'mousePosition'],\n });\n }, [allowZeroProgress, children, className, data, hasPadding, heightKind, isButtonDown, isDisabled, isEmpty, isHovered, isLoading, mousePosition, onClick, progress, theme, widthKind]);\n\n const handleButtonOnClick = useCallback(\n (event: SyntheticMouseEvent | SyntheticTouchEvent) => {\n const { altKey, ctrlKey } = event;\n\n if (isDebugModeEnabled && (ctrlKey || altKey)) {\n event.preventDefault();\n event.stopPropagation();\n\n showDebugInfo();\n return;\n }\n\n if (isDisabled || isLoading || !onClick) {\n return;\n }\n\n onClick(event, data);\n },\n [isDebugModeEnabled, isDisabled, isLoading, onClick, showDebugInfo],\n );\n\n const handleMouseDown = useCallback(() => {\n setIsButtonDown(true);\n }, []);\n\n const handleMouseUp = useCallback(() => {\n setIsButtonDown(false);\n }, []);\n\n const handleMouseEnter = useCallback((event: SyntheticMouseEvent) => {\n setIsButtonDown(event.buttons === 1);\n setIsHovered(true);\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n setIsHovered(false);\n }, []);\n\n const handleMouseMove = useCallback((event: SyntheticMouseEvent) => {\n if (!hoverLayerElt.current) {\n return;\n }\n\n const { clientX, clientY } = event;\n const { left, top } = hoverLayerElt.current.getBoundingClientRect();\n\n setMousePosition({ x: clientX - left, y: clientY - top });\n }, []);\n\n const background = useMemo(() => {\n if (isHovered) {\n if (isButtonDown) {\n return BUTTON_HOVER_COLORS.Cursor;\n }\n\n const { x, y } = mousePosition;\n return `radial-gradient(circle at ${x}px ${y}px, ${BUTTON_HOVER_COLORS.Cursor} 0%, ${BUTTON_HOVER_COLORS.Main} 100%)`;\n }\n\n return 'none';\n }, [isButtonDown, isHovered, mousePosition]);\n\n const loaderElt = useMemo(\n () =>\n isLoading ? (\n
\n \n
\n ) : null,\n [isLoading],\n );\n\n const disabledLayerElt = useMemo(() => (isDisabled || isLoading ?
: null), [isDisabled, isLoading]);\n\n return (\n
\n
\n \n \n
{children}
\n
\n {disabledLayerElt}\n {loaderElt}\n
\n );\n};\n\nexport default ButtonFX;\n","/* @flow */\n\nexport enum WidthKind {\n Content = 'widthContent', // Adapt to content\n Stretched = 'widthStretched', // 100%\n Small = 'widthSmall', // 130px\n Large = 'widthLarge', // 210px\n}\n\nexport enum HeightKind {\n Stretched = 'heightStretched', // 100%\n Small = 'heightSmall', // 30px\n Medium = 'heightMedium', // 40px\n Large = 'heightLarge', // 46px\n}\n","/* @flow */\n\nimport './circleLoader.css';\nimport * as React from 'react';\nimport { useEffect, useState } from 'react';\nimport type { BasicFunction } from '@ntg/utils/dist/types';\n\nconst MAX_PERCENTAGE = 100;\nconst TWO = 2;\nconst RADIUS = 40;\n\n// Time to wait before calling the animation complete callback (in ms)\nconst ANIMATION_COMPLETE_TIMEOUT = 50;\n\n// Circumference is ~251.3\nconst CIRCUMFERENCE = Math.PI * RADIUS * TWO;\n\ntype CircleLoaderPropType = {|\n +hidePercentage?: boolean, // eslint-disable-line react/require-default-props\n +onAnimationCompleted: BasicFunction,\n +progress: number,\n|};\n\nconst renderPercentage = (hidePercentage: boolean, progress: number): React.Node => {\n if (hidePercentage) {\n return null;\n }\n\n return
{Math.min(progress, MAX_PERCENTAGE)}%
;\n};\n\nconst CircleLoader = ({ hidePercentage = false, onAnimationCompleted, progress }: CircleLoaderPropType): React.Node => {\n const [timer, setTimer] = useState(null);\n const [percentage, setPercentage] = useState(0);\n\n useEffect(() => {\n setPercentage(Math.min(((MAX_PERCENTAGE - progress) / MAX_PERCENTAGE) * CIRCUMFERENCE, CIRCUMFERENCE));\n }, [progress]);\n\n // Initialization\n useEffect(() => {\n const resetTimer = () => {\n if (timer) {\n clearTimeout(timer);\n setTimer(null);\n }\n };\n\n return () => {\n resetTimer();\n };\n }, []);\n\n useEffect(() => {\n if (onAnimationCompleted && progress >= MAX_PERCENTAGE) {\n // Following time ensures that the animation is shown (even briefly), otherwise, we get some ugly blinking visual glitch\n setTimer(setTimeout(onAnimationCompleted, ANIMATION_COMPLETE_TIMEOUT));\n }\n }, [onAnimationCompleted, progress, setTimer]);\n\n return (\n
\n \n \n \n \n {renderPercentage(hidePercentage, progress)}\n
\n );\n};\n\nexport default CircleLoader;\n","/* @flow */\n\nimport './infiniteCircleLoader.css';\nimport * as React from 'react';\nimport { Theme, type ThemeType } from '@ntg/ui/dist/theme';\nimport clsx from 'clsx';\n\n/* eslint-disable react/require-default-props */\ntype InfiniteCircleLoaderPropType = {|\n +className?: string,\n +theme?: ThemeType,\n|};\n/* eslint-enable react/require-default-props */\n\nconst InfiniteCircleLoader = ({ className, theme = Theme.Dark }: InfiniteCircleLoaderPropType): React.Node => (\n
\n \n \n \n
\n);\n\nexport default InfiniteCircleLoader;\n","/* @flow */\n\nimport './ConfirmationModal.css';\nimport * as React from 'react';\nimport ButtonFX from '../../buttons/ButtonFX';\nimport Modal from '../modal';\nimport { ModalIcon } from '../modalTypes';\nimport type { ModalState } from '../../../redux/modal/reducers';\nimport { WidthKind } from '../../buttons/types';\nimport { connect } from 'react-redux';\n\nconst { Fragment } = React;\n\nexport enum ConfirmationModalResult {\n Button1,\n Button2,\n Cancel,\n}\n\nexport type CONFIRMATION_DATA_MODAL_TYPE = {|\n button1Title: string,\n button2Title: string,\n header?: string,\n icon?: ModalIcon,\n question: string,\n title?: string,\n|};\n\nclass ConfirmationModalView extends React.PureComponent {\n modal: React.ElementRef | null;\n\n constructor(...args: Array) {\n super(...args);\n\n this.modal = null;\n }\n\n close = (result: ConfirmationModalResult): void => {\n const { modal } = this;\n\n if (modal) {\n modal.close(result);\n }\n };\n\n handleButton1OnClick: () => void = () => {\n this.close(ConfirmationModalResult.Button1);\n };\n\n handleButton2OnClick: () => void = () => {\n this.close(ConfirmationModalResult.Button2);\n };\n\n renderQuestion = (): React.Node => {\n const { confirmationData } = this.props;\n\n if (!confirmationData) {\n return null;\n }\n\n const { question } = confirmationData;\n\n return (\n
\n {question.split('\\n').map((line) => (\n \n {line}\n
\n
\n ))}\n
\n );\n };\n\n renderButtons = (): React.Node => {\n const { confirmationData } = this.props;\n\n if (!confirmationData) {\n return null;\n }\n\n const { button1Title, button2Title } = confirmationData;\n\n return (\n
\n \n {button1Title}\n \n \n {button2Title}\n \n
\n );\n };\n\n render(): React.Node {\n const { confirmationData, index } = this.props;\n\n if (!confirmationData) {\n return null;\n }\n\n const { header, icon, title } = confirmationData;\n\n return (\n {\n this.modal = instance;\n }}\n title={title}\n >\n {this.renderQuestion()}\n {this.renderButtons()}\n \n );\n }\n}\n\nconst ConfirmationModal: React.ComponentType = connect(null, null, null, { forwardRef: true })(ConfirmationModalView);\n\nexport default ConfirmationModal;\n","/* @flow */\n\nimport './modal.css';\nimport * as React from 'react';\nimport { Messenger, MessengerEvents } from '@ntg/utils/dist/messenger';\nimport { PictoArrowLeft, PictoCart, PictoFailure, PictoInfo, PictoRecord, PictoUser, PictoX } from '@ntg/components/dist/pictos/Element';\nimport { Theme, type ThemeType } from '@ntg/ui/dist/theme';\nimport type { BasicFunction } from '@ntg/utils/dist/types';\nimport type { CombinedReducers } from '../../redux/reducers';\nimport type { Dispatch } from '../../redux/types/types';\nimport HotKeys from '../../helpers/hotKeys/hotKeys';\nimport { ModalIcon } from './modalTypes';\nimport clsx from 'clsx';\nimport { connect } from 'react-redux';\nimport { hideModal } from '../../redux/modal/actions';\n\ntype ReduxModalReducerStateType = {|\n +openModalCount: number,\n|};\n\ntype DefaultProps = {|\n +backCallback?: (data: any) => void,\n +canCloseOnEnter?: boolean,\n +canCloseOnEscape?: boolean,\n +canCloseOnOverlayClick?: boolean,\n +className?: string | null,\n +hasSeparator?: boolean,\n +header?: React.Node,\n +icon?: ModalIcon,\n +index?: number,\n +isCloseButtonDisplayed?: boolean,\n +theme?: ThemeType,\n +title?: string | null,\n|};\n\ntype ModalPropType = {|\n ...DefaultProps,\n +children: React.Node,\n|};\n\ntype ReduxModalDispatchToPropsType = {|\n +localHideModal: BasicFunction,\n|};\n\ntype ModalStateType = {|\n closingData: any,\n isClosing: boolean,\n isClosingEnabled: boolean,\n|};\n\nconst InitialState = Object.freeze({\n closingData: null,\n isClosing: false,\n isClosingEnabled: true,\n});\n\ntype CompleteModalPropType = {|\n ...ModalPropType,\n ...ReduxModalReducerStateType,\n ...ReduxModalDispatchToPropsType,\n|};\n\n// Used to stack modals on top of each others\nconst Z_INDEX = Object.freeze({\n ContentBase: 10100,\n OverlayBase: 10000,\n Shift: 200,\n});\n\nclass ModalView extends React.PureComponent {\n isMouseDown: boolean;\n\n static defaultProps: DefaultProps = {\n backCallback: undefined,\n canCloseOnEnter: true,\n canCloseOnEscape: true,\n canCloseOnOverlayClick: true,\n className: null,\n hasSeparator: false,\n header: null,\n icon: ModalIcon.None,\n index: 0,\n isCloseButtonDisplayed: true,\n theme: Theme.Dark,\n title: '',\n };\n\n constructor(props: CompleteModalPropType) {\n super(props);\n\n this.isMouseDown = false;\n\n this.state = { ...InitialState };\n }\n\n componentDidMount() {\n const { canCloseOnEnter, canCloseOnEscape } = this.props;\n\n if (canCloseOnEnter) {\n HotKeys.register('enter', this.handleCloseHotKey, {\n disableOthers: true,\n name: 'Modal.enterClose',\n });\n }\n if (canCloseOnEscape) {\n HotKeys.register('escape', this.handleCloseHotKey, {\n disableOthers: true,\n name: 'Modal.escapeClose',\n });\n }\n }\n\n componentWillUnmount() {\n const { canCloseOnEnter, canCloseOnEscape } = this.props;\n\n if (canCloseOnEnter) {\n HotKeys.unregister('enter', this.handleCloseHotKey);\n }\n if (canCloseOnEscape) {\n HotKeys.unregister('escape', this.handleCloseHotKey);\n }\n }\n\n handleCloseHotKey = (event: SyntheticKeyboardEvent) => {\n const { isClosingEnabled } = this.state;\n\n event.preventDefault();\n event.stopPropagation();\n\n if (isClosingEnabled) {\n this.cancel();\n }\n };\n\n handleOverlayOnMouseDown: () => void = () => {\n this.isMouseDown = true;\n };\n\n handleOverlayOnMouseUp: () => void = () => {\n const { isMouseDown } = this;\n\n if (isMouseDown) {\n this.cancel();\n this.isMouseDown = false;\n }\n };\n\n close = (data: any) => {\n const { index, openModalCount } = this.props;\n\n if (typeof index !== 'number' || index + 1 < openModalCount) {\n // A keyboard event was captured by multiple modals but only the top-most should be closed\n return;\n }\n\n this.setState({\n closingData: data,\n isClosing: true,\n });\n };\n\n cancel = () => {\n this.close();\n };\n\n handleCloseButtonOnClick: () => void = this.cancel;\n\n // eslint-disable-next-line react/no-unused-class-component-methods\n enableClosing = () => {\n this.setState({ isClosingEnabled: true });\n };\n\n // eslint-disable-next-line react/no-unused-class-component-methods\n disableClosing = () => {\n this.setState({ isClosingEnabled: false });\n };\n\n handleDialogOnMouseDown = (event: SyntheticMouseEvent | SyntheticTouchEvent) => {\n event.stopPropagation();\n };\n\n handleBackButtonOnClick = () => {\n const { backCallback } = this.props;\n\n if (backCallback) {\n backCallback();\n }\n };\n\n handleContentOnAnimationEnd = () => {\n const { localHideModal } = this.props;\n const { closingData, isClosing } = this.state;\n\n if (isClosing) {\n localHideModal();\n\n Messenger.emit(MessengerEvents.MODAL_CONFIRMATION_CLOSED, closingData);\n }\n };\n\n // eslint-disable-next-line consistent-return\n renderPicto = (icon: ModalIcon): React.Node => {\n switch (icon) {\n case ModalIcon.None:\n return null;\n case ModalIcon.Cart:\n return ;\n case ModalIcon.Info:\n return ;\n case ModalIcon.Error:\n return ;\n case ModalIcon.Record:\n return ;\n case ModalIcon.User:\n return ;\n\n // No default\n }\n };\n\n renderIcon = (): React.Node => {\n const { icon = ModalIcon.None } = this.props;\n const { isClosing } = this.state;\n\n if (icon === ModalIcon.None) {\n return null;\n }\n\n const pictoElt = this.renderPicto(icon);\n\n return (\n
\n \n \n \n {pictoElt}\n
\n );\n };\n\n render(): React.Node {\n const { backCallback, canCloseOnOverlayClick, children, className, hasSeparator, header, icon, isCloseButtonDisplayed, index = 0, theme, title } = this.props;\n const { isClosing, isClosingEnabled } = this.state;\n\n const handleOverlayOnMouseDown = canCloseOnOverlayClick && isClosingEnabled ? this.handleOverlayOnMouseDown : undefined;\n const handleOverlayOnMouseUp = canCloseOnOverlayClick && isClosingEnabled ? this.handleOverlayOnMouseUp : undefined;\n\n const closeButton = isCloseButtonDisplayed ? : null;\n const backButton = backCallback ? : null;\n\n const titleElement = (\n
\n {title}\n
\n );\n\n const shift = index * Z_INDEX.Shift;\n const overlayStyle = { zIndex: Z_INDEX.OverlayBase + shift };\n const contentStyle = { zIndex: Z_INDEX.ContentBase + shift };\n\n const headerElement = header !== null ?
{header}
: null;\n\n return (\n
\n
\n
\n
\n
\n
\n {backButton}\n {titleElement}\n {closeButton}\n
\n {headerElement}\n {children}\n
\n {this.renderIcon()}\n
\n
\n
\n );\n }\n}\n\nconst mapStateToProps = (state: CombinedReducers) => {\n return {\n openModalCount: state.modal.openModals.length,\n };\n};\n\nconst mapDispatchToProps = (dispatch: Dispatch): ReduxModalDispatchToPropsType => {\n return {\n localHideModal: () => dispatch(hideModal(false, true)),\n };\n};\n\nconst Modal: React.ComponentType = connect(mapStateToProps, mapDispatchToProps, null, { forwardRef: true })(ModalView);\n\nexport default Modal;\n","/* @flow */\n\nexport const AUTHENTICATION_REQUIRED_MODAL: 'AUTHENTICATION_REQUIRED_MODAL' = 'AUTHENTICATION_REQUIRED_MODAL';\nexport const AVENUE_MODAL: 'AVENUE_MODAL' = 'AVENUE_MODAL';\nexport const CARD_MODAL: 'CARD_MODAL' = 'CARD_MODAL';\nexport const CONFIRMATION_MODAL: 'CONFIRMATION_MODAL' = 'CONFIRMATION_MODAL';\nexport const EXTERNAL_CONTENT_MODAL: 'EXTERNAL_CONTENT_MODAL' = 'EXTERNAL_CONTENT_MODAL';\nexport const KEYBOARD_SHORTCUTS_MODAL: 'KEYBOARD_SHORTCUTS_MODAL' = 'KEYBOARD_SHORTCUTS_MODAL';\nexport const LEGAL_NOTICE_MODAL: 'LEGAL_NOTICE_MODAL' = 'LEGAL_NOTICE_MODAL';\nexport const MESSAGE_MODAL: 'MESSAGE_MODAL' = 'MESSAGE_MODAL';\nexport const NEW_VERSION_MODAL: 'NEW_VERSION_MODAL' = 'NEW_VERSION_MODAL';\nexport const NPVR_HELP_MODAL: 'NPVR_HELP_MODAL' = 'NPVR_HELP_MODAL';\nexport const NPVR_MODAL: 'NPVR_MODAL' = 'NPVR_MODAL';\nexport const VOD_PURCHASE_MODAL: 'VOD_PURCHASE_MODAL' = 'VOD_PURCHASE_MODAL';\n\nexport type MODAL_TYPE =\n | typeof AUTHENTICATION_REQUIRED_MODAL\n | typeof AVENUE_MODAL\n | typeof CARD_MODAL\n | typeof CONFIRMATION_MODAL\n | typeof EXTERNAL_CONTENT_MODAL\n | typeof KEYBOARD_SHORTCUTS_MODAL\n | typeof LEGAL_NOTICE_MODAL\n | typeof MESSAGE_MODAL\n | typeof NEW_VERSION_MODAL\n | typeof NPVR_HELP_MODAL\n | typeof NPVR_MODAL\n | typeof VOD_PURCHASE_MODAL;\n\nexport enum ModalIcon {\n None,\n Cart,\n Info,\n Error,\n Record,\n User,\n}\n","/* @flow */\n\nimport './MultipleChoices.css';\nimport * as React from 'react';\nimport ResizeDetectorWrapper, { type ResizeType } from '../resizeDetectorWrapper/ResizeDetectorWrapper';\nimport { Setting } from '../../helpers/settings/types';\nimport clsx from 'clsx';\n\nexport enum LabelWidth {\n Large = 'large',\n Medium = 'medium',\n Small = 'small',\n}\n\ntype ChoicesType = $ReadOnlyArray<{| text: string, value: any |}>;\n\ntype DefaultProps = {|\n +isDisabled?: boolean,\n +setting?: Setting,\n +requestedLabelWidth?: LabelWidth,\n|};\n\ntype MultipleChoicesPropType = {|\n ...DefaultProps,\n +choices: ChoicesType,\n +onSelectionChanged: (value: any, setting?: Setting, index: number) => void,\n +selectedIndex: number,\n|};\n\nclass MultipleChoices extends React.PureComponent {\n labels: HTMLElement | null;\n\n labelWidth: number;\n\n static defaultProps: DefaultProps = {\n isDisabled: false,\n requestedLabelWidth: LabelWidth.Large,\n setting: undefined,\n };\n\n constructor(...args: Array) {\n super(...args);\n\n this.labels = null;\n this.labelWidth = 0;\n }\n\n componentDidMount() {\n const {\n choices: { length },\n } = this.props;\n const { labels } = this;\n\n if (!labels) {\n return;\n }\n\n labels.style.setProperty('--choice-count', length.toString());\n this.labelWidth = labels.offsetWidth / length;\n const height = labels.offsetHeight;\n labels.style.setProperty('--label-width', `${this.labelWidth}px`);\n labels.style.setProperty('--label-height', `${height}px`);\n\n this.updateSelectionBackground();\n }\n\n componentDidUpdate(prevProps: MultipleChoicesPropType) {\n const { selectedIndex } = this.props;\n const { selectedIndex: prevSelectedIndex } = prevProps;\n\n if (selectedIndex !== prevSelectedIndex) {\n this.updateSelectionBackground();\n }\n }\n\n handleLabelsOnResize = (data: ResizeType): void => {\n const {\n choices: { length },\n } = this.props;\n const { labels } = this;\n const { height, width } = data;\n\n if (!labels || width === null || height === null) {\n // Component not mounted or no label\n return;\n }\n\n this.labelWidth = width / length;\n\n labels.style.setProperty('--label-width', `${this.labelWidth}px`);\n labels.style.setProperty('--label-height', `${height}px`);\n\n this.updateSelectionBackground();\n };\n\n updateSelectionBackground = (): void => {\n const { selectedIndex } = this.props;\n const { labels, labelWidth } = this;\n\n if (!labels) {\n return;\n }\n\n labels.style.setProperty('--offset-x', `${selectedIndex * labelWidth}px`);\n };\n\n handleOnClick = (event: SyntheticMouseEvent | SyntheticTouchEvent): void => {\n const {\n currentTarget: {\n dataset: { index: indexStr },\n },\n } = event;\n const index = parseInt(indexStr, 10);\n const {\n choices: {\n [index]: { value },\n },\n isDisabled,\n onSelectionChanged,\n setting,\n } = this.props;\n\n if (isDisabled) {\n return;\n }\n\n onSelectionChanged(value, setting, index);\n };\n\n render(): React.Node {\n const { choices, isDisabled, requestedLabelWidth = LabelWidth.Large, selectedIndex } = this.props;\n\n return (\n
\n {\n this.labels = instance;\n }}\n >\n {choices.map((choice, index) => (\n
\n {choice.text}\n
\n ))}\n
\n
\n \n
\n );\n }\n}\n\nexport default (MultipleChoices: React.ComponentType);\n","/* @flow */\n\nimport { BO_INVALID_APPLICATION_V2, BO_INVALID_JWT_V2, BO_INVALID_SUBSCRIBER_V2, BO_STREAM_DEVICE_NOT_FOUND } from '../../libs/netgemLibrary/videofutur/types/ErrorCodes';\nimport type { KeyValuePair, Undefined } from '@ntg/utils/dist/types';\nimport { type NETGEM_API_V8_FEED_RAW_ITEM, NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT } from '../../libs/netgemLibrary/v8/types/FeedItem';\nimport { type NETGEM_API_V8_METADATA_SCHEDULE_VIDEO_STREAM_PARAM, type NETGEM_API_V8_PLAYBACK_URL, StreamType } from '../../libs/netgemLibrary/v8/types/MetadataSchedule';\nimport type { STREAM_PRIORITIES_BY_TYPE_TYPE, STREAM_PRIORITIES_TYPE } from '../../helpers/ui/metadata/Types';\nimport { SubtitlesMimeType, VIDEOPLAYER_ERRORS, type VideoPlayerExternalSubtitles, type VideoPlayerInitData } from './implementation/types';\nimport { compareDrmsFromName, getSupportedDrms, getSupportedTypesPerDrm, isDrmSupported } from '../../helpers/jsHelpers/Drm';\nimport { getLocationStartAndEndTime, getLocationType } from '../../libs/netgemLibrary/v8/helpers/Item';\nimport type { BO_API_ERROR_TYPE } from '../../redux/netgemApi/actions/videofutur/types/common';\nimport { CustomNetworkError } from '../../libs/netgemLibrary/helpers/CustomNetworkError';\nimport DidomiWrapper from '../../helpers/consent/didomi';\nimport type { NETGEM_API_CHANNEL } from '../../libs/netgemLibrary/v8/types/Channel';\n\nconst filterSubtitlesTrack = (map: Map>, subtitles: VideoPlayerExternalSubtitles) => {\n const { captions, format, language, mimeType, url } = subtitles;\n\n // Copy subtitles because object is coming from location metadata which is already stored into Player's state through immer\n const subtitlesCopy = { ...subtitles };\n\n if (!mimeType) {\n /*\n * If mime type is not provided, try to deduce it from format or URL\n * Mime type will be used later by Shaka Player when loading sidecar subtitles\n */\n subtitlesCopy.mimeType = getMimeType(format, url);\n }\n if (!subtitlesCopy.mimeType) {\n return;\n }\n\n let subsForLanguage = map.get(language);\n\n if (subsForLanguage && subsForLanguage.length > 0) {\n // Subtitles for same language have already been found\n const pos = subsForLanguage.findIndex((s) => s.captions === captions && s.mimeType !== mimeType);\n\n if (pos > -1) {\n // Subtitles for same language and same captions but different mime type\n const { [pos]: subsOtherMimeType } = subsForLanguage;\n if (subsOtherMimeType.mimeType === SubtitlesMimeType.TTML && subtitlesCopy.mimeType === SubtitlesMimeType.WebVTT) {\n // Replace TTML subtitles by WebVTT ones\n subsForLanguage[pos] = subtitlesCopy;\n }\n } else {\n // Add subtitles to list of existing subtitles for this language\n subsForLanguage.push(subtitlesCopy);\n }\n } else {\n // Create map entry and array of subtitles\n subsForLanguage = [subtitlesCopy];\n map.set(language, subsForLanguage);\n }\n};\n\n// Filter subtitles by removing same language and role with different format (WebVTT > TTML)\nconst filterExternalSubtitles = (subtitles?: Array): Array => {\n if (subtitles === undefined) {\n return [];\n }\n\n const map = new Map>();\n subtitles.forEach((subs) => filterSubtitlesTrack(map, subs));\n\n // Convert map back to array\n const filteredSubs = [];\n map.forEach((subsForLanguage) => subsForLanguage.forEach((subs) => filteredSubs.push(subs)));\n\n return filteredSubs;\n};\n\nconst getMimeType = (format: ?string, url: string): Undefined => {\n if (format) {\n // Use specified format\n const lcFormat = format.toLowerCase();\n if (lcFormat === 'ttml') {\n return SubtitlesMimeType.TTML;\n }\n if (lcFormat === 'webvtt' || lcFormat === 'vtt') {\n return SubtitlesMimeType.WebVTT;\n }\n }\n\n // Try to determine format through URL\n if (/ttml/iu.test(url)) {\n return SubtitlesMimeType.TTML;\n } else if (/\\.vtt/iu.test(url)) {\n return SubtitlesMimeType.WebVTT;\n }\n\n return undefined;\n};\n\n// Return a list of supported streams\nconst getStreamsFromPlaybackUrls = (streamPriorities: STREAM_PRIORITIES_TYPE | null, playbackUrls: Array): { allStreams: ?Array, errorCode: ?string } => {\n const [\n {\n player,\n start: { params },\n },\n ] = playbackUrls;\n const videostreams = params?.find((p) => p.name === 'videostreams');\n if (!videostreams) {\n return {\n allStreams: null,\n errorCode: VIDEOPLAYER_ERRORS.VS002StreamNotFound,\n };\n }\n\n const {\n value: { args: streams },\n } = videostreams;\n\n if (streams.length === 0) {\n return {\n allStreams: null,\n errorCode: VIDEOPLAYER_ERRORS.VS002StreamNotFound,\n };\n }\n\n // Create an array of well-supported streams\n const supportedTypes = getSupportedTypes();\n const allStreams: Array = [];\n let drmStreamFound = false;\n\n for (let j = 0; j < streams.length; ++j) {\n const { [j]: stream } = streams;\n const { drms, path, properties, type } = ((stream: any): NETGEM_API_V8_METADATA_SCHEDULE_VIDEO_STREAM_PARAM);\n const isTypeSupported = supportedTypes.includes(type);\n\n if (drms && drms.length > 0) {\n // DRM is present\n for (let k = 0; k < drms.length; ++k) {\n drmStreamFound = true;\n const {\n [k]: { type: drmType, laUrl, ntgEntitlement },\n } = drms;\n if (isDrmSupported(drmType) && isTypeSupported) {\n allStreams.push({\n drm: drmType,\n laUrl: laUrl?.url ?? null,\n ntgEntitlement,\n path,\n properties,\n type,\n });\n }\n }\n } else {\n // No DRM\n allStreams.push({\n path,\n properties,\n type,\n });\n }\n }\n\n if (allStreams.length === 0) {\n return {\n allStreams: null,\n errorCode: drmStreamFound ? VIDEOPLAYER_ERRORS.VD002DrmNotSupportedError : VIDEOPLAYER_ERRORS.VS001NoStreamSupported,\n };\n }\n\n return {\n allStreams: sortStreams(streamPriorities, allStreams, player),\n errorCode: null,\n };\n};\n\nconst getSupportedTypes = (): Array => {\n const supportedTypes: Array = [];\n\n getSupportedDrms().forEach((drm) => supportedTypes.push(...getSupportedTypesPerDrm(drm)));\n\n return supportedTypes;\n};\n\nconst getVideoStreamDataFromPlatformChannel = (channel: NETGEM_API_CHANNEL): {| errorCode?: string, initData: VideoPlayerInitData | null |} => {\n const { epgid: channelId, info } = channel;\n\n const notFound = { errorCode: VIDEOPLAYER_ERRORS.VS002StreamNotFound, initData: null };\n\n if (!info) {\n return notFound;\n }\n\n const { urlContentType } = info;\n if (!urlContentType) {\n return notFound;\n }\n\n const { playbacks } = urlContentType;\n if (!playbacks || playbacks.length === 0) {\n return notFound;\n }\n\n const [\n {\n start: { params, uri },\n },\n ] = playbacks;\n if (uri !== '{videostreams}' || params.length === 0) {\n return notFound;\n }\n\n const [\n {\n value: { args },\n },\n ] = params;\n if (args.length === 0) {\n return notFound;\n }\n\n for (const { drms, path: url, type } of args) {\n // No DRM\n if (drms.length === 0) {\n return {\n initData: {\n channelId,\n type,\n url,\n },\n };\n }\n\n const [{ type: drm, ntgEntitlement }] = drms;\n\n // Fast channel\n if (ntgEntitlement?.service === 'fastchannel') {\n return {\n initData: {\n channelId,\n ntgEntitlement,\n type,\n url,\n },\n };\n }\n\n if (isDrmSupported(drm)) {\n return {\n initData: {\n channelId,\n drm,\n ntgEntitlement,\n type,\n url,\n },\n };\n }\n }\n\n return notFound;\n};\n\nconst getVideoStreamDataFromDmsChannel = (channel: NETGEM_API_CHANNEL): {| errorCode?: string, initData: VideoPlayerInitData | null |} => {\n const {\n data: {\n stream: { drmType, msdrmCustomData, service, type },\n },\n epgid: channelId,\n isFastChannel,\n url,\n } = channel;\n\n const localUrl = isFastChannel ? DidomiWrapper.addFastChannelConsent(url) : url;\n\n if (type === undefined) {\n return { errorCode: VIDEOPLAYER_ERRORS.VS002StreamNotFound, initData: null };\n }\n\n if (!isDrmSupported(drmType)) {\n return { errorCode: VIDEOPLAYER_ERRORS.VD002DrmNotSupportedError, initData: null };\n }\n\n if (!service || !msdrmCustomData) {\n // No entitlement\n return {\n initData: {\n channelId,\n drm: drmType,\n type,\n url: localUrl,\n },\n };\n }\n\n return {\n initData: {\n channelId,\n drm: drmType,\n ntgEntitlement: {\n customData: msdrmCustomData,\n service,\n url: localUrl,\n },\n type,\n url: localUrl,\n },\n };\n};\n\nconst getVideoStreamDataFromChannel = (channel: NETGEM_API_CHANNEL): {| errorCode?: string, initData: VideoPlayerInitData | null |} => {\n const ptfResult = getVideoStreamDataFromPlatformChannel(channel);\n const { errorCode: ptfErrorCode, initData: ptfInitData } = ptfResult;\n\n if (ptfInitData !== null) {\n return ptfResult;\n }\n\n const dmsResult = getVideoStreamDataFromDmsChannel(channel);\n const { errorCode: dmsErrorCode, initData: dmsInitData } = dmsResult;\n\n if (dmsInitData !== null) {\n return dmsResult;\n }\n\n return {\n errorCode: dmsErrorCode ?? ptfErrorCode,\n initData: null,\n };\n};\n\nconst getClosestStartTime = (item: NETGEM_API_V8_FEED_RAW_ITEM): number => {\n const stack = [item];\n let closestStartTime = 0;\n\n while (stack.length > 0) {\n const rawItem = stack.pop();\n\n // Since flowjs v0.239.0, \"rawItem\" is said to be potentially undefined (which is impossible, here)\n if (!rawItem) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const { elements, locations } = rawItem;\n\n if (elements) {\n for (let i = 0; i < elements.length; ++i) {\n stack.unshift(elements[i]);\n }\n } else if (locations) {\n for (let j = 0; j < locations.length; ++j) {\n const { [j]: location } = locations;\n const { id } = location;\n const locType = getLocationType(id);\n if (locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT) {\n const { startTime } = getLocationStartAndEndTime(location);\n if (startTime > closestStartTime) {\n closestStartTime = startTime;\n }\n }\n }\n }\n }\n\n return closestStartTime;\n};\n\nconst sortStreams = (streamPriorities: STREAM_PRIORITIES_TYPE | null, streams: Array, player: string): Array => {\n let priorities: ?STREAM_PRIORITIES_BY_TYPE_TYPE = null;\n if (streamPriorities) {\n priorities = streamPriorities[player] || streamPriorities.default;\n }\n\n // Sort bitrates inside each stream\n streams.forEach((a) => {\n if (a.properties && a.properties.videos && a.properties.videos.length > 0) {\n a.properties.videos.sort((b, c) => c.bitrate - b.bitrate);\n } else {\n a.properties = { videos: [{ bitrate: 0 }] };\n }\n });\n\n // Sort per DRM (streams with DRM first), then per format then per bitrate\n streams.sort((a, b) => {\n if (a.drm && !b.drm) {\n return -1;\n }\n if (!a.drm && b.drm) {\n return 1;\n }\n\n const drmComparison = compareDrmsFromName(a.drm, b.drm);\n if (drmComparison !== 0) {\n return drmComparison;\n }\n\n if (priorities) {\n const index1 = priorities[a.type];\n const index2 = priorities[b.type];\n if (index1 !== index2) {\n return index1 - index2;\n }\n }\n\n return b.properties.videos[0].bitrate - a.properties.videos[0].bitrate;\n });\n\n return streams;\n};\n\n/* eslint-disable no-magic-numbers */\nconst getHtmlMediaErrorText = (code: number): string => {\n switch (code) {\n case 1:\n return 'MEDIA_ERR_ABORTED';\n case 2:\n return 'MEDIA_ERR_NETWORK';\n case 3:\n return 'MEDIA_ERR_DECODE';\n case 4:\n return 'MEDIA_ERR_SRC_NOT_SUPPORTED';\n default:\n return `UNKNOWN (code: ${code})`;\n }\n};\n/* eslint-enable no-magic-numbers */\n\nconst isInvalidTokenError = (error: Error | BO_API_ERROR_TYPE): boolean => {\n if (!(error instanceof CustomNetworkError)) {\n return false;\n }\n\n const code = error.getCustomCode();\n return code === BO_STREAM_DEVICE_NOT_FOUND || code === BO_INVALID_JWT_V2 || code === BO_INVALID_APPLICATION_V2 || code === BO_INVALID_SUBSCRIBER_V2;\n};\n\nconst getInitDataAsSentryContext = (initData: ?VideoPlayerInitData): KeyValuePair => {\n if (!initData) {\n return {};\n }\n\n const {\n audioLanguage,\n channelId,\n customHeaders,\n drm,\n fairplayCertificateUrl,\n fairplayContentKeySystem,\n laUrl,\n manifestUpdatePeriod,\n maxBitrate,\n ntgEntitlement,\n subtitlesLanguage,\n trackingStart,\n type,\n url,\n vuDrmToken,\n } = initData;\n\n return {\n audioLanguage,\n channelId,\n customHeaders: JSON.stringify(customHeaders),\n drm: drm ? (drm: string) : 'undefined',\n fairplayCertificateUrl,\n fairplayContentKeySystem,\n laUrl,\n manifestUpdatePeriod,\n maxBitrate,\n ntgEntitlement: JSON.stringify(ntgEntitlement),\n subtitlesLanguage,\n trackingStart: JSON.stringify(trackingStart),\n type: (type: string),\n url,\n vuDrmToken,\n };\n};\n\nexport { filterExternalSubtitles, getClosestStartTime, getHtmlMediaErrorText, getInitDataAsSentryContext, getStreamsFromPlaybackUrls, getVideoStreamDataFromChannel, isInvalidTokenError };\n","/* @flow */\n\nimport type { ShakaOfflineContent, ShakaOfflineExtraMetadata, ShakaOfflineMetadata, ShakaOfflineProgressUpdate, ShakaOfflineTrackSelection } from './shakaTypes';\nimport { logError } from '../../../helpers/debug/debug';\nimport shaka from 'shaka-player/dist/shaka-player.compiled';\n\nclass ShakaStorage {\n // $FlowFixMe: not Flow-typed\n static storage: shaka.offline.Storage | null = null;\n\n static inProgress: Map = new Map();\n\n // $FlowFixMe: Flow does not support symbols yet\n get [Symbol.toStringTag]() {\n return 'ShakaStorage';\n }\n\n // $FlowFixMe: not Flow-typed\n static getInstance: () => shaka.offline.Storage = () => {\n if (ShakaStorage.storage === null) {\n ShakaStorage.storage = new shaka.offline.Storage();\n }\n\n return ShakaStorage.storage;\n };\n\n static listContent: () => Promise | null> = async () => {\n try {\n return await ShakaStorage.getInstance().list();\n } catch (error) {\n logError(`Error retrieving offline content: ${error.message}`);\n return null;\n }\n };\n\n static exists: (manifestUrl: string) => Promise = async (manifestUrl) => {\n const allContent = await ShakaStorage.listContent();\n if (allContent === null) {\n return false;\n }\n\n return allContent.some(({ originalManifestUri }) => originalManifestUri === manifestUrl);\n };\n\n // $FlowFixMe: not Flow-typed\n static loadContent: (player: shaka.Player, offlineUri: string) => Promise = async (player, offlineUri) => {\n try {\n await player.load(offlineUri);\n return true;\n } catch (error) {\n logError(`Error playing offline content: ${error.message}`);\n return false;\n }\n };\n\n static removeContent: (offlineUri: string) => Promise = async (offlineUri) => {\n try {\n await ShakaStorage.getInstance().remove(offlineUri);\n return true;\n } catch (error) {\n logError(`Error removing offline content: ${error.message}`);\n return false;\n }\n };\n\n static removeAllContent: () => Promise = async () => {\n try {\n const allContent = await ShakaStorage.listContent();\n if (allContent === null) {\n return false;\n }\n\n await Promise.all(allContent.map(async ({ offlineUri }) => await ShakaStorage.removeContent(offlineUri)));\n return true;\n } catch (error) {\n logError(`Error removing all offline content: ${error.message}`);\n return false;\n }\n };\n\n // Passing the current player allows the storage to use the same network engine, hence correctly handling DRM-protected content\n static downloadContent: (\n // $FlowFixMe: not Flow-typed\n player: shaka.Player,\n id: string,\n manifestUri: string,\n metadata: ShakaOfflineExtraMetadata,\n selectTracks: ShakaOfflineTrackSelection,\n updateProgress: ShakaOfflineProgressUpdate,\n ) => Promise = (player, id, manifestUri, metadata, selectTracks, updateProgress) => {\n const storage = new shaka.offline.Storage(player);\n\n storage.configure({\n offline: {\n progressCallback: updateProgress,\n trackSelectionCallback: selectTracks,\n },\n });\n\n ShakaStorage.storage = storage;\n\n const appMetadata: ShakaOfflineMetadata = {\n ...metadata,\n downloadTime: Date.now(),\n id,\n };\n\n const downloadOp = storage.store(manifestUri, appMetadata);\n ShakaStorage.inProgress.set(id, downloadOp);\n\n return downloadOp.promise.finally(() => ShakaStorage.inProgress.delete(id));\n };\n\n static cancelDownload: (id: string) => void = (id) => {\n const downloadOp = ShakaStorage.inProgress.get(id);\n\n if (downloadOp) {\n downloadOp.abort();\n }\n };\n}\n\nexport default ShakaStorage;\n","/* @flow */\n\nimport { type NETGEM_API_V8_METADATA_SCHEDULE_VIDEO_STREAM_ENTITLEMENT_PARAM, StreamType } from '../../../libs/netgemLibrary/v8/types/MetadataSchedule';\nimport { Drm } from '../../../helpers/jsHelpers/Drm';\nimport { type NETGEM_API_V8_HEADERS } from '../../../libs/netgemLibrary/v8/types/Headers';\nimport { type NETGEM_API_V8_URL_DEFINITION } from '../../../libs/netgemLibrary/v8/types/NtgVideoFeed';\nimport type { ShakaMetrics } from './shakaTypes';\n\nexport enum SubtitlesMimeType {\n TTML = 'application/ttml+xml',\n WebVTT = 'text/vtt',\n}\n\nexport enum VideoPlayerMediaType {\n Audio = 'audio',\n Subtitles = 'subtitles',\n Video = 'video',\n}\n\nexport const VIDEOPLAYER_ERRORS = Object.freeze({\n // DRM\n VD001DrmGenericError: 'VD001',\n VD002DrmNotSupportedError: 'VD002',\n // Platform\n VP001MetadataLocationRequestError: 'VP001',\n VP002NtgEntitlementRequestError: 'VP002',\n VP003MetadataRecordingsRequestError: 'VP003',\n VP004NtgEntitlementNoSubscriptionError: 'VP004',\n VP005NtgEntitlementReleaseError: 'VP005',\n // Stream\n VS001NoStreamSupported: 'VS001',\n VS002StreamNotFound: 'VS002',\n VS004StreamRequestPending: 'VS004',\n VS005StreamStopError: 'VS005',\n VS006ManifestError: 'VS006',\n // Other\n VS994OfflineContentError: 'VS994',\n VS995SessionTimeOut: 'VS995',\n VS996StartupCancelled: 'VS996',\n VS997NoTrailerError: 'VS997',\n VS998InternalError: 'VS998',\n VS999StreamUnknownError: 'VS999',\n});\n\nexport type VideoPlayerInitData = {|\n audioLanguage?: string,\n channelId?: string,\n customHeaders?: NETGEM_API_V8_HEADERS,\n drm?: Drm,\n fairplayCertificateUrl?: string | null,\n fairplayContentKeySystem?: string,\n laUrl?: string,\n manifestUpdatePeriod?: number,\n // In Mbps (undefined means unlimited bitrate)\n maxBitrate?: number,\n ntgEntitlement?: NETGEM_API_V8_METADATA_SCHEDULE_VIDEO_STREAM_ENTITLEMENT_PARAM,\n subtitlesLanguage?: string,\n trackingStart?: NETGEM_API_V8_URL_DEFINITION,\n type: StreamType,\n url: string,\n vuDrmToken?: string,\n|};\n\nexport type VideoPlayerMediaInfo = {|\n accessibility?: Array,\n accessibilityPurpose?: string,\n autoselect?: boolean,\n bitrateList?: Array,\n codec?: string,\n default?: boolean,\n forced?: boolean,\n id?: number,\n // Internal index\n index: number,\n kind?: string,\n // ISO language\n lang: string,\n mimeType?: string,\n name?: string,\n roles?: Array,\n // Can be 'audio', 'video', 'text' or empty string for subtitles (Dash), or 'AUDIO', 'VIDEO' or 'SUBTITLES' (Hls)\n type: string,\n|};\n\nexport type VideoPlayerExternalSubtitles = {|\n captions?: boolean,\n format?: string,\n language: string,\n mimeType?: SubtitlesMimeType,\n url: string,\n|};\n\nexport type VideoPlayerBitrateInfo = {|\n bitrate: number,\n height: number,\n mediaType: VideoPlayerMediaType,\n qualityIndex: number,\n scanType: ?string,\n width: number,\n|};\n\nexport type VideoPlayerPlaybackInfo = {|\n timeToEnd: number,\n time: number,\n type: string,\n|};\n\nexport type VideoPlayerStreamInfo = {|\n duration: number,\n id?: string,\n index?: number,\n isLast?: boolean,\n manifestInfo?: {},\n start?: number,\n|};\n\nexport type VideoPlayerStreamInitialized = {|\n error?: Error,\n streamInfo: VideoPlayerStreamInfo,\n type?: string,\n|};\n\nexport type VideoPlayerBufferEvent = {|\n mediaType: VideoPlayerMediaType,\n|};\n\nexport type VideoPlayerQualityChangeRendered = {|\n mediaType: VideoPlayerMediaType,\n newQuality: 3,\n oldQuality: 0,\n type: string,\n|};\n\nexport type VideoPlayerBufferMetrics = {|\n level: number,\n state: string,\n target: number,\n|};\n\nexport type VideoPlayerHtmlLiveMetrics = {|\n audioBitrate?: number | null,\n videoBitrate?: number | null,\n|};\n\nexport type VideoPlayerLiveMetrics = {|\n shakaMetrics: ShakaMetrics,\n|};\n\nexport type VideoPlayerCommonMetrics = {|\n bufferChunkCount?: number,\n bufferLength?: number,\n elementHeight?: number,\n elementWidth?: number,\n playbackRate?: number,\n videoHeight?: number,\n videoWidth?: number,\n|};\n\nexport type VideoPlayerDebugInfo = {|\n bufferChunkCount?: number,\n bufferLength?: number,\n elementHeight?: number,\n elementWidth?: number,\n isPlayheadPositionFallback: boolean,\n laUrl: string,\n playbackRate?: number,\n playerName: string,\n playerVersion: string,\n shakaMetrics?: ShakaMetrics,\n streamType?: StreamType,\n streamUrl: string,\n state: string,\n time: number,\n totalTime: number,\n url?: string,\n videoHeight?: number,\n videoWidth?: number,\n|};\n\nexport const VIDEOPLAYER_NAME = 'Shaka';\n\nexport const VIDEOPLAYER_DEBUG = Object.freeze({\n BufferFlushed: 'flushed',\n BufferLoaded: 'loaded',\n BufferStalled: 'stalled',\n NoKeepAlive: 'none',\n NotApplicable: 'n/a',\n StateEnded: 'ended',\n StateInitializing: 'initializing',\n StatePaused: 'paused',\n StatePlaying: 'playing',\n UnknownMetric: '',\n});\n\nexport const VIDEOPLAYER_BUFFER_DEFAULT_METRICS = Object.freeze({\n level: 0,\n state: VIDEOPLAYER_DEBUG.UnknownMetric,\n target: 0,\n});\n\n// Apple WebKit errors (see https://developer.apple.com/documentation/webkitjs/mediaerror)\n/* eslint-disable no-magic-numbers */\nexport enum HtmlMediaError {\n // Added to handle undefined cast\n Unknown = 0,\n // MEDIA_ERR_ABORTED\n Aborted = 1,\n // MEDIA_ERR_NETWORK\n Network = 2,\n // MEDIA_ERR_DECODE\n Decode = 3,\n // MEDIA_ERR_SRC_NOT_SUPPORTED\n SrcNotSupported = 4,\n}\n\nexport type MediaKeyEvent = {|\n +initData: Uint8Array,\n +initDataType: string,\n|};\n\nexport type MediaKeyMessageEvent = {|\n +message: ArrayBuffer,\n|};\n","// extracted by mini-css-extract-plugin\nexport default {\"container\":\"ProgressBar_container__KDfs9\",\"progressBar\":\"ProgressBar_progressBar__zE3yK\"};","/* @flow */\n\nimport * as React from 'react';\nimport { BroadcastStatus } from '../../helpers/ui/location/Format';\nimport type { NETGEM_API_V8_FEED_ITEM } from '../../libs/netgemLibrary/v8/types/FeedItem';\nimport { getRealPercentage } from '../../helpers/maths/maths';\nimport styles from './ProgressBar.module.css';\nimport { useMemo } from 'react';\n\nconst MAX_PERCENTAGE = 100;\n\n// Ensures that minimum progress is displayed when a program has been watched for a very short time (5%)\nconst MIN_PERCENTAGE = 0.05;\n\n/*\n * ProgressBar component should be called with either {broadcastStatus, item, now} or {progress}, with progress in [0,100]\n */\n/* eslint-disable react/require-default-props */\nexport type ProgressBarPropType = {|\n +allowZeroProgress?: boolean,\n +broadcastStatus?: BroadcastStatus,\n +item?: NETGEM_API_V8_FEED_ITEM,\n +now?: number,\n +progress?: number | null,\n|};\n/* eslint-enable react/require-default-props */\n\nconst getProgress = ({ allowZeroProgress, broadcastStatus, item, now, progress }: ProgressBarPropType): number | null => {\n if (typeof progress === 'number') {\n if (progress > 0) {\n // Progress is directly provided by parent component (button for live or catchup tile/card)\n return progress / MAX_PERCENTAGE;\n } else if (progress === 0) {\n return allowZeroProgress ? 0 : MIN_PERCENTAGE;\n }\n }\n\n if (broadcastStatus === undefined || broadcastStatus !== BroadcastStatus.Live || item === undefined || now === undefined) {\n return null;\n }\n\n // Progress has to be computed from item start and end times (live tile)\n const { endTime, startTime } = item;\n return getRealPercentage(now, startTime, endTime);\n};\n\nconst ProgressBar = ({ allowZeroProgress = true, broadcastStatus, item, now, progress }: ProgressBarPropType): React.Node => {\n const progressPct = useMemo(\n () =>\n getProgress({\n allowZeroProgress,\n broadcastStatus,\n item,\n now,\n progress,\n }),\n [allowZeroProgress, broadcastStatus, item, now, progress],\n );\n\n if (progressPct === null) {\n // Not live\n return null;\n }\n\n return (\n
\n
\n
\n );\n};\n\nexport default ProgressBar;\n","import { useEffect, useState, useRef, useCallback } from 'react';\nimport type { DebouncedFunc } from 'lodash';\n\nimport { getDimensions, patchResizeCallback, useCallbackRef, useRefProxy } from './utils';\n\nimport type { Dimensions, UseResizeDetectorReturn, useResizeDetectorProps } from './types';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction useResizeDetector({\n skipOnMount = false,\n refreshMode,\n refreshRate = 1000,\n refreshOptions,\n handleWidth = true,\n handleHeight = true,\n targetRef,\n observerOptions,\n onResize\n}: useResizeDetectorProps = {}): UseResizeDetectorReturn {\n // If `skipOnMount` is enabled, skip the first resize event\n const skipResize = useRef(skipOnMount);\n\n // Wrap the `onResize` callback with a ref to avoid re-renders\n const onResizeRef = useCallbackRef(onResize);\n\n const [size, setSize] = useState({\n width: undefined,\n height: undefined\n });\n\n // Create a proxy ref to handle conditional rendering and dynamic ref changes of the target element\n const { refProxy, refElement } = useRefProxy(targetRef);\n\n const { box } = observerOptions || {};\n\n const resizeCallback: ResizeObserverCallback = useCallback(\n (entries: ResizeObserverEntry[]) => {\n if (!handleWidth && !handleHeight) return;\n\n if (skipResize.current) {\n skipResize.current = false;\n return;\n }\n\n // Only update the size if one of the observed dimensions has changed\n const shouldSetSize = (prevSize: Dimensions, nextSize: Dimensions) =>\n (handleWidth && prevSize.width !== nextSize.width) || (handleHeight && prevSize.height !== nextSize.height);\n\n entries.forEach(entry => {\n const dimensions = getDimensions(entry, box);\n setSize(prevSize => {\n if (!shouldSetSize(prevSize, dimensions)) return prevSize;\n onResizeRef?.({\n width: dimensions.width,\n height: dimensions.height,\n entry\n });\n return dimensions;\n });\n });\n },\n [handleWidth, handleHeight, skipResize, box]\n );\n\n // Throttle/Debounce the resize event if refreshMode is configured\n const resizeHandler = useCallback(patchResizeCallback(resizeCallback, refreshMode, refreshRate, refreshOptions), [\n resizeCallback,\n refreshMode,\n refreshRate,\n refreshOptions\n ]);\n\n // Attach ResizeObserver to the element\n useEffect(() => {\n let resizeObserver: ResizeObserver | undefined;\n if (refElement) {\n resizeObserver = new window.ResizeObserver(resizeHandler);\n resizeObserver.observe(refElement, observerOptions);\n }\n // If refElement is not available, reset the size\n else if (size.width || size.height) {\n onResizeRef?.({\n width: null,\n height: null,\n entry: null\n });\n setSize({ width: undefined, height: undefined });\n }\n\n // Disconnect the ResizeObserver when the component is unmounted\n return () => {\n resizeObserver?.disconnect?.();\n (resizeHandler as DebouncedFunc).cancel?.();\n };\n }, [resizeHandler, refElement]);\n\n return { ref: refProxy, ...size };\n}\n\nexport default useResizeDetector;\n","import * as React from 'react';\nimport debounce from 'lodash/debounce';\nimport throttle from 'lodash/throttle';\nimport type { DebouncedFunc } from 'lodash';\n\nimport { OnRefChangeType, Props } from './types';\n\nexport type PatchedResizeObserverCallback = DebouncedFunc | ResizeObserverCallback;\n\n/**\n * Wraps the resize callback with a lodash debounce / throttle based on the refresh mode\n */\nexport const patchResizeCallback = (\n resizeCallback: ResizeObserverCallback,\n refreshMode: Props['refreshMode'],\n refreshRate: Props['refreshRate'],\n refreshOptions: Props['refreshOptions']\n): PatchedResizeObserverCallback => {\n switch (refreshMode) {\n case 'debounce':\n return debounce(resizeCallback, refreshRate, refreshOptions);\n case 'throttle':\n return throttle(resizeCallback, refreshRate, refreshOptions);\n default:\n return resizeCallback;\n }\n};\n\n/**\n * A custom hook that converts a callback to a ref to avoid triggering re-renders when passed as a\n * prop or avoid re-executing effects when passed as a dependency\n */\nexport const useCallbackRef =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any>(callback: T | undefined): T => {\n const callbackRef = React.useRef(callback);\n\n React.useEffect(() => {\n callbackRef.current = callback;\n });\n\n return React.useMemo(() => ((...args) => callbackRef.current?.(...args)) as T, []);\n };\n\n/** `useRef` hook doesn't handle conditional rendering or dynamic ref changes.\n * This hook creates a proxy that ensures that `refElement` is updated whenever the ref is changed. */\nexport const useRefProxy =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (targetRef: React.MutableRefObject | undefined) => {\n // we are going to use this ref to store the last element that was passed to the hook\n const [refElement, setRefElement] = React.useState(targetRef?.current || null);\n\n // if targetRef is passed, we need to update the refElement\n // we have to use setTimeout because ref get assigned after the hook is called\n // in the future releases we are going to remove targetRef and force users to use ref returned by the hook\n if (targetRef) {\n setTimeout(() => {\n if (targetRef.current !== refElement) {\n setRefElement(targetRef.current);\n }\n }, 0);\n }\n\n // this is a memo that will be called every time the ref is changed\n // This proxy will properly call setState either when the ref is called as a function or when `.current` is set\n // we call setState inside to trigger rerender\n const refProxy: OnRefChangeType = React.useMemo(\n () =>\n new Proxy(\n node => {\n if (node !== refElement) {\n setRefElement(node);\n }\n },\n {\n get(target, prop) {\n if (prop === 'current') {\n return refElement;\n }\n return target[prop];\n },\n set(target, prop, value) {\n if (prop === 'current') {\n setRefElement(value);\n } else {\n target[prop] = value;\n }\n return true;\n }\n }\n ),\n [refElement]\n );\n\n return { refProxy, refElement, setRefElement };\n };\n\n/** Calculates the dimensions of the element based on the current box model.\n * @see https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/The_box_model\n */\nexport const getDimensions = (entry: ResizeObserverEntry, box: ResizeObserverBoxOptions | undefined) => {\n // Value\t Border\t Padding\t Inner Content\n // ---------------------------------------------------\n // 'border-box'\t Yes\t Yes\t Yes\n // 'content-box'\t No\t No\t Yes\n // undefined No\t No?\t Yes\n\n if (box === 'border-box') {\n return {\n width: entry.borderBoxSize[0].inlineSize,\n height: entry.borderBoxSize[0].blockSize\n };\n }\n\n if (box === 'content-box') {\n return {\n width: entry.contentBoxSize[0].inlineSize,\n height: entry.contentBoxSize[0].blockSize\n };\n }\n\n return {\n width: entry.contentRect.width,\n height: entry.contentRect.height\n };\n};\n","/* @flow */\n\nimport './ResizeDetectorWrapper.css';\nimport * as React from 'react';\nimport clsx from 'clsx';\nimport { useResizeDetector } from 'react-resize-detector';\n\ntype RefreshModeType = 'throttle' | 'debounce';\n\nexport type ResizeType = {| entry: ResizeObserverEntry, height: number | null, width: number | null |};\n\n/* eslint-disable react/require-default-props */\ntype ResizeDetectorWrapperPropType = {|\n +className?: string,\n +children?: React.Node,\n +handleHeight?: boolean,\n +handleWidth?: boolean,\n +onResize?: (data: ResizeType) => void,\n +refreshMode?: RefreshModeType,\n +refreshRate?: number,\n|};\n/* eslint-enable react/require-default-props */\n\nconst ResizeDetectorWrapper: React.ComponentType = ({\n children,\n className,\n handleHeight = false,\n handleWidth = false,\n onResize,\n refreshMode,\n refreshRate,\n}: ResizeDetectorWrapperPropType) => {\n const { ref } = useResizeDetector({ handleHeight, handleWidth, onResize, refreshMode, refreshRate });\n\n if (children) {\n return (\n
\n {children}\n
\n );\n }\n\n return
;\n};\n\nexport default ResizeDetectorWrapper;\n","/* @flow */\n\nexport const APPLICATION_ID = {\n FranceChannel: 'francechannel',\n Gaumont: 'gaumont',\n MyVideofutur: 'myvideofutur',\n Post: 'posttvgo',\n Premiere: 'premiere',\n Viva: 'viva',\n ZeopTV: 'zeoptv',\n};\n","var _desc, _defs, _g;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nfunction SvgHeaderLogo(_ref, svgRef) {\n let {\n title,\n titleId,\n ...props\n } = _ref;\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: \"154px\",\n height: \"30px\",\n viewBox: \"0 0 154 30\",\n xmlns: \"http://www.w3.org/2000/svg\",\n xmlnsXlink: \"http://www.w3.org/1999/xlink\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title === undefined ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, \"header-logo@3x\") : title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _desc || (_desc = /*#__PURE__*/React.createElement(\"desc\", null, \"Created with Sketch.\")), _defs || (_defs = /*#__PURE__*/React.createElement(\"defs\", null, /*#__PURE__*/React.createElement(\"polygon\", {\n id: \"path-1\",\n points: \"0.135865782 0.309695302 10.3156418 0.309695302 10.3156418 15.6452591 0.135865782 15.6452591\"\n }), /*#__PURE__*/React.createElement(\"polygon\", {\n id: \"path-3\",\n points: \"0.000100174298 0.255818792 37.5394601 0.255818792 37.5394601 29.6509121 0.000100174298 29.6509121\"\n }))), _g || (_g = /*#__PURE__*/React.createElement(\"g\", {\n id: \"header-logo\",\n stroke: \"none\",\n strokeWidth: 1,\n fill: \"none\",\n fillRule: \"evenodd\"\n }, /*#__PURE__*/React.createElement(\"g\", {\n id: \"Group-35\",\n transform: \"translate(20.000000, 0.000000)\"\n }, /*#__PURE__*/React.createElement(\"polygon\", {\n id: \"Fill-7\",\n fill: \"#FFFFFF\",\n points: \"42.5044759 18.5034081 44.6546063 18.5034081 44.6546063 11.9426497 49.1157484 11.9426497 49.1157484 10.0752671 44.6546063 10.0752671 44.6546063 5.03617315 51.8592466 5.03617315 51.8592466 3.1678443 42.5044759 3.1678443\"\n }), /*#__PURE__*/React.createElement(\"g\", {\n id: \"Group-11\",\n transform: \"translate(112.932319, 2.858212)\"\n }, /*#__PURE__*/React.createElement(\"mask\", {\n id: \"mask-2\",\n fill: \"white\"\n }, /*#__PURE__*/React.createElement(\"use\", {\n xlinkHref: \"#path-1\"\n })), /*#__PURE__*/React.createElement(\"g\", {\n id: \"Clip-10\"\n }), /*#__PURE__*/React.createElement(\"polygon\", {\n id: \"Fill-9\",\n fill: \"#FFFFFF\",\n mask: \"url(#mask-2)\",\n points: \"2.28631165 13.7762993 2.28631165 8.91164161 8.87897239 8.91164161 8.87897239 7.04299732 2.28631165 7.04299732 2.28631165 2.17770872 9.94741308 2.17770872 9.94741308 0.309695302 0.135865782 0.309695302 0.135865782 15.6452591 10.3158627 15.6452591 10.3158627 13.7762993\"\n })), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M73.6596637,7.44711544 C73.9202283,6.66514899 74.2675425,5.2743906 74.2675425,5.2743906 L74.3113905,5.2743906 C74.3113905,5.2743906 74.6372538,6.66514899 74.8978184,7.44711544 L76.5706678,12.312404 L71.9864989,12.312404 L73.6596637,7.44711544 Z M71.3745193,14.0939879 L77.1829628,14.0939879 L78.6996628,18.5034711 L80.9362275,18.5034711 L75.4195783,3.16790738 L73.1596701,3.16790738 L67.6427055,18.5034711 L69.8584502,18.5034711 L71.3745193,14.0939879 Z\",\n id: \"Fill-12\",\n fill: \"#FFFFFF\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M84.903054,8.55423356 C84.903054,7.68583758 84.7510055,6.31747517 84.7510055,6.31747517 L84.7942226,6.31747517 C84.7942226,6.31747517 85.5109328,7.70760268 86.0759098,8.55423356 L92.9184097,18.5034081 L95.0256384,18.5034081 L95.0256384,3.1678443 L92.8751925,3.1678443 L92.8751925,13.1378376 C92.8751925,13.9854148 93.0269256,15.3531463 93.0269256,15.3531463 L92.9837085,15.3531463 C92.9837085,15.3531463 92.2666829,13.9633342 91.7023368,13.1378376 L84.8809723,3.1678443 L82.7526082,3.1678443 L82.7526082,18.5034081 L84.903054,18.5034081 L84.903054,8.55423356 Z\",\n id: \"Fill-14\",\n fill: \"#FFFFFF\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M103.675024,18.5616376 C103.674708,18.5628993 103.674708,18.5632148 103.675024,18.5616376\",\n id: \"Fill-16\",\n fill: \"#FFFFFF\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M105.024628,16.8057933 C104.973209,16.804847 104.92179,16.8039007 104.871002,16.8016926 C104.843558,16.8007463 104.816429,16.7998 104.7893,16.7985383 C104.777628,16.7979074 104.766272,16.7966456 104.754915,16.7956993 C104.750815,16.9679275 104.732518,17.1395248 104.695926,17.3082832 C104.634412,17.5928067 104.572583,17.8770148 104.506969,18.1609074 C104.483941,18.261847 104.455866,18.3615248 104.426844,18.4608872 C104.398453,18.5570953 104.365015,18.6517262 104.326214,18.744149 L104.32653,18.744149 C104.32653,18.7447799 104.326214,18.7454107 104.326214,18.7460416 C104.361861,18.749196 104.397191,18.751404 104.433153,18.7539275 C104.440093,18.7545584 104.447348,18.7555047 104.454604,18.7561356 C104.454604,18.7561356 104.454604,18.7558201 104.454919,18.7558201 C107.3634,18.9731557 109.73971,17.7145651 111.016035,16.352196 C110.613832,15.8266792 110.253268,15.3169342 109.86463,14.8097128 C108.484837,16.0613638 106.889589,16.8319745 105.024628,16.8057933\",\n id: \"Fill-18\",\n fill: \"#FFFFFF\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M103.67903,18.5468436 L103.678399,18.549998 L103.67903,18.5468436 Z\",\n id: \"Fill-20\",\n fill: \"#FFFFFF\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M74.4111053,23.8092034 C74.3751436,24.0826866 74.2950184,24.3549081 74.200067,24.6154584 C73.8978626,25.4478946 73.6123773,26.2888477 73.2514986,27.096049 C73.1057591,27.4222101 72.8196429,27.7161966 72.5325803,27.9426799 C71.8896862,28.4502168 71.2975802,28.0161765 71.1531025,27.4054919 C71.1048381,27.2014047 71.1032609,26.9862772 71.0802328,26.7761966 C71.1505789,25.9018074 71.3433209,25.0577 71.8174474,24.3104315 C72.0928382,23.8763913 72.4060834,23.4590691 72.7505586,23.0777067 C72.9947195,22.8064315 73.343611,22.7054919 73.7281487,22.7676329 C74.2865012,22.8581631 74.4647324,23.3988208 74.4111053,23.8092034 M95.7909599,22.8389215 C96.078338,22.7477604 96.3256534,22.8045389 96.5057773,23.0587805 C96.6338514,23.2398409 96.5849561,23.5858745 96.3896905,23.8076262 C96.2890608,23.9214987 96.1688731,24.0240154 96.0420608,24.1082369 C95.4915946,24.4728812 94.8654196,24.582653 94.1468168,24.6779148 C94.5786725,23.8861698 94.9080058,23.1190289 95.7909599,22.8389215 M104.742266,16.4469215 L104.739742,16.4251564 C104.681068,15.8721966 104.326814,15.4744315 103.850164,15.5157537 C103.333135,15.5605456 102.864372,15.7681027 102.50854,16.1778544 C102.707591,16.2825792 102.914529,16.3759483 103.129037,16.4560691 C103.271937,16.3298946 103.39528,16.1734383 103.553637,16.0715523 C103.838492,15.8885993 104.099056,16.0182436 104.152368,16.357653 C104.171295,16.4787805 104.157415,16.6046396 104.158362,16.7289215 L104.158362,16.7304987 C103.999688,17.3361362 103.842277,17.9420893 103.678872,18.5467805 C103.669093,18.5802168 103.655844,18.6174383 103.641649,18.6565523 C103.578874,18.8297268 103.482029,19.0442235 103.409475,19.1770221 C102.821785,20.2554987 102.101921,21.2437604 101.310133,22.180606 C101.299723,22.1929081 101.276064,22.1941698 101.186475,22.2260289 C101.605397,20.9245389 102.025581,19.6145322 102.430623,18.3559416 C102.035991,18.2234584 101.659655,18.0603779 101.300985,17.8714315 C101.223383,18.0121161 101.100672,18.235445 101.033796,18.3587805 C100.917709,18.5717 100.820234,18.7940826 100.742001,19.0240356 C100.246424,20.4759886 99.7486383,21.9285725 99.3016409,23.3956664 C98.8940751,24.733747 98.4719984,26.0481698 97.4269013,27.0534651 C96.9404721,27.521257 96.4802256,28.0401497 95.7714018,28.1562302 C94.8827696,28.3019617 94.1890875,28.1284718 93.9512356,27.0443174 C93.8442969,26.5582302 93.9111731,26.034606 93.8982395,25.5277 C93.8935077,25.3548409 93.989721,25.3242436 94.1452395,25.2844987 C94.8237798,25.1116396 95.5061055,24.9425658 96.166034,24.711351 C96.7329038,24.513257 97.1089242,24.095304 97.2420456,23.4855658 C97.3575015,22.9575255 97.1578195,22.5512436 96.6417378,22.3979416 C95.898845,22.1777671 95.1304005,22.1664114 94.4487057,22.5402034 C93.454712,23.0859081 92.7859508,23.9328544 92.5181308,25.0558074 C92.4364284,25.3993174 92.4641883,25.7794181 92.3329597,26.0983242 C92.0219226,26.853794 91.4799737,27.447445 90.8231997,27.9284852 C90.580616,28.1063913 90.2998625,28.1865121 90.0118535,28.0231161 C89.7768407,27.8896866 89.6658011,27.5764584 89.7607526,27.2231698 C89.879994,26.7784047 90.0222635,26.3380557 90.1815674,25.9059081 C90.3944985,25.3292906 90.6784066,24.7753846 90.8493823,24.1880423 C91.0556888,23.4786262 90.7437054,22.8174718 90.1474985,22.5537671 C89.6689557,22.341794 89.1598139,22.2938477 88.6954664,22.5487201 C88.3043042,22.7635322 87.9620373,23.0682436 87.598004,23.3332101 C87.5869632,23.3436195 87.5756069,23.3543443 87.5642505,23.3653846 C87.5683514,23.3470893 87.5718214,23.328794 87.5756069,23.3108141 C87.6377512,23.0994718 87.7112518,22.890653 87.7595162,22.6761564 C87.8084115,22.4569282 87.6913783,22.3550423 87.3995839,22.406143 C87.2096809,22.4389483 87.0156771,22.4301161 86.8257741,22.3995188 C86.5144216,22.3496799 86.3759375,22.4805859 86.3077996,22.7433443 C86.2428162,22.9928544 86.1648992,23.2392101 86.0775186,23.4817805 C85.6529183,24.6596195 85.2819451,25.8705792 84.4557727,26.8471698 C84.0989949,27.2689081 83.6750255,27.6458544 83.2340216,27.9805322 C82.9374954,28.2060691 82.5744085,28.0622302 82.4299309,27.7086262 C82.3539066,27.5228342 82.300595,27.2793174 82.3557993,27.098257 C82.4974379,26.6339349 82.6775618,26.175606 82.8942783,25.7409349 C83.1971136,25.134351 83.5232924,24.5476396 83.4781826,23.8341228 C83.4390663,23.2133443 83.0753486,22.6641698 82.5368696,22.5036128 C81.7763114,22.2764987 81.0943012,22.4348477 80.5015642,22.9685658 C80.4025118,23.0575188 80.2971504,23.1401631 80.1946281,23.2256463 C80.1741236,23.2455188 80.1539346,23.2650758 80.1334301,23.2852638 C80.1422628,23.2556128 80.15078,23.2262772 80.1596127,23.1966262 C80.1987289,23.0379617 80.2492015,22.8808745 80.2741223,22.720002 C80.3053522,22.5193846 80.2510942,22.3796463 80.0009397,22.3932101 C79.7700278,22.4058275 79.5378541,22.3903711 79.3063113,22.3976262 C79.0668821,22.4055121 78.8826573,22.4834248 78.8220903,22.7556463 C78.769725,22.9893846 78.6719345,23.2127134 78.6094747,23.4448745 C78.2426024,24.8085054 77.6615372,26.0708812 76.8094975,27.1988812 C76.5375767,27.5591094 76.2489368,27.9382638 75.7744949,28.0385725 C75.1823889,28.1641161 74.8442228,28.1287872 74.849901,27.3572302 C74.8521092,27.0850087 74.9158307,26.8011161 75.009205,26.5437201 C75.4360134,25.3665121 75.8896354,24.1990826 76.3208602,23.0237671 C76.5880493,22.2951094 76.5672293,22.2831228 75.8035166,22.2834383 C75.7666086,22.2834383 75.7050952,22.2812302 75.6678717,22.2790221 C75.2858576,22.2582034 74.9316034,22.2824919 74.8827081,22.7925523 C74.6284527,22.6275792 74.4249852,22.4294852 74.1824016,22.3506262 C73.4398243,22.1086866 72.6877833,22.1392839 72.0007258,22.524747 C70.8165137,23.1890557 70.0669964,24.2101228 69.8304064,25.5431564 C69.7357704,26.074351 69.5285175,26.5008208 69.2039159,26.9001631 C69.1613297,26.9525255 69.1297844,27.0149819 69.0821509,27.061351 C68.7395685,27.3938208 68.4127588,27.746794 68.0417856,28.0448812 C67.8417881,28.2051228 67.5622964,28.2035456 67.3452645,28.0117604 C67.1298098,27.8212369 66.9966884,27.5815054 67.1187689,27.2909886 C67.3354854,26.777143 67.5831163,26.2762302 67.7969937,25.7611228 C68.0067702,25.2561094 68.2566093,24.7545658 68.3714344,24.2258946 C68.5704855,23.3101832 67.9137115,22.4585054 66.8436935,22.4727 C66.2187803,22.4809013 65.6790396,22.777096 65.2071213,23.1871631 C65.0982898,23.2821094 64.978733,23.3653846 64.8642234,23.4540221 C64.8377253,23.3007201 64.8623307,23.1906329 64.9033396,23.0868544 C65.0585427,22.6925591 65.2266794,22.3029953 65.3758888,21.9064919 C65.9629476,20.3469752 66.5414892,18.784304 67.1294943,17.2251027 C67.372078,16.5816128 67.3111955,16.5194718 66.6313934,16.4759416 C66.170516,16.4462906 65.9301405,16.6453309 65.7645274,17.0285859 C65.6620051,17.2651631 65.5424482,17.4941698 65.4307777,17.7269617 C65.4260459,17.7408409 65.4213141,17.7547201 65.4165823,17.7685993 C65.3339335,18.0133779 65.2512847,18.2581564 65.1683205,18.5029349 C65.1664278,18.5089282 65.1642196,18.5149215 65.1623269,18.5209148 C65.1402451,18.6234315 65.1273116,18.7287872 65.0948198,18.8281497 C64.7695874,19.8258745 64.436784,20.8210758 64.1137598,21.819747 C63.5771735,23.4779953 63.0856971,25.1479148 62.0850789,26.6181631 C61.5500699,27.4042302 60.9081222,27.9417336 59.9526139,28.0921966 C59.1466304,28.219002 58.5422217,27.8723376 58.3759777,27.0768074 C58.123615,25.8696329 58.3788168,24.746049 59.0504171,23.717096 C59.3415806,23.2713846 59.7226483,22.9234584 60.2317901,22.7389282 C60.5989779,22.6061295 60.8500788,22.670794 61.0276791,22.9297671 C61.2371401,23.234794 61.214743,23.5265725 60.9349358,23.8189819 C60.7961363,23.9640826 60.6368323,24.0924651 60.4737429,24.2107537 C60.2986663,24.3375591 60.3393597,24.4318745 60.5059191,24.4959081 C60.5999243,24.5321832 60.7238975,24.5561564 60.8141171,24.5252436 C61.3109562,24.3558544 61.6090597,23.9877403 61.7317711,23.4906128 C61.8428107,23.0404852 61.6705731,22.6736329 61.3081172,22.3995188 C60.9854083,22.1556866 60.6056024,22.0550624 60.215702,22.1200423 C58.9983673,22.3228678 58.0945933,22.9862302 57.4933391,24.060606 C57.1684221,24.6413242 56.98609,25.275351 56.9551756,25.9320893 C56.9211066,26.6585389 57.0690543,27.3600691 57.6034324,27.9070356 C58.5078373,28.8325255 59.9999319,28.9773107 61.1775194,28.2555926 C61.4850865,28.0669617 61.7671019,27.8366933 62.1112615,27.5897067 C62.0238809,27.9294315 61.9497494,28.2177403 61.867416,28.5382235 L62.7803382,28.5382235 C63.0248146,28.5379081 63.2399538,28.3757738 63.3071454,28.1407738 C63.6945222,26.7891295 64.1087125,25.4425322 64.9967138,24.3192638 C65.3266781,23.9019416 65.7156322,23.5114315 66.1424406,23.1969416 C66.5250856,22.9149416 66.9197178,23.1212369 67.0364356,23.5924987 C67.07429,23.7454852 67.0932172,23.9306463 67.0421137,24.0722772 C66.901737,24.4593174 66.7301303,24.8362638 66.5518991,25.2078477 C66.2698838,25.7955054 65.9146833,26.3431027 65.8932324,27.036747 C65.8654725,27.9401564 66.528871,28.8016128 67.5985735,28.689002 C68.3954088,28.6044651 69.0200066,28.1827268 69.511483,27.555955 C69.6140053,27.425049 69.7341931,27.3077067 69.8663681,27.1622906 C70.2417576,27.9455188 70.6840233,28.5502101 71.6038854,28.6035188 C72.4647578,28.6533577 73.1382508,28.3335054 73.6622189,27.6348141 C73.742975,27.7710826 73.7928166,27.8619282 73.8492828,27.9486732 C74.0543275,28.2615859 74.2956494,28.5543107 74.6726162,28.6375859 C75.3776545,28.7943577 76.0300122,28.6341161 76.6012983,28.1934517 C76.8574465,27.9959886 77.0877275,27.7654047 77.3296802,27.5499617 L77.3347275,27.5543779 C77.2451387,27.8720221 77.154919,28.189351 77.0590212,28.528445 C77.3621719,28.5498946 77.6296764,28.5732369 77.8978118,28.5868007 C78.1473354,28.5991027 78.3192575,28.5044718 78.4015909,28.2603242 C78.437868,28.152445 78.4706752,28.0436195 78.5110532,27.937002 C79.0795003,26.4440423 79.6652972,24.9570758 80.638471,23.6726195 C80.8088158,23.4480289 81.0312105,23.237002 81.2744251,23.0994718 C81.6838836,22.8676262 82.2438134,23.1404785 82.2447597,23.5653711 C82.2453906,23.8511564 82.1917636,24.1716396 82.0548568,24.4164181 C81.6349883,25.1655792 81.186729,25.8958141 81.007236,26.7515926 C80.811024,27.6859148 81.3778938,28.4631497 82.3188913,28.6044651 C82.9343409,28.6968879 83.4573626,28.506049 83.9567254,28.1937671 C84.2147663,28.0325792 84.456719,27.8455255 84.7668097,27.6269282 C84.6863691,27.9202839 84.6349502,28.1502369 84.5595568,28.3719886 C84.4841635,28.5940557 84.5791149,28.659351 84.7778506,28.647049 C84.9888889,28.6338007 85.1999272,28.5991027 85.4106501,28.6003644 C85.584465,28.6016262 85.6876182,28.5369617 85.7516553,28.3877604 C85.8526003,28.1540221 85.9399809,27.9149215 86.0371406,27.679606 C86.5538533,26.4289013 87.0166234,25.1488611 87.8162978,24.0394718 C88.0500488,23.7155188 88.309036,23.3877805 88.6229122,23.1483644 C89.0746414,22.8035926 89.6402494,23.1228141 89.6831511,23.6890221 C89.7153273,24.1123376 89.5121753,24.4473309 89.3323669,24.7999886 C89.0266925,25.3999483 88.6487793,25.9822436 88.4610846,26.6184785 C88.2027282,27.4931832 88.583165,28.2672638 89.4916708,28.5593577 C90.3509659,28.8359953 91.0657833,28.5606195 91.677132,27.9568745 C91.9891155,27.6490087 92.269869,27.308653 92.5821679,26.9635658 C92.6802739,27.1257 92.7648154,27.2745859 92.8578741,27.4181094 C93.2534527,28.0281631 93.7518691,28.5073107 94.494131,28.6568275 C95.5814989,28.8754248 96.5370072,28.577653 97.3720124,27.8758074 C97.7136484,27.5887604 98.0250009,27.2654383 98.3650597,26.9443242 C98.4123777,27.0865859 98.4581185,27.2225389 98.5032283,27.3584919 C98.836978,28.3710423 99.6429615,28.8290557 100.677018,28.5467403 C101.906655,28.2111161 102.541347,27.2130758 103.159321,26.2156664 C103.257742,26.0566866 103.117681,25.8973913 102.927778,25.9424987 C102.827779,25.9661564 102.722102,26.0469081 102.659327,26.131445 C102.476049,26.3793779 102.319268,26.6465523 102.141352,26.8985859 C101.759654,27.4389282 101.270386,27.8486799 100.644526,28.078002 C100.300682,28.2041765 100.002578,28.1117537 99.8842833,27.7707671 C99.7776601,27.4632168 99.6729295,27.0913174 99.7492693,26.7944919 C99.9792348,25.9011765 100.295004,25.0296262 100.585536,24.152398 C100.638848,23.9908946 100.701623,23.818351 100.808877,23.6924919 C101.152406,23.2887336 101.513916,22.9001161 101.877318,22.5137067 C102.804751,21.5282839 103.530294,20.4091161 104.106627,19.1883779 C104.14322,19.1107805 104.183282,19.0353913 104.223976,18.960002 C104.26183,18.8896597 104.295584,18.8177403 104.326183,18.7439282 C104.364983,18.6515054 104.398422,18.5568745 104.426812,18.4609819 C104.455834,18.361304 104.483909,18.2619416 104.506938,18.161002 C104.572552,17.8771094 104.634381,17.5929013 104.69621,17.3080624 C104.732487,17.139304 104.750783,16.9677067 104.754884,16.7954785 C104.757408,16.679398 104.754568,16.563002 104.742266,16.4469215\",\n id: \"Fill-22\",\n fill: \"#FF002E\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M105.020464,2.9281443 C100.567524,2.9281443 97.2221405,6.3165604 97.2221405,10.7698893 C97.2221405,13.8990168 98.7937293,16.5486812 101.300953,17.8713054 C101.659624,18.0605671 102.035959,18.2233322 102.430907,18.3558154 C102.818284,18.4854597 103.222695,18.5860839 103.641617,18.6564262 C103.655813,18.6173121 103.669062,18.5800906 103.679156,18.5469698 C103.842246,17.9422785 103.999657,17.3363255 104.15833,16.7306879 L104.15833,16.7287953 C103.798713,16.6694933 103.455184,16.5773859 103.129006,16.4562584 C102.914497,16.3761376 102.70756,16.282453 102.508824,16.1780436 C100.601908,15.1759027 99.4378852,13.0902383 99.4378852,10.7484396 C99.4378852,7.48966779 101.675396,4.88321812 105.107529,4.88321812 C107.757338,4.88321812 109.539334,6.55534564 109.539334,6.55534564 L110.603359,4.94851342 C110.603359,4.94851342 108.714108,2.9281443 105.020464,2.9281443\",\n id: \"Fill-24\",\n fill: \"#FFFFFF\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M103.678241,18.5499349 C103.676664,18.5562436 103.675402,18.5600289 103.675087,18.561606 C103.675718,18.5590826 103.677295,18.5537201 103.678241,18.5499349\",\n id: \"Fill-26\",\n fill: \"#FFFFFF\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M36.0461352,7.6704443 C36.0048108,8.58804832 36.4066984,9.1823302 37.0947023,9.61479329 C37.299747,9.74349128 37.506369,9.87092752 37.702581,10.0119275 C37.9388556,10.1816322 38.1685057,10.3626926 38.0666143,10.7131423 C37.9672464,11.0550752 37.6719821,11.3017463 37.3148888,11.3370752 C36.4306729,11.4247664 35.451821,10.6450081 35.3004033,9.73276644 C35.1682284,8.93628993 35.5067099,8.30825638 36.0461352,7.6704443\",\n id: \"Fill-28\",\n fill: \"#FF002E\"\n }), /*#__PURE__*/React.createElement(\"g\", {\n id: \"Group-32\",\n transform: \"translate(0.000000, 0.019286)\"\n }, /*#__PURE__*/React.createElement(\"mask\", {\n id: \"mask-4\",\n fill: \"white\"\n }, /*#__PURE__*/React.createElement(\"use\", {\n xlinkHref: \"#path-3\"\n })), /*#__PURE__*/React.createElement(\"g\", {\n id: \"Clip-31\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M35.6997358,6.18087852 C34.7088967,7.06220738 33.9300422,8.07885839 33.6256297,9.40305973 C33.4073359,10.3541 33.4436131,11.2950463 33.7253129,12.2265295 C33.9770448,13.0599121 34.1609541,13.9027577 34.134456,14.7799859 C34.0915543,16.1874624 33.5212146,17.3760262 32.6123933,18.4191738 C31.5934788,19.588496 30.3471224,20.4821268 29.0386217,21.287751 C27.8679741,22.0082074 26.6714593,22.6873416 25.4812536,23.3759389 C23.4036775,24.5771201 21.3582776,25.8227779 19.5847986,27.5109926 C19.5390578,27.303751 19.5062507,27.1195362 19.4573554,26.9397376 C18.5387551,23.5674087 16.3476157,21.3738651 13.0908747,20.266053 C9.3701018,19.0008383 5.97740042,19.7522074 2.91497875,22.1567779 C2.86135167,22.1987309 2.80867095,22.2413148 2.73201577,22.302194 C2.32571178,20.847402 2.20836312,19.4014423 2.2856492,17.9403416 C2.42066326,15.3827846 3.02696471,12.9416235 4.21685495,10.6673282 C4.57994183,9.97305302 5.02567749,9.31473758 5.49538761,8.68575772 C6.60704541,7.19847584 8.16254616,6.46855638 9.9631542,6.21431477 C12.3262157,5.88121409 14.2618378,6.7316302 15.8775901,8.41069732 C17.2589606,9.84656309 18.1643119,11.5723148 18.864303,13.4169859 C19.4343273,14.920355 19.8160259,16.4729322 20.0652341,18.0592611 C20.0715432,18.099006 20.0787986,18.1384356 20.0917322,18.2141403 C20.1885764,18.1371738 20.2608152,18.0822879 20.3308459,18.0242477 C22.0961231,16.5647242 23.5336443,14.8165765 24.8260569,12.9378383 C25.7935525,11.5319389 26.7695653,10.131402 27.9127685,8.85798591 C29.097296,7.53883154 30.5001173,6.56854966 32.2423665,6.13640201 C32.3152362,6.11842215 32.388106,6.10075772 32.4729629,6.01811342 C32.0083001,5.91118054 31.5471072,5.7837443 31.0783434,5.70078456 C29.5812015,5.43487181 28.0764888,5.48376443 26.5686215,5.60930805 C25.8547505,5.6689255 25.133624,5.71971074 24.4197529,5.68848255 C23.4651909,5.64747584 22.6563684,4.5409255 23.3418486,3.44636174 C23.7516226,2.79246242 24.3298487,2.33634161 25.0042881,1.99693221 C26.9326547,1.02665034 28.8610214,1.12317383 30.7811863,2.02721409 C31.531019,2.37987181 32.2237547,2.81675101 32.784,3.43910671 C33.3530779,4.07124094 33.6915594,4.80620738 33.7480256,5.65883154 C33.7584356,5.81623423 33.7934509,5.86891208 33.9603257,5.84399262 C34.6032198,5.74778456 35.2369657,5.82254295 35.9158214,5.98341544 C35.8287563,6.06322081 35.7650347,6.12283826 35.6997358,6.18087852 M35.3259235,4.96550268 C35.1644114,4.94626107 35.1331815,4.87591879 35.0767153,4.73901946 C34.8874433,4.27816711 34.7196221,3.7923953 34.4401304,3.38800604 C33.7104866,2.33161007 32.713023,1.57077785 31.5471072,1.04589195 C28.9575502,-0.120591275 26.4377084,-0.0269067114 24.0279598,1.53734161 C23.2522599,2.04109329 22.6226149,2.69530805 22.2857106,3.58042215 C21.815685,4.81409329 22.4525855,6.06795235 23.7222854,6.42628792 C24.2926252,6.5871604 24.8740058,6.5653953 25.451601,6.49536846 C26.5093163,6.36793221 27.5641925,6.21589195 28.6215923,6.08467047 C29.2553382,6.00612685 30.2083229,6.06700604 30.583397,6.19696577 C29.1136996,6.7568651 28.0102436,7.77130805 27.0313917,8.93305973 C26.4512728,9.62134161 25.9064848,10.3402208 25.3645359,11.0597309 C24.4216456,12.3113819 23.5194489,13.5948919 22.5484833,14.8238315 C22.0040107,15.5130597 21.3560694,16.1199591 20.7103363,16.8113953 C20.6709046,16.6763886 20.6576556,16.6356973 20.6472456,16.5940597 C20.3986683,15.6042208 20.1964627,14.5998718 19.8926811,13.6273819 C19.2491561,11.5697913 18.3220386,9.64846913 16.8901956,8.01072416 C14.8078876,5.62918054 12.2303178,4.68287181 9.10354367,5.38724094 C6.91776702,5.87995235 5.17835694,7.09122752 3.78089835,8.79742215 C1.27304377,11.8587309 0.202079452,15.4534423 0.0077601538,19.3443483 C-0.0282015345,20.065751 0.0699044748,20.7972477 0.147190559,21.5199121 C0.316589039,23.1046638 0.781251906,24.6042477 1.56862361,25.9921671 C1.7162558,26.2517711 1.94969132,26.4921336 2.19921497,26.6574221 C2.60583441,26.9271201 2.96576675,26.7394356 3.00929932,26.2565027 C3.05914095,25.7003886 3.2809047,25.2218718 3.5963581,24.7793148 C4.34555994,23.7270195 5.30359194,22.8942678 6.37707988,22.1914758 C7.47012593,21.475751 8.68304428,21.1246705 9.98271232,21.0988047 C12.12401,21.0562208 14.0135759,21.7694221 15.6630818,23.1075027 C17.4034382,24.5200262 18.4819734,26.3211671 18.7314971,28.5787443 C18.7680897,28.9083752 18.8119377,29.2373752 18.8627257,29.6509121 C20.4560809,27.3598987 22.6156749,25.8599993 24.8683277,24.5077242 C24.615334,25.1773953 24.3093442,25.8309792 24.1260658,26.5176839 C23.941841,27.2081738 23.8796967,27.9317846 23.7642407,28.6396235 C23.0913786,28.2484826 22.6806583,27.5971067 22.310316,26.8536235 C22.296436,28.0144289 23.352574,29.3102409 24.3257478,29.3812141 C24.327956,29.3556638 24.3333187,29.3301134 24.3317414,29.3048785 C24.2001973,27.1416168 24.9632791,25.3016772 26.3642077,23.694845 C26.4645219,23.5800262 26.5888105,23.4787711 26.7194082,23.3989658 C27.5020481,22.9213953 28.2944671,22.4599121 29.0748988,21.9785564 C30.4707802,21.1177309 31.8240753,20.1969725 32.9470894,18.9838047 C34.0038583,17.8419255 34.7193066,16.5363349 34.8480116,14.9518987 C34.9316068,13.9229456 34.736972,12.9356302 34.4533794,11.9565161 C34.1048034,10.7521805 34.1278315,9.5620396 34.7549529,8.45517383 C35.383336,7.34641544 36.2546184,6.4461604 37.3318917,5.75377785 C37.3943515,5.71403289 37.4564958,5.67365705 37.5394601,5.62034832 C36.8091854,5.29418725 36.0877435,5.05697919 35.3259235,4.96550268\",\n id: \"Fill-30\",\n fill: \"#FFFFFF\",\n mask: \"url(#mask-4)\"\n })), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M59.9605318,10.5315772 L56.8757129,10.5315772 L56.8757129,5.03604698 L59.352653,5.03604698 C60.5463287,5.03604698 61.0472687,5.16600671 61.4595663,5.38365772 C62.2418908,5.81706711 62.6759547,6.62142953 62.6759547,7.75132215 C62.6759547,9.46697987 61.6327503,10.5315772 59.9605318,10.5315772 L59.9605318,10.5315772 Z M62.5671232,12.5519463 C62.2854234,12.051349 62.1109776,11.856094 62.1109776,11.856094 L62.1109776,11.8128792 C63.7847734,11.269698 64.8699331,9.61933557 64.8699331,7.66426174 C64.8699331,5.64420805 63.848495,4.10204027 62.2854234,3.51532886 C61.6983646,3.29736242 61.0248715,3.16771812 59.4170055,3.16771812 L54.7258979,3.16771812 L54.7258979,18.5029664 L56.8757129,18.5029664 L56.8757129,12.3995906 L60.1557974,12.3995906 L63.3926648,18.5029664 L65.168352,18.5029664 C65.2510008,18.2581879 65.3339651,18.0134094 65.4166139,17.7686309 L62.5671232,12.5519463 Z\",\n id: \"Fill-33\",\n fill: \"#FFFFFF\"\n })))));\n}\nconst ForwardRef = /*#__PURE__*/React.forwardRef(SvgHeaderLogo);\nexport default __webpack_public_path__ + \"static/media/header-logo.1c6db8685f512c5173e7097761497856.svg\";\nexport { ForwardRef as ReactComponent };","var _desc, _g;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nfunction SvgHeaderLogo(_ref, svgRef) {\n let {\n title,\n titleId,\n ...props\n } = _ref;\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: \"154px\",\n height: \"30px\",\n viewBox: \"0 0 154 30\",\n xmlns: \"http://www.w3.org/2000/svg\",\n xmlnsXlink: \"http://www.w3.org/1999/xlink\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title === undefined ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, \"header-logo@3x\") : title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _desc || (_desc = /*#__PURE__*/React.createElement(\"desc\", null, \"Created with Sketch.\")), _g || (_g = /*#__PURE__*/React.createElement(\"g\", {\n id: \"header-logo\",\n stroke: \"none\",\n strokeWidth: 1,\n fill: \"none\",\n fillRule: \"evenodd\"\n }, /*#__PURE__*/React.createElement(\"g\", {\n id: \"Logo-topbar\",\n fillRule: \"nonzero\"\n }, /*#__PURE__*/React.createElement(\"g\", {\n id: \"Gaumont_-_coffret_-_00000158031290302717583950000008722797276171988655_\",\n fill: \"#DC0A2F\"\n }, /*#__PURE__*/React.createElement(\"g\", {\n id: \"Group\"\n }, /*#__PURE__*/React.createElement(\"path\", {\n d: \"M85.8088036,17.8395349 L85.8088036,14.0267442 L87.9832957,14.0267442 L87.9832957,12.8895349 L85.8018341,12.8895349 L85.8018341,11.4209302 L83.1812923,11.4209302 L83.1812923,12.8930233 L82.0382901,12.8930233 L82.0382901,14.0302326 L83.1812923,14.0302326 L83.1812923,18.2616279 C83.2579571,19.6744186 84.2615688,20.1802326 85.7425931,20.3476744 C87.2236174,20.5116279 88.1784424,20.1837209 88.1784424,20.1837209 L88.1784424,19.1023256 C87.0215011,19.3081395 86.4046981,18.9872093 86.4046981,18.9872093 C85.773956,18.7081395 85.8088036,17.8395349 85.8088036,17.8395349 L85.8088036,17.8395349 Z M79.7209227,20.2116279 L81.2089165,20.2116279 L81.1984622,14.9127907 C81.1880079,14.3476744 80.9057421,13.9325581 80.9057421,13.9325581 C79.9822799,12.5197674 77.7555164,12.7709302 77.7555164,12.7709302 C75.9399549,12.8232558 74.9502822,13.7162791 74.9502822,13.7162791 L74.9502822,12.8860465 L72.4482223,12.8860465 L72.4412528,19.1023256 C72.4551919,20.1383721 73.5912246,20.2116279 73.5912246,20.2116279 L74.9711907,20.2116279 L74.9711907,14.6755814 C76.1107082,14.0127907 77.3721924,14.1523256 77.3721924,14.1523256 C78.8148843,14.2918605 78.6545852,15.4465116 78.6545852,15.4465116 L78.6545852,19.2104651 C78.6998871,20.1244186 79.7209227,20.2116279 79.7209227,20.2116279 L79.7209227,20.2116279 Z M71.1693143,16.4372093 C71.0159848,13.5139535 68.3083239,12.7290698 66.0153499,12.7255814 C60.3770034,12.7151163 60.7707816,16.6709302 60.7707816,16.6709302 C61.0356236,20.6860465 65.9561089,20.3825581 65.9561089,20.3825581 C71.5526383,20.372093 71.1693143,16.4372093 71.1693143,16.4372093 L71.1693143,16.4372093 Z M66.0258042,19.2488372 C66.0258042,19.2488372 63.7328301,19.4825581 63.5690463,16.6883721 C63.5690463,16.6883721 63.4157167,13.8976744 65.9142918,13.855814 C66.5310948,13.8453488 68.1863572,13.9674419 68.3710497,16.405814 C68.3675649,16.405814 68.541803,19.1895349 66.0258042,19.2488372 L66.0258042,19.2488372 Z M57.9097912,20.2011628 L59.5092974,20.2011628 L59.5092974,14.8953488 C59.2514249,12.5616279 56.456645,12.7430233 56.456645,12.7430233 C54.1741253,12.7569767 52.9300649,13.8069767 52.9300649,13.8069767 C52.149478,12.6069767 50.1213459,12.7186047 50.1213459,12.7186047 C47.9956405,12.7569767 47.0199069,13.6988372 47.0199069,13.6988372 L47.0199069,12.8790698 L44.5283014,12.8790698 L44.5283014,19.2 C44.6014814,20.1174419 45.5319131,20.2151163 45.5319131,20.2151163 L47.0582393,20.2151163 L47.0582393,14.6895349 C47.8388262,14.1767442 49.0828866,14.1383721 49.0828866,14.1383721 C50.7207252,14.0895349 50.7451185,15.1883721 50.7451185,15.1883721 L50.7451185,19.2453488 C50.7695119,20.1383721 51.8184255,20.2116279 51.8184255,20.2116279 L53.295965,20.2116279 L53.295965,14.6860465 C54.1253386,14.1 55.5436371,14.1348837 55.5436371,14.1348837 C56.9236033,14.1348837 56.9967833,15.2232558 56.9967833,15.2232558 L56.9967833,19.3290698 C57.0525395,20.0825581 57.9097912,20.2011628 57.9097912,20.2011628 L57.9097912,20.2011628 Z M41.3641366,20.2046512 L42.6325903,20.2046512 L42.6325903,12.8930233 L40.0468962,12.8930233 L40.0468962,18.422093 C39.1304035,18.9872093 37.8061936,18.9523256 37.8061936,18.9523256 C36.109114,18.9523256 36.2171416,17.7244186 36.2171416,17.7244186 L36.2171416,12.8930233 L33.5931151,12.8930233 L33.5931151,18.205814 C33.7743228,20.1453488 36.1056292,20.3023256 36.1056292,20.3023256 C37.4786258,20.4697674 38.5623871,20.1104651 39.1164644,19.9290698 C39.6705418,19.7476744 40.1270457,19.4127907 40.1270457,19.4127907 C40.2734058,20.1802326 41.3641366,20.2046512 41.3641366,20.2046512 L41.3641366,20.2046512 Z M31.8472489,14.7662791 C31.8472489,14.7662791 32.0423956,13.2732558 29.8992664,12.7744186 C29.8992664,12.7744186 28.0593115,12.4325581 26.3413234,12.6767442 C26.3413234,12.6767442 25.0310525,12.7953488 23.8985045,13.2034884 L23.8985045,14.3406977 C23.8985045,14.3406977 24.8080277,13.9813953 25.7977003,13.8383721 C26.7838883,13.6953488 27.6167466,13.7232558 28.1011287,13.8104651 C28.1011287,13.8104651 29.25807,13.894186 29.2232223,14.8255814 L29.2232223,15.5023256 C29.2232223,15.5023256 27.6864419,15.5127907 27.0417607,15.5267442 C26.3970796,15.5406977 24.6825762,15.6418605 23.6963883,16.472093 C23.6963883,16.472093 22.8391366,17.1174419 22.8948928,18.0906977 C22.8948928,18.0906977 22.7520175,19.5383721 24.8393905,20.1662791 C24.8393905,20.1662791 26.111329,20.5116279 27.9861315,20.0372093 C27.9861315,20.0372093 28.7980813,19.8313953 29.2232223,19.5697674 C29.2232223,19.5697674 29.4148843,20.2534884 30.669399,20.3023256 C30.7077314,20.2953488 31.8472489,20.3023256 31.8472489,20.3023256 L31.8472489,14.7662791 L31.8472489,14.7662791 Z M29.2232223,18.45 C28.8886851,18.6767442 27.7317438,19.05 26.6096501,19.0081395 C26.3378386,18.9976744 25.3307421,18.8581395 25.2018059,18.0732558 C25.1321106,17.6511628 25.2157449,17.0930233 25.8708804,16.7825581 C26.5016225,16.4825581 27.6794723,16.4895349 28.5750564,16.4895349 L29.2232223,16.4895211 L29.2232223,18.45 Z M26.9093397,8.39302326 C27.8502257,7.35348837 27.6202314,6.48488372 27.4843256,6.3244186 L27.4843256,6.3244186 C27.3553894,6.15697674 26.5538939,5.8255814 25.3795288,6.50232558 C24.8602991,6.80232558 24.0135017,7.42674419 23.4559396,9.35581395 C23.4559396,9.35581395 23.421092,9.47790698 23.4907872,9.54767442 L23.4907872,9.54418605 C23.5430587,9.6244186 23.6719949,9.62093023 23.6719949,9.62093023 C25.6722489,9.49186047 26.5051072,8.83953488 26.9093397,8.39302326 L26.9093397,8.39302326 Z M23.2259453,4.15116279 C23.5604825,2.53604651 22.8844385,1.85581395 22.6509594,1.7755814 L22.6509594,1.7755814 C22.420965,1.68139535 21.4382619,1.76162791 20.6507054,3.15 C20.3022291,3.76395349 19.7829994,4.96744186 20.3684396,7.25581395 C20.3684396,7.25581395 20.4102568,7.40232558 20.5182844,7.43023256 L20.5147997,7.42674419 C20.6193426,7.47906977 20.744794,7.39534884 20.744794,7.39534884 C22.6962613,6.06627907 23.08307,4.84186047 23.2259453,4.15116279 L23.2259453,4.15116279 Z M21.009636,11.1313953 L19.6366394,10.7197674 C17.3157872,10.077907 15.1412951,10.3674419 15.1412951,10.3674419 C12.409241,10.6011628 11.1826044,11.8151163 11.1826044,11.8151163 C9.08129233,13.5837209 9.64930869,16.3046512 9.64930869,16.3046512 C10.2138403,19.1790698 13.0469526,19.9430233 13.0469526,19.9430233 C14.9914503,20.605814 17.7583521,20.4976744 17.7583521,20.4976744 C19.8422404,20.427907 21.0270598,20.0895349 21.0270598,20.0895349 C21.5428047,19.9255814 21.4835638,19.4337209 21.4835638,19.4337209 L21.4835638,15.1290698 L16.1065745,15.1290698 L16.1065745,16.3395349 L17.2704853,16.3395349 C17.5039644,16.3290698 17.9604684,16.3290698 18.3298533,16.6709302 C18.6992381,17.0127907 18.7201467,17.5186047 18.7201467,17.5186047 L18.7201467,19.05 C17.657294,19.2488372 16.5421699,19.0744186 16.5421699,19.0744186 C14.6255502,18.8790698 13.8240547,18.205814 13.8240547,18.205814 C13.4546699,17.972093 12.2977286,16.7930233 12.5381772,14.9406977 C12.7821106,13.0883721 13.9982929,12.3593023 13.9982929,12.3593023 C14.7579712,11.7348837 16.1971783,11.6686047 16.1971783,11.6686047 C18.1939475,11.4453488 21.0061512,12.2581395 21.0061512,12.2581395 L21.0061512,11.1313953 L21.009636,11.1313953 Z M16.8383747,6.55465116 C18.186978,4.48604651 18.2044018,3.0244186 18.0754656,2.26046512 C17.775776,0.477906977 16.8139814,0.0523255814 16.5421699,0.0627906977 L16.5421699,0.0627906977 C16.2738431,0.0558139535 15.3294723,0.551162791 15.0785694,2.28139535 C14.967057,3.04534884 14.8903922,4.45813953 16.3992946,6.55813953 C16.3992946,6.55813953 16.5003527,6.69069767 16.6223194,6.67674419 L16.6188347,6.67674419 C16.7442861,6.69069767 16.8383747,6.55465116 16.8383747,6.55465116 L16.8383747,6.55465116 Z M12.8343821,7.08139535 C13.3710356,4.4372093 12.7855954,3.04883721 12.35,2.35116279 C11.3638121,0.76744186 10.1720231,0.66627907 9.91066591,0.788372093 C9.64233916,0.893023256 9.08477709,1.83488372 9.37749718,3.59651163 C9.48900959,4.2627907 10.2208098,6.04186047 12.4057562,7.26627907 C12.4057562,7.26627907 12.5521163,7.35348837 12.6705982,7.29418605 C12.7925649,7.25232558 12.8343821,7.08139535 12.8343821,7.08139535 L12.8343821,7.08139535 Z M9.37401242,9.39418605 C8.61781885,6.57209302 7.34588036,5.74186047 6.60014108,5.29186047 C4.91003104,4.27674419 3.78096783,4.63953488 3.59279063,4.87674419 L3.59279063,4.87674419 C3.39067438,5.10697674 3.07704571,6.20930233 4.3768623,7.69186047 C4.94836343,8.34767442 6.1471219,9.52674419 9.05689898,9.7744186 C9.05689898,9.7744186 9.23810666,9.78488372 9.31825621,9.67325581 C9.41582957,9.5755814 9.37401242,9.39418605 9.37401242,9.39418605 L9.37401242,9.39418605 Z M3.05613713,10.6988372 C1.08376129,10.6151163 0.386808691,11.5883721 0.338022009,11.8883721 L0.338022009,11.8883721 C0.268326749,12.1848837 0.543623025,13.2593023 2.39751693,13.9430233 C3.21295147,14.2430233 4.80548815,14.7488372 7.47830135,13.5732558 C7.47830135,13.5732558 7.64556998,13.4965116 7.65950903,13.3534884 L7.65950903,13.3569767 C7.70132619,13.2209302 7.57238995,13.0813953 7.57238995,13.0813953 C5.55819695,10.9709302 3.92732788,10.7372093 3.05613713,10.6988372 L3.05613713,10.6988372 Z M0.972248871,19.3639535 L0.972248871,19.3639535 C1.04542889,19.6395349 1.83995485,20.3755814 3.65551637,20.1383721 C4.45701185,20.0302326 5.88576467,19.7825581 7.57587472,17.6581395 C7.57587472,17.6581395 7.68041761,17.522093 7.63163093,17.4 L7.63163093,17.4034884 C7.60723758,17.2744186 7.44345372,17.2151163 7.44345372,17.2151163 C4.87169865,16.35 3.61021445,16.9081395 2.87841422,17.2569767 C1.21966704,18.0383721 0.885129797,19.0918605 0.972248871,19.3639535 L0.972248871,19.3639535 Z M4.91700056,22.5383721 C3.76354402,23.7244186 3.86111738,24.6802326 4.01793172,24.8825581 C4.16429176,25.0918605 5.01457393,25.5348837 6.47817438,24.7639535 C7.12285553,24.422093 8.30419018,23.6930233 9.06735327,21.3662791 C9.06735327,21.3662791 9.11265519,21.2162791 9.03250564,21.1290698 L9.03599041,21.1325581 C8.97326467,21.0313953 8.81645034,21.0313953 8.81645034,21.0313953 C6.37014673,21.1081395 5.42926072,22.0186047 4.91700056,22.5383721 L4.91700056,22.5383721 Z M9.46113149,26.1837209 C9.11265519,27.5755814 9.74339729,28.3186047 9.95248307,28.3988372 L9.95248307,28.3988372 C10.1545993,28.4930233 11.1268482,28.4337209 11.8865265,27.2162791 C12.2210638,26.6790698 12.6462049,25.6395349 12.20364,23.5639535 C12.20364,23.5639535 12.1722771,23.4348837 12.0781885,23.4 C11.9875847,23.3511628 11.8725875,23.4209302 11.8725875,23.4209302 C10.070965,24.544186 9.61794582,25.5697674 9.46113149,26.1837209 L9.46113149,26.1837209 Z M15.8173392,24.9697674 C14.6255502,26.4069767 14.5279769,27.3872093 14.5663093,27.9418605 C14.6603979,29.2011628 15.3921981,29.6476744 15.5873448,29.6581395 C15.7824915,29.6790698 16.5770175,29.3616279 16.8767071,28.1337209 C17.0056433,27.5930233 17.0753386,26.605814 16.1344526,24.994186 C16.1344526,24.994186 16.0717269,24.8930233 15.981123,24.8930233 L15.9846078,24.8930233 C15.8974887,24.8790698 15.8173392,24.9697674 15.8173392,24.9697674 L15.8173392,24.9697674 Z M19.6087613,24.7465116 C19.2114983,26.277907 19.4902793,27.0662791 19.7202737,27.477907 C20.2429881,28.4093023 20.9678188,28.4860465 21.1211484,28.4232558 C21.2779628,28.3709302 21.7727991,27.8372093 21.5602286,26.7906977 C21.46614,26.3267442 21.1629656,25.5488372 19.863149,24.6523256 C19.863149,24.6523256 19.7760299,24.5965116 19.7098194,24.6313953 L19.7133042,24.6313953 C19.6366394,24.6488372 19.6087613,24.7465116 19.6087613,24.7465116 L19.6087613,24.7465116 Z M22.9959509,22.7581395 C22.9471642,22.7965116 22.9541337,22.8767442 22.9541337,22.8767442 C23.0656462,24.1430233 23.5709368,24.7151163 23.8810807,24.9593023 C24.5780333,25.5034884 25.1878668,25.3046512 25.2854402,25.2069767 C25.3899831,25.1162791 25.640886,24.5232558 25.1425649,23.7906977 C24.9230248,23.4662791 24.3724323,22.9465116 23.1179176,22.7267442 C23.1179176,22.7267442 23.0377681,22.7093023 22.9959509,22.7581395 L22.9959509,22.7581395 Z\",\n id: \"Shape\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M29.7529063,26.2953488 L29.7529063,23.2639535 L29.1221642,23.2639535 L29.1221642,24.3593023 C28.9723194,24.1813953 28.7632336,24.027907 28.4286964,24.027907 C27.9024972,24.027907 27.4181151,24.4360465 27.4181151,25.1790698 L27.4181151,25.1860465 C27.4181151,25.9290698 27.9129515,26.3372093 28.4286964,26.3372093 C28.7562641,26.3372093 28.9688347,26.1837209 29.1221642,25.9744186 L29.1221642,26.2953488 L29.7529063,26.2953488 Z M29.1291337,25.1860465 C29.1291337,25.555814 28.8852003,25.8 28.5889955,25.8 C28.2927906,25.8 28.0453725,25.555814 28.0453725,25.1860465 L28.0453725,25.1790698 C28.0453725,24.805814 28.2927906,24.5651163 28.5889955,24.5651163 C28.8817156,24.5651163 29.1291337,24.8093023 29.1291337,25.1790698 L29.1291337,25.1860465 Z M32.49193,25.2418605 L32.49193,25.2348837 C32.49193,24.6034884 32.1504233,24.0244186 31.4116535,24.0244186 C30.7634876,24.0244186 30.3139532,24.5476744 30.3139532,25.1825581 L30.3139532,25.1895349 C30.3139532,25.8697674 30.8053047,26.3406977 31.4743792,26.3406977 C31.8786117,26.3406977 32.1748166,26.1837209 32.3839024,25.9255814 L32.0249718,25.6046512 C31.8507336,25.7686047 31.6974041,25.8348837 31.4848335,25.8348837 C31.2025677,25.8348837 31.0039362,25.6848837 30.9412105,25.3988372 L32.4884453,25.3988372 C32.49193,25.3430233 32.49193,25.3046512 32.49193,25.2418605 L32.49193,25.2418605 Z M31.8786117,25.0046512 L30.9272714,25.0046512 C30.9795429,24.7186047 31.1468115,24.5302326 31.4081687,24.5302326 C31.6764955,24.5337209 31.8437641,24.722093 31.8786117,25.0046512 L31.8786117,25.0046512 Z M35.4017071,25.1860465 L35.4017071,25.1790698 C35.4017071,24.4360465 34.9068708,24.027907 34.3911258,24.027907 C34.0635581,24.027907 33.8509876,24.1813953 33.697658,24.3872093 L33.697658,24.0697674 L33.0669159,24.0697674 L33.0669159,26.9581395 L33.697658,26.9581395 L33.697658,26.005814 C33.8475028,26.1837209 34.0531038,26.3372093 34.3911258,26.3372093 C34.9173251,26.3372093 35.4017071,25.9290698 35.4017071,25.1860465 L35.4017071,25.1860465 Z M34.770965,25.1860465 C34.770965,25.5593023 34.5235468,25.8 34.227342,25.8 C33.9311371,25.8 33.6872037,25.555814 33.6872037,25.1860465 L33.6872037,25.1790698 C33.6872037,24.8093023 33.9311371,24.5651163 34.227342,24.5651163 C34.5200621,24.5651163 34.770965,24.8093023 34.770965,25.1790698 L34.770965,25.1860465 Z M37.990886,26.2953488 L37.990886,24.0697674 L37.3601439,24.0697674 L37.3601439,25.3116279 C37.3601439,25.6116279 37.2068143,25.7651163 36.9663657,25.7651163 C36.725917,25.7651163 36.5865265,25.6116279 36.5865265,25.3116279 L36.5865265,24.0697674 L35.9557844,24.0697674 L35.9557844,25.5104651 C35.9557844,26.0197674 36.2345655,26.3372093 36.711978,26.3372093 C37.0290914,26.3372093 37.2172686,26.1662791 37.3636287,25.977907 L37.3636287,26.2953488 L37.990886,26.2953488 L37.990886,26.2953488 Z M39.3360045,23.2639535 L38.6738995,23.2639535 L38.6738995,23.8255814 L39.3360045,23.8255814 L39.3360045,23.2639535 Z M39.3185807,24.0697674 L38.6878386,24.0697674 L38.6878386,26.2953488 L39.3185807,26.2953488 L39.3185807,24.0697674 Z M41.6464024,25.6151163 L41.6464024,25.6081395 C41.6464024,25.2034884 41.2874718,25.0534884 40.9738431,24.9488372 C40.7333945,24.8651163 40.5208239,24.8093023 40.5208239,24.6837209 L40.5208239,24.6767442 C40.5208239,24.5895349 40.6009735,24.5232558 40.754303,24.5232558 C40.9146021,24.5232558 41.1341422,24.6 41.3536823,24.7290698 L41.5941309,24.2930233 C41.3536823,24.1325581 41.0470231,24.0348837 40.7647573,24.0348837 C40.3187077,24.0348837 39.9528076,24.2860465 39.9528076,24.7395349 L39.9528076,24.7465116 C39.9528076,25.1790698 40.3047686,25.3255814 40.6149125,25.4162791 C40.8588459,25.4895349 41.0749012,25.5348837 41.0749012,25.6744186 L41.0749012,25.6813953 C41.0749012,25.7825581 40.9912669,25.8488372 40.8100593,25.8488372 C40.6009735,25.8488372 40.3500705,25.7581395 40.1096219,25.5837209 L39.8378104,25.9988372 C40.1340152,26.2290698 40.4824915,26.3337209 40.7926354,26.3337209 C41.2770175,26.3372093 41.6464024,26.1104651 41.6464024,25.6151163 L41.6464024,25.6151163 Z M45.7863008,26.9581395 L45.7863008,24.0697674 L45.1555587,24.0697674 L45.1555587,24.3593023 C45.0057139,24.1813953 44.7966281,24.027907 44.4620909,24.027907 C43.9358916,24.027907 43.4515096,24.4360465 43.4515096,25.1790698 L43.4515096,25.1860465 C43.4515096,25.9290698 43.9463459,26.3372093 44.4620909,26.3372093 C44.7896586,26.3372093 45.0022291,26.1837209 45.1555587,25.9744186 L45.1555587,26.9581395 L45.7863008,26.9581395 Z M45.1625282,25.1860465 C45.1625282,25.555814 44.9185948,25.8 44.62239,25.8 C44.3296699,25.8 44.0787669,25.555814 44.0787669,25.1860465 L44.0787669,25.1790698 C44.0787669,24.805814 44.3261851,24.5651163 44.62239,24.5651163 C44.9185948,24.5651163 45.1625282,24.8093023 45.1625282,25.1790698 L45.1625282,25.1860465 Z M48.473053,26.2953488 L48.473053,24.0697674 L47.8423109,24.0697674 L47.8423109,25.3116279 C47.8423109,25.6116279 47.6889814,25.7651163 47.4485327,25.7651163 C47.2080841,25.7651163 47.0652088,25.6116279 47.0652088,25.3116279 L47.0652088,24.0697674 L46.4344667,24.0697674 L46.4344667,25.5104651 C46.4344667,26.0197674 46.7132477,26.3372093 47.1906603,26.3372093 C47.5112585,26.3372093 47.6959509,26.1662791 47.8423109,25.977907 L47.8423109,26.2953488 L48.473053,26.2953488 L48.473053,26.2953488 Z M51.2155615,25.2418605 L51.2155615,25.2348837 C51.2155615,24.6034884 50.8740547,24.0244186 50.1318002,24.0244186 C49.4836343,24.0244186 49.0340999,24.5476744 49.0340999,25.1825581 L49.0340999,25.1895349 C49.0340999,25.8697674 49.5289362,26.3406977 50.194526,26.3406977 C50.5987585,26.3406977 50.8949633,26.1837209 51.1040491,25.9255814 L50.7451185,25.6046512 C50.5708804,25.7686047 50.4175508,25.8348837 50.2049802,25.8348837 C49.9227144,25.8348837 49.724083,25.6848837 49.6613572,25.3988372 L51.208592,25.3988372 C51.2120767,25.3430233 51.2155615,25.3046512 51.2155615,25.2418605 L51.2155615,25.2418605 Z M50.6022432,25.0046512 L49.6509029,25.0046512 C49.6996896,24.7186047 49.870443,24.5302326 50.1318002,24.5302326 C50.400127,24.5337209 50.5639108,24.722093 50.6022432,25.0046512 L50.6022432,25.0046512 Z M53.7977709,23.2639535 L53.1670288,23.2639535 L53.1670288,26.2953488 L53.7977709,26.2953488 L53.7977709,23.2639535 Z M56.5681574,25.2418605 L56.5681574,25.2348837 C56.5681574,24.6034884 56.2266507,24.0244186 55.4843962,24.0244186 C54.839715,24.0244186 54.3866958,24.5476744 54.3866958,25.1825581 L54.3866958,25.1895349 C54.3866958,25.8697674 54.8815322,26.3406977 55.5471219,26.3406977 C55.9513544,26.3406977 56.2475593,26.1837209 56.456645,25.9255814 L56.0942297,25.6046512 C55.9199915,25.7686047 55.766662,25.8348837 55.5540914,25.8348837 C55.2718256,25.8348837 55.0731941,25.6848837 55.0104684,25.3988372 L56.5577032,25.3988372 C56.5646727,25.3430233 56.5681574,25.3046512 56.5681574,25.2418605 L56.5681574,25.2418605 Z M55.9548392,25.0046512 L55.0034989,25.0046512 C55.0557703,24.7186047 55.2230389,24.5302326 55.4843962,24.5302326 C55.7492381,24.5337209 55.9165068,24.722093 55.9548392,25.0046512 L55.9548392,25.0046512 Z M60.4466986,25.9360465 L60.0773138,25.5627907 C59.9239842,25.7093023 59.7776242,25.8 59.5685384,25.8 C59.2235468,25.8 59.0040068,25.5244186 59.0040068,25.1860465 L59.0040068,25.1790698 C59.0040068,24.8511628 59.2270316,24.572093 59.544145,24.572093 C59.7671699,24.572093 59.9100451,24.6662791 60.0494357,24.8162791 L60.4362444,24.4011628 C60.2306433,24.1674419 59.9658014,24.027907 59.5476298,24.027907 C58.868101,24.027907 58.3802342,24.5511628 58.3802342,25.1860465 L58.3802342,25.1930233 C58.3802342,25.827907 58.868101,26.344186 59.5371755,26.344186 C59.9832252,26.344186 60.2306433,26.1732558 60.4466986,25.9360465 L60.4466986,25.9360465 Z M61.6350028,23.2639535 L60.9728979,23.2639535 L60.9728979,23.8255814 L61.6350028,23.8255814 L61.6350028,23.2639535 Z M61.6210638,24.0697674 L60.9903217,24.0697674 L60.9903217,26.2953488 L61.6210638,26.2953488 L61.6210638,24.0697674 Z M64.3531179,26.2953488 L64.3531179,24.8546512 C64.3531179,24.3453488 64.0743369,24.027907 63.5969244,24.027907 C63.2798109,24.027907 63.0916337,24.1988372 62.9452737,24.3837209 L62.9452737,24.0697674 L62.3145316,24.0697674 L62.3145316,26.2953488 L62.9452737,26.2953488 L62.9452737,25.0534884 C62.9452737,24.7534884 63.0986033,24.6 63.3390519,24.6 C63.5795006,24.6 63.7188911,24.7534884 63.7188911,25.0534884 L63.7188911,26.2953488 L64.3531179,26.2953488 Z M66.2244357,23.822093 L66.7541196,23.3232558 L66.2104966,23.0860465 L65.7400536,23.822093 L66.2244357,23.822093 Z M67.0816874,25.2418605 L67.0816874,25.2348837 C67.0816874,24.6034884 66.7401806,24.0244186 65.9979261,24.0244186 C65.3497602,24.0244186 64.9002257,24.5476744 64.9002257,25.1825581 L64.9002257,25.1895349 C64.9002257,25.8697674 65.3950621,26.3406977 66.0606518,26.3406977 C66.4648843,26.3406977 66.7610892,26.1837209 66.9701749,25.9255814 L66.6112444,25.6046512 C66.4370062,25.7686047 66.2836766,25.8348837 66.0711061,25.8348837 C65.7888403,25.8348837 65.5902088,25.6848837 65.5274831,25.3988372 L67.0747178,25.3988372 C67.0747178,25.3430233 67.0816874,25.3046512 67.0816874,25.2418605 L67.0816874,25.2418605 Z M66.4648843,25.0046512 L65.513544,25.0046512 C65.5623307,24.7186047 65.7330841,24.5302326 65.9944413,24.5302326 C66.2627681,24.5337209 66.4300367,24.722093 66.4648843,25.0046512 L66.4648843,25.0046512 Z M71.0438629,26.2953488 L71.0438629,24.844186 C71.0438629,24.3104651 70.7615971,24.027907 70.2946388,24.027907 C69.9914644,24.027907 69.7579853,24.1534884 69.5628386,24.3802326 C69.4478414,24.1569767 69.2283014,24.027907 68.9355813,24.027907 C68.6149831,24.027907 68.4268059,24.1988372 68.2804458,24.3837209 L68.2804458,24.0697674 L67.6497037,24.0697674 L67.6497037,26.2953488 L68.2804458,26.2953488 L68.2804458,25.0534884 C68.2804458,24.7534884 68.4268059,24.6 68.6637698,24.6 C68.9007336,24.6 69.0331546,24.7534884 69.0331546,25.0534884 L69.0331546,26.2953488 L69.6638967,26.2953488 L69.6638967,25.0534884 C69.6638967,24.7534884 69.8102568,24.6 70.0472207,24.6 C70.2841845,24.6 70.4166055,24.7534884 70.4166055,25.0534884 L70.4166055,26.2953488 L71.0438629,26.2953488 Z M73.6086484,26.2953488 L73.6086484,25.0046512 C73.6086484,24.4046512 73.305474,24.0453488 72.6189757,24.0453488 C72.2426213,24.0453488 72.0021727,24.1151163 71.7547545,24.2232558 L71.9115688,24.7046512 C72.1136851,24.627907 72.2844385,24.5860465 72.5248871,24.5860465 C72.8420006,24.5860465 73.0022997,24.7325581 73.0022997,24.994186 L73.0022997,25.0290698 C72.8454853,24.9767442 72.6851862,24.9383721 72.4586766,24.9383721 C71.9324774,24.9383721 71.5630926,25.1616279 71.5630926,25.65 L71.5630926,25.6569767 C71.5630926,26.0965116 71.9080841,26.3372093 72.3262556,26.3372093 C72.6329148,26.3372093 72.8454853,26.2255814 72.9988149,26.0546512 L72.9988149,26.2953488 L73.6086484,26.2953488 L73.6086484,26.2953488 Z M73.012754,25.5104651 C73.012754,25.7372093 72.8141225,25.9011628 72.5179176,25.9011628 C72.3158014,25.9011628 72.1729261,25.8 72.1729261,25.6325581 L72.1729261,25.6255814 C72.1729261,25.4267442 72.3401947,25.3186047 72.6085214,25.3186047 C72.761851,25.3186047 72.9047263,25.3534884 73.012754,25.4023256 L73.012754,25.5104651 Z M77.6788516,25.2418605 L77.6788516,25.2348837 C77.6788516,24.6034884 77.3408296,24.0244186 76.5985751,24.0244186 C75.9504091,24.0244186 75.5008747,24.5476744 75.5008747,25.1825581 L75.5008747,25.1895349 C75.5008747,25.8697674 75.9957111,26.3406977 76.6613008,26.3406977 C77.0655333,26.3406977 77.3617381,26.1837209 77.5708239,25.9255814 L77.2118933,25.6046512 C77.0376552,25.7686047 76.8843256,25.8348837 76.6717551,25.8348837 C76.3894893,25.8348837 76.1908578,25.6848837 76.1281321,25.3988372 L77.6753668,25.3988372 C77.6753668,25.3430233 77.6788516,25.3046512 77.6788516,25.2418605 L77.6788516,25.2418605 Z M77.0655333,25.0046512 L76.114193,25.0046512 C76.1629797,24.7186047 76.3337331,24.5302326 76.5950903,24.5302326 C76.8599323,24.5337209 77.0272009,24.722093 77.0655333,25.0046512 L77.0655333,25.0046512 Z M80.1704571,26.2953488 L79.3863854,25.1546512 L80.1356095,24.0732558 L79.4769893,24.0732558 L79.055333,24.7186047 L78.6406462,24.0732558 L77.9646021,24.0732558 L78.7138262,25.1686047 L77.9332393,26.2988372 L78.5918595,26.2988372 L79.0413939,25.6046512 L79.4874436,26.2988372 L80.1704571,26.2988372 L80.1704571,26.2953488 Z M81.3308832,23.2639535 L80.6687782,23.2639535 L80.6687782,23.8255814 L81.3308832,23.8255814 L81.3308832,23.2639535 Z M81.3134594,24.0697674 L80.6827173,24.0697674 L80.6827173,26.2953488 L81.3134594,26.2953488 L81.3134594,24.0697674 Z M83.641281,25.6151163 L83.641281,25.6081395 C83.641281,25.2034884 83.2823505,25.0534884 82.9687218,24.9488372 C82.7282731,24.8651163 82.5157026,24.8093023 82.5157026,24.6837209 L82.5157026,24.6767442 C82.5157026,24.5895349 82.5958521,24.5232558 82.7491817,24.5232558 C82.9129656,24.5232558 83.1290209,24.6 83.3485609,24.7290698 L83.5890096,24.2930233 C83.3485609,24.1325581 83.0419018,24.0348837 82.759636,24.0348837 C82.3135863,24.0348837 81.9476862,24.2860465 81.9476862,24.7395349 L81.9476862,24.7465116 C81.9476862,25.1790698 82.2996473,25.3255814 82.6097912,25.4162791 C82.8537246,25.4895349 83.0697799,25.5348837 83.0697799,25.6744186 L83.0697799,25.6813953 C83.0697799,25.7825581 82.9861456,25.8488372 82.8049379,25.8488372 C82.5993369,25.8488372 82.3449492,25.7581395 82.1045006,25.5837209 L81.8361738,25.9988372 C82.1288939,26.2290698 82.480855,26.3337209 82.7875141,26.3337209 C83.2718962,26.3372093 83.641281,26.1104651 83.641281,25.6151163 L83.641281,25.6151163 Z M85.4045711,26.2011628 L85.4045711,25.6953488 C85.3139673,25.744186 85.2094244,25.772093 85.0944272,25.772093 C84.9550367,25.772093 84.8923109,25.7023256 84.8923109,25.555814 L84.8923109,24.6034884 L85.4150254,24.6034884 L85.4150254,24.0697674 L84.8923109,24.0697674 L84.8923109,23.5011628 L84.2615688,23.5011628 L84.2615688,24.0697674 L83.9967269,24.0697674 L83.9967269,24.6104651 L84.2615688,24.6104651 L84.2615688,25.6674419 C84.2615688,26.1837209 84.5229261,26.3372093 84.90625,26.3372093 C85.1188205,26.3302326 85.2686653,26.2813953 85.4045711,26.2011628 L85.4045711,26.2011628 Z M87.99375,25.2418605 L87.99375,25.2348837 C87.99375,24.6034884 87.6522432,24.0244186 86.9099887,24.0244186 C86.2618228,24.0244186 85.8122884,24.5476744 85.8122884,25.1825581 L85.8122884,25.1895349 C85.8122884,25.8697674 86.3071247,26.3406977 86.9727144,26.3406977 C87.376947,26.3406977 87.6731518,26.1837209 87.8822376,25.9255814 L87.5198222,25.6046512 C87.3455841,25.7686047 87.1922545,25.8348837 86.979684,25.8348837 C86.6974182,25.8348837 86.4987867,25.6848837 86.4360609,25.3988372 L87.9832957,25.3988372 C87.9867805,25.3430233 87.99375,25.3046512 87.99375,25.2418605 L87.99375,25.2418605 Z M87.376947,25.0046512 L86.4256067,25.0046512 C86.4743933,24.7186047 86.6451467,24.5302326 86.906504,24.5302326 C87.1748307,24.5337209 87.3420993,24.722093 87.376947,25.0046512 L87.376947,25.0046512 Z\",\n id: \"Shape\"\n }))), /*#__PURE__*/React.createElement(\"g\", {\n id: \"Group\",\n transform: \"translate(93.740124, 12.558140)\",\n fill: \"#FFFFFF\"\n }, /*#__PURE__*/React.createElement(\"path\", {\n d: \"M0.275296275,3.99069767 C0.275296275,1.84534884 1.90616535,0.268604651 4.10853555,0.268604651 C5.17487302,0.268604651 6.13666761,0.624418605 6.78483352,1.33604651 L6.29348194,1.82790698 C5.69758747,1.22093023 4.96578725,0.959302326 4.12944413,0.959302326 C2.3626693,0.959302326 1.0349746,2.25697674 1.0349746,3.99418605 C1.0349746,5.73139535 2.3626693,7.02906977 4.12944413,7.02906977 C4.96578725,7.02906977 5.69758747,6.76744186 6.29348194,6.15 L6.78483352,6.64186047 C6.13666761,7.35348837 5.17487302,7.71976744 4.09808126,7.71976744 C1.90616535,7.71627907 0.275296275,6.13604651 0.275296275,3.99069767 Z\",\n id: \"Path\"\n }), /*#__PURE__*/React.createElement(\"polygon\", {\n id: \"Path\",\n points: \"8.43312641 0.331395349 9.20674379 0.331395349 9.20674379 6.98372093 13.3013403 6.98372093 13.3013403 7.65348837 8.43312641 7.65348837\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M19.1940745,5.69651163 L15.1203866,5.69651163 L14.2422263,7.65348837 L13.437246,7.65348837 L16.7791337,0.331395349 L17.5422968,0.331395349 L20.8841845,7.65348837 L20.06875,7.65348837 L19.1940745,5.69651163 Z M18.9152935,5.06860465 L17.1589729,1.1372093 L15.4026524,5.06860465 L18.9152935,5.06860465 Z\",\n id: \"Shape\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M21.3999295,6.76395349 L21.7031038,6.16744186 C22.2258183,6.68023256 23.15625,7.05697674 24.1180446,7.05697674 C25.4875564,7.05697674 26.0834509,6.48139535 26.0834509,5.75930233 C26.0834509,3.75 21.5811371,4.98488372 21.5811371,2.27790698 C21.5811371,1.2 22.4174802,0.268604651 24.2783437,0.268604651 C25.1042325,0.268604651 25.9614842,0.509302326 26.5469244,0.91744186 L26.2855672,1.53488372 C25.6583098,1.12674419 24.9265096,0.927906977 24.2783437,0.927906977 C22.9401947,0.927906977 22.3443002,1.5244186 22.3443002,2.25697674 C22.3443002,4.26627907 26.846614,3.05232558 26.846614,5.72093023 C26.846614,6.79883721 25.9893623,7.71976744 24.1180446,7.71976744 C23.0203442,7.71627907 21.9435525,7.32906977 21.3999295,6.76395349 Z\",\n id: \"Path\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M27.8258324,6.76395349 L28.1290068,6.16744186 C28.6517212,6.68023256 29.5821529,7.05697674 30.5439475,7.05697674 C31.9134594,7.05697674 32.5093538,6.48139535 32.5093538,5.75930233 C32.5093538,3.75 28.0070401,4.98488372 28.0070401,2.27790698 C28.0070401,1.2 28.8433832,0.268604651 30.7042466,0.268604651 C31.5301354,0.268604651 32.3873871,0.509302326 32.9728273,0.91744186 L32.7114701,1.53488372 C32.0842128,1.12674419 31.3524125,0.927906977 30.7042466,0.927906977 C29.3660976,0.927906977 28.7702032,1.5244186 28.7702032,2.25697674 C28.7702032,4.26627907 33.2725169,3.05232558 33.2725169,5.72093023 C33.2725169,6.79883721 32.4152652,7.71976744 30.5439475,7.71976744 C29.4462472,7.71627907 28.3694554,7.32906977 27.8258324,6.76395349 Z\",\n id: \"Path\"\n }), /*#__PURE__*/React.createElement(\"polygon\", {\n id: \"Path\",\n points: \"34.9486879 0.331395349 35.7223053 0.331395349 35.7223053 7.65348837 34.9486879 7.65348837\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M45.4726721,8.26744186 C45.0231377,8.81162791 44.4063347,9.10465116 43.695443,9.10465116 C42.8381913,9.10465116 42.1272997,8.71744186 41.1655051,7.7127907 C39.0223758,7.65 37.4577173,6.08023256 37.4577173,3.99069767 C37.4577173,1.85581395 39.0885863,0.268604651 41.3014108,0.268604651 C43.4968115,0.268604651 45.1346501,1.84883721 45.1346501,3.99069767 C45.1346501,5.86395349 43.8905897,7.29418605 42.1133606,7.63953488 C42.6674379,8.2255814 43.1796981,8.4872093 43.7024125,8.4872093 C44.2564898,8.4872093 44.7060243,8.26744186 45.092833,7.81744186 L45.4726721,8.26744186 Z M41.3014108,7.0255814 C43.0577314,7.0255814 44.3645175,5.72790698 44.3645175,3.99069767 C44.3645175,2.25348837 43.0577314,0.955813953 41.3014108,0.955813953 C39.534636,0.955813953 38.2208804,2.25348837 38.2208804,3.99069767 C38.2208804,5.72790698 39.5381208,7.0255814 41.3014108,7.0255814 Z\",\n id: \"Shape\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M46.8073363,4.5244186 L46.8073363,0.331395349 L47.5809537,0.331395349 L47.5809537,4.49302326 C47.5809537,6.23023256 48.3963883,7.0255814 49.8181716,7.0255814 C51.2504091,7.0255814 52.0658437,6.23023256 52.0658437,4.49302326 L52.0658437,0.331395349 L52.8185525,0.331395349 L52.8185525,4.5244186 C52.8185525,6.62790698 51.6894893,7.7127907 49.8181716,7.7127907 C47.9468538,7.7127907 46.8073363,6.62790698 46.8073363,4.5244186 Z\",\n id: \"Path\"\n }), /*#__PURE__*/React.createElement(\"polygon\", {\n id: \"Path\",\n points: \"60.3177624 6.98372093 60.3177624 7.65348837 55.1463742 7.65348837 55.1463742 0.331395349 60.1609481 0.331395349 60.1609481 1.00116279 55.9199915 1.00116279 55.9199915 3.60697674 59.7009594 3.60697674 59.7009594 4.26627907 55.9199915 4.26627907 55.9199915 6.9872093 60.3177624 6.9872093\"\n }))))));\n}\nconst ForwardRef = /*#__PURE__*/React.forwardRef(SvgHeaderLogo);\nexport default __webpack_public_path__ + \"static/media/header-logo.a2ab6b010ee5e45eda38a79777950c53.svg\";\nexport { ForwardRef as ReactComponent };","var _desc, _defs, _g;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nfunction SvgHeaderLogo(_ref, svgRef) {\n let {\n title,\n titleId,\n ...props\n } = _ref;\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: \"154px\",\n height: \"30px\",\n viewBox: \"0 0 154 30\",\n xmlns: \"http://www.w3.org/2000/svg\",\n xmlnsXlink: \"http://www.w3.org/1999/xlink\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title === undefined ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, \"header-logo@3x\") : title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _desc || (_desc = /*#__PURE__*/React.createElement(\"desc\", null, \"Created with Sketch.\")), _defs || (_defs = /*#__PURE__*/React.createElement(\"defs\", null, /*#__PURE__*/React.createElement(\"polygon\", {\n id: \"path-1\",\n points: \"0.000117054632 0.529833333 45.8035945 0.529833333 45.8035945 29.0072798 0.000117054632 29.0072798\"\n }), /*#__PURE__*/React.createElement(\"polygon\", {\n id: \"path-3\",\n points: \"0 29.0697942 153.926841 29.0697942 153.926841 0.591992551 0 0.591992551\"\n }))), _g || (_g = /*#__PURE__*/React.createElement(\"g\", {\n id: \"header-logo\",\n stroke: \"none\",\n strokeWidth: 1,\n fill: \"none\",\n fillRule: \"evenodd\"\n }, /*#__PURE__*/React.createElement(\"g\", {\n id: \"vf\",\n transform: \"translate(-0.000000, 0.000000)\"\n }, /*#__PURE__*/React.createElement(\"g\", {\n id: \"Group-3\",\n transform: \"translate(0.000000, 0.062159)\"\n }, /*#__PURE__*/React.createElement(\"mask\", {\n id: \"mask-2\",\n fill: \"white\"\n }, /*#__PURE__*/React.createElement(\"use\", {\n xlinkHref: \"#path-1\"\n })), /*#__PURE__*/React.createElement(\"g\", {\n id: \"Clip-2\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M24.6149503,27.1780228 L25.4255536,25.8318318 L24.6149503,24.4850487 L23.8066881,25.8318318 L24.6149503,27.1780228 Z M21.2039783,24.4850487 L20.3963014,25.8318318 L21.2039783,27.1780228 L22.0145817,25.8318318 L21.2039783,24.4850487 Z M22.1035432,22.9955955 L22.908879,24.3406025 L23.7177266,22.9955955 L22.908879,21.6488124 L22.1035432,22.9955955 Z M21.9010387,29.0072798 L20.5098444,29.0072798 L19.5008334,27.324245 L18.4900667,29.0072798 L17.0965313,29.0072798 L16.1413655,27.4154118 L9.04668428,15.5927286 L9.00922679,15.5353053 L6.0805199,10.6590627 L6.11036884,10.6744545 C7.85975031,11.6447303 9.33112703,13.0708403 10.3571109,14.7911707 L17.7935916,27.1780228 L18.6012686,25.8318318 L11.5493123,14.0890675 C10.0334548,11.5529714 7.66134271,9.6088679 4.86841919,8.63444816 L3.70782252,6.70100048 L3.7300629,6.7075124 C7.56711373,7.53926194 10.8692249,9.95577553 12.8609095,13.2845496 L19.5008334,24.3406025 L20.3090957,22.9955955 L14.0589636,12.5936943 C11.6523204,8.58945672 7.51853606,5.80353978 2.78309093,5.1576759 L1.78110328,3.49832078 L1.79924675,3.50068875 C7.48751658,3.88015598 12.5196952,7.05323605 15.3699755,11.7891765 L21.2039783,21.5014063 L22.0145817,20.1546232 L16.5703707,11.0953612 C13.3302985,5.71829285 7.48751658,2.22612879 0.934213017,2.08582655 L0.000117054632,0.529478138 L0.527448171,0.529478138 C7.77547097,0.529478138 14.2924876,4.33776622 17.8796268,10.2896593 L22.908879,18.66221 L27.9252553,10.2896593 C31.5094681,4.33776622 38.0247289,0.529478138 45.2745076,0.529478138 L45.8035945,0.529478138 L44.8706691,2.08582655 C38.3173655,2.22612879 32.4716572,5.71829285 29.231585,11.0953612 L23.8066881,20.1546232 L24.6149503,21.5014063 L30.4354919,11.7921364 C33.2799194,7.05738 38.3144391,3.88015598 44.0056353,3.50068875 L44.0214377,3.50068875 L43.0270586,5.1576759 C38.2851755,5.80768372 34.1525617,8.59064071 31.7459185,12.5954703 L25.5115888,22.9955955 L26.3210216,24.3406025 L32.9433874,13.2857336 C34.9344867,9.95991948 38.2383536,7.53926194 42.0777456,6.7075124 L42.0999859,6.70218447 L40.9370482,8.63444816 C38.1435394,9.6088679 35.7714273,11.5547474 34.2526434,14.0908435 L27.21766,25.8318318 L28.0282634,27.1780228 L35.4466007,14.7911707 C36.4708287,13.0726163 37.9439612,11.6447303 39.6886605,10.6756385 L39.7220211,10.6620226 L36.7903878,15.5353053 L36.7558567,15.5956886 L29.6758073,27.4154118 L28.7223973,29.0072798 L27.331203,29.0072798 L26.3210216,27.324245 L25.3114254,29.0072798 L23.9208163,29.0072798 L22.908879,27.324245 L21.9010387,29.0072798 Z\",\n id: \"Fill-1\",\n fill: \"#FE4E1E\",\n mask: \"url(#mask-2)\"\n })), /*#__PURE__*/React.createElement(\"polygon\", {\n id: \"Fill-4\",\n fill: \"#FFFFFF\",\n points: \"49.070121 20.6352028 46.3755234 13.4756448 43.6065961 13.4756448 47.7280897 22.8717506 50.4098113 22.8717506 54.533646 13.4756448 51.7617923 13.4756448\"\n }), /*#__PURE__*/React.createElement(\"mask\", {\n id: \"mask-4\",\n fill: \"white\"\n }, /*#__PURE__*/React.createElement(\"use\", {\n xlinkHref: \"#path-3\"\n })), /*#__PURE__*/React.createElement(\"g\", {\n id: \"Clip-7\"\n }), /*#__PURE__*/React.createElement(\"polygon\", {\n id: \"Fill-6\",\n fill: \"#FFFFFF\",\n mask: \"url(#mask-4)\",\n points: \"56.4279411 22.8710402 58.951639 22.8710402 58.951639 13.4761184 56.4279411 13.4761184\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M67.1244519,21.0823939 L64.3133849,21.0823939 L64.3133849,15.2648831 L66.8915132,15.2648831 C68.8164766,15.2648831 69.5451417,16.3452695 69.5451417,18.0815837 C69.5451417,20.0689027 68.7889687,21.0823939 67.1244519,21.0823939 M67.5797944,13.4764736 L61.7914429,13.4764736 L61.7914429,22.8708034 L67.8016129,22.8708034 C70.7139322,22.8708034 72.1455103,21.0024749 72.1455103,18.1757105 C72.1455103,15.3453941 70.7683626,13.4764736 67.5797944,13.4764736\",\n id: \"Fill-8\",\n fill: \"#FFFFFF\",\n mask: \"url(#mask-4)\"\n }), /*#__PURE__*/React.createElement(\"polygon\", {\n id: \"Fill-9\",\n fill: \"#FFFFFF\",\n mask: \"url(#mask-4)\",\n points: \"77.1858242 18.9239891 83.0256798 18.9239891 83.0256798 17.2137226 77.1858242 17.2137226 77.1858242 15.2666591 83.3382157 15.2666591 83.3382157 13.4764736 74.6592 13.4764736 74.6592 22.8725794 83.3920608 22.8725794 83.3920608 21.0823939 77.1858242 21.0823939\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M90.9643249,21.3457122 C88.6764922,21.3457122 87.8688152,19.6336698 87.8688152,18.1750001 C87.8688152,16.7133705 88.6764922,15.00192 90.9643249,15.00192 C93.2521577,15.00192 94.0598347,16.7133705 94.0598347,18.1750001 C94.0598347,19.6336698 93.2521577,21.3457122 90.9643249,21.3457122 M90.9643249,13.2129185 C85.9696038,13.2129185 85.1894347,16.2137288 85.1894347,18.1750001 C85.1894347,20.1350874 85.9696038,23.1358977 90.9643249,23.1358977 C95.9619724,23.1358977 96.7392152,20.1350874 96.7392152,18.1750001 C96.7392152,16.2137288 95.9619724,13.2129185 90.9643249,13.2129185\",\n id: \"Fill-10\",\n fill: \"#FFFFFF\",\n mask: \"url(#mask-4)\"\n }), /*#__PURE__*/React.createElement(\"polygon\", {\n id: \"Fill-11\",\n fill: \"#FFFFFF\",\n mask: \"url(#mask-4)\",\n points: \"98.9760707 22.8716322 101.499769 22.8716322 101.499769 19.1071516 106.912375 19.1071516 106.912375 17.3187421 101.499769 17.3187421 101.499769 15.2657119 107.275829 15.2657119 107.275829 13.4767104 98.9760707 13.4767104\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M116.566573,18.8719529 C116.566573,19.7919094 116.529115,21.3458898 114.213774,21.3458898 C111.897849,21.3458898 111.856879,19.7919094 111.856879,18.8719529 L111.856879,13.4759408 L109.333182,13.4759408 L109.333182,19.502425 C109.333182,20.5555798 109.463112,23.1360753 114.213774,23.1360753 C118.960925,23.1360753 119.09027,20.5555798 119.09027,19.502425 L119.09027,13.4759408 L116.566573,13.4759408 L116.566573,18.8719529 Z\",\n id: \"Fill-12\",\n fill: \"#FFFFFF\",\n mask: \"url(#mask-4)\"\n }), /*#__PURE__*/React.createElement(\"polygon\", {\n id: \"Fill-13\",\n fill: \"#FFFFFF\",\n mask: \"url(#mask-4)\",\n points: \"120.552049 15.2656527 123.997552 15.2656527 123.997552 22.871573 126.52242 22.871573 126.52242 15.2656527 129.97085 15.2656527 129.97085 13.4772432 120.552049 13.4772432\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M138.665785,18.8719529 C138.665785,19.7919094 138.628327,21.3458898 136.31006,21.3458898 C133.99472,21.3458898 133.956092,19.7919094 133.956092,18.8719529 L133.956092,13.4759408 L131.432394,13.4759408 L131.432394,19.502425 C131.432394,20.5555798 131.56291,23.1360753 136.31006,23.1360753 C141.060137,23.1360753 141.189483,20.5555798 141.189483,19.502425 L141.189483,13.4759408 L138.665785,13.4759408 L138.665785,18.8719529 Z\",\n id: \"Fill-14\",\n fill: \"#FFFFFF\",\n mask: \"url(#mask-4)\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M149.790247,17.6336229 L146.447752,17.6336229 L146.447752,15.2650607 L149.662658,15.2650607 C150.273098,15.2650607 150.998836,15.5024497 150.998836,16.437206 C150.998836,17.3180909 150.348013,17.6336229 149.790247,17.6336229 M153.445278,20.8321587 C153.445278,19.9110183 153.277305,18.4902361 152.170553,18.3173743 L152.170553,18.2936946 C153.225801,17.9118594 153.681143,17.1748287 153.681143,16.0287311 C153.681143,15.0685192 153.252138,13.4760592 150.676936,13.4760592 L143.922299,13.4760592 L143.922299,22.870981 L146.447752,22.870981 L146.447752,19.4238084 L149.58189,19.4238084 C150.3644,19.4238084 150.922751,19.7523643 150.922751,21.0683637 C150.922751,22.0563993 150.936797,22.4370505 151.169736,22.870981 L153.926958,22.870981 C153.485077,22.399163 153.445278,21.2915449 153.445278,20.8321587\",\n id: \"Fill-15\",\n fill: \"#FFFFFF\",\n mask: \"url(#mask-4)\"\n })))));\n}\nconst ForwardRef = /*#__PURE__*/React.forwardRef(SvgHeaderLogo);\nexport default __webpack_public_path__ + \"static/media/header-logo.c64e72ebd3db4c33bc8ed7821d496a53.svg\";\nexport { ForwardRef as ReactComponent };","var _defs,_g;function _extends(){return _extends=Object.assign?Object.assign.bind():function(n){for(var e=1;e Promise = () => {\n switch (process.env.REACT_APP_ID) {\n case APPLICATION_ID.FranceChannel:\n return import('@ntg/francechannel/dist/themes/base.css');\n case APPLICATION_ID.Gaumont:\n return import('@ntg/gaumont/dist/themes/base.css');\n case APPLICATION_ID.MyVideofutur:\n return import('@ntg/myvideofutur/dist/themes/base.css');\n case APPLICATION_ID.Post:\n return import('@ntg/post/dist/themes/base.css');\n case APPLICATION_ID.Premiere:\n return import('@ntg/premiere/dist/themes/base.css');\n case APPLICATION_ID.Viva:\n return import('@ntg/viva/dist/themes/base.css');\n case APPLICATION_ID.ZeopTV:\n return import('@ntg/zeoptv/dist/themes/base.css');\n default:\n // No app-specific CSS\n return Promise.resolve();\n }\n};\n\nconst createAppFooterContent: () => Promise = () => {\n switch (process.env.REACT_APP_ID) {\n case APPLICATION_ID.FranceChannel:\n return import('@ntg/francechannel/dist/components/footer/FooterContent').then((module) => module.default);\n case APPLICATION_ID.Gaumont:\n return import('@ntg/gaumont/dist/components/footer/FooterContent').then((module) => module.default);\n case APPLICATION_ID.MyVideofutur:\n return import('@ntg/myvideofutur/dist/components/footer/FooterContent').then((module) => module.default);\n case APPLICATION_ID.Post:\n return import('@ntg/post/dist/components/footer/FooterContent').then((module) => module.default);\n case APPLICATION_ID.Premiere:\n return import('@ntg/premiere/dist/components/footer/FooterContent').then((module) => module.default);\n case APPLICATION_ID.Viva:\n return import('@ntg/viva/dist/components/footer/FooterContent').then((module) => module.default);\n case APPLICATION_ID.ZeopTV:\n return import('@ntg/zeoptv/dist/components/footer/FooterContent').then((module) => module.default);\n default:\n // No footer\n return Promise.resolve(null);\n }\n};\n\nconst getAppLottieLoader: () => any = () => {\n switch (process.env.REACT_APP_ID) {\n case APPLICATION_ID.FranceChannel:\n return animationDataFrCh;\n case APPLICATION_ID.Gaumont:\n return animationDataGaumont;\n case APPLICATION_ID.MyVideofutur:\n return animationDataMyVF;\n case APPLICATION_ID.Post:\n return animationDataPost;\n case APPLICATION_ID.Premiere:\n return animationDataPremiere;\n case APPLICATION_ID.Viva:\n return animationDataViva;\n case APPLICATION_ID.ZeopTV:\n return animationDataZeopTV;\n default:\n // No loading animation\n return null;\n }\n};\n\nconst createAppHeaderLogo: () => string | null = () => {\n switch (process.env.REACT_APP_ID) {\n case APPLICATION_ID.FranceChannel:\n return headerLogoFrCh;\n case APPLICATION_ID.Gaumont:\n return headerLogoGaumont;\n case APPLICATION_ID.MyVideofutur:\n return headerLogoMyVF;\n case APPLICATION_ID.Post:\n return headerLogoPost;\n case APPLICATION_ID.Premiere:\n return headerLogoPremiere;\n case APPLICATION_ID.Viva:\n return headerLogoViva;\n case APPLICATION_ID.ZeopTV:\n return headerLogoZeopTV;\n default:\n // No header logo\n return null;\n }\n};\n\nconst createAppMobileAppLogo: () => string | null = () => {\n switch (process.env.REACT_APP_ID) {\n case APPLICATION_ID.FranceChannel:\n return mobileAppLogoFrCh;\n case APPLICATION_ID.Gaumont:\n return mobileAppLogoGaumont;\n case APPLICATION_ID.MyVideofutur:\n return mobileAppLogoMyVF;\n case APPLICATION_ID.Post:\n return mobileAppLogoPost;\n case APPLICATION_ID.Premiere:\n return mobileAppLogoPremiere;\n case APPLICATION_ID.Viva:\n return mobileAppLogoViva;\n case APPLICATION_ID.ZeopTV:\n return mobileAppLogoZeopTV;\n default:\n // No logo for mobile app links page\n return null;\n }\n};\n\nconst createAppAppleStoreLogo: () => string | null = () => {\n switch (process.env.REACT_APP_ID) {\n case APPLICATION_ID.FranceChannel:\n return storeLogoAppleFrCh;\n case APPLICATION_ID.Gaumont:\n return storeLogoAppleGaumont;\n case APPLICATION_ID.MyVideofutur:\n return storeLogoAppleMyVF;\n case APPLICATION_ID.Post:\n return storeLogoApplePost;\n case APPLICATION_ID.Premiere:\n return storeLogoApplePremiere;\n case APPLICATION_ID.Viva:\n return storeLogoAppleViva;\n case APPLICATION_ID.ZeopTV:\n return storeLogoAppleZeopTV;\n default:\n // No logo for Apple mobile app\n return null;\n }\n};\n\nconst createAppGoogleStoreLogo: () => string | null = () => {\n switch (process.env.REACT_APP_ID) {\n case APPLICATION_ID.FranceChannel:\n return storeLogoGoogleFrCh;\n case APPLICATION_ID.Gaumont:\n return storeLogoGoogleGaumont;\n case APPLICATION_ID.MyVideofutur:\n return storeLogoGoogleMyVF;\n case APPLICATION_ID.Post:\n return storeLogoGooglePost;\n case APPLICATION_ID.Premiere:\n return storeLogoGooglePremiere;\n case APPLICATION_ID.Viva:\n return storeLogoGoogleViva;\n case APPLICATION_ID.ZeopTV:\n return storeLogoGoogleZeopTV;\n default:\n // No logo for Android mobile app\n return null;\n }\n};\n\nconst createAppBackgroundImage: () => string | null = () => {\n switch (process.env.REACT_APP_ID) {\n case APPLICATION_ID.Gaumont:\n return backgroundImageGaumont;\n case APPLICATION_ID.MyVideofutur:\n return backgroundImageMyVF;\n case APPLICATION_ID.Post:\n return backgroundImagePost;\n case APPLICATION_ID.Premiere:\n return backgroundImagePremiere;\n case APPLICATION_ID.Viva:\n return backgroundImageViva;\n case APPLICATION_ID.FranceChannel:\n case APPLICATION_ID.ZeopTV:\n default:\n // No background image\n return null;\n }\n};\n\nconst createAppHasHeaderCloseButton: () => boolean = () => {\n switch (process.env.REACT_APP_ID) {\n case APPLICATION_ID.Gaumont:\n case APPLICATION_ID.Premiere:\n case APPLICATION_ID.Post:\n case APPLICATION_ID.Viva:\n return true;\n case APPLICATION_ID.FranceChannel:\n case APPLICATION_ID.MyVideofutur:\n case APPLICATION_ID.ZeopTV:\n default:\n return false;\n }\n};\n\nconst AppAppleStoreLogo: string | null = createAppAppleStoreLogo();\nconst AppGoogleStoreLogo: string | null = createAppGoogleStoreLogo();\nconst AppFooterContent: Promise = createAppFooterContent();\nconst AppHasHeaderCloseButton: boolean = createAppHasHeaderCloseButton();\nconst AppHeaderLogo: string | null = createAppHeaderLogo();\nconst AppMobileAppLogo: string | null = createAppMobileAppLogo();\nconst AppBackgroundImage: string | null = createAppBackgroundImage();\n\nexport { AppAppleStoreLogo, AppBackgroundImage, AppFooterContent, AppGoogleStoreLogo, AppHasHeaderCloseButton, AppHeaderLogo, AppMobileAppLogo, getAppCss, getAppLottieLoader };\n","/* @flow */\n\nimport type { ChannelMap, METRICS_PROPERTIES, METRICS_TYPE, MetricsStreamType } from '../../libs/netgemLibrary/v8/types/Channel';\nimport { FAKE_LOCATION, FAKE_SCHEDULED_EVENT_ITEM } from '../../components/avenue/section/SectionConstsAndTypes';\nimport { buildFeedItem, getFirstLocation } from '../../libs/netgemLibrary/v8/helpers/Item';\nimport { logDebug, logWarning } from '../debug/debug';\nimport AccurateTimestamp from '../dateTime/AccurateTimestamp';\nimport type { CombinedReducers } from '../../redux/reducers';\nimport { FAKE_EPG_LIVE_PREFIX } from '../ui/item/types';\nimport type { LOCATION_METADATA_METRICS } from '../../libs/netgemLibrary/v8/types/MetadataSchedule';\nimport type { NETGEM_API_URL_LIFECYCLE } from '../../libs/netgemLibrary/ntgEntitlement/types';\nimport type { NETGEM_API_V8_FEED } from '../../libs/netgemLibrary/v8/types/FeedItem';\nimport type { NETGEM_API_V8_RIGHTS } from '../../libs/netgemLibrary/v8/types/Rights';\nimport type { NETGEM_API_V8_SECTION } from '../../libs/netgemLibrary/v8/types/Section';\nimport { getValueForParameter } from '../../redux/netgemApi/actions/helpers/api';\n\nconst filterDuplicates: (feed: NETGEM_API_V8_FEED) => void = (feed) => {\n const duplicateChannels: Array<{| channelId: string, index: number |}> = [];\n const channels: Set = new Set();\n\n feed.forEach((item, index) => {\n const {\n selectedLocation: { channelId },\n } = item;\n\n if (channelId) {\n if (channels.has(channelId)) {\n duplicateChannels.push({ channelId, index });\n } else {\n channels.add(channelId);\n }\n }\n });\n\n if (duplicateChannels.length > 0) {\n logWarning(`Live duplicates: ${duplicateChannels.length} (${duplicateChannels.map(({ channelId }) => channelId).join(', ')})`);\n duplicateChannels.reverse().forEach(({ index }) => feed.splice(index, 1));\n }\n};\n\nconst addMissingChannels: (feed: NETGEM_API_V8_FEED, sectionChannels: Set) => void = (feed, sectionChannels) => {\n // Find missing channels\n const missingChannels = new Set(sectionChannels);\n for (let i = 0; i < feed.length; i++) {\n const location = getFirstLocation(feed[i]);\n if (location?.channelId) {\n missingChannels.delete(location.channelId);\n }\n }\n\n if (missingChannels.size === 0) {\n // All channels have been found\n return;\n }\n\n logDebug('Missing channels in live feed:');\n missingChannels.forEach((channelId) => logDebug(` - ${channelId ?? ''}`));\n logDebug('Feed:');\n logDebug(feed);\n\n // Add missing channels with fake (i.e. empty) scheduled events\n const now = AccurateTimestamp.nowInSeconds();\n missingChannels.forEach((channelId) => {\n const fakeItem = {\n ...FAKE_SCHEDULED_EVENT_ITEM,\n id: `${FAKE_EPG_LIVE_PREFIX}${channelId?.replace(/^.+\\/([^/]+)$/u, '$1') ?? 'no-channel-id'}/${now}`,\n };\n const fakeLocation = {\n ...FAKE_LOCATION,\n channelId,\n };\n fakeItem.locations = [fakeLocation];\n const feedItem = buildFeedItem(fakeItem);\n if (feedItem) {\n feed.push(feedItem);\n }\n });\n};\n\nconst getChannelsParameterName: (uri: string) => string | null = (uri) => {\n const sectionUri = new URL(uri);\n const channelsParam = [...sectionUri.searchParams.entries()].find(([name]) => name === 'channels');\n\n if (!channelsParam || channelsParam.length <= 1) {\n // No parameter for 'channels'\n return null;\n }\n\n return channelsParam[1].slice(1, -1);\n};\n\nconst getSectionChannels: (section: NETGEM_API_V8_SECTION, channelsParameter: string | null, allChannels: ChannelMap, state: CombinedReducers) => Set = (\n section,\n channelsParameter,\n allChannels,\n state,\n) => {\n const {\n appConfiguration: { deviceChannels, listAlias, listAliasChannelLists },\n } = state;\n\n const allChannelIds = [...Object.keys(deviceChannels)];\n\n const getAllSectionChannels = (): Array => {\n if (!section.model || !section.model.params || channelsParameter === null) {\n // No model or no parameter\n return allChannelIds;\n }\n\n const {\n model: { params },\n } = section;\n\n // Value look like: \"{channelList}\"\n const channelsParameterName = channelsParameter.slice(1, -1);\n\n const param = params.find((p) => p.name === channelsParameterName);\n\n if (!param) {\n // Parameter not found\n return allChannelIds;\n }\n\n const channelListOrListAlias = getValueForParameter(param.value, null, state);\n\n if (!channelListOrListAlias) {\n // Parameter lead to nothing\n return [];\n }\n\n if (Array.isArray(channelListOrListAlias)) {\n // List of channel Ids\n return channelListOrListAlias;\n }\n\n if (channelListOrListAlias.startsWith('[')) {\n // Channel list\n return JSON.parse(channelListOrListAlias);\n }\n\n // Check master list alias first\n if (channelListOrListAlias === listAlias) {\n // Value is list alias for all channels\n return allChannelIds;\n }\n\n // Check all other list aliases\n const { [channelListOrListAlias]: channelList } = listAliasChannelLists;\n\n // Value is another list alias\n return channelList;\n };\n\n return new Set(getAllSectionChannels().filter((channelId) => !allChannels[channelId].isHidden));\n};\n\nconst getBooleanSetting: (channels: ChannelMap, channelId: ?string, settingName: string) => boolean = (channels, channelId, settingName) => {\n if (!channelId) {\n return false;\n }\n\n if (settingName !== 'hasCatchup' && settingName !== 'hasKeepFromReplay' && settingName !== 'hasStartover' && settingName !== 'hasTimeshift' && settingName !== 'isRecordable') {\n // Not a known setting\n return false;\n }\n\n const { [channelId]: channel } = channels;\n return channel?.consolidated?.[settingName] ?? false;\n};\n\nconst getChannelImageId: (channels: ChannelMap, channelId: ?string) => string | null = (channels, channelId) => {\n if (!channelId) {\n // Universe, channel, channel group, etc.\n return null;\n }\n\n const { [channelId]: channel } = channels;\n return channel?.consolidated?.imageId ?? null;\n};\n\nconst getChannelRights: (channels: ChannelMap, channelId: ?string) => ?NETGEM_API_V8_RIGHTS = (channels, channelId) => {\n if (!channelId) {\n // Universe, channel, channel group, etc.\n return null;\n }\n\n const { [channelId]: channel } = channels;\n return channel?.info?.rights ?? null;\n};\n\nconst getChannelName: (channels: ChannelMap, channelId: ?string) => string = (channels, channelId) => {\n if (!channelId) {\n return '';\n }\n\n const { [channelId]: channel } = channels;\n return channel?.name ?? '';\n};\n\nconst getChannelNumber: (channels: ChannelMap, channelId: ?string) => number = (channels, channelId) => {\n if (!channelId) {\n return -1;\n }\n\n const { [channelId]: channel } = channels;\n return channel?.number ?? -1;\n};\n\nconst getChannelGroupId: (channels: ChannelMap, channelId: ?string) => string | null = (channels, channelId) => {\n if (!channelId) {\n return null;\n }\n\n const { [channelId]: channel } = channels;\n return channel?.info?.channelGrId ?? null;\n};\n\nconst getChannelListFromGroupId: (channels: ChannelMap, channelGroupId: string | null) => Array = (channels, channelGroupId) => {\n if (!channelGroupId) {\n return [];\n }\n\n const channelList = [];\n\n for (const { epgid, info } of Object.keys(channels).map((key) => channels[key])) {\n if (info?.channelGrId === channelGroupId) {\n channelList.push(epgid);\n }\n }\n\n return channelList;\n};\n\nconst getChannelListFromTag: (channels: ChannelMap, tag: string) => Array = (channels, tag) => {\n const channelList = [];\n\n for (const { epgid, info } of Object.keys(channels).map((key) => channels[key])) {\n if (info) {\n const { tags } = info;\n\n if (tags && tags.indexOf(tag) > -1) {\n channelList.push(epgid);\n }\n }\n }\n\n return channelList;\n};\n\nconst getAllTags: (channels: ChannelMap) => Array = (channels) => {\n const allTags = new Set();\n\n for (const { info } of Object.keys(channels).map((key) => channels[key])) {\n if (info) {\n const { tags } = info;\n tags?.forEach((tag) => allTags.add(tag));\n }\n }\n\n return [...allTags];\n};\n\nconst getChannelMetrics: (\n channels: ChannelMap,\n channelId: ?string,\n type: METRICS_TYPE,\n streamType: MetricsStreamType,\n locationMetrics: ?Array,\n) => METRICS_PROPERTIES | null = (channels, channelId, type, streamType, locationMetrics) => {\n if (!channelId) {\n return null;\n }\n\n const { [channelId]: channel } = channels;\n if (channel?.info?.metrics) {\n const {\n info: { metrics },\n } = channel;\n\n const typeMetrics = metrics.find((m) => m.type === type);\n if (typeMetrics) {\n const metricsProperties = typeMetrics.properties.find((m) => m.type === streamType);\n\n if (metricsProperties) {\n const typeLocationMetrics = locationMetrics?.find((m) => m.type === type);\n\n if (typeLocationMetrics) {\n return {\n ...metricsProperties,\n params: {\n ...metricsProperties.params,\n ...typeLocationMetrics.properties,\n },\n };\n }\n\n return metricsProperties;\n }\n }\n }\n\n return null;\n};\n\nconst getChannelUrlLifecycle: (channels: ChannelMap, channelId: ?string) => NETGEM_API_URL_LIFECYCLE | null = (channels, channelId) => {\n if (!channelId) {\n return null;\n }\n\n const { [channelId]: channel } = channels;\n return channel?.data.urlLifecycle ?? null;\n};\n\nconst channelHasCatchup: (channels: ChannelMap, channelId: ?string) => boolean = (channels, channelId) => getBooleanSetting(channels, channelId, 'hasCatchup');\n\nconst channelHasKeepFromReplay: (channels: ChannelMap, channelId: ?string) => boolean = (channels, channelId) => getBooleanSetting(channels, channelId, 'hasKeepFromReplay');\n\nconst channelHasStartover: (channels: ChannelMap, channelId: ?string) => boolean = (channels, channelId) => getBooleanSetting(channels, channelId, 'hasStartover');\n\nconst channelHasTimeshift: (channels: ChannelMap, channelId: ?string) => boolean = (channels, channelId) => getBooleanSetting(channels, channelId, 'hasTimeshift');\n\nconst channelIsRecordable: (channels: ChannelMap, channelId: ?string) => boolean = (channels, channelId) => getBooleanSetting(channels, channelId, 'isRecordable');\n\nexport {\n addMissingChannels,\n channelHasCatchup,\n channelHasKeepFromReplay,\n channelHasStartover,\n channelHasTimeshift,\n channelIsRecordable,\n filterDuplicates,\n getAllTags,\n getChannelGroupId,\n getChannelImageId,\n getChannelUrlLifecycle,\n getChannelListFromGroupId,\n getChannelListFromTag,\n getChannelMetrics,\n getChannelName,\n getChannelNumber,\n getChannelRights,\n getChannelsParameterName,\n getSectionChannels,\n};\n","/* @flow */\n\nimport { logError } from '../debug/debug';\n\nexport default class DidomiWrapper {\n static instance: any;\n\n // $FlowFixMe: Flow does not support symbols yet\n get [Symbol.toStringTag]() {\n return 'DidomiWrapper';\n }\n\n static initialize: (didomi: any) => void = (didomi) => {\n if (DidomiWrapper.instance) {\n // Already initialized\n return;\n }\n\n DidomiWrapper.instance = didomi;\n };\n\n static resetConsent: () => void = () => {\n if (!DidomiWrapper.instance) {\n logError('DidomiWrapper not initialized');\n }\n\n DidomiWrapper.instance.reset();\n };\n\n static manageConsent: () => void = () => {\n if (!DidomiWrapper.instance) {\n logError('DidomiWrapper not initialized');\n }\n\n DidomiWrapper.instance.preferences.show();\n };\n\n static getUserId: () => string = () => {\n if (!DidomiWrapper.instance) {\n logError('DidomiWrapper not initialized');\n return '';\n }\n\n return DidomiWrapper.instance.getCurrentUserStatus().user_id;\n };\n\n static getConsentString: () => string = () => {\n if (!DidomiWrapper.instance) {\n logError('DidomiWrapper not initialized');\n return '';\n }\n\n return DidomiWrapper.instance.getCurrentUserStatus().consent_string;\n };\n\n static isVendorEnabled: (vendor: string) => boolean = (vendor) => {\n if (!DidomiWrapper.instance) {\n logError('DidomiWrapper not initialized');\n return false;\n }\n\n const {\n vendors: {\n [vendor]: { enabled },\n },\n } = DidomiWrapper.instance.getCurrentUserStatus();\n\n return enabled;\n };\n\n static isGtmEnabled: () => boolean = () => DidomiWrapper.isVendorEnabled('googleana-4TXnJigR');\n\n static isMediametrieEnabled: () => boolean = () => DidomiWrapper.isVendorEnabled('mediametri-Npn8xCFG');\n\n static addFastChannelConsent: (url: string) => string = (url) => {\n const u = new URL(url);\n u.searchParams.set('cmid', DidomiWrapper.getUserId());\n u.searchParams.set('cmtoken', DidomiWrapper.getConsentString());\n return u.toString();\n };\n}\n","/* @flow */\n\nimport { MILLISECONDS_PER_SECOND } from './Format';\n\nexport default class AccurateTimestamp {\n // $FlowFixMe: Flow does not support symbols yet\n get [Symbol.toStringTag]() {\n return 'AccurateTimestamp';\n }\n\n static nowInternal: () => number =\n // $FlowFixMe: Flow doesn't know 'timeOrigin' property\n () => performance.timeOrigin + performance.now();\n\n // $FlowFixMe: Flow doesn't know 'timeOrigin' property\n static origin: () => number = () => performance.timeOrigin;\n\n // Returns current time in milliseconds\n static now: () => number = () => Math.trunc(AccurateTimestamp.nowInternal());\n\n // Returns current time in seconds\n static nowInSeconds: () => number = () => Math.trunc(AccurateTimestamp.nowInternal() / MILLISECONDS_PER_SECOND);\n\n // Returns current time as Date\n static nowAsDate: () => Date = () => new Date(AccurateTimestamp.nowInternal());\n\n // Returns current time as a UTC ISO string where milliseconds have been removed\n static nowAsIsoString: () => string = () =>\n AccurateTimestamp.nowAsDate()\n .toISOString()\n .replace(/\\.\\d\\d\\d/u, '');\n\n static startOfDayInSeconds: () => number = () => {\n const d = AccurateTimestamp.nowAsDate();\n d.setHours(0, 0, 0, 0);\n return Math.round(d.getTime() / MILLISECONDS_PER_SECOND);\n };\n}\n","/* @flow */\n\nimport AccurateTimestamp from './AccurateTimestamp';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport { capitalizeFirstLetter } from '@ntg/utils/dist/string';\n\nconst MONTH_KEYS = Object.freeze(['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december']);\n\nconst DAY_KEYS = Object.freeze(['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday']);\n\nconst TIME_PADDING_LENGTH = 2;\n\n// For calculation regarding month duration below, we assume a 30-day month\n\nexport const MILLISECONDS_PER_SECOND = 1_000;\nexport const MILLISECONDS_PER_MINUTE = 60_000;\nexport const MILLISECONDS_PER_HOUR = 3_600_000;\nexport const MILLISECONDS_PER_DAY = 86_400_000;\nexport const MILLISECONDS_PER_WEEK = 604_800_000;\nexport const SECONDS_PER_MINUTE = 60;\nexport const SECONDS_PER_HOUR = 3_600;\nexport const SECONDS_PER_DAY = 86_400;\nexport const MINUTES_PER_HOUR = 60;\nexport const HOURS_PER_DAY = 24;\nexport const DAYS_PER_MONTH = 30;\nexport const MONTHS_PER_YEAR = 12;\n\nconst SECONDS_PER_WEEK = 604_800;\nconst SECONDS_PER_MONTH = 2_592_000;\nconst ONE_YEAR_IN_SECONDS = 31_536_000;\nconst THREE_MONTHS_IN_SECONDS = 7_776_000;\n\nconst JANUARY_INDEX = 0;\nconst DECEMBER_INDEX = 11;\n\nexport const ISO8601_DURATION_ZERO = 'PT0S';\n\n// Minimum value for a JS date (as Date)\nexport const MIN_DATE: Date = new Date(0);\n\n// Minimum value for a JS date (as ISO8601 string)\nexport const MIN_DATE_ISO = '1970-01-01T00:00:00.000Z';\n\n// Maximum value for a JS date (in seconds)\nexport const MAX_DATE_IN_SECONDS = 8_640_000_000_000;\n\n// Maximum value for a JS date (as ISO8601 string)\nexport const MAX_DATE_ISO = '275760-09-13T00:00:00.000Z';\n\n// Display change between before and after 50% of the program duration\nconst DISPLAY_CHANGE_THRESHOLD = 0.5;\n\n// Different display when program starts in less than 10 minutes\nexport const LIVE_START_THRESHOLD = 600;\n\nconst pad2 = (n: number) => n.toString().padStart(TIME_PADDING_LENGTH, '0');\n\nconst formatTime = (d: Date): string => `${pad2(d.getHours())}:${pad2(d.getMinutes())}`;\n\n// Argument 't' is a time in seconds\nconst formatTimeFromSeconds: (t: number) => string = (t) => formatTime(new Date(t * MILLISECONDS_PER_SECOND));\n\nconst buildSpecificDate: (dDay: number, dDate: number, dMonth: number, time: string) => string = (dDay, dDate, dMonth, time) =>\n Localizer.localize('common.datetime.scheduled_event_status.specific_date', {\n date: Localizer.localize(`common.datetime.date_names.${dDate}`),\n day: Localizer.localize(`common.datetime.day_names.short.${DAY_KEYS[dDay]}`),\n month: Localizer.localize(`common.datetime.month_names.${MONTH_KEYS[dMonth]}`),\n time,\n });\n\nconst formatDateInternal: (startTime: number, endTime: number, now: number) => string = (startTime, endTime, now) => {\n const itemDate = new Date(startTime * MILLISECONDS_PER_SECOND);\n const itemDateMidnight = new Date(itemDate);\n itemDateMidnight.setHours(0, 0, 0, 0);\n const itemTimeMidnight = itemDateMidnight.getTime();\n const dDate = itemDate.getDate();\n const dDay = itemDate.getDay();\n const dMonth = itemDate.getMonth();\n const formattedTime = formatTime(itemDate);\n\n const currentDate = new Date(now * MILLISECONDS_PER_SECOND);\n const currentDateMidnight = new Date(currentDate);\n currentDateMidnight.setHours(0, 0, 0, 0);\n const currentTimeMidnight = currentDateMidnight.getTime();\n\n const isToday = itemTimeMidnight === currentTimeMidnight;\n\n if (startTime > now) {\n // Future date\n const timeBeforeStart = startTime - now;\n\n if (timeBeforeStart <= LIVE_START_THRESHOLD) {\n // Program starts in less than 10 minutes\n const timeBeforeStartMin = Math.floor(timeBeforeStart / SECONDS_PER_MINUTE);\n if (timeBeforeStartMin > 0) {\n if (timeBeforeStartMin >= MINUTES_PER_HOUR) {\n // Display hours and minutes\n const timeBeforeStartH = Math.floor(timeBeforeStartMin / MINUTES_PER_HOUR);\n const timeBeforeStartM = timeBeforeStartMin % MINUTES_PER_HOUR;\n return Localizer.localize('common.datetime.scheduled_event_status.start_in_hour_minute', {\n hours: timeBeforeStartH,\n minutes: pad2(timeBeforeStartM),\n });\n }\n\n // Display minutes only\n return Localizer.localize('common.datetime.scheduled_event_status.start_in_minute', { minutes: timeBeforeStartMin });\n }\n\n return Localizer.localize('common.datetime.scheduled_event_status.about_to_start');\n }\n\n // Program starts in more than 10 minutes\n const currentWeek = Math.floor(now / SECONDS_PER_WEEK);\n const week = Math.floor(startTime / SECONDS_PER_WEEK);\n\n if (isToday) {\n // Program starts today\n return Localizer.localize('common.datetime.scheduled_event_status.today', { time: formattedTime });\n } else if (itemTimeMidnight === new Date(currentDateMidnight).setDate(currentDateMidnight.getDate() + 1)) {\n // Program starts tomorrow\n return Localizer.localize('common.datetime.scheduled_event_status.tomorrow', { time: formattedTime });\n } else if (week === currentWeek) {\n // Program starts this week\n return Localizer.localize('common.datetime.scheduled_event_status.this_week', {\n date: Localizer.localize(`common.datetime.date_names.${dDate}`),\n day: Localizer.localize(`common.datetime.day_names.long.${DAY_KEYS[dDay]}`),\n time: formattedTime,\n });\n }\n\n // Program starts later in the future\n return buildSpecificDate(dDay, dDate, dMonth, formattedTime);\n } else if (now < endTime) {\n // Live\n const elapsed = now - startTime;\n const elapsedMin = Math.floor(elapsed / SECONDS_PER_MINUTE);\n const remainingMin = Math.floor((endTime - now) / SECONDS_PER_MINUTE);\n\n if (elapsedMin === 0) {\n // Program is just starting\n return Localizer.localize('common.datetime.scheduled_event_status.starting');\n } else if (remainingMin === 0) {\n // Program is about to finish\n return Localizer.localize('common.datetime.scheduled_event_status.finishing');\n } else if (elapsed <= (endTime - startTime) * DISPLAY_CHANGE_THRESHOLD) {\n // Program has been on for less than 50% of its duration\n if (elapsedMin > MINUTES_PER_HOUR) {\n const elapsedH = Math.floor(elapsedMin / MINUTES_PER_HOUR);\n const elapsedM = elapsedMin % MINUTES_PER_HOUR;\n return Localizer.localize('common.datetime.scheduled_event_status.since_hour_minute', {\n hours: elapsedH,\n minutes: pad2(elapsedM),\n });\n }\n\n return Localizer.localize('common.datetime.scheduled_event_status.since_minute', { minutes: elapsedMin });\n }\n\n // Program has been on for more than 50% of its duration\n if (remainingMin > MINUTES_PER_HOUR) {\n const remainingH = Math.floor(remainingMin / MINUTES_PER_HOUR);\n const remainingM = remainingMin % MINUTES_PER_HOUR;\n return Localizer.localize('common.datetime.scheduled_event_status.remaining_hour_minute', {\n hours: remainingH,\n minutes: pad2(remainingM),\n });\n }\n\n return Localizer.localize('common.datetime.scheduled_event_status.remaining_minute', { minutes: remainingMin });\n }\n\n // Past date\n if (isToday) {\n // Program was broadcasted today\n return Localizer.localize('common.datetime.scheduled_event_status.today', { time: formattedTime });\n } else if (itemTimeMidnight === new Date(currentDateMidnight).setDate(currentDateMidnight.getDate() - 1)) {\n // Program was broadcasted yesterday\n return Localizer.localize('common.datetime.scheduled_event_status.yesterday', { time: formattedTime });\n }\n\n const dYear = itemDate.getFullYear();\n const yearDiff = currentDate.getFullYear() - dYear;\n\n if (yearDiff > 1 || (yearDiff === 1 && (dMonth !== DECEMBER_INDEX || currentDate.getMonth() !== JANUARY_INDEX))) {\n // Last year (or before) but not the previous month (case of a program broadcasted in December and today is January)\n return Localizer.localize('common.datetime.scheduled_event_status.long_past_date', {\n month: capitalizeFirstLetter(Localizer.localize(`common.datetime.month_names.${MONTH_KEYS[dMonth]}`)),\n year: dYear,\n });\n }\n\n // Earlier than yesterday\n return buildSpecificDate(dDay, dDate, dMonth, formattedTime);\n};\n\n/*\n * Format date information depending on program dates from the current time\n * and depending on language code.\n *\n * case FUTURE program (startTime > now):\n * - today date -> Today, hh:mm am/pm\n * - tomorrow date -> Tomorrow, hh:mm am/pm\n * - next day after tomorrow and in same week of current time:\n * -> ex: Monday, hh:mm am/pm\n * - date of next week and after: -> ex: Monday 18 August, hh:mm am/pm\n *\n * case LIVE program: (startTime <= now < endTime):\n * - program playing from 75% of its duration: -> ex: Since xxx min\n * - program finishing to 25% of its duration: -> ex: xxx min remaining\n *\n * case PAST program: (now >= endTime): -> ex: Monday 18 August, hh:mm am/pm\n *\n * @public\n * @param {number} startTime : program startTime (timestamp in seconds)\n * @param {number} endTime : program endTime (timestamp in seconds)\n * @param {number} now : current time (timestamp in seconds)\n * @return {string} : formatted result\n */\nconst formatDate: (startTime: number, endTime: number, now: number) => string = (startTime, endTime, now) => {\n if (isNaN(startTime) || isNaN(endTime) || startTime === 0) {\n return '';\n }\n\n const formattedDate = formatDateInternal(startTime, endTime, now);\n\n return capitalizeFirstLetter(formattedDate);\n};\n\nconst formatAvailabilityTimestamp: (timestamp: number) => string = (timestamp) => {\n const d = new Date(timestamp);\n return Localizer.localize('vod.pricing.availability.date', {\n date: pad2(d.getDate()),\n month: pad2(d.getMonth() + 1),\n });\n};\n\nconst formatExpirationTimestamp: (expirationTime: number) => string = (expirationTime) => {\n if (expirationTime === Infinity) {\n return capitalizeFirstLetter(Localizer.localize('common.datetime.expiration.never'));\n }\n\n const now = AccurateTimestamp.nowInSeconds();\n const remainingTime = expirationTime - now;\n\n if (remainingTime <= 0) {\n // Catchup not available anymore\n return capitalizeFirstLetter(Localizer.localize('common.datetime.expiration.expired'));\n }\n\n if (remainingTime > ONE_YEAR_IN_SECONDS) {\n return capitalizeFirstLetter(Localizer.localize('common.datetime.expiration.more_1_year'));\n }\n\n if (remainingTime > THREE_MONTHS_IN_SECONDS) {\n return capitalizeFirstLetter(Localizer.localize('common.datetime.expiration.more_3_months'));\n }\n\n const durationD = Math.floor(remainingTime / SECONDS_PER_DAY);\n if (durationD > 1) {\n return capitalizeFirstLetter(Localizer.localize('common.datetime.expiration.day', { count: durationD }));\n }\n\n const durationH = Math.floor(remainingTime / SECONDS_PER_HOUR);\n if (durationH > 1) {\n return capitalizeFirstLetter(Localizer.localize('common.datetime.expiration.hour', { count: durationH }));\n }\n\n const durationM = Math.floor(remainingTime / SECONDS_PER_MINUTE);\n if (durationM > 1) {\n return capitalizeFirstLetter(Localizer.localize('common.datetime.expiration.minute', { count: durationM }));\n }\n\n return capitalizeFirstLetter(Localizer.localize('common.datetime.expiration.less_1_minute'));\n};\n\nconst formatExpirationDate: (iso8601Date: string) => string = (iso8601Date) => formatExpirationTimestamp(new Date(iso8601Date).getTime() / MILLISECONDS_PER_SECOND);\n\n/*\n * Get duration information in seconds\n * ex: PT1H30M --> 5400\n *\n * @public\n * @param {string} iso8601Duration : duration in iso8601 format ex: PT1H30M\n * @return {number} : number of seconds\n */\nconst getIso8601DurationInSeconds: (iso8601Duration: ?string) => number = (iso8601Duration) => {\n if (!iso8601Duration) {\n return 0;\n }\n\n const time: Array | null = /^P([0-9]+Y)?([0-9]+M)?([0-9]+D)?T?([0-9]+H)?([0-9]+M)?(?:([0-9]+)(?:\\.[0-9]+)?S)?$/u.exec(iso8601Duration);\n\n if (!time) {\n return 0;\n }\n\n return [0, 0, SECONDS_PER_MONTH, SECONDS_PER_DAY, SECONDS_PER_HOUR, SECONDS_PER_MINUTE, 1].reduce((sum, coef, i) => {\n const { [i]: n } = time;\n return sum + (n && coef ? coef * parseInt(n, 10) : 0);\n }, 0);\n};\n\n/*\n * Format duration information (depending on language code)\n * ex: PT1H30M --> 1h30\n *\n * @public\n * @param {string} iso8601Duration : duration in iso8601 format ex: PT1H30M\n * @param {language} language : iso639-1 language code\n * @return {string} : formatted result\n */\nconst formatIso8601Duration: (iso8601Duration: ?string) => string = (iso8601Duration) => {\n if (!iso8601Duration) {\n return '';\n }\n\n return formatDuration(getIso8601DurationInSeconds(iso8601Duration));\n};\n\nconst formatDuration: (durationInSeconds: number) => string = (durationInSeconds) => {\n let durationS = Math.abs(Math.floor(durationInSeconds));\n\n const durationH = Math.floor(durationS / SECONDS_PER_HOUR);\n durationS %= SECONDS_PER_HOUR;\n\n const durationM = Math.floor(durationS / SECONDS_PER_MINUTE);\n\n if (durationH > 0) {\n return Localizer.localize('common.datetime.duration_hour_minute', {\n hours: durationH,\n minutes: durationM > 0 ? pad2(durationM) : '',\n });\n }\n\n return Localizer.localize('common.datetime.duration_minute', { minutes: durationM });\n};\n\n/*\n * Format seconds in HH:MM:SS\n * ex: toHHMMSS(0) => \"00:00\"\n * ex: toHHMMSS(59) => \"00:59\"\n * ex: toHHMMSS(3500) => \"58:20\"\n * ex: toHHMMSS(36000) => \"10:00:00\"\n *\n * @public\n * @param {number} durationInSeconds : number of seconds to convert\n * @return {string} : formatted result\n */\nconst formatSecondsToHHMMSS: (durationInSeconds: number) => string = (durationInSeconds) => {\n let seconds = Math.abs(Math.floor(durationInSeconds));\n\n const hours = Math.floor(seconds / SECONDS_PER_HOUR);\n seconds %= SECONDS_PER_HOUR;\n\n const minutes = Math.floor(seconds / SECONDS_PER_MINUTE);\n seconds %= SECONDS_PER_MINUTE;\n\n let formattedDuration = [hours, minutes, seconds]\n .map((n: number): string => pad2(n))\n .filter((s: string, i: number) => s !== '00' || i > 0)\n .join(':');\n\n if (durationInSeconds < 0) {\n // Negative duration\n formattedDuration = `-${formattedDuration}`;\n }\n\n return formattedDuration;\n};\n\nconst getIso8601DateInSeconds: (iso8601Date: ?string) => number = (iso8601Date) => {\n if (!iso8601Date) {\n return 0;\n }\n\n return new Date(iso8601Date).getTime() / MILLISECONDS_PER_SECOND;\n};\n\nexport {\n formatAvailabilityTimestamp,\n formatDate,\n formatDuration,\n formatExpirationDate,\n formatExpirationTimestamp,\n formatIso8601Duration,\n formatSecondsToHHMMSS,\n formatTimeFromSeconds,\n getIso8601DurationInSeconds,\n getIso8601DateInSeconds,\n};\n","/* @flow */\n\nimport * as React from 'react';\nimport { MILLISECONDS_PER_SECOND, SECONDS_PER_HOUR, SECONDS_PER_MINUTE, formatSecondsToHHMMSS } from '../dateTime/Format';\nimport AccurateTimestamp from '../dateTime/AccurateTimestamp';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport type { NETGEM_API_V8_FEED } from '../../libs/netgemLibrary/v8/types/FeedItem';\nimport { type NOTIFICATION_MESSAGE } from '../notification/types';\nimport { isUndefinedOrNull } from '@ntg/utils/dist/types';\nimport log from 'loglevel';\n\n// Without any parameter, live program debug function will show programs finishing in less than 5 minutes\nconst DEFAULT_DEBUG_LIVE_PROGRAMS_THRESHOLD = 300;\n\n// Live program debug function will not show more than 5 programs\nconst DEFAULT_DEBUG_LIVE_PROGRAMS_MAX_COUNT = 5;\n\nconst DEBUG_LIVE_PROGRAMS_INDEX_PAD = 2;\n\nexport type DEBUG_DATA = {|\n instance?: Object,\n instanceFields?: Array,\n misc?: Object,\n props?: Object,\n propsFields?: Array,\n state?: Object,\n stateFields?: Array,\n|};\n\nconst showItem: (data?: Object, field: string) => void = (data, field) => {\n if (!data) {\n return;\n }\n\n const { [field]: value } = data;\n\n let displayedValue: ?string = null;\n\n if (value === undefined) {\n displayedValue = '';\n } else if (value === null) {\n displayedValue = '';\n } else if (typeof value === 'object') {\n log.debug(field, value);\n return;\n } else {\n displayedValue = value.toString();\n }\n\n log.debug(`${field}: ${displayedValue}`);\n};\n\nconst showGroup: (label: string, data?: Object, fields?: Array) => void = (label, data, fields) => {\n if (data && fields) {\n log.debug(`--[ ${label} ]--`);\n fields.forEach((field) => showItem(data, field));\n }\n};\n\nconst showDebug: (title: string, data: DEBUG_DATA) => void = (title, data) => {\n const { instance, instanceFields, misc, props, propsFields, state, stateFields } = data;\n\n log.debug(`---------- ${title} Debug Info`);\n showGroup('props', props, propsFields);\n showGroup('state', state, stateFields);\n showGroup('this', instance, instanceFields);\n showGroup('misc', misc, misc && Object.keys(misc));\n log.debug('----------');\n};\n\nconst showObjectDiff: (type: string, obj: any, prevObj: any) => void = (type, obj, prevObj) => {\n if (!obj && !prevObj) {\n return;\n }\n\n if (obj && !prevObj) {\n log.debug(`${type}: null => not null`);\n return;\n }\n\n if (!obj && prevObj) {\n log.debug(`${type}: not null => null`);\n return;\n }\n\n for (const key of Object.keys(obj)) {\n if (key !== undefined) {\n const { [key]: value } = obj;\n const { [key]: prevValue } = prevObj;\n if (value !== prevValue) {\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n log.debug(`[${type}] ${key}: ${prevValue} => ${value.toString()}`);\n } else {\n log.debug(`[${type}] ${key}:`);\n log.debug(prevValue);\n log.debug(value);\n }\n }\n }\n }\n};\n\nconst showUpdateDiff: (componentName: string, component: React.PureComponent, prevProps: any, prevState: any) => void = (componentName, component, prevProps, prevState) => {\n log.debug(`Component update diff for: ${componentName}`);\n showObjectDiff('props', component.props, prevProps);\n showObjectDiff('state', component.state, prevState);\n};\n\n// Parameter maxTime is in minutes\nconst showFinishingLivePrograms: (feed: NETGEM_API_V8_FEED, itemCountPerPage?: number, maxTime?: number, maxItems?: number) => void = (feed, itemCountPerPage, maxTime, maxItems) => {\n const threshold = maxTime ? maxTime * SECONDS_PER_MINUTE : DEFAULT_DEBUG_LIVE_PROGRAMS_THRESHOLD;\n const maxCount = maxItems ? maxItems : DEFAULT_DEBUG_LIVE_PROGRAMS_MAX_COUNT;\n\n const now = AccurateTimestamp.nowInSeconds();\n const items = [];\n\n feed.forEach((item, index) => {\n const {\n endTime,\n selectedLocation: { channelId },\n } = item;\n const remainingTime = endTime - now;\n\n if (remainingTime > 0 && remainingTime <= threshold) {\n items.push({\n channelId,\n index: index + 1,\n remainingTime,\n remainingTimeStr: formatSecondsToHHMMSS(remainingTime),\n });\n }\n });\n\n items.sort((a, b) => a.remainingTime - b.remainingTime);\n const { length } = items;\n\n for (let i = 0; i < Math.min(maxCount, length); ++i) {\n const {\n [i]: { channelId, index, remainingTimeStr },\n } = items;\n const posInSection = index.toString().padStart(DEBUG_LIVE_PROGRAMS_INDEX_PAD);\n const page =\n itemCountPerPage && itemCountPerPage > 0\n ? ` (p. ${Math.ceil(index / itemCountPerPage)\n .toString()\n .padStart(DEBUG_LIVE_PROGRAMS_INDEX_PAD)})`\n : '';\n const pos = channelId?.lastIndexOf('_') ?? -1;\n const channel = pos > -1 && channelId ? channelId.substring(pos + 1) : channelId;\n log.debug(`${remainingTimeStr} | ${posInSection}${page} | ${channel ?? ''}`);\n }\n};\n\nconst buildMissingParametersMessage: (parameters: any, name: string) => string = (parameters, name) => {\n const missingParameters = [];\n\n Object.entries(parameters).forEach(([key, value]) => {\n if (isUndefinedOrNull(value)) {\n missingParameters.push(key);\n }\n });\n\n return Localizer.localize('common.messages.errors.missing_parameters_list', {\n list: missingParameters.join(', '),\n name,\n });\n};\n\nconst buildMissingParametersError: (parameters: any, name: string) => Error = (parameters, name) => new Error(buildMissingParametersMessage(parameters, name));\n\nconst logTrace = (...args: Array): void => {\n log.trace(...args);\n};\n\nconst logDebug = (...args: Array): void => {\n log.debug(...args);\n};\n\nconst logInfo = (...args: Array): void => {\n log.info(...args);\n};\n\nconst logWarning = (...args: Array): void => {\n log.warn(...args);\n};\n\nconst logError = (...args: Array): void => {\n log.error(...args);\n};\n\nconst flattenNotificationMessage = (message: NOTIFICATION_MESSAGE, flattenText?: string): string => {\n const addPrefixIfDefined = (s: string): string => (flattenText ? `${flattenText} | ${s}` : s);\n\n if (typeof message === 'string') {\n return addPrefixIfDefined(message);\n }\n\n const {\n // $FlowFixMe: Flow says props is missing in React.Element (which is wrong)\n props: { children },\n } = message;\n\n if (Array.isArray(children)) {\n return addPrefixIfDefined(children.map((child) => flattenNotificationMessage(child)).join(' | '));\n }\n\n return flattenNotificationMessage(children);\n};\n\nconst getTimeRangesAsString = (timeRanges: TimeRanges | null): string => {\n if (timeRanges === null) {\n return '';\n }\n\n const result = [];\n\n for (let i = 0; i < timeRanges.length; ++i) {\n result.push(`[${timeRanges.start(i).toFixed(1)},${timeRanges.end(i).toFixed(1)}]`);\n }\n\n return result.join(' ');\n};\n\nconst TIME_PADDING_LENGTH = 2;\n\nconst pad2 = (n: number) => n.toString().padStart(TIME_PADDING_LENGTH, '0');\n\n// Parameter duration is in seconds\nconst getDurationAsString = (duration: number): string => {\n const h = Math.floor(duration / SECONDS_PER_HOUR);\n const remainder = duration % SECONDS_PER_HOUR;\n const m = Math.floor(remainder / SECONDS_PER_MINUTE);\n // Sometimes there are fractions of seconds\n const s = Math.floor(remainder) % SECONDS_PER_MINUTE;\n return `${pad2(h)}:${pad2(m)}:${pad2(s)}`;\n};\n\nconst getTimestampAsLocalTime = (t: number): string => new Date(t * MILLISECONDS_PER_SECOND).toLocaleTimeString();\n\nconst getDurationDisplay = (duration: ?number): string => {\n if (duration === null) {\n return '';\n }\n\n if (typeof duration !== 'number') {\n return '';\n }\n\n return `${duration} (${getDurationAsString(duration)})`;\n};\n\nconst getTimestampDisplay = (timestamp: number): string => `${timestamp} (${getTimestampAsLocalTime(timestamp)})`;\n\nexport {\n buildMissingParametersError,\n buildMissingParametersMessage,\n showFinishingLivePrograms,\n flattenNotificationMessage,\n getDurationDisplay,\n getTimeRangesAsString,\n getTimestampDisplay,\n logDebug,\n logError,\n logInfo,\n logTrace,\n logWarning,\n showDebug,\n showUpdateDiff,\n};\n","/* @flow */\n\nimport { logError, logInfo, logWarning } from '../debug/debug';\nimport { KEY } from './keysDefinition';\nimport type { KeyValuePair } from '@ntg/utils/dist/types';\n\nconst MODIFIER_PADDING = 3;\n\ntype ListenerOptions = {|\n allowEditableContext?: boolean,\n disableOthers?: boolean,\n name?: string,\n|};\n\ntype ListenerType = {|\n ...ListenerOptions,\n handler: (event: SyntheticKeyboardEvent) => void | Promise,\n|};\n\nexport default class HotKeys {\n listeners: {|\n [string]: Array,\n |};\n\n // eslint-disable-next-line no-use-before-define\n static instance: HotKeys;\n\n constructor() {\n this.listeners = {};\n window.addEventListener('keydown', this.handleOnKeyDown, { capture: true });\n }\n\n // $FlowFixMe: Flow does not support symbols yet\n get [Symbol.toStringTag]() {\n return 'HotKeys';\n }\n\n // eslint-disable-next-line no-use-before-define\n static getInstance: () => HotKeys = () => {\n if (!HotKeys.instance) {\n HotKeys.instance = new HotKeys();\n }\n\n return HotKeys.instance;\n };\n\n static listHotKeys: () => void = () => {\n logInfo('Registered listeners:');\n Object.entries(HotKeys.getInstance().listeners).forEach(([key, listeners]) => {\n const listenerDescriptions = ((listeners: any): Array).map((l) => {\n const { allowEditableContext, disableOthers, name } = l;\n const parts = [name ?? ''];\n if (disableOthers) {\n parts.push('disableOthers');\n }\n if (allowEditableContext) {\n parts.push('editable');\n }\n\n return `(${parts.join(',')})`;\n });\n\n logInfo(`${HotKeys.toHumanReadable(key)}: [${listenerDescriptions.join(' ')}]`);\n });\n };\n\n /*\n * Takes a string and returns a normalized shortcut (string) of the form: 'a|c|s|k'\n * where a, c, s mean Alt, Control, Shift and can be 0 or 1\n * k is the shortcut key code\n *\n * Examples:\n * 'a' will return '0|0|0|65'\n * 'ctrl+f' will return '0|1|0|70'\n * 'alt+shift+escape' will return '1|0|1|27'\n */\n static normalizeHotkey: (key: string) => string | null = (key) => {\n if (key === '') {\n return null;\n }\n\n const parts = key.toUpperCase().split('+');\n const { length } = parts;\n\n const keyName = parts[length - 1];\n if (!(keyName in KEY)) {\n return null;\n }\n\n const modifiers: KeyValuePair = {};\n for (let i = 0; i < length - 1; ++i) {\n const { [i]: modifier } = parts;\n if (modifier in modifiers) {\n logWarning(`Duplicate modifier ${modifier} in shortcut: ${key}`);\n }\n modifiers[parts[i]] = 1;\n }\n\n return HotKeys.buildHotKey(KEY[keyName], modifiers.ALT, modifiers.CTRL, modifiers.SHIFT);\n };\n\n static buildHotKey: (keyCode: number, alt?: boolean | 0 | 1, ctrl?: boolean | 0 | 1, shift?: boolean | 0 | 1) => string = (keyCode, alt, ctrl, shift) =>\n `${alt ? 1 : 0}|${ctrl ? 1 : 0}|${shift ? 1 : 0}|${keyCode}`;\n\n static toHumanReadable: (hotKey: string) => string = (hotKey) => {\n const modifiers = ['Alt', 'Ctrl', 'Shift'];\n const parts = hotKey.split('|');\n const keyCode = Number(parts.splice(parts.length - 1, 1));\n const modifiersString = parts.map((part, index) => (part === '1' ? modifiers[index] : ''.padStart(MODIFIER_PADDING + index))).join(' ');\n return `${modifiersString} ${HotKeys.getKeyNameFromCode(keyCode)}`;\n };\n\n static getKeyNameFromCode: (code: number) => string = (code) => {\n for (const keyName in KEY) {\n if (KEY[keyName] === code) {\n return keyName;\n }\n }\n\n return ``;\n };\n\n static register: (key: string | Array, handler: (event: SyntheticKeyboardEvent) => void | Promise, options?: ListenerOptions) => void = (key, handler, options) => {\n if (Array.isArray(key)) {\n key.forEach((k) => HotKeys.register(k, handler, options));\n return;\n }\n\n const hotKey = HotKeys.normalizeHotkey(key);\n\n if (!hotKey) {\n logError(`Cannot register unknown shortcut: ${key}`);\n return;\n }\n\n let { [hotKey]: listeners } = HotKeys.getInstance().listeners;\n if (!listeners) {\n listeners = [];\n HotKeys.getInstance().listeners[hotKey] = listeners;\n }\n\n const item = {\n ...options,\n handler,\n };\n\n if (options?.disableOthers) {\n listeners.unshift(item);\n } else {\n listeners.push(item);\n }\n };\n\n static unregister: (key: string | Array, handler: (event: SyntheticKeyboardEvent) => void | Promise) => void = (key, handler) => {\n if (Array.isArray(key)) {\n key.forEach((k) => HotKeys.unregister(k, handler));\n return;\n }\n\n const hotKey = HotKeys.normalizeHotkey(key);\n\n if (!hotKey) {\n logError(`Cannot unregister unknown shortcut: ${key}`);\n return;\n }\n\n const { [hotKey]: listeners } = HotKeys.getInstance().listeners;\n if (!listeners) {\n return;\n }\n\n const index = listeners.findIndex((item) => item.handler === handler);\n if (index > -1) {\n listeners.splice(index, 1);\n if (listeners.length === 0) {\n // No more listeners registered for this shortcut\n delete HotKeys.getInstance().listeners[hotKey];\n }\n }\n };\n\n static isInEditableContext: (event: SyntheticKeyboardEvent) => boolean = (event) => {\n const {\n // $FlowFixMe: tagName does exist in target\n target: { tagName },\n } = event;\n\n return ['INPUT', 'SELECT', 'TEXTAREA'].includes(tagName.toUpperCase());\n };\n\n handleOnKeyDown: (event: SyntheticKeyboardEvent) => void = (event) => {\n const { altKey, keyCode, ctrlKey, shiftKey } = event;\n\n const hotKey = HotKeys.buildHotKey(keyCode, altKey, ctrlKey, shiftKey);\n\n // Check listeners for this shortcut\n const { [hotKey]: listeners } = HotKeys.getInstance().listeners;\n if (!listeners) {\n // Nobody is listening\n return;\n }\n\n const isInEditableContext = HotKeys.isInEditableContext(event);\n\n for (let i = 0; i < listeners.length; ++i) {\n const { disableOthers, handler, allowEditableContext } = listeners[i];\n\n if (!isInEditableContext || allowEditableContext) {\n handler(event);\n }\n\n if (disableOthers) {\n // First listener is the only one notified\n break;\n }\n }\n };\n}\n","/* @flow */\n\nimport type { ReadOnlyKeyValuePair } from '@ntg/utils/src/types';\n\n// Used with event.keyCode\nexport const KEY: ReadOnlyKeyValuePair = Object.freeze({\n A: 65,\n ACCEPT: 30,\n ADD: 107,\n ALT: 18,\n ANDROID_VIRTUAL_KEYBOARD_DEAD_KEY: 229,\n B: 66,\n BACK: 461,\n BACK_QUOTE: 192,\n BACK_SLASH: 92,\n BACK_SPACE: 8,\n BALANCE_LEFT: 452,\n BALANCE_RIGHT: 451,\n BASS_BOOST_DOWN: 456,\n BASS_BOOST_UP: 455,\n BLUE: 406,\n BROWN: 408,\n C: 67,\n CANCEL: 3,\n CAPS_LOCK: 20,\n CHANNEL_DOWN: 428,\n CHANNEL_UP: 427,\n CLEAR: 12,\n CLEAR_FAVORITE_0: 437,\n CLEAR_FAVORITE_1: 438,\n CLEAR_FAVORITE_2: 439,\n CLEAR_FAVORITE_3: 440,\n CLOSE_BRACKET: 93,\n COMMA: 44,\n CONTROL: 17,\n CONVERT: 28,\n D: 68,\n DECIMAL: 110,\n DELETE: 127,\n DIMMER: 410,\n DISPLAY_SWAP: 444,\n DIVIDE: 111,\n DOWN: 40,\n E: 69,\n EJECT_TOGGLE: 414,\n END: 35,\n ENTER: 13,\n EQUALS: 61,\n ESCAPE: 27,\n F: 70,\n // Chrome: Help\n F1: 112,\n // Firefox: Menu\n F10: 121,\n // Chrome, Firefox: Fullscreen\n F11: 122,\n // Chrome, Firefox: Inspector\n F12: 123,\n F2: 113,\n // Chrome, Firefox: Open Find-bar\n F3: 114,\n F4: 115,\n // Chrome, Firefox: Reload\n F5: 116,\n // Chrome, Firefox: Rotate focus (address-bar/bookmark-bar/etc)\n F6: 117,\n // Firefox: Caret Browsing\n F7: 118,\n F8: 119,\n F9: 120,\n FADER_FRONT: 453,\n FADER_REAR: 454,\n FAST_FWD: 417,\n FINAL: 24,\n G: 71,\n GO_TO_END: 423,\n GO_TO_START: 422,\n GREEN: 404,\n GREY: 407,\n GUIDE: 458,\n H: 72,\n HELP: 156,\n HOME: 36,\n I: 73,\n INFO: 457,\n INSERT: 155,\n J: 74,\n K: 75,\n KANA: 21,\n KANJI: 25,\n L: 76,\n LEFT: 37,\n LESS_THAN: 226,\n M: 77,\n MENU: 462,\n META: 157,\n MINUS: 54,\n MODECHANGE: 31,\n MULTIPLY: 106,\n MUTE: 449,\n N: 78,\n NEXT: 425,\n NONCONVERT: 29,\n NUMPAD_0: 96,\n NUMPAD_1: 97,\n NUMPAD_2: 98,\n NUMPAD_3: 99,\n NUMPAD_4: 100,\n NUMPAD_5: 101,\n NUMPAD_6: 102,\n NUMPAD_7: 103,\n NUMPAD_8: 104,\n NUMPAD_9: 105,\n NUMPAD_MINUS: 109,\n NUMPAD_PLUS: 107,\n NUM_0: 48,\n NUM_1: 49,\n NUM_2: 50,\n NUM_3: 51,\n NUM_4: 52,\n NUM_5: 53,\n NUM_6: 54,\n NUM_7: 55,\n NUM_8: 56,\n NUM_9: 57,\n NUM_LOCK: 144,\n O: 79,\n OPEN_BRACKET: 91,\n P: 80,\n PAGE_DOWN: 34,\n PAGE_UP: 33,\n PAUSE: 19,\n PERIOD: 46,\n PINP_TOGGLE: 442,\n PLAY: 415,\n PLAY_PAUSE: 463,\n PLAY_SPEED_DOWN: 419,\n PLAY_SPEED_RESET: 420,\n PLAY_SPEED_UP: 418,\n PLUS: 187,\n POWER: 409,\n PREV: 424,\n PRINTSCREEN: 154,\n Q: 81,\n QUOTE: 222,\n R: 82,\n RANDOM_TOGGLE: 426,\n RECALL_FAVORITE_0: 433,\n RECALL_FAVORITE_1: 434,\n RECALL_FAVORITE_2: 435,\n RECALL_FAVORITE_3: 436,\n RECORD: 416,\n RECORD_SPEED_NEXT: 421,\n RED: 403,\n REWIND: 412,\n RIGHT: 39,\n S: 83,\n SCAN_CHANNELS_TOGGLE: 441,\n SCREEN_MODE_NEXT: 445,\n SCROLL_LOCK: 145,\n SEMICOLON: 59,\n SEPARATOR: 108,\n SHIFT: 16,\n SLASH: 47,\n SPACE: 32,\n SPLIT_SCREEN_TOGGLE: 443,\n STOP: 413,\n STORE_FAVORITE_0: 429,\n STORE_FAVORITE_1: 430,\n STORE_FAVORITE_2: 431,\n STORE_FAVORITE_3: 432,\n SUBTITLE: 460,\n SUBTRACT: 109,\n SURROUND_MODE_NEXT: 450,\n T: 84,\n TAB: 9,\n TELETEXT: 459,\n U: 85,\n UNDEFINED: 0,\n UP: 38,\n V: 86,\n VIDEO_MODE_NEXT: 446,\n VOLUME_DOWN: 448,\n VOLUME_UP: 447,\n W: 87,\n WINK: 411,\n X: 88,\n Y: 89,\n YELLOW: 405,\n Z: 90,\n});\n","/* @flow */\n\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport { StreamType } from '../../libs/netgemLibrary/v8/types/MetadataSchedule';\nimport type { Undefined } from '@ntg/utils/dist/types';\n\nconst TWO = 2;\n\nexport enum Drm {\n Fairplay = 'fairplay',\n Playready = 'playready',\n Widevine = 'widevine',\n}\n\nexport const DRM_KEY_SYSTEM = Object.freeze({\n Fairplay: 'com.apple.fps',\n Playready: 'com.microsoft.playready',\n Widevine: 'com.widevine.alpha',\n});\n\n// List of DRMs supported by PTF\nexport const DRM_KEY_SYSTEMS = Object.freeze({\n Fairplay: [DRM_KEY_SYSTEM.Fairplay, 'com.apple.fps.1_0', 'com.apple.fps.2_0', 'com.apple.fps.3_0', 'com.apple.fairplay'],\n Playready: [DRM_KEY_SYSTEM.Playready, 'com.youtube.playready'],\n Widevine: [DRM_KEY_SYSTEM.Widevine],\n});\n\n// List of DRMs supported by current browser (filled at startup)\nconst supportedDrms: Array = [];\n\nconst getDrmName = (drm?: Drm): Undefined => {\n if (drm === undefined) {\n return undefined;\n }\n\n return (drm: string);\n};\n\n// eslint-disable-next-line consistent-return\nconst getKeySystemsFromDrm = (drm: Drm): Array => {\n switch (drm) {\n case Drm.Fairplay:\n return DRM_KEY_SYSTEMS.Fairplay;\n case Drm.Playready:\n return DRM_KEY_SYSTEMS.Playready;\n case Drm.Widevine:\n return DRM_KEY_SYSTEMS.Widevine;\n\n // No default\n }\n};\n\nconst Config = Object.freeze([\n {\n audioCapabilities: [\n {\n contentType: 'audio/mp4;codecs=\"mp4a.40.2\"',\n robustness: 'SW_SECURE_CRYPTO',\n },\n ],\n initDataTypes: ['cenc'],\n videoCapabilities: [\n {\n contentType: 'video/mp4;codecs=\"avc1.42E01E\"',\n robustness: 'SW_SECURE_CRYPTO',\n },\n ],\n },\n]);\n\nconst getDrmPriority: (name: Drm) => number =\n // eslint-disable-next-line consistent-return\n (name) => {\n // Following order determines which DRM is used when more than one is available (0 is the highest priority)\n switch (name) {\n case Drm.Fairplay:\n return TWO;\n case Drm.Playready:\n return 1;\n case Drm.Widevine:\n return 0;\n\n // No default\n }\n };\n\nconst compareDrms: (drm1?: Drm, drm2?: Drm) => number = (drm1, drm2) => {\n if (drm1 === undefined || drm2 === undefined) {\n return 0;\n }\n\n const priority1 = getDrmPriority(drm1);\n const priority2 = getDrmPriority(drm2);\n\n if (priority1 === undefined && priority2 === undefined) {\n return 0;\n }\n\n if (priority2 === undefined) {\n return -1;\n }\n if (priority1 === undefined) {\n return 1;\n }\n return priority1 - priority2;\n};\n\nconst compareDrmsFromName: (drm1: string, drm2: string) => number = (drm1, drm2) => compareDrms(Drm.cast(drm1), Drm.cast(drm2));\n\nconst isDrmSupported: (drm: ?Drm) => boolean = (drm) => {\n if (drm === undefined || drm === null) {\n return true;\n }\n\n return supportedDrms.some((supportedDrm) => drm === supportedDrm);\n};\n\nconst getFirstSupportedDrm: () => Undefined = () => {\n if (supportedDrms.length > 0) {\n const [drm] = supportedDrms;\n return drm;\n }\n\n // No supported DRM\n return undefined;\n};\n\nconst getSupportedDrms: () => Array = () => supportedDrms;\n\nconst getSupportedTypesPerDrm: (drm: Drm) => Array =\n // eslint-disable-next-line consistent-return\n (drm) => {\n switch (drm) {\n case Drm.Fairplay:\n return [StreamType.HLS, StreamType.MP4];\n case Drm.Playready:\n return [StreamType.DASH, StreamType.HLS, StreamType.MP4, StreamType.MSS];\n case Drm.Widevine:\n return [StreamType.DASH, StreamType.HLS, StreamType.MP4];\n\n // No default\n }\n };\n\nconst requestMediaKey: (keySystem: string) => Promise = (keySystem) => window.navigator.requestMediaKeySystemAccess(keySystem, Config);\n\nconst defaultEmeChecker: (keySystem: string) => Promise = (keySystem) => requestMediaKey(keySystem);\n\nconst webKitEmeChecker: (keySystem: string) => Promise = (keySystem) => {\n try {\n new window.WebKitMediaKeys(keySystem); // eslint-disable-line no-new\n return Promise.resolve();\n } catch {\n return Promise.reject(new Error(`${keySystem} no supported`));\n }\n};\n\nconst msEmeChecker: (keySystem: string) => Promise = (keySystem) => {\n if (window.MSMediaKeys.isTypeSupported(keySystem)) {\n return Promise.resolve();\n }\n\n return Promise.reject(new Error('Not supported'));\n};\n\nconst detectDrmInternal: (checker: (keySystem: string) => Promise) => Promise = (checker) => {\n const supportedSystems = new Set();\n const promises = [];\n\n Array.from(Drm.members()).forEach((drm) => {\n getKeySystemsFromDrm(drm).forEach((keySystem) => {\n promises.push(checker(keySystem).then(() => supportedSystems.add(drm)));\n });\n });\n\n return Promise.allSettled(promises).then(() => supportedSystems);\n};\n\nconst detectDrm: () => Promise = () => {\n const videoElement = document.createElement('video');\n\n if (videoElement.mediaKeys) {\n throw new Error(Localizer.localize('common.messages.errors.no_drm'));\n }\n\n let checker: ?(keySystem: string) => Promise = null;\n\n if (window.WebKitMediaKeys) {\n checker = webKitEmeChecker;\n } else if (typeof window.MSMediaKeys === 'function') {\n checker = msEmeChecker;\n } else if (typeof window.navigator.requestMediaKeySystemAccess === 'function') {\n checker = defaultEmeChecker;\n } else {\n throw new Error(Localizer.localize('common.messages.errors.no_drm'));\n }\n\n return detectDrmInternal(checker).then((supportedSystems) => {\n if (supportedSystems.size === 0) {\n return Promise.reject(new Error(Localizer.localize('common.messages.errors.no_drm')));\n }\n\n const systems = [...supportedSystems];\n systems.sort(compareDrms);\n systems.forEach((drm) => supportedDrms.push(drm));\n return Promise.resolve();\n });\n};\n\nexport { compareDrms, compareDrmsFromName, detectDrm, getDrmPriority, getDrmName, getFirstSupportedDrm, getSupportedDrms, getSupportedTypesPerDrm, isDrmSupported };\n","/* @flow */\n\nconst parseBoolean: (value: ?string) => boolean = (value) => {\n if (typeof value !== 'string') {\n return false;\n }\n\n return ['1', 'true', 'enabled', 'yes'].includes(value.toLowerCase());\n};\n\nconst parseFloat: (value: ?string, defaultValue?: number) => number = (value, defaultValue) => {\n if (value === undefined || value === null || isNaN(value)) {\n return defaultValue || -1;\n }\n\n return Number(value);\n};\n\nconst parseInteger: (value: ?string, defaultValue?: number) => number = (value, defaultValue) => {\n const f = parseFloat(value, defaultValue);\n return Number.isInteger(f) ? f : (defaultValue ?? -1);\n};\n\nconst parseStringArray = (value: ?string, delimiter: string = ',', defaultValue: Array = []): Array => {\n if (typeof value !== 'string') {\n return defaultValue;\n }\n\n return value.split(delimiter).filter((s) => s);\n};\n\nconst parseIntegerArray: (value: ?string, delimiter?: string) => Array = (value, delimiter = ',') => {\n if (typeof value !== 'string') {\n return [];\n }\n\n return value\n .split(delimiter)\n .filter((s) => !isNaN(s))\n .map((s) => Number(s));\n};\n\nexport { parseBoolean, parseFloat, parseInteger, parseIntegerArray, parseStringArray };\n","/* @flow */\n\nexport const SettledPromiseFulfilled = 'fulfilled';\nexport const SettledPromiseRejected = 'rejected';\n\nexport type SettledPromise =\n | {|\n +status: typeof SettledPromiseFulfilled,\n +value: any,\n |}\n | {|\n +reason: any,\n +status: typeof SettledPromiseRejected,\n |};\n\nexport type AllSettledPromises = Array;\n\n// Used to ignore any promise return (success or failure) without any lint warning\nconst fireAndForget: (promise: Promise) => void = (promise) => {\n promise\n .then(() => {\n /* Nothing to do */\n })\n .catch(() => {\n /* Nothing to do */\n });\n};\n\n// Wait a certain amount of time (in milliseconds) before resolving\nconst wait: (duration: number) => Promise = (duration) =>\n new Promise((resolve) => {\n setTimeout(resolve, duration);\n });\n\nexport { fireAndForget, wait };\n","/* @flow */\n\nexport enum LoadableStatus {\n NotInitialized,\n Loaded,\n Error,\n}\n","/* @flow */\n\nimport type { ReadOnlyKeyValuePair } from '@ntg/utils/dist/types';\n\nexport const StorageKeys: ReadOnlyKeyValuePair = Object.freeze({\n CardExpandedItemIndex: 'cardExpandedItemIndex',\n CrmData: 'crmData',\n DataCollectionStash: 'dataCollectionStash',\n DefaultSubtitlesApplied: 'defaultSubtitlesApplied',\n DeviceIdentifier: 'deviceIdentifier',\n LastBOTokenRenewal: 'boTokenRenewalLast',\n LastPaymentExpirationNotification: 'lastPaymentExpirationNotification',\n LastStartup: 'startupLast',\n LastTokenRenewal: 'tokenRenewalLast',\n LastViewingHistoryCleanUp: 'lastViewingHistoryCleanUp',\n NextBOTokenRenewal: 'boTokenRenewalNext',\n NextTokenRenewal: 'tokenRenewalNext',\n NextVersionCheckDate: 'nextVersionCheckDate',\n OptimisticDefaultActions: 'optimisticDefaultActions',\n OptimisticDmsSettings: 'optimisticDmsSettings',\n OptimisticDmsSettingsUsed: 'optimisticDmsSettingsUsed',\n OptimisticHub: 'optimisticHub',\n OverriddenAppConf: 'overriddenAppConf',\n PendingOperation: 'pendingOperation',\n RegisteredAsGuest: 'registeredAsGuest',\n SearchHistory: 'searchHistory',\n Settings: 'settings',\n UserDeviceInfo: 'userDeviceInfo',\n});\n","/* @flow */\n\nimport { logWarning } from '../debug/debug';\n\nconst replacer: (key: string, value: any) => any = (key, value) => {\n if (value instanceof Map) {\n return {\n dataType: 'Map',\n value: Array.from(value.entries()),\n };\n }\n\n if (typeof value === 'number' && isNaN(value)) {\n return 'NaN';\n }\n\n return value;\n};\n\nconst reviver: (key: string, value: any) => any = (key, value) => {\n if (typeof value === 'object' && value !== null) {\n if (value.dataType === 'Map') {\n return new Map(value.value);\n }\n }\n\n if (value === 'NaN') {\n return NaN;\n }\n\n return value;\n};\n\nexport default class LocalStorageManager {\n // $FlowFixMe: Flow does not support symbols yet\n get [Symbol.toStringTag]() {\n return 'LocalStorageManager';\n }\n\n static clear: () => void = () => localStorage.clear();\n\n static delete: (...keys: Array) => void = (...keys) => keys.forEach((key) => localStorage.removeItem(key));\n\n static loadString: (key: string, defaultValue: string) => string = (key, defaultValue) => localStorage.getItem(key) ?? defaultValue;\n\n static loadObject: (key: string, defaultValue: any) => any = (key, defaultValue) => {\n try {\n const str = localStorage.getItem(key);\n if (str) {\n const value = JSON.parse(str, reviver);\n\n if (value !== null) {\n return value;\n }\n }\n } catch {\n // Nothing to do: default value or null is returned below\n logWarning(`Value found in local storage is invalid for key \"${key}\" and has been deleted`);\n localStorage.removeItem(key);\n }\n\n return defaultValue ?? null;\n };\n\n static loadBoolean: (key: string, defaultValue: boolean) => boolean = (key, defaultValue) => {\n try {\n const str = localStorage.getItem(key);\n if (str) {\n return str === '1' || str.toLowerCase() === 'true';\n }\n } catch {\n // Nothing to do: default value is returned below\n }\n\n return defaultValue;\n };\n\n static loadNumber: (key: string, defaultValue: number) => number = (key, defaultValue) => {\n try {\n const str = localStorage.getItem(key);\n if (str) {\n const n = Number(str);\n if (!isNaN(n)) {\n return n;\n }\n }\n } catch {\n // Nothing to do: default value is returned below\n }\n\n return defaultValue;\n };\n\n static loadIsoDate: (key: string, defaultValue: Date) => Date = (key, defaultValue) => {\n try {\n const str = localStorage.getItem(key);\n if (str) {\n const date = new Date(JSON.parse(str));\n if (date instanceof Date && !isNaN(date)) {\n return date;\n }\n }\n } catch {\n // Nothing to do: default value is returned below\n }\n\n return defaultValue;\n };\n\n static save: (key: string, value: any) => void = (key, value) => {\n if (value === undefined) {\n return;\n }\n\n localStorage.setItem(key, typeof value === 'string' ? value : JSON.stringify(value, replacer));\n };\n}\n","/* @flow */\n\nconst TWO = 2;\nconst TEN = 10;\nconst ONE_HUNDRED = 100;\n\n/*\n * Shuffle the given array of numbers in place using a random number generator that gives the same result during a whole day\n * Implementation of Fischer-Yates algorithm\n */\nconst dailyShuffleArray: (array: Array) => void = (array) => {\n const { length } = array;\n\n // Initialize RNG with current date so that it's the same during the whole day\n const getRandomNumber = getRandomNumberGeneratorWithSeed(new Date().getDate());\n\n for (let i = length - 1; i > 0; i--) {\n const j = Math.floor(getRandomNumber() * (i + 1));\n // $FlowFixMe: flow doesn't support swapping with array\n [array[i], array[j]] = [array[j], array[i]];\n }\n};\n\n// Return the given value adjusted to the interval [minValue,maxValue] (default interval is [0,100])\nconst getBoundedValue = (value: number, minValue: number = 0, maxValue: number = ONE_HUNDRED): number => Math.min(maxValue, Math.max(minValue, value));\n\nconst getClosestEvenInteger: (value: number) => number = (value) => TWO * Math.round(value / TWO);\n\n// Return an integer in the interval [0,100]\nconst getIntegerPercentage: (value: number, minValue: number, maxValue: number) => number = (value, minValue, maxValue) => Math.round(ONE_HUNDRED * getRealPercentage(value, minValue, maxValue));\n\n// Return a real in the interval [0,1]\nconst getRealPercentage: (value: number, minValue: number, maxValue: number) => number = (value, minValue, maxValue) => {\n if (value <= minValue) {\n return 0;\n }\n\n if (value >= maxValue) {\n return 1;\n }\n\n return (value - minValue) / (maxValue - minValue);\n};\n\n// Return an integer in the interval [minValue,maxValue]\nconst getRandomInteger: (minValue: number, maxValue: number) => number = (minValue, maxValue) => {\n const localMin = Math.ceil(minValue);\n const localMax = Math.floor(maxValue);\n return Math.floor(Math.random() * (localMax - localMin + 1)) + localMin;\n};\n\n// Return a random number generator (like Math.random()) based on the given seed\nconst getRandomNumberGeneratorWithSeed = (seed: number) => {\n const m = 2 ** 35 - 31; // eslint-disable-line no-magic-numbers\n const a = 185852;\n let s = seed % m;\n return () => (s = (s * a) % m) / m;\n};\n\nconst round: (value: number, decimalPlaces: number) => number = (value, decimalPlaces) => {\n const p = TEN ** decimalPlaces;\n\n if (Math.round(value * p) / p === value) {\n return value;\n }\n\n return Math.round(value * p * (1 + Number.EPSILON)) / p;\n};\n\nconst roundDownTo: (value: number, rounding: number) => number = (value, rounding) => value - (value % rounding);\n\nconst roundUpTo: (value: number, rounding: number) => number = (value, rounding) => {\n const modulo = value % rounding;\n\n return modulo === 0 ? value : value + rounding - modulo;\n};\n\nconst getPriceAsFloat: (price: string | null) => number | null = (price) => {\n if (price === null) {\n return null;\n }\n\n return parseFloat(price.replace(',', '.').replace(/[^\\d.]/gu, ''));\n};\n\nconst getPriceAsInteger: (price: string | null) => number | null = (price) => {\n if (price === null) {\n return null;\n }\n\n let p = price.replace(',', '.').replace(/[^\\d.]/gu, '');\n const dotIndex = p.indexOf('.');\n if (dotIndex === -1) {\n // Price is already an integer, like \"3€\" > let's convert it to cents\n p = `${p}00`;\n } else {\n // Price has a decimal separator somewhere like \".50€\", \"1.50€\", etc. > let's move this dot 2 characters to the right\n const re = /^(\\d*).(\\d*)$/u;\n const m = re.exec(p);\n if (!m) {\n return null;\n }\n\n p = `${m[1]}${m[TWO].padEnd(TWO, '0').substring(0, TWO)}`;\n }\n\n return parseFloat(p);\n};\n\nexport { dailyShuffleArray, getBoundedValue, getClosestEvenInteger, getIntegerPercentage, getPriceAsFloat, getPriceAsInteger, getRandomInteger, getRealPercentage, round, roundDownTo, roundUpTo };\n","/* v:'7.3.1' - build date : '2023-01-03T13:50:55+0000'*/\n(()=>{\"use strict\";var t={d:(e,i)=>{for(var n in i)t.o(i,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:i[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(t,\"__esModule\",{value:!0})}},e={};t.r(e),t.d(e,{eStatTag:()=>k});var i,n,o,s=\"INFO: probe mode enabled\",r=\"WARNING: the notifyPlayer() cannot be called with play or pause in an automatic mode\",a=new(function(){function t(){this.debugEnabled=!1}return t.prototype.err=function(t){console.error(t)},t.prototype.debug=function(t,e){this.debugEnabled&&(e?console.debug(t,e):console.debug(t))},t.prototype.setDebug=function(t){this.debugEnabled=t},t.prototype.isDebug=function(){return this.debugEnabled},t}());!function(t){t.page=\"page\",t.streaming=\"streaming\"}(i||(i={})),function(t){t.live=\"live\",t.replay=\"replay\",t.timeshifting=\"timeshifting\"}(n||(n={})),function(t){t.optout=\"optout\",t.optin=\"optin\",t.exempted=\"exempted\"}(o||(o={}));var h,u=function(){function t(){this.logger=a,this.schema={serial:{},measure:{},levels:{schema:{level_1:{hitName:\"cmsS3\"},level_2:{hitName:\"cmsS2\"},level_3:{hitName:\"cmsS1\"},level_4:{hitName:\"cmsS4\"},level_5:{hitName:\"cmsS5\"}}},streaming:{schema:{diffusion:{},streamName:{hitName:\"cmsSN\"},streamURL:{hitName:\"cmsME\"},streamGenre:{hitName:\"cmsGR\"},streamDuration:{hitName:\"cmsDU\"},playerName:{hitName:\"cmsPL\"},playerVersion:{hitName:\"cmsPV\"},pluginName:{hitName:\"pn\"},pluginVersion:{hitName:\"pv\"}}},newLevels:{schema:{newLevel_1:{hitName:\"ml1\"},newLevel_2:{hitName:\"ml2\"},newLevel_3:{hitName:\"ml3\"},newLevel_4:{hitName:\"ml4\"},newLevel_5:{hitName:\"ml5\"},newLevel_6:{hitName:\"ml6\"},newLevel_7:{hitName:\"ml7\"},newLevel_8:{hitName:\"ml8\"},newLevel_9:{hitName:\"ml9\"},newLevel_10:{hitName:\"ml10\"},newLevel_11:{hitName:\"ml11\"}}},multiLevels:{hitName:\"mls\"},mediaInfo:{schema:{mediaContentId:{hitName:\"msCid\"},mediaDiffMode:{hitName:\"msDm\"},mediaChannel:{hitName:\"msCh\"}}},netMeasurement:{hitName:\"miCh\"},firstParty:{hitName:\"cfp\"},consentType:{hitName:\"ct\"},consentString:{hitName:\"cstr\"}}}return t.prototype.validateConfiguration=function(t){var e=!0;return t?(t.hasOwnProperty(\"serial\")&&t.serial||(this.logger.err(\"ERROR: you must specify the serial number in which you want to send the measure {serial:XXXXXXX}\"),e=!1),t.hasOwnProperty(\"consentType\")&&t.consentType in o||(this.logger.err(\"ERROR: you must specify the type of measure you want {consentType:'optin|exempted|optout'}\"),e=!1),t.hasOwnProperty(\"measure\")&&t.measure in i||(this.logger.err(\"ERROR: you must specify the type of measure you want {measure:'streaming|page'}\"),e=!1),\"page\"===t.measure&&(this.logger.err(\"Page mode is not supported anymore\"),e=!1),(t.hasOwnProperty(\"multiLevels\")||t.multiLevels)&&(t.hasOwnProperty(\"newLevels\")||t.newLevels)&&(this.logger.err(\"ERROR: you can't specify both newLevels and multiLevels. Only one is allowed.\"),e=!1),t.hasOwnProperty(\"multiLevels\")&&t.multiLevels&&!Array.isArray(t.multiLevels)&&(this.logger.err(\"ERROR: you must provide an array for multiLevels.\"),e=!1),t.measure===i.streaming&&(t.hasOwnProperty(\"streaming\")&&t.streaming?(t.streaming.hasOwnProperty(\"diffusion\")&&t.streaming.diffusion in n||(this.logger.err(\"ERROR: you must specify the diffusion mode\\n\\nvar confStreamingAnalyticsMediametrie = {\\n\\tstreaming:{\\n\\t\\tdiffusion:'live||replay||timeShift'...\\n\\t}\\n}\"),e=!1),t.streaming.hasOwnProperty(\"playerName\")&&t.streaming.playerName||(this.logger.err(\"ERROR: you must specify a name for your player\\n\\nvar confStreamingAnalyticsMediametrie= {\\n\\tstreaming{\\n\\t\\tplayerName:'jwplayer|html5...'\\n\\t}\\n}\"),e=!1),t.streaming.hasOwnProperty(\"streamName\")&&t.streaming.streamName||(this.logger.err(\"ERROR: you must specify a name for your stream\\n\\nvar confStreamingAnalyticsMediametrie= {\\n\\tstreaming{\\n\\t\\tstreamName:'myStream'\\n\\t}\\n}\"),e=!1),t.streaming.diffusion===n.replay&&(t.streaming.hasOwnProperty(\"callbackPosition\")&&t.streaming.callbackPosition||(this.logger.err(\"ERROR: you must specify the position callback\"),e=!1)),t.streaming.diffusion!==n.live||!t.streaming.probe||t.streaming.hasOwnProperty(\"callbackState\")&&t.streaming.callbackState||(this.logger.err(\"ERROR: you must specify the state callback\"),e=!1)):(this.logger.err(\"ERROR: you must specify the streaming informations\\n\\nvar confStreamingAnalyticsMediametrie = {\\n\\tstreaming:{\\n\\t\\tdatas...\\n\\t}\\n}\"),e=!1))):(this.logger.err(\"ERROR: you must pass a JSON object as a parameter to the contructor \\n\\n1 - you have to create a JSON object \\n\\nvar mySettings = {\\n\\tserial:'monSerial',\\n\\t...,\\n\\tlevels:{\\n\\t\\tlevel_1:'mon niveau1'\\n\\t}\\n\\t... \\n}\\n\\n2 - Instantiate the measure object with your JSON object as parameter\\n\\n var monTag = new eStatTag(mySettings);\"),e=!1),e},t.prototype.buildConfiguration=function(t){var e=this.defaultConfiguration();return this.mergeConfiguration(e,t,!1,!0),e.schema=this.schema,e},t.prototype.defaultConfiguration=function(){return{firstParty:!1}},t.prototype.mergeConfiguration=function(t,e,i,n){for(var o in void 0===n&&(n=!1),e)if(e.hasOwnProperty(o))if(e[o]instanceof Object){if(Array.isArray(e[o]))t[o]=e[o];else for(var s in e[o])if(e[o].hasOwnProperty(s)){if(t[o]||(t[o]={}),i&&\"streamName\"===s)continue;t[o][s]=e[o][s]}}else(n||\"measure\"!==o&&\"serial\"!==o)&&(t[o]=e[o])},t}();!function(t){t[t.PLAY=5]=\"PLAY\",t[t.PAUSE=7]=\"PAUSE\",t[t.STOP=12]=\"STOP\"}(h||(h={}));var p,c=function(){function t(t,e,i,n,o){this.argmap={},this.serial=t.serial,this.contextInfos=e,this.buildParameters(t,t.schema),this.argmap.n=Math.round(1e9*Math.random()),this.argmap.cmsPO=i,this.argmap.cmsPS=n,this.argmap.cmsEV=o,t.streaming&&t.streaming.callbackOffset&&(this.argmap.oft=Math.round(t.streaming.callbackOffset()))}return t.prototype.buildURL=function(){var t=this.contextInfos.getInfos();for(var e in this.argmap)this.argmap.hasOwnProperty(e)&&t.push([e,this.argmap[e]]);t.sort((function(t,e){return t[0].localeCompare(e[0])}));for(var i=this.collectUrl+this.serial,n=\"\",o=0;o256&&a.debug(\"WARNING: the maximum number of characters is limited to 256, the sent data will be truncated\"),n+=\"&\"+t[o][0]+\"=\"+s.substring(0,256)}return i+\"?\"+n.substring(1)},t.prototype.set=function(t,e){this.argmap[t]=e},t.prototype.setCollectUrl=function(t){this.collectUrl=t},t.prototype.setSessionID=function(t){this.argmap.cmsVI=t},t.prototype.setSessionNumber=function(t){this.argmap.cmsRK=t},t.prototype.setOldPosition=function(t){this.argmap.cmsOP=t},t.prototype.getState=function(){return this.argmap.cmsPS},t.prototype.setState=function(t){this.argmap.cmsPS=t},t.prototype.getType=function(){return this.argmap.cmsEV},t.prototype.getPosition=function(){return this.argmap.cmsPO},t.prototype.getLogObject=function(){var t={};return this.argmap.cmsEV===p.POLLING?t.event=\"polling\":(t.event=\"state\",t.eventType=h[this.argmap.cmsPS]),t.position=this.argmap.cmsPO,t.duration=this.argmap.cmsDU,t.casting=this.contextInfos.isCastingEnabled(),t.sessionID=this.argmap.cmsVI,t.rank=this.argmap.cmsRK,t},t.prototype.buildParameters=function(t,e){var i=this;for(var n in e)if(e.hasOwnProperty(n)&&t.hasOwnProperty(n))if(e[n].hitName){if(\"mls\"===e[n].hitName){t[n].forEach((function(t,e){i.argmap[\"ml\"+(e+1)]=t}));continue}this.argmap[e[n].hitName]=t[n]}else e[n].hasOwnProperty(\"schema\")&&this.buildParameters(t[n],e[n].schema)},t}();!function(t){t.POLLING=\"polling\",t.STATE=\"state\"}(p||(p={}));var l,f,g=function(){function t(){this.timeout=[],this.status=h.STOP,this.started=!1}return t.prototype.notify=function(t,e){t!==_.play||this.started?t===_.stop&&this.started&&this.stopPolling():this.startPolling()},t.prototype.setStatus=function(t){this.status=t},t.prototype.configurationChange=function(t){this.info=t},t.prototype.stop=function(){this.stopPolling()},t.prototype.setSessionManager=function(t){this.sessionManager=t},t.prototype.snooze=function(){this.stop()},t.prototype.wakeup=function(){this.status===h.STOP||this.started||this.startPolling()},t.prototype.startPolling=function(){var t=this;this.started=!0,this.timeout[0]=window.setTimeout((function(){t.sendPollingHit()}),1e4),this.timeout[1]=window.setTimeout((function(){t.sendPollingHit()}),2e4),this.timeout[2]=window.setTimeout((function(){t.sendPollingHit()}),4e4),this.timeout[3]=window.setInterval((function(){t.sendPollingHit()}),6e4)},t.prototype.stopPolling=function(){for(var t=0;t<3;t++)window.clearTimeout(this.timeout[t]);window.clearInterval(this.timeout[3]),this.timeout=[],this.started=!1},t.prototype.sendPollingHit=function(){!this.info.streaming.diffusion||\"live\"!==this.info.streaming.diffusion&&\"timeshifting\"!==this.info.streaming.diffusion?this.sessionManager.send(this.status,this.info.streaming.callbackPosition(),p.POLLING):this.sessionManager.send(this.status,0,p.POLLING)},t}(),m=function(){function t(){this.status=h.STOP,this.pollingBehavior=new g}return t.prototype.configurationChange=function(t){this.pollingBehavior.configurationChange(t),this.configuration=t},t.prototype.stop=function(){this.pollingBehavior.stop()},t.prototype.setSessionManager=function(t){this.session=t,this.pollingBehavior.setSessionManager(t)},t.prototype.snooze=function(){this.pollingBehavior.snooze()},t.prototype.wakeup=function(){},t}(),d=(l=function(t,e){return l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=e[i])},l(t,e)},function(t,e){if(\"function\"!=typeof e&&null!==e)throw new TypeError(\"Class extends value \"+String(e)+\" is not a constructor or null\");function i(){this.constructor=t}l(t,e),t.prototype=null===e?Object.create(e):(i.prototype=e.prototype,new i)}),y=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return d(e,t),e.prototype.notify=function(t,e){switch(this.pollingBehavior.notify(t,e),t){case _.play:if(this.status===h.PLAY)return;this.status=h.PLAY;break;case _.pause:if(this.status===h.PAUSE)return;this.status=h.PAUSE;break;case _.stop:if(this.status===h.STOP)return;this.status=h.STOP}this.pollingBehavior.setStatus(this.status),this.session.send(this.status,0,p.STATE)},e.prototype.stop=function(){this.notify(_.stop,0),this.pollingBehavior.stop()},e}(m),v=function(){function t(){this.playing=!1,this.liveBehavior=new y;var t=this;this.probeHandle=window.setInterval((function(){return t.probe()}),1e3)}return t.prototype.setSessionManager=function(t){this.liveBehavior.setSessionManager(t)},t.prototype.notify=function(t,e){t===_.stop?(this.liveBehavior.notify(t,0),this.playing=!1):a.debug(r)},t.prototype.configurationChange=function(t){return this.configuration=t,this.liveBehavior.configurationChange(t),\"\"},t.prototype.stop=function(){this.liveBehavior.stop(),window.clearInterval(this.probeHandle)},t.prototype.snooze=function(){this.liveBehavior.notify(_.stop,0),this.playing=!1,this.liveBehavior.snooze(),window.clearInterval(this.probeHandle)},t.prototype.wakeup=function(){this.liveBehavior.wakeup();var t=this;window.clearInterval(this.probeHandle),this.probeHandle=window.setInterval((function(){return t.probe()}),1e3)},t.prototype.probe=function(){if(this.configuration.streaming.callbackState){var t=this.configuration.streaming.callbackState();this.playing&&_.play!==t?(this.playing=!1,this.liveBehavior.notify(_.stop,0)):this.playing||_.play!==t||(this.playing=!0,this.liveBehavior.notify(_.play,0))}},t}(),b=function(){var t=function(e,i){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=e[i])},t(e,i)};return function(e,i){if(\"function\"!=typeof i&&null!==i)throw new TypeError(\"Class extends value \"+String(i)+\" is not a constructor or null\");function n(){this.constructor=e}t(e,i),e.prototype=null===i?Object.create(i):(n.prototype=i.prototype,new n)}}(),w=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return b(e,t),e.prototype.notify=function(t,e){switch(this.pollingBehavior.notify(t,e),t){case _.play:if(this.status===h.PLAY)return;this.status=h.PLAY;break;case _.pause:if(this.status===h.PAUSE)return;this.status=h.PAUSE;break;case _.stop:if(this.status===h.STOP)return;this.status=h.STOP}this.pollingBehavior.setStatus(this.status),this.session.send(this.status,e,p.STATE)},e.prototype.configurationChange=function(t){this.pollingBehavior.configurationChange(t),this.configuration=t},e.prototype.stop=function(){this.notify(_.stop,this.configuration.streaming.callbackPosition()),this.pollingBehavior.stop()},e.prototype.setSessionManager=function(t){this.session=t,this.pollingBehavior.setSessionManager(t)},e}(m),S=function(){function t(){this.replayBehavior=new w;var t=this;this.playing=!1,this.lastPos=0,this.lastCall=0,this.probeHandle=window.setInterval((function(){return t.probe()}),1e3)}return t.prototype.setSessionManager=function(t){this.sessionManager=t,this.replayBehavior.setSessionManager(t)},t.prototype.notify=function(t,e){t===_.stop?(this.lastPos=e,this.playing=!1,this.replayBehavior.notify(t,e)):a.debug(r)},t.prototype.configurationChange=function(t){this.info=t,this.replayBehavior.configurationChange(t)},t.prototype.stop=function(){window.clearInterval(this.probeHandle),this.replayBehavior.stop()},t.prototype.snooze=function(){this.replayBehavior.notify(_.pause,this.lastPos),this.playing=!1,this.replayBehavior.snooze(),window.clearInterval(this.probeHandle)},t.prototype.wakeup=function(){this.replayBehavior.wakeup();var t=this;window.clearInterval(this.probeHandle),this.probeHandle=window.setInterval((function(){return t.probe()}),1e3)},t.prototype.probe=function(){var t=this.lastPos,e=this.lastCall;this.lastPos=this.info.streaming.callbackPosition(),this.lastCall=(new Date).getTime();var i=1,n=0;0!==e&&(n=this.lastPos-t,i=(this.lastCall-e)/1e3),this.playing?n>i+.9||n<0?(this.replayBehavior.notify(_.pause,t),this.replayBehavior.notify(_.play,this.lastPos)):0===n&&(this.replayBehavior.notify(_.pause,this.lastPos),this.playing=!1):n>0&&n<=i+.9&&(this.replayBehavior.notify(_.play,t),this.playing=!0)},t}(),P=function(){function t(){this.liveMode=!0,this.playing=!1,this.liveBehavior=new y,this.replayBehavior=new w}return t.prototype.setSessionManager=function(t){this.liveBehavior.setSessionManager(t),this.replayBehavior.setSessionManager(t)},t.prototype.notify=function(t,e){this.liveMode?t===_.pause?(this.liveMode=!1,this.liveBehavior.notify(_.stop,e)):this.liveBehavior.notify(t,e):(t===_.stop&&(this.liveMode=!0),this.replayBehavior.notify(t,e))},t.prototype.configurationChange=function(t){return this.configuration=t,this.liveBehavior.configurationChange(t),this.replayBehavior.configurationChange(t),\"\"},t.prototype.stop=function(){this.liveBehavior.stop(),this.replayBehavior.stop()},t.prototype.snooze=function(){this.liveBehavior.snooze(),this.replayBehavior.snooze()},t.prototype.wakeup=function(){this.liveBehavior.wakeup(),this.replayBehavior.wakeup()},t}(),R=function(t,e){void 0===e&&(e=null),this.hitname=t,this.value=e};!function(t){t.banner=\"banner\",t.blog=\"blog\",t.email=\"email\",t.link=\"link\",t.search=\"search\",t.social=\"social\"}(f||(f={}));var O,C=function(){function t(t,e,i){void 0===i&&(i=null),this.args={},this.isCasting=!1,this.casting=\"cs\",this.userDomain=i,this.implementation=t,this.consentType=e,this.args.hitFormatVersion=new R(\"cmsMV\",\"6\"),this.args.domain=new R(\"dom\"),this.args.encoding=new R(\"enc\"),this.args.origin=new R(\"o\"),this.args.screenColorDepth=new R(\"scp\"),this.args.screenHeigth=new R(\"sch\"),this.args.screenWidth=new R(\"scw\"),this.args.tagName=new R(\"tn\",\"TS\"),this.args.version=new R(\"v\",\"7.3.1\"),this.args.viewportHeigth=new R(\"vh\"),this.args.viewportWidth=new R(\"vw\"),this.generateParams()}return t.prototype.getInfos=function(){var t=[];for(var e in this.isCasting?t.push([this.casting,\"1\"]):t.push([this.casting,\"0\"]),this.args)null!=this.args[e]&&null!==this.args[e].value&&\"\"!==this.args[e].value&&this.args[e]instanceof R&&t.push([this.args[e].hitname,this.args[e].value]);return t},t.prototype.update=function(){return this.args.domain.value=this.getDomain(),this.args.origin.value=this.getOriginIfAllowed(),o.optin===this.consentType?this.extractCampaignInformation():this.forgetCampaignInformation(),this.getInfos()},t.prototype.setCast=function(t){this.isCasting=t},t.prototype.isCastingEnabled=function(){return this.isCasting},t.prototype.setImplementation=function(t){this.implementation=t},t.prototype.setConsentType=function(t){this.consentType=t},t.prototype.generateParams=function(){this.args.domain.value=this.getDomain(),this.args.encoding.value=document.characterSet||document.charset,this.args.origin.value=this.getOriginIfAllowed(),screen&&(screen.colorDepth&&(this.args.screenColorDepth.value=screen.colorDepth.toString()),screen.height&&(this.args.screenHeigth.value=screen.height.toString()),screen.width&&(this.args.screenWidth.value=screen.width.toString())),this.args.viewportHeigth.value=String(window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight||0),this.args.viewportWidth.value=String(window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth||0).toString(),o.optin===this.consentType&&this.extractCampaignInformation()},t.prototype.getDomain=function(){return null!=this.userDomain&&\"\"!==this.userDomain?this.userDomain:\"frame\"===this.implementation?this.getParentDomain():document.domain},t.prototype.getParentDomain=function(){var t=(window.location!==window.parent.location?document.referrer:document.location).toString(),e=t.replace(/^https?:\\/\\//,\"\").split(\"/\");return t[0].match(/:/g)?e[0].split(\":\")[0]:e[0]},t.prototype.getOrigin=function(){var t,e=document.URL;switch(this.implementation){case\"frame\":e.match(/ifrmref=/g)?e.match(/ifrmref=([^&]+)/g)?t=decodeURIComponent(e.match(/ifrmref=([^&]+)/g)[0].split(\"=\")[1]):(a.err(\"Origin is not correctly defined\"),t=this.getParentDomain()):t=this.getParentDomain();break;case\"redirection\":t=this.getOriginRedirected();break;default:t=document.referrer}return this.extractFQDNFromGivenUrl(t)},t.prototype.getOriginIfAllowed=function(){return o.optin===this.consentType?this.getOrigin():null},t.prototype.extractFQDNFromGivenUrl=function(t){if(!t.startsWith(\"http://\")&&!t.startsWith(\"https://\"))return t.toString();var e=document.createElement(\"a\");return e.href=t.toString(),e.hostname},t.prototype.getOriginRedirected=function(){for(var t=\"\",e=document.cookie.split(\":\"),i=0;i boolean = (seriesScheduledRecording) => {\n if (seriesScheduledRecording) {\n const { description } = seriesScheduledRecording;\n const { toUtc } = ((description: any): NETGEM_API_V8_SCHEDULED_RECORDING_DESCRIPTION_SERIES);\n if (!toUtc || new Date(toUtc) > AccurateTimestamp.nowAsDate()) {\n return true;\n }\n }\n\n return false;\n};\n\nconst hasRunningSeriesScheduledRecording: (seriesId: Undefined, npvrScheduledRecordingsList: NETGEM_SCHEDULED_RECORDINGS_MAP) => boolean = (seriesId, npvrScheduledRecordingsList) => {\n if (seriesId) {\n const { [seriesId]: seriesScheduledRecording } = npvrScheduledRecordingsList;\n return isSeriesScheduledRecordingRunning(seriesScheduledRecording);\n }\n\n return false;\n};\n\nexport { hasRunningSeriesScheduledRecording, isSeriesScheduledRecordingRunning };\n","/* @flow */\n\nexport class PlayerError extends Error {\n code: ?string;\n\n constructor(code: string, message?: string) {\n super(message);\n\n this.code = code;\n }\n\n // $FlowFixMe: Flow does not support symbols yet\n get [Symbol.toStringTag]() {\n return 'PlayerError';\n }\n}\n","/* @flow */\n\nimport AccurateTimestamp from '../dateTime/AccurateTimestamp';\nimport { MILLISECONDS_PER_SECOND } from '../dateTime/Format';\n\nexport type CACHE_TYPE = {|\n [string]: {|\n input: any,\n output: any,\n |},\n|};\n\nconst getHashFromDate: (items: $ReadOnlyArray<{ date: string }>) => string | null = (items) => {\n if (!items) {\n return null;\n }\n\n return items.map((item) => item.date).join();\n};\n\nconst getCacheExpirationTime: (maxAge: ?number) => number = (maxAge) => {\n const now = AccurateTimestamp.now();\n return maxAge ? now + maxAge * MILLISECONDS_PER_SECOND : now;\n};\n\nexport { getCacheExpirationTime, getHashFromDate };\n","/* @flow */\n\nexport enum SubtitlesSize {\n Big = 'big',\n Medium = 'medium',\n Small = 'small',\n}\n\nconst SUBTITLES_SIZE_BIG = 0.85;\nconst SUBTITLES_SIZE_MEDIUM = 0.7;\nconst SUBTITLES_SIZE_SMALL = 0.55;\n\n// eslint-disable-next-line consistent-return\nexport const getCoeffFromSubtitlesSize = (size: SubtitlesSize): number => {\n switch (size) {\n case SubtitlesSize.Big:\n return SUBTITLES_SIZE_BIG;\n case SubtitlesSize.Small:\n return SUBTITLES_SIZE_SMALL;\n case SubtitlesSize.Medium:\n return SUBTITLES_SIZE_MEDIUM;\n\n // No default\n }\n};\n\nexport enum SubtitlesBGColor {\n Yellow = 'yellow',\n White = 'white',\n}\n","/* @flow */\n\nexport enum Setting {\n AutoOpenPlayerDebugPanel = 'autoOpenPlayerDebugPanel',\n AutoResume = 'autoResume',\n AutoSelectAudioTrack = 'autoSelectAudioTrack',\n AutoSelectSubtitlesTrack = 'autoSelectSubtitlesTrack',\n BufferBehind = 'bufferBehind',\n BufferingGoal = 'bufferingGoal',\n GreenStreaming = 'greenStreaming',\n LastAudioTrack = 'lastAudioTrack',\n LastSubtitlesTrack = 'lastSubtitlesTrack',\n RebufferingGoal = 'rebufferingGoal',\n SubtitlesBGColor = 'subtitlesBgColor',\n SubtitlesSize = 'subtitlesSize',\n Volume = 'volume',\n}\n\nexport type Settings = {| [Setting]: any |};\n\n/*\n * Available subtitles colors (defined in CSS):\n * - whiteOnTransparent\n * - whiteOnTranslucentBlack\n * - whiteOnBlack\n * - yellowOnTransparent\n * - yellowOnTranslucentBlack\n * - yellowOnBlack\n * - blackOnWhite\n * - blackOnTranslucentWhite\n */\n","/* @flow */\n\nimport type { NETGEM_API_V8_FEED_ITEM } from '../../../libs/netgemLibrary/v8/types/FeedItem';\nimport type { NETGEM_API_V8_HUB } from '../../../libs/netgemLibrary/v8/types/Hub';\nimport type { NETGEM_API_V8_LANG } from '../../../libs/netgemLibrary/v8/types/Lang';\n\nexport enum AvenueType {\n Explore,\n Myvideos,\n Other,\n Regular,\n Search,\n}\n\nexport type BASE_AVENUE_TYPE = {|\n index: number,\n type: AvenueType,\n|};\n\nexport type NAVIGATION_AVENUE_TYPE = {|\n ...BASE_AVENUE_TYPE,\n title: Array,\n|};\n\nexport type FOCUSED_AVENUE_TYPE = {|\n ...BASE_AVENUE_TYPE,\n hub?: NETGEM_API_V8_HUB,\n hubItem?: NETGEM_API_V8_FEED_ITEM,\n searchString?: string,\n|};\n","/* @flow */\n\nimport type { ScrollOptions } from './types';\n\nconst isTabHidden: () => ?boolean = () => {\n let isHidden: ?boolean = null;\n\n if (document.hidden !== undefined) {\n isHidden = document.hidden;\n // $FlowFixMe\n } else if (document.mozHidden !== undefined) {\n // $FlowFixMe\n isHidden = document.mozHidden;\n // $FlowFixMe\n } else if (document.msHidden !== undefined) {\n // $FlowFixMe\n isHidden = document.msHidden;\n // $FlowFixMe\n } else if (document.webkitHidden !== undefined) {\n // $FlowFixMe\n isHidden = document.webkitHidden;\n }\n\n return typeof isHidden === 'boolean' ? isHidden : null;\n};\n\nconst smoothScrollIntoView: (container: HTMLElement, element: HTMLElement, options: ScrollOptions) => Promise = (container, element, options) =>\n new Promise((resolve) => {\n const FRAME_COUNT_THRESHOLD = 2;\n let same = 0;\n let lastPosTop = container.scrollTop;\n\n const checkForScrollEnd = () => {\n const newPosTop = container.scrollTop;\n\n if (newPosTop === lastPosTop) {\n same += 1;\n if (same > FRAME_COUNT_THRESHOLD) {\n resolve();\n }\n } else {\n same = 0;\n lastPosTop = newPosTop;\n }\n\n requestAnimationFrame(checkForScrollEnd);\n };\n\n element.scrollIntoView({\n ...options,\n behavior: 'smooth',\n });\n requestAnimationFrame(checkForScrollEnd);\n });\n\nexport { isTabHidden, smoothScrollIntoView };\n","/* @flow */\n\nimport { TileConfigTileType } from '../../libs/netgemLibrary/v8/types/WidgetConfig';\nimport { getAppCss } from '../applicationCustomization/ui';\n\n// Default max bitrate for green streaming when no value is given in app conf (in Mbps)\nexport const DEFAULT_MAX_BITRATE = 3.5;\n\n// Amount of time to skip backward or forward (in seconds)\nexport const SKIP_DURATION_LEVEL0 = 10;\nexport const SKIP_DURATION_LEVEL1 = 30;\nexport const SKIP_DURATION_LEVEL2 = 60;\n\nexport type SkipDuration = -60 | -30 | -10 | 10 | 30 | 60;\n\n// Background image of card\nexport const CARD_BACKGROUND_IMAGE_WIDTH = 1920;\nexport const CARD_BACKGROUND_IMAGE_HEIGHT = 1080;\n\n// Carousel image\nexport const CAROUSEL_BACKGROUND_IMAGE_WIDTH = 1920;\nexport const CAROUSEL_BACKGROUND_IMAGE_HEIGHT = 1080;\n\nexport const AVENUE_HEADER_WIDTH = 1920;\nexport const AVENUE_HEADER_HEIGHT = 1080;\n\nexport const HUB_IMAGE_WIDTH = 400;\nexport const HUB_IMAGE_HEIGHT = 64;\n\n// Used to retrieve CSS variables defined at :root level\nconst styles = window.getComputedStyle(document.documentElement);\n\nconst getCssNumber = (name: string): number => parseInt(styles.getPropertyValue(name), 10);\nconst getCssString = (name: string): string => styles.getPropertyValue(name);\n\nexport const BUTTON_HOVER_COLORS: {| Cursor: string, Main: string |} = {\n Cursor: '#CE1866',\n Main: '#FE4E1E',\n};\n\n// All constants below are retrieved from CSS, through custom variables\n\n// Imports app-specific CSS\ngetAppCss().then(() => {\n // Hover button colors\n BUTTON_HOVER_COLORS.Cursor = getCssString('--button-hover-cursor');\n BUTTON_HOVER_COLORS.Main = getCssString('--button-hover-main');\n});\n\n// Tile type = gemtv\nexport const TV_TILE_WIDTH: number = getCssNumber('--tile-gemtv-image-width-u');\nexport const TV_TILE_WIDTH_PLUS_MARGIN: number = TV_TILE_WIDTH + getCssNumber('--tile-gemtv-horizontal-space-u');\n\n// Tile type = portrait\nexport const VOD_TILE_WIDTH: number = getCssNumber('--tile-portrait-image-width-u');\nexport const VOD_TILE_HEIGHT: number = getCssNumber('--tile-portrait-image-height-u');\nconst VOD_TILE_WIDTH_PLUS_MARGIN = VOD_TILE_WIDTH + getCssNumber('--tile-portrait-horizontal-space-u');\n\n// Tile type = deeplink\nconst DEEPLINK_TILE_WIDTH_PLUS_MARGIN: number = getCssNumber('--tile-deeplink-image-width-u') + getCssNumber('--tile-deeplink-horizontal-space-u');\n\n// Tile type = deeplink.3x1\nconst DEEPLINK_3X1_TILE_WIDTH_PLUS_MARGIN: number = getCssNumber('--tile-deeplink-3x1-image-width-u') + getCssNumber('--tile-deeplink-3x1-horizontal-space-u');\n\n// Tile type = deeplink.5x1\nconst DEEPLINK_5X1_TILE_WIDTH_PLUS_MARGIN: number = getCssNumber('--tile-deeplink-5x1-image-width-u') + getCssNumber('--tile-deeplink-5x1-horizontal-space-u');\n\n// Tile type = landscape.big\nconst LANDSCAPE_BIG_TILE_WIDTH_PLUS_MARGIN: number = getCssNumber('--tile-landscape-big-image-width-u') + getCssNumber('--tile-landscape-big-horizontal-space-u');\n\n// Tile type = landscape.vod\nconst LANDSCAPE_VOD_TILE_WIDTH_PLUS_MARGIN: number = getCssNumber('--tile-landscape-vod-image-width-u') + getCssNumber('--tile-landscape-vod-horizontal-space-u');\n\nexport const NPVR_TV_TILE_WIDTH: number = getCssNumber('--npvr-tv-image-width-u');\nexport const NPVR_TV_TILE_HEIGHT: number = getCssNumber('--npvr-tv-image-height-u');\n\nexport const CHANNEL_GROUP_TILE_WIDTH: number = getCssNumber('--tile-channel-group-image-width-u');\nexport const CHANNEL_GROUP_TILE_HEIGHT: number = getCssNumber('--tile-channel-group-image-height-u');\nconst CHANNEL_GROUP_TILE_WIDTH_PLUS_MARGIN = CHANNEL_GROUP_TILE_WIDTH + getCssNumber('--tile-channel-group-horizontal-space-u');\n\nexport const CHANNEL_GROUP_BIG_TILE_WIDTH: number = getCssNumber('--tile-channel-group-big-image-width-u');\nexport const CHANNEL_GROUP_BIG_TILE_HEIGHT: number = getCssNumber('--tile-channel-group-big-image-height-u');\nconst CHANNEL_GROUP_BIG_TILE_WIDTH_PLUS_MARGIN = CHANNEL_GROUP_BIG_TILE_WIDTH + getCssNumber('--tile-channel-group-big-horizontal-space-u');\n\nexport const CHANNEL_IMAGE_WIDTH: number = getCssNumber('--channel-image-width-u');\nexport const CHANNEL_IMAGE_HEIGHT: number = getCssNumber('--channel-image-height-u');\n\nexport const CONFLICT_CHANNEL_IMAGE_WIDTH: number = getCssNumber('--conflict-channel-image-width-u');\nexport const CONFLICT_CHANNEL_IMAGE_HEIGHT: number = getCssNumber('--conflict-channel-image-height-u');\n\nexport const TILE_CHANNEL_IMAGE_WIDTH: number = getCssNumber('--tile-channel-logo-width-u');\nexport const TILE_CHANNEL_IMAGE_HEIGHT: number = getCssNumber('--tile-channel-logo-height-u');\nconst TILE_CHANNEL_IMAGE_WIDTH_PLUS_MARGIN = CHANNEL_GROUP_TILE_WIDTH + getCssNumber('--tile-channel-horizontal-space-u');\n\nexport const AVENUE_IMAGE_WIDTH: number = getCssNumber('--avenue-image-width-u');\nexport const AVENUE_IMAGE_HEIGHT: number = getCssNumber('--avenue-image-height-u');\n\nexport const TILE_SYNOPSIS_LINE_HEIGHT: number = getCssNumber('--tile-synopsis-line-height-u');\nexport const TILE_SYNOPSIS_TAGLINE_LINE_HEIGHT: number = getCssNumber('--tile-synopsis-tagline-line-height-u');\n\nexport const BURGER_WIDTH: number = getCssNumber('--burger-width-u');\n\n// eslint-disable-next-line consistent-return\nconst getTileWidthPlusMargin = (tileType?: TileConfigTileType): number => {\n if (tileType === undefined) {\n return 0;\n }\n\n switch (tileType) {\n case TileConfigTileType.Channel:\n return TILE_CHANNEL_IMAGE_WIDTH_PLUS_MARGIN;\n case TileConfigTileType.ChannelGroup:\n return CHANNEL_GROUP_TILE_WIDTH_PLUS_MARGIN;\n case TileConfigTileType.ChannelGroupBig:\n return CHANNEL_GROUP_BIG_TILE_WIDTH_PLUS_MARGIN;\n case TileConfigTileType.ChannelGroupBigFill:\n return CHANNEL_GROUP_BIG_TILE_WIDTH_PLUS_MARGIN;\n case TileConfigTileType.ChannelGroupFill:\n return CHANNEL_GROUP_TILE_WIDTH_PLUS_MARGIN;\n case TileConfigTileType.Deeplink:\n return DEEPLINK_TILE_WIDTH_PLUS_MARGIN;\n case TileConfigTileType.Deeplink3x1:\n return DEEPLINK_3X1_TILE_WIDTH_PLUS_MARGIN;\n case TileConfigTileType.Deeplink5x1:\n return DEEPLINK_5X1_TILE_WIDTH_PLUS_MARGIN;\n case TileConfigTileType.Gemtv:\n return TV_TILE_WIDTH_PLUS_MARGIN;\n case TileConfigTileType.GemtvBig:\n return LANDSCAPE_BIG_TILE_WIDTH_PLUS_MARGIN;\n case TileConfigTileType.GemtvMedium:\n return TV_TILE_WIDTH_PLUS_MARGIN;\n case TileConfigTileType.Landscape:\n return TV_TILE_WIDTH_PLUS_MARGIN;\n case TileConfigTileType.LandscapeBig:\n return LANDSCAPE_BIG_TILE_WIDTH_PLUS_MARGIN;\n case TileConfigTileType.LandscapeVod:\n return LANDSCAPE_VOD_TILE_WIDTH_PLUS_MARGIN;\n case TileConfigTileType.Portrait:\n return VOD_TILE_WIDTH_PLUS_MARGIN;\n\n // No default\n }\n};\n\nexport const EPG = Object.freeze({\n // EPG for all channels is retrieved by chunks to avoid missing programs\n ChannelChunkSize: 20,\n // Range of loaded live feed EPG (3 hours in milliseconds)\n FeedRange: 10_800_000,\n // Cached live feed is updated every 10 minutes (in milliseconds)\n IntervalCachedLiveFeed: 600_000,\n // Live feed is updated every 10 seconds (in milliseconds)\n IntervalLiveFeedEpgReady: 10_000,\n // Live feed is updated every 100 milliseconds when EPG manager is refreshing (in milliseconds)\n IntervalLiveFeedEpgRefreshing: 100,\n // How long the live feed EPG go back in time (2 hours in milliseconds)\n RewindPeriod: 7_200_000,\n});\n\nexport { getTileWidthPlusMargin };\n","/* @flow */\n\nimport type { NETGEM_API_V8_METADATA_PROGRAM } from '../../../libs/netgemLibrary/v8/types/MetadataProgram';\nimport type { NETGEM_API_V8_METADATA_SCHEDULE } from '../../../libs/netgemLibrary/v8/types/MetadataSchedule';\nimport type { NETGEM_API_V8_PURCHASE_INFO } from '../../../libs/netgemLibrary/v8/types/PurchaseInfo';\n\nconst getDistributorId = (\n vodLocations: Array | null,\n purchaseInfo?: NETGEM_API_V8_PURCHASE_INFO | null,\n programMetadata?: NETGEM_API_V8_METADATA_PROGRAM | null\n): string | null => {\n if (purchaseInfo && purchaseInfo.length > 0) {\n return purchaseInfo[0].settings.distributorId;\n }\n\n if (programMetadata?.providerInfo?.distributorId) {\n return programMetadata?.providerInfo?.distributorId ?? null;\n }\n\n if (vodLocations && vodLocations.length > 0) {\n return vodLocations[0].location.providerInfo?.distributorId ?? null;\n }\n\n return null;\n};\n\nexport { getDistributorId };\n","/* @flow */\n\nimport { ItemType, type NETGEM_API_V8_FEED_ITEM } from '../../../libs/netgemLibrary/v8/types/FeedItem';\nimport type { NETGEM_API_V8_METADATA_PROGRAM, NETGEM_API_V8_METADATA_SERIES } from '../../../libs/netgemLibrary/v8/types/MetadataProgram';\nimport { type NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE, TileConfigTileType } from '../../../libs/netgemLibrary/v8/types/WidgetConfig';\nimport type { CARD_DATA_MODAL_TYPE } from '../../../components/modal/cardModal/CardModalConstsAndTypes';\nimport type { NETGEM_API_V8_AUTHENT_REALM } from '../../../libs/netgemLibrary/v8/types/Realm';\n\nexport enum ExtendedItemType {\n OfflineContent,\n Trailer,\n TV,\n VOD,\n}\n\nexport type EXTENDED_ITEM = {|\n authority?: NETGEM_API_V8_AUTHENT_REALM,\n cardData?: CARD_DATA_MODAL_TYPE | null,\n distributorId?: string | null,\n item: NETGEM_API_V8_FEED_ITEM,\n locationId?: string,\n onItemClick?: NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE,\n openFromCard?: boolean,\n previewCatchupScheduledEventId?: string | null,\n programMetadata?: NETGEM_API_V8_METADATA_PROGRAM | null,\n seriesMetadata?: NETGEM_API_V8_METADATA_SERIES | null,\n tileType?: TileConfigTileType,\n type: ExtendedItemType,\n viewingHistoryId?: string | null,\n vtiId?: number | null,\n|};\n\nexport const FAKE_EPG_LIVE_ITEM_TYPE: ItemType = ItemType.FakeItem;\nexport const FAKE_LIVE_CHANNEL_ITEM_TYPE: ItemType = ItemType.Channel;\n\nexport const FAKE_EPG_LIVE_PREFIX = `${(FAKE_EPG_LIVE_ITEM_TYPE: string)}://`;\nexport const FAKE_LIVE_CHANNEL_PREFIX = `${(FAKE_LIVE_CHANNEL_ITEM_TYPE: string)}://`;\n","/* @flow */\n\nimport { LANGUAGE } from './metadata/Types';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport type { ShakaTrack } from '../../components/player/implementation/shakaTypes';\nimport type { VideoPlayerMediaInfo } from '../../components/player/implementation/types';\n\nconst HEARING_IMPAIRED_CODE = 'HI';\nconst CAPTION = 'caption';\nexport const CAPTIONS = 'captions';\nexport const SUBTITLES = 'subtitles';\n\n// Parameter 'code' can be any unicode language Id (see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DisplayNames/of#code)\nconst convertToHumanReadable = (code: string): string => {\n // Special case\n const ucCode = code.toUpperCase();\n if (ucCode === LANGUAGE.OriginalVersion) {\n return Localizer.localize('player.language.qaa');\n }\n if (ucCode === LANGUAGE.VisuallyImpaired || ucCode === LANGUAGE.VisuallyImpairedAlt) {\n return Localizer.localize('player.language.qad');\n }\n\n // General case\n try {\n // $FlowFixMe: missing API definition for DisplayNames\n const languageNames = new Intl.DisplayNames([Localizer.language], { type: 'language' });\n return languageNames.of(code);\n } catch {\n return code;\n }\n};\n\nconst isCaptionInArray = (array?: Array): boolean => {\n if (!array) {\n return false;\n }\n\n return array.some((element) => element.toLowerCase().indexOf(CAPTION) > -1);\n};\n\nconst isHearingImpairedSubtitlesTrack = (track: VideoPlayerMediaInfo | ShakaTrack | null): boolean => {\n if (!track) {\n return false;\n }\n\n const { accessibility, accessibilityPurpose, kind, roles } = track;\n return (accessibilityPurpose?.toLowerCase() === 'hard of hearing' || isCaptionInArray(accessibility) || isCaptionInArray(roles) || kind?.toLowerCase() === CAPTIONS) ?? false;\n};\n\nconst isVisuallyImpairedAudioTrack = (track: VideoPlayerMediaInfo | null): boolean => {\n if (!track) {\n return false;\n }\n\n const { lang } = track;\n const ucLang = lang.toUpperCase();\n return ucLang === LANGUAGE.VisuallyImpaired || ucLang === LANGUAGE.VisuallyImpairedAlt;\n};\n\nconst getAudioSettingCode = (track: VideoPlayerMediaInfo): string => {\n const { lang } = track;\n\n return lang;\n};\n\nconst getSubtitlesSettingCode = (track: VideoPlayerMediaInfo | null): string => {\n if (!track) {\n return '';\n }\n\n const { lang } = track;\n\n if (isHearingImpairedSubtitlesTrack(track)) {\n return `${lang}:${HEARING_IMPAIRED_CODE}`;\n }\n\n return lang;\n};\n\n/*\n * Find and return the track matching the given language code or the closest one, e.g.:\n * - languageCode=fr -> fr track > fr hearing impaired track > null\n * - languageCode=fr:HI -> fr hearing impaired track > fr track > null\n */\nconst getSubtitlesTrackFromCode = (tracks: Array, languageCode: string): VideoPlayerMediaInfo | null => {\n if (tracks.length === 0) {\n return null;\n }\n\n const [language, isHearingImpaired] = languageCode.split(':');\n\n const hearingImpairedFunc = isHearingImpaired ? (track: VideoPlayerMediaInfo) => isHearingImpairedSubtitlesTrack(track) : (track) => !isHearingImpairedSubtitlesTrack(track);\n const requestedLanguageTracks = tracks.filter((track) => track.lang === language);\n\n const exactRequestedLanguage = requestedLanguageTracks.find((track) => hearingImpairedFunc(track));\n if (exactRequestedLanguage) {\n // Exact language has been found (e.g. \"fr\" or \"fr hearing impaired\")\n return exactRequestedLanguage;\n }\n\n const closestRequestedLanguage = requestedLanguageTracks.find((track) => !hearingImpairedFunc(track));\n if (closestRequestedLanguage) {\n // Closest language has been found (e.g. \"fr\" for \"fr hearing impaired\" or \"fr hearing impaired\" for \"fr\")\n return closestRequestedLanguage;\n }\n\n // No matching track was found\n return null;\n};\n\nexport { convertToHumanReadable, getAudioSettingCode, getSubtitlesSettingCode, getSubtitlesTrackFromCode, isHearingImpairedSubtitlesTrack, isVisuallyImpairedAudioTrack };\n","/* @flow */\n\nimport { FAKE_EPG_LIVE_PREFIX, FAKE_LIVE_CHANNEL_PREFIX } from '../item/types';\nimport { type NETGEM_API_V8_AUTHENT_REALM, NETGEM_API_V8_AUTHENT_REALM_NETGEM } from '../../../libs/netgemLibrary/v8/types/Realm';\nimport {\n type NETGEM_API_V8_FEED_ITEM,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_APP,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_CATCHUP,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_EST,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_SVOD,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_TVOD,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_VOD,\n} from '../../../libs/netgemLibrary/v8/types/FeedItem';\nimport { getAvailabilityEndTimeOrDefault, getAvailabilityStartTimeOrDefault } from '../../videofutur/metadata';\nimport AccurateTimestamp from '../../dateTime/AccurateTimestamp';\nimport { MILLISECONDS_PER_SECOND } from '../../dateTime/Format';\nimport { getLocationType } from '../../../libs/netgemLibrary/v8/helpers/Item';\nimport { getStartAndEndTimes } from '../metadata/Format';\n\nexport enum WebAppHelpersLocationStatus {\n App = 'app',\n Catchup = 'catchup',\n Future = 'future',\n Live = 'live',\n Past = 'past',\n Preview = 'preview',\n Recording = 'recording',\n Vod = 'vod',\n}\n\nexport enum BroadcastStatus {\n Future,\n Live,\n Past,\n Preview,\n Unknown,\n}\n\nconst getLocationStatusInternal: (item: NETGEM_API_V8_FEED_ITEM) => WebAppHelpersLocationStatus | null = (item) => {\n const { locType, startTime, endTime } = item;\n\n const now = AccurateTimestamp.nowInSeconds();\n\n switch (locType) {\n case NETGEM_API_V8_ITEM_LOCATION_TYPE_APP:\n return WebAppHelpersLocationStatus.App;\n\n case NETGEM_API_V8_ITEM_LOCATION_TYPE_CATCHUP:\n return WebAppHelpersLocationStatus.Catchup;\n\n case NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING:\n return WebAppHelpersLocationStatus.Recording;\n\n case NETGEM_API_V8_ITEM_LOCATION_TYPE_EST:\n case NETGEM_API_V8_ITEM_LOCATION_TYPE_SVOD:\n case NETGEM_API_V8_ITEM_LOCATION_TYPE_TVOD:\n case NETGEM_API_V8_ITEM_LOCATION_TYPE_VOD:\n return WebAppHelpersLocationStatus.Vod;\n\n default:\n // NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT\n if (startTime <= now && now < endTime) {\n return WebAppHelpersLocationStatus.Live;\n } else if (startTime > now) {\n return WebAppHelpersLocationStatus.Future;\n } else if (endTime < now) {\n return WebAppHelpersLocationStatus.Past;\n }\n break;\n }\n\n return null;\n};\n\nconst getLocationStatus: (item: NETGEM_API_V8_FEED_ITEM, authority?: NETGEM_API_V8_AUTHENT_REALM) => WebAppHelpersLocationStatus | null = (item, authority) => {\n const { selectedProgramId } = item;\n\n if (selectedProgramId.startsWith(FAKE_EPG_LIVE_PREFIX) || selectedProgramId.startsWith(FAKE_LIVE_CHANNEL_PREFIX)) {\n // Live program without info (missing PTF channel)\n return WebAppHelpersLocationStatus.Live;\n }\n\n const locationStatus = getBroadcastStatus(item) === BroadcastStatus.Live ? WebAppHelpersLocationStatus.Live : getLocationStatusInternal(item);\n\n if (locationStatus === WebAppHelpersLocationStatus.Vod && authority === NETGEM_API_V8_AUTHENT_REALM_NETGEM) {\n return WebAppHelpersLocationStatus.Catchup;\n }\n\n return locationStatus;\n};\n\n// Parameter 'now' is in seconds\nconst getBroadcastStatus: (item: NETGEM_API_V8_FEED_ITEM, now: ?number) => BroadcastStatus = (item, now) => {\n const { locType } = item;\n\n if (locType !== NETGEM_API_V8_ITEM_LOCATION_TYPE_CATCHUP && locType !== NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT && locType !== NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING) {\n return BroadcastStatus.Unknown;\n }\n\n const { endTime, startTime } = getStartAndEndTimes(item);\n const status = getBroadcastStatusFromTimes(startTime, endTime, now);\n\n if (status === BroadcastStatus.Future && locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_CATCHUP) {\n // Case of a catchup being available before the first broadcast\n const {\n selectedLocation: { availabilityEndDate, availabilityStartDate },\n } = item;\n const localNow = (now || AccurateTimestamp.nowInSeconds()) * MILLISECONDS_PER_SECOND;\n if (getAvailabilityStartTimeOrDefault(availabilityStartDate) <= localNow && localNow < getAvailabilityEndTimeOrDefault(availabilityEndDate)) {\n // Special case for items available as catchups before their first broadcast\n return BroadcastStatus.Preview;\n }\n } else if (status === BroadcastStatus.Live) {\n // Case of a catchup being also live\n const {\n selectedLocation: { id },\n } = item;\n if (getLocationType(id) === NETGEM_API_V8_ITEM_LOCATION_TYPE_CATCHUP) {\n return BroadcastStatus.Past;\n }\n }\n\n return status;\n};\n\nconst getBroadcastStatusFromTimes: (startTime: number, endTime: number, now: ?number) => BroadcastStatus = (startTime, endTime, now) => {\n const localNow = now || AccurateTimestamp.nowInSeconds();\n\n if (startTime <= 0) {\n return BroadcastStatus.Unknown;\n }\n\n if (localNow < startTime) {\n return BroadcastStatus.Future;\n }\n\n if (endTime <= 0) {\n return BroadcastStatus.Unknown;\n }\n\n if (endTime <= localNow) {\n return BroadcastStatus.Past;\n }\n\n return BroadcastStatus.Live;\n};\n\nexport { getBroadcastStatus, getBroadcastStatusFromTimes, getLocationStatus };\n","/* @flow */\n\nexport enum SynopsisType {\n Full,\n Short,\n}\n\nexport type NETGEM_API_V8_LANG = {|\n lang: string,\n type?: SynopsisType,\n value: string,\n|};\n","/* @flow */\n\nimport * as React from 'react';\nimport { ISO8601_DURATION_ZERO, formatIso8601Duration, getIso8601DateInSeconds, getIso8601DurationInSeconds } from '../../dateTime/Format';\nimport { LANGUAGE, PROGRAM_INFO } from './Types';\nimport { METADATA_KIND_PROGRAM, type NETGEM_API_V8_METADATA, type NETGEM_API_V8_METADATA_PROGRAM, type NETGEM_API_V8_METADATA_SERIES } from '../../../libs/netgemLibrary/v8/types/MetadataProgram';\nimport { type NETGEM_API_V8_FEED_ITEM, NETGEM_API_V8_ITEM_LOCATION_TYPE_CATCHUP, NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING } from '../../../libs/netgemLibrary/v8/types/FeedItem';\nimport { type NETGEM_API_V8_LANG, SynopsisType } from '../../../libs/netgemLibrary/v8/types/Lang';\nimport type {\n NETGEM_API_V8_METADATA_LOCATION_VIDEO_STREAM_PARAM,\n NETGEM_API_V8_METADATA_SCHEDULE,\n NETGEM_API_V8_METADATA_SCHEDULE_LOCATION,\n} from '../../../libs/netgemLibrary/v8/types/MetadataSchedule';\nimport { PictoHearingImpaired, PictoVisuallyImpaired } from '@ntg/components/dist/pictos/Element';\nimport type { BO_API_AUDIO_AND_SUBS_TYPE } from '../../../libs/netgemLibrary/videofutur/types/Language';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport clsx from 'clsx';\nimport { getLocationType } from '../../../libs/netgemLibrary/v8/helpers/Item';\nimport getTranslatedText from '../../../libs/netgemLibrary/v8/helpers/Lang';\n\nconst addIfNotNull =\n (elements: Array): ((element: T | null) => void) =>\n (element: T | null) => {\n if (element !== null) {\n elements.push(element);\n }\n };\n\nconst buildTitle: (language: string, programMetadata: NETGEM_API_V8_METADATA_PROGRAM | null, seriesMetadata: NETGEM_API_V8_METADATA_SERIES | null, alwaysDisplaySeriesTitle: boolean) => string = (\n language,\n programMetadata,\n seriesMetadata,\n alwaysDisplaySeriesTitle,\n) => {\n const titleArray: Array = [];\n const addToTitleArrayIfNotNull = addIfNotNull(titleArray);\n\n let seriesTitle: string | null = null;\n if (seriesMetadata) {\n const { titles } = seriesMetadata;\n if (titles.length > 0) {\n seriesTitle = getTranslatedText(titles, language);\n }\n }\n\n if (programMetadata) {\n const { episodeIndex, episodeTitle } = getEpisodeIndexAndTitle(programMetadata, seriesTitle, language);\n addToTitleArrayIfNotNull(episodeIndex);\n addToTitleArrayIfNotNull(episodeTitle);\n }\n\n if ((alwaysDisplaySeriesTitle || titleArray.length === 0) && seriesTitle) {\n titleArray.unshift(seriesTitle);\n }\n\n return titleArray.length > 0 ? titleArray.join(' - ') : Localizer.localize('common.metadata.unknown_title');\n};\n\nconst renderProgramLanguage: (locationMetadata: NETGEM_API_V8_METADATA_SCHEDULE_LOCATION | null) => React.Node = (locationMetadata) => {\n const languageElements = formatAudioAndSubtitles(locationMetadata);\n\n if (!languageElements) {\n return null;\n }\n\n return (\n
\n {languageElements}\n
\n );\n};\n\nconst renderProgramParentalGuidance: (data: NETGEM_API_V8_FEED_ITEM, programMetadata: NETGEM_API_V8_METADATA_PROGRAM) => React.Node = (data, programMetadata) => {\n const { parentalGuidance: dataPG } = data;\n const { parentalGuidance: metadataPG } = programMetadata;\n\n const parentalGuidance = dataPG || metadataPG;\n\n let pgText = Localizer.localize('common.metadata.no_age_restriction');\n\n if (parentalGuidance) {\n const { minimumAge } = parentalGuidance;\n const pg = Number(minimumAge);\n if (pg > 0) {\n pgText = `-${pg}`;\n }\n }\n\n return (\n
\n {pgText}\n
\n );\n};\n\nconst renderProgramDuration: (item: NETGEM_API_V8_FEED_ITEM, metadata: NETGEM_API_V8_METADATA_PROGRAM) => React.Node = (item, metadata) => {\n const {\n locType,\n selectedLocation: { duration: locationDuration, quotaUsed, scheduledEventDuration },\n } = item;\n const { duration: programDuration } = metadata;\n const localDuration = scheduledEventDuration ?? locationDuration ?? programDuration;\n\n if (localDuration && localDuration !== ISO8601_DURATION_ZERO) {\n const formattedDuration = formatIso8601Duration(localDuration);\n if (formattedDuration !== '') {\n const wasNotFullyRecorded =\n locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING && typeof quotaUsed === 'string' && getIso8601DurationInSeconds(quotaUsed) < getIso8601DurationInSeconds(localDuration);\n\n const recordedDuration = wasNotFullyRecorded ? (\n <>\n {formatIso8601Duration(quotaUsed)}\n /\n \n ) : null;\n\n return (\n
\n {recordedDuration}\n {formattedDuration}\n
\n );\n }\n }\n\n return null;\n};\n\nconst renderProgramDetails: (item: NETGEM_API_V8_FEED_ITEM, metadata: ?NETGEM_API_V8_METADATA, vodLocations: ?Array, info: number) => Array | null = (\n item,\n metadata,\n vodLocations,\n info,\n) => {\n if (!metadata) {\n return null;\n }\n\n const { genres, productionCountry, releaseDate } = metadata;\n const genreText = genres && genres.values && genres.values.length > 0 ? genres.values[0] : null;\n const details: Array = [];\n const addToDetailsIfNotNull = addIfNotNull(details);\n\n // eslint-disable-next-line no-bitwise\n if (info & PROGRAM_INFO.Duration && metadata.type === METADATA_KIND_PROGRAM) {\n addToDetailsIfNotNull(renderProgramDuration(item, (metadata: NETGEM_API_V8_METADATA_PROGRAM)));\n }\n\n // eslint-disable-next-line no-bitwise\n if (info & PROGRAM_INFO.Genre && genreText && genreText !== 'null') {\n details.push(\n
\n {genreText}\n
,\n );\n }\n\n // eslint-disable-next-line no-bitwise\n if (info & PROGRAM_INFO.ProductionCountry && productionCountry) {\n details.push(\n
\n {productionCountry}\n
,\n );\n }\n\n // eslint-disable-next-line no-bitwise\n if (info & PROGRAM_INFO.ReleaseDate && releaseDate) {\n details.push(\n
\n {releaseDate}\n
,\n );\n }\n\n // eslint-disable-next-line no-bitwise\n if (info & PROGRAM_INFO.Language && vodLocations && vodLocations.length > 0) {\n addToDetailsIfNotNull(renderProgramLanguage(vodLocations[0].location));\n }\n\n // eslint-disable-next-line no-bitwise\n if (info & PROGRAM_INFO.ParentalGuidance && metadata.type === METADATA_KIND_PROGRAM) {\n addToDetailsIfNotNull(renderProgramParentalGuidance(item, metadata));\n }\n\n if (details.length === 0) {\n // Nothing to render\n return null;\n }\n\n // React transforms the array into elements\n return details;\n};\n\n/*\n * Format Season Episode number in SXX EXX\n * ex: => \"S0 E1\"\n * ex: => \"S1 E10\"\n * ex: => \"S1\"\n * ex: => \"E2\"\n *\n * @public\n * @param {NETGEM_API_V8_METADATA_PROGRAM} metadata: item metadata\n * @return {string} : formatted result\n */\nconst formatSeasonEpisodeNbr: (programMetadata: NETGEM_API_V8_METADATA_PROGRAM | null) => string | null = (programMetadata) => {\n if (!programMetadata) {\n return null;\n }\n\n let textResult: string | null = null;\n\n const { episodeOf: { episodeNumber = 0, seasonNumber = 0 } = {} } = programMetadata;\n if (seasonNumber > 0) {\n textResult = `S${seasonNumber}`;\n }\n if (episodeNumber > 0) {\n textResult = `${textResult ? `${textResult} E` : ''}${episodeNumber}`;\n }\n\n return textResult;\n};\n\nconst hasLanguage: (languages: BO_API_AUDIO_AND_SUBS_TYPE, language: string) => boolean = (languages, language) => languages.some((l) => l.language.toUpperCase() === language) ?? false;\n\nconst hasNotVFLanguage: (languages: BO_API_AUDIO_AND_SUBS_TYPE) => boolean = (languages) => languages.some((l) => l.language.toUpperCase() !== LANGUAGE.FR) ?? false;\n\nconst isVisuallyImpairedAudio = (track: {| audioDescription: boolean, language: string |}): boolean => {\n const { audioDescription, language } = track;\n\n if (audioDescription) {\n return true;\n }\n\n const ucLanguage = language.toUpperCase();\n return ucLanguage === LANGUAGE.VisuallyImpaired || ucLanguage === LANGUAGE.VisuallyImpairedAlt;\n};\n\nconst formatAudioAndSubtitles: (locationMetadata: ?NETGEM_API_V8_METADATA_SCHEDULE_LOCATION) => React.Node = (locationMetadata) => {\n if (!locationMetadata) {\n return null;\n }\n\n const { playbackUrls } = locationMetadata;\n\n if (!playbackUrls || playbackUrls.length === 0) {\n return null;\n }\n\n const [\n {\n start: { params },\n },\n ] = playbackUrls;\n const videostreams = params?.find((i) => i.name === 'videostreams');\n const propertiesArg = videostreams?.value.args.find((i) => ((i: any): NETGEM_API_V8_METADATA_LOCATION_VIDEO_STREAM_PARAM).properties);\n\n if (!propertiesArg) {\n return null;\n }\n\n const { properties } = ((propertiesArg: any): NETGEM_API_V8_METADATA_LOCATION_VIDEO_STREAM_PARAM);\n if (!properties) {\n return null;\n }\n\n const { audio, subtitles } = properties;\n\n if (!audio && !subtitles) {\n return null;\n }\n\n /*\n * VOD case:\n * - FR only : VF\n * - FR + another language : VF VOST\n * - FR + another language + FR subtitles: VF VOST\n * - Another language + FR subtitles : VOST\n * - Another language : VOST\n *\n * TV case:\n * - FR only : VF\n * - FR + QAA : VF VOST\n * - FR + QAA + FR subtitles : VF VOST\n * - QAA + FR subtitles : VOST\n * - QAA : VOST\n */\n\n const audioAndSubs: Array = [];\n let visuallyImpairedElt = null;\n let hearingImpairedElt = null;\n\n if (audio) {\n if (hasLanguage(audio, LANGUAGE.FR)) {\n audioAndSubs.push(Localizer.localize('common.metadata.language.french'));\n }\n\n if (hasNotVFLanguage(audio) || hasLanguage(audio, LANGUAGE.OriginalVersion)) {\n audioAndSubs.push(Localizer.localize('common.metadata.language.original_version_with_subtitles'));\n }\n\n if (audio.some((track) => isVisuallyImpairedAudio(track))) {\n visuallyImpairedElt = ;\n }\n }\n\n if (subtitles && subtitles.some((sub) => sub.captions === true)) {\n hearingImpairedElt = ;\n }\n\n if (audioAndSubs.length > 0) {\n return (\n <>\n {audioAndSubs.map((lang) => (\n
\n {lang}\n
\n ))}\n {visuallyImpairedElt}\n {hearingImpairedElt}\n \n );\n }\n\n return null;\n};\n\nconst getEpisodeIndexAndTitle: (programMetadata: ?NETGEM_API_V8_METADATA_PROGRAM, seriesTitle: ?string, language: string) => {| episodeIndex: string | null, episodeTitle: string | null |} = (\n programMetadata,\n seriesTitle,\n language,\n) => {\n if (!programMetadata) {\n return {\n episodeIndex: null,\n episodeTitle: null,\n };\n }\n\n const { titles } = programMetadata;\n const title = getTranslatedText(titles, language);\n const episodeIndex = formatSeasonEpisodeNbr(programMetadata);\n const episodeTitle = title && (!seriesTitle || title.toLowerCase() !== seriesTitle.toLowerCase()) ? title : null;\n\n return {\n episodeIndex,\n episodeTitle,\n };\n};\n\nconst getLocalizedString: (langArray: Array, language: string, fallbackValue: ?string, requestedType?: SynopsisType) => string | null = (\n langArray,\n language,\n fallbackValue,\n requestedType,\n) => {\n const baseLang = (language.includes('-') ? language.substring(0, language.indexOf('-')) : language).toUpperCase();\n let defaultText: string | null = null;\n\n for (const { lang, type, value } of langArray) {\n if (lang.toUpperCase() === baseLang) {\n // For synopsis and tagline, look for correct type, but for title, first value is OK\n if (requestedType === undefined || type === requestedType) {\n return value;\n }\n\n if (requestedType !== SynopsisType.Short) {\n // For full synopsis (resp. title), another kind of synopsis (resp. title) could be used in case nothing perfect is found\n defaultText = value;\n }\n }\n }\n\n if (!defaultText) {\n // Find available correct synopsis kind in any language\n for (const { type, value } of langArray) {\n if (!requestedType || type === requestedType) {\n defaultText = value;\n break;\n }\n }\n }\n\n // At this point, defaultText is either null (nothing was found for the given language) or has a value for the wrong type but in the right language\n return defaultText ?? fallbackValue ?? null;\n};\n\nconst getTitleInternal: (metadata: ?NETGEM_API_V8_METADATA, language: string, fallbackValue: ?string) => string | null = (metadata, language, fallbackValue) => {\n if (!metadata) {\n return null;\n }\n\n const { titles } = metadata;\n\n if (!titles) {\n return null;\n }\n\n return getLocalizedString(titles, language, fallbackValue);\n};\n\nconst getSynopsisInternal: (metadata: ?NETGEM_API_V8_METADATA, language: string, fallbackValue: ?string, requestedType: SynopsisType) => string | null = (\n metadata,\n language,\n fallbackValue,\n requestedType,\n) => {\n if (!metadata) {\n return null;\n }\n\n const { synopses } = metadata;\n\n if (!synopses) {\n return null;\n }\n\n return getLocalizedString(synopses, language, fallbackValue, requestedType);\n};\n\nconst getTagline: (metadata: ?NETGEM_API_V8_METADATA, language: string, fallbackValue: ?string) => string | null = (metadata, language, fallbackValue = null) =>\n getSynopsisInternal(metadata, language, fallbackValue, SynopsisType.Short);\n\nconst getSynopsis: (metadata: ?NETGEM_API_V8_METADATA, language: string, fallbackValue: ?string) => string | null = (metadata, language, fallbackValue = null) =>\n getSynopsisInternal(metadata, language, fallbackValue, SynopsisType.Full);\n\nconst getTitle: (metadata: ?NETGEM_API_V8_METADATA, language: string, fallbackValue: ?string) => string | null = (metadata, language, fallbackValue = null) =>\n getTitleInternal(metadata, language, fallbackValue);\n\nconst getStartAndEndTimes: (item: NETGEM_API_V8_FEED_ITEM) => {| endTime: number, startTime: number |} = (item) => {\n const {\n selectedLocation: { id, scheduledEventDuration, scheduledEventStartDate },\n } = item;\n let { endTime: localEndTime, startTime: localStartTime } = item;\n\n const locType = getLocationType(id);\n\n if ((locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_CATCHUP || locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING) && scheduledEventDuration && scheduledEventStartDate) {\n localStartTime = getIso8601DateInSeconds(scheduledEventStartDate);\n localEndTime = localStartTime + getIso8601DurationInSeconds(scheduledEventDuration);\n }\n\n return {\n endTime: localEndTime,\n startTime: localStartTime,\n };\n};\n\nexport {\n buildTitle,\n formatAudioAndSubtitles,\n formatSeasonEpisodeNbr,\n getEpisodeIndexAndTitle,\n getLocalizedString,\n getStartAndEndTimes,\n getSynopsis,\n getTagline,\n getTitle,\n renderProgramDetails,\n renderProgramLanguage,\n renderProgramParentalGuidance,\n};\n","/* @flow */\n\nimport type { KeyValuePair, ReadOnlyKeyValuePair } from '@ntg/utils/dist/types';\nimport { BOVodAssetStatus } from '../../videofutur/metadata';\nimport type { NETGEM_API_V8_METADATA_SCHEDULE_LOCATION } from '../../../libs/netgemLibrary/v8/types/MetadataSchedule';\n\nexport type VOD_STATUS_TYPE = {|\n availabilityTime?: number,\n expirationTime?: number,\n status: BOVodAssetStatus,\n viewingHistoryId?: string,\n vtiId?: number,\n|};\n\nexport const DEFINITION_PRIORITY = Object.freeze({\n Definition4K: 2,\n DefinitionHD: 1,\n DefinitionSD: 0,\n});\n\nexport enum Definition {\n FourK = '4K',\n HD = 'HD',\n SD = 'SD',\n}\n\nexport type STREAM_PRIORITIES_BY_TYPE_TYPE = KeyValuePair;\n\nexport type STREAM_PRIORITIES_TYPE = {|\n [string]: STREAM_PRIORITIES_BY_TYPE_TYPE,\n default: STREAM_PRIORITIES_BY_TYPE_TYPE,\n|};\n\nexport const LANGUAGE = Object.freeze({\n FR: 'FR',\n OriginalVersion: 'QAA',\n VisuallyImpaired: 'QAD',\n VisuallyImpairedAlt: 'QTZ',\n});\n\nexport const LANGUAGE_VARIANTS: ReadOnlyKeyValuePair> = Object.freeze({\n DE: Object.freeze(['DE', 'DEU', 'DEUTSCH', 'GERMAN', 'ALLEMAND']),\n EN: Object.freeze(['EN', 'ENG', 'ENGLISH', 'ANGLAIS', 'ENGLISCH']),\n FR: Object.freeze(['FR', 'FRA', 'FRE', 'FRENCH', 'FRANCAIS', 'FRANÇAIS', 'FRANZÖSISCH', 'FRANZOSISCH']),\n Undetermined: Object.freeze(['UND', 'UNDETERMINED', 'INDÉTERMINÉ']),\n});\n\nexport const PROGRAM_INFO: ReadOnlyKeyValuePair = Object.freeze({\n Duration: 1,\n Genre: 2,\n Language: 4,\n ParentalGuidance: 8,\n ProductionCountry: 16,\n ReleaseDate: 32,\n});\n\nexport enum Currency {\n Euro = 'EUR',\n}\n\nexport const getCurrencySymbol = (currency: Currency): string => (currency === Currency.Euro ? '€' : '?');\n\nexport type BASE_PURCHASE_DETAILS_TYPE = {|\n // In ms\n availabilityStartTime: number,\n definition: Definition,\n displayPrice: string,\n distributorId: string,\n licenseDuration?: string,\n vtiId: number,\n|};\n\nexport type PURCHASE_DETAILS_TYPE = {|\n ...BASE_PURCHASE_DETAILS_TYPE,\n itemCount: number,\n locationId?: string,\n vodLocationMetadata?: NETGEM_API_V8_METADATA_SCHEDULE_LOCATION,\n|};\n","/* @flow */\n\nimport type { BO_PURCHASE_LIST_BY_DISTRIBUTOR_TYPE, BO_PURCHASE_LIST_ITEM_TYPE, BO_PURCHASE_LIST_TYPE } from '../../../redux/netgemApi/actions/videofutur/types/purchase';\nimport type { NETGEM_API_VIEWINGHISTORY_ITEM, NETGEM_API_VIEWINGHISTORY_PLAYED_ITEMS, VIEWING_HISTORY_TYPE } from '../../../libs/netgemLibrary/v8/types/ViewingHistory';\nimport type { NETGEM_API_WISHLIST, NETGEM_API_WISHLIST_ITEM } from '../../../libs/netgemLibrary/v8/types/Wishlist';\nimport type { BO_FAVORITE_LIST_TYPE } from '../../../redux/netgemApi/actions/videofutur/types/favorite';\nimport type { NETGEM_API_V8_AVENUE } from '../../../libs/netgemLibrary/v8/types/Avenue';\nimport type { NETGEM_API_V8_HUB } from '../../../libs/netgemLibrary/v8/types/Hub';\n\nconst areArraysDifferent: (a1: Array, a2: Array) => boolean = (a1, a2) => a1.concat(a2).filter((val, index, arr) => arr.indexOf(val) === arr.lastIndexOf(val)).length > 0;\n\nconst areAvenuesDifferent: (avenue1: ?NETGEM_API_V8_AVENUE, avenue2: ?NETGEM_API_V8_AVENUE) => boolean = (avenue1, avenue2) => {\n if (!avenue1 && !avenue2) {\n return false;\n }\n\n if (!avenue1 || !avenue2) {\n return true;\n }\n\n return JSON.stringify(avenue1) !== JSON.stringify(avenue2);\n};\n\nconst areHubsDifferent: (hub1: ?NETGEM_API_V8_HUB, hub2: ?NETGEM_API_V8_HUB) => boolean = (hub1, hub2) => {\n if (!hub1 && !hub2) {\n return false;\n }\n\n if (!hub1 || !hub2 || hub1.length !== hub2.length) {\n return true;\n }\n\n return JSON.stringify(hub1) !== JSON.stringify(hub2);\n};\n\nconst arePurchasedItemsDifferent: (item1: ?BO_PURCHASE_LIST_ITEM_TYPE, item2: ?BO_PURCHASE_LIST_ITEM_TYPE) => boolean = (item1, item2) => {\n if (!item1 && !item2) {\n return false;\n }\n\n if (!item1 || !item2) {\n return true;\n }\n\n return item1.lastBookmark !== item2.lastBookmark || item1.purchaseDate !== item2.purchaseDate || item1.expirationTime !== item2.expirationTime || item1.type !== item2.type;\n};\n\nconst arePurchaseListsByDistributorDifferent: (l1: BO_PURCHASE_LIST_BY_DISTRIBUTOR_TYPE, l2: BO_PURCHASE_LIST_BY_DISTRIBUTOR_TYPE) => boolean = (l1, l2) => {\n // VTI Ids\n const keys1 = Array.from(Object.keys(l1));\n const keys2 = Array.from(Object.keys(l2));\n\n if (keys1.length !== keys2.length || areArraysDifferent(keys1, keys2)) {\n return true;\n }\n\n for (const key of keys1) {\n // Purchased items\n if (arePurchasedItemsDifferent(l1[key], l2[key])) {\n return true;\n }\n }\n\n return false;\n};\n\nconst arePurchaseListsDifferent: (l1: BO_PURCHASE_LIST_TYPE | null, l2: BO_PURCHASE_LIST_TYPE | null) => boolean = (l1, l2) => {\n if (!l1 && !l2) {\n return false;\n }\n\n if (!l1 || !l2) {\n return true;\n }\n\n // Distributor Ids\n const keys1 = Array.from(Object.keys(l1));\n const keys2 = Array.from(Object.keys(l2));\n\n if (keys1.length !== keys2.length || areArraysDifferent(keys1, keys2)) {\n return true;\n }\n\n for (const key of keys1) {\n // Purchase list by distributor\n if (arePurchaseListsByDistributorDifferent(l1[key], l2[key])) {\n return true;\n }\n }\n\n return false;\n};\n\nconst arePlayedItemsDifferent: (playedItems1?: NETGEM_API_VIEWINGHISTORY_PLAYED_ITEMS, playedItems2?: NETGEM_API_VIEWINGHISTORY_PLAYED_ITEMS) => boolean = (playedItems1, playedItems2) => {\n if (!playedItems1 && !playedItems2) {\n return false;\n }\n\n if (!playedItems1 || !playedItems2) {\n return true;\n }\n\n const keys1 = Array.from(Object.keys(playedItems1));\n const keys2 = Array.from(Object.keys(playedItems2));\n\n if (keys1.length !== keys2.length || areArraysDifferent(keys1, keys2)) {\n return true;\n }\n\n for (const key of keys1) {\n const { [key]: item1 } = playedItems1;\n const { [key]: item2 } = playedItems2;\n\n if (item1.date !== item2.date || item1.position !== item2.position) {\n return true;\n }\n }\n\n return false;\n};\n\nconst areViewingHistoryItemsDifferent: (item1: NETGEM_API_VIEWINGHISTORY_ITEM, item2: NETGEM_API_VIEWINGHISTORY_ITEM) => boolean = (item1, item2) =>\n item1.date !== item2.date || item1.id !== item2.id || item1.rating !== item2.rating || item1.watchingstatus !== item2.watchingstatus;\n\nconst areViewingHistoriesDifferent: (l1?: VIEWING_HISTORY_TYPE, l2?: VIEWING_HISTORY_TYPE) => boolean = (l1, l2) => {\n if (l1 === l2) {\n return false;\n }\n\n if (l1 === undefined || l2 === undefined) {\n return true;\n }\n\n if (l1.length !== l2.length) {\n return true;\n }\n\n for (let i = 0; i < l1.length; ++i) {\n const { [i]: item1 } = l1;\n const { [i]: item2 } = l2;\n if (areViewingHistoryItemsDifferent(item1, item2)) {\n return true;\n }\n\n const { playeditems: playedItems1 } = item1;\n const { playeditems: playedItems2 } = item2;\n if ((playedItems1 && !playedItems2) || (!playedItems1 && playedItems2)) {\n return true;\n } else if (playedItems1 && playedItems2 && arePlayedItemsDifferent(playedItems1, playedItems2)) {\n return true;\n }\n }\n\n return false;\n};\n\nconst areWishlistItemsDifferent: (item1: NETGEM_API_WISHLIST_ITEM, item2: NETGEM_API_WISHLIST_ITEM) => boolean = (item1, item2) =>\n item1.channelId !== item2.channelId || item1.date !== item2.date || item1.id !== item2.id || item1.type !== item2.type;\n\n// Given wishlists are sorted by date\nconst areWishlistsDifferent: (l1?: NETGEM_API_WISHLIST, l2?: NETGEM_API_WISHLIST) => boolean = (l1, l2) => {\n if (l1 === l2) {\n return false;\n }\n\n if (l1 === undefined || l2 === undefined) {\n return true;\n }\n\n if (l1.length !== l2.length) {\n return true;\n }\n\n for (let i = 0; i < l1.length; ++i) {\n if (areWishlistItemsDifferent(l1[i], l2[i])) {\n return true;\n }\n }\n\n return false;\n};\n\nconst areFavoriteListsDifferent: (l1: BO_FAVORITE_LIST_TYPE, l2: BO_FAVORITE_LIST_TYPE) => boolean = (l1, l2) => {\n if (l1.length !== l2.length) {\n return true;\n }\n\n for (let i = 0; i < l1.length; ++i) {\n if (l1[i] !== l2[i]) {\n return true;\n }\n }\n\n return false;\n};\n\nexport { areAvenuesDifferent, areFavoriteListsDifferent, areHubsDifferent, arePlayedItemsDifferent, arePurchaseListsDifferent, areViewingHistoriesDifferent, areWishlistsDifferent };\n","/* @flow */\n\nexport enum SectionType {\n Carousel = 'carousel',\n ChannelGroup = 'channelgroup',\n Grid = 'grid',\n HeroPanel = 'heroPanel',\n Regular = 'sectionList',\n}\n\nexport enum SectionDisplayType {\n Collapsed = 'collapsed',\n Grid = 'grid',\n Hidden = 'hidden',\n Regular = 'regular',\n}\n\nexport type SECTION_PAGINATION = {|\n maxPageIndex: number,\n pageIndex: number,\n sliderPositions: Array,\n|};\n\nexport type SwipeEventData = {|\n deltaX: number,\n deltaY: number,\n dir: 'Down' | 'Left' | 'Right' | 'Up',\n velocity: number,\n|};\n","/* @flow */\n\nimport * as React from 'react';\nimport { type BASE_PURCHASE_DETAILS_TYPE, Currency, DEFINITION_PRIORITY, Definition, type STREAM_PRIORITIES_TYPE, type VOD_STATUS_TYPE, getCurrencySymbol } from '../ui/metadata/Types';\nimport { type BO_PURCHASE_LIST_ITEM_TYPE, type BO_PURCHASE_LIST_TYPE, Purchase, type PurchaseType } from '../../redux/netgemApi/actions/videofutur/types/purchase';\nimport { MINUTES_PER_HOUR, SECONDS_PER_DAY, SECONDS_PER_HOUR, SECONDS_PER_MINUTE } from '../dateTime/Format';\nimport { NETGEM_API_V8_ITEM_LOCATION_TYPE_APP, VodKind } from '../../libs/netgemLibrary/v8/types/FeedItem';\nimport type { NETGEM_API_V8_METADATA_PROGRAM, NETGEM_API_V8_METADATA_PROVIDER_INFO, NETGEM_API_V8_METADATA_SERIES } from '../../libs/netgemLibrary/v8/types/MetadataProgram';\nimport type {\n NETGEM_API_V8_METADATA_SCHEDULE,\n NETGEM_API_V8_METADATA_SCHEDULE_LOCATION,\n NETGEM_API_V8_METADATA_SCHEDULE_VIDEO_STREAM_PARAM,\n NETGEM_API_V8_PLAYBACK_URL,\n NETGEM_API_V8_PRICE,\n NETGEM_API_V8_VOD_PURCHASEINFO,\n} from '../../libs/netgemLibrary/v8/types/MetadataSchedule';\nimport AccurateTimestamp from '../dateTime/AccurateTimestamp';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport { NETGEM_API_V8_AUTHENT_REALM_NETGEM } from '../../libs/netgemLibrary/v8/types/Realm';\nimport type { NETGEM_API_V8_PURCHASE_INFO_PRICE_OPTION } from '../../libs/netgemLibrary/v8/types/PurchaseInfo';\nimport type { Undefined } from '@ntg/utils/dist/types';\nimport clsx from 'clsx';\nimport { getDistributorId } from '../ui/item/distributor';\nimport { getLocationType } from '../../libs/netgemLibrary/v8/helpers/Item';\nimport { getStreamsFromPlaybackUrls } from '../../components/player/helper';\n\nexport enum BOVodAssetStatus {\n Bought = 'bought',\n Free = 'free',\n FreeButAvailableInFuture = 'futureFree',\n Locked = 'locked',\n Rented = 'rented',\n Series = 'series',\n Unknown = 'unknown',\n}\n\nconst MAX_TIMESTAMP = 8_640_000_000_000_000;\n\n// Returns availability start date as a timestamp, or 0 (1970-01-01T00:00:00.000Z) if undefined\nconst getAvailabilityStartTimeOrDefault: (startDate?: string) => number = (startDate) => (startDate ? new Date(startDate).getTime() : 0);\n\n// Returns availability end date as a timestamp, or 0 (275760-09-13T00:00:00.000Z) if undefined\nconst getAvailabilityEndTimeOrDefault: (endDate?: string) => number = (endDate) => (endDate ? new Date(endDate).getTime() : MAX_TIMESTAMP);\n\nconst getDefinitionPriority: (definition: ?Definition) => number =\n // eslint-disable-next-line consistent-return\n (definition) => {\n if (definition === undefined || definition === null) {\n return Number.MIN_SAFE_INTEGER;\n }\n\n switch (definition) {\n case Definition.FourK:\n return DEFINITION_PRIORITY.Definition4K;\n case Definition.HD:\n return DEFINITION_PRIORITY.DefinitionHD;\n case Definition.SD:\n return DEFINITION_PRIORITY.DefinitionSD;\n\n // No default\n }\n };\n\nconst getTrailerInternal: (streamPriorities: STREAM_PRIORITIES_TYPE | null, trailerUrl: ?NETGEM_API_V8_PLAYBACK_URL) => NETGEM_API_V8_METADATA_SCHEDULE_VIDEO_STREAM_PARAM | null = (\n streamPriorities,\n trailerUrl,\n) => {\n if (!trailerUrl) {\n return null;\n }\n\n const { allStreams, errorCode } = getStreamsFromPlaybackUrls(streamPriorities, [trailerUrl]);\n\n if (!allStreams || errorCode) {\n // No supported stream or DRM found\n return null;\n }\n\n const [{ path, type }] = allStreams;\n\n if (!path) {\n return null;\n }\n\n return {\n drms: [],\n path,\n type,\n };\n};\n\nconst getTrailer: (\n streamPriorities: STREAM_PRIORITIES_TYPE | null,\n programMetadata: ?NETGEM_API_V8_METADATA_PROGRAM,\n seriesMetadata: ?NETGEM_API_V8_METADATA_SERIES,\n) => NETGEM_API_V8_METADATA_SCHEDULE_VIDEO_STREAM_PARAM | null = (streamPriorities, programMetadata, seriesMetadata) =>\n getTrailerInternal(streamPriorities, seriesMetadata?.trailerUrl ?? programMetadata?.trailerUrl);\n\nconst hasTrailer: (streamPriorities: STREAM_PRIORITIES_TYPE | null, programMetadata: ?NETGEM_API_V8_METADATA_PROGRAM, seriesMetadata: ?NETGEM_API_V8_METADATA_SERIES) => boolean = (\n streamPriorities,\n programMetadata,\n seriesMetadata,\n) => getTrailer(streamPriorities, programMetadata, seriesMetadata) !== null;\n\nconst hasProgramTrailer: (streamPriorities: STREAM_PRIORITIES_TYPE | null, programMetadata: ?NETGEM_API_V8_METADATA_PROGRAM) => boolean = (streamPriorities, programMetadata) =>\n getTrailerInternal(streamPriorities, programMetadata?.trailerUrl) !== null;\n\nconst hasSeriesTrailer: (streamPriorities: STREAM_PRIORITIES_TYPE | null, seriesMetadata: ?NETGEM_API_V8_METADATA_SERIES) => boolean = (streamPriorities, seriesMetadata) =>\n getTrailerInternal(streamPriorities, seriesMetadata?.trailerUrl) !== null;\n\nconst getVodKind: (id: string) => VodKind = (id) => {\n if (id.startsWith((VodKind.EST: string))) {\n return VodKind.EST;\n } else if (id.startsWith((VodKind.TVOD: string))) {\n return VodKind.TVOD;\n } else if (id.startsWith((VodKind.SVOD: string))) {\n return VodKind.SVOD;\n }\n return VodKind.VOD;\n};\n\n// Function accepts 1 or 2 VTI Id in order to check if an item has been rent or bought\nconst hasBeenPurchased: (purchaseList: BO_PURCHASE_LIST_TYPE, distributorId: string, vtiId: number, otherVtiId?: number) => boolean = (purchaseList, distributorId, vtiId, otherVtiId) =>\n getPurchaseDetails(purchaseList, distributorId, vtiId) !== null || getPurchaseDetails(purchaseList, distributorId, otherVtiId) !== null;\n\nconst getPurchaseDetails: (purchaseList: BO_PURCHASE_LIST_TYPE, distributorId: string, vtiId?: number) => BO_PURCHASE_LIST_ITEM_TYPE | null = (purchaseList, distributorId, vtiId) => {\n if (!vtiId) {\n return null;\n }\n\n const { [distributorId]: purchaseListForDistributor } = purchaseList;\n\n if (!purchaseListForDistributor) {\n return null;\n }\n\n return purchaseListForDistributor[vtiId.toString()] ?? null;\n};\n\nconst getVodStatusFromLocations: (vodLocations: ?Array, purchaseList: BO_PURCHASE_LIST_TYPE | null) => VOD_STATUS_TYPE = (vodLocations, purchaseList) => {\n if (!vodLocations) {\n return { status: BOVodAssetStatus.Unknown };\n }\n\n const authority = vodLocations[0]?.location.authority;\n\n if (vodLocations.length === 0) {\n // Series\n return { status: BOVodAssetStatus.Series };\n }\n\n // Single\n const distributorId = getDistributorId(vodLocations);\n\n // FranceChannel SVOD\n if (!distributorId && authority !== NETGEM_API_V8_AUTHENT_REALM_NETGEM) {\n return { status: BOVodAssetStatus.Unknown };\n }\n\n let status: BOVodAssetStatus | null = null;\n let vtiId: Undefined = undefined;\n let viewingHistoryId: Undefined = undefined;\n let expirationTime: Undefined = undefined;\n\n for (let i = 0; i < vodLocations.length; ++i) {\n const {\n [i]: {\n location: { availabilityStartDate, providerInfo, purchaseInfo, id },\n },\n } = vodLocations;\n\n const newVtiId = purchaseInfo?.vtiId;\n const newViewingHistoryId = providerInfo?.viewingHistoryId;\n\n if (getLocationType(id) === NETGEM_API_V8_ITEM_LOCATION_TYPE_APP || (newVtiId === undefined && availabilityStartDate === undefined)) {\n // Deeplink asset or TVOD/EST without VTI Id and availabilityStartDate (error)\n return { status: BOVodAssetStatus.Unknown };\n }\n\n if (getVodKind(id) === VodKind.SVOD) {\n // VOD asset is free, but it can be available in the future\n const availabilityTime = getAvailabilityStartTimeOrDefault(availabilityStartDate);\n return {\n availabilityTime,\n status: availabilityTime <= AccurateTimestamp.now() ? BOVodAssetStatus.Free : BOVodAssetStatus.FreeButAvailableInFuture,\n viewingHistoryId: newViewingHistoryId,\n vtiId: newVtiId,\n };\n }\n\n if (authority === NETGEM_API_V8_AUTHENT_REALM_NETGEM) {\n // FranceChannel SVOD\n return {\n status: BOVodAssetStatus.Free,\n viewingHistoryId: newViewingHistoryId,\n vtiId: newVtiId,\n };\n }\n\n if (!purchaseList || !distributorId) {\n // Cannot happen because either they are defined or authority is 'netgem' (and in this case, we returned just above)\n return { status: BOVodAssetStatus.Unknown };\n }\n\n const purchaseDetails = getPurchaseDetails(purchaseList, distributorId, newVtiId);\n\n if (purchaseDetails) {\n // VOD asset has been found in the purchase list\n if (purchaseDetails.type === Purchase.Rent) {\n if (status !== BOVodAssetStatus.Bought) {\n // Rented TVOD\n status = BOVodAssetStatus.Rented;\n vtiId = newVtiId;\n viewingHistoryId = newViewingHistoryId;\n ({ expirationTime } = purchaseDetails);\n }\n } else {\n // Bought EST\n return {\n status: BOVodAssetStatus.Bought,\n viewingHistoryId: newViewingHistoryId,\n vtiId: newVtiId,\n };\n }\n }\n }\n\n if (status === null) {\n status = BOVodAssetStatus.Locked;\n }\n\n return {\n expirationTime,\n status,\n viewingHistoryId,\n vtiId,\n };\n};\n\nconst getPrice: (purchaseInfo: NETGEM_API_V8_VOD_PURCHASEINFO, currency: Currency) => NETGEM_API_V8_PRICE | null = (purchaseInfo, currency) => {\n const { priceOptions } = purchaseInfo;\n\n if (!priceOptions || priceOptions.length === 0) {\n return null;\n }\n\n return priceOptions.find((item) => item.currency === (currency: string)) ?? null;\n};\n\nconst comparePrices: (option1: NETGEM_API_V8_PURCHASE_INFO_PRICE_OPTION, option2: NETGEM_API_V8_PURCHASE_INFO_PRICE_OPTION) => number = (option1, option2) => {\n const { amount: amount1 } = option1;\n const { amount: amount2 } = option2;\n\n return amount1 - amount2;\n};\n\nconst isBetterPriceOption: (current: NETGEM_API_V8_PURCHASE_INFO_PRICE_OPTION, candidate: NETGEM_API_V8_PURCHASE_INFO_PRICE_OPTION) => boolean = (current, candidate) => {\n const currentStart = getAvailabilityStartTimeOrDefault(current.availabilityStartDate);\n const candidateStart = getAvailabilityStartTimeOrDefault(candidate.availabilityStartDate);\n\n // Open window: promo has higher priority, then dates\n return (candidate.promo && !current.promo) || candidateStart < currentStart;\n};\n\nconst getCurrentOrNextPriceOption: (priceOptions: Array) => NETGEM_API_V8_PURCHASE_INFO_PRICE_OPTION | null = (priceOptions) => {\n const now = AccurateTimestamp.now();\n let currentPriceOption: NETGEM_API_V8_PURCHASE_INFO_PRICE_OPTION | null = null;\n let nextPriceOption: NETGEM_API_V8_PURCHASE_INFO_PRICE_OPTION | null = null;\n\n // Sort all options by price\n const sortedOptions = [...priceOptions];\n sortedOptions.sort(comparePrices);\n\n for (const option of priceOptions) {\n const { availabilityEndDate, availabilityStartDate, previewAvailabilityStartDate, promo } = option;\n const previewTime = new Date(previewAvailabilityStartDate).getTime();\n const startTime = getAvailabilityStartTimeOrDefault(availabilityStartDate);\n const endTime = getAvailabilityEndTimeOrDefault(availabilityEndDate);\n\n // Skip past windows and buggy windows\n if (now < endTime && startTime < endTime) {\n // Current window is open\n if (startTime < now) {\n // Promo has higher priority\n if (currentPriceOption === null || promo) {\n currentPriceOption = option;\n }\n } else if ((nextPriceOption === null || startTime < getAvailabilityStartTimeOrDefault(nextPriceOption.availabilityStartDate)) && previewTime < now) {\n // Next available window\n nextPriceOption = option;\n }\n }\n }\n\n // Return the current price option or the next available one or null if none was found\n return currentPriceOption ?? nextPriceOption;\n};\n\nconst formatDisplayPrice: (display: string, currency: Currency) => string = (display, currency) => {\n const reCurrencyText = new RegExp((currency: string), 'ugi');\n\n return display.replace(reCurrencyText, getCurrencySymbol(currency)).replace(/\\./gu, ',');\n};\n\nconst getDisplayPriceAndDefinition: (vodLocation: NETGEM_API_V8_METADATA_SCHEDULE_LOCATION) => BASE_PURCHASE_DETAILS_TYPE = (vodLocation) => {\n const { availabilityStartDate, providerInfo, purchaseInfo } = vodLocation;\n\n if (providerInfo?.distributorId && purchaseInfo) {\n const { distributorId } = providerInfo;\n const euroPrice = getPrice(purchaseInfo, Currency.Euro);\n if (euroPrice !== null) {\n const { display } = euroPrice;\n const { definition, vtiId } = purchaseInfo;\n return {\n availabilityStartTime: 0,\n definition,\n displayPrice: formatDisplayPrice(display, Currency.Euro),\n distributorId,\n vtiId,\n };\n }\n }\n\n return {\n availabilityStartTime: getAvailabilityStartTimeOrDefault(availabilityStartDate),\n definition: Definition.SD,\n displayPrice: '',\n distributorId: '',\n vtiId: 0,\n };\n};\n\nconst renderPurchaseSummary: (purchaseType: PurchaseType, definition: Definition, displayPrice: string, discountPrice: ?string, updatedPrice: ?string) => React.Node = (\n purchaseType,\n definition,\n displayPrice,\n discountPrice,\n updatedPrice,\n) => (\n <>\n {Localizer.localize(purchaseType === Purchase.Rent ? 'vod.pricing.tvod.rent' : 'vod.pricing.est.buy')} \n {(definition: string)} \n {Localizer.localize('vod.pricing.priceFor')} \n {discountPrice || updatedPrice || displayPrice}\n {discountPrice ? {updatedPrice || displayPrice} : null}\n \n);\n\nconst getPurchaseType: (vodKind: VodKind) => PurchaseType | null = (vodKind) => {\n if (vodKind === VodKind.EST) {\n return Purchase.Buy;\n } else if (vodKind === VodKind.TVOD) {\n return Purchase.Rent;\n }\n\n return null;\n};\n\n// Given date is a timestamp in seconds\nconst getTimeLeftFromExpirationTime: (expirationTime: number) => string = (expirationTime) => {\n const duration = expirationTime - AccurateTimestamp.nowInSeconds();\n\n if (duration <= SECONDS_PER_MINUTE) {\n // Less than 1 minute\n return Localizer.localize('vod.pricing.tvod.minute0', { count: duration });\n }\n\n if (duration <= SECONDS_PER_HOUR) {\n // Between 1 and 60 minutes\n return Localizer.localize('vod.pricing.tvod.minute', { count: Math.ceil(duration / MINUTES_PER_HOUR) });\n }\n\n const TWO = 2;\n if (duration <= SECONDS_PER_DAY * TWO) {\n // Between 60 minutes and 2 days\n return Localizer.localize('vod.pricing.tvod.hour', { count: Math.ceil(duration / SECONDS_PER_HOUR) });\n }\n\n // More than 2 days\n return Localizer.localize('vod.pricing.tvod.day', { count: Math.ceil(duration / SECONDS_PER_DAY) });\n};\n\n/*\n * Ids look like this:\n * tvod://videofutur/10039482/21580099/dsktp-widevine/vitis-vno-fibre-v8/41/NA\n * est://videofutur/10039482/21580150/dsktp-widevine/vitis-vno-fibre-v8/41/12451254\n * svod://videofutur/52002737/70006135/dsktp-widevine/universcine-v8/41/NA\n *\n * General shape is:\n * ://.../...///.../...\n */\nconst extractDistributorId: (id?: string, deviceOS: string) => string | null = (id, deviceOS) => {\n if (!id) {\n return null;\n }\n\n const re = new RegExp(`/${deviceOS}/(?.+?)/`, 'ugi');\n const match = re.exec(id);\n\n return match?.groups?.distributorId ?? null;\n};\n\nconst getTitIdFromProviderInfo: (programProviderInfo: NETGEM_API_V8_METADATA_PROVIDER_INFO, seriesMetadata: ?NETGEM_API_V8_METADATA_SERIES) => string = (programProviderInfo, seriesMetadata) => {\n const { id } = programProviderInfo;\n\n // Regular case: TIT Id is provided as \"id\" in program's provider info\n if (id) {\n return id;\n }\n\n // TIT Id could also be in series' provider info\n const titId = seriesMetadata?.providerInfo.id;\n if (titId) {\n return titId;\n }\n\n // Hack: when id is not provided, extract it from series' \"viewingHistoryId\"\n return seriesMetadata?.providerInfo.viewingHistoryId.split('/').at(-1) ?? '';\n};\n\nconst getVodLocationFromVtiId: (vodLocations: Array | null, vtiId: ?number) => NETGEM_API_V8_METADATA_SCHEDULE | null = (vodLocations, vtiId) => {\n if (!vodLocations) {\n // No locations: error\n return null;\n }\n\n if (!vtiId && vodLocations.length > 0) {\n // No VTI Id: item not rent/bought\n return vodLocations[0];\n }\n\n return vodLocations.find((loc) => loc.location.purchaseInfo?.vtiId === vtiId) ?? null;\n};\n\nexport {\n extractDistributorId,\n formatDisplayPrice,\n getAvailabilityStartTimeOrDefault,\n getAvailabilityEndTimeOrDefault,\n getCurrentOrNextPriceOption,\n getDefinitionPriority,\n getDisplayPriceAndDefinition,\n getPrice,\n getPurchaseDetails,\n getPurchaseType,\n getTimeLeftFromExpirationTime,\n getTitIdFromProviderInfo,\n getTrailer,\n getVodLocationFromVtiId,\n getVodStatusFromLocations,\n getVodKind,\n hasBeenPurchased,\n hasProgramTrailer,\n hasSeriesTrailer,\n hasTrailer,\n isBetterPriceOption,\n renderPurchaseSummary,\n};\n","/* @flow */\n\nimport type { NETGEM_API_WISHLIST, NETGEM_API_WISHLIST_ITEM } from '../../libs/netgemLibrary/v8/types/Wishlist';\nimport { LoadableStatus } from '../loadable/loadable';\nimport { getHashFromDate } from '../request/cache';\n\nclass WishlistCache {\n static ids: Set = new Set();\n\n static items: NETGEM_API_WISHLIST = [];\n\n static hashCode: string | null = null;\n\n // $FlowFixMe: Flow does not support symbols yet\n get [Symbol.toStringTag]() {\n return 'WishlistCache';\n }\n\n static reset: () => void = () => {\n WishlistCache.ids = new Set();\n WishlistCache.items = [];\n WishlistCache.hashCode = null;\n };\n\n static checkGet: (newWishlist: NETGEM_API_WISHLIST, status: LoadableStatus, ordered?: boolean) => { ids: Set, items: NETGEM_API_WISHLIST } = (newWishlist, status, ordered = false) => {\n if (status !== LoadableStatus.Loaded) {\n // Not loaded yet\n return { ids: new Set(), items: [] };\n }\n\n const newHashCode = getHashFromDate(newWishlist);\n\n if (newHashCode !== WishlistCache.hashCode) {\n // Cache items\n WishlistCache.items = [...newWishlist];\n if (ordered) {\n WishlistCache.items.sort((a, b) => a.date.localeCompare(b.date));\n }\n\n // Cache Ids\n WishlistCache.ids = new Set();\n newWishlist.forEach((item: NETGEM_API_WISHLIST_ITEM) => WishlistCache.ids.add(item.id));\n\n WishlistCache.hashCode = newHashCode;\n }\n\n return { ids: WishlistCache.ids, items: WishlistCache.items };\n };\n}\n\nexport default WishlistCache;\n","/* @flow */\n\nimport { ItemContent, type NETGEM_API_V8_FEED_ITEM } from '../../libs/netgemLibrary/v8/types/FeedItem';\nimport { Messenger, MessengerEvents } from '@ntg/utils/dist/messenger';\nimport type { NETGEM_API_V8_METADATA_PROGRAM, NETGEM_API_V8_METADATA_SERIES } from '../../libs/netgemLibrary/v8/types/MetadataProgram';\nimport AccurateTimestamp from '../dateTime/AccurateTimestamp';\nimport type { CARD_DATA_MODAL_TYPE } from '../../components/modal/cardModal/CardModalConstsAndTypes';\nimport { Definition } from '../ui/metadata/Types';\nimport LocalStorageManager from '../localStorage/localStorageManager';\nimport { type ModalState } from '../../redux/modal/reducers';\nimport type { NETGEM_API_V8_AUTHENT_REALM } from '../../libs/netgemLibrary/v8/types/Realm';\nimport type { NETGEM_API_V8_METADATA_SCHEDULE_LOCATION } from '../../libs/netgemLibrary/v8/types/MetadataSchedule';\nimport type { PurchaseType } from '../../redux/netgemApi/actions/videofutur/types/purchase';\nimport type { ScheduledRecordingsKindType } from '../../libs/netgemLibrary/v8/types/Npvr';\nimport { StorageKeys } from '../localStorage/keys';\n\n// After 5 minutes, any pending operation becomes obsolete (in ms)\nconst PENDING_OPERATION_TTL = 300_000;\n\nexport enum PendingOperationKind {\n AddToFavorite = 'add_to_favorite',\n AddToWishlist = 'add_to_wishlist',\n OpenCard = 'open_card',\n Play = 'play',\n Purchase = 'purchase',\n Record = 'record',\n}\n\nexport enum PendingOperationReason {\n RequireAccount = 'require_account',\n RequireSubscription = 'require_subscription',\n}\n\nexport type ADD_TO_FAVORITE_DATA_TYPE = {|\n titId: string,\n|};\n\nexport type ADD_TO_WISHLIST_DATA_TYPE = {|\n assetId: string,\n channelId: string,\n|};\n\nexport type BASE_VOD_PURCHASE_DATA_TYPE = {|\n definition: Definition,\n displayPrice: string,\n distributorId: string,\n itemCount: number,\n licenseDuration?: string,\n locationId?: string,\n otherVtiId?: number,\n purchaseType: PurchaseType,\n vodLocationMetadata?: NETGEM_API_V8_METADATA_SCHEDULE_LOCATION,\n vtiId: number,\n|};\n\nexport type VOD_PURCHASE_DATA_TYPE = {|\n ...BASE_VOD_PURCHASE_DATA_TYPE,\n item: NETGEM_API_V8_FEED_ITEM,\n programMetadata: NETGEM_API_V8_METADATA_PROGRAM,\n seriesMetadata: ?NETGEM_API_V8_METADATA_SERIES,\n viewingHistoryId?: string,\n|};\n\nexport type PENDING_OPERATION_DATA_TYPE = {|\n authority?: NETGEM_API_V8_AUTHENT_REALM | null,\n addToFavoriteData?: ADD_TO_FAVORITE_DATA_TYPE | null,\n addToWishlistData?: ADD_TO_WISHLIST_DATA_TYPE | null,\n contentType?: ItemContent | null,\n operationType: PendingOperationKind,\n purchaseData?: VOD_PURCHASE_DATA_TYPE | null,\n recordKind?: ScheduledRecordingsKindType | null,\n reason: PendingOperationReason,\n|};\n\ntype PENDING_OPERATION_TYPE = {|\n cardData: CARD_DATA_MODAL_TYPE,\n date: number,\n|};\n\nconst storePendingOperation: (cardData: CARD_DATA_MODAL_TYPE) => void = (cardData) => {\n LocalStorageManager.save(StorageKeys.PendingOperation, {\n cardData,\n date: AccurateTimestamp.now(),\n });\n};\n\nconst getPendingOperation: () => ?PENDING_OPERATION_TYPE = () => LocalStorageManager.loadObject(StorageKeys.PendingOperation, null);\n\nconst clearPendingPurchase: () => void = () => {\n const pendingOp = getPendingOperation();\n const operationType = pendingOp?.cardData.pendingOperation?.operationType;\n\n if (operationType === PendingOperationKind.Purchase) {\n clearPendingOperation();\n }\n};\n\nconst clearPendingOperation: () => void = () => {\n LocalStorageManager.delete(StorageKeys.PendingOperation);\n};\n\nconst clearPendingOperationFromCard: (modalCard: ?ModalState) => ?ModalState = (modalCard) => {\n if (!modalCard) {\n return null;\n }\n\n const { cardData } = modalCard;\n if (!cardData) {\n return modalCard;\n }\n\n return {\n ...modalCard,\n cardData: {\n ...cardData,\n pendingOperation: undefined,\n },\n };\n};\n\nconst hasPendingOperation: () => boolean = () => getPendingOperation() !== null;\n\nconst checkPendingOperation: () => void = () => {\n const pendingOperation = getPendingOperation();\n\n if (!pendingOperation) {\n return;\n }\n\n const { cardData, date } = pendingOperation;\n\n if (date + PENDING_OPERATION_TTL < AccurateTimestamp.now()) {\n // Pending operation expired\n clearPendingOperation();\n return;\n }\n\n Messenger.emit(MessengerEvents.OPEN_CARD, cardData);\n};\n\nconst updatePendingOperationType: (newType: PendingOperationKind) => void = (newType) => {\n const pendingOperation = getPendingOperation();\n\n if (!pendingOperation) {\n return;\n }\n\n if (pendingOperation.cardData.pendingOperation?.operationType === undefined) {\n return;\n }\n\n pendingOperation.cardData.pendingOperation.operationType = newType;\n\n if (newType === PendingOperationKind.OpenCard) {\n /*\n * User was trying to play something but had no subscription, then refused to subscribe, hence, no need to try to play again\n * In this case, we also ensure that the correct card is open (series if required)\n */\n const { seriesId } = pendingOperation.cardData.item;\n if (seriesId) {\n pendingOperation.cardData.item.id = seriesId;\n }\n }\n\n LocalStorageManager.save(StorageKeys.PendingOperation, pendingOperation);\n};\n\nexport {\n checkPendingOperation,\n clearPendingOperation,\n clearPendingOperationFromCard,\n clearPendingPurchase,\n getPendingOperation,\n hasPendingOperation,\n storePendingOperation,\n updatePendingOperationType,\n};\n","/* @flow */\n\nexport enum XhrResponseType {\n ArrayBuffer = 'arraybuffer',\n Blob = 'blob',\n Json = 'json',\n Text = 'text',\n Xml = 'document',\n}\n\nconst getXhrResponseTypeFromString = (responseType: string): XhrResponseType => XhrResponseType.cast(responseType) ?? XhrResponseType.Text;\n\nconst handleFetchError: (response: any) => any = async (response) => {\n const { ok, status, statusText } = response;\n\n if (ok) {\n return response;\n }\n\n // Check statusText first\n if (statusText) {\n throw Error(`${status}:${statusText}`);\n }\n\n const contentType = response.headers.get('content-type');\n\n if (!contentType) {\n throw Error(status.toString());\n }\n\n if (contentType.startsWith('text/plain')) {\n // Read text response\n const textError = await response.text();\n throw Error(`${status}:${textError}`);\n }\n\n if (contentType.startsWith('application/json')) {\n // Read JSON response\n const { error, errorCode } = await response.json();\n throw Error(`${status}:${error}:${errorCode ?? ''}`);\n }\n\n throw Error(status.toString());\n};\n\nconst fetchJsonWithErrorCheck: (url: URL | string, options: any) => any = async (url, options) => {\n const response = await fetch(url, options);\n const checkedResponse = await handleFetchError(response);\n return checkedResponse.json();\n};\n\nconst fetchTextWithErrorCheck: (url: URL | string, options: any) => any = async (url, options) => {\n const response = await fetch(url, options);\n const checkedResponse = await handleFetchError(response);\n return checkedResponse.text();\n};\n\nexport { fetchJsonWithErrorCheck, fetchTextWithErrorCheck, getXhrResponseTypeFromString };\n","/* @flow */\n\nexport const REDUX_MSG_APPLICATION_REGISTER: 'REDUX_MSG_APPLICATION_REGISTER' = 'REDUX_MSG_APPLICATION_REGISTER';\nexport const REDUX_MSG_APPLICATION_UNREGISTER: 'REDUX_MSG_APPLICATION_UNREGISTER' = 'REDUX_MSG_APPLICATION_UNREGISTER';\nexport const REDUX_MSG_ASSOCIATED_DEVICES_UPDATE: 'NTG_RDX_MSG_ASSOCIATED_DEVICES' = 'NTG_RDX_MSG_ASSOCIATED_DEVICES';\nexport const REDUX_MSG_SET_DEVICE_ID: 'NTG_RDX_MSG_SET_DEVICE_ID' = 'NTG_RDX_MSG_SET_DEVICE_ID';\nexport const REDUX_MSG_UPDATE_AUTHENTICATION_TOKEN: 'NTG_RDX_MSG_LOGGED' = 'NTG_RDX_MSG_LOGGED';\nexport const REDUX_MSG_USER_INFO_RESET: 'REDUX_MSG_USER_INFO_RESET' = 'REDUX_MSG_USER_INFO_RESET';\nexport const REDUX_MSG_USER_INFO_UPDATE: 'REDUX_MSG_USER_INFO_UPDATE' = 'REDUX_MSG_USER_INFO_UPDATE';\n","/* @flow */\n\nimport {\n REDUX_MSG_APPLICATION_REGISTER,\n REDUX_MSG_APPLICATION_UNREGISTER,\n REDUX_MSG_ASSOCIATED_DEVICES_UPDATE,\n REDUX_MSG_SET_DEVICE_ID,\n REDUX_MSG_UPDATE_AUTHENTICATION_TOKEN,\n REDUX_MSG_USER_INFO_RESET,\n REDUX_MSG_USER_INFO_UPDATE,\n} from '../constants/';\nimport type { UserDeviceInfoType, UserInfo } from '../types/types';\nimport type { KeyValuePair } from '@ntg/utils/dist/types';\nimport type { NETGEM_API_DMS_ASSOCIATED_DEVICE } from '../../../libs/netgemLibrary/dms/types/AssociatedDevice';\n\nexport type AppRegistrationAction =\n // Default action\n | {| type: null |}\n // Register user\n | {|\n asGuest: boolean,\n type: typeof REDUX_MSG_APPLICATION_REGISTER,\n userInfo: UserDeviceInfoType,\n |}\n // Unregister user\n | {| type: typeof REDUX_MSG_APPLICATION_UNREGISTER |}\n // Update associated devices\n | {|\n associatedDevices: Array,\n type: typeof REDUX_MSG_ASSOCIATED_DEVICES_UPDATE,\n |}\n // Set device Id\n | {|\n deviceId: string,\n type: typeof REDUX_MSG_SET_DEVICE_ID,\n |}\n // Reset user info\n | {| type: typeof REDUX_MSG_USER_INFO_RESET |}\n // Update user info\n | {|\n userInfo: UserInfo,\n type: typeof REDUX_MSG_USER_INFO_UPDATE,\n |}\n // Update authentication token\n | {|\n authenticationToken: string | null,\n paymentSystemUrls: KeyValuePair,\n type: typeof REDUX_MSG_UPDATE_AUTHENTICATION_TOKEN,\n |};\n\nconst registerApplication: (userInfo: UserDeviceInfoType, asGuest: boolean) => AppRegistrationAction = (userInfo, asGuest) => {\n return {\n asGuest,\n type: REDUX_MSG_APPLICATION_REGISTER,\n userInfo,\n };\n};\n\nconst setDeviceId: (deviceId: string) => AppRegistrationAction = (deviceId) => {\n return {\n deviceId,\n type: REDUX_MSG_SET_DEVICE_ID,\n };\n};\n\nconst resetUserInfo: () => AppRegistrationAction = () => {\n return { type: REDUX_MSG_USER_INFO_RESET };\n};\n\nconst updateUserInfo: (userInfo: UserInfo) => AppRegistrationAction = (userInfo) => {\n return {\n type: REDUX_MSG_USER_INFO_UPDATE,\n userInfo,\n };\n};\n\nconst unregisterApplication: () => AppRegistrationAction = () => {\n return { type: REDUX_MSG_APPLICATION_UNREGISTER };\n};\n\nconst updateAssociatedDevices: (associatedDevices: Array) => AppRegistrationAction = (associatedDevices) => {\n return {\n associatedDevices,\n type: REDUX_MSG_ASSOCIATED_DEVICES_UPDATE,\n };\n};\n\nconst updateAuthenticationToken: (authenticationToken: string | null, paymentSystemUrls: KeyValuePair) => AppRegistrationAction = (authenticationToken, paymentSystemUrls) => {\n return {\n authenticationToken,\n paymentSystemUrls,\n type: REDUX_MSG_UPDATE_AUTHENTICATION_TOKEN,\n };\n};\n\nexport { registerApplication, resetUserInfo, setDeviceId, unregisterApplication, updateAssociatedDevices, updateAuthenticationToken, updateUserInfo };\n","/* @flow */\n\nimport './infiniteCircleLoaderArc.css';\nimport * as React from 'react';\nimport { Theme, type ThemeType } from '@ntg/ui/dist/theme';\nimport clsx from 'clsx';\n\n/* eslint-disable react/require-default-props */\ntype InfiniteCircleLoaderArcPropType = {|\n +className?: string,\n +theme?: ThemeType,\n|};\n/* eslint-enable react/require-default-props */\n\nconst InfiniteCircleLoaderArc = ({ className, theme = Theme.Dark }: InfiniteCircleLoaderArcPropType): React.Node =>
;\n\nexport default InfiniteCircleLoaderArc;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nvar DidomiSDK = function DidomiSDK(_ref) {\n var _ref$apiKey = _ref.apiKey,\n apiKeyProp = _ref$apiKey === void 0 ? null : _ref$apiKey,\n _ref$iabVersion = _ref.iabVersion,\n iabVersion = _ref$iabVersion === void 0 ? 2 : _ref$iabVersion,\n _ref$noticeId = _ref.noticeId,\n noticeId = _ref$noticeId === void 0 ? null : _ref$noticeId,\n _ref$platform = _ref.platform,\n platform = _ref$platform === void 0 ? null : _ref$platform,\n _ref$config = _ref.config,\n config = _ref$config === void 0 ? {} : _ref$config,\n _ref$gdprAppliesGloba = _ref.gdprAppliesGlobally,\n gdprAppliesGloballyProp = _ref$gdprAppliesGloba === void 0 ? true : _ref$gdprAppliesGloba,\n onReady = _ref.onReady,\n onConsentChanged = _ref.onConsentChanged,\n onNoticeShown = _ref.onNoticeShown,\n onNoticeHidden = _ref.onNoticeHidden,\n onNoticeBackdropclick = _ref.onNoticeBackdropclick,\n onNoticeClickAgree = _ref.onNoticeClickAgree,\n onNoticeClickMoreInfo = _ref.onNoticeClickMoreInfo,\n onPreferencesClickAgreeToAll = _ref.onPreferencesClickAgreeToAll,\n onPreferencesClickDisagreeToAll = _ref.onPreferencesClickDisagreeToAll,\n onPreferencesClickPurposeAgree = _ref.onPreferencesClickPurposeAgree,\n onPreferencesClickPurposeDisagree = _ref.onPreferencesClickPurposeDisagree,\n onPreferencesClickViewVendors = _ref.onPreferencesClickViewVendors,\n onPreferencesClickSaveChoices = _ref.onPreferencesClickSaveChoices,\n onPreferencesClickVendorAgree = _ref.onPreferencesClickVendorAgree,\n onPreferencesClickVendorDisagree = _ref.onPreferencesClickVendorDisagree,\n onPreferencesClickVendorSaveChoices = _ref.onPreferencesClickVendorSaveChoices,\n _ref$sdkPath = _ref.sdkPath,\n sdkPath = _ref$sdkPath === void 0 ? 'https://sdk.privacy-center.org/' : _ref$sdkPath,\n _ref$embedTCFStub = _ref.embedTCFStub,\n embedTCFStub = _ref$embedTCFStub === void 0 ? true : _ref$embedTCFStub;\n /**\n * Set all the Didomi event listeners from the props\n */\n var setEvents = function setEvents() {\n if (onReady) {\n window.didomiOnReady = window.didomiOnReady || [];\n window.didomiOnReady.push(onReady);\n }\n window.didomiEventListeners = window.didomiEventListeners || [];\n if (onConsentChanged) {\n window.didomiEventListeners.push({\n event: 'consent.changed',\n listener: function listener(e) {\n onConsentChanged(e.consentToken);\n }\n });\n }\n if (onNoticeShown) {\n window.didomiEventListeners.push({\n event: 'notice.shown',\n listener: function listener() {\n return onNoticeShown();\n }\n });\n }\n if (onNoticeHidden) {\n window.didomiEventListeners.push({\n event: 'notice.hidden',\n listener: function listener() {\n return onNoticeHidden();\n }\n });\n }\n if (onNoticeBackdropclick) {\n window.didomiEventListeners.push({\n event: 'notice.backdropclick',\n listener: function listener() {\n return onNoticeBackdropclick();\n }\n });\n }\n if (onNoticeClickAgree) {\n window.didomiEventListeners.push({\n event: 'notice.clickagree',\n listener: function listener() {\n return onNoticeClickAgree();\n }\n });\n }\n if (onNoticeClickMoreInfo) {\n window.didomiEventListeners.push({\n event: 'notice.clickmoreinfo',\n listener: function listener() {\n return onNoticeClickMoreInfo();\n }\n });\n }\n if (onPreferencesClickAgreeToAll) {\n window.didomiEventListeners.push({\n event: 'preferences.clickagreetoall',\n listener: function listener() {\n return onPreferencesClickAgreeToAll();\n }\n });\n }\n if (onPreferencesClickDisagreeToAll) {\n window.didomiEventListeners.push({\n event: 'preferences.clickdisagreetoall',\n listener: function listener() {\n return onPreferencesClickDisagreeToAll();\n }\n });\n }\n if (onPreferencesClickPurposeAgree) {\n window.didomiEventListeners.push({\n event: 'preferences.clickpurposeagree',\n listener: function listener() {\n return onPreferencesClickPurposeAgree();\n }\n });\n }\n if (onPreferencesClickPurposeDisagree) {\n window.didomiEventListeners.push({\n event: 'preferences.clickpurposedisagree',\n listener: function listener() {\n return onPreferencesClickPurposeDisagree();\n }\n });\n }\n if (onPreferencesClickViewVendors) {\n window.didomiEventListeners.push({\n event: 'preferences.clickviewvendors',\n listener: function listener() {\n return onPreferencesClickViewVendors();\n }\n });\n }\n if (onPreferencesClickSaveChoices) {\n window.didomiEventListeners.push({\n event: 'preferences.clicksavechoices',\n listener: function listener() {\n return onPreferencesClickSaveChoices();\n }\n });\n }\n if (onPreferencesClickVendorAgree) {\n window.didomiEventListeners.push({\n event: 'preferences.clickvendoragree',\n listener: function listener() {\n return onPreferencesClickVendorAgree();\n }\n });\n }\n if (onPreferencesClickVendorDisagree) {\n window.didomiEventListeners.push({\n event: 'preferences.clickvendordisagree',\n listener: function listener() {\n return onPreferencesClickVendorDisagree();\n }\n });\n }\n if (onPreferencesClickVendorSaveChoices) {\n window.didomiEventListeners.push({\n event: 'preferences.clickvendorsavechoices',\n listener: function listener() {\n return onPreferencesClickVendorSaveChoices();\n }\n });\n }\n };\n\n /**\n * Get the API Key from the props or from the config if it exists\n */\n var getApiKey = function getApiKey() {\n var apiKey;\n if (config.app && config.app.apiKey) {\n apiKey = config.app.apiKey;\n }\n return apiKeyProp || apiKey;\n };\n\n /**\n * Initialize the SDK, set the config object and insert the loader.js into the DOM\n */\n var init = function init() {\n var loaderParams;\n var apiKey = getApiKey();\n var gdprAppliesGlobally = gdprAppliesGloballyProp === false ? false : true;\n window.didomiConfig = config || {};\n\n // Set the SDK path\n window.didomiConfig.sdkPath = sdkPath;\n\n // Embed the Didomi SDK on the page\n window.gdprAppliesGlobally = gdprAppliesGlobally;\n if (noticeId) {\n loaderParams = \"target_type=notice&target=\" + noticeId;\n if (platform) {\n loaderParams = \"platform=\" + platform + \"&\" + loaderParams;\n }\n } else {\n loaderParams = \"target=\" + document.location.hostname;\n }\n\n // Embed the TCF stub\n if (embedTCFStub) {\n if (iabVersion === 2) {\n // TCF v2\n // prettier-ignore\n (function () {\n function a(e) {\n if (!window.frames[e]) {\n if (document.body && document.body.firstChild) {\n var t = document.body;\n var n = document.createElement(\"iframe\");\n n.style.display = \"none\";\n n.name = e;\n n.title = e;\n t.insertBefore(n, t.firstChild);\n } else {\n setTimeout(function () {\n a(e);\n }, 5);\n }\n }\n }\n function e(n, r, o, c, s) {\n function e(e, t, n, a) {\n if (typeof n !== \"function\") {\n return;\n }\n if (!window[r]) {\n window[r] = [];\n }\n var i = false;\n if (s) {\n i = s(e, t, n);\n }\n if (!i) {\n window[r].push({\n command: e,\n parameter: t,\n callback: n,\n version: a\n });\n }\n }\n e.stub = true;\n function t(a) {\n if (!window[n] || window[n].stub !== true) {\n return;\n }\n if (!a.data) {\n return;\n }\n var i = typeof a.data === \"string\";\n var e;\n try {\n e = i ? JSON.parse(a.data) : a.data;\n } catch (t) {\n return;\n }\n if (e[o]) {\n var r = e[o];\n window[n](r.command, r.parameter, function (e, t) {\n var n = {};\n n[c] = {\n returnValue: e,\n success: t,\n callId: r.callId\n };\n a.source.postMessage(i ? JSON.stringify(n) : n, \"*\");\n }, r.version);\n }\n }\n if (typeof window[n] !== \"function\") {\n window[n] = e;\n if (window.addEventListener) {\n window.addEventListener(\"message\", t, false);\n } else {\n window.attachEvent(\"onmessage\", t);\n }\n }\n }\n e(\"__tcfapi\", \"__tcfapiBuffer\", \"__tcfapiCall\", \"__tcfapiReturn\");\n a(\"__tcfapiLocator\");\n })();\n } else {\n // TCF v1\n // prettier-ignore\n (function () {\n function r() {\n if (!window.frames.__cmpLocator) {\n if (document.body && document.body.firstChild) {\n var e = document.body;\n var t = document.createElement(\"iframe\");\n t.style.display = \"none\";\n t.name = \"__cmpLocator\";\n t.title = \"cmpLocator\";\n e.insertBefore(t, e.firstChild);\n } else {\n setTimeout(r, 5);\n }\n }\n }\n function e(e, t, r) {\n if (typeof r !== \"function\") {\n return;\n }\n if (!window.__cmpBuffer) {\n window.__cmpBuffer = [];\n }\n if (e === \"ping\") {\n r({\n gdprAppliesGlobally: window.gdprAppliesGlobally,\n cmpLoaded: false\n }, true);\n } else {\n window.__cmpBuffer.push({\n command: e,\n parameter: t,\n callback: r\n });\n }\n }\n e.stub = true;\n function t(a) {\n if (!window.__cmp || window.__cmp.stub !== true) {\n return;\n }\n if (!a.data) {\n return;\n }\n var n = typeof a.data === \"string\";\n var e;\n try {\n e = n ? JSON.parse(a.data) : a.data;\n } catch (t) {\n return;\n }\n if (e.__cmpCall) {\n var o = e.__cmpCall;\n window.__cmp(o.command, o.parameter, function (e, t) {\n var r = {\n __cmpReturn: {\n returnValue: e,\n success: t,\n callId: o.callId\n }\n };\n a.source.postMessage(n ? JSON.stringify(r) : r, \"*\");\n });\n }\n }\n if (typeof window.__cmp !== \"function\") {\n window.__cmp = e;\n if (window.addEventListener) {\n window.addEventListener(\"message\", t, false);\n } else {\n window.attachEvent(\"onmessage\", t);\n }\n }\n r();\n })();\n }\n }\n var spcloaderId = 'spcloader';\n var spcloaderScript = document.getElementById(spcloaderId);\n\n // Didomi is already loaded, no need to add the script again\n if (spcloaderScript) {\n return null;\n }\n\n // Embed the SDK\n var loaderScript = document.createElement('script');\n loaderScript.id = spcloaderId;\n loaderScript.type = 'text/javascript';\n loaderScript.async = true;\n loaderScript.src = sdkPath + apiKey + '/loader.js?' + loaderParams;\n loaderScript.charset = 'utf-8';\n var firstScriptTagInDocument = document.getElementsByTagName('script')[0];\n firstScriptTagInDocument.parentNode.insertBefore(loaderScript, firstScriptTagInDocument);\n };\n React.useEffect(function () {\n setEvents();\n init();\n }, []);\n return null;\n};\nDidomiSDK.propTypes = {\n apiKey: PropTypes.string,\n iabVersion: PropTypes.number,\n noticeId: PropTypes.string,\n platform: PropTypes.string,\n config: PropTypes.object,\n gdprAppliesGlobally: PropTypes.bool,\n onReady: PropTypes.func,\n onConsentChanged: PropTypes.func,\n onNoticeShown: PropTypes.func,\n onNoticeHidden: PropTypes.func,\n onNoticeBackdropclick: PropTypes.func,\n onNoticeClickAgree: PropTypes.func,\n onNoticeClickMoreInfo: PropTypes.func,\n onPreferencesClickAgreeToAll: PropTypes.func,\n onPreferencesClickDisagreeToAll: PropTypes.func,\n onPreferencesClickPurposeAgree: PropTypes.func,\n onPreferencesClickPurposeDisagree: PropTypes.func,\n onPreferencesClickViewVendors: PropTypes.func,\n onPreferencesClickSaveChoices: PropTypes.func,\n onPreferencesClickVendorAgree: PropTypes.func,\n onPreferencesClickVendorDisagree: PropTypes.func,\n onPreferencesClickVendorSaveChoices: PropTypes.func,\n sdkPath: PropTypes.string,\n embedTCFStub: PropTypes.bool\n};\nexport { DidomiSDK };","/* @flow */\n\nconst mapUnion = (map: Map, otherMap: Map) => {\n for (const item of otherMap) {\n map.set(...item);\n }\n};\n\nexport { mapUnion };\n","/* @flow */\n\nimport { ItemType, type NETGEM_API_V8_FEED_ITEM, type NETGEM_API_V8_FEED_RAW_ITEM, NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT } from '../../libs/netgemLibrary/v8/types/FeedItem';\nimport { getItemType, getLocationStartAndEndTime, getLocationType } from '../../libs/netgemLibrary/v8/helpers/Item';\n\n// Search in a raw item a program matching time (in ms)\nconst searchInFeedRawItem: (rawItem: NETGEM_API_V8_FEED_RAW_ITEM, channelId: string, time: number) => NETGEM_API_V8_FEED_ITEM | null = (rawItem, channelId, time) => {\n const { id: rawItemId } = rawItem;\n const stack = [rawItem];\n\n while (stack.length > 0) {\n const item = stack.pop();\n\n // Since flowjs v0.239.0, \"item\" is said to be potentially undefined (which is impossible, here)\n if (!item) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const { elements, id: itemId, locations } = item;\n\n if (elements) {\n for (let i = 0; i < elements.length; ++i) {\n stack.unshift(elements[i]);\n }\n } else if (locations) {\n for (let j = 0; j < locations.length; ++j) {\n const { [j]: location } = locations;\n const { channelId: rawChannelId, id, score } = location;\n\n // First, check if channel Id matches\n if (rawChannelId === channelId) {\n const locType = getLocationType(id);\n\n // Then, check location type (only scheduled events are wanted)\n if (locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT) {\n const { endTime, startTime } = getLocationStartAndEndTime(location);\n const itemType = getItemType(rawItemId);\n const seriesId = itemType === ItemType.Series ? rawItemId : null;\n const type = itemType === ItemType.Series ? ItemType.Series : ItemType.Program;\n\n // Finally, check the times\n if (startTime <= time && time <= endTime) {\n return {\n ...rawItem,\n endTime,\n locType,\n score,\n selectedLocation: location,\n selectedProgramId: itemId,\n seriesId,\n startTime,\n type,\n };\n }\n }\n }\n }\n }\n }\n\n return null;\n};\n\nexport { searchInFeedRawItem };\n","/* @flow */\n\nimport type { NetgemApiEmitterType, RequestResponseMethodDefinitionType } from '../emitter';\nimport type { CombinedReducers } from '../../../reducers';\nimport type { Dispatch } from '../../../types/types';\nimport type { NETGEM_API_V8_PARAM } from '../../../../libs/netgemLibrary/v8/types/Param';\nimport type { NETGEM_API_V8_URL_DEFINITION } from '../../../../libs/netgemLibrary/v8/types/NtgVideoFeed';\nimport { REDUX_MSG_REQUEST_GENERIC } from '../../constants/';\nimport { createCustomNetworkErrorFromKey } from '../../../../libs/netgemLibrary/helpers/CreateCustomNetworkError';\nimport { generateApiUrl } from '../helpers/api';\n\nconst buildUrlDefinition: (locationEpgUrl: NETGEM_API_V8_URL_DEFINITION, newParams: ?Array) => NETGEM_API_V8_URL_DEFINITION = (locationEpgUrl, newParams) => {\n if (!newParams) {\n return locationEpgUrl;\n }\n\n const { params = [] } = locationEpgUrl;\n\n const urlDef = {\n ...locationEpgUrl,\n params: [...params],\n };\n\n const { params: currentParams = [] } = urlDef;\n\n newParams.forEach((newParam) => {\n const pos = currentParams.findIndex((param) => param.name === newParam.name);\n if (pos === -1) {\n currentParams.push(newParam);\n } else {\n currentParams[pos] = newParam;\n }\n });\n\n return urlDef;\n};\n\nconst getChannelList: (channelIds: Array | string | null) => string | null = (channelIds) => {\n if (typeof channelIds === 'string') {\n return channelIds;\n }\n\n if (Array.isArray(channelIds)) {\n return JSON.stringify(channelIds);\n }\n\n return null;\n};\n\nconst sendV8LocationEpgRequest: (\n startDate: number,\n range: number,\n newParams?: Array,\n channelIds: Array | string | null,\n signal?: AbortSignal,\n) => RequestResponseMethodDefinitionType =\n (startDate, range, newParams, channelIds, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise => {\n const state = getState();\n const {\n netgemApi: { locationEpgUrl },\n } = state;\n\n if (!locationEpgUrl) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definition', { urlDef: 'locationEpgUrl' }));\n }\n\n const { authent, method } = locationEpgUrl;\n const channelList = getChannelList(channelIds);\n\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_GENERIC, {\n authent,\n method,\n signal,\n uri: generateApiUrl(\n buildUrlDefinition(locationEpgUrl, newParams),\n {\n channelList,\n range,\n startDate,\n },\n state,\n ),\n });\n };\n\nexport default sendV8LocationEpgRequest;\n","/* @flow */\n\nimport type { Dispatch, Store } from '../../redux/types/types';\nimport { FAKE_CHANNEL_ITEM, FAKE_LOCATION } from '../../components/avenue/section/SectionConstsAndTypes';\nimport { Messenger, MessengerEvents } from '@ntg/utils/dist/messenger';\nimport type { NETGEM_API_V8_FEED, NETGEM_API_V8_FEED_ITEM } from '../../libs/netgemLibrary/v8/types/FeedItem';\nimport { addMissingChannels, filterDuplicates } from '../channel/helper';\nimport { filterChannels, filterLiveFeed, sortFeed, splitFeedByChannels } from '../../libs/netgemLibrary/v8/helpers/Feed';\nimport { logWarning, showFinishingLivePrograms } from '../debug/debug';\nimport AccurateTimestamp from '../dateTime/AccurateTimestamp';\nimport type { CombinedReducers } from '../../redux/reducers';\nimport { EPG } from '../ui/constants';\nimport type { NETGEM_API_V8_RAW_FEED } from '../../libs/netgemLibrary/v8/types/FeedResult';\nimport type { NETGEM_API_V8_SECTION } from '../../libs/netgemLibrary/v8/types/Section';\nimport { buildFeedItem } from '../../libs/netgemLibrary/v8/helpers/Item';\nimport { ignoreIfAborted } from '../../libs/netgemLibrary/helpers/cancellablePromise/promiseHelper';\nimport { mapUnion } from '../jsHelpers/dataStructure';\nimport { searchInFeedRawItem } from './helper';\nimport sendV8LocationEpgRequest from '../../redux/netgemApi/actions/v8/epg';\n\nclass EpgManager {\n abortController: AbortController;\n\n cachedFeed: NETGEM_API_V8_RAW_FEED;\n\n // Keys are channel Ids and values are associated feed\n cachedFeedTemp: Map;\n\n dispatch: Dispatch;\n\n // eslint-disable-next-line no-use-before-define\n static instance: EpgManager;\n\n getState: () => CombinedReducers;\n\n feedCachedTimer: TimeoutID | null;\n\n feedLiveTimer: TimeoutID | null;\n\n isRefreshing: boolean;\n\n lastLiveFeed: NETGEM_API_V8_FEED;\n\n constructor(store: Store) {\n const { dispatch, getState } = store;\n\n this.abortController = new AbortController();\n this.cachedFeed = [];\n this.cachedFeedTemp = new Map();\n this.dispatch = dispatch;\n this.feedCachedTimer = null;\n this.feedLiveTimer = null;\n this.getState = getState;\n this.isRefreshing = false;\n this.lastLiveFeed = [];\n\n Messenger.on(MessengerEvents.AUTHENTICATION_TOKEN_CHANGED, this.refreshCachedFeed);\n Messenger.on(MessengerEvents.DEBUG_SHOW_FINISHING_LIVE_PROGRAMS, this.handleShowFinishingLivePrograms);\n }\n\n // $FlowFixMe: Flow does not support symbols yet\n get [Symbol.toStringTag]() {\n return 'EpgManager';\n }\n\n /*\n * Static methods\n */\n\n static initialize: (store: Store) => void = (store) => {\n if (EpgManager.instance) {\n return;\n }\n\n EpgManager.instance = new EpgManager(store);\n };\n\n static isRefreshing: () => boolean = () => EpgManager.instance?.isRefreshing ?? true;\n\n static initializeCachedFeed: () => void = () => {\n if (!EpgManager.instance) {\n // Too early: channel list not initialized yet\n return;\n }\n\n EpgManager.instance.refreshCachedFeed();\n };\n\n static getLiveFeed: (section: NETGEM_API_V8_SECTION, sectionChannels: Set, hubItem: ?NETGEM_API_V8_FEED_ITEM) => NETGEM_API_V8_FEED = (section, sectionChannels, hubItem) => {\n if (!EpgManager.instance) {\n logWarning('Cannot get live feed because EPG Manager has not been initialized');\n return [];\n }\n\n return EpgManager.instance.getLiveFeed(section, sectionChannels, hubItem);\n };\n\n // Find the program that satisfies start <= time <= end, with time in seconds\n static findItem: (channelId: string, time: number) => NETGEM_API_V8_FEED_ITEM | null = (channelId, time) => {\n if (!EpgManager.instance) {\n logWarning('Cannot find item because EPG Manager has not been initialized');\n return null;\n }\n\n return EpgManager.instance.findItem(channelId, time);\n };\n\n static buildFakeChannelsSection: (section: NETGEM_API_V8_SECTION, sectionChannels: Set) => NETGEM_API_V8_FEED | null = (section, sectionChannels) => {\n if (!EpgManager.instance) {\n logWarning('Cannot build fake channel section because EPG Manager has not been initialized');\n return null;\n }\n\n return EpgManager.instance.buildFakeChannelsSection(section, sectionChannels);\n };\n\n /*\n * Class methods\n */\n\n getEpgChunk: (startTime: number, channelIds: Array) => Promise> = (startTime, channelIds) => {\n const {\n abortController: { signal },\n dispatch,\n } = this;\n\n return dispatch(sendV8LocationEpgRequest(startTime, EPG.FeedRange, undefined, channelIds, signal))\n .then((results) => {\n signal.throwIfAborted();\n\n const feedMap = splitFeedByChannels(((results.result.feed: any): NETGEM_API_V8_RAW_FEED));\n mapUnion(this.cachedFeedTemp, feedMap);\n\n return Promise.resolve();\n })\n .catch((error) => ignoreIfAborted(signal, error));\n };\n\n startTimer: () => void = () => {\n if (this.feedCachedTimer !== null) {\n clearTimeout(this.feedCachedTimer);\n }\n\n this.feedCachedTimer = setTimeout(this.refreshCachedFeed, EPG.IntervalCachedLiveFeed);\n };\n\n // Load EPG data for all channels, by chunks\n refreshCachedFeed: () => void = () => {\n const {\n appConfiguration: { deviceChannels },\n } = this.getState();\n\n const channels = Object.values(deviceChannels);\n\n if (channels.length === 0) {\n // Too early: channel list not initialized yet\n this.cachedFeed = [];\n this.startTimer();\n return;\n }\n\n const visibleChannels = channels.filter(({ isHidden }) => !isHidden);\n\n if (visibleChannels.length === 0) {\n logWarning('No visible channel. Cached live feed is empty');\n this.cachedFeed = [];\n this.startTimer();\n return;\n }\n\n const startBase = new Date(AccurateTimestamp.now() - EPG.RewindPeriod);\n startBase.setMinutes(0);\n startBase.setSeconds(0);\n const startTime = startBase.getTime();\n\n this.isRefreshing = true;\n\n // Create temporary feed bucket\n this.cachedFeedTemp = new Map();\n\n const promises = [];\n for (let startIndex = 0; startIndex < visibleChannels.length; startIndex += EPG.ChannelChunkSize) {\n const channelIds = [];\n for (let j = startIndex; j < startIndex + EPG.ChannelChunkSize && j < visibleChannels.length; j++) {\n channelIds.push(visibleChannels[j].epgid);\n }\n promises.push(this.getEpgChunk(startTime, channelIds));\n }\n\n Promise.allSettled(promises).then(() => {\n this.isRefreshing = false;\n this.cachedFeed.length = 0;\n this.cachedFeedTemp.forEach((feed) => this.cachedFeed.push(...feed));\n\n this.startTimer();\n });\n };\n\n getLiveFeed: (section: NETGEM_API_V8_SECTION, sectionChannels: Set, hubItem: ?NETGEM_API_V8_FEED_ITEM) => NETGEM_API_V8_FEED = (section, sectionChannels, hubItem) => {\n const {\n appConfiguration: { deviceChannels },\n } = this.getState();\n\n // Get live items from cached live feed\n const newFeed = filterLiveFeed(this.cachedFeed, deviceChannels, section.model.slice);\n\n // Only keep channels present in the section\n filterChannels(newFeed, deviceChannels, sectionChannels);\n\n if (!hubItem) {\n addMissingChannels(newFeed, sectionChannels);\n }\n\n // Could happen when programs overlap\n filterDuplicates(newFeed);\n\n if (section.model.scoring) {\n sortFeed(newFeed, section.model.scoring, { channels: deviceChannels });\n }\n\n this.lastLiveFeed = newFeed;\n\n return newFeed;\n };\n\n // Find the program that satisfies start <= time <= end, with time in seconds\n findItem: (channelId: string, time: number) => NETGEM_API_V8_FEED_ITEM | null = (channelId, time) => {\n // TODO: use cache\n const { length } = this.cachedFeed;\n if (length === 0) {\n return null;\n }\n\n let matchingItem: NETGEM_API_V8_FEED_ITEM | null = null;\n for (let i = 0; i < length; i++) {\n const { [i]: item } = this.cachedFeed;\n\n matchingItem = searchInFeedRawItem(item, channelId, time);\n\n if (matchingItem) {\n // Item found, no need to keep searching\n return matchingItem;\n }\n }\n\n return null;\n };\n\n buildFakeChannelsSection: (section: NETGEM_API_V8_SECTION, sectionChannels: Set) => NETGEM_API_V8_FEED | null = (section, sectionChannels) => {\n const {\n appConfiguration: { deviceChannels: channels },\n } = this.getState();\n\n if (sectionChannels === null) {\n // Not ready\n return null;\n }\n\n if (sectionChannels.size === 0) {\n return [];\n }\n\n const feed: NETGEM_API_V8_FEED = [];\n\n // Create fake channel items\n sectionChannels.forEach((channelId) => {\n const fakeItem = {\n ...FAKE_CHANNEL_ITEM,\n id: channelId,\n };\n const fakeLocation = {\n ...FAKE_LOCATION,\n channelId,\n };\n fakeItem.locations = [fakeLocation];\n const feedItem = buildFeedItem(fakeItem);\n if (feedItem) {\n feed.push(feedItem);\n }\n });\n\n if (section.model.scoring) {\n sortFeed(feed, section.model.scoring, { channels });\n }\n\n return feed;\n };\n\n handleShowFinishingLivePrograms: (itemCountPerPage?: number, maxTime?: number, maxItems?: number) => void = (itemCountPerPage, maxTime, maxItems) => {\n showFinishingLivePrograms(this.lastLiveFeed, itemCountPerPage, maxTime, maxItems);\n };\n}\n\nexport default EpgManager;\n","/* @flow */\n\nimport type { ChannelMap } from './Channel';\nimport type { NETGEM_API_VIEWINGHISTORY_PLAYED_ITEMS } from './ViewingHistory';\n\nexport enum FeedProviderKind {\n Aggregation,\n Local,\n NtgVideo,\n}\n\nexport type NETGEM_API_V8_FEED_OP_FILTER = {|\n args?: Array,\n op: string,\n|};\n\nexport type NETGEM_API_V8_FEED_SCORING_OP = {|\n args?: Array,\n op: string,\n order?: 'asc' | 'desc',\n|};\n\nexport type NETGEM_API_V8_FEED_SCORING = Array;\n\nexport type NETGEM_API_V8_FEED_OP_SLICE = [number, number];\n\nexport type NETGEM_API_V8_FEED_DESCRIPTION = {|\n filter?: NETGEM_API_V8_FEED_OP_FILTER | null,\n scoring?: NETGEM_API_V8_FEED_SCORING,\n provider: FeedProviderKind,\n queryType?: string,\n slice?: NETGEM_API_V8_FEED_OP_SLICE,\n|};\n\nexport type ScoreContextType = {|\n channels?: ChannelMap,\n playedItemsMap?: NETGEM_API_VIEWINGHISTORY_PLAYED_ITEMS,\n sessionId?: string,\n|};\n\nexport type FeedRequestFunction = (assetId: string, startDate: number, range: number, channelIds?: Array, signal?: AbortSignal) => Promise;\n","/* @flow */\n\nimport type { NetgemApiEmitterType, RequestResponseMethodDefinitionType } from '../emitter';\nimport { updateAvenueList, updateDefaultActions } from '../../../ui/actions';\nimport type { CombinedReducers } from '../../../reducers';\nimport type { Dispatch } from '../../../types/types';\nimport { FeedProviderKind } from '../../../../libs/netgemLibrary/v8/types/Feed';\nimport LocalStorageManager from '../../../../helpers/localStorage/localStorageManager';\nimport { MILLISECONDS_PER_SECOND } from '../../../../helpers/dateTime/Format';\nimport { type NETGEM_API_V8_AGGREGATION_FEED } from '../../../../libs/netgemLibrary/v8/types/AggregationFeed';\nimport { type NETGEM_API_V8_AVENUE } from '../../../../libs/netgemLibrary/v8/types/Avenue';\nimport { type NETGEM_API_V8_DEFAULT_ACTIONS } from '../../../../libs/netgemLibrary/v8/types/WidgetConfig';\nimport type { NETGEM_API_V8_HUB } from '../../../../libs/netgemLibrary/v8/types/Hub';\nimport { type NETGEM_API_V8_NTG_VIDEO_FEED } from '../../../../libs/netgemLibrary/v8/types/NtgVideoFeed';\nimport { type NETGEM_API_V8_REQUEST_RESPONSE } from '../../../../libs/netgemLibrary/v8/types/RequestResponse';\nimport { type NETGEM_API_V8_SECTION } from '../../../../libs/netgemLibrary/v8/types/Section';\nimport { REDUX_MSG_REQUEST_GENERIC } from '../../constants/';\nimport { StorageKeys } from '../../../../helpers/localStorage/keys';\nimport { createCustomNetworkErrorFromKey } from '../../../../libs/netgemLibrary/helpers/CreateCustomNetworkError';\nimport { generateApiUrl } from '../helpers/api';\nimport { getSettingValueByName } from '../helpers/settings';\n\n// Delay before actually doing hub query when a previous one has been found in the local storage (in ms)\nconst OPTIMISTIC_HUB_REFRESH_DELAY = 1_000;\n\n// Delay before actually doing default actions query when previous ones have been found in the local storage (in ms)\nconst OPTIMISTIC_DEFAULT_ACTIONS_REFRESH_DELAY = 2_000;\n\nconst validateSection: (section: NETGEM_API_V8_SECTION) => boolean = (section) => {\n const { model }: { model: NETGEM_API_V8_NTG_VIDEO_FEED | NETGEM_API_V8_AGGREGATION_FEED } = section;\n const { provider } = model;\n\n if (provider === FeedProviderKind.Aggregation) {\n const { sources } = ((model: any): NETGEM_API_V8_AGGREGATION_FEED);\n\n if (!sources) {\n return true;\n }\n\n for (let i = 0; i < sources.length; i++) {\n const { provider: srcProvider } = sources[i];\n if (srcProvider !== FeedProviderKind.NtgVideo && srcProvider !== FeedProviderKind.Local) {\n return false;\n }\n }\n\n return true;\n }\n\n return provider === FeedProviderKind.NtgVideo || provider === FeedProviderKind.Local;\n};\n\nconst validateAvenue: (avenue: NETGEM_API_V8_AVENUE) => boolean = (avenue) => {\n const { sections } = avenue;\n\n if (!sections) {\n return false;\n }\n\n avenue.sections = sections.filter(validateSection);\n return sections.length > 0;\n};\n\nconst getValidHub: (hub: NETGEM_API_V8_HUB) => NETGEM_API_V8_HUB = (hub) => hub.filter(validateAvenue);\n\nconst sendV8HubRequest: (hubKey: ?string, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (hubKey, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise => {\n const state = getState();\n const {\n appConfiguration,\n netgemApi: { hubUrl },\n ui: { hubETag: initialETag },\n } = state;\n\n if (!hubUrl) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definition', { urlDef: 'hubUrl' }));\n }\n\n // Startup optimization: get last hub response from local storage and do the actual query in background after a few seconds\n if (!hubKey && !initialETag) {\n const optimisticHubResult = LocalStorageManager.loadObject(StorageKeys.OptimisticHub);\n if (optimisticHubResult) {\n LocalStorageManager.delete(StorageKeys.OptimisticHub);\n dispatch(updateAvenueList(optimisticHubResult, OPTIMISTIC_HUB_REFRESH_DELAY, null));\n return Promise.resolve(optimisticHubResult);\n }\n }\n\n /*\n * The old 'platform.hubkey' has been replaced by 'platform.hubkeys.home' but the setting has yet to be deployed in all realms and environments\n * So, in the meantime, we fall back to the old setting\n */\n const key = hubKey ?? getSettingValueByName('platform.hubkeys', 'home', appConfiguration) ?? getSettingValueByName('platform', 'hubkey', appConfiguration);\n const { authent, method } = hubUrl;\n\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_GENERIC, {\n authent,\n eTag: hubKey ? null : initialETag,\n method,\n signal,\n uri: generateApiUrl(hubUrl, { key }, state),\n }).then((response: NETGEM_API_V8_REQUEST_RESPONSE) => {\n const { cacheMaxAge, eTag: hubETag, result } = response;\n const hubResult: NETGEM_API_V8_HUB = getValidHub(result);\n\n if (!hubKey) {\n // General hub: sets all avenues\n\n if (hubETag !== null && hubETag === initialETag) {\n // Not modified\n return Promise.resolve();\n }\n\n // Startup optimization: store last hub response in local storage\n LocalStorageManager.save(StorageKeys.OptimisticHub, hubResult);\n\n const hubMaxAge = cacheMaxAge ? cacheMaxAge * MILLISECONDS_PER_SECOND : null;\n dispatch(updateAvenueList(hubResult, hubMaxAge, hubETag ?? null));\n }\n\n return Promise.resolve(hubResult);\n });\n };\n\nconst sendV8DefaultHubRequest: (signal?: AbortSignal, skipCache?: boolean) => RequestResponseMethodDefinitionType =\n (signal, skipCache) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise => {\n const state = getState();\n const {\n netgemApi: { defaultHubUrl },\n } = state;\n\n if (!defaultHubUrl) {\n // Old version\n return Promise.resolve();\n }\n\n // Startup optimization: get last default actions from local storage and do the actual query in background afterwards\n const optimisticDefaultActions = LocalStorageManager.loadObject(StorageKeys.OptimisticDefaultActions);\n if (optimisticDefaultActions && !skipCache) {\n dispatch(updateDefaultActions(optimisticDefaultActions));\n setTimeout(() => dispatch(sendV8DefaultHubRequest(undefined, true)), OPTIMISTIC_DEFAULT_ACTIONS_REFRESH_DELAY);\n return Promise.resolve();\n }\n\n const { authent, method } = defaultHubUrl;\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_GENERIC, {\n authent,\n method,\n signal,\n uri: generateApiUrl(defaultHubUrl, {}, state),\n }).then((response: NETGEM_API_V8_REQUEST_RESPONSE) => {\n const { actions } = (response.result: NETGEM_API_V8_DEFAULT_ACTIONS);\n\n LocalStorageManager.save(StorageKeys.OptimisticDefaultActions, actions);\n dispatch(updateDefaultActions(actions));\n return Promise.resolve();\n });\n };\n\nexport { getValidHub, sendV8DefaultHubRequest, sendV8HubRequest };\n","/* @flow */\n\nexport const AVENUE_ID_EXPLORE: 'explore_avenue_id' = 'explore_avenue_id';\nexport const AVENUE_ID_MYVIDEOS: 'mylists_avenue_id' = 'mylists_avenue_id';\n","/* @flow */\n\nimport './ButtonBack.css';\nimport * as React from 'react';\nimport { PictoArrowLeft, PictoArrowLeftWithShaft } from '@ntg/components/dist/pictos/Element';\nimport type { BasicFunction } from '@ntg/utils/dist/types';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport clsx from 'clsx';\n\n/* eslint-disable react/require-default-props */\ntype PropType = {|\n +className: string,\n +hasShaft?: boolean,\n +hasText?: boolean,\n +onClick: (event: SyntheticMouseEvent | SyntheticTouchEvent) => Promise | void,\n +onMouseEnter?: BasicFunction,\n +onMouseLeave?: BasicFunction,\n|};\n/* eslint-enable react/require-default-props */\n\nconst ButtonBack = ({ className, hasShaft = false, hasText = true, onClick, onMouseEnter, onMouseLeave }: PropType): React.Node => (\n \n);\n\nexport default ButtonBack;\n","/* @flow */\n\nimport './SearchHistoryTerm.css';\nimport * as React from 'react';\nimport { PictoReplay, PictoX } from '@ntg/components/dist/pictos/Element';\nimport type { Dispatch } from '../../redux/types/types';\nimport { connect } from 'react-redux';\nimport { deleteSearchHistoryTerm } from '../../redux/ui/actions';\n\ntype ReduxSearchHistoryTermDispatchToPropsType = {|\n +localDeleteSearchString: (searchString: string) => void,\n|};\n\ntype SearchHistoryTermPropType = {|\n +onClick: (term: string) => void,\n +term: string,\n|};\n\ntype CompleteSearchHistoryTermPropType = {|\n ...SearchHistoryTermPropType,\n ...ReduxSearchHistoryTermDispatchToPropsType,\n|};\n\ntype SearchHistoryTermStateType = {||};\n\nclass SearchHistoryTermView extends React.PureComponent {\n handleSearchOnClick: () => void = () => {\n const { onClick, term } = this.props;\n\n onClick(term);\n };\n\n handleDeleteOnClick: () => void = () => {\n const { localDeleteSearchString, term } = this.props;\n\n localDeleteSearchString(term);\n };\n\n render(): React.Node {\n const { term } = this.props;\n\n return (\n
\n
\n \n
\n
\n {term}\n
\n \n
\n );\n }\n}\n\nconst mapDispatchToProps = (dispatch: Dispatch): ReduxSearchHistoryTermDispatchToPropsType => {\n return {\n localDeleteSearchString: (searchString: string) => dispatch(deleteSearchHistoryTerm(searchString)),\n };\n};\n\nconst SearchHistoryTerm: React.ComponentType = connect(null, mapDispatchToProps, null, { forwardRef: true })(SearchHistoryTermView);\n\nexport default SearchHistoryTerm;\n","/* @flow */\n\nimport './SearchHistory.css';\nimport * as React from 'react';\nimport type { CombinedReducers } from '../../redux/reducers';\nimport SearchHistoryTerm from './SearchHistoryTerm';\nimport { connect } from 'react-redux';\n\ntype ReduxSearchHistoryReducerStateType = {|\n +searchHistory: Array,\n|};\n\ntype SearchHistoryPropType = {|\n +onSearchStringClick: (searchString: string) => void,\n|};\n\ntype CompleteSearchHistoryPropType = {|\n ...SearchHistoryPropType,\n ...ReduxSearchHistoryReducerStateType,\n|};\n\nclass SearchHistoryView extends React.PureComponent {\n render(): React.Node {\n const { onSearchStringClick, searchHistory } = this.props;\n\n if (searchHistory.length === 0) {\n // Only display non-empty history\n return null;\n }\n\n return (\n
\n {searchHistory.map((term) => (\n \n ))}\n
\n );\n }\n}\n\nconst mapStateToProps = (state: CombinedReducers): ReduxSearchHistoryReducerStateType => {\n return {\n searchHistory: state.ui.searchHistory,\n };\n};\n\nconst SearchHistory: React.ComponentType = connect(mapStateToProps, null, null, { forwardRef: true })(SearchHistoryView);\n\nexport default SearchHistory;\n","/* @flow */\n\nimport { type NETGEM_API_V8_AGGREGATION_FEED } from './AggregationFeed';\nimport { type NETGEM_API_V8_NTG_VIDEO_FEED } from './NtgVideoFeed';\nimport { type NETGEM_API_V8_WIDGET } from './Widget';\nimport { SectionType } from '../../../../helpers/ui/section/types';\n\nexport const LocalFeed = Object.freeze({\n Channels: 'channels/list',\n ViewingHistory: 'viewinghistory',\n Wishlist: 'wishlist',\n});\n\nexport type NETGEM_API_V8_SECTION = {|\n ...NETGEM_API_V8_WIDGET,\n kind: SectionType,\n model: NETGEM_API_V8_AGGREGATION_FEED | NETGEM_API_V8_NTG_VIDEO_FEED,\n version: number,\n|};\n","/* @flow */\n\nexport enum SortKind {\n Chronological,\n Default,\n}\n\nexport enum SortDirection {\n Ascendant,\n Descendant,\n}\n\nexport type SortAndFilterType = {|\n direction: SortDirection,\n filter: string,\n kind: SortKind,\n|};\n","/* @flow */\n\nimport * as React from 'react';\nimport { type CompleteSectionPropType, LOCAL_PROVIDER_QUERY, type LocalPlayedItemType, type SectionStateType } from './SectionConstsAndTypes';\nimport { FeedProviderKind, type FeedRequestFunction } from '../../../libs/netgemLibrary/v8/types/Feed';\nimport { MILLISECONDS_PER_HOUR, MILLISECONDS_PER_WEEK, getIso8601DurationInSeconds } from '../../../helpers/dateTime/Format';\nimport {\n type NETGEM_API_V8_FEED_ITEM,\n type NETGEM_API_V8_FEED_RAW_ITEM,\n type NETGEM_API_V8_ITEM_LOCATION_TYPE,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_CATCHUP,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_EST,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_SVOD,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_TVOD,\n} from '../../../libs/netgemLibrary/v8/types/FeedItem';\nimport { getFirstLocation, getLocationType } from '../../../libs/netgemLibrary/v8/helpers/Item';\nimport AccurateTimestamp from '../../../helpers/dateTime/AccurateTimestamp';\nimport type { CombinedReducers } from '../../../redux/reducers';\nimport { CustomNetworkError } from '../../../libs/netgemLibrary/helpers/CustomNetworkError';\nimport type { FeedRequestResponseType } from '../../../libs/netgemLibrary/v8/requests/feed';\nimport HotKeys from '../../../helpers/hotKeys/hotKeys';\nimport { HttpStatus } from '../../../libs/netgemLibrary/v8/constants/NetworkCodesAndMessages';\nimport type { KeyValuePair } from '@ntg/utils/dist/types';\nimport type { NETGEM_API_V8_AGGREGATION_FEED } from '../../../libs/netgemLibrary/v8/types/AggregationFeed';\nimport type { NETGEM_API_V8_NTG_VIDEO_FEED } from '../../../libs/netgemLibrary/v8/types/NtgVideoFeed';\nimport type { NETGEM_API_V8_PARAM } from '../../../libs/netgemLibrary/v8/types/Param';\nimport type { NETGEM_API_V8_RAW_FEED } from '../../../libs/netgemLibrary/v8/types/FeedResult';\nimport type { NETGEM_API_WISHLIST_ITEM } from '../../../libs/netgemLibrary/v8/types/Wishlist';\nimport { TileConfigTileType } from '../../../libs/netgemLibrary/v8/types/WidgetConfig';\nimport { getChannelsParameterName } from '../../../helpers/channel/helper';\nimport { getValueForParameter } from '../../../redux/netgemApi/actions/helpers/api';\nimport { showDebug } from '../../../helpers/debug/debug';\n\nconst enableHotKeys: (handleExitGridViewHotKey: (event: SyntheticKeyboardEvent) => void) => void = (handleExitGridViewHotKey) => {\n HotKeys.register('escape', handleExitGridViewHotKey, { name: 'StandardSection.exitGrid' });\n};\n\nconst deserializeChannelIds: (channels: string) => Array | string = (channels) => {\n try {\n // Argument 'channels' is a stringified list of channel Ids\n return JSON.parse(channels);\n } catch {\n // Argument 'channels' is a list alias\n return channels;\n }\n};\n\nconst disableHotKeys: (handleExitGridViewHotKey: (event: SyntheticKeyboardEvent) => void) => void = (handleExitGridViewHotKey) => {\n HotKeys.unregister('escape', handleExitGridViewHotKey);\n};\n\nconst getChannelIdsOrAliasFromParameters: (uri: string, params: Array, state: CombinedReducers) => Array | string | null = (uri, params, state) => {\n const channelsParameterName = getChannelsParameterName(uri);\n\n if (!channelsParameterName) {\n // Parameter name not found\n return null;\n }\n\n const param = params.find((p) => p.name === channelsParameterName);\n\n if (!param) {\n // Parameter not found\n return null;\n }\n\n const channelIds = getValueForParameter(param.value, null, state);\n\n if (!channelIds) {\n // No channel Id matched the parameter\n return [];\n }\n\n // Channel Ids returned by getValueForParameter() are serialized\n return deserializeChannelIds(channelIds);\n};\n\nconst getPageStepFromKeyboardModifiers: (event: SyntheticMouseEvent | SyntheticTouchEvent) => number = (event) => {\n const { altKey, ctrlKey, shiftKey } = event;\n let step = 1;\n\n if (ctrlKey) {\n step += 1;\n\n if (shiftKey) {\n step += 1;\n\n if (altKey) {\n step += 1;\n }\n }\n }\n\n return step;\n};\n\nconst getLocalPath: (uri: string) => string | null = (uri) => {\n /*\n * Regex will take all characters after \"local://\" and up to:\n * - ? query string\n * - /? trailing slash + query string\n * - /$ trailing slash + end of string\n * - $ end of string\n */\n const result = /local:\\/\\/(?.+?)(\\?|\\/\\?|\\/$|$)/iu.exec(uri);\n return result?.groups?.path ?? null;\n};\n\nconst getValuesFromQueryString: (uri: string, parameterNames: Array) => KeyValuePair = (uri, parameterNames) => {\n try {\n const params = new URL(uri).searchParams;\n const values: KeyValuePair = {};\n\n parameterNames.forEach((name) => (values[name] = params.get(name)));\n\n return values;\n } catch {\n return Object.fromEntries(parameterNames.map((name) => ([name, null]: [string, string | null])));\n }\n};\n\nconst getMatchingRecordingFeed: (recordingsListFeed: NETGEM_API_V8_RAW_FEED, seriesOrProgramId: string) => FeedRequestResponseType = (recordingsListFeed, seriesOrProgramId) => {\n const recording = recordingsListFeed.find((r) => r.id === seriesOrProgramId);\n\n if (!recording) {\n return {\n feedIndex: 0,\n result: { feed: [] },\n };\n }\n\n return {\n feedIndex: 0,\n result: { feed: [recording] },\n };\n};\n\nconst getTimestampFromRange: (range: ?string) => number = (range) => (range !== null ? AccurateTimestamp.nowInSeconds() - getIso8601DurationInSeconds(range) : 0);\n\nconst getViewingHistoryPromiseGenerator: (\n getCatchupForAsset: FeedRequestFunction,\n getVodForAsset: FeedRequestFunction,\n recordingsListFeed: NETGEM_API_V8_RAW_FEED,\n uri: string,\n now: number,\n queryAllChannels: boolean,\n queryType: ?string,\n signal: AbortSignal,\n) => ((item: LocalPlayedItemType) => Promise) | null = (getCatchupForAsset, getVodForAsset, recordingsListFeed, uri, now, queryAllChannels, queryType, signal) => {\n const getChannelIds = (item: LocalPlayedItemType) => (queryAllChannels || !item.channelId ? undefined : [item.channelId]);\n\n switch (queryType) {\n case LOCAL_PROVIDER_QUERY.Catchup:\n return (item) => getCatchupForAssetRequest(getCatchupForAsset, item.id, now, getChannelIds(item), signal);\n\n case LOCAL_PROVIDER_QUERY.Est:\n case LOCAL_PROVIDER_QUERY.Svod:\n case LOCAL_PROVIDER_QUERY.Tvod:\n return (item) => getVodForAsset(item.id, now, MILLISECONDS_PER_HOUR, getChannelIds(item), signal);\n\n case LOCAL_PROVIDER_QUERY.Recording:\n return (item) => Promise.resolve(getMatchingRecordingFeed(recordingsListFeed, item.id));\n\n default:\n }\n\n return null;\n};\n\nconst getCatchupForAssetRequest: (getCatchupForAsset: FeedRequestFunction, assetId: string, startDate: number, channelIds?: Array, signal?: AbortSignal) => Promise = (\n getCatchupForAsset,\n assetId,\n startDate,\n channelIds,\n signal,\n) => {\n // Closure\n const errorResult = {\n feed: [],\n programId: assetId,\n };\n\n return getCatchupForAsset(assetId, startDate, MILLISECONDS_PER_WEEK, channelIds, signal).catch((error: CustomNetworkError) => {\n if (error.getStatus() === HttpStatus.NotFound) {\n // Catchup doesn't exist anymore: skip it from the viewing history, then delete it\n return Promise.resolve({\n result: errorResult,\n status: HttpStatus.NotFound,\n });\n }\n\n return Promise.reject(error);\n });\n};\n\nconst getWishlistPromiseGenerator: (\n getCatchupForAsset: FeedRequestFunction,\n getEpgForAsset: FeedRequestFunction,\n getVodForAsset: FeedRequestFunction,\n recordingsListFeed: NETGEM_API_V8_RAW_FEED,\n uri: string,\n now: number,\n signal: AbortSignal,\n) => (item: NETGEM_API_WISHLIST_ITEM) => Promise = (getCatchupForAsset, getEpgForAsset, getVodForAsset, recordingsListFeed, uri, now, signal) => {\n const { allChannels, q } = getValuesFromQueryString(uri, ['allChannels', 'q']);\n const getChannelIds = (item: NETGEM_API_WISHLIST_ITEM) => (allChannels !== '0' || !item.channelId ? undefined : [item.channelId]);\n\n switch (q) {\n case LOCAL_PROVIDER_QUERY.Catchup:\n return (item) => getCatchupForAssetRequest(getCatchupForAsset, item.id, now, getChannelIds(item), signal);\n\n case LOCAL_PROVIDER_QUERY.Est:\n case LOCAL_PROVIDER_QUERY.Svod:\n case LOCAL_PROVIDER_QUERY.Tvod:\n return (item) => getVodForAsset(item.id, now, MILLISECONDS_PER_HOUR, getChannelIds(item), signal);\n\n case LOCAL_PROVIDER_QUERY.Recording:\n return (item) => Promise.resolve(getMatchingRecordingFeed(recordingsListFeed, item.id));\n\n case LOCAL_PROVIDER_QUERY.Scheduledevent:\n return (item) => getEpgForAsset(item.id, now, MILLISECONDS_PER_WEEK, getChannelIds(item), signal);\n\n default:\n }\n\n return () => Promise.resolve();\n};\n\nconst locationTypeToQueryType: (locationType: NETGEM_API_V8_ITEM_LOCATION_TYPE) => ?string = (locationType) => {\n switch (locationType) {\n case NETGEM_API_V8_ITEM_LOCATION_TYPE_CATCHUP:\n return LOCAL_PROVIDER_QUERY.Catchup;\n\n case NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING:\n return LOCAL_PROVIDER_QUERY.Recording;\n\n case NETGEM_API_V8_ITEM_LOCATION_TYPE_SVOD:\n return LOCAL_PROVIDER_QUERY.Svod;\n\n case NETGEM_API_V8_ITEM_LOCATION_TYPE_TVOD:\n return LOCAL_PROVIDER_QUERY.Tvod;\n\n case NETGEM_API_V8_ITEM_LOCATION_TYPE_EST:\n return LOCAL_PROVIDER_QUERY.Est;\n\n default:\n return null;\n }\n};\n\nconst queryTypeToLocationType: (queryType: ?string) => ?NETGEM_API_V8_ITEM_LOCATION_TYPE = (queryType) => {\n switch (queryType) {\n case LOCAL_PROVIDER_QUERY.Catchup:\n return NETGEM_API_V8_ITEM_LOCATION_TYPE_CATCHUP;\n\n case LOCAL_PROVIDER_QUERY.Recording:\n return NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING;\n\n case LOCAL_PROVIDER_QUERY.Svod:\n return NETGEM_API_V8_ITEM_LOCATION_TYPE_SVOD;\n\n case LOCAL_PROVIDER_QUERY.Tvod:\n return NETGEM_API_V8_ITEM_LOCATION_TYPE_TVOD;\n\n case LOCAL_PROVIDER_QUERY.Est:\n return NETGEM_API_V8_ITEM_LOCATION_TYPE_EST;\n\n default:\n return null;\n }\n};\n\n/* eslint-disable no-magic-numbers */\nconst getPlaceholderItemCount: (tileType?: TileConfigTileType) => number =\n // eslint-disable-next-line consistent-return\n (tileType) => {\n if (tileType === undefined) {\n // Same as Gemtv\n return 6;\n }\n\n switch (tileType) {\n case TileConfigTileType.Channel:\n return 18;\n case TileConfigTileType.ChannelGroup:\n return 12;\n case TileConfigTileType.ChannelGroupBig:\n return 8;\n case TileConfigTileType.ChannelGroupBigFill:\n return 8;\n case TileConfigTileType.ChannelGroupFill:\n return 12;\n case TileConfigTileType.Deeplink:\n return 8;\n case TileConfigTileType.Deeplink3x1:\n return 3;\n case TileConfigTileType.Deeplink5x1:\n return 2;\n case TileConfigTileType.Gemtv:\n return 6;\n case TileConfigTileType.GemtvBig:\n return 4;\n case TileConfigTileType.GemtvMedium:\n return 6;\n case TileConfigTileType.Landscape:\n return 6;\n case TileConfigTileType.LandscapeBig:\n return 4;\n case TileConfigTileType.LandscapeVod:\n return 4;\n case TileConfigTileType.Portrait:\n return 8;\n\n // No default\n }\n };\n/* eslint-enable no-magic-numbers */\n\nconst showDebugInfo: (props: CompleteSectionPropType, state: SectionStateType, instance: React.PureComponent) => void = (props, state, instance) => {\n showDebug('Section', {\n instance,\n instanceFields: ['isVisible', 'isVodOrDeeplink', 'sectionName', 'sectionItemWidth', 'sectionType', 'sliderPositions', 'tileConfig'],\n props,\n propsFields: ['avenueIndex', 'cardData', 'gridSectionId', 'hubItem', 'isGridAvenue', 'onItemClick', 'recordingsListFeed', 'searchString', 'section', 'sectionIndex', 'viewingHistory', 'wishlist'],\n state,\n stateFields: [\n 'displayType',\n 'feed',\n 'isCollapsed',\n 'isInVodSeriesCard',\n 'isLive',\n 'isLoading',\n 'itemCountPerPage',\n 'maxPageIndex',\n 'originalFeed',\n 'pageIndex',\n 'sortAndFilter',\n 'updateDimensionsNeeded',\n ],\n });\n};\n\nconst getTime: (d1?: string, d2?: string, d3?: string) => number | null = (d1, d2, d3) => {\n const d = d1 ?? d2 ?? d3;\n if (d === undefined) {\n return null;\n }\n\n return new Date(d).getTime();\n};\n\nconst compareDate: (item1: NETGEM_API_V8_FEED_ITEM, item2: NETGEM_API_V8_FEED_ITEM) => number = (item1, item2) => {\n const {\n selectedLocation: { availabilityStartDate: availabilityStartDate1, scheduledEventStartDate: scheduledEventStartDate1, startDate: startDate1 },\n } = item1;\n const {\n selectedLocation: { availabilityStartDate: availabilityStartDate2, scheduledEventStartDate: scheduledEventStartDate2, startDate: startDate2 },\n } = item2;\n\n const time1 = getTime(startDate1, scheduledEventStartDate1, availabilityStartDate1);\n const time2 = getTime(startDate2, scheduledEventStartDate2, availabilityStartDate2);\n\n if (typeof time1 === 'number' && typeof time2 === 'number') {\n return time1 - time2;\n }\n\n if (typeof time1 === 'number') {\n return -1;\n }\n\n if (typeof time2 === 'number') {\n return 1;\n }\n\n return 0;\n};\n\nconst checkSources: (sources?: Array, model: NETGEM_API_V8_AGGREGATION_FEED | NETGEM_API_V8_NTG_VIDEO_FEED) => Array = (sources, model) => {\n if (sources) {\n return sources;\n }\n\n const { authent, authentRealm, filter, method, params, queryType, sakName, scoring, slice, uri } = ((model: any): NETGEM_API_V8_NTG_VIDEO_FEED);\n\n if (!uri) {\n return [];\n }\n\n return [\n {\n authent,\n authentRealm,\n filter,\n method,\n params,\n provider: FeedProviderKind.Local,\n queryType,\n sakName,\n scoring,\n slice,\n uri,\n },\n ];\n};\n\nconst isItemTypeMatching: (item: NETGEM_API_V8_FEED_RAW_ITEM, expectedType: string | null) => boolean = (item, expectedType) => {\n if (expectedType === null) {\n return false;\n }\n\n const firstLocation = getFirstLocation(item);\n if (firstLocation === null) {\n return false;\n }\n\n return getLocationType(firstLocation.id) === expectedType;\n};\n\nexport {\n checkSources,\n compareDate,\n enableHotKeys,\n deserializeChannelIds,\n disableHotKeys,\n getChannelIdsOrAliasFromParameters,\n getLocalPath,\n getMatchingRecordingFeed,\n getPageStepFromKeyboardModifiers,\n getPlaceholderItemCount,\n getTimestampFromRange,\n getValuesFromQueryString,\n getViewingHistoryPromiseGenerator,\n getWishlistPromiseGenerator,\n isItemTypeMatching,\n locationTypeToQueryType,\n queryTypeToLocationType,\n showDebugInfo,\n};\n","/* @flow */\n\nimport {\n NETGEM_API_V8_WIDGET_ITEM_CLICK_ACTION_CARD,\n type NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE,\n type NETGEM_API_V8_WIDGET_TILE_CONFIG_TYPE,\n type TILE_CONFIG_DESCRIPTION,\n type TILE_CONFIG_TYPE,\n TileConfig,\n TileConfigTileType,\n TileContentImageKind,\n TileImageLayout,\n TileOnFocus,\n} from '../../../libs/netgemLibrary/v8/types/WidgetConfig';\nimport { ItemType } from '../../../libs/netgemLibrary/v8/types/FeedItem';\nimport type { NETGEM_API_V8_SECTION } from '../../../libs/netgemLibrary/v8/types/Section';\nimport type { NETGEM_API_V8_URL_DEFINITION } from '../../../libs/netgemLibrary/v8/types/NtgVideoFeed';\nimport { isUndefinedOrNull } from '@ntg/utils/dist/types';\n\nconst DefaultTileConfig = {\n caption: null,\n channelLogo: true,\n contentImage: TileContentImageKind.Program,\n hoverContent: null,\n imageLayout: TileImageLayout.Stretched,\n onFocus: TileOnFocus.Details,\n type: TileConfigTileType.Gemtv,\n};\n\n// Temporary function until tileConfig is used everywhere and widgetConfig.tileType completely deprecated\nconst completeIfNeeded: (tileConfig: NETGEM_API_V8_WIDGET_TILE_CONFIG_TYPE, sectionId: string) => TILE_CONFIG_TYPE =\n // eslint-disable-next-line max-lines-per-function\n (tileConfig, sectionId) => {\n const { caption, channelLogo, contentImage, contentImageVariant, hoverContent, imageLayout, onFocus, type } = tileConfig;\n const completeTileConfig: TILE_CONFIG_TYPE = {\n caption,\n channelLogo,\n contentImage,\n contentImageVariant,\n hoverContent,\n imageLayout,\n onFocus,\n type: type ?? TileConfigTileType.Gemtv,\n };\n\n if (!contentImage) {\n completeTileConfig.contentImage = TileContentImageKind.Program;\n }\n\n if (!imageLayout) {\n completeTileConfig.imageLayout = TileImageLayout.Stretched;\n }\n\n if (!onFocus) {\n completeTileConfig.onFocus = TileOnFocus.Details;\n }\n\n if (!type) {\n completeTileConfig.type = TileConfigTileType.Gemtv;\n }\n\n if ((type === TileConfigTileType.Portrait || type === TileConfigTileType.LandscapeVod) && isUndefinedOrNull(hoverContent)) {\n completeTileConfig.channelLogo = false;\n completeTileConfig.contentImage = TileContentImageKind.Series;\n completeTileConfig.hoverContent = {\n program: [TileConfig.ProgramTitle, TileConfig.ProgramSynopsis, TileConfig.Duration, TileConfig.Year, TileConfig.Genre, TileConfig.Language, TileConfig.ParentalGuidance],\n series: [TileConfig.SeriesTitle, TileConfig.SeriesSynopsis, TileConfig.Duration, TileConfig.Year, TileConfig.Genre, TileConfig.ParentalGuidance],\n };\n }\n if (completeTileConfig.type === TileConfigTileType.Gemtv) {\n completeTileConfig.contentImage = TileContentImageKind.Series;\n\n if (isUndefinedOrNull(hoverContent)) {\n completeTileConfig.hoverContent = {\n program: [TileConfig.SeriesTitle, TileConfig.ProgramTitle, TileConfig.ProgramSynopsis, TileConfig.Duration, TileConfig.Year],\n series: [TileConfig.SeriesTitle, TileConfig.ProgramTitle, TileConfig.ProgramSynopsis, TileConfig.Duration, TileConfig.Year],\n };\n }\n if (isUndefinedOrNull(caption)) {\n completeTileConfig.caption = {\n program: [TileConfig.SeriesTitle, TileConfig.ProgramTitle, TileConfig.Duration, TileConfig.Year],\n series: [TileConfig.SeriesTitle, TileConfig.ProgramTitle, TileConfig.Duration, TileConfig.Year],\n };\n }\n }\n if (type === TileConfigTileType.Landscape && isUndefinedOrNull(hoverContent)) {\n completeTileConfig.contentImage = TileContentImageKind.Series;\n completeTileConfig.hoverContent = {\n program: [TileConfig.ProgramTitle, TileConfig.ProgramSynopsis, TileConfig.Duration, TileConfig.Year, TileConfig.Genre, TileConfig.Language, TileConfig.ParentalGuidance],\n series: [TileConfig.SeriesTitle, TileConfig.SeriesSynopsis, TileConfig.Duration, TileConfig.Year, TileConfig.Genre, TileConfig.ParentalGuidance],\n };\n }\n\n if (sectionId === 'jeunesse_vod_universe_section_id' || sectionId === 'universcine_vod_thematic_universe_section_id') {\n completeTileConfig.onFocus = TileOnFocus.Selection;\n completeTileConfig.contentImage = TileContentImageKind.Other;\n }\n\n if (type && (type: string).endsWith('.fill')) {\n completeTileConfig.imageLayout = TileImageLayout.Cover;\n }\n\n if (\n [\n TileConfigTileType.Channel,\n TileConfigTileType.ChannelGroup,\n TileConfigTileType.ChannelGroupBig,\n TileConfigTileType.ChannelGroupFill,\n TileConfigTileType.ChannelGroupBigFill,\n TileConfigTileType.Deeplink3x1,\n TileConfigTileType.Deeplink5x1,\n ].includes(type)\n ) {\n completeTileConfig.onFocus = TileOnFocus.Selection;\n }\n\n return completeTileConfig;\n };\n\nconst getTileConfig: (section: NETGEM_API_V8_SECTION) => TILE_CONFIG_TYPE = (section) => {\n const { id, widgetConfig } = section;\n\n if (!widgetConfig?.tileConfig) {\n return completeIfNeeded(DefaultTileConfig, id);\n }\n\n const { tileConfig } = widgetConfig;\n return completeIfNeeded(tileConfig, id);\n};\n\nconst getTileTypeClass: (type: ?TileConfigTileType) => string = (type) =>\n type\n ? (type: string)\n .replace(/deeplink\\.(\\d+x\\d+)/gu, 'deeplink$1')\n .replace(/\\./gu, ' ')\n .replace('fill', 'cover')\n : '';\n\nconst getTileCaption: (tileConfig: TILE_CONFIG_TYPE, itemType: ?ItemType) => Set = (tileConfig, itemType) => {\n const { caption } = tileConfig;\n return getTileTextDescription(caption, itemType);\n};\n\nconst getTileHoverContent: (tileConfig: TILE_CONFIG_TYPE, itemType: ?ItemType) => Set = (tileConfig, itemType) => {\n const { hoverContent } = tileConfig;\n return getTileTextDescription(hoverContent, itemType);\n};\n\nconst getTileTextDescription: (textDescription: ?TILE_CONFIG_DESCRIPTION, itemType: ?ItemType) => Set = (textDescription, itemType) => {\n if (!textDescription || !itemType) {\n // No description\n return new Set();\n }\n\n let descriptionByType: ?Array = null;\n\n if (itemType === ItemType.Series) {\n ({ series: descriptionByType } = textDescription);\n } else {\n // ItemType.Program and everything else\n ({ program: descriptionByType } = textDescription);\n }\n\n if (!descriptionByType) {\n // No description for this item type\n return new Set();\n }\n\n return new Set(descriptionByType);\n};\n\nconst getSeriesCardUrlDefinition: (onItemClick?: NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE, defaultOnItemClick: ?NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE) => NETGEM_API_V8_URL_DEFINITION | null = (\n onItemClick,\n defaultOnItemClick,\n) => {\n const localOnItemClick = onItemClick ?? defaultOnItemClick;\n if (!localOnItemClick || !Array.isArray(localOnItemClick.params)) {\n return null;\n }\n\n const seriesCardParam = localOnItemClick.params.find((param) => param.prefix === `${(ItemType.Series: string)}://` && param.action.action === NETGEM_API_V8_WIDGET_ITEM_CLICK_ACTION_CARD);\n\n if (!seriesCardParam) {\n return null;\n }\n\n const {\n action: { params },\n } = seriesCardParam;\n return ((params: any): NETGEM_API_V8_URL_DEFINITION);\n};\n\nexport { getSeriesCardUrlDefinition, getTileCaption, getTileConfig, getTileHoverContent, getTileTypeClass };\n","/* @flow */\n\nimport type { BasicFunction, KeyValuePair } from '@ntg/utils/dist/types';\nimport { ItemContent, type NETGEM_API_V8_FEED_ITEM, type NETGEM_API_V8_ITEM_LOCATION } from '../../../libs/netgemLibrary/v8/types/FeedItem';\nimport type { MetadataKind, NETGEM_API_V8_METADATA_PROGRAM, NETGEM_API_V8_METADATA_SERIES } from '../../../libs/netgemLibrary/v8/types/MetadataProgram';\nimport { type NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE, type TILE_CONFIG_TYPE, TileConfig } from '../../../libs/netgemLibrary/v8/types/WidgetConfig';\nimport type { BO_FAVORITE_LIST_TYPE } from '../../../redux/netgemApi/actions/videofutur/types/favorite';\nimport type { BO_PURCHASE_LIST_TYPE } from '../../../redux/netgemApi/actions/videofutur/types/purchase';\nimport { BroadcastStatus } from '../../../helpers/ui/location/Format';\nimport type { CARD_DATA_MODAL_TYPE } from '../../modal/cardModal/CardModalConstsAndTypes';\nimport type { ChannelMap } from '../../../libs/netgemLibrary/v8/types/Channel';\nimport type { ImageUrlType } from '../../../redux/netgemApi/actions/v8/metadataImage';\nimport { LoadableStatus } from '../../../helpers/loadable/loadable';\nimport type { NETGEM_API_V8_AUTHENT_REALM } from '../../../libs/netgemLibrary/v8/types/Realm';\nimport type { NETGEM_API_V8_METADATA_SCHEDULE } from '../../../libs/netgemLibrary/v8/types/MetadataSchedule';\nimport type { NETGEM_API_V8_PURCHASE_INFO } from '../../../libs/netgemLibrary/v8/types/PurchaseInfo';\nimport type { NETGEM_API_V8_RIGHTS } from '../../../libs/netgemLibrary/v8/types/Rights';\nimport type { NETGEM_API_VIEWINGHISTORY } from '../../../libs/netgemLibrary/v8/types/ViewingHistory';\nimport type { VOD_STATUS_TYPE } from '../../../helpers/ui/metadata/Types';\n\n// Hack used to prevent graphic glitches while real item image is loading\nexport const TRANSPARENT_PIXEL = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=';\n\nexport enum MetadataStatus {\n Loading,\n Loaded,\n Error,\n}\n\n// Time display and broadcast status are refreshed every second (in ms)\nexport const REFRESH_TIMEOUT = 1_000;\n\n// Delay between two attempts at image loading when DOM element is not ready yet (in ms)\nexport const IMAGE_LOAD_TIMEOUT = 20;\n\nexport const IMAGE_URL_COUNT = 2;\n\nexport const SHORT_DEEPLINK_TEMPLATE_PROGRAM = 'https:////<id>';\nexport const SHORT_DEEPLINK_TEMPLATE_SERIES = `${SHORT_DEEPLINK_TEMPLATE_PROGRAM}/s`;\n\n// eslint-disable-next-line max-len\nexport const LEGACY_DEEPLINK_TEMPLATE_VF =\n '<protocol>//<host>/?<type>=provider%3dvideofutur%26titId%3d<titId>%26episodeNum%3d0%26vfDistributor%3d<distributorId>%26vfDevice%3d%7bvfDevice%7d%26vfProductId%3d%7bvfProductId%7d%26origin=HTML';\n\nexport const LEGACY_DEEPLINK_TEMPLATE_NETGEM = '<protocol>//<host>/?<type>=provider%3dnetgem%26id%3d<id>%26service%3d<channel>%26kind%3d<kind>%26origin=HTML';\n\nexport type ReduxItemDispatchToPropsType = {|\n +localGetImageUrl: (data: ImageUrlType, signal?: AbortSignal) => Promise<any>,\n +localGetPurchaseInfoPerAsset: (id: string, channelId: string, signal?: AbortSignal) => Promise<any>,\n +localGetVodLocations: (locations: Array<NETGEM_API_V8_ITEM_LOCATION>, signal?: AbortSignal) => Promise<any>,\n +localHideModal: BasicFunction,\n +localSendV8LocationCatchupForAssetRequest: (assetId: string, startDate: number, range: number, signal?: AbortSignal) => Promise<any>,\n +localSendV8MetadataLocationRequest: (assetId: string, signal?: AbortSignal) => Promise<any>,\n +localSendV8MetadataRequest: (assetId: string, type: MetadataKind, signal?: AbortSignal) => Promise<any>,\n +localSendV8RecordingsMetadataRequest: (recordId: string, signal?: AbortSignal) => Promise<any>,\n|};\n\nexport type ReduxItemReducerStateType = {|\n +authenticationToken: string | null,\n +channels: ChannelMap,\n +commercialOffers: ?KeyValuePair<Array<string>>,\n +defaultOnItemClick: ?NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE,\n +defaultRights: ?NETGEM_API_V8_RIGHTS,\n +deviceOS: string,\n +favoriteList: BO_FAVORITE_LIST_TYPE,\n +isDebugModeEnabled: boolean,\n +isRegisteredAsGuest: boolean,\n +purchaseList: BO_PURCHASE_LIST_TYPE | null,\n +usePackPurchaseApi: boolean,\n +userRights: Array<string> | null,\n +viewingHistory: NETGEM_API_VIEWINGHISTORY,\n +viewingHistoryStatus: LoadableStatus,\n +wishlistStatus: LoadableStatus,\n|};\n\nexport type DefaultProps = {|\n +cardData?: CARD_DATA_MODAL_TYPE | null,\n +isDebugModePlusForced?: boolean,\n +isInExploreModal?: boolean,\n +isInLiveSection?: boolean,\n +isSwiping?: boolean,\n +onItemClick?: NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE,\n|};\n\nexport type ItemPropType = {|\n ...DefaultProps,\n +item: NETGEM_API_V8_FEED_ITEM,\n +tileConfig: TILE_CONFIG_TYPE,\n +titleFilter?: string,\n|};\n\nexport type CompleteItemPropType = {|\n ...ItemPropType,\n ...ReduxItemReducerStateType,\n ...ReduxItemDispatchToPropsType,\n|};\n\nexport type ItemStateType = {|\n authority?: NETGEM_API_V8_AUTHENT_REALM,\n backgroundImageDisplayIndex: number,\n broadcastStatus: BroadcastStatus,\n caption: Set<TileConfig>,\n channelImageUrl: string | null,\n channelName: string | null,\n contentType: ItemContent,\n hoverContent: Set<TileConfig>,\n imageUrls: Array<string>,\n isDebugModePlusEnabled: boolean,\n isFocused: boolean,\n now: number,\n previewCatchupScheduledEventId: string | null,\n programMetadata: NETGEM_API_V8_METADATA_PROGRAM | null,\n programMetadataStatus: MetadataStatus,\n programTitle: string,\n purchaseInfo: NETGEM_API_V8_PURCHASE_INFO | null,\n seriesMetadata: NETGEM_API_V8_METADATA_SERIES | null,\n seriesMetadataStatus: MetadataStatus,\n seriesTitle: string,\n startoverItem: NETGEM_API_V8_FEED_ITEM | null,\n tvLocationMetadata: NETGEM_API_V8_METADATA_SCHEDULE | null,\n vodLocationsMetadata: Array<NETGEM_API_V8_METADATA_SCHEDULE> | null,\n vodStatus: VOD_STATUS_TYPE | null,\n|};\n","/* @flow */\n\nimport type { NETGEM_API_V8_METADATA_PROGRAM, NETGEM_API_V8_METADATA_PROVIDER_INFO, NETGEM_API_V8_METADATA_SERIES } from '../../libs/netgemLibrary/v8/types/MetadataProgram';\nimport type {\n NETGEM_API_VIEWINGHISTORY,\n NETGEM_API_VIEWINGHISTORY_ITEM,\n NETGEM_API_VIEWINGHISTORY_LOCATION,\n NETGEM_API_VIEWINGHISTORY_PLAYED_ITEMS,\n VIEWING_HISTORY_TYPE,\n} from '../../libs/netgemLibrary/v8/types/ViewingHistory';\nimport AccurateTimestamp from '../dateTime/AccurateTimestamp';\nimport { type NETGEM_API_V8_FEED_ITEM } from '../../libs/netgemLibrary/v8/types/FeedItem';\nimport type { Undefined } from '@ntg/utils/dist/types';\nimport type { VOD_STATUS_TYPE } from '../ui/metadata/Types';\nimport { getIntegerPercentage } from '../maths/maths';\n\n// Any program not watched more than 1 minute is considered not watched at all (in seconds)\nconst BOOKMARK_POSITION_THRESHOLD = 60;\n\nconst ONE_HUNDRED = 100;\n\nconst deepCopyViewingHistoryItem: (item: NETGEM_API_VIEWINGHISTORY_ITEM) => NETGEM_API_VIEWINGHISTORY_ITEM = (item) => {\n const { date, episodes: episodesOriginal, id, playeditems: playeditemsOriginal, rating, watchingstatus } = item;\n\n // Copy simple values\n const clone: NETGEM_API_VIEWINGHISTORY_ITEM = {\n date,\n episodes: undefined,\n id,\n playeditems: undefined,\n rating,\n watchingstatus,\n };\n\n // Copy episodes array\n if (episodesOriginal) {\n clone.episodes = episodesOriginal.map((episode) => deepCopyViewingHistoryItem(episode));\n }\n\n // Copy playeditems object\n const playeditems: NETGEM_API_VIEWINGHISTORY_PLAYED_ITEMS = {};\n if (playeditemsOriginal) {\n Object.keys(playeditemsOriginal).forEach((locationId) => {\n const playedItem = playeditemsOriginal[locationId];\n playeditems[locationId] = { ...playedItem };\n });\n clone.playeditems = playeditems;\n }\n\n return clone;\n};\n\n// Returns an integer in the interval [0,100]\nconst computeProgress: (duration: number, position: number) => number = (duration, position) => getIntegerPercentage(position, 0, duration);\n\nconst getMostRecentlyPlayedEpisode: (episodes: VIEWING_HISTORY_TYPE) => NETGEM_API_VIEWINGHISTORY_ITEM = (episodes) =>\n episodes.reduce((mostRecentEp, ep) => (ep.playeditems && (!mostRecentEp || ep.date > mostRecentEp.date) ? ep : mostRecentEp));\n\nconst getHighestProgress: (item: NETGEM_API_VIEWINGHISTORY_ITEM, defaultValue: number, vodViewingHistoryId?: string) => number = (item, defaultValue, vodViewingHistoryId) => {\n const { playeditems } = item;\n\n if (!playeditems) {\n return defaultValue;\n }\n\n if (vodViewingHistoryId) {\n // VOD item\n const { [vodViewingHistoryId]: historyItem } = playeditems;\n return historyItem?.percent ?? defaultValue;\n }\n\n // TV item\n let highestProgress: number | null = null;\n Object.values(playeditems).forEach((i) => {\n const { percent } = ((i: any): NETGEM_API_VIEWINGHISTORY_LOCATION);\n if (typeof percent === 'number' && (highestProgress === null || percent > highestProgress)) {\n highestProgress = percent;\n }\n });\n\n return typeof highestProgress === 'number' ? highestProgress : defaultValue;\n};\n\n// Returns a number between 0 and 100, or null if not found\nconst getProgress: (\n viewingHistory: NETGEM_API_VIEWINGHISTORY,\n item: NETGEM_API_V8_FEED_ITEM,\n programMetadata: NETGEM_API_V8_METADATA_PROGRAM | null,\n seriesMetadata: NETGEM_API_V8_METADATA_SERIES | null,\n isSeries: boolean,\n vodStatus: VOD_STATUS_TYPE | null,\n) => number | null = (viewingHistory, item, programMetadata, seriesMetadata, isSeries, vodStatus) => {\n if (programMetadata) {\n const { providerInfo } = programMetadata;\n const vodViewingHistoryId = vodStatus?.viewingHistoryId;\n\n if (providerInfo) {\n // Search VOD items\n return getVodProgress(viewingHistory, item, providerInfo, seriesMetadata?.providerInfo, isSeries, vodViewingHistoryId);\n }\n }\n\n // Search TV items\n return getTVProgress(viewingHistory, item, isSeries, seriesMetadata?.id);\n};\n\nconst getVodProgress: (\n viewingHistory: NETGEM_API_VIEWINGHISTORY,\n item: NETGEM_API_V8_FEED_ITEM,\n programProviderInfo: NETGEM_API_V8_METADATA_PROVIDER_INFO,\n seriesProviderInfo?: NETGEM_API_V8_METADATA_PROVIDER_INFO,\n isSeries: boolean,\n vodViewingHistoryId?: string,\n) => number | null = (viewingHistory, item, programProviderInfo, seriesProviderInfo, isSeries, vodViewingHistoryId) => {\n // New version: using universal Ids for VOD items\n const { viewingHistoryId: programId } = programProviderInfo;\n\n const { [programId]: programHistory } = viewingHistory;\n if (programHistory) {\n // Single program\n return getHighestProgress(programHistory, programHistory.watchingstatus, vodViewingHistoryId);\n }\n\n if (seriesProviderInfo) {\n // Program is part of a series\n const { viewingHistoryId: seriesId } = seriesProviderInfo;\n if (seriesId) {\n const { [seriesId]: seriesHistory } = viewingHistory;\n\n if (seriesHistory) {\n const { episodes } = seriesHistory;\n if (episodes) {\n if (isSeries) {\n // Series tile: display the progress of the most recently played episode\n const mostRecentEpisode = getMostRecentlyPlayedEpisode(episodes);\n return getHighestProgress(mostRecentEpisode, mostRecentEpisode.watchingstatus);\n }\n\n // Episode tile: display the progress of the episode\n const watchedEpisode = episodes.find((ep) => ep.id === programId);\n\n if (watchedEpisode) {\n return getHighestProgress(watchedEpisode, watchedEpisode.watchingstatus);\n }\n }\n }\n }\n }\n\n // Backward compatibility version: using device-specific Ids for VOD items\n return getTVProgress(viewingHistory, item, isSeries);\n};\n\nconst getTVProgress: (viewingHistory: NETGEM_API_VIEWINGHISTORY, item: NETGEM_API_V8_FEED_ITEM, isSeries: boolean, seriesId?: string) => number | null = (viewingHistory, item, isSeries, seriesId) => {\n const { selectedProgramId } = item;\n const { [selectedProgramId]: programHistory } = viewingHistory;\n\n if (programHistory) {\n // Single program\n return getHighestProgress(programHistory, programHistory.watchingstatus);\n }\n\n if (seriesId) {\n // Program is part of a series\n const { [seriesId]: seriesHistory } = viewingHistory;\n\n if (seriesHistory) {\n const { episodes } = seriesHistory;\n if (episodes) {\n if (isSeries) {\n // Series tile: display the progress of the most recently played episode\n const mostRecentEpisode = getMostRecentlyPlayedEpisode(episodes);\n return getHighestProgress(mostRecentEpisode, mostRecentEpisode.watchingstatus);\n }\n\n // Episode tile: display the progress of the episode\n const watchedEpisode = episodes.find((ep) => ep.id === selectedProgramId);\n\n if (watchedEpisode) {\n return getHighestProgress(watchedEpisode, watchedEpisode.watchingstatus);\n }\n }\n }\n }\n\n return null;\n};\n\nconst buildViewingHistoryItem: (\n viewingHistory: NETGEM_API_VIEWINGHISTORY,\n locationId: string,\n programId: string,\n seriesId: ?string,\n position: number,\n duration: number,\n start: number,\n end: number,\n channelId?: string,\n) => NETGEM_API_VIEWINGHISTORY_ITEM | null = (viewingHistory, locationId, programId, seriesId, position, duration, start, end, channelId) => {\n const date = AccurateTimestamp.nowAsIsoString();\n\n let episodeItem: ?NETGEM_API_VIEWINGHISTORY_ITEM = null;\n let seriesItem: ?NETGEM_API_VIEWINGHISTORY_ITEM = null;\n\n if (seriesId) {\n // Series\n\n // Search series in the viewing history and clone it\n const { [seriesId]: series } = viewingHistory;\n if (series) {\n seriesItem = deepCopyViewingHistoryItem(series);\n }\n\n if (!seriesItem) {\n seriesItem = {\n date,\n episodes: [],\n id: seriesId,\n rating: 0,\n watchingstatus: 0,\n };\n } else {\n const { episodes } = seriesItem;\n if (episodes) {\n episodeItem = episodes.find((ep) => ep.id === programId);\n }\n }\n } else {\n // Single\n\n // Search episode in the viewing history and clone it\n const { [programId]: episode } = viewingHistory;\n if (episode) {\n episodeItem = deepCopyViewingHistoryItem(episode);\n }\n }\n\n const shouldEpisodeBeAdded = !episodeItem;\n\n let playeditems: Undefined<NETGEM_API_VIEWINGHISTORY_PLAYED_ITEMS> = {};\n\n if (!episodeItem) {\n episodeItem = {\n date: '',\n id: programId,\n playeditems,\n rating: 0,\n watchingstatus: 0,\n };\n }\n\n ({ playeditems } = episodeItem);\n\n if (!playeditems) {\n playeditems = {};\n episodeItem.playeditems = playeditems;\n }\n\n let relativePosition = position - start;\n if (relativePosition < 0 || relativePosition < BOOKMARK_POSITION_THRESHOLD) {\n relativePosition = 0;\n }\n\n const programDuration = duration ? duration - start - end : 0;\n const percent = computeProgress(programDuration, relativePosition);\n\n // $FlowFixMe: prop-missing\n playeditems[locationId] = {\n channelId,\n date,\n percent,\n position: relativePosition,\n };\n\n const { watchingstatus } = episodeItem;\n\n if (watchingstatus < ONE_HUNDRED) {\n const maxPosition = Object.values(playeditems).reduce((acc, val) => Math.max(acc, ((val: any): NETGEM_API_VIEWINGHISTORY_LOCATION).position), 0);\n const newWatchingstatus = computeProgress(programDuration, maxPosition);\n\n if (newWatchingstatus > watchingstatus) {\n episodeItem.watchingstatus = newWatchingstatus;\n }\n }\n\n // Update episode\n episodeItem.date = date;\n\n if (!seriesId || !seriesItem) {\n // Single\n return episodeItem;\n }\n\n // Series\n\n if (!seriesItem.episodes) {\n seriesItem.episodes = [];\n }\n\n if (shouldEpisodeBeAdded) {\n seriesItem.episodes.push(episodeItem);\n }\n\n // Update at series level\n seriesItem.date = date;\n\n return seriesItem;\n};\n\nexport { buildViewingHistoryItem, getMostRecentlyPlayedEpisode, getProgress };\n","/* @flow */\n\nimport * as React from 'react';\nimport { ISO8601_DURATION_ZERO, formatDate, formatIso8601Duration } from '../../../helpers/dateTime/Format';\nimport { ItemContent, ItemType, type NETGEM_API_V8_FEED_ITEM, NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT } from '../../../libs/netgemLibrary/v8/types/FeedItem';\nimport type { NETGEM_API_V8_METADATA_PROGRAM, NETGEM_API_V8_METADATA_SERIES } from '../../../libs/netgemLibrary/v8/types/MetadataProgram';\nimport { BOVodAssetStatus } from '../../../helpers/videofutur/metadata';\nimport { LoadableStatus } from '../../../helpers/loadable/loadable';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport { MetadataStatus } from './ItemConstsAndTypes';\nimport type { NETGEM_API_VIEWINGHISTORY } from '../../../libs/netgemLibrary/v8/types/ViewingHistory';\nimport { TileConfig } from '../../../libs/netgemLibrary/v8/types/WidgetConfig';\nimport type { VOD_STATUS_TYPE } from '../../../helpers/ui/metadata/Types';\nimport clsx from 'clsx';\nimport { getProgress } from '../../../helpers/viewingHistory/ViewingHistory';\nimport { getStartAndEndTimes } from '../../../helpers/ui/metadata/Format';\n\nconst getTimeText = (item: NETGEM_API_V8_FEED_ITEM, now: number, description: Set<TileConfig>): string | null => {\n const {\n selectedLocation: { duration, scheduledEventDuration },\n } = item;\n\n const timeParts: Array<string> = [];\n\n if (description.has(TileConfig.Date)) {\n const { endTime, startTime } = getStartAndEndTimes(item);\n timeParts.push(formatDate(startTime, endTime, now));\n }\n\n if (description.has(TileConfig.Duration)) {\n const localDuration = scheduledEventDuration ?? duration;\n const durationText = localDuration !== ISO8601_DURATION_ZERO ? formatIso8601Duration(localDuration) : '';\n\n if (durationText) {\n timeParts.push(`(${durationText})`);\n }\n }\n\n if (timeParts.length === 0) {\n return null;\n }\n\n return timeParts.join(' ');\n};\n\nconst getWatchingStatus = (\n item: NETGEM_API_V8_FEED_ITEM,\n viewingHistory: NETGEM_API_VIEWINGHISTORY,\n viewingHistoryStatus: LoadableStatus,\n contentType: ItemContent,\n programMetadata: NETGEM_API_V8_METADATA_PROGRAM | null,\n seriesMetadata: NETGEM_API_V8_METADATA_SERIES | null,\n vodStatus: VOD_STATUS_TYPE | null,\n): number | null => {\n const { locType, type } = item;\n\n if (contentType === ItemContent.Unknown) {\n return null;\n }\n\n if (contentType === ItemContent.VODOrDeeplink) {\n const status = vodStatus?.status ?? BOVodAssetStatus.Unknown;\n if (status === BOVodAssetStatus.Locked) {\n // Item has been watched (at least partially) but its rent has expired\n return null;\n }\n }\n\n if (viewingHistoryStatus !== LoadableStatus.Loaded || locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT) {\n return null;\n }\n\n /*\n * About progress\n * VOD: show the progress of the series or program\n * TV: always show the progress of the surfaced program\n */\n return getProgress(viewingHistory, item, programMetadata, seriesMetadata, type === ItemType.Series && contentType === ItemContent.VODOrDeeplink, vodStatus);\n};\n\nconst renderProgramTitle = (\n programMetadataStatus: MetadataStatus,\n seriesMetadataStatus: MetadataStatus,\n programTitle: string,\n timeText: ?string,\n className?: string,\n noInfoTextAllowed: boolean,\n): React.Node => {\n if (programMetadataStatus === MetadataStatus.Loading || seriesMetadataStatus === MetadataStatus.Loading) {\n return null;\n }\n\n const text = noInfoTextAllowed && (programMetadataStatus === MetadataStatus.Error || !programTitle) ? Localizer.localize('player.no_program_info') : programTitle;\n return (\n <div className={clsx('text', className)}>\n {text}\n {timeText ? `${text !== '' ? ' - ' : ''}${timeText}` : ''}\n </div>\n );\n};\n\nconst renderSeriesTitle = (programMetadataStatus: MetadataStatus, seriesMetadataStatus: MetadataStatus, seriesTitle: string): React.Node => {\n if (programMetadataStatus === MetadataStatus.Loading || seriesMetadataStatus === MetadataStatus.Loading || seriesTitle === '') {\n return null;\n }\n\n const text = seriesMetadataStatus === MetadataStatus.Error ? Localizer.localize('player.no_program_info') : seriesTitle;\n return <div className='text'>{text}</div>;\n};\n\nexport { getTimeText, getWatchingStatus, renderProgramTitle, renderSeriesTitle };\n","/* @flow */\n\nimport './WatchingStatus.css';\nimport * as React from 'react';\nimport { PictoPlay } from '@ntg/components/dist/pictos/Element';\nimport clsx from 'clsx';\nimport { connect } from 'react-redux';\n\nconst ONE_HUNDRED = 100;\nconst DEFAULT_GRANULARITY = 1;\nconst TWO = 2;\nconst RADIUS = 40;\nconst TRANSITION_TIMEOUT = 50;\n\n// Circumference is ~251.3\nconst CIRCUMFERENCE = Math.PI * RADIUS * TWO;\n\n// Ensures that minimum progress is displayed when a program has been watched for a very short time (~ CIRCUMFERENCE - 13)\nconst MAX_CIRCUMFERENCE_PERCENTAGE = 238;\n\ntype WatchingStatusPropType = {|\n +allowZeroProgress?: boolean,\n +granularity?: number,\n +onClick?: (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => void,\n +progress?: number | null,\n|};\n\ntype WatchingStatusStateType = {|\n percentage: number | null,\n|};\n\nconst InitialState = Object.freeze({\n percentage: null,\n});\n\nclass WatchingStatusView extends React.PureComponent<WatchingStatusPropType, WatchingStatusStateType> {\n transitionTimer: TimeoutID | null;\n\n static defaultProps: WatchingStatusPropType = {\n allowZeroProgress: false,\n granularity: DEFAULT_GRANULARITY,\n onClick: undefined,\n progress: null,\n };\n\n constructor(props: WatchingStatusPropType) {\n super(props);\n\n this.transitionTimer = null;\n this.state = { ...InitialState };\n }\n\n componentDidMount() {\n this.update();\n }\n\n componentDidUpdate(prevProps: WatchingStatusPropType) {\n const { progress } = this.props;\n const { progress: prevProgress } = prevProps;\n\n if (progress !== prevProgress) {\n this.update();\n }\n }\n\n componentWillUnmount() {\n const { transitionTimer } = this;\n\n if (transitionTimer) {\n clearTimeout(transitionTimer);\n }\n }\n\n update = () => {\n const { allowZeroProgress, granularity = DEFAULT_GRANULARITY, progress } = this.props;\n const { percentage: currentPercentage } = this.state;\n\n if (progress === undefined || progress === null) {\n // If progress is null, nothing to show\n return;\n }\n\n let adjustedProgress = 0;\n\n if (progress > ONE_HUNDRED) {\n adjustedProgress = ONE_HUNDRED;\n } else if (progress > 0) {\n adjustedProgress = Math.floor(granularity * Math.round(progress / granularity));\n }\n\n const percentage =\n adjustedProgress > 0 || !allowZeroProgress ? Math.min(((ONE_HUNDRED - adjustedProgress) / ONE_HUNDRED) * CIRCUMFERENCE, allowZeroProgress ? CIRCUMFERENCE : MAX_CIRCUMFERENCE_PERCENTAGE) : null;\n\n if (currentPercentage === null && percentage !== null) {\n // First set percentage to CIRCUMFERENCE to allow CSS transition to play\n this.setState({ percentage: CIRCUMFERENCE }, () => {\n if (this.transitionTimer) {\n clearTimeout(this.transitionTimer);\n }\n this.transitionTimer = setTimeout(() => this.setState({ percentage }), TRANSITION_TIMEOUT);\n });\n }\n };\n\n render(): React.Node {\n const { onClick } = this.props;\n const { percentage } = this.state;\n\n const progressCircle = percentage !== null ? <circle cx='50' cy='50' r={RADIUS} style={{ strokeDashoffset: percentage }} /> : null;\n\n return (\n <div className={clsx('watchingStatus', onClick !== undefined && 'clickable')} onClick={onClick}>\n <svg viewBox='0 0 100 100'>\n <circle className='background' cx='50' cy='50' r={RADIUS} />\n {progressCircle}\n </svg>\n <PictoPlay className='play' />\n </div>\n );\n }\n}\n\nconst WatchingStatus: React.ComponentType<WatchingStatusPropType> = connect(null, null, null, { forwardRef: true })(WatchingStatusView);\n\nexport default WatchingStatus;\n","/* @flow */\n\nimport * as React from 'react';\nimport { BroadcastStatus, WebAppHelpersLocationStatus } from '../../../helpers/ui/location/Format';\nimport {\n type ID_TYPE,\n type NETGEM_API_V8_SCHEDULED_RECORDING,\n type NETGEM_RECORDINGS_MAP,\n RecordingOutcome,\n ScheduledRecordingsKind,\n type ScheduledRecordingsKindType,\n} from '../../../libs/netgemLibrary/v8/types/Npvr';\nimport {\n ItemContent,\n ItemType,\n type NETGEM_API_V8_FEED_ITEM,\n type NETGEM_API_V8_ITEM_LOCATION_TYPE,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT,\n} from '../../../libs/netgemLibrary/v8/types/FeedItem';\nimport { PictoClock, PictoRecord } from '@ntg/components/dist/pictos/Element';\nimport { getIso8601DateInSeconds, getIso8601DurationInSeconds } from '../../../helpers/dateTime/Format';\nimport AccurateTimestamp from '../../../helpers/dateTime/AccurateTimestamp';\nimport type { NETGEM_API_V8_METADATA_SCHEDULE } from '../../../libs/netgemLibrary/v8/types/MetadataSchedule';\nimport type { Undefined } from '@ntg/utils/dist/types';\nimport WatchingStatus from '../../watchingStatus/WatchingStatus';\n\nconst getRecordingOutcomes = (\n npvrRecordingsList: NETGEM_RECORDINGS_MAP,\n npvrRecordingsFuture: NETGEM_RECORDINGS_MAP,\n seriesScheduledRecording: ?NETGEM_API_V8_SCHEDULED_RECORDING,\n singleScheduledRecording: ?NETGEM_API_V8_SCHEDULED_RECORDING,\n item: NETGEM_API_V8_FEED_ITEM,\n scheduledEventId: string,\n tvLocationMetadata: NETGEM_API_V8_METADATA_SCHEDULE | null,\n): Array<Undefined<RecordingOutcome>> => {\n const {\n selectedLocation: { startDate, duration },\n selectedProgramId: itemId,\n } = item;\n const outcomes: Array<Undefined<RecordingOutcome>> = [];\n\n let associatedRecords: ?Array<ID_TYPE> = null;\n if (singleScheduledRecording) {\n ({ records: associatedRecords } = singleScheduledRecording);\n } else if (seriesScheduledRecording) {\n ({ records: associatedRecords } = seriesScheduledRecording);\n }\n\n if (associatedRecords) {\n // Search in existing recordings\n const { [itemId]: recordings } = npvrRecordingsList;\n if (recordings) {\n // Check first if program is live right now\n const now = AccurateTimestamp.nowInSeconds();\n const start = getIso8601DateInSeconds(startDate);\n const end = start + getIso8601DurationInSeconds(duration);\n const startMargin = getIso8601DurationInSeconds(tvLocationMetadata?.location.startMargin);\n const isLive = start - startMargin <= now && now < end;\n\n associatedRecords.forEach((r) => {\n const recording = recordings.find((rec) => rec.id === r.id);\n if (recording && (!isLive || recording.scheduledEventStartDate === startDate)) {\n outcomes.push(recording.recordOutcome);\n }\n });\n }\n\n // Search in future recordings\n const { [itemId]: futureRecordings } = npvrRecordingsFuture;\n if (futureRecordings) {\n const recording = futureRecordings.find((rec) => rec.id === scheduledEventId);\n if (recording) {\n const { matchingScheduledRecordings } = recording;\n if (matchingScheduledRecordings) {\n matchingScheduledRecordings.forEach((sr) => outcomes.push(sr.recordOutcome));\n }\n }\n }\n }\n\n return outcomes;\n};\n\nconst renderLiveRecordingIcon = (locType: ?NETGEM_API_V8_ITEM_LOCATION_TYPE, broadcastStatus: BroadcastStatus, isRecordOutcomeOK: boolean): React.Node => {\n if (broadcastStatus !== BroadcastStatus.Live || (locType !== (WebAppHelpersLocationStatus.Recording: string) && !isRecordOutcomeOK)) {\n return null;\n }\n\n return <PictoRecord className='recording live' hasBackground />;\n};\n\nconst renderRecordingIcon = (locType: ?NETGEM_API_V8_ITEM_LOCATION_TYPE, recordOutcome?: RecordingOutcome): React.Node => {\n if (locType !== (WebAppHelpersLocationStatus.Recording: string) || recordOutcome !== RecordingOutcome.Recorded) {\n return null;\n }\n\n return <PictoRecord className='recording' hasBackground />;\n};\n\nconst renderScheduledRecordingIcon = (broadcastStatus: BroadcastStatus, hasSeriesScheduledRecording: boolean, hasSingleScheduledRecording: boolean): React.Node => {\n if (broadcastStatus === BroadcastStatus.Live || broadcastStatus === BroadcastStatus.Past || (!hasSeriesScheduledRecording && !hasSingleScheduledRecording)) {\n return null;\n }\n\n return <PictoClock className='scheduledRecording' hasBackground />;\n};\n\nconst renderDebugInfoElement = (\n item: NETGEM_API_V8_FEED_ITEM,\n hasSingleScheduledRecording: boolean,\n hasSeriesScheduledRecording: boolean,\n recordingOutcomes: Array<Undefined<RecordingOutcome>>,\n channelNumber: number,\n isDebugModePlusEnabled: boolean,\n): React.Node => {\n const {\n id,\n locType,\n score,\n selectedLocation: { matchingScheduledRecordings, recordOutcome },\n seriesId,\n } = item;\n\n if (!isDebugModePlusEnabled) {\n return null;\n }\n\n let scheduledRecordingType: ?ScheduledRecordingsKindType = null;\n if (hasSingleScheduledRecording) {\n scheduledRecordingType = ScheduledRecordingsKind.Single;\n } else if (hasSeriesScheduledRecording) {\n scheduledRecordingType = ScheduledRecordingsKind.Series;\n }\n const scheduledRecordingTypeElement = scheduledRecordingType ? <div className='scheduledRecordingType'>Recording kind: {scheduledRecordingType}</div> : null;\n\n const outcomeToString = (outcome?: RecordingOutcome): string => (outcome === undefined ? 'No record outcome' : (outcome: string));\n\n let debugContentElement = null;\n if (locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING) {\n // Recording\n debugContentElement = <div className='recordOutcome'>Outcome: {outcomeToString(recordOutcome)}</div>;\n } else if (locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT) {\n // Scheduled recording\n let outcomes: Array<Undefined<RecordingOutcome>> = [];\n if (recordingOutcomes.length > 0) {\n outcomes = recordingOutcomes;\n } else if (matchingScheduledRecordings) {\n outcomes = matchingScheduledRecordings.map((sr) => sr.recordOutcome);\n }\n\n if (outcomes.length > 0) {\n let i = -1;\n debugContentElement = outcomes.map((outcome) => {\n i += 1;\n\n return (\n <div className='recordOutcome' key={i}>\n Outcome: {outcomeToString(outcome)}\n </div>\n );\n });\n }\n }\n\n return (\n <div className='debugInfo'>\n <div>\n <span>LCN: {channelNumber}</span>\n <span>{seriesId}</span>\n <span>{id !== seriesId ? id : null}</span>\n <span>{locType}</span>\n <span>{score ? JSON.stringify(score).slice(1, -1) : null}</span>\n </div>\n {scheduledRecordingTypeElement || debugContentElement ? (\n <div className='record'>\n {scheduledRecordingTypeElement}\n {debugContentElement}\n </div>\n ) : null}\n </div>\n );\n};\n\nconst renderChannelImage = (channelImageUrl: string | null): React.Node => {\n if (!channelImageUrl) {\n return null;\n }\n\n return <div className='channelImage' style={{ backgroundImage: `url(${channelImageUrl})` }} />;\n};\n\nconst renderWatchingStatus = (itemType: ?ItemType, contentType: ItemContent, vodLocationsMetadata: Array<NETGEM_API_V8_METADATA_SCHEDULE> | null, progress: number | null): React.Node => {\n if (contentType === ItemContent.VODOrDeeplink && !vodLocationsMetadata && itemType !== ItemType.Series) {\n return null;\n }\n\n if (progress === null) {\n return null;\n }\n\n return <WatchingStatus progress={progress} />;\n};\n\nexport { getRecordingOutcomes, renderChannelImage, renderDebugInfoElement, renderLiveRecordingIcon, renderRecordingIcon, renderScheduledRecordingIcon, renderWatchingStatus };\n","/* @flow */\n\nimport './ItemDecoration.scss';\nimport * as React from 'react';\nimport {\n ItemContent,\n ItemType,\n type NETGEM_API_V8_FEED_ITEM,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT,\n} from '../../../libs/netgemLibrary/v8/types/FeedItem';\nimport { PictoClock, PictoSeries } from '@ntg/components/dist/pictos/Element';\nimport {\n getRecordingOutcomes,\n renderChannelImage,\n renderDebugInfoElement,\n renderLiveRecordingIcon,\n renderRecordingIcon,\n renderScheduledRecordingIcon,\n renderWatchingStatus,\n} from './ItemDecorationHelper';\nimport { useCallback, useMemo } from 'react';\nimport { BroadcastStatus } from '../../../helpers/ui/location/Format';\nimport type { NETGEM_API_V8_METADATA_PROGRAM } from '../../../libs/netgemLibrary/v8/types/MetadataProgram';\nimport type { NETGEM_API_V8_METADATA_SCHEDULE } from '../../../libs/netgemLibrary/v8/types/MetadataSchedule';\nimport ProgressBar from '../../progressBar/ProgressBar';\nimport { RecordingOutcome } from '../../../libs/netgemLibrary/v8/types/Npvr';\nimport { TileOnFocus } from '../../../libs/netgemLibrary/v8/types/WidgetConfig';\nimport clsx from 'clsx';\nimport { getChannelNumber } from '../../../helpers/channel/helper';\nimport { hasRunningSeriesScheduledRecording } from '../../../helpers/npvr/scheduledRecording';\nimport { useSelector } from 'react-redux';\n\ntype ItemDecorationPropType = {|\n +broadcastStatus: BroadcastStatus,\n +channelImageUrl: string | null,\n +contentType: ItemContent,\n +isDebugModePlusEnabled: boolean,\n +isInLiveSection?: boolean, // eslint-disable-line react/require-default-props\n +item: NETGEM_API_V8_FEED_ITEM,\n +now: number,\n +onFocus: TileOnFocus,\n +previewCatchupScheduledEventId: ?string,\n +programMetadata: NETGEM_API_V8_METADATA_PROGRAM | null,\n +tvLocationMetadata: NETGEM_API_V8_METADATA_SCHEDULE | null,\n +vodLocationsMetadata: Array<NETGEM_API_V8_METADATA_SCHEDULE> | null,\n +watchingStatus: number | null,\n|};\n\nconst ItemDecoration = ({\n broadcastStatus,\n channelImageUrl,\n contentType,\n isDebugModePlusEnabled,\n isInLiveSection = false,\n item,\n now,\n onFocus,\n previewCatchupScheduledEventId,\n programMetadata,\n tvLocationMetadata,\n vodLocationsMetadata,\n watchingStatus,\n}: ItemDecorationPropType): React.Node => {\n const npvrScheduledRecordingsList = useSelector((state) => state.npvr.npvrScheduledRecordingsList);\n const npvrRecordingsFuture = useSelector((state) => state.npvr.npvrRecordingsFuture);\n const npvrRecordingsList = useSelector((state) => state.npvr.npvrRecordingsList);\n const channels = useSelector((state) => state.appConfiguration.deviceChannels);\n\n if (onFocus === TileOnFocus.Selection) {\n return null;\n }\n\n const {\n selectedLocation: { channelId },\n } = item;\n const channelNumber = useMemo(() => getChannelNumber(channels, channelId), [channels, item]);\n\n const renderRegularTileDecoration = useCallback((): React.Node => {\n const {\n locType,\n selectedLocation: { id: scheduledEventId, recordOutcome },\n seriesId,\n type: itemType,\n } = item;\n\n const localScheduledEventId = previewCatchupScheduledEventId || scheduledEventId;\n\n if (!localScheduledEventId) {\n return null;\n }\n\n const hasSeriesScheduledRecording = hasRunningSeriesScheduledRecording(seriesId ?? undefined, npvrScheduledRecordingsList);\n\n /*\n * In case of a live item, a single scheduled recording should override any series scheduled recording\n * Special case where user started a single recording on a live item, then started a series recording\n */\n const singleScheduledRecording = !hasSeriesScheduledRecording || broadcastStatus === BroadcastStatus.Live ? npvrScheduledRecordingsList[localScheduledEventId] : undefined;\n\n const hasSingleScheduledRecording =\n // Item is a recording\n (!hasSeriesScheduledRecording && locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING) ||\n // Item is a scheduled event or a preview, and a scheduled recording os type Single exists\n ((locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT || broadcastStatus === BroadcastStatus.Preview) && singleScheduledRecording !== undefined);\n\n const seriesScheduledRecording = seriesId ? npvrScheduledRecordingsList[seriesId] : null;\n const recordingOutcomes = getRecordingOutcomes(npvrRecordingsList, npvrRecordingsFuture, seriesScheduledRecording, singleScheduledRecording, item, localScheduledEventId, tvLocationMetadata);\n const isRecordOutcomeOK = recordingOutcomes.some((outcome) => outcome === RecordingOutcome.Recorded);\n\n const seriesIconElement = itemType === ItemType.Series && (contentType === ItemContent.NetgemSVOD || contentType === ItemContent.TV) ? <PictoSeries className='series' /> : null;\n\n const previewIconElement = broadcastStatus === BroadcastStatus.Preview ? <PictoClock className='preview' hasBackground /> : null;\n\n const liveRecordingIconElement = renderLiveRecordingIcon(locType, broadcastStatus, isRecordOutcomeOK);\n\n const recordingIconElement = liveRecordingIconElement ? null : renderRecordingIcon(locType, recordOutcome);\n\n const scheduledRecordingIconElement =\n recordingIconElement || liveRecordingIconElement ? null : renderScheduledRecordingIcon(broadcastStatus, hasSeriesScheduledRecording, hasSingleScheduledRecording);\n\n const futureIconElement = broadcastStatus === BroadcastStatus.Future && !scheduledRecordingIconElement ? <PictoClock className='future' hasBackground /> : null;\n\n return (\n <>\n {futureIconElement}\n {previewIconElement}\n {seriesIconElement}\n {recordingIconElement}\n {liveRecordingIconElement}\n {scheduledRecordingIconElement}\n {renderChannelImage(channelImageUrl)}\n {renderWatchingStatus(itemType, contentType, vodLocationsMetadata, watchingStatus)}\n <ProgressBar broadcastStatus={broadcastStatus} item={item} now={now} />\n {renderDebugInfoElement(item, hasSingleScheduledRecording, hasSeriesScheduledRecording, recordingOutcomes, channelNumber, isDebugModePlusEnabled)}\n </>\n );\n }, [\n broadcastStatus,\n channelImageUrl,\n channelNumber,\n contentType,\n isDebugModePlusEnabled,\n item,\n now,\n npvrRecordingsFuture,\n npvrRecordingsList,\n npvrScheduledRecordingsList,\n previewCatchupScheduledEventId,\n tvLocationMetadata,\n vodLocationsMetadata,\n watchingStatus,\n ]);\n\n // Second case is a live program without info\n return <div className={clsx('decoration', channelImageUrl && 'tv')}>{programMetadata || !isInLiveSection ? renderRegularTileDecoration() : renderChannelImage(channelImageUrl)}</div>;\n};\n\nexport default ItemDecoration;\n","/* @flow */\n\nimport * as React from 'react';\nimport type { BasicFunction, KeyValuePair } from '@ntg/utils/dist/types';\nimport { ItemContent, type NETGEM_API_V8_FEED_ITEM } from '../../../libs/netgemLibrary/v8/types/FeedItem';\nimport type { NETGEM_API_V8_METADATA_PROGRAM, NETGEM_API_V8_METADATA_SERIES } from '../../../libs/netgemLibrary/v8/types/MetadataProgram';\nimport { type NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE, type TILE_CONFIG_TYPE, TileConfig } from '../../../libs/netgemLibrary/v8/types/WidgetConfig';\nimport type { NETGEM_RECORDINGS_MAP, NETGEM_SCHEDULED_RECORDINGS_MAP } from '../../../libs/netgemLibrary/v8/types/Npvr';\nimport type { STREAM_PRIORITIES_TYPE, VOD_STATUS_TYPE } from '../../../helpers/ui/metadata/Types';\nimport type { BO_FAVORITE_LIST_TYPE } from '../../../redux/netgemApi/actions/videofutur/types/favorite';\nimport type { BO_PURCHASE_LIST_TYPE } from '../../../redux/netgemApi/actions/videofutur/types/purchase';\nimport { BroadcastStatus } from '../../../helpers/ui/location/Format';\nimport type { ChannelMap } from '../../../libs/netgemLibrary/v8/types/Channel';\nimport { LoadableStatus } from '../../../helpers/loadable/loadable';\nimport { MetadataStatus } from './ItemConstsAndTypes';\nimport type { NETGEM_API_V8_AUTHENT_REALM } from '../../../libs/netgemLibrary/v8/types/Realm';\nimport type { NETGEM_API_V8_METADATA_SCHEDULE } from '../../../libs/netgemLibrary/v8/types/MetadataSchedule';\nimport type { NETGEM_API_V8_PURCHASE_INFO } from '../../../libs/netgemLibrary/v8/types/PurchaseInfo';\nimport type { NETGEM_API_V8_RIGHTS } from '../../../libs/netgemLibrary/v8/types/Rights';\nimport type { NETGEM_API_VIEWINGHISTORY } from '../../../libs/netgemLibrary/v8/types/ViewingHistory';\nimport type { VOD_PURCHASE_DATA_TYPE } from '../../../helpers/rights/pendingOperations';\n\nexport enum TruncateState {\n Initializing,\n NotTruncated,\n Truncated,\n}\n\nexport type ActionsType = {|\n actions: Array<React.Node>,\n mainButton: React.Node,\n|};\n\nexport type ReduxItemOverlayDispatchToPropsType = {|\n +localAddToFavoriteList: (titId: string, signal?: AbortSignal) => Promise<any>,\n +localAddToWishlist: (assetId: string, channelId: string, signal?: AbortSignal) => Promise<any>,\n +localHideModal: BasicFunction,\n +localRemoveFromFavoriteList: (titId: string, signal?: AbortSignal) => Promise<any>,\n +localRemoveFromWishlist: (assetId: string, channelId: string, signal?: AbortSignal) => Promise<any>,\n +showVodPurchaseDialog: (vodPurchaseData: VOD_PURCHASE_DATA_TYPE) => void,\n|};\n\nexport type ReduxItemOverlayReducerStateType = {|\n +channels: ChannelMap,\n +commercialOffers: KeyValuePair<Array<string>> | null,\n +defaultOnItemClick: NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE | null,\n +defaultRights: NETGEM_API_V8_RIGHTS | null,\n +favoriteList: BO_FAVORITE_LIST_TYPE,\n +isDebugModeEnabled: boolean,\n +isRegisteredAsGuest: boolean,\n +isSubscriptionFeatureEnabled: boolean,\n +npvrRecordingsFuture: NETGEM_RECORDINGS_MAP,\n +npvrRecordingsList: NETGEM_RECORDINGS_MAP,\n +npvrScheduledRecordingsList: NETGEM_SCHEDULED_RECORDINGS_MAP,\n +purchaseList: BO_PURCHASE_LIST_TYPE | null,\n +streamPriorities: STREAM_PRIORITIES_TYPE | null,\n +userRights: Array<string> | null,\n +viewingHistory: NETGEM_API_VIEWINGHISTORY,\n +viewingHistoryStatus: LoadableStatus,\n +wishlist: Set<string>,\n +wishlistStatus: LoadableStatus,\n|};\n\nexport type ItemOverlayPropType = {|\n +authority?: NETGEM_API_V8_AUTHENT_REALM,\n +broadcastStatus: BroadcastStatus,\n +contentType: ItemContent,\n +distributorId: string | null,\n +hoverContent: Set<TileConfig>,\n +isInLiveSection?: boolean,\n +isVisible: boolean,\n +item: NETGEM_API_V8_FEED_ITEM,\n +now: number,\n +onClick: (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => void,\n +onItemClick?: NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE,\n +previewCatchupScheduledEventId: string | null,\n +programMetadata: NETGEM_API_V8_METADATA_PROGRAM | null,\n +programMetadataStatus: MetadataStatus,\n +programTitle: string,\n +purchaseInfo: NETGEM_API_V8_PURCHASE_INFO | null,\n +seriesMetadata: NETGEM_API_V8_METADATA_SERIES | null,\n +seriesMetadataStatus: MetadataStatus,\n +seriesTitle: string,\n +startoverItem: NETGEM_API_V8_FEED_ITEM | null,\n +tileConfig: TILE_CONFIG_TYPE,\n +tvLocationMetadata: NETGEM_API_V8_METADATA_SCHEDULE | null,\n +viewingHistoryId?: string | null,\n +vodLocationsMetadata: Array<NETGEM_API_V8_METADATA_SCHEDULE> | null,\n +vodStatus: VOD_STATUS_TYPE | null,\n +vtiId: ?number,\n|};\n\nexport type CompleteItemOverlayPropType = {|\n ...ItemOverlayPropType,\n ...ReduxItemOverlayReducerStateType,\n ...ReduxItemOverlayDispatchToPropsType,\n|};\n\nexport type ItemOverlayStateType = {|\n isLoading: boolean,\n synopsis: string | null,\n textHeight: number,\n truncateState: TruncateState,\n|};\n","/* @flow */\n\nimport type { BO_PURCHASE_LIST_TYPE } from '../../redux/netgemApi/actions/videofutur/types/purchase';\nimport type { NETGEM_API_V8_FEED_RAW_ITEM } from '../../libs/netgemLibrary/v8/types/FeedItem';\nimport type { NETGEM_API_V8_PURCHASE_INFO } from '../../libs/netgemLibrary/v8/types/PurchaseInfo';\nimport type { NETGEM_API_V8_RAW_FEED } from '../../libs/netgemLibrary/v8/types/FeedResult';\n\nconst isPackPurchased = (purchaseInfo: NETGEM_API_V8_PURCHASE_INFO, purchaseList: BO_PURCHASE_LIST_TYPE | null): boolean => {\n if (purchaseList === null) {\n return false;\n }\n\n const [\n {\n settings: { distributorId, vtiId },\n },\n ] = purchaseInfo;\n const { [distributorId]: purchaseListForDistributor } = purchaseList;\n\n if (purchaseListForDistributor === undefined) {\n return false;\n }\n\n const purchasedItems = Object.values(purchaseListForDistributor);\n for (const item of purchasedItems) {\n if (item.packVtiId === vtiId) {\n return true;\n }\n }\n\n return false;\n};\n\nconst getFirstEpisodeLocation = (packElements: NETGEM_API_V8_RAW_FEED): NETGEM_API_V8_FEED_RAW_ITEM | null => {\n const [{ elements }] = packElements;\n\n if (!elements) {\n return null;\n }\n\n for (const episode of elements) {\n const { id } = episode;\n const [, , , , episodeNumber] = id.split('/');\n if (Number(episodeNumber) === 1) {\n return episode;\n }\n }\n\n return null;\n};\n\nexport { getFirstEpisodeLocation, isPackPurchased };\n","/* @flow */\n\nimport './ButtonFXBicolor.css';\nimport * as React from 'react';\nimport { HeightKind, WidthKind } from './types';\nimport { Theme, type ThemeType } from '@ntg/ui/dist/theme';\nimport ButtonFX from './ButtonFX';\n\n/* eslint-disable react/require-default-props */\ntype PropType = {|\n +data?: any,\n +hasPadding?: boolean,\n +heightKind?: HeightKind,\n +isDisabled?: boolean,\n +leftPart: React.Node,\n +onClick?: (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>, data: any) => void,\n +rightPart: React.Node,\n +theme?: ThemeType,\n +widthKind?: WidthKind,\n|};\n/* eslint-enable react/require-default-props */\n\nconst ButtonFXBicolor = ({ data, hasPadding, heightKind, isDisabled = false, leftPart, onClick, rightPart, theme = Theme.Dark, widthKind }: PropType): React.Node => (\n <ButtonFX className='buttonFXBicolor' data={data} hasPadding={hasPadding} heightKind={heightKind} isDisabled={isDisabled} onClick={onClick} theme={theme} widthKind={widthKind}>\n <div className='part left'>{leftPart}</div>\n <div className='part right'>{rightPart}</div>\n </ButtonFX>\n);\n\nexport default ButtonFXBicolor;\n","/* @flow */\n\nimport './PricingVod.css';\nimport * as React from 'react';\nimport {\n BOVodAssetStatus,\n formatDisplayPrice,\n getAvailabilityStartTimeOrDefault,\n getCurrentOrNextPriceOption,\n getDefinitionPriority,\n getDisplayPriceAndDefinition,\n getPrice,\n getPurchaseType,\n getTimeLeftFromExpirationTime,\n getVodKind,\n isBetterPriceOption,\n renderPurchaseSummary,\n} from '../../helpers/videofutur/metadata';\nimport { type BO_PURCHASE_LIST_TYPE, Purchase, type PurchaseType } from '../../redux/netgemApi/actions/videofutur/types/purchase';\nimport { Currency, Definition, type PURCHASE_DETAILS_TYPE } from '../../helpers/ui/metadata/Types';\nimport { HeightKind, WidthKind } from '../buttons/types';\nimport type { NETGEM_API_V8_METADATA_SCHEDULE, NETGEM_API_V8_METADATA_SCHEDULE_LOCATION } from '../../libs/netgemLibrary/v8/types/MetadataSchedule';\nimport type { NETGEM_API_V8_PURCHASE_INFO, NETGEM_API_V8_PURCHASE_INFO_ITEM, NETGEM_API_V8_PURCHASE_INFO_PRICE_OPTION } from '../../libs/netgemLibrary/v8/types/PurchaseInfo';\nimport { Theme, type ThemeType } from '@ntg/ui/dist/theme';\nimport { getFirstEpisodeLocation, isPackPurchased } from '../../helpers/videofutur/pack';\nimport AccurateTimestamp from '../../helpers/dateTime/AccurateTimestamp';\nimport type { BASE_VOD_PURCHASE_DATA_TYPE } from '../../helpers/rights/pendingOperations';\nimport ButtonFXBicolor from '../buttons/ButtonFXBicolor';\nimport type { CombinedReducers } from '../../redux/reducers';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport type { NETGEM_API_V8_RAW_FEED } from '../../libs/netgemLibrary/v8/types/FeedResult';\nimport { RegistrationType } from '../../redux/appRegistration/types/types';\nimport type { Undefined } from '@ntg/utils/dist/types';\nimport clsx from 'clsx';\nimport { connect } from 'react-redux';\nimport { formatAvailabilityTimestamp } from '../../helpers/dateTime/Format';\nimport { showDebug } from '../../helpers/debug/debug';\n\nexport enum ContextKind {\n Card,\n LandscapeTile,\n RegularTile,\n VodEpisode,\n}\n\ntype AllPurchaseDetails = {|\n [PurchaseType]: PURCHASE_DETAILS_TYPE | null,\n|};\n\ntype DefaultProps = {|\n +expirationTime?: number,\n +isVodSeries?: boolean,\n +purchaseInfo?: NETGEM_API_V8_PURCHASE_INFO | null,\n +theme?: ThemeType,\n|};\n\ntype PricingVodPropType = {|\n ...DefaultProps,\n +context: ContextKind,\n +locationsMetadata: ?Array<NETGEM_API_V8_METADATA_SCHEDULE>,\n +onClick: (data: BASE_VOD_PURCHASE_DATA_TYPE) => void,\n +status: BOVodAssetStatus,\n|};\n\ntype PricingVodReducerStateType = {|\n +isDebugModeEnabled: boolean,\n +purchaseList: BO_PURCHASE_LIST_TYPE | null,\n|};\n\ntype CompletePricingVodPropType = {|\n ...PricingVodPropType,\n ...PricingVodReducerStateType,\n|};\n\ntype PricingVodStateType = {|\n minEpisodePrice: ?string,\n purchaseDetails: AllPurchaseDetails,\n|};\n\nconst InitialState = Object.freeze({\n minEpisodePrice: null,\n purchaseDetails: {\n [Purchase.Buy]: null,\n [Purchase.BuyPack]: null,\n [Purchase.Rent]: null,\n },\n});\n\nclass PricingVodView extends React.PureComponent<CompletePricingVodPropType, PricingVodStateType> {\n static defaultProps: DefaultProps = {\n expirationTime: 0,\n isVodSeries: false,\n purchaseInfo: null,\n theme: Theme.Dark,\n };\n\n constructor(props: CompletePricingVodPropType) {\n super(props);\n\n this.state = { ...InitialState };\n }\n\n componentDidMount() {\n const { locationsMetadata, purchaseInfo } = this.props;\n\n if (locationsMetadata || purchaseInfo) {\n this.updatePurchaseDetails();\n }\n }\n\n componentDidUpdate(prevProps: CompletePricingVodPropType) {\n const { locationsMetadata, purchaseInfo } = this.props;\n const { locationsMetadata: prevLocationsMetadata, purchaseInfo: prevPurchaseInfo } = prevProps;\n\n if ((locationsMetadata && locationsMetadata !== prevLocationsMetadata) || (purchaseInfo && purchaseInfo !== prevPurchaseInfo)) {\n this.updatePurchaseDetails();\n }\n }\n\n handleOnClick = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => {\n const { isDebugModeEnabled } = this.props;\n const { altKey, ctrlKey } = event;\n\n if (isDebugModeEnabled && (altKey || ctrlKey)) {\n event.preventDefault();\n event.stopPropagation();\n this.showDebugInfo();\n }\n };\n\n showDebugInfo = () => {\n const { props, state } = this;\n\n showDebug('Pricing VOD', {\n props,\n propsFields: ['context', 'expirationTime', 'isVodSeries', 'locationsMetadata', 'purchaseInfo', 'status', 'theme'],\n state,\n stateFields: ['minEpisodePrice', 'purchaseDetails'],\n });\n };\n\n getPurchaseDetails = (purchaseType: PurchaseType): PURCHASE_DETAILS_TYPE | null => {\n const { locationsMetadata } = this.props;\n const sortedLocations: Array<NETGEM_API_V8_METADATA_SCHEDULE_LOCATION> = [];\n\n if (!locationsMetadata) {\n return null;\n }\n\n const now = AccurateTimestamp.now();\n\n for (let i = 0; i < locationsMetadata.length; i++) {\n const {\n [i]: {\n location,\n location: { availabilityStartDate, id, purchaseInfo },\n },\n } = locationsMetadata;\n if (getPurchaseType(getVodKind(id)) === purchaseType && (purchaseInfo || getAvailabilityStartTimeOrDefault(availabilityStartDate) > now)) {\n sortedLocations.push(location);\n }\n }\n\n if (sortedLocations.length === 0) {\n // No info found\n return null;\n }\n\n // Sort accordingly to definitions (4K > HD > SD > [unknown])\n sortedLocations.sort(this.compareDefinitions);\n\n const [vodLocationMetadata] = sortedLocations;\n const priceAndDefinition = getDisplayPriceAndDefinition(vodLocationMetadata);\n\n return {\n ...priceAndDefinition,\n itemCount: 1,\n locationId: vodLocationMetadata.id,\n vodLocationMetadata,\n };\n };\n\n countEpisodes = (elements: NETGEM_API_V8_RAW_FEED): number => elements[0].elements?.length ?? 0;\n\n getLocationId = (elements: NETGEM_API_V8_RAW_FEED): Undefined<string> => (elements[0].elements?.[0] ?? elements[0]).locations?.[0].id;\n\n // Pack purchase\n setPackPurchaseDetailsNew = (): void => {\n const { locationsMetadata, purchaseInfo } = this.props;\n\n if (!purchaseInfo) {\n return;\n }\n\n let selectedPurchase: NETGEM_API_V8_PURCHASE_INFO_ITEM | null = null;\n let selectedPriceOption: NETGEM_API_V8_PURCHASE_INFO_PRICE_OPTION | null = null;\n\n purchaseInfo.forEach((purchase) => {\n const { priceOptions } = purchase;\n const priceOption = getCurrentOrNextPriceOption(priceOptions);\n\n if (priceOption !== null && (selectedPurchase === null || selectedPriceOption === null || isBetterPriceOption(selectedPriceOption, priceOption))) {\n selectedPurchase = purchase;\n selectedPriceOption = priceOption;\n }\n });\n\n if (selectedPurchase === null || selectedPriceOption === null) {\n // No current or next purchase window\n return;\n }\n\n const {\n condition: { definition },\n elements,\n settings: { distributorId, vtiId },\n } = selectedPurchase;\n const { availabilityStartDate, display } = selectedPriceOption;\n const availabilityStartTime = getAvailabilityStartTimeOrDefault(availabilityStartDate);\n const displayPrice = formatDisplayPrice(display, Currency.Euro);\n const locationId = getFirstEpisodeLocation(elements)?.locations?.[0].id;\n const vodLocationMetadata = locationsMetadata?.find((loc) => loc.location.id === locationId)?.location;\n const itemCount = this.countEpisodes(elements);\n\n this.setState({\n purchaseDetails: {\n [Purchase.Buy]: null,\n [Purchase.BuyPack]: {\n availabilityStartTime,\n definition,\n displayPrice,\n distributorId,\n itemCount,\n locationId,\n vodLocationMetadata,\n vtiId,\n },\n [Purchase.Rent]: null,\n },\n });\n };\n\n // Single item buy/rent\n setPurchaseDetailsNew = (): void => {\n const { locationsMetadata, purchaseInfo } = this.props;\n\n if (!purchaseInfo) {\n return;\n }\n\n const selection: {| [PurchaseType]: { priceOption: NETGEM_API_V8_PURCHASE_INFO_PRICE_OPTION, purchase: NETGEM_API_V8_PURCHASE_INFO_ITEM } | null |} = {\n [Purchase.Buy]: null,\n [Purchase.Rent]: null,\n };\n\n purchaseInfo.forEach((purchase) => {\n const { condition, priceOptions } = purchase;\n const { licenseDuration } = condition;\n const purchaseType = licenseDuration === undefined ? Purchase.Buy : Purchase.Rent;\n const priceOption = getCurrentOrNextPriceOption(priceOptions);\n const selectedPurchase = selection[purchaseType];\n\n if (priceOption !== null && (selectedPurchase === null || isBetterPriceOption(selectedPurchase.priceOption, priceOption))) {\n selection[purchaseType] = { priceOption, purchase };\n }\n });\n\n const buildPurchaseDetails = (purchaseType: PurchaseType, vodLocationsMetadata: ?Array<NETGEM_API_V8_METADATA_SCHEDULE>): PURCHASE_DETAILS_TYPE | null => {\n const { [purchaseType]: selectedPurchase } = selection;\n\n if (!selectedPurchase) {\n return null;\n }\n\n const { purchase, priceOption } = selectedPurchase;\n const {\n condition: { definition, licenseDuration },\n elements,\n settings: { distributorId, vtiId },\n } = purchase;\n const { availabilityStartDate, display } = priceOption;\n const availabilityStartTime = getAvailabilityStartTimeOrDefault(availabilityStartDate);\n const displayPrice = formatDisplayPrice(display, Currency.Euro);\n const locationId = this.getLocationId(elements);\n const vodLocationMetadata = vodLocationsMetadata?.find((loc) => loc.location.id === locationId)?.location;\n\n return {\n availabilityStartTime,\n definition,\n displayPrice,\n distributorId,\n itemCount: 1,\n licenseDuration,\n locationId,\n vodLocationMetadata,\n vtiId,\n };\n };\n\n this.setState({\n purchaseDetails: {\n [Purchase.Buy]: buildPurchaseDetails(Purchase.Buy, locationsMetadata),\n [Purchase.BuyPack]: null,\n [Purchase.Rent]: buildPurchaseDetails(Purchase.Rent, locationsMetadata),\n },\n });\n };\n\n updatePurchaseDetails = () => {\n const { isVodSeries, purchaseInfo, status } = this.props;\n\n if (purchaseInfo) {\n // TODO: Clean up code when BO API v2 if fully deployed\n if (isVodSeries) {\n this.setPackPurchaseDetailsNew();\n } else {\n this.setPurchaseDetailsNew();\n }\n return;\n }\n\n if (status === BOVodAssetStatus.Free || status === BOVodAssetStatus.FreeButAvailableInFuture) {\n return;\n }\n\n if (isVodSeries) {\n this.setState({\n ...InitialState,\n minEpisodePrice: this.getMinEpisodePrice(),\n });\n } else {\n this.setState({\n ...InitialState,\n purchaseDetails: {\n [Purchase.Buy]: this.getPurchaseDetails(Purchase.Buy),\n [Purchase.Rent]: this.getPurchaseDetails(Purchase.Rent),\n },\n });\n }\n };\n\n getMinEpisodePrice = (): string | null => {\n const { locationsMetadata } = this.props;\n\n if (!locationsMetadata) {\n return null;\n }\n\n let definition: Definition | null = null;\n let minDisplayPrice: string | null = null;\n let minPrice = Number.MAX_SAFE_INTEGER;\n\n locationsMetadata.forEach((metadata) => {\n const {\n location: { purchaseInfo },\n } = metadata;\n\n if (purchaseInfo) {\n const price = getPrice(purchaseInfo, Currency.Euro);\n if (price !== null) {\n const { amount, display } = price;\n if (amount < minPrice) {\n ({ definition } = purchaseInfo);\n minDisplayPrice = display;\n minPrice = amount;\n }\n }\n }\n });\n\n if (minPrice === Number.MAX_SAFE_INTEGER || !minDisplayPrice) {\n return null;\n }\n\n return Localizer.localize('vod.pricing.episode_min_price', {\n definition: definition !== null ? (definition: string) : '',\n price: formatDisplayPrice(minDisplayPrice, Currency.Euro),\n });\n };\n\n onBuyClick = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>): void => {\n const {\n purchaseDetails: { [Purchase.BuyPack]: packPurchaseDetails },\n } = this.state;\n\n this.onPurchaseClick(event, packPurchaseDetails ? Purchase.BuyPack : Purchase.Buy);\n };\n\n onRentClick = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>): void => this.onPurchaseClick(event, Purchase.Rent);\n\n onPurchaseClick = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>, purchaseType: PurchaseType) => {\n const { isDebugModeEnabled } = this.props;\n const { altKey, ctrlKey } = event;\n\n if (isDebugModeEnabled && (altKey || ctrlKey)) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n const { onClick } = this.props;\n const { purchaseDetails } = this.state;\n const { [purchaseType]: details } = purchaseDetails;\n\n // Needed to forbid buying (resp. renting) when item is already rented (resp. bought)\n let otherVtiId: Undefined<number> = undefined;\n if (purchaseType !== Purchase.BuyPack) {\n otherVtiId = purchaseDetails[purchaseType === Purchase.Buy ? Purchase.Rent : Purchase.Buy]?.vtiId;\n }\n if (details) {\n const { definition, displayPrice, distributorId, itemCount, licenseDuration, locationId, vodLocationMetadata, vtiId } = details;\n\n onClick({\n definition,\n displayPrice,\n distributorId,\n itemCount,\n licenseDuration,\n locationId,\n otherVtiId,\n purchaseType,\n vodLocationMetadata,\n vtiId,\n });\n }\n };\n\n compareDefinitions = (location1: NETGEM_API_V8_METADATA_SCHEDULE_LOCATION, location2: NETGEM_API_V8_METADATA_SCHEDULE_LOCATION): number => {\n const { purchaseInfo: info1 } = location1;\n const { purchaseInfo: info2 } = location2;\n\n if (!info1 && !info2) {\n return 0;\n }\n\n if (!info1) {\n return 1;\n }\n\n if (!info2) {\n return -1;\n }\n\n const { definition: def1 } = info1;\n const { definition: def2 } = info2;\n const v1 = getDefinitionPriority(def1);\n const v2 = getDefinitionPriority(def2);\n\n return v1 - v2;\n };\n\n getDisplayData = (\n purchaseType: PurchaseType,\n clickCallback: (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => void,\n ): {|\n element: React.Node,\n isTextOnly: boolean,\n |} => {\n const { context, theme } = this.props;\n const {\n purchaseDetails: { [purchaseType]: details },\n } = this.state;\n\n if (!details) {\n return { element: null, isTextOnly: false };\n }\n\n const { availabilityStartTime, definition, displayPrice } = details;\n\n if (availabilityStartTime > AccurateTimestamp.now()) {\n // Not yet open to this kind of purchase (BUY or RENT)\n const localizationKey = purchaseType === Purchase.Rent ? 'vod.pricing.availability.tvod' : 'vod.pricing.availability.est';\n return { element: <div className='availabilityDate'>{Localizer.localize(localizationKey, { date: formatAvailabilityTimestamp(availabilityStartTime) })}</div>, isTextOnly: true };\n }\n\n if (context === ContextKind.VodEpisode) {\n // VOD episode: display rent/buy actions as links\n return {\n element: (\n <div className='pricingLink' onClick={clickCallback}>\n {renderPurchaseSummary(purchaseType, definition, displayPrice)}\n </div>\n ),\n isTextOnly: true,\n };\n }\n\n // Regular case: display rent/buy actions as buttons\n return {\n element: (\n <ButtonFXBicolor\n heightKind={context === ContextKind.Card ? HeightKind.Large : HeightKind.Small}\n leftPart={`${Localizer.localize(purchaseType === Purchase.Rent ? 'vod.pricing.actions.rent' : 'vod.pricing.actions.buy')} ${(definition: string)}`}\n onClick={clickCallback}\n rightPart={displayPrice}\n theme={theme}\n widthKind={context === ContextKind.LandscapeTile ? WidthKind.Large : WidthKind.Stretched}\n />\n ),\n isTextOnly: false,\n };\n };\n\n renderPackPurchaseButton = (context: ContextKind): React.Node => {\n const { theme } = this.props;\n const {\n purchaseDetails: { [Purchase.BuyPack]: packPurchaseDetails },\n } = this.state;\n\n if (packPurchaseDetails === null) {\n return null;\n }\n\n const { availabilityStartTime, definition, displayPrice } = packPurchaseDetails;\n\n if (availabilityStartTime > AccurateTimestamp.now()) {\n // Not yet open to purchase\n return <div className='availabilityDate'>{Localizer.localize('vod.pricing.availability.est', { date: formatAvailabilityTimestamp(availabilityStartTime) })}</div>;\n }\n\n /* eslint-disable react/jsx-handler-names */\n return (\n <div className='pricing purchasable spaced' onClick={this.handleOnClick}>\n <ButtonFXBicolor\n heightKind={context === ContextKind.Card ? HeightKind.Large : HeightKind.Small}\n leftPart={`${Localizer.localize('vod.pricing.actions.buy')} ${(definition: string)}`}\n onClick={this.onBuyClick}\n rightPart={displayPrice}\n theme={theme}\n widthKind={context === ContextKind.LandscapeTile ? WidthKind.Large : WidthKind.Stretched}\n />\n </div>\n );\n /* eslint-enable react/jsx-handler-names */\n };\n\n renderButtons = (context: ContextKind, isVodSeries?: boolean): React.Node => {\n const { element: rentElement, isTextOnly: isRentTextOnly } = this.getDisplayData(Purchase.Rent, this.onRentClick);\n const { element: buyElement, isTextOnly: isBuyTextOnly } = this.getDisplayData(Purchase.Buy, this.onBuyClick);\n\n if (!rentElement && !buyElement) {\n return null;\n }\n\n return (\n <div\n className={clsx(\n context !== ContextKind.VodEpisode && !isVodSeries && 'pricing purchasable spaced',\n context === ContextKind.VodEpisode && 'episodePricing',\n isBuyTextOnly && !isRentTextOnly && 'reversed',\n )}\n onClick={this.handleOnClick}\n >\n {rentElement}\n {buyElement}\n </div>\n );\n };\n\n render(): React.Node {\n const { context, expirationTime, isVodSeries, locationsMetadata, purchaseInfo, purchaseList, status } = this.props;\n const {\n minEpisodePrice,\n purchaseDetails: { [Purchase.BuyPack]: packPurchaseDetails },\n } = this.state;\n const lines = [];\n\n if (status === BOVodAssetStatus.Free) {\n // SVOD: asset is part of the subscription\n lines.push(Localizer.localize('vod.pricing.svod'));\n } else if (status === BOVodAssetStatus.Rented) {\n // TVOD: asset already rented\n lines.push(Localizer.localize('vod.pricing.tvod.rented'));\n if (typeof expirationTime === 'number' && expirationTime > 0) {\n lines.push(Localizer.localize('vod.pricing.tvod.expire', { expiration: getTimeLeftFromExpirationTime(expirationTime) }));\n }\n } else if (status === BOVodAssetStatus.Bought) {\n // EST: asset already bought\n lines.push(Localizer.localize('vod.pricing.est.bought'));\n } else if (packPurchaseDetails && purchaseInfo && purchaseInfo.length > 0) {\n // Purchasable VOD pack\n if (isPackPurchased(purchaseInfo, purchaseList)) {\n return (\n <div className='pricing' onClick={this.handleOnClick}>\n {Localizer.localize('vod.pricing.est.bought_season')}\n </div>\n );\n }\n\n return this.renderPackPurchaseButton(context);\n } else if (minEpisodePrice) {\n // TVOD or EST series\n lines.push(minEpisodePrice);\n } else if (locationsMetadata && locationsMetadata.length > 0) {\n // TVOD or EST not purchased\n const rentAndBuyButtons = this.renderButtons(context, isVodSeries);\n if (rentAndBuyButtons) {\n return rentAndBuyButtons;\n }\n }\n\n if (context === ContextKind.VodEpisode) {\n // Purchase status is not displayed here for episodes of VOD series\n return null;\n }\n\n if (lines.length === 0) {\n // Still loading\n return null;\n }\n\n return (\n <div className='pricing' onClick={this.handleOnClick}>\n {lines.map((l) => (\n <div key={l}>{l}</div>\n ))}\n </div>\n );\n }\n}\n\nconst mapStateToProps = (state: CombinedReducers): PricingVodReducerStateType => {\n return {\n isDebugModeEnabled: state.appConfiguration.isDebugModeEnabled,\n purchaseList: state.appRegistration.registration === RegistrationType.RegisteredAsGuest ? {} : state.ui.purchaseList,\n };\n};\n\nconst PricingVod: React.ComponentType<PricingVodPropType> = connect(mapStateToProps, null, null, { forwardRef: true })(PricingVodView);\n\nexport default PricingVod;\n","/* @flow */\n\nimport './NpvrModal.css';\nimport * as React from 'react';\nimport { ScheduledRecordingsKind, type ScheduledRecordingsKindType } from '../../../libs/netgemLibrary/v8/types/Npvr';\nimport ButtonFX from '../../buttons/ButtonFX';\nimport type { CombinedReducers } from '../../../redux/reducers';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport Modal from '../modal';\nimport { ModalIcon } from '../modalTypes';\nimport type { ModalState } from '../../../redux/modal/reducers';\nimport MultipleChoices from '../../multipleChoices/MultipleChoices';\nimport { PictoArrowLeft } from '@ntg/components/dist/pictos/Element';\nimport type { SCHEDULED_RECORDING_CORE_SETTINGS } from '../../../helpers/npvr/Types';\nimport { Setting } from '../../../helpers/settings/types';\nimport { WidthKind } from '../../buttons/types';\nimport { connect } from 'react-redux';\nimport { produce } from 'immer';\n\nexport enum NpvrModalDialogResult {\n Cancel,\n DeleteEpisode,\n RecordEpisode,\n RecordSeries,\n StopSeries,\n}\n\nexport type NPVR_MODAL_RESULT = {|\n dialogResult: NpvrModalDialogResult,\n settings?: SCHEDULED_RECORDING_CORE_SETTINGS,\n|};\n\nexport type NPVR_DATA_MODAL_TYPE = {|\n episodeIndex: ?string,\n episodeTitle: ?string,\n isEpisodeDeletable: boolean,\n isEpisodeRecordable: boolean,\n isSeriesRecordable: boolean,\n kind: ?ScheduledRecordingsKindType,\n seriesTitle: ?string,\n|};\n\ntype ReduxNpvrModalReducerStateType = {|\n +isDebugModeEnabled: boolean,\n|};\n\ntype NpvrModalStateType = {|\n increasingEpisodesIndex: number,\n isSeriesMode: boolean,\n recordsToKeepIndex: number,\n settings?: SCHEDULED_RECORDING_CORE_SETTINGS,\n|};\n\nconst InitialState = Object.freeze({\n increasingEpisodesIndex: -1,\n isSeriesMode: false,\n recordsToKeepIndex: -1,\n settings: undefined,\n});\n\ntype CompleteConfirmationModalPropType = {|\n ...ModalState,\n ...ReduxNpvrModalReducerStateType,\n|};\n\nclass NpvrModalView extends React.PureComponent<CompleteConfirmationModalPropType, NpvrModalStateType> {\n isBackDisplayed: boolean;\n\n modal: React.ElementRef<any> | null;\n\n constructor(props: CompleteConfirmationModalPropType) {\n super(props);\n\n const { isDebugModeEnabled, npvrData } = props;\n const isSeriesMode = Boolean(npvrData && npvrData.kind === ScheduledRecordingsKind.Series);\n\n this.isBackDisplayed = !isSeriesMode;\n this.modal = null;\n\n if (isDebugModeEnabled) {\n // Debug mode: new custom series settings\n this.state = {\n ...InitialState,\n increasingEpisodesIndex: 0,\n isSeriesMode,\n recordsToKeepIndex: 3,\n settings: {\n increasingEpisodes: true,\n recordsToKeep: 0,\n },\n };\n } else {\n // Old version: no series settings\n this.state = {\n ...InitialState,\n isSeriesMode,\n };\n }\n }\n\n close = (result: NPVR_MODAL_RESULT): void => {\n const { modal } = this;\n\n if (modal) {\n modal.close(result);\n }\n };\n\n handleRecordEpisode = () => {\n this.close({ dialogResult: NpvrModalDialogResult.RecordEpisode });\n };\n\n handleDeleteEpisode = () => {\n this.close({ dialogResult: NpvrModalDialogResult.DeleteEpisode });\n };\n\n handleRecordSeries = () => {\n const { isDebugModeEnabled } = this.props;\n\n if (isDebugModeEnabled) {\n // New series options\n this.setState({ isSeriesMode: true });\n } else {\n this.handleRecordSeriesInternal();\n }\n };\n\n handleStopSeries = () => {\n this.close({ dialogResult: NpvrModalDialogResult.StopSeries });\n };\n\n handleIncreasingEpisodesOnSelectionChanged = (value: any, setting?: Setting, increasingEpisodesIndex: number) => {\n this.setState(\n produce((draft) => {\n draft.increasingEpisodesIndex = increasingEpisodesIndex;\n\n if (draft.settings === undefined) {\n draft.settings = { increasingEpisodes: Boolean(value) };\n } else {\n draft.settings.increasingEpisodes = Boolean(value);\n }\n }),\n );\n };\n\n handleRecordsToKeepOnSelectionChanged = (value: any, setting?: Setting, recordsToKeepIndex: number) => {\n this.setState(\n produce((draft) => {\n draft.recordsToKeepIndex = recordsToKeepIndex;\n\n if (draft.settings === undefined) {\n draft.settings = { recordsToKeep: Number(value) };\n } else {\n draft.settings.recordsToKeep = Number(value);\n }\n }),\n );\n };\n\n renderHeader = (): React.Node => {\n const { npvrData } = this.props;\n const { isSeriesMode } = this.state;\n\n if (!npvrData) {\n return null;\n }\n\n const { episodeIndex, episodeTitle, seriesTitle } = npvrData;\n const parts = [];\n if (episodeIndex) {\n parts.push(episodeIndex);\n }\n if (episodeTitle) {\n parts.push(episodeTitle);\n }\n const episodeTitleElement = (!isSeriesMode || !seriesTitle) && parts.length > 0 ? <div className='episodeTitle'>{parts.join(' : ')}</div> : null;\n\n return (\n <>\n <div className='seriesTitle'>{seriesTitle}</div>\n {episodeTitleElement}\n </>\n );\n };\n\n renderButtons = (): React.Node => {\n const { npvrData } = this.props;\n\n if (!npvrData) {\n return null;\n }\n\n const { isEpisodeDeletable, isEpisodeRecordable, isSeriesRecordable } = npvrData;\n\n const episodeRecordBtn = isEpisodeRecordable ? (\n <ButtonFX key='recordEpisode' onClick={this.handleRecordEpisode} widthKind={WidthKind.Stretched}>\n {Localizer.localize('modal.npvr_confirmation.record_episode')}\n </ButtonFX>\n ) : null;\n\n const episodeDeleteBtn = isEpisodeDeletable ? (\n <ButtonFX key='deleteEpisode' onClick={this.handleDeleteEpisode} widthKind={WidthKind.Stretched}>\n {Localizer.localize('modal.npvr_confirmation.delete_episode')}\n </ButtonFX>\n ) : null;\n\n const seriesRecordBtn = isSeriesRecordable ? (\n <ButtonFX key='recordSeries' onClick={this.handleRecordSeries} widthKind={WidthKind.Stretched}>\n {Localizer.localize('modal.npvr_confirmation.record_series')}\n </ButtonFX>\n ) : null;\n\n const seriesStopBtn = !isSeriesRecordable ? (\n <ButtonFX key='stopSeries' onClick={this.handleStopSeries} widthKind={WidthKind.Stretched}>\n {Localizer.localize('modal.npvr_confirmation.stop_series')}\n </ButtonFX>\n ) : null;\n\n return (\n <>\n {episodeRecordBtn}\n {episodeDeleteBtn}\n {seriesRecordBtn}\n {seriesStopBtn}\n </>\n );\n };\n\n renderRegularBody: () => React.Node = this.renderButtons;\n\n handleRecordSeriesInternal = () => {\n const { settings } = this.state;\n\n this.close({\n dialogResult: NpvrModalDialogResult.RecordSeries,\n settings,\n });\n };\n\n renderSeriesBody = (): React.Node => {\n const { increasingEpisodesIndex, recordsToKeepIndex, settings } = this.state;\n\n const increasingEpisodesChoices = [\n {\n text: Localizer.localize('modal.npvr_confirmation.options.recent_seasons'),\n value: true,\n },\n {\n text: Localizer.localize('modal.npvr_confirmation.options.whole_series'),\n value: false,\n },\n ];\n\n const recordsToKeepChoices = [\n {\n text: '1',\n value: 1,\n },\n {\n text: '3',\n value: 3,\n },\n {\n text: '5',\n value: 5,\n },\n {\n text: Localizer.localize('modal.npvr_confirmation.options.all'),\n value: 0,\n },\n ];\n\n const seriesRecordOptions = settings ? (\n <div className='confirmationOptions'>\n <div className='confirmationOption'>\n <MultipleChoices choices={increasingEpisodesChoices} onSelectionChanged={this.handleIncreasingEpisodesOnSelectionChanged} selectedIndex={increasingEpisodesIndex} />\n </div>\n <div className='confirmationOption'>\n <span className='confirmationLabel'>{Localizer.localize('modal.npvr_confirmation.options.records_to_keep')}</span>\n <MultipleChoices choices={recordsToKeepChoices} onSelectionChanged={this.handleRecordsToKeepOnSelectionChanged} selectedIndex={recordsToKeepIndex} />\n </div>\n </div>\n ) : null;\n\n return (\n <>\n {seriesRecordOptions}\n <ButtonFX key='recordSeries' onClick={this.handleRecordSeriesInternal} widthKind={WidthKind.Stretched}>\n {Localizer.localize('common.actions.confirm')}\n </ButtonFX>\n </>\n );\n };\n\n handleBackOnClick = () => {\n this.setState({ isSeriesMode: false });\n };\n\n renderBackPicto = (): React.Node => <PictoArrowLeft onClick={this.handleBackOnClick} />;\n\n renderChildren = (): React.Node => {\n const { isSeriesMode } = this.state;\n const { isBackDisplayed } = this;\n\n return (\n <>\n {isSeriesMode && isBackDisplayed ? this.renderBackPicto() : null}\n <div className='confirmationBody'>{isSeriesMode ? this.renderSeriesBody() : this.renderRegularBody()}</div>\n </>\n );\n };\n\n render(): React.Node {\n const { index } = this.props;\n\n return (\n <Modal\n canCloseOnEnter={false}\n className='npvrConfirmation'\n header={this.renderHeader()}\n icon={ModalIcon.Record}\n index={index}\n ref={(instance) => {\n this.modal = instance;\n }}\n >\n {this.renderChildren()}\n </Modal>\n );\n }\n}\n\nconst mapStateToProps = (state: CombinedReducers) => {\n return {\n isDebugModeEnabled: state.appConfiguration.isDebugModeEnabled,\n };\n};\n\nconst NpvrModal: React.ComponentType<ModalState> = connect(mapStateToProps, null, null, { forwardRef: true })(NpvrModalView);\n\nexport default NpvrModal;\n","/* @flow */\n\nimport { RecordingOutcome, type ScheduledRecordingsKindType } from '../../libs/netgemLibrary/v8/types/Npvr';\n\n// All times below are in seconds\nexport type NPVR_QUOTA = {|\n formattedRecordingTime: string,\n formattedRemainingTime: string,\n formattedScheduledRecordingTime: string,\n formattedTotalQuota: string,\n recordingTime: number,\n remainingTime: number,\n scheduledRecordingTime: number,\n totalQuota: number,\n|};\n\nexport enum RecordingKind {\n Series,\n SeriesWithSingle,\n Single,\n SingleKeepFromReplay,\n}\n\nexport type ITEM_RECORD_STATUS = {|\n failedRecordingId?: string,\n hasRecording: boolean,\n hasScheduledRecording: boolean,\n hasSeriesScheduledRecording: boolean,\n recordOutcome?: RecordingOutcome,\n warningScheduledEventId?: string,\n warningScheduledRecordingId?: string,\n|};\n\nexport type SCHEDULED_RECORDING_CORE_SETTINGS = {|\n fromUtc?: string | null,\n increasingEpisodes?: boolean,\n recordsToKeep?: number,\n toUtc?: string | null,\n|};\n\nexport type SCHEDULED_RECORDING_CREATION_SETTINGS = {|\n ...SCHEDULED_RECORDING_CORE_SETTINGS,\n channelId?: string | null,\n scheduledRecordKind: ScheduledRecordingsKindType,\n target: string,\n|};\n\nexport type SCHEDULED_RECORDING_UPDATE_SETTINGS = {|\n ...SCHEDULED_RECORDING_CORE_SETTINGS,\n assetId: string,\n|};\n\nexport enum RecordButtonActionKind {\n Delete,\n None,\n Record,\n}\n","/* @flow */\n\nimport { MILLISECONDS_PER_MINUTE } from '../dateTime/Format';\n\n// Following time is in ms\nexport const SCHEDULED_RECORDING_CHECK_TIMEOUT: number = 500;\n\n// Max number of attempts when checking that a new scheduled recording is OK\nexport const SCHEDULED_RECORDING_MAX_CHECK_COUNT: number = MILLISECONDS_PER_MINUTE / SCHEDULED_RECORDING_CHECK_TIMEOUT;\n","/* @flow */\n\nimport {\n type NETGEM_API_V8_FEED_ITEM,\n type NETGEM_API_V8_ITEM_LOCATION,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT,\n} from '../../libs/netgemLibrary/v8/types/FeedItem';\nimport { type NETGEM_API_V8_SCHEDULED_RECORDING, type NETGEM_RECORDINGS_MAP, type NETGEM_SCHEDULED_RECORDINGS_MAP, RecordingOutcome } from '../../libs/netgemLibrary/v8/types/Npvr';\nimport { type ITEM_RECORD_STATUS } from './Types';\nimport type { Undefined } from '@ntg/utils/dist/types';\nimport { hasRunningSeriesScheduledRecording } from './scheduledRecording';\n\nconst isRecordingMatching: (item: NETGEM_API_V8_FEED_ITEM, recording: NETGEM_API_V8_ITEM_LOCATION) => boolean = (item, recording) => {\n const {\n selectedLocation: { duration, scheduledEventDuration, scheduledEventStartDate, startDate },\n } = item;\n const localStart = scheduledEventStartDate || startDate;\n const localDuration = scheduledEventDuration || duration;\n\n const { scheduledEventDuration: recordingDuration, scheduledEventStartDate: recordingStart } = recording;\n\n return Boolean(localStart && localDuration) && recordingStart === localStart && recordingDuration === localDuration;\n};\n\nconst searchProgramInRecordings: (\n programId: string,\n item: NETGEM_API_V8_FEED_ITEM,\n recordingList: NETGEM_RECORDINGS_MAP,\n) => {\n failedRecordingId?: string,\n hasRecording: boolean,\n recordOutcome?: RecordingOutcome,\n warningScheduledEventId?: string,\n warningScheduledRecordingId?: string,\n} = (programId, item, recordingList) => {\n const recordings = recordingList[programId];\n\n let failedRecordingId: Undefined<string> = undefined;\n let hasRecording = false;\n let recordOutcome: Undefined<RecordingOutcome> = undefined;\n let warningScheduledEventId: Undefined<string> = undefined;\n let warningScheduledRecordingId: Undefined<string> = undefined;\n\n if (recordings) {\n recordings.forEach((r) => {\n const { recordOutcome: outcome } = r;\n\n if (outcome) {\n if (recordOutcome !== RecordingOutcome.Recorded) {\n // Existing recording case\n recordOutcome = outcome;\n if (outcome !== RecordingOutcome.Recorded) {\n failedRecordingId = r.id;\n } else if (isRecordingMatching(item, r)) {\n failedRecordingId = undefined;\n hasRecording = true;\n }\n }\n } else {\n // Future recording case\n const { id, matchingScheduledRecordings } = r;\n if (matchingScheduledRecordings) {\n const scheduledRecordingInDanger = matchingScheduledRecordings.find((scheduledRecording) => scheduledRecording.recordOutcome !== RecordingOutcome.WillBeRecorded);\n if (scheduledRecordingInDanger) {\n warningScheduledEventId = id;\n ({ recordOutcome, id: warningScheduledRecordingId } = scheduledRecordingInDanger);\n }\n }\n }\n });\n }\n\n return {\n failedRecordingId,\n hasRecording,\n recordOutcome,\n warningScheduledEventId,\n warningScheduledRecordingId,\n };\n};\n\nconst getEpisodeAndSeriesRecordStatus: (\n programId: string,\n metadataSeriesId: Undefined<string>,\n item: NETGEM_API_V8_FEED_ITEM,\n npvrRecordingsList: NETGEM_RECORDINGS_MAP,\n npvrRecordingsFuture: NETGEM_RECORDINGS_MAP,\n npvrScheduledRecordingsList: NETGEM_SCHEDULED_RECORDINGS_MAP,\n previewCatchupScheduledEventId: ?string,\n) => ITEM_RECORD_STATUS = (programId, metadataSeriesId, item, npvrRecordingsList, npvrRecordingsFuture, npvrScheduledRecordingsList, previewCatchupScheduledEventId) => {\n const {\n selectedLocation: { id: scheduledEventId = '' },\n seriesId,\n } = item;\n\n let failedRecordingId: Undefined<string> = undefined;\n let hasRecording = false;\n let recordOutcome: Undefined<RecordingOutcome> = undefined;\n let warningScheduledEventId: Undefined<string> = undefined;\n let warningScheduledRecordingId: Undefined<string> = undefined;\n\n // HACK: recordings started in the user start margin does not appear in the future recording list any longer but their recordOutcome in the existing recording list is \"Unknown\"\n const {\n locType,\n selectedLocation: { recordOutcome: correctOutcome },\n } = item;\n const isRecordingFallback = locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING && correctOutcome === RecordingOutcome.Recorded;\n\n // Look into existing recordings\n ({ failedRecordingId, hasRecording, recordOutcome } = searchProgramInRecordings(programId, item, npvrRecordingsList));\n\n // Look into future recordings\n if (!hasRecording && !failedRecordingId && !recordOutcome) {\n ({ recordOutcome, warningScheduledEventId, warningScheduledRecordingId } = searchProgramInRecordings(programId, item, npvrRecordingsFuture));\n }\n\n const scheduledRecording = npvrScheduledRecordingsList[previewCatchupScheduledEventId ?? scheduledEventId];\n const hasScheduledRecording = Boolean(scheduledRecording) && ((scheduledRecording.records.length > 0 && hasRecording) || scheduledRecording.records.length === 0);\n const hasSeriesScheduledRecording = hasRunningSeriesScheduledRecording(seriesId ?? metadataSeriesId, npvrScheduledRecordingsList);\n\n if ((!hasRecording || recordOutcome === RecordingOutcome.Unknown) && isRecordingFallback) {\n return {\n failedRecordingId,\n hasRecording: true,\n hasScheduledRecording,\n hasSeriesScheduledRecording,\n recordOutcome: RecordingOutcome.Recorded,\n warningScheduledEventId,\n warningScheduledRecordingId,\n };\n }\n\n return {\n failedRecordingId,\n hasRecording,\n hasScheduledRecording,\n hasSeriesScheduledRecording,\n recordOutcome,\n warningScheduledEventId,\n warningScheduledRecordingId,\n };\n};\n\nconst getScheduledRecordingIdFromRecordingId: (failedRecordingId: string, npvrScheduledRecordingsList: NETGEM_SCHEDULED_RECORDINGS_MAP) => ?string = (\n failedRecordingId,\n npvrScheduledRecordingsList,\n) => {\n for (const scheduledRecording of Object.values(npvrScheduledRecordingsList)) {\n const { id: scheduledRecordingId, records } = ((scheduledRecording: any): NETGEM_API_V8_SCHEDULED_RECORDING);\n if (records.some((r) => r.id === failedRecordingId)) {\n return scheduledRecordingId;\n }\n }\n\n return null;\n};\n\nconst searchScheduledRecordingInFuture: (\n scheduledRecordingId: string,\n futureRecordings: NETGEM_RECORDINGS_MAP | null,\n) => {\n isScheduledRecordingFuturePresent: boolean,\n scheduledRecordingOutcome: RecordingOutcome,\n} = (scheduledRecordingId, futureRecordings) => {\n let isScheduledRecordingFuturePresent = false;\n let scheduledRecordingOutcome: RecordingOutcome = RecordingOutcome.WillBeRecorded;\n\n if (futureRecordings === null) {\n // Latest retrieved future recordings have not changed (HTTP 304)\n return { isScheduledRecordingFuturePresent, scheduledRecordingOutcome };\n }\n\n const futureValues = ((Object.values(futureRecordings): any): Array<Array<NETGEM_API_V8_ITEM_LOCATION>>);\n\n for (let i = 0; i < futureValues.length; ++i) {\n const { [i]: locations } = futureValues;\n\n for (let j = 0; j < locations.length; ++j) {\n const {\n [j]: { matchingScheduledRecordings },\n } = locations;\n if (matchingScheduledRecordings) {\n for (let k = 0; k < matchingScheduledRecordings.length; ++k) {\n const {\n [k]: { id, recordOutcome },\n } = matchingScheduledRecordings;\n\n if (id === scheduledRecordingId) {\n isScheduledRecordingFuturePresent = true;\n if (recordOutcome !== RecordingOutcome.WillBeRecorded && recordOutcome !== RecordingOutcome.Rebroadcast && recordOutcome !== RecordingOutcome.OutdatedEpisode) {\n scheduledRecordingOutcome = recordOutcome;\n return { isScheduledRecordingFuturePresent, scheduledRecordingOutcome };\n }\n }\n }\n }\n }\n }\n\n return { isScheduledRecordingFuturePresent, scheduledRecordingOutcome };\n};\n\nconst searchRecordingInExisting: (\n recordId: string,\n existingRecordings: NETGEM_RECORDINGS_MAP | null,\n) => {\n isRecordingPresent: boolean,\n recordingOutcome: RecordingOutcome,\n} = (recordId, existingRecordings) => {\n let isRecordingPresent = false;\n\n if (existingRecordings === null) {\n // Latest retrieved future recordings have not changed (HTTP 304)\n return { isRecordingPresent, recordingOutcome: RecordingOutcome.Unknown };\n }\n\n const existingValues = ((Object.values(existingRecordings): any): Array<Array<NETGEM_API_V8_ITEM_LOCATION>>);\n\n for (let i = 0; i < existingValues.length; ++i) {\n const { [i]: locations } = existingValues;\n\n for (let j = 0; j < locations.length; ++j) {\n const {\n [j]: { id, recordOutcome },\n } = locations;\n\n if (id === recordId) {\n isRecordingPresent = true;\n if (recordOutcome === RecordingOutcome.Recorded || recordOutcome === RecordingOutcome.Rebroadcast) {\n return { isRecordingPresent, recordingOutcome: RecordingOutcome.Recorded };\n }\n }\n }\n }\n\n return { isRecordingPresent, recordingOutcome: RecordingOutcome.Unknown };\n};\n\nconst isItemRecordingOrScheduledRecording: (item: NETGEM_API_V8_FEED_ITEM) => boolean = (item) => {\n const { locType, selectedLocation } = item;\n\n return (\n // Recordings\n locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING ||\n // Scheduled recordings\n (locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT && selectedLocation.matchingScheduledRecordings !== undefined && selectedLocation.matchingScheduledRecordings.length > 0)\n );\n};\n\nexport {\n getEpisodeAndSeriesRecordStatus,\n getScheduledRecordingIdFromRecordingId,\n isItemRecordingOrScheduledRecording,\n isRecordingMatching,\n searchRecordingInExisting,\n searchScheduledRecordingInFuture,\n};\n","/* @flow */\n\nimport * as React from 'react';\nimport { BroadcastStatus, getBroadcastStatusFromTimes } from '../../../../helpers/ui/location/Format';\nimport { HeightKind, WidthKind } from '../../../../components/buttons/types';\nimport { ItemType, type NETGEM_API_V8_FEED_ITEM, type NETGEM_API_V8_ITEM_LOCATION } from '../../../../libs/netgemLibrary/v8/types/FeedItem';\nimport { Messenger, MessengerEvents } from '@ntg/utils/dist/messenger';\nimport type { NETGEM_API_V8_METADATA_PROGRAM, NETGEM_API_V8_METADATA_SERIES } from '../../../../libs/netgemLibrary/v8/types/MetadataProgram';\nimport {\n type NETGEM_API_V8_SCHEDULED_RECORDING,\n type NETGEM_RECORDINGS_MAP,\n type NETGEM_SCHEDULED_RECORDINGS_MAP,\n RecordingOutcome,\n ScheduledRecordingsKind,\n type ScheduledRecordingsKindType,\n} from '../../../../libs/netgemLibrary/v8/types/Npvr';\nimport { type NPVR_MODAL_RESULT, NpvrModalDialogResult } from '../../../../components/modal/npvrModal/NpvrModal';\nimport { RecordingKind, type SCHEDULED_RECORDING_CORE_SETTINGS, type SCHEDULED_RECORDING_CREATION_SETTINGS } from '../../../../helpers/npvr/Types';\nimport { SCHEDULED_RECORDING_CHECK_TIMEOUT, SCHEDULED_RECORDING_MAX_CHECK_COUNT } from '../../../../helpers/npvr/Constants';\nimport { deleteRecording, getExistingRecordings, getFutureRecordings, sendV8RecordingsMetadataRequest } from './recordings';\nimport { deleteScheduledRecording, getRecordId, sendV8ScheduledRecordingCreateRequest, startSeriesScheduledRecording, stopSeriesScheduledRecording } from './scheduledRecordings';\nimport { getEpisodeAndSeriesRecordStatus, searchRecordingInExisting, searchScheduledRecordingInFuture } from '../../../../helpers/npvr/recording';\nimport { getEpisodeIndexAndTitle, getTitle } from '../../../../helpers/ui/metadata/Format';\nimport { getIso8601DateInSeconds, getIso8601DurationInSeconds } from '../../../../helpers/dateTime/Format';\nimport { showConfirmationModal, showNpvrModal } from '../../../modal/actions';\nimport ButtonFX from '../../../../components/buttons/ButtonFX';\nimport type { CombinedReducers } from '../../../reducers';\nimport { ConfirmationModalResult } from '../../../../components/modal/confirmationModal/ConfirmationModal';\nimport { CustomNetworkError } from '../../../../libs/netgemLibrary/helpers/CustomNetworkError';\nimport type { Dispatch } from '../../../types/types';\nimport { HttpStatus } from '../../../../libs/netgemLibrary/v8/constants/NetworkCodesAndMessages';\nimport type { InternalActionDefinitionType } from '../emitter';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport { ModalIcon } from '../../../../components/modal/modalTypes';\nimport type { NETGEM_API_V8_METADATA_SCHEDULE } from '../../../../libs/netgemLibrary/v8/types/MetadataSchedule';\nimport type { NETGEM_API_V8_REQUEST_RESPONSE } from '../../../../libs/netgemLibrary/v8/types/RequestResponse';\nimport { getRoundedNowToISOString } from '../../../../libs/netgemLibrary/v8/helpers/Date';\nimport { isSeriesScheduledRecordingRunning } from '../../../../helpers/npvr/scheduledRecording';\n\nexport type RECORD_ITEM_TYPE = {|\n broadcastStatus: BroadcastStatus,\n catchupId?: string,\n finishedOperationEventName: string,\n item: NETGEM_API_V8_FEED_ITEM,\n kind: ?ScheduledRecordingsKindType,\n previewCatchupScheduledEventId: ?string,\n programMetadata: NETGEM_API_V8_METADATA_PROGRAM,\n seriesMetadata: ?NETGEM_API_V8_METADATA_SERIES,\n settings?: SCHEDULED_RECORDING_CORE_SETTINGS | null,\n|};\n\ntype OUTCOMES_TYPE = {|\n futureOutcome: ?RecordingOutcome,\n keepFromReplayOutcome: ?RecordingOutcome,\n liveOutcome: ?RecordingOutcome,\n recordId: ?string,\n scheduledRecordingId: ?string,\n seriesOutcome: ?RecordingOutcome,\n|};\n\nconst startRecord: (recordItem: RECORD_ITEM_TYPE, isDebugModeEnabled: boolean) => InternalActionDefinitionType = (recordItem, isDebugModeEnabled) => (dispatch: Dispatch) => {\n const {\n finishedOperationEventName,\n item: { type },\n kind,\n seriesMetadata,\n } = recordItem;\n\n if (!type) {\n Messenger.emit(finishedOperationEventName);\n return;\n }\n\n if (kind === ScheduledRecordingsKind.Single || kind === ScheduledRecordingsKind.KeepFromReplay || (type === ItemType.Program && !seriesMetadata)) {\n // Program card\n dispatch(recordSingle(recordItem));\n } else if (kind === ScheduledRecordingsKind.Series && !isDebugModeEnabled) {\n // Series card\n dispatch(recordSeries(recordItem));\n } else {\n // All other cases\n dispatch(promptUser(recordItem));\n }\n};\n\nconst stopRecord: (recordItem: RECORD_ITEM_TYPE) => InternalActionDefinitionType = (recordItem) => (dispatch: Dispatch) => {\n const {\n finishedOperationEventName,\n item: { type },\n kind,\n seriesMetadata,\n } = recordItem;\n\n if (!type) {\n Messenger.emit(finishedOperationEventName);\n return;\n }\n\n if (kind === ScheduledRecordingsKind.Single || kind === ScheduledRecordingsKind.KeepFromReplay || (type === ItemType.Program && !seriesMetadata)) {\n // Program card\n dispatch(deleteSingle(recordItem));\n } else if (kind === ScheduledRecordingsKind.Series) {\n // Series card\n dispatch(stopSeries(recordItem));\n } else {\n // All other cases\n dispatch(promptUser(recordItem));\n }\n};\n\nconst promptUser: (recordItem: RECORD_ITEM_TYPE) => InternalActionDefinitionType = (recordItem) => (dispatch: Dispatch, getState: () => CombinedReducers) => {\n const {\n npvr: { npvrRecordingsFuture, npvrRecordingsList, npvrScheduledRecordingsList },\n } = getState();\n const {\n broadcastStatus,\n finishedOperationEventName,\n item,\n item: { selectedProgramId: programId },\n kind,\n previewCatchupScheduledEventId,\n programMetadata,\n seriesMetadata,\n } = recordItem;\n\n if (!programMetadata || !seriesMetadata || !programId) {\n Messenger.emit(finishedOperationEventName);\n return;\n }\n\n const { hasRecording, hasScheduledRecording, hasSeriesScheduledRecording } = getEpisodeAndSeriesRecordStatus(\n programId,\n seriesMetadata.id,\n item,\n npvrRecordingsList,\n npvrRecordingsFuture,\n npvrScheduledRecordingsList,\n previewCatchupScheduledEventId,\n );\n\n const seriesTitle = getTitle(seriesMetadata, Localizer.language);\n const { episodeIndex, episodeTitle } = getEpisodeIndexAndTitle(programMetadata, seriesTitle, Localizer.language);\n\n const npvrData = {\n episodeIndex,\n episodeTitle,\n isEpisodeDeletable: hasRecording || hasScheduledRecording,\n isEpisodeRecordable:\n !hasRecording &&\n !hasScheduledRecording &&\n !hasSeriesScheduledRecording &&\n (broadcastStatus === BroadcastStatus.Live || broadcastStatus === BroadcastStatus.Future || broadcastStatus === BroadcastStatus.Preview),\n isSeriesRecordable: !hasSeriesScheduledRecording,\n kind,\n seriesTitle,\n };\n\n const confirmationClosedCallback = (result?: NPVR_MODAL_RESULT) => {\n const { dialogResult, settings } = result || {\n dialogResult: NpvrModalDialogResult.Cancel,\n settings: undefined,\n };\n\n dispatch(\n npvrConfirmationClosedCallback(\n {\n ...recordItem,\n settings,\n },\n dialogResult,\n ),\n );\n };\n\n Messenger.once(MessengerEvents.MODAL_CONFIRMATION_CLOSED, confirmationClosedCallback);\n dispatch(showNpvrModal(npvrData));\n};\n\nconst npvrConfirmationClosedCallback: (recordItem: RECORD_ITEM_TYPE, result: NpvrModalDialogResult) => InternalActionDefinitionType = (recordItem, result) => (dispatch: Dispatch) => {\n const { finishedOperationEventName } = recordItem;\n\n switch (result) {\n case NpvrModalDialogResult.DeleteEpisode:\n dispatch(deleteSingle(recordItem));\n break;\n\n case NpvrModalDialogResult.StopSeries:\n dispatch(stopSeries(recordItem));\n break;\n\n case NpvrModalDialogResult.RecordEpisode:\n dispatch(recordSingle(recordItem));\n break;\n\n case NpvrModalDialogResult.RecordSeries:\n dispatch(recordSeries(recordItem));\n break;\n\n case NpvrModalDialogResult.Cancel:\n Messenger.emit(finishedOperationEventName);\n break;\n\n // No default\n }\n};\n\nconst recordSingle: (recordItem: RECORD_ITEM_TYPE) => InternalActionDefinitionType = (recordItem) => (dispatch: Dispatch) => {\n const {\n catchupId,\n finishedOperationEventName,\n item: {\n selectedLocation: { id: scheduledEventId = '' },\n },\n kind,\n previewCatchupScheduledEventId,\n settings,\n } = recordItem;\n\n let target = scheduledEventId;\n if (catchupId) {\n // Keep from replay\n target = catchupId;\n } else if (previewCatchupScheduledEventId) {\n // Preview catchup\n target = previewCatchupScheduledEventId;\n }\n\n const creationSettings: SCHEDULED_RECORDING_CREATION_SETTINGS = {\n ...settings,\n // KeepFromReplay or Single (default)\n scheduledRecordKind: kind ?? ScheduledRecordingsKind.Single,\n target,\n };\n\n dispatch(sendV8ScheduledRecordingCreateRequest(creationSettings))\n .then((result: NETGEM_API_V8_SCHEDULED_RECORDING) => {\n const recordId = getRecordId(result);\n const { id } = result;\n\n const outcomes: OUTCOMES_TYPE = {\n futureOutcome: null,\n keepFromReplayOutcome: null,\n liveOutcome: null,\n recordId,\n scheduledRecordingId: id,\n seriesOutcome: null,\n };\n\n if (recordId) {\n if (kind === ScheduledRecordingsKind.KeepFromReplay) {\n // Program is past (keep from replay): let's check if it's in the existing recordings\n outcomes.keepFromReplayOutcome = RecordingOutcome.Unknown;\n setTimeout(() => dispatch(checkKeepFromReplay(recordItem, outcomes)), SCHEDULED_RECORDING_CHECK_TIMEOUT);\n } else {\n // Program is live: let's check that it's actually being recorded\n outcomes.liveOutcome = RecordingOutcome.Unknown;\n setTimeout(() => dispatch(checkLiveRecording(recordItem, RecordingKind.Single, outcomes)), SCHEDULED_RECORDING_CHECK_TIMEOUT);\n }\n } else {\n // Program is a future: scheduled recording has been created\n outcomes.futureOutcome = RecordingOutcome.Unknown;\n setTimeout(() => dispatch(checkFutureRecording(recordItem, RecordingKind.Single, outcomes)), SCHEDULED_RECORDING_CHECK_TIMEOUT);\n }\n })\n .catch((error: CustomNetworkError) => {\n const {\n message,\n networkError: { message: networkMsg },\n } = error;\n Messenger.emit(finishedOperationEventName);\n Messenger.emit(\n MessengerEvents.NOTIFY_ERROR,\n <>\n <div>{Localizer.localize('recording.single.create.error')}</div>\n <div>\n <b>{networkMsg ?? message}</b>\n </div>\n </>,\n );\n });\n};\n\nconst recordSeries: (recordItem: RECORD_ITEM_TYPE) => InternalActionDefinitionType = (recordItem) => (dispatch: Dispatch, getState: () => CombinedReducers) => {\n const {\n npvr: { npvrScheduledRecordingsList },\n } = getState();\n const {\n finishedOperationEventName,\n item: {\n selectedLocation: { channelId },\n seriesId,\n },\n } = recordItem;\n\n if (!channelId || !seriesId) {\n Messenger.emit(finishedOperationEventName);\n return;\n }\n\n // Check first if the series already has a matching scheduled recording that has been previously stopped\n const { [seriesId]: seriesScheduledRecording } = npvrScheduledRecordingsList;\n if (!seriesScheduledRecording) {\n // Create a new scheduled recording\n dispatch(createSeriesScheduledRecording(recordItem));\n } else if (!isSeriesScheduledRecordingRunning(seriesScheduledRecording)) {\n // Restart the scheduled recording only if it has indeed been stopped (if it's not the case, there's a bug out there...)\n dispatch(restartSeriesScheduledRecording(recordItem, seriesScheduledRecording.id));\n }\n};\n\nconst createSeriesScheduledRecording: (recordItem: RECORD_ITEM_TYPE) => InternalActionDefinitionType = (recordItem) => (dispatch: Dispatch) => {\n const {\n finishedOperationEventName,\n item: {\n selectedLocation: { channelId },\n seriesId,\n },\n settings,\n } = recordItem;\n\n if (!seriesId) {\n return;\n }\n\n const creationSettings: SCHEDULED_RECORDING_CREATION_SETTINGS = {\n ...settings,\n channelId,\n fromUtc: getRoundedNowToISOString(),\n scheduledRecordKind: ScheduledRecordingsKind.Series,\n target: seriesId,\n };\n\n dispatch(sendV8ScheduledRecordingCreateRequest(creationSettings))\n .then((result: NETGEM_API_V8_SCHEDULED_RECORDING) => {\n const recordId = getRecordId(result);\n const { id } = result;\n\n const outcomes: OUTCOMES_TYPE = {\n futureOutcome: null,\n keepFromReplayOutcome: null,\n liveOutcome: null,\n recordId,\n scheduledRecordingId: id,\n seriesOutcome: RecordingOutcome.WillBeRecorded,\n };\n\n let recordingType: RecordingKind = RecordingKind.Series;\n\n if (recordId) {\n // Series recording triggered a live recording: let's check that it's actually being recorded\n recordingType = RecordingKind.SeriesWithSingle;\n outcomes.liveOutcome = RecordingOutcome.Unknown;\n setTimeout(() => dispatch(checkLiveRecording(recordItem, RecordingKind.SeriesWithSingle, outcomes)), SCHEDULED_RECORDING_CHECK_TIMEOUT);\n } else {\n // No episode of this series is currently live\n outcomes.futureOutcome = RecordingOutcome.Unknown;\n setTimeout(() => dispatch(checkFutureRecording(recordItem, recordingType, outcomes)), SCHEDULED_RECORDING_CHECK_TIMEOUT);\n }\n })\n .catch((error: CustomNetworkError) => {\n const {\n message,\n networkError: { message: networkMsg },\n } = error;\n Messenger.emit(finishedOperationEventName);\n Messenger.emit(\n MessengerEvents.NOTIFY_ERROR,\n <>\n <div>{Localizer.localize('recording.series.create.error')}</div>\n <div>\n <b>{networkMsg ?? message}</b>\n </div>\n </>,\n );\n });\n};\n\nconst restartSeriesScheduledRecording: (recordItem: RECORD_ITEM_TYPE, seriesScheduledRecordingId: string) => InternalActionDefinitionType =\n (recordItem, seriesScheduledRecordingId) => (dispatch: Dispatch) => {\n const { finishedOperationEventName, settings } = recordItem;\n\n const updateSettings = {\n ...settings,\n assetId: seriesScheduledRecordingId,\n };\n\n dispatch(startSeriesScheduledRecording(updateSettings))\n .then(() => {\n Messenger.emit(finishedOperationEventName);\n Messenger.emit(MessengerEvents.REFRESH_NPVR);\n })\n .catch((error: CustomNetworkError) => {\n const status = error.getStatus();\n Messenger.emit(finishedOperationEventName);\n if (status === HttpStatus.NotFound) {\n // Series scheduled recording seems to have been deleted somehow: let's try to create it instead of restarting it\n dispatch(createSeriesScheduledRecording(recordItem));\n } else {\n Messenger.emit(\n MessengerEvents.NOTIFY_ERROR,\n <>\n <div>{Localizer.localize('recording.series.create.error')}</div>\n <div>\n <b>{status}</b>\n </div>\n </>,\n );\n }\n });\n };\n\nconst checkLiveRecording =\n (recordItem: RECORD_ITEM_TYPE, recordingType: RecordingKind, outcomes: OUTCOMES_TYPE, checkCount: number = 0): InternalActionDefinitionType =>\n (dispatch: Dispatch) => {\n const { finishedOperationEventName } = recordItem;\n const { recordId } = outcomes;\n\n if (!recordId) {\n Messenger.emit(finishedOperationEventName);\n return;\n }\n\n if (checkCount === SCHEDULED_RECORDING_MAX_CHECK_COUNT) {\n // Max attempts reached\n outcomes.liveOutcome = RecordingOutcome.ServerError;\n\n if (recordingType === RecordingKind.Single) {\n // Single recording\n Messenger.emit(finishedOperationEventName);\n showSingleRecordingError(outcomes);\n } else {\n // Live recording failed, but it's a series: check future recording(s)\n dispatch(checkFutureRecording(recordItem, recordingType, outcomes));\n }\n return;\n }\n\n dispatch(sendV8RecordingsMetadataRequest(recordId))\n .then((response: NETGEM_API_V8_REQUEST_RESPONSE) => {\n const result = (response.result: NETGEM_API_V8_METADATA_SCHEDULE);\n const {\n location: { recordOutcome },\n } = result;\n\n outcomes.liveOutcome = recordOutcome;\n\n if (recordOutcome === RecordingOutcome.Recorded) {\n // Live recording is OK\n\n if (recordingType === RecordingKind.Single) {\n // Single recording\n Messenger.emit(finishedOperationEventName);\n Messenger.emit(MessengerEvents.REFRESH_NPVR);\n Messenger.emit(MessengerEvents.NOTIFY_SUCCESS, <div>{Localizer.localize('recording.single.create.success_live')}</div>);\n } else {\n // Series recording + live recording\n outcomes.liveOutcome = RecordingOutcome.Recorded;\n outcomes.seriesOutcome = RecordingOutcome.Recorded;\n outcomes.futureOutcome = RecordingOutcome.Unknown;\n dispatch(checkFutureRecording(recordItem, recordingType, outcomes));\n }\n } else if (recordOutcome === RecordingOutcome.Unknown) {\n // Live recording state is still unknown: wait a little bit more\n setTimeout(() => dispatch(checkLiveRecording(recordItem, recordingType, outcomes, checkCount + 1)), SCHEDULED_RECORDING_CHECK_TIMEOUT);\n } else if (recordingType === RecordingKind.Single) {\n // Live recording failed\n Messenger.emit(finishedOperationEventName);\n showSingleRecordingError(outcomes);\n } else {\n // Live recording failed but series recording might be OK\n outcomes.futureOutcome = RecordingOutcome.Unknown;\n dispatch(checkFutureRecording(recordItem, recordingType, outcomes));\n }\n })\n .catch(() => Messenger.emit(finishedOperationEventName));\n };\n\nconst checkKeepFromReplay =\n (recordItem: RECORD_ITEM_TYPE, outcomes: OUTCOMES_TYPE, checkCount: number = 0): InternalActionDefinitionType =>\n (dispatch: Dispatch) => {\n const { finishedOperationEventName } = recordItem;\n const { recordId } = outcomes;\n\n if (!recordId) {\n Messenger.emit(finishedOperationEventName);\n return;\n }\n\n if (checkCount === SCHEDULED_RECORDING_MAX_CHECK_COUNT) {\n // Max attempts reached\n outcomes.keepFromReplayOutcome = RecordingOutcome.ServerError;\n\n Messenger.emit(finishedOperationEventName);\n showKeepFromReplayError(outcomes);\n return;\n }\n\n dispatch(getExistingRecordings())\n .then((existingRecordings: NETGEM_RECORDINGS_MAP | null) => {\n // Search for scheduledRecordingId\n const { isRecordingPresent, recordingOutcome } = searchRecordingInExisting(recordId, existingRecordings);\n\n if (!isRecordingPresent && recordingOutcome !== RecordingOutcome.Recorded) {\n setTimeout(() => dispatch(checkKeepFromReplay(recordItem, outcomes, checkCount + 1)), SCHEDULED_RECORDING_CHECK_TIMEOUT);\n return;\n }\n\n outcomes.keepFromReplayOutcome = recordingOutcome;\n\n Messenger.emit(finishedOperationEventName);\n Messenger.emit(MessengerEvents.REFRESH_NPVR);\n Messenger.emit(MessengerEvents.REFRESH_RECORDINGS_SECTION);\n if (recordingOutcome === RecordingOutcome.Recorded) {\n Messenger.emit(MessengerEvents.NOTIFY_SUCCESS, <div>{Localizer.localize('tv.keep_from_replay.saved')}</div>);\n } else {\n showKeepFromReplayError(outcomes);\n }\n })\n .catch(() => {\n Messenger.emit(finishedOperationEventName);\n return Promise.resolve();\n });\n };\n\nconst checkFutureRecording =\n (recordItem: RECORD_ITEM_TYPE, recordingType: RecordingKind, outcomes: OUTCOMES_TYPE, checkCount: number = 0): InternalActionDefinitionType =>\n (dispatch: Dispatch) => {\n const { finishedOperationEventName } = recordItem;\n const { scheduledRecordingId } = outcomes;\n\n if (!scheduledRecordingId) {\n Messenger.emit(finishedOperationEventName);\n return;\n }\n\n if (checkCount === SCHEDULED_RECORDING_MAX_CHECK_COUNT) {\n // Max attempts reached\n outcomes.futureOutcome = RecordingOutcome.ServerError;\n\n if (recordingType === RecordingKind.Single) {\n // Single recording\n Messenger.emit(finishedOperationEventName);\n showSingleRecordingError(outcomes, scheduledRecordingId);\n } else {\n // Series recording: check if scheduled recording exists for the series\n outcomes.seriesOutcome = RecordingOutcome.ServerError;\n dispatch(checkSeriesRecordingOutcome(recordItem, recordingType, outcomes));\n }\n return;\n }\n\n dispatch(getFutureRecordings())\n .then((futureRecordings: NETGEM_RECORDINGS_MAP | null) => {\n // Search for scheduledRecordingId\n const { isScheduledRecordingFuturePresent, scheduledRecordingOutcome } = searchScheduledRecordingInFuture(scheduledRecordingId, futureRecordings);\n\n if (!isScheduledRecordingFuturePresent && scheduledRecordingOutcome !== RecordingOutcome.WillBeRecorded) {\n setTimeout(() => dispatch(checkFutureRecording(recordItem, recordingType, outcomes, checkCount + 1)), SCHEDULED_RECORDING_CHECK_TIMEOUT);\n return;\n }\n\n outcomes.futureOutcome = scheduledRecordingOutcome;\n\n if (recordingType === RecordingKind.Single) {\n // Single recording\n Messenger.emit(finishedOperationEventName);\n Messenger.emit(MessengerEvents.REFRESH_NPVR);\n if (scheduledRecordingOutcome === RecordingOutcome.WillBeRecorded) {\n Messenger.emit(MessengerEvents.NOTIFY_SUCCESS, <div>{Localizer.localize('recording.single.create.success_future')}</div>);\n } else {\n showSingleRecordingError(outcomes, scheduledRecordingId);\n }\n } else {\n // Series recording (no future episodes available right now but scheduled recording has been created)\n outcomes.seriesOutcome = scheduledRecordingOutcome;\n dispatch(checkSeriesRecordingOutcome(recordItem, recordingType, outcomes));\n }\n })\n .catch(() => {\n if (recordingType === RecordingKind.Single) {\n // Single recording\n Messenger.emit(finishedOperationEventName);\n return Promise.resolve();\n }\n\n // Series recording\n return dispatch(checkSeriesRecordingOutcome(recordItem, recordingType, outcomes));\n });\n };\n\nconst checkSeriesRecordingOutcome: (recordItem: RECORD_ITEM_TYPE, recordingType: RecordingKind, outcomes: OUTCOMES_TYPE) => InternalActionDefinitionType =\n (recordItem, recordingType, outcomes) => () => {\n const { finishedOperationEventName } = recordItem;\n const { liveOutcome, scheduledRecordingId, seriesOutcome } = outcomes;\n\n if (!seriesOutcome || (recordingType === RecordingKind.SeriesWithSingle && !liveOutcome)) {\n return;\n }\n\n Messenger.emit(finishedOperationEventName);\n Messenger.emit(MessengerEvents.REFRESH_NPVR);\n\n if (\n seriesOutcome !== RecordingOutcome.WillBeRecorded ||\n (recordingType === RecordingKind.SeriesWithSingle && liveOutcome !== RecordingOutcome.Recorded && liveOutcome !== RecordingOutcome.Rebroadcast)\n ) {\n showSeriesRecordingError(outcomes, scheduledRecordingId);\n } else {\n Messenger.emit(MessengerEvents.NOTIFY_SUCCESS, <div>{Localizer.localize('recording.series.create.success')}</div>);\n }\n };\n\nconst deleteSingle: (recordItem: RECORD_ITEM_TYPE) => InternalActionDefinitionType = (recordItem) => (dispatch: Dispatch, getState: () => CombinedReducers) => {\n const {\n item: { selectedProgramId: programId },\n } = recordItem;\n const {\n npvr: { npvrRecordingsList },\n } = getState();\n const { [programId]: recording } = npvrRecordingsList;\n\n if (recording) {\n // Live or finished recordings: ask confirmation\n const data = {\n button1Title: Localizer.localize('common.actions.cancel'),\n button2Title: Localizer.localize('common.actions.delete'),\n header: Localizer.localize('common.titles.delete_confirmation'),\n icon: ModalIcon.Record,\n question: Localizer.localize('recording.single.delete.confirmation_question'),\n };\n\n Messenger.once(MessengerEvents.MODAL_CONFIRMATION_CLOSED, (result: ConfirmationModalResult) => dispatch(deleteSingleConfirmationClosedCallback(recordItem, result)));\n dispatch(showConfirmationModal(data));\n } else {\n // Future recordings (i.e. scheduled recordings): no confirmation needed\n dispatch(deleteFutureRecordings(recordItem));\n }\n};\n\nconst isMatching: (scheduledEventId: string, scheduledRecordingId: string, npvrScheduledRecordingsList: NETGEM_SCHEDULED_RECORDINGS_MAP) => boolean = (\n scheduledEventId,\n scheduledRecordingId,\n npvrScheduledRecordingsList,\n) => {\n const {\n [scheduledEventId]: { id },\n } = npvrScheduledRecordingsList;\n\n return id === scheduledRecordingId;\n};\n\nconst deleteSingleConfirmationClosedCallback: (recordItem: RECORD_ITEM_TYPE, result: ConfirmationModalResult) => InternalActionDefinitionType =\n (recordItem, result) => (dispatch: Dispatch, getState: () => CombinedReducers) => {\n const { finishedOperationEventName } = recordItem;\n\n if (result !== ConfirmationModalResult.Button2) {\n // Delete cancelled\n Messenger.emit(finishedOperationEventName);\n return;\n }\n\n const {\n item: { selectedProgramId: programId },\n } = recordItem;\n const {\n npvr: { npvrRecordingsList },\n } = getState();\n const { [programId]: recording } = npvrRecordingsList;\n\n // Specific scenario where \"recording\" becomes undefined: start live episode rec, start series rec, stop series rec and quickly delete live rec\n if (recording === undefined) {\n return;\n }\n\n dispatch(\n deleteExistingRecordings(\n recordItem,\n recording.map((r) => r.id),\n ),\n );\n };\n\nconst deleteExistingRecordings: (recordItem: RECORD_ITEM_TYPE, recordingIds: Array<string>, successMessage?: string) => InternalActionDefinitionType =\n (recordItem, recordingIds, successMessage) => (dispatch: Dispatch) => {\n const { finishedOperationEventName } = recordItem;\n const promises = recordingIds.map((id) => dispatch(deleteRecording(id)));\n\n Promise.all(promises)\n .then(() => {\n Messenger.emit(finishedOperationEventName);\n Messenger.emit(MessengerEvents.REFRESH_NPVR);\n Messenger.emit(MessengerEvents.REFRESH_RECORDINGS_SECTION);\n Messenger.emit(MessengerEvents.NOTIFY_SUCCESS, <div>{successMessage || Localizer.localize('recording.single.delete.success')}</div>);\n })\n .catch((error: CustomNetworkError) => {\n const {\n message,\n networkError: { message: networkMsg },\n } = error;\n Messenger.emit(finishedOperationEventName);\n Messenger.emit(\n MessengerEvents.NOTIFY_ERROR,\n <>\n <div>{Localizer.localize('recording.single.delete.error')}</div>\n <div>\n <b>{networkMsg ?? message}</b>\n </div>\n </>,\n );\n });\n };\n\nconst deleteFutureRecordings: (recordItem: RECORD_ITEM_TYPE) => InternalActionDefinitionType = (recordItem) => (dispatch: Dispatch, getState: () => CombinedReducers) => {\n const {\n finishedOperationEventName,\n item: { selectedProgramId: programId },\n } = recordItem;\n const {\n npvr: { npvrRecordingsFuture, npvrScheduledRecordingsList },\n } = getState();\n const { [programId]: futureRecording } = npvrRecordingsFuture;\n\n if (futureRecording) {\n const scheduledRecordings = [];\n futureRecording.forEach((loc) => {\n const { id: scheduledEventId = '', matchingScheduledRecordings } = loc;\n\n if (matchingScheduledRecordings) {\n for (let i = 0; i < matchingScheduledRecordings.length; ++i) {\n const { [i]: sr } = matchingScheduledRecordings;\n const { id: scheduledRecordingId } = sr;\n\n if (isMatching(scheduledEventId, scheduledRecordingId, npvrScheduledRecordingsList)) {\n scheduledRecordings.push(scheduledRecordingId);\n break;\n }\n }\n }\n });\n\n const promises = scheduledRecordings.map((id) => dispatch(deleteScheduledRecording(id, true)));\n\n Promise.all(promises)\n .then(() => {\n Messenger.emit(finishedOperationEventName);\n Messenger.emit(MessengerEvents.REFRESH_NPVR);\n Messenger.emit(MessengerEvents.REFRESH_RECORDINGS_SECTION);\n Messenger.emit(MessengerEvents.NOTIFY_SUCCESS, <div>{Localizer.localize('recording.single.delete.success_future')}</div>);\n })\n .catch((error: CustomNetworkError) => {\n const {\n message,\n networkError: { message: networkMsg },\n } = error;\n Messenger.emit(finishedOperationEventName);\n Messenger.emit(\n MessengerEvents.NOTIFY_ERROR,\n <>\n <div>{Localizer.localize('recording.single.delete.error_future')}</div>\n <div>\n <b>{networkMsg ?? message}</b>\n </div>\n </>,\n );\n });\n }\n};\n\nconst stopSeries: (recordItem: RECORD_ITEM_TYPE) => InternalActionDefinitionType = (recordItem) => (dispatch: Dispatch) => {\n const data = {\n button1Title: Localizer.localize('common.actions.cancel'),\n button2Title: Localizer.localize('common.actions.delete'),\n icon: ModalIcon.Record,\n question: Localizer.localize('recording.series.stop.confirmation_question'),\n };\n\n Messenger.once(MessengerEvents.MODAL_CONFIRMATION_CLOSED, (result: ConfirmationModalResult) => dispatch(stopSeriesConfirmationClosedCallback(recordItem, result)));\n dispatch(showConfirmationModal(data));\n};\n\nconst isLive: (item: NETGEM_API_V8_ITEM_LOCATION) => boolean = (item) => {\n const { scheduledEventDuration, scheduledEventStartDate } = item;\n\n if (!scheduledEventStartDate || !scheduledEventDuration) {\n return false;\n }\n\n const startTime = getIso8601DateInSeconds(scheduledEventStartDate);\n const endTime = startTime + getIso8601DurationInSeconds(scheduledEventDuration);\n\n return getBroadcastStatusFromTimes(startTime, endTime) === BroadcastStatus.Live;\n};\n\nconst searchLiveRecording: (seriesScheduledRecording: NETGEM_API_V8_SCHEDULED_RECORDING, npvrRecordingsList: NETGEM_RECORDINGS_MAP) => ?Array<string> = (\n seriesScheduledRecording,\n npvrRecordingsList,\n) => {\n const { records } = seriesScheduledRecording;\n\n for (const record of records) {\n const { id } = record;\n\n for (const recordingItem of Object.values(npvrRecordingsList)) {\n const typedRecordingItem = ((recordingItem: any): Array<NETGEM_API_V8_ITEM_LOCATION>);\n if (typedRecordingItem.some((item) => item.id === id && isLive(item))) {\n // $FlowFixMe: Ids can't be undefined here but flow couldn't see it\n return typedRecordingItem.map((item) => item.id);\n }\n }\n }\n\n return null;\n};\n\nconst stopSeriesConfirmationClosedCallback: (recordItem: RECORD_ITEM_TYPE, result: ConfirmationModalResult) => InternalActionDefinitionType =\n (recordItem, result) => (dispatch: Dispatch, getState: () => CombinedReducers) => {\n const { finishedOperationEventName } = recordItem;\n\n if (result !== ConfirmationModalResult.Button2) {\n // Stop cancelled\n Messenger.emit(finishedOperationEventName);\n return;\n }\n\n const {\n item: { seriesId },\n } = recordItem;\n const {\n npvr: { npvrRecordingsList, npvrScheduledRecordingsList },\n } = getState();\n\n if (!seriesId) {\n Messenger.emit(finishedOperationEventName);\n return;\n }\n\n const { [seriesId]: seriesScheduledRecording } = npvrScheduledRecordingsList;\n\n if (!seriesScheduledRecording) {\n Messenger.emit(finishedOperationEventName);\n return;\n }\n\n // A recording is actually a list of recordings (although only one can be live, of course) and they all must be deleted\n const liveRecordingIds = searchLiveRecording(seriesScheduledRecording, npvrRecordingsList);\n\n const { id } = seriesScheduledRecording;\n const updateSettings = {\n assetId: id,\n toUtc: null,\n };\n\n dispatch(stopSeriesScheduledRecording(updateSettings))\n .then(() => {\n const successMessage = Localizer.localize('recording.series.stop.success');\n if (liveRecordingIds) {\n // Also delete the live recording associated to this scheduled recording\n dispatch(deleteExistingRecordings(recordItem, liveRecordingIds, successMessage));\n return;\n }\n\n Messenger.emit(finishedOperationEventName);\n Messenger.emit(MessengerEvents.REFRESH_NPVR);\n Messenger.emit(MessengerEvents.REFRESH_RECORDINGS_SECTION);\n Messenger.emit(MessengerEvents.NOTIFY_SUCCESS, <div>{successMessage}</div>);\n })\n .catch((error: CustomNetworkError) => {\n const {\n message,\n networkError: { message: networkMsg },\n } = error;\n Messenger.emit(finishedOperationEventName);\n Messenger.emit(\n MessengerEvents.NOTIFY_ERROR,\n <>\n <div>{Localizer.localize('recording.series.stop.error')}</div>\n <div>\n <b>{networkMsg ?? message}</b>\n </div>\n </>,\n );\n });\n };\n\nconst handleCleanUpOnClick: (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>, data: any) => void = (event, data) => {\n Messenger.emit(MessengerEvents.OPEN_NPVR_MANAGEMENT_SCREEN, data ? ((data: any): string) : undefined);\n};\n\nconst showKeepFromReplayError: (outcomes: OUTCOMES_TYPE) => void = (outcomes) => {\n const { keepFromReplayOutcome } = outcomes;\n const message = Localizer.localize(\n keepFromReplayOutcome === RecordingOutcome.OutOfQuota ? 'recording.single.create.keep_from_replay_out_of_quota' : 'recording.single.create.keep_from_replay_error',\n );\n\n Messenger.emit(\n MessengerEvents.NOTIFY_ERROR,\n <>\n <div>{message}</div>\n <ButtonFX heightKind={HeightKind.Small} onClick={handleCleanUpOnClick} widthKind={WidthKind.Stretched}>\n {Localizer.localize('recording.cleanup')}\n </ButtonFX>\n </>,\n );\n\n Messenger.emit(MessengerEvents.NOTIFY_ERROR, <div>{message}</div>);\n};\n\nconst showSingleRecordingError: (outcomes: OUTCOMES_TYPE, scheduledRecordingId: ?string) => void = (outcomes, scheduledRecordingId) => {\n let message = Localizer.localize('common.messages.errors.retry');\n const futureDefaultMsg = Localizer.localize('recording.single.create.conflicts_future');\n\n const { liveOutcome, futureOutcome } = outcomes;\n const error = liveOutcome || futureOutcome;\n\n if (error === RecordingOutcome.ExceededConcurrency) {\n message = liveOutcome ? Localizer.localize('recording.single.create.exceeded_concurrency_live') : futureDefaultMsg;\n } else if (error === RecordingOutcome.OutOfQuota) {\n message = liveOutcome ? Localizer.localize('recording.single.create.out_of_quota_live') : futureDefaultMsg;\n }\n\n if (futureOutcome) {\n // Future single recording in danger: show a warning and suggest user to do some cleaning\n Messenger.emit(\n MessengerEvents.NOTIFY_WARNING,\n <>\n <div>{message}</div>\n <ButtonFX data={scheduledRecordingId} heightKind={HeightKind.Small} onClick={handleCleanUpOnClick} widthKind={WidthKind.Stretched}>\n {Localizer.localize('recording.cleanup')}\n </ButtonFX>\n </>,\n );\n } else {\n // Live single recording in error: show an error\n Messenger.emit(MessengerEvents.NOTIFY_ERROR, <div>{message}</div>);\n }\n};\n\nconst showSeriesRecordingError: (outcomes: OUTCOMES_TYPE, scheduledRecordingId: ?string) => void = (outcomes, scheduledRecordingId) => {\n const { liveOutcome, seriesOutcome } = outcomes;\n\n let liveErrorKey = 'recording.series.create.server_error_live';\n if (liveOutcome === RecordingOutcome.ExceededConcurrency) {\n liveErrorKey = 'recording.series.create.exceeded_concurrency_live';\n } else if (liveOutcome === RecordingOutcome.OutOfQuota) {\n liveErrorKey = 'recording.series.create.out_of_quota_live';\n }\n\n if (seriesOutcome === undefined || seriesOutcome === null || seriesOutcome === RecordingOutcome.ServerError) {\n // Error\n Messenger.emit(MessengerEvents.NOTIFY_ERROR, <div>{Localizer.localize('common.messages.errors.retry')}</div>);\n return;\n }\n\n if (seriesOutcome === RecordingOutcome.ExceededConcurrency || seriesOutcome === RecordingOutcome.OutOfQuota) {\n // Too many scheduled recordings at the same time or not enough storage space\n Messenger.emit(\n MessengerEvents.NOTIFY_WARNING,\n <>\n <div>{Localizer.localize('recording.series.create.conflicts')}</div>\n <ButtonFX data={scheduledRecordingId} heightKind={HeightKind.Small} onClick={handleCleanUpOnClick} widthKind={WidthKind.Stretched}>\n {Localizer.localize('recording.cleanup')}\n </ButtonFX>\n </>,\n );\n return;\n }\n\n // Series scheduled recording is OK but the live program failed (RecordingOutcome.WillBeRecorded)\n Messenger.emit(\n MessengerEvents.NOTIFY_WARNING,\n <>\n <div>{Localizer.localize('recording.series.create.success')}</div>\n <div>{Localizer.localize(liveErrorKey)}</div>\n </>,\n );\n};\n\nexport { startRecord, stopRecord };\n","/* @flow */\n\nimport type { NETGEM_API_V8_ITEM_LOCATION_TYPE } from './FeedItem';\n\nexport const NETGEM_API_V8_RIGHTS_PLAYBACK: 'playback' = 'playback';\nexport const NETGEM_API_V8_RIGHTS_RECORD: 'record' = 'record';\nexport const NETGEM_API_V8_RIGHTS_VIEWINGHISTORY: 'viewingHistory' = 'viewingHistory';\nexport const NETGEM_API_V8_RIGHTS_WISHLIST: 'wishList' = 'wishList';\n\nexport type NETGEM_API_V8_RIGHTS_KIND = typeof NETGEM_API_V8_RIGHTS_PLAYBACK | typeof NETGEM_API_V8_RIGHTS_RECORD | typeof NETGEM_API_V8_RIGHTS_VIEWINGHISTORY | typeof NETGEM_API_V8_RIGHTS_WISHLIST;\n\nexport type NETGEM_API_V8_RIGHTS_LIST = ?Array<string>;\n\nexport type NETGEM_API_V8_LOCATION_RIGHTS = {|\n [NETGEM_API_V8_RIGHTS_KIND]: NETGEM_API_V8_RIGHTS_LIST,\n|};\n\nexport type NETGEM_API_V8_RIGHTS = {|\n playback: ?{|\n default?: NETGEM_API_V8_RIGHTS_LIST,\n [NETGEM_API_V8_ITEM_LOCATION_TYPE]: NETGEM_API_V8_RIGHTS_LIST,\n |},\n record?: NETGEM_API_V8_RIGHTS_LIST,\n viewingHistory?: NETGEM_API_V8_RIGHTS_LIST,\n wishList?: NETGEM_API_V8_RIGHTS_LIST,\n|};\n","/* @flow */\n\nimport { Messenger, MessengerEvents } from '@ntg/utils/dist/messenger';\nimport { type NETGEM_API_V8_LOCATION_RIGHTS, type NETGEM_API_V8_RIGHTS, type NETGEM_API_V8_RIGHTS_KIND, NETGEM_API_V8_RIGHTS_PLAYBACK } from '../../libs/netgemLibrary/v8/types/Rights';\nimport { PendingOperationReason, storePendingOperation } from './pendingOperations';\nimport type { CARD_DATA_MODAL_TYPE } from '../../components/modal/cardModal/CardModalConstsAndTypes';\nimport type { KeyValuePair } from '@ntg/utils/dist/types';\nimport type { NETGEM_API_V8_ITEM_LOCATION_TYPE } from '../../libs/netgemLibrary/v8/types/FeedItem';\nimport type { NETGEM_API_V8_METADATA_SCHEDULE_LOCATION } from '../../libs/netgemLibrary/v8/types/MetadataSchedule';\nimport { getLocationType } from '../../libs/netgemLibrary/v8/helpers/Item';\n\nconst getRequiredLocationRights: (kind: NETGEM_API_V8_RIGHTS_KIND, rights: ?(NETGEM_API_V8_LOCATION_RIGHTS | NETGEM_API_V8_RIGHTS)) => ?Set<string> = (kind, rights) => {\n if (!rights) {\n // No rights found\n return null;\n }\n\n const { [kind]: kindRights } = rights;\n if (Array.isArray(kindRights)) {\n return new Set(kindRights);\n }\n\n // No rights found\n return null;\n};\n\nconst getRequiredPlaybackRightsForLocationType: (locType: ?NETGEM_API_V8_ITEM_LOCATION_TYPE, rights: ?NETGEM_API_V8_RIGHTS) => ?Set<string> = (locType, rights) => {\n if (!rights) {\n // No rights found\n return null;\n }\n\n const { [NETGEM_API_V8_RIGHTS_PLAYBACK]: playbackRights } = rights;\n if (!playbackRights) {\n // No rights found\n return null;\n }\n\n if (locType) {\n const { [locType]: locationTypeRights } = playbackRights;\n if (locationTypeRights) {\n // Returning rights found for this location type on this channel\n return new Set(locationTypeRights);\n }\n }\n\n const { default: defaultRights } = playbackRights;\n if (defaultRights) {\n // Returning default rights found for this channel\n return new Set(defaultRights);\n }\n\n // No rights found\n return null;\n};\n\nconst getRequiredRights: (\n kind: NETGEM_API_V8_RIGHTS_KIND,\n location: ?NETGEM_API_V8_METADATA_SCHEDULE_LOCATION,\n channelRights: ?NETGEM_API_V8_RIGHTS,\n defaultRights: ?NETGEM_API_V8_RIGHTS\n) => Set<string> = (kind, location, channelRights, defaultRights) => {\n const locType = getLocationType(location?.id);\n\n // 1. Check at location level\n const requiredLocationRights = getRequiredLocationRights(kind, location?.rights);\n if (requiredLocationRights) {\n // Required rights have been found at location level\n return requiredLocationRights;\n }\n\n // 2. Check at channel level\n const requiredChannelRights = kind === NETGEM_API_V8_RIGHTS_PLAYBACK ? getRequiredPlaybackRightsForLocationType(locType, channelRights) : getRequiredLocationRights(kind, channelRights);\n if (requiredChannelRights) {\n // Required rights have been found at channel level\n return requiredChannelRights;\n }\n\n // 3. Check at default level\n const requiredDefaultRights = kind === NETGEM_API_V8_RIGHTS_PLAYBACK ? getRequiredPlaybackRightsForLocationType(locType, defaultRights) : getRequiredLocationRights(kind, defaultRights);\n if (requiredDefaultRights) {\n // Required rights have been found at default level\n return requiredDefaultRights;\n }\n\n // No rights found: returning an empty set to indicate that no rights are required\n return new Set<string>();\n};\n\nconst getIntersectionRights: (rights1: Set<string>, rights2: Set<string>) => Set<string> = (rights1, rights2) => new Set([...rights1].filter((r) => rights2.has(r)));\n\nconst isAccessGranted: (requiredRights: Set<string>, userRights: Array<string> | null) => boolean = (requiredRights, userRights) => {\n if (requiredRights.size === 0) {\n // No required rights\n return true;\n }\n\n // Some rights are required: compare user rights against them\n return getIntersectionRights(requiredRights, new Set(userRights)).size > 0;\n};\n\nconst getMatchingCommercialOffers: (requiredRights: Set<string>, commercialOffers: ?KeyValuePair<Array<string>>) => Array<string> = (requiredRights, commercialOffers) => {\n if (!commercialOffers) {\n return [];\n }\n\n const matchingOffers = new Set<string>();\n requiredRights.forEach((right) => commercialOffers[right]?.forEach((offer) => matchingOffers.add(offer)));\n return [...matchingOffers];\n};\n\nconst showMissingSubscription: (data: CARD_DATA_MODAL_TYPE, requiredRights: Set<string>, commercialOffers: ?KeyValuePair<Array<string>>) => void = (data, requiredRights, commercialOffers) => {\n if (data.pendingOperation) {\n // Always true but Flow does not know it\n data.pendingOperation.reason = PendingOperationReason.RequireSubscription;\n }\n\n storePendingOperation(data);\n\n const matchingOffers = getMatchingCommercialOffers(requiredRights, commercialOffers);\n\n Messenger.emit(MessengerEvents.WATCH_RIGHTS_CHANGE, [...requiredRights]);\n Messenger.emit(MessengerEvents.SHOW_SUBSCRIBE, matchingOffers);\n};\n\nconst areRightsDifferent: (r1: ?Array<string>, r2: ?Array<string>) => boolean = (r1, r2) => {\n if (!r1 && !r2) {\n return false;\n }\n\n if (!r1 || !r2 || r1.length !== r2.length) {\n return true;\n }\n\n const s2 = new Set(r2);\n return r1.some((r) => !s2.has(r));\n};\n\nexport { areRightsDifferent, getMatchingCommercialOffers, getRequiredRights, isAccessGranted, showMissingSubscription };\n","/* @flow */\n\nimport * as React from 'react';\nimport type { BasicFunction, KeyValuePair } from '@ntg/utils/dist/types';\nimport { FEATURE_NPVR, FEATURE_SUBSCRIPTION } from '../../redux/appConf/constants';\nimport { HeightKind, WidthKind } from '../buttons/types';\nimport {\n ItemType,\n type NETGEM_API_V8_FEED_ITEM,\n type NETGEM_API_V8_ITEM_LOCATION,\n type NETGEM_API_V8_ITEM_LOCATION_TYPE,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_CATCHUP,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT,\n} from '../../libs/netgemLibrary/v8/types/FeedItem';\nimport type { NETGEM_API_V8_METADATA_PROGRAM, NETGEM_API_V8_METADATA_SERIES } from '../../libs/netgemLibrary/v8/types/MetadataProgram';\nimport { type NETGEM_RECORDINGS_MAP, type NETGEM_SCHEDULED_RECORDINGS_MAP, ScheduledRecordingsKind, type ScheduledRecordingsKindType } from '../../libs/netgemLibrary/v8/types/Npvr';\nimport { PendingOperationKind, clearPendingOperation, getPendingOperation } from '../../helpers/rights/pendingOperations';\nimport { PictoRecordingStart, PictoRecordingStop } from '@ntg/components/dist/pictos/Element';\nimport { type RECORD_ITEM_TYPE, startRecord, stopRecord } from '../../redux/netgemApi/actions/v8/recorder';\nimport { Theme, type ThemeType } from '@ntg/ui/dist/theme';\nimport { channelHasKeepFromReplay, channelIsRecordable } from '../../helpers/channel/helper';\nimport { logError, showDebug } from '../../helpers/debug/debug';\nimport { BroadcastStatus } from '../../helpers/ui/location/Format';\nimport ButtonFX from '../buttons/ButtonFX';\nimport type { CARD_DATA_MODAL_TYPE } from '../modal/cardModal/CardModalConstsAndTypes';\nimport type { ChannelMap } from '../../libs/netgemLibrary/v8/types/Channel';\nimport type { CombinedReducers } from '../../redux/reducers';\nimport type { Dispatch } from '../../redux/types/types';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport { Messenger } from '@ntg/utils/dist/messenger';\nimport type { NETGEM_API_V8_METADATA_SCHEDULE_LOCATION } from '../../libs/netgemLibrary/v8/types/MetadataSchedule';\nimport type { NETGEM_API_V8_RIGHTS } from '../../libs/netgemLibrary/v8/types/Rights';\nimport type { NETGEM_API_V8_URL_DEFINITION } from '../../libs/netgemLibrary/v8/types/NtgVideoFeed';\nimport { RecordButtonActionKind } from '../../helpers/npvr/Types';\nimport { RegistrationType } from '../../redux/appRegistration/types/types';\nimport { TileConfigTileType } from '../../libs/netgemLibrary/v8/types/WidgetConfig';\nimport { connect } from 'react-redux';\nimport { getEpisodeAndSeriesRecordStatus } from '../../helpers/npvr/recording';\nimport { getItemType } from '../../libs/netgemLibrary/v8/helpers/Item';\nimport { hideModal } from '../../redux/modal/actions';\nimport { isRecordGranted } from '../../helpers/rights/record';\n\nexport enum DisplayMode {\n Button,\n Picto,\n}\n\nexport enum ContextKind {\n Card,\n Player,\n Tile,\n TVEpisode,\n}\n\ntype ReduxRecordButtonReducerStateType = {|\n +channels: ChannelMap,\n +commercialOffers: ?KeyValuePair<Array<string>>,\n +defaultRights: ?NETGEM_API_V8_RIGHTS,\n +isDebugModeEnabled: boolean,\n +isNpvrEnabled: boolean,\n +isRegisteredAsGuest: boolean,\n +isSubscriptionFeatureEnabled: boolean,\n +npvrRecordingsFuture: NETGEM_RECORDINGS_MAP,\n +npvrRecordingsList: NETGEM_RECORDINGS_MAP,\n +npvrScheduledRecordingsList: NETGEM_SCHEDULED_RECORDINGS_MAP,\n +userRights: Array<string> | null,\n|};\n\ntype ReduxRecordButtonDispatchToPropsType = {|\n +localHideModal: BasicFunction,\n +localStartRecord: (recordItem: RECORD_ITEM_TYPE, isDebugModeEnabled: boolean) => void,\n +localStopRecord: (recordItem: RECORD_ITEM_TYPE) => void,\n|};\n\ntype DefaultProps = {|\n +cardDataUrlDefinition?: NETGEM_API_V8_URL_DEFINITION,\n +isDisabled?: boolean,\n +kind?: ScheduledRecordingsKindType,\n +theme?: ThemeType,\n|};\n\n// If not defined, kind will be deduced from the item's metadata\ntype RecordButtonPropType = {|\n ...DefaultProps,\n +broadcastStatus: BroadcastStatus,\n +context: ContextKind,\n +displayMode: DisplayMode,\n +item: NETGEM_API_V8_FEED_ITEM,\n +location: NETGEM_API_V8_METADATA_SCHEDULE_LOCATION | null,\n +previewCatchupScheduledEventId: ?string,\n +programMetadata: NETGEM_API_V8_METADATA_PROGRAM | null,\n +seriesMetadata: NETGEM_API_V8_METADATA_SERIES | null,\n +tileType: TileConfigTileType,\n|};\n\ntype CompleteRecordButtonPropType = {|\n ...RecordButtonPropType,\n ...ReduxRecordButtonReducerStateType,\n ...ReduxRecordButtonDispatchToPropsType,\n|};\n\ntype RecordButtonStateType = {|\n actionType: RecordButtonActionKind,\n hasScheduledRecording: boolean,\n hasSeriesScheduledRecording: boolean,\n isWaitingForDeleteConfirmation: boolean,\n isWaitingForRecordConfirmation: boolean,\n|};\n\nconst InitialState = Object.freeze({\n actionType: RecordButtonActionKind.None,\n hasScheduledRecording: false,\n hasSeriesScheduledRecording: false,\n isWaitingForDeleteConfirmation: false,\n isWaitingForRecordConfirmation: false,\n});\n\nclass RecordButtonView extends React.PureComponent<CompleteRecordButtonPropType, RecordButtonStateType> {\n deleteFinishedEventName: ?string;\n\n recordFinishedEventName: ?string;\n\n static defaultProps: DefaultProps = {\n cardDataUrlDefinition: undefined,\n isDisabled: false,\n kind: undefined,\n theme: Theme.Dark,\n };\n\n constructor(props: CompleteRecordButtonPropType) {\n super(props);\n\n this.deleteFinishedEventName = null;\n this.recordFinishedEventName = null;\n\n this.state = { ...InitialState };\n }\n\n componentDidMount() {\n this.refreshState();\n }\n\n componentDidUpdate(prevProps: CompleteRecordButtonPropType) {\n const {\n item: { selectedProgramId },\n broadcastStatus,\n location,\n npvrRecordingsFuture,\n npvrRecordingsList,\n npvrScheduledRecordingsList,\n previewCatchupScheduledEventId,\n } = this.props;\n const {\n item: { selectedProgramId: prevSelectedProgramId },\n broadcastStatus: prevBroadcastStatus,\n location: prevLocation,\n npvrRecordingsFuture: prevNpvrRecordingsFuture,\n npvrRecordingsList: prevNpvrRecordingsList,\n npvrScheduledRecordingsList: prevNpvrScheduledRecordingsList,\n previewCatchupScheduledEventId: prevPreviewCatchupScheduledEventId,\n } = prevProps;\n\n if (location && location !== prevLocation) {\n this.checkPendingRecording();\n }\n\n if (\n selectedProgramId !== prevSelectedProgramId ||\n broadcastStatus !== prevBroadcastStatus ||\n previewCatchupScheduledEventId !== prevPreviewCatchupScheduledEventId ||\n npvrRecordingsFuture !== prevNpvrRecordingsFuture ||\n npvrRecordingsList !== prevNpvrRecordingsList ||\n npvrScheduledRecordingsList !== prevNpvrScheduledRecordingsList\n ) {\n this.refreshState();\n }\n }\n\n componentWillUnmount() {\n const { deleteFinishedEventName, recordFinishedEventName } = this;\n\n if (deleteFinishedEventName) {\n Messenger.off(deleteFinishedEventName, this.stopWaitingDeleteConfirmation);\n this.deleteFinishedEventName = null;\n }\n\n if (recordFinishedEventName) {\n Messenger.off(recordFinishedEventName, this.stopWaitingRecordConfirmation);\n this.recordFinishedEventName = null;\n }\n }\n\n showDebugInfo = () => {\n const { props, state } = this;\n\n showDebug('Record Button', {\n props,\n propsFields: ['cardDataUrlDefinition', 'broadcastStatus', 'displayMode', 'item', 'kind', 'location', 'previewCatchupScheduledEventId', 'programMetadata', 'seriesMetadata', 'theme', 'tileType'],\n state,\n stateFields: ['actionType', 'hasScheduledRecording', 'hasSeriesScheduledRecording', 'isWaitingForDeleteConfirmation', 'isWaitingForRecordConfirmation'],\n });\n };\n\n isRecordable = (\n kind?: ScheduledRecordingsKindType,\n locType: ?NETGEM_API_V8_ITEM_LOCATION_TYPE,\n selectedLocation: NETGEM_API_V8_ITEM_LOCATION,\n broadcastStatus: BroadcastStatus,\n hasRecording: boolean,\n hasScheduledRecording: boolean,\n hasSeriesScheduledRecording: boolean,\n previewCatchupScheduledEventId: ?string,\n isChannelRecordable: boolean,\n hasChannelKeepFromReplay: boolean,\n ): boolean => {\n if (kind === ScheduledRecordingsKind.KeepFromReplay && hasChannelKeepFromReplay && locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_CATCHUP && broadcastStatus === BroadcastStatus.Past) {\n // Catchup with keep from replay enabled (keep from replay has been checked before)\n return true;\n }\n\n if (!isChannelRecordable) {\n // Channel not recordable\n return false;\n }\n\n if (kind === ScheduledRecordingsKind.Series) {\n // Series\n return true;\n }\n\n if (!selectedLocation || hasRecording || hasScheduledRecording || hasSeriesScheduledRecording) {\n // No location or (scheduled) recording already existing\n return false;\n }\n\n if (\n locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT &&\n (broadcastStatus === BroadcastStatus.Live || broadcastStatus === BroadcastStatus.Future || (broadcastStatus === BroadcastStatus.Preview && previewCatchupScheduledEventId))\n ) {\n // Scheduled event with right broadcast status\n return true;\n }\n\n // All other cases\n return false;\n };\n\n refreshState = () => {\n const {\n broadcastStatus,\n channels,\n isNpvrEnabled,\n item,\n item: {\n locType,\n selectedLocation,\n selectedLocation: { channelId },\n selectedProgramId,\n },\n kind,\n npvrRecordingsFuture,\n npvrRecordingsList,\n npvrScheduledRecordingsList,\n previewCatchupScheduledEventId,\n seriesMetadata,\n } = this.props;\n\n let actionType: RecordButtonActionKind = RecordButtonActionKind.None;\n let hasScheduledRecording = false;\n let hasSeriesScheduledRecording = false;\n\n const isChannelRecordable = isNpvrEnabled && channelIsRecordable(channels, channelId);\n const hasChannelKeepFromReplay = channelHasKeepFromReplay(channels, channelId);\n\n if (isChannelRecordable || hasChannelKeepFromReplay) {\n const status = getEpisodeAndSeriesRecordStatus(\n selectedProgramId,\n seriesMetadata?.id,\n item,\n npvrRecordingsList,\n npvrRecordingsFuture,\n npvrScheduledRecordingsList,\n previewCatchupScheduledEventId,\n );\n const { hasRecording } = status;\n ({ hasScheduledRecording, hasSeriesScheduledRecording } = status);\n\n const isDeletable =\n (kind === ScheduledRecordingsKind.Series && hasSeriesScheduledRecording) ||\n ((locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT || locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING) &&\n (hasRecording || hasScheduledRecording || hasSeriesScheduledRecording));\n\n if (isDeletable && (kind !== ScheduledRecordingsKind.Series || hasSeriesScheduledRecording)) {\n actionType = RecordButtonActionKind.Delete;\n } else if (\n this.isRecordable(\n kind,\n locType,\n selectedLocation,\n broadcastStatus,\n hasRecording,\n hasScheduledRecording,\n hasSeriesScheduledRecording,\n previewCatchupScheduledEventId,\n isChannelRecordable,\n hasChannelKeepFromReplay,\n )\n ) {\n actionType = RecordButtonActionKind.Record;\n }\n }\n\n this.setState(\n {\n actionType,\n hasScheduledRecording,\n hasSeriesScheduledRecording,\n },\n this.checkPendingRecording,\n );\n };\n\n checkPendingRecording = () => {\n const {\n isRegisteredAsGuest,\n item: { id },\n location,\n } = this.props;\n\n const pendingOperation = getPendingOperation();\n\n if (isRegisteredAsGuest || !pendingOperation) {\n // User not logged in or no pending operation\n return;\n }\n\n const {\n cardData: {\n item: { id: targetId },\n pendingOperation: operation,\n recordKind,\n },\n } = pendingOperation;\n if (operation?.operationType !== PendingOperationKind.Record) {\n // Wrong operation type: ignore\n return;\n }\n\n if (!location) {\n // Too early: location is not defined yet\n return;\n }\n\n if (recordKind === ScheduledRecordingsKind.Single && id !== targetId) {\n return;\n }\n\n clearPendingOperation();\n\n // If recordKind is 'Series' or 'undefined' or 'Single' and program Id matches, starts recording\n this.startRecording(true, recordKind);\n };\n\n stopWaitingRecordConfirmation = () => {\n const { recordFinishedEventName } = this;\n\n if (recordFinishedEventName) {\n this.recordFinishedEventName = null;\n }\n\n this.setState({ isWaitingForRecordConfirmation: false });\n };\n\n stopWaitingDeleteConfirmation = () => {\n const { deleteFinishedEventName } = this;\n\n if (deleteFinishedEventName) {\n this.deleteFinishedEventName = null;\n }\n\n this.setState({ isWaitingForDeleteConfirmation: false });\n };\n\n handleStartRecordingButtonOnClick = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => {\n const { isDebugModeEnabled } = this.props;\n const { altKey, ctrlKey } = event;\n\n event.preventDefault();\n event.stopPropagation();\n\n if (isDebugModeEnabled && (ctrlKey || altKey)) {\n this.showDebugInfo();\n return;\n }\n\n this.startRecording(false);\n };\n\n getPendingRecordKind = (): ?ScheduledRecordingsKindType => {\n const {\n item: { id },\n kind,\n } = this.props;\n\n if (kind !== undefined) {\n // Record kind is known (Single, Series, KeepFromReplay)\n return kind;\n }\n\n if (getItemType(id) === ItemType.Program) {\n // Single record button on card\n return ScheduledRecordingsKind.Single;\n }\n\n // Record button on series tile: user will be asked later\n return undefined;\n };\n\n startRecording = (isPendingOperation?: boolean, pendingRecordKind: ?ScheduledRecordingsKindType): void => {\n const {\n broadcastStatus,\n cardDataUrlDefinition,\n channels,\n commercialOffers,\n defaultRights,\n isDebugModeEnabled,\n isRegisteredAsGuest,\n isSubscriptionFeatureEnabled,\n item,\n item: {\n locType,\n selectedLocation: { id },\n },\n kind,\n localHideModal,\n localStartRecord,\n location,\n previewCatchupScheduledEventId,\n programMetadata,\n seriesMetadata,\n tileType,\n userRights,\n } = this.props;\n\n if (!programMetadata || !location) {\n return;\n }\n\n const recordKind = isPendingOperation && pendingRecordKind === undefined ? undefined : this.getPendingRecordKind();\n\n const cardData: CARD_DATA_MODAL_TYPE = {\n item,\n programMetadata,\n recordKind,\n seriesMetadata,\n tileType,\n urlDefinition: cardDataUrlDefinition,\n };\n\n if (!isRecordGranted(isRegisteredAsGuest, isSubscriptionFeatureEnabled, cardData, location, channels, commercialOffers, defaultRights, userRights)) {\n // Record denied: log-in or subscribe page has been requested\n localHideModal();\n return;\n }\n\n this.recordFinishedEventName = `RECORD_FINISHED_TILE_${id ?? 'no-location-id'}`;\n const { recordFinishedEventName: finishedOperationEventName } = this;\n Messenger.once(this.recordFinishedEventName, this.stopWaitingRecordConfirmation);\n\n // Keep from replay case\n const catchupId = locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_CATCHUP ? id : undefined;\n\n this.setState({ isWaitingForRecordConfirmation: true }, () =>\n localStartRecord(\n {\n broadcastStatus,\n catchupId,\n finishedOperationEventName,\n item,\n kind: isPendingOperation ? pendingRecordKind : kind,\n previewCatchupScheduledEventId,\n programMetadata,\n seriesMetadata,\n },\n isDebugModeEnabled,\n ),\n );\n };\n\n handleStopRecordingButtonOnClick = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>): void => {\n const {\n broadcastStatus,\n isDebugModeEnabled,\n item,\n item: {\n selectedLocation: { id },\n },\n kind,\n localStopRecord,\n previewCatchupScheduledEventId,\n programMetadata,\n seriesMetadata,\n } = this.props;\n const { hasSeriesScheduledRecording } = this.state;\n const { altKey, ctrlKey } = event;\n\n event.preventDefault();\n event.stopPropagation();\n\n if (isDebugModeEnabled && (ctrlKey || altKey)) {\n this.showDebugInfo();\n return;\n }\n\n if (!programMetadata) {\n return;\n }\n\n this.deleteFinishedEventName = `DELETE_FINISHED_TILE_${id ?? 'no-location-id'}`;\n const { deleteFinishedEventName: finishedOperationEventName } = this;\n Messenger.once(this.deleteFinishedEventName, this.stopWaitingDeleteConfirmation);\n\n const localKind = kind === undefined && broadcastStatus === BroadcastStatus.Live && hasSeriesScheduledRecording ? ScheduledRecordingsKind.Series : kind;\n\n this.setState({ isWaitingForDeleteConfirmation: true }, () =>\n localStopRecord({\n broadcastStatus,\n finishedOperationEventName,\n item,\n kind: localKind,\n previewCatchupScheduledEventId,\n programMetadata,\n seriesMetadata,\n }),\n );\n };\n\n renderStartRecordButton = (): React.Node => {\n const { context, isDisabled, kind, theme = Theme.Dark } = this.props;\n const { isWaitingForRecordConfirmation } = this.state;\n\n const recordKey = kind === ScheduledRecordingsKind.Series ? 'common.actions.record_series' : 'common.actions.record';\n\n return (\n <ButtonFX\n heightKind={context === ContextKind.Card ? HeightKind.Large : HeightKind.Small}\n isDisabled={isDisabled}\n isLoading={isWaitingForRecordConfirmation}\n key='startRecording'\n onClick={this.handleStartRecordingButtonOnClick}\n theme={theme}\n widthKind={WidthKind.Stretched}\n >\n {Localizer.localize(recordKey)}\n </ButtonFX>\n );\n };\n\n renderStopRecordButton = (): React.Node => {\n const {\n context,\n isDisabled,\n item: { locType },\n kind,\n theme = Theme.Dark,\n } = this.props;\n const { isWaitingForDeleteConfirmation } = this.state;\n\n let deleteKey = 'common.actions.delete_recording';\n if (locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_CATCHUP) {\n deleteKey = 'tv.actions.delete_keep_from_replay';\n } else if (kind === ScheduledRecordingsKind.Series) {\n deleteKey = 'common.actions.delete_series_recording';\n }\n\n return (\n <ButtonFX\n heightKind={context === ContextKind.Card ? HeightKind.Large : HeightKind.Small}\n isDisabled={isDisabled}\n isLoading={isWaitingForDeleteConfirmation}\n key='stopRecording'\n onClick={this.handleStopRecordingButtonOnClick}\n theme={theme}\n widthKind={WidthKind.Stretched}\n >\n {Localizer.localize(deleteKey)}\n </ButtonFX>\n );\n };\n\n renderButton = (): React.Node => {\n const { actionType } = this.state;\n\n return actionType === RecordButtonActionKind.Record ? this.renderStartRecordButton() : this.renderStopRecordButton();\n };\n\n renderStartRecordPicto = (): React.Node => {\n const { isDisabled } = this.props;\n const { isWaitingForRecordConfirmation } = this.state;\n\n return <PictoRecordingStart className='recording' isDisabled={isDisabled || isWaitingForRecordConfirmation} key='startRecording' onClick={this.handleStartRecordingButtonOnClick} />;\n };\n\n renderStopRecordPicto = (): React.Node => {\n const {\n isDisabled,\n item: { locType },\n kind,\n } = this.props;\n const { hasSeriesScheduledRecording, hasScheduledRecording, isWaitingForDeleteConfirmation } = this.state;\n\n const isDisabledAggregated =\n isDisabled ||\n isWaitingForDeleteConfirmation ||\n (locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT && kind === ScheduledRecordingsKind.Single && hasSeriesScheduledRecording && !hasScheduledRecording);\n\n return <PictoRecordingStop className='recording' isDisabled={isDisabledAggregated} key='stopRecording' onClick={this.handleStopRecordingButtonOnClick} />;\n };\n\n renderPicto = (): React.Node => {\n const { actionType } = this.state;\n\n if (actionType === RecordButtonActionKind.None) {\n logError(`actionType: ${(RecordButtonActionKind.None: string)}`);\n }\n\n return actionType === RecordButtonActionKind.Record ? this.renderStartRecordPicto() : this.renderStopRecordPicto();\n };\n\n render(): React.Node {\n const { displayMode } = this.props;\n const { actionType } = this.state;\n\n if (actionType === RecordButtonActionKind.None) {\n return null;\n }\n\n return displayMode === DisplayMode.Button ? this.renderButton() : this.renderPicto();\n }\n}\n\nconst mapStateToProps = (state: CombinedReducers): ReduxRecordButtonReducerStateType => {\n return {\n channels: state.appConfiguration.deviceChannels,\n commercialOffers: state.appConfiguration.rightsCommercialOffers,\n defaultRights: state.appConfiguration.rightsDefault,\n isDebugModeEnabled: state.appConfiguration.isDebugModeEnabled,\n isNpvrEnabled: state.appConfiguration.features[FEATURE_NPVR] && state.npvr.isEnabled,\n isRegisteredAsGuest: state.appRegistration.registration === RegistrationType.RegisteredAsGuest,\n isSubscriptionFeatureEnabled: state.appConfiguration.features[FEATURE_SUBSCRIPTION],\n npvrRecordingsFuture: state.npvr.npvrRecordingsFuture,\n npvrRecordingsList: state.npvr.npvrRecordingsList,\n npvrScheduledRecordingsList: state.npvr.npvrScheduledRecordingsList,\n userRights: state.appConfiguration.rightsUser,\n };\n};\n\nconst mapDispatchToProps = (dispatch: Dispatch): ReduxRecordButtonDispatchToPropsType => {\n return {\n localHideModal: () => dispatch(hideModal()),\n localStartRecord: (recordItem: RECORD_ITEM_TYPE, isDebugModeEnabled: boolean) => dispatch(startRecord(recordItem, isDebugModeEnabled)),\n localStopRecord: (recordItem: RECORD_ITEM_TYPE) => dispatch(stopRecord(recordItem)),\n };\n};\n\nconst RecordButton: React.ComponentType<RecordButtonPropType> = connect(mapStateToProps, mapDispatchToProps, null, { forwardRef: true })(RecordButtonView);\n\nexport default RecordButton;\n","/* @flow */\n\nimport { Messenger, MessengerEvents } from '@ntg/utils/dist/messenger';\nimport { type NETGEM_API_V8_RIGHTS, NETGEM_API_V8_RIGHTS_RECORD } from '../../libs/netgemLibrary/v8/types/Rights';\nimport { PendingOperationKind, PendingOperationReason, storePendingOperation } from './pendingOperations';\nimport { getRequiredRights, isAccessGranted, showMissingSubscription } from './rights';\nimport type { CARD_DATA_MODAL_TYPE } from '../../components/modal/cardModal/CardModalConstsAndTypes';\nimport type { ChannelMap } from '../../libs/netgemLibrary/v8/types/Channel';\nimport type { KeyValuePair } from '@ntg/utils/dist/types';\nimport type { NETGEM_API_V8_METADATA_SCHEDULE_LOCATION } from '../../libs/netgemLibrary/v8/types/MetadataSchedule';\nimport { getChannelRights } from '../channel/helper';\n\nconst isRecordGranted: (\n isRegisteredAsGuest: boolean,\n isSubscriptionFeatureEnabled: boolean,\n cardData: CARD_DATA_MODAL_TYPE,\n location: NETGEM_API_V8_METADATA_SCHEDULE_LOCATION,\n channels: ChannelMap,\n commercialOffers: ?KeyValuePair<Array<string>>,\n defaultRights: ?NETGEM_API_V8_RIGHTS,\n userRights: Array<string> | null,\n) => boolean = (isRegisteredAsGuest, isSubscriptionFeatureEnabled, cardData, location, channels, commercialOffers, defaultRights, userRights) => {\n const { channelId } = location;\n\n const data = {\n ...cardData,\n pendingOperation: {\n operationType: PendingOperationKind.Record,\n reason: PendingOperationReason.RequireSubscription,\n },\n };\n\n if (isRegisteredAsGuest) {\n // Guest mode: let's open the sign-in page\n storePendingOperation(data);\n Messenger.emit(MessengerEvents.SHOW_SIGN_IN, PendingOperationKind.OpenCard);\n return false;\n }\n\n if (!isSubscriptionFeatureEnabled) {\n // Subscription feature not enabled: no restriction\n return true;\n }\n\n const channelRights = getChannelRights(channels, channelId);\n const requiredRights = getRequiredRights(NETGEM_API_V8_RIGHTS_RECORD, location, channelRights, defaultRights);\n if (isAccessGranted(requiredRights, userRights)) {\n // User has required rights\n return true;\n }\n\n // User rights do not meet required rights: open subscribe page and highlight matching commercial offer\n showMissingSubscription(data, requiredRights, commercialOffers);\n return false;\n};\n\nexport { isRecordGranted };\n","/* @flow */\n\nimport { Messenger, MessengerEvents } from '@ntg/utils/dist/messenger';\nimport { type NETGEM_API_V8_RIGHTS, NETGEM_API_V8_RIGHTS_WISHLIST } from '../../libs/netgemLibrary/v8/types/Rights';\nimport { type PENDING_OPERATION_DATA_TYPE, PendingOperationKind, PendingOperationReason, storePendingOperation } from './pendingOperations';\nimport { getRequiredRights, isAccessGranted, showMissingSubscription } from './rights';\nimport type { CARD_DATA_MODAL_TYPE } from '../../components/modal/cardModal/CardModalConstsAndTypes';\nimport type { ChannelMap } from '../../libs/netgemLibrary/v8/types/Channel';\nimport type { KeyValuePair } from '@ntg/utils/dist/types';\nimport { type NETGEM_API_V8_METADATA_SCHEDULE_LOCATION } from '../../libs/netgemLibrary/v8/types/MetadataSchedule';\nimport { getChannelRights } from '../channel/helper';\nimport { logError } from '../debug/debug';\n\nconst isWishlistGrantedInternal: (\n isRegisteredAsGuest: boolean,\n isSubscriptionFeatureEnabled: boolean,\n cardData: CARD_DATA_MODAL_TYPE,\n location: ?NETGEM_API_V8_METADATA_SCHEDULE_LOCATION,\n channels: ChannelMap,\n commercialOffers: ?KeyValuePair<Array<string>>,\n defaultRights: ?NETGEM_API_V8_RIGHTS,\n userRights: Array<string> | null,\n pendingOperation: PENDING_OPERATION_DATA_TYPE\n) => boolean = (isRegisteredAsGuest, isSubscriptionFeatureEnabled, cardData, location, channels, commercialOffers, defaultRights, userRights, pendingOperation) => {\n const { item, seriesMetadata, tileType } = cardData;\n\n if (!location && !seriesMetadata?.id) {\n // Location is null and item is not a series\n logError('Wishlist error: no location');\n return false;\n }\n\n const data = {\n ...cardData,\n item,\n pendingOperation,\n tileType,\n };\n\n if (isRegisteredAsGuest) {\n // Guest mode: let's open the sign-in page\n storePendingOperation(data);\n Messenger.emit(MessengerEvents.SHOW_SIGN_IN, PendingOperationKind.AddToWishlist);\n return false;\n }\n\n if (!isSubscriptionFeatureEnabled) {\n // Subscription feature not enabled: no restriction\n return true;\n }\n\n const channelRights = getChannelRights(channels, location?.channelId);\n const requiredRights = getRequiredRights(NETGEM_API_V8_RIGHTS_WISHLIST, location, channelRights, defaultRights);\n if (isAccessGranted(requiredRights, userRights)) {\n // User has required rights\n return true;\n }\n\n // User rights do not meet required rights: open subscribe page and highlight matching commercial offer\n showMissingSubscription(data, requiredRights, commercialOffers);\n return false;\n};\n\nconst isWishlistGranted: (\n isRegisteredAsGuest: boolean,\n isSubscriptionFeatureEnabled: boolean,\n cardData: CARD_DATA_MODAL_TYPE,\n location: ?NETGEM_API_V8_METADATA_SCHEDULE_LOCATION,\n channels: ChannelMap,\n commercialOffers: ?KeyValuePair<Array<string>>,\n defaultRights: ?NETGEM_API_V8_RIGHTS,\n userRights: Array<string> | null\n) => boolean = (isRegisteredAsGuest, isSubscriptionFeatureEnabled, cardData, location, channels, commercialOffers, defaultRights, userRights) => {\n const { seriesMetadata } = cardData;\n const {\n item,\n item: {\n selectedLocation: { channelId },\n },\n } = cardData;\n const assetId = seriesMetadata?.id ?? item.selectedProgramId;\n\n if (!channelId) {\n // Channel Id is null\n logError('Wishlist error: no channel Id');\n return false;\n }\n\n const pendingOperation = {\n addToWishlistData: {\n assetId,\n channelId,\n },\n operationType: PendingOperationKind.AddToWishlist,\n reason: PendingOperationReason.RequireAccount,\n };\n\n return isWishlistGrantedInternal(isRegisteredAsGuest, isSubscriptionFeatureEnabled, cardData, location, channels, commercialOffers, defaultRights, userRights, pendingOperation);\n};\n\nconst isFavoriteGranted: (\n isRegisteredAsGuest: boolean,\n isSubscriptionFeatureEnabled: boolean,\n cardData: CARD_DATA_MODAL_TYPE,\n titId: string,\n location: ?NETGEM_API_V8_METADATA_SCHEDULE_LOCATION,\n channels: ChannelMap,\n commercialOffers: ?KeyValuePair<Array<string>>,\n defaultRights: ?NETGEM_API_V8_RIGHTS,\n userRights: Array<string> | null\n) => boolean = (isRegisteredAsGuest, isSubscriptionFeatureEnabled, cardData, titId, location, channels, commercialOffers, defaultRights, userRights) => {\n const pendingOperation = {\n addToFavoriteData: { titId },\n operationType: PendingOperationKind.AddToFavorite,\n reason: PendingOperationReason.RequireAccount,\n };\n\n return isWishlistGrantedInternal(isRegisteredAsGuest, isSubscriptionFeatureEnabled, cardData, location, channels, commercialOffers, defaultRights, userRights, pendingOperation);\n};\n\nexport { isFavoriteGranted, isWishlistGranted };\n","// extracted by mini-css-extract-plugin\nexport default {\"wrapper\":\"TextScroller_wrapper__1rL1X\",\"elementMeasure\":\"TextScroller_elementMeasure__x2OW3\"};","/* @flow */\n\nimport * as React from 'react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport styles from './TextScroller.module.scss';\n\n// Delay between mouse hovering the text and start of scrolling (in ms)\nconst START_DELAY = 500;\n\n// When trying to scroll on mount, retry every 50 ms while DOM elements get ready\nconst SCROLL_ON_MOUNT_DELAY = 50;\n\n// Interval between 2 scroll steps (in ms)\nconst SCROLL_INTERVAL = 20;\n\nexport type TextScrollerStyle = {| [string]: string |};\n\nconst getRecursiveChildText = (node: React.Node): string => {\n if (node === null) {\n return '';\n }\n\n if (Array.isArray(node)) {\n const joinedNodes = [];\n node.forEach((n: React.Node) => {\n if (typeof n === 'object') {\n joinedNodes.push(getRecursiveChildText(n));\n } else if (typeof n === 'string') {\n joinedNodes.push(n);\n }\n });\n return joinedNodes.join('');\n }\n\n const {\n // $FlowFixMe: after updating to flow 0.219.4, \"props\" seems to be missing in React.Element\n props: { children },\n } = node;\n\n if (typeof children === 'object') {\n return getRecursiveChildText(children);\n }\n\n if (typeof children === 'string') {\n return children;\n }\n\n return '';\n};\n\nconst measureTextWidth = (availableWidth: number, style: TextScrollerStyle, text: string = '') => {\n if (text === '') {\n return { displayedTextWidth: 0, realTextWidth: 0 };\n }\n\n const div = document.createElement('DIV');\n div.innerHTML = text;\n Object.entries(style).forEach(([key, value]) => {\n // $FlowFixMe: Flow is strangely expecting key to be an index (number)\n div.style[key] = value;\n });\n div.classList.add(styles.elementMeasure);\n\n document.body?.appendChild(div);\n const { width: displayedTextWidth } = div.getBoundingClientRect();\n const realTextWidth = div.offsetWidth;\n document.body?.removeChild(div);\n\n // Displayed width takes into account any \"transform: scale(...)\"\n return { displayedTextWidth, realTextWidth };\n};\n\ntype PropType = {|\n +children: React.Node,\n +scrollOnMount?: boolean, // eslint-disable-line react/require-default-props\n +style: TextScrollerStyle,\n|};\n\nconst TextScroller = ({ children, scrollOnMount, style }: PropType): React.Node => {\n const [leftPct, setLeftPct] = useState(0);\n const elementRef = useRef<HTMLElement | null>(null);\n const [isTruncated, setIsTruncated] = useState<boolean>(false);\n const [scrollStop, setScrollStop] = useState<number>(0);\n const mountDelayTimerId = useRef<TimeoutID | null>(null);\n const hoverTimerId = useRef<TimeoutID | null>(null);\n const scrollingIntervalId = useRef<IntervalID | null>(null);\n\n // eslint-disable-next-line arrow-body-style\n useEffect(() => {\n return () => {\n if (mountDelayTimerId.current !== null) {\n clearTimeout(mountDelayTimerId.current);\n }\n if (hoverTimerId.current !== null) {\n clearTimeout(hoverTimerId.current);\n }\n if (scrollingIntervalId.current !== null) {\n clearInterval(scrollingIntervalId.current);\n }\n };\n }, []);\n\n const getWidths = useCallback(() => {\n if (elementRef.current) {\n const { width } = elementRef.current.getBoundingClientRect();\n const text = getRecursiveChildText(children);\n const { displayedTextWidth, realTextWidth } = measureTextWidth(width, style, text);\n\n return { displayedTextWidth, realTextWidth, width };\n }\n\n return null;\n }, [children, style]);\n\n const translate = useCallback(() => {\n setLeftPct((currentLeftPct) => currentLeftPct - 1);\n }, []);\n\n const stopScrolling = useCallback(() => {\n if (hoverTimerId.current !== null) {\n clearTimeout(hoverTimerId.current);\n hoverTimerId.current = null;\n }\n\n if (scrollingIntervalId.current !== null) {\n clearInterval(scrollingIntervalId.current);\n scrollingIntervalId.current = null;\n }\n\n setLeftPct(0);\n }, []);\n\n const startScrolling: () => void = useCallback(() => {\n const widths = getWidths();\n\n if (widths === null) {\n if (mountDelayTimerId.current === null) {\n mountDelayTimerId.current = setTimeout(startScrolling, SCROLL_ON_MOUNT_DELAY);\n }\n return;\n }\n\n mountDelayTimerId.current = null;\n\n const { displayedTextWidth, realTextWidth, width } = widths;\n const truncated = displayedTextWidth > width;\n setIsTruncated(truncated);\n setScrollStop(-realTextWidth);\n\n if (!truncated) {\n // Not truncated: don't start scrolling\n return;\n }\n\n if (scrollingIntervalId.current === null) {\n scrollingIntervalId.current = setInterval(translate, SCROLL_INTERVAL);\n }\n }, [getWidths]);\n\n useEffect(() => {\n if (scrollStop === 0) {\n // Not ready yet\n return;\n }\n\n if (!isTruncated) {\n return;\n }\n\n if (leftPct <= scrollStop) {\n // Animation finished\n stopScrolling();\n }\n }, [isTruncated, leftPct, scrollStop, stopScrolling]);\n\n useEffect(() => {\n if (scrollOnMount && hoverTimerId.current === null) {\n // Start animation on mount\n hoverTimerId.current = setTimeout(startScrolling, START_DELAY);\n }\n }, [scrollOnMount]);\n\n const handleOnMouseEnter = useCallback(() => {\n if (hoverTimerId.current === null) {\n hoverTimerId.current = setTimeout(startScrolling, START_DELAY);\n }\n }, [startScrolling]);\n\n const handleOnMouseLeave = useCallback(() => {\n stopScrolling();\n }, [stopScrolling]);\n\n return (\n <div className={styles.wrapper} onMouseEnter={handleOnMouseEnter} onMouseLeave={handleOnMouseLeave} ref={elementRef}>\n {isTruncated ? <div style={{ transform: `translateX(${leftPct}px)` }}>{children}</div> : children}\n </div>\n );\n};\n\nexport default TextScroller;\n","/* @flow */\n\nimport type { NetgemApiEmitterType, RequestResponseMethodDefinitionType } from '../emitter';\nimport { BO_API_ADD_FAVORITE } from './types/common';\nimport type { CombinedReducers } from '../../../reducers';\nimport type { Dispatch } from '../../../types/types';\nimport { REDUX_MSG_REQUEST_BO_FAVORITE_ADD } from '../../constants';\nimport { createCustomNetworkErrorFromKey } from '../../../../libs/netgemLibrary/helpers/CreateCustomNetworkError';\nimport getFavoriteList from './favoriteList';\nimport getRequestDetails from './helpers/requestCommon';\n\nconst addToFavoriteList: (titId: string, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (titId, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const {\n appConfiguration: { mainDistributorId },\n } = getState();\n\n if (!mainDistributorId) {\n return Promise.reject(\n createCustomNetworkErrorFromKey('common.messages.errors.missing_parameters_list', {\n list: 'mainDistributorId',\n name: 'Add to favorite list',\n }),\n );\n }\n\n // BO API v2\n return dispatch(getRequestDetails(mainDistributorId, BO_API_ADD_FAVORITE))\n .then((requestDetails) =>\n // Object 'requestDetails' contains 'headers', 'method' and 'uri' parameters\n NetgemApiEmitter.emit(REDUX_MSG_REQUEST_BO_FAVORITE_ADD, {\n ...requestDetails,\n signal,\n titId,\n }),\n )\n .then(() => dispatch(getFavoriteList(signal)));\n };\n\nexport default addToFavoriteList;\n","/* @flow */\n\nimport AccurateTimestamp from '../../dateTime/AccurateTimestamp';\nimport type { NETGEM_API_V8_FEED_ITEM } from '../../../libs/netgemLibrary/v8/types/FeedItem';\nimport { getIntegerPercentage } from '../../maths/maths';\n\nconst getItemLiveProgress = (item: NETGEM_API_V8_FEED_ITEM): number => {\n const { endTime, startTime } = item;\n\n return getIntegerPercentage(AccurateTimestamp.nowInSeconds(), startTime, endTime);\n};\n\nexport { getItemLiveProgress };\n","/* @flow */\n\nimport { Messenger, MessengerEvents } from '@ntg/utils/dist/messenger';\nimport { type NETGEM_API_V8_RIGHTS, NETGEM_API_V8_RIGHTS_PLAYBACK } from '../../libs/netgemLibrary/v8/types/Rights';\nimport { PendingOperationKind, PendingOperationReason, storePendingOperation } from './pendingOperations';\nimport { getRequiredRights, isAccessGranted, showMissingSubscription } from './rights';\nimport type { CARD_DATA_MODAL_TYPE } from '../../components/modal/cardModal/CardModalConstsAndTypes';\nimport type { ChannelMap } from '../../libs/netgemLibrary/v8/types/Channel';\nimport { ItemContent } from '../../libs/netgemLibrary/v8/types/FeedItem';\nimport type { KeyValuePair } from '@ntg/utils/dist/types';\nimport type { NETGEM_API_V8_AUTHENT_REALM } from '../../libs/netgemLibrary/v8/types/Realm';\nimport type { NETGEM_API_V8_METADATA_SCHEDULE_LOCATION } from '../../libs/netgemLibrary/v8/types/MetadataSchedule';\nimport { getChannelRights } from '../channel/helper';\nimport { logError } from '../debug/debug';\n\nconst isChannelPlaybackGranted: (isSubscriptionFeatureEnabled: boolean, channelRights: ?NETGEM_API_V8_RIGHTS, defaultRights: ?NETGEM_API_V8_RIGHTS, userRights: Array<string> | null) => boolean = (\n isSubscriptionFeatureEnabled,\n channelRights,\n defaultRights,\n userRights,\n) => {\n if (!isSubscriptionFeatureEnabled) {\n // Subscription feature not enabled: no restriction\n return true;\n }\n\n const requiredRights = getRequiredRights(NETGEM_API_V8_RIGHTS_PLAYBACK, null, channelRights, defaultRights);\n return isAccessGranted(requiredRights, userRights);\n};\n\nconst isPlaybackGranted: (\n isRegisteredAsGuest: boolean,\n isSubscriptionFeatureEnabled: boolean,\n cardData: CARD_DATA_MODAL_TYPE,\n authority?: NETGEM_API_V8_AUTHENT_REALM,\n contentType: ItemContent,\n location: ?NETGEM_API_V8_METADATA_SCHEDULE_LOCATION,\n channels: ChannelMap,\n commercialOffers: ?KeyValuePair<Array<string>>,\n defaultRights: ?NETGEM_API_V8_RIGHTS,\n userRights: Array<string> | null,\n) => boolean = (isRegisteredAsGuest, isSubscriptionFeatureEnabled, cardData, authority, contentType, location, channels, commercialOffers, defaultRights, userRights) => {\n const data = {\n ...cardData,\n pendingOperation: {\n authority,\n contentType,\n operationType: PendingOperationKind.Play,\n reason: PendingOperationReason.RequireAccount,\n },\n };\n\n if (!location) {\n // Location is null\n logError('Playback error: no location');\n return false;\n }\n\n if (isRegisteredAsGuest) {\n // Guest mode: let's open the sign-in page\n storePendingOperation(data);\n Messenger.emit(MessengerEvents.SHOW_SIGN_IN, PendingOperationKind.Play);\n return false;\n }\n\n if (!isSubscriptionFeatureEnabled) {\n // Subscription feature not enabled: no restriction\n return true;\n }\n\n const { channelId } = location;\n const channelRights = getChannelRights(channels, channelId);\n const requiredRights = getRequiredRights(NETGEM_API_V8_RIGHTS_PLAYBACK, location, channelRights, defaultRights);\n if (isAccessGranted(requiredRights, userRights)) {\n // User has required rights\n return true;\n }\n\n // User rights do not meet required rights: open subscribe page and highlight matching commercial offer\n showMissingSubscription(data, requiredRights, commercialOffers);\n return false;\n};\n\nexport { isChannelPlaybackGranted, isPlaybackGranted };\n","/* @flow */\n\nimport './ItemOverlay.scss';\nimport * as React from 'react';\nimport {\n type ActionsType,\n type CompleteItemOverlayPropType,\n type ItemOverlayPropType,\n type ItemOverlayStateType,\n type ReduxItemOverlayDispatchToPropsType,\n type ReduxItemOverlayReducerStateType,\n TruncateState,\n} from './ItemOverlayConstsAndTypes';\nimport { type BASE_VOD_PURCHASE_DATA_TYPE, PendingOperationKind, PendingOperationReason, type VOD_PURCHASE_DATA_TYPE, storePendingOperation } from '../../../helpers/rights/pendingOperations';\nimport { BOVodAssetStatus, getTitIdFromProviderInfo, getVodLocationFromVtiId, hasProgramTrailer, hasSeriesTrailer } from '../../../helpers/videofutur/metadata';\nimport { HeightKind, WidthKind } from '../../buttons/types';\nimport {\n ItemContent,\n ItemType,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_CATCHUP,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_EST,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_TVOD,\n} from '../../../libs/netgemLibrary/v8/types/FeedItem';\nimport { Messenger, MessengerEvents } from '@ntg/utils/dist/messenger';\nimport { PictoHeartEmpty, PictoHeartFull, PictoReplay, PictoTrailer } from '@ntg/components/dist/pictos/Element';\nimport PricingVod, { ContextKind as PricingContext } from '../../pricingVod/PricingVod';\nimport RecordButton, { DisplayMode, ContextKind as RecordContext } from '../../recordButton/RecordButton';\nimport ResizeDetectorWrapper, { type ResizeType } from '../../resizeDetectorWrapper/ResizeDetectorWrapper';\nimport { TILE_SYNOPSIS_LINE_HEIGHT, TILE_SYNOPSIS_TAGLINE_LINE_HEIGHT } from '../../../helpers/ui/constants';\nimport { TileConfig, TileConfigTileType, TileOnFocus } from '../../../libs/netgemLibrary/v8/types/WidgetConfig';\nimport { addToWishlist, removeFromWishlist } from '../../../redux/netgemApi/actions/personalData/wishlist';\nimport { getSynopsis, getTagline, renderProgramDetails } from '../../../helpers/ui/metadata/Format';\nimport { getTimeText, getWatchingStatus, renderProgramTitle, renderSeriesTitle } from './helper';\nimport { hideModal, showVodPurchaseModal } from '../../../redux/modal/actions';\nimport { isFavoriteGranted, isWishlistGranted } from '../../../helpers/rights/wishlist';\nimport { BroadcastStatus } from '../../../helpers/ui/location/Format';\nimport ButtonFX from '../../buttons/ButtonFX';\nimport type { CARD_DATA_MODAL_TYPE } from '../../modal/cardModal/CardModalConstsAndTypes';\nimport type { CombinedReducers } from '../../../redux/reducers';\nimport type { Dispatch } from '../../../redux/types/types';\nimport { ExtendedItemType } from '../../../helpers/ui/item/types';\nimport { FEATURE_SUBSCRIPTION } from '../../../redux/appConf/constants';\nimport InfiniteCircleLoader from '../../loader/infiniteCircleLoader';\nimport { LoadableStatus } from '../../../helpers/loadable/loadable';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport { NETGEM_API_V8_AUTHENT_REALM_VIDEOFUTUR } from '../../../libs/netgemLibrary/v8/types/Realm';\nimport type { NETGEM_API_V8_METADATA } from '../../../libs/netgemLibrary/v8/types/MetadataProgram';\nimport type { NETGEM_API_V8_URL_DEFINITION } from '../../../libs/netgemLibrary/v8/types/NtgVideoFeed';\nimport { PROGRAM_INFO } from '../../../helpers/ui/metadata/Types';\nimport { RegistrationType } from '../../../redux/appRegistration/types/types';\nimport { ScheduledRecordingsKind } from '../../../libs/netgemLibrary/v8/types/Npvr';\nimport TextScroller from '../../textScroller/TextScroller';\nimport { type Undefined } from '@ntg/utils/dist/types';\nimport WishlistCache from '../../../helpers/wishlist/WishlistCache';\nimport addToFavoriteList from '../../../redux/netgemApi/actions/videofutur/addFavorite';\nimport clsx from 'clsx';\nimport { connect } from 'react-redux';\nimport { getDistributorId } from '../../../helpers/ui/item/distributor';\nimport { getItemLiveProgress } from '../../../helpers/ui/item/time';\nimport { getSeriesCardUrlDefinition } from '../../../helpers/ui/section/tile';\nimport { ignoreIfAborted } from '../../../libs/netgemLibrary/helpers/cancellablePromise/promiseHelper';\nimport { isPlaybackGranted } from '../../../helpers/rights/playback';\nimport removeFromFavoriteList from '../../../redux/netgemApi/actions/videofutur/deleteFavorite';\nimport { showDebug } from '../../../helpers/debug/debug';\n\nconst InitialState = Object.freeze({\n isLoading: true,\n synopsis: null,\n textHeight: 0,\n truncateState: TruncateState.Initializing,\n});\n\nconst textHeightCache: {| [string]: number |} = {};\n\nclass ItemOverlayView extends React.PureComponent<CompleteItemOverlayPropType, ItemOverlayStateType> {\n abortController: AbortController;\n\n wrapperHeight: number;\n\n constructor(props: CompleteItemOverlayPropType) {\n super(props);\n\n this.abortController = new AbortController();\n this.wrapperHeight = 0;\n\n this.state = { ...InitialState };\n }\n\n componentDidMount() {\n this.updateSynopsis();\n }\n\n componentDidUpdate(prevProps: CompleteItemOverlayPropType) {\n const {\n item: { type },\n programMetadata,\n programTitle,\n seriesMetadata,\n tvLocationMetadata,\n vodLocationsMetadata,\n } = this.props;\n const {\n programMetadata: prevProgramMetadata,\n programTitle: prevProgramTitle,\n seriesMetadata: prevSeriesMetadata,\n tvLocationMetadata: prevTVLocationMetadata,\n vodLocationsMetadata: prevVodLocationsMetadata,\n } = prevProps;\n\n if (programMetadata !== prevProgramMetadata || seriesMetadata !== prevSeriesMetadata) {\n this.updateSynopsis();\n }\n\n if (\n (prevVodLocationsMetadata === null && vodLocationsMetadata !== prevVodLocationsMetadata) ||\n (prevTVLocationMetadata === null && tvLocationMetadata !== prevTVLocationMetadata) ||\n (programTitle !== prevProgramTitle && type === ItemType.Universe)\n ) {\n this.setIsReady();\n }\n }\n\n setIsReady = () => {\n this.setState({ isLoading: false });\n };\n\n measureTextHeight = (text: string | null, width: number, isTagLine: boolean): number => {\n if (typeof text !== 'string' || text === '') {\n return 0;\n }\n\n const key = `${text}:${width}`;\n const { key: cachedHeight } = textHeightCache;\n\n if (typeof cachedHeight === 'number') {\n return cachedHeight;\n }\n\n const div = document.createElement('DIV');\n div.innerHTML = text;\n div.classList.add('synopsisMeasure');\n if (isTagLine) {\n div.classList.add('tagLine');\n }\n div.style.width = `${width}px`;\n document.body?.appendChild(div);\n const height = div.offsetHeight;\n document.body?.removeChild(div);\n\n textHeightCache[key] = height;\n\n return height;\n };\n\n // eslint-disable-next-line react/no-unused-class-component-methods\n showDebugInfo = () => {\n const { state } = this;\n\n showDebug('Section Item Overlay', {\n instance: this,\n instanceFields: ['wrapperHeight'],\n misc: { watchingStatus: this.localGetWatchingStatus() },\n state,\n stateFields: ['isLoading', 'synopsis', 'textHeight', 'truncateState'],\n });\n };\n\n updateSynopsis = () => {\n const {\n contentType,\n hoverContent,\n item: { locType, type },\n programMetadata,\n seriesMetadata,\n tvLocationMetadata,\n vodLocationsMetadata,\n } = this.props;\n\n let assetMetadata: ?NETGEM_API_V8_METADATA = null;\n let synopsis: string | null = '';\n\n if (hoverContent.has(TileConfig.SeriesSynopsis)) {\n assetMetadata = seriesMetadata;\n } else if (hoverContent.has(TileConfig.ProgramSynopsis)) {\n assetMetadata = programMetadata;\n }\n\n if (assetMetadata) {\n if (locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_TVOD || locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_EST) {\n // Display tag line on VOD tiles\n synopsis = getTagline(seriesMetadata ?? programMetadata, Localizer.language) ?? '';\n } else {\n // Display synopsis on all other tiles\n synopsis = assetMetadata ? getSynopsis(assetMetadata, Localizer.language) : '';\n }\n }\n\n this.setState({ synopsis, textHeight: 0, truncateState: TruncateState.Initializing });\n\n if (contentType === ItemContent.NetgemSVOD || (contentType === ItemContent.VODOrDeeplink && type === ItemType.Series) || vodLocationsMetadata !== null || tvLocationMetadata !== null) {\n // Do not wait for location metadata to load for these contents or if metadata is already loaded\n this.setIsReady();\n }\n };\n\n localGetWatchingStatus = (): number | null => {\n const { contentType, item, programMetadata, seriesMetadata, viewingHistory, viewingHistoryStatus, vodStatus } = this.props;\n\n return getWatchingStatus(item, viewingHistory, viewingHistoryStatus, contentType, programMetadata, seriesMetadata, vodStatus);\n };\n\n isFavorite = (): boolean => {\n const {\n authority,\n favoriteList,\n item: { selectedProgramId: programId, seriesId },\n programMetadata,\n seriesMetadata,\n wishlist,\n wishlistStatus,\n } = this.props;\n\n if (authority === NETGEM_API_V8_AUTHENT_REALM_VIDEOFUTUR) {\n if (!programMetadata) {\n return false;\n }\n\n const { providerInfo } = programMetadata;\n\n if (!providerInfo) {\n return false;\n }\n\n const titId = getTitIdFromProviderInfo(providerInfo, seriesMetadata);\n\n return favoriteList.includes(titId) ?? false;\n }\n\n if (wishlistStatus !== LoadableStatus.Loaded) {\n return false;\n }\n\n return wishlist.has(seriesId || programId);\n };\n\n getTimeElement = (description: Set<TileConfig>, className?: string): React.Node => {\n const { item, now } = this.props;\n\n const time = getTimeText(item, now, description);\n\n if (!time) {\n return null;\n }\n\n return <div className={clsx('text', className)}>{time}</div>;\n };\n\n getDetailsElement = (description: Set<TileConfig>): React.Node => {\n const { item, programMetadata, vodLocationsMetadata } = this.props;\n\n let info = 0;\n\n if (description.has(TileConfig.Year)) {\n info |= PROGRAM_INFO.ReleaseDate; // eslint-disable-line no-bitwise\n }\n\n if (description.has(TileConfig.Genre)) {\n info |= PROGRAM_INFO.Genre; // eslint-disable-line no-bitwise\n }\n\n if (description.has(TileConfig.Language)) {\n info |= PROGRAM_INFO.Language; // eslint-disable-line no-bitwise\n }\n\n if (description.has(TileConfig.ParentalGuidance)) {\n info |= PROGRAM_INFO.ParentalGuidance; // eslint-disable-line no-bitwise\n }\n\n if (info === 0) {\n return null;\n }\n\n return <div className='details other'>{renderProgramDetails(item, programMetadata, vodLocationsMetadata, info)}</div>;\n };\n\n toggleWishlist = (toggler: (string, string, AbortSignal) => Promise<any>) => {\n const {\n channels,\n commercialOffers,\n defaultRights,\n isRegisteredAsGuest,\n isSubscriptionFeatureEnabled,\n item,\n item: {\n selectedLocation: { channelId },\n selectedProgramId,\n },\n localHideModal,\n programMetadata,\n seriesMetadata,\n tileConfig: { type: tileType },\n tvLocationMetadata,\n userRights,\n vodLocationsMetadata,\n vtiId,\n } = this.props;\n const {\n abortController: { signal },\n } = this;\n const assetId = seriesMetadata?.id ?? selectedProgramId;\n\n if (!channelId) {\n // Channel Id is null\n return;\n }\n\n const locationMetadata = tvLocationMetadata ?? getVodLocationFromVtiId(vodLocationsMetadata, vtiId);\n\n const cardData: CARD_DATA_MODAL_TYPE = {\n item,\n programMetadata,\n seriesMetadata,\n tileType,\n };\n\n if (!isWishlistGranted(isRegisteredAsGuest, isSubscriptionFeatureEnabled, cardData, locationMetadata?.location, channels, commercialOffers, defaultRights, userRights)) {\n // Add to wishlist denied: log-in or subscribe page has been requested\n localHideModal();\n return;\n }\n\n toggler(assetId, channelId, signal).catch((error) => ignoreIfAborted(signal, error));\n };\n\n toggleFavorite = (toggler: (string, AbortSignal) => Promise<any>) => {\n const {\n channels,\n commercialOffers,\n defaultRights,\n isRegisteredAsGuest,\n isSubscriptionFeatureEnabled,\n item,\n localHideModal,\n tileConfig: { type: tileType },\n programMetadata,\n seriesMetadata,\n userRights,\n vodLocationsMetadata,\n vodStatus,\n } = this.props;\n const {\n abortController: { signal },\n } = this;\n\n if (!programMetadata) {\n return;\n }\n\n const { providerInfo } = programMetadata;\n\n if (!providerInfo) {\n return;\n }\n\n const locationMetadata = getVodLocationFromVtiId(vodLocationsMetadata, vodStatus?.vtiId);\n const cardData: CARD_DATA_MODAL_TYPE = {\n item,\n programMetadata,\n seriesMetadata,\n tileType,\n };\n\n const titId = getTitIdFromProviderInfo(providerInfo, seriesMetadata);\n\n if (!isFavoriteGranted(isRegisteredAsGuest, isSubscriptionFeatureEnabled, cardData, titId, locationMetadata?.location, channels, commercialOffers, defaultRights, userRights)) {\n // Add to favorite list denied: log-in or subscribe page has been requested\n localHideModal();\n return;\n }\n\n toggler(titId, signal).catch((error) => ignoreIfAborted(signal, error));\n };\n\n handleTrailerButtonOnClick = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n const { programMetadata, seriesMetadata } = this.props;\n\n if (programMetadata) {\n Messenger.emit(MessengerEvents.OPEN_PLAYER, {\n programMetadata,\n seriesMetadata,\n type: ExtendedItemType.Trailer,\n });\n }\n };\n\n handleAddToWishlistButtonOnClick = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n const { authority, localAddToWishlist, localAddToFavoriteList } = this.props;\n\n if (authority === NETGEM_API_V8_AUTHENT_REALM_VIDEOFUTUR) {\n this.toggleFavorite(localAddToFavoriteList);\n } else {\n this.toggleWishlist(localAddToWishlist);\n }\n };\n\n handleRemoveFromWishlistButtonOnClick = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n const { authority, localRemoveFromWishlist, localRemoveFromFavoriteList } = this.props;\n\n if (authority === NETGEM_API_V8_AUTHENT_REALM_VIDEOFUTUR) {\n this.toggleFavorite(localRemoveFromFavoriteList);\n } else {\n this.toggleWishlist(localRemoveFromWishlist);\n }\n };\n\n handlePlayButtonOnClick = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n const {\n authority,\n channels,\n contentType,\n commercialOffers,\n defaultOnItemClick,\n defaultRights,\n isRegisteredAsGuest,\n isSubscriptionFeatureEnabled,\n item,\n localHideModal,\n onItemClick,\n previewCatchupScheduledEventId,\n programMetadata,\n seriesMetadata,\n tileConfig: { type: tileType },\n tvLocationMetadata,\n userRights,\n viewingHistoryId,\n vodLocationsMetadata,\n vtiId,\n } = this.props;\n\n const locationMetadata = tvLocationMetadata ?? getVodLocationFromVtiId(vodLocationsMetadata, vtiId);\n const distributorId = locationMetadata?.location?.providerInfo?.distributorId ?? null;\n\n const cardData: CARD_DATA_MODAL_TYPE = {\n distributorId,\n item,\n programMetadata,\n seriesMetadata,\n tileType,\n urlDefinition: undefined,\n viewingHistoryId,\n vtiId,\n };\n\n if (seriesMetadata && tvLocationMetadata) {\n // In case of TV series item, add the series card URL definition (if found) so that the episodes will be displayed on the card\n const urlDefinition = getSeriesCardUrlDefinition(onItemClick, defaultOnItemClick);\n if (urlDefinition !== null) {\n cardData.urlDefinition = urlDefinition;\n }\n }\n\n if (!isPlaybackGranted(isRegisteredAsGuest, isSubscriptionFeatureEnabled, cardData, authority, contentType, locationMetadata?.location, channels, commercialOffers, defaultRights, userRights)) {\n // Playback denied: log-in or subscribe page has been requested\n localHideModal();\n return;\n }\n\n if (contentType === ItemContent.VODOrDeeplink) {\n if (programMetadata && vtiId) {\n Messenger.emit(MessengerEvents.OPEN_PLAYER, {\n distributorId,\n item,\n locationId: locationMetadata?.location.id,\n programMetadata,\n seriesMetadata,\n tileType,\n type: ExtendedItemType.VOD,\n viewingHistoryId,\n vtiId,\n });\n }\n } else {\n Messenger.emit(MessengerEvents.OPEN_PLAYER, {\n authority,\n item,\n previewCatchupScheduledEventId,\n programMetadata,\n seriesMetadata,\n type: ExtendedItemType.TV,\n });\n }\n };\n\n handleReplayButtonOnClick = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n const { programMetadata, seriesMetadata, startoverItem } = this.props;\n\n if (programMetadata && startoverItem) {\n Messenger.emit(MessengerEvents.OPEN_PLAYER, {\n item: startoverItem,\n programMetadata,\n seriesMetadata,\n type: ExtendedItemType.TV,\n });\n }\n };\n\n vodPurchaseModalClosedCallback = (data: any): void => {\n const { item, programMetadata, purchaseInfo, seriesMetadata, vodLocationsMetadata } = this.props;\n\n if (!data) {\n // Purchase cancelled\n return;\n }\n\n const { locationId, playNow, viewingHistoryId, vtiId } = data;\n\n if (playNow && vtiId) {\n Messenger.emit(MessengerEvents.OPEN_PLAYER, {\n distributorId: getDistributorId(vodLocationsMetadata, purchaseInfo),\n item,\n locationId,\n programMetadata,\n seriesMetadata,\n type: ExtendedItemType.VOD,\n viewingHistoryId,\n vtiId,\n });\n }\n };\n\n handlePurchaseButtonOnClick = (data: BASE_VOD_PURCHASE_DATA_TYPE): void => {\n const {\n isRegisteredAsGuest,\n item,\n localHideModal,\n programMetadata,\n seriesMetadata,\n showVodPurchaseDialog,\n tileConfig: { type: tileType },\n } = this.props;\n\n const { definition, displayPrice, distributorId, itemCount, licenseDuration, locationId, otherVtiId, purchaseType, vodLocationMetadata, vtiId } = data;\n\n if (!programMetadata) {\n return;\n }\n\n const providerInfo = vodLocationMetadata?.providerInfo ?? programMetadata.providerInfo;\n\n const purchaseData: VOD_PURCHASE_DATA_TYPE = {\n definition,\n displayPrice,\n distributorId,\n item,\n itemCount,\n licenseDuration,\n locationId,\n otherVtiId,\n programMetadata,\n purchaseType,\n seriesMetadata,\n viewingHistoryId: providerInfo?.viewingHistoryId,\n vodLocationMetadata,\n vtiId,\n };\n\n if (isRegisteredAsGuest) {\n // Guest mode: let's open the sign-in page\n storePendingOperation({\n item,\n pendingOperation: {\n operationType: PendingOperationKind.Purchase,\n purchaseData,\n reason: PendingOperationReason.RequireAccount,\n },\n programMetadata,\n seriesMetadata,\n tileType,\n });\n localHideModal();\n Messenger.emit(MessengerEvents.SHOW_SIGN_IN, PendingOperationKind.Purchase);\n } else {\n Messenger.once(MessengerEvents.MODAL_CONFIRMATION_CLOSED, this.vodPurchaseModalClosedCallback);\n showVodPurchaseDialog(purchaseData);\n }\n };\n\n renderVodActions = (pictoGem: React.Node): ActionsType => {\n const {\n tileConfig: { type: tileType },\n vodStatus,\n } = this.props;\n\n const status = vodStatus?.status ?? BOVodAssetStatus.Unknown;\n const actions = [pictoGem];\n\n const progress = this.localGetWatchingStatus();\n\n const widthKind = tileType === TileConfigTileType.LandscapeBig || tileType === TileConfigTileType.LandscapeVod ? WidthKind.Large : WidthKind.Stretched;\n\n const playBtn =\n status === BOVodAssetStatus.Free || status === BOVodAssetStatus.Rented || status === BOVodAssetStatus.Bought ? (\n <ButtonFX allowZeroProgress={false} heightKind={HeightKind.Small} key='play' onClick={this.handlePlayButtonOnClick} progress={progress} widthKind={widthKind}>\n {Localizer.localize('common.actions.watch')}\n </ButtonFX>\n ) : null;\n\n const mainButton = (\n <>\n {this.renderPricingVod()}\n {playBtn}\n </>\n );\n\n return {\n actions,\n mainButton,\n };\n };\n\n renderTVActions = (pictoGem: React.Node): ActionsType => {\n const {\n broadcastStatus,\n defaultOnItemClick,\n item,\n item: { locType },\n onItemClick,\n previewCatchupScheduledEventId,\n programMetadata,\n seriesMetadata,\n startoverItem,\n tileConfig: { type: tileType },\n tvLocationMetadata,\n } = this.props;\n\n const pictoReplay = startoverItem ? <PictoReplay key='replay' onClick={this.handleReplayButtonOnClick} /> : null;\n\n const actions = [pictoGem, pictoReplay];\n\n let mainButton = null;\n\n let cardDataUrlDefinition: Undefined<NETGEM_API_V8_URL_DEFINITION> = undefined;\n if (seriesMetadata && tvLocationMetadata) {\n // In case of TV series item, add the series card URL definition (if found) so that the episodes will be displayed on the card\n const urlDefinition = getSeriesCardUrlDefinition(onItemClick, defaultOnItemClick);\n if (urlDefinition) {\n cardDataUrlDefinition = urlDefinition;\n }\n }\n\n if (broadcastStatus === BroadcastStatus.Future) {\n // Future scheduled event\n mainButton = (\n <RecordButton\n broadcastStatus={broadcastStatus}\n cardDataUrlDefinition={cardDataUrlDefinition}\n context={RecordContext.Tile}\n displayMode={DisplayMode.Button}\n item={item}\n key='recordButton'\n location={tvLocationMetadata?.location ?? null}\n previewCatchupScheduledEventId={previewCatchupScheduledEventId}\n programMetadata={programMetadata}\n seriesMetadata={seriesMetadata}\n tileType={tileType}\n />\n );\n } else if (broadcastStatus !== BroadcastStatus.Unknown) {\n // Live scheduled event, catchup or recording\n const buttonTextKey = broadcastStatus === BroadcastStatus.Live && locType !== NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING ? 'common.actions.watch_live' : 'common.actions.watch';\n const widthKind = tileType === TileConfigTileType.LandscapeBig || tileType === TileConfigTileType.LandscapeVod ? WidthKind.Large : WidthKind.Stretched;\n actions.push(\n <RecordButton\n broadcastStatus={broadcastStatus}\n cardDataUrlDefinition={cardDataUrlDefinition}\n context={RecordContext.Tile}\n displayMode={DisplayMode.Picto}\n item={item}\n key='recordButton'\n kind={locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_CATCHUP ? ScheduledRecordingsKind.KeepFromReplay : undefined}\n location={tvLocationMetadata?.location ?? null}\n previewCatchupScheduledEventId={previewCatchupScheduledEventId}\n programMetadata={programMetadata}\n seriesMetadata={seriesMetadata}\n tileType={tileType}\n />,\n );\n mainButton = (\n <ButtonFX\n allowZeroProgress={broadcastStatus === BroadcastStatus.Live}\n heightKind={HeightKind.Small}\n key='play'\n onClick={this.handlePlayButtonOnClick}\n progress={broadcastStatus === BroadcastStatus.Live ? getItemLiveProgress(item) : this.localGetWatchingStatus()}\n widthKind={widthKind}\n >\n {Localizer.localize(buttonTextKey)}\n </ButtonFX>\n );\n }\n\n return {\n actions,\n mainButton,\n };\n };\n\n handleSynopsisOnResize = (data: ResizeType): void => {\n const {\n item: { locType },\n } = this.props;\n const { synopsis, truncateState } = this.state;\n const { height: availableHeight, width: availableWidth } = data;\n\n const isTagLine = locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_TVOD || locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_EST;\n\n if (truncateState !== TruncateState.Initializing || availableHeight === null || availableWidth === null) {\n // Component not mounted or truncate state already initialized\n return;\n }\n\n // Synopsis wrapper has been rendered\n\n // Fix wrapper height for future renderings\n this.wrapperHeight = availableHeight;\n\n // Height needed to fully display synopsis\n const requiredHeight = this.measureTextHeight(synopsis, availableWidth, isTagLine);\n\n let newTextHeight = 0;\n let newTruncateState = truncateState;\n\n if (requiredHeight > availableHeight) {\n // Synopsis has to be truncated to following height\n const lineHeight = isTagLine ? TILE_SYNOPSIS_TAGLINE_LINE_HEIGHT : TILE_SYNOPSIS_LINE_HEIGHT;\n newTextHeight = Math.floor(availableHeight / lineHeight - 1) * lineHeight;\n newTruncateState = TruncateState.Truncated;\n } else {\n newTextHeight = requiredHeight;\n newTruncateState = TruncateState.NotTruncated;\n }\n\n // Text height and truncate state are not stored immediately in component's state because it seems to happen too early sometimes\n setTimeout(() => {\n // Text height is increased by 1 pixel to accommodate for rounding error\n this.setState({ textHeight: newTextHeight + 1, truncateState: newTruncateState });\n }, 0);\n };\n\n renderSynopsis = (): React.Node => {\n const {\n item: { locType },\n } = this.props;\n const { synopsis, textHeight, truncateState } = this.state;\n\n const isTagLine = locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_TVOD || locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_EST;\n\n // Wrapper height is fixed so that it doesn't grow when the synopsis text is rendered\n const wrapperStyle = truncateState === TruncateState.Truncated && this.wrapperHeight > 0 ? { height: this.wrapperHeight, maxHeight: this.wrapperHeight } : undefined;\n\n const synopsisElt =\n truncateState === TruncateState.Initializing ? null : (\n <div className='text' style={{ height: `${textHeight}px` }}>\n {synopsis}\n </div>\n );\n\n return (\n <div className={clsx('synopsisWrapper', (synopsis === null || synopsis === '') && 'empty', isTagLine && 'tagLine')} style={wrapperStyle}>\n <div className='synopsis'>{synopsisElt}</div>\n {truncateState === TruncateState.Truncated ? <div className='ellipsis'>[...]</div> : null}\n </div>\n );\n };\n\n renderPricingVod = (): React.Node => {\n const {\n item: { purchasable, type },\n tileConfig: { type: tileType },\n purchaseInfo,\n vodLocationsMetadata,\n vodStatus,\n } = this.props;\n\n if (!vodStatus && !purchaseInfo) {\n return null;\n }\n\n let status = BOVodAssetStatus.Unknown;\n const expirationTime = vodStatus?.expirationTime ?? 0;\n\n if (vodStatus) {\n ({ status } = vodStatus);\n } else if (purchaseInfo) {\n status = BOVodAssetStatus.Locked;\n }\n\n if (status === BOVodAssetStatus.Unknown) {\n // Purchase list not loaded yet\n return null;\n }\n\n if ((purchasable !== undefined && !purchasable) || status === BOVodAssetStatus.Free) {\n // No message on tiles for free VOD items\n return null;\n }\n\n // TODO: handle BOVodAssetStatus.FreeButAvailableInFuture here if some movies with future availability appear in the catalog\n\n const context = tileType === TileConfigTileType.LandscapeBig || tileType === TileConfigTileType.LandscapeVod ? PricingContext.LandscapeTile : PricingContext.RegularTile;\n\n return (\n <PricingVod\n context={context}\n expirationTime={expirationTime}\n isVodSeries={type === ItemType.Series}\n locationsMetadata={vodLocationsMetadata}\n onClick={this.handlePurchaseButtonOnClick}\n purchaseInfo={purchaseInfo}\n status={status}\n />\n );\n };\n\n renderHoverContentElements = (): React.Node => {\n const { hoverContent, programMetadataStatus, programTitle, seriesMetadataStatus, seriesTitle } = this.props;\n\n let titleElement = null;\n let subtitleElement = null;\n let synopsisElement = null;\n\n // Series title\n if (hoverContent.has(TileConfig.SeriesTitle)) {\n titleElement = renderSeriesTitle(programMetadataStatus, seriesMetadataStatus, seriesTitle);\n }\n\n // Program title\n if (hoverContent.has(TileConfig.ProgramTitle)) {\n const programTitleElement = renderProgramTitle(programMetadataStatus, seriesMetadataStatus, programTitle, null, titleElement ? 'secondLineInfo' : '', titleElement === null);\n if (titleElement) {\n subtitleElement = programTitleElement;\n } else {\n titleElement = programTitleElement;\n }\n }\n\n // Date & duration\n const timeElement = this.getTimeElement(hoverContent, 'thirdLineInfo');\n\n // Year, genre, language & parental guidance\n const detailsElement = this.getDetailsElement(hoverContent);\n\n if (hoverContent.has(TileConfig.ProgramSynopsis) || hoverContent.has(TileConfig.SeriesSynopsis)) {\n synopsisElement = (\n <ResizeDetectorWrapper className='resizeDetectorSynopsis' handleHeight handleWidth onResize={this.handleSynopsisOnResize} refreshMode='debounce' refreshRate={50}>\n {this.renderSynopsis()}\n </ResizeDetectorWrapper>\n );\n }\n\n return (\n <>\n <TextScroller scrollOnMount style={{ font: '18px var(--bold-font)', maxHeight: '24px', transform: 'scale3d(1.22, 1.22, 1)' }}>\n {titleElement}\n </TextScroller>\n {subtitleElement ? (\n <TextScroller scrollOnMount style={{ font: '11px var(--light-font)', maxHeight: '16px' }}>\n {subtitleElement}\n </TextScroller>\n ) : null}\n {timeElement}\n {detailsElement}\n {synopsisElement}\n </>\n );\n };\n\n renderUnknownProgram = (): React.Node => {\n const {\n isInLiveSection,\n onClick,\n tileConfig: { type: tileType },\n } = this.props;\n\n if (!isInLiveSection) {\n // Do not display overlay when nothing is known about program\n return null;\n }\n\n const widthKind = tileType === TileConfigTileType.LandscapeBig || tileType === TileConfigTileType.LandscapeVod ? WidthKind.Large : WidthKind.Stretched;\n\n // No info for current program but since it's a live tile, allow to open player with channel only\n return (\n <div className='overlay bottom' onClick={onClick}>\n <ButtonFX heightKind={HeightKind.Small} key='play' onClick={this.handlePlayButtonOnClick} widthKind={widthKind}>\n {Localizer.localize('common.actions.watch_live')}\n </ButtonFX>\n </div>\n );\n };\n\n renderIconBar = (actions: Array<React.Node>): React.Node => (\n <div className='iconBar'>\n {actions.map((picto, index) =>\n picto ? (\n // eslint-disable-next-line react/no-array-index-key\n <div className='iconContainer' key={index}>\n {picto}\n </div>\n ) : null,\n )}\n </div>\n );\n\n render(): React.Node {\n const {\n contentType,\n isVisible,\n item: { type: itemType },\n onClick,\n programMetadata,\n seriesMetadata,\n streamPriorities,\n tileConfig: { onFocus },\n } = this.props;\n const { isLoading } = this.state;\n\n if (!isVisible || onFocus === TileOnFocus.Selection) {\n // Tile is not hovered: overlay is not displayed\n return null;\n }\n\n if (!programMetadata) {\n return this.renderUnknownProgram();\n }\n\n const fullHeartPicto = <PictoHeartFull className='fullHeart' key='heart' onClick={this.handleRemoveFromWishlistButtonOnClick} />;\n\n const emptyHeartPicto = <PictoHeartEmpty className='emptyHeart' key='heart' onClick={this.handleAddToWishlistButtonOnClick} />;\n\n const pictoWishlist = this.isFavorite() ? fullHeartPicto : emptyHeartPicto;\n\n const { actions, mainButton } = contentType === ItemContent.VODOrDeeplink ? this.renderVodActions(pictoWishlist) : this.renderTVActions(pictoWishlist);\n\n if ((hasProgramTrailer(streamPriorities, programMetadata) && itemType === ItemType.Program) || (hasSeriesTrailer(streamPriorities, seriesMetadata) && itemType === ItemType.Series)) {\n actions.push(<PictoTrailer key='trailer' onClick={this.handleTrailerButtonOnClick} />);\n }\n\n // Information displayed over tile, described by hoverContent in tileConfig (series tiles, program title, etc.)\n const hoverContentElements = this.renderHoverContentElements();\n\n const iconBar = this.renderIconBar(actions);\n\n return (\n <div className='overlay' onClick={onClick}>\n {iconBar}\n {isLoading ? <InfiniteCircleLoader className='loader' /> : hoverContentElements}\n {mainButton}\n </div>\n );\n }\n}\n\nconst mapStateToProps = (state: CombinedReducers): ReduxItemOverlayReducerStateType => {\n return {\n channels: state.appConfiguration.deviceChannels,\n commercialOffers: state.appConfiguration.rightsCommercialOffers,\n defaultOnItemClick: state.ui.defaultActions ? state.ui.defaultActions.onItemClick : null,\n defaultRights: state.appConfiguration.rightsDefault,\n favoriteList: state.ui.favoriteList || [],\n isDebugModeEnabled: state.appConfiguration.isDebugModeEnabled,\n isRegisteredAsGuest: state.appRegistration.registration === RegistrationType.RegisteredAsGuest,\n isSubscriptionFeatureEnabled: state.appConfiguration.features[FEATURE_SUBSCRIPTION],\n npvrRecordingsFuture: state.npvr.npvrRecordingsFuture,\n npvrRecordingsList: state.npvr.npvrRecordingsList,\n npvrScheduledRecordingsList: state.npvr.npvrScheduledRecordingsList,\n purchaseList: state.appRegistration.registration === RegistrationType.RegisteredAsGuest ? {} : state.ui.purchaseList,\n streamPriorities: state.appConfiguration.playerStreamPriorities,\n userRights: state.appConfiguration.rightsUser,\n viewingHistory: state.ui.viewingHistory,\n viewingHistoryStatus: state.ui.viewingHistoryStatus,\n wishlist: WishlistCache.checkGet(state.ui.wishlist, state.ui.wishlistStatus).ids,\n wishlistStatus: state.ui.wishlistStatus,\n };\n};\n\nconst mapDispatchToProps = (dispatch: Dispatch): ReduxItemOverlayDispatchToPropsType => {\n return {\n localAddToFavoriteList: (titId: string, signal?: AbortSignal): Promise<any> => dispatch(addToFavoriteList(titId, signal)),\n\n localAddToWishlist: (assetId: string, channelId: string, signal?: AbortSignal): Promise<any> => dispatch(addToWishlist(assetId, channelId, signal)),\n\n localHideModal: () => dispatch(hideModal()),\n\n localRemoveFromFavoriteList: (titId: string, signal?: AbortSignal): Promise<any> => dispatch(removeFromFavoriteList(titId, signal)),\n\n localRemoveFromWishlist: (assetId: string, channelId: string, signal?: AbortSignal): Promise<any> => dispatch(removeFromWishlist(assetId, channelId, signal)),\n\n showVodPurchaseDialog: (vodPurchaseData: VOD_PURCHASE_DATA_TYPE) => dispatch(showVodPurchaseModal(vodPurchaseData)),\n };\n};\n\nconst ItemOverlay: React.ComponentType<ItemOverlayPropType> = connect(mapStateToProps, mapDispatchToProps, null, { forwardRef: true })(ItemOverlayView);\n\nexport default ItemOverlay;\n","/* @flow */\n\nimport type { NETGEM_API_V8_AVENUE } from '../../../libs/netgemLibrary/v8/types/Avenue';\nimport type { NETGEM_API_V8_METADATA } from '../../../libs/netgemLibrary/v8/types/MetadataProgram';\nimport type { NETGEM_API_V8_REQUEST_RESPONSE } from '../../../libs/netgemLibrary/v8/types/RequestResponse';\n\n/*\n * Hard-coded list of lowercase names that should be excluded from the cast\n * Useful to avoid, e.g. \"TFOU MAX\", in cast or in related sections of series/program card\n */\nconst CastExclusionList: Array<string> = ['adult swim', 'boing tv', 'boomerang tv', 'tfou max', 'toonami tv'];\n\nconst filterSections: (response: NETGEM_API_V8_REQUEST_RESPONSE) => NETGEM_API_V8_AVENUE = (response) => {\n const { result }: { result: NETGEM_API_V8_AVENUE } = response;\n const { sections } = result;\n\n result.sections = sections.filter((section) => {\n if (section.title.length === 0) {\n return true;\n }\n\n const title = section.title[0].value.toLowerCase();\n return CastExclusionList.every((excluded) => !title.endsWith(excluded));\n });\n\n return result;\n};\n\nconst filterCredits: (metadata: NETGEM_API_V8_METADATA) => NETGEM_API_V8_METADATA = (metadata) => {\n const { credits } = metadata;\n\n if (credits) {\n metadata.credits = credits.filter((person) => {\n let { name } = person;\n if (!name || name.match(/^\\s$/u)) {\n return false;\n }\n\n name = name.toLowerCase();\n return CastExclusionList.every((excluded) => name !== excluded);\n });\n }\n\n return metadata;\n};\n\nexport { filterCredits, filterSections };\n","/* @flow */\n\nimport {\n ItemContent,\n type NETGEM_API_V8_FEED_ITEM,\n type NETGEM_API_V8_ITEM_LOCATION_TYPE,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_CATCHUP,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_EST,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_SVOD,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_TVOD,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_VOD,\n} from '../../libs/netgemLibrary/v8/types/FeedItem';\nimport { LEGACY_DEEPLINK_TEMPLATE_NETGEM, LEGACY_DEEPLINK_TEMPLATE_VF, SHORT_DEEPLINK_TEMPLATE_PROGRAM, SHORT_DEEPLINK_TEMPLATE_SERIES } from '../../components/avenue/item/ItemConstsAndTypes';\nimport { type NETGEM_API_V8_AUTHENT_REALM, NETGEM_API_V8_AUTHENT_REALM_NETGEM, NETGEM_API_V8_AUTHENT_REALM_VIDEOFUTUR } from '../../libs/netgemLibrary/v8/types/Realm';\nimport type { NETGEM_API_V8_METADATA_PROGRAM, NETGEM_API_V8_METADATA_SERIES } from '../../libs/netgemLibrary/v8/types/MetadataProgram';\nimport { logInfo, logWarning } from './debug';\nimport { APPLICATION_ID } from '../applicationCustomization/types';\nimport type { NETGEM_API_V8_METADATA_SCHEDULE } from '../../libs/netgemLibrary/v8/types/MetadataSchedule';\nimport type { NETGEM_API_V8_PURCHASE_INFO } from '../../libs/netgemLibrary/v8/types/PurchaseInfo';\nimport { extractDistributorId } from '../videofutur/metadata';\nimport { getDistributorId } from '../ui/item/distributor';\n\ntype DEEPLINK_GENERATION_DATA = {\n authority?: NETGEM_API_V8_AUTHENT_REALM,\n contentType: ItemContent,\n deviceOS: string,\n item: NETGEM_API_V8_FEED_ITEM,\n programMetadata: NETGEM_API_V8_METADATA_PROGRAM | null,\n purchaseInfo?: NETGEM_API_V8_PURCHASE_INFO | null,\n seriesMetadata: NETGEM_API_V8_METADATA_SERIES | null,\n vodLocationsMetadata: Array<NETGEM_API_V8_METADATA_SCHEDULE> | null,\n};\n\nconst generateVFDeeplink = (data: DEEPLINK_GENERATION_DATA): string => {\n const {\n location: { host, protocol },\n } = window;\n const {\n deviceOS,\n item: {\n selectedLocation: { id },\n },\n programMetadata,\n purchaseInfo,\n seriesMetadata,\n vodLocationsMetadata,\n } = data;\n\n if (!programMetadata) {\n throw new Error('No program metadata');\n }\n\n const { providerInfo } = programMetadata;\n\n if (!providerInfo) {\n throw new Error('No provider info');\n }\n\n const distributorId = getDistributorId(vodLocationsMetadata, purchaseInfo, programMetadata) ?? extractDistributorId(id, deviceOS);\n\n if (!distributorId) {\n throw new Error('No distributor Id');\n }\n\n const { id: titId } = providerInfo;\n\n return LEGACY_DEEPLINK_TEMPLATE_VF.replace('<protocol>', protocol)\n .replace('<host>', host)\n .replace('<type>', seriesMetadata ? 'series' : 'program')\n .replace('<titId>', titId)\n .replace('<distributorId>', distributorId);\n};\n\nconst generateDeeplinkInternal = (data: DEEPLINK_GENERATION_DATA, kind: Array<NETGEM_API_V8_ITEM_LOCATION_TYPE>): string => {\n const {\n location: { host, protocol },\n } = window;\n const {\n item: {\n id: itemId,\n selectedLocation: { channelId },\n },\n seriesMetadata,\n } = data;\n\n // Since flowjs v0.239.0, \"id\" is said to be potentially undefined (which is impossible, here)\n const id = itemId.split('/').pop() ?? '';\n\n return LEGACY_DEEPLINK_TEMPLATE_NETGEM.replace('<protocol>', protocol)\n .replace('<host>', host)\n .replace('<type>', seriesMetadata ? 'series' : 'program')\n .replace('<id>', id)\n .replace('<kind>', encodeURIComponent(encodeURIComponent(JSON.stringify(kind))))\n .replace('<channel>', encodeURIComponent(encodeURIComponent(channelId ?? '')));\n};\n\nconst generateNetgemVodDeeplink = (data: DEEPLINK_GENERATION_DATA): string => generateDeeplinkInternal(data, [NETGEM_API_V8_ITEM_LOCATION_TYPE_VOD]);\n\nconst generateNetgemTVDeeplink = (data: DEEPLINK_GENERATION_DATA): string =>\n generateDeeplinkInternal(data, [NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT, NETGEM_API_V8_ITEM_LOCATION_TYPE_CATCHUP]);\n\nconst normalizeString = (s: string): string =>\n s\n .normalize('NFKD')\n .replace(/[\\u0300-\\u036f]/gu, '')\n .toLowerCase()\n .replace(/[^a-z0-9]+/gu, '-');\n\nconst getDomain = (): string => {\n switch (process.env.REACT_APP_ID) {\n case APPLICATION_ID.FranceChannel:\n return 'francechannel.tv';\n case APPLICATION_ID.Gaumont:\n return 'gaumontclassique.fr';\n case APPLICATION_ID.Premiere:\n return 'premieremax.com';\n case APPLICATION_ID.Viva:\n return `${process.env.REACT_APP_ENV_NAME !== '' ? '' : 'viva.'}videofutur.fr`;\n default:\n throw new Error(`Application \"${process.env.REACT_APP_ID ?? '<unknown>'}\" not supported`);\n }\n};\n\nconst getVodDomain = (): string => `vod${process.env.REACT_APP_ENV_NAME !== '' ? 'test' : ''}.${getDomain()}`;\n\nconst getId = (data: DEEPLINK_GENERATION_DATA): string => {\n const {\n authority,\n item: { id },\n programMetadata,\n } = data;\n\n if (authority === NETGEM_API_V8_AUTHENT_REALM_NETGEM) {\n // FranceChannel SVOD\n return id.split('/').slice(-1)[0];\n }\n\n // All other cases\n\n if (!programMetadata) {\n throw new Error('No program metadata');\n }\n\n const {\n providerInfo: { id: titId },\n } = programMetadata;\n\n return titId;\n};\n\nconst generateLegacyDeeplink = (data: DEEPLINK_GENERATION_DATA): string => {\n const {\n authority,\n contentType,\n item: { locType },\n } = data;\n if (authority === undefined) {\n throw new Error('No authority');\n }\n\n if (contentType === ItemContent.VODOrDeeplink || contentType === ItemContent.NetgemSVOD) {\n // VOD\n if (authority === NETGEM_API_V8_AUTHENT_REALM_VIDEOFUTUR) {\n // Videofutur content (TVOD or EST)\n return generateVFDeeplink(data);\n } else if (authority === NETGEM_API_V8_AUTHENT_REALM_NETGEM) {\n // Netgem content (e.g. FranceChannel SVOD)\n return generateNetgemVodDeeplink(data);\n }\n throw new Error(`Authority \"${authority}\" not supported`);\n }\n\n if (locType !== NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT && locType !== NETGEM_API_V8_ITEM_LOCATION_TYPE_CATCHUP) {\n throw new Error(`Location \"${locType ?? '<unknown>'}\" not supported`);\n }\n\n // TV: scheduled event or catchup\n return generateNetgemTVDeeplink(data);\n};\n\nconst generateShortDeeplink = (data: DEEPLINK_GENERATION_DATA): string => {\n const { programMetadata, seriesMetadata } = data;\n\n const deeplinkPattern = seriesMetadata ? SHORT_DEEPLINK_TEMPLATE_SERIES : SHORT_DEEPLINK_TEMPLATE_PROGRAM;\n const titles = seriesMetadata ? seriesMetadata.titles : programMetadata?.titles;\n const title = titles?.[0].value;\n\n if (!title) {\n throw new Error('No title');\n }\n\n return deeplinkPattern.replace('<vod_domain>', getVodDomain()).replace('<title>', normalizeString(title)).replace('<id>', getId(data));\n};\n\nconst generateDeeplink = (data: DEEPLINK_GENERATION_DATA) => {\n const {\n authority,\n item: { locType },\n } = data;\n\n if (\n locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_EST ||\n locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_TVOD ||\n locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_VOD ||\n (locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_SVOD && (authority === NETGEM_API_V8_AUTHENT_REALM_NETGEM || authority === NETGEM_API_V8_AUTHENT_REALM_VIDEOFUTUR))\n ) {\n // Short deeplinks only work for VOD items\n try {\n const deeplink = generateShortDeeplink(data);\n\n // Successfully generated\n logInfo('Short deeplink successfully generated:');\n logInfo(deeplink);\n\n return;\n } catch (error) {\n logWarning('Error generating short deeplink');\n }\n }\n\n // Fallback to long deeplinks\n try {\n const deeplink = generateLegacyDeeplink(data);\n\n // Successfully generated\n logInfo('Legacy deeplink successfully generated:');\n logInfo(deeplink);\n } catch (error) {\n logWarning('Error generating legacy deeplink');\n }\n};\n\nexport { generateDeeplink };\n","/* @flow */\n\nimport type { NetgemApiEmitterType, RequestResponseMethodDefinitionType } from '../emitter';\nimport type { CombinedReducers } from '../../../reducers';\nimport type { Dispatch } from '../../../types/types';\nimport type { NETGEM_API_V8_REQUEST_RESPONSE } from '../../../../libs/netgemLibrary/v8/types/RequestResponse';\nimport { REDUX_MSG_REQUEST_GENERIC } from '../../constants';\nimport { createCustomNetworkErrorFromKey } from '../../../../libs/netgemLibrary/helpers/CreateCustomNetworkError';\nimport { generateApiUrl } from '../helpers/api';\n\nconst fixVtiIdType: (response: NETGEM_API_V8_REQUEST_RESPONSE) => NETGEM_API_V8_REQUEST_RESPONSE = (response) => {\n response.result.forEach((r) => {\n const {\n settings: { vtiId },\n } = r;\n if (typeof vtiId === 'string' && vtiId !== '' && !isNaN(vtiId)) {\n r.settings.vtiId = Number(vtiId);\n }\n });\n\n return response;\n};\n\n// Used to retrieve the purchase info for a VOD item (series, season, program)\nconst getPurchaseInfoPerAsset: (assetId: string, channelId: string, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (assetId, channelId, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const state = getState();\n const {\n netgemApi: { purchaseInfoPerAssetUrl },\n } = state;\n\n if (!purchaseInfoPerAssetUrl) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definition', { urlDef: 'purchaseInfoPerAssetUrl' }));\n }\n\n const { authent, method } = purchaseInfoPerAssetUrl;\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_GENERIC, {\n authent,\n method,\n signal,\n state,\n uri: generateApiUrl(\n purchaseInfoPerAssetUrl,\n {\n assetId,\n channelList: [channelId],\n },\n state\n ),\n }).then((response) => fixVtiIdType(response).result);\n };\n\nexport { getPurchaseInfoPerAsset };\n","/* @flow */\n\nimport { ItemType, type NETGEM_API_V8_FEED_ITEM, NETGEM_API_V8_ITEM_LOCATION_TYPE_CATCHUP } from '../types/FeedItem';\nimport { type NETGEM_API_V8_REQUEST_RESPONSE } from '../types/RequestResponse';\n\nexport const getStartOverItem: (item: NETGEM_API_V8_FEED_ITEM, requestResponse: NETGEM_API_V8_REQUEST_RESPONSE) => NETGEM_API_V8_FEED_ITEM | null = (item, requestResponse) => {\n const { result } = requestResponse;\n\n if (!result.feed) {\n return null;\n }\n\n const {\n feed: [firstItem],\n } = result;\n if (!firstItem) {\n return null;\n }\n\n const { locations } = firstItem;\n\n const {\n elements,\n endTime,\n id,\n score,\n selectedLocation: { startDate },\n selectedProgramId,\n seriesId,\n startTime,\n } = item;\n\n for (let i = 0; i < locations.length; i++) {\n const { [i]: location } = locations;\n const { scheduledEventStartDate } = location;\n\n if (startDate === scheduledEventStartDate) {\n return {\n elements,\n endTime,\n id,\n locType: NETGEM_API_V8_ITEM_LOCATION_TYPE_CATCHUP,\n locations,\n score,\n selectedLocation: location,\n selectedProgramId,\n seriesId,\n startTime,\n type: ItemType.Program,\n };\n }\n }\n\n // No catchup matching live item was found\n return null;\n};\n","/* @flow */\n\nimport type { NetgemApiEmitterType, RequestResponseMethodDefinitionType } from '../emitter';\nimport type { CombinedReducers } from '../../../reducers';\nimport type { Dispatch } from '../../../types/types';\nimport { REDUX_MSG_REQUEST_GENERIC } from '../../constants/';\nimport { createCustomNetworkErrorFromKey } from '../../../../libs/netgemLibrary/helpers/CreateCustomNetworkError';\nimport { generateApiUrl } from '../helpers/api';\n\nconst sendV8LocationCatchupForAssetRequest: (assetId: string, startDate: number, range: number, channelIds?: Array<string>, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (assetId, startDate, range, channelIds, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const state = getState();\n const {\n netgemApi: { locationCatchupForAssetUrl },\n } = state;\n\n if (!locationCatchupForAssetUrl) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definition', { urlDef: 'locationCatchupForAssetUrl' }));\n }\n\n const { authent, method } = locationCatchupForAssetUrl;\n const channelList = channelIds ? JSON.stringify(channelIds) : undefined;\n\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_GENERIC, {\n authent,\n method,\n signal,\n uri: generateApiUrl(\n locationCatchupForAssetUrl,\n {\n assetId,\n channelList,\n endDate: startDate + range,\n range,\n startDate,\n },\n state\n ),\n });\n };\n\nexport default sendV8LocationCatchupForAssetRequest;\n","/* @flow */\n\nimport './Item.css';\nimport * as React from 'react';\nimport { BroadcastStatus, WebAppHelpersLocationStatus, getBroadcastStatus, getLocationStatus } from '../../../helpers/ui/location/Format';\nimport {\n type CompleteItemPropType,\n type DefaultProps,\n IMAGE_LOAD_TIMEOUT,\n IMAGE_URL_COUNT,\n type ItemPropType,\n type ItemStateType,\n MetadataStatus,\n REFRESH_TIMEOUT,\n type ReduxItemDispatchToPropsType,\n type ReduxItemReducerStateType,\n TRANSPARENT_PIXEL,\n} from './ItemConstsAndTypes';\nimport { ExtendedItemType, FAKE_EPG_LIVE_PREFIX } from '../../../helpers/ui/item/types';\nimport { type ImageUrlType, getImageUrl } from '../../../redux/netgemApi/actions/v8/metadataImage';\nimport {\n ItemContent,\n ItemType,\n type NETGEM_API_V8_FEED_ITEM,\n type NETGEM_API_V8_ITEM_LOCATION,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT,\n} from '../../../libs/netgemLibrary/v8/types/FeedItem';\nimport { Luminosity, Theme, type ThemeType } from '@ntg/ui/dist/theme';\nimport {\n METADATA_KIND_PROGRAM,\n METADATA_KIND_SERIES,\n type MetadataKind,\n type NETGEM_API_V8_METADATA,\n type NETGEM_API_V8_METADATA_PROGRAM,\n type NETGEM_API_V8_METADATA_SERIES,\n} from '../../../libs/netgemLibrary/v8/types/MetadataProgram';\nimport { Messenger, MessengerEvents } from '@ntg/utils/dist/messenger';\nimport { TILE_CHANNEL_IMAGE_HEIGHT, TILE_CHANNEL_IMAGE_WIDTH } from '../../../helpers/ui/constants';\nimport { TileConfig, TileContentImageKind, TileOnFocus } from '../../../libs/netgemLibrary/v8/types/WidgetConfig';\nimport { channelHasStartover, getChannelImageId, getChannelName } from '../../../helpers/channel/helper';\nimport { extractDistributorId, getVodStatusFromLocations } from '../../../helpers/videofutur/metadata';\nimport { getItemContentType, getItemType } from '../../../libs/netgemLibrary/v8/helpers/Item';\nimport { getTileCaption, getTileHoverContent } from '../../../helpers/ui/section/tile';\nimport { getTimeText, getWatchingStatus, renderProgramTitle, renderSeriesTitle } from './helper';\nimport { logError, showDebug } from '../../../helpers/debug/debug';\nimport sendV8MetadataLocationRequest, { getVodLocations } from '../../../redux/netgemApi/actions/v8/metadataLocation';\nimport AccurateTimestamp from '../../../helpers/dateTime/AccurateTimestamp';\nimport type { CombinedReducers } from '../../../redux/reducers';\nimport type { Dispatch } from '../../../redux/types/types';\nimport ItemDecoration from './ItemDecoration';\nimport ItemOverlay from './ItemOverlay';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport { MILLISECONDS_PER_HOUR } from '../../../helpers/dateTime/Format';\nimport type { NETGEM_API_V8_PURCHASE_INFO } from '../../../libs/netgemLibrary/v8/types/PurchaseInfo';\nimport type { NETGEM_API_V8_REQUEST_RESPONSE } from '../../../libs/netgemLibrary/v8/types/RequestResponse';\nimport { RegistrationType } from '../../../redux/appRegistration/types/types';\nimport TextScroller from '../../textScroller/TextScroller';\nimport { type Undefined } from '@ntg/utils/dist/types';\nimport { arePurchaseListsDifferent } from '../../../helpers/ui/section/comparisons';\nimport clsx from 'clsx';\nimport { connect } from 'react-redux';\nimport { filterCredits } from '../../../helpers/ui/metadata/Exclusion';\nimport { formatSeasonEpisodeNbr } from '../../../helpers/ui/metadata/Format';\nimport { generateDeeplink } from '../../../helpers/debug/deeplink';\nimport { getClosestEvenInteger } from '../../../helpers/maths/maths';\nimport { getDistributorId } from '../../../helpers/ui/item/distributor';\nimport { getPurchaseInfoPerAsset } from '../../../redux/netgemApi/actions/v8/purchaseInfo';\nimport { getStartOverItem } from '../../../libs/netgemLibrary/v8/helpers/CatchupForAsset';\nimport getTranslatedText from '../../../libs/netgemLibrary/v8/helpers/Lang';\nimport { hideModal } from '../../../redux/modal/actions';\nimport { ignoreIfAborted } from '../../../libs/netgemLibrary/helpers/cancellablePromise/promiseHelper';\nimport { isItemLiveOrAboutToStart } from '../../../libs/netgemLibrary/v8/helpers/Feed';\nimport sendV8LocationCatchupForAssetRequest from '../../../redux/netgemApi/actions/v8/catchupForAsset';\nimport sendV8MetadataRequest from '../../../redux/netgemApi/actions/v8/metadata';\nimport { sendV8RecordingsMetadataRequest } from '../../../redux/netgemApi/actions/v8/recordings';\n\nconst InitialState = Object.freeze({\n authority: undefined,\n backgroundImageDisplayIndex: 1,\n broadcastStatus: BroadcastStatus.Unknown,\n caption: new Set<TileConfig>(),\n channelImageUrl: null,\n channelName: null,\n contentType: ItemContent.Unknown,\n hoverContent: new Set<TileConfig>(),\n imageUrls: [TRANSPARENT_PIXEL, TRANSPARENT_PIXEL],\n isDebugModePlusEnabled: false,\n isFocused: false,\n previewCatchupScheduledEventId: null,\n programMetadata: null,\n programMetadataStatus: MetadataStatus.Loading,\n programTitle: '',\n purchaseInfo: null,\n seriesMetadata: null,\n seriesMetadataStatus: MetadataStatus.Loading,\n seriesTitle: '',\n startoverItem: null,\n tvLocationMetadata: null,\n vodLocationsMetadata: null,\n vodStatus: null,\n});\n\nclass Item extends React.PureComponent<CompleteItemPropType, ItemStateType> {\n abortController: AbortController;\n\n broadcastStatusRefreshTimer: TimeoutID | null;\n\n imageElement: HTMLElement | null;\n\n imageHeight: number;\n\n imageWidth: number;\n\n imageLoadTimer: TimeoutID | null;\n\n itemOverlay: React.ElementRef<any> | null;\n\n preloadedImage: ?Image;\n\n timeRefreshTimer: TimeoutID | null;\n\n // Location Id of purchased location\n viewingHistoryId: ?string;\n\n // VtiId of purchased location\n vtiId: ?number;\n\n static defaultProps: DefaultProps = {\n cardData: null,\n isDebugModePlusForced: false,\n isInExploreModal: false,\n isInLiveSection: false,\n isSwiping: false,\n onItemClick: undefined,\n };\n\n constructor(props: CompleteItemPropType) {\n super(props);\n\n this.abortController = new AbortController();\n this.broadcastStatusRefreshTimer = null;\n this.imageElement = null;\n this.imageHeight = 0;\n this.imageLoadTimer = null;\n this.imageWidth = 0;\n this.itemOverlay = null;\n this.preloadedImage = null;\n this.timeRefreshTimer = null;\n this.viewingHistoryId = null;\n this.vtiId = null;\n\n this.state = {\n ...InitialState,\n now: AccurateTimestamp.nowInSeconds(),\n };\n }\n\n componentDidMount() {\n this.update();\n }\n\n componentDidUpdate(prevProps: CompleteItemPropType, prevState: ItemStateType) {\n const { authenticationToken, isInLiveSection, item, purchaseList } = this.props;\n const { broadcastStatus, contentType } = this.state;\n const { authenticationToken: prevAuthenticationToken, item: prevItem, purchaseList: prevPurchaseList } = prevProps;\n const { broadcastStatus: prevBroadcastStatus, contentType: prevContentType } = prevState;\n const { broadcastStatusRefreshTimer } = this;\n\n if (authenticationToken !== prevAuthenticationToken) {\n this.handleTokenUpdate(authenticationToken);\n }\n\n if (item.selectedProgramId !== prevItem.selectedProgramId) {\n this.update();\n }\n\n if (contentType !== prevContentType) {\n if (!broadcastStatusRefreshTimer) {\n this.updateBroadcastStatus();\n }\n\n this.loadVodLocations();\n }\n\n if (broadcastStatus !== prevBroadcastStatus) {\n if (!isInLiveSection) {\n if (broadcastStatus === BroadcastStatus.Live) {\n // Item became live\n this.startTimeRefreshTimer();\n } else {\n // Item is not live anymore\n this.resetTimeRefreshTimer();\n }\n }\n\n if (prevBroadcastStatus === BroadcastStatus.Unknown) {\n this.loadTVLocationMetadata();\n }\n }\n\n if (arePurchaseListsDifferent(purchaseList, prevPurchaseList)) {\n this.loadVodLocations();\n }\n }\n\n componentWillUnmount() {\n const { abortController } = this;\n\n abortController.abort('Component Item will unmount');\n\n if (this.preloadedImage) {\n this.preloadedImage.src = '';\n this.preloadedImage.onload = undefined;\n this.preloadedImage = null;\n }\n\n this.resetTimeRefreshTimer();\n this.resetBroadcastStatusRefreshTimer();\n this.resetImageLoadTimer();\n }\n\n resetTimeRefreshTimer: () => void = () => {\n if (this.timeRefreshTimer) {\n clearTimeout(this.timeRefreshTimer);\n this.timeRefreshTimer = null;\n }\n };\n\n resetImageLoadTimer = () => {\n if (this.imageLoadTimer) {\n clearTimeout(this.imageLoadTimer);\n this.imageLoadTimer = null;\n }\n };\n\n resetBroadcastStatusRefreshTimer = () => {\n if (this.broadcastStatusRefreshTimer) {\n clearTimeout(this.broadcastStatusRefreshTimer);\n this.broadcastStatusRefreshTimer = null;\n }\n };\n\n startTimeRefreshTimer = () => {\n this.resetTimeRefreshTimer();\n this.timeRefreshTimer = setTimeout(this.updateTime, REFRESH_TIMEOUT);\n };\n\n startBroadcastStatusRefreshTimer = () => {\n const { broadcastStatus } = this.state;\n\n this.resetBroadcastStatusRefreshTimer();\n\n if (broadcastStatus === BroadcastStatus.Past) {\n // A past item will never change, no need to check again\n return;\n }\n\n this.broadcastStatusRefreshTimer = setTimeout(this.updateBroadcastStatus, REFRESH_TIMEOUT);\n };\n\n updateTime = () => {\n this.setState({ now: AccurateTimestamp.nowInSeconds() }, this.startTimeRefreshTimer);\n };\n\n updateBroadcastStatus = () => {\n const {\n item,\n item: { type },\n } = this.props;\n const { contentType } = this.state;\n\n // Item is an SVOD but is displayed as a catchup (e.g. Okoo)\n this.setState({ broadcastStatus: contentType === ItemContent.NetgemSVOD && type !== ItemType.Series ? BroadcastStatus.Past : getBroadcastStatus(item) }, this.startBroadcastStatusRefreshTimer);\n };\n\n handleTokenUpdate = (token: string | null) => {\n const { isInLiveSection } = this.props;\n\n if (token && isInLiveSection) {\n this.updateTime();\n this.updateBroadcastStatus();\n }\n };\n\n showDebugInfo = () => {\n const { itemOverlay, props, state } = this;\n\n showDebug('Section Item', {\n instance: this,\n instanceFields: ['broadcastStatusRefreshTimer', 'imageElement', 'imageHeight', 'imageWidth', 'imageLoadTimer', 'preloadedImage', 'timeRefreshTimer', 'viewingHistoryId', 'vtiId'],\n misc: { watchingStatus: this.localGetWatchingStatus() },\n props,\n propsFields: ['cardData', 'isInLiveSection', 'item', 'onItemClick', 'tileConfig', 'titleFilter'],\n state,\n stateFields: [\n 'authority',\n 'backgroundImageDisplayIndex',\n 'broadcastStatus',\n 'caption',\n 'channelImageUrl',\n 'contentType',\n 'hoverContent',\n 'imageUrls',\n 'isDebugModePlusEnabled',\n 'isFocused',\n 'now',\n 'previewCatchupScheduledEventId',\n 'programMetadata',\n 'programMetadataStatus',\n 'programTitle',\n 'purchaseInfo',\n 'seriesMetadata',\n 'seriesMetadataStatus',\n 'seriesTitle',\n 'startoverItem',\n 'tvLocationMetadata',\n 'vodLocationsMetadata',\n 'vodStatus',\n ],\n });\n\n itemOverlay?.showDebugInfo();\n };\n\n localGetWatchingStatus = (): number | null => {\n const { item, viewingHistory, viewingHistoryStatus } = this.props;\n const { contentType, programMetadata, seriesMetadata, vodStatus } = this.state;\n\n return getWatchingStatus(item, viewingHistory, viewingHistoryStatus, contentType, programMetadata, seriesMetadata, vodStatus);\n };\n\n getImageWidth = (): number => {\n const { imageElement, imageWidth } = this;\n\n if (imageWidth === 0 && imageElement) {\n this.imageWidth = getClosestEvenInteger(imageElement.getBoundingClientRect().width);\n }\n\n return this.imageWidth;\n };\n\n getImageHeight = (): number => {\n const { imageElement, imageHeight } = this;\n\n if (imageHeight === 0 && imageElement) {\n this.imageHeight = getClosestEvenInteger(imageElement.getBoundingClientRect().height);\n }\n\n return this.imageHeight;\n };\n\n unfocus = () => {\n this.setState({ isFocused: false });\n };\n\n update = () => {\n const {\n channels,\n isInLiveSection,\n item: {\n id,\n selectedProgramId,\n selectedLocation: { channelId },\n },\n tileConfig,\n tileConfig: { onFocus },\n } = this.props;\n const { backgroundImageDisplayIndex, imageUrls } = this.state;\n\n this.resetImageLoadTimer();\n this.resetTimeRefreshTimer();\n\n this.vtiId = null;\n\n const itemType = getItemType(id);\n const hoverContent = getTileHoverContent(tileConfig, itemType);\n const caption = getTileCaption(tileConfig, itemType);\n\n // We copy imageUrls (which is empty at startup) because we transition between previous and new image\n this.setState({\n ...InitialState,\n backgroundImageDisplayIndex,\n caption,\n channelName: null,\n hoverContent,\n imageUrls,\n });\n\n this.loadChannelImage();\n\n if (selectedProgramId.startsWith(FAKE_EPG_LIVE_PREFIX)) {\n // Live program without info (missing PTF channel)\n this.setState({ channelName: getChannelName(channels, channelId) });\n return;\n }\n\n this.loadImage();\n\n if (onFocus === TileOnFocus.Selection) {\n this.setState({\n programMetadataStatus: MetadataStatus.Loaded,\n seriesMetadataStatus: MetadataStatus.Loaded,\n });\n return;\n }\n\n this.loadProgramMetadata();\n this.loadSeriesMetadata();\n this.loadStartoverItem();\n\n if (isInLiveSection) {\n // Items in a live section will always be considered 'live', even when starting or finishing\n this.setState({ broadcastStatus: BroadcastStatus.Live });\n }\n };\n\n updateTitles = () => {\n const { programMetadata, seriesMetadata } = this.state;\n\n const seriesTitle = getTranslatedText(seriesMetadata?.titles, Localizer.language);\n const index = formatSeasonEpisodeNbr(programMetadata);\n let title = getTranslatedText(programMetadata?.titles, Localizer.language);\n if (title.toLowerCase() === seriesTitle.toLowerCase()) {\n title = '';\n }\n const programTitle = `${index ?? ''}${index && title !== '' ? ' : ' : ''}${title}`;\n\n this.setState({\n programTitle,\n seriesTitle,\n });\n };\n\n loadChannelImage = () => {\n const {\n channels,\n item: { selectedLocation },\n localGetImageUrl,\n tileConfig: { channelLogo },\n } = this.props;\n const {\n abortController: { signal },\n } = this;\n\n if (!channelLogo) {\n return;\n }\n\n const { channelId } = selectedLocation;\n const channelImageId = getChannelImageId(channels, channelId);\n\n if (!channelImageId) {\n // Universe, channel, channel group, channel without image, etc.\n return;\n }\n\n localGetImageUrl(\n {\n assetId: channelImageId,\n height: TILE_CHANNEL_IMAGE_HEIGHT,\n luminosity: Luminosity.Light,\n width: TILE_CHANNEL_IMAGE_WIDTH,\n },\n signal,\n )\n .then((channelImageUrl: string) => {\n signal.throwIfAborted();\n\n this.setState({ channelImageUrl });\n })\n .catch((error) => ignoreIfAborted(signal, error));\n };\n\n loadProgramMetadata = () => {\n const {\n isInLiveSection,\n item,\n item: { selectedProgramId, seriesId },\n localSendV8MetadataRequest,\n } = this.props;\n const {\n abortController: { signal },\n } = this;\n\n localSendV8MetadataRequest(selectedProgramId, METADATA_KIND_PROGRAM, signal)\n .then((metadata: NETGEM_API_V8_METADATA) => {\n const programMetadata = ((filterCredits(metadata): any): NETGEM_API_V8_METADATA_PROGRAM);\n const metadataSeriesId = programMetadata.episodeOf?.id;\n\n // If the program is part of a series but no series was provided, check in the metadata\n if (!seriesId && metadataSeriesId) {\n this.loadSeriesMetadata(metadataSeriesId);\n }\n\n const { authority } = programMetadata;\n\n this.setState(\n {\n authority,\n contentType: getItemContentType(item, authority),\n programMetadata,\n programMetadataStatus: MetadataStatus.Loaded,\n },\n () => {\n this.updateTitles();\n this.loadTVLocationMetadata();\n },\n );\n\n // If the program is live, start a timer to update the time display\n if (isInLiveSection) {\n this.startTimeRefreshTimer();\n }\n })\n .catch((error) => ignoreIfAborted(signal, error, () => this.setState({ programMetadataStatus: MetadataStatus.Error })));\n };\n\n loadSeriesMetadata = (metadataSeriesId?: string) => {\n const {\n item: { seriesId },\n localSendV8MetadataRequest,\n } = this.props;\n const {\n abortController: { signal },\n } = this;\n\n const id = seriesId ?? metadataSeriesId;\n\n if (!id) {\n this.setState({ seriesMetadataStatus: MetadataStatus.Loaded });\n return;\n }\n\n localSendV8MetadataRequest(id, METADATA_KIND_SERIES, signal)\n .then((metadata: NETGEM_API_V8_METADATA) => {\n const seriesMetadata = ((filterCredits(metadata): any): NETGEM_API_V8_METADATA_SERIES);\n this.setState(\n {\n seriesMetadata,\n seriesMetadataStatus: MetadataStatus.Loaded,\n },\n this.updateTitles,\n );\n })\n .catch((error) => ignoreIfAborted(signal, error, () => this.setState({ seriesMetadataStatus: MetadataStatus.Error })));\n };\n\n loadImage = async (isNewAttempt?: boolean): Promise<void> => {\n const {\n channels,\n item: {\n id,\n selectedLocation: { channelId },\n selectedProgramId,\n },\n localGetImageUrl,\n tileConfig: { contentImage, contentImageVariant: forcedVariant },\n } = this.props;\n const {\n abortController: { signal },\n imageLoadTimer,\n } = this;\n\n if (imageLoadTimer) {\n if (isNewAttempt) {\n this.imageLoadTimer = null;\n } else {\n return;\n }\n }\n\n const width = this.getImageWidth();\n const height = this.getImageHeight();\n\n if (width === 0 || height === 0) {\n // Image not ready yet\n this.imageLoadTimer = setTimeout(this.loadImage, IMAGE_LOAD_TIMEOUT, true);\n return;\n }\n\n let assetId: ?string = null;\n let theme: Undefined<ThemeType> = undefined;\n const itemType = getItemType(selectedProgramId);\n if (itemType === ItemType.Channel || contentImage === TileContentImageKind.Channel || selectedProgramId.startsWith(FAKE_EPG_LIVE_PREFIX)) {\n // Channel: Id is the channel Id if content image is 'channel' (e.g. FAST channels) and is item Id if item type is 'channel'\n assetId = getChannelImageId(channels, contentImage === TileContentImageKind.Channel || selectedProgramId.startsWith(FAKE_EPG_LIVE_PREFIX) ? channelId : id);\n theme = Theme.Dark;\n\n if (assetId === null) {\n // Channel (probably a FAST one) without image: display its name\n this.setState({ channelName: getChannelName(channels, id) });\n }\n } else if (itemType === ItemType.Program || itemType === ItemType.Series) {\n // Program or series\n assetId = contentImage === TileContentImageKind.Series ? id : selectedProgramId;\n } else if (itemType === ItemType.ChannelGroup || itemType === ItemType.Universe) {\n // Channel group or universe\n assetId = id;\n theme = Theme.Dark;\n } else {\n // Everything else (i.e. unknown types)\n assetId = id;\n }\n\n if (assetId === undefined || assetId === null) {\n return;\n }\n\n try {\n const url: string = await localGetImageUrl(\n {\n assetId,\n forcedVariant,\n height,\n theme,\n width,\n },\n signal,\n );\n\n signal.throwIfAborted();\n\n if (url !== '') {\n this.preloadedImage = new Image(width, height);\n this.preloadedImage.onload = () => this.handleImageOnLoad(signal);\n this.preloadedImage.src = url;\n } else {\n // 404 HTTP code is generally not considered as an error for images but in the particular context of a channel image in the zapper, it is\n this.setState({ channelName: getChannelName(channels, id) });\n }\n } catch (error) {\n await ignoreIfAborted(signal, error);\n\n // Channel (probably a FAST one) without image: display its name\n this.setState({ channelName: getChannelName(channels, id) });\n }\n };\n\n handleImageOnLoad = (signal: AbortSignal) => {\n const { backgroundImageDisplayIndex, imageUrls: previousImageUrls } = this.state;\n\n if (!this.preloadedImage || signal.aborted) {\n // Component unmounted while image was loading\n return;\n }\n\n this.preloadedImage.onload = undefined;\n const imageUrls = [...previousImageUrls];\n const index = (backgroundImageDisplayIndex + 1) % IMAGE_URL_COUNT;\n\n if (index === backgroundImageDisplayIndex) {\n // Already been there for this image\n return;\n }\n\n imageUrls[index] = this.preloadedImage.src;\n this.preloadedImage = null;\n\n this.setState({\n backgroundImageDisplayIndex: index,\n imageUrls,\n });\n };\n\n getImageUrl = (): string => {\n const { backgroundImageDisplayIndex, imageUrls } = this.state;\n\n return imageUrls[backgroundImageDisplayIndex];\n };\n\n loadPurchaseInfo = () => {\n const {\n item: {\n id,\n purchasable,\n selectedLocation: { channelId },\n },\n localGetPurchaseInfoPerAsset,\n } = this.props;\n const { contentType } = this.state;\n const {\n abortController: { signal },\n } = this;\n\n if ((contentType !== ItemContent.VODOrDeeplink && contentType !== ItemContent.NetgemSVOD) || !purchasable) {\n return;\n }\n\n if (channelId === undefined) {\n logError(`Channel Id is undefined for item ${id}`);\n return;\n }\n\n localGetPurchaseInfoPerAsset(id, channelId, signal)\n .then((purchaseInfo: NETGEM_API_V8_PURCHASE_INFO) => {\n signal.throwIfAborted();\n this.setState({ purchaseInfo });\n })\n .catch((error) => ignoreIfAborted(signal, error, () => this.setState({ purchaseInfo: null })));\n };\n\n loadVodLocations = () => {\n const {\n item: { locations, seriesId },\n localGetVodLocations,\n purchaseList,\n usePackPurchaseApi,\n } = this.props;\n const { contentType } = this.state;\n const {\n abortController: { signal },\n } = this;\n\n // TODO: clean up code when BO API v2 is fully supported\n if (usePackPurchaseApi) {\n this.loadPurchaseInfo();\n }\n\n if (seriesId) {\n return;\n }\n\n if ((contentType !== ItemContent.VODOrDeeplink && contentType !== ItemContent.NetgemSVOD) || !locations) {\n return;\n }\n\n localGetVodLocations(locations, signal)\n .then((vodLocationsMetadata) => {\n signal.throwIfAborted();\n\n const vodStatus = getVodStatusFromLocations(vodLocationsMetadata, purchaseList);\n const { viewingHistoryId, vtiId } = vodStatus;\n this.viewingHistoryId = viewingHistoryId;\n this.vtiId = vtiId;\n\n this.setState({\n vodLocationsMetadata,\n vodStatus,\n });\n })\n .catch((error) => ignoreIfAborted(signal, error));\n };\n\n loadStartoverItem = () => {\n const {\n channels,\n item,\n item: { locType, selectedLocation, selectedProgramId },\n localSendV8LocationCatchupForAssetRequest,\n } = this.props;\n const {\n abortController: { signal },\n } = this;\n\n if (\n locType !== NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT ||\n !selectedLocation ||\n !selectedProgramId ||\n !isItemLiveOrAboutToStart(item) ||\n !channelHasStartover(channels, selectedLocation.channelId)\n ) {\n return;\n }\n\n localSendV8LocationCatchupForAssetRequest(selectedProgramId, AccurateTimestamp.now(), MILLISECONDS_PER_HOUR, signal)\n .then((requestResponse: NETGEM_API_V8_REQUEST_RESPONSE) => {\n const startoverItem: NETGEM_API_V8_FEED_ITEM | null = getStartOverItem(item, requestResponse);\n this.setState({ startoverItem });\n })\n .catch((error) => ignoreIfAborted(signal, error, () => this.setState({ startoverItem: null })));\n };\n\n loadTVLocationMetadata = () => {\n const {\n item,\n item: {\n locType,\n selectedLocation: { id },\n },\n localSendV8MetadataLocationRequest,\n localSendV8RecordingsMetadataRequest,\n } = this.props;\n const { authority, broadcastStatus, contentType } = this.state;\n const {\n abortController: { signal },\n } = this;\n\n if (!id || contentType === ItemContent.VODOrDeeplink || contentType === ItemContent.NetgemSVOD || broadcastStatus === BroadcastStatus.Unknown) {\n return;\n }\n\n const locationStatus = getLocationStatus(item, authority);\n\n const request =\n locationStatus === WebAppHelpersLocationStatus.Recording || (locationStatus === WebAppHelpersLocationStatus.Live && locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING)\n ? localSendV8RecordingsMetadataRequest\n : localSendV8MetadataLocationRequest;\n\n request(id, signal)\n .then((requestResponse: NETGEM_API_V8_REQUEST_RESPONSE) => {\n signal.throwIfAborted();\n\n const {\n result,\n result: {\n location: { target },\n },\n } = requestResponse;\n\n this.setState({\n previewCatchupScheduledEventId: broadcastStatus === BroadcastStatus.Preview ? target : null,\n tvLocationMetadata: result,\n });\n })\n .catch((error) => ignoreIfAborted(signal, error));\n };\n\n getDistributorId = (): string | null => {\n const {\n deviceOS,\n item: {\n selectedLocation: { id },\n },\n } = this.props;\n const { programMetadata, purchaseInfo, vodLocationsMetadata } = this.state;\n\n return getDistributorId(vodLocationsMetadata, purchaseInfo, programMetadata) ?? extractDistributorId(id, deviceOS);\n };\n\n handleTileMouseOver = () => {\n const { isFocused } = this.state;\n\n if (!isFocused) {\n this.setState({ isFocused: true });\n }\n };\n\n handleTileMouseLeave = () => {\n const { isFocused } = this.state;\n\n if (isFocused) {\n this.unfocus();\n }\n };\n\n handleTileOnClick = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n const {\n cardData,\n isDebugModeEnabled,\n isInExploreModal,\n isSwiping,\n item,\n localHideModal,\n onItemClick,\n tileConfig: { type: tileType },\n } = this.props;\n const { deviceOS } = this.props;\n const { authority, contentType, isDebugModePlusEnabled: currentIsDebugModePlusEnabled, programMetadata, purchaseInfo, seriesMetadata, vodLocationsMetadata } = this.state;\n const { vtiId } = this;\n const { altKey, ctrlKey, shiftKey } = event;\n\n if (isSwiping) {\n return;\n }\n\n if (isDebugModeEnabled) {\n if (ctrlKey || altKey) {\n if (shiftKey) {\n this.setState({ isDebugModePlusEnabled: !currentIsDebugModePlusEnabled });\n } else {\n this.showDebugInfo();\n }\n return;\n } else if (shiftKey) {\n generateDeeplink({\n authority,\n contentType,\n deviceOS,\n item,\n programMetadata,\n purchaseInfo,\n seriesMetadata,\n vodLocationsMetadata,\n });\n return;\n }\n }\n\n const type = vtiId ? ExtendedItemType.VOD : ExtendedItemType.TV;\n const imageUrl = this.getImageUrl();\n\n Messenger.emit(MessengerEvents.ITEM_CLICKED, {\n cardData,\n imageUrl,\n item,\n onItemClick,\n programMetadata,\n seriesMetadata,\n tileType,\n type,\n vtiId,\n });\n\n if (isInExploreModal) {\n localHideModal();\n }\n };\n\n renderCaption = (): {| caption: React.Node, isFiltered: boolean |} => {\n const { item, titleFilter } = this.props;\n const { caption, now, programMetadataStatus, programTitle, seriesMetadataStatus, seriesTitle } = this.state;\n\n const lcFilter = titleFilter?.toLowerCase();\n if (lcFilter !== undefined && programTitle.toLowerCase().indexOf(lcFilter) === -1 && seriesTitle.toLowerCase().indexOf(lcFilter) === -1) {\n return { caption: null, isFiltered: true };\n }\n\n if (caption.size === 0) {\n // No caption at all (e.g. portrait tile)\n return { caption: null, isFiltered: false };\n }\n\n let titleElement = null;\n let subtitleElement = null;\n\n if (caption.has(TileConfig.SeriesTitle)) {\n titleElement = renderSeriesTitle(programMetadataStatus, seriesMetadataStatus, seriesTitle);\n }\n\n const timeText = getTimeText(item, now, caption);\n\n if (caption.has(TileConfig.ProgramTitle)) {\n const programTitleElement = renderProgramTitle(\n programMetadataStatus,\n seriesMetadataStatus,\n programTitle,\n titleElement ? timeText : null,\n titleElement ? 'secondLineInfo' : '',\n titleElement === null,\n );\n if (titleElement) {\n subtitleElement = programTitleElement;\n } else {\n titleElement = programTitleElement;\n }\n }\n\n if (!titleElement && !subtitleElement && !timeText) {\n return {\n caption: (\n <div className='textContainer placeholder'>\n <div className='text' />\n <div className='text secondLineInfo' />\n </div>\n ),\n isFiltered: false,\n };\n }\n\n let secondLineElt = null;\n if (subtitleElement) {\n secondLineElt = <TextScroller style={{ font: '14px var(--regular-font)', height: 'calc(var(--tile-text-height) / 2 * 1px)' }}>{subtitleElement}</TextScroller>;\n } else if (timeText) {\n secondLineElt = <div className='text secondLineInfo'>{timeText}</div>;\n }\n\n return {\n caption: (\n <div className='textContainer' onClick={this.handleTileOnClick}>\n <TextScroller style={{ font: '16px var(--semibold-font)', height: 'calc(var(--tile-text-height) / 2 * 1px)' }}>{titleElement}</TextScroller>\n {secondLineElt}\n </div>\n ),\n isFiltered: false,\n };\n };\n\n renderSelectionTile = (): React.Node => {\n const {\n item: {\n id,\n selectedLocation: { channelId },\n },\n } = this.props;\n\n const imageUrl = this.getImageUrl();\n const imageStyle = imageUrl ? { backgroundImage: `url(${imageUrl})` } : {};\n\n return (\n <div className='sectionItem'>\n <div className='selectionBorder'>\n <div\n className='tileContainer'\n data-qa-channel-id={channelId ?? id}\n onClick={this.handleTileOnClick}\n ref={(instance) => {\n this.imageElement = instance;\n }}\n style={imageStyle}\n />\n </div>\n </div>\n );\n };\n\n renderBackgroundImages = (): React.Node => {\n const { backgroundImageDisplayIndex, imageUrls } = this.state;\n\n /* eslint-disable react/no-array-index-key */\n return (\n <>\n {imageUrls.map((url, i) => (\n <img alt='' className={clsx('backgroundImage', i === backgroundImageDisplayIndex ? 'visible' : 'hidden')} key={i} src={url} />\n ))}\n </>\n );\n /* eslint-enable react/no-array-index-key */\n };\n\n renderDetailsTile = (): React.Node => {\n const {\n isDebugModeEnabled,\n isDebugModePlusForced = false,\n isInLiveSection,\n item,\n item: {\n selectedLocation: { channelId, id },\n },\n onItemClick,\n tileConfig,\n tileConfig: { onFocus },\n } = this.props;\n const {\n authority,\n broadcastStatus,\n channelImageUrl,\n channelName,\n contentType,\n hoverContent,\n isDebugModePlusEnabled,\n isFocused,\n now,\n previewCatchupScheduledEventId,\n programMetadata,\n programMetadataStatus,\n programTitle,\n purchaseInfo,\n seriesMetadata,\n seriesMetadataStatus,\n seriesTitle,\n startoverItem,\n tvLocationMetadata,\n vodLocationsMetadata,\n vodStatus,\n } = this.state;\n const { viewingHistoryId, vtiId } = this;\n\n const bgImageElements = this.renderBackgroundImages();\n\n // Information displayed below image, described by caption in tileConfig (series title, program title, date, etc.)\n const { caption, isFiltered } = this.renderCaption();\n\n if (isFiltered) {\n // User entered a something in the filter box and this item does not match it through its program or series title\n return null;\n }\n\n const distributorId = this.getDistributorId();\n\n // 2 possible states for a tile: normal or focused (i.e. hovered)\n return (\n <div className='sectionItem'>\n <div\n className={clsx('tileContainer', isFocused && 'focused')}\n data-qa-channel-id={channelId}\n data-qa-location-id={id}\n onClick={this.handleTileOnClick}\n onMouseLeave={this.handleTileMouseLeave}\n onMouseOver={this.handleTileMouseOver}\n ref={(instance) => {\n this.imageElement = instance;\n }}\n >\n {bgImageElements}\n <ItemDecoration\n broadcastStatus={broadcastStatus}\n channelImageUrl={channelImageUrl}\n contentType={contentType}\n isDebugModePlusEnabled={isDebugModePlusEnabled || isDebugModePlusForced}\n isInLiveSection={isInLiveSection}\n item={item}\n now={now}\n onFocus={onFocus}\n previewCatchupScheduledEventId={previewCatchupScheduledEventId}\n programMetadata={programMetadata}\n tvLocationMetadata={tvLocationMetadata}\n vodLocationsMetadata={vodLocationsMetadata}\n watchingStatus={this.localGetWatchingStatus()}\n />\n {isDebugModeEnabled && channelName !== null ? <div className='channelName'>{channelName}</div> : null}\n <ItemOverlay\n authority={authority}\n broadcastStatus={broadcastStatus}\n contentType={contentType}\n distributorId={distributorId}\n hoverContent={hoverContent}\n isInLiveSection={isInLiveSection}\n isVisible={isFocused}\n item={item}\n now={now}\n onClick={this.handleTileOnClick}\n onItemClick={onItemClick}\n previewCatchupScheduledEventId={previewCatchupScheduledEventId}\n programMetadata={programMetadata}\n programMetadataStatus={programMetadataStatus}\n programTitle={programTitle}\n purchaseInfo={purchaseInfo}\n ref={(instance) => {\n this.itemOverlay = instance;\n }}\n seriesMetadata={seriesMetadata}\n seriesMetadataStatus={seriesMetadataStatus}\n seriesTitle={seriesTitle}\n startoverItem={startoverItem}\n tileConfig={tileConfig}\n tvLocationMetadata={tvLocationMetadata}\n viewingHistoryId={viewingHistoryId}\n vodLocationsMetadata={vodLocationsMetadata}\n vodStatus={vodStatus}\n vtiId={vtiId}\n />\n </div>\n {caption}\n </div>\n );\n };\n\n render(): React.Node {\n const {\n item: { selectedProgramId },\n tileConfig: { onFocus },\n } = this.props;\n\n if (onFocus === TileOnFocus.Details || selectedProgramId.startsWith(FAKE_EPG_LIVE_PREFIX)) {\n // Program, series, etc.: details appear on hover\n return this.renderDetailsTile();\n }\n\n // Channel, channel group, universe, etc.: tile is selected on hover\n return this.renderSelectionTile();\n }\n}\n\nconst mapStateToProps = (state: CombinedReducers): ReduxItemReducerStateType => {\n return {\n authenticationToken: state.appRegistration.authenticationToken,\n channels: state.appConfiguration.deviceChannels,\n commercialOffers: state.appConfiguration.rightsCommercialOffers,\n defaultOnItemClick: state.ui.defaultActions ? state.ui.defaultActions.onItemClick : null,\n defaultRights: state.appConfiguration.rightsDefault,\n deviceOS: state.appConfiguration.deviceOS,\n favoriteList: state.ui.favoriteList || [],\n isDebugModeEnabled: state.appConfiguration.isDebugModeEnabled,\n isRegisteredAsGuest: state.appRegistration.registration === RegistrationType.RegisteredAsGuest,\n purchaseList: state.appRegistration.registration === RegistrationType.RegisteredAsGuest ? {} : state.ui.purchaseList,\n usePackPurchaseApi: state.appConfiguration.usePackPurchaseApi,\n userRights: state.appConfiguration.rightsUser,\n viewingHistory: state.ui.viewingHistory,\n viewingHistoryStatus: state.ui.viewingHistoryStatus,\n wishlistStatus: state.ui.wishlistStatus,\n };\n};\n\nconst mapDispatchToProps = (dispatch: Dispatch): ReduxItemDispatchToPropsType => {\n return {\n localGetImageUrl: (data: ImageUrlType, signal?: AbortSignal): Promise<any> => dispatch(getImageUrl(data, signal)),\n\n localGetPurchaseInfoPerAsset: (id: string, channelId: string, signal?: AbortSignal): Promise<any> => dispatch(getPurchaseInfoPerAsset(id, channelId, signal)),\n\n localGetVodLocations: (locations: Array<NETGEM_API_V8_ITEM_LOCATION>, signal?: AbortSignal): Promise<any> => dispatch(getVodLocations(locations, signal)),\n\n localHideModal: () => dispatch(hideModal()),\n\n localSendV8LocationCatchupForAssetRequest: (assetId: string, startDate: number, range: number, signal?: AbortSignal): Promise<any> =>\n dispatch(sendV8LocationCatchupForAssetRequest(assetId, startDate, range, undefined, signal)),\n\n localSendV8MetadataLocationRequest: (assetId: string, signal?: AbortSignal): Promise<any> => dispatch(sendV8MetadataLocationRequest(assetId, signal)),\n\n localSendV8MetadataRequest: (assetId: string, type: MetadataKind, signal?: AbortSignal): Promise<any> => dispatch(sendV8MetadataRequest(assetId, type, signal)),\n\n localSendV8RecordingsMetadataRequest: (recordId: string, signal?: AbortSignal): Promise<any> => dispatch(sendV8RecordingsMetadataRequest(recordId, signal)),\n };\n};\n\nconst ItemView: React.ComponentType<ItemPropType> = connect(mapStateToProps, mapDispatchToProps, null, { forwardRef: true })(Item);\n\nexport default ItemView;\n","/* @flow */\n\nimport './Item.css';\nimport './PlaceholderItem.css';\nimport * as React from 'react';\n\ntype PlaceholderItemPropType = {||};\n\nclass PlaceholderItemView extends React.PureComponent<PlaceholderItemPropType> {\n render(): React.Node {\n return (\n <div className='sectionItem placeholder'>\n <div className='tileContainer' />\n <div className='textContainer'>\n <div className='text' />\n <div className='text secondLineInfo' />\n </div>\n </div>\n );\n }\n}\n\nexport default PlaceholderItemView;\n","/* @flow */\n\nimport './SortAndFilter.css';\nimport * as React from 'react';\nimport { PictoArrowDown, PictoArrowUp } from '@ntg/components/dist/pictos/Element';\nimport { type SortAndFilterType, SortDirection, SortKind } from './type';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport clsx from 'clsx';\n\nconst availableSorts = [SortKind.Default, SortKind.Chronological];\n\n// eslint-disable-next-line consistent-return\nconst getSortName = (kind: SortKind): string => {\n switch (kind) {\n case SortKind.Default:\n return Localizer.localize('grid.sort_and_filter.kind.default');\n case SortKind.Chronological:\n return Localizer.localize('grid.sort_and_filter.kind.date');\n\n // No default\n }\n};\n\ntype SortAndFilterPropType = {|\n +updateSortAndFilter: (sortAndFilter: SortAndFilterType) => void,\n|};\n\nconst SortAndFilter = ({ updateSortAndFilter }: SortAndFilterPropType): React.Node => {\n const [sortKind, setSortKind] = React.useState(SortKind.Default);\n const [sortDirection, setSortDirection] = React.useState(SortDirection.Ascendant);\n const [filter, setFilter] = React.useState('');\n\n React.useEffect(() => {\n updateSortAndFilter({\n direction: sortDirection,\n filter,\n kind: sortKind,\n });\n }, [filter, sortDirection, sortKind, updateSortAndFilter]);\n\n const handleFilterOnChange = React.useCallback((event: SyntheticInputEvent<HTMLInputElement>) => {\n setFilter(event.currentTarget.value);\n }, []);\n\n const handleSortOnClick = React.useCallback(\n (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => {\n const kind = SortKind.cast(event.currentTarget.getAttribute('data-kind'));\n if (!kind) {\n // Invalid value (shouldn't occur\n return;\n }\n\n if (kind === sortKind && kind !== SortKind.Default) {\n // Kind already selected: revert direction\n setSortDirection(sortDirection === SortDirection.Ascendant ? SortDirection.Descendant : SortDirection.Ascendant);\n } else {\n // New sort kind\n setSortKind(kind);\n }\n },\n [sortDirection, sortKind],\n );\n\n const renderDirection = (kind: SortKind): React.Node => {\n if (kind !== sortKind || kind === SortKind.Default) {\n return null;\n }\n\n return sortDirection === SortDirection.Ascendant ? <PictoArrowUp forceHoverEffect /> : <PictoArrowDown forceHoverEffect />;\n };\n\n return (\n <div className='sortAndFilter'>\n <input onChange={handleFilterOnChange} placeholder={Localizer.localize('grid.sort_and_filter.placeholder')} type='text' value={filter} />\n {availableSorts.map((kind) => (\n <button className={clsx(sortKind === kind && 'selected')} data-kind={(kind: string)} key={(kind: string)} onClick={handleSortOnClick} type='button'>\n {getSortName(kind)} {renderDirection(kind)}\n </button>\n ))}\n </div>\n );\n};\n\nexport default SortAndFilter;\n","import * as React from \"react\";\n\nexport const LEFT = \"Left\";\nexport const RIGHT = \"Right\";\nexport const UP = \"Up\";\nexport const DOWN = \"Down\";\nexport type HandledEvents = React.MouseEvent | TouchEvent | MouseEvent;\nexport type Vector2 = [number, number];\nexport type SwipeDirections =\n | typeof LEFT\n | typeof RIGHT\n | typeof UP\n | typeof DOWN;\nexport interface SwipeEventData {\n /**\n * Absolute displacement of swipe in x. Math.abs(deltaX);\n */\n absX: number;\n /**\n * Absolute displacement of swipe in y. Math.abs(deltaY);\n */\n absY: number;\n /**\n * Displacement of swipe in x. (current.x - initial.x)\n */\n deltaX: number;\n /**\n * Displacement of swipe in y. (current.y - initial.y)\n */\n deltaY: number;\n /**\n * Direction of swipe - Left | Right | Up | Down\n */\n dir: SwipeDirections;\n /**\n * Source event.\n */\n event: HandledEvents;\n /**\n * True for the first event of a tracked swipe.\n */\n first: boolean;\n /**\n * Location where swipe started - [x, y].\n */\n initial: Vector2;\n /**\n * \"Absolute velocity\" (speed) - √(absX^2 + absY^2) / time\n */\n velocity: number;\n /**\n * Velocity per axis - [ deltaX/time, deltaY/time ]\n */\n vxvy: Vector2;\n}\n\nexport type SwipeCallback = (eventData: SwipeEventData) => void;\nexport type TapCallback = ({ event }: { event: HandledEvents }) => void;\n\nexport type SwipeableDirectionCallbacks = {\n /**\n * Called after a DOWN swipe\n */\n onSwipedDown: SwipeCallback;\n /**\n * Called after a LEFT swipe\n */\n onSwipedLeft: SwipeCallback;\n /**\n * Called after a RIGHT swipe\n */\n onSwipedRight: SwipeCallback;\n /**\n * Called after a UP swipe\n */\n onSwipedUp: SwipeCallback;\n};\n\nexport type SwipeableCallbacks = SwipeableDirectionCallbacks & {\n /**\n * Called at start of a tracked swipe.\n */\n onSwipeStart: SwipeCallback;\n /**\n * Called after any swipe.\n */\n onSwiped: SwipeCallback;\n /**\n * Called for each move event during a tracked swipe.\n */\n onSwiping: SwipeCallback;\n /**\n * Called after a tap. A touch under the min distance, `delta`.\n */\n onTap: TapCallback;\n /**\n * Called for `touchstart` and `mousedown`.\n */\n onTouchStartOrOnMouseDown: TapCallback;\n /**\n * Called for `touchend` and `mouseup`.\n */\n onTouchEndOrOnMouseUp: TapCallback;\n};\n\n// Configuration Options\nexport type ConfigurationOptionDelta =\n | number\n | { [key in Lowercase<SwipeDirections>]?: number };\n\nexport interface ConfigurationOptions {\n /**\n * Min distance(px) before a swipe starts. **Default**: `10`\n */\n delta: ConfigurationOptionDelta;\n /**\n * Prevents scroll during swipe in most cases. **Default**: `false`\n */\n preventScrollOnSwipe: boolean;\n /**\n * Set a rotation angle. **Default**: `0`\n */\n rotationAngle: number;\n /**\n * Track mouse input. **Default**: `false`\n */\n trackMouse: boolean;\n /**\n * Track touch input. **Default**: `true`\n */\n trackTouch: boolean;\n /**\n * Allowable duration of a swipe (ms). **Default**: `Infinity`\n */\n swipeDuration: number;\n /**\n * Options for touch event listeners\n */\n touchEventOptions: { passive: boolean };\n}\n\nexport type SwipeableProps = Partial<SwipeableCallbacks & ConfigurationOptions>;\n\nexport type SwipeablePropsWithDefaultOptions = Partial<SwipeableCallbacks> &\n ConfigurationOptions;\n\nexport interface SwipeableHandlers {\n ref(element: HTMLElement | null): void;\n onMouseDown?(event: React.MouseEvent): void;\n}\n\nexport type SwipeableState = {\n cleanUpTouch?: () => void;\n el?: HTMLElement;\n eventData?: SwipeEventData;\n first: boolean;\n initial: Vector2;\n start: number;\n swiping: boolean;\n xy: Vector2;\n};\n\nexport type StateSetter = (\n state: SwipeableState,\n props: SwipeablePropsWithDefaultOptions\n) => SwipeableState;\nexport type Setter = (stateSetter: StateSetter) => void;\nexport type AttachTouch = (\n el: HTMLElement,\n props: SwipeablePropsWithDefaultOptions\n) => () => void;\n","/* global document */\nimport * as React from \"react\";\nimport {\n AttachTouch,\n SwipeDirections,\n DOWN,\n SwipeEventData,\n HandledEvents,\n LEFT,\n RIGHT,\n Setter,\n ConfigurationOptions,\n SwipeableDirectionCallbacks,\n SwipeableHandlers,\n SwipeableProps,\n SwipeablePropsWithDefaultOptions,\n SwipeableState,\n SwipeCallback,\n TapCallback,\n UP,\n Vector2,\n} from \"./types\";\n\nexport {\n LEFT,\n RIGHT,\n UP,\n DOWN,\n SwipeDirections,\n SwipeEventData,\n SwipeableDirectionCallbacks,\n SwipeCallback,\n TapCallback,\n SwipeableHandlers,\n SwipeableProps,\n Vector2,\n};\n\nconst defaultProps: ConfigurationOptions = {\n delta: 10,\n preventScrollOnSwipe: false,\n rotationAngle: 0,\n trackMouse: false,\n trackTouch: true,\n swipeDuration: Infinity,\n touchEventOptions: { passive: true },\n};\nconst initialState: SwipeableState = {\n first: true,\n initial: [0, 0],\n start: 0,\n swiping: false,\n xy: [0, 0],\n};\nconst mouseMove = \"mousemove\";\nconst mouseUp = \"mouseup\";\nconst touchEnd = \"touchend\";\nconst touchMove = \"touchmove\";\nconst touchStart = \"touchstart\";\n\nfunction getDirection(\n absX: number,\n absY: number,\n deltaX: number,\n deltaY: number\n): SwipeDirections {\n if (absX > absY) {\n if (deltaX > 0) {\n return RIGHT;\n }\n return LEFT;\n } else if (deltaY > 0) {\n return DOWN;\n }\n return UP;\n}\n\nfunction rotateXYByAngle(pos: Vector2, angle: number): Vector2 {\n if (angle === 0) return pos;\n const angleInRadians = (Math.PI / 180) * angle;\n const x =\n pos[0] * Math.cos(angleInRadians) + pos[1] * Math.sin(angleInRadians);\n const y =\n pos[1] * Math.cos(angleInRadians) - pos[0] * Math.sin(angleInRadians);\n return [x, y];\n}\n\nfunction getHandlers(\n set: Setter,\n handlerProps: { trackMouse: boolean | undefined }\n): [\n {\n ref: (element: HTMLElement | null) => void;\n onMouseDown?: (event: React.MouseEvent) => void;\n },\n AttachTouch\n] {\n const onStart = (event: HandledEvents) => {\n const isTouch = \"touches\" in event;\n // if more than a single touch don't track, for now...\n if (isTouch && event.touches.length > 1) return;\n\n set((state, props) => {\n // setup mouse listeners on document to track swipe since swipe can leave container\n if (props.trackMouse && !isTouch) {\n document.addEventListener(mouseMove, onMove);\n document.addEventListener(mouseUp, onUp);\n }\n const { clientX, clientY } = isTouch ? event.touches[0] : event;\n const xy = rotateXYByAngle([clientX, clientY], props.rotationAngle);\n\n props.onTouchStartOrOnMouseDown &&\n props.onTouchStartOrOnMouseDown({ event });\n\n return {\n ...state,\n ...initialState,\n initial: xy.slice() as Vector2,\n xy,\n start: event.timeStamp || 0,\n };\n });\n };\n\n const onMove = (event: HandledEvents) => {\n set((state, props) => {\n const isTouch = \"touches\" in event;\n // Discount a swipe if additional touches are present after\n // a swipe has started.\n if (isTouch && event.touches.length > 1) {\n return state;\n }\n\n // if swipe has exceeded duration stop tracking\n if (event.timeStamp - state.start > props.swipeDuration) {\n return state.swiping ? { ...state, swiping: false } : state;\n }\n\n const { clientX, clientY } = isTouch ? event.touches[0] : event;\n const [x, y] = rotateXYByAngle([clientX, clientY], props.rotationAngle);\n const deltaX = x - state.xy[0];\n const deltaY = y - state.xy[1];\n const absX = Math.abs(deltaX);\n const absY = Math.abs(deltaY);\n const time = (event.timeStamp || 0) - state.start;\n const velocity = Math.sqrt(absX * absX + absY * absY) / (time || 1);\n const vxvy: Vector2 = [deltaX / (time || 1), deltaY / (time || 1)];\n\n const dir = getDirection(absX, absY, deltaX, deltaY);\n\n // if swipe is under delta and we have not started to track a swipe: skip update\n const delta =\n typeof props.delta === \"number\"\n ? props.delta\n : props.delta[dir.toLowerCase() as Lowercase<SwipeDirections>] ||\n defaultProps.delta;\n if (absX < delta && absY < delta && !state.swiping) return state;\n\n const eventData = {\n absX,\n absY,\n deltaX,\n deltaY,\n dir,\n event,\n first: state.first,\n initial: state.initial,\n velocity,\n vxvy,\n };\n\n // call onSwipeStart if present and is first swipe event\n eventData.first && props.onSwipeStart && props.onSwipeStart(eventData);\n\n // call onSwiping if present\n props.onSwiping && props.onSwiping(eventData);\n\n // track if a swipe is cancelable (handler for swiping or swiped(dir) exists)\n // so we can call preventDefault if needed\n let cancelablePageSwipe = false;\n if (\n props.onSwiping ||\n props.onSwiped ||\n props[`onSwiped${dir}` as keyof SwipeableDirectionCallbacks]\n ) {\n cancelablePageSwipe = true;\n }\n\n if (\n cancelablePageSwipe &&\n props.preventScrollOnSwipe &&\n props.trackTouch &&\n event.cancelable\n ) {\n event.preventDefault();\n }\n\n return {\n ...state,\n // first is now always false\n first: false,\n eventData,\n swiping: true,\n };\n });\n };\n\n const onEnd = (event: HandledEvents) => {\n set((state, props) => {\n let eventData: SwipeEventData | undefined;\n if (state.swiping && state.eventData) {\n // if swipe is less than duration fire swiped callbacks\n if (event.timeStamp - state.start < props.swipeDuration) {\n eventData = { ...state.eventData, event };\n props.onSwiped && props.onSwiped(eventData);\n\n const onSwipedDir =\n props[\n `onSwiped${eventData.dir}` as keyof SwipeableDirectionCallbacks\n ];\n onSwipedDir && onSwipedDir(eventData);\n }\n } else {\n props.onTap && props.onTap({ event });\n }\n\n props.onTouchEndOrOnMouseUp && props.onTouchEndOrOnMouseUp({ event });\n\n return { ...state, ...initialState, eventData };\n });\n };\n\n const cleanUpMouse = () => {\n // safe to just call removeEventListener\n document.removeEventListener(mouseMove, onMove);\n document.removeEventListener(mouseUp, onUp);\n };\n\n const onUp = (e: HandledEvents) => {\n cleanUpMouse();\n onEnd(e);\n };\n\n /**\n * The value of passive on touchMove depends on `preventScrollOnSwipe`:\n * - true => { passive: false }\n * - false => { passive: true } // Default\n *\n * NOTE: When preventScrollOnSwipe is true, we attempt to call preventDefault to prevent scroll.\n *\n * props.touchEventOptions can also be set for all touch event listeners,\n * but for `touchmove` specifically when `preventScrollOnSwipe` it will\n * supersede and force passive to false.\n *\n */\n const attachTouch: AttachTouch = (el, props) => {\n let cleanup = () => {};\n if (el && el.addEventListener) {\n const baseOptions = {\n ...defaultProps.touchEventOptions,\n ...props.touchEventOptions,\n };\n // attach touch event listeners and handlers\n const tls: [\n typeof touchStart | typeof touchMove | typeof touchEnd,\n (e: HandledEvents) => void,\n { passive: boolean }\n ][] = [\n [touchStart, onStart, baseOptions],\n // preventScrollOnSwipe option supersedes touchEventOptions.passive\n [\n touchMove,\n onMove,\n {\n ...baseOptions,\n ...(props.preventScrollOnSwipe ? { passive: false } : {}),\n },\n ],\n [touchEnd, onEnd, baseOptions],\n ];\n tls.forEach(([e, h, o]) => el.addEventListener(e, h, o));\n // return properly scoped cleanup method for removing listeners, options not required\n cleanup = () => tls.forEach(([e, h]) => el.removeEventListener(e, h));\n }\n return cleanup;\n };\n\n const onRef = (el: HTMLElement | null) => {\n // \"inline\" ref functions are called twice on render, once with null then again with DOM element\n // ignore null here\n if (el === null) return;\n set((state, props) => {\n // if the same DOM el as previous just return state\n if (state.el === el) return state;\n\n const addState: { cleanUpTouch?: () => void } = {};\n // if new DOM el clean up old DOM and reset cleanUpTouch\n if (state.el && state.el !== el && state.cleanUpTouch) {\n state.cleanUpTouch();\n addState.cleanUpTouch = void 0;\n }\n // only attach if we want to track touch\n if (props.trackTouch && el) {\n addState.cleanUpTouch = attachTouch(el, props);\n }\n\n // store event attached DOM el for comparison, clean up, and re-attachment\n return { ...state, el, ...addState };\n });\n };\n\n // set ref callback to attach touch event listeners\n const output: { ref: typeof onRef; onMouseDown?: typeof onStart } = {\n ref: onRef,\n };\n\n // if track mouse attach mouse down listener\n if (handlerProps.trackMouse) {\n output.onMouseDown = onStart;\n }\n\n return [output, attachTouch];\n}\n\nfunction updateTransientState(\n state: SwipeableState,\n props: SwipeablePropsWithDefaultOptions,\n previousProps: SwipeablePropsWithDefaultOptions,\n attachTouch: AttachTouch\n) {\n // if trackTouch is off or there is no el, then remove handlers if necessary and exit\n if (!props.trackTouch || !state.el) {\n if (state.cleanUpTouch) {\n state.cleanUpTouch();\n }\n\n return {\n ...state,\n cleanUpTouch: undefined,\n };\n }\n\n // trackTouch is on, so if there are no handlers attached, attach them and exit\n if (!state.cleanUpTouch) {\n return {\n ...state,\n cleanUpTouch: attachTouch(state.el, props),\n };\n }\n\n // trackTouch is on and handlers are already attached, so if preventScrollOnSwipe changes value,\n // remove and reattach handlers (this is required to update the passive option when attaching\n // the handlers)\n if (\n props.preventScrollOnSwipe !== previousProps.preventScrollOnSwipe ||\n props.touchEventOptions.passive !== previousProps.touchEventOptions.passive\n ) {\n state.cleanUpTouch();\n\n return {\n ...state,\n cleanUpTouch: attachTouch(state.el, props),\n };\n }\n\n return state;\n}\n\nexport function useSwipeable(options: SwipeableProps): SwipeableHandlers {\n const { trackMouse } = options;\n const transientState = React.useRef({ ...initialState });\n const transientProps = React.useRef<SwipeablePropsWithDefaultOptions>({\n ...defaultProps,\n });\n\n // track previous rendered props\n const previousProps = React.useRef<SwipeablePropsWithDefaultOptions>({\n ...transientProps.current,\n });\n previousProps.current = { ...transientProps.current };\n\n // update current render props & defaults\n transientProps.current = {\n ...defaultProps,\n ...options,\n };\n // Force defaults for config properties\n let defaultKey: keyof ConfigurationOptions;\n for (defaultKey in defaultProps) {\n if (transientProps.current[defaultKey] === void 0) {\n (transientProps.current[defaultKey] as any) = defaultProps[defaultKey];\n }\n }\n\n const [handlers, attachTouch] = React.useMemo(\n () =>\n getHandlers(\n (stateSetter) =>\n (transientState.current = stateSetter(\n transientState.current,\n transientProps.current\n )),\n { trackMouse }\n ),\n [trackMouse]\n );\n\n transientState.current = updateTransientState(\n transientState.current,\n transientProps.current,\n previousProps.current,\n attachTouch\n );\n\n return handlers;\n}\n","/* @flow */\n\nimport * as React from 'react';\nimport { useSwipeable } from 'react-swipeable';\n\ntype SwipeablePropType = {\n +children: React.Node,\n};\n\nconst Swipeable: React.ComponentType<SwipeablePropType> = ({ children, ...props }: SwipeablePropType) => {\n const handlers = useSwipeable(props);\n\n /* eslint-disable react/jsx-props-no-spreading */\n return (\n <div className='swipeable' {...handlers}>\n {children}\n </div>\n );\n /* eslint-enable react/jsx-props-no-spreading */\n};\n\nexport default Swipeable;\n","/* @flow */\n\nimport type { NETGEM_API_VIEWINGHISTORY, NETGEM_API_VIEWINGHISTORY_ITEM, VIEWING_HISTORY_TYPE } from '../../libs/netgemLibrary/v8/types/ViewingHistory';\nimport { LoadableStatus } from '../loadable/loadable';\nimport { getHashFromDate } from '../request/cache';\n\nconst getTVItem: (i: NETGEM_API_VIEWINGHISTORY_ITEM) => boolean = (i) => i.id.indexOf('://netgem/') > -1;\n\nclass ViewingHistoryCache {\n static items: VIEWING_HISTORY_TYPE = [];\n\n static hashCode: string | null = null;\n\n // $FlowFixMe: Flow does not support symbols yet\n get [Symbol.toStringTag]() {\n return 'ViewingHistoryCache';\n }\n\n static checkGet: (newViewingHistory: NETGEM_API_VIEWINGHISTORY, status: LoadableStatus, ordered?: boolean) => VIEWING_HISTORY_TYPE = (newViewingHistory, status, ordered = false) => {\n if (status !== LoadableStatus.Loaded) {\n // Not loaded yet\n return [];\n }\n\n const items = ((Object.values(newViewingHistory): any): VIEWING_HISTORY_TYPE);\n const newHashCode = getHashFromDate(items);\n\n if (newHashCode !== ViewingHistoryCache.hashCode) {\n // Cache items\n ViewingHistoryCache.items = items.filter(getTVItem);\n if (ordered) {\n ViewingHistoryCache.items.sort((a, b) => b.date.localeCompare(a.date));\n }\n\n ViewingHistoryCache.hashCode = newHashCode;\n }\n\n return ViewingHistoryCache.items;\n };\n}\n\nexport default ViewingHistoryCache;\n","/* @flow */\n\nimport type { NETGEM_API_V8_FEED } from '../../../libs/netgemLibrary/v8/types/FeedItem';\nimport type { SECTION_PAGINATION } from './types';\n\nconst createSectionPagination: (feed: NETGEM_API_V8_FEED, itemWidth: number, itemCountPerPage: number, previousPageIndex: number, previousItemCountPerPage?: number) => SECTION_PAGINATION = (\n feed,\n itemWidth,\n itemCountPerPage,\n previousPageIndex,\n previousItemCountPerPage,\n) => {\n const { length: itemCount } = feed;\n\n if (itemCount === 0) {\n return {\n maxPageIndex: -1,\n pageIndex: 0,\n sliderPositions: [],\n };\n }\n\n const maxPageIndex = Math.ceil(itemCount / itemCountPerPage) - 1;\n const sliderPositions = [];\n\n for (let i: number = 0; i <= maxPageIndex; i++) {\n sliderPositions.push(-(i * itemCountPerPage * itemWidth));\n }\n\n // Compute new pageIndex so that the same tile remains as the first entirely visible one (if possible)\n const mostLeftItemIndex = previousItemCountPerPage !== undefined ? previousPageIndex * previousItemCountPerPage : 0;\n const desiredPageIndex = Math.floor(mostLeftItemIndex / itemCountPerPage);\n const pageIndex = Math.min(desiredPageIndex, maxPageIndex);\n\n return {\n maxPageIndex,\n pageIndex,\n sliderPositions,\n };\n};\n\nexport { createSectionPagination };\n","/* @flow */\n\nimport type { NetgemApiEmitterType, RequestResponseMethodDefinitionType } from '../emitter';\nimport type { CombinedReducers } from '../../../reducers';\nimport type { Dispatch } from '../../../types/types';\nimport { REDUX_MSG_REQUEST_GENERIC } from '../../constants/';\nimport { createCustomNetworkErrorFromKey } from '../../../../libs/netgemLibrary/helpers/CreateCustomNetworkError';\nimport { generateApiUrl } from '../helpers/api';\n\nconst sendV8LocationEpgForAssetRequest: (assetId: string, startDate: number, range: number, channelIds?: Array<string>, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (assetId, startDate, range, channelIds, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const state = getState();\n const {\n netgemApi: { locationEpgForAssetUrl },\n } = state;\n\n if (!locationEpgForAssetUrl) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definition', { urlDef: 'locationEpgForAssetUrl' }));\n }\n\n const { authent, method } = locationEpgForAssetUrl;\n const channelList = channelIds ? JSON.stringify(channelIds) : undefined;\n\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_GENERIC, {\n authent,\n method,\n signal,\n uri: generateApiUrl(\n locationEpgForAssetUrl,\n {\n assetId,\n channelList,\n endDate: startDate + range,\n range,\n startDate,\n },\n state\n ),\n });\n };\n\nexport default sendV8LocationEpgForAssetRequest;\n","/* @flow */\n\nimport type { NetgemApiEmitterType, RequestResponseMethodDefinitionType } from '../emitter';\nimport type { CombinedReducers } from '../../../reducers';\nimport type { Dispatch } from '../../../types/types';\nimport { REDUX_MSG_REQUEST_GENERIC } from '../../constants/';\nimport { createCustomNetworkErrorFromKey } from '../../../../libs/netgemLibrary/helpers/CreateCustomNetworkError';\nimport { generateApiUrl } from '../helpers/api';\n\nconst sendV8LocationVodForAssetRequest: (assetId: string, startDate: number, range: number, channelIds?: Array<string>, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (assetId, startDate, range, channelIds, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const state = getState();\n const {\n netgemApi: { locationVodForAssetUrl },\n } = state;\n\n if (!locationVodForAssetUrl) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definition', { urlDef: 'locationVodForAssetUrl' }));\n }\n\n const { authent, method } = locationVodForAssetUrl;\n const channelList = channelIds ? JSON.stringify(channelIds) : undefined;\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_GENERIC, {\n authent,\n method,\n signal,\n uri: generateApiUrl(\n locationVodForAssetUrl,\n {\n assetId,\n channelList,\n endDate: startDate + range,\n range,\n startDate,\n },\n state\n ),\n });\n };\n\nexport default sendV8LocationVodForAssetRequest;\n","/* @flow */\n\nimport type { NetgemApiEmitterType, RequestResponseMethodDefinitionType } from '../emitter';\nimport type { CombinedReducers } from '../../../reducers';\nimport type { Dispatch } from '../../../types/types';\nimport { type NETGEM_API_V8_SECTION } from '../../../../libs/netgemLibrary/v8/types/Section';\nimport { REDUX_MSG_REQUEST_SECTION_FEED } from '../../constants/';\n\nconst sendV8SectionFeedRequest: (section: NETGEM_API_V8_SECTION, searchString: ?string, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (section, searchString, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> =>\n NetgemApiEmitter.emit(REDUX_MSG_REQUEST_SECTION_FEED, {\n searchString,\n section,\n signal,\n state: getState(),\n });\n\nexport default sendV8SectionFeedRequest;\n","/* @flow */\n\nimport './Section.css';\nimport * as React from 'react';\nimport { type AllSettledPromises, SettledPromiseFulfilled } from '../../../helpers/jsHelpers/promise';\nimport type { BasicFunction, KeyValuePair } from '@ntg/utils/dist/types';\nimport {\n type CompleteSectionPropType,\n type DefaultProps,\n type LocalPlayedItemType,\n MAX_Z_INDEX,\n PAGE_DISPLAY_COUNT,\n type ReduxSectionDispatchToPropsType,\n type ReduxSectionReducerStateType,\n SWIPE,\n type SectionPropType,\n type SectionStateType,\n StandardSectionType,\n} from './SectionConstsAndTypes';\nimport { EPG, getTileWidthPlusMargin } from '../../../helpers/ui/constants';\nimport { LocalFeed, type NETGEM_API_V8_SECTION } from '../../../libs/netgemLibrary/v8/types/Section';\nimport { Messenger, MessengerEvents } from '@ntg/utils/dist/messenger';\nimport { type NETGEM_API_V8_FEED, type NETGEM_API_V8_FEED_RAW_ITEM, type NETGEM_API_V8_ITEM_LOCATION_TYPE } from '../../../libs/netgemLibrary/v8/types/FeedItem';\nimport type { NETGEM_API_VIEWINGHISTORY_LOCATION, NETGEM_API_VIEWINGHISTORY_PLAYED_ITEMS, VIEWING_HISTORY_TYPE } from '../../../libs/netgemLibrary/v8/types/ViewingHistory';\nimport { PictoArrowLeft, PictoArrowRight } from '@ntg/components/dist/pictos/Element';\nimport { SectionDisplayType, type SwipeEventData } from '../../../helpers/ui/section/types';\nimport { type SortAndFilterType, SortDirection, SortKind } from '../sortAndFilter/type';\nimport {\n checkSources,\n compareDate,\n disableHotKeys,\n enableHotKeys,\n getLocalPath,\n getPageStepFromKeyboardModifiers,\n getPlaceholderItemCount,\n getTimestampFromRange,\n getValuesFromQueryString,\n getViewingHistoryPromiseGenerator,\n getWishlistPromiseGenerator,\n isItemTypeMatching,\n locationTypeToQueryType,\n queryTypeToLocationType,\n showDebugInfo,\n} from './helper';\nimport { filterFeed, filterViewingHistoryFeed, mergeFeeds, setFeedScore } from '../../../libs/netgemLibrary/v8/helpers/Feed';\nimport { getTileConfig, getTileTypeClass } from '../../../helpers/ui/section/tile';\nimport { resetGridSectionId, updateGridSectionId, updateSectionPageIndex } from '../../../redux/ui/actions';\nimport AccurateTimestamp from '../../../helpers/dateTime/AccurateTimestamp';\nimport ButtonBack from '../../buttons/ButtonBack';\nimport type { CombinedReducers } from '../../../redux/reducers';\nimport type { Dispatch } from '../../../redux/types/types';\nimport EpgManager from '../../../helpers/epg/epgManager';\nimport { FeedProviderKind } from '../../../libs/netgemLibrary/v8/types/Feed';\nimport Item from '../item/Item';\nimport { LoadableStatus } from '../../../helpers/loadable/loadable';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport type { NETGEM_API_V8_AGGREGATION_FEED } from '../../../libs/netgemLibrary/v8/types/AggregationFeed';\nimport type { NETGEM_API_V8_NTG_VIDEO_FEED } from '../../../libs/netgemLibrary/v8/types/NtgVideoFeed';\nimport PlaceholderItem from '../item/PlaceholderItem';\nimport { RegistrationType } from '../../../redux/appRegistration/types/types';\nimport SortAndFilter from '../sortAndFilter/SortAndFilter';\nimport Swipeable from '../../swipeable/swipeable';\nimport { type TILE_CONFIG_TYPE } from '../../../libs/netgemLibrary/v8/types/WidgetConfig';\nimport ViewingHistoryCache from '../../../helpers/viewingHistory/ViewingHistoryCache';\nimport { Waypoint } from 'react-waypoint';\nimport WishlistCache from '../../../helpers/wishlist/WishlistCache';\nimport { areFavoriteListsDifferent } from '../../../helpers/ui/section/comparisons';\nimport { cleanUpViewingHistory } from '../../../redux/netgemApi/actions/personalData/viewingHistory';\nimport clsx from 'clsx';\nimport { connect } from 'react-redux';\nimport { createSectionPagination } from '../../../helpers/ui/section/Pagination';\nimport { getIso8601DateInSeconds } from '../../../helpers/dateTime/Format';\nimport { getLocationType } from '../../../libs/netgemLibrary/v8/helpers/Item';\nimport { getMostRecentlyPlayedEpisode } from '../../../helpers/viewingHistory/ViewingHistory';\nimport { getSectionChannels } from '../../../helpers/channel/helper';\nimport getTranslatedText from '../../../libs/netgemLibrary/v8/helpers/Lang';\nimport { ignoreIfAborted } from '../../../libs/netgemLibrary/helpers/cancellablePromise/promiseHelper';\nimport { isItemRecordingOrScheduledRecording } from '../../../helpers/npvr/recording';\nimport { produce } from 'immer';\nimport sendV8LocationCatchupForAssetRequest from '../../../redux/netgemApi/actions/v8/catchupForAsset';\nimport sendV8LocationEpgForAssetRequest from '../../../redux/netgemApi/actions/v8/epgForAsset';\nimport sendV8LocationVodForAssetRequest from '../../../redux/netgemApi/actions/v8/vodForAsset';\nimport sendV8SectionFeedRequest from '../../../redux/netgemApi/actions/v8/feed';\n\nconst InitialState = Object.freeze({\n displayType: SectionDisplayType.Regular,\n feed: null,\n isCollapsed: false,\n isDebugModePlus: false,\n isLive: false,\n isLoading: true,\n isSwiping: false,\n itemCountPerPage: -1,\n maxPageIndex: -1,\n pageIndex: 0,\n sortAndFilter: null,\n updateDimensionsNeeded: true,\n});\n\nclass SectionView extends React.PureComponent<CompleteSectionPropType, SectionStateType> {\n abortController: AbortController;\n\n isVisible: boolean;\n\n liveFeedTimer: TimeoutID | null;\n\n sectionChannels: Set<string> | null;\n\n sectionName: string;\n\n sectionItemWidth: number;\n\n sectionType: ?StandardSectionType;\n\n slider: HTMLElement | null;\n\n sliderPositions: Array<number>;\n\n swipeTimeout: TimeoutID | null;\n\n tileConfig: TILE_CONFIG_TYPE;\n\n static defaultProps: DefaultProps = {\n cardData: null,\n hubItem: null,\n isGridAvenue: false,\n isInExploreModal: false,\n onItemClick: undefined,\n searchString: null,\n };\n\n constructor(props: CompleteSectionPropType) {\n super(props);\n\n const {\n cardData,\n gridSectionId,\n section,\n section: { id },\n } = props;\n const tileConfig = getTileConfig(section);\n const { type } = tileConfig;\n\n this.abortController = new AbortController();\n this.isVisible = false;\n this.liveFeedTimer = null;\n this.sectionChannels = null;\n this.sectionName = id;\n this.sectionItemWidth = getTileWidthPlusMargin(type);\n this.sectionType = null;\n this.slider = null;\n this.sliderPositions = [];\n this.swipeTimeout = null;\n this.tileConfig = tileConfig;\n\n const isCollapsed = !cardData && gridSectionId !== null && id !== gridSectionId;\n\n let displayType = SectionDisplayType.Regular;\n if (isCollapsed) {\n displayType = SectionDisplayType.Collapsed;\n } else if (id === gridSectionId) {\n displayType = SectionDisplayType.Grid;\n }\n\n this.state = {\n ...InitialState,\n displayType,\n isCollapsed,\n };\n }\n\n componentDidMount() {\n const { displayType } = this.state;\n\n Messenger.on(MessengerEvents.AVENUE_RESET, this.reset);\n\n window.addEventListener('resize', this.updateDimensions, { passive: true });\n\n if (displayType === SectionDisplayType.Grid) {\n enableHotKeys(this.handleExitGridViewHotKey);\n }\n\n this.loadData();\n }\n\n componentDidUpdate(prevProps: CompleteSectionPropType, prevState: SectionStateType) {\n const {\n favoriteList,\n gridSectionId,\n searchString,\n section: { id: sectionId },\n viewingHistory,\n viewingHistoryStatus,\n wishlist,\n wishlistStatus,\n } = this.props;\n const { displayType, isCollapsed, itemCountPerPage } = this.state;\n const { favoriteList: prevFavoriteList, gridSectionId: prevGridSectionId, searchString: prevSearchString, viewingHistory: prevViewingHistory, wishlist: prevWishlist } = prevProps;\n const { displayType: prevDisplayType, isCollapsed: prevIsCollapsed, itemCountPerPage: prevItemCountPerPage } = prevState;\n const { sectionType } = this;\n\n if (gridSectionId !== prevGridSectionId) {\n this.updateIsCollapsed();\n }\n\n if (sectionId === 'wishList_vod' && areFavoriteListsDifferent(prevFavoriteList, favoriteList)) {\n this.buildRegularSection(false);\n }\n\n if (displayType !== prevDisplayType) {\n if (displayType === SectionDisplayType.Grid) {\n enableHotKeys(this.handleExitGridViewHotKey);\n } else {\n disableHotKeys(this.handleExitGridViewHotKey);\n }\n }\n\n if (isCollapsed !== prevIsCollapsed) {\n if (isCollapsed) {\n this.collapse();\n } else {\n this.show();\n }\n }\n\n if (itemCountPerPage !== prevItemCountPerPage) {\n this.createPageList(prevItemCountPerPage);\n }\n\n if (sectionType === StandardSectionType.Wishlist && wishlistStatus !== LoadableStatus.NotInitialized && wishlist !== prevWishlist) {\n this.buildWishlistSection();\n return;\n }\n\n if (sectionType === StandardSectionType.ViewingHistory && viewingHistoryStatus !== LoadableStatus.NotInitialized && viewingHistory !== prevViewingHistory) {\n this.buildViewingHistorySection();\n return;\n }\n\n if (searchString !== prevSearchString) {\n this.loadData();\n return;\n }\n\n this.componentDidUpdateFeedUpdate(prevProps, prevState);\n }\n\n componentWillUnmount() {\n const { abortController, liveFeedTimer } = this;\n\n abortController.abort('Component Section will unmount');\n\n Messenger.off(MessengerEvents.AVENUE_RESET, this.reset);\n Messenger.off(MessengerEvents.REFRESH_RECORDINGS_SECTION, this.forceRefresh);\n window.removeEventListener('resize', this.updateDimensions, { passive: true });\n disableHotKeys(this.handleExitGridViewHotKey);\n\n this.resetSwipeTimeout();\n\n // Clear timer\n if (liveFeedTimer) {\n clearTimeout(liveFeedTimer);\n }\n }\n\n componentDidUpdateFeedUpdate = (prevProps: CompleteSectionPropType, prevState: SectionStateType) => {\n const {\n avenueIndex,\n dataLoadedCallback,\n hubItem,\n section: { id },\n sectionIndex,\n } = this.props;\n const { displayType, feed, isCollapsed } = this.state;\n const { avenueIndex: prevAvenueIndex, hubItem: prevHubItem } = prevProps;\n const { displayType: prevDisplayType, feed: prevFeed } = prevState;\n\n if (avenueIndex !== prevAvenueIndex || (hubItem !== prevHubItem && !hubItem) || (!prevFeed && feed) || (feed && feed.length !== prevFeed?.length)) {\n // Section has already been built in previous avenue or sub-avenue\n dataLoadedCallback(id, sectionIndex, avenueIndex, feed?.length ?? 0);\n }\n\n if (feed?.length === 0 && displayType === SectionDisplayType.Regular && prevDisplayType === SectionDisplayType.Grid) {\n // Section has been emptied while in grid view, it must be collapsed now it changed back to regular view\n this.collapse();\n }\n\n if (feed && prevFeed !== feed) {\n if (feed.length === 0) {\n // Feed changed from non-empty to empty\n if (displayType === SectionDisplayType.Grid) {\n // First exit grid view, then collapse section\n this.exitGridView();\n } else {\n // Collapse empty section\n this.collapse();\n }\n return;\n }\n\n // Feed is not empty\n\n if (!isCollapsed) {\n this.show();\n }\n\n if (!prevFeed || prevFeed.length !== feed.length) {\n // Feed has changed: re-render everything\n this.createPageList();\n }\n }\n };\n\n updateIsCollapsed: () => void = () => {\n const {\n gridSectionId,\n section: { id },\n } = this.props;\n\n this.setState({ isCollapsed: gridSectionId !== null && id !== gridSectionId });\n };\n\n resetSwipeTimeout: () => void = () => {\n if (this.swipeTimeout) {\n clearTimeout(this.swipeTimeout);\n this.swipeTimeout = null;\n }\n };\n\n // Exit grid view\n handleExitGridViewHotKey: (event: SyntheticKeyboardEvent<HTMLElement>) => void = (event) => {\n const { displayType } = this.state;\n\n if (displayType === SectionDisplayType.Grid) {\n event.preventDefault();\n event.stopPropagation();\n this.exitGridView();\n }\n };\n\n setEmptySectionLoaded: () => void = () => {\n this.setSectionLoaded([]);\n };\n\n setSectionLoaded: (feed: NETGEM_API_V8_FEED) => void = (feed) => {\n const {\n avenueIndex,\n dataLoadedCallback,\n section: { id },\n sectionIndex,\n } = this.props;\n\n this.setState(\n produce((draft) => {\n draft.feed = feed;\n draft.isLoading = false;\n }),\n );\n\n // Notify avenue and tell it how many items were loaded\n dataLoadedCallback(id, sectionIndex, avenueIndex, feed.length ?? 0);\n };\n\n updateLiveSection: () => void = () => {\n const { hubItem, section } = this.props;\n const { sectionChannels } = this;\n\n if (sectionChannels !== null && !EpgManager.isRefreshing()) {\n const newLiveFeed = EpgManager.getLiveFeed(section, sectionChannels, hubItem);\n\n this.setState(\n produce((draft) => {\n draft.feed = newLiveFeed;\n draft.isLoading = false;\n }),\n );\n }\n\n this.liveFeedTimer = setTimeout(this.updateLiveSection, EpgManager.isRefreshing() ? EPG.IntervalLiveFeedEpgRefreshing : EPG.IntervalLiveFeedEpgReady);\n };\n\n buildWishlistSection = (): void => {\n const {\n channels,\n localSendV8LocationCatchupForAssetRequest,\n localSendV8LocationEpgForAssetRequest,\n localSendV8LocationVodForAssetRequest,\n recordingsListFeed,\n section: {\n model,\n model: { scoring: globalScoring, slice: globalSlice },\n },\n sessionId,\n wishlist,\n wishlistStatus,\n } = this.props;\n const {\n abortController: { signal },\n } = this;\n\n if (wishlistStatus === LoadableStatus.NotInitialized) {\n // Not yet retrieved from server\n return;\n }\n\n if (wishlistStatus === LoadableStatus.Error || wishlist.length === 0) {\n this.setEmptySectionLoaded();\n return;\n }\n\n // Build promises for every source\n const promises: Array<Promise<any>> = [];\n let { sources } = ((model: any): NETGEM_API_V8_AGGREGATION_FEED);\n const now = AccurateTimestamp.now();\n\n // Check if feed model is not an aggregation of sources\n sources = checkSources(sources, model);\n\n if (sources.length === 0) {\n this.setEmptySectionLoaded();\n return;\n }\n\n for (let i = 0; i < sources.length; i++) {\n const {\n [i]: { uri },\n } = sources;\n const promiseGenerator = getWishlistPromiseGenerator(\n localSendV8LocationCatchupForAssetRequest,\n localSendV8LocationEpgForAssetRequest,\n localSendV8LocationVodForAssetRequest,\n recordingsListFeed,\n uri,\n now,\n signal,\n );\n wishlist.forEach((item) => promises.push(promiseGenerator(item)));\n }\n\n // Wait for all promises to resolve\n Promise.allSettled(promises).then((results: AllSettledPromises) => {\n if (signal.aborted || sources === undefined) {\n return;\n }\n\n const { length: itemCount } = wishlist;\n\n const feedArray = [];\n for (let i = 0; i < sources.length; i++) {\n const {\n [i]: { filter, scoring, slice, uri },\n } = sources;\n const startIndex = i * itemCount;\n const endIndex = startIndex + itemCount;\n const { q: expectedType } = getValuesFromQueryString(uri, ['q']);\n\n const sourceFeed = [];\n const addToSourceFeed = (item: NETGEM_API_V8_FEED_RAW_ITEM) => {\n if (isItemTypeMatching(item, expectedType)) {\n sourceFeed.push(item);\n }\n };\n\n for (let j = startIndex; j < endIndex; ++j) {\n const {\n [j]: { status, value },\n } = results;\n\n if (status === SettledPromiseFulfilled) {\n value?.result?.feed?.forEach(addToSourceFeed);\n }\n }\n\n if (sourceFeed.length > 0) {\n let filteredFeed: NETGEM_API_V8_FEED = filterFeed(sourceFeed, channels, filter, slice);\n if (scoring) {\n filteredFeed = setFeedScore(filteredFeed, scoring, { sessionId });\n }\n feedArray.push(filteredFeed);\n }\n }\n\n this.setSectionLoaded(mergeFeeds(feedArray, globalScoring, { sessionId }, globalSlice));\n });\n };\n\n parseViewingHistory: (viewingHistory: VIEWING_HISTORY_TYPE) => { playedItemIds: KeyValuePair<Set<string>>, playedItemsMap: KeyValuePair<LocalPlayedItemType>, playedSeries: Set<string> } = (\n viewingHistory,\n ) => {\n const playedItemIds: KeyValuePair<Set<string>> = {};\n const playedItemsMap: KeyValuePair<LocalPlayedItemType> = {};\n const playedSeries: Set<string> = new Set();\n\n viewingHistory.forEach((item) => {\n const { episodes, id, playeditems } = item;\n let itemsToAdd: NETGEM_API_VIEWINGHISTORY_PLAYED_ITEMS | null = null;\n\n if (episodes) {\n // Series\n playedSeries.add(id);\n\n const mostRecentlyPlayedEpisode = getMostRecentlyPlayedEpisode(episodes);\n const { playeditems: items } = mostRecentlyPlayedEpisode;\n if (items) {\n itemsToAdd = items;\n }\n } else if (playeditems) {\n // Program\n itemsToAdd = playeditems;\n }\n\n if (itemsToAdd) {\n Object.keys(itemsToAdd).forEach((locationId) => {\n const playedItem: ?NETGEM_API_VIEWINGHISTORY_LOCATION = itemsToAdd?.[locationId];\n const locationType = getLocationType(locationId);\n\n if (locationType) {\n const queryType = locationTypeToQueryType(locationType);\n if (queryType) {\n if (!playedItemIds[queryType]) {\n playedItemIds[queryType] = new Set<string>();\n }\n playedItemIds[queryType].add(locationId);\n\n // $FlowFixMe: prop-missing but \"date\" exists in playedItem (of type NETGEM_API_VIEWINGHISTORY_LOCATION)\n playedItemsMap[locationId] = {\n ...playedItem,\n id,\n };\n }\n }\n });\n }\n });\n\n return {\n playedItemIds,\n playedItemsMap,\n playedSeries,\n };\n };\n\n buildViewingHistoryFeedFromPromises: (\n sources: Array<NETGEM_API_V8_NTG_VIDEO_FEED>,\n promiseCountByType: KeyValuePair<number>,\n playedItemsMap: KeyValuePair<LocalPlayedItemType>,\n playedSeries: Set<string>,\n results: AllSettledPromises,\n ) => void = (sources, promiseCountByType, playedItemsMap, playedSeries, results) => {\n const {\n channels,\n localCleanUpViewingHistory,\n section: {\n model: { scoring: globalScoring, slice: globalSlice },\n },\n sessionId,\n viewingHistory,\n viewingHistoryStatus,\n } = this.props;\n\n const searchedLocationTypes = new Set<NETGEM_API_V8_ITEM_LOCATION_TYPE>();\n const feedArray = [];\n\n const noIdPlayedItemsMap: NETGEM_API_VIEWINGHISTORY_PLAYED_ITEMS = {};\n Object.entries(playedItemsMap).forEach(([key, value]) => {\n // Get all properties except id\n const { channelId, date, percent, position } = ((value: any): LocalPlayedItemType);\n noIdPlayedItemsMap[key] = {\n channelId,\n date,\n percent,\n position,\n };\n });\n\n let startIndex = 0;\n for (let i = 0; i < sources.length; i++) {\n const {\n [i]: { filter, scoring, slice, uri },\n } = sources;\n const { q: queryType } = getValuesFromQueryString(uri, ['q']);\n\n const locationType = queryTypeToLocationType(queryType);\n if (locationType) {\n searchedLocationTypes.add(locationType);\n }\n\n if (queryType && promiseCountByType[queryType]) {\n const endIndex = startIndex + promiseCountByType[queryType];\n const sourceFeed = [];\n const addToSourceFeed = (item: NETGEM_API_V8_FEED_RAW_ITEM) => sourceFeed.push(item);\n\n for (let j = startIndex; j < endIndex; ++j) {\n const { [j]: result } = results;\n const { status, value } = result;\n\n if (status === SettledPromiseFulfilled) {\n value?.result?.feed?.forEach(addToSourceFeed);\n }\n }\n\n startIndex = endIndex;\n\n if (sourceFeed.length > 0) {\n let filteredFeed: NETGEM_API_V8_FEED = filterFeed(sourceFeed, channels, filter, slice);\n if (scoring) {\n filteredFeed = setFeedScore(filteredFeed, scoring, {\n playedItemsMap: noIdPlayedItemsMap,\n sessionId,\n });\n }\n const validFeed = filterViewingHistoryFeed(filteredFeed, noIdPlayedItemsMap, playedSeries);\n feedArray.push(validFeed);\n }\n }\n }\n\n const feed = mergeFeeds(feedArray, globalScoring, { sessionId }, globalSlice);\n\n this.setSectionLoaded(feed);\n\n if (viewingHistoryStatus === LoadableStatus.Loaded) {\n localCleanUpViewingHistory(viewingHistory, feed, searchedLocationTypes);\n }\n };\n\n buildViewingHistorySection: () => void = () => {\n const {\n localSendV8LocationCatchupForAssetRequest,\n localSendV8LocationVodForAssetRequest,\n recordingsListFeed,\n section: { model },\n viewingHistory,\n viewingHistoryStatus,\n } = this.props;\n const {\n abortController: { signal },\n } = this;\n\n if (viewingHistoryStatus === LoadableStatus.NotInitialized) {\n // Not yet retrieved from server\n return;\n }\n\n if (viewingHistoryStatus === LoadableStatus.Error || viewingHistory.length === 0) {\n this.setEmptySectionLoaded();\n return;\n }\n\n /*\n * Parse viewing history to retrieve items Ids\n * playedItemIds: map of sets of location Ids grouped by type (catchup, recording, etc.)\n * playedItemsMap: map from location Id (catchup, recording, etc.) to viewing history item Id (i.e. series or program Id)\n * playedSeries: set of series Id\n */\n const { playedItemIds, playedItemsMap, playedSeries } = this.parseViewingHistory(viewingHistory);\n\n // Build promises for every source\n const promises: Array<Promise<any>> = [];\n let { sources } = ((model: any): NETGEM_API_V8_AGGREGATION_FEED);\n const now = AccurateTimestamp.now();\n\n // Check if feed model is not an aggregation of sources\n sources = checkSources(sources, model);\n\n if (sources.length === 0) {\n this.setEmptySectionLoaded();\n return;\n }\n\n const promiseCountByType: KeyValuePair<number> = {};\n\n for (let i = 0; i < sources.length; i++) {\n const {\n [i]: { uri },\n } = sources;\n const { allChannels, q: queryType, range } = getValuesFromQueryString(uri, ['allChannels', 'q', 'range']);\n const thresholdTime = getTimestampFromRange(range);\n\n if (queryType && playedItemIds[queryType]) {\n promiseCountByType[queryType] = 0;\n const promiseGenerator = getViewingHistoryPromiseGenerator(\n localSendV8LocationCatchupForAssetRequest,\n localSendV8LocationVodForAssetRequest,\n recordingsListFeed,\n uri,\n now,\n allChannels !== '0',\n queryType,\n signal,\n );\n\n if (promiseGenerator !== null) {\n playedItemIds[queryType].forEach((locationId) => {\n const item = playedItemsMap[locationId];\n const { date } = item;\n\n if (item && getIso8601DateInSeconds(date) >= thresholdTime) {\n promiseCountByType[queryType] += 1;\n promises.push(promiseGenerator(item));\n }\n });\n }\n }\n }\n\n if (promises.length === 0) {\n this.setEmptySectionLoaded();\n return;\n }\n\n // Wait for all promises to resolve/reject\n Promise.allSettled(promises).then((results: AllSettledPromises) => {\n if (signal.aborted || sources === undefined) {\n return;\n }\n\n this.buildViewingHistoryFeedFromPromises(sources, promiseCountByType, playedItemsMap, playedSeries, results);\n });\n };\n\n buildRegularSection: (isFirstCall: boolean) => void = (isFirstCall) => {\n const { localSendV8SectionFeedRequest, searchString, section } = this.props;\n const {\n abortController: { signal },\n } = this;\n\n localSendV8SectionFeedRequest(section, searchString, signal)\n .then((response) => {\n signal.throwIfAborted();\n\n const feed = ((response: any): NETGEM_API_V8_FEED);\n\n if (isFirstCall && feed.some((i) => isItemRecordingOrScheduledRecording(i))) {\n // Recordings or scheduled recordings section: ensure data freshness\n Messenger.on(MessengerEvents.REFRESH_RECORDINGS_SECTION, this.forceRefresh);\n }\n\n this.setSectionLoaded(feed);\n })\n .catch((error) => ignoreIfAborted(signal, error, this.setEmptySectionLoaded));\n };\n\n // Only used for recordings and scheduled recordings sections\n forceRefresh: () => void = () => {\n this.buildRegularSection(false);\n };\n\n loadData: () => void = () => {\n const {\n channels,\n isRegisteredAsGuest,\n section,\n section: { model },\n state,\n } = this.props;\n\n // Reset section display: go back to first page\n this.reset(true);\n\n let { provider } = model;\n let uri: string = '';\n let path: ?string = null;\n\n if (provider === FeedProviderKind.Aggregation) {\n const aggregationModel = ((model: any): NETGEM_API_V8_AGGREGATION_FEED);\n const { sources } = aggregationModel;\n\n if (!sources) {\n return;\n }\n\n // Pick first model\n [{ provider, uri }] = sources;\n } else {\n ({ uri } = ((model: any): NETGEM_API_V8_NTG_VIDEO_FEED));\n }\n\n if (provider === FeedProviderKind.Local) {\n /*\n * Examples:\n * local://channels/list --> same as ?event=live\n * local://channels/list?event=live&channels={channelList}\n * local://channels/list?event=next&channels={channelList}\n * local://wishlist/?q=scheduledevent\n * local://wishlist/?q=(catchup|recording|svod|tvod|est)\n * local://viewinghistory/?q=(catchup|recording)&range=P15D\n */\n path = getLocalPath(uri);\n }\n\n switch (provider) {\n case FeedProviderKind.Local:\n // Local provider\n\n switch (path) {\n case LocalFeed.Channels: {\n // Feed of local channels\n const { channels: channelsParam, event } = getValuesFromQueryString(uri, ['channels', 'event']);\n this.sectionChannels = getSectionChannels(section, channelsParam, channels, state);\n\n if (event !== null) {\n // Live feed\n this.sectionType = StandardSectionType.Live;\n this.setState({ isLive: true });\n this.updateLiveSection();\n } else {\n // Channels feed (e.g. FAST channels)\n this.sectionType = StandardSectionType.Regular;\n const feed = EpgManager.buildFakeChannelsSection(section, this.sectionChannels);\n if (feed !== null) {\n if (feed.length === 0) {\n this.setEmptySectionLoaded();\n } else {\n this.setState({ feed });\n }\n }\n }\n break;\n }\n\n case LocalFeed.ViewingHistory:\n // Viewing history (TV)\n if (isRegisteredAsGuest) {\n this.collapse();\n this.setEmptySectionLoaded();\n } else {\n this.sectionType = StandardSectionType.ViewingHistory;\n this.buildViewingHistorySection();\n }\n break;\n\n case LocalFeed.Wishlist:\n // TV programs flagged with the gem icon\n if (isRegisteredAsGuest) {\n this.collapse();\n this.setEmptySectionLoaded();\n } else {\n this.sectionType = StandardSectionType.Wishlist;\n this.buildWishlistSection();\n }\n break;\n\n default:\n Messenger.emit(\n MessengerEvents.NOTIFY_ERROR,\n <>\n <div>Type de feed inconnu :</div>\n <div>\n <b>{path}</b>\n </div>\n </>,\n );\n break;\n }\n break;\n\n case FeedProviderKind.NtgVideo:\n default:\n // Regular sections (replay, future, live)\n this.sectionType = StandardSectionType.Regular;\n this.buildRegularSection(true);\n }\n };\n\n reset: (skipGridViewExit?: boolean) => void = (skipGridViewExit) => {\n const { isGridAvenue } = this.props;\n const { displayType } = this.state;\n\n if (displayType === SectionDisplayType.Regular) {\n this.goToPage(0);\n } else if (!isGridAvenue && skipGridViewExit !== true) {\n this.exitGridView();\n }\n };\n\n calculateItemCountPerPage: () => number = () => {\n const { sectionItemWidth, slider } = this;\n\n if (!slider || !(slider.parentElement instanceof HTMLElement) || sectionItemWidth <= 0) {\n return -1;\n }\n\n return Math.max(1, Math.floor(slider.parentElement.offsetWidth / sectionItemWidth));\n };\n\n updateDimensions: () => void = () => {\n const { isVisible } = this;\n\n if (!isVisible) {\n this.setState({ updateDimensionsNeeded: true });\n return;\n }\n\n const itemCountPerPage = this.calculateItemCountPerPage();\n\n this.setState({\n itemCountPerPage,\n updateDimensionsNeeded: itemCountPerPage === -1,\n });\n };\n\n createPageList: (previousItemCountPerPage?: number) => void = (previousItemCountPerPage) => {\n const { feed, itemCountPerPage, pageIndex: previousPageIndex } = this.state;\n const { sectionItemWidth } = this;\n\n if (!feed) {\n return;\n }\n\n if (itemCountPerPage === -1) {\n this.setState({ updateDimensionsNeeded: true });\n return;\n }\n\n const { maxPageIndex, pageIndex, sliderPositions } = createSectionPagination(feed, sectionItemWidth, itemCountPerPage, previousPageIndex, previousItemCountPerPage);\n\n this.sliderPositions = sliderPositions;\n this.setState(\n {\n maxPageIndex,\n pageIndex,\n },\n () => this.goToPage(pageIndex, true, this.checkSavedPageIndex),\n );\n };\n\n handleEnterGridViewButtonOnClick: (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => void = (event) => {\n event.preventDefault();\n event.stopPropagation();\n\n this.enterGridView();\n };\n\n handleExitGridViewButtonOnClick: (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => void = (event) => {\n event.preventDefault();\n event.stopPropagation();\n\n this.exitGridView();\n };\n\n handlePlaceholderSectionTitleOnClick: (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => void = (event) => this.handleSectionTitleOnClick(event, true);\n\n handleSectionTitleOnClick: (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>, isPlaceholder?: boolean) => void = (event, isPlaceholder) => {\n const { cardData, isDebugModeEnabled } = this.props;\n const { displayType, isDebugModePlus, maxPageIndex, pageIndex } = this.state;\n\n event.preventDefault();\n event.stopPropagation();\n\n if (isDebugModeEnabled && event.ctrlKey) {\n if (event.shiftKey) {\n // Enable debug mode plus for all items in section (live only)\n this.setState({ isDebugModePlus: !isDebugModePlus });\n } else {\n // Show debug info for section\n showDebugInfo(this.props, this.state, this);\n }\n return;\n }\n\n if (displayType === SectionDisplayType.Grid || cardData || (pageIndex === 0 && maxPageIndex === 0)) {\n return;\n }\n\n if (!isPlaceholder && displayType !== SectionDisplayType.Grid) {\n this.enterGridView();\n }\n };\n\n handleNextButtonOnClick: (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => void = (event) => {\n event.preventDefault();\n event.stopPropagation();\n\n this.goToNextPage(getPageStepFromKeyboardModifiers(event));\n };\n\n handlePrevButtonOnClick: (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => void = (event) => {\n event.preventDefault();\n event.stopPropagation();\n\n this.goToPreviousPage(getPageStepFromKeyboardModifiers(event));\n };\n\n goToPreviousPage: (pageStep: number) => void = (pageStep) => {\n const { pageIndex } = this.state;\n\n this.goToPage(Math.max(0, pageIndex - pageStep));\n };\n\n goToNextPage: (pageStep: number) => void = (pageStep) => {\n const { maxPageIndex, pageIndex } = this.state;\n\n this.goToPage(Math.min(pageIndex + pageStep, maxPageIndex));\n };\n\n goToPage: (pageIndex: number, skipIndexSave?: boolean, callback?: BasicFunction) => void = (pageIndex, skipIndexSave, callback) => {\n const {\n localSavePageIndex,\n section: { id },\n } = this.props;\n const { slider, sliderPositions } = this;\n\n if (!slider || pageIndex < 0 || pageIndex >= sliderPositions.length) {\n if (callback) {\n callback();\n }\n return;\n }\n\n const posX = sliderPositions[pageIndex];\n slider.style.transform = `translateX(${posX}px) translateZ(0)`;\n\n this.setState({ pageIndex }, callback);\n\n if (!skipIndexSave) {\n // Save page index to restore it after player exited\n const { cardData } = this.props;\n localSavePageIndex(`${cardData ? `card_${cardData.item.id}_` : ''}${id}`, pageIndex);\n }\n\n Messenger.emit(MessengerEvents.SECTION_SLIDING_UPDATE, true);\n };\n\n checkSavedPageIndex: () => void = () => {\n const {\n section: { id },\n sectionPageIndices,\n } = this.props;\n const { displayType } = this.state;\n\n const savedPageIndex = sectionPageIndices[id];\n\n if (displayType === SectionDisplayType.Regular && savedPageIndex) {\n // Restore page index to its value before the player opened\n this.goToPage(savedPageIndex, true);\n }\n };\n\n handleOnTransitionEnd: () => void = () => {\n Messenger.emit(MessengerEvents.SECTION_SLIDING_UPDATE, false);\n };\n\n handleSectionVisibilityChanged: (isVisible: boolean) => void = (isVisible) => {\n const { updateDimensionsNeeded } = this.state;\n this.isVisible = isVisible;\n\n if (isVisible && updateDimensionsNeeded) {\n // Became visible\n this.updateDimensions();\n }\n };\n\n handleWaypointEnter: () => void = () => {\n this.handleSectionVisibilityChanged(true);\n };\n\n handleWaypointLeave: () => void = () => {\n this.handleSectionVisibilityChanged(false);\n };\n\n // $FlowFixMe: flow doesn't understand some external classes/types/interfaces\n handleOnSwiping: (eventData: SwipeEventData) => void = (eventData) => {\n const { deltaX } = eventData;\n const { displayType, maxPageIndex, pageIndex } = this.state;\n const { slider, sliderPositions } = this;\n\n if (!slider || maxPageIndex <= 0 || displayType === SectionDisplayType.Grid) {\n return;\n }\n\n this.setState({ isSwiping: true });\n\n const posX = sliderPositions[pageIndex];\n const newPosX = posX + deltaX;\n\n slider.style.transform = `translateX(${newPosX}px) translateZ(0)`;\n };\n\n // $FlowFixMe: flow doesn't understand some external classes/types/interfaces\n handleOnSwiped: (eventData: SwipeEventData) => void = (eventData) => {\n const { dir, velocity } = eventData;\n const { displayType, maxPageIndex } = this.state;\n\n this.resetSwipeTimeout();\n this.swipeTimeout = setTimeout(() => this.setState({ isSwiping: false }), SWIPE.CooldownTime);\n\n if (maxPageIndex <= 0 || displayType === SectionDisplayType.Grid) {\n return;\n }\n\n const pageStep = Math.ceil(velocity / SWIPE.PageVelocityStep);\n\n if (dir === 'Left') {\n this.goToNextPage(pageStep);\n } else if (dir === 'Right') {\n this.goToPreviousPage(pageStep);\n }\n };\n\n enterGridView: () => void = () => {\n const {\n localUpdateGridSectionId,\n section: { id },\n } = this.props;\n Messenger.emit(MessengerEvents.MOVE_TO_TOP, true);\n localUpdateGridSectionId(id);\n this.goToPage(0, true, () => {\n this.setState({ displayType: SectionDisplayType.Grid });\n });\n };\n\n exitGridView: () => void = () => {\n const { localResetGridSectionId } = this.props;\n const { displayType } = this.state;\n\n if (displayType !== SectionDisplayType.Grid) {\n return;\n }\n\n localResetGridSectionId();\n\n this.setState(\n {\n displayType: SectionDisplayType.Regular,\n sortAndFilter: null,\n },\n () => {\n // Will restore vertical scroll position\n Messenger.emit(MessengerEvents.RESTORE_POSITION);\n\n // Will restore horizontal position of all sections\n this.checkSavedPageIndex();\n },\n );\n };\n\n onUpdateSortAndFilter: (sortAndFilter: SortAndFilterType) => void = (sortAndFilter) => {\n this.setState(\n produce((draft) => {\n draft.sortAndFilter = sortAndFilter;\n }),\n );\n };\n\n collapse: () => void = () => {\n this.setState({ displayType: SectionDisplayType.Collapsed });\n };\n\n // eslint-disable-next-line react/no-unused-class-component-methods\n hide: () => void = () => {\n this.setState({ displayType: SectionDisplayType.Hidden });\n };\n\n show: () => void = () => {\n const { displayType, feed } = this.state;\n\n if ((displayType === SectionDisplayType.Collapsed || displayType === SectionDisplayType.Hidden) && feed && feed.length > 0) {\n this.setState({ displayType: SectionDisplayType.Regular }, this.checkSavedPageIndex);\n }\n };\n\n renderPlaceholderSection: (sectionTitle: string, tileTypeClass: string) => React.Node = (sectionTitle, tileTypeClass) => {\n const { displayType } = this.state;\n const {\n tileConfig: { type },\n } = this;\n\n const tileCount = getPlaceholderItemCount(type);\n const placeholderTiles = [];\n for (let i = 0; i < tileCount; ++i) {\n placeholderTiles.push(<PlaceholderItem key={i} />);\n }\n\n return (\n <Waypoint fireOnRapidScroll={false} onEnter={this.handleWaypointEnter} onLeave={this.handleWaypointLeave}>\n <div className={clsx('section', 'placeholder', (displayType: string), tileTypeClass)}>\n <div className='header'>\n <div className={clsx('sectionTitleContainer', sectionTitle === '' && 'noTitle')} onClick={this.handlePlaceholderSectionTitleOnClick}>\n <div className='sectionTitle'>{sectionTitle}</div>\n </div>\n </div>\n <div>\n <div\n className='sectionSlider'\n ref={(instance) => {\n this.slider = instance;\n }}\n >\n {placeholderTiles}\n </div>\n </div>\n </div>\n </Waypoint>\n );\n };\n\n customSortFeed: (feed: NETGEM_API_V8_FEED) => NETGEM_API_V8_FEED = (feed) => {\n const { sortAndFilter } = this.state;\n\n if (sortAndFilter === null) {\n return feed;\n }\n\n const sortedFeed = [...feed];\n\n const { direction, kind } = sortAndFilter;\n\n if (kind === SortKind.Chronological) {\n sortedFeed.sort(compareDate);\n }\n\n if (direction === SortDirection.Descendant) {\n sortedFeed.reverse();\n }\n\n return sortedFeed;\n };\n\n renderTiles: () => Array<React.Node> = () => {\n const { cardData, isInExploreModal, onItemClick } = this.props;\n const { displayType, feed, isDebugModePlus, isLive, isSwiping, itemCountPerPage, pageIndex, sortAndFilter } = this.state;\n const { tileConfig } = this;\n\n if (!feed) {\n return [];\n }\n\n const localFeed = this.customSortFeed(feed);\n\n const { length: itemCount } = localFeed;\n const indexEnd = displayType === SectionDisplayType.Grid ? itemCount : Math.min((pageIndex + PAGE_DISPLAY_COUNT) * itemCountPerPage, itemCount);\n const tiles: Array<React.Node> = [];\n\n for (let i = 0; i < indexEnd; ++i) {\n const { [i]: item } = localFeed;\n\n tiles.push(\n <Item\n cardData={cardData}\n // eslint-disable-next-line react/jsx-no-leaked-render\n isDebugModePlusForced={isLive && isDebugModePlus}\n isInExploreModal={isInExploreModal}\n isInLiveSection={isLive}\n isSwiping={isSwiping}\n item={item}\n key={i}\n onItemClick={onItemClick}\n tileConfig={tileConfig}\n titleFilter={sortAndFilter?.filter}\n />,\n );\n }\n\n return tiles;\n };\n\n renderHeader: (title: string, pageIndex: number, maxPageIndex: number, prevButton: React.Node, nextButton: React.Node) => React.Node = (title, pageIndex, maxPageIndex, prevButton, nextButton) => {\n const { cardData, isDebugModeEnabled } = this.props;\n const { displayType } = this.state;\n\n const sortAndFilterElt = isDebugModeEnabled && displayType === SectionDisplayType.Grid ? <SortAndFilter updateSortAndFilter={this.onUpdateSortAndFilter} /> : null;\n\n const gridViewButton =\n displayType !== SectionDisplayType.Grid && !cardData && (prevButton || nextButton) ? (\n <div className='gridViewButton' onClick={this.handleEnterGridViewButtonOnClick}>\n <div>{Localizer.localize('common.actions.see_all')}</div>\n <PictoArrowRight forceHoverEffect />\n </div>\n ) : null;\n\n const paginationElt =\n displayType !== SectionDisplayType.Grid && maxPageIndex > 0 ? (\n <div className='sectionPagination'>\n {pageIndex + 1} / {maxPageIndex + 1}\n </div>\n ) : null;\n\n return (\n <div className='header'>\n <div className={clsx('sectionTitleContainer', gridViewButton !== null && 'hoverable')} onClick={gridViewButton !== null || isDebugModeEnabled ? this.handleSectionTitleOnClick : undefined}>\n <div className='sectionTitle'>{title}</div>\n </div>\n {gridViewButton}\n {sortAndFilterElt}\n {paginationElt}\n </div>\n );\n };\n\n render(): React.Node {\n const { isGridAvenue, section, sectionIndex } = this.props;\n const { displayType, feed, isLoading, maxPageIndex, pageIndex } = this.state;\n const {\n sectionName,\n tileConfig: { imageLayout, type },\n } = this;\n\n const sectionTitle = getTranslatedText(section.title, Localizer.language);\n\n if (displayType === SectionDisplayType.Collapsed) {\n // Do not display empty section\n return null;\n }\n\n // Tile type to CSS class conversion (e.g. 'gemtv.big' -> 'gemtv big')\n const tileTypeClass = getTileTypeClass(type);\n\n if (isLoading || maxPageIndex === -1 || !feed) {\n // Display placeholder while loading\n return this.renderPlaceholderSection(sectionTitle, tileTypeClass);\n }\n\n // Display all visible items (+ a little more) or all items in grid view\n const tiles = this.renderTiles();\n\n const prevButton =\n displayType !== SectionDisplayType.Grid && pageIndex > 0 ? (\n <div className={clsx('navigationButton', 'previous', tileTypeClass)} onClick={this.handlePrevButtonOnClick}>\n <PictoArrowLeft forceHoverEffect />\n </div>\n ) : null;\n\n const nextButton =\n displayType !== SectionDisplayType.Grid && pageIndex < maxPageIndex ? (\n <div className={clsx('navigationButton', 'next', tileTypeClass)} onClick={this.handleNextButtonOnClick}>\n <PictoArrowRight forceHoverEffect />\n </div>\n ) : null;\n\n const backButton = !isGridAvenue && displayType === SectionDisplayType.Grid ? <ButtonBack className='backBar' onClick={this.handleExitGridViewButtonOnClick} /> : null;\n\n return (\n <Waypoint fireOnRapidScroll={false} onEnter={this.handleWaypointEnter} onLeave={this.handleWaypointLeave}>\n <div className={clsx('section', (displayType: string), tileTypeClass, imageLayout)} id={`section_${sectionName}`} style={{ zIndex: MAX_Z_INDEX - sectionIndex }}>\n {backButton}\n {this.renderHeader(sectionTitle, pageIndex, maxPageIndex, prevButton, nextButton)}\n <Swipeable onSwiped={this.handleOnSwiped} onSwiping={this.handleOnSwiping} trackMouse>\n <div\n className='sectionSlider'\n onTransitionEnd={this.handleOnTransitionEnd}\n ref={(instance) => {\n this.slider = instance;\n }}\n >\n {tiles}\n </div>\n </Swipeable>\n {prevButton}\n {nextButton}\n </div>\n </Waypoint>\n );\n }\n}\n\nconst mapStateToProps: (state: CombinedReducers) => ReduxSectionReducerStateType = (state) => {\n return {\n channels: state.appConfiguration.deviceChannels,\n favoriteList: state.ui.favoriteList || [],\n gridSectionId: state.ui.gridSectionId,\n isDebugModeEnabled: state.appConfiguration.isDebugModeEnabled,\n isRegisteredAsGuest: state.appRegistration.registration === RegistrationType.RegisteredAsGuest,\n recordingsListFeed: state.npvr.npvrRecordingsListFeed,\n sectionPageIndices: state.ui.sectionPageIndices,\n sessionId: state.appConfiguration.sessionId,\n state,\n viewingHistory: ViewingHistoryCache.checkGet(state.ui.viewingHistory, state.ui.viewingHistoryStatus, true),\n viewingHistoryStatus: state.ui.viewingHistoryStatus,\n wishlist: WishlistCache.checkGet(state.ui.wishlist, state.ui.wishlistStatus, true).items,\n wishlistStatus: state.ui.wishlistStatus,\n };\n};\n\nconst mapDispatchToProps: (dispatch: Dispatch) => ReduxSectionDispatchToPropsType = (dispatch) => {\n return {\n localCleanUpViewingHistory: (viewingHistory: VIEWING_HISTORY_TYPE, feed: NETGEM_API_V8_FEED, locationTypes: Set<NETGEM_API_V8_ITEM_LOCATION_TYPE>): Promise<any> =>\n dispatch(cleanUpViewingHistory(viewingHistory, feed, locationTypes)),\n\n localResetGridSectionId: (): void => dispatch(resetGridSectionId()),\n\n localSavePageIndex: (sectionId: string, index: number): void => dispatch(updateSectionPageIndex(sectionId, index)),\n\n localSendV8LocationCatchupForAssetRequest: (assetId: string, startDate: number, range: number, channelIds?: Array<string>, signal?: AbortSignal): Promise<any> =>\n dispatch(sendV8LocationCatchupForAssetRequest(assetId, startDate, range, channelIds, signal)),\n\n localSendV8LocationEpgForAssetRequest: (assetId: string, startDate: number, range: number, channelIds?: Array<string>, signal?: AbortSignal): Promise<any> =>\n dispatch(sendV8LocationEpgForAssetRequest(assetId, startDate, range, channelIds, signal)),\n\n localSendV8LocationVodForAssetRequest: (assetId: string, startDate: number, range: number, channelIds?: Array<string>, signal?: AbortSignal): Promise<any> =>\n dispatch(sendV8LocationVodForAssetRequest(assetId, startDate, range, channelIds, signal)),\n\n localSendV8SectionFeedRequest: (section: NETGEM_API_V8_SECTION, searchString: ?string, signal?: AbortSignal): Promise<any> => dispatch(sendV8SectionFeedRequest(section, searchString, signal)),\n\n localUpdateGridSectionId: (gridSectionId: string | null): void => dispatch(updateGridSectionId(gridSectionId)),\n };\n};\n\nconst Section: React.ComponentType<SectionPropType> = connect(mapStateToProps, mapDispatchToProps, null, { forwardRef: true })(SectionView);\n\nexport default Section;\n","/* @flow */\n\nimport type { NETGEM_API_V8_FEED, NETGEM_API_V8_FEED_ITEM } from '../../../libs/netgemLibrary/v8/types/FeedItem';\nimport type { BasicFunction } from '@ntg/utils/dist/types';\nimport type { ChannelMap } from '../../../libs/netgemLibrary/v8/types/Channel';\nimport type { CombinedReducers } from '../../../redux/reducers';\nimport type { ItemData } from './Types';\nimport type { MetadataKind } from '../../../libs/netgemLibrary/v8/types/MetadataProgram';\nimport type { NETGEM_API_V8_SECTION } from '../../../libs/netgemLibrary/v8/types/Section';\nimport type { NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE } from '../../../libs/netgemLibrary/v8/types/WidgetConfig';\nimport type { STREAM_PRIORITIES_TYPE } from '../../../helpers/ui/metadata/Types';\nimport { SectionDisplayType } from '../../../helpers/ui/section/types';\nimport type { ThemeType } from '@ntg/ui/dist/theme';\nimport type { VideoCarouselStateType } from '../../../redux/ui/types/types';\n\nexport enum CarouselSectionType {\n Regular,\n Live,\n}\n\n// Displayed item changes every 6 seconds\nexport const ITEM_CHANGE_TIMEOUT: number = 6_000;\n\n// Video carousel goes into preview mode after 4 seconds of mouse idle time\nexport const UI_HIDE_TIMEOUT: number = 4_000;\n\n// Video carousel section displays a maximum of 7 items\nexport const VIDEO_MAX_ITEMS = 7;\n\n// Image carousel section displays a maximum of 5 items\nexport const IMAGE_MAX_ITEMS = 5;\n\n// Cannot be converted to enum because it's used as a key in an object\nexport type INTERVAL_TYPE = 'LIVE_CAROUSEL_SECTION' | 'LIVE_CACHED_CAROUSEL_SECTION';\n\nexport type ReduxSectionDispatchToPropsType = {|\n +localGetImageUrl: (assetId: string, width: number, height: number, theme?: ThemeType, signal?: AbortSignal) => Promise<any>,\n +localSendV8MetadataRequest: (assetId: string, type: MetadataKind, signal?: AbortSignal) => Promise<any>,\n +localSendV8SectionFeedRequest: (section: NETGEM_API_V8_SECTION, signal?: AbortSignal) => Promise<any>,\n +localUpdateVideoCarouselMuted: BasicFunction,\n +localUpdateVideoCarouselPaused: BasicFunction,\n +localUpdateVideoCarouselPlaying: BasicFunction,\n +localUpdateVideoCarouselUnmuted: BasicFunction,\n|};\n\nexport type ReduxSectionReducerStateType = {|\n +channels: ChannelMap,\n +gridSectionId: string | null,\n +isDebugModeEnabled: boolean,\n +isInTheaterMode: boolean,\n +state: CombinedReducers,\n +streamPriorities: STREAM_PRIORITIES_TYPE | null,\n +videoCarousel: VideoCarouselStateType,\n|};\n\nexport type DefaultProps = {|\n +onItemClick?: NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE,\n +onUIHiddenCallback?: BasicFunction,\n +onUIShownCallback?: BasicFunction,\n|};\n\nexport type SectionPropType = {|\n ...DefaultProps,\n +avenueImageUri: ?string,\n +avenueIndex: number,\n +dataLoadedCallback: (sectionId: string, sectionIndex: number, avenueIndex: number, itemCount: number) => void,\n +hubItem: ?NETGEM_API_V8_FEED_ITEM,\n +section: NETGEM_API_V8_SECTION,\n +sectionIndex: number,\n|};\n\nexport type CompleteSectionPropType = {|\n ...SectionPropType,\n ...ReduxSectionReducerStateType,\n ...ReduxSectionDispatchToPropsType,\n|};\n\nexport type SectionStateType = {|\n currentIndex: number,\n displayType: SectionDisplayType,\n feed: NETGEM_API_V8_FEED,\n hubImageUrl: ?string,\n imageUrlList: Array<string>,\n isCollapsed: boolean,\n isUIHidden: boolean,\n itemDataList: Array<ItemData>,\n selectedItemIndices: Array<number>,\n trailerUrlList: Array<string>,\n|};\n","/* @flow */\n\nimport type { NETGEM_API_V8_METADATA_IMAGE } from '../../../libs/netgemLibrary/v8/types/MetadataProgram';\n\nexport const IMAGE_TAG_NO_TEXT: 'no-text' = 'no-text';\nexport type IMAGE_TAG_TYPE = typeof IMAGE_TAG_NO_TEXT;\n\nconst findLandscapeImageId: (images: Array<NETGEM_API_V8_METADATA_IMAGE>, tag?: IMAGE_TAG_TYPE) => string | null = (images, tag) => {\n const image = images.find((img) => {\n if (!img || !img.size) {\n return false;\n }\n\n const {\n size: { height, width },\n tags,\n } = img;\n\n if (width > height) {\n // Landscape\n if (tag !== undefined) {\n // Looking for a specific tag\n if (tags?.includes(tag)) {\n // Tag has been found\n return true;\n }\n } else {\n // Any landscape will do (no tag required)\n return true;\n }\n }\n\n // No landscape found\n return false;\n });\n\n return image?.id ?? null;\n};\n\nexport { findLandscapeImageId };\n","/* @flow */\n\nimport './Equalizer.css';\nimport * as React from 'react';\nimport type { BasicFunction } from '@ntg/utils/dist/types';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport { TIPPY_DEFAULT_OPTIONS } from '@ntg/ui/dist/tooltip';\nimport Tippy from '@tippyjs/react';\nimport { connect } from 'react-redux';\n\n/* eslint-disable no-magic-numbers */\nconst EQUALIZER = Object.freeze({\n AnimationSpeed: 180,\n BarCount: 5,\n MinValues: Object.freeze([0, 0.3, 0.4, 0.5, 0.4, 0.2]),\n RangeValues: Object.freeze([0, 0.5, 0.6, 0.4, 0.5, 0.6]),\n});\n/* eslint-enable no-magic-numbers */\n\ntype ReduxEqualizerReducerStateType = {||};\n\ntype DefaultProps = {|\n +isEnabled?: boolean,\n|};\n\ntype EqualizerPropType = {|\n ...DefaultProps,\n +isMuted: boolean,\n +onClick: BasicFunction,\n|};\n\ntype CompleteEqualizerPropType = {|\n ...EqualizerPropType,\n ...ReduxEqualizerReducerStateType,\n|};\n\ntype EqualizerStateType = {|\n barHeights: Array<number>,\n|};\n\nconst InitialState = Object.freeze({\n barHeights: [],\n});\n\nclass EqualizerView extends React.PureComponent<CompleteEqualizerPropType, EqualizerStateType> {\n equalizerAnimationTimer: ?IntervalID;\n\n static defaultProps: DefaultProps = {\n isEnabled: true,\n };\n\n constructor(props: CompleteEqualizerPropType) {\n super(props);\n\n this.equalizerAnimationTimer = null;\n\n this.state = {\n ...InitialState,\n barHeights: this.getEqualizerBarHeights(),\n };\n }\n\n componentDidMount() {\n this.initialize();\n }\n\n componentDidUpdate(prevProps: CompleteEqualizerPropType) {\n const { isEnabled, isMuted } = this.props;\n const { isEnabled: prevIsEnabled, isMuted: prevIsMuted } = prevProps;\n\n if (isEnabled !== prevIsEnabled || isMuted !== prevIsMuted) {\n this.initialize();\n }\n }\n\n componentWillUnmount() {\n this.stopEqualizerAnimation();\n }\n\n initialize = () => {\n const { isEnabled, isMuted } = this.props;\n\n if (isEnabled && !isMuted) {\n this.startEqualizerAnimation();\n } else {\n this.stopEqualizerAnimation();\n }\n };\n\n startEqualizerAnimation = () => {\n if (this.equalizerAnimationTimer) {\n // Already started\n return;\n }\n this.equalizerAnimationTimer = setInterval(this.updateEqualizer, EQUALIZER.AnimationSpeed);\n };\n\n stopEqualizerAnimation = () => {\n if (this.equalizerAnimationTimer) {\n clearInterval(this.equalizerAnimationTimer);\n this.equalizerAnimationTimer = null;\n }\n };\n\n getEqualizerBarHeights = (): Array<number> => {\n const barHeights = [];\n\n for (let i = 1; i < EQUALIZER.BarCount + 1; i++) {\n const h = EQUALIZER.MinValues[i] + Math.random() * EQUALIZER.RangeValues[i];\n barHeights.push(h);\n }\n\n return barHeights;\n };\n\n updateEqualizer = () => {\n this.setState({ barHeights: this.getEqualizerBarHeights() });\n };\n\n render(): React.Node {\n const { isMuted, onClick } = this.props;\n const { barHeights } = this.state;\n\n // eslint-disable-next-line react/no-array-index-key\n const bars = barHeights.map((h, i) => <span key={i} style={{ transform: `scaleY(${h})` }} />);\n\n const muteSign = isMuted ? (\n <div className='muteSign'>\n <svg viewBox='0 0 18 20' xmlns='http://www.w3.org/2000/svg'>\n <line x1='3' x2='15' y1='20' y2='0' />\n </svg>\n </div>\n ) : null;\n\n /* eslint-disable react/jsx-props-no-spreading */\n return (\n <Tippy {...TIPPY_DEFAULT_OPTIONS} content={<div className='tooltipContent button'>{Localizer.localize('carousel.tooltip.toggle_sound')}</div>}>\n <div className='equalizer' onClick={onClick}>\n {bars}\n {muteSign}\n </div>\n </Tippy>\n );\n /* eslint-enable react/jsx-props-no-spreading */\n }\n}\n\nconst Equalizer: React.ComponentType<EqualizerPropType> = connect(null, null, null, { forwardRef: true })(EqualizerView);\n\nexport default Equalizer;\n","/* @flow */\n\nimport './ItemIndex.css';\nimport * as React from 'react';\nimport { Messenger, MessengerEvents } from '@ntg/utils/dist/messenger';\nimport type { CombinedReducers } from '../../../redux/reducers';\nimport type { ItemData } from './Types';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport { TIPPY_DEFAULT_OPTIONS } from '@ntg/ui/dist/tooltip';\nimport TextScroller from '../../textScroller/TextScroller';\nimport Tippy from '@tippyjs/react';\nimport { buildTitle } from '../../../helpers/ui/metadata/Format';\nimport clsx from 'clsx';\nimport { connect } from 'react-redux';\n\ntype ItemIndexPropType = {|\n +currentIndex: number,\n +index: number,\n +itemData: ItemData | null,\n +onClick: (index: number) => void,\n|};\n\ntype ReduxItemIndexReducerStateType = {|\n +isDebugModeEnabled: boolean,\n|};\n\ntype CompleteItemIndexPropType = {|\n ...ItemIndexPropType,\n ...ReduxItemIndexReducerStateType,\n|};\n\ntype ItemIndexStateType = {|\n isTooltipShown: boolean,\n progress: number,\n|};\n\nconst InitialState = Object.freeze({\n isTooltipShown: true,\n progress: 0,\n});\n\nconst PADDING_LENGTH = 2;\n\nclass ItemIndexView extends React.PureComponent<CompleteItemIndexPropType, ItemIndexStateType> {\n constructor(props: CompleteItemIndexPropType) {\n super(props);\n\n this.state = { ...InitialState };\n }\n\n componentDidMount() {\n Messenger.on(MessengerEvents.VIDEO_CAROUSEL_UPDATE_PROGRESS, this.updateProgress);\n }\n\n componentDidUpdate(prevProps: CompleteItemIndexPropType) {\n const { currentIndex } = this.props;\n const { currentIndex: prevCurrentIndex } = prevProps;\n\n if (currentIndex !== prevCurrentIndex) {\n this.resetProgress();\n }\n }\n\n componentWillUnmount() {\n Messenger.off(MessengerEvents.VIDEO_CAROUSEL_UPDATE_PROGRESS, this.updateProgress);\n }\n\n updateProgress: (updateIndex: number, percent: number) => void = (updateIndex, percent) => {\n const { index } = this.props;\n\n if (index === updateIndex) {\n this.setState({ progress: percent });\n }\n };\n\n resetProgress: () => void = () => {\n this.setState({ progress: 0 });\n };\n\n handleOnClick: () => void = () => {\n const { index, onClick } = this.props;\n\n onClick(index);\n };\n\n renderTitleElement: () => React.Node = () => {\n const { itemData } = this.props;\n\n if (!itemData) {\n return <div className='title'> </div>;\n }\n\n const { programMetadata, seriesMetadata } = itemData;\n const title = buildTitle(Localizer.language, programMetadata ?? null, seriesMetadata ?? null, true);\n\n return (\n <div className='titleContainer'>\n <TextScroller scrollOnMount style={{ font: '14px var(--regular-font)', maxHeight: '16px' }}>\n <div className='title'>{title}</div>\n </TextScroller>\n </div>\n );\n };\n\n render(): React.Node {\n const { currentIndex, index, isDebugModeEnabled, itemData } = this.props;\n const { isTooltipShown, progress } = this.state;\n\n const indexText = (index + 1).toString().padStart(PADDING_LENGTH, '0');\n const progressStyle = { width: `${progress}%` };\n\n const options = {\n ...TIPPY_DEFAULT_OPTIONS,\n content: isTooltipShown ? (\n <div className={clsx('tooltipContent', 'carouselIndex', itemData?.tileType)}>\n <img alt='' className={clsx(itemData?.tileType)} src={itemData?.imageUrl ?? ''} />\n {this.renderTitleElement()}\n </div>\n ) : null,\n onHidden: () => this.setState({ isTooltipShown: false }),\n onShown: () => this.setState({ isTooltipShown: true }),\n };\n\n const indexElement = (\n <div className={clsx('itemIndex', index === currentIndex && 'focused')} onClick={this.handleOnClick}>\n <div className='videoProgressContainer'>\n <div className='videoProgress' style={progressStyle} />\n </div>\n <div className='index'>\n <p>{indexText}</p>\n </div>\n </div>\n );\n\n if (isDebugModeEnabled) {\n // eslint-disable-next-line react/jsx-props-no-spreading\n return <Tippy {...options}>{indexElement}</Tippy>;\n }\n\n return indexElement;\n }\n}\n\nconst mapStateToProps = (state: CombinedReducers): ReduxItemIndexReducerStateType => {\n return {\n isDebugModeEnabled: state.appConfiguration.isDebugModeEnabled,\n };\n};\n\nconst ItemIndex: React.ComponentType<ItemIndexPropType> = connect(mapStateToProps, null, null, { forwardRef: true })(ItemIndexView);\n\nexport default ItemIndex;\n","/* @flow */\n\nimport './StatusPicto.css';\nimport * as React from 'react';\nimport { BroadcastStatus, WebAppHelpersLocationStatus, getBroadcastStatus, getLocationStatus } from '../../helpers/ui/location/Format';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport { type NETGEM_API_V8_FEED_ITEM } from '../../libs/netgemLibrary/v8/types/FeedItem';\nimport clsx from 'clsx';\n\n// Picto status is refreshed every 30 seconds\nconst REFRESH_TIMEOUT: number = 30_000;\n\ntype DefaultProps = {|\n +className?: string,\n +forcedText?: string,\n +onClick?: (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => Promise<void> | void,\n|};\n\nexport type StatusPictoPropType = {|\n ...DefaultProps,\n +item: NETGEM_API_V8_FEED_ITEM,\n|};\n\ntype ReduxStatusPictoReducerStateType = {||};\n\nexport type CompleteStatusPictoPropType = {|\n ...StatusPictoPropType,\n ...ReduxStatusPictoReducerStateType,\n|};\n\ntype StatusPictoStateType = {|\n broadcastStatus: BroadcastStatus,\n|};\n\nclass StatusPicto extends React.PureComponent<CompleteStatusPictoPropType, StatusPictoStateType> {\n refreshTimer: TimeoutID | null;\n\n static defaultProps: DefaultProps = {\n className: '',\n forcedText: undefined,\n onClick: undefined,\n };\n\n constructor(props: CompleteStatusPictoPropType) {\n super(props);\n\n this.refreshTimer = null;\n\n this.state = {\n broadcastStatus: BroadcastStatus.Unknown,\n };\n }\n\n componentDidMount() {\n this.updateBroadcastStatus();\n }\n\n componentDidUpdate(prevProps: CompleteStatusPictoPropType) {\n const { item } = this.props;\n const { item: prevItem } = prevProps;\n\n if (item !== prevItem) {\n this.updateBroadcastStatus();\n }\n }\n\n componentWillUnmount() {\n this.resetRefreshTimer();\n }\n\n startRefreshTimer: () => void = () => {\n const { broadcastStatus } = this.state;\n\n this.resetRefreshTimer();\n\n if (broadcastStatus === BroadcastStatus.Past) {\n // A past item will never change, no need to check again\n return;\n }\n\n this.refreshTimer = setTimeout(this.updateBroadcastStatus, REFRESH_TIMEOUT);\n };\n\n resetRefreshTimer: () => void = () => {\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = null;\n }\n };\n\n updateBroadcastStatus: () => void = () => {\n const { item } = this.props;\n this.setState({ broadcastStatus: getBroadcastStatus(item) }, this.startRefreshTimer);\n };\n\n handleOnClick = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>): void => {\n const { onClick } = this.props;\n\n if (onClick) {\n onClick(event);\n }\n };\n\n render(): React.Node {\n const { className = '', forcedText, item, onClick } = this.props;\n const { broadcastStatus } = this.state;\n\n let status = getLocationStatus(item);\n if (!status || status === WebAppHelpersLocationStatus.Vod || status === WebAppHelpersLocationStatus.App || broadcastStatus === BroadcastStatus.Unknown) {\n return null;\n }\n\n if (broadcastStatus === BroadcastStatus.Live) {\n status = WebAppHelpersLocationStatus.Live;\n } else if (broadcastStatus === BroadcastStatus.Preview) {\n status = WebAppHelpersLocationStatus.Preview;\n }\n\n return (\n <div className={clsx('statusPicto', (status: string), className, onClick && 'clickable')} onClick={this.handleOnClick}>\n {forcedText || Localizer.localize(`common.status_picto.${(status: string)}`)}\n </div>\n );\n }\n}\n\nexport default (StatusPicto: React.ComponentType<StatusPictoPropType>);\n","/* @flow */\n\nimport { ItemType, type NETGEM_API_V8_FEED_ITEM } from '../../../libs/netgemLibrary/v8/types/FeedItem';\nimport type { NETGEM_API_CHANNEL } from '../../../libs/netgemLibrary/v8/types/Channel';\n\nconst DEFAULT_SCORE = 100;\n\nconst createItemFromChannel: (channel: NETGEM_API_CHANNEL) => ?NETGEM_API_V8_FEED_ITEM = (channel) => {\n const { epgid: channelId, isHidden } = channel;\n\n if (isHidden) {\n return null;\n }\n\n const selectedLocation = {\n channelId,\n duration: '',\n id: channelId,\n score: [DEFAULT_SCORE],\n startDate: '',\n };\n\n return {\n endTime: NaN,\n id: channelId,\n locType: null,\n locations: [selectedLocation],\n score: [DEFAULT_SCORE],\n selectedLocation,\n selectedProgramId: channelId,\n seriesId: null,\n startTime: NaN,\n type: ItemType.Channel,\n };\n};\n\nexport { createItemFromChannel };\n","/* @flow */\n\nimport {\n ItemType,\n type NETGEM_API_V8_FEED_ITEM,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_EST,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_SVOD,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_TVOD,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_VOD,\n} from '../../../libs/netgemLibrary/v8/types/FeedItem';\nimport { getLocationType } from '../../../libs/netgemLibrary/v8/helpers/Item';\n\nconst hasItemMetadata: (item: NETGEM_API_V8_FEED_ITEM) => boolean = (item) => {\n const { type } = item;\n\n return type === ItemType.Program || type === ItemType.Series;\n};\n\nconst isVodItem: (item: NETGEM_API_V8_FEED_ITEM) => boolean = (item) => {\n const {\n locType,\n selectedLocation: { id },\n } = item;\n\n const type = locType ?? getLocationType(id);\n return (\n type === NETGEM_API_V8_ITEM_LOCATION_TYPE_EST || type === NETGEM_API_V8_ITEM_LOCATION_TYPE_SVOD || type === NETGEM_API_V8_ITEM_LOCATION_TYPE_TVOD || type === NETGEM_API_V8_ITEM_LOCATION_TYPE_VOD\n );\n};\n\nexport { hasItemMetadata, isVodItem };\n","/* @flow */\n\nimport './Slide.css';\nimport * as React from 'react';\nimport { BOVodAssetStatus, getVodStatusFromLocations } from '../../../helpers/videofutur/metadata';\nimport type { BasicFunction, KeyValuePair } from '@ntg/utils/dist/types';\nimport { BroadcastStatus, getBroadcastStatus } from '../../../helpers/ui/location/Format';\nimport { ExtendedItemType, FAKE_EPG_LIVE_ITEM_TYPE } from '../../../helpers/ui/item/types';\nimport { ItemContent, type NETGEM_API_V8_FEED_ITEM, type NETGEM_API_V8_ITEM_LOCATION, NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT } from '../../../libs/netgemLibrary/v8/types/FeedItem';\nimport { Messenger, MessengerEvents } from '@ntg/utils/dist/messenger';\nimport { type NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE, TileConfigTileType } from '../../../libs/netgemLibrary/v8/types/WidgetConfig';\nimport type { NETGEM_RECORDINGS_MAP, NETGEM_SCHEDULED_RECORDINGS_MAP } from '../../../libs/netgemLibrary/v8/types/Npvr';\nimport { formatSeasonEpisodeNbr, getTitle } from '../../../helpers/ui/metadata/Format';\nimport sendV8MetadataLocationRequest, { getVodLocations } from '../../../redux/netgemApi/actions/v8/metadataLocation';\nimport { APPLICATION_ID } from '../../../helpers/applicationCustomization/types';\nimport type { BO_PURCHASE_LIST_TYPE } from '../../../redux/netgemApi/actions/videofutur/types/purchase';\nimport ButtonFX from '../../buttons/ButtonFX';\nimport type { CARD_DATA_MODAL_TYPE } from '../../modal/cardModal/CardModalConstsAndTypes';\nimport type { ChannelMap } from '../../../libs/netgemLibrary/v8/types/Channel';\nimport type { CombinedReducers } from '../../../redux/reducers';\nimport type { Dispatch } from '../../../redux/types/types';\nimport { FEATURE_SUBSCRIPTION } from '../../../redux/appConf/constants';\nimport type { ItemData } from './Types';\nimport { LoadableStatus } from '../../../helpers/loadable/loadable';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport type { NETGEM_API_V8_METADATA_SCHEDULE } from '../../../libs/netgemLibrary/v8/types/MetadataSchedule';\nimport type { NETGEM_API_V8_REQUEST_RESPONSE } from '../../../libs/netgemLibrary/v8/types/RequestResponse';\nimport type { NETGEM_API_V8_RIGHTS } from '../../../libs/netgemLibrary/v8/types/Rights';\nimport type { NETGEM_API_VIEWINGHISTORY } from '../../../libs/netgemLibrary/v8/types/ViewingHistory';\nimport { PictoRecord } from '@ntg/components/dist/pictos/Element';\nimport { RegistrationType } from '../../../redux/appRegistration/types/types';\nimport StatusPicto from '../../statusPicto/StatusPicto';\nimport type { VOD_STATUS_TYPE } from '../../../helpers/ui/metadata/Types';\nimport clsx from 'clsx';\nimport { connect } from 'react-redux';\nimport { createItemFromChannel } from '../../../helpers/ui/item/channel';\nimport { getDistributorId } from '../../../helpers/ui/item/distributor';\nimport { getEpisodeAndSeriesRecordStatus } from '../../../helpers/npvr/recording';\nimport { getItemLiveProgress } from '../../../helpers/ui/item/time';\nimport { getProgress } from '../../../helpers/viewingHistory/ViewingHistory';\nimport { getSeriesCardUrlDefinition } from '../../../helpers/ui/section/tile';\nimport getTranslatedText from '../../../libs/netgemLibrary/v8/helpers/Lang';\nimport { hideModal } from '../../../redux/modal/actions';\nimport { ignoreIfAborted } from '../../../libs/netgemLibrary/helpers/cancellablePromise/promiseHelper';\nimport { isPlaybackGranted } from '../../../helpers/rights/playback';\nimport { isVodItem } from '../../../helpers/ui/item/metadata';\nimport { showDebug } from '../../../helpers/debug/debug';\n\ntype ReduxItemSlideDispatchToPropsType = {|\n +localGetVodLocations: (locations: Array<NETGEM_API_V8_ITEM_LOCATION>, signal?: AbortSignal) => Promise<any>,\n +localHideModal: BasicFunction,\n +localSendV8MetadataLocationRequest: (assetId: string, signal?: AbortSignal) => Promise<any>,\n|};\n\ntype ReduxItemSlideReducerStateType = {|\n +channels: ChannelMap,\n +commercialOffers: KeyValuePair<Array<string>> | null,\n +defaultOnItemClick: NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE | null,\n +defaultRights: NETGEM_API_V8_RIGHTS | null,\n +isDebugModeEnabled: boolean,\n +isRegisteredAsGuest: boolean,\n +isSubscriptionFeatureEnabled: boolean,\n +npvrRecordingsFuture: NETGEM_RECORDINGS_MAP,\n +npvrRecordingsList: NETGEM_RECORDINGS_MAP,\n +npvrScheduledRecordingsList: NETGEM_SCHEDULED_RECORDINGS_MAP,\n +purchaseList: BO_PURCHASE_LIST_TYPE,\n +userRights: Array<string> | null,\n +viewingHistory: NETGEM_API_VIEWINGHISTORY,\n +viewingHistoryStatus: LoadableStatus,\n|};\n\ntype DefaultProps = {|\n +onItemClick?: NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE,\n|};\n\ntype ItemSlidePropType = {|\n ...DefaultProps,\n +currentIndex: number,\n +hubItem: ?NETGEM_API_V8_FEED_ITEM,\n +item: NETGEM_API_V8_FEED_ITEM,\n +itemData: ItemData | null,\n +itemIndex: number,\n +sectionTitle: ?string,\n|};\n\ntype CompleteItemSlidePropType = {|\n ...ItemSlidePropType,\n ...ReduxItemSlideReducerStateType,\n ...ReduxItemSlideDispatchToPropsType,\n|};\n\ntype ItemSlideStateType = {|\n broadcastStatus: BroadcastStatus,\n isLiveRecording: boolean,\n previewCatchupScheduledEventId: ?string,\n tvLocationMetadata: NETGEM_API_V8_METADATA_SCHEDULE | null,\n vodLocations: Array<NETGEM_API_V8_METADATA_SCHEDULE> | null,\n|};\n\nconst InitialState = Object.freeze({\n broadcastStatus: BroadcastStatus.Unknown,\n isLiveRecording: false,\n previewCatchupScheduledEventId: null,\n tvLocationMetadata: null,\n vodLocations: null,\n});\n\n// Time display and broadcast status are refreshed every second\nconst REFRESH_TIMEOUT = 1_000;\n\nclass ItemSlideView extends React.PureComponent<CompleteItemSlidePropType, ItemSlideStateType> {\n abortController: AbortController;\n\n broadcastStatusRefreshTimer: TimeoutID | null;\n\n isVod: boolean;\n\n // Location Id of purchased location\n viewingHistoryId: ?string;\n\n // VtiId of purchased location\n vtiId: ?number;\n\n static defaultProps: DefaultProps = {\n onItemClick: undefined,\n };\n\n constructor(props: CompleteItemSlidePropType) {\n super(props);\n\n const { item } = props;\n\n this.abortController = new AbortController();\n this.broadcastStatusRefreshTimer = null;\n this.isVod = isVodItem(item);\n this.viewingHistoryId = null;\n this.vtiId = null;\n\n this.state = { ...InitialState };\n }\n\n componentDidMount() {\n this.loadData();\n }\n\n componentDidUpdate(prevProps: CompleteItemSlidePropType) {\n const {\n item: { selectedProgramId },\n npvrRecordingsList,\n npvrScheduledRecordingsList,\n } = this.props;\n\n const {\n item: { selectedProgramId: prevSelectedProgramId },\n npvrRecordingsList: prevNpvrRecordingsList,\n npvrScheduledRecordingsList: prevNpvrScheduledRecordingsList,\n } = prevProps;\n\n if (selectedProgramId !== prevSelectedProgramId) {\n this.loadData();\n }\n\n if (npvrRecordingsList !== prevNpvrRecordingsList || npvrScheduledRecordingsList !== prevNpvrScheduledRecordingsList) {\n this.checkRecordingState();\n }\n }\n\n componentWillUnmount() {\n const { abortController } = this;\n\n abortController.abort('Component Slide will unmount');\n\n this.resetBroadcastStatusRefreshTimer();\n }\n\n handleDebugOnClick = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>): void => {\n if (event.ctrlKey) {\n event.preventDefault();\n event.stopPropagation();\n\n const { props, state } = this;\n\n showDebug('Carousel Item', {\n instance: this,\n instanceFields: ['broadcastStatusRefreshTimer', 'isVod', 'timeRefreshTimer', 'viewingHistoryId', 'vtiId'],\n props,\n propsFields: ['currentIndex', 'hubItem', 'item', 'itemData', 'itemIndex', 'sectionTitle'],\n state,\n stateFields: ['isLiveRecording', 'tvLocationMetadata', 'vodLocations'],\n });\n }\n };\n\n startBroadcastStatusRefreshTimer: () => void = () => {\n const { broadcastStatus } = this.state;\n\n this.resetBroadcastStatusRefreshTimer();\n\n if (broadcastStatus === BroadcastStatus.Past) {\n // A past item will never change, no need to check again\n return;\n }\n\n this.broadcastStatusRefreshTimer = setTimeout(this.updateBroadcastStatus, REFRESH_TIMEOUT);\n };\n\n resetBroadcastStatusRefreshTimer: () => void = () => {\n if (this.broadcastStatusRefreshTimer) {\n clearTimeout(this.broadcastStatusRefreshTimer);\n this.broadcastStatusRefreshTimer = null;\n }\n };\n\n updateBroadcastStatus: () => void = () => {\n const { item } = this.props;\n this.setState({ broadcastStatus: getBroadcastStatus(item) }, this.startBroadcastStatusRefreshTimer);\n };\n\n checkRecordingState: () => void = () => {\n const {\n item,\n item: { selectedProgramId },\n itemData,\n npvrRecordingsFuture,\n npvrRecordingsList,\n npvrScheduledRecordingsList,\n } = this.props;\n const { broadcastStatus } = this.state;\n\n const { hasRecording } = getEpisodeAndSeriesRecordStatus(selectedProgramId, itemData?.seriesMetadata?.id, item, npvrRecordingsList, npvrRecordingsFuture, npvrScheduledRecordingsList);\n\n this.setState({ isLiveRecording: hasRecording && broadcastStatus === BroadcastStatus.Live });\n };\n\n loadData: () => void = () => {\n const { item } = this.props;\n\n if (!item) {\n return;\n }\n\n this.setState({ ...InitialState });\n\n this.updateBroadcastStatus();\n this.checkRecordingState();\n this.loadVodLocations();\n this.loadTVLocationMetadata();\n };\n\n loadTVLocationMetadata: () => void = () => {\n const {\n item: {\n selectedLocation: { id },\n type,\n },\n localSendV8MetadataLocationRequest,\n } = this.props;\n const { broadcastStatus } = this.state;\n const {\n abortController: { signal },\n isVod,\n } = this;\n\n if (isVod || !id || type === FAKE_EPG_LIVE_ITEM_TYPE) {\n return;\n }\n\n localSendV8MetadataLocationRequest(id, signal)\n .then((requestResponse: NETGEM_API_V8_REQUEST_RESPONSE) => {\n signal.throwIfAborted();\n\n const {\n result,\n result: {\n location: { target },\n },\n } = requestResponse;\n this.setState({\n previewCatchupScheduledEventId: broadcastStatus === BroadcastStatus.Preview ? target : null,\n tvLocationMetadata: result,\n });\n })\n .catch((error) => ignoreIfAborted(signal, error));\n };\n\n loadVodLocations: () => void = () => {\n const {\n item: { locations },\n localGetVodLocations,\n purchaseList,\n } = this.props;\n const {\n abortController: { signal },\n isVod,\n } = this;\n\n if (!isVod || !locations) {\n return;\n }\n\n localGetVodLocations(locations, signal)\n .then((vodLocations) => {\n signal.throwIfAborted();\n\n const { viewingHistoryId, vtiId } = getVodStatusFromLocations(vodLocations, purchaseList);\n this.viewingHistoryId = viewingHistoryId;\n this.vtiId = vtiId;\n\n this.setState({ vodLocations });\n })\n .catch((error) => ignoreIfAborted(signal, error));\n };\n\n handlePlayButtonOnClick = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>): void => {\n event.preventDefault();\n event.stopPropagation();\n\n const {\n channels,\n commercialOffers,\n defaultOnItemClick,\n defaultRights,\n isRegisteredAsGuest,\n isSubscriptionFeatureEnabled,\n item,\n item: { type: itemType },\n itemData,\n localHideModal,\n onItemClick,\n userRights,\n } = this.props;\n const { previewCatchupScheduledEventId, tvLocationMetadata, vodLocations } = this.state;\n const { isVod, viewingHistoryId, vtiId } = this;\n\n if (!itemData) {\n // Probably backend error\n return;\n }\n\n const { programMetadata, seriesMetadata, tileType } = itemData;\n const distributorId = getDistributorId(vodLocations);\n\n const cardData: CARD_DATA_MODAL_TYPE = {\n distributorId,\n item,\n programMetadata: programMetadata ?? null,\n seriesMetadata: seriesMetadata ?? null,\n tileType: tileType ?? TileConfigTileType.Gemtv,\n urlDefinition: undefined,\n viewingHistoryId,\n vtiId,\n };\n\n if (seriesMetadata && tvLocationMetadata) {\n // In case of TV series item, add the series card URL definition (if found) so that the episodes will be displayed on the card\n const urlDefinition = getSeriesCardUrlDefinition(onItemClick, defaultOnItemClick);\n if (urlDefinition !== null) {\n cardData.urlDefinition = urlDefinition;\n }\n }\n\n if (\n !isPlaybackGranted(\n isRegisteredAsGuest,\n isSubscriptionFeatureEnabled,\n cardData,\n programMetadata?.authority,\n ItemContent.TV,\n tvLocationMetadata?.location,\n channels,\n commercialOffers,\n defaultRights,\n userRights,\n )\n ) {\n // Playback denied: log-in or subscribe page has been requested\n localHideModal();\n return;\n }\n\n if (item && (programMetadata || itemType === FAKE_EPG_LIVE_ITEM_TYPE)) {\n if (isVod) {\n // Not sure this case is possible since there's no \"Play\" button for VOD slides, but if so, location Id (from VOD location metadata) should be passed\n Messenger.emit(MessengerEvents.OPEN_PLAYER, {\n distributorId,\n item,\n programMetadata,\n seriesMetadata,\n type: ExtendedItemType.VOD,\n viewingHistoryId,\n vtiId,\n });\n } else {\n Messenger.emit(MessengerEvents.OPEN_PLAYER, {\n item,\n previewCatchupScheduledEventId,\n programMetadata,\n seriesMetadata,\n type: ExtendedItemType.TV,\n });\n }\n }\n };\n\n handleItemClick = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>): void => {\n event.preventDefault();\n event.stopPropagation();\n\n const { item, itemData } = this.props;\n const { isVod } = this;\n\n if (!itemData) {\n // Probably backend error\n return;\n }\n\n const { programMetadata, seriesMetadata, tileType } = itemData;\n\n if (item && programMetadata) {\n Messenger.emit(MessengerEvents.ITEM_CLICKED, {\n item,\n programMetadata: programMetadata ?? null,\n seriesMetadata: seriesMetadata ?? null,\n tileType: tileType ?? TileConfigTileType.Gemtv,\n type: isVod ? ExtendedItemType.VOD : ExtendedItemType.TV,\n });\n }\n };\n\n renderOverTitle = (item: NETGEM_API_V8_FEED_ITEM): React.Node => {\n const { channels, hubItem, sectionTitle } = this.props;\n const { isVod } = this;\n\n if (isVod) {\n return <div className='text'>{sectionTitle}</div>;\n }\n\n const {\n selectedLocation: { channelId },\n } = item;\n if (!channelId) {\n return null;\n }\n\n const { [channelId]: channel } = channels;\n if (!channel) {\n return null;\n }\n\n const { epgid, name } = channel;\n const isClickable = process.env.REACT_APP_ID !== APPLICATION_ID.FranceChannel && (!hubItem || hubItem.id !== epgid);\n\n const handleChannelOnClick = () => {\n const channelItem = createItemFromChannel(channel);\n\n if (channelItem) {\n Messenger.emit(MessengerEvents.ITEM_CLICKED, { item: channelItem });\n }\n };\n\n return (\n <>\n <div className={clsx('text', isClickable && 'clickable')} onClick={isClickable ? handleChannelOnClick : undefined}>\n {name}\n </div>\n <div className='separator'>|</div>\n </>\n );\n };\n\n renderTitleInternal = (): string => {\n const { itemData } = this.props;\n\n if (itemData) {\n const { programMetadata, seriesMetadata } = itemData;\n\n if (seriesMetadata) {\n const translatedTitleText = getTitle(seriesMetadata, Localizer.language);\n if (translatedTitleText) {\n return translatedTitleText;\n }\n }\n\n if (programMetadata) {\n const { titles } = programMetadata;\n const seasonEpisodeText = formatSeasonEpisodeNbr(programMetadata);\n const translatedTitleText = getTranslatedText(titles, Localizer.language);\n\n if (seasonEpisodeText && translatedTitleText) {\n return `${seasonEpisodeText} - ${translatedTitleText}`;\n } else if (seasonEpisodeText) {\n return seasonEpisodeText;\n } else if (translatedTitleText) {\n return translatedTitleText;\n }\n }\n }\n\n return '\\u00A0';\n };\n\n renderTitle = (): React.Node => <div className='title'>{this.renderTitleInternal()}</div>;\n\n getWatchingStatus = (): number | null => {\n const {\n item,\n item: { locType },\n itemData,\n purchaseList,\n viewingHistory,\n viewingHistoryStatus,\n } = this.props;\n const { vodLocations } = this.state;\n const { isVod } = this;\n\n let vodStatus: VOD_STATUS_TYPE | null = null;\n\n if (isVod) {\n vodStatus = getVodStatusFromLocations(vodLocations, purchaseList);\n const { status } = vodStatus;\n if (status === BOVodAssetStatus.Locked) {\n // Item has been watched (at least partially) but its rent has expired\n return 0;\n }\n }\n\n if (!itemData) {\n // Probably backend error\n return 0;\n }\n\n const { programMetadata } = itemData;\n\n if (!programMetadata || viewingHistoryStatus !== LoadableStatus.Loaded || locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT) {\n return 0;\n }\n\n return getProgress(viewingHistory, item, programMetadata, null, false, vodStatus);\n };\n\n renderActionPanel = (): React.Node => {\n const {\n item,\n item: { type },\n } = this.props;\n const { broadcastStatus } = this.state;\n const { isVod } = this;\n\n const progress = broadcastStatus === BroadcastStatus.Live ? getItemLiveProgress(item) : this.getWatchingStatus();\n\n const playButton =\n type === FAKE_EPG_LIVE_ITEM_TYPE || (!isVod && (broadcastStatus === BroadcastStatus.Past || broadcastStatus === BroadcastStatus.Preview || broadcastStatus === BroadcastStatus.Live)) ? (\n <ButtonFX allowZeroProgress={broadcastStatus === BroadcastStatus.Live} className='spacedButton' key='play' onClick={this.handlePlayButtonOnClick} progress={progress}>\n {Localizer.localize(broadcastStatus === BroadcastStatus.Live ? 'common.actions.watch_live' : 'common.actions.watch')}\n </ButtonFX>\n ) : null;\n const moreInfoButton =\n type !== FAKE_EPG_LIVE_ITEM_TYPE ? (\n <ButtonFX key='moreInfo' onClick={this.handleItemClick}>\n {Localizer.localize('common.actions.more_info')}\n </ButtonFX>\n ) : null;\n\n return (\n <>\n {playButton}\n {moreInfoButton}\n </>\n );\n };\n\n render(): React.Node {\n const { currentIndex, isDebugModeEnabled, item, itemIndex } = this.props;\n const { isLiveRecording } = this.state;\n const { isVod } = this;\n\n const liveRecordingIconElement = isLiveRecording ? (\n <div className='liveRecording'>\n <PictoRecord className='recording live' hasBackground />\n <div className='text'>{Localizer.localize('common.status.live_recording')}</div>\n </div>\n ) : null;\n\n return (\n <div className={clsx('itemSlide', isVod && 'vod', itemIndex === currentIndex && 'visible')} onClick={isDebugModeEnabled ? this.handleDebugOnClick : undefined}>\n <div className='infoContainer'>\n <div className='overTitle'>\n {this.renderOverTitle(item)}\n {isVod ? null : <StatusPicto item={item} />}\n {liveRecordingIconElement}\n </div>\n {this.renderTitle()}\n <div className='iconBar'>{this.renderActionPanel()}</div>\n </div>\n </div>\n );\n }\n}\n\nconst mapStateToProps = (state: CombinedReducers): ReduxItemSlideReducerStateType => {\n return {\n channels: state.appConfiguration.deviceChannels,\n commercialOffers: state.appConfiguration.rightsCommercialOffers,\n defaultOnItemClick: state.ui.defaultActions ? state.ui.defaultActions.onItemClick : null,\n defaultRights: state.appConfiguration.rightsDefault,\n isDebugModeEnabled: state.appConfiguration.isDebugModeEnabled,\n isRegisteredAsGuest: state.appRegistration.registration === RegistrationType.RegisteredAsGuest,\n isSubscriptionFeatureEnabled: state.appConfiguration.features[FEATURE_SUBSCRIPTION],\n npvrRecordingsFuture: state.npvr.npvrRecordingsFuture,\n npvrRecordingsList: state.npvr.npvrRecordingsList,\n npvrScheduledRecordingsList: state.npvr.npvrScheduledRecordingsList,\n purchaseList: state.appRegistration.registration === RegistrationType.RegisteredAsGuest ? {} : (state.ui.purchaseList ?? {}),\n userRights: state.appConfiguration.rightsUser,\n viewingHistory: state.ui.viewingHistory,\n viewingHistoryStatus: state.ui.viewingHistoryStatus,\n };\n};\n\nconst mapDispatchToProps = (dispatch: Dispatch): ReduxItemSlideDispatchToPropsType => {\n return {\n localGetVodLocations: (locations: Array<NETGEM_API_V8_ITEM_LOCATION>, signal?: AbortSignal): Promise<any> => dispatch(getVodLocations(locations, signal)),\n localHideModal: () => dispatch(hideModal()),\n localSendV8MetadataLocationRequest: (assetId: string, signal?: AbortSignal): Promise<any> => dispatch(sendV8MetadataLocationRequest(assetId, signal)),\n };\n};\n\nconst ItemSlide: React.ComponentType<ItemSlidePropType> = connect(mapStateToProps, mapDispatchToProps, null, { forwardRef: true })(ItemSlideView);\n\nexport default ItemSlide;\n","/* @flow */\n\nimport './Section.css';\nimport * as React from 'react';\nimport { type AllSettledPromises, SettledPromiseFulfilled } from '../../../helpers/jsHelpers/promise';\nimport { CAROUSEL_BACKGROUND_IMAGE_HEIGHT, CAROUSEL_BACKGROUND_IMAGE_WIDTH, EPG, HUB_IMAGE_HEIGHT, HUB_IMAGE_WIDTH, VOD_TILE_HEIGHT, VOD_TILE_WIDTH } from '../../../helpers/ui/constants';\nimport {\n CarouselSectionType,\n type CompleteSectionPropType,\n type DefaultProps,\n IMAGE_MAX_ITEMS,\n ITEM_CHANGE_TIMEOUT,\n type ReduxSectionDispatchToPropsType,\n type ReduxSectionReducerStateType,\n type SectionPropType,\n type SectionStateType,\n UI_HIDE_TIMEOUT,\n VIDEO_MAX_ITEMS,\n} from './SectionConstsAndTypes';\nimport { IMAGE_TAG_NO_TEXT, findLandscapeImageId } from '../../../helpers/ui/metadata/image';\nimport { LEFT, RIGHT } from 'react-swipeable';\nimport {\n METADATA_KIND_PROGRAM,\n METADATA_KIND_SERIES,\n type MetadataKind,\n type NETGEM_API_V8_METADATA,\n type NETGEM_API_V8_METADATA_PROGRAM,\n type NETGEM_API_V8_METADATA_SERIES,\n} from '../../../libs/netgemLibrary/v8/types/MetadataProgram';\nimport { Messenger, MessengerEvents } from '@ntg/utils/dist/messenger';\nimport { PictoArrowLeft, PictoArrowRight, PictoFullscreen, PictoPause, PictoPlay } from '@ntg/components/dist/pictos/Element';\nimport { SectionDisplayType, SectionType, type SwipeEventData } from '../../../helpers/ui/section/types';\nimport { TIPPY_DEFAULT_OPTIONS, type TippyOptionsType } from '@ntg/ui/dist/tooltip';\nimport { Theme, type ThemeType } from '@ntg/ui/dist/theme';\nimport { logDebug, showDebug } from '../../../helpers/debug/debug';\nimport { updateVideoCarouselMuted, updateVideoCarouselPaused, updateVideoCarouselPlaying, updateVideoCarouselUnmuted } from '../../../redux/ui/actions';\nimport type { CombinedReducers } from '../../../redux/reducers';\nimport type { Dispatch } from '../../../redux/types/types';\nimport EpgManager from '../../../helpers/epg/epgManager';\nimport Equalizer from '../../equalizer/Equalizer';\nimport { FAKE_EPG_LIVE_ITEM_TYPE } from '../../../helpers/ui/item/types';\nimport { FeedProviderKind } from '../../../libs/netgemLibrary/v8/types/Feed';\nimport HotKeys from '../../../helpers/hotKeys/hotKeys';\nimport type { ItemData } from './Types';\nimport ItemIndex from './ItemIndex';\nimport ItemSlide from './Slide';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport type { NETGEM_API_V8_FEED } from '../../../libs/netgemLibrary/v8/types/FeedItem';\nimport type { NETGEM_API_V8_METADATA_SCHEDULE_VIDEO_STREAM_PARAM } from '../../../libs/netgemLibrary/v8/types/MetadataSchedule';\nimport { type NETGEM_API_V8_REQUEST_RESPONSE } from '../../../libs/netgemLibrary/v8/types/RequestResponse';\nimport { type NETGEM_API_V8_SECTION } from '../../../libs/netgemLibrary/v8/types/Section';\nimport Swipeable from '../../swipeable/swipeable';\nimport { TileConfigTileType } from '../../../libs/netgemLibrary/v8/types/WidgetConfig';\nimport Tippy from '@tippyjs/react';\nimport type { Undefined } from '@ntg/utils/dist/types';\nimport clsx from 'clsx';\nimport { connect } from 'react-redux';\nimport { dailyShuffleArray } from '../../../helpers/maths/maths';\nimport { getImageUrl } from '../../../redux/netgemApi/actions/v8/metadataImage';\nimport { getSectionChannels } from '../../../helpers/channel/helper';\nimport { getTileConfig } from '../../../helpers/ui/section/tile';\nimport { getTrailer } from '../../../helpers/videofutur/metadata';\nimport getTranslatedText from '../../../libs/netgemLibrary/v8/helpers/Lang';\nimport { getValuesFromQueryString } from '../section/helper';\nimport { ignoreIfAborted } from '../../../libs/netgemLibrary/helpers/cancellablePromise/promiseHelper';\nimport { isVodItem } from '../../../helpers/ui/item/metadata';\nimport { produce } from 'immer';\nimport sendV8MetadataRequest from '../../../redux/netgemApi/actions/v8/metadata';\nimport sendV8SectionFeedRequest from '../../../redux/netgemApi/actions/v8/feed';\n\nconst InitialState: $ReadOnly<SectionStateType> = Object.freeze({\n currentIndex: -1,\n displayType: SectionDisplayType.Regular,\n feed: [],\n hubImageUrl: null,\n imageUrlList: [],\n isCollapsed: false,\n isUIHidden: false,\n itemDataList: [],\n selectedItemIndices: [],\n trailerUrlList: [],\n});\n\nclass SectionCarouselView extends React.PureComponent<CompleteSectionPropType, SectionStateType> {\n abortController: AbortController;\n\n carouselTimerId: TimeoutID | null;\n\n isMouseOverSection: boolean;\n\n isVideo: boolean;\n\n liveFeedTimer: TimeoutID | null;\n\n observer: ?IntersectionObserver;\n\n sectionChannels: Set<string> | null;\n\n sectionElement: HTMLElement | null;\n\n sectionTitle: ?string;\n\n sectionType: ?CarouselSectionType;\n\n tileType: TileConfigTileType;\n\n uiHideTimerId: TimeoutID | null;\n\n wasTrailerPlaying: boolean;\n\n static defaultProps: DefaultProps = {\n onItemClick: undefined,\n onUIHiddenCallback: undefined,\n onUIShownCallback: undefined,\n };\n\n constructor(props: CompleteSectionPropType) {\n super(props);\n\n const { section } = props;\n const { type } = getTileConfig(section);\n\n this.abortController = new AbortController();\n this.carouselTimerId = null;\n this.isMouseOverSection = false;\n this.isVideo = false;\n this.liveFeedTimer = null;\n this.observer = null;\n this.sectionChannels = null;\n this.sectionElement = null;\n this.tileType = type;\n this.uiHideTimerId = null;\n this.wasTrailerPlaying = false;\n\n const { gridSectionId } = props;\n const isCollapsed = gridSectionId !== null;\n\n this.state = {\n ...InitialState,\n displayType: isCollapsed ? SectionDisplayType.Collapsed : SectionDisplayType.Regular,\n isCollapsed,\n };\n }\n\n componentDidMount() {\n const { section } = this.props;\n\n Messenger.on(MessengerEvents.VIDEO_CAROUSEL_ENDED, this.handleTrailerEnded);\n Messenger.on(MessengerEvents.AVENUE_RESET, this.reset);\n\n this.resetBackgroundCarousel();\n\n this.sectionTitle = getTranslatedText(section.title, Localizer.language);\n this.loadData();\n this.loadHubImage();\n }\n\n componentDidUpdate(prevProps: CompleteSectionPropType, prevState: SectionStateType) {\n const {\n avenueIndex,\n dataLoadedCallback,\n gridSectionId,\n isInTheaterMode,\n section: { id },\n sectionIndex,\n } = this.props;\n const { feed, imageUrlList, isCollapsed, selectedItemIndices, trailerUrlList } = this.state;\n const { gridSectionId: prevGridSectionId, isInTheaterMode: prevIsInTheaterMode } = prevProps;\n const { feed: prevFeed, imageUrlList: prevImageUrlList, isCollapsed: prevIsCollapsed, selectedItemIndices: prevSelectedItemIndices, trailerUrlList: prevTrailerUrlList } = prevState;\n\n if (imageUrlList !== prevImageUrlList) {\n Messenger.emit(MessengerEvents.IMAGE_CAROUSEL_SET, imageUrlList);\n this.startCarousel();\n }\n\n if (trailerUrlList !== prevTrailerUrlList) {\n Messenger.emit(MessengerEvents.VIDEO_CAROUSEL_SET, trailerUrlList);\n this.startCarousel();\n }\n\n if (gridSectionId !== prevGridSectionId) {\n this.updateIsCollapsed();\n }\n\n if (isInTheaterMode !== prevIsInTheaterMode) {\n if (isInTheaterMode) {\n this.disabledHotKeys();\n } else {\n this.enabledHotKeys();\n }\n }\n\n if (isCollapsed !== prevIsCollapsed) {\n if (isCollapsed) {\n this.collapse();\n } else if (feed.length > 0) {\n this.show();\n }\n }\n\n if (selectedItemIndices !== prevSelectedItemIndices && selectedItemIndices.length === 0) {\n // Carousel is empty\n this.collapse();\n dataLoadedCallback(id, sectionIndex, avenueIndex, 0);\n }\n\n if (prevFeed === feed) {\n return;\n }\n\n if (feed.length > 0) {\n this.initializeItemList();\n if (gridSectionId === null) {\n this.show();\n }\n } else {\n // Carousel is empty\n this.collapse();\n dataLoadedCallback(id, sectionIndex, avenueIndex, 0);\n }\n }\n\n componentWillUnmount() {\n const { abortController, isVideo, liveFeedTimer, observer, sectionElement } = this;\n\n abortController.abort('Component SectionCarousel will unmount');\n\n Messenger.off(MessengerEvents.VIDEO_CAROUSEL_ENDED, this.handleTrailerEnded);\n Messenger.off(MessengerEvents.AVENUE_RESET, this.reset);\n\n // Clear timer\n if (liveFeedTimer) {\n clearTimeout(liveFeedTimer);\n }\n\n if (observer && sectionElement) {\n observer.unobserve(sectionElement);\n }\n\n this.resetCarouselTimer();\n this.resetBackgroundCarousel();\n\n if (isVideo) {\n this.disabledHotKeys();\n }\n }\n\n updateIsCollapsed: () => void = () => {\n const { gridSectionId } = this.props;\n const { selectedItemIndices } = this.state;\n\n this.setState({ isCollapsed: gridSectionId !== null || selectedItemIndices.length === 0 });\n };\n\n enabledHotKeys: () => void = () => {\n HotKeys.register('f', this.handleFullscreenHotKey, { name: 'VideoCarouselSection.fullscreen' });\n HotKeys.register('m', this.handleMuteHotKey, { name: 'VideoCarouselSection.mute' });\n HotKeys.register('space', this.handlePlayHotKey, { name: 'VideoCarouselSection.play' });\n };\n\n disabledHotKeys: () => void = () => {\n HotKeys.unregister('f', this.handleFullscreenHotKey);\n HotKeys.unregister('m', this.handleMuteHotKey);\n HotKeys.unregister('space', this.handlePlayHotKey);\n };\n\n handleDebugOnClick: (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => void = (event) => {\n if (event.ctrlKey) {\n event.preventDefault();\n event.stopPropagation();\n\n const { props, state } = this;\n\n showDebug('Carousel Section', {\n instance: this,\n instanceFields: ['abortController', 'carouselTimerId', 'isMouseOverSection', 'isVideo', 'sectionTitle', 'sectionType', 'uiHideTimerId', 'wasTrailerPlaying'],\n props,\n propsFields: ['avenueImageUri', 'avenueIndex', 'gridSectionId', 'hubItem', 'isHubItemVisible', 'section', 'sectionIndex', 'videoCarousel'],\n state,\n stateFields: ['currentIndex', 'displayType', 'feed', 'hubImageUrl', 'imageUrlList', 'isCollapsed', 'isUIHidden', 'itemDataList', 'selectedItemIndices', 'trailerUrlList'],\n });\n\n // Show image/video carousel as well (no way to click on it, so it starts from here)\n Messenger.emit(MessengerEvents.CAROUSEL_SHOW_DEBUG);\n }\n };\n\n // Toggle fullscreen\n handleFullscreenHotKey: (event: SyntheticKeyboardEvent<HTMLElement>) => void = (event) => {\n event.preventDefault();\n event.stopPropagation();\n\n Messenger.emit(MessengerEvents.VIDEO_CAROUSEL_TOGGLE_FULLSCREEN);\n };\n\n // Mute/unmute\n handleMuteHotKey: (event: SyntheticKeyboardEvent<HTMLElement>) => void = (event) => {\n event.preventDefault();\n event.stopPropagation();\n\n this.toggleSound();\n };\n\n // Play/pause\n handlePlayHotKey: (event: SyntheticKeyboardEvent<HTMLElement>) => void = (event) => {\n const {\n videoCarousel: { isPlaying },\n } = this.props;\n\n event.preventDefault();\n event.stopPropagation();\n\n if (isPlaying) {\n this.pauseVideo();\n } else {\n this.playVideo();\n }\n };\n\n handleTrailerEnded: () => void = () => {\n const {\n currentIndex,\n selectedItemIndices: { length: itemCount },\n } = this.state;\n\n if (currentIndex < itemCount - 1) {\n // Go to next trailer\n this.displayNextItem();\n } else {\n // All trailers have been played once: go back to first one without starting it\n Messenger.emit(MessengerEvents.VIDEO_CAROUSEL_STOP);\n this.setState({ currentIndex: 0 });\n this.resetUIHideTimer(false);\n }\n };\n\n refreshNpvr: () => void = () => {\n Messenger.emit(MessengerEvents.REFRESH_NPVR);\n };\n\n collapse: () => void = () => {\n const {\n videoCarousel: { isPlaying },\n } = this.props;\n\n Messenger.emit(MessengerEvents.CAROUSEL_HIDE);\n this.resetCarouselTimer();\n this.setState({ displayType: SectionDisplayType.Collapsed });\n\n if (isPlaying) {\n this.wasTrailerPlaying = true;\n this.pauseVideo();\n } else {\n this.wasTrailerPlaying = false;\n }\n };\n\n show: () => void = () => {\n const { currentIndex } = this.state;\n const { isVideo, wasTrailerPlaying } = this;\n\n Messenger.emit(MessengerEvents.CAROUSEL_SHOW);\n this.setState({ displayType: SectionDisplayType.Regular });\n\n if (currentIndex > -1 && !isVideo) {\n this.displayItemIndex(currentIndex);\n }\n\n if (wasTrailerPlaying) {\n this.wasTrailerPlaying = false;\n this.playVideo();\n }\n };\n\n resetBackgroundCarousel: () => void = () => {\n Messenger.emit(MessengerEvents.IMAGE_CAROUSEL_SET, null);\n Messenger.emit(MessengerEvents.VIDEO_CAROUSEL_SET, null);\n };\n\n loadHubImage: () => void = () => {\n const { avenueImageUri, hubItem, localGetImageUrl } = this.props;\n const {\n abortController: { signal },\n } = this;\n\n const uri = avenueImageUri ?? hubItem?.id;\n\n if (!uri) {\n return;\n }\n\n localGetImageUrl(uri, HUB_IMAGE_WIDTH, HUB_IMAGE_HEIGHT, Theme.Dark, signal)\n .then((hubImageUrl: string) => {\n signal.throwIfAborted();\n\n this.setState({ hubImageUrl });\n })\n .catch((error) => ignoreIfAborted(signal, error));\n };\n\n loadData: () => void = () => {\n const {\n channels,\n section,\n section: {\n model: { provider, uri },\n },\n state,\n } = this.props;\n\n if (!uri) {\n return;\n }\n\n if (provider === FeedProviderKind.Local) {\n // Feed of local channels\n const { channels: channelsParam, event } = getValuesFromQueryString(uri, ['channels', 'event']);\n this.sectionChannels = getSectionChannels(section, channelsParam, channels, state);\n\n if (event !== null) {\n // Live feed\n this.sectionType = CarouselSectionType.Live;\n this.updateLiveSection();\n } else {\n // Channels feed (e.g. FAST channels)\n this.sectionType = CarouselSectionType.Regular;\n const feed = EpgManager.buildFakeChannelsSection(section, this.sectionChannels);\n if (feed !== null) {\n this.setState({ feed });\n }\n }\n } else {\n // Regular feed\n this.sectionType = CarouselSectionType.Regular;\n this.buildRegularSection();\n }\n };\n\n updateLiveSection: () => void = () => {\n const {\n avenueIndex,\n dataLoadedCallback,\n section,\n section: { id },\n sectionIndex,\n } = this.props;\n const { feed: prevFeed } = this.state;\n const { sectionChannels } = this;\n\n if (sectionChannels !== null && !EpgManager.isRefreshing()) {\n const newLiveFeed = EpgManager.getLiveFeed(section, sectionChannels);\n const feedItemIds = prevFeed.map((i) => i.selectedProgramId);\n\n let shouldNpvrBeRefreshed = false;\n if (newLiveFeed.length !== feedItemIds.length) {\n if (feedItemIds.length > 0) {\n shouldNpvrBeRefreshed = true;\n }\n this.setState({ feed: newLiveFeed });\n } else {\n for (let i = 0; i < newLiveFeed.length; i++) {\n if (newLiveFeed[i].selectedProgramId !== feedItemIds[i]) {\n // Only update feed in state if at least one program has changed (a program ended and a new one started)\n this.setState({ feed: newLiveFeed });\n break;\n }\n }\n }\n\n if (shouldNpvrBeRefreshed) {\n this.refreshNpvr();\n }\n\n // Notify avenue and tell it how many items were loaded\n dataLoadedCallback(id, sectionIndex, avenueIndex, newLiveFeed.length);\n\n if (newLiveFeed.length === 0) {\n // Empty live feed\n this.collapse();\n }\n }\n\n this.liveFeedTimer = setTimeout(this.updateLiveSection, EpgManager.isRefreshing() ? EPG.IntervalLiveFeedEpgRefreshing : EPG.IntervalLiveFeedEpgReady);\n };\n\n buildRegularSection: () => void = () => {\n const {\n avenueIndex,\n dataLoadedCallback,\n localSendV8SectionFeedRequest,\n section,\n section: { id, kind },\n sectionIndex,\n } = this.props;\n const {\n abortController: { signal },\n } = this;\n\n localSendV8SectionFeedRequest(section, signal)\n .then((response: NETGEM_API_V8_REQUEST_RESPONSE) => {\n signal.throwIfAborted();\n\n const feed = ((response: any): NETGEM_API_V8_FEED);\n if (kind === SectionType.HeroPanel && feed.length > 1) {\n // Only keep first item for hero panel section\n feed.length = 1;\n }\n this.setState({ feed });\n })\n .catch((error) =>\n ignoreIfAborted(signal, error, () => {\n this.setState({ feed: [] });\n dataLoadedCallback(id, sectionIndex, avenueIndex, 0);\n }),\n );\n };\n\n renderItemSlides: () => Array<React.Node> = () => {\n const { hubItem, onItemClick } = this.props;\n const { currentIndex, feed, itemDataList, selectedItemIndices } = this.state;\n const { sectionTitle } = this;\n\n if (feed.length === 0) {\n return [];\n }\n\n return selectedItemIndices.map((feedIndex, carouselIndex) => {\n const { [feedIndex]: item } = feed;\n const { [feedIndex]: itemData } = itemDataList;\n\n return (\n <ItemSlide\n currentIndex={currentIndex}\n hubItem={hubItem}\n item={item}\n itemData={itemData ?? null}\n itemIndex={carouselIndex}\n key={item.id}\n onItemClick={onItemClick}\n sectionTitle={sectionTitle}\n />\n );\n });\n };\n\n renderIndices: () => Array<React.Node> = () => {\n const { currentIndex, itemDataList, selectedItemIndices } = this.state;\n\n return selectedItemIndices.map((feedIndex, carouselIndex) => (\n <ItemIndex currentIndex={currentIndex} index={carouselIndex} itemData={itemDataList[feedIndex] ?? null} key={feedIndex} onClick={this.handleItemIndexOnClick} />\n ));\n };\n\n updateItemData: (feedIndex: number, partialState: any) => void = (feedIndex, partialState) => {\n this.setState(\n produce((draft) => {\n draft.itemDataList[feedIndex] = {\n ...draft.itemDataList[feedIndex],\n ...partialState,\n };\n }),\n );\n };\n\n getProgramMetadata: (feedIndex: number, programId: string, signal: AbortSignal) => Promise<any> = (feedIndex, programId, signal) => {\n const { localSendV8MetadataRequest } = this.props;\n\n return localSendV8MetadataRequest(programId, METADATA_KIND_PROGRAM, signal)\n .then((metadata: NETGEM_API_V8_METADATA) => {\n signal.throwIfAborted();\n\n return ((metadata: any): NETGEM_API_V8_METADATA_PROGRAM);\n })\n .catch((error) => ignoreIfAborted(signal, error));\n };\n\n getSeriesMetadata: (feedIndex: number, seriesId: string, signal: AbortSignal) => Promise<any> = (feedIndex, seriesId, signal) => {\n const { localSendV8MetadataRequest } = this.props;\n\n return localSendV8MetadataRequest(seriesId, METADATA_KIND_SERIES, signal)\n .then((metadata: NETGEM_API_V8_METADATA) => {\n signal.throwIfAborted();\n\n return ((metadata: any): NETGEM_API_V8_METADATA_SERIES);\n })\n .catch((error) => ignoreIfAborted(signal, error));\n };\n\n getImageUrl: (programId: string, programMetadata?: NETGEM_API_V8_METADATA_PROGRAM, seriesMetadata?: NETGEM_API_V8_METADATA_SERIES, signal: AbortSignal) => Promise<Undefined<string>> = (\n programId,\n programMetadata,\n seriesMetadata,\n signal,\n ) => {\n const { localGetImageUrl } = this.props;\n const { isVideo } = this;\n\n const width = isVideo ? VOD_TILE_WIDTH : CAROUSEL_BACKGROUND_IMAGE_WIDTH;\n const height = isVideo ? VOD_TILE_HEIGHT : CAROUSEL_BACKGROUND_IMAGE_HEIGHT;\n\n let imageId: ?string = null;\n const imagesMetadata = seriesMetadata?.images ?? programMetadata?.images;\n\n if (imagesMetadata && !isVideo) {\n imageId = findLandscapeImageId(imagesMetadata, IMAGE_TAG_NO_TEXT);\n }\n\n if (!imageId) {\n imageId = programId;\n }\n\n return localGetImageUrl(imageId, width, height, undefined, signal)\n .then((imageUrl: string) => {\n signal.throwIfAborted();\n\n return imageUrl;\n })\n .catch((error) => ignoreIfAborted(signal, error));\n };\n\n getItemData: (feedIndex: number, carouselIndex: number, signal: AbortSignal) => Promise<ItemData> = (feedIndex, carouselIndex, signal) => {\n const {\n feed: {\n [feedIndex]: { selectedProgramId, seriesId, type },\n },\n } = this.state;\n const { tileType } = this;\n\n const badItem = {\n carouselIndex,\n imageUrl: undefined,\n programMetadata: undefined,\n seriesMetadata: undefined,\n tileType: undefined,\n };\n\n if (type === FAKE_EPG_LIVE_ITEM_TYPE) {\n return Promise.resolve(badItem);\n }\n\n const promises = [this.getProgramMetadata(feedIndex, selectedProgramId, signal)];\n\n if (seriesId) {\n promises.push(this.getSeriesMetadata(feedIndex, seriesId, signal));\n }\n\n return Promise.allSettled(promises).then((results: AllSettledPromises) => {\n const [programMetadataPromise, seriesMetadataPromise] = results;\n\n if (programMetadataPromise.status === SettledPromiseFulfilled && (!seriesMetadataPromise || seriesMetadataPromise.status === SettledPromiseFulfilled)) {\n // All promises were successful\n const programMetadata = programMetadataPromise.value;\n const seriesMetadata = seriesMetadataPromise?.value;\n\n return this.getImageUrl(selectedProgramId, programMetadata, seriesMetadata, signal)\n .then((imageUrl) => {\n return {\n carouselIndex,\n imageUrl,\n programMetadata,\n seriesMetadata,\n tileType,\n };\n })\n .catch(() => badItem);\n }\n\n // At least one promise failed\n return badItem;\n });\n };\n\n initializeItemList: () => void = () => {\n const {\n section: { kind },\n } = this.props;\n const {\n feed,\n feed: { length: availableItemCount },\n } = this.state;\n\n if (availableItemCount === 0) {\n return;\n }\n\n this.isVideo = kind !== SectionType.HeroPanel && isVodItem(feed[0]);\n\n // Initialize items data (no metadata, image and trailer at first and not displayed (carouselIndex = -1)\n const itemDataList = [];\n for (let i = 0; i < availableItemCount; ++i) {\n itemDataList.push({ carouselIndex: -1 });\n }\n\n if (this.isVideo) {\n this.enabledHotKeys();\n this.observeVideoVisibility();\n }\n\n this.setState({ itemDataList }, this.selectItemIndices);\n };\n\n observeVideoVisibility: () => void = () => {\n const { observer, sectionElement } = this;\n\n if (!sectionElement || observer) {\n return;\n }\n\n this.observer = new IntersectionObserver(\n (entries) => {\n const {\n videoCarousel: { isPlaying },\n } = this.props;\n const { wasTrailerPlaying } = this;\n\n if (entries[0].isIntersecting) {\n // Trailer visible: play video\n if (wasTrailerPlaying) {\n this.wasTrailerPlaying = false;\n this.playVideo();\n }\n } else if (isPlaying) {\n // Trailer hidden: pause video\n this.wasTrailerPlaying = true;\n this.pauseVideo();\n }\n },\n { threshold: [0] },\n );\n\n this.observer.observe(sectionElement);\n };\n\n selectItemIndices: () => void = () => {\n const {\n feed: { length: availableItemCount },\n } = this.state;\n const { isVideo } = this;\n\n const maxItems = isVideo ? VIDEO_MAX_ITEMS : IMAGE_MAX_ITEMS;\n const displayedItemCount = this.sectionType !== CarouselSectionType.Live && availableItemCount > maxItems ? maxItems : availableItemCount;\n\n // Take the first maxItems indices\n const selectedItemIndices = [...Array(displayedItemCount).keys()];\n\n if (isVideo) {\n // For video carousel only, shuffle selected indices using a special RNG that gives the same result for a given day\n dailyShuffleArray(selectedItemIndices);\n }\n\n this.setState({ selectedItemIndices }, this.loadItemsData);\n };\n\n loadItemsData: () => void = () => {\n const { itemDataList, selectedItemIndices } = this.state;\n const {\n abortController: { signal },\n } = this;\n\n const promises = [];\n selectedItemIndices.forEach((feedIndex) => {\n const {\n [feedIndex]: { carouselIndex },\n } = itemDataList;\n\n if (carouselIndex === -1) {\n // Load data for new items in list only\n promises.push(this.getItemData(feedIndex, carouselIndex, signal));\n }\n });\n\n Promise.allSettled(promises).then((results: AllSettledPromises) => {\n if (signal.aborted) {\n return;\n }\n\n const newItemDataList: Array<ItemData> = [];\n\n // Get loaded data from fulfilled promises\n results.forEach((result, index) => {\n if (result.status === SettledPromiseFulfilled) {\n const { imageUrl, programMetadata, seriesMetadata, tileType } = result.value;\n const feedIndex = selectedItemIndices[index];\n newItemDataList[feedIndex] = {\n carouselIndex: index,\n imageUrl,\n programMetadata,\n seriesMetadata,\n tileType,\n };\n }\n });\n\n this.setState({ itemDataList: newItemDataList }, () => {\n if (this.isVideo) {\n this.checkTrailers();\n } else {\n this.startImageCarousel();\n }\n });\n });\n };\n\n checkTrailers: () => void = () => {\n const { streamPriorities } = this.props;\n const { itemDataList, selectedItemIndices } = this.state;\n\n const newSelectedItemIndices = [];\n const trailerUrlList = [];\n\n selectedItemIndices.forEach((selectedIndex, i) => {\n const { [selectedIndex]: itemData } = itemDataList;\n\n if (itemData?.programMetadata) {\n const trailer: NETGEM_API_V8_METADATA_SCHEDULE_VIDEO_STREAM_PARAM | null = getTrailer(streamPriorities, itemData.programMetadata, itemData.seriesMetadata);\n const trailerUrl = trailer?.path;\n\n if (trailerUrl) {\n newSelectedItemIndices.push(selectedIndex);\n trailerUrlList.push(trailerUrl);\n this.updateItemData(selectedIndex, { carouselIndex: i });\n } else {\n logDebug(`No trailer URL for item at index ${selectedIndex} in feed`);\n }\n } else {\n logDebug(`No program metadata for item at index ${selectedIndex} in feed`);\n }\n });\n\n if (trailerUrlList.length > 0) {\n // At least 1 trailer has been found\n this.startVideoCarousel(trailerUrlList);\n\n if (newSelectedItemIndices.length === selectedItemIndices.length) {\n // All items have a trailer\n return;\n }\n }\n\n // Update selected item list with the ones having trailers\n this.setState({ selectedItemIndices: newSelectedItemIndices });\n };\n\n reset: () => void = () => {\n const {\n displayType,\n selectedItemIndices: { length: itemCount },\n } = this.state;\n\n if (displayType === SectionDisplayType.Regular) {\n this.moveToFirstPage();\n } else if (itemCount > 0) {\n this.show();\n }\n };\n\n moveToFirstPage: () => void = () => {\n this.resetCarouselTimer();\n this.displayItemIndex(0);\n };\n\n displayItemIndex: (itemIndex: number) => void = (itemIndex) => {\n const { imageUrlList, trailerUrlList } = this.state;\n\n if (imageUrlList.length + trailerUrlList.length === 0) {\n return;\n }\n\n /*\n * Following lines effect:\n * Video carousel: launches next trailer, then a trailer starts at the end of the previous one, so no need for a timer in this component\n * Image carousel: shows next image\n */\n this.setState({ currentIndex: itemIndex });\n Messenger.emit(MessengerEvents.CAROUSEL_SET_CURRENT_INDEX, itemIndex);\n\n this.startCarouselTimer();\n };\n\n displayNextItem: (direction?: number) => void = (direction) => {\n const {\n currentIndex,\n selectedItemIndices: { length: itemCount },\n } = this.state;\n\n let nextIndex = 0;\n if (typeof direction === 'number' && direction < 0) {\n // Going backward\n nextIndex = (currentIndex + itemCount - 1) % itemCount;\n } else {\n // Going forward\n nextIndex = (currentIndex + 1) % itemCount;\n }\n\n this.displayItemIndex(nextIndex);\n };\n\n areIndicesDifferent: (l1: Array<string>, l2: Array<string>) => boolean = (l1, l2) => l1.length !== l2.length || l1.some((value, index) => value !== l2[index]);\n\n startVideoCarousel: (newTrailerUrlList: Array<string>) => void = (newTrailerUrlList) => {\n const { trailerUrlList } = this.state;\n\n if (this.areIndicesDifferent(newTrailerUrlList, trailerUrlList)) {\n this.setState({ trailerUrlList: newTrailerUrlList });\n }\n };\n\n startImageCarousel: () => void = () => {\n const { itemDataList, selectedItemIndices } = this.state;\n\n if (itemDataList.length === selectedItemIndices.length) {\n this.setState({ imageUrlList: selectedItemIndices.map((index) => itemDataList[index].imageUrl ?? '') });\n }\n };\n\n startCarousel: () => void = () => {\n const {\n avenueIndex,\n dataLoadedCallback,\n section: { id },\n sectionIndex,\n } = this.props;\n const { feed } = this.state;\n\n if (this.carouselTimerId) {\n // Image carousel already started\n return;\n }\n\n // Notify avenue and tell it how many items were loaded\n dataLoadedCallback(id, sectionIndex, avenueIndex, feed.length);\n\n this.startUIHideTimer();\n this.displayNextItem();\n };\n\n startCarouselTimer: () => void = () => {\n const { isVideo } = this;\n\n if (isVideo) {\n return;\n }\n\n // Image carousel\n this.resetCarouselTimer();\n this.carouselTimerId = setTimeout(this.displayNextItem, ITEM_CHANGE_TIMEOUT);\n };\n\n resetCarouselTimer: () => void = () => {\n if (this.carouselTimerId) {\n clearTimeout(this.carouselTimerId);\n this.carouselTimerId = null;\n }\n\n this.resetUIHideTimer(false);\n };\n\n startUIHideTimer: () => void = () => {\n const {\n videoCarousel: { isPlaying },\n } = this.props;\n const { isMouseOverSection, uiHideTimerId } = this;\n\n if (isPlaying && isMouseOverSection && !uiHideTimerId) {\n this.uiHideTimerId = setTimeout(this.hideUI, UI_HIDE_TIMEOUT);\n }\n };\n\n resetUIHideTimer: (thenRestart: boolean) => void = (thenRestart) => {\n const { isCollapsed } = this.state;\n\n if (!isCollapsed) {\n this.showUI();\n }\n\n if (this.uiHideTimerId) {\n clearTimeout(this.uiHideTimerId);\n this.uiHideTimerId = null;\n }\n\n if (thenRestart) {\n this.startUIHideTimer();\n }\n };\n\n hideUI: () => void = () => {\n const { onUIHiddenCallback } = this.props;\n\n Messenger.emit(MessengerEvents.REDUCE_VIDEO_CAROUSEL_MASK);\n this.setState({ isUIHidden: true });\n\n if (onUIHiddenCallback) {\n onUIHiddenCallback();\n }\n };\n\n showUI: () => void = () => {\n const { onUIShownCallback } = this.props;\n\n Messenger.emit(MessengerEvents.ENLARGE_VIDEO_CAROUSEL_MASK);\n this.setState({ isUIHidden: false });\n\n if (onUIShownCallback) {\n onUIShownCallback();\n }\n };\n\n handleOnMouseEnter: () => void = () => {\n const { isMouseOverSection, sectionElement } = this;\n\n if (sectionElement && !isMouseOverSection) {\n this.isMouseOverSection = true;\n sectionElement.addEventListener('mousemove', this.handleOnMouseMove, { passive: true });\n }\n };\n\n handleOnMouseLeave: () => void = () => {\n const { sectionElement } = this;\n\n this.isMouseOverSection = false;\n this.resetUIHideTimer(false);\n\n sectionElement?.removeEventListener('mousemove', this.handleOnMouseMove, { passive: true });\n };\n\n handleOnMouseMove: () => void = () => {\n const {\n videoCarousel: { isPlaying },\n } = this.props;\n const { isMouseOverSection } = this;\n\n if (isMouseOverSection && isPlaying) {\n this.resetUIHideTimer(true);\n }\n };\n\n handleItemIndexOnClick: (index: number) => void = (index) => {\n const { currentIndex } = this.state;\n\n if (index !== currentIndex) {\n this.resetUIHideTimer(true);\n this.displayItemIndex(index);\n }\n };\n\n handleNextButtonOnClick: () => void = () => {\n this.resetUIHideTimer(true);\n this.displayNextItem();\n };\n\n handlePreviousButtonOnClick: () => void = () => {\n this.resetUIHideTimer(true);\n this.displayNextItem(-1);\n };\n\n // $FlowFixMe: flow doesn't understand some external classes/types/interfaces\n handleOnSwiped: (eventData: SwipeEventData) => void = (eventData) => {\n const { dir } = eventData;\n const {\n selectedItemIndices: { length: itemCount },\n } = this.state;\n\n if (itemCount <= 1) {\n return;\n }\n\n if (dir === LEFT) {\n this.resetUIHideTimer(true);\n this.displayNextItem();\n } else if (dir === RIGHT) {\n this.resetUIHideTimer(true);\n this.displayNextItem(-1);\n }\n };\n\n playVideo: () => void = () => {\n const {\n localUpdateVideoCarouselPlaying,\n videoCarousel: { isPlaying },\n } = this.props;\n\n this.resetUIHideTimer(true);\n\n if (!isPlaying) {\n localUpdateVideoCarouselPlaying();\n }\n };\n\n handlePlayButtonOnClick: () => void = this.playVideo;\n\n pauseVideo: () => void = () => {\n const { localUpdateVideoCarouselPaused } = this.props;\n\n this.resetUIHideTimer(false);\n localUpdateVideoCarouselPaused();\n };\n\n handlePauseButtonOnClick: () => void = this.pauseVideo;\n\n muteVideo: () => void = () => {\n const { localUpdateVideoCarouselMuted } = this.props;\n\n localUpdateVideoCarouselMuted();\n };\n\n unmuteVideo: () => void = () => {\n const { localUpdateVideoCarouselUnmuted } = this.props;\n\n localUpdateVideoCarouselUnmuted();\n };\n\n toggleSound: () => void = () => {\n const {\n videoCarousel: { isMuted },\n } = this.props;\n\n if (isMuted) {\n this.unmuteVideo();\n } else {\n this.muteVideo();\n }\n };\n\n handleEqualizerButtonOnClick: () => void = this.toggleSound;\n\n handleFullscreenButtonOnClick: () => void = () => {\n Messenger.emit(MessengerEvents.VIDEO_CAROUSEL_ENTER_FULLSCREEN);\n };\n\n wrapPictoInTooltip: (picto: React.Node, tooltipKeyContent: string, tooltipTheme?: ThemeType, tooltipContentClass?: string) => React.Node = (\n picto,\n tooltipKeyContent,\n tooltipTheme,\n tooltipContentClass,\n ) => {\n const tooltipContent = <div className={clsx('tooltipContent', tooltipContentClass)}>{Localizer.localize(tooltipKeyContent)}</div>;\n const options: TippyOptionsType = {\n ...TIPPY_DEFAULT_OPTIONS,\n content: tooltipContent,\n };\n\n if (tooltipTheme) {\n options.theme = tooltipTheme.toLowerCase();\n }\n\n return (\n // eslint-disable-next-line react/jsx-props-no-spreading\n <Tippy {...options}>{picto}</Tippy>\n );\n };\n\n renderVideoIconBar: () => ?React.Node = () => {\n const {\n videoCarousel: { isMuted, isPlaying },\n } = this.props;\n const { isVideo } = this;\n\n if (!isVideo) {\n return null;\n }\n\n // Play/pause button\n const pauseBtn = this.wrapPictoInTooltip(<PictoPause onClick={this.handlePauseButtonOnClick} />, 'carousel.tooltip.toggle_play', undefined, 'button');\n const playBtn = this.wrapPictoInTooltip(<PictoPlay className='play' onClick={this.handlePlayButtonOnClick} />, 'carousel.tooltip.toggle_play', undefined, 'button');\n const playPauseBtn = isPlaying ? pauseBtn : playBtn;\n\n // Fullscreen button\n const fullscreenBtn = this.wrapPictoInTooltip(<PictoFullscreen onClick={this.handleFullscreenButtonOnClick} />, 'carousel.tooltip.fullscreen', undefined, 'button');\n\n // Equalizer button (mute/unmute)\n const equalizerBtn = <Equalizer isMuted={isMuted || !isPlaying} onClick={this.handleEqualizerButtonOnClick} />;\n\n // Entering/leaving the icon bar is the opposite of entering/leaving the section\n return (\n <div className='iconBar' onMouseEnter={this.handleOnMouseLeave} onMouseLeave={this.handleOnMouseEnter}>\n {playPauseBtn}\n {equalizerBtn}\n {fullscreenBtn}\n </div>\n );\n };\n\n render(): React.Node {\n const { isDebugModeEnabled } = this.props;\n const {\n displayType,\n hubImageUrl,\n isUIHidden,\n selectedItemIndices: { length: itemCount },\n } = this.state;\n const { isVideo } = this;\n\n if (displayType !== SectionDisplayType.Regular) {\n return null;\n }\n\n const handleSectionMouseLeave = isVideo ? this.handleOnMouseLeave : undefined;\n const handleSectionMouseEnter = isVideo ? this.handleOnMouseEnter : undefined;\n\n // Entering/leaving pagination area or previous/next buttons is the opposite of entering/leaving the section\n\n const previousButton =\n itemCount > 1 ? (\n <div className='previousButton' onMouseEnter={handleSectionMouseLeave} onMouseLeave={handleSectionMouseEnter}>\n <PictoArrowLeft onClick={this.handlePreviousButtonOnClick} />\n </div>\n ) : null;\n\n const nextButton =\n itemCount > 1 ? (\n <div className='nextButton' onMouseEnter={handleSectionMouseLeave} onMouseLeave={handleSectionMouseEnter}>\n <PictoArrowRight onClick={this.handleNextButtonOnClick} />\n </div>\n ) : null;\n\n const pagination =\n itemCount > 1 ? (\n <div className='pagination' onMouseEnter={handleSectionMouseLeave} onMouseLeave={handleSectionMouseEnter}>\n {this.renderIndices()}\n </div>\n ) : null;\n\n const hubImage = hubImageUrl ? <img alt='' className='hubImage' src={hubImageUrl} /> : null;\n\n return (\n <div\n className={clsx('sectionCarousel', isUIHidden && 'hidden')}\n onMouseEnter={handleSectionMouseEnter}\n onMouseLeave={handleSectionMouseLeave}\n ref={(instance) => {\n this.sectionElement = instance;\n }}\n >\n {previousButton}\n <Swipeable onSwiped={this.handleOnSwiped} trackMouse>\n <div className='itemSlideContainer'>\n {hubImage}\n {this.renderItemSlides()}\n </div>\n </Swipeable>\n <div className='paginationAndActions' onClick={isDebugModeEnabled ? this.handleDebugOnClick : undefined}>\n {pagination}\n {this.renderVideoIconBar()}\n </div>\n {nextButton}\n </div>\n );\n }\n}\n\nconst mapStateToProps = (state: CombinedReducers): ReduxSectionReducerStateType => {\n return {\n channels: state.appConfiguration.deviceChannels,\n gridSectionId: state.ui.gridSectionId,\n isDebugModeEnabled: state.appConfiguration.isDebugModeEnabled,\n isInTheaterMode: state.ui.isInTheaterMode,\n state,\n streamPriorities: state.appConfiguration.playerStreamPriorities,\n videoCarousel: state.ui.videoCarousel,\n };\n};\n\nconst mapDispatchToProps = (dispatch: Dispatch): ReduxSectionDispatchToPropsType => {\n return {\n localGetImageUrl: (assetId: string, width: number, height: number, theme?: ThemeType, signal?: AbortSignal): Promise<any> =>\n dispatch(\n getImageUrl(\n {\n assetId,\n height,\n theme,\n width,\n },\n signal,\n ),\n ),\n\n localSendV8MetadataRequest: (assetId: string, type: MetadataKind, signal?: AbortSignal): Promise<any> => dispatch(sendV8MetadataRequest(assetId, type, signal)),\n\n localSendV8SectionFeedRequest: (section: NETGEM_API_V8_SECTION, signal?: AbortSignal): Promise<any> => dispatch(sendV8SectionFeedRequest(section, null, signal)),\n\n localUpdateVideoCarouselMuted: () => dispatch(updateVideoCarouselMuted()),\n\n localUpdateVideoCarouselPaused: () => dispatch(updateVideoCarouselPaused()),\n\n localUpdateVideoCarouselPlaying: () => dispatch(updateVideoCarouselPlaying()),\n\n localUpdateVideoCarouselUnmuted: () => dispatch(updateVideoCarouselUnmuted()),\n };\n};\n\nconst SectionCarousel: React.ComponentType<SectionPropType> = connect(mapStateToProps, mapDispatchToProps, null, { forwardRef: true })(SectionCarouselView);\n\nexport default SectionCarousel;\n","/* @flow */\n\nimport './Section.css';\nimport * as React from 'react';\nimport type { NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE, TILE_CONFIG_TYPE } from '../../../libs/netgemLibrary/v8/types/WidgetConfig';\nimport { getTileConfig, getTileTypeClass } from '../../../helpers/ui/section/tile';\nimport type { ChannelMap } from '../../../libs/netgemLibrary/v8/types/Channel';\nimport type { CombinedReducers } from '../../../redux/reducers';\nimport Item from '../item/Item';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport { type NETGEM_API_V8_SECTION } from '../../../libs/netgemLibrary/v8/types/Section';\nimport clsx from 'clsx';\nimport { connect } from 'react-redux';\nimport { createItemFromChannel } from '../../../helpers/ui/item/channel';\nimport getTranslatedText from '../../../libs/netgemLibrary/v8/helpers/Lang';\n\ntype ReduxSectionGridDispatchToPropsType = {||};\n\ntype ReduxSectionGridReducerStateType = {|\n +channels: ChannelMap,\n|};\n\ntype DefaultProps = {|\n +isInExploreModal?: boolean,\n +onItemClick?: NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE,\n|};\n\ntype SectionGridPropType = {|\n ...DefaultProps,\n +section: NETGEM_API_V8_SECTION,\n|};\n\ntype CompleteSectionGridPropType = {|\n ...SectionGridPropType,\n ...ReduxSectionGridReducerStateType,\n ...ReduxSectionGridDispatchToPropsType,\n|};\n\ntype SectionGridStateType = {|\n items: Array<React.Node>,\n|};\n\nclass SectionGridView extends React.PureComponent<CompleteSectionGridPropType, SectionGridStateType> {\n sectionName: string;\n\n tileConfig: TILE_CONFIG_TYPE;\n\n static defaultProps: DefaultProps = {\n isInExploreModal: false,\n onItemClick: undefined,\n };\n\n constructor(props: CompleteSectionGridPropType) {\n super(props);\n\n const {\n section,\n section: { id },\n } = props;\n\n this.sectionName = id;\n this.tileConfig = getTileConfig(section);\n\n this.state = { items: [] };\n }\n\n componentDidMount() {\n this.loadData();\n }\n\n loadData = () => {\n const { channels, isInExploreModal, onItemClick } = this.props;\n const { tileConfig } = this;\n const items: Array<React.Node> = [];\n\n const sortedChannels = Object.keys(channels)\n .map((key) => channels[key])\n .sort((c1, c2) => c1.number - c2.number);\n\n for (const channel of sortedChannels) {\n const item = createItemFromChannel(channel);\n\n if (item) {\n items.push(<Item isInExploreModal={isInExploreModal} item={item} key={item.id} onItemClick={onItemClick} tileConfig={tileConfig} />);\n }\n }\n\n this.setState({ items });\n };\n\n render(): React.Node {\n const { section } = this.props;\n const { items } = this.state;\n const {\n tileConfig: { imageLayout, type },\n } = this;\n\n if (items.length === 0) {\n // Do not display empty section\n return null;\n }\n\n // Tile type to CSS classe conversion (e.g. 'gemtv.big' -> 'gemtv big')\n const tileTypeClass = getTileTypeClass(type);\n\n return (\n <div className={clsx('section', 'channelSection', tileTypeClass, imageLayout)} id={`sectionGrid_${this.sectionName}`}>\n <div className='header'>{getTranslatedText(section.title, Localizer.language)}</div>\n <div className='itemGrid'>{items}</div>\n </div>\n );\n }\n}\n\nconst mapStateToProps = (state: CombinedReducers): ReduxSectionGridReducerStateType => {\n return {\n channels: state.appConfiguration.deviceChannels,\n };\n};\n\nconst SectionGrid: React.ComponentType<SectionGridPropType> = connect(mapStateToProps, null, null, { forwardRef: true })(SectionGridView);\n\nexport default SectionGrid;\n","/* @flow */\n\nimport './Section.css';\nimport * as React from 'react';\nimport { type NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE, type TILE_CONFIG_TYPE } from '../../../libs/netgemLibrary/v8/types/WidgetConfig';\nimport { PictoArrowLeft, PictoArrowRight } from '@ntg/components/dist/pictos/Element';\nimport { getTileConfig, getTileTypeClass } from '../../../helpers/ui/section/tile';\nimport { type Dispatch } from '../../../redux/types/types';\nimport Item from '../item/Item';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport { type NETGEM_API_V8_FEED } from '../../../libs/netgemLibrary/v8/types/FeedItem';\nimport { type NETGEM_API_V8_SECTION } from '../../../libs/netgemLibrary/v8/types/Section';\nimport { type SwipeEventData } from '../../../helpers/ui/section/types';\nimport Swipeable from '../../swipeable/swipeable';\nimport clsx from 'clsx';\nimport { connect } from 'react-redux';\nimport { createSectionPagination } from '../../../helpers/ui/section/Pagination';\nimport { getTileWidthPlusMargin } from '../../../helpers/ui/constants';\nimport getTranslatedText from '../../../libs/netgemLibrary/v8/helpers/Lang';\nimport { ignoreIfAborted } from '../../../libs/netgemLibrary/helpers/cancellablePromise/promiseHelper';\nimport sendV8SectionFeedRequest from '../../../redux/netgemApi/actions/v8/feed';\n\ntype ReduxSectionDispatchToPropsType = {|\n +localSendV8SectionFeedRequest: (section: NETGEM_API_V8_SECTION, signal?: AbortSignal) => Promise<any>,\n|};\n\ntype DefaultProps = {|\n +isInExploreModal?: boolean,\n +onItemClick?: NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE,\n|};\n\ntype SectionPropType = {|\n ...DefaultProps,\n +section: NETGEM_API_V8_SECTION,\n|};\n\ntype CompleteSectionPropType = {|\n ...SectionPropType,\n ...ReduxSectionDispatchToPropsType,\n|};\n\ntype SectionStateType = {|\n feed: NETGEM_API_V8_FEED,\n itemCountPerPage: number,\n maxPageIndex: number,\n pageIndex: number,\n|};\n\nconst InitialState: $ReadOnly<SectionStateType> = Object.freeze({\n feed: [],\n itemCountPerPage: -1,\n maxPageIndex: 0,\n pageIndex: 0,\n});\n\n// Number of pages actually rendered (even if only partially visible)\nconst PAGE_RENDER_COUNT = 2;\n\n// Used to transform velocity in a page step when swiping a section\nconst PAGE_VELOCITY_STEP: number = 5;\n\nclass SectionView extends React.PureComponent<CompleteSectionPropType, SectionStateType> {\n abortController: AbortController;\n\n itemWidthPlusMargin: number;\n\n sectionName: string;\n\n slider: HTMLElement | null;\n\n sliderPositions: Array<number>;\n\n tileConfig: TILE_CONFIG_TYPE;\n\n static defaultProps: DefaultProps = {\n isInExploreModal: false,\n onItemClick: undefined,\n };\n\n constructor(props: CompleteSectionPropType) {\n super(props);\n\n const {\n section,\n section: { id },\n } = props;\n\n this.abortController = new AbortController();\n this.sectionName = id;\n this.slider = null;\n this.sliderPositions = [];\n this.tileConfig = getTileConfig(section);\n this.itemWidthPlusMargin = getTileWidthPlusMargin(this.tileConfig.type);\n\n this.state = { ...InitialState };\n }\n\n componentDidMount() {\n window.addEventListener('resize', this.updateDimensions, { passive: true });\n this.loadData();\n }\n\n componentDidUpdate(prevProps: CompleteSectionPropType, prevState: SectionStateType) {\n const { feed, itemCountPerPage, pageIndex } = this.state;\n const { feed: prevFeed, itemCountPerPage: prevItemCountPerPage } = prevState;\n\n if (itemCountPerPage !== prevItemCountPerPage) {\n this.createPageList(prevItemCountPerPage);\n return;\n }\n\n if (prevFeed !== feed && feed.length > 0) {\n if (prevFeed.length !== feed.length) {\n // Feed has changed: re-render everything\n this.createPageList();\n }\n } else if (prevState.pageIndex !== pageIndex) {\n this.goToPage(pageIndex);\n }\n }\n\n componentWillUnmount() {\n const { abortController } = this;\n\n abortController.abort('Component SectionChannelGroup will unmount');\n\n window.removeEventListener('resize', this.updateDimensions, { passive: true });\n }\n\n loadData = () => {\n const { localSendV8SectionFeedRequest, section } = this.props;\n const {\n abortController: { signal },\n } = this;\n\n localSendV8SectionFeedRequest(section, signal)\n .then((response) => {\n signal.throwIfAborted();\n\n const feed = ((response: any): NETGEM_API_V8_FEED);\n this.setState({ feed });\n this.updateDimensions();\n })\n .catch((error) => ignoreIfAborted(signal, error, () => this.setState({ feed: [] })));\n };\n\n createPageList: (previousItemCountPerPage?: number) => void = (previousItemCountPerPage) => {\n const { feed, itemCountPerPage, pageIndex: previousPageIndex } = this.state;\n const { itemWidthPlusMargin } = this;\n\n if (itemCountPerPage === -1) {\n return;\n }\n\n const { maxPageIndex, pageIndex, sliderPositions } = createSectionPagination(feed, itemWidthPlusMargin, itemCountPerPage, previousPageIndex, previousItemCountPerPage);\n\n this.sliderPositions = sliderPositions;\n this.setState({\n maxPageIndex,\n pageIndex,\n });\n };\n\n calculateItemCountPerPage = (): number => {\n const { itemWidthPlusMargin, slider } = this;\n\n if (!slider || !(slider.parentElement instanceof HTMLElement)) {\n return -1;\n }\n\n return Math.max(1, Math.floor(slider.parentElement.offsetWidth / itemWidthPlusMargin));\n };\n\n updateDimensions = () => {\n const itemCountPerPage = this.calculateItemCountPerPage();\n\n this.setState({ itemCountPerPage }, () => {\n if (itemCountPerPage === -1) {\n // Slider was not rendered yet, so let schedule another run\n setTimeout(this.updateDimensions, 0);\n }\n });\n };\n\n checkGetPageStep = (pageStep?: number): number => (typeof pageStep === 'number' && pageStep > 1 ? pageStep : 1);\n\n handleNextButtonOnClick = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n this.goToNextPage();\n };\n\n goToNextPage = (pageStep?: number) => {\n const { maxPageIndex, pageIndex } = this.state;\n\n const step = this.checkGetPageStep(pageStep);\n this.goToPage(Math.min(pageIndex + step, maxPageIndex));\n };\n\n handlePrevButtonOnClick = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n this.goToPreviousPage();\n };\n\n goToPreviousPage = (pageStep?: number) => {\n const { pageIndex } = this.state;\n\n const step = this.checkGetPageStep(pageStep);\n this.goToPage(Math.max(0, pageIndex - step));\n };\n\n goToPage = (pageIndex: number) => {\n const { slider, sliderPositions } = this;\n\n if (!slider || pageIndex < 0 || pageIndex >= sliderPositions.length) {\n return;\n }\n\n const posX = sliderPositions[pageIndex];\n slider.style.transform = `translateX(${posX}px) translateZ(0)`;\n\n this.setState({ pageIndex });\n };\n\n handleOnSwiping = (eventData: SwipeEventData) => {\n const { deltaX } = eventData;\n const { maxPageIndex, pageIndex } = this.state;\n const { slider, sliderPositions } = this;\n\n if (!slider || maxPageIndex === 0) {\n return;\n }\n\n const posX = sliderPositions[pageIndex];\n const newPosX = posX + deltaX;\n\n slider.style.transform = `translateX(${newPosX}px) translateZ(0)`;\n };\n\n handleOnSwiped = (eventData: SwipeEventData) => {\n const { dir, velocity } = eventData;\n const { maxPageIndex } = this.state;\n\n if (maxPageIndex === 0) {\n return;\n }\n\n const pageStep = Math.ceil(velocity / PAGE_VELOCITY_STEP);\n\n if (dir === 'Left') {\n this.goToNextPage(pageStep);\n } else if (dir === 'Right') {\n this.goToPreviousPage(pageStep);\n }\n };\n\n renderTiles = (): Array<React.Node> => {\n const { isInExploreModal, onItemClick } = this.props;\n const {\n feed,\n feed: { length: itemCount },\n itemCountPerPage,\n pageIndex,\n } = this.state;\n const { tileConfig } = this;\n\n const indexEnd = Math.min((pageIndex + PAGE_RENDER_COUNT) * itemCountPerPage, itemCount);\n const tiles: Array<React.Node> = [];\n\n for (let i = 0; i < indexEnd; ++i) {\n const { [i]: item } = feed;\n\n tiles.push(<Item isInExploreModal={isInExploreModal} item={item} key={item.id} onItemClick={onItemClick} tileConfig={tileConfig} />);\n }\n\n return tiles;\n };\n\n render(): React.Node {\n const { section } = this.props;\n const { feed, maxPageIndex, pageIndex } = this.state;\n const {\n tileConfig: { imageLayout, type },\n } = this;\n\n if (feed.length === 0) {\n // Do not display empty section\n return null;\n }\n\n // Tile type to CSS class conversion (e.g. 'gemtv.big' -> 'gemtv big')\n const tileTypeClass = getTileTypeClass(type);\n\n // Display only visible pages\n const tiles = this.renderTiles();\n\n const prevButton =\n pageIndex > 0 ? (\n <div className='navigationButton previous' onClick={this.handlePrevButtonOnClick}>\n <PictoArrowLeft forceHoverEffect />\n </div>\n ) : null;\n\n const nextButton =\n pageIndex < maxPageIndex ? (\n <div className='navigationButton next' onClick={this.handleNextButtonOnClick}>\n <PictoArrowRight forceHoverEffect />\n </div>\n ) : null;\n\n return (\n <div className={clsx('section', 'channelGroupSection', tileTypeClass, imageLayout)} id={`section_${this.sectionName}`}>\n <div className='header'>\n <div className='sectionTitleContainer'>{getTranslatedText(section.title, Localizer.language)}</div>\n </div>\n <Swipeable onSwiped={this.handleOnSwiped} onSwiping={this.handleOnSwiping} trackMouse>\n <div\n className='slider'\n ref={(instance) => {\n this.slider = instance;\n }}\n >\n {tiles}\n </div>\n </Swipeable>\n {prevButton}\n {nextButton}\n </div>\n );\n }\n}\n\nconst mapDispatchToProps = (dispatch: Dispatch): ReduxSectionDispatchToPropsType => {\n return {\n localSendV8SectionFeedRequest: (section: NETGEM_API_V8_SECTION, signal?: AbortSignal): Promise<any> => dispatch(sendV8SectionFeedRequest(section, null, signal)),\n };\n};\n\nconst Section: React.ComponentType<SectionPropType> = connect(null, mapDispatchToProps, null, { forwardRef: true })(SectionView);\n\nexport default Section;\n","/* @flow */\n\nimport LocalStorageManager from '../localStorage/localStorageManager';\nimport { SEARCH_HISTORY_MAX_COUNT } from './constants';\nimport { StorageKeys } from '../localStorage/keys';\n\nconst deleteSearchHistory: () => Array<string> = () => {\n LocalStorageManager.delete(StorageKeys.SearchHistory);\n return [];\n};\n\nconst getSearchHistory: () => Array<string> = () => LocalStorageManager.loadObject(StorageKeys.SearchHistory, []);\n\nconst deleteTermInternal: (term: string) => Array<string> = (term) => {\n const history = LocalStorageManager.loadObject(StorageKeys.SearchHistory, []);\n\n if (!Array.isArray(history) || history.length === 0) {\n return [];\n }\n\n const trimmedTerm = term.trim();\n const pos = history.indexOf(trimmedTerm);\n if (pos > -1) {\n history.splice(pos, 1);\n }\n\n return history;\n};\n\nconst deleteSearchString: (term: string) => Array<string> = (term) => {\n const history = deleteTermInternal(term);\n LocalStorageManager.save(StorageKeys.SearchHistory, history);\n return history;\n};\n\nconst saveSearchString: (term?: string) => Array<string> = (term) => {\n if (!term) {\n return getSearchHistory();\n }\n\n const history = deleteTermInternal(term);\n\n const trimmedTerm = term.trim();\n if (trimmedTerm === '') {\n return history;\n }\n\n history.unshift(trimmedTerm);\n\n if (history.length > SEARCH_HISTORY_MAX_COUNT) {\n history.length = SEARCH_HISTORY_MAX_COUNT;\n }\n\n LocalStorageManager.save(StorageKeys.SearchHistory, history);\n\n return history;\n};\n\nexport { deleteSearchHistory, deleteSearchString, getSearchHistory, saveSearchString };\n","/* @flow */\n\nexport const SEARCH_STRING_MIN_LENGTH = 3;\nexport const SEARCH_HISTORY_MAX_COUNT = 10;\n","/* @flow */\n\nimport './Avenue.css';\nimport * as React from 'react';\nimport { AVENUE_HEADER_HEIGHT, AVENUE_HEADER_WIDTH, AVENUE_IMAGE_HEIGHT, AVENUE_IMAGE_WIDTH } from '../../helpers/ui/constants';\nimport { FEATURE_NPVR, FEATURE_TV, FEATURE_VOD } from '../../redux/appConf/constants';\nimport { type NETGEM_API_V8_WIDGET_PANEL_IMAGE_URL_TYPE, WidgetLayoutType } from '../../libs/netgemLibrary/v8/types/WidgetConfig';\nimport { PictoMagnifier, PictoNoContent, PictoSadFace } from '@ntg/components/dist/pictos/Element';\nimport { Theme, type ThemeType } from '@ntg/ui/dist/theme';\nimport { getImageUrl, getImageUrlFromDefinition } from '../../redux/netgemApi/actions/v8/metadataImage';\nimport { goBackToFocusedAvenue, updateGridSectionId, updateSearchString } from '../../redux/ui/actions';\nimport { AVENUE_ID_EXPLORE } from '../../helpers/ui/avenue/constants';\nimport type { AppConfigurationFeatures } from '../../redux/appConf/types/types';\nimport { AvenueType } from '../../helpers/ui/avenue/types';\nimport { type BasicFunction } from '@ntg/utils/dist/types';\nimport ButtonBack from '../buttons/ButtonBack';\nimport type { CombinedReducers } from '../../redux/reducers';\nimport type { Dispatch } from '../../redux/types/types';\nimport HotKeys from '../../helpers/hotKeys/hotKeys';\nimport { KEY } from '../../helpers/hotKeys/keysDefinition';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport { type NETGEM_API_V8_AVENUE } from '../../libs/netgemLibrary/v8/types/Avenue';\nimport { type NETGEM_API_V8_FEED_ITEM } from '../../libs/netgemLibrary/v8/types/FeedItem';\nimport type { NETGEM_API_V8_HUB } from '../../libs/netgemLibrary/v8/types/Hub';\nimport type { NETGEM_API_V8_SECTION } from '../../libs/netgemLibrary/v8/types/Section';\nimport type { NETGEM_API_V8_URL_DEFINITION } from '../../libs/netgemLibrary/v8/types/NtgVideoFeed';\nimport { SEARCH_STRING_MIN_LENGTH } from '../../helpers/search/constants';\nimport SearchHistory from '../searchHistory/SearchHistory';\nimport Section from './section/Section';\nimport SectionCarousel from './sectionCarousel/Section';\nimport SectionChannelGrid from './sectionChannelGrid/Section';\nimport SectionChannelGroup from './sectionChannelGroup/Section';\nimport { SectionType } from '../../helpers/ui/section/types';\nimport { areAvenuesDifferent } from '../../helpers/ui/section/comparisons';\nimport clsx from 'clsx';\nimport { connect } from 'react-redux';\nimport { getLocalizedString } from '../../helpers/ui/metadata/Format';\nimport { ignoreIfAborted } from '../../libs/netgemLibrary/helpers/cancellablePromise/promiseHelper';\nimport { produce } from 'immer';\nimport { saveSearchString } from '../../helpers/search/search';\n\n// After the following amount of time (in ms), we act as if the first 3 sections have been loaded and start loading the remaining ones\nconst FIRST_SECTIONS_LOAD_TIMEOUT = 5_000;\n\nconst VISIBLE_SECTION_COUNT = 3;\n\nconst EMPTY_AVENUE_IMAGE_WIDTH = 224;\nconst EMPTY_AVENUE_IMAGE_HEIGHT = 192;\n\ntype ReduxAvenueDispatchToPropsType = {|\n +localGetImageUrl: (assetId: string, width: number, height: number, theme?: ThemeType, signal?: AbortSignal) => Promise<any>,\n +localGetImageUrlFromDefinition: (urlDefinition: NETGEM_API_V8_URL_DEFINITION) => Promise<any>,\n +localGoBackToFocusedAvenue: BasicFunction,\n +localUpdateGridSectionId: (gridSectionId: string | null) => void,\n +localUpdateSearchString: (searchString: string) => void,\n|};\n\ntype ReduxAvenueReducerStateType = {|\n +avenueList: ?NETGEM_API_V8_HUB, // eslint-disable-line react/no-unused-prop-types\n +features: AppConfigurationFeatures,\n +gridSectionId: string | null,\n +searchString: string | null,\n|};\n\ntype DefaultProps = {|\n +hasBackButton?: boolean,\n +loadedCallback?: BasicFunction,\n|};\n\nexport type AvenuePropType = {|\n ...DefaultProps,\n +hub: ?NETGEM_API_V8_HUB, // eslint-disable-line react/no-unused-prop-types\n +hubItem: ?NETGEM_API_V8_FEED_ITEM,\n +index: number,\n +isInExploreModal: boolean,\n +type: AvenueType,\n|};\n\ntype CompleteAvenuePropType = {|\n ...AvenuePropType,\n ...ReduxAvenueReducerStateType,\n ...ReduxAvenueDispatchToPropsType,\n|};\n\ntype AvenueStateType = {|\n avenue: ?NETGEM_API_V8_AVENUE,\n avenueHeaderUri: string | null,\n avenueHeaderUrl: string | null,\n avenueImageUri: string | null,\n avenueImageUrl: string | null,\n avenueItemCount: number,\n emptyAvenueImageUrl: string | null,\n isGridAvenue: boolean,\n isLoadingSearchResults: boolean,\n isMyVideosEmptyVisible: boolean,\n isNoResultVisible: boolean,\n isSectionRenderingLimited: boolean,\n newSearchString: string | null,\n sectionElements: Array<React.Node>,\n sections: Array<NETGEM_API_V8_SECTION>,\n|};\n\nconst InitialState: $ReadOnly<AvenueStateType> = Object.freeze({\n avenue: null,\n avenueHeaderUri: null,\n avenueHeaderUrl: null,\n avenueImageUri: null,\n avenueImageUrl: null,\n avenueItemCount: 0,\n emptyAvenueImageUrl: null,\n isGridAvenue: false,\n isLoadingSearchResults: true,\n isMyVideosEmptyVisible: false,\n isNoResultVisible: false,\n isSectionRenderingLimited: true,\n newSearchString: null,\n sectionElements: [],\n sections: [],\n});\n\nclass AvenueView extends React.PureComponent<CompleteAvenuePropType, AvenueStateType> {\n abortController: AbortController;\n avenueVisibleSectionCountdown: number;\n carouselSectionIndex: number;\n firstSectionsLoadTimer: TimeoutID | null;\n isLoadingEmptyAvenueImageUrl: boolean;\n loadedSectionCount: number;\n searchBox: HTMLElement | null;\n sectionMapRef: Map<number, React.ElementRef<any> | null>;\n // Section Id -> item count\n sectionItemCountMap: Map<string, number>;\n\n static defaultProps: DefaultProps = {\n hasBackButton: false,\n loadedCallback: undefined,\n };\n\n constructor(props: CompleteAvenuePropType) {\n super(props);\n\n this.abortController = new AbortController();\n this.avenueVisibleSectionCountdown = VISIBLE_SECTION_COUNT;\n this.carouselSectionIndex = -1;\n this.firstSectionsLoadTimer = null;\n this.isLoadingEmptyAvenueImageUrl = false;\n this.loadedSectionCount = 0;\n this.searchBox = null;\n this.sectionMapRef = new Map();\n this.sectionItemCountMap = new Map();\n\n const { searchString } = props;\n const { avenueHeaderUri, avenueImageUri } = this.getAvenueImageAndHeaderUri(props);\n\n this.state = {\n ...InitialState,\n // Avenue image and header URIs are initialized here to prevent layout shift\n avenueHeaderUri,\n avenueImageUri,\n newSearchString: searchString,\n };\n }\n\n componentDidMount() {\n const { gridSectionId, hasBackButton, type } = this.props;\n const { searchBox } = this;\n\n if (hasBackButton && !gridSectionId) {\n HotKeys.register('escape', this.handleGoBackToFocusedAvenueHotKey, { name: 'Avenue.goBackToFocusedAvenue' });\n }\n\n this.loadAvenue();\n\n if (type === AvenueType.Search && !gridSectionId && searchBox) {\n HotKeys.register('s', this.handleFocusSearchBoxHotKey, { disableOthers: true, name: 'Avenue.focusSearch' });\n searchBox.focus();\n }\n }\n\n componentDidUpdate(prevProps: CompleteAvenuePropType, prevState: AvenueStateType) {\n const { avenueList, gridSectionId, hasBackButton, hub, hubItem, index, searchString, type } = this.props;\n const { avenue, isSectionRenderingLimited, sections } = this.state;\n const {\n avenueList: prevAvenueList,\n gridSectionId: prevGridSectionId,\n hasBackButton: prevHasBackButton,\n hubItem: prevHubItem,\n index: prevIndex,\n searchString: prevSearchString,\n type: prevType,\n } = prevProps;\n const { avenue: prevAvenue, isSectionRenderingLimited: prevIsSectionRenderingLimited, sections: prevSections } = prevState;\n\n if (!hub && index === prevIndex && avenueList && prevAvenueList && areAvenuesDifferent(avenueList[index], prevAvenueList[index])) {\n // Hub has changed\n this.loadAvenue(false);\n return;\n }\n\n if (prevIndex !== index || hubItem !== prevHubItem) {\n this.loadAvenue();\n } else if (prevIsSectionRenderingLimited !== isSectionRenderingLimited && !isSectionRenderingLimited) {\n this.renderRemainingSectionElements();\n } else if (prevAvenue !== avenue || prevGridSectionId !== gridSectionId || prevSections !== sections || prevSearchString !== searchString) {\n this.renderSectionElements(prevSearchString !== searchString);\n }\n\n if (hasBackButton !== prevHasBackButton || gridSectionId !== prevGridSectionId) {\n if (hasBackButton && !gridSectionId) {\n HotKeys.register('escape', this.handleGoBackToFocusedAvenueHotKey, { name: 'Avenue.goBackToFocusedAvenue' });\n } else {\n HotKeys.unregister('escape', this.handleGoBackToFocusedAvenueHotKey);\n }\n }\n\n if (type !== prevType || gridSectionId !== prevGridSectionId) {\n if (type !== AvenueType.Search || gridSectionId) {\n HotKeys.unregister('s', this.handleFocusSearchBoxHotKey);\n } else {\n HotKeys.register('s', this.handleFocusSearchBoxHotKey, { disableOthers: true, name: 'Avenue.focusSearch' });\n }\n }\n }\n\n componentWillUnmount() {\n const { abortController } = this;\n\n abortController.abort('Component Avenue will unmount');\n\n this.resetFirstSectionsLoadTimer();\n\n HotKeys.unregister('s', this.handleFocusSearchBoxHotKey);\n HotKeys.unregister('escape', this.handleGoBackToFocusedAvenueHotKey);\n }\n\n resetFirstSectionsLoadTimer = () => {\n const { firstSectionsLoadTimer } = this;\n\n if (firstSectionsLoadTimer) {\n clearTimeout(firstSectionsLoadTimer);\n this.firstSectionsLoadTimer = null;\n }\n };\n\n handleFocusSearchBoxHotKey = (event: SyntheticKeyboardEvent<HTMLElement>) => {\n const { searchBox } = this;\n\n if (searchBox) {\n event.preventDefault();\n event.stopPropagation();\n searchBox.focus();\n }\n };\n\n handleGoBackToFocusedAvenueHotKey = (event: SyntheticKeyboardEvent<HTMLElement>) => {\n const { localGoBackToFocusedAvenue } = this.props;\n\n event.preventDefault();\n event.stopPropagation();\n\n localGoBackToFocusedAvenue();\n };\n\n getAvenue = (props?: CompleteAvenuePropType): NETGEM_API_V8_AVENUE | null => {\n const { avenueList, hub, index } = props ?? this.props;\n const localHub = hub ?? avenueList;\n\n if (!localHub || localHub.length === 0) {\n return null;\n }\n\n return localHub[hub ? 0 : index];\n };\n\n getAvenueImageAndHeaderUri = (props?: CompleteAvenuePropType): { avenueHeaderUri: string | null, avenueImageUri: string | null } => {\n const { hubItem } = props ?? this.props;\n const avenue = this.getAvenue(props);\n\n if (!avenue) {\n return {\n avenueHeaderUri: null,\n avenueImageUri: null,\n };\n }\n\n const { widgetConfig } = avenue;\n const avenueHeaderUri = widgetConfig?.headerUri;\n let avenueImageUri = widgetConfig?.imageUri;\n\n if (!avenueHeaderUri && !avenueImageUri && hubItem) {\n ({ id: avenueImageUri } = hubItem);\n }\n\n return {\n avenueHeaderUri: avenueHeaderUri ?? null,\n avenueImageUri: avenueImageUri ?? null,\n };\n };\n\n // Default is true\n loadAvenue = (isSectionRenderingLimited: boolean = true) => {\n const { localUpdateGridSectionId } = this.props;\n\n const avenue = this.getAvenue();\n\n if (!avenue) {\n return;\n }\n\n const { sections = [] } = avenue;\n\n // In case of avenue with layout 'grid', only the first section (if there are more) is kept\n const isGridAvenue = avenue.widgetConfig?.layout === WidgetLayoutType.Grid;\n const localSections = isGridAvenue ? sections.slice(0, 1) : [...sections];\n if (isGridAvenue) {\n localUpdateGridSectionId(localSections[0].id);\n }\n\n this.avenueVisibleSectionCountdown = isSectionRenderingLimited ? Math.min(VISIBLE_SECTION_COUNT, localSections.length) : localSections.length;\n this.loadedSectionCount = 0;\n this.sectionItemCountMap.clear();\n\n const { avenueHeaderUri, avenueImageUri } = this.getAvenueImageAndHeaderUri();\n\n this.setState({\n avenue,\n avenueHeaderUri,\n avenueImageUri,\n avenueItemCount: 0,\n emptyAvenueImageUrl: null,\n isGridAvenue,\n isMyVideosEmptyVisible: false,\n isNoResultVisible: false,\n isSectionRenderingLimited,\n sections: localSections,\n });\n };\n\n loadAvenueHeaderOrImage = () => {\n const { avenueHeaderUri } = this.state;\n\n if (avenueHeaderUri) {\n this.setState({ avenueImageUrl: null });\n this.loadAvenueHeader();\n } else {\n this.loadAvenueImage();\n }\n };\n\n loadAvenueHeader = () => {\n const { localGetImageUrl } = this.props;\n const { avenueHeaderUri } = this.state;\n const {\n abortController: { signal },\n } = this;\n\n if (!avenueHeaderUri) {\n this.setState({ avenueHeaderUrl: null });\n return;\n }\n\n localGetImageUrl(avenueHeaderUri, AVENUE_HEADER_WIDTH, AVENUE_HEADER_HEIGHT, undefined, signal)\n .then((avenueHeaderUrl: string) => {\n signal.throwIfAborted();\n\n this.setState({ avenueHeaderUrl });\n })\n .catch((error) => ignoreIfAborted(signal, error, () => this.setState({ avenueHeaderUrl: null })));\n };\n\n loadAvenueImage = () => {\n const { localGetImageUrl } = this.props;\n const { avenueImageUri } = this.state;\n const {\n abortController: { signal },\n } = this;\n\n this.setState({ avenueHeaderUrl: null });\n\n if (!avenueImageUri) {\n this.setState({ avenueImageUrl: null });\n return;\n }\n\n localGetImageUrl(avenueImageUri, AVENUE_IMAGE_WIDTH, AVENUE_IMAGE_HEIGHT, Theme.Dark, signal)\n .then((avenueImageUrl: string) => {\n signal.throwIfAborted();\n\n this.setState({ avenueImageUrl });\n })\n .catch((error) => ignoreIfAborted(signal, error, () => this.setState({ avenueImageUrl: null })));\n };\n\n handleBackOnClick = () => {\n const { localGoBackToFocusedAvenue } = this.props;\n\n localGoBackToFocusedAvenue();\n };\n\n handleOnSearchChange = (event: SyntheticInputEvent<HTMLInputElement>) => {\n this.setState({ newSearchString: event.currentTarget.value });\n };\n\n handleSearchStringOnClick = (newSearchString: string) => {\n this.setState({ newSearchString }, this.launchSearch);\n };\n\n handleOnSearchKeyDown = (event: SyntheticKeyboardEvent<HTMLElement>) => {\n const { keyCode } = event;\n\n if (keyCode === KEY.ENTER) {\n this.launchSearch();\n }\n };\n\n handleSearchOnClick = () => {\n this.launchSearch();\n };\n\n launchSearch = () => {\n const { searchString, localUpdateSearchString } = this.props;\n const { newSearchString } = this.state;\n\n if (newSearchString) {\n const trimmedSearchString = newSearchString.trim();\n if (trimmedSearchString.length >= SEARCH_STRING_MIN_LENGTH && trimmedSearchString !== searchString) {\n saveSearchString(trimmedSearchString);\n localUpdateSearchString(trimmedSearchString);\n }\n }\n };\n\n handleOnUIHiddenCallback = () => {\n this.toggleSectionNextToCarousel(true);\n };\n\n handleOnUIShownCallback = () => {\n this.toggleSectionNextToCarousel(false);\n };\n\n toggleSectionNextToCarousel = (isHidden: boolean) => {\n const { carouselSectionIndex, sectionMapRef } = this;\n\n if (carouselSectionIndex === -1) {\n return;\n }\n\n const section = sectionMapRef.get(carouselSectionIndex + 1);\n if (section) {\n if (isHidden) {\n section.hide();\n } else {\n section.show();\n }\n }\n };\n\n dataLoadedCallback = (sectionId: string, sectionIndex: number, avenueIndex: number, sectionItemCount: number) => {\n const { index: currentAvenueIndex } = this.props;\n const { sectionItemCountMap } = this;\n\n if (avenueIndex !== currentAvenueIndex) {\n // Old avenue: ignore\n return;\n }\n\n let diff = sectionItemCount;\n\n if (sectionItemCountMap.has(sectionId)) {\n // Section already loaded: its items were updated\n diff -= sectionItemCountMap.get(sectionId) || 0;\n } else {\n // Section freshly loaded\n this.increaseLoadedSectionCount(sectionIndex);\n }\n\n sectionItemCountMap.set(sectionId, sectionItemCount);\n\n this.setState(\n produce((draft) => {\n draft.avenueItemCount += diff;\n }),\n this.checkForEmptyAvenue,\n );\n };\n\n increaseLoadedSectionCount = (sectionIndex: number) => {\n this.loadedSectionCount += 1;\n\n if (sectionIndex < VISIBLE_SECTION_COUNT) {\n this.avenueVisibleSectionCountdown -= 1;\n\n if (this.avenueVisibleSectionCountdown === 0) {\n this.resetFirstSectionsLoadTimer();\n this.setState({ isSectionRenderingLimited: false });\n }\n }\n };\n\n checkForEmptyAvenue = () => {\n const { loadedCallback, type } = this.props;\n const { avenueItemCount, sections } = this.state;\n const { loadedSectionCount } = this;\n\n if (loadedSectionCount < sections.length) {\n return;\n }\n\n // All sections loaded\n if (type === AvenueType.Search) {\n // All sections have been loaded: check if the search came back with items\n this.setState({\n isLoadingSearchResults: false,\n isNoResultVisible: avenueItemCount === 0,\n });\n } else if (type === AvenueType.Myvideos) {\n // All sections have been loaded: check if MY VIDEOS is empty\n this.setState({\n isMyVideosEmptyVisible: avenueItemCount === 0,\n });\n }\n\n if (loadedCallback) {\n loadedCallback();\n }\n };\n\n renderSectionElement = (avenueId: string, sectionIndex: number): React.Node => {\n const { hubItem, index: avenueIndex, isInExploreModal, searchString } = this.props;\n const { avenueImageUri, isGridAvenue, sections } = this.state;\n\n const { [sectionIndex]: section } = sections;\n const { id, kind, widgetConfig } = section;\n\n const layout = widgetConfig?.layout ?? WidgetLayoutType.List;\n const onItemClick = widgetConfig?.onItemClick;\n\n let displayType: SectionType = kind;\n if (layout === WidgetLayoutType.Grid) {\n displayType = SectionType.Grid;\n } else if (avenueId === AVENUE_ID_EXPLORE) {\n displayType = SectionType.ChannelGroup;\n }\n\n if (this.carouselSectionIndex > -1) {\n // Ensure no more than 1 carousel is displayed\n displayType = SectionType.Regular;\n }\n\n // Section key is made of section Id plus avenue index to avoid the issue where same section Id exists on multiple avenues\n const key = `${id}_${avenueIndex}`;\n\n switch (displayType) {\n case SectionType.HeroPanel:\n case SectionType.Carousel:\n this.carouselSectionIndex = sectionIndex;\n return (\n <SectionCarousel\n avenueImageUri={avenueImageUri}\n avenueIndex={avenueIndex}\n dataLoadedCallback={this.dataLoadedCallback}\n hubItem={hubItem}\n key={key}\n onItemClick={onItemClick}\n onUIHiddenCallback={this.handleOnUIHiddenCallback}\n onUIShownCallback={this.handleOnUIShownCallback}\n ref={(instance) => {\n this.sectionMapRef.set(sectionIndex, instance);\n }}\n section={section}\n sectionIndex={sectionIndex}\n />\n );\n\n case SectionType.ChannelGroup:\n return (\n <SectionChannelGroup\n isInExploreModal={isInExploreModal}\n key={key}\n onItemClick={onItemClick}\n ref={(instance) => {\n this.sectionMapRef.set(sectionIndex, instance);\n }}\n section={section}\n />\n );\n\n case SectionType.Grid:\n return (\n <SectionChannelGrid\n isInExploreModal={isInExploreModal}\n key={key}\n onItemClick={onItemClick}\n ref={(instance) => {\n this.sectionMapRef.set(sectionIndex, instance);\n }}\n section={section}\n />\n );\n\n default:\n return (\n <Section\n avenueIndex={avenueIndex}\n dataLoadedCallback={this.dataLoadedCallback}\n hubItem={hubItem}\n isGridAvenue={isGridAvenue}\n isInExploreModal={isInExploreModal}\n key={key}\n onItemClick={onItemClick}\n ref={(instance) => {\n this.sectionMapRef.set(sectionIndex, instance);\n }}\n searchString={searchString}\n section={section}\n sectionIndex={sectionIndex}\n />\n );\n }\n };\n\n renderSectionElements = (isSearching: boolean) => {\n const { hubItem } = this.props;\n const { avenue, isSectionRenderingLimited, sections } = this.state;\n\n const sectionElements: Array<React.Node> = [];\n\n if (!avenue) {\n this.setState({ sectionElements });\n return;\n }\n\n if (isSearching) {\n this.setState({ isLoadingSearchResults: true });\n }\n\n const { id: avenueId } = avenue;\n this.sectionMapRef = new Map();\n this.carouselSectionIndex = -1;\n\n const renderedSectionCount = isSectionRenderingLimited ? Math.min(VISIBLE_SECTION_COUNT, sections.length) : sections.length;\n\n for (let i = 0; i < renderedSectionCount; i++) {\n const sectionView = this.renderSectionElement(avenueId, i);\n\n if (sectionView) {\n sectionElements.push(sectionView);\n }\n }\n\n if (this.carouselSectionIndex === -1) {\n // No carousel\n this.loadAvenueHeaderOrImage();\n } else if (!hubItem) {\n // Carousel without hub image\n this.loadAvenueImage();\n }\n\n this.setState({ sectionElements });\n\n if (isSectionRenderingLimited) {\n this.resetFirstSectionsLoadTimer();\n this.firstSectionsLoadTimer = setTimeout(this.forceLoadingRemainingSections, FIRST_SECTIONS_LOAD_TIMEOUT);\n }\n };\n\n forceLoadingRemainingSections = () => {\n this.setState({ isSectionRenderingLimited: false });\n };\n\n renderRemainingSectionElements = () => {\n const { avenue, sectionElements: currentElements, sections } = this.state;\n\n if (!avenue) {\n this.setState({ sectionElements: [] });\n return;\n }\n\n const { id: avenueId } = avenue;\n const sectionElements = [...currentElements];\n\n for (let i = currentElements.length; i < sections.length; i++) {\n const sectionView = this.renderSectionElement(avenueId, i);\n\n if (sectionView) {\n sectionElements.push(sectionView);\n }\n }\n\n this.setState({ sectionElements });\n };\n\n renderNoResult = (): React.Node => {\n const { isNoResultVisible } = this.state;\n const { type } = this.props;\n\n if (type !== AvenueType.Search || !isNoResultVisible) {\n return null;\n }\n\n return (\n <div className='noResult'>\n <PictoSadFace />\n <div className='noResultText'>{Localizer.localize('search.no_result')}</div>\n </div>\n );\n };\n\n renderMyVideosEmptyContent = (): React.Node => {\n const { features } = this.props;\n\n if (features[FEATURE_TV] && !features[FEATURE_NPVR] && !features[FEATURE_VOD]) {\n // TV only\n return <div className='subtitle'>{Localizer.localize('my_videos.empty.subtitle.tv_only')}</div>;\n } else if (features[FEATURE_VOD] && !features[FEATURE_NPVR] && !features[FEATURE_TV]) {\n // VOD only\n return <div className='subtitle'>{Localizer.localize('my_videos.empty.subtitle.vod_only')}</div>;\n }\n\n return (\n <>\n <div className='subtitle'>{Localizer.localize('my_videos.empty.subtitle.multiple_features')}</div>\n <ul>\n {features[FEATURE_VOD] ? <li>{Localizer.localize('my_videos.empty.vod')}</li> : null}\n {features[FEATURE_NPVR] ? <li>{Localizer.localize('my_videos.empty.recordings')}</li> : null}\n {features[FEATURE_TV] ? <li>{Localizer.localize('my_videos.empty.tv')}</li> : null}\n </ul>\n </>\n );\n };\n\n loadEmptyAvenueImageUrl = (imageUri: ?string, imageUrl: ?NETGEM_API_V8_WIDGET_PANEL_IMAGE_URL_TYPE): void => {\n const { localGetImageUrl, localGetImageUrlFromDefinition } = this.props;\n const { isLoadingEmptyAvenueImageUrl } = this;\n\n if (isLoadingEmptyAvenueImageUrl || (!imageUri && !imageUrl)) {\n return;\n }\n\n this.isLoadingEmptyAvenueImageUrl = true;\n\n const getImagePromise = imageUri\n ? // New way of retrieving image, via URI\n localGetImageUrl(imageUri, EMPTY_AVENUE_IMAGE_WIDTH, EMPTY_AVENUE_IMAGE_HEIGHT, Theme.Dark)\n : // Legacy way, via URL definition\n localGetImageUrlFromDefinition({\n authent: false,\n params: imageUrl?.params ?? [],\n uri: imageUrl?.uri ?? '',\n });\n\n getImagePromise\n .then((emptyAvenueImageUrl: string) => this.setState({ emptyAvenueImageUrl }))\n .catch(() => this.setState({ emptyAvenueImageUrl: '' }))\n .finally(() => {\n this.isLoadingEmptyAvenueImageUrl = false;\n });\n };\n\n renderMyVideosEmpty = (): React.Node => {\n const { type } = this.props;\n const { avenue, emptyAvenueImageUrl, isMyVideosEmptyVisible } = this.state;\n\n if (!avenue || !isMyVideosEmptyVisible) {\n // Avenue not empty\n return null;\n }\n\n const onEmptyAvenue = avenue.widgetConfig?.onEmptyAvenue;\n\n if (!onEmptyAvenue && type !== AvenueType.Myvideos) {\n return null;\n }\n\n if (onEmptyAvenue) {\n // Empty avenue is described by PTF\n const {\n widgetConfig: { imageUri, imageUrl, instructions, title },\n } = onEmptyAvenue;\n const localizedTitle = title ? getLocalizedString(title, Localizer.language) : Localizer.localize('my_videos.empty.title');\n const localizedInstructions = instructions ? getLocalizedString(instructions, Localizer.language) : '';\n\n if ((imageUri || imageUrl) && emptyAvenueImageUrl === null) {\n this.loadEmptyAvenueImageUrl(imageUri, imageUrl);\n }\n\n return (\n <div className='emptyMyVideos'>\n <div className='title'>{localizedTitle}</div>\n <div className='subtitle'>{localizedInstructions}</div>\n <div className='image' style={{ backgroundImage: `url(${emptyAvenueImageUrl ?? ''})` }} />\n </div>\n );\n }\n\n // Empty avenue special case: MY VIDEOS\n return (\n <div className='emptyMyVideos'>\n <div className='title'>{Localizer.localize('my_videos.empty.title')}</div>\n <div className='iconAndText'>\n <PictoNoContent />\n <div>{this.renderMyVideosEmptyContent()}</div>\n </div>\n </div>\n );\n };\n\n renderSearchElement = (): React.Node => {\n const { gridSectionId, type } = this.props;\n const { isLoadingSearchResults, newSearchString } = this.state;\n\n if (type !== AvenueType.Search || gridSectionId) {\n return null;\n }\n\n return (\n <div className={clsx('search', isLoadingSearchResults && 'loading')}>\n <div className='searchBox'>\n <PictoMagnifier onClick={this.handleSearchOnClick} />\n <input\n onChange={this.handleOnSearchChange}\n onKeyDown={this.handleOnSearchKeyDown}\n placeholder={Localizer.localize('search.placeholder')}\n ref={(instance) => {\n this.searchBox = instance;\n }}\n type='text'\n value={newSearchString}\n />\n </div>\n <SearchHistory onSearchStringClick={this.handleSearchStringOnClick} />\n </div>\n );\n };\n\n render(): React.Node {\n const { gridSectionId, hasBackButton, type } = this.props;\n const { avenue, avenueHeaderUrl, avenueImageUrl, sectionElements, sections } = this.state;\n const { loadedSectionCount } = this;\n\n const isGridAvenue = avenue?.widgetConfig?.layout === WidgetLayoutType.Grid;\n\n const backButton = hasBackButton && (!gridSectionId || isGridAvenue) ? <ButtonBack className='backBar' hasText={avenueHeaderUrl === null} onClick={this.handleBackOnClick} /> : null;\n\n const avenueHeader = avenueHeaderUrl ? <div className='avenueHeader' style={{ backgroundImage: `url(${avenueHeaderUrl ?? ''})` }} /> : null;\n\n const avenueImage = avenueImageUrl && !avenueHeader ? <div className='avenueImage' style={{ backgroundImage: `url(${avenueImageUrl ?? ''})` }} /> : null;\n\n return (\n <div className={clsx('avenueView', (type: string).toLowerCase(), isGridAvenue && 'gridAvenue')} data-qa-avenue-status={loadedSectionCount < sections.length ? 'loading' : 'loaded'}>\n {avenueHeader}\n {backButton}\n {avenueImage}\n <div className='slider'>\n {this.renderSearchElement()}\n {sectionElements}\n {this.renderMyVideosEmpty()}\n {this.renderNoResult()}\n </div>\n </div>\n );\n }\n}\n\nconst mapStateToProps = (state: CombinedReducers): ReduxAvenueReducerStateType => {\n return {\n avenueList: state.ui.avenueList,\n features: state.appConfiguration.features,\n gridSectionId: state.ui.gridSectionId,\n searchString: state.ui.focusedAvenue?.searchString ?? null,\n };\n};\n\nconst mapDispatchToProps = (dispatch: Dispatch): ReduxAvenueDispatchToPropsType => {\n return {\n localGetImageUrl: (assetId: string, width: number, height: number, theme?: ThemeType, signal?: AbortSignal): Promise<any> =>\n dispatch(\n getImageUrl(\n {\n assetId,\n height,\n theme,\n width,\n },\n signal,\n ),\n ),\n\n localGetImageUrlFromDefinition: (urlDefinition: NETGEM_API_V8_URL_DEFINITION): Promise<any> => dispatch(getImageUrlFromDefinition(urlDefinition)),\n\n localGoBackToFocusedAvenue: () => dispatch(goBackToFocusedAvenue()),\n\n localUpdateGridSectionId: (gridSectionId: string | null): void => dispatch(updateGridSectionId(gridSectionId)),\n\n localUpdateSearchString: (searchString: string) => dispatch(updateSearchString(searchString)),\n };\n};\n\nconst Avenue: React.ComponentType<AvenuePropType> = connect(mapStateToProps, mapDispatchToProps, null, { forwardRef: true })(AvenueView);\n\nexport default Avenue;\n","/* @flow */\n\nimport './ErrorBoundary.css';\nimport * as React from 'react';\nimport { Messenger, MessengerEvents } from '@ntg/utils/dist/messenger';\nimport type { BasicFunction } from '@ntg/utils/dist/types';\n\ntype DefaultProps = {|\n +errorCallback?: BasicFunction,\n +isNotificationEnabled?: boolean,\n|};\n\ntype ErrorBoundaryPropType = {|\n ...DefaultProps,\n +children: React.Node,\n +componentName: string,\n|};\n\ntype ErrorBoundaryStateType = {|\n +error: ?Error,\n|};\n\nconst InitialState = Object.freeze({\n error: null,\n});\n\nclass ErrorBoundary extends React.PureComponent<ErrorBoundaryPropType, ErrorBoundaryStateType> {\n static getDerivedStateFromError(error: Error): any {\n return { error };\n }\n\n static defaultProps: DefaultProps = {\n errorCallback: undefined,\n isNotificationEnabled: false,\n };\n\n constructor(props: ErrorBoundaryPropType) {\n super(props);\n this.state = { ...InitialState };\n }\n\n componentDidCatch(error: Error) {\n const { componentName, errorCallback, isNotificationEnabled } = this.props;\n const { name: errorName } = error;\n\n if (isNotificationEnabled) {\n Messenger.emit(\n MessengerEvents.NOTIFY_ERROR,\n <div>\n {errorName} in "{componentName}"\n </div>,\n );\n }\n\n if (errorCallback) {\n errorCallback();\n }\n }\n\n render(): React.Node {\n const { children, componentName } = this.props;\n const { error } = this.state;\n\n if (error) {\n const { name: errorName } = error;\n return (\n <div className='errorBoundary'>\n {errorName} ({componentName})\n </div>\n );\n }\n\n return children;\n }\n}\n\nexport default ErrorBoundary;\n","/* @flow */\n\nimport './Footer.css';\nimport * as React from 'react';\nimport { Messenger, MessengerEvents } from '@ntg/utils/dist/messenger';\nimport type { CombinedReducers } from '../../redux/reducers';\nimport type { KeyValuePair } from '@ntg/utils/dist/types';\nimport { PictoArrowUp } from '@ntg/components/dist/pictos/Element';\nimport clsx from 'clsx';\nimport { connect } from 'react-redux';\n\ntype ReduxFooterReducerStateType = {|\n +configuration: KeyValuePair<string>, // eslint-disable-line react/no-unused-prop-types\n +isDebugModeEnabled: boolean,\n +isInTheaterMode: boolean,\n +versionShort: string, // eslint-disable-line react/no-unused-prop-types\n|};\n\ntype FooterPropType = {|\n +isVisible: boolean,\n|};\n\ntype FooterStateType = {|\n content: React.Node,\n|};\n\ntype CompleteFooterPropType = {|\n ...FooterPropType,\n ...ReduxFooterReducerStateType,\n|};\n\nclass FooterView extends React.PureComponent<CompleteFooterPropType, FooterStateType> {\n constructor(props: CompleteFooterPropType) {\n super(props);\n\n this.state = { content: null };\n this.setFooterContent(props);\n }\n\n componentDidUpdate(prevProps: CompleteFooterPropType) {\n const { isDebugModeEnabled } = this.props;\n const { isDebugModeEnabled: prevIsDebugModeEnabled } = prevProps;\n\n if (isDebugModeEnabled !== prevIsDebugModeEnabled) {\n this.setFooterContent(this.props);\n }\n }\n\n setFooterContent = (props: CompleteFooterPropType): void => {\n import('../../helpers/applicationCustomization/ui').then((module) => {\n module.AppFooterContent.then((FooterContent) => {\n if (!FooterContent) {\n return;\n }\n\n const { configuration, isDebugModeEnabled, versionShort } = props;\n\n this.setState({\n content: <FooterContent configuration={configuration} isDebugModeEnabled={isDebugModeEnabled} version={versionShort} />,\n });\n });\n });\n };\n\n handleTopButtonOnClick = (): void => {\n Messenger.emit(MessengerEvents.MOVE_TO_TOP);\n };\n\n render(): React.Node {\n const { isInTheaterMode, isVisible } = this.props;\n const { content } = this.state;\n\n return (\n <div className={clsx('footer', (isInTheaterMode && 'slideDown') || (isVisible && 'slideUp'))}>\n <div className='footerCommon'>\n <PictoArrowUp className='topButton' onClick={this.handleTopButtonOnClick} />\n </div>\n <React.Suspense fallback={<div>Error loading footer content</div>}>{content}</React.Suspense>\n </div>\n );\n }\n}\n\nconst mapStateToProps = (state: CombinedReducers): ReduxFooterReducerStateType => {\n return {\n configuration: state.appConfiguration.configuration,\n isDebugModeEnabled: state.appConfiguration.isDebugModeEnabled,\n isInTheaterMode: state.ui.isInTheaterMode,\n versionShort: state.appConfiguration.versionAppShort,\n };\n};\n\nconst Footer: React.ComponentType<FooterPropType> = connect(mapStateToProps, null, null, { forwardRef: true })(FooterView);\n\nexport default Footer;\n","/* @flow */\n\nimport * as React from 'react';\nimport { logError, logInfo, logWarning } from '../../helpers/debug/debug';\nimport type { CombinedReducers } from '../../redux/reducers';\nimport { ExternalContentDisplayType } from '../../redux/appConf/types/types';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport type { SecurityInfoType } from './HeaderConstsAndTypes';\nimport { getBOSetting } from '../../redux/netgemApi/actions/helpers/boSettings';\nimport { getSettingValueByName } from '../../redux/netgemApi/actions/helpers/settings';\nimport { showExternalContentModal } from '../../redux/modal/actions';\nimport { useCallback } from 'react';\n\nlet securityInfoKey: string | null = null;\nlet securityInfoValue: SecurityInfoType = {};\n\nconst buildSecurityInfo: (state: CombinedReducers) => SecurityInfoType = (state) => {\n const {\n appConfiguration,\n appConfiguration: { distributorAppKeys, mainDistributorId },\n appRegistration: { applicationId, authenticationToken, deviceKey, subscriberId, userInfo },\n } = state;\n\n const cacheKey = [applicationId, authenticationToken, deviceKey, subscriberId].join('+');\n if (securityInfoKey !== null && cacheKey === securityInfoKey) {\n return securityInfoValue;\n }\n\n const customerId = getBOSetting('customerId', appConfiguration);\n const identity = getBOSetting('identity', appConfiguration);\n const name = getBOSetting('name', appConfiguration);\n const productId = getBOSetting('productId', appConfiguration);\n const device = getSettingValueByName('platform.vf', 'device', appConfiguration);\n const email = userInfo?.email;\n\n securityInfoKey = cacheKey;\n securityInfoValue = {\n applicationId,\n authenticationToken,\n customerId,\n device,\n deviceKey,\n email,\n identity,\n mainDistributorId,\n name,\n productId,\n subscriberId,\n };\n\n Object.entries(distributorAppKeys).forEach(([appKey, distributorId]) => {\n securityInfoValue[`appKey for ${((distributorId: any): string)}`] = appKey ?? '<missing appkey>';\n });\n\n return securityInfoValue;\n};\n\nconst logSecurityInfo: (securityInfo: SecurityInfoType) => void = (securityInfo) => {\n logInfo('########### Security info ###########');\n Object.entries(securityInfo).forEach(([key, value]) => logInfo(`${key}: ${typeof value === 'string' ? value : ''}`));\n logInfo('#####################################');\n\n // Also copy authentication token to clipboard because it's commonly used by developers\n const { authenticationToken } = securityInfo;\n if (authenticationToken) {\n navigator.clipboard\n .writeText(authenticationToken)\n .then(() => logInfo('Authentication token was copied to clipboard.'))\n .catch(() => logError('Error copying authentication token to clipboard.'));\n }\n};\n\nconst getHeaderClass: (isInTheaterMode: boolean, isLogoLoaded: boolean, isScrolling: boolean) => string = (isInTheaterMode, isLogoLoaded, isScrolling) => {\n let headerClass = 'header';\n\n if (isInTheaterMode) {\n headerClass = 'header slideUp';\n } else if (isLogoLoaded) {\n headerClass = 'header slideDown';\n }\n\n if (isScrolling) {\n headerClass = `${headerClass} scroll`;\n }\n\n return headerClass;\n};\n\nconst renderSubscriptionPresentationButton: (displayType: ExternalContentDisplayType, url: string, dispatch: Function) => ?React.Node = (displayType, url, dispatch) => {\n if (url === '') {\n return null;\n }\n\n if (displayType === ExternalContentDisplayType.NewTab) {\n // Link opening a new tab/page\n return (\n <a href={url} rel='noopener noreferrer' target='_blank'>\n {Localizer.localize('subscription.offers_presentation_button')}\n </a>\n );\n } else if (displayType === ExternalContentDisplayType.EmbeddedPopup) {\n // Button opening an in-app popup\n\n const onClickHandler = useCallback(() => {\n if (displayType === ExternalContentDisplayType.EmbeddedPopup) {\n // Open external page in in-app popup\n dispatch(showExternalContentModal(url));\n }\n }, [displayType, url]);\n\n return (\n <div className='link' onClick={onClickHandler}>\n {Localizer.localize('subscription.offers_presentation_button')}\n </div>\n );\n }\n\n // Case ExternalContentDisplayType.ExternalPopup is not supposed to happen\n logWarning(`Unexpected display type for offers presentation page: ${(displayType: string)}`);\n return null;\n};\n\nconst renderFreeTrialButton: (isRegisteredAsGuest: boolean, hasButton: boolean, url: string) => ?React.Node = (isRegisteredAsGuest, hasButton, url) => {\n if (!isRegisteredAsGuest || !hasButton || url === '') {\n return null;\n }\n\n const onClickHandler = useCallback(() => window.location.assign(url), [url]);\n\n return (\n <div className='freeTrial' onClick={onClickHandler}>\n {Localizer.localize('subscription.start_free_trial_button')}\n </div>\n );\n};\n\nexport { buildSecurityInfo, getHeaderClass, logSecurityInfo, renderFreeTrialButton, renderSubscriptionPresentationButton };\n","/* @flow */\n\nimport './Item.css';\nimport * as React from 'react';\nimport { Messenger, MessengerEvents } from '@ntg/utils/dist/messenger';\nimport { AvenueType } from '../../helpers/ui/avenue/types';\nimport type { CombinedReducers } from '../../redux/reducers';\nimport type { Dispatch } from '../../redux/types/types';\nimport { NO_AVENUE_INDEX } from './NavigationMenu';\nimport clsx from 'clsx';\nimport { connect } from 'react-redux';\nimport { updateFocusedAvenue } from '../../redux/ui/actions';\n\ntype MenuItemPropType = {|\n +index: number,\n +text: string,\n +type: AvenueType,\n|};\n\ntype ReduxMenuItemReducerStateType = {|\n +focusedAvenueIndex: number,\n|};\n\ntype ReduxMenuItemDispatchToPropsType = {|\n +localUpdateFocusedAvenue: (index: number, type: AvenueType) => void,\n|};\n\ntype CompleteMenuItemPropType = {|\n ...MenuItemPropType,\n ...ReduxMenuItemReducerStateType,\n ...ReduxMenuItemDispatchToPropsType,\n|};\n\ntype MenuItemStateType = {||};\n\nclass MenuItemView extends React.PureComponent<CompleteMenuItemPropType, MenuItemStateType> {\n itemElement: HTMLElement | null;\n\n totalWidth: number | null;\n\n constructor(props: CompleteMenuItemPropType) {\n super(props);\n\n this.itemElement = null;\n this.totalWidth = null;\n }\n\n // eslint-disable-next-line react/no-unused-class-component-methods\n getTotalWidth = (): number => {\n const { itemElement, totalWidth } = this;\n\n if (!itemElement) {\n return 0;\n }\n\n if (totalWidth) {\n return totalWidth;\n }\n\n const { marginLeft, marginRight } = window.getComputedStyle(itemElement);\n\n this.totalWidth = Math.ceil(itemElement.offsetWidth) + Math.ceil(parseFloat(marginLeft)) + Math.ceil(parseFloat(marginRight));\n\n return this.totalWidth;\n };\n\n handleOnClick = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n const { focusedAvenueIndex, index, localUpdateFocusedAvenue, type } = this.props;\n\n if (type === AvenueType.Explore) {\n Messenger.emit(MessengerEvents.OPEN_EXPLORE_MODAL, index);\n return;\n }\n\n if (index === focusedAvenueIndex) {\n // Focused menu item has been clicked again: reset avenue\n Messenger.emit(MessengerEvents.AVENUE_RESET);\n return;\n }\n\n // Update focused avenue in store (which will trigger the actual loading of the avenue)\n localUpdateFocusedAvenue(index, type);\n };\n\n render(): React.Node {\n const { focusedAvenueIndex, index, text, type } = this.props;\n\n return (\n <div\n className={clsx('avenueElement', index === focusedAvenueIndex && 'focused', (type === AvenueType.Myvideos || type === AvenueType.Explore) && 'separator')}\n ref={(instance) => {\n this.itemElement = instance;\n }}\n >\n <div className='text' data-text={text} onClick={this.handleOnClick}>\n {text}\n </div>\n </div>\n );\n }\n}\n\nconst mapStateToProps = (state: CombinedReducers): ReduxMenuItemReducerStateType => {\n return {\n focusedAvenueIndex: state.ui.focusedAvenue?.index ?? NO_AVENUE_INDEX,\n };\n};\n\nconst mapDispatchToProps = (dispatch: Dispatch): ReduxMenuItemDispatchToPropsType => {\n return {\n localUpdateFocusedAvenue: (index: number, type: AvenueType) => dispatch(updateFocusedAvenue(index, type)),\n };\n};\n\nconst MenuItem: React.ComponentType<MenuItemPropType> = connect(mapStateToProps, mapDispatchToProps, null, { forwardRef: true })(MenuItemView);\n\nexport default MenuItem;\n","/* @flow */\n\nimport './NavigationMenu.css';\nimport * as React from 'react';\nimport { AVENUE_ID_EXPLORE, AVENUE_ID_MYVIDEOS } from '../../helpers/ui/avenue/constants';\nimport ResizeDetectorWrapper, { type ResizeType } from '../resizeDetectorWrapper/ResizeDetectorWrapper';\nimport { AvenueType } from '../../helpers/ui/avenue/types';\nimport { BURGER_WIDTH } from '../../helpers/ui/constants';\nimport type { CombinedReducers } from '../../redux/reducers';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport MenuItem from './Item';\nimport type { NETGEM_API_V8_HUB } from '../../libs/netgemLibrary/v8/types/Hub';\nimport { PictoArrowDown } from '@ntg/components/dist/pictos/Element';\nimport { RegistrationType } from '../../redux/appRegistration/types/types';\nimport { areHubsDifferent } from '../../helpers/ui/section/comparisons';\nimport { connect } from 'react-redux';\nimport getTranslatedText from '../../libs/netgemLibrary/v8/helpers/Lang';\n\nexport const NO_AVENUE_INDEX = -1;\n\ntype MenuItemType = {|\n index: number,\n text: string,\n type: AvenueType,\n|};\n\ntype ReduxNavigationMenuReducerStateType = {|\n +avenueList: ?NETGEM_API_V8_HUB,\n +isRegisteredAsGuest: boolean,\n|};\n\ntype NavigationMenuPropType = {||};\n\ntype CompleteNavigationMenuPropType = {|\n ...NavigationMenuPropType,\n ...ReduxNavigationMenuReducerStateType,\n|};\n\ntype NavigationMenuStateType = {|\n hiddenItems: Array<MenuItemType>,\n visibleItems: Array<MenuItemType>,\n|};\n\nconst InitialState: $ReadOnly<NavigationMenuStateType> = Object.freeze({\n hiddenItems: [],\n visibleItems: [],\n});\n\nclass NavigationMenuView extends React.PureComponent<CompleteNavigationMenuPropType, NavigationMenuStateType> {\n itemMapRef: Map<number, React.ElementRef<any>>;\n\n itemWidths: Array<number>;\n\n constructor(props: CompleteNavigationMenuPropType) {\n super(props);\n\n this.itemMapRef = new Map();\n this.itemWidths = [];\n\n this.state = { ...InitialState };\n }\n\n componentDidMount() {\n this.createItems();\n }\n\n componentDidUpdate(prevProps: CompleteNavigationMenuPropType) {\n const { avenueList } = this.props;\n const { avenueList: prevAvenueList } = prevProps;\n\n if (areHubsDifferent(avenueList, prevAvenueList)) {\n this.createItems();\n }\n }\n\n computeVisibleItemsWidth = (): number => {\n const { visibleItems } = this.state;\n const { itemMapRef, itemWidths } = this;\n\n let visibleItemsWidth = 0;\n visibleItems.forEach((_, index) => {\n const itemRef = itemMapRef.get(index);\n if (itemRef) {\n const totalWidth = itemRef.getTotalWidth();\n visibleItemsWidth += totalWidth;\n itemWidths[index] = totalWidth;\n }\n });\n\n return visibleItemsWidth;\n };\n\n hideItems = (menuWidth: number, visibleItemsWidth: number) => {\n const { hiddenItems, visibleItems } = this.state;\n const { itemWidths } = this;\n\n const newHiddenItems: Array<MenuItemType> = [];\n const visibleItemsCopy = [...visibleItems];\n\n let newVisibleItemsWidth = visibleItemsWidth;\n if (hiddenItems.length === 0) {\n newVisibleItemsWidth += BURGER_WIDTH;\n }\n\n let lastItemIndex = visibleItemsCopy.length;\n while (newVisibleItemsWidth > menuWidth) {\n lastItemIndex -= 1;\n const lastVisibleItem = visibleItemsCopy.pop();\n\n // Since flowjs v0.239.0, \"lastVisibleItem\" is said to be potentially undefined (which is impossible, here)\n if (!lastVisibleItem) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n newHiddenItems.unshift(lastVisibleItem);\n newVisibleItemsWidth -= itemWidths[lastItemIndex];\n }\n\n this.setState({\n hiddenItems: [...newHiddenItems, ...hiddenItems],\n visibleItems: visibleItemsCopy,\n });\n };\n\n showItemsIfNecessary = (menuWidth: number, visibleItemsWidth: number) => {\n const { hiddenItems, visibleItems } = this.state;\n const { itemWidths } = this;\n\n const hiddenItemsCopy = [...hiddenItems];\n let { length: hiddenItemCount } = hiddenItems;\n let firstHiddenItemIndex = visibleItems.length;\n let potentialNewWidth = visibleItemsWidth + itemWidths[firstHiddenItemIndex] - (hiddenItemCount === 1 ? BURGER_WIDTH : 0);\n\n const newVisibleItems = [];\n while (potentialNewWidth < menuWidth) {\n const firstHiddenItem = hiddenItemsCopy.shift();\n\n // Since flowjs v0.239.0, \"firstHiddenItem\" is said to be potentially undefined (which is impossible, here)\n if (!firstHiddenItem) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n hiddenItemCount -= 1;\n newVisibleItems.push(firstHiddenItem);\n\n // Try one more item\n firstHiddenItemIndex += 1;\n potentialNewWidth += itemWidths[firstHiddenItemIndex] - (hiddenItemCount === 1 ? BURGER_WIDTH : 0);\n }\n\n if (newVisibleItems.length > 0) {\n this.setState({\n hiddenItems: hiddenItemsCopy,\n visibleItems: [...visibleItems, ...newVisibleItems],\n });\n }\n };\n\n handleMenuOnResize = (data: ResizeType) => {\n const { hiddenItems } = this.state;\n const { width: menuWidth } = data;\n\n if (menuWidth === null) {\n // Component not mounted\n return;\n }\n\n const visibleItemsWidth = this.computeVisibleItemsWidth();\n\n if (visibleItemsWidth > menuWidth) {\n // Hide some menu items\n this.hideItems(menuWidth, visibleItemsWidth);\n } else if (hiddenItems.length > 0) {\n // Show some menu items\n this.showItemsIfNecessary(menuWidth, visibleItemsWidth);\n }\n };\n\n createItems = () => {\n const { avenueList, isRegisteredAsGuest } = this.props;\n\n this.itemMapRef.clear();\n const visibleItems: Array<MenuItemType> = [];\n\n // Regular avenues\n if (avenueList) {\n avenueList.forEach((avenue, index) => {\n const { id, title } = avenue;\n\n const text = getTranslatedText(title, Localizer.language);\n\n let type: AvenueType = AvenueType.Regular;\n if (id === AVENUE_ID_EXPLORE) {\n type = AvenueType.Explore;\n } else if (id === AVENUE_ID_MYVIDEOS) {\n type = AvenueType.Myvideos;\n }\n\n if (id !== AVENUE_ID_MYVIDEOS || !isRegisteredAsGuest) {\n visibleItems.push({\n index,\n text,\n type,\n });\n }\n });\n }\n\n this.setState({\n hiddenItems: [],\n visibleItems,\n });\n };\n\n renderItems = (items: Array<MenuItemType>): Array<React.ElementRef<any>> =>\n items.map(({ index, text, type }) => (\n <MenuItem\n index={index}\n key={index}\n ref={(instance) => {\n this.itemMapRef.set(index, instance);\n }}\n text={text}\n type={type}\n />\n ));\n\n renderBurgerIcon = (): React.ElementRef<any> | null => {\n const { hiddenItems } = this.state;\n\n if (hiddenItems.length === 0) {\n return null;\n }\n\n return (\n <div className='burgerIcon'>\n <PictoArrowDown forceHoverEffect />\n <div className='burgerMenu'>{this.renderItems(hiddenItems)}</div>\n </div>\n );\n };\n\n render(): React.Node {\n const { visibleItems } = this.state;\n\n return (\n <div className='menuWrapper'>\n {this.renderItems(visibleItems)}\n {this.renderBurgerIcon()}\n <ResizeDetectorWrapper handleWidth onResize={this.handleMenuOnResize} />\n </div>\n );\n }\n}\n\nconst mapStateToProps = (state: CombinedReducers): ReduxNavigationMenuReducerStateType => {\n return {\n avenueList: state.ui.avenueList,\n isRegisteredAsGuest: state.appRegistration.registration === RegistrationType.RegisteredAsGuest,\n };\n};\n\nconst NavigationMenu: React.ComponentType<NavigationMenuPropType> = connect(mapStateToProps, null, null, { forwardRef: true })(NavigationMenuView);\n\nexport default NavigationMenu;\n","/* @flow */\n\nimport './SearchBox.css';\nimport * as React from 'react';\nimport { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';\nimport HotKeys from '../../helpers/hotKeys/hotKeys';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport { PictoMagnifier } from '@ntg/components/dist/pictos/Element';\nimport { SEARCH_STRING_MIN_LENGTH } from '../../helpers/search/constants';\nimport { useSelector } from 'react-redux';\n\ntype PropType = {|\n +onSearch: (searchString: string) => void,\n|};\n\nconst SearchBox = ({ onSearch }: PropType, ref: React.ElementRef<any> | null): React.Node => {\n const lastSearchTerm: string = useSelector((state) => state.ui.searchHistory[0]);\n const [isOpen, setIsOpen] = useState<boolean>(false);\n const [searchString, setSearchString] = useState<string>('');\n\n const inputRef = useRef<HTMLElement | null>(null);\n\n const isClosed = useCallback(() => !isOpen, [isOpen]);\n const open = useCallback(() => setIsOpen(true), [setIsOpen]);\n\n useImperativeHandle(ref, () => {\n return {\n isClosed,\n open,\n };\n });\n\n const reset: () => void = useCallback(() => {\n HotKeys.unregister('enter', handleSearchHotKey);\n HotKeys.unregister('escape', handleResetHotKey);\n\n setIsOpen(false);\n setSearchString('');\n }, [setIsOpen, setSearchString]);\n\n const launchSearch = useCallback(\n (searchTerm?: string) => {\n const trimmedSearchString = searchTerm ?? searchString.trim();\n if (trimmedSearchString.length >= SEARCH_STRING_MIN_LENGTH) {\n onSearch(trimmedSearchString);\n reset();\n }\n },\n [onSearch, reset, searchString],\n );\n\n const handleSearchHotKey = useCallback(\n (event: SyntheticKeyboardEvent<HTMLElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n launchSearch();\n },\n [launchSearch],\n );\n\n const handleResetHotKey = useCallback(\n (event: SyntheticKeyboardEvent<HTMLElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n reset();\n },\n [reset],\n );\n\n useEffect(() => {\n if (!isOpen || !inputRef.current) {\n // Returning undefined to avoid eslint consistent-return error\n return undefined;\n }\n\n inputRef.current.focus();\n\n HotKeys.register('enter', handleSearchHotKey, {\n allowEditableContext: true,\n name: 'Search.search',\n });\n HotKeys.register('escape', handleResetHotKey, {\n allowEditableContext: true,\n name: 'Search.reset',\n });\n\n return () => {\n HotKeys.unregister('enter', handleSearchHotKey);\n HotKeys.unregister('escape', handleResetHotKey);\n };\n }, [handleResetHotKey, handleSearchHotKey, isOpen]);\n\n const handleOnClick = useCallback(\n (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => {\n const { ctrlKey, shiftKey } = event;\n\n if (!isOpen) {\n if (ctrlKey || shiftKey) {\n // Relaunch last search\n launchSearch(lastSearchTerm);\n }\n setIsOpen(true);\n } else {\n launchSearch();\n }\n },\n [isOpen, lastSearchTerm, launchSearch, setIsOpen],\n );\n\n const handleOnChange = useCallback(\n (event: SyntheticInputEvent<HTMLInputElement>) => {\n setSearchString(event.currentTarget.value);\n },\n [setSearchString],\n );\n\n const handleOnBlur = useCallback(() => {\n if (searchString.trim() === '') {\n reset();\n }\n }, [reset, searchString]);\n\n const inputElt = useMemo(() => {\n if (!isOpen) {\n return null;\n }\n\n return <input onBlur={handleOnBlur} onChange={handleOnChange} placeholder={Localizer.localize('search.placeholder')} ref={inputRef} type='text' value={searchString} />;\n }, [handleOnBlur, handleOnChange, isOpen, searchString]);\n\n return (\n <div className='searchBox'>\n <PictoMagnifier onClick={handleOnClick} />\n {inputElt}\n </div>\n );\n};\n\n// $FlowFixMe: don't know how to annotate this export\nexport default forwardRef(SearchBox);\n","/* @flow */\n\nimport './UserMenu.css';\nimport * as React from 'react';\nimport { HeightKind, WidthKind } from '../buttons/types';\nimport { Messenger, MessengerEvents } from '@ntg/utils/dist/messenger';\nimport ButtonFX from '../buttons/ButtonFX';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport { PictoUser } from '@ntg/components/dist/pictos/Element';\nimport { RegistrationType } from '../../redux/appRegistration/types/types';\nimport { useCallback } from 'react';\nimport { useSelector } from 'react-redux';\n\nconst UserMenu = (): React.Node => {\n const isRegisteredAsGuest = useSelector((state) => state.appRegistration.registration === RegistrationType.RegisteredAsGuest);\n\n const handleGlobalSettingsOnClick = useCallback(() => Messenger.emit(MessengerEvents.OPEN_GLOBAL_SETTINGS), []);\n\n // Guest mode: let's open the sign-in page\n const handleSignInOnClick = useCallback(() => Messenger.emit(MessengerEvents.SHOW_SIGN_IN), []);\n\n if (isRegisteredAsGuest) {\n // Sign-in button\n return (\n <ButtonFX hasPadding heightKind={HeightKind.Medium} onClick={handleSignInOnClick} widthKind={WidthKind.Content}>\n {Localizer.localize('authentication.connection')}\n </ButtonFX>\n );\n }\n\n return <PictoUser onClick={handleGlobalSettingsOnClick} />;\n};\n\nexport default UserMenu;\n","/* @flow */\n\nimport './Header.css';\nimport * as React from 'react';\nimport { type HeaderPropType, LOGO_LOAD_TIMEOUT } from './HeaderConstsAndTypes';\nimport { buildSecurityInfo, getHeaderClass, logSecurityInfo, renderFreeTrialButton, renderSubscriptionPresentationButton } from './HeaderHelper';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { AppHeaderLogo } from '../../helpers/applicationCustomization/ui';\nimport { AvenueType } from '../../helpers/ui/avenue/types';\nimport HotKeys from '../../helpers/hotKeys/hotKeys';\nimport NavigationMenuView from '../navigationMenu/NavigationMenu';\nimport { RegistrationType } from '../../redux/appRegistration/types/types';\nimport SearchBox from '../search/SearchBox';\nimport UserMenu from './UserMenu';\nimport { updateFocusedAvenue } from '../../redux/ui/actions';\n\nconst Header = ({ isScrolling, onLogoLoaded, onSearch }: HeaderPropType): React.Node => {\n const dispatch = useDispatch();\n\n const [isLogoLoaded, setIsLogoLoaded] = useState<boolean>(false);\n const [headerClass, setHeaderClass] = useState<string>('header');\n\n const applicationName = useSelector((state) => state.appConfiguration.applicationName);\n const focusedAvenue = useSelector((state) => state.ui.focusedAvenue);\n const mainAvenue = useSelector((state) => state.ui.mainAvenue);\n const isDebugModeEnabled = useSelector((state) => state.appConfiguration.isDebugModeEnabled);\n const isInTheaterMode = useSelector((state) => state.ui.isInTheaterMode);\n const securityInfo = useSelector((state) => buildSecurityInfo(state));\n const subscriptionPresentationDisplay = useSelector((state) => state.appConfiguration.subscriptionPresentationDisplay);\n const subscriptionPresentationUrl = useSelector((state) => state.appConfiguration.configuration.subscriptionPresentationUrl ?? '');\n const hasFreeTrialButton = useSelector((state) => state.appConfiguration.hasFreeTrialButton);\n const freeTrialUrl = useSelector((state) => state.appConfiguration.configuration.subscribeWebUrl ?? '');\n const isRegisteredAsGuest = useSelector((state) => state.appRegistration.registration === RegistrationType.RegisteredAsGuest);\n\n const logoLoadTimer = useRef<TimeoutID | null>(null);\n const searchBoxRef = useRef<React.ElementRef<any> | null>(null);\n\n const resetLogoLoadTimer = useCallback(() => {\n if (logoLoadTimer.current) {\n clearTimeout(logoLoadTimer.current);\n logoLoadTimer.current = null;\n }\n }, []);\n\n const handleHeaderImageOnLoad = useCallback(() => {\n resetLogoLoadTimer();\n setIsLogoLoaded(true);\n onLogoLoaded();\n }, [onLogoLoaded, resetLogoLoadTimer]);\n\n useEffect(() => {\n const handleOpenSearchBoxHotKey = (event: SyntheticKeyboardEvent<HTMLElement>) => {\n if ((!focusedAvenue || focusedAvenue.type !== AvenueType.Search) && searchBoxRef.current && searchBoxRef.current.isClosed()) {\n event.preventDefault();\n event.stopPropagation();\n searchBoxRef.current?.open();\n }\n };\n\n HotKeys.register('s', handleOpenSearchBoxHotKey, { name: 'Header.openSearch' });\n logoLoadTimer.current = setTimeout(handleHeaderImageOnLoad, LOGO_LOAD_TIMEOUT);\n\n return () => {\n HotKeys.unregister('s', handleOpenSearchBoxHotKey);\n resetLogoLoadTimer();\n };\n }, [focusedAvenue, handleHeaderImageOnLoad, resetLogoLoadTimer, searchBoxRef.current]);\n\n useEffect(() => {\n setHeaderClass(getHeaderClass(isInTheaterMode, isLogoLoaded, isScrolling));\n }, [isInTheaterMode, isLogoLoaded, isScrolling]);\n\n const handleHeaderImageOnClick = useCallback(\n (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => {\n if (isDebugModeEnabled && (event.ctrlKey || event.altKey) && event.shiftKey) {\n logSecurityInfo(securityInfo);\n return;\n }\n\n dispatch(updateFocusedAvenue(mainAvenue.index, mainAvenue.type));\n },\n [isDebugModeEnabled, mainAvenue, securityInfo],\n );\n\n const handleOnSearch = useCallback(\n (searchString: string) => {\n onSearch(searchString);\n },\n [onSearch],\n );\n\n return (\n <div className={headerClass}>\n <div className='headerLeft'>\n <img alt={applicationName} className='headerImage' draggable={false} onClick={handleHeaderImageOnClick} onLoad={handleHeaderImageOnLoad} src={AppHeaderLogo} />\n </div>\n <div className='headerMiddle'>\n <NavigationMenuView />\n </div>\n <div className='headerRight'>\n {renderSubscriptionPresentationButton(subscriptionPresentationDisplay, subscriptionPresentationUrl, dispatch)}\n <SearchBox onSearch={handleOnSearch} ref={searchBoxRef} />\n {renderFreeTrialButton(isRegisteredAsGuest, hasFreeTrialButton, freeTrialUrl)}\n <UserMenu />\n </div>\n </div>\n );\n};\n\nexport default Header;\n","/* @flow */\n\nimport type { BasicFunction, KeyValuePair } from '@ntg/utils/dist/types';\n\n// After 1 second, display the header even if the logo is not loaded\nexport const LOGO_LOAD_TIMEOUT = 1_000;\n\nexport type HeaderPropType = {|\n +isScrolling: boolean,\n +onLogoLoaded: BasicFunction,\n +onSearch: (searchString: string) => void,\n|};\n\nexport type SecurityInfoType = KeyValuePair<?string>;\n","/* @flow */\n\nimport './ImageCarousel.css';\nimport * as React from 'react';\nimport { Messenger, MessengerEvents } from '@ntg/utils/dist/messenger';\nimport type { CombinedReducers } from '../../redux/reducers';\nimport clsx from 'clsx';\nimport { connect } from 'react-redux';\nimport { showDebug } from '../../helpers/debug/debug';\n\ntype ImageCarouselPropType = {||};\n\ntype ReduxImageCarouselReducerStateType = {|\n +gridSectionId: string | null,\n +isDebugModeEnabled: boolean,\n|};\n\ntype CompleteImageCarouselPropType = {|\n ...ImageCarouselPropType,\n ...ReduxImageCarouselReducerStateType,\n|};\n\ntype ImageCarouselStateType = {|\n currentIndex: number,\n imageUrlList: Array<string> | null,\n isHidden: boolean,\n|};\n\nconst InitialState = Object.freeze({\n currentIndex: -1,\n imageUrlList: null,\n isHidden: false,\n});\n\nclass ImageCarouselView extends React.PureComponent<CompleteImageCarouselPropType, ImageCarouselStateType> {\n constructor(props: CompleteImageCarouselPropType) {\n super(props);\n\n const { gridSectionId } = props;\n\n this.state = {\n ...InitialState,\n isHidden: gridSectionId !== null,\n };\n }\n\n componentDidMount() {\n Messenger.on(MessengerEvents.CAROUSEL_SHOW_DEBUG, this.showDebug);\n Messenger.on(MessengerEvents.IMAGE_CAROUSEL_SET, this.setImages);\n Messenger.on(MessengerEvents.CAROUSEL_SET_CURRENT_INDEX, this.setCurrentIndex);\n Messenger.on(MessengerEvents.CAROUSEL_SHOW, this.show);\n Messenger.on(MessengerEvents.CAROUSEL_HIDE, this.hide);\n }\n\n componentWillUnmount() {\n Messenger.off(MessengerEvents.CAROUSEL_SHOW_DEBUG, this.showDebug);\n Messenger.off(MessengerEvents.IMAGE_CAROUSEL_SET, this.setImages);\n Messenger.off(MessengerEvents.CAROUSEL_SET_CURRENT_INDEX, this.setCurrentIndex);\n Messenger.off(MessengerEvents.CAROUSEL_SHOW, this.show);\n Messenger.off(MessengerEvents.CAROUSEL_HIDE, this.hide);\n }\n\n showDebug: () => void = () => {\n const { props, state } = this;\n const { isDebugModeEnabled } = props;\n\n if (!isDebugModeEnabled) {\n return;\n }\n\n showDebug('Background Images', {\n state,\n stateFields: ['currentIndex', 'imageUrlList', 'isHidden'],\n });\n };\n\n setImages = (imageUrlList: Array<string>): void => {\n this.setState({\n currentIndex: 0,\n imageUrlList,\n });\n };\n\n setCurrentIndex = (currentIndex: number): void => {\n this.setState({ currentIndex });\n };\n\n show: () => void = () => {\n this.setState({ isHidden: false });\n };\n\n hide: () => void = () => {\n this.setState({ isHidden: true });\n };\n\n render(): React.Node {\n const { currentIndex, imageUrlList, isHidden } = this.state;\n\n if (isHidden || !imageUrlList || currentIndex < 0 || currentIndex >= imageUrlList.length) {\n return null;\n }\n\n return (\n <div className='imageCarousel'>\n {imageUrlList.map((url, i) => (\n <img alt='' className={clsx('imageContainer', i === currentIndex && 'selected')} data-index={i} key={url} src={url} />\n ))}\n </div>\n );\n }\n}\n\nconst mapStateToProps = (state: CombinedReducers): ReduxImageCarouselReducerStateType => {\n return {\n gridSectionId: state.ui.gridSectionId,\n isDebugModeEnabled: state.appConfiguration.isDebugModeEnabled,\n };\n};\n\nconst ImageCarousel: React.ComponentType<ImageCarouselPropType> = connect(mapStateToProps, null)(ImageCarouselView);\n\nexport default ImageCarousel;\n","/* @flow */\n\nexport enum SkipDirection {\n Backward,\n Forward,\n}\n\nexport type ScrollOptions = {|\n behavior?: 'auto' | 'instant' | 'smooth',\n block?: 'start' | 'center' | 'end' | 'nearest',\n inline?: 'start' | 'center' | 'end' | 'nearest',\n|};\n","/* @flow */\n\nimport { SKIP_DURATION_LEVEL0, SKIP_DURATION_LEVEL1, SKIP_DURATION_LEVEL2, type SkipDuration } from './constants';\nimport { SkipDirection } from './types';\nimport { SkippingKind } from '../../components/player/constantsAndTypes';\n\nexport enum ControlLevel {\n Level0,\n Level1,\n Level2,\n}\n\nconst eventToControlLevel = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement> | SyntheticKeyboardEvent<HTMLElement>): ControlLevel => {\n const { ctrlKey, shiftKey } = event;\n\n if (shiftKey) {\n return ControlLevel.Level2;\n }\n\n if (ctrlKey) {\n return ControlLevel.Level1;\n }\n\n return ControlLevel.Level0;\n};\n\nconst getSkippingTypeAndValue = (\n direction: SkipDirection,\n event?: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement> | SyntheticKeyboardEvent<HTMLElement>,\n): {| type: SkippingKind, value: SkipDuration |} => {\n let type: SkippingKind = direction === SkipDirection.Forward ? SkippingKind.ForwardLevel0 : SkippingKind.BackwardLevel0;\n let value: SkipDuration = SKIP_DURATION_LEVEL0;\n\n if (event) {\n const controlLevel = eventToControlLevel(event);\n\n switch (controlLevel) {\n case ControlLevel.Level1:\n type = direction === SkipDirection.Forward ? SkippingKind.ForwardLevel1 : SkippingKind.BackwardLevel1;\n value = SKIP_DURATION_LEVEL1;\n break;\n\n case ControlLevel.Level2:\n type = direction === SkipDirection.Forward ? SkippingKind.ForwardLevel2 : SkippingKind.BackwardLevel2;\n value = SKIP_DURATION_LEVEL2;\n break;\n\n default:\n // Nothing to do\n }\n }\n\n if (direction === SkipDirection.Backward) {\n value = -value;\n }\n\n return {\n type,\n value,\n };\n};\n\nexport { getSkippingTypeAndValue, eventToControlLevel };\n","/* @flow */\n\nimport type { BasicFunction, BasicPromiseFunction } from '@ntg/utils/dist/types';\nimport type { ChannelMap, NETGEM_API_CHANNEL } from '../../libs/netgemLibrary/v8/types/Channel';\nimport type { LOCATION_METADATA_METRICS, NETGEM_API_V8_METADATA_SCHEDULE_LOCATION } from '../../libs/netgemLibrary/v8/types/MetadataSchedule';\nimport type { MetadataKind, NETGEM_API_V8_METADATA_PROGRAM, NETGEM_API_V8_METADATA_SERIES } from '../../libs/netgemLibrary/v8/types/MetadataProgram';\nimport type { NETGEM_API_VIEWINGHISTORY, NETGEM_API_VIEWINGHISTORY_ITEM } from '../../libs/netgemLibrary/v8/types/ViewingHistory';\nimport { Setting, type Settings } from '../../helpers/settings/types';\nimport type { VideoPlayerDebugInfo, VideoPlayerExternalSubtitles, VideoPlayerInitData, VideoPlayerMediaInfo } from './implementation/types';\nimport type { BO_PURCHASE_LIST_TYPE } from '../../redux/netgemApi/actions/videofutur/types/purchase';\nimport type { CONFIRMATION_DATA_MODAL_TYPE } from '../modal/confirmationModal/ConfirmationModal';\nimport type { CombinedReducers } from '../../redux/reducers';\nimport { ControlLevel } from '../../helpers/ui/player';\nimport type { DATA_COLLECTION_INTERNAL_MESSAGE } from '../../libs/netgemLibrary/v8/types/DataCollection';\nimport type { DmsSettingMap } from '../../libs/netgemLibrary/dms/types/DeviceInfoSettings';\nimport type { EXTENDED_ITEM } from '../../helpers/ui/item/types';\nimport { LoadableStatus } from '../../helpers/loadable/loadable';\nimport type { LuminosityType } from '@ntg/ui/dist/theme';\nimport type { NETGEM_API_V8_FEED_ITEM } from '../../libs/netgemLibrary/v8/types/FeedItem';\nimport type { NETGEM_RECORDINGS_MAP } from '../../libs/netgemLibrary/v8/types/Npvr';\nimport type { STREAM_PRIORITIES_TYPE } from '../../helpers/ui/metadata/Types';\nimport type { SettingValueType } from '../settings/SettingsConstsAndTypes';\nimport type { ShakaOfflineContent } from './implementation/shakaTypes';\nimport { WebAppHelpersLocationStatus } from '../../helpers/ui/location/Format';\n\nexport enum StopStreamKind {\n FinalStop,\n Initialization,\n Pause,\n}\n\nexport enum SkippingKind {\n BackwardLevel0,\n BackwardLevel1,\n BackwardLevel2,\n ForwardLevel0,\n ForwardLevel1,\n ForwardLevel2,\n None,\n}\n\nexport type NTGENTITLEMENT_PARAMS = {|\n channelId: ?string,\n customData: string,\n service: string,\n url: string,\n|};\n\n/*\n * Steps:\n * NotStarted > LoadingProgramMetadata > Loaded | ItemNotFound\n * or:\n * NotStarted > LoadingProgramMetadata > LoadingSeriesMetadata > Loaded | ItemNotFound\n */\nexport enum ProgramInfoLoadStatus {\n NotStarted,\n LoadingProgramMetadata,\n LoadingSeriesMetadata,\n Loaded,\n ItemNotFound,\n}\n\n/*\n * Resume mechanism can be in 4 states:\n * - NotChecked: we've not checked yet if a resume position exists\n * - NoResumePosition: no resume position has been found -> nothing to do\n * - PromptUserIfNeeded: a resume positions exists, user should be prompted to use it or not (skipped if \"auto resume\" setting is enabled)\n * - Seeking: user chose to restart or resume (could take a little time since we have to wait that the video actually starts playing)\n * - Done: user made a choice (resume or restart) and video seeked to the right position\n */\nexport enum ResumeState {\n NotChecked,\n NoResumePosition,\n PromptUserIfNeeded,\n Seeking,\n Done,\n}\n\nexport enum ContentType {\n // Live TV program\n Live,\n // Live TV program being recorded (including end margin)\n LiveRecording,\n // Catchup, finished recording, VOD\n Static,\n}\n\n// If resume position is less than 5s from the end, program is considered entirely watched and resume position is reset (in seconds)\nexport const RESUME_REWIND_DURATION = 5;\n\nexport const DOUBLE_CLICK = Object.freeze({\n // In percent\n BackwardSkipAreaThreshold: 0.2,\n // In percent\n ForwardSkipAreaThreshold: 0.8,\n // In milliseconds\n MaxDuration: 300,\n});\n\n// Display duration of skip and play/pause pictos (in milliseconds)\nexport const BLINKING_PICTO_DURATION = 500;\n\n// Display duration of controls (in milliseconds)\nexport const OVERLAY_TIMEOUT = 3_000;\n\n// Time between two updates of the player debug info metrics (in milliseconds)\nexport const DEBUG_INFO_METRICS_TIMEOUT = 100;\n\n// In seconds\nexport const PLAYHEAD_POSITION_CHANGE_THRESHOLD = 5;\n\n// Increment/decrement when changing volume through keyboard shortcut\nexport const VOLUME_STEP = 0.1;\n\n// Playback rate is capped at 16 in most browsers\nexport const PLAYBACK_RATES: Array<number> = Object.freeze([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 5, 10, 16]); // eslint-disable-line no-magic-numbers\nexport const NORMAL_PLAYBACK_INDEX: number = PLAYBACK_RATES.findIndex((r) => r === 1);\n\nexport const ONE_HUNDRED = 100;\nexport const ONE_THOUSAND = 1_000;\n\n// Playback duration greater than twice the program duration is considered an error\nexport const PLAYBACK_DURATION_ERROR_THRESHOLD = 2;\n\n// If position is between <now - TIMESHIFT_THRESHOLD> and <now>, we consider the stream is played live, otherwise, we're timeshifting (in seconds)\nexport const TIMESHIFT_THRESHOLD = 5;\n\n// Code used in 'handleClose' function to indicate that the exit is not due to an error\nexport const NO_ERROR_CODE = 'no_error';\n\n// Image dimension for Global Media Controls\nexport const GMC_IMAGE_WIDTH = 320;\nexport const GMC_IMAGE_HEIGHT = 184;\n\n// Image dimension for cover in controller\nexport const COVER_IMAGE_WIDTH = 108;\nexport const COVER_IMAGE_HEIGHT = 160;\n\n// Video resolution\nexport const RESOLUTION = Object.freeze({\n FourK: {\n Height: 2160,\n Width: 3840,\n },\n HD: {\n Height: 720,\n Width: 1280,\n },\n});\n\nexport type ErrorCallback = BasicFunction | BasicPromiseFunction;\n\nexport type ViewingHistoryIds = {|\n isVod: boolean,\n locationId: string | null,\n programId: string,\n seriesId: string | null,\n|};\n\nexport type ResumeData = {|\n resumePosition: number,\n resumeState: ResumeState,\n|};\n\nexport type CloseData = {|\n downloadOperationId?: string | null,\n errorCode?: string | null,\n errorMsg?: string | null,\n isLargeNotificationNeeded?: boolean,\n isSafariWorkaround?: boolean,\n|};\n\nexport type CreateVodStreamFunction = (distributorId: string, vtiId: number, signal?: AbortSignal) => Promise<any>;\n\nexport type ReduxPlayerDispatchToPropsType = {|\n +closeConfirmation: BasicFunction,\n +localGetImageUrl: (assetId: string, width: number, height: number, luminosity?: LuminosityType, signal?: AbortSignal) => Promise<any>,\n +localCreateSvodStreamFromId: CreateVodStreamFunction,\n +localCreateVodStreamFromId: CreateVodStreamFunction,\n +localSendNtgEntitlementGetRequest: (customData: string, service: string, url: string, channelId: string, signal?: AbortSignal) => Promise<any>,\n +localSendNtgEntitlementReleaseRequest: (customData: string, service: string, url: string, channelId: string, signal?: AbortSignal) => Promise<any>,\n +localSendV8LocationEpgRequest: (startTime: number, range: number, channelIds: Array<string>, signal?: AbortSignal) => Promise<any>,\n +localSendV8MetadataLocationRequest: (assetId: string, signal?: AbortSignal) => Promise<any>,\n +localSendV8MetadataRequest: (assetId: string, type: MetadataKind, signal?: AbortSignal) => Promise<any>,\n +localSendV8RecordingsMetadataRequest: (recordId: string, signal?: AbortSignal) => Promise<any>,\n +localSendVideofuturStreamCreateRequest: (distributorId: string, vtiId: number, licence: boolean, signal?: AbortSignal) => Promise<any>,\n +localSendVideofuturStreamStartRequest: (distributorId: string, streamId: number, signal?: AbortSignal) => Promise<any>,\n +localSendVideofuturStreamStopRequest: (distributorId: string, streamId: number, bookmark?: string, signal?: AbortSignal, keepAlive?: boolean) => Promise<any>,\n +localShowConfirmation: (data: CONFIRMATION_DATA_MODAL_TYPE) => void,\n +localStopOpenStreams: (distributorId: string, signal?: AbortSignal) => Promise<any>,\n +localUpdateSetting: (setting?: Setting, value: SettingValueType) => Promise<any>,\n +localUpdateViewingHistory: (item: NETGEM_API_VIEWINGHISTORY_ITEM, signal?: AbortSignal) => Promise<any>,\n|};\n\nexport type ReduxPlayerReducerStateType = {|\n +applicationName: string,\n +authenticationToken: string | null,\n +channels: ChannelMap,\n +deviceSettings: DmsSettingMap,\n +isDebugModeEnabled: boolean,\n +isMaxBitrateAllowed: boolean,\n +maxBitrate: number,\n +npvrRecordingsList: NETGEM_RECORDINGS_MAP,\n +purchaseList: BO_PURCHASE_LIST_TYPE,\n +settings: Settings,\n +state: CombinedReducers,\n +streamPriorities: STREAM_PRIORITIES_TYPE | null,\n +viewingHistory: NETGEM_API_VIEWINGHISTORY,\n +viewingHistoryStatus: LoadableStatus,\n|};\n\nexport type PlayerPropType = {|\n +closeCallback: (retry: boolean) => void,\n +playerOfflineContent: ShakaOfflineContent | null,\n +playerItem: EXTENDED_ITEM | null,\n|};\n\nexport type CompletePlayerPropType = {|\n ...PlayerPropType,\n ...ReduxPlayerDispatchToPropsType,\n ...ReduxPlayerReducerStateType,\n|};\n\nexport type PlayerStateInitializationType = {|\n endMargin: number,\n externalSubtitles: Array<VideoPlayerExternalSubtitles>,\n isBuffering: boolean,\n isVideofuturAsset: boolean,\n locationId: string | null,\n programInfoLoadStatus: ProgramInfoLoadStatus,\n programMetadata: NETGEM_API_V8_METADATA_PROGRAM | null,\n realEnd: number,\n realStart: number,\n seriesEpisodeText: string | null,\n seriesMetadata: NETGEM_API_V8_METADATA_SERIES | null,\n startMargin: number,\n title: string | null,\n videoStreamData: VideoPlayerInitData | null,\n viewingHistoryId: string | null,\n vtiId: number | null,\n|};\n\nexport type PlayerStateType = {|\n ...PlayerStateInitializationType,\n audioMediaInfo: Array<VideoPlayerMediaInfo>,\n bufferedTimeRanges: TimeRanges | null,\n channel: NETGEM_API_CHANNEL | null,\n channelImageUrl: string,\n contentType: ContentType,\n controlLevel: ControlLevel,\n currentItem: NETGEM_API_V8_FEED_ITEM | null,\n // Last time playbackDuration was updated (0 when paused) (in seconds)\n dataCollectionLastPlaybackTime: number,\n // Current data collection player state\n dataCollectionMessage: DATA_COLLECTION_INTERNAL_MESSAGE | null,\n // Time of the cdata collection session start\n dataCollectionStartTime: number,\n debugInfo: VideoPlayerDebugInfo,\n // Either the Id of the download operation or null if none is in progress\n downloadOperationId: string | null,\n // Initialized first with the duration from the program's metadata, then adjusted by the player\n duration: number,\n // Used to restart session without losing playhead position (Broadpeak keep-alive workaround)\n forcedResumePosition: number | null,\n imageUrl: string | null,\n isBOStreamRequestPending: boolean,\n isControllerEnabled: boolean,\n isCurrentItemBlackedOut: boolean,\n isDebugOverlayVisible: boolean,\n isInFullscreen: boolean,\n // Following property is used to display a recording picto while playing a live stream (when contentType === ContentType.Live)\n isLiveRecording: boolean,\n isMuted: boolean,\n isOverlayVisible: boolean,\n isPlaying: boolean,\n isTimeshiftEnabled: boolean,\n isTimeshiftSwitching: boolean,\n isTrailer: boolean,\n isVideoQualityAuto: boolean,\n liveBufferLength: number,\n location: NETGEM_API_V8_METADATA_SCHEDULE_LOCATION | null,\n locationMetrics: ?Array<LOCATION_METADATA_METRICS>,\n locationStatus: WebAppHelpersLocationStatus | null,\n playheadPosition: number,\n resumePosition: number,\n resumeState: ResumeState,\n selectedAudioMediaInfo: number,\n selectedSubtitlesMediaInfo: number,\n selectedVideoQuality: number,\n skipping: SkippingKind,\n subtitlesMediaInfo: Array<VideoPlayerMediaInfo>,\n timeshift: number,\n // Duration from location metadata\n totalDuration: number,\n userViewEndOffset: number,\n userViewStartOffset: number,\n volume: number,\n|};\n","/* @flow */\n\nexport enum DataCollectionMessage {\n CurrentState = 'v1_currentState',\n Navigation = 'v1_navigation',\n PlayerState = 'v1_playerState',\n TurnOff = 'v1_turnOff',\n TurnOn = 'v1_turnOn',\n}\n\nexport enum DataCollectionStream {\n Catchup = 'catchup',\n EST = 'est',\n Live = 'live',\n Recording = 'recording',\n SVOD = 'svod',\n Timeshift = 'timeshift',\n Trailer = 'trailer',\n TVOD = 'tvod',\n}\n\nexport enum DataCollectionPlayerState {\n Error = 'error',\n Pause = 'pause',\n Play = 'play',\n Start = 'start',\n Stop = 'stop',\n}\n\nexport const DataCollectionHubCold = 'cold';\nexport const DataCollectionHubHot = 'hot';\n\nexport type DataCollectionHubKind = 'cold' | 'hot';\n\n// Position in the program without taking margins into account (in seconds, ISO 8601)\nexport type DATA_COLLECTION_INTERNAL_MESSAGE = {|\n channelId?: string,\n errorDetails?: string,\n locationId?: string,\n playbackDuration?: number,\n position?: number,\n programDuration?: number,\n programId?: string,\n sessionDuration?: number,\n sessionGuid?: string,\n state?: DataCollectionPlayerState,\n streamType?: DataCollectionStream,\n|};\n\nexport type NETGEM_API_V8_DATA_COLLECTION_OBJECT = {|\n ...DATA_COLLECTION_INTERNAL_MESSAGE,\n messageType: DataCollectionMessage,\n serialNumber: number,\n timestamp: string,\n|};\n\nexport type NETGEM_API_V8_DATA_COLLECTION_USER_PROPERTIES = {|\n appVersion?: string,\n browserVersion?: string,\n collectorId?: string,\n device?: string,\n osVersion?: string,\n realm?: string,\n|};\n\nexport type NETGEM_API_V8_DATA_COLLECTION_BATCH_PAYLOAD = Array<{|\n Body: string,\n UserProperties: NETGEM_API_V8_DATA_COLLECTION_USER_PROPERTIES,\n|}>;\n","/* @flow */\n\nimport { MILLISECONDS_PER_SECOND, getIso8601DurationInSeconds } from '../../helpers/dateTime/Format';\nimport { logError, logInfo } from '../../helpers/debug/debug';\nimport { HttpStatus } from '../../libs/netgemLibrary/v8/constants/NetworkCodesAndMessages';\n\n// Minimum heartbeat (in ms)\nconst MIN_HEARTBEAT = 1_000;\n\n// Delay between 2 start retries (in ms)\nconst START_RETRY_DELAY = 500;\n\nexport enum KeepAliveState {\n ForbiddenError = 'error (forbidden)',\n InitializationError = 'error (initialization)',\n Initializing = 'initializing',\n TemporaryError = 'error (retrying)',\n Terminated = 'terminated',\n Working = 'working',\n}\n\n/* eslint-disable no-console */\n\nclass KeepAlive {\n // In ms\n heartbeatInterval: number;\n\n intervalId: IntervalID | null;\n\n kaType: string;\n\n startRetry: TimeoutID | null;\n\n state: KeepAliveState;\n\n url: string | null;\n\n constructor(type: string, heartbeatInterval: string) {\n this.heartbeatInterval = Math.max(MIN_HEARTBEAT, getIso8601DurationInSeconds(heartbeatInterval) * MILLISECONDS_PER_SECOND);\n this.intervalId = null;\n this.kaType = type;\n this.startRetry = null;\n this.state = KeepAliveState.Initializing;\n this.url = null;\n }\n\n // $FlowFixMe: Flow does not support symbols yet\n get [Symbol.toStringTag]() {\n return 'KeepAlive';\n }\n\n // Initialize URL with redirected URL\n initialize: (originalUrl: string) => Promise<string | null> = async (originalUrl) => {\n try {\n const { redirected, url } = await fetch(originalUrl);\n\n if (!redirected) {\n // Error: no redirection\n this.state = KeepAliveState.InitializationError;\n return null;\n }\n\n // Session successfully started\n this.state = KeepAliveState.Working;\n this.url = url;\n return url;\n } catch (error) {\n this.state = KeepAliveState.InitializationError;\n logError('Error initializing keep-alive');\n logError(error);\n return null;\n }\n };\n\n sendKeepAlive: () => void = () => {\n fetch(`${this.url ?? ''}/keepalive`)\n .then(({ status }) => {\n if (status === HttpStatus.Forbidden) {\n clearInterval(this.intervalId);\n this.state = KeepAliveState.ForbiddenError;\n logInfo('Keep-alive was late -> stopping');\n } else if (status !== HttpStatus.OK && status !== HttpStatus.NoContent) {\n throw new Error(`Received HTTP status ${status}`);\n } else {\n this.state = KeepAliveState.Working;\n }\n })\n .catch((error) => {\n this.state = KeepAliveState.TemporaryError;\n logError('Error sending keep-alive');\n logError(error);\n });\n };\n\n sendTearDown: () => Promise<void> = async () => {\n try {\n await fetch(`${this.url ?? ''}/teardown`);\n } catch (error) {\n logError('Error sending teardown');\n logError(error);\n }\n };\n\n start: () => void = () => {\n if (this.state === KeepAliveState.InitializationError) {\n logError('Cannot start keep-alive because no redirect');\n return;\n }\n\n if (this.state === KeepAliveState.Terminated) {\n logError('Cannot start keep-alive because state is Terminated');\n return;\n }\n\n if (this.state === KeepAliveState.Initializing) {\n logError('Cannot start keep-alive because URL is being fetched');\n if (this.startRetry === null) {\n this.startRetry = setTimeout(this.start, START_RETRY_DELAY);\n }\n return;\n }\n\n this.intervalId = setInterval(this.sendKeepAlive, this.heartbeatInterval);\n };\n\n stop: () => Promise<void> = async () => {\n if (this.startRetry !== null) {\n clearTimeout(this.startRetry);\n this.startRetry = null;\n }\n this.state = KeepAliveState.Terminated;\n clearInterval(this.intervalId);\n await this.sendTearDown();\n };\n\n getState: () => KeepAliveState = () => this.state;\n}\n\nexport default KeepAlive;\n","/* @flow */\n\nimport type { NETGEM_API_V8_METADATA_SCHEDULE_VIDEO_STREAM_ENTITLEMENT_PARAM, StreamType } from './MetadataSchedule';\nimport { Drm } from '../../../../helpers/jsHelpers/Drm';\nimport { HttpMethod } from './HttpMethod';\nimport type { KeyValuePair } from '@ntg/utils/dist/types';\nimport type { NETGEM_API_URL_LIFECYCLE } from '../../ntgEntitlement/types';\nimport type { NETGEM_API_V8_RIGHTS } from './Rights';\n\nexport const METRICS_ESTAT = 'Estat';\nexport type METRICS_TYPE = 'Estat';\n\nexport enum MetricsStreamType {\n Catchup = 'catchup',\n Live = 'live',\n}\n\nexport enum MetricsProperties {\n Desktop = 'desktop',\n Mobile = 'mobile',\n Stb = 'stb',\n Tablet = 'tablet',\n}\n\nexport type METRICS_PARAMS = {|\n chId: string,\n cmsGR: ?string,\n cmsS1: ?string,\n cmsS2: ?string,\n cmsS3: ?string,\n cmsS4: ?string,\n cmsS5: ?string,\n cmsSN: ?string,\n dom: ?string,\n miCh: ?string,\n ml1: ?string,\n ml10: ?string,\n ml11: ?string,\n ml2: ?string,\n ml3: ?string,\n ml4: ?string,\n ml5: ?string,\n ml6: ?string,\n ml7: ?string,\n ml8: ?string,\n ml9: ?string,\n msCh: ?string,\n msCid: ?string,\n // MediametrieDiffusionMode\n msDm: ?string,\n|};\n\nexport type METRICS_PROPERTIES = {|\n type: MetricsStreamType,\n device: MetricsProperties,\n serial: string,\n params: METRICS_PARAMS,\n|};\n\ntype NETGEM_API_CHANNEL_INFO_METRICS = {|\n type: METRICS_TYPE,\n properties: Array<METRICS_PROPERTIES>,\n|};\n\ntype NETGEM_API_CHANNEL_DRM_TYPE = {|\n ntgEntitlement: NETGEM_API_V8_METADATA_SCHEDULE_VIDEO_STREAM_ENTITLEMENT_PARAM,\n type: Drm,\n|};\n\nexport type NETGEM_API_CHANNEL_PLAYBACK_PARAMS_ARG_TYPE = {|\n drms: Array<NETGEM_API_CHANNEL_DRM_TYPE>,\n path: string,\n type: StreamType,\n|};\n\ntype NETGEM_API_CHANNEL_PLAYBACK_PARAMS_TYPE = {|\n name: string,\n value: {|\n args: Array<NETGEM_API_CHANNEL_PLAYBACK_PARAMS_ARG_TYPE>,\n op: string,\n |},\n|};\n\ntype NETGEM_API_CHANNEL_PLAYBACK_TYPE = {|\n player: string,\n start: {|\n method: HttpMethod,\n params: Array<NETGEM_API_CHANNEL_PLAYBACK_PARAMS_TYPE>,\n redirect?: boolean,\n uri: string,\n |},\n|};\n\ntype NETGEM_API_CHANNEL_URL_CONTENT_TYPE = {|\n playback?: NETGEM_API_CHANNEL_PLAYBACK_TYPE,\n playbacks?: Array<NETGEM_API_CHANNEL_PLAYBACK_TYPE>,\n|};\n\nexport type NETGEM_API_CHANNEL_INFO = {|\n baseline?: string,\n channelGrId?: string,\n channelId: string,\n hasCatchup?: boolean,\n hasKeepFromReplay?: boolean,\n images?: Array<{ id: string }>,\n isRecordable?: boolean,\n languages?: Array<string>,\n metrics?: Array<NETGEM_API_CHANNEL_INFO_METRICS>,\n name?: string,\n owner?: string,\n rights?: NETGEM_API_V8_RIGHTS,\n tags?: Array<string>,\n urlContentType?: NETGEM_API_CHANNEL_URL_CONTENT_TYPE,\n|};\n\nexport type NETGEM_API_CHANNEL = {|\n altimg: string,\n amsnumber: string,\n consolidated?: {|\n hasCatchup?: boolean,\n hasKeepFromReplay?: boolean,\n hasStartover?: boolean,\n hasTimeshift?: boolean,\n imageId: ?string,\n isRecordable?: boolean,\n |},\n data: {|\n npvr: {|\n hasCatchup: string,\n hasKeepFromReplay: string,\n hasStartover: string,\n isRecordable: string,\n |},\n stream: {|\n debug: string,\n drmType?: Drm,\n isSeekable: string,\n laUrl: string,\n msdrmCustomData: string,\n notrickmode: string,\n service: string,\n type?: StreamType,\n |},\n urlLifecycle?: NETGEM_API_URL_LIFECYCLE,\n |},\n epgid: string,\n id: string,\n img: string,\n info?: NETGEM_API_CHANNEL_INFO,\n isFastChannel: boolean,\n isHidden: boolean,\n name: string,\n number: number,\n template: string,\n url: string,\n|};\n\nexport type ChannelMap = KeyValuePair<NETGEM_API_CHANNEL>;\n","/* @flow */\n\nimport type { KeyValuePair } from '@ntg/utils/dist/types';\n\nexport enum SentryLevel {\n Info = 'info',\n Warning = 'warning',\n Error = 'error',\n}\n\nexport enum SentryTagName {\n Component = 'component',\n Session = 'session',\n SubscriberId = 'subscriberId',\n}\n\nexport enum SentryTagValue {\n DataCollect = 'dataCollect',\n PaymentSystem = 'paymentSystem',\n Player = 'player',\n Recorder = 'recorder',\n VodPurchase = 'vodPurchase',\n Xhr = 'xhr',\n}\n\nexport type SentryDataType = {|\n breadcrumbs?: Array<string>,\n context?: KeyValuePair<any>,\n error?: Error,\n message?: string,\n tagName?: SentryTagName,\n tagValue?: SentryTagValue,\n|};\n","/* @flow */\n\nimport type { KeyValuePair } from '@ntg/utils/dist/types';\nimport { NO_ERROR_CODE } from '../constantsAndTypes';\n\n// Copies of Shaka types since they're not Flow-typed\n\nexport type ShakaBaseTrack = {|\n bandwidth: number,\n id: number,\n label: string | null,\n language: string,\n mimeType: string | null,\n roles: Array<string>,\n|};\n\ntype ShakaAudioTrack = {|\n audioBandwidth: number | null,\n audioCodec: string | null,\n audioId: number | null,\n audioMimeType: string | null,\n originalAudioId: string | null,\n|};\n\ntype ShakaTextTrack = {|\n forced: boolean,\n kind: string | null,\n|};\n\ntype ShakaVideoTrack = {|\n frameRate: number | null,\n height: number | null,\n originalVideoId: string | null,\n videoBandwidth: number | null,\n videoCodec: string | null,\n videoId: number | null,\n videoMimeType: string | null,\n width: number | null,\n|};\n\nexport type AudioTrack = {|\n ...ShakaBaseTrack,\n ...ShakaAudioTrack,\n|};\n\nexport type TextTrack = {|\n ...ShakaBaseTrack,\n ...ShakaTextTrack,\n|};\n\nexport type VideoTrack = {|\n ...ShakaBaseTrack,\n ...ShakaVideoTrack,\n|};\n\nexport type ShakaTrack = {|\n ...ShakaBaseTrack,\n ...AudioTrack,\n ...TextTrack,\n ...VideoTrack,\n active: boolean,\n type: 'variant' | 'text' | 'image',\n|};\n\nexport type ShakaTrackList = Array<ShakaTrack>;\n\nexport type IndexedShakaTrack = {|\n index: number,\n track: ShakaTrack,\n|};\n\nexport type ShakaLanguageRole = {|\n label: string | null,\n language: string,\n role: string,\n|};\n\ntype ShakaStateChange = {|\n duration: number,\n state: string,\n timestamp: number,\n|};\n\nexport type ShakaOfflineTrackSelection = (tracks: Array<ShakaTrack>) => Array<ShakaTrack>;\n\nexport type ShakaOfflineProgressUpdate = (content: any, progress: number, message?: string) => void;\n\nexport type ShakaOfflineExtraMetadata = {|\n assetId?: string,\n channelId?: string,\n title: string,\n|};\n\nexport type ShakaOfflineMetadata = {|\n ...ShakaOfflineExtraMetadata,\n downloadTime: number, // Timestamp in milliseconds\n id: string,\n|};\n\nexport type ShakaOfflineContent = {|\n appMetadata: ShakaOfflineMetadata,\n duration: number, // In seconds\n expiration: number, // In milliseconds\n isIncomplete: boolean,\n offlineUri: string,\n originalManifestUri: string,\n size: number, // In bytes\n tracks: ShakaTrackList,\n|};\n\ntype ShakaTrackChoice = {|\n bandwidth: number | null,\n fromAdaptation: boolean,\n id: number,\n timestamp: number,\n type: string,\n|};\n\nexport type ShakaBufferedRange = {|\n end: number,\n start: number,\n|};\n\ntype ShakaBufferedInfo = {|\n audio: Array<ShakaBufferedRange>,\n text: Array<ShakaBufferedRange>,\n total: Array<ShakaBufferedRange>,\n video: Array<ShakaBufferedRange>,\n|};\n\nexport type ShakaStats = {|\n bufferingTime: number,\n completionPercent: number,\n corruptedFrames: number,\n decodedFrames: number,\n drmTimeSeconds: number,\n droppedFrames: number,\n estimatedBandwidth: number,\n gapsJumped: number,\n height: number,\n licenseTime: number,\n liveLatency: number,\n loadLatency: number,\n manifestTimeSeconds: number,\n maxSegmentDuration: number,\n pauseTime: number,\n playTime: number,\n stallsDetected: number,\n stateHistory: Array<ShakaStateChange>,\n streamBandwidth: number,\n switchHistory: Array<ShakaTrackChoice>,\n width: number,\n|};\n\nexport type ShakaInitData = {|\n initData: Uint8Array,\n initDataType: string,\n keyId: string | null,\n|};\n\ntype ShakaDrmInfo = {|\n audioRobustness: Array<string>,\n distinctiveIdentifierRequired: boolean,\n initData: Array<ShakaInitData>,\n hasVUDrmToken: boolean,\n keyIds: Set<string>,\n keySystem: string,\n licenseServerUri: string,\n persistentStateRequired: boolean,\n serverCertificate: Uint8Array,\n serverCertificateUri: string,\n sessionType: string,\n videoRobustness: Array<string>,\n|};\n\nexport type TrackIds = {|\n audio: number | null,\n text: number | null,\n video: number | null,\n|};\n\nexport type AllTracks = {|\n audio: Array<AudioTrack>,\n text: Array<TextTrack>,\n video: Array<VideoTrack>,\n|};\n\nexport type ShakaMetrics = {|\n bufferedInfo: ShakaBufferedInfo,\n bufferFullness: number,\n drmInfo: ShakaDrmInfo,\n selectedTrackIds: TrackIds,\n stats: ShakaStats,\n tracks: AllTracks,\n|};\n\nexport type ShakaPlayerSettings = {|\n bufferBehind: number,\n bufferingGoal: number,\n rebufferingGoal: number,\n|};\n\nexport type ShakaConfiguration = {|\n drm?: {|\n advanced: KeyValuePair<any>,\n initDataTransform: (Uint8Array, string, null) => Uint8Array,\n servers: KeyValuePair<string>,\n |},\n manifest?: {|\n dash?: { ignoreMinBufferTime?: boolean },\n defaultPresentationDelay?: number,\n |},\n preferredAudioLanguage?: string,\n preferredTextLanguage?: string,\n restrictions?: {| maxBandwidth: number |},\n streaming?: {\n ...ShakaPlayerSettings,\n autoLowLatencyMode: boolean,\n ignoreTextStreamFailures: boolean,\n retryParameters?: {| maxAttempts: number |},\n },\n|};\n\nexport type ShakaError = {|\n detail: {|\n category: number,\n code: number,\n data: Array<string | number>,\n message: string,\n severity: number,\n |},\n|};\n\n/* eslint-disable no-magic-numbers */\nexport const getShakaErrorCategoryAsText = (category: number): string => {\n switch (category) {\n case 1:\n return 'Network';\n case 2:\n return 'Text';\n case 3:\n return 'Media';\n case 4:\n return 'Manifest';\n case 5:\n return 'Streaming';\n case 6:\n return 'DRM';\n case 7:\n return 'Player';\n case 8:\n return 'Cast';\n case 9:\n return 'Storage';\n case 10:\n return 'Ads';\n default:\n return `Unknown category (${category})`;\n }\n};\n/* eslint-enable no-magic-numbers */\n\n/* eslint-disable no-magic-numbers, max-lines-per-function, complexity */\nexport const getShakaErrorCodeAsText = (code: number): string => {\n switch (code) {\n case 8002:\n return 'ALREADY_CASTING';\n case 1010:\n return 'ATTEMPTS_EXHAUSTED';\n case 2004:\n return 'BAD_ENCODING';\n case 1001:\n return 'BAD_HTTP_STATUS';\n case 3000:\n return 'BUFFER_READ_OUT_OF_BOUNDS';\n case 4033:\n return 'CANNOT_ADD_EXTERNAL_TEXT_TO_LIVE_STREAM';\n case 2012:\n return 'CANNOT_ADD_EXTERNAL_TEXT_TO_SRC_EQUALS';\n case 9005:\n return 'CANNOT_STORE_LIVE_OFFLINE';\n case 8000:\n return 'CAST_API_UNAVAILABLE';\n case 8004:\n return 'CAST_CANCELED_BY_USER';\n case 8005:\n return 'CAST_CONNECTION_TIMED_OUT';\n case 8006:\n return 'CAST_RECEIVER_APP_UNAVAILABLE';\n case 2015:\n return 'CHAPTERS_TRACK_FAILED';\n case 7004:\n return 'CONTENT_NOT_LOADED';\n case 3019:\n return 'CONTENT_TRANSFORMATION_FAILED';\n case 4032:\n return 'CONTENT_UNSUPPORTED_BY_BROWSER';\n case 10001:\n return 'CS_AD_MANAGER_NOT_INITIALIZED';\n case 10000:\n return 'CS_IMA_SDK_MISSING';\n case 10004:\n return 'CURRENT_DAI_REQUEST_NOT_FINISHED';\n case 4010:\n return 'DASH_CONFLICTING_KEY_IDS';\n case 4018:\n return 'DASH_DUPLICATE_REPRESENTATION_ID';\n case 4003:\n return 'DASH_EMPTY_ADAPTATION_SET';\n case 4004:\n return 'DASH_EMPTY_PERIOD';\n case 4001:\n return 'DASH_INVALID_XML';\n case 4009:\n return 'DASH_MULTIPLE_KEY_IDS_NOT_SUPPORTED';\n case 4008:\n return 'DASH_NO_COMMON_KEY_SYSTEM';\n case 4002:\n return 'DASH_NO_SEGMENT_INFO';\n case 4007:\n return 'DASH_PSSH_BAD_ENCODING';\n case 4006:\n return 'DASH_UNSUPPORTED_CONTAINER';\n case 4027:\n return 'DASH_UNSUPPORTED_XLINK_ACTUATE';\n case 4005:\n return 'DASH_WEBM_MISSING_INIT';\n case 4028:\n return 'DASH_XLINK_DEPTH_LIMIT';\n case 9002:\n return 'DEPRECATED_OPERATION_ABORTED';\n case 9015:\n return 'DOWNLOAD_SIZE_CALLBACK_ERROR';\n case 3003:\n return 'EBML_BAD_FLOATING_POINT_SIZE';\n case 3002:\n return 'EBML_OVERFLOW';\n case 6010:\n return 'ENCRYPTED_CONTENT_WITHOUT_DRM_INFO';\n case 6014:\n return 'EXPIRED';\n case 6003:\n return 'FAILED_TO_ATTACH_TO_VIDEO';\n case 6002:\n return 'FAILED_TO_CREATE_CDM';\n case 6005:\n return 'FAILED_TO_CREATE_SESSION';\n case 6006:\n return 'FAILED_TO_GENERATE_LICENSE_REQUEST';\n case 4043:\n return 'HLS_AES_128_INVALID_IV_LENGTH';\n case 4044:\n return 'HLS_AES_128_INVALID_KEY_LENGTH';\n case 4025:\n return 'HLS_COULD_NOT_GUESS_CODECS';\n case 4017:\n return 'HLS_INVALID_PLAYLIST_HIERARCHY';\n case 4026:\n return 'HLS_KEYFORMATS_NOT_SUPPORTED';\n case 4041:\n return 'HLS_MSE_ENCRYPTED_LEGACY_APPLE_MEDIA_KEYS_NOT_SUPPORTED';\n case 4040:\n return 'HLS_MSE_ENCRYPTED_MP2T_NOT_SUPPORTED';\n case 4020:\n return 'HLS_MULTIPLE_MEDIA_INIT_SECTIONS_FOUND';\n case 4015:\n return 'HLS_PLAYLIST_HEADER_MISSING';\n case 4023:\n return 'HLS_REQUIRED_ATTRIBUTE_MISSING';\n case 4024:\n return 'HLS_REQUIRED_TAG_MISSING';\n case 4039:\n return 'HLS_VARIABLE_NOT_FOUND';\n case 1002:\n return 'HTTP_ERROR';\n case 4038:\n return 'INCONSISTENT_DRM_ACROSS_PERIODS';\n case 9001:\n return 'INDEXED_DB_ERROR';\n case 6016:\n return 'INIT_DATA_TRANSFORM_ERROR';\n case 4016:\n return 'INVALID_HLS_TAG';\n case 2010:\n return 'INVALID_MP4_CEA';\n case 2007:\n return 'INVALID_MP4_TTML';\n case 2008:\n return 'INVALID_MP4_VTT';\n case 6004:\n return 'INVALID_SERVER_CERTIFICATE';\n case 2001:\n return 'INVALID_TEXT_CUE';\n case 2000:\n return 'INVALID_TEXT_HEADER';\n case 2005:\n return 'INVALID_XML';\n case 3001:\n return 'JS_INTEGER_OVERFLOW';\n case 9012:\n return 'KEY_NOT_FOUND';\n case 6007:\n return 'LICENSE_REQUEST_FAILED';\n case 6008:\n return 'LICENSE_RESPONSE_REJECTED';\n case 7000:\n return 'LOAD_INTERRUPTED';\n case 9008:\n return 'LOCAL_PLAYER_INSTANCE_REQUIRED';\n case 1004:\n return 'MALFORMED_DATA_URI';\n case 9004:\n return 'MALFORMED_OFFLINE_URI';\n case 1008:\n return 'MALFORMED_TEST_URI';\n case 3014:\n return 'MEDIA_SOURCE_OPERATION_FAILED';\n case 3015:\n return 'MEDIA_SOURCE_OPERATION_THREW';\n case 9013:\n return 'MISSING_STORAGE_CELL';\n case 2014:\n return 'MISSING_TEXT_PLUGIN';\n case 9016:\n return 'MODIFY_OPERATION_NOT_SUPPORTED';\n case 3005:\n return 'MP4_SIDX_INVALID_TIMESCALE';\n case 3006:\n return 'MP4_SIDX_TYPE_NOT_SUPPORTED';\n case 3004:\n return 'MP4_SIDX_WRONG_BOX_TYPE';\n case 9011:\n return 'NEW_KEY_OPERATION_NOT_SUPPORTED';\n case 8001:\n return 'NO_CAST_RECEIVERS';\n case 9007:\n return 'NO_INIT_DATA_FOR_OFFLINE';\n case 6012:\n return 'NO_LICENSE_SERVER_GIVEN';\n case 6000:\n return 'NO_RECOGNIZED_KEY_SYSTEMS';\n case 4036:\n return 'NO_VARIANTS';\n case 7002:\n return 'NO_VIDEO_ELEMENT';\n case 4042:\n return 'NO_WEB_CRYPTO_API';\n case 7003:\n return 'OBJECT_DESTROYED';\n case 6013:\n return 'OFFLINE_SESSION_REMOVED';\n case 7001:\n return 'OPERATION_ABORTED';\n case 4037:\n return 'PERIOD_FLATTENING_FAILED';\n case 3017:\n return 'QUOTA_EXCEEDED_ERROR';\n case 9003:\n return 'REQUESTED_ITEM_NOT_FOUND';\n case 6001:\n return 'REQUESTED_KEY_SYSTEM_CONFIG_UNAVAILABLE';\n case 1006:\n return 'REQUEST_FILTER_ERROR';\n case 1007:\n return 'RESPONSE_FILTER_ERROR';\n case 4012:\n return 'RESTRICTIONS_CANNOT_BE_MET';\n case 1011:\n return 'SEGMENT_MISSING';\n case 6017:\n return 'SERVER_CERTIFICATE_REQUEST_FAILED';\n case 6015:\n return 'SERVER_CERTIFICATE_REQUIRED';\n case 10003:\n return 'SS_AD_MANAGER_NOT_INITIALIZED';\n case 10002:\n return 'SS_IMA_SDK_MISSING';\n case 9014:\n return 'STORAGE_LIMIT_REACHED';\n case 9000:\n return 'STORAGE_NOT_SUPPORTED';\n case 5006:\n return 'STREAMING_ENGINE_STARTUP_INVALID_STATE';\n case 2011:\n return 'TEXT_COULD_NOT_GUESS_MIME_TYPE';\n case 2013:\n return 'TEXT_ONLY_WEBVTT_SRC_EQUALS';\n case 1003:\n return 'TIMEOUT';\n case 3018:\n return 'TRANSMUXING_FAILED';\n case 2003:\n return 'UNABLE_TO_DETECT_ENCODING';\n case 2009:\n return 'UNABLE_TO_EXTRACT_CUE_START_TIME';\n case 4000:\n return 'UNABLE_TO_GUESS_MANIFEST_TYPE';\n case 8003:\n return 'UNEXPECTED_CAST_ERROR';\n case 1009:\n return 'UNEXPECTED_TEST_REQUEST';\n case 1000:\n return 'UNSUPPORTED_SCHEME';\n case 3016:\n return 'VIDEO_ERROR';\n case 3007:\n return 'WEBM_CUES_ELEMENT_MISSING';\n case 3013:\n return 'WEBM_CUE_TIME_ELEMENT_MISSING';\n case 3012:\n return 'WEBM_CUE_TRACK_POSITIONS_ELEMENT_MISSING';\n case 3011:\n return 'WEBM_DURATION_ELEMENT_MISSING';\n case 3008:\n return 'WEBM_EBML_HEADER_ELEMENT_MISSING';\n case 3010:\n return 'WEBM_INFO_ELEMENT_MISSING';\n case 3009:\n return 'WEBM_SEGMENT_ELEMENT_MISSING';\n\n default:\n return `Unknown code (${code})`;\n }\n};\n/* eslint-enable no-magic-numbers, max-lines-per-function, complexity */\n\nexport const ShakaErrors = Object.freeze({\n OperationAborted: 7001,\n RequestedKeySystemConfigUnavailable: 6001,\n});\n\n/*\n * Following errors could be safely ignored because it reflects an early player exit (while it's still loading)\n * - 7000: LOAD_INTERRUPTED\n * - 7001: OPERATION_ABORTED\n * - 7002: NO_VIDEO_ELEMENT\n */\nconst shouldErrorBeIgnored = (code: string | number): boolean => [NO_ERROR_CODE, '7000', '7001', '7002'].includes(code.toString());\n\nexport { shouldErrorBeIgnored };\n","/* @flow */\n\nimport { HeaderName, HeaderValue } from '../../../../libs/netgemLibrary/v8/constants/Headers';\nimport type { NetgemApiEmitterType, RequestResponseMethodDefinitionType } from '../emitter';\nimport type { CombinedReducers } from '../../../reducers';\nimport type { Dispatch } from '../../../types/types';\nimport type { NETGEM_API_V8_DATA_COLLECTION_BATCH_PAYLOAD } from '../../../../libs/netgemLibrary/v8/types/DataCollection';\nimport type { NETGEM_API_V8_URL_DEFINITION } from '../../../../libs/netgemLibrary/v8/types/NtgVideoFeed';\nimport { REDUX_MSG_REQUEST_DATA_COLLECTION } from '../../constants';\nimport { buildHeaderList } from '../../../../libs/netgemLibrary/v8/helpers/RequestHeaders';\nimport { computeSas } from '../helpers/api';\nimport { createCustomNetworkErrorFromKey } from '../../../../libs/netgemLibrary/helpers/CreateCustomNetworkError';\nimport { getSettingValueByName } from '../helpers/settings';\n\nexport const sendColdDataRequest: (content: NETGEM_API_V8_DATA_COLLECTION_BATCH_PAYLOAD, sasDelay: number, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (content, sasDelay, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers): Promise<any> => {\n const state = getState();\n const {\n netgemApi: { dataCollectionColdUrl },\n } = state;\n\n return dispatch(sendDataRequest(dataCollectionColdUrl, content, sasDelay, signal));\n };\n\nexport const sendHotDataRequest: (content: NETGEM_API_V8_DATA_COLLECTION_BATCH_PAYLOAD, sasDelay: number, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (content, sasDelay, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers): Promise<any> => {\n const state = getState();\n const {\n netgemApi: { dataCollectionHotUrl },\n } = state;\n\n return dispatch(sendDataRequest(dataCollectionHotUrl, content, sasDelay, signal));\n };\n\nconst sendDataRequest: (\n urlDefinition: ?NETGEM_API_V8_URL_DEFINITION,\n content: NETGEM_API_V8_DATA_COLLECTION_BATCH_PAYLOAD,\n sasDelay: number,\n signal?: AbortSignal,\n) => RequestResponseMethodDefinitionType =\n (urlDefinition, content, sasDelay, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const { appConfiguration } = getState();\n\n if (!urlDefinition) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definition', { urlDef: 'data collection URL' }));\n }\n\n const { method, sakName, uri } = urlDefinition;\n\n if (!sakName) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_data_collection_sak_name'));\n }\n\n const apiKeyValue = getSettingValueByName('platform.sas', sakName, appConfiguration);\n\n if (!apiKeyValue) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_data_collection_sak_value', { sakName }));\n }\n\n const sas = computeSas(uri, sakName, apiKeyValue, sasDelay);\n const headers = buildHeaderList(HeaderName.Authorization, sas, HeaderName.ContentType, HeaderValue.ApplicationMicrosoftServiceBus);\n\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_DATA_COLLECTION, {\n content,\n headers,\n method,\n signal,\n uri,\n });\n };\n","var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n};\nvar BrowserInfo = /** @class */ (function () {\n function BrowserInfo(name, version, os) {\n this.name = name;\n this.version = version;\n this.os = os;\n this.type = 'browser';\n }\n return BrowserInfo;\n}());\nexport { BrowserInfo };\nvar NodeInfo = /** @class */ (function () {\n function NodeInfo(version) {\n this.version = version;\n this.type = 'node';\n this.name = 'node';\n this.os = process.platform;\n }\n return NodeInfo;\n}());\nexport { NodeInfo };\nvar SearchBotDeviceInfo = /** @class */ (function () {\n function SearchBotDeviceInfo(name, version, os, bot) {\n this.name = name;\n this.version = version;\n this.os = os;\n this.bot = bot;\n this.type = 'bot-device';\n }\n return SearchBotDeviceInfo;\n}());\nexport { SearchBotDeviceInfo };\nvar BotInfo = /** @class */ (function () {\n function BotInfo() {\n this.type = 'bot';\n this.bot = true; // NOTE: deprecated test name instead\n this.name = 'bot';\n this.version = null;\n this.os = null;\n }\n return BotInfo;\n}());\nexport { BotInfo };\nvar ReactNativeInfo = /** @class */ (function () {\n function ReactNativeInfo() {\n this.type = 'react-native';\n this.name = 'react-native';\n this.version = null;\n this.os = null;\n }\n return ReactNativeInfo;\n}());\nexport { ReactNativeInfo };\n// tslint:disable-next-line:max-line-length\nvar SEARCHBOX_UA_REGEX = /alexa|bot|crawl(er|ing)|facebookexternalhit|feedburner|google web preview|nagios|postrank|pingdom|slurp|spider|yahoo!|yandex/;\nvar SEARCHBOT_OS_REGEX = /(nuhk|curl|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask\\ Jeeves\\/Teoma|ia_archiver)/;\nvar REQUIRED_VERSION_PARTS = 3;\nvar userAgentRules = [\n ['aol', /AOLShield\\/([0-9\\._]+)/],\n ['edge', /Edge\\/([0-9\\._]+)/],\n ['edge-ios', /EdgiOS\\/([0-9\\._]+)/],\n ['yandexbrowser', /YaBrowser\\/([0-9\\._]+)/],\n ['kakaotalk', /KAKAOTALK\\s([0-9\\.]+)/],\n ['samsung', /SamsungBrowser\\/([0-9\\.]+)/],\n ['silk', /\\bSilk\\/([0-9._-]+)\\b/],\n ['miui', /MiuiBrowser\\/([0-9\\.]+)$/],\n ['beaker', /BeakerBrowser\\/([0-9\\.]+)/],\n ['edge-chromium', /EdgA?\\/([0-9\\.]+)/],\n [\n 'chromium-webview',\n /(?!Chrom.*OPR)wv\\).*Chrom(?:e|ium)\\/([0-9\\.]+)(:?\\s|$)/,\n ],\n ['chrome', /(?!Chrom.*OPR)Chrom(?:e|ium)\\/([0-9\\.]+)(:?\\s|$)/],\n ['phantomjs', /PhantomJS\\/([0-9\\.]+)(:?\\s|$)/],\n ['crios', /CriOS\\/([0-9\\.]+)(:?\\s|$)/],\n ['firefox', /Firefox\\/([0-9\\.]+)(?:\\s|$)/],\n ['fxios', /FxiOS\\/([0-9\\.]+)/],\n ['opera-mini', /Opera Mini.*Version\\/([0-9\\.]+)/],\n ['opera', /Opera\\/([0-9\\.]+)(?:\\s|$)/],\n ['opera', /OPR\\/([0-9\\.]+)(:?\\s|$)/],\n ['pie', /^Microsoft Pocket Internet Explorer\\/(\\d+\\.\\d+)$/],\n ['pie', /^Mozilla\\/\\d\\.\\d+\\s\\(compatible;\\s(?:MSP?IE|MSInternet Explorer) (\\d+\\.\\d+);.*Windows CE.*\\)$/],\n ['netfront', /^Mozilla\\/\\d\\.\\d+.*NetFront\\/(\\d.\\d)/],\n ['ie', /Trident\\/7\\.0.*rv\\:([0-9\\.]+).*\\).*Gecko$/],\n ['ie', /MSIE\\s([0-9\\.]+);.*Trident\\/[4-7].0/],\n ['ie', /MSIE\\s(7\\.0)/],\n ['bb10', /BB10;\\sTouch.*Version\\/([0-9\\.]+)/],\n ['android', /Android\\s([0-9\\.]+)/],\n ['ios', /Version\\/([0-9\\._]+).*Mobile.*Safari.*/],\n ['safari', /Version\\/([0-9\\._]+).*Safari/],\n ['facebook', /FB[AS]V\\/([0-9\\.]+)/],\n ['instagram', /Instagram\\s([0-9\\.]+)/],\n ['ios-webview', /AppleWebKit\\/([0-9\\.]+).*Mobile/],\n ['ios-webview', /AppleWebKit\\/([0-9\\.]+).*Gecko\\)$/],\n ['curl', /^curl\\/([0-9\\.]+)$/],\n ['searchbot', SEARCHBOX_UA_REGEX],\n];\nvar operatingSystemRules = [\n ['iOS', /iP(hone|od|ad)/],\n ['Android OS', /Android/],\n ['BlackBerry OS', /BlackBerry|BB10/],\n ['Windows Mobile', /IEMobile/],\n ['Amazon OS', /Kindle/],\n ['Windows 3.11', /Win16/],\n ['Windows 95', /(Windows 95)|(Win95)|(Windows_95)/],\n ['Windows 98', /(Windows 98)|(Win98)/],\n ['Windows 2000', /(Windows NT 5.0)|(Windows 2000)/],\n ['Windows XP', /(Windows NT 5.1)|(Windows XP)/],\n ['Windows Server 2003', /(Windows NT 5.2)/],\n ['Windows Vista', /(Windows NT 6.0)/],\n ['Windows 7', /(Windows NT 6.1)/],\n ['Windows 8', /(Windows NT 6.2)/],\n ['Windows 8.1', /(Windows NT 6.3)/],\n ['Windows 10', /(Windows NT 10.0)/],\n ['Windows ME', /Windows ME/],\n ['Windows CE', /Windows CE|WinCE|Microsoft Pocket Internet Explorer/],\n ['Open BSD', /OpenBSD/],\n ['Sun OS', /SunOS/],\n ['Chrome OS', /CrOS/],\n ['Linux', /(Linux)|(X11)/],\n ['Mac OS', /(Mac_PowerPC)|(Macintosh)/],\n ['QNX', /QNX/],\n ['BeOS', /BeOS/],\n ['OS/2', /OS\\/2/],\n];\nexport function detect(userAgent) {\n if (!!userAgent) {\n return parseUserAgent(userAgent);\n }\n if (typeof document === 'undefined' &&\n typeof navigator !== 'undefined' &&\n navigator.product === 'ReactNative') {\n return new ReactNativeInfo();\n }\n if (typeof navigator !== 'undefined') {\n return parseUserAgent(navigator.userAgent);\n }\n return getNodeVersion();\n}\nfunction matchUserAgent(ua) {\n // opted for using reduce here rather than Array#first with a regex.test call\n // this is primarily because using the reduce we only perform the regex\n // execution once rather than once for the test and for the exec again below\n // probably something that needs to be benchmarked though\n return (ua !== '' &&\n userAgentRules.reduce(function (matched, _a) {\n var browser = _a[0], regex = _a[1];\n if (matched) {\n return matched;\n }\n var uaMatch = regex.exec(ua);\n return !!uaMatch && [browser, uaMatch];\n }, false));\n}\nexport function browserName(ua) {\n var data = matchUserAgent(ua);\n return data ? data[0] : null;\n}\nexport function parseUserAgent(ua) {\n var matchedRule = matchUserAgent(ua);\n if (!matchedRule) {\n return null;\n }\n var name = matchedRule[0], match = matchedRule[1];\n if (name === 'searchbot') {\n return new BotInfo();\n }\n // Do not use RegExp for split operation as some browser do not support it (See: http://blog.stevenlevithan.com/archives/cross-browser-split)\n var versionParts = match[1] && match[1].split('.').join('_').split('_').slice(0, 3);\n if (versionParts) {\n if (versionParts.length < REQUIRED_VERSION_PARTS) {\n versionParts = __spreadArray(__spreadArray([], versionParts, true), createVersionParts(REQUIRED_VERSION_PARTS - versionParts.length), true);\n }\n }\n else {\n versionParts = [];\n }\n var version = versionParts.join('.');\n var os = detectOS(ua);\n var searchBotMatch = SEARCHBOT_OS_REGEX.exec(ua);\n if (searchBotMatch && searchBotMatch[1]) {\n return new SearchBotDeviceInfo(name, version, os, searchBotMatch[1]);\n }\n return new BrowserInfo(name, version, os);\n}\nexport function detectOS(ua) {\n for (var ii = 0, count = operatingSystemRules.length; ii < count; ii++) {\n var _a = operatingSystemRules[ii], os = _a[0], regex = _a[1];\n var match = regex.exec(ua);\n if (match) {\n return os;\n }\n }\n return null;\n}\nexport function getNodeVersion() {\n var isNode = typeof process !== 'undefined' && process.version;\n return isNode ? new NodeInfo(process.version.slice(1)) : null;\n}\nfunction createVersionParts(count) {\n var output = [];\n for (var ii = 0; ii < count; ii++) {\n output.push('0');\n }\n return output;\n}\n","/* @flow */\n\nimport { capitalizeFirstLetter } from '@ntg/utils/dist/string';\nimport { detect as detectBrowser } from 'detect-browser';\nimport { logInfo } from '../debug/debug';\n\nconst getBrowserAndOS: () => {|\n browserName: string | null,\n browserVersion: string | null,\n osVersion: string | null,\n osName: string | null,\n|} = () => {\n const browser = detectBrowser();\n\n let browserName: string | null = null;\n let browserVersion: string | null = null;\n let osName: string | null = null;\n let osVersion: string | null = null;\n\n if (browser) {\n ({ name: browserName, version: browserVersion } = browser);\n const { os } = browser;\n\n if (os) {\n [osName, osVersion] = os.split(' ');\n }\n }\n return {\n browserName: capitalizeFirstLetter(browserName),\n browserVersion,\n osName: capitalizeFirstLetter(osName),\n osVersion,\n };\n};\n\nconst isRunningOnLocalhost: () => boolean = () => ['localhost', '127.0.0.1', '', '::1'].includes(location.hostname);\n\nconst isRunningOnMobileBrowser: () => boolean = () => {\n // Using native browser property\n const uaDataIsMobile = window.navigator.userAgentData?.mobile;\n if (typeof uaDataIsMobile === 'boolean' && uaDataIsMobile) {\n logInfo('Mobile detected through \"window.navigator.userAgentData.mobile\"');\n return true;\n }\n\n // Running locally\n if (isRunningOnLocalhost()) {\n return false;\n }\n\n // Using legacy method\n const USER_AGENT_SIGNIFICANT_LENGTH = 4;\n const userAgent = window.navigator.userAgent || window.navigator.vendor;\n /* eslint-disable max-len */\n const isMobile =\n /(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series[46]0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/iu.test(\n userAgent,\n ) ||\n /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br[ev]w|bumb|bw-[nu]|c55\\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do[cp]o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly[_-]|g1 u|g560|gene|gf-5|g-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd-[mpt]|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c[agpst _-]|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac[/ -]|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja[tv]a|jbro|jemu|jigs|kddi|keji|kgt[/ ]|klon|kpt |kwc-|kyo[ck]|le(no|xi)|lg( g|\\/[klu]|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t[ov -]|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30[02]|n50[025]|n7(0[01]|10)|ne([cm]-|on|tf|wf|wg|wt)|nok[6i]|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan[adt]|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\\/|se(c[01-]|47|mc|nd|ri)|sgh-|shar|sie[m-]|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel[im]|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c[ -]|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/iu.test(\n userAgent.substring(0, USER_AGENT_SIGNIFICANT_LENGTH),\n );\n /* eslint-enable max-len */\n\n if (isMobile) {\n logInfo(`Mobile detected through \"window.navigator.userAgent\": ${userAgent}`);\n }\n\n return isMobile;\n};\n\nexport { getBrowserAndOS, isRunningOnLocalhost, isRunningOnMobileBrowser };\n","/* @flow */\n\nimport type { NetgemApiEmitterType, RequestResponseMethodDefinitionType } from '../emitter';\nimport type { CombinedReducers } from '../../../reducers';\nimport type { Dispatch } from '../../../types/types';\nimport type { NETGEM_API_V8_REQUEST_RESPONSE } from '../../../../libs/netgemLibrary/v8/types/RequestResponse';\nimport { REDUX_MSG_REQUEST_DATA_COLLECTION_COLLECTOR_ID } from '../../constants';\n\nconst sendGetCollectorIdRequest: (signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const {\n appRegistration: { upgradeDeviceUrl },\n } = getState();\n\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_DATA_COLLECTION_COLLECTOR_ID, {\n signal,\n uri: `${upgradeDeviceUrl}getCollectorID`,\n }).then((response: NETGEM_API_V8_REQUEST_RESPONSE) => {\n const { result } = response;\n const { collectorId } = JSON.parse(result);\n return Promise.resolve(collectorId);\n });\n };\n\nexport default sendGetCollectorIdRequest;\n","/* @flow */\n\nimport {\n type DATA_COLLECTION_INTERNAL_MESSAGE,\n DataCollectionHubCold,\n DataCollectionHubHot,\n type DataCollectionHubKind,\n DataCollectionMessage,\n type NETGEM_API_V8_DATA_COLLECTION_BATCH_PAYLOAD,\n type NETGEM_API_V8_DATA_COLLECTION_OBJECT,\n type NETGEM_API_V8_DATA_COLLECTION_USER_PROPERTIES,\n} from '../../libs/netgemLibrary/v8/types/DataCollection';\nimport type { DATA_COLLECTION_MESSAGE_SETTINGS, DATA_COLLECTION_SETTINGS } from './types';\nimport { Messenger, MessengerEvents } from '@ntg/utils/dist/messenger';\nimport { sendColdDataRequest, sendHotDataRequest } from '../../redux/netgemApi/actions/dataCollection/post';\nimport AccurateTimestamp from '../dateTime/AccurateTimestamp';\nimport type { Dispatch } from '../../redux/types/types';\nimport LocalStorageManager from '../localStorage/localStorageManager';\nimport { StorageKeys } from '../localStorage/keys';\nimport { fireAndForget } from '../jsHelpers/promise';\nimport { getBrowserAndOS } from '../jsHelpers/environment';\nimport { getRandomInteger } from '../maths/maths';\nimport { logWarning } from '../debug/debug';\nimport sendGetCollectorIdRequest from '../../redux/netgemApi/actions/dataCollection/getCollectorId';\n\nconst MAX_PERCENT = 100;\n\ntype QueueType = {| [DataCollectionHubKind]: NETGEM_API_V8_DATA_COLLECTION_BATCH_PAYLOAD |};\n\nexport default class Collector {\n batchTimers: {| [DataCollectionHubKind]: TimeoutID | null |};\n\n dispatch: Dispatch;\n\n isEnabled: boolean;\n\n // In milliseconds\n maxFlushDelay: {| [DataCollectionHubKind]: number |};\n\n maxFlushSize: {| [DataCollectionHubKind]: number |};\n\n msgCurrentState: DATA_COLLECTION_MESSAGE_SETTINGS;\n\n msgNavigation: DATA_COLLECTION_MESSAGE_SETTINGS;\n\n msgPlayerState: DATA_COLLECTION_MESSAGE_SETTINGS;\n\n msgTurnOff: DATA_COLLECTION_MESSAGE_SETTINGS;\n\n msgTurnOn: DATA_COLLECTION_MESSAGE_SETTINGS;\n\n // Queued data is sent when first thing occurs: last piece of data received was maxFlushDelay (in milliseconds) ago or queue size is maxFlushSize\n queue: QueueType;\n\n // In milliseconds\n samplingDelay: number;\n\n sasDelay: {| [DataCollectionHubKind]: number |};\n\n serialNumber: number;\n\n // In milliseconds\n startDelay: number;\n\n userProperties: NETGEM_API_V8_DATA_COLLECTION_USER_PROPERTIES;\n\n // eslint-disable-next-line no-use-before-define\n static instance: Collector;\n\n constructor(dispatch: Dispatch, appVersion: string, realm: string, settings: DATA_COLLECTION_SETTINGS) {\n if (!dispatch) {\n throw new Error('\"dispatch\" cannot be null');\n }\n\n const {\n coldHub: { maxFlushDelay: coldMaxFlushDelay, maxFlushSize: coldMaxFlushSize, sasDelay: coldSasDelay },\n hotHub: { maxFlushDelay: hotMaxFlushDelay, maxFlushSize: hotMaxFlushSize, sasDelay: hotSasDelay },\n isEnabled,\n msgCurrentState,\n msgNavigation,\n msgPlayerState,\n msgTurnOff,\n msgTurnOn,\n sampling,\n samplingDelay,\n startDelay,\n } = settings;\n\n this.isEnabled = isEnabled && (sampling === -1 || getRandomInteger(0, MAX_PERCENT) <= sampling);\n\n if (!isEnabled) {\n return;\n }\n\n this.userProperties = {\n appVersion,\n realm,\n };\n\n this.serialNumber = 1;\n this.dispatch = dispatch;\n this.samplingDelay = samplingDelay;\n this.startDelay = startDelay;\n\n this.batchTimers = {\n [DataCollectionHubCold]: null,\n [DataCollectionHubHot]: null,\n };\n this.maxFlushDelay = {\n [DataCollectionHubCold]: coldMaxFlushDelay,\n [DataCollectionHubHot]: hotMaxFlushDelay,\n };\n this.maxFlushSize = {\n [DataCollectionHubCold]: coldMaxFlushSize,\n [DataCollectionHubHot]: hotMaxFlushSize,\n };\n this.queue = {\n [DataCollectionHubCold]: [],\n [DataCollectionHubHot]: [],\n };\n this.sasDelay = {\n [DataCollectionHubCold]: coldSasDelay,\n [DataCollectionHubHot]: hotSasDelay,\n };\n\n this.msgCurrentState = msgCurrentState;\n this.msgNavigation = msgNavigation;\n this.msgPlayerState = msgPlayerState;\n this.msgTurnOff = msgTurnOff;\n this.msgTurnOn = msgTurnOn;\n\n fireAndForget(this.setCollectorId(true));\n this.initializeBrowserAndOs();\n }\n\n // $FlowFixMe: Flow does not support symbols yet\n get [Symbol.toStringTag]() {\n return 'Collector';\n }\n\n static initialize: (dispatch: Dispatch, appVersion: string, realm: string, settings: DATA_COLLECTION_SETTINGS) => void = (dispatch, appVersion, realm, settings) => {\n if (Collector.instance) {\n // Update collector Id since user signed in or out\n fireAndForget(Collector.instance.setCollectorId(false));\n return;\n }\n\n Collector.instance = new Collector(dispatch, appVersion, realm, settings);\n };\n\n static getPlayerStateSettings: () => DATA_COLLECTION_MESSAGE_SETTINGS | null = () => {\n const { isEnabled, msgPlayerState } = Collector.instance;\n\n return isEnabled ? msgPlayerState : null;\n };\n\n setCollectorId: (subscribe: boolean) => Promise<void> = async (subscribe) => {\n const { dispatch, userProperties } = this;\n\n try {\n userProperties.collectorId = await dispatch(sendGetCollectorIdRequest());\n\n if (subscribe) {\n this.subscribeToEvents();\n }\n } catch {\n // Error while retrieving collector Id: no data collection\n logWarning('An error occurred while retrieving the collector Id. No data collection will be performed.');\n }\n };\n\n initializeBrowserAndOs: () => void = () => {\n const { userProperties } = this;\n const { browserName, browserVersion, osName, osVersion } = getBrowserAndOS();\n\n userProperties.browserVersion = browserVersion || 'unknown browser version';\n userProperties.device = `${osName || 'unknown OS name'}.${browserName || 'unknown browser name'}`;\n userProperties.osVersion = osVersion || 'unknown OS version';\n };\n\n subscribeToEvents: () => void = () => {\n const { msgCurrentState, msgNavigation, msgPlayerState, msgTurnOff, msgTurnOn } = this;\n\n if (msgCurrentState) {\n Messenger.on(DataCollectionMessage.CurrentState, this.onCurrentStateEvent);\n }\n\n if (msgNavigation) {\n Messenger.on(DataCollectionMessage.Navigation, this.onNavigationEvent);\n }\n\n if (msgPlayerState) {\n Messenger.on(DataCollectionMessage.PlayerState, this.onPlayerStateEvent);\n }\n\n if (msgTurnOff) {\n Messenger.on(DataCollectionMessage.TurnOff, this.onTurnOffEvent);\n }\n\n if (msgTurnOn) {\n Messenger.on(DataCollectionMessage.TurnOn, this.onTurnOnEvent);\n }\n\n Messenger.on(MessengerEvents.FLUSH_COLLECTOR, this.flushAll);\n Messenger.on(MessengerEvents.STASH_COLLECTOR, this.stash);\n Messenger.on(MessengerEvents.UNSTASH_COLLECTOR, this.unstash);\n };\n\n onCurrentStateEvent: (msg: DATA_COLLECTION_INTERNAL_MESSAGE) => void = (msg) => {\n this.onEvent(DataCollectionHubHot, DataCollectionMessage.CurrentState, msg);\n };\n\n onNavigationEvent: (msg: DATA_COLLECTION_INTERNAL_MESSAGE) => void = (msg) => {\n this.onEvent(DataCollectionHubCold, DataCollectionMessage.Navigation, msg);\n };\n\n onPlayerStateEvent: (msg: DATA_COLLECTION_INTERNAL_MESSAGE) => void = (msg) => {\n this.onEvent(DataCollectionHubHot, DataCollectionMessage.PlayerState, msg);\n };\n\n onTurnOffEvent: () => void = () => {\n this.onEvent(DataCollectionHubCold, DataCollectionMessage.TurnOff);\n };\n\n onTurnOnEvent: () => void = () => {\n this.onEvent(DataCollectionHubCold, DataCollectionMessage.TurnOn);\n };\n\n onEvent: (hubType: DataCollectionHubKind, messageType: DataCollectionMessage, msg?: DATA_COLLECTION_INTERNAL_MESSAGE) => void = (hubType, messageType, msg) => {\n const { serialNumber } = this;\n const timestamp = AccurateTimestamp.nowAsIsoString();\n\n this.enqueue(hubType, {\n ...msg,\n messageType,\n serialNumber,\n timestamp,\n });\n\n this.serialNumber += 1;\n };\n\n enqueue: (hubType: DataCollectionHubKind, msg: NETGEM_API_V8_DATA_COLLECTION_OBJECT) => void = (hubType, msg) => {\n const {\n batchTimers,\n maxFlushDelay: { [hubType]: flushDelay },\n maxFlushSize: { [hubType]: flushSize },\n queue: { [hubType]: typedQueue },\n userProperties,\n } = this;\n\n typedQueue.push({\n Body: JSON.stringify(msg),\n UserProperties: userProperties,\n });\n\n if (typedQueue.length === flushSize) {\n this.flush(hubType);\n } else if (!batchTimers[hubType]) {\n batchTimers[hubType] = setTimeout(this.flush, flushDelay, hubType);\n }\n };\n\n resetBatchTimer: (hubType: DataCollectionHubKind) => void = (hubType) => {\n const {\n batchTimers,\n batchTimers: { [hubType]: timer },\n } = this;\n\n if (timer) {\n clearTimeout(timer);\n batchTimers[hubType] = null;\n }\n };\n\n flush: (hubType: DataCollectionHubKind) => void = (hubType) => {\n const {\n queue: { [hubType]: typedQueue },\n } = this;\n\n this.resetBatchTimer(hubType);\n if (typedQueue.length > 0) {\n this.sendData(hubType, typedQueue);\n }\n };\n\n flushAll: () => void = () => {\n this.flush(DataCollectionHubCold);\n this.flush(DataCollectionHubHot);\n };\n\n sendData: (hubType: DataCollectionHubKind, queue: NETGEM_API_V8_DATA_COLLECTION_BATCH_PAYLOAD) => void = (hubType, queue) => {\n const {\n dispatch,\n sasDelay: { [hubType]: sasDelay },\n } = this;\n\n const sendRequest = hubType === DataCollectionHubCold ? sendColdDataRequest : sendHotDataRequest;\n\n dispatch(sendRequest(queue, sasDelay))\n .catch(() => {\n // Data could not be sent, but we don't want to bloat things with old data\n })\n .finally(() => {\n queue.length = 0;\n });\n };\n\n stash: () => void = () => {\n const {\n queue,\n queue: { [DataCollectionHubCold]: coldQueue, [DataCollectionHubHot]: hotQueue },\n } = this;\n\n if (coldQueue.length + hotQueue.length > 0) {\n LocalStorageManager.save(StorageKeys.DataCollectionStash, queue);\n }\n };\n\n // Retrieve and flush data that has been stored when the app last exited\n unstash: () => void = () => {\n const stashedQueue = LocalStorageManager.loadObject(StorageKeys.DataCollectionStash);\n\n if (!stashedQueue) {\n return;\n }\n\n // Clean up\n LocalStorageManager.delete(StorageKeys.DataCollectionStash);\n\n try {\n const queue = JSON.parse(stashedQueue);\n if (queue instanceof Object) {\n [DataCollectionHubCold, DataCollectionHubHot].forEach((hubType) => {\n const { [hubType]: typedQueue } = ((queue: any): QueueType);\n if (typedQueue && typedQueue instanceof Array && typedQueue.length > 0) {\n this.sendData(hubType, typedQueue);\n }\n });\n }\n } catch {\n // Nothing to do: outcome does not matter that much\n }\n };\n}\n","/* @flow */\n\n/*\n * Chrome's Global Media Controls\n */\n\nimport type { BasicFunction, BasicPromiseFunction } from '@ntg/utils/dist/types';\n\nconst GMC_PLAYBACK_STATE_NONE = 'none';\nconst GMC_PLAYBACK_STATE_PAUSED = 'paused';\nconst GMC_PLAYBACK_STATE_PLAYING = 'playing';\n\nexport default class MediaController {\n // $FlowFixMe: Flow does not support symbols yet\n get [Symbol.toStringTag]() {\n return 'MediaController';\n }\n\n static initialize: (applicationName: string) => void = (applicationName) => {\n const {\n navigator: { mediaSession },\n } = window;\n\n if (mediaSession) {\n mediaSession.metadata = new window.MediaMetadata({\n album: applicationName,\n // Space is crucial here, as an empty string causes the display of the default title\n title: ' ',\n });\n\n mediaSession.playbackState = GMC_PLAYBACK_STATE_NONE;\n }\n };\n\n static reset: () => void = () => {\n const {\n navigator: { mediaSession },\n } = window;\n\n if (mediaSession) {\n mediaSession.metadata = null;\n mediaSession.playbackState = GMC_PLAYBACK_STATE_NONE;\n }\n };\n\n static setPlayingState: () => void = () => {\n const {\n navigator: { mediaSession },\n } = window;\n\n if (mediaSession) {\n mediaSession.playbackState = GMC_PLAYBACK_STATE_PLAYING;\n }\n };\n\n static setPausedState: () => void = () => {\n const {\n navigator: { mediaSession },\n } = window;\n\n if (mediaSession) {\n mediaSession.playbackState = GMC_PLAYBACK_STATE_PAUSED;\n }\n };\n\n static setTitles: (programTitle: ?string, seriesTitle: ?string) => void = (programTitle, seriesTitle) => {\n const {\n navigator: { mediaSession },\n } = window;\n\n if (mediaSession && mediaSession.metadata) {\n mediaSession.metadata.title = seriesTitle ?? programTitle;\n if (seriesTitle && programTitle && seriesTitle !== programTitle) {\n mediaSession.metadata.artist = programTitle;\n }\n }\n };\n\n static setImage: (src: string, type: string, width: number, height: number) => void = (src, type, width, height) => {\n const {\n navigator: { mediaSession },\n } = window;\n\n if (mediaSession && mediaSession.metadata) {\n mediaSession.metadata.artwork = [\n {\n sizes: `${width}x${height}`,\n src,\n type,\n },\n ];\n }\n };\n\n static setPlayHandler: (callback: BasicPromiseFunction) => void = (callback) => {\n const {\n navigator: { mediaSession },\n } = window;\n\n if (mediaSession && mediaSession.metadata) {\n mediaSession.setActionHandler('play', callback);\n }\n };\n\n static setPauseHandler: (callback: BasicPromiseFunction) => void = (callback) => {\n const {\n navigator: { mediaSession },\n } = window;\n\n if (mediaSession && mediaSession.metadata) {\n mediaSession.setActionHandler('pause', callback);\n }\n };\n\n static setSeekBackwardHandler: (callback: BasicFunction) => void = (callback) => {\n const {\n navigator: { mediaSession },\n } = window;\n\n if (mediaSession && mediaSession.metadata) {\n mediaSession.setActionHandler('seekbackward', callback);\n }\n };\n\n static setSeekForwardHandler: (callback: BasicFunction) => void = (callback) => {\n const {\n navigator: { mediaSession },\n } = window;\n\n if (mediaSession && mediaSession.metadata) {\n mediaSession.setActionHandler('seekforward', callback);\n }\n };\n\n static setPreviousTrackHandler: (callback?: BasicFunction) => void = (callback) => {\n const {\n navigator: { mediaSession },\n } = window;\n\n if (mediaSession && mediaSession.metadata) {\n mediaSession.setActionHandler('previoustrack', callback);\n }\n };\n\n static setNextTrackHandler: (callback?: BasicFunction) => void = (callback) => {\n const {\n navigator: { mediaSession },\n } = window;\n\n if (mediaSession && mediaSession.metadata) {\n mediaSession.setActionHandler('nexttrack', callback);\n }\n };\n}\n","/* @flow */\n\nexport enum MediametrieDiffusion {\n Live = 'live',\n Replay = 'replay',\n Timeshifting = 'timeshifting',\n}\n\n/* eslint-disable no-magic-numbers */\nexport enum MediametrieState {\n Pause = 7,\n Play = 5,\n Stop = 12,\n}\n/* eslint-enable no-magic-numbers */\n\nexport enum MediametrieDiffusionMode {\n Aod = 'AOD',\n Live = 'LIVE',\n Svod = 'SVOD',\n Timeshifting = 'TIMESHIFTING',\n Tvod = 'TVOD',\n Vod = 'VOD',\n}\n\nexport enum MediametrieStateEvent {\n Pause = 'pause',\n Play = 'play',\n Stop = 'stop',\n}\n\nexport const DEFAULT_MEASURE: 'streaming' = 'streaming';\n\nexport type STREAM_ANALYTICS_CONFIGURATION_TYPE = {|\n consentString: ?string,\n consentType: ?string,\n domain: ?string,\n levels?: {|\n level_1?: string,\n level_2?: string,\n level_3?: string,\n level_4?: string,\n level_5?: string,\n |},\n measure: typeof DEFAULT_MEASURE,\n mediaInfo: {|\n mediaChannel: string,\n mediaContentId: ?string,\n // MediametrieDiffusionMode\n mediaDiffMode: string,\n |},\n netMeasurement?: string,\n newLevels?: {|\n newLevel_1?: string,\n newLevel_10?: string,\n newLevel_11?: string,\n newLevel_2?: string,\n newLevel_3?: string,\n newLevel_4?: string,\n newLevel_5?: string,\n newLevel_6?: string,\n newLevel_7?: string,\n newLevel_8?: string,\n newLevel_9?: string,\n |},\n serial: string,\n streaming: {|\n callbackPosition: () => number,\n // Returns a MediametrieState\n callbackState: () => number,\n // MediametrieDiffusion\n diffusion: string,\n duration?: number,\n playerName: string,\n playerVersion: string,\n probe: boolean,\n streamGenre?: string,\n streamName: string,\n |},\n|};\n","/* @flow */\n\nimport './mu-7.3.1.js';\nimport { DEFAULT_MEASURE, MediametrieDiffusion, MediametrieDiffusionMode, MediametrieState, MediametrieStateEvent, type STREAM_ANALYTICS_CONFIGURATION_TYPE } from './types';\nimport { type METRICS_PROPERTIES, MetricsStreamType } from '../../libs/netgemLibrary/v8/types/Channel';\nimport DidomiWrapper from '../consent/didomi';\n\n/*\n * Switching from LIVE to TIMESHIFTING when reader head is more than 60s behind live and switching back to LIVE when it's less than 50s behind live (in seconds)\n * See 3.1.1 in \"Mesure 4 Ecrans - Plan de marquage eStat 3 niveaux TV - TF1 - V3.0 - 11042016.pdf\"\n */\nconst DOWNWARD_TIMESHIFT_THRESHOLD = 60;\nconst UPWARD_TIMESHIFT_THRESHOLD = 50;\n\nconst addIfDefined = (obj: any, key: string, value: ?string) => {\n if (typeof value === 'string') {\n obj[key] = value;\n }\n};\n\nconst callbackStateAsNumber =\n (callbackState: () => MediametrieState): (() => number) =>\n () =>\n (callbackState(): number);\n\nexport default class Mediametrie {\n // $FlowFixMe: eStartTag is defined in mu-*.js script but bindings are not exported\n contentStreamTag: eStatTag;\n\n constructor(metrics: METRICS_PROPERTIES, playerName: string, playerVersion: string, callbackState: () => MediametrieState, callbackPosition: () => number, forceOptOutConsent: boolean) {\n const {\n params: { chId, cmsGR, cmsSN, dom, miCh, msCh, msCid, msDm },\n serial,\n type,\n } = metrics;\n\n const isLive = type === MetricsStreamType.Live;\n\n const diffusion = isLive ? MediametrieDiffusion.Timeshifting : MediametrieDiffusion.Replay;\n\n // Following is always initialized to 'LIVE' when diffusion === 'timeshifting', but could change later to 'TIMESHIFTING' depending on user's actions\n const mediaDiffMode = isLive ? MediametrieDiffusionMode.Live : msDm || MediametrieDiffusionMode.Tvod;\n\n const configuration: STREAM_ANALYTICS_CONFIGURATION_TYPE = {\n consentString: DidomiWrapper.getConsentString(),\n consentType: DidomiWrapper.isMediametrieEnabled() && !forceOptOutConsent ? 'optin' : 'optout',\n domain: dom,\n measure: DEFAULT_MEASURE,\n mediaInfo: {\n mediaChannel: msCh || chId,\n mediaContentId: isLive ? '0' : msCid,\n mediaDiffMode: (mediaDiffMode: string),\n },\n serial,\n streaming: {\n callbackPosition,\n callbackState: callbackStateAsNumber(callbackState),\n diffusion: (diffusion: string),\n playerName,\n playerVersion,\n probe: true,\n streamName: isLive ? '-' : cmsSN || '-',\n },\n };\n\n if (!isLive) {\n addIfDefined(configuration.streaming, 'streamGenre', cmsGR);\n }\n\n if (miCh) {\n configuration.netMeasurement = miCh;\n }\n\n this.addLevels(configuration, metrics);\n this.addNewLevels(configuration, metrics);\n\n // $FlowFixMe: eStartTag is defined in mu-*.js script but bindings are not exported\n this.contentStreamTag = new eStatTag(configuration); // eslint-disable-line new-cap\n }\n\n // $FlowFixMe: Flow does not support symbols yet\n get [Symbol.toStringTag]() {\n return 'Mediametrie';\n }\n\n destroy: () => void = () => {\n const { contentStreamTag } = this;\n\n if (contentStreamTag) {\n contentStreamTag.disable();\n }\n };\n\n addLevels: (configuration: STREAM_ANALYTICS_CONFIGURATION_TYPE, metrics: METRICS_PROPERTIES) => void = (configuration, metrics) => {\n const {\n params: { cmsS1, cmsS2, cmsS3, cmsS4, cmsS5 },\n } = metrics;\n\n if (cmsS1 || cmsS2 || cmsS3 || cmsS4 || cmsS5) {\n configuration.levels = {};\n addIfDefined(configuration.levels, 'level_1', cmsS3);\n addIfDefined(configuration.levels, 'level_2', cmsS2);\n addIfDefined(configuration.levels, 'level_3', cmsS1);\n addIfDefined(configuration.levels, 'level_4', cmsS4);\n addIfDefined(configuration.levels, 'level_5', cmsS5);\n }\n };\n\n addNewLevels: (configuration: STREAM_ANALYTICS_CONFIGURATION_TYPE, metrics: METRICS_PROPERTIES) => void = (configuration, metrics) => {\n const {\n params: { ml1, ml10, ml11, ml2, ml3, ml4, ml5, ml6, ml7, ml8, ml9 },\n } = metrics;\n\n if (ml1 || ml2 || ml3 || ml4 || ml5 || ml6 || ml7 || ml8 || ml9 || ml10 || ml11) {\n configuration.newLevels = {};\n addIfDefined(configuration.newLevels, 'newLevel_1', ml1);\n addIfDefined(configuration.newLevels, 'newLevel_2', ml2);\n addIfDefined(configuration.newLevels, 'newLevel_3', ml3);\n addIfDefined(configuration.newLevels, 'newLevel_4', ml4);\n addIfDefined(configuration.newLevels, 'newLevel_5', ml5);\n addIfDefined(configuration.newLevels, 'newLevel_6', ml6);\n addIfDefined(configuration.newLevels, 'newLevel_7', ml7);\n addIfDefined(configuration.newLevels, 'newLevel_8', ml8);\n addIfDefined(configuration.newLevels, 'newLevel_9', ml9);\n addIfDefined(configuration.newLevels, 'newLevel_10', ml10);\n addIfDefined(configuration.newLevels, 'newLevel_11', ml11);\n }\n };\n\n setDuration: (duration: number) => void = (duration) => {\n const { contentStreamTag } = this;\n\n contentStreamTag.set({ streaming: { streamDuration: Math.round(duration) } });\n };\n\n updateTimeshift: (value: number) => void = (value) => {\n const {\n contentStreamTag,\n contentStreamTag: {\n configuration: {\n mediaInfo: { mediaDiffMode },\n },\n },\n } = this;\n\n if (mediaDiffMode === MediametrieDiffusionMode.Live && value >= DOWNWARD_TIMESHIFT_THRESHOLD) {\n // Stop session because we're behind the live stream\n this.notifyStop();\n contentStreamTag.set({ mediaInfo: { mediaDiffMode: (MediametrieDiffusionMode.Timeshifting: string) } });\n this.notifyPlay();\n } else if (mediaDiffMode === MediametrieDiffusionMode.Timeshifting && value <= UPWARD_TIMESHIFT_THRESHOLD) {\n // Stop session because we're not timeshifting anymore\n this.notifyStop();\n contentStreamTag.set({ mediaInfo: { mediaDiffMode: (MediametrieDiffusionMode.Live: string) } });\n this.notifyPlay();\n }\n };\n\n notifyPlay: () => void = () => {\n const { contentStreamTag } = this;\n\n contentStreamTag.notifyPlayer((MediametrieStateEvent.Play: string));\n };\n\n notifyPause: () => void = () => {\n const { contentStreamTag } = this;\n\n contentStreamTag.notifyPlayer((MediametrieStateEvent.Pause: string));\n };\n\n notifyStop: () => void = () => {\n const { contentStreamTag } = this;\n\n contentStreamTag.notifyPlayer((MediametrieStateEvent.Stop: string));\n };\n}\n","/* @flow */\n\nimport * as React from 'react';\nimport type { AllTracks, AudioTrack, ShakaOfflineProgressUpdate, ShakaTrack, TextTrack, VideoTrack } from './shakaTypes';\nimport { HeightKind, WidthKind } from '../../buttons/types';\nimport { Messenger, MessengerEvents } from '@ntg/utils/dist/messenger';\nimport ButtonFX from '../../buttons/ButtonFX';\nimport ShakaStorage from './shakaStorage';\nimport { logInfo } from '../../../helpers/debug/debug';\n\nconst cloneAudioTracks: (tracks: Array<AudioTrack>) => Array<AudioTrack> = (tracks) =>\n tracks.map((track) => {\n return {\n ...track,\n roles: [...track.roles],\n };\n });\n\nconst cloneTextTracks: (tracks: Array<TextTrack>) => Array<TextTrack> = (tracks) =>\n tracks.map((track) => {\n return {\n ...track,\n roles: [...track.roles],\n };\n });\n\nconst cloneVideoTracks: (tracks: Array<VideoTrack>) => Array<VideoTrack> = (tracks) =>\n tracks.map((track) => {\n return {\n ...track,\n roles: [...track.roles],\n };\n });\n\n// TODO: use cache\nconst cloneAllTracks: (tracks: AllTracks) => AllTracks = (tracks) => {\n const { audio, text, video } = tracks;\n\n return {\n audio: cloneAudioTracks(audio),\n text: cloneTextTracks(text),\n video: cloneVideoTracks(video),\n };\n};\n\nconst handleCancelOnClick: (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>, id: string) => void = (event, id) => {\n if (id) {\n ShakaStorage.cancelDownload(id);\n }\n};\n\n// Sending progress of 1 will immediately close the toast, whatever the value of autoClose\nconst ALMOST_ONE = 0.99;\nconst generateUpdateDownloadProgress: (toastId: string, title: string) => ShakaOfflineProgressUpdate =\n (toastId, title) =>\n (content: any, progress: number): void => {\n if (progress === -1) {\n // Error\n Messenger.emit(MessengerEvents.NOTIFY_ERROR, <div>Erreur lors du téléchargement de « {title} »</div>, { progress, toastId });\n Messenger.emit(MessengerEvents.NOTIFY_CLOSE, toastId);\n } else if (progress < 1) {\n // Downloading\n Messenger.emit(\n MessengerEvents.NOTIFY_INFO,\n <>\n <div>Téléchargement de « {title} »...</div>\n <ButtonFX data={toastId} heightKind={HeightKind.Small} onClick={handleCancelOnClick} widthKind={WidthKind.Stretched}>\n Annuler\n </ButtonFX>\n </>,\n { progress, toastId },\n );\n } else {\n // Finished\n Messenger.emit(MessengerEvents.NOTIFY_SUCCESS, <div>« {title} » a été téléchargé</div>, { progress: ALMOST_ONE, toastId });\n Messenger.emit(MessengerEvents.NOTIFY_CLOSE, toastId);\n Messenger.emit(MessengerEvents.DOWNLOAD_SUCCESSFUL);\n }\n };\n\nconst selectDownloadTracks: (tracks: Array<ShakaTrack>) => Array<ShakaTrack> = (tracks) => {\n let index = -1;\n let maxBandwidth = -1;\n for (let i = 0; i < tracks.length; ++i) {\n const {\n [i]: { bandwidth, type },\n } = tracks;\n if (type === 'variant' && bandwidth > maxBandwidth) {\n index = i;\n maxBandwidth = bandwidth;\n }\n }\n\n if (index > -1) {\n // Track with the highest bandwidth found\n return [tracks[index]];\n }\n\n // First variant track selected\n const firstTrack = tracks.find(({ type }) => type === 'variant');\n if (firstTrack) {\n return [firstTrack];\n }\n\n // No track\n return [];\n};\n\nconst Verimatrix = Object.freeze({ Case2LastIndex: 6, CharCodeRadix: 16, HexCharCodeLength: 2, UuidLength: 32 });\n\nconst getContentId: (skdOriginalValue: string, isVerimatrixFairplay: boolean) => string = (skdOriginalValue, isVerimatrixFairplay) => {\n if (!isVerimatrixFairplay) {\n // Regular case: use SKD as it is\n return skdOriginalValue;\n }\n\n // Verimatrix case: extract SKD\n\n let contentId: string | null = null;\n\n // [Case 1] request id: skd://e670fd8208733965b03cfd818d21e3fc → content key id: e670fd8208733965b03cfd818d21e3fc\n const ma1 = skdOriginalValue.match(/\\/([a-z\\d]+)$/iu);\n if (ma1) {\n [, contentId] = ma1;\n } else {\n // [Case 2] request id: skd://fps.ezdrm.com/;d9fb2bc6-6e03-4206-abfe-665405e083cc → content key id: d9fb2bc66e034206abfe665405e083cc\n const ma2 = skdOriginalValue.match(/;([a-z\\d]{8})-([a-z\\d]{4})-([a-z\\d]{4})-([a-z\\d]{4})-([a-z\\d]{12})$/iu);\n if (ma2) {\n contentId = ma2.slice(1, Verimatrix.Case2LastIndex).join('');\n }\n }\n\n const base64Re = /^(?:[A-Z0-9+/]{4})*(?:[A-Z0-9+/]{2}==|[A-Z0-9+/]{3}=|[A-Z0-9+/]{4})$/iu;\n if (contentId !== null && base64Re.test(contentId)) {\n logInfo(`contentId \"${contentId}\" is valid base64`);\n\n const result = atob(contentId)\n .split('')\n .map((c) => c.charCodeAt(0).toString(Verimatrix.CharCodeRadix).padStart(Verimatrix.HexCharCodeLength, '0'))\n .join('');\n\n if (result.length === Verimatrix.UuidLength) {\n logInfo('Length is 32');\n contentId = result;\n } else {\n logInfo(`Length is not 32: (${result.length}) ${result}`);\n }\n } else {\n logInfo(`contentId \"${contentId ?? 'contentId is null'}\" is not valid base64`);\n }\n\n // If contentId is null, return original SKD\n return contentId || skdOriginalValue;\n};\n\nexport { cloneAllTracks, getContentId, selectDownloadTracks, generateUpdateDownloadProgress };\n","/**\n * NOTE: In order to avoid circular dependencies, if you add a function to this module and it needs to print something,\n * you must either a) use `console.log` rather than the logger, or b) put your function elsewhere.\n *\n * Note: This file was originally called `global.ts`, but was changed to unblock users which might be doing\n * string replaces with bundlers like Vite for `global` (would break imports that rely on importing from utils/src/global).\n *\n * Why worldwide?\n *\n * Why not?\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { Carrier } from '../carrier';\nimport type { SdkSource } from './env';\n\n/** Internal global with common properties and Sentry extensions */\nexport type InternalGlobal = {\n navigator?: { userAgent?: string; maxTouchPoints?: number };\n console: Console;\n PerformanceObserver?: any;\n Sentry?: any;\n onerror?: {\n (event: object | string, source?: string, lineno?: number, colno?: number, error?: Error): any;\n __SENTRY_INSTRUMENTED__?: true;\n };\n onunhandledrejection?: {\n (event: unknown): boolean;\n __SENTRY_INSTRUMENTED__?: true;\n };\n SENTRY_ENVIRONMENT?: string;\n SENTRY_DSN?: string;\n SENTRY_RELEASE?: {\n id?: string;\n };\n SENTRY_SDK_SOURCE?: SdkSource;\n /**\n * Debug IDs are indirectly injected by Sentry CLI or bundler plugins to directly reference a particular source map\n * for resolving of a source file. The injected code will place an entry into the record for each loaded bundle/JS\n * file.\n */\n _sentryDebugIds?: Record<string, string>;\n /**\n * Raw module metadata that is injected by bundler plugins.\n *\n * Keys are `error.stack` strings, values are the metadata.\n */\n _sentryModuleMetadata?: Record<string, any>;\n _sentryEsmLoaderHookRegistered?: boolean;\n} & Carrier;\n\n/** Get's the global object for the current JavaScript runtime */\nexport const GLOBAL_OBJ = globalThis as unknown as InternalGlobal;\n","import { GLOBAL_OBJ } from './worldwide';\n\nconst ONE_SECOND_IN_MS = 1000;\n\n/**\n * A partial definition of the [Performance Web API]{@link https://developer.mozilla.org/en-US/docs/Web/API/Performance}\n * for accessing a high-resolution monotonic clock.\n */\ninterface Performance {\n /**\n * The millisecond timestamp at which measurement began, measured in Unix time.\n */\n timeOrigin: number;\n /**\n * Returns the current millisecond timestamp, where 0 represents the start of measurement.\n */\n now(): number;\n}\n\n/**\n * Returns a timestamp in seconds since the UNIX epoch using the Date API.\n */\nexport function dateTimestampInSeconds(): number {\n return Date.now() / ONE_SECOND_IN_MS;\n}\n\n/**\n * Returns a wrapper around the native Performance API browser implementation, or undefined for browsers that do not\n * support the API.\n *\n * Wrapping the native API works around differences in behavior from different browsers.\n */\nfunction createUnixTimestampInSecondsFunc(): () => number {\n const { performance } = GLOBAL_OBJ as typeof GLOBAL_OBJ & { performance?: Performance };\n if (!performance?.now) {\n return dateTimestampInSeconds;\n }\n\n // Some browser and environments don't have a timeOrigin, so we fallback to\n // using Date.now() to compute the starting time.\n const approxStartingTimeOrigin = Date.now() - performance.now();\n const timeOrigin = performance.timeOrigin == undefined ? approxStartingTimeOrigin : performance.timeOrigin;\n\n // performance.now() is a monotonic clock, which means it starts at 0 when the process begins. To get the current\n // wall clock time (actual UNIX timestamp), we need to add the starting time origin and the current time elapsed.\n //\n // TODO: This does not account for the case where the monotonic clock that powers performance.now() drifts from the\n // wall clock time, which causes the returned timestamp to be inaccurate. We should investigate how to detect and\n // correct for this.\n // See: https://github.com/getsentry/sentry-javascript/issues/2590\n // See: https://github.com/mdn/content/issues/4713\n // See: https://dev.to/noamr/when-a-millisecond-is-not-a-millisecond-3h6\n return () => {\n return (timeOrigin + performance.now()) / ONE_SECOND_IN_MS;\n };\n}\n\n/**\n * Returns a timestamp in seconds since the UNIX epoch using either the Performance or Date APIs, depending on the\n * availability of the Performance API.\n *\n * BUG: Note that because of how browsers implement the Performance API, the clock might stop when the computer is\n * asleep. This creates a skew between `dateTimestampInSeconds` and `timestampInSeconds`. The\n * skew can grow to arbitrary amounts like days, weeks or months.\n * See https://github.com/getsentry/sentry-javascript/issues/2590.\n */\nexport const timestampInSeconds = createUnixTimestampInSecondsFunc();\n\n/**\n * Cached result of getBrowserTimeOrigin.\n */\nlet cachedTimeOrigin: [number | undefined, string] | undefined;\n\n/**\n * Gets the time origin and the mode used to determine it.\n */\nfunction getBrowserTimeOrigin(): [number | undefined, string] {\n // Unfortunately browsers may report an inaccurate time origin data, through either performance.timeOrigin or\n // performance.timing.navigationStart, which results in poor results in performance data. We only treat time origin\n // data as reliable if they are within a reasonable threshold of the current time.\n\n const { performance } = GLOBAL_OBJ as typeof GLOBAL_OBJ & Window;\n if (!performance?.now) {\n return [undefined, 'none'];\n }\n\n const threshold = 3600 * 1000;\n const performanceNow = performance.now();\n const dateNow = Date.now();\n\n // if timeOrigin isn't available set delta to threshold so it isn't used\n const timeOriginDelta = performance.timeOrigin\n ? Math.abs(performance.timeOrigin + performanceNow - dateNow)\n : threshold;\n const timeOriginIsReliable = timeOriginDelta < threshold;\n\n // While performance.timing.navigationStart is deprecated in favor of performance.timeOrigin, performance.timeOrigin\n // is not as widely supported. Namely, performance.timeOrigin is undefined in Safari as of writing.\n // Also as of writing, performance.timing is not available in Web Workers in mainstream browsers, so it is not always\n // a valid fallback. In the absence of an initial time provided by the browser, fallback to the current time from the\n // Date API.\n // eslint-disable-next-line deprecation/deprecation\n const navigationStart = performance.timing?.navigationStart;\n const hasNavigationStart = typeof navigationStart === 'number';\n // if navigationStart isn't available set delta to threshold so it isn't used\n const navigationStartDelta = hasNavigationStart ? Math.abs(navigationStart + performanceNow - dateNow) : threshold;\n const navigationStartIsReliable = navigationStartDelta < threshold;\n\n if (timeOriginIsReliable || navigationStartIsReliable) {\n // Use the more reliable time origin\n if (timeOriginDelta <= navigationStartDelta) {\n return [performance.timeOrigin, 'timeOrigin'];\n } else {\n return [navigationStart, 'navigationStart'];\n }\n }\n\n // Either both timeOrigin and navigationStart are skewed or neither is available, fallback to Date.\n return [dateNow, 'dateNow'];\n}\n\n/**\n * The number of milliseconds since the UNIX epoch. This value is only usable in a browser, and only when the\n * performance API is available.\n */\nexport function browserPerformanceTimeOrigin(): number | undefined {\n if (!cachedTimeOrigin) {\n cachedTimeOrigin = getBrowserTimeOrigin();\n }\n\n return cachedTimeOrigin[0];\n}\n","// This is a magic string replaced by rollup\ndeclare const __SENTRY_SDK_VERSION__: string;\n\nexport const SDK_VERSION = typeof __SENTRY_SDK_VERSION__ === 'string' ? __SENTRY_SDK_VERSION__ : '0.0.0-unknown.0';\n","import type { AsyncContextStack } from './asyncContext/stackStrategy';\nimport type { AsyncContextStrategy } from './asyncContext/types';\nimport type { Scope } from './scope';\nimport type { Logger } from './utils-hoist/logger';\nimport { SDK_VERSION } from './utils-hoist/version';\nimport { GLOBAL_OBJ } from './utils-hoist/worldwide';\n\n/**\n * An object that contains globally accessible properties and maintains a scope stack.\n * @hidden\n */\nexport interface Carrier {\n __SENTRY__?: VersionedCarrier;\n}\n\ntype VersionedCarrier = {\n version?: string;\n} & Record<Exclude<string, 'version'>, SentryCarrier>;\n\nexport interface SentryCarrier {\n acs?: AsyncContextStrategy;\n stack?: AsyncContextStack;\n\n globalScope?: Scope;\n defaultIsolationScope?: Scope;\n defaultCurrentScope?: Scope;\n logger?: Logger;\n\n /** Overwrites TextEncoder used in `@sentry/core`, need for `react-native@0.73` and older */\n encodePolyfill?: (input: string) => Uint8Array;\n /** Overwrites TextDecoder used in `@sentry/core`, need for `react-native@0.73` and older */\n decodePolyfill?: (input: Uint8Array) => string;\n}\n\n/**\n * Returns the global shim registry.\n *\n * FIXME: This function is problematic, because despite always returning a valid Carrier,\n * it has an optional `__SENTRY__` property, which then in turn requires us to always perform an unnecessary check\n * at the call-site. We always access the carrier through this function, so we can guarantee that `__SENTRY__` is there.\n **/\nexport function getMainCarrier(): Carrier {\n // This ensures a Sentry carrier exists\n getSentryCarrier(GLOBAL_OBJ);\n return GLOBAL_OBJ;\n}\n\n/** Will either get the existing sentry carrier, or create a new one. */\nexport function getSentryCarrier(carrier: Carrier): SentryCarrier {\n const __SENTRY__ = (carrier.__SENTRY__ = carrier.__SENTRY__ || {});\n\n // For now: First SDK that sets the .version property wins\n __SENTRY__.version = __SENTRY__.version || SDK_VERSION;\n\n // Intentionally populating and returning the version of \"this\" SDK instance\n // rather than what's set in .version so that \"this\" SDK always gets its carrier\n return (__SENTRY__[SDK_VERSION] = __SENTRY__[SDK_VERSION] || {});\n}\n\n/**\n * Returns a global singleton contained in the global `__SENTRY__[]` object.\n *\n * If the singleton doesn't already exist in `__SENTRY__`, it will be created using the given factory\n * function and added to the `__SENTRY__` object.\n *\n * @param name name of the global singleton on __SENTRY__\n * @param creator creator Factory function to create the singleton if it doesn't already exist on `__SENTRY__`\n * @param obj (Optional) The global object on which to look for `__SENTRY__`, if not `GLOBAL_OBJ`'s return value\n * @returns the singleton\n */\nexport function getGlobalSingleton<Prop extends keyof SentryCarrier>(\n name: Prop,\n creator: () => NonNullable<SentryCarrier[Prop]>,\n obj = GLOBAL_OBJ,\n): NonNullable<SentryCarrier[Prop]> {\n const __SENTRY__ = (obj.__SENTRY__ = obj.__SENTRY__ || {});\n const carrier = (__SENTRY__[SDK_VERSION] = __SENTRY__[SDK_VERSION] || {});\n // Note: We do not want to set `carrier.version` here, as this may be called before any `init` is called, e.g. for the default scopes\n return carrier[name] || (carrier[name] = creator());\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { ParameterizedString, PolymorphicEvent, Primitive } from '../types-hoist';\n\n// eslint-disable-next-line @typescript-eslint/unbound-method\nconst objectToString = Object.prototype.toString;\n\n/**\n * Checks whether given value's type is one of a few Error or Error-like\n * {@link isError}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isError(wat: unknown): wat is Error {\n switch (objectToString.call(wat)) {\n case '[object Error]':\n case '[object Exception]':\n case '[object DOMException]':\n case '[object WebAssembly.Exception]':\n return true;\n default:\n return isInstanceOf(wat, Error);\n }\n}\n/**\n * Checks whether given value is an instance of the given built-in class.\n *\n * @param wat The value to be checked\n * @param className\n * @returns A boolean representing the result.\n */\nfunction isBuiltin(wat: unknown, className: string): boolean {\n return objectToString.call(wat) === `[object ${className}]`;\n}\n\n/**\n * Checks whether given value's type is ErrorEvent\n * {@link isErrorEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isErrorEvent(wat: unknown): boolean {\n return isBuiltin(wat, 'ErrorEvent');\n}\n\n/**\n * Checks whether given value's type is DOMError\n * {@link isDOMError}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isDOMError(wat: unknown): boolean {\n return isBuiltin(wat, 'DOMError');\n}\n\n/**\n * Checks whether given value's type is DOMException\n * {@link isDOMException}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isDOMException(wat: unknown): boolean {\n return isBuiltin(wat, 'DOMException');\n}\n\n/**\n * Checks whether given value's type is a string\n * {@link isString}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isString(wat: unknown): wat is string {\n return isBuiltin(wat, 'String');\n}\n\n/**\n * Checks whether given string is parameterized\n * {@link isParameterizedString}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isParameterizedString(wat: unknown): wat is ParameterizedString {\n return (\n typeof wat === 'object' &&\n wat !== null &&\n '__sentry_template_string__' in wat &&\n '__sentry_template_values__' in wat\n );\n}\n\n/**\n * Checks whether given value is a primitive (undefined, null, number, boolean, string, bigint, symbol)\n * {@link isPrimitive}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isPrimitive(wat: unknown): wat is Primitive {\n return wat === null || isParameterizedString(wat) || (typeof wat !== 'object' && typeof wat !== 'function');\n}\n\n/**\n * Checks whether given value's type is an object literal, or a class instance.\n * {@link isPlainObject}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isPlainObject(wat: unknown): wat is Record<string, unknown> {\n return isBuiltin(wat, 'Object');\n}\n\n/**\n * Checks whether given value's type is an Event instance\n * {@link isEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isEvent(wat: unknown): wat is PolymorphicEvent {\n return typeof Event !== 'undefined' && isInstanceOf(wat, Event);\n}\n\n/**\n * Checks whether given value's type is an Element instance\n * {@link isElement}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isElement(wat: unknown): boolean {\n return typeof Element !== 'undefined' && isInstanceOf(wat, Element);\n}\n\n/**\n * Checks whether given value's type is an regexp\n * {@link isRegExp}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isRegExp(wat: unknown): wat is RegExp {\n return isBuiltin(wat, 'RegExp');\n}\n\n/**\n * Checks whether given value has a then function.\n * @param wat A value to be checked.\n */\nexport function isThenable(wat: any): wat is PromiseLike<any> {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return Boolean(wat?.then && typeof wat.then === 'function');\n}\n\n/**\n * Checks whether given value's type is a SyntheticEvent\n * {@link isSyntheticEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isSyntheticEvent(wat: unknown): boolean {\n return isPlainObject(wat) && 'nativeEvent' in wat && 'preventDefault' in wat && 'stopPropagation' in wat;\n}\n\n/**\n * Checks whether given value's type is an instance of provided constructor.\n * {@link isInstanceOf}.\n *\n * @param wat A value to be checked.\n * @param base A constructor to be used in a check.\n * @returns A boolean representing the result.\n */\nexport function isInstanceOf(wat: any, base: any): boolean {\n try {\n return wat instanceof base;\n } catch (_e) {\n return false;\n }\n}\n\ninterface VueViewModel {\n // Vue3\n __isVue?: boolean;\n // Vue2\n _isVue?: boolean;\n}\n/**\n * Checks whether given value's type is a Vue ViewModel.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isVueViewModel(wat: unknown): boolean {\n // Not using Object.prototype.toString because in Vue 3 it would read the instance's Symbol(Symbol.toStringTag) property.\n return !!(typeof wat === 'object' && wat !== null && ((wat as VueViewModel).__isVue || (wat as VueViewModel)._isVue));\n}\n","import { isString } from './is';\nimport { GLOBAL_OBJ } from './worldwide';\n\nconst WINDOW = GLOBAL_OBJ as unknown as Window;\n\nconst DEFAULT_MAX_STRING_LENGTH = 80;\n\ntype SimpleNode = {\n parentNode: SimpleNode;\n} | null;\n\n/**\n * Given a child DOM element, returns a query-selector statement describing that\n * and its ancestors\n * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz]\n * @returns generated DOM path\n */\nexport function htmlTreeAsString(\n elem: unknown,\n options: string[] | { keyAttrs?: string[]; maxStringLength?: number } = {},\n): string {\n if (!elem) {\n return '<unknown>';\n }\n\n // try/catch both:\n // - accessing event.target (see getsentry/raven-js#838, #768)\n // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly\n // - can throw an exception in some circumstances.\n try {\n let currentElem = elem as SimpleNode;\n const MAX_TRAVERSE_HEIGHT = 5;\n const out = [];\n let height = 0;\n let len = 0;\n const separator = ' > ';\n const sepLength = separator.length;\n let nextStr;\n const keyAttrs = Array.isArray(options) ? options : options.keyAttrs;\n const maxStringLength = (!Array.isArray(options) && options.maxStringLength) || DEFAULT_MAX_STRING_LENGTH;\n\n while (currentElem && height++ < MAX_TRAVERSE_HEIGHT) {\n nextStr = _htmlElementAsString(currentElem, keyAttrs);\n // bail out if\n // - nextStr is the 'html' element\n // - the length of the string that would be created exceeds maxStringLength\n // (ignore this limit if we are on the first iteration)\n if (nextStr === 'html' || (height > 1 && len + out.length * sepLength + nextStr.length >= maxStringLength)) {\n break;\n }\n\n out.push(nextStr);\n\n len += nextStr.length;\n currentElem = currentElem.parentNode;\n }\n\n return out.reverse().join(separator);\n } catch (_oO) {\n return '<unknown>';\n }\n}\n\n/**\n * Returns a simple, query-selector representation of a DOM element\n * e.g. [HTMLElement] => input#foo.btn[name=baz]\n * @returns generated DOM path\n */\nfunction _htmlElementAsString(el: unknown, keyAttrs?: string[]): string {\n const elem = el as {\n tagName?: string;\n id?: string;\n className?: string;\n getAttribute(key: string): string;\n };\n\n const out = [];\n\n if (!elem?.tagName) {\n return '';\n }\n\n // @ts-expect-error WINDOW has HTMLElement\n if (WINDOW.HTMLElement) {\n // If using the component name annotation plugin, this value may be available on the DOM node\n if (elem instanceof HTMLElement && elem.dataset) {\n if (elem.dataset['sentryComponent']) {\n return elem.dataset['sentryComponent'];\n }\n if (elem.dataset['sentryElement']) {\n return elem.dataset['sentryElement'];\n }\n }\n }\n\n out.push(elem.tagName.toLowerCase());\n\n // Pairs of attribute keys defined in `serializeAttribute` and their values on element.\n const keyAttrPairs = keyAttrs?.length\n ? keyAttrs.filter(keyAttr => elem.getAttribute(keyAttr)).map(keyAttr => [keyAttr, elem.getAttribute(keyAttr)])\n : null;\n\n if (keyAttrPairs?.length) {\n keyAttrPairs.forEach(keyAttrPair => {\n out.push(`[${keyAttrPair[0]}=\"${keyAttrPair[1]}\"]`);\n });\n } else {\n if (elem.id) {\n out.push(`#${elem.id}`);\n }\n\n const className = elem.className;\n if (className && isString(className)) {\n const classes = className.split(/\\s+/);\n for (const c of classes) {\n out.push(`.${c}`);\n }\n }\n }\n const allowedAttrs = ['aria-label', 'type', 'name', 'title', 'alt'];\n for (const k of allowedAttrs) {\n const attr = elem.getAttribute(k);\n if (attr) {\n out.push(`[${k}=\"${attr}\"]`);\n }\n }\n\n return out.join('');\n}\n\n/**\n * A safe form of location.href\n */\nexport function getLocationHref(): string {\n try {\n return WINDOW.document.location.href;\n } catch (oO) {\n return '';\n }\n}\n\n/**\n * Given a DOM element, traverses up the tree until it finds the first ancestor node\n * that has the `data-sentry-component` or `data-sentry-element` attribute with `data-sentry-component` taking\n * precedence. This attribute is added at build-time by projects that have the component name annotation plugin installed.\n *\n * @returns a string representation of the component for the provided DOM element, or `null` if not found\n */\nexport function getComponentName(elem: unknown): string | null {\n // @ts-expect-error WINDOW has HTMLElement\n if (!WINDOW.HTMLElement) {\n return null;\n }\n\n let currentElem = elem as SimpleNode;\n const MAX_TRAVERSE_HEIGHT = 5;\n for (let i = 0; i < MAX_TRAVERSE_HEIGHT; i++) {\n if (!currentElem) {\n return null;\n }\n\n if (currentElem instanceof HTMLElement) {\n if (currentElem.dataset['sentryComponent']) {\n return currentElem.dataset['sentryComponent'];\n }\n if (currentElem.dataset['sentryElement']) {\n return currentElem.dataset['sentryElement'];\n }\n }\n\n currentElem = currentElem.parentNode;\n }\n\n return null;\n}\n","declare const __DEBUG_BUILD__: boolean;\n\n/**\n * This serves as a build time flag that will be true by default, but false in non-debug builds or if users replace `__SENTRY_DEBUG__` in their generated code.\n *\n * ATTENTION: This constant must never cross package boundaries (i.e. be exported) to guarantee that it can be used for tree shaking.\n */\nexport const DEBUG_BUILD = __DEBUG_BUILD__;\n","import { getGlobalSingleton } from '../carrier';\nimport type { ConsoleLevel } from '../types-hoist';\nimport { DEBUG_BUILD } from './debug-build';\nimport { GLOBAL_OBJ } from './worldwide';\n\n/** Prefix for logging strings */\nconst PREFIX = 'Sentry Logger ';\n\nexport const CONSOLE_LEVELS: readonly ConsoleLevel[] = [\n 'debug',\n 'info',\n 'warn',\n 'error',\n 'log',\n 'assert',\n 'trace',\n] as const;\n\ntype LoggerMethod = (...args: unknown[]) => void;\ntype LoggerConsoleMethods = Record<ConsoleLevel, LoggerMethod>;\n\n/** This may be mutated by the console instrumentation. */\nexport const originalConsoleMethods: {\n [key in ConsoleLevel]?: (...args: unknown[]) => void;\n} = {};\n\n/** A Sentry Logger instance. */\nexport interface Logger extends LoggerConsoleMethods {\n disable(): void;\n enable(): void;\n isEnabled(): boolean;\n}\n\n/**\n * Temporarily disable sentry console instrumentations.\n *\n * @param callback The function to run against the original `console` messages\n * @returns The results of the callback\n */\nexport function consoleSandbox<T>(callback: () => T): T {\n if (!('console' in GLOBAL_OBJ)) {\n return callback();\n }\n\n const console = GLOBAL_OBJ.console as Console;\n const wrappedFuncs: Partial<LoggerConsoleMethods> = {};\n\n const wrappedLevels = Object.keys(originalConsoleMethods) as ConsoleLevel[];\n\n // Restore all wrapped console methods\n wrappedLevels.forEach(level => {\n const originalConsoleMethod = originalConsoleMethods[level] as LoggerMethod;\n wrappedFuncs[level] = console[level] as LoggerMethod | undefined;\n console[level] = originalConsoleMethod;\n });\n\n try {\n return callback();\n } finally {\n // Revert restoration to wrapped state\n wrappedLevels.forEach(level => {\n console[level] = wrappedFuncs[level] as LoggerMethod;\n });\n }\n}\n\nfunction makeLogger(): Logger {\n let enabled = false;\n const logger: Partial<Logger> = {\n enable: () => {\n enabled = true;\n },\n disable: () => {\n enabled = false;\n },\n isEnabled: () => enabled,\n };\n\n if (DEBUG_BUILD) {\n CONSOLE_LEVELS.forEach(name => {\n logger[name] = (...args: Parameters<(typeof GLOBAL_OBJ.console)[typeof name]>) => {\n if (enabled) {\n consoleSandbox(() => {\n GLOBAL_OBJ.console[name](`${PREFIX}[${name}]:`, ...args);\n });\n }\n };\n });\n } else {\n CONSOLE_LEVELS.forEach(name => {\n logger[name] = () => undefined;\n });\n }\n\n return logger as Logger;\n}\n\n/**\n * This is a logger singleton which either logs things or no-ops if logging is not enabled.\n * The logger is a singleton on the carrier, to ensure that a consistent logger is used throughout the SDK.\n */\nexport const logger = getGlobalSingleton('logger', makeLogger);\n","import { isRegExp, isString, isVueViewModel } from './is';\n\nexport { escapeStringForRegex } from './vendor/escapeStringForRegex';\n\n/**\n * Truncates given string to the maximum characters count\n *\n * @param str An object that contains serializable values\n * @param max Maximum number of characters in truncated string (0 = unlimited)\n * @returns string Encoded\n */\nexport function truncate(str: string, max: number = 0): string {\n if (typeof str !== 'string' || max === 0) {\n return str;\n }\n return str.length <= max ? str : `${str.slice(0, max)}...`;\n}\n\n/**\n * This is basically just `trim_line` from\n * https://github.com/getsentry/sentry/blob/master/src/sentry/lang/javascript/processor.py#L67\n *\n * @param str An object that contains serializable values\n * @param max Maximum number of characters in truncated string\n * @returns string Encoded\n */\nexport function snipLine(line: string, colno: number): string {\n let newLine = line;\n const lineLength = newLine.length;\n if (lineLength <= 150) {\n return newLine;\n }\n if (colno > lineLength) {\n // eslint-disable-next-line no-param-reassign\n colno = lineLength;\n }\n\n let start = Math.max(colno - 60, 0);\n if (start < 5) {\n start = 0;\n }\n\n let end = Math.min(start + 140, lineLength);\n if (end > lineLength - 5) {\n end = lineLength;\n }\n if (end === lineLength) {\n start = Math.max(end - 140, 0);\n }\n\n newLine = newLine.slice(start, end);\n if (start > 0) {\n newLine = `'{snip} ${newLine}`;\n }\n if (end < lineLength) {\n newLine += ' {snip}';\n }\n\n return newLine;\n}\n\n/**\n * Join values in array\n * @param input array of values to be joined together\n * @param delimiter string to be placed in-between values\n * @returns Joined values\n */\nexport function safeJoin(input: unknown[], delimiter?: string): string {\n if (!Array.isArray(input)) {\n return '';\n }\n\n const output = [];\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let i = 0; i < input.length; i++) {\n const value = input[i];\n try {\n // This is a hack to fix a Vue3-specific bug that causes an infinite loop of\n // console warnings. This happens when a Vue template is rendered with\n // an undeclared variable, which we try to stringify, ultimately causing\n // Vue to issue another warning which repeats indefinitely.\n // see: https://github.com/getsentry/sentry-javascript/pull/8981\n if (isVueViewModel(value)) {\n output.push('[VueViewModel]');\n } else {\n output.push(String(value));\n }\n } catch (e) {\n output.push('[value cannot be serialized]');\n }\n }\n\n return output.join(delimiter);\n}\n\n/**\n * Checks if the given value matches a regex or string\n *\n * @param value The string to test\n * @param pattern Either a regex or a string against which `value` will be matched\n * @param requireExactStringMatch If true, `value` must match `pattern` exactly. If false, `value` will match\n * `pattern` if it contains `pattern`. Only applies to string-type patterns.\n */\nexport function isMatchingPattern(\n value: string,\n pattern: RegExp | string,\n requireExactStringMatch: boolean = false,\n): boolean {\n if (!isString(value)) {\n return false;\n }\n\n if (isRegExp(pattern)) {\n return pattern.test(value);\n }\n if (isString(pattern)) {\n return requireExactStringMatch ? value === pattern : value.includes(pattern);\n }\n\n return false;\n}\n\n/**\n * Test the given string against an array of strings and regexes. By default, string matching is done on a\n * substring-inclusion basis rather than a strict equality basis\n *\n * @param testString The string to test\n * @param patterns The patterns against which to test the string\n * @param requireExactStringMatch If true, `testString` must match one of the given string patterns exactly in order to\n * count. If false, `testString` will match a string pattern if it contains that pattern.\n * @returns\n */\nexport function stringMatchesSomePattern(\n testString: string,\n patterns: Array<string | RegExp> = [],\n requireExactStringMatch: boolean = false,\n): boolean {\n return patterns.some(pattern => isMatchingPattern(testString, pattern, requireExactStringMatch));\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { WrappedFunction } from '../types-hoist';\n\nimport { htmlTreeAsString } from './browser';\nimport { DEBUG_BUILD } from './debug-build';\nimport { isElement, isError, isEvent, isInstanceOf, isPrimitive } from './is';\nimport { logger } from './logger';\nimport { truncate } from './string';\n\n/**\n * Replace a method in an object with a wrapped version of itself.\n *\n * If the method on the passed object is not a function, the wrapper will not be applied.\n *\n * @param source An object that contains a method to be wrapped.\n * @param name The name of the method to be wrapped.\n * @param replacementFactory A higher-order function that takes the original version of the given method and returns a\n * wrapped version. Note: The function returned by `replacementFactory` needs to be a non-arrow function, in order to\n * preserve the correct value of `this`, and the original method must be called using `origMethod.call(this, <other\n * args>)` or `origMethod.apply(this, [<other args>])` (rather than being called directly), again to preserve `this`.\n * @returns void\n */\nexport function fill(source: { [key: string]: any }, name: string, replacementFactory: (...args: any[]) => any): void {\n if (!(name in source)) {\n return;\n }\n\n // explicitly casting to unknown because we don't know the type of the method initially at all\n const original = source[name] as unknown;\n\n if (typeof original !== 'function') {\n return;\n }\n\n const wrapped = replacementFactory(original) as WrappedFunction;\n\n // Make sure it's a function first, as we need to attach an empty prototype for `defineProperties` to work\n // otherwise it'll throw \"TypeError: Object.defineProperties called on non-object\"\n if (typeof wrapped === 'function') {\n markFunctionWrapped(wrapped, original);\n }\n\n try {\n source[name] = wrapped;\n } catch {\n DEBUG_BUILD && logger.log(`Failed to replace method \"${name}\" in object`, source);\n }\n}\n\n/**\n * Defines a non-enumerable property on the given object.\n *\n * @param obj The object on which to set the property\n * @param name The name of the property to be set\n * @param value The value to which to set the property\n */\nexport function addNonEnumerableProperty(obj: object, name: string, value: unknown): void {\n try {\n Object.defineProperty(obj, name, {\n // enumerable: false, // the default, so we can save on bundle size by not explicitly setting it\n value: value,\n writable: true,\n configurable: true,\n });\n } catch (o_O) {\n DEBUG_BUILD && logger.log(`Failed to add non-enumerable property \"${name}\" to object`, obj);\n }\n}\n\n/**\n * Remembers the original function on the wrapped function and\n * patches up the prototype.\n *\n * @param wrapped the wrapper function\n * @param original the original function that gets wrapped\n */\nexport function markFunctionWrapped(wrapped: WrappedFunction, original: WrappedFunction): void {\n try {\n const proto = original.prototype || {};\n wrapped.prototype = original.prototype = proto;\n addNonEnumerableProperty(wrapped, '__sentry_original__', original);\n } catch (o_O) {} // eslint-disable-line no-empty\n}\n\n/**\n * This extracts the original function if available. See\n * `markFunctionWrapped` for more information.\n *\n * @param func the function to unwrap\n * @returns the unwrapped version of the function if available.\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function getOriginalFunction<T extends Function>(func: WrappedFunction<T>): T | undefined {\n return func.__sentry_original__;\n}\n\n/**\n * Transforms any `Error` or `Event` into a plain object with all of their enumerable properties, and some of their\n * non-enumerable properties attached.\n *\n * @param value Initial source that we have to transform in order for it to be usable by the serializer\n * @returns An Event or Error turned into an object - or the value argument itself, when value is neither an Event nor\n * an Error.\n */\nexport function convertToPlainObject<V>(value: V):\n | {\n [ownProps: string]: unknown;\n type: string;\n target: string;\n currentTarget: string;\n detail?: unknown;\n }\n | {\n [ownProps: string]: unknown;\n message: string;\n name: string;\n stack?: string;\n }\n | V {\n if (isError(value)) {\n return {\n message: value.message,\n name: value.name,\n stack: value.stack,\n ...getOwnProperties(value),\n };\n } else if (isEvent(value)) {\n const newObj: {\n [ownProps: string]: unknown;\n type: string;\n target: string;\n currentTarget: string;\n detail?: unknown;\n } = {\n type: value.type,\n target: serializeEventTarget(value.target),\n currentTarget: serializeEventTarget(value.currentTarget),\n ...getOwnProperties(value),\n };\n\n if (typeof CustomEvent !== 'undefined' && isInstanceOf(value, CustomEvent)) {\n newObj.detail = value.detail;\n }\n\n return newObj;\n } else {\n return value;\n }\n}\n\n/** Creates a string representation of the target of an `Event` object */\nfunction serializeEventTarget(target: unknown): string {\n try {\n return isElement(target) ? htmlTreeAsString(target) : Object.prototype.toString.call(target);\n } catch (_oO) {\n return '<unknown>';\n }\n}\n\n/** Filters out all but an object's own properties */\nfunction getOwnProperties(obj: unknown): { [key: string]: unknown } {\n if (typeof obj === 'object' && obj !== null) {\n const extractedProps: { [key: string]: unknown } = {};\n for (const property in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, property)) {\n extractedProps[property] = (obj as Record<string, unknown>)[property];\n }\n }\n return extractedProps;\n } else {\n return {};\n }\n}\n\n/**\n * Given any captured exception, extract its keys and create a sorted\n * and truncated list that will be used inside the event message.\n * eg. `Non-error exception captured with keys: foo, bar, baz`\n */\nexport function extractExceptionKeysForMessage(exception: Record<string, unknown>, maxLength: number = 40): string {\n const keys = Object.keys(convertToPlainObject(exception));\n keys.sort();\n\n const firstKey = keys[0];\n\n if (!firstKey) {\n return '[object has no keys]';\n }\n\n if (firstKey.length >= maxLength) {\n return truncate(firstKey, maxLength);\n }\n\n for (let includedKeys = keys.length; includedKeys > 0; includedKeys--) {\n const serialized = keys.slice(0, includedKeys).join(', ');\n if (serialized.length > maxLength) {\n continue;\n }\n if (includedKeys === keys.length) {\n return serialized;\n }\n return truncate(serialized, maxLength);\n }\n\n return '';\n}\n\n/**\n * Given any object, return a new object having removed all fields whose value was `undefined`.\n * Works recursively on objects and arrays.\n *\n * Attention: This function keeps circular references in the returned object.\n */\nexport function dropUndefinedKeys<T>(inputValue: T): T {\n // This map keeps track of what already visited nodes map to.\n // Our Set - based memoBuilder doesn't work here because we want to the output object to have the same circular\n // references as the input object.\n const memoizationMap = new Map<unknown, unknown>();\n\n // This function just proxies `_dropUndefinedKeys` to keep the `memoBuilder` out of this function's API\n return _dropUndefinedKeys(inputValue, memoizationMap);\n}\n\nfunction _dropUndefinedKeys<T>(inputValue: T, memoizationMap: Map<unknown, unknown>): T {\n // Early return for primitive values\n if (inputValue === null || typeof inputValue !== 'object') {\n return inputValue;\n }\n\n // Check memo map first for all object types\n const memoVal = memoizationMap.get(inputValue);\n if (memoVal !== undefined) {\n return memoVal as T;\n }\n\n // handle arrays\n if (Array.isArray(inputValue)) {\n const returnValue: unknown[] = [];\n // Store mapping to handle circular references\n memoizationMap.set(inputValue, returnValue);\n\n inputValue.forEach(value => {\n returnValue.push(_dropUndefinedKeys(value, memoizationMap));\n });\n\n return returnValue as unknown as T;\n }\n\n if (isPojo(inputValue)) {\n const returnValue: { [key: string]: unknown } = {};\n // Store mapping to handle circular references\n memoizationMap.set(inputValue, returnValue);\n\n const keys = Object.keys(inputValue);\n\n keys.forEach(key => {\n const val = inputValue[key];\n if (val !== undefined) {\n returnValue[key] = _dropUndefinedKeys(val, memoizationMap);\n }\n });\n\n return returnValue as T;\n }\n\n // For other object types, return as is\n return inputValue;\n}\n\nfunction isPojo(input: unknown): input is Record<string, unknown> {\n // Plain objects have Object as constructor or no constructor\n const constructor = (input as object).constructor;\n return constructor === Object || constructor === undefined;\n}\n\n/**\n * Ensure that something is an object.\n *\n * Turns `undefined` and `null` into `String`s and all other primitives into instances of their respective wrapper\n * classes (String, Boolean, Number, etc.). Acts as the identity function on non-primitives.\n *\n * @param wat The subject of the objectification\n * @returns A version of `wat` which can safely be used with `Object` class methods\n */\nexport function objectify(wat: unknown): typeof Object {\n let objectified;\n switch (true) {\n // this will catch both undefined and null\n case wat == undefined:\n objectified = new String(wat);\n break;\n\n // Though symbols and bigints do have wrapper classes (`Symbol` and `BigInt`, respectively), for whatever reason\n // those classes don't have constructors which can be used with the `new` keyword. We therefore need to cast each as\n // an object in order to wrap it.\n case typeof wat === 'symbol' || typeof wat === 'bigint':\n objectified = Object(wat);\n break;\n\n // this will catch the remaining primitives: `String`, `Number`, and `Boolean`\n case isPrimitive(wat):\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n objectified = new (wat as any).constructor(wat);\n break;\n\n // by process of elimination, at this point we know that `wat` must already be an object\n default:\n objectified = wat;\n break;\n }\n return objectified;\n}\n","import type { Event, Exception, Mechanism, StackFrame } from '../types-hoist';\n\nimport { addNonEnumerableProperty } from './object';\nimport { snipLine } from './string';\nimport { GLOBAL_OBJ } from './worldwide';\n\ninterface CryptoInternal {\n getRandomValues(array: Uint8Array): Uint8Array;\n randomUUID?(): string;\n}\n\n/** An interface for common properties on global */\ninterface CryptoGlobal {\n msCrypto?: CryptoInternal;\n crypto?: CryptoInternal;\n}\n\nfunction getCrypto(): CryptoInternal | undefined {\n const gbl = GLOBAL_OBJ as typeof GLOBAL_OBJ & CryptoGlobal;\n return gbl.crypto || gbl.msCrypto;\n}\n\n/**\n * UUID4 generator\n * @param crypto Object that provides the crypto API.\n * @returns string Generated UUID4.\n */\nexport function uuid4(crypto = getCrypto()): string {\n let getRandomByte = (): number => Math.random() * 16;\n try {\n if (crypto?.randomUUID) {\n return crypto.randomUUID().replace(/-/g, '');\n }\n if (crypto?.getRandomValues) {\n getRandomByte = () => {\n // crypto.getRandomValues might return undefined instead of the typed array\n // in old Chromium versions (e.g. 23.0.1235.0 (151422))\n // However, `typedArray` is still filled in-place.\n // @see https://developer.mozilla.org/en-US/docs/Web/API/Crypto/getRandomValues#typedarray\n const typedArray = new Uint8Array(1);\n crypto.getRandomValues(typedArray);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return typedArray[0]!;\n };\n }\n } catch (_) {\n // some runtimes can crash invoking crypto\n // https://github.com/getsentry/sentry-javascript/issues/8935\n }\n\n // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523\n // Concatenating the following numbers as strings results in '10000000100040008000100000000000'\n return (([1e7] as unknown as string) + 1e3 + 4e3 + 8e3 + 1e11).replace(/[018]/g, c =>\n // eslint-disable-next-line no-bitwise\n ((c as unknown as number) ^ ((getRandomByte() & 15) >> ((c as unknown as number) / 4))).toString(16),\n );\n}\n\nfunction getFirstException(event: Event): Exception | undefined {\n return event.exception?.values?.[0];\n}\n\n/**\n * Extracts either message or type+value from an event that can be used for user-facing logs\n * @returns event's description\n */\nexport function getEventDescription(event: Event): string {\n const { message, event_id: eventId } = event;\n if (message) {\n return message;\n }\n\n const firstException = getFirstException(event);\n if (firstException) {\n if (firstException.type && firstException.value) {\n return `${firstException.type}: ${firstException.value}`;\n }\n return firstException.type || firstException.value || eventId || '<unknown>';\n }\n return eventId || '<unknown>';\n}\n\n/**\n * Adds exception values, type and value to an synthetic Exception.\n * @param event The event to modify.\n * @param value Value of the exception.\n * @param type Type of the exception.\n * @hidden\n */\nexport function addExceptionTypeValue(event: Event, value?: string, type?: string): void {\n const exception = (event.exception = event.exception || {});\n const values = (exception.values = exception.values || []);\n const firstException = (values[0] = values[0] || {});\n if (!firstException.value) {\n firstException.value = value || '';\n }\n if (!firstException.type) {\n firstException.type = type || 'Error';\n }\n}\n\n/**\n * Adds exception mechanism data to a given event. Uses defaults if the second parameter is not passed.\n *\n * @param event The event to modify.\n * @param newMechanism Mechanism data to add to the event.\n * @hidden\n */\nexport function addExceptionMechanism(event: Event, newMechanism?: Partial<Mechanism>): void {\n const firstException = getFirstException(event);\n if (!firstException) {\n return;\n }\n\n const defaultMechanism = { type: 'generic', handled: true };\n const currentMechanism = firstException.mechanism;\n firstException.mechanism = { ...defaultMechanism, ...currentMechanism, ...newMechanism };\n\n if (newMechanism && 'data' in newMechanism) {\n const mergedData = { ...currentMechanism?.data, ...newMechanism.data };\n firstException.mechanism.data = mergedData;\n }\n}\n\n// https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string\nconst SEMVER_REGEXP =\n /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$/;\n\n/**\n * Represents Semantic Versioning object\n */\ninterface SemVer {\n major?: number;\n minor?: number;\n patch?: number;\n prerelease?: string;\n buildmetadata?: string;\n}\n\nfunction _parseInt(input: string | undefined): number {\n return parseInt(input || '', 10);\n}\n\n/**\n * Parses input into a SemVer interface\n * @param input string representation of a semver version\n */\nexport function parseSemver(input: string): SemVer {\n const match = input.match(SEMVER_REGEXP) || [];\n const major = _parseInt(match[1]);\n const minor = _parseInt(match[2]);\n const patch = _parseInt(match[3]);\n return {\n buildmetadata: match[5],\n major: isNaN(major) ? undefined : major,\n minor: isNaN(minor) ? undefined : minor,\n patch: isNaN(patch) ? undefined : patch,\n prerelease: match[4],\n };\n}\n\n/**\n * This function adds context (pre/post/line) lines to the provided frame\n *\n * @param lines string[] containing all lines\n * @param frame StackFrame that will be mutated\n * @param linesOfContext number of context lines we want to add pre/post\n */\nexport function addContextToFrame(lines: string[], frame: StackFrame, linesOfContext: number = 5): void {\n // When there is no line number in the frame, attaching context is nonsensical and will even break grouping\n if (frame.lineno === undefined) {\n return;\n }\n\n const maxLines = lines.length;\n const sourceLine = Math.max(Math.min(maxLines - 1, frame.lineno - 1), 0);\n\n frame.pre_context = lines\n .slice(Math.max(0, sourceLine - linesOfContext), sourceLine)\n .map((line: string) => snipLine(line, 0));\n\n // We guard here to ensure this is not larger than the existing number of lines\n const lineIndex = Math.min(maxLines - 1, sourceLine);\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n frame.context_line = snipLine(lines[lineIndex]!, frame.colno || 0);\n\n frame.post_context = lines\n .slice(Math.min(sourceLine + 1, maxLines), sourceLine + 1 + linesOfContext)\n .map((line: string) => snipLine(line, 0));\n}\n\n/**\n * Checks whether or not we've already captured the given exception (note: not an identical exception - the very object\n * in question), and marks it captured if not.\n *\n * This is useful because it's possible for an error to get captured by more than one mechanism. After we intercept and\n * record an error, we rethrow it (assuming we've intercepted it before it's reached the top-level global handlers), so\n * that we don't interfere with whatever effects the error might have had were the SDK not there. At that point, because\n * the error has been rethrown, it's possible for it to bubble up to some other code we've instrumented. If it's not\n * caught after that, it will bubble all the way up to the global handlers (which of course we also instrument). This\n * function helps us ensure that even if we encounter the same error more than once, we only record it the first time we\n * see it.\n *\n * Note: It will ignore primitives (always return `false` and not mark them as seen), as properties can't be set on\n * them. {@link: Object.objectify} can be used on exceptions to convert any that are primitives into their equivalent\n * object wrapper forms so that this check will always work. However, because we need to flag the exact object which\n * will get rethrown, and because that rethrowing happens outside of the event processing pipeline, the objectification\n * must be done before the exception captured.\n *\n * @param A thrown exception to check or flag as having been seen\n * @returns `true` if the exception has already been captured, `false` if not (with the side effect of marking it seen)\n */\nexport function checkOrSetAlreadyCaught(exception: unknown): boolean {\n if (isAlreadyCaptured(exception)) {\n return true;\n }\n\n try {\n // set it this way rather than by assignment so that it's not ennumerable and therefore isn't recorded by the\n // `ExtraErrorData` integration\n addNonEnumerableProperty(exception as { [key: string]: unknown }, '__sentry_captured__', true);\n } catch (err) {\n // `exception` is a primitive, so we can't mark it seen\n }\n\n return false;\n}\n\nfunction isAlreadyCaptured(exception: unknown): boolean | void {\n try {\n return (exception as { __sentry_captured__?: boolean }).__sentry_captured__;\n } catch {} // eslint-disable-line no-empty\n}\n","import type { SerializedSession, Session, SessionContext, SessionStatus } from './types-hoist';\nimport { timestampInSeconds, uuid4 } from './utils-hoist';\n\n/**\n * Creates a new `Session` object by setting certain default parameters. If optional @param context\n * is passed, the passed properties are applied to the session object.\n *\n * @param context (optional) additional properties to be applied to the returned session object\n *\n * @returns a new `Session` object\n */\nexport function makeSession(context?: Omit<SessionContext, 'started' | 'status'>): Session {\n // Both timestamp and started are in seconds since the UNIX epoch.\n const startingTime = timestampInSeconds();\n\n const session: Session = {\n sid: uuid4(),\n init: true,\n timestamp: startingTime,\n started: startingTime,\n duration: 0,\n status: 'ok',\n errors: 0,\n ignoreDuration: false,\n toJSON: () => sessionToJSON(session),\n };\n\n if (context) {\n updateSession(session, context);\n }\n\n return session;\n}\n\n/**\n * Updates a session object with the properties passed in the context.\n *\n * Note that this function mutates the passed object and returns void.\n * (Had to do this instead of returning a new and updated session because closing and sending a session\n * makes an update to the session after it was passed to the sending logic.\n * @see Client.captureSession )\n *\n * @param session the `Session` to update\n * @param context the `SessionContext` holding the properties that should be updated in @param session\n */\n// eslint-disable-next-line complexity\nexport function updateSession(session: Session, context: SessionContext = {}): void {\n if (context.user) {\n if (!session.ipAddress && context.user.ip_address) {\n session.ipAddress = context.user.ip_address;\n }\n\n if (!session.did && !context.did) {\n session.did = context.user.id || context.user.email || context.user.username;\n }\n }\n\n session.timestamp = context.timestamp || timestampInSeconds();\n\n if (context.abnormal_mechanism) {\n session.abnormal_mechanism = context.abnormal_mechanism;\n }\n\n if (context.ignoreDuration) {\n session.ignoreDuration = context.ignoreDuration;\n }\n if (context.sid) {\n // Good enough uuid validation. — Kamil\n session.sid = context.sid.length === 32 ? context.sid : uuid4();\n }\n if (context.init !== undefined) {\n session.init = context.init;\n }\n if (!session.did && context.did) {\n session.did = `${context.did}`;\n }\n if (typeof context.started === 'number') {\n session.started = context.started;\n }\n if (session.ignoreDuration) {\n session.duration = undefined;\n } else if (typeof context.duration === 'number') {\n session.duration = context.duration;\n } else {\n const duration = session.timestamp - session.started;\n session.duration = duration >= 0 ? duration : 0;\n }\n if (context.release) {\n session.release = context.release;\n }\n if (context.environment) {\n session.environment = context.environment;\n }\n if (!session.ipAddress && context.ipAddress) {\n session.ipAddress = context.ipAddress;\n }\n if (!session.userAgent && context.userAgent) {\n session.userAgent = context.userAgent;\n }\n if (typeof context.errors === 'number') {\n session.errors = context.errors;\n }\n if (context.status) {\n session.status = context.status;\n }\n}\n\n/**\n * Closes a session by setting its status and updating the session object with it.\n * Internally calls `updateSession` to update the passed session object.\n *\n * Note that this function mutates the passed session (@see updateSession for explanation).\n *\n * @param session the `Session` object to be closed\n * @param status the `SessionStatus` with which the session was closed. If you don't pass a status,\n * this function will keep the previously set status, unless it was `'ok'` in which case\n * it is changed to `'exited'`.\n */\nexport function closeSession(session: Session, status?: Exclude<SessionStatus, 'ok'>): void {\n let context = {};\n if (status) {\n context = { status };\n } else if (session.status === 'ok') {\n context = { status: 'exited' };\n }\n\n updateSession(session, context);\n}\n\n/**\n * Serializes a passed session object to a JSON object with a slightly different structure.\n * This is necessary because the Sentry backend requires a slightly different schema of a session\n * than the one the JS SDKs use internally.\n *\n * @param session the session to be converted\n *\n * @returns a JSON object of the passed session\n */\nfunction sessionToJSON(session: Session): SerializedSession {\n return {\n sid: `${session.sid}`,\n init: session.init,\n // Make sure that sec is converted to ms for date constructor\n started: new Date(session.started * 1000).toISOString(),\n timestamp: new Date(session.timestamp * 1000).toISOString(),\n status: session.status,\n errors: session.errors,\n did: typeof session.did === 'number' || typeof session.did === 'string' ? `${session.did}` : undefined,\n duration: session.duration,\n abnormal_mechanism: session.abnormal_mechanism,\n attrs: {\n release: session.release,\n environment: session.environment,\n ip_address: session.ipAddress,\n user_agent: session.userAgent,\n },\n };\n}\n","import { uuid4 } from './misc';\n\n/**\n * Generate a random, valid trace ID.\n */\nexport function generateTraceId(): string {\n return uuid4();\n}\n\n/**\n * Generate a random, valid span ID.\n */\nexport function generateSpanId(): string {\n return uuid4().substring(16);\n}\n","/**\n * Shallow merge two objects.\n * Does not mutate the passed in objects.\n * Undefined/empty values in the merge object will overwrite existing values.\n *\n * By default, this merges 2 levels deep.\n */\nexport function merge<T>(initialObj: T, mergeObj: T, levels = 2): T {\n // If the merge value is not an object, or we have no merge levels left,\n // we just set the value to the merge value\n if (!mergeObj || typeof mergeObj !== 'object' || levels <= 0) {\n return mergeObj;\n }\n\n // If the merge object is an empty object, and the initial object is not undefined, we return the initial object\n if (initialObj && Object.keys(mergeObj).length === 0) {\n return initialObj;\n }\n\n // Clone object\n const output = { ...initialObj };\n\n // Merge values into output, resursively\n for (const key in mergeObj) {\n if (Object.prototype.hasOwnProperty.call(mergeObj, key)) {\n output[key] = merge(output[key], mergeObj[key], levels - 1);\n }\n }\n\n return output;\n}\n","import type { Scope } from '../scope';\nimport type { Span } from '../types-hoist';\nimport { addNonEnumerableProperty } from '../utils-hoist/object';\n\nconst SCOPE_SPAN_FIELD = '_sentrySpan';\n\ntype ScopeWithMaybeSpan = Scope & {\n [SCOPE_SPAN_FIELD]?: Span;\n};\n\n/**\n * Set the active span for a given scope.\n * NOTE: This should NOT be used directly, but is only used internally by the trace methods.\n */\nexport function _setSpanForScope(scope: Scope, span: Span | undefined): void {\n if (span) {\n addNonEnumerableProperty(scope as ScopeWithMaybeSpan, SCOPE_SPAN_FIELD, span);\n } else {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete (scope as ScopeWithMaybeSpan)[SCOPE_SPAN_FIELD];\n }\n}\n\n/**\n * Get the active span for a given scope.\n * NOTE: This should NOT be used directly, but is only used internally by the trace methods.\n */\nexport function _getSpanForScope(scope: ScopeWithMaybeSpan): Span | undefined {\n return scope[SCOPE_SPAN_FIELD];\n}\n","/* eslint-disable max-lines */\nimport type { Client } from './client';\nimport { updateSession } from './session';\nimport type {\n Attachment,\n Breadcrumb,\n Context,\n Contexts,\n DynamicSamplingContext,\n Event,\n EventHint,\n EventProcessor,\n Extra,\n Extras,\n Primitive,\n PropagationContext,\n RequestEventData,\n Session,\n SeverityLevel,\n Span,\n User,\n} from './types-hoist';\nimport { isPlainObject } from './utils-hoist/is';\nimport { logger } from './utils-hoist/logger';\nimport { uuid4 } from './utils-hoist/misc';\nimport { generateTraceId } from './utils-hoist/propagationContext';\nimport { dateTimestampInSeconds } from './utils-hoist/time';\nimport { merge } from './utils/merge';\nimport { _getSpanForScope, _setSpanForScope } from './utils/spanOnScope';\n\n/**\n * Default value for maximum number of breadcrumbs added to an event.\n */\nconst DEFAULT_MAX_BREADCRUMBS = 100;\n\n/**\n * A context to be used for capturing an event.\n * This can either be a Scope, or a partial ScopeContext,\n * or a callback that receives the current scope and returns a new scope to use.\n */\nexport type CaptureContext = Scope | Partial<ScopeContext> | ((scope: Scope) => Scope);\n\n/**\n * Data that can be converted to a Scope.\n */\nexport interface ScopeContext {\n user: User;\n level: SeverityLevel;\n extra: Extras;\n contexts: Contexts;\n tags: { [key: string]: Primitive };\n fingerprint: string[];\n propagationContext: PropagationContext;\n}\n\nexport interface SdkProcessingMetadata {\n [key: string]: unknown;\n requestSession?: {\n status: 'ok' | 'errored' | 'crashed';\n };\n normalizedRequest?: RequestEventData;\n dynamicSamplingContext?: Partial<DynamicSamplingContext>;\n capturedSpanScope?: Scope;\n capturedSpanIsolationScope?: Scope;\n spanCountBeforeProcessing?: number;\n ipAddress?: string;\n}\n\n/**\n * Normalized data of the Scope, ready to be used.\n */\nexport interface ScopeData {\n eventProcessors: EventProcessor[];\n breadcrumbs: Breadcrumb[];\n user: User;\n tags: { [key: string]: Primitive };\n extra: Extras;\n contexts: Contexts;\n attachments: Attachment[];\n propagationContext: PropagationContext;\n sdkProcessingMetadata: SdkProcessingMetadata;\n fingerprint: string[];\n level?: SeverityLevel;\n transactionName?: string;\n span?: Span;\n}\n\n/**\n * Holds additional event information.\n */\nexport class Scope {\n /** Flag if notifying is happening. */\n protected _notifyingListeners: boolean;\n\n /** Callback for client to receive scope changes. */\n protected _scopeListeners: Array<(scope: Scope) => void>;\n\n /** Callback list that will be called during event processing. */\n protected _eventProcessors: EventProcessor[];\n\n /** Array of breadcrumbs. */\n protected _breadcrumbs: Breadcrumb[];\n\n /** User */\n protected _user: User;\n\n /** Tags */\n protected _tags: { [key: string]: Primitive };\n\n /** Extra */\n protected _extra: Extras;\n\n /** Contexts */\n protected _contexts: Contexts;\n\n /** Attachments */\n protected _attachments: Attachment[];\n\n /** Propagation Context for distributed tracing */\n protected _propagationContext: PropagationContext;\n\n /**\n * A place to stash data which is needed at some point in the SDK's event processing pipeline but which shouldn't get\n * sent to Sentry\n */\n protected _sdkProcessingMetadata: SdkProcessingMetadata;\n\n /** Fingerprint */\n protected _fingerprint?: string[];\n\n /** Severity */\n protected _level?: SeverityLevel;\n\n /**\n * Transaction Name\n *\n * IMPORTANT: The transaction name on the scope has nothing to do with root spans/transaction objects.\n * It's purpose is to assign a transaction to the scope that's added to non-transaction events.\n */\n protected _transactionName?: string;\n\n /** Session */\n protected _session?: Session;\n\n /** The client on this scope */\n protected _client?: Client;\n\n /** Contains the last event id of a captured event. */\n protected _lastEventId?: string;\n\n // NOTE: Any field which gets added here should get added not only to the constructor but also to the `clone` method.\n\n public constructor() {\n this._notifyingListeners = false;\n this._scopeListeners = [];\n this._eventProcessors = [];\n this._breadcrumbs = [];\n this._attachments = [];\n this._user = {};\n this._tags = {};\n this._extra = {};\n this._contexts = {};\n this._sdkProcessingMetadata = {};\n this._propagationContext = {\n traceId: generateTraceId(),\n sampleRand: Math.random(),\n };\n }\n\n /**\n * Clone all data from this scope into a new scope.\n */\n public clone(): Scope {\n const newScope = new Scope();\n newScope._breadcrumbs = [...this._breadcrumbs];\n newScope._tags = { ...this._tags };\n newScope._extra = { ...this._extra };\n newScope._contexts = { ...this._contexts };\n if (this._contexts.flags) {\n // We need to copy the `values` array so insertions on a cloned scope\n // won't affect the original array.\n newScope._contexts.flags = {\n values: [...this._contexts.flags.values],\n };\n }\n\n newScope._user = this._user;\n newScope._level = this._level;\n newScope._session = this._session;\n newScope._transactionName = this._transactionName;\n newScope._fingerprint = this._fingerprint;\n newScope._eventProcessors = [...this._eventProcessors];\n newScope._attachments = [...this._attachments];\n newScope._sdkProcessingMetadata = { ...this._sdkProcessingMetadata };\n newScope._propagationContext = { ...this._propagationContext };\n newScope._client = this._client;\n newScope._lastEventId = this._lastEventId;\n\n _setSpanForScope(newScope, _getSpanForScope(this));\n\n return newScope;\n }\n\n /**\n * Update the client assigned to this scope.\n * Note that not every scope will have a client assigned - isolation scopes & the global scope will generally not have a client,\n * as well as manually created scopes.\n */\n public setClient(client: Client | undefined): void {\n this._client = client;\n }\n\n /**\n * Set the ID of the last captured error event.\n * This is generally only captured on the isolation scope.\n */\n public setLastEventId(lastEventId: string | undefined): void {\n this._lastEventId = lastEventId;\n }\n\n /**\n * Get the client assigned to this scope.\n */\n public getClient<C extends Client>(): C | undefined {\n return this._client as C | undefined;\n }\n\n /**\n * Get the ID of the last captured error event.\n * This is generally only available on the isolation scope.\n */\n public lastEventId(): string | undefined {\n return this._lastEventId;\n }\n\n /**\n * @inheritDoc\n */\n public addScopeListener(callback: (scope: Scope) => void): void {\n this._scopeListeners.push(callback);\n }\n\n /**\n * Add an event processor that will be called before an event is sent.\n */\n public addEventProcessor(callback: EventProcessor): this {\n this._eventProcessors.push(callback);\n return this;\n }\n\n /**\n * Set the user for this scope.\n * Set to `null` to unset the user.\n */\n public setUser(user: User | null): this {\n // If null is passed we want to unset everything, but still define keys,\n // so that later down in the pipeline any existing values are cleared.\n this._user = user || {\n email: undefined,\n id: undefined,\n ip_address: undefined,\n username: undefined,\n };\n\n if (this._session) {\n updateSession(this._session, { user });\n }\n\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * Get the user from this scope.\n */\n public getUser(): User | undefined {\n return this._user;\n }\n\n /**\n * Set an object that will be merged into existing tags on the scope,\n * and will be sent as tags data with the event.\n */\n public setTags(tags: { [key: string]: Primitive }): this {\n this._tags = {\n ...this._tags,\n ...tags,\n };\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * Set a single tag that will be sent as tags data with the event.\n */\n public setTag(key: string, value: Primitive): this {\n this._tags = { ...this._tags, [key]: value };\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * Set an object that will be merged into existing extra on the scope,\n * and will be sent as extra data with the event.\n */\n public setExtras(extras: Extras): this {\n this._extra = {\n ...this._extra,\n ...extras,\n };\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * Set a single key:value extra entry that will be sent as extra data with the event.\n */\n public setExtra(key: string, extra: Extra): this {\n this._extra = { ...this._extra, [key]: extra };\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * Sets the fingerprint on the scope to send with the events.\n * @param {string[]} fingerprint Fingerprint to group events in Sentry.\n */\n public setFingerprint(fingerprint: string[]): this {\n this._fingerprint = fingerprint;\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * Sets the level on the scope for future events.\n */\n public setLevel(level: SeverityLevel): this {\n this._level = level;\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * Sets the transaction name on the scope so that the name of e.g. taken server route or\n * the page location is attached to future events.\n *\n * IMPORTANT: Calling this function does NOT change the name of the currently active\n * root span. If you want to change the name of the active root span, use\n * `Sentry.updateSpanName(rootSpan, 'new name')` instead.\n *\n * By default, the SDK updates the scope's transaction name automatically on sensible\n * occasions, such as a page navigation or when handling a new request on the server.\n */\n public setTransactionName(name?: string): this {\n this._transactionName = name;\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * Sets context data with the given name.\n * Data passed as context will be normalized. You can also pass `null` to unset the context.\n * Note that context data will not be merged - calling `setContext` will overwrite an existing context with the same key.\n */\n public setContext(key: string, context: Context | null): this {\n if (context === null) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete this._contexts[key];\n } else {\n this._contexts[key] = context;\n }\n\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * Set the session for the scope.\n */\n public setSession(session?: Session): this {\n if (!session) {\n delete this._session;\n } else {\n this._session = session;\n }\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * Get the session from the scope.\n */\n public getSession(): Session | undefined {\n return this._session;\n }\n\n /**\n * Updates the scope with provided data. Can work in three variations:\n * - plain object containing updatable attributes\n * - Scope instance that'll extract the attributes from\n * - callback function that'll receive the current scope as an argument and allow for modifications\n */\n public update(captureContext?: CaptureContext): this {\n if (!captureContext) {\n return this;\n }\n\n const scopeToMerge = typeof captureContext === 'function' ? captureContext(this) : captureContext;\n\n const scopeInstance =\n scopeToMerge instanceof Scope\n ? scopeToMerge.getScopeData()\n : isPlainObject(scopeToMerge)\n ? (captureContext as ScopeContext)\n : undefined;\n\n const { tags, extra, user, contexts, level, fingerprint = [], propagationContext } = scopeInstance || {};\n\n this._tags = { ...this._tags, ...tags };\n this._extra = { ...this._extra, ...extra };\n this._contexts = { ...this._contexts, ...contexts };\n\n if (user && Object.keys(user).length) {\n this._user = user;\n }\n\n if (level) {\n this._level = level;\n }\n\n if (fingerprint.length) {\n this._fingerprint = fingerprint;\n }\n\n if (propagationContext) {\n this._propagationContext = propagationContext;\n }\n\n return this;\n }\n\n /**\n * Clears the current scope and resets its properties.\n * Note: The client will not be cleared.\n */\n public clear(): this {\n // client is not cleared here on purpose!\n this._breadcrumbs = [];\n this._tags = {};\n this._extra = {};\n this._user = {};\n this._contexts = {};\n this._level = undefined;\n this._transactionName = undefined;\n this._fingerprint = undefined;\n this._session = undefined;\n _setSpanForScope(this, undefined);\n this._attachments = [];\n this.setPropagationContext({ traceId: generateTraceId(), sampleRand: Math.random() });\n\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * Adds a breadcrumb to the scope.\n * By default, the last 100 breadcrumbs are kept.\n */\n public addBreadcrumb(breadcrumb: Breadcrumb, maxBreadcrumbs?: number): this {\n const maxCrumbs = typeof maxBreadcrumbs === 'number' ? maxBreadcrumbs : DEFAULT_MAX_BREADCRUMBS;\n\n // No data has been changed, so don't notify scope listeners\n if (maxCrumbs <= 0) {\n return this;\n }\n\n const mergedBreadcrumb = {\n timestamp: dateTimestampInSeconds(),\n ...breadcrumb,\n };\n\n this._breadcrumbs.push(mergedBreadcrumb);\n if (this._breadcrumbs.length > maxCrumbs) {\n this._breadcrumbs = this._breadcrumbs.slice(-maxCrumbs);\n this._client?.recordDroppedEvent('buffer_overflow', 'log_item');\n }\n\n this._notifyScopeListeners();\n\n return this;\n }\n\n /**\n * Get the last breadcrumb of the scope.\n */\n public getLastBreadcrumb(): Breadcrumb | undefined {\n return this._breadcrumbs[this._breadcrumbs.length - 1];\n }\n\n /**\n * Clear all breadcrumbs from the scope.\n */\n public clearBreadcrumbs(): this {\n this._breadcrumbs = [];\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * Add an attachment to the scope.\n */\n public addAttachment(attachment: Attachment): this {\n this._attachments.push(attachment);\n return this;\n }\n\n /**\n * Clear all attachments from the scope.\n */\n public clearAttachments(): this {\n this._attachments = [];\n return this;\n }\n\n /**\n * Get the data of this scope, which should be applied to an event during processing.\n */\n public getScopeData(): ScopeData {\n return {\n breadcrumbs: this._breadcrumbs,\n attachments: this._attachments,\n contexts: this._contexts,\n tags: this._tags,\n extra: this._extra,\n user: this._user,\n level: this._level,\n fingerprint: this._fingerprint || [],\n eventProcessors: this._eventProcessors,\n propagationContext: this._propagationContext,\n sdkProcessingMetadata: this._sdkProcessingMetadata,\n transactionName: this._transactionName,\n span: _getSpanForScope(this),\n };\n }\n\n /**\n * Add data which will be accessible during event processing but won't get sent to Sentry.\n */\n public setSDKProcessingMetadata(newData: SdkProcessingMetadata): this {\n this._sdkProcessingMetadata = merge(this._sdkProcessingMetadata, newData, 2);\n return this;\n }\n\n /**\n * Add propagation context to the scope, used for distributed tracing\n */\n public setPropagationContext(context: PropagationContext): this {\n this._propagationContext = context;\n return this;\n }\n\n /**\n * Get propagation context from the scope, used for distributed tracing\n */\n public getPropagationContext(): PropagationContext {\n return this._propagationContext;\n }\n\n /**\n * Capture an exception for this scope.\n *\n * @returns {string} The id of the captured Sentry event.\n */\n public captureException(exception: unknown, hint?: EventHint): string {\n const eventId = hint?.event_id || uuid4();\n\n if (!this._client) {\n logger.warn('No client configured on scope - will not capture exception!');\n return eventId;\n }\n\n const syntheticException = new Error('Sentry syntheticException');\n\n this._client.captureException(\n exception,\n {\n originalException: exception,\n syntheticException,\n ...hint,\n event_id: eventId,\n },\n this,\n );\n\n return eventId;\n }\n\n /**\n * Capture a message for this scope.\n *\n * @returns {string} The id of the captured message.\n */\n public captureMessage(message: string, level?: SeverityLevel, hint?: EventHint): string {\n const eventId = hint?.event_id || uuid4();\n\n if (!this._client) {\n logger.warn('No client configured on scope - will not capture message!');\n return eventId;\n }\n\n const syntheticException = new Error(message);\n\n this._client.captureMessage(\n message,\n level,\n {\n originalException: message,\n syntheticException,\n ...hint,\n event_id: eventId,\n },\n this,\n );\n\n return eventId;\n }\n\n /**\n * Capture a Sentry event for this scope.\n *\n * @returns {string} The id of the captured event.\n */\n public captureEvent(event: Event, hint?: EventHint): string {\n const eventId = hint?.event_id || uuid4();\n\n if (!this._client) {\n logger.warn('No client configured on scope - will not capture event!');\n return eventId;\n }\n\n this._client.captureEvent(event, { ...hint, event_id: eventId }, this);\n\n return eventId;\n }\n\n /**\n * This will be called on every set call.\n */\n protected _notifyScopeListeners(): void {\n // We need this check for this._notifyingListeners to be able to work on scope during updates\n // If this check is not here we'll produce endless recursion when something is done with the scope\n // during the callback.\n if (!this._notifyingListeners) {\n this._notifyingListeners = true;\n this._scopeListeners.forEach(callback => {\n callback(this);\n });\n this._notifyingListeners = false;\n }\n }\n}\n","import type { Client } from '../client';\nimport { getDefaultCurrentScope, getDefaultIsolationScope } from '../defaultScopes';\nimport { Scope } from '../scope';\nimport { isThenable } from '../utils-hoist/is';\nimport { getMainCarrier, getSentryCarrier } from './../carrier';\nimport type { AsyncContextStrategy } from './types';\n\ninterface Layer {\n client?: Client;\n scope: Scope;\n}\n\n/**\n * This is an object that holds a stack of scopes.\n */\nexport class AsyncContextStack {\n private readonly _stack: [Layer, ...Layer[]];\n private _isolationScope: Scope;\n\n public constructor(scope?: Scope, isolationScope?: Scope) {\n let assignedScope;\n if (!scope) {\n assignedScope = new Scope();\n } else {\n assignedScope = scope;\n }\n\n let assignedIsolationScope;\n if (!isolationScope) {\n assignedIsolationScope = new Scope();\n } else {\n assignedIsolationScope = isolationScope;\n }\n\n // scope stack for domains or the process\n this._stack = [{ scope: assignedScope }];\n this._isolationScope = assignedIsolationScope;\n }\n\n /**\n * Fork a scope for the stack.\n */\n public withScope<T>(callback: (scope: Scope) => T): T {\n const scope = this._pushScope();\n\n let maybePromiseResult: T;\n try {\n maybePromiseResult = callback(scope);\n } catch (e) {\n this._popScope();\n throw e;\n }\n\n if (isThenable(maybePromiseResult)) {\n // @ts-expect-error - isThenable returns the wrong type\n return maybePromiseResult.then(\n res => {\n this._popScope();\n return res;\n },\n e => {\n this._popScope();\n throw e;\n },\n );\n }\n\n this._popScope();\n return maybePromiseResult;\n }\n\n /**\n * Get the client of the stack.\n */\n public getClient<C extends Client>(): C | undefined {\n return this.getStackTop().client as C;\n }\n\n /**\n * Returns the scope of the top stack.\n */\n public getScope(): Scope {\n return this.getStackTop().scope;\n }\n\n /**\n * Get the isolation scope for the stack.\n */\n public getIsolationScope(): Scope {\n return this._isolationScope;\n }\n\n /**\n * Returns the topmost scope layer in the order domain > local > process.\n */\n public getStackTop(): Layer {\n return this._stack[this._stack.length - 1] as Layer;\n }\n\n /**\n * Push a scope to the stack.\n */\n private _pushScope(): Scope {\n // We want to clone the content of prev scope\n const scope = this.getScope().clone();\n this._stack.push({\n client: this.getClient(),\n scope,\n });\n return scope;\n }\n\n /**\n * Pop a scope from the stack.\n */\n private _popScope(): boolean {\n if (this._stack.length <= 1) return false;\n return !!this._stack.pop();\n }\n}\n\n/**\n * Get the global async context stack.\n * This will be removed during the v8 cycle and is only here to make migration easier.\n */\nfunction getAsyncContextStack(): AsyncContextStack {\n const registry = getMainCarrier();\n const sentry = getSentryCarrier(registry);\n\n return (sentry.stack = sentry.stack || new AsyncContextStack(getDefaultCurrentScope(), getDefaultIsolationScope()));\n}\n\nfunction withScope<T>(callback: (scope: Scope) => T): T {\n return getAsyncContextStack().withScope(callback);\n}\n\nfunction withSetScope<T>(scope: Scope, callback: (scope: Scope) => T): T {\n const stack = getAsyncContextStack() as AsyncContextStack;\n return stack.withScope(() => {\n stack.getStackTop().scope = scope;\n return callback(scope);\n });\n}\n\nfunction withIsolationScope<T>(callback: (isolationScope: Scope) => T): T {\n return getAsyncContextStack().withScope(() => {\n return callback(getAsyncContextStack().getIsolationScope());\n });\n}\n\n/**\n * Get the stack-based async context strategy.\n */\nexport function getStackAsyncContextStrategy(): AsyncContextStrategy {\n return {\n withIsolationScope,\n withScope,\n withSetScope,\n withSetIsolationScope: <T>(_isolationScope: Scope, callback: (isolationScope: Scope) => T) => {\n return withIsolationScope(callback);\n },\n getCurrentScope: () => getAsyncContextStack().getScope(),\n getIsolationScope: () => getAsyncContextStack().getIsolationScope(),\n };\n}\n","import { getGlobalSingleton } from './carrier';\nimport { Scope } from './scope';\n\n/** Get the default current scope. */\nexport function getDefaultCurrentScope(): Scope {\n return getGlobalSingleton('defaultCurrentScope', () => new Scope());\n}\n\n/** Get the default isolation scope. */\nexport function getDefaultIsolationScope(): Scope {\n return getGlobalSingleton('defaultIsolationScope', () => new Scope());\n}\n","import type { Carrier } from './../carrier';\nimport { getMainCarrier, getSentryCarrier } from './../carrier';\nimport { getStackAsyncContextStrategy } from './stackStrategy';\nimport type { AsyncContextStrategy } from './types';\n\n/**\n * @private Private API with no semver guarantees!\n *\n * Sets the global async context strategy\n */\nexport function setAsyncContextStrategy(strategy: AsyncContextStrategy | undefined): void {\n // Get main carrier (global for every environment)\n const registry = getMainCarrier();\n const sentry = getSentryCarrier(registry);\n sentry.acs = strategy;\n}\n\n/**\n * Get the current async context strategy.\n * If none has been setup, the default will be used.\n */\nexport function getAsyncContextStrategy(carrier: Carrier): AsyncContextStrategy {\n const sentry = getSentryCarrier(carrier);\n\n if (sentry.acs) {\n return sentry.acs;\n }\n\n // Otherwise, use the default one (stack)\n return getStackAsyncContextStrategy();\n}\n","import { getAsyncContextStrategy } from './asyncContext';\nimport { getGlobalSingleton, getMainCarrier } from './carrier';\nimport type { Client } from './client';\nimport { Scope } from './scope';\nimport type { TraceContext } from './types-hoist';\nimport { generateSpanId } from './utils-hoist';\n\n/**\n * Get the currently active scope.\n */\nexport function getCurrentScope(): Scope {\n const carrier = getMainCarrier();\n const acs = getAsyncContextStrategy(carrier);\n return acs.getCurrentScope();\n}\n\n/**\n * Get the currently active isolation scope.\n * The isolation scope is active for the current execution context.\n */\nexport function getIsolationScope(): Scope {\n const carrier = getMainCarrier();\n const acs = getAsyncContextStrategy(carrier);\n return acs.getIsolationScope();\n}\n\n/**\n * Get the global scope.\n * This scope is applied to _all_ events.\n */\nexport function getGlobalScope(): Scope {\n return getGlobalSingleton('globalScope', () => new Scope());\n}\n\n/**\n * Creates a new scope with and executes the given operation within.\n * The scope is automatically removed once the operation\n * finishes or throws.\n */\nexport function withScope<T>(callback: (scope: Scope) => T): T;\n/**\n * Set the given scope as the active scope in the callback.\n */\nexport function withScope<T>(scope: Scope | undefined, callback: (scope: Scope) => T): T;\n/**\n * Either creates a new active scope, or sets the given scope as active scope in the given callback.\n */\nexport function withScope<T>(\n ...rest: [callback: (scope: Scope) => T] | [scope: Scope | undefined, callback: (scope: Scope) => T]\n): T {\n const carrier = getMainCarrier();\n const acs = getAsyncContextStrategy(carrier);\n\n // If a scope is defined, we want to make this the active scope instead of the default one\n if (rest.length === 2) {\n const [scope, callback] = rest;\n\n if (!scope) {\n return acs.withScope(callback);\n }\n\n return acs.withSetScope(scope, callback);\n }\n\n return acs.withScope(rest[0]);\n}\n\n/**\n * Attempts to fork the current isolation scope and the current scope based on the current async context strategy. If no\n * async context strategy is set, the isolation scope and the current scope will not be forked (this is currently the\n * case, for example, in the browser).\n *\n * Usage of this function in environments without async context strategy is discouraged and may lead to unexpected behaviour.\n *\n * This function is intended for Sentry SDK and SDK integration development. It is not recommended to be used in \"normal\"\n * applications directly because it comes with pitfalls. Use at your own risk!\n */\nexport function withIsolationScope<T>(callback: (isolationScope: Scope) => T): T;\n/**\n * Set the provided isolation scope as active in the given callback. If no\n * async context strategy is set, the isolation scope and the current scope will not be forked (this is currently the\n * case, for example, in the browser).\n *\n * Usage of this function in environments without async context strategy is discouraged and may lead to unexpected behaviour.\n *\n * This function is intended for Sentry SDK and SDK integration development. It is not recommended to be used in \"normal\"\n * applications directly because it comes with pitfalls. Use at your own risk!\n *\n * If you pass in `undefined` as a scope, it will fork a new isolation scope, the same as if no scope is passed.\n */\nexport function withIsolationScope<T>(isolationScope: Scope | undefined, callback: (isolationScope: Scope) => T): T;\n/**\n * Either creates a new active isolation scope, or sets the given isolation scope as active scope in the given callback.\n */\nexport function withIsolationScope<T>(\n ...rest:\n | [callback: (isolationScope: Scope) => T]\n | [isolationScope: Scope | undefined, callback: (isolationScope: Scope) => T]\n): T {\n const carrier = getMainCarrier();\n const acs = getAsyncContextStrategy(carrier);\n\n // If a scope is defined, we want to make this the active scope instead of the default one\n if (rest.length === 2) {\n const [isolationScope, callback] = rest;\n\n if (!isolationScope) {\n return acs.withIsolationScope(callback);\n }\n\n return acs.withSetIsolationScope(isolationScope, callback);\n }\n\n return acs.withIsolationScope(rest[0]);\n}\n\n/**\n * Get the currently active client.\n */\nexport function getClient<C extends Client>(): C | undefined {\n return getCurrentScope().getClient<C>();\n}\n\n/**\n * Get a trace context for the given scope.\n */\nexport function getTraceContextFromScope(scope: Scope): TraceContext {\n const propagationContext = scope.getPropagationContext();\n\n const { traceId, parentSpanId, propagationSpanId } = propagationContext;\n\n const traceContext: TraceContext = {\n trace_id: traceId,\n span_id: propagationSpanId || generateSpanId(),\n };\n\n if (parentSpanId) {\n traceContext.parent_span_id = parentSpanId;\n }\n\n return traceContext;\n}\n","/**\n * Use this attribute to represent the source of a span.\n * Should be one of: custom, url, route, view, component, task, unknown\n *\n */\nexport const SEMANTIC_ATTRIBUTE_SENTRY_SOURCE = 'sentry.source';\n\n/**\n * Attributes that holds the sample rate that was locally applied to a span.\n * If this attribute is not defined, it means that the span inherited a sampling decision.\n *\n * NOTE: Is only defined on root spans.\n */\nexport const SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE = 'sentry.sample_rate';\n\n/**\n * Use this attribute to represent the operation of a span.\n */\nexport const SEMANTIC_ATTRIBUTE_SENTRY_OP = 'sentry.op';\n\n/**\n * Use this attribute to represent the origin of a span.\n */\nexport const SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN = 'sentry.origin';\n\n/** The reason why an idle span finished. */\nexport const SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON = 'sentry.idle_span_finish_reason';\n\n/** The unit of a measurement, which may be stored as a TimedEvent. */\nexport const SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT = 'sentry.measurement_unit';\n\n/** The value of a measurement, which may be stored as a TimedEvent. */\nexport const SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE = 'sentry.measurement_value';\n\n/**\n * A custom span name set by users guaranteed to be taken over any automatically\n * inferred name. This attribute is removed before the span is sent.\n *\n * @internal only meant for internal SDK usage\n * @hidden\n */\nexport const SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME = 'sentry.custom_span_name';\n\n/**\n * The id of the profile that this span occurred in.\n */\nexport const SEMANTIC_ATTRIBUTE_PROFILE_ID = 'sentry.profile_id';\n\nexport const SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME = 'sentry.exclusive_time';\n\nexport const SEMANTIC_ATTRIBUTE_CACHE_HIT = 'cache.hit';\n\nexport const SEMANTIC_ATTRIBUTE_CACHE_KEY = 'cache.key';\n\nexport const SEMANTIC_ATTRIBUTE_CACHE_ITEM_SIZE = 'cache.item_size';\n\n/** TODO: Remove these once we update to latest semantic conventions */\nexport const SEMANTIC_ATTRIBUTE_HTTP_REQUEST_METHOD = 'http.request.method';\nexport const SEMANTIC_ATTRIBUTE_URL_FULL = 'url.full';\n\n/**\n * A span link attribute to mark the link as a special span link.\n *\n * Known values:\n * - `previous_trace`: The span links to the frontend root span of the previous trace.\n * - `next_trace`: The span links to the frontend root span of the next trace. (Not set by the SDK)\n *\n * Other values may be set as appropriate.\n * @see https://develop.sentry.dev/sdk/telemetry/traces/span-links/#link-types\n */\nexport const SEMANTIC_LINK_ATTRIBUTE_LINK_TYPE = 'sentry.link.type';\n","import type { Span, SpanStatus } from '../types-hoist';\n\nexport const SPAN_STATUS_UNSET = 0;\nexport const SPAN_STATUS_OK = 1;\nexport const SPAN_STATUS_ERROR = 2;\n\n/**\n * Converts a HTTP status code into a sentry status with a message.\n *\n * @param httpStatus The HTTP response status code.\n * @returns The span status or unknown_error.\n */\n// https://develop.sentry.dev/sdk/event-payloads/span/\nexport function getSpanStatusFromHttpCode(httpStatus: number): SpanStatus {\n if (httpStatus < 400 && httpStatus >= 100) {\n return { code: SPAN_STATUS_OK };\n }\n\n if (httpStatus >= 400 && httpStatus < 500) {\n switch (httpStatus) {\n case 401:\n return { code: SPAN_STATUS_ERROR, message: 'unauthenticated' };\n case 403:\n return { code: SPAN_STATUS_ERROR, message: 'permission_denied' };\n case 404:\n return { code: SPAN_STATUS_ERROR, message: 'not_found' };\n case 409:\n return { code: SPAN_STATUS_ERROR, message: 'already_exists' };\n case 413:\n return { code: SPAN_STATUS_ERROR, message: 'failed_precondition' };\n case 429:\n return { code: SPAN_STATUS_ERROR, message: 'resource_exhausted' };\n case 499:\n return { code: SPAN_STATUS_ERROR, message: 'cancelled' };\n default:\n return { code: SPAN_STATUS_ERROR, message: 'invalid_argument' };\n }\n }\n\n if (httpStatus >= 500 && httpStatus < 600) {\n switch (httpStatus) {\n case 501:\n return { code: SPAN_STATUS_ERROR, message: 'unimplemented' };\n case 503:\n return { code: SPAN_STATUS_ERROR, message: 'unavailable' };\n case 504:\n return { code: SPAN_STATUS_ERROR, message: 'deadline_exceeded' };\n default:\n return { code: SPAN_STATUS_ERROR, message: 'internal_error' };\n }\n }\n\n return { code: SPAN_STATUS_ERROR, message: 'unknown_error' };\n}\n\n/**\n * Sets the Http status attributes on the current span based on the http code.\n * Additionally, the span's status is updated, depending on the http code.\n */\nexport function setHttpStatus(span: Span, httpStatus: number): void {\n span.setAttribute('http.response.status_code', httpStatus);\n\n const spanStatus = getSpanStatusFromHttpCode(httpStatus);\n if (spanStatus.message !== 'unknown_error') {\n span.setStatus(spanStatus);\n }\n}\n","import type { Scope } from '../scope';\nimport type { Span } from '../types-hoist';\nimport { addNonEnumerableProperty } from '../utils-hoist/object';\n\nconst SCOPE_ON_START_SPAN_FIELD = '_sentryScope';\nconst ISOLATION_SCOPE_ON_START_SPAN_FIELD = '_sentryIsolationScope';\n\ntype SpanWithScopes = Span & {\n [SCOPE_ON_START_SPAN_FIELD]?: Scope;\n [ISOLATION_SCOPE_ON_START_SPAN_FIELD]?: Scope;\n};\n\n/** Store the scope & isolation scope for a span, which can the be used when it is finished. */\nexport function setCapturedScopesOnSpan(span: Span | undefined, scope: Scope, isolationScope: Scope): void {\n if (span) {\n addNonEnumerableProperty(span, ISOLATION_SCOPE_ON_START_SPAN_FIELD, isolationScope);\n addNonEnumerableProperty(span, SCOPE_ON_START_SPAN_FIELD, scope);\n }\n}\n\n/**\n * Grabs the scope and isolation scope off a span that were active when the span was started.\n */\nexport function getCapturedScopesOnSpan(span: Span): { scope?: Scope; isolationScope?: Scope } {\n return {\n scope: (span as SpanWithScopes)[SCOPE_ON_START_SPAN_FIELD],\n isolationScope: (span as SpanWithScopes)[ISOLATION_SCOPE_ON_START_SPAN_FIELD],\n };\n}\n","/**\n * Parse a sample rate from a given value.\n * This will either return a boolean or number sample rate, if the sample rate is valid (between 0 and 1).\n * If a string is passed, we try to convert it to a number.\n *\n * Any invalid sample rate will return `undefined`.\n */\nexport function parseSampleRate(sampleRate: unknown): number | undefined {\n if (typeof sampleRate === 'boolean') {\n return Number(sampleRate);\n }\n\n const rate = typeof sampleRate === 'string' ? parseFloat(sampleRate) : sampleRate;\n if (typeof rate !== 'number' || isNaN(rate) || rate < 0 || rate > 1) {\n return undefined;\n }\n\n return rate;\n}\n","import type { DynamicSamplingContext } from '../types-hoist';\n\nimport { DEBUG_BUILD } from './debug-build';\nimport { isString } from './is';\nimport { logger } from './logger';\n\nexport const SENTRY_BAGGAGE_KEY_PREFIX = 'sentry-';\n\nexport const SENTRY_BAGGAGE_KEY_PREFIX_REGEX = /^sentry-/;\n\n/**\n * Max length of a serialized baggage string\n *\n * https://www.w3.org/TR/baggage/#limits\n */\nexport const MAX_BAGGAGE_STRING_LENGTH = 8192;\n\n/**\n * Takes a baggage header and turns it into Dynamic Sampling Context, by extracting all the \"sentry-\" prefixed values\n * from it.\n *\n * @param baggageHeader A very bread definition of a baggage header as it might appear in various frameworks.\n * @returns The Dynamic Sampling Context that was found on `baggageHeader`, if there was any, `undefined` otherwise.\n */\nexport function baggageHeaderToDynamicSamplingContext(\n // Very liberal definition of what any incoming header might look like\n baggageHeader: string | string[] | number | null | undefined | boolean,\n): Partial<DynamicSamplingContext> | undefined {\n const baggageObject = parseBaggageHeader(baggageHeader);\n\n if (!baggageObject) {\n return undefined;\n }\n\n // Read all \"sentry-\" prefixed values out of the baggage object and put it onto a dynamic sampling context object.\n const dynamicSamplingContext = Object.entries(baggageObject).reduce<Record<string, string>>((acc, [key, value]) => {\n if (key.match(SENTRY_BAGGAGE_KEY_PREFIX_REGEX)) {\n const nonPrefixedKey = key.slice(SENTRY_BAGGAGE_KEY_PREFIX.length);\n acc[nonPrefixedKey] = value;\n }\n return acc;\n }, {});\n\n // Only return a dynamic sampling context object if there are keys in it.\n // A keyless object means there were no sentry values on the header, which means that there is no DSC.\n if (Object.keys(dynamicSamplingContext).length > 0) {\n return dynamicSamplingContext as Partial<DynamicSamplingContext>;\n } else {\n return undefined;\n }\n}\n\n/**\n * Turns a Dynamic Sampling Object into a baggage header by prefixing all the keys on the object with \"sentry-\".\n *\n * @param dynamicSamplingContext The Dynamic Sampling Context to turn into a header. For convenience and compatibility\n * with the `getDynamicSamplingContext` method on the Transaction class ,this argument can also be `undefined`. If it is\n * `undefined` the function will return `undefined`.\n * @returns a baggage header, created from `dynamicSamplingContext`, or `undefined` either if `dynamicSamplingContext`\n * was `undefined`, or if `dynamicSamplingContext` didn't contain any values.\n */\nexport function dynamicSamplingContextToSentryBaggageHeader(\n // this also takes undefined for convenience and bundle size in other places\n dynamicSamplingContext?: Partial<DynamicSamplingContext>,\n): string | undefined {\n if (!dynamicSamplingContext) {\n return undefined;\n }\n\n // Prefix all DSC keys with \"sentry-\" and put them into a new object\n const sentryPrefixedDSC = Object.entries(dynamicSamplingContext).reduce<Record<string, string>>(\n (acc, [dscKey, dscValue]) => {\n if (dscValue) {\n acc[`${SENTRY_BAGGAGE_KEY_PREFIX}${dscKey}`] = dscValue;\n }\n return acc;\n },\n {},\n );\n\n return objectToBaggageHeader(sentryPrefixedDSC);\n}\n\n/**\n * Take a baggage header and parse it into an object.\n */\nexport function parseBaggageHeader(\n baggageHeader: string | string[] | number | null | undefined | boolean,\n): Record<string, string> | undefined {\n if (!baggageHeader || (!isString(baggageHeader) && !Array.isArray(baggageHeader))) {\n return undefined;\n }\n\n if (Array.isArray(baggageHeader)) {\n // Combine all baggage headers into one object containing the baggage values so we can later read the Sentry-DSC-values from it\n return baggageHeader.reduce<Record<string, string>>((acc, curr) => {\n const currBaggageObject = baggageHeaderToObject(curr);\n Object.entries(currBaggageObject).forEach(([key, value]) => {\n acc[key] = value;\n });\n return acc;\n }, {});\n }\n\n return baggageHeaderToObject(baggageHeader);\n}\n\n/**\n * Will parse a baggage header, which is a simple key-value map, into a flat object.\n *\n * @param baggageHeader The baggage header to parse.\n * @returns a flat object containing all the key-value pairs from `baggageHeader`.\n */\nfunction baggageHeaderToObject(baggageHeader: string): Record<string, string> {\n return baggageHeader\n .split(',')\n .map(baggageEntry => baggageEntry.split('=').map(keyOrValue => decodeURIComponent(keyOrValue.trim())))\n .reduce<Record<string, string>>((acc, [key, value]) => {\n if (key && value) {\n acc[key] = value;\n }\n return acc;\n }, {});\n}\n\n/**\n * Turns a flat object (key-value pairs) into a baggage header, which is also just key-value pairs.\n *\n * @param object The object to turn into a baggage header.\n * @returns a baggage header string, or `undefined` if the object didn't have any values, since an empty baggage header\n * is not spec compliant.\n */\nexport function objectToBaggageHeader(object: Record<string, string>): string | undefined {\n if (Object.keys(object).length === 0) {\n // An empty baggage header is not spec compliant: We return undefined.\n return undefined;\n }\n\n return Object.entries(object).reduce((baggageHeader, [objectKey, objectValue], currentIndex) => {\n const baggageEntry = `${encodeURIComponent(objectKey)}=${encodeURIComponent(objectValue)}`;\n const newBaggageHeader = currentIndex === 0 ? baggageEntry : `${baggageHeader},${baggageEntry}`;\n if (newBaggageHeader.length > MAX_BAGGAGE_STRING_LENGTH) {\n DEBUG_BUILD &&\n logger.warn(\n `Not adding key: ${objectKey} with val: ${objectValue} to baggage header due to exceeding baggage size limits.`,\n );\n return baggageHeader;\n } else {\n return newBaggageHeader;\n }\n }, '');\n}\n","import type { DynamicSamplingContext, PropagationContext, TraceparentData } from '../types-hoist';\nimport { parseSampleRate } from '../utils/parseSampleRate';\n\nimport { baggageHeaderToDynamicSamplingContext } from './baggage';\nimport { generateSpanId, generateTraceId } from './propagationContext';\n\n// eslint-disable-next-line @sentry-internal/sdk/no-regexp-constructor -- RegExp is used for readability here\nexport const TRACEPARENT_REGEXP = new RegExp(\n '^[ \\\\t]*' + // whitespace\n '([0-9a-f]{32})?' + // trace_id\n '-?([0-9a-f]{16})?' + // span_id\n '-?([01])?' + // sampled\n '[ \\\\t]*$', // whitespace\n);\n\n/**\n * Extract transaction context data from a `sentry-trace` header.\n *\n * @param traceparent Traceparent string\n *\n * @returns Object containing data from the header, or undefined if traceparent string is malformed\n */\nexport function extractTraceparentData(traceparent?: string): TraceparentData | undefined {\n if (!traceparent) {\n return undefined;\n }\n\n const matches = traceparent.match(TRACEPARENT_REGEXP);\n if (!matches) {\n return undefined;\n }\n\n let parentSampled: boolean | undefined;\n if (matches[3] === '1') {\n parentSampled = true;\n } else if (matches[3] === '0') {\n parentSampled = false;\n }\n\n return {\n traceId: matches[1],\n parentSampled,\n parentSpanId: matches[2],\n };\n}\n\n/**\n * Create a propagation context from incoming headers or\n * creates a minimal new one if the headers are undefined.\n */\nexport function propagationContextFromHeaders(\n sentryTrace: string | undefined,\n baggage: string | number | boolean | string[] | null | undefined,\n): PropagationContext {\n const traceparentData = extractTraceparentData(sentryTrace);\n const dynamicSamplingContext = baggageHeaderToDynamicSamplingContext(baggage);\n\n if (!traceparentData?.traceId) {\n return {\n traceId: generateTraceId(),\n sampleRand: Math.random(),\n };\n }\n\n const sampleRand = getSampleRandFromTraceparentAndDsc(traceparentData, dynamicSamplingContext);\n\n // The sample_rand on the DSC needs to be generated based on traceparent + baggage.\n if (dynamicSamplingContext) {\n dynamicSamplingContext.sample_rand = sampleRand.toString();\n }\n\n const { traceId, parentSpanId, parentSampled } = traceparentData;\n\n return {\n traceId,\n parentSpanId,\n sampled: parentSampled,\n dsc: dynamicSamplingContext || {}, // If we have traceparent data but no DSC it means we are not head of trace and we must freeze it\n sampleRand,\n };\n}\n\n/**\n * Create sentry-trace header from span context values.\n */\nexport function generateSentryTraceHeader(\n traceId: string | undefined = generateTraceId(),\n spanId: string | undefined = generateSpanId(),\n sampled?: boolean,\n): string {\n let sampledString = '';\n if (sampled !== undefined) {\n sampledString = sampled ? '-1' : '-0';\n }\n return `${traceId}-${spanId}${sampledString}`;\n}\n\n/**\n * Given any combination of an incoming trace, generate a sample rand based on its defined semantics.\n *\n * Read more: https://develop.sentry.dev/sdk/telemetry/traces/#propagated-random-value\n */\nfunction getSampleRandFromTraceparentAndDsc(\n traceparentData: TraceparentData | undefined,\n dsc: Partial<DynamicSamplingContext> | undefined,\n): number {\n // When there is an incoming sample rand use it.\n const parsedSampleRand = parseSampleRate(dsc?.sample_rand);\n if (parsedSampleRand !== undefined) {\n return parsedSampleRand;\n }\n\n // Otherwise, if there is an incoming sampling decision + sample rate, generate a sample rand that would lead to the same sampling decision.\n const parsedSampleRate = parseSampleRate(dsc?.sample_rate);\n if (parsedSampleRate && traceparentData?.parentSampled !== undefined) {\n return traceparentData.parentSampled\n ? // Returns a sample rand with positive sampling decision [0, sampleRate)\n Math.random() * parsedSampleRate\n : // Returns a sample rand with negative sampling decision [sampleRate, 1)\n parsedSampleRate + Math.random() * (1 - parsedSampleRate);\n } else {\n // If nothing applies, return a random sample rand.\n return Math.random();\n }\n}\n","import { getAsyncContextStrategy } from '../asyncContext';\nimport { getMainCarrier } from '../carrier';\nimport { getCurrentScope } from '../currentScopes';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME,\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n} from '../semanticAttributes';\nimport type { SentrySpan } from '../tracing/sentrySpan';\nimport { SPAN_STATUS_OK, SPAN_STATUS_UNSET } from '../tracing/spanstatus';\nimport { getCapturedScopesOnSpan } from '../tracing/utils';\nimport type {\n Span,\n SpanAttributes,\n SpanJSON,\n SpanOrigin,\n SpanStatus,\n SpanTimeInput,\n TraceContext,\n} from '../types-hoist';\nimport type { SpanLink, SpanLinkJSON } from '../types-hoist/link';\nimport { consoleSandbox } from '../utils-hoist/logger';\nimport { addNonEnumerableProperty, dropUndefinedKeys } from '../utils-hoist/object';\nimport { generateSpanId } from '../utils-hoist/propagationContext';\nimport { timestampInSeconds } from '../utils-hoist/time';\nimport { generateSentryTraceHeader } from '../utils-hoist/tracing';\nimport { _getSpanForScope } from './spanOnScope';\n\n// These are aligned with OpenTelemetry trace flags\nexport const TRACE_FLAG_NONE = 0x0;\nexport const TRACE_FLAG_SAMPLED = 0x1;\n\nlet hasShownSpanDropWarning = false;\n\n/**\n * Convert a span to a trace context, which can be sent as the `trace` context in an event.\n * By default, this will only include trace_id, span_id & parent_span_id.\n * If `includeAllData` is true, it will also include data, op, status & origin.\n */\nexport function spanToTransactionTraceContext(span: Span): TraceContext {\n const { spanId: span_id, traceId: trace_id } = span.spanContext();\n const { data, op, parent_span_id, status, origin, links } = spanToJSON(span);\n\n return dropUndefinedKeys({\n parent_span_id,\n span_id,\n trace_id,\n data,\n op,\n status,\n origin,\n links,\n });\n}\n\n/**\n * Convert a span to a trace context, which can be sent as the `trace` context in a non-transaction event.\n */\nexport function spanToTraceContext(span: Span): TraceContext {\n const { spanId, traceId: trace_id, isRemote } = span.spanContext();\n\n // If the span is remote, we use a random/virtual span as span_id to the trace context,\n // and the remote span as parent_span_id\n const parent_span_id = isRemote ? spanId : spanToJSON(span).parent_span_id;\n const scope = getCapturedScopesOnSpan(span).scope;\n\n const span_id = isRemote ? scope?.getPropagationContext().propagationSpanId || generateSpanId() : spanId;\n\n return dropUndefinedKeys({\n parent_span_id,\n span_id,\n trace_id,\n });\n}\n\n/**\n * Convert a Span to a Sentry trace header.\n */\nexport function spanToTraceHeader(span: Span): string {\n const { traceId, spanId } = span.spanContext();\n const sampled = spanIsSampled(span);\n return generateSentryTraceHeader(traceId, spanId, sampled);\n}\n\n/**\n * Converts the span links array to a flattened version to be sent within an envelope.\n *\n * If the links array is empty, it returns `undefined` so the empty value can be dropped before it's sent.\n */\nexport function convertSpanLinksForEnvelope(links?: SpanLink[]): SpanLinkJSON[] | undefined {\n if (links && links.length > 0) {\n return links.map(({ context: { spanId, traceId, traceFlags, ...restContext }, attributes }) => ({\n span_id: spanId,\n trace_id: traceId,\n sampled: traceFlags === TRACE_FLAG_SAMPLED,\n attributes,\n ...restContext,\n }));\n } else {\n return undefined;\n }\n}\n\n/**\n * Convert a span time input into a timestamp in seconds.\n */\nexport function spanTimeInputToSeconds(input: SpanTimeInput | undefined): number {\n if (typeof input === 'number') {\n return ensureTimestampInSeconds(input);\n }\n\n if (Array.isArray(input)) {\n // See {@link HrTime} for the array-based time format\n return input[0] + input[1] / 1e9;\n }\n\n if (input instanceof Date) {\n return ensureTimestampInSeconds(input.getTime());\n }\n\n return timestampInSeconds();\n}\n\n/**\n * Converts a timestamp to second, if it was in milliseconds, or keeps it as second.\n */\nfunction ensureTimestampInSeconds(timestamp: number): number {\n const isMs = timestamp > 9999999999;\n return isMs ? timestamp / 1000 : timestamp;\n}\n\n/**\n * Convert a span to a JSON representation.\n */\n// Note: Because of this, we currently have a circular type dependency (which we opted out of in package.json).\n// This is not avoidable as we need `spanToJSON` in `spanUtils.ts`, which in turn is needed by `span.ts` for backwards compatibility.\n// And `spanToJSON` needs the Span class from `span.ts` to check here.\nexport function spanToJSON(span: Span): SpanJSON {\n if (spanIsSentrySpan(span)) {\n return span.getSpanJSON();\n }\n\n const { spanId: span_id, traceId: trace_id } = span.spanContext();\n\n // Handle a span from @opentelemetry/sdk-base-trace's `Span` class\n if (spanIsOpenTelemetrySdkTraceBaseSpan(span)) {\n const { attributes, startTime, name, endTime, parentSpanId, status, links } = span;\n\n return dropUndefinedKeys({\n span_id,\n trace_id,\n data: attributes,\n description: name,\n parent_span_id: parentSpanId,\n start_timestamp: spanTimeInputToSeconds(startTime),\n // This is [0,0] by default in OTEL, in which case we want to interpret this as no end time\n timestamp: spanTimeInputToSeconds(endTime) || undefined,\n status: getStatusMessage(status),\n op: attributes[SEMANTIC_ATTRIBUTE_SENTRY_OP],\n origin: attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] as SpanOrigin | undefined,\n links: convertSpanLinksForEnvelope(links),\n });\n }\n\n // Finally, at least we have `spanContext()`....\n // This should not actually happen in reality, but we need to handle it for type safety.\n return {\n span_id,\n trace_id,\n start_timestamp: 0,\n data: {},\n };\n}\n\nfunction spanIsOpenTelemetrySdkTraceBaseSpan(span: Span): span is OpenTelemetrySdkTraceBaseSpan {\n const castSpan = span as Partial<OpenTelemetrySdkTraceBaseSpan>;\n return !!castSpan.attributes && !!castSpan.startTime && !!castSpan.name && !!castSpan.endTime && !!castSpan.status;\n}\n\n/** Exported only for tests. */\nexport interface OpenTelemetrySdkTraceBaseSpan extends Span {\n attributes: SpanAttributes;\n startTime: SpanTimeInput;\n name: string;\n status: SpanStatus;\n endTime: SpanTimeInput;\n parentSpanId?: string;\n links?: SpanLink[];\n}\n\n/**\n * Sadly, due to circular dependency checks we cannot actually import the Span class here and check for instanceof.\n * :( So instead we approximate this by checking if it has the `getSpanJSON` method.\n */\nfunction spanIsSentrySpan(span: Span): span is SentrySpan {\n return typeof (span as SentrySpan).getSpanJSON === 'function';\n}\n\n/**\n * Returns true if a span is sampled.\n * In most cases, you should just use `span.isRecording()` instead.\n * However, this has a slightly different semantic, as it also returns false if the span is finished.\n * So in the case where this distinction is important, use this method.\n */\nexport function spanIsSampled(span: Span): boolean {\n // We align our trace flags with the ones OpenTelemetry use\n // So we also check for sampled the same way they do.\n const { traceFlags } = span.spanContext();\n return traceFlags === TRACE_FLAG_SAMPLED;\n}\n\n/** Get the status message to use for a JSON representation of a span. */\nexport function getStatusMessage(status: SpanStatus | undefined): string | undefined {\n if (!status || status.code === SPAN_STATUS_UNSET) {\n return undefined;\n }\n\n if (status.code === SPAN_STATUS_OK) {\n return 'ok';\n }\n\n return status.message || 'unknown_error';\n}\n\nconst CHILD_SPANS_FIELD = '_sentryChildSpans';\nconst ROOT_SPAN_FIELD = '_sentryRootSpan';\n\ntype SpanWithPotentialChildren = Span & {\n [CHILD_SPANS_FIELD]?: Set<Span>;\n [ROOT_SPAN_FIELD]?: Span;\n};\n\n/**\n * Adds an opaque child span reference to a span.\n */\nexport function addChildSpanToSpan(span: SpanWithPotentialChildren, childSpan: Span): void {\n // We store the root span reference on the child span\n // We need this for `getRootSpan()` to work\n const rootSpan = span[ROOT_SPAN_FIELD] || span;\n addNonEnumerableProperty(childSpan as SpanWithPotentialChildren, ROOT_SPAN_FIELD, rootSpan);\n\n // We store a list of child spans on the parent span\n // We need this for `getSpanDescendants()` to work\n if (span[CHILD_SPANS_FIELD]) {\n span[CHILD_SPANS_FIELD].add(childSpan);\n } else {\n addNonEnumerableProperty(span, CHILD_SPANS_FIELD, new Set([childSpan]));\n }\n}\n\n/** This is only used internally by Idle Spans. */\nexport function removeChildSpanFromSpan(span: SpanWithPotentialChildren, childSpan: Span): void {\n if (span[CHILD_SPANS_FIELD]) {\n span[CHILD_SPANS_FIELD].delete(childSpan);\n }\n}\n\n/**\n * Returns an array of the given span and all of its descendants.\n */\nexport function getSpanDescendants(span: SpanWithPotentialChildren): Span[] {\n const resultSet = new Set<Span>();\n\n function addSpanChildren(span: SpanWithPotentialChildren): void {\n // This exit condition is required to not infinitely loop in case of a circular dependency.\n if (resultSet.has(span)) {\n return;\n // We want to ignore unsampled spans (e.g. non recording spans)\n } else if (spanIsSampled(span)) {\n resultSet.add(span);\n const childSpans = span[CHILD_SPANS_FIELD] ? Array.from(span[CHILD_SPANS_FIELD]) : [];\n for (const childSpan of childSpans) {\n addSpanChildren(childSpan);\n }\n }\n }\n\n addSpanChildren(span);\n\n return Array.from(resultSet);\n}\n\n/**\n * Returns the root span of a given span.\n */\nexport function getRootSpan(span: SpanWithPotentialChildren): Span {\n return span[ROOT_SPAN_FIELD] || span;\n}\n\n/**\n * Returns the currently active span.\n */\nexport function getActiveSpan(): Span | undefined {\n const carrier = getMainCarrier();\n const acs = getAsyncContextStrategy(carrier);\n if (acs.getActiveSpan) {\n return acs.getActiveSpan();\n }\n\n return _getSpanForScope(getCurrentScope());\n}\n\n/**\n * Logs a warning once if `beforeSendSpan` is used to drop spans.\n */\nexport function showSpanDropWarning(): void {\n if (!hasShownSpanDropWarning) {\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.warn(\n '[Sentry] Returning null from `beforeSendSpan` is disallowed. To drop certain spans, configure the respective integrations directly.',\n );\n });\n hasShownSpanDropWarning = true;\n }\n}\n\n/**\n * Updates the name of the given span and ensures that the span name is not\n * overwritten by the Sentry SDK.\n *\n * Use this function instead of `span.updateName()` if you want to make sure that\n * your name is kept. For some spans, for example root `http.server` spans the\n * Sentry SDK would otherwise overwrite the span name with a high-quality name\n * it infers when the span ends.\n *\n * Use this function in server code or when your span is started on the server\n * and on the client (browser). If you only update a span name on the client,\n * you can also use `span.updateName()` the SDK does not overwrite the name.\n *\n * @param span - The span to update the name of.\n * @param name - The name to set on the span.\n */\nexport function updateSpanName(span: Span, name: string): void {\n span.updateName(name);\n span.setAttributes({\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'custom',\n [SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME]: name,\n });\n}\n","declare const __DEBUG_BUILD__: boolean;\n\n/**\n * This serves as a build time flag that will be true by default, but false in non-debug builds or if users replace `__SENTRY_DEBUG__` in their generated code.\n *\n * ATTENTION: This constant must never cross package boundaries (i.e. be exported) to guarantee that it can be used for tree shaking.\n */\nexport const DEBUG_BUILD = __DEBUG_BUILD__;\n","import { DEBUG_BUILD } from '../debug-build';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT,\n SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE,\n} from '../semanticAttributes';\nimport type { MeasurementUnit, Measurements, TimedEvent } from '../types-hoist';\nimport { logger } from '../utils-hoist/logger';\nimport { getActiveSpan, getRootSpan } from '../utils/spanUtils';\n\n/**\n * Adds a measurement to the active transaction on the current global scope. You can optionally pass in a different span\n * as the 4th parameter.\n */\nexport function setMeasurement(name: string, value: number, unit: MeasurementUnit, activeSpan = getActiveSpan()): void {\n const rootSpan = activeSpan && getRootSpan(activeSpan);\n\n if (rootSpan) {\n DEBUG_BUILD && logger.log(`[Measurement] Setting measurement on root span: ${name} = ${value} ${unit}`);\n rootSpan.addEvent(name, {\n [SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE]: value,\n [SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT]: unit as string,\n });\n }\n}\n\n/**\n * Convert timed events to measurements.\n */\nexport function timedEventsToMeasurements(events: TimedEvent[]): Measurements | undefined {\n if (!events || events.length === 0) {\n return undefined;\n }\n\n const measurements: Measurements = {};\n events.forEach(event => {\n const attributes = event.attributes || {};\n const unit = attributes[SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT] as MeasurementUnit | undefined;\n const value = attributes[SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE] as number | undefined;\n\n if (typeof unit === 'string' && typeof value === 'number') {\n measurements[event.name] = { value, unit };\n }\n });\n\n return measurements;\n}\n","type PartialURL = {\n host?: string;\n path?: string;\n protocol?: string;\n relative?: string;\n search?: string;\n hash?: string;\n};\n\ninterface URLwithCanParse extends URL {\n canParse: (url: string, base?: string | URL | undefined) => boolean;\n}\n\n/**\n * Parses string to a URL object\n *\n * @param url - The URL to parse\n * @returns The parsed URL object or undefined if the URL is invalid\n */\nexport function parseStringToURL(url: string, base?: string | URL | undefined): URL | undefined {\n try {\n // Use `canParse` to short-circuit the URL constructor if it's not a valid URL\n // This is faster than trying to construct the URL and catching the error\n // Node 20+, Chrome 120+, Firefox 115+, Safari 17+\n if ('canParse' in URL && !(URL as unknown as URLwithCanParse).canParse(url, base)) {\n return undefined;\n }\n\n return new URL(url, base);\n } catch {\n // empty body\n }\n\n return undefined;\n}\n\n/**\n * Parses string form of URL into an object\n * // borrowed from https://tools.ietf.org/html/rfc3986#appendix-B\n * // intentionally using regex and not <a/> href parsing trick because React Native and other\n * // environments where DOM might not be available\n * @returns parsed URL object\n */\nexport function parseUrl(url: string): PartialURL {\n if (!url) {\n return {};\n }\n\n const match = url.match(/^(([^:/?#]+):)?(\\/\\/([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$/);\n\n if (!match) {\n return {};\n }\n\n // coerce to undefined values to empty string so we don't get 'undefined'\n const query = match[6] || '';\n const fragment = match[8] || '';\n return {\n host: match[4],\n path: match[5],\n protocol: match[2],\n search: query,\n hash: fragment,\n relative: match[5] + query + fragment, // everything minus origin\n };\n}\n\n/**\n * Strip the query string and fragment off of a given URL or path (if present)\n *\n * @param urlPath Full URL or path, including possible query string and/or fragment\n * @returns URL or path without query string or fragment\n */\nexport function stripUrlQueryAndFragment(urlPath: string): string {\n return (urlPath.split(/[?#]/, 1) as [string, ...string[]])[0];\n}\n\n/**\n * Takes a URL object and returns a sanitized string which is safe to use as span name\n * see: https://develop.sentry.dev/sdk/data-handling/#structuring-data\n */\nexport function getSanitizedUrlString(url: PartialURL): string {\n const { protocol, host, path } = url;\n\n const filteredHost =\n host\n // Always filter out authority\n ?.replace(/^.*@/, '[filtered]:[filtered]@')\n // Don't show standard :80 (http) and :443 (https) ports to reduce the noise\n // TODO: Use new URL global if it exists\n .replace(/(:80)$/, '')\n .replace(/(:443)$/, '') || '';\n\n return `${protocol ? `${protocol}://` : ''}${filteredHost}${path}`;\n}\n","import type {\n FetchBreadcrumbHint,\n HandlerDataFetch,\n SentryWrappedXMLHttpRequest,\n XhrBreadcrumbHint,\n} from '@sentry/core';\nimport { GLOBAL_OBJ } from '@sentry/core';\n\nexport const WINDOW = GLOBAL_OBJ as typeof GLOBAL_OBJ &\n // document is not available in all browser environments (webworkers). We make it optional so you have to explicitly check for it\n Omit<Window, 'document'> &\n Partial<Pick<Window, 'document'>>;\n\nexport type NetworkMetaWarning =\n | 'MAYBE_JSON_TRUNCATED'\n | 'TEXT_TRUNCATED'\n | 'URL_SKIPPED'\n | 'BODY_PARSE_ERROR'\n | 'BODY_PARSE_TIMEOUT'\n | 'UNPARSEABLE_BODY_TYPE';\n\ntype RequestBody = null | Blob | BufferSource | FormData | URLSearchParams | string;\n\nexport type XhrHint = XhrBreadcrumbHint & {\n xhr: XMLHttpRequest & SentryWrappedXMLHttpRequest;\n input?: RequestBody;\n};\nexport type FetchHint = FetchBreadcrumbHint & {\n input: HandlerDataFetch['args'];\n response: Response;\n};\n","declare const __DEBUG_BUILD__: boolean;\n\n/**\n * This serves as a build time flag that will be true by default, but false in non-debug builds or if users replace `__SENTRY_DEBUG__` in their generated code.\n *\n * ATTENTION: This constant must never cross package boundaries (i.e. be exported) to guarantee that it can be used for tree shaking.\n */\nexport const DEBUG_BUILD = __DEBUG_BUILD__;\n","import type { Event, StackFrame, StackLineParser, StackParser } from '../types-hoist';\n\nconst STACKTRACE_FRAME_LIMIT = 50;\nexport const UNKNOWN_FUNCTION = '?';\n// Used to sanitize webpack (error: *) wrapped stack errors\nconst WEBPACK_ERROR_REGEXP = /\\(error: (.*)\\)/;\nconst STRIP_FRAME_REGEXP = /captureMessage|captureException/;\n\n/**\n * Creates a stack parser with the supplied line parsers\n *\n * StackFrames are returned in the correct order for Sentry Exception\n * frames and with Sentry SDK internal frames removed from the top and bottom\n *\n */\nexport function createStackParser(...parsers: StackLineParser[]): StackParser {\n const sortedParsers = parsers.sort((a, b) => a[0] - b[0]).map(p => p[1]);\n\n return (stack: string, skipFirstLines: number = 0, framesToPop: number = 0): StackFrame[] => {\n const frames: StackFrame[] = [];\n const lines = stack.split('\\n');\n\n for (let i = skipFirstLines; i < lines.length; i++) {\n const line = lines[i] as string;\n // Ignore lines over 1kb as they are unlikely to be stack frames.\n // Many of the regular expressions use backtracking which results in run time that increases exponentially with\n // input size. Huge strings can result in hangs/Denial of Service:\n // https://github.com/getsentry/sentry-javascript/issues/2286\n if (line.length > 1024) {\n continue;\n }\n\n // https://github.com/getsentry/sentry-javascript/issues/5459\n // Remove webpack (error: *) wrappers\n const cleanedLine = WEBPACK_ERROR_REGEXP.test(line) ? line.replace(WEBPACK_ERROR_REGEXP, '$1') : line;\n\n // https://github.com/getsentry/sentry-javascript/issues/7813\n // Skip Error: lines\n if (cleanedLine.match(/\\S*Error: /)) {\n continue;\n }\n\n for (const parser of sortedParsers) {\n const frame = parser(cleanedLine);\n\n if (frame) {\n frames.push(frame);\n break;\n }\n }\n\n if (frames.length >= STACKTRACE_FRAME_LIMIT + framesToPop) {\n break;\n }\n }\n\n return stripSentryFramesAndReverse(frames.slice(framesToPop));\n };\n}\n\n/**\n * Gets a stack parser implementation from Options.stackParser\n * @see Options\n *\n * If options contains an array of line parsers, it is converted into a parser\n */\nexport function stackParserFromStackParserOptions(stackParser: StackParser | StackLineParser[]): StackParser {\n if (Array.isArray(stackParser)) {\n return createStackParser(...stackParser);\n }\n return stackParser;\n}\n\n/**\n * Removes Sentry frames from the top and bottom of the stack if present and enforces a limit of max number of frames.\n * Assumes stack input is ordered from top to bottom and returns the reverse representation so call site of the\n * function that caused the crash is the last frame in the array.\n * @hidden\n */\nexport function stripSentryFramesAndReverse(stack: ReadonlyArray<StackFrame>): StackFrame[] {\n if (!stack.length) {\n return [];\n }\n\n const localStack = Array.from(stack);\n\n // If stack starts with one of our API calls, remove it (starts, meaning it's the top of the stack - aka last call)\n if (/sentryWrapped/.test(getLastStackFrame(localStack).function || '')) {\n localStack.pop();\n }\n\n // Reversing in the middle of the procedure allows us to just pop the values off the stack\n localStack.reverse();\n\n // If stack ends with one of our internal API calls, remove it (ends, meaning it's the bottom of the stack - aka top-most call)\n if (STRIP_FRAME_REGEXP.test(getLastStackFrame(localStack).function || '')) {\n localStack.pop();\n\n // When using synthetic events, we will have a 2 levels deep stack, as `new Error('Sentry syntheticException')`\n // is produced within the scope itself, making it:\n //\n // Sentry.captureException()\n // scope.captureException()\n //\n // instead of just the top `Sentry` call itself.\n // This forces us to possibly strip an additional frame in the exact same was as above.\n if (STRIP_FRAME_REGEXP.test(getLastStackFrame(localStack).function || '')) {\n localStack.pop();\n }\n }\n\n return localStack.slice(0, STACKTRACE_FRAME_LIMIT).map(frame => ({\n ...frame,\n filename: frame.filename || getLastStackFrame(localStack).filename,\n function: frame.function || UNKNOWN_FUNCTION,\n }));\n}\n\nfunction getLastStackFrame(arr: StackFrame[]): StackFrame {\n return arr[arr.length - 1] || {};\n}\n\nconst defaultFunctionName = '<anonymous>';\n\n/**\n * Safely extract function name from itself\n */\nexport function getFunctionName(fn: unknown): string {\n try {\n if (!fn || typeof fn !== 'function') {\n return defaultFunctionName;\n }\n return fn.name || defaultFunctionName;\n } catch (e) {\n // Just accessing custom props in some Selenium environments\n // can cause a \"Permission denied\" exception (see raven-js#495).\n return defaultFunctionName;\n }\n}\n\n/**\n * Get's stack frames from an event without needing to check for undefined properties.\n */\nexport function getFramesFromEvent(event: Event): StackFrame[] | undefined {\n const exception = event.exception;\n\n if (exception) {\n const frames: StackFrame[] = [];\n try {\n // @ts-expect-error Object could be undefined\n exception.values.forEach(value => {\n // @ts-expect-error Value could be undefined\n if (value.stacktrace.frames) {\n // @ts-expect-error Value could be undefined\n frames.push(...value.stacktrace.frames);\n }\n });\n return frames;\n } catch (_oO) {\n return undefined;\n }\n }\n return undefined;\n}\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { MetricRatingThresholds, MetricType } from '../types';\n\nconst getRating = (value: number, thresholds: MetricRatingThresholds): MetricType['rating'] => {\n if (value > thresholds[1]) {\n return 'poor';\n }\n if (value > thresholds[0]) {\n return 'needs-improvement';\n }\n return 'good';\n};\n\nexport const bindReporter = <MetricName extends MetricType['name']>(\n callback: (metric: Extract<MetricType, { name: MetricName }>) => void,\n metric: Extract<MetricType, { name: MetricName }>,\n thresholds: MetricRatingThresholds,\n reportAllChanges?: boolean,\n) => {\n let prevValue: number;\n let delta: number;\n return (forceReport?: boolean) => {\n if (metric.value >= 0) {\n if (forceReport || reportAllChanges) {\n delta = metric.value - (prevValue || 0);\n\n // Report the metric if there's a non-zero delta or if no previous\n // value exists (which can happen in the case of the document becoming\n // hidden when the metric value is 0).\n // See: https://github.com/GoogleChrome/web-vitals/issues/14\n if (delta || prevValue === undefined) {\n prevValue = metric.value;\n metric.delta = delta;\n metric.rating = getRating(metric.value, thresholds);\n callback(metric);\n }\n }\n }\n };\n};\n","/*\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { WINDOW } from '../../../types';\n\n// sentry-specific change:\n// add optional param to not check for responseStart (see comment below)\nexport const getNavigationEntry = (checkResponseStart = true): PerformanceNavigationTiming | void => {\n const navigationEntry = WINDOW.performance?.getEntriesByType?.('navigation')[0];\n // Check to ensure the `responseStart` property is present and valid.\n // In some cases no value is reported by the browser (for\n // privacy/security reasons), and in other cases (bugs) the value is\n // negative or is larger than the current page time. Ignore these cases:\n // https://github.com/GoogleChrome/web-vitals/issues/137\n // https://github.com/GoogleChrome/web-vitals/issues/162\n // https://github.com/GoogleChrome/web-vitals/issues/275\n if (\n // sentry-specific change:\n // We don't want to check for responseStart for our own use of `getNavigationEntry`\n !checkResponseStart ||\n (navigationEntry && navigationEntry.responseStart > 0 && navigationEntry.responseStart < performance.now())\n ) {\n return navigationEntry;\n }\n};\n","/*\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getNavigationEntry } from './getNavigationEntry';\n\nexport const getActivationStart = (): number => {\n const navEntry = getNavigationEntry();\n return navEntry?.activationStart || 0;\n};\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { WINDOW } from '../../../types';\nimport type { MetricType } from '../types';\nimport { generateUniqueID } from './generateUniqueID';\nimport { getActivationStart } from './getActivationStart';\nimport { getNavigationEntry } from './getNavigationEntry';\n\nexport const initMetric = <MetricName extends MetricType['name']>(name: MetricName, value?: number) => {\n const navEntry = getNavigationEntry();\n let navigationType: MetricType['navigationType'] = 'navigate';\n\n if (navEntry) {\n if (WINDOW.document?.prerendering || getActivationStart() > 0) {\n navigationType = 'prerender';\n } else if (WINDOW.document?.wasDiscarded) {\n navigationType = 'restore';\n } else if (navEntry.type) {\n navigationType = navEntry.type.replace(/_/g, '-') as MetricType['navigationType'];\n }\n }\n\n // Use `entries` type specific for the metric.\n const entries: Extract<MetricType, { name: MetricName }>['entries'] = [];\n\n return {\n name,\n value: typeof value === 'undefined' ? -1 : value,\n rating: 'good' as const, // If needed, will be updated when reported. `const` to keep the type from widening to `string`.\n delta: 0,\n entries,\n id: generateUniqueID(),\n navigationType,\n };\n};\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Performantly generate a unique, 30-char string by combining a version\n * number, the current timestamp with a 13-digit number integer.\n * @return {string}\n */\nexport const generateUniqueID = () => {\n return `v4-${Date.now()}-${Math.floor(Math.random() * (9e12 - 1)) + 1e12}`;\n};\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\ninterface PerformanceEntryMap {\n event: PerformanceEventTiming[];\n 'first-input': PerformanceEventTiming[];\n 'layout-shift': LayoutShift[];\n 'largest-contentful-paint': LargestContentfulPaint[];\n 'long-animation-frame': PerformanceLongAnimationFrameTiming[];\n paint: PerformancePaintTiming[];\n navigation: PerformanceNavigationTiming[];\n resource: PerformanceResourceTiming[];\n // Sentry-specific change:\n // We add longtask as a supported entry type as we use this in\n // our `instrumentPerformanceObserver` function also observes 'longtask'\n // entries.\n longtask: PerformanceEntry[];\n}\n\n/**\n * Takes a performance entry type and a callback function, and creates a\n * `PerformanceObserver` instance that will observe the specified entry type\n * with buffering enabled and call the callback _for each entry_.\n *\n * This function also feature-detects entry support and wraps the logic in a\n * try/catch to avoid errors in unsupporting browsers.\n */\nexport const observe = <K extends keyof PerformanceEntryMap>(\n type: K,\n callback: (entries: PerformanceEntryMap[K]) => void,\n opts?: PerformanceObserverInit,\n): PerformanceObserver | undefined => {\n try {\n if (PerformanceObserver.supportedEntryTypes.includes(type)) {\n const po = new PerformanceObserver(list => {\n // Delay by a microtask to workaround a bug in Safari where the\n // callback is invoked immediately, rather than in a separate task.\n // See: https://github.com/GoogleChrome/web-vitals/issues/277\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n Promise.resolve().then(() => {\n callback(list.getEntries() as PerformanceEntryMap[K]);\n });\n });\n po.observe(\n Object.assign(\n {\n type,\n buffered: true,\n },\n opts || {},\n ) as PerformanceObserverInit,\n );\n return po;\n }\n } catch (e) {\n // Do nothing.\n }\n return;\n};\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { WINDOW } from '../../../types';\n\nexport interface OnHiddenCallback {\n (event: Event): void;\n}\n\n// Sentry-specific change:\n// This function's logic was NOT updated to web-vitals 4.2.4 but we continue\n// to use the web-vitals 3.5.2 due to us having stricter browser support.\n// PR with context that made the changes: https://github.com/GoogleChrome/web-vitals/pull/442/files#r1530492402\n// The PR removed listening to the `pagehide` event, in favour of only listening to `visibilitychange` event.\n// This is \"more correct\" but some browsers we still support (Safari 12.1-14.0) don't fully support `visibilitychange`\n// or have known bugs w.r.t the `visibilitychange` event.\n// TODO (v9): If we decide to drop support for Safari 12.1-14.0, we can use the logic from web-vitals 4.2.4\n// In this case, we also need to update the integration tests that currently trigger the `pagehide` event to\n// simulate the page being hidden.\nexport const onHidden = (cb: OnHiddenCallback) => {\n const onHiddenOrPageHide = (event: Event) => {\n if (event.type === 'pagehide' || WINDOW.document?.visibilityState === 'hidden') {\n cb(event);\n }\n };\n\n if (WINDOW.document) {\n addEventListener('visibilitychange', onHiddenOrPageHide, true);\n // Some browsers have buggy implementations of visibilitychange,\n // so we use pagehide in addition, just to be safe.\n addEventListener('pagehide', onHiddenOrPageHide, true);\n }\n};\n","/*\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport const runOnce = (cb: () => void) => {\n let called = false;\n return () => {\n if (!called) {\n cb();\n called = true;\n }\n };\n};\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { WINDOW } from '../../../types';\n\nlet firstHiddenTime = -1;\n\nconst initHiddenTime = () => {\n // If the document is hidden when this code runs, assume it was always\n // hidden and the page was loaded in the background, with the one exception\n // that visibility state is always 'hidden' during prerendering, so we have\n // to ignore that case until prerendering finishes (see: `prerenderingchange`\n // event logic below).\n return WINDOW.document!.visibilityState === 'hidden' && !WINDOW.document!.prerendering ? 0 : Infinity;\n};\n\nconst onVisibilityUpdate = (event: Event) => {\n // If the document is 'hidden' and no previous hidden timestamp has been\n // set, update it based on the current event data.\n if (WINDOW.document!.visibilityState === 'hidden' && firstHiddenTime > -1) {\n // If the event is a 'visibilitychange' event, it means the page was\n // visible prior to this change, so the event timestamp is the first\n // hidden time.\n // However, if the event is not a 'visibilitychange' event, then it must\n // be a 'prerenderingchange' event, and the fact that the document is\n // still 'hidden' from the above check means the tab was activated\n // in a background state and so has always been hidden.\n firstHiddenTime = event.type === 'visibilitychange' ? event.timeStamp : 0;\n\n // Remove all listeners now that a `firstHiddenTime` value has been set.\n removeChangeListeners();\n }\n};\n\nconst addChangeListeners = () => {\n addEventListener('visibilitychange', onVisibilityUpdate, true);\n // IMPORTANT: when a page is prerendering, its `visibilityState` is\n // 'hidden', so in order to account for cases where this module checks for\n // visibility during prerendering, an additional check after prerendering\n // completes is also required.\n addEventListener('prerenderingchange', onVisibilityUpdate, true);\n};\n\nconst removeChangeListeners = () => {\n removeEventListener('visibilitychange', onVisibilityUpdate, true);\n removeEventListener('prerenderingchange', onVisibilityUpdate, true);\n};\n\nexport const getVisibilityWatcher = () => {\n if (WINDOW.document && firstHiddenTime < 0) {\n // If the document is hidden when this code runs, assume it was hidden\n // since navigation start. This isn't a perfect heuristic, but it's the\n // best we can do until an API is available to support querying past\n // visibilityState.\n firstHiddenTime = initHiddenTime();\n addChangeListeners();\n }\n return {\n get firstHiddenTime() {\n return firstHiddenTime;\n },\n };\n};\n","/*\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { WINDOW } from '../../../types';\n\nexport const whenActivated = (callback: () => void) => {\n if (WINDOW.document?.prerendering) {\n addEventListener('prerenderingchange', () => callback(), true);\n } else {\n callback();\n }\n};\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { bindReporter } from './lib/bindReporter';\nimport { getActivationStart } from './lib/getActivationStart';\nimport { getVisibilityWatcher } from './lib/getVisibilityWatcher';\nimport { initMetric } from './lib/initMetric';\nimport { observe } from './lib/observe';\nimport { whenActivated } from './lib/whenActivated';\nimport type { FCPMetric, MetricRatingThresholds, ReportOpts } from './types';\n\n/** Thresholds for FCP. See https://web.dev/articles/fcp#what_is_a_good_fcp_score */\nexport const FCPThresholds: MetricRatingThresholds = [1800, 3000];\n\n/**\n * Calculates the [FCP](https://web.dev/articles/fcp) value for the current page and\n * calls the `callback` function once the value is ready, along with the\n * relevant `paint` performance entry used to determine the value. The reported\n * value is a `DOMHighResTimeStamp`.\n */\nexport const onFCP = (onReport: (metric: FCPMetric) => void, opts: ReportOpts = {}) => {\n whenActivated(() => {\n const visibilityWatcher = getVisibilityWatcher();\n const metric = initMetric('FCP');\n let report: ReturnType<typeof bindReporter>;\n\n const handleEntries = (entries: FCPMetric['entries']) => {\n entries.forEach(entry => {\n if (entry.name === 'first-contentful-paint') {\n po!.disconnect();\n\n // Only report if the page wasn't hidden prior to the first paint.\n if (entry.startTime < visibilityWatcher.firstHiddenTime) {\n // The activationStart reference is used because FCP should be\n // relative to page activation rather than navigation start if the\n // page was prerendered. But in cases where `activationStart` occurs\n // after the FCP, this time should be clamped at 0.\n metric.value = Math.max(entry.startTime - getActivationStart(), 0);\n metric.entries.push(entry);\n report(true);\n }\n }\n });\n };\n\n const po = observe('paint', handleEntries);\n\n if (po) {\n report = bindReporter(onReport, metric, FCPThresholds, opts.reportAllChanges);\n }\n });\n};\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { bindReporter } from './lib/bindReporter';\nimport { initMetric } from './lib/initMetric';\nimport { observe } from './lib/observe';\nimport { onHidden } from './lib/onHidden';\nimport { runOnce } from './lib/runOnce';\nimport { onFCP } from './onFCP';\nimport type { CLSMetric, MetricRatingThresholds, ReportOpts } from './types';\n\n/** Thresholds for CLS. See https://web.dev/articles/cls#what_is_a_good_cls_score */\nexport const CLSThresholds: MetricRatingThresholds = [0.1, 0.25];\n\n/**\n * Calculates the [CLS](https://web.dev/articles/cls) value for the current page and\n * calls the `callback` function once the value is ready to be reported, along\n * with all `layout-shift` performance entries that were used in the metric\n * value calculation. The reported value is a `double` (corresponding to a\n * [layout shift score](https://web.dev/articles/cls#layout_shift_score)).\n *\n * If the `reportAllChanges` configuration option is set to `true`, the\n * `callback` function will be called as soon as the value is initially\n * determined as well as any time the value changes throughout the page\n * lifespan.\n *\n * _**Important:** CLS should be continually monitored for changes throughout\n * the entire lifespan of a page—including if the user returns to the page after\n * it's been hidden/backgrounded. However, since browsers often [will not fire\n * additional callbacks once the user has backgrounded a\n * page](https://developer.chrome.com/blog/page-lifecycle-api/#advice-hidden),\n * `callback` is always called when the page's visibility state changes to\n * hidden. As a result, the `callback` function might be called multiple times\n * during the same page load._\n */\nexport const onCLS = (onReport: (metric: CLSMetric) => void, opts: ReportOpts = {}) => {\n // Start monitoring FCP so we can only report CLS if FCP is also reported.\n // Note: this is done to match the current behavior of CrUX.\n onFCP(\n runOnce(() => {\n const metric = initMetric('CLS', 0);\n let report: ReturnType<typeof bindReporter>;\n\n let sessionValue = 0;\n let sessionEntries: LayoutShift[] = [];\n\n const handleEntries = (entries: LayoutShift[]) => {\n entries.forEach(entry => {\n // Only count layout shifts without recent user input.\n if (!entry.hadRecentInput) {\n const firstSessionEntry = sessionEntries[0];\n const lastSessionEntry = sessionEntries[sessionEntries.length - 1];\n\n // If the entry occurred less than 1 second after the previous entry\n // and less than 5 seconds after the first entry in the session,\n // include the entry in the current session. Otherwise, start a new\n // session.\n if (\n sessionValue &&\n firstSessionEntry &&\n lastSessionEntry &&\n entry.startTime - lastSessionEntry.startTime < 1000 &&\n entry.startTime - firstSessionEntry.startTime < 5000\n ) {\n sessionValue += entry.value;\n sessionEntries.push(entry);\n } else {\n sessionValue = entry.value;\n sessionEntries = [entry];\n }\n }\n });\n\n // If the current session value is larger than the current CLS value,\n // update CLS and the entries contributing to it.\n if (sessionValue > metric.value) {\n metric.value = sessionValue;\n metric.entries = sessionEntries;\n report();\n }\n };\n\n const po = observe('layout-shift', handleEntries);\n if (po) {\n report = bindReporter(onReport, metric, CLSThresholds, opts.reportAllChanges);\n\n onHidden(() => {\n handleEntries(po.takeRecords() as CLSMetric['entries']);\n report(true);\n });\n\n // Queue a task to report (if nothing else triggers a report first).\n // This allows CLS to be reported as soon as FCP fires when\n // `reportAllChanges` is true.\n setTimeout(report, 0);\n }\n }),\n );\n};\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { bindReporter } from './lib/bindReporter';\nimport { getVisibilityWatcher } from './lib/getVisibilityWatcher';\nimport { initMetric } from './lib/initMetric';\nimport { observe } from './lib/observe';\nimport { onHidden } from './lib/onHidden';\nimport { runOnce } from './lib/runOnce';\nimport { whenActivated } from './lib/whenActivated';\nimport type { FIDMetric, MetricRatingThresholds, ReportOpts } from './types';\n\n/** Thresholds for FID. See https://web.dev/articles/fid#what_is_a_good_fid_score */\nexport const FIDThresholds: MetricRatingThresholds = [100, 300];\n\n/**\n * Calculates the [FID](https://web.dev/articles/fid) value for the current page and\n * calls the `callback` function once the value is ready, along with the\n * relevant `first-input` performance entry used to determine the value. The\n * reported value is a `DOMHighResTimeStamp`.\n *\n * _**Important:** since FID is only reported after the user interacts with the\n * page, it's possible that it will not be reported for some page loads._\n */\nexport const onFID = (onReport: (metric: FIDMetric) => void, opts: ReportOpts = {}) => {\n whenActivated(() => {\n const visibilityWatcher = getVisibilityWatcher();\n const metric = initMetric('FID');\n // eslint-disable-next-line prefer-const\n let report: ReturnType<typeof bindReporter>;\n\n const handleEntry = (entry: PerformanceEventTiming): void => {\n // Only report if the page wasn't hidden prior to the first input.\n if (entry.startTime < visibilityWatcher.firstHiddenTime) {\n metric.value = entry.processingStart - entry.startTime;\n metric.entries.push(entry);\n report(true);\n }\n };\n\n const handleEntries = (entries: FIDMetric['entries']) => {\n (entries as PerformanceEventTiming[]).forEach(handleEntry);\n };\n\n const po = observe('first-input', handleEntries);\n\n report = bindReporter(onReport, metric, FIDThresholds, opts.reportAllChanges);\n\n if (po) {\n onHidden(\n runOnce(() => {\n handleEntries(po.takeRecords() as FIDMetric['entries']);\n po.disconnect();\n }),\n );\n }\n });\n};\n","/*\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { observe } from '../observe';\n\ndeclare global {\n interface Performance {\n interactionCount: number;\n }\n}\n\nlet interactionCountEstimate = 0;\nlet minKnownInteractionId = Infinity;\nlet maxKnownInteractionId = 0;\n\nconst updateEstimate = (entries: PerformanceEventTiming[]) => {\n entries.forEach(e => {\n if (e.interactionId) {\n minKnownInteractionId = Math.min(minKnownInteractionId, e.interactionId);\n maxKnownInteractionId = Math.max(maxKnownInteractionId, e.interactionId);\n\n interactionCountEstimate = maxKnownInteractionId ? (maxKnownInteractionId - minKnownInteractionId) / 7 + 1 : 0;\n }\n });\n};\n\nlet po: PerformanceObserver | undefined;\n\n/**\n * Returns the `interactionCount` value using the native API (if available)\n * or the polyfill estimate in this module.\n */\nexport const getInteractionCount = (): number => {\n return po ? interactionCountEstimate : performance.interactionCount || 0;\n};\n\n/**\n * Feature detects native support or initializes the polyfill if needed.\n */\nexport const initInteractionCountPolyfill = (): void => {\n if ('interactionCount' in performance || po) return;\n\n po = observe('event', updateEstimate, {\n type: 'event',\n buffered: true,\n durationThreshold: 0,\n } as PerformanceObserverInit);\n};\n","/*\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getInteractionCount } from './polyfills/interactionCountPolyfill';\n\ninterface Interaction {\n id: number;\n latency: number;\n entries: PerformanceEventTiming[];\n}\n\ninterface EntryPreProcessingHook {\n (entry: PerformanceEventTiming): void;\n}\n\n// A list of longest interactions on the page (by latency) sorted so the\n// longest one is first. The list is at most MAX_INTERACTIONS_TO_CONSIDER long.\nexport const longestInteractionList: Interaction[] = [];\n\n// A mapping of longest interactions by their interaction ID.\n// This is used for faster lookup.\nexport const longestInteractionMap: Map<number, Interaction> = new Map();\n\n// The default `durationThreshold` used across this library for observing\n// `event` entries via PerformanceObserver.\nexport const DEFAULT_DURATION_THRESHOLD = 40;\n\n// Used to store the interaction count after a bfcache restore, since p98\n// interaction latencies should only consider the current navigation.\nlet prevInteractionCount = 0;\n\n/**\n * Returns the interaction count since the last bfcache restore (or for the\n * full page lifecycle if there were no bfcache restores).\n */\nconst getInteractionCountForNavigation = () => {\n return getInteractionCount() - prevInteractionCount;\n};\n\nexport const resetInteractions = () => {\n prevInteractionCount = getInteractionCount();\n longestInteractionList.length = 0;\n longestInteractionMap.clear();\n};\n\n/**\n * Returns the estimated p98 longest interaction based on the stored\n * interaction candidates and the interaction count for the current page.\n */\nexport const estimateP98LongestInteraction = () => {\n const candidateInteractionIndex = Math.min(\n longestInteractionList.length - 1,\n Math.floor(getInteractionCountForNavigation() / 50),\n );\n\n return longestInteractionList[candidateInteractionIndex];\n};\n\n// To prevent unnecessary memory usage on pages with lots of interactions,\n// store at most 10 of the longest interactions to consider as INP candidates.\nconst MAX_INTERACTIONS_TO_CONSIDER = 10;\n\n/**\n * A list of callback functions to run before each entry is processed.\n * Exposing this list allows the attribution build to hook into the\n * entry processing pipeline.\n */\nexport const entryPreProcessingCallbacks: EntryPreProcessingHook[] = [];\n\n/**\n * Takes a performance entry and adds it to the list of worst interactions\n * if its duration is long enough to make it among the worst. If the\n * entry is part of an existing interaction, it is merged and the latency\n * and entries list is updated as needed.\n */\nexport const processInteractionEntry = (entry: PerformanceEventTiming) => {\n entryPreProcessingCallbacks.forEach(cb => cb(entry));\n\n // Skip further processing for entries that cannot be INP candidates.\n if (!(entry.interactionId || entry.entryType === 'first-input')) return;\n\n // The least-long of the 10 longest interactions.\n const minLongestInteraction = longestInteractionList[longestInteractionList.length - 1];\n\n const existingInteraction = longestInteractionMap.get(entry.interactionId!);\n\n // Only process the entry if it's possibly one of the ten longest,\n // or if it's part of an existing interaction.\n if (\n existingInteraction ||\n longestInteractionList.length < MAX_INTERACTIONS_TO_CONSIDER ||\n (minLongestInteraction && entry.duration > minLongestInteraction.latency)\n ) {\n // If the interaction already exists, update it. Otherwise create one.\n if (existingInteraction) {\n // If the new entry has a longer duration, replace the old entries,\n // otherwise add to the array.\n if (entry.duration > existingInteraction.latency) {\n existingInteraction.entries = [entry];\n existingInteraction.latency = entry.duration;\n } else if (\n entry.duration === existingInteraction.latency &&\n entry.startTime === existingInteraction.entries[0]?.startTime\n ) {\n existingInteraction.entries.push(entry);\n }\n } else {\n const interaction = {\n id: entry.interactionId!,\n latency: entry.duration,\n entries: [entry],\n };\n longestInteractionMap.set(interaction.id, interaction);\n longestInteractionList.push(interaction);\n }\n\n // Sort the entries by latency (descending) and keep only the top ten.\n longestInteractionList.sort((a, b) => b.latency - a.latency);\n if (longestInteractionList.length > MAX_INTERACTIONS_TO_CONSIDER) {\n longestInteractionList.splice(MAX_INTERACTIONS_TO_CONSIDER).forEach(i => longestInteractionMap.delete(i.id));\n }\n }\n};\n","/*\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { WINDOW } from '../../../types';\nimport { onHidden } from './onHidden';\nimport { runOnce } from './runOnce';\n\n/**\n * Runs the passed callback during the next idle period, or immediately\n * if the browser's visibility state is (or becomes) hidden.\n */\nexport const whenIdle = (cb: () => void): number => {\n const rIC = WINDOW.requestIdleCallback || WINDOW.setTimeout;\n\n let handle = -1;\n // eslint-disable-next-line no-param-reassign\n cb = runOnce(cb) as () => void;\n // If the document is hidden, run the callback immediately, otherwise\n // race an idle callback with the next `visibilitychange` event.\n if (WINDOW.document?.visibilityState === 'hidden') {\n cb();\n } else {\n handle = rIC(cb);\n onHidden(cb);\n }\n return handle;\n};\n","/*\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { WINDOW } from '../../types';\nimport { bindReporter } from './lib/bindReporter';\nimport { initMetric } from './lib/initMetric';\nimport { DEFAULT_DURATION_THRESHOLD, estimateP98LongestInteraction, processInteractionEntry } from './lib/interactions';\nimport { observe } from './lib/observe';\nimport { onHidden } from './lib/onHidden';\nimport { initInteractionCountPolyfill } from './lib/polyfills/interactionCountPolyfill';\nimport { whenActivated } from './lib/whenActivated';\nimport { whenIdle } from './lib/whenIdle';\n\nimport type { INPMetric, MetricRatingThresholds, ReportOpts } from './types';\n\n/** Thresholds for INP. See https://web.dev/articles/inp#what_is_a_good_inp_score */\nexport const INPThresholds: MetricRatingThresholds = [200, 500];\n\n/**\n * Calculates the [INP](https://web.dev/articles/inp) value for the current\n * page and calls the `callback` function once the value is ready, along with\n * the `event` performance entries reported for that interaction. The reported\n * value is a `DOMHighResTimeStamp`.\n *\n * A custom `durationThreshold` configuration option can optionally be passed to\n * control what `event-timing` entries are considered for INP reporting. The\n * default threshold is `40`, which means INP scores of less than 40 are\n * reported as 0. Note that this will not affect your 75th percentile INP value\n * unless that value is also less than 40 (well below the recommended\n * [good](https://web.dev/articles/inp#what_is_a_good_inp_score) threshold).\n *\n * If the `reportAllChanges` configuration option is set to `true`, the\n * `callback` function will be called as soon as the value is initially\n * determined as well as any time the value changes throughout the page\n * lifespan.\n *\n * _**Important:** INP should be continually monitored for changes throughout\n * the entire lifespan of a page—including if the user returns to the page after\n * it's been hidden/backgrounded. However, since browsers often [will not fire\n * additional callbacks once the user has backgrounded a\n * page](https://developer.chrome.com/blog/page-lifecycle-api/#advice-hidden),\n * `callback` is always called when the page's visibility state changes to\n * hidden. As a result, the `callback` function might be called multiple times\n * during the same page load._\n */\nexport const onINP = (onReport: (metric: INPMetric) => void, opts: ReportOpts = {}) => {\n // Return if the browser doesn't support all APIs needed to measure INP.\n if (!('PerformanceEventTiming' in WINDOW && 'interactionId' in PerformanceEventTiming.prototype)) {\n return;\n }\n\n whenActivated(() => {\n // TODO(philipwalton): remove once the polyfill is no longer needed.\n initInteractionCountPolyfill();\n\n const metric = initMetric('INP');\n // eslint-disable-next-line prefer-const\n let report: ReturnType<typeof bindReporter>;\n\n const handleEntries = (entries: INPMetric['entries']) => {\n // Queue the `handleEntries()` callback in the next idle task.\n // This is needed to increase the chances that all event entries that\n // occurred between the user interaction and the next paint\n // have been dispatched. Note: there is currently an experiment\n // running in Chrome (EventTimingKeypressAndCompositionInteractionId)\n // 123+ that if rolled out fully may make this no longer necessary.\n whenIdle(() => {\n entries.forEach(processInteractionEntry);\n\n const inp = estimateP98LongestInteraction();\n\n if (inp && inp.latency !== metric.value) {\n metric.value = inp.latency;\n metric.entries = inp.entries;\n report();\n }\n });\n };\n\n const po = observe('event', handleEntries, {\n // Event Timing entries have their durations rounded to the nearest 8ms,\n // so a duration of 40ms would be any event that spans 2.5 or more frames\n // at 60Hz. This threshold is chosen to strike a balance between usefulness\n // and performance. Running this callback for any interaction that spans\n // just one or two frames is likely not worth the insight that could be\n // gained.\n durationThreshold: opts.durationThreshold != null ? opts.durationThreshold : DEFAULT_DURATION_THRESHOLD,\n });\n\n report = bindReporter(onReport, metric, INPThresholds, opts.reportAllChanges);\n\n if (po) {\n // Also observe entries of type `first-input`. This is useful in cases\n // where the first interaction is less than the `durationThreshold`.\n po.observe({ type: 'first-input', buffered: true });\n\n onHidden(() => {\n handleEntries(po.takeRecords() as INPMetric['entries']);\n report(true);\n });\n }\n });\n};\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { WINDOW } from '../../types';\nimport { bindReporter } from './lib/bindReporter';\nimport { getActivationStart } from './lib/getActivationStart';\nimport { getVisibilityWatcher } from './lib/getVisibilityWatcher';\nimport { initMetric } from './lib/initMetric';\nimport { observe } from './lib/observe';\nimport { onHidden } from './lib/onHidden';\nimport { runOnce } from './lib/runOnce';\nimport { whenActivated } from './lib/whenActivated';\nimport { whenIdle } from './lib/whenIdle';\nimport type { LCPMetric, MetricRatingThresholds, ReportOpts } from './types';\n\n/** Thresholds for LCP. See https://web.dev/articles/lcp#what_is_a_good_lcp_score */\nexport const LCPThresholds: MetricRatingThresholds = [2500, 4000];\n\nconst reportedMetricIDs: Record<string, boolean> = {};\n\n/**\n * Calculates the [LCP](https://web.dev/articles/lcp) value for the current page and\n * calls the `callback` function once the value is ready (along with the\n * relevant `largest-contentful-paint` performance entry used to determine the\n * value). The reported value is a `DOMHighResTimeStamp`.\n *\n * If the `reportAllChanges` configuration option is set to `true`, the\n * `callback` function will be called any time a new `largest-contentful-paint`\n * performance entry is dispatched, or once the final value of the metric has\n * been determined.\n */\nexport const onLCP = (onReport: (metric: LCPMetric) => void, opts: ReportOpts = {}) => {\n whenActivated(() => {\n const visibilityWatcher = getVisibilityWatcher();\n const metric = initMetric('LCP');\n let report: ReturnType<typeof bindReporter>;\n\n const handleEntries = (entries: LCPMetric['entries']) => {\n // If reportAllChanges is set then call this function for each entry,\n // otherwise only consider the last one.\n if (!opts.reportAllChanges) {\n // eslint-disable-next-line no-param-reassign\n entries = entries.slice(-1);\n }\n\n entries.forEach(entry => {\n // Only report if the page wasn't hidden prior to LCP.\n if (entry.startTime < visibilityWatcher.firstHiddenTime) {\n // The startTime attribute returns the value of the renderTime if it is\n // not 0, and the value of the loadTime otherwise. The activationStart\n // reference is used because LCP should be relative to page activation\n // rather than navigation start if the page was pre-rendered. But in cases\n // where `activationStart` occurs after the LCP, this time should be\n // clamped at 0.\n metric.value = Math.max(entry.startTime - getActivationStart(), 0);\n metric.entries = [entry];\n report();\n }\n });\n };\n\n const po = observe('largest-contentful-paint', handleEntries);\n\n if (po) {\n report = bindReporter(onReport, metric, LCPThresholds, opts.reportAllChanges);\n\n const stopListening = runOnce(() => {\n if (!reportedMetricIDs[metric.id]) {\n handleEntries(po.takeRecords() as LCPMetric['entries']);\n po.disconnect();\n reportedMetricIDs[metric.id] = true;\n report(true);\n }\n });\n\n // Stop listening after input. Note: while scrolling is an input that\n // stops LCP observation, it's unreliable since it can be programmatically\n // generated. See: https://github.com/GoogleChrome/web-vitals/issues/75\n ['keydown', 'click'].forEach(type => {\n // Wrap in a setTimeout so the callback is run in a separate task\n // to avoid extending the keyboard/click handler to reduce INP impact\n // https://github.com/GoogleChrome/web-vitals/issues/383\n if (WINDOW.document) {\n addEventListener(type, () => whenIdle(stopListening as () => void), {\n once: true,\n capture: true,\n });\n }\n });\n\n onHidden(stopListening);\n }\n });\n};\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { WINDOW } from '../../types';\nimport { bindReporter } from './lib/bindReporter';\nimport { getActivationStart } from './lib/getActivationStart';\nimport { getNavigationEntry } from './lib/getNavigationEntry';\nimport { initMetric } from './lib/initMetric';\nimport { whenActivated } from './lib/whenActivated';\nimport type { MetricRatingThresholds, ReportOpts, TTFBMetric } from './types';\n\n/** Thresholds for TTFB. See https://web.dev/articles/ttfb#what_is_a_good_ttfb_score */\nexport const TTFBThresholds: MetricRatingThresholds = [800, 1800];\n\n/**\n * Runs in the next task after the page is done loading and/or prerendering.\n * @param callback\n */\nconst whenReady = (callback: () => void) => {\n if (WINDOW.document?.prerendering) {\n whenActivated(() => whenReady(callback));\n } else if (WINDOW.document?.readyState !== 'complete') {\n addEventListener('load', () => whenReady(callback), true);\n } else {\n // Queue a task so the callback runs after `loadEventEnd`.\n setTimeout(callback, 0);\n }\n};\n\n/**\n * Calculates the [TTFB](https://web.dev/articles/ttfb) value for the\n * current page and calls the `callback` function once the page has loaded,\n * along with the relevant `navigation` performance entry used to determine the\n * value. The reported value is a `DOMHighResTimeStamp`.\n *\n * Note, this function waits until after the page is loaded to call `callback`\n * in order to ensure all properties of the `navigation` entry are populated.\n * This is useful if you want to report on other metrics exposed by the\n * [Navigation Timing API](https://w3c.github.io/navigation-timing/). For\n * example, the TTFB metric starts from the page's [time\n * origin](https://www.w3.org/TR/hr-time-2/#sec-time-origin), which means it\n * includes time spent on DNS lookup, connection negotiation, network latency,\n * and server processing time.\n */\nexport const onTTFB = (onReport: (metric: TTFBMetric) => void, opts: ReportOpts = {}) => {\n const metric = initMetric('TTFB');\n const report = bindReporter(onReport, metric, TTFBThresholds, opts.reportAllChanges);\n\n whenReady(() => {\n const navigationEntry = getNavigationEntry();\n\n if (navigationEntry) {\n // The activationStart reference is used because TTFB should be\n // relative to page activation rather than navigation start if the\n // page was prerendered. But in cases where `activationStart` occurs\n // after the first byte is received, this time should be clamped at 0.\n metric.value = Math.max(navigationEntry.responseStart - getActivationStart(), 0);\n\n metric.entries = [navigationEntry];\n report(true);\n }\n });\n};\n","import { getFunctionName, logger } from '@sentry/core';\n\nimport { DEBUG_BUILD } from '../debug-build';\nimport { onCLS } from './web-vitals/getCLS';\nimport { onFID } from './web-vitals/getFID';\nimport { onINP } from './web-vitals/getINP';\nimport { onLCP } from './web-vitals/getLCP';\nimport { observe } from './web-vitals/lib/observe';\nimport { onTTFB } from './web-vitals/onTTFB';\n\ntype InstrumentHandlerTypePerformanceObserver =\n | 'longtask'\n | 'event'\n | 'navigation'\n | 'paint'\n | 'resource'\n | 'first-input';\n\ntype InstrumentHandlerTypeMetric = 'cls' | 'lcp' | 'fid' | 'ttfb' | 'inp';\n\n// We provide this here manually instead of relying on a global, as this is not available in non-browser environements\n// And we do not want to expose such types\ninterface PerformanceEntry {\n readonly duration: number;\n readonly entryType: string;\n readonly name: string;\n readonly startTime: number;\n toJSON(): Record<string, unknown>;\n}\ninterface PerformanceEventTiming extends PerformanceEntry {\n processingStart: number;\n processingEnd: number;\n duration: number;\n cancelable?: boolean;\n target?: unknown | null;\n interactionId?: number;\n}\n\ninterface PerformanceScriptTiming extends PerformanceEntry {\n sourceURL: string;\n sourceFunctionName: string;\n sourceCharPosition: number;\n invoker: string;\n invokerType: string;\n}\nexport interface PerformanceLongAnimationFrameTiming extends PerformanceEntry {\n scripts: PerformanceScriptTiming[];\n}\n\ninterface Metric {\n /**\n * The name of the metric (in acronym form).\n */\n name: 'CLS' | 'FCP' | 'FID' | 'INP' | 'LCP' | 'TTFB';\n\n /**\n * The current value of the metric.\n */\n value: number;\n\n /**\n * The rating as to whether the metric value is within the \"good\",\n * \"needs improvement\", or \"poor\" thresholds of the metric.\n */\n rating: 'good' | 'needs-improvement' | 'poor';\n\n /**\n * The delta between the current value and the last-reported value.\n * On the first report, `delta` and `value` will always be the same.\n */\n delta: number;\n\n /**\n * A unique ID representing this particular metric instance. This ID can\n * be used by an analytics tool to dedupe multiple values sent for the same\n * metric instance, or to group multiple deltas together and calculate a\n * total. It can also be used to differentiate multiple different metric\n * instances sent from the same page, which can happen if the page is\n * restored from the back/forward cache (in that case new metrics object\n * get created).\n */\n id: string;\n\n /**\n * Any performance entries relevant to the metric value calculation.\n * The array may also be empty if the metric value was not based on any\n * entries (e.g. a CLS value of 0 given no layout shifts).\n */\n entries: PerformanceEntry[];\n\n /**\n * The type of navigation\n *\n * Navigation Timing API (or `undefined` if the browser doesn't\n * support that API). For pages that are restored from the bfcache, this\n * value will be 'back-forward-cache'.\n */\n navigationType: 'navigate' | 'reload' | 'back-forward' | 'back-forward-cache' | 'prerender' | 'restore';\n}\n\ntype InstrumentHandlerType = InstrumentHandlerTypeMetric | InstrumentHandlerTypePerformanceObserver;\n\ntype StopListening = undefined | void | (() => void);\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype InstrumentHandlerCallback = (data: any) => void;\n\ntype CleanupHandlerCallback = () => void;\n\nconst handlers: { [key in InstrumentHandlerType]?: InstrumentHandlerCallback[] } = {};\nconst instrumented: { [key in InstrumentHandlerType]?: boolean } = {};\n\nlet _previousCls: Metric | undefined;\nlet _previousFid: Metric | undefined;\nlet _previousLcp: Metric | undefined;\nlet _previousTtfb: Metric | undefined;\nlet _previousInp: Metric | undefined;\n\n/**\n * Add a callback that will be triggered when a CLS metric is available.\n * Returns a cleanup callback which can be called to remove the instrumentation handler.\n *\n * Pass `stopOnCallback = true` to stop listening for CLS when the cleanup callback is called.\n * This will lead to the CLS being finalized and frozen.\n */\nexport function addClsInstrumentationHandler(\n callback: (data: { metric: Metric }) => void,\n stopOnCallback = false,\n): CleanupHandlerCallback {\n return addMetricObserver('cls', callback, instrumentCls, _previousCls, stopOnCallback);\n}\n\n/**\n * Add a callback that will be triggered when a LCP metric is available.\n * Returns a cleanup callback which can be called to remove the instrumentation handler.\n *\n * Pass `stopOnCallback = true` to stop listening for LCP when the cleanup callback is called.\n * This will lead to the LCP being finalized and frozen.\n */\nexport function addLcpInstrumentationHandler(\n callback: (data: { metric: Metric }) => void,\n stopOnCallback = false,\n): CleanupHandlerCallback {\n return addMetricObserver('lcp', callback, instrumentLcp, _previousLcp, stopOnCallback);\n}\n\n/**\n * Add a callback that will be triggered when a FID metric is available.\n * Returns a cleanup callback which can be called to remove the instrumentation handler.\n */\nexport function addFidInstrumentationHandler(callback: (data: { metric: Metric }) => void): CleanupHandlerCallback {\n return addMetricObserver('fid', callback, instrumentFid, _previousFid);\n}\n\n/**\n * Add a callback that will be triggered when a FID metric is available.\n */\nexport function addTtfbInstrumentationHandler(callback: (data: { metric: Metric }) => void): CleanupHandlerCallback {\n return addMetricObserver('ttfb', callback, instrumentTtfb, _previousTtfb);\n}\n\n/**\n * Add a callback that will be triggered when a INP metric is available.\n * Returns a cleanup callback which can be called to remove the instrumentation handler.\n */\nexport function addInpInstrumentationHandler(\n callback: (data: { metric: Omit<Metric, 'entries'> & { entries: PerformanceEventTiming[] } }) => void,\n): CleanupHandlerCallback {\n return addMetricObserver('inp', callback, instrumentInp, _previousInp);\n}\n\nexport function addPerformanceInstrumentationHandler(\n type: 'event',\n callback: (data: { entries: ((PerformanceEntry & { target?: unknown | null }) | PerformanceEventTiming)[] }) => void,\n): CleanupHandlerCallback;\nexport function addPerformanceInstrumentationHandler(\n type: InstrumentHandlerTypePerformanceObserver,\n callback: (data: { entries: PerformanceEntry[] }) => void,\n): CleanupHandlerCallback;\n\n/**\n * Add a callback that will be triggered when a performance observer is triggered,\n * and receives the entries of the observer.\n * Returns a cleanup callback which can be called to remove the instrumentation handler.\n */\nexport function addPerformanceInstrumentationHandler(\n type: InstrumentHandlerTypePerformanceObserver,\n callback: (data: { entries: PerformanceEntry[] }) => void,\n): CleanupHandlerCallback {\n addHandler(type, callback);\n\n if (!instrumented[type]) {\n instrumentPerformanceObserver(type);\n instrumented[type] = true;\n }\n\n return getCleanupCallback(type, callback);\n}\n\n/** Trigger all handlers of a given type. */\nfunction triggerHandlers(type: InstrumentHandlerType, data: unknown): void {\n const typeHandlers = handlers[type];\n\n if (!typeHandlers?.length) {\n return;\n }\n\n for (const handler of typeHandlers) {\n try {\n handler(data);\n } catch (e) {\n DEBUG_BUILD &&\n logger.error(\n `Error while triggering instrumentation handler.\\nType: ${type}\\nName: ${getFunctionName(handler)}\\nError:`,\n e,\n );\n }\n }\n}\n\nfunction instrumentCls(): StopListening {\n return onCLS(\n metric => {\n triggerHandlers('cls', {\n metric,\n });\n _previousCls = metric;\n },\n // We want the callback to be called whenever the CLS value updates.\n // By default, the callback is only called when the tab goes to the background.\n { reportAllChanges: true },\n );\n}\n\nfunction instrumentFid(): void {\n return onFID(metric => {\n triggerHandlers('fid', {\n metric,\n });\n _previousFid = metric;\n });\n}\n\nfunction instrumentLcp(): StopListening {\n return onLCP(\n metric => {\n triggerHandlers('lcp', {\n metric,\n });\n _previousLcp = metric;\n },\n // We want the callback to be called whenever the LCP value updates.\n // By default, the callback is only called when the tab goes to the background.\n { reportAllChanges: true },\n );\n}\n\nfunction instrumentTtfb(): StopListening {\n return onTTFB(metric => {\n triggerHandlers('ttfb', {\n metric,\n });\n _previousTtfb = metric;\n });\n}\n\nfunction instrumentInp(): void {\n return onINP(metric => {\n triggerHandlers('inp', {\n metric,\n });\n _previousInp = metric;\n });\n}\n\nfunction addMetricObserver(\n type: InstrumentHandlerTypeMetric,\n callback: InstrumentHandlerCallback,\n instrumentFn: () => StopListening,\n previousValue: Metric | undefined,\n stopOnCallback = false,\n): CleanupHandlerCallback {\n addHandler(type, callback);\n\n let stopListening: StopListening | undefined;\n\n if (!instrumented[type]) {\n stopListening = instrumentFn();\n instrumented[type] = true;\n }\n\n if (previousValue) {\n callback({ metric: previousValue });\n }\n\n return getCleanupCallback(type, callback, stopOnCallback ? stopListening : undefined);\n}\n\nfunction instrumentPerformanceObserver(type: InstrumentHandlerTypePerformanceObserver): void {\n const options: PerformanceObserverInit = {};\n\n // Special per-type options we want to use\n if (type === 'event') {\n options.durationThreshold = 0;\n }\n\n observe(\n type,\n entries => {\n triggerHandlers(type, { entries });\n },\n options,\n );\n}\n\nfunction addHandler(type: InstrumentHandlerType, handler: InstrumentHandlerCallback): void {\n handlers[type] = handlers[type] || [];\n (handlers[type] as InstrumentHandlerCallback[]).push(handler);\n}\n\n// Get a callback which can be called to remove the instrumentation handler\nfunction getCleanupCallback(\n type: InstrumentHandlerType,\n callback: InstrumentHandlerCallback,\n stopListening: StopListening,\n): CleanupHandlerCallback {\n return () => {\n if (stopListening) {\n stopListening();\n }\n\n const typeHandlers = handlers[type];\n\n if (!typeHandlers) {\n return;\n }\n\n const index = typeHandlers.indexOf(callback);\n if (index !== -1) {\n typeHandlers.splice(index, 1);\n }\n };\n}\n\n/**\n * Check if a PerformanceEntry is a PerformanceEventTiming by checking for the `duration` property.\n */\nexport function isPerformanceEventTiming(entry: PerformanceEntry): entry is PerformanceEventTiming {\n return 'duration' in entry;\n}\n","import { getClient } from '../currentScopes';\nimport type { Options } from '../types-hoist';\n\n// Treeshakable guard to remove all code related to tracing\ndeclare const __SENTRY_TRACING__: boolean | undefined;\n\n/**\n * Determines if span recording is currently enabled.\n *\n * Spans are recorded when at least one of `tracesSampleRate` and `tracesSampler`\n * is defined in the SDK config. This function does not make any assumption about\n * sampling decisions, it only checks if the SDK is configured to record spans.\n *\n * Important: This function only determines if span recording is enabled. Trace\n * continuation and propagation is separately controlled and not covered by this function.\n * If this function returns `false`, traces can still be propagated (which is what\n * we refer to by \"Tracing without Performance\")\n * @see https://develop.sentry.dev/sdk/telemetry/traces/tracing-without-performance/\n *\n * @param maybeOptions An SDK options object to be passed to this function.\n * If this option is not provided, the function will use the current client's options.\n */\nexport function hasSpansEnabled(\n maybeOptions?: Pick<Options, 'tracesSampleRate' | 'tracesSampler'> | undefined,\n): boolean {\n if (typeof __SENTRY_TRACING__ === 'boolean' && !__SENTRY_TRACING__) {\n return false;\n }\n\n const options = maybeOptions || getClient()?.getOptions();\n return (\n !!options &&\n // Note: This check is `!= null`, meaning \"nullish\". `0` is not \"nullish\", `undefined` and `null` are. (This comment was brought to you by 15 minutes of questioning life)\n (options.tracesSampleRate != null || !!options.tracesSampler)\n );\n}\n\n/**\n * @see JSDoc of `hasSpansEnabled`\n * @deprecated Use `hasSpansEnabled` instead, which is a more accurately named version of this function.\n * This function will be removed in the next major version of the SDK.\n */\n// TODO(v10): Remove this export\nexport const hasTracingEnabled = hasSpansEnabled;\n","export const DEFAULT_ENVIRONMENT = 'production';\n","import type { Client } from '../client';\nimport { DEFAULT_ENVIRONMENT } from '../constants';\nimport { getClient } from '../currentScopes';\nimport type { Scope } from '../scope';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from '../semanticAttributes';\nimport type { DynamicSamplingContext, Span } from '../types-hoist';\nimport {\n baggageHeaderToDynamicSamplingContext,\n dynamicSamplingContextToSentryBaggageHeader,\n} from '../utils-hoist/baggage';\nimport { addNonEnumerableProperty, dropUndefinedKeys } from '../utils-hoist/object';\nimport { hasSpansEnabled } from '../utils/hasSpansEnabled';\nimport { getRootSpan, spanIsSampled, spanToJSON } from '../utils/spanUtils';\nimport { getCapturedScopesOnSpan } from './utils';\n\n/**\n * If you change this value, also update the terser plugin config to\n * avoid minification of the object property!\n */\nconst FROZEN_DSC_FIELD = '_frozenDsc';\n\ntype SpanWithMaybeDsc = Span & {\n [FROZEN_DSC_FIELD]?: Partial<DynamicSamplingContext> | undefined;\n};\n\n/**\n * Freeze the given DSC on the given span.\n */\nexport function freezeDscOnSpan(span: Span, dsc: Partial<DynamicSamplingContext>): void {\n const spanWithMaybeDsc = span as SpanWithMaybeDsc;\n addNonEnumerableProperty(spanWithMaybeDsc, FROZEN_DSC_FIELD, dsc);\n}\n\n/**\n * Creates a dynamic sampling context from a client.\n *\n * Dispatches the `createDsc` lifecycle hook as a side effect.\n */\nexport function getDynamicSamplingContextFromClient(trace_id: string, client: Client): DynamicSamplingContext {\n const options = client.getOptions();\n\n const { publicKey: public_key } = client.getDsn() || {};\n\n const dsc = dropUndefinedKeys({\n environment: options.environment || DEFAULT_ENVIRONMENT,\n release: options.release,\n public_key,\n trace_id,\n }) satisfies DynamicSamplingContext;\n\n client.emit('createDsc', dsc);\n\n return dsc;\n}\n\n/**\n * Get the dynamic sampling context for the currently active scopes.\n */\nexport function getDynamicSamplingContextFromScope(client: Client, scope: Scope): Partial<DynamicSamplingContext> {\n const propagationContext = scope.getPropagationContext();\n return propagationContext.dsc || getDynamicSamplingContextFromClient(propagationContext.traceId, client);\n}\n\n/**\n * Creates a dynamic sampling context from a span (and client and scope)\n *\n * @param span the span from which a few values like the root span name and sample rate are extracted.\n *\n * @returns a dynamic sampling context\n */\nexport function getDynamicSamplingContextFromSpan(span: Span): Readonly<Partial<DynamicSamplingContext>> {\n const client = getClient();\n if (!client) {\n return {};\n }\n\n const rootSpan = getRootSpan(span);\n const rootSpanJson = spanToJSON(rootSpan);\n const rootSpanAttributes = rootSpanJson.data;\n const traceState = rootSpan.spanContext().traceState;\n\n // The span sample rate that was locally applied to the root span should also always be applied to the DSC, even if the DSC is frozen.\n // This is so that the downstream traces/services can use parentSampleRate in their `tracesSampler` to make consistent sampling decisions across the entire trace.\n const rootSpanSampleRate =\n traceState?.get('sentry.sample_rate') ?? rootSpanAttributes[SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE];\n function applyLocalSampleRateToDsc(dsc: Partial<DynamicSamplingContext>): Partial<DynamicSamplingContext> {\n if (typeof rootSpanSampleRate === 'number' || typeof rootSpanSampleRate === 'string') {\n dsc.sample_rate = `${rootSpanSampleRate}`;\n }\n return dsc;\n }\n\n // For core implementation, we freeze the DSC onto the span as a non-enumerable property\n const frozenDsc = (rootSpan as SpanWithMaybeDsc)[FROZEN_DSC_FIELD];\n if (frozenDsc) {\n return applyLocalSampleRateToDsc(frozenDsc);\n }\n\n // For OpenTelemetry, we freeze the DSC on the trace state\n const traceStateDsc = traceState?.get('sentry.dsc');\n\n // If the span has a DSC, we want it to take precedence\n const dscOnTraceState = traceStateDsc && baggageHeaderToDynamicSamplingContext(traceStateDsc);\n\n if (dscOnTraceState) {\n return applyLocalSampleRateToDsc(dscOnTraceState);\n }\n\n // Else, we generate it from the span\n const dsc = getDynamicSamplingContextFromClient(span.spanContext().traceId, client);\n\n // We don't want to have a transaction name in the DSC if the source is \"url\" because URLs might contain PII\n const source = rootSpanAttributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE];\n\n // after JSON conversion, txn.name becomes jsonSpan.description\n const name = rootSpanJson.description;\n if (source !== 'url' && name) {\n dsc.transaction = name;\n }\n\n // How can we even land here with hasSpansEnabled() returning false?\n // Otel creates a Non-recording span in Tracing Without Performance mode when handling incoming requests\n // So we end up with an active span that is not sampled (neither positively nor negatively)\n if (hasSpansEnabled()) {\n dsc.sampled = String(spanIsSampled(rootSpan));\n dsc.sample_rand =\n // In OTEL we store the sample rand on the trace state because we cannot access scopes for NonRecordingSpans\n // The Sentry OTEL SpanSampler takes care of writing the sample rand on the root span\n traceState?.get('sentry.sample_rand') ??\n // On all other platforms we can actually get the scopes from a root span (we use this as a fallback)\n getCapturedScopesOnSpan(rootSpan).scope?.getPropagationContext().sampleRand.toString();\n }\n\n applyLocalSampleRateToDsc(dsc);\n\n client.emit('createDsc', dsc, rootSpan);\n\n return dsc;\n}\n\n/**\n * Convert a Span to a baggage header.\n */\nexport function spanToBaggageHeader(span: Span): string | undefined {\n const dsc = getDynamicSamplingContextFromSpan(span);\n return dynamicSamplingContextToSentryBaggageHeader(dsc);\n}\n","import type {\n SentrySpanArguments,\n Span,\n SpanAttributeValue,\n SpanAttributes,\n SpanContextData,\n SpanStatus,\n SpanTimeInput,\n} from '../types-hoist';\nimport { generateSpanId, generateTraceId } from '../utils-hoist/propagationContext';\nimport { TRACE_FLAG_NONE } from '../utils/spanUtils';\n\n/**\n * A Sentry Span that is non-recording, meaning it will not be sent to Sentry.\n */\nexport class SentryNonRecordingSpan implements Span {\n private _traceId: string;\n private _spanId: string;\n\n public constructor(spanContext: SentrySpanArguments = {}) {\n this._traceId = spanContext.traceId || generateTraceId();\n this._spanId = spanContext.spanId || generateSpanId();\n }\n\n /** @inheritdoc */\n public spanContext(): SpanContextData {\n return {\n spanId: this._spanId,\n traceId: this._traceId,\n traceFlags: TRACE_FLAG_NONE,\n };\n }\n\n /** @inheritdoc */\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n public end(_timestamp?: SpanTimeInput): void {}\n\n /** @inheritdoc */\n public setAttribute(_key: string, _value: SpanAttributeValue | undefined): this {\n return this;\n }\n\n /** @inheritdoc */\n public setAttributes(_values: SpanAttributes): this {\n return this;\n }\n\n /** @inheritdoc */\n public setStatus(_status: SpanStatus): this {\n return this;\n }\n\n /** @inheritdoc */\n public updateName(_name: string): this {\n return this;\n }\n\n /** @inheritdoc */\n public isRecording(): boolean {\n return false;\n }\n\n /** @inheritdoc */\n public addEvent(\n _name: string,\n _attributesOrStartTime?: SpanAttributes | SpanTimeInput,\n _startTime?: SpanTimeInput,\n ): this {\n return this;\n }\n\n /** @inheritDoc */\n public addLink(_link: unknown): this {\n return this;\n }\n\n /** @inheritDoc */\n public addLinks(_links: unknown[]): this {\n return this;\n }\n\n /**\n * This should generally not be used,\n * but we need it for being compliant with the OTEL Span interface.\n *\n * @hidden\n * @internal\n */\n public recordException(_exception: unknown, _time?: number | undefined): void {\n // noop\n }\n}\n","import type { DsnComponents, DsnLike, DsnProtocol } from '../types-hoist';\n\nimport { DEBUG_BUILD } from './debug-build';\nimport { consoleSandbox, logger } from './logger';\n\n/** Regular expression used to parse a Dsn. */\nconst DSN_REGEX = /^(?:(\\w+):)\\/\\/(?:(\\w+)(?::(\\w+)?)?@)([\\w.-]+)(?::(\\d+))?\\/(.+)/;\n\nfunction isValidProtocol(protocol?: string): protocol is DsnProtocol {\n return protocol === 'http' || protocol === 'https';\n}\n\n/**\n * Renders the string representation of this Dsn.\n *\n * By default, this will render the public representation without the password\n * component. To get the deprecated private representation, set `withPassword`\n * to true.\n *\n * @param withPassword When set to true, the password will be included.\n */\nexport function dsnToString(dsn: DsnComponents, withPassword: boolean = false): string {\n const { host, path, pass, port, projectId, protocol, publicKey } = dsn;\n return (\n `${protocol}://${publicKey}${withPassword && pass ? `:${pass}` : ''}` +\n `@${host}${port ? `:${port}` : ''}/${path ? `${path}/` : path}${projectId}`\n );\n}\n\n/**\n * Parses a Dsn from a given string.\n *\n * @param str A Dsn as string\n * @returns Dsn as DsnComponents or undefined if @param str is not a valid DSN string\n */\nexport function dsnFromString(str: string): DsnComponents | undefined {\n const match = DSN_REGEX.exec(str);\n\n if (!match) {\n // This should be logged to the console\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.error(`Invalid Sentry Dsn: ${str}`);\n });\n return undefined;\n }\n\n const [protocol, publicKey, pass = '', host = '', port = '', lastPath = ''] = match.slice(1);\n let path = '';\n let projectId = lastPath;\n\n const split = projectId.split('/');\n if (split.length > 1) {\n path = split.slice(0, -1).join('/');\n projectId = split.pop() as string;\n }\n\n if (projectId) {\n const projectMatch = projectId.match(/^\\d+/);\n if (projectMatch) {\n projectId = projectMatch[0];\n }\n }\n\n return dsnFromComponents({ host, pass, path, projectId, port, protocol: protocol as DsnProtocol, publicKey });\n}\n\nfunction dsnFromComponents(components: DsnComponents): DsnComponents {\n return {\n protocol: components.protocol,\n publicKey: components.publicKey || '',\n pass: components.pass || '',\n host: components.host,\n port: components.port || '',\n path: components.path || '',\n projectId: components.projectId,\n };\n}\n\nfunction validateDsn(dsn: DsnComponents): boolean {\n if (!DEBUG_BUILD) {\n return true;\n }\n\n const { port, projectId, protocol } = dsn;\n\n const requiredComponents: ReadonlyArray<keyof DsnComponents> = ['protocol', 'publicKey', 'host', 'projectId'];\n const hasMissingRequiredComponent = requiredComponents.find(component => {\n if (!dsn[component]) {\n logger.error(`Invalid Sentry Dsn: ${component} missing`);\n return true;\n }\n return false;\n });\n\n if (hasMissingRequiredComponent) {\n return false;\n }\n\n if (!projectId.match(/^\\d+$/)) {\n logger.error(`Invalid Sentry Dsn: Invalid projectId ${projectId}`);\n return false;\n }\n\n if (!isValidProtocol(protocol)) {\n logger.error(`Invalid Sentry Dsn: Invalid protocol ${protocol}`);\n return false;\n }\n\n if (port && isNaN(parseInt(port, 10))) {\n logger.error(`Invalid Sentry Dsn: Invalid port ${port}`);\n return false;\n }\n\n return true;\n}\n\n/**\n * Creates a valid Sentry Dsn object, identifying a Sentry instance and project.\n * @returns a valid DsnComponents object or `undefined` if @param from is an invalid DSN source\n */\nexport function makeDsn(from: DsnLike): DsnComponents | undefined {\n const components = typeof from === 'string' ? dsnFromString(from) : dsnFromComponents(from);\n if (!components || !validateDsn(components)) {\n return undefined;\n }\n return components;\n}\n","import type { Primitive } from '../types-hoist';\n\nimport { isSyntheticEvent, isVueViewModel } from './is';\nimport { convertToPlainObject } from './object';\nimport { getFunctionName } from './stacktrace';\n\ntype Prototype = { constructor?: (...args: unknown[]) => unknown };\n// This is a hack to placate TS, relying on the fact that technically, arrays are objects with integer keys. Normally we\n// think of those keys as actual numbers, but `arr['0']` turns out to work just as well as `arr[0]`, and doing it this\n// way lets us use a single type in the places where behave as if we are only dealing with objects, even if some of them\n// might be arrays.\ntype ObjOrArray<T> = { [key: string]: T };\n\ntype MemoFunc = [\n // memoize\n (obj: object) => boolean,\n // unmemoize\n (obj: object) => void,\n];\n\n/**\n * Recursively normalizes the given object.\n *\n * - Creates a copy to prevent original input mutation\n * - Skips non-enumerable properties\n * - When stringifying, calls `toJSON` if implemented\n * - Removes circular references\n * - Translates non-serializable values (`undefined`/`NaN`/functions) to serializable format\n * - Translates known global objects/classes to a string representations\n * - Takes care of `Error` object serialization\n * - Optionally limits depth of final output\n * - Optionally limits number of properties/elements included in any single object/array\n *\n * @param input The object to be normalized.\n * @param depth The max depth to which to normalize the object. (Anything deeper stringified whole.)\n * @param maxProperties The max number of elements or properties to be included in any single array or\n * object in the normalized output.\n * @returns A normalized version of the object, or `\"**non-serializable**\"` if any errors are thrown during normalization.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function normalize(input: unknown, depth: number = 100, maxProperties: number = +Infinity): any {\n try {\n // since we're at the outermost level, we don't provide a key\n return visit('', input, depth, maxProperties);\n } catch (err) {\n return { ERROR: `**non-serializable** (${err})` };\n }\n}\n\n/** JSDoc */\nexport function normalizeToSize<T>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n object: { [key: string]: any },\n // Default Node.js REPL depth\n depth: number = 3,\n // 100kB, as 200kB is max payload size, so half sounds reasonable\n maxSize: number = 100 * 1024,\n): T {\n const normalized = normalize(object, depth);\n\n if (jsonSize(normalized) > maxSize) {\n return normalizeToSize(object, depth - 1, maxSize);\n }\n\n return normalized as T;\n}\n\n/**\n * Visits a node to perform normalization on it\n *\n * @param key The key corresponding to the given node\n * @param value The node to be visited\n * @param depth Optional number indicating the maximum recursion depth\n * @param maxProperties Optional maximum number of properties/elements included in any single object/array\n * @param memo Optional Memo class handling decycling\n */\nfunction visit(\n key: string,\n value: unknown,\n depth: number = +Infinity,\n maxProperties: number = +Infinity,\n memo = memoBuilder(),\n): Primitive | ObjOrArray<unknown> {\n const [memoize, unmemoize] = memo;\n\n // Get the simple cases out of the way first\n if (\n value == null || // this matches null and undefined -> eqeq not eqeqeq\n ['boolean', 'string'].includes(typeof value) ||\n (typeof value === 'number' && Number.isFinite(value))\n ) {\n return value as Primitive;\n }\n\n const stringified = stringifyValue(key, value);\n\n // Anything we could potentially dig into more (objects or arrays) will have come back as `\"[object XXXX]\"`.\n // Everything else will have already been serialized, so if we don't see that pattern, we're done.\n if (!stringified.startsWith('[object ')) {\n return stringified;\n }\n\n // From here on, we can assert that `value` is either an object or an array.\n\n // Do not normalize objects that we know have already been normalized. As a general rule, the\n // \"__sentry_skip_normalization__\" property should only be used sparingly and only should only be set on objects that\n // have already been normalized.\n if ((value as ObjOrArray<unknown>)['__sentry_skip_normalization__']) {\n return value as ObjOrArray<unknown>;\n }\n\n // We can set `__sentry_override_normalization_depth__` on an object to ensure that from there\n // We keep a certain amount of depth.\n // This should be used sparingly, e.g. we use it for the redux integration to ensure we get a certain amount of state.\n const remainingDepth =\n typeof (value as ObjOrArray<unknown>)['__sentry_override_normalization_depth__'] === 'number'\n ? ((value as ObjOrArray<unknown>)['__sentry_override_normalization_depth__'] as number)\n : depth;\n\n // We're also done if we've reached the max depth\n if (remainingDepth === 0) {\n // At this point we know `serialized` is a string of the form `\"[object XXXX]\"`. Clean it up so it's just `\"[XXXX]\"`.\n return stringified.replace('object ', '');\n }\n\n // If we've already visited this branch, bail out, as it's circular reference. If not, note that we're seeing it now.\n if (memoize(value)) {\n return '[Circular ~]';\n }\n\n // If the value has a `toJSON` method, we call it to extract more information\n const valueWithToJSON = value as unknown & { toJSON?: () => unknown };\n if (valueWithToJSON && typeof valueWithToJSON.toJSON === 'function') {\n try {\n const jsonValue = valueWithToJSON.toJSON();\n // We need to normalize the return value of `.toJSON()` in case it has circular references\n return visit('', jsonValue, remainingDepth - 1, maxProperties, memo);\n } catch (err) {\n // pass (The built-in `toJSON` failed, but we can still try to do it ourselves)\n }\n }\n\n // At this point we know we either have an object or an array, we haven't seen it before, and we're going to recurse\n // because we haven't yet reached the max depth. Create an accumulator to hold the results of visiting each\n // property/entry, and keep track of the number of items we add to it.\n const normalized = (Array.isArray(value) ? [] : {}) as ObjOrArray<unknown>;\n let numAdded = 0;\n\n // Before we begin, convert`Error` and`Event` instances into plain objects, since some of each of their relevant\n // properties are non-enumerable and otherwise would get missed.\n const visitable = convertToPlainObject(value as ObjOrArray<unknown>);\n\n for (const visitKey in visitable) {\n // Avoid iterating over fields in the prototype if they've somehow been exposed to enumeration.\n if (!Object.prototype.hasOwnProperty.call(visitable, visitKey)) {\n continue;\n }\n\n if (numAdded >= maxProperties) {\n normalized[visitKey] = '[MaxProperties ~]';\n break;\n }\n\n // Recursively visit all the child nodes\n const visitValue = visitable[visitKey];\n normalized[visitKey] = visit(visitKey, visitValue, remainingDepth - 1, maxProperties, memo);\n\n numAdded++;\n }\n\n // Once we've visited all the branches, remove the parent from memo storage\n unmemoize(value);\n\n // Return accumulated values\n return normalized;\n}\n\n/* eslint-disable complexity */\n/**\n * Stringify the given value. Handles various known special values and types.\n *\n * Not meant to be used on simple primitives which already have a string representation, as it will, for example, turn\n * the number 1231 into \"[Object Number]\", nor on `null`, as it will throw.\n *\n * @param value The value to stringify\n * @returns A stringified representation of the given value\n */\nfunction stringifyValue(\n key: unknown,\n // this type is a tiny bit of a cheat, since this function does handle NaN (which is technically a number), but for\n // our internal use, it'll do\n value: Exclude<unknown, string | number | boolean | null>,\n): string {\n try {\n if (key === 'domain' && value && typeof value === 'object' && (value as { _events: unknown })._events) {\n return '[Domain]';\n }\n\n if (key === 'domainEmitter') {\n return '[DomainEmitter]';\n }\n\n // It's safe to use `global`, `window`, and `document` here in this manner, as we are asserting using `typeof` first\n // which won't throw if they are not present.\n\n if (typeof global !== 'undefined' && value === global) {\n return '[Global]';\n }\n\n // eslint-disable-next-line no-restricted-globals\n if (typeof window !== 'undefined' && value === window) {\n return '[Window]';\n }\n\n // eslint-disable-next-line no-restricted-globals\n if (typeof document !== 'undefined' && value === document) {\n return '[Document]';\n }\n\n if (isVueViewModel(value)) {\n return '[VueViewModel]';\n }\n\n // React's SyntheticEvent thingy\n if (isSyntheticEvent(value)) {\n return '[SyntheticEvent]';\n }\n\n if (typeof value === 'number' && !Number.isFinite(value)) {\n return `[${value}]`;\n }\n\n if (typeof value === 'function') {\n return `[Function: ${getFunctionName(value)}]`;\n }\n\n if (typeof value === 'symbol') {\n return `[${String(value)}]`;\n }\n\n // stringified BigInts are indistinguishable from regular numbers, so we need to label them to avoid confusion\n if (typeof value === 'bigint') {\n return `[BigInt: ${String(value)}]`;\n }\n\n // Now that we've knocked out all the special cases and the primitives, all we have left are objects. Simply casting\n // them to strings means that instances of classes which haven't defined their `toStringTag` will just come out as\n // `\"[object Object]\"`. If we instead look at the constructor's name (which is the same as the name of the class),\n // we can make sure that only plain objects come out that way.\n const objName = getConstructorName(value);\n\n // Handle HTML Elements\n if (/^HTML(\\w*)Element$/.test(objName)) {\n return `[HTMLElement: ${objName}]`;\n }\n\n return `[object ${objName}]`;\n } catch (err) {\n return `**non-serializable** (${err})`;\n }\n}\n/* eslint-enable complexity */\n\nfunction getConstructorName(value: unknown): string {\n const prototype: Prototype | null = Object.getPrototypeOf(value);\n\n return prototype?.constructor ? prototype.constructor.name : 'null prototype';\n}\n\n/** Calculates bytes size of input string */\nfunction utf8Length(value: string): number {\n // eslint-disable-next-line no-bitwise\n return ~-encodeURI(value).split(/%..|./).length;\n}\n\n/** Calculates bytes size of input object */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction jsonSize(value: any): number {\n return utf8Length(JSON.stringify(value));\n}\n\n/**\n * Normalizes URLs in exceptions and stacktraces to a base path so Sentry can fingerprint\n * across platforms and working directory.\n *\n * @param url The URL to be normalized.\n * @param basePath The application base path.\n * @returns The normalized URL.\n */\nexport function normalizeUrlToBase(url: string, basePath: string): string {\n const escapedBase = basePath\n // Backslash to forward\n .replace(/\\\\/g, '/')\n // Escape RegExp special characters\n .replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&');\n\n let newUrl = url;\n try {\n newUrl = decodeURI(url);\n } catch (_Oo) {\n // Sometime this breaks\n }\n return (\n newUrl\n .replace(/\\\\/g, '/')\n .replace(/webpack:\\/?/g, '') // Remove intermediate base path\n // eslint-disable-next-line @sentry-internal/sdk/no-regexp-constructor\n .replace(new RegExp(`(file://)?/*${escapedBase}/*`, 'ig'), 'app:///')\n );\n}\n\n/**\n * Helper to decycle json objects\n */\nfunction memoBuilder(): MemoFunc {\n const inner = new WeakSet<object>();\n function memoize(obj: object): boolean {\n if (inner.has(obj)) {\n return true;\n }\n inner.add(obj);\n return false;\n }\n\n function unmemoize(obj: object): void {\n inner.delete(obj);\n }\n return [memoize, unmemoize];\n}\n","import { getSentryCarrier } from '../carrier';\nimport type {\n Attachment,\n AttachmentItem,\n BaseEnvelopeHeaders,\n BaseEnvelopeItemHeaders,\n DataCategory,\n DsnComponents,\n Envelope,\n EnvelopeItemType,\n Event,\n EventEnvelopeHeaders,\n SdkInfo,\n SdkMetadata,\n SpanItem,\n SpanJSON,\n} from '../types-hoist';\n\nimport { dsnToString } from './dsn';\nimport { normalize } from './normalize';\nimport { dropUndefinedKeys } from './object';\nimport { GLOBAL_OBJ } from './worldwide';\n\n/**\n * Creates an envelope.\n * Make sure to always explicitly provide the generic to this function\n * so that the envelope types resolve correctly.\n */\nexport function createEnvelope<E extends Envelope>(headers: E[0], items: E[1] = []): E {\n return [headers, items] as E;\n}\n\n/**\n * Add an item to an envelope.\n * Make sure to always explicitly provide the generic to this function\n * so that the envelope types resolve correctly.\n */\nexport function addItemToEnvelope<E extends Envelope>(envelope: E, newItem: E[1][number]): E {\n const [headers, items] = envelope;\n return [headers, [...items, newItem]] as unknown as E;\n}\n\n/**\n * Convenience function to loop through the items and item types of an envelope.\n * (This function was mostly created because working with envelope types is painful at the moment)\n *\n * If the callback returns true, the rest of the items will be skipped.\n */\nexport function forEachEnvelopeItem<E extends Envelope>(\n envelope: Envelope,\n callback: (envelopeItem: E[1][number], envelopeItemType: E[1][number][0]['type']) => boolean | void,\n): boolean {\n const envelopeItems = envelope[1];\n\n for (const envelopeItem of envelopeItems) {\n const envelopeItemType = envelopeItem[0].type;\n const result = callback(envelopeItem, envelopeItemType);\n\n if (result) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Returns true if the envelope contains any of the given envelope item types\n */\nexport function envelopeContainsItemType(envelope: Envelope, types: EnvelopeItemType[]): boolean {\n return forEachEnvelopeItem(envelope, (_, type) => types.includes(type));\n}\n\n/**\n * Encode a string to UTF8 array.\n */\nfunction encodeUTF8(input: string): Uint8Array {\n const carrier = getSentryCarrier(GLOBAL_OBJ);\n return carrier.encodePolyfill ? carrier.encodePolyfill(input) : new TextEncoder().encode(input);\n}\n\n/**\n * Decode a UTF8 array to string.\n */\nfunction decodeUTF8(input: Uint8Array): string {\n const carrier = getSentryCarrier(GLOBAL_OBJ);\n return carrier.decodePolyfill ? carrier.decodePolyfill(input) : new TextDecoder().decode(input);\n}\n\n/**\n * Serializes an envelope.\n */\nexport function serializeEnvelope(envelope: Envelope): string | Uint8Array {\n const [envHeaders, items] = envelope;\n\n // Initially we construct our envelope as a string and only convert to binary chunks if we encounter binary data\n let parts: string | Uint8Array[] = JSON.stringify(envHeaders);\n\n function append(next: string | Uint8Array): void {\n if (typeof parts === 'string') {\n parts = typeof next === 'string' ? parts + next : [encodeUTF8(parts), next];\n } else {\n parts.push(typeof next === 'string' ? encodeUTF8(next) : next);\n }\n }\n\n for (const item of items) {\n const [itemHeaders, payload] = item;\n\n append(`\\n${JSON.stringify(itemHeaders)}\\n`);\n\n if (typeof payload === 'string' || payload instanceof Uint8Array) {\n append(payload);\n } else {\n let stringifiedPayload: string;\n try {\n stringifiedPayload = JSON.stringify(payload);\n } catch (e) {\n // In case, despite all our efforts to keep `payload` circular-dependency-free, `JSON.stringify()` still\n // fails, we try again after normalizing it again with infinite normalization depth. This of course has a\n // performance impact but in this case a performance hit is better than throwing.\n stringifiedPayload = JSON.stringify(normalize(payload));\n }\n append(stringifiedPayload);\n }\n }\n\n return typeof parts === 'string' ? parts : concatBuffers(parts);\n}\n\nfunction concatBuffers(buffers: Uint8Array[]): Uint8Array {\n const totalLength = buffers.reduce((acc, buf) => acc + buf.length, 0);\n\n const merged = new Uint8Array(totalLength);\n let offset = 0;\n for (const buffer of buffers) {\n merged.set(buffer, offset);\n offset += buffer.length;\n }\n\n return merged;\n}\n\n/**\n * Parses an envelope\n */\nexport function parseEnvelope(env: string | Uint8Array): Envelope {\n let buffer = typeof env === 'string' ? encodeUTF8(env) : env;\n\n function readBinary(length: number): Uint8Array {\n const bin = buffer.subarray(0, length);\n // Replace the buffer with the remaining data excluding trailing newline\n buffer = buffer.subarray(length + 1);\n return bin;\n }\n\n function readJson<T>(): T {\n let i = buffer.indexOf(0xa);\n // If we couldn't find a newline, we must have found the end of the buffer\n if (i < 0) {\n i = buffer.length;\n }\n\n return JSON.parse(decodeUTF8(readBinary(i))) as T;\n }\n\n const envelopeHeader = readJson<BaseEnvelopeHeaders>();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const items: [any, any][] = [];\n\n while (buffer.length) {\n const itemHeader = readJson<BaseEnvelopeItemHeaders>();\n const binaryLength = typeof itemHeader.length === 'number' ? itemHeader.length : undefined;\n\n items.push([itemHeader, binaryLength ? readBinary(binaryLength) : readJson()]);\n }\n\n return [envelopeHeader, items];\n}\n\n/**\n * Creates envelope item for a single span\n */\nexport function createSpanEnvelopeItem(spanJson: Partial<SpanJSON>): SpanItem {\n const spanHeaders: SpanItem[0] = {\n type: 'span',\n };\n\n return [spanHeaders, spanJson];\n}\n\n/**\n * Creates attachment envelope items\n */\nexport function createAttachmentEnvelopeItem(attachment: Attachment): AttachmentItem {\n const buffer = typeof attachment.data === 'string' ? encodeUTF8(attachment.data) : attachment.data;\n\n return [\n dropUndefinedKeys({\n type: 'attachment',\n length: buffer.length,\n filename: attachment.filename,\n content_type: attachment.contentType,\n attachment_type: attachment.attachmentType,\n }),\n buffer,\n ];\n}\n\nconst ITEM_TYPE_TO_DATA_CATEGORY_MAP: Record<EnvelopeItemType, DataCategory> = {\n session: 'session',\n sessions: 'session',\n attachment: 'attachment',\n transaction: 'transaction',\n event: 'error',\n client_report: 'internal',\n user_report: 'default',\n profile: 'profile',\n profile_chunk: 'profile',\n replay_event: 'replay',\n replay_recording: 'replay',\n check_in: 'monitor',\n feedback: 'feedback',\n span: 'span',\n raw_security: 'security',\n otel_log: 'log_item',\n};\n\n/**\n * Maps the type of an envelope item to a data category.\n */\nexport function envelopeItemTypeToDataCategory(type: EnvelopeItemType): DataCategory {\n return ITEM_TYPE_TO_DATA_CATEGORY_MAP[type];\n}\n\n/** Extracts the minimal SDK info from the metadata or an events */\nexport function getSdkMetadataForEnvelopeHeader(metadataOrEvent?: SdkMetadata | Event): SdkInfo | undefined {\n if (!metadataOrEvent?.sdk) {\n return;\n }\n const { name, version } = metadataOrEvent.sdk;\n return { name, version };\n}\n\n/**\n * Creates event envelope headers, based on event, sdk info and tunnel\n * Note: This function was extracted from the core package to make it available in Replay\n */\nexport function createEventEnvelopeHeaders(\n event: Event,\n sdkInfo: SdkInfo | undefined,\n tunnel: string | undefined,\n dsn?: DsnComponents,\n): EventEnvelopeHeaders {\n const dynamicSamplingContext = event.sdkProcessingMetadata?.dynamicSamplingContext;\n return {\n event_id: event.event_id as string,\n sent_at: new Date().toISOString(),\n ...(sdkInfo && { sdk: sdkInfo }),\n ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n ...(dynamicSamplingContext && {\n trace: dynamicSamplingContext,\n }),\n };\n}\n","import type { Client } from './client';\nimport { getDynamicSamplingContextFromSpan } from './tracing/dynamicSamplingContext';\nimport type { SentrySpan } from './tracing/sentrySpan';\nimport type {\n DsnComponents,\n DynamicSamplingContext,\n Event,\n EventEnvelope,\n EventItem,\n LegacyCSPReport,\n RawSecurityEnvelope,\n RawSecurityItem,\n SdkInfo,\n SdkMetadata,\n Session,\n SessionAggregates,\n SessionEnvelope,\n SessionItem,\n SpanEnvelope,\n SpanItem,\n} from './types-hoist';\nimport { dsnToString } from './utils-hoist/dsn';\nimport {\n createEnvelope,\n createEventEnvelopeHeaders,\n createSpanEnvelopeItem,\n getSdkMetadataForEnvelopeHeader,\n} from './utils-hoist/envelope';\nimport { uuid4 } from './utils-hoist/misc';\nimport { showSpanDropWarning, spanToJSON } from './utils/spanUtils';\n\n/**\n * Apply SdkInfo (name, version, packages, integrations) to the corresponding event key.\n * Merge with existing data if any.\n **/\nfunction enhanceEventWithSdkInfo(event: Event, sdkInfo?: SdkInfo): Event {\n if (!sdkInfo) {\n return event;\n }\n event.sdk = event.sdk || {};\n event.sdk.name = event.sdk.name || sdkInfo.name;\n event.sdk.version = event.sdk.version || sdkInfo.version;\n event.sdk.integrations = [...(event.sdk.integrations || []), ...(sdkInfo.integrations || [])];\n event.sdk.packages = [...(event.sdk.packages || []), ...(sdkInfo.packages || [])];\n return event;\n}\n\n/** Creates an envelope from a Session */\nexport function createSessionEnvelope(\n session: Session | SessionAggregates,\n dsn?: DsnComponents,\n metadata?: SdkMetadata,\n tunnel?: string,\n): SessionEnvelope {\n const sdkInfo = getSdkMetadataForEnvelopeHeader(metadata);\n const envelopeHeaders = {\n sent_at: new Date().toISOString(),\n ...(sdkInfo && { sdk: sdkInfo }),\n ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n };\n\n const envelopeItem: SessionItem =\n 'aggregates' in session ? [{ type: 'sessions' }, session] : [{ type: 'session' }, session.toJSON()];\n\n return createEnvelope<SessionEnvelope>(envelopeHeaders, [envelopeItem]);\n}\n\n/**\n * Create an Envelope from an event.\n */\nexport function createEventEnvelope(\n event: Event,\n dsn?: DsnComponents,\n metadata?: SdkMetadata,\n tunnel?: string,\n): EventEnvelope {\n const sdkInfo = getSdkMetadataForEnvelopeHeader(metadata);\n\n /*\n Note: Due to TS, event.type may be `replay_event`, theoretically.\n In practice, we never call `createEventEnvelope` with `replay_event` type,\n and we'd have to adjust a looot of types to make this work properly.\n We want to avoid casting this around, as that could lead to bugs (e.g. when we add another type)\n So the safe choice is to really guard against the replay_event type here.\n */\n const eventType = event.type && event.type !== 'replay_event' ? event.type : 'event';\n\n enhanceEventWithSdkInfo(event, metadata?.sdk);\n\n const envelopeHeaders = createEventEnvelopeHeaders(event, sdkInfo, tunnel, dsn);\n\n // Prevent this data (which, if it exists, was used in earlier steps in the processing pipeline) from being sent to\n // sentry. (Note: Our use of this property comes and goes with whatever we might be debugging, whatever hacks we may\n // have temporarily added, etc. Even if we don't happen to be using it at some point in the future, let's not get rid\n // of this `delete`, lest we miss putting it back in the next time the property is in use.)\n delete event.sdkProcessingMetadata;\n\n const eventItem: EventItem = [{ type: eventType }, event];\n return createEnvelope<EventEnvelope>(envelopeHeaders, [eventItem]);\n}\n\n/**\n * Create envelope from Span item.\n *\n * Takes an optional client and runs spans through `beforeSendSpan` if available.\n */\nexport function createSpanEnvelope(spans: [SentrySpan, ...SentrySpan[]], client?: Client): SpanEnvelope {\n function dscHasRequiredProps(dsc: Partial<DynamicSamplingContext>): dsc is DynamicSamplingContext {\n return !!dsc.trace_id && !!dsc.public_key;\n }\n\n // For the moment we'll obtain the DSC from the first span in the array\n // This might need to be changed if we permit sending multiple spans from\n // different segments in one envelope\n const dsc = getDynamicSamplingContextFromSpan(spans[0]);\n\n const dsn = client?.getDsn();\n const tunnel = client?.getOptions().tunnel;\n\n const headers: SpanEnvelope[0] = {\n sent_at: new Date().toISOString(),\n ...(dscHasRequiredProps(dsc) && { trace: dsc }),\n ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n };\n\n const beforeSendSpan = client?.getOptions().beforeSendSpan;\n const convertToSpanJSON = beforeSendSpan\n ? (span: SentrySpan) => {\n const spanJson = spanToJSON(span);\n const processedSpan = beforeSendSpan(spanJson);\n\n if (!processedSpan) {\n showSpanDropWarning();\n return spanJson;\n }\n\n return processedSpan;\n }\n : spanToJSON;\n\n const items: SpanItem[] = [];\n for (const span of spans) {\n const spanJson = convertToSpanJSON(span);\n if (spanJson) {\n items.push(createSpanEnvelopeItem(spanJson));\n }\n }\n\n return createEnvelope<SpanEnvelope>(headers, items);\n}\n\n/**\n * Create an Envelope from a CSP report.\n */\nexport function createRawSecurityEnvelope(\n report: LegacyCSPReport,\n dsn: DsnComponents,\n tunnel?: string,\n release?: string,\n environment?: string,\n): RawSecurityEnvelope {\n const envelopeHeaders = {\n event_id: uuid4(),\n ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n };\n\n const eventItem: RawSecurityItem = [\n { type: 'raw_security', sentry_release: release, sentry_environment: environment },\n report,\n ];\n\n return createEnvelope<RawSecurityEnvelope>(envelopeHeaders, [eventItem]);\n}\n","import { getClient, getCurrentScope } from '../currentScopes';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { createSpanEnvelope } from '../envelope';\nimport {\n SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME,\n SEMANTIC_ATTRIBUTE_PROFILE_ID,\n SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME,\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n} from '../semanticAttributes';\nimport type {\n SentrySpanArguments,\n Span,\n SpanAttributeValue,\n SpanAttributes,\n SpanContextData,\n SpanEnvelope,\n SpanJSON,\n SpanOrigin,\n SpanStatus,\n SpanTimeInput,\n TimedEvent,\n TransactionEvent,\n TransactionSource,\n} from '../types-hoist';\nimport type { SpanLink } from '../types-hoist/link';\nimport { logger } from '../utils-hoist/logger';\nimport { dropUndefinedKeys } from '../utils-hoist/object';\nimport { generateSpanId, generateTraceId } from '../utils-hoist/propagationContext';\nimport { timestampInSeconds } from '../utils-hoist/time';\nimport {\n TRACE_FLAG_NONE,\n TRACE_FLAG_SAMPLED,\n convertSpanLinksForEnvelope,\n getRootSpan,\n getSpanDescendants,\n getStatusMessage,\n spanTimeInputToSeconds,\n spanToJSON,\n spanToTransactionTraceContext,\n} from '../utils/spanUtils';\nimport { getDynamicSamplingContextFromSpan } from './dynamicSamplingContext';\nimport { logSpanEnd } from './logSpans';\nimport { timedEventsToMeasurements } from './measurement';\nimport { getCapturedScopesOnSpan } from './utils';\n\nconst MAX_SPAN_COUNT = 1000;\n\n/**\n * Span contains all data about a span\n */\nexport class SentrySpan implements Span {\n protected _traceId: string;\n protected _spanId: string;\n protected _parentSpanId?: string | undefined;\n protected _sampled: boolean | undefined;\n protected _name?: string | undefined;\n protected _attributes: SpanAttributes;\n protected _links?: SpanLink[];\n /** Epoch timestamp in seconds when the span started. */\n protected _startTime: number;\n /** Epoch timestamp in seconds when the span ended. */\n protected _endTime?: number | undefined;\n /** Internal keeper of the status */\n protected _status?: SpanStatus;\n /** The timed events added to this span. */\n protected _events: TimedEvent[];\n\n /** if true, treat span as a standalone span (not part of a transaction) */\n private _isStandaloneSpan?: boolean;\n\n /**\n * You should never call the constructor manually, always use `Sentry.startSpan()`\n * or other span methods.\n * @internal\n * @hideconstructor\n * @hidden\n */\n public constructor(spanContext: SentrySpanArguments = {}) {\n this._traceId = spanContext.traceId || generateTraceId();\n this._spanId = spanContext.spanId || generateSpanId();\n this._startTime = spanContext.startTimestamp || timestampInSeconds();\n this._links = spanContext.links;\n\n this._attributes = {};\n this.setAttributes({\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'manual',\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: spanContext.op,\n ...spanContext.attributes,\n });\n\n this._name = spanContext.name;\n\n if (spanContext.parentSpanId) {\n this._parentSpanId = spanContext.parentSpanId;\n }\n // We want to include booleans as well here\n if ('sampled' in spanContext) {\n this._sampled = spanContext.sampled;\n }\n if (spanContext.endTimestamp) {\n this._endTime = spanContext.endTimestamp;\n }\n\n this._events = [];\n\n this._isStandaloneSpan = spanContext.isStandalone;\n\n // If the span is already ended, ensure we finalize the span immediately\n if (this._endTime) {\n this._onSpanEnded();\n }\n }\n\n /** @inheritDoc */\n public addLink(link: SpanLink): this {\n if (this._links) {\n this._links.push(link);\n } else {\n this._links = [link];\n }\n return this;\n }\n\n /** @inheritDoc */\n public addLinks(links: SpanLink[]): this {\n if (this._links) {\n this._links.push(...links);\n } else {\n this._links = links;\n }\n return this;\n }\n\n /**\n * This should generally not be used,\n * but it is needed for being compliant with the OTEL Span interface.\n *\n * @hidden\n * @internal\n */\n public recordException(_exception: unknown, _time?: number | undefined): void {\n // noop\n }\n\n /** @inheritdoc */\n public spanContext(): SpanContextData {\n const { _spanId: spanId, _traceId: traceId, _sampled: sampled } = this;\n return {\n spanId,\n traceId,\n traceFlags: sampled ? TRACE_FLAG_SAMPLED : TRACE_FLAG_NONE,\n };\n }\n\n /** @inheritdoc */\n public setAttribute(key: string, value: SpanAttributeValue | undefined): this {\n if (value === undefined) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete this._attributes[key];\n } else {\n this._attributes[key] = value;\n }\n\n return this;\n }\n\n /** @inheritdoc */\n public setAttributes(attributes: SpanAttributes): this {\n Object.keys(attributes).forEach(key => this.setAttribute(key, attributes[key]));\n return this;\n }\n\n /**\n * This should generally not be used,\n * but we need it for browser tracing where we want to adjust the start time afterwards.\n * USE THIS WITH CAUTION!\n *\n * @hidden\n * @internal\n */\n public updateStartTime(timeInput: SpanTimeInput): void {\n this._startTime = spanTimeInputToSeconds(timeInput);\n }\n\n /**\n * @inheritDoc\n */\n public setStatus(value: SpanStatus): this {\n this._status = value;\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public updateName(name: string): this {\n this._name = name;\n this.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, 'custom');\n return this;\n }\n\n /** @inheritdoc */\n public end(endTimestamp?: SpanTimeInput): void {\n // If already ended, skip\n if (this._endTime) {\n return;\n }\n\n this._endTime = spanTimeInputToSeconds(endTimestamp);\n logSpanEnd(this);\n\n this._onSpanEnded();\n }\n\n /**\n * Get JSON representation of this span.\n *\n * @hidden\n * @internal This method is purely for internal purposes and should not be used outside\n * of SDK code. If you need to get a JSON representation of a span,\n * use `spanToJSON(span)` instead.\n */\n public getSpanJSON(): SpanJSON {\n return dropUndefinedKeys({\n data: this._attributes,\n description: this._name,\n op: this._attributes[SEMANTIC_ATTRIBUTE_SENTRY_OP],\n parent_span_id: this._parentSpanId,\n span_id: this._spanId,\n start_timestamp: this._startTime,\n status: getStatusMessage(this._status),\n timestamp: this._endTime,\n trace_id: this._traceId,\n origin: this._attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] as SpanOrigin | undefined,\n profile_id: this._attributes[SEMANTIC_ATTRIBUTE_PROFILE_ID] as string | undefined,\n exclusive_time: this._attributes[SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME] as number | undefined,\n measurements: timedEventsToMeasurements(this._events),\n is_segment: (this._isStandaloneSpan && getRootSpan(this) === this) || undefined,\n segment_id: this._isStandaloneSpan ? getRootSpan(this).spanContext().spanId : undefined,\n links: convertSpanLinksForEnvelope(this._links),\n });\n }\n\n /** @inheritdoc */\n public isRecording(): boolean {\n return !this._endTime && !!this._sampled;\n }\n\n /**\n * @inheritdoc\n */\n public addEvent(\n name: string,\n attributesOrStartTime?: SpanAttributes | SpanTimeInput,\n startTime?: SpanTimeInput,\n ): this {\n DEBUG_BUILD && logger.log('[Tracing] Adding an event to span:', name);\n\n const time = isSpanTimeInput(attributesOrStartTime) ? attributesOrStartTime : startTime || timestampInSeconds();\n const attributes = isSpanTimeInput(attributesOrStartTime) ? {} : attributesOrStartTime || {};\n\n const event: TimedEvent = {\n name,\n time: spanTimeInputToSeconds(time),\n attributes,\n };\n\n this._events.push(event);\n\n return this;\n }\n\n /**\n * This method should generally not be used,\n * but for now we need a way to publicly check if the `_isStandaloneSpan` flag is set.\n * USE THIS WITH CAUTION!\n * @internal\n * @hidden\n * @experimental\n */\n public isStandaloneSpan(): boolean {\n return !!this._isStandaloneSpan;\n }\n\n /** Emit `spanEnd` when the span is ended. */\n private _onSpanEnded(): void {\n const client = getClient();\n if (client) {\n client.emit('spanEnd', this);\n }\n\n // A segment span is basically the root span of a local span tree.\n // So for now, this is either what we previously refer to as the root span,\n // or a standalone span.\n const isSegmentSpan = this._isStandaloneSpan || this === getRootSpan(this);\n\n if (!isSegmentSpan) {\n return;\n }\n\n // if this is a standalone span, we send it immediately\n if (this._isStandaloneSpan) {\n if (this._sampled) {\n sendSpanEnvelope(createSpanEnvelope([this], client));\n } else {\n DEBUG_BUILD &&\n logger.log('[Tracing] Discarding standalone span because its trace was not chosen to be sampled.');\n if (client) {\n client.recordDroppedEvent('sample_rate', 'span');\n }\n }\n return;\n }\n\n const transactionEvent = this._convertSpanToTransaction();\n if (transactionEvent) {\n const scope = getCapturedScopesOnSpan(this).scope || getCurrentScope();\n scope.captureEvent(transactionEvent);\n }\n }\n\n /**\n * Finish the transaction & prepare the event to send to Sentry.\n */\n private _convertSpanToTransaction(): TransactionEvent | undefined {\n // We can only convert finished spans\n if (!isFullFinishedSpan(spanToJSON(this))) {\n return undefined;\n }\n\n if (!this._name) {\n DEBUG_BUILD && logger.warn('Transaction has no name, falling back to `<unlabeled transaction>`.');\n this._name = '<unlabeled transaction>';\n }\n\n const { scope: capturedSpanScope, isolationScope: capturedSpanIsolationScope } = getCapturedScopesOnSpan(this);\n\n if (this._sampled !== true) {\n return undefined;\n }\n\n // The transaction span itself as well as any potential standalone spans should be filtered out\n const finishedSpans = getSpanDescendants(this).filter(span => span !== this && !isStandaloneSpan(span));\n\n const spans = finishedSpans.map(span => spanToJSON(span)).filter(isFullFinishedSpan);\n\n const source = this._attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE] as TransactionSource | undefined;\n\n // remove internal root span attributes we don't need to send.\n /* eslint-disable @typescript-eslint/no-dynamic-delete */\n delete this._attributes[SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME];\n spans.forEach(span => {\n delete span.data[SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME];\n });\n // eslint-enabled-next-line @typescript-eslint/no-dynamic-delete\n\n const transaction: TransactionEvent = {\n contexts: {\n trace: spanToTransactionTraceContext(this),\n },\n spans:\n // spans.sort() mutates the array, but `spans` is already a copy so we can safely do this here\n // we do not use spans anymore after this point\n spans.length > MAX_SPAN_COUNT\n ? spans.sort((a, b) => a.start_timestamp - b.start_timestamp).slice(0, MAX_SPAN_COUNT)\n : spans,\n start_timestamp: this._startTime,\n timestamp: this._endTime,\n transaction: this._name,\n type: 'transaction',\n sdkProcessingMetadata: {\n capturedSpanScope,\n capturedSpanIsolationScope,\n dynamicSamplingContext: getDynamicSamplingContextFromSpan(this),\n },\n ...(source && {\n transaction_info: {\n source,\n },\n }),\n };\n\n const measurements = timedEventsToMeasurements(this._events);\n const hasMeasurements = measurements && Object.keys(measurements).length;\n\n if (hasMeasurements) {\n DEBUG_BUILD &&\n logger.log(\n '[Measurements] Adding measurements to transaction event',\n JSON.stringify(measurements, undefined, 2),\n );\n transaction.measurements = measurements;\n }\n\n return transaction;\n }\n}\n\nfunction isSpanTimeInput(value: undefined | SpanAttributes | SpanTimeInput): value is SpanTimeInput {\n return (value && typeof value === 'number') || value instanceof Date || Array.isArray(value);\n}\n\n// We want to filter out any incomplete SpanJSON objects\nfunction isFullFinishedSpan(input: Partial<SpanJSON>): input is SpanJSON {\n return !!input.start_timestamp && !!input.timestamp && !!input.span_id && !!input.trace_id;\n}\n\n/** `SentrySpan`s can be sent as a standalone span rather than belonging to a transaction */\nfunction isStandaloneSpan(span: Span): boolean {\n return span instanceof SentrySpan && span.isStandaloneSpan();\n}\n\n/**\n * Sends a `SpanEnvelope`.\n *\n * Note: If the envelope's spans are dropped, e.g. via `beforeSendSpan`,\n * the envelope will not be sent either.\n */\nfunction sendSpanEnvelope(envelope: SpanEnvelope): void {\n const client = getClient();\n if (!client) {\n return;\n }\n\n const spanItems = envelope[1];\n if (!spanItems || spanItems.length === 0) {\n client.recordDroppedEvent('before_send', 'span');\n return;\n }\n\n // sendEnvelope should not throw\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n client.sendEnvelope(envelope);\n}\n","import { DEBUG_BUILD } from '../debug-build';\nimport type { Span } from '../types-hoist';\nimport { logger } from '../utils-hoist/logger';\nimport { getRootSpan, spanIsSampled, spanToJSON } from '../utils/spanUtils';\n\n/**\n * Print a log message for a started span.\n */\nexport function logSpanStart(span: Span): void {\n if (!DEBUG_BUILD) return;\n\n const { description = '< unknown name >', op = '< unknown op >', parent_span_id: parentSpanId } = spanToJSON(span);\n const { spanId } = span.spanContext();\n\n const sampled = spanIsSampled(span);\n const rootSpan = getRootSpan(span);\n const isRootSpan = rootSpan === span;\n\n const header = `[Tracing] Starting ${sampled ? 'sampled' : 'unsampled'} ${isRootSpan ? 'root ' : ''}span`;\n\n const infoParts: string[] = [`op: ${op}`, `name: ${description}`, `ID: ${spanId}`];\n\n if (parentSpanId) {\n infoParts.push(`parent ID: ${parentSpanId}`);\n }\n\n if (!isRootSpan) {\n const { op, description } = spanToJSON(rootSpan);\n infoParts.push(`root ID: ${rootSpan.spanContext().spanId}`);\n if (op) {\n infoParts.push(`root op: ${op}`);\n }\n if (description) {\n infoParts.push(`root description: ${description}`);\n }\n }\n\n logger.log(`${header}\n ${infoParts.join('\\n ')}`);\n}\n\n/**\n * Print a log message for an ended span.\n */\nexport function logSpanEnd(span: Span): void {\n if (!DEBUG_BUILD) return;\n\n const { description = '< unknown name >', op = '< unknown op >' } = spanToJSON(span);\n const { spanId } = span.spanContext();\n const rootSpan = getRootSpan(span);\n const isRootSpan = rootSpan === span;\n\n const msg = `[Tracing] Finishing \"${op}\" ${isRootSpan ? 'root ' : ''}span \"${description}\" with ID ${spanId}`;\n logger.log(msg);\n}\n","/* eslint-disable max-lines */\n\nimport type { AsyncContextStrategy } from '../asyncContext/types';\nimport { getMainCarrier } from '../carrier';\nimport type {\n ClientOptions,\n DynamicSamplingContext,\n SentrySpanArguments,\n Span,\n SpanTimeInput,\n StartSpanOptions,\n} from '../types-hoist';\n\nimport { getClient, getCurrentScope, getIsolationScope, withScope } from '../currentScopes';\n\nimport { getAsyncContextStrategy } from '../asyncContext';\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { Scope } from '../scope';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from '../semanticAttributes';\nimport { logger } from '../utils-hoist/logger';\nimport { generateTraceId } from '../utils-hoist/propagationContext';\nimport { propagationContextFromHeaders } from '../utils-hoist/tracing';\nimport { handleCallbackErrors } from '../utils/handleCallbackErrors';\nimport { hasSpansEnabled } from '../utils/hasSpansEnabled';\nimport { parseSampleRate } from '../utils/parseSampleRate';\nimport { _getSpanForScope, _setSpanForScope } from '../utils/spanOnScope';\nimport { addChildSpanToSpan, getRootSpan, spanIsSampled, spanTimeInputToSeconds, spanToJSON } from '../utils/spanUtils';\nimport { freezeDscOnSpan, getDynamicSamplingContextFromSpan } from './dynamicSamplingContext';\nimport { logSpanStart } from './logSpans';\nimport { sampleSpan } from './sampling';\nimport { SentryNonRecordingSpan } from './sentryNonRecordingSpan';\nimport { SentrySpan } from './sentrySpan';\nimport { SPAN_STATUS_ERROR } from './spanstatus';\nimport { setCapturedScopesOnSpan } from './utils';\n\nconst SUPPRESS_TRACING_KEY = '__SENTRY_SUPPRESS_TRACING__';\n\n/**\n * Wraps a function with a transaction/span and finishes the span after the function is done.\n * The created span is the active span and will be used as parent by other spans created inside the function\n * and can be accessed via `Sentry.getActiveSpan()`, as long as the function is executed while the scope is active.\n *\n * If you want to create a span that is not set as active, use {@link startInactiveSpan}.\n *\n * You'll always get a span passed to the callback,\n * it may just be a non-recording span if the span is not sampled or if tracing is disabled.\n */\nexport function startSpan<T>(options: StartSpanOptions, callback: (span: Span) => T): T {\n const acs = getAcs();\n if (acs.startSpan) {\n return acs.startSpan(options, callback);\n }\n\n const spanArguments = parseSentrySpanArguments(options);\n const { forceTransaction, parentSpan: customParentSpan, scope: customScope } = options;\n\n // We still need to fork a potentially passed scope, as we set the active span on it\n // and we need to ensure that it is cleaned up properly once the span ends.\n const customForkedScope = customScope?.clone();\n\n return withScope(customForkedScope, () => {\n // If `options.parentSpan` is defined, we want to wrap the callback in `withActiveSpan`\n const wrapper = getActiveSpanWrapper<T>(customParentSpan);\n\n return wrapper(() => {\n const scope = getCurrentScope();\n const parentSpan = getParentSpan(scope);\n\n const shouldSkipSpan = options.onlyIfParent && !parentSpan;\n const activeSpan = shouldSkipSpan\n ? new SentryNonRecordingSpan()\n : createChildOrRootSpan({\n parentSpan,\n spanArguments,\n forceTransaction,\n scope,\n });\n\n _setSpanForScope(scope, activeSpan);\n\n return handleCallbackErrors(\n () => callback(activeSpan),\n () => {\n // Only update the span status if it hasn't been changed yet, and the span is not yet finished\n const { status } = spanToJSON(activeSpan);\n if (activeSpan.isRecording() && (!status || status === 'ok')) {\n activeSpan.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n }\n },\n () => {\n activeSpan.end();\n },\n );\n });\n });\n}\n\n/**\n * Similar to `Sentry.startSpan`. Wraps a function with a transaction/span, but does not finish the span\n * after the function is done automatically. Use `span.end()` to end the span.\n *\n * The created span is the active span and will be used as parent by other spans created inside the function\n * and can be accessed via `Sentry.getActiveSpan()`, as long as the function is executed while the scope is active.\n *\n * You'll always get a span passed to the callback,\n * it may just be a non-recording span if the span is not sampled or if tracing is disabled.\n */\nexport function startSpanManual<T>(options: StartSpanOptions, callback: (span: Span, finish: () => void) => T): T {\n const acs = getAcs();\n if (acs.startSpanManual) {\n return acs.startSpanManual(options, callback);\n }\n\n const spanArguments = parseSentrySpanArguments(options);\n const { forceTransaction, parentSpan: customParentSpan, scope: customScope } = options;\n\n const customForkedScope = customScope?.clone();\n\n return withScope(customForkedScope, () => {\n // If `options.parentSpan` is defined, we want to wrap the callback in `withActiveSpan`\n const wrapper = getActiveSpanWrapper<T>(customParentSpan);\n\n return wrapper(() => {\n const scope = getCurrentScope();\n const parentSpan = getParentSpan(scope);\n\n const shouldSkipSpan = options.onlyIfParent && !parentSpan;\n const activeSpan = shouldSkipSpan\n ? new SentryNonRecordingSpan()\n : createChildOrRootSpan({\n parentSpan,\n spanArguments,\n forceTransaction,\n scope,\n });\n\n _setSpanForScope(scope, activeSpan);\n\n return handleCallbackErrors(\n // We pass the `finish` function to the callback, so the user can finish the span manually\n // this is mainly here for historic purposes because previously, we instructed users to call\n // `finish` instead of `span.end()` to also clean up the scope. Nowadays, calling `span.end()`\n // or `finish` has the same effect and we simply leave it here to avoid breaking user code.\n () => callback(activeSpan, () => activeSpan.end()),\n () => {\n // Only update the span status if it hasn't been changed yet, and the span is not yet finished\n const { status } = spanToJSON(activeSpan);\n if (activeSpan.isRecording() && (!status || status === 'ok')) {\n activeSpan.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n }\n },\n );\n });\n });\n}\n\n/**\n * Creates a span. This span is not set as active, so will not get automatic instrumentation spans\n * as children or be able to be accessed via `Sentry.getActiveSpan()`.\n *\n * If you want to create a span that is set as active, use {@link startSpan}.\n *\n * This function will always return a span,\n * it may just be a non-recording span if the span is not sampled or if tracing is disabled.\n */\nexport function startInactiveSpan(options: StartSpanOptions): Span {\n const acs = getAcs();\n if (acs.startInactiveSpan) {\n return acs.startInactiveSpan(options);\n }\n\n const spanArguments = parseSentrySpanArguments(options);\n const { forceTransaction, parentSpan: customParentSpan } = options;\n\n // If `options.scope` is defined, we use this as as a wrapper,\n // If `options.parentSpan` is defined, we want to wrap the callback in `withActiveSpan`\n const wrapper = options.scope\n ? (callback: () => Span) => withScope(options.scope, callback)\n : customParentSpan !== undefined\n ? (callback: () => Span) => withActiveSpan(customParentSpan, callback)\n : (callback: () => Span) => callback();\n\n return wrapper(() => {\n const scope = getCurrentScope();\n const parentSpan = getParentSpan(scope);\n\n const shouldSkipSpan = options.onlyIfParent && !parentSpan;\n\n if (shouldSkipSpan) {\n return new SentryNonRecordingSpan();\n }\n\n return createChildOrRootSpan({\n parentSpan,\n spanArguments,\n forceTransaction,\n scope,\n });\n });\n}\n\n/**\n * Continue a trace from `sentry-trace` and `baggage` values.\n * These values can be obtained from incoming request headers, or in the browser from `<meta name=\"sentry-trace\">`\n * and `<meta name=\"baggage\">` HTML tags.\n *\n * Spans started with `startSpan`, `startSpanManual` and `startInactiveSpan`, within the callback will automatically\n * be attached to the incoming trace.\n */\nexport const continueTrace = <V>(\n options: {\n sentryTrace: Parameters<typeof propagationContextFromHeaders>[0];\n baggage: Parameters<typeof propagationContextFromHeaders>[1];\n },\n callback: () => V,\n): V => {\n const carrier = getMainCarrier();\n const acs = getAsyncContextStrategy(carrier);\n if (acs.continueTrace) {\n return acs.continueTrace(options, callback);\n }\n\n const { sentryTrace, baggage } = options;\n\n return withScope(scope => {\n const propagationContext = propagationContextFromHeaders(sentryTrace, baggage);\n scope.setPropagationContext(propagationContext);\n return callback();\n });\n};\n\n/**\n * Forks the current scope and sets the provided span as active span in the context of the provided callback. Can be\n * passed `null` to start an entirely new span tree.\n *\n * @param span Spans started in the context of the provided callback will be children of this span. If `null` is passed,\n * spans started within the callback will not be attached to a parent span.\n * @param callback Execution context in which the provided span will be active. Is passed the newly forked scope.\n * @returns the value returned from the provided callback function.\n */\nexport function withActiveSpan<T>(span: Span | null, callback: (scope: Scope) => T): T {\n const acs = getAcs();\n if (acs.withActiveSpan) {\n return acs.withActiveSpan(span, callback);\n }\n\n return withScope(scope => {\n _setSpanForScope(scope, span || undefined);\n return callback(scope);\n });\n}\n\n/** Suppress tracing in the given callback, ensuring no spans are generated inside of it. */\nexport function suppressTracing<T>(callback: () => T): T {\n const acs = getAcs();\n\n if (acs.suppressTracing) {\n return acs.suppressTracing(callback);\n }\n\n return withScope(scope => {\n scope.setSDKProcessingMetadata({ [SUPPRESS_TRACING_KEY]: true });\n return callback();\n });\n}\n\n/**\n * Starts a new trace for the duration of the provided callback. Spans started within the\n * callback will be part of the new trace instead of a potentially previously started trace.\n *\n * Important: Only use this function if you want to override the default trace lifetime and\n * propagation mechanism of the SDK for the duration and scope of the provided callback.\n * The newly created trace will also be the root of a new distributed trace, for example if\n * you make http requests within the callback.\n * This function might be useful if the operation you want to instrument should not be part\n * of a potentially ongoing trace.\n *\n * Default behavior:\n * - Server-side: A new trace is started for each incoming request.\n * - Browser: A new trace is started for each page our route. Navigating to a new route\n * or page will automatically create a new trace.\n */\nexport function startNewTrace<T>(callback: () => T): T {\n return withScope(scope => {\n scope.setPropagationContext({\n traceId: generateTraceId(),\n sampleRand: Math.random(),\n });\n DEBUG_BUILD && logger.info(`Starting a new trace with id ${scope.getPropagationContext().traceId}`);\n return withActiveSpan(null, callback);\n });\n}\n\nfunction createChildOrRootSpan({\n parentSpan,\n spanArguments,\n forceTransaction,\n scope,\n}: {\n parentSpan: SentrySpan | undefined;\n spanArguments: SentrySpanArguments;\n forceTransaction?: boolean;\n scope: Scope;\n}): Span {\n if (!hasSpansEnabled()) {\n const span = new SentryNonRecordingSpan();\n\n // If this is a root span, we ensure to freeze a DSC\n // So we can have at least partial data here\n if (forceTransaction || !parentSpan) {\n const dsc = {\n sampled: 'false',\n sample_rate: '0',\n transaction: spanArguments.name,\n ...getDynamicSamplingContextFromSpan(span),\n } satisfies Partial<DynamicSamplingContext>;\n freezeDscOnSpan(span, dsc);\n }\n\n return span;\n }\n\n const isolationScope = getIsolationScope();\n\n let span: Span;\n if (parentSpan && !forceTransaction) {\n span = _startChildSpan(parentSpan, scope, spanArguments);\n addChildSpanToSpan(parentSpan, span);\n } else if (parentSpan) {\n // If we forced a transaction but have a parent span, make sure to continue from the parent span, not the scope\n const dsc = getDynamicSamplingContextFromSpan(parentSpan);\n const { traceId, spanId: parentSpanId } = parentSpan.spanContext();\n const parentSampled = spanIsSampled(parentSpan);\n\n span = _startRootSpan(\n {\n traceId,\n parentSpanId,\n ...spanArguments,\n },\n scope,\n parentSampled,\n );\n\n freezeDscOnSpan(span, dsc);\n } else {\n const {\n traceId,\n dsc,\n parentSpanId,\n sampled: parentSampled,\n } = {\n ...isolationScope.getPropagationContext(),\n ...scope.getPropagationContext(),\n };\n\n span = _startRootSpan(\n {\n traceId,\n parentSpanId,\n ...spanArguments,\n },\n scope,\n parentSampled,\n );\n\n if (dsc) {\n freezeDscOnSpan(span, dsc);\n }\n }\n\n logSpanStart(span);\n\n setCapturedScopesOnSpan(span, scope, isolationScope);\n\n return span;\n}\n\n/**\n * This converts StartSpanOptions to SentrySpanArguments.\n * For the most part (for now) we accept the same options,\n * but some of them need to be transformed.\n */\nfunction parseSentrySpanArguments(options: StartSpanOptions): SentrySpanArguments {\n const exp = options.experimental || {};\n const initialCtx: SentrySpanArguments = {\n isStandalone: exp.standalone,\n ...options,\n };\n\n if (options.startTime) {\n const ctx: SentrySpanArguments & { startTime?: SpanTimeInput } = { ...initialCtx };\n ctx.startTimestamp = spanTimeInputToSeconds(options.startTime);\n delete ctx.startTime;\n return ctx;\n }\n\n return initialCtx;\n}\n\nfunction getAcs(): AsyncContextStrategy {\n const carrier = getMainCarrier();\n return getAsyncContextStrategy(carrier);\n}\n\nfunction _startRootSpan(spanArguments: SentrySpanArguments, scope: Scope, parentSampled?: boolean): SentrySpan {\n const client = getClient();\n const options: Partial<ClientOptions> = client?.getOptions() || {};\n\n const { name = '', attributes } = spanArguments;\n const currentPropagationContext = scope.getPropagationContext();\n const [sampled, sampleRate, localSampleRateWasApplied] = scope.getScopeData().sdkProcessingMetadata[\n SUPPRESS_TRACING_KEY\n ]\n ? [false]\n : sampleSpan(\n options,\n {\n name,\n parentSampled,\n attributes,\n parentSampleRate: parseSampleRate(currentPropagationContext.dsc?.sample_rate),\n },\n currentPropagationContext.sampleRand,\n );\n\n const rootSpan = new SentrySpan({\n ...spanArguments,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'custom',\n [SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE]:\n sampleRate !== undefined && localSampleRateWasApplied ? sampleRate : undefined,\n ...spanArguments.attributes,\n },\n sampled,\n });\n\n if (!sampled && client) {\n DEBUG_BUILD && logger.log('[Tracing] Discarding root span because its trace was not chosen to be sampled.');\n client.recordDroppedEvent('sample_rate', 'transaction');\n }\n\n if (client) {\n client.emit('spanStart', rootSpan);\n }\n\n return rootSpan;\n}\n\n/**\n * Creates a new `Span` while setting the current `Span.id` as `parentSpanId`.\n * This inherits the sampling decision from the parent span.\n */\nfunction _startChildSpan(parentSpan: Span, scope: Scope, spanArguments: SentrySpanArguments): Span {\n const { spanId, traceId } = parentSpan.spanContext();\n const sampled = scope.getScopeData().sdkProcessingMetadata[SUPPRESS_TRACING_KEY] ? false : spanIsSampled(parentSpan);\n\n const childSpan = sampled\n ? new SentrySpan({\n ...spanArguments,\n parentSpanId: spanId,\n traceId,\n sampled,\n })\n : new SentryNonRecordingSpan({ traceId });\n\n addChildSpanToSpan(parentSpan, childSpan);\n\n const client = getClient();\n if (client) {\n client.emit('spanStart', childSpan);\n // If it has an endTimestamp, it's already ended\n if (spanArguments.endTimestamp) {\n client.emit('spanEnd', childSpan);\n }\n }\n\n return childSpan;\n}\n\nfunction getParentSpan(scope: Scope): SentrySpan | undefined {\n const span = _getSpanForScope(scope) as SentrySpan | undefined;\n\n if (!span) {\n return undefined;\n }\n\n const client = getClient();\n const options: Partial<ClientOptions> = client ? client.getOptions() : {};\n if (options.parentSpanIsAlwaysRootSpan) {\n return getRootSpan(span) as SentrySpan;\n }\n\n return span;\n}\n\nfunction getActiveSpanWrapper<T>(parentSpan: Span | undefined | null): (callback: () => T) => T {\n return parentSpan !== undefined\n ? (callback: () => T) => {\n return withActiveSpan(parentSpan, callback);\n }\n : (callback: () => T) => callback();\n}\n","import type { Options, SamplingContext } from '../types-hoist';\n\nimport { DEBUG_BUILD } from '../debug-build';\nimport { logger } from '../utils-hoist/logger';\nimport { hasSpansEnabled } from '../utils/hasSpansEnabled';\nimport { parseSampleRate } from '../utils/parseSampleRate';\n\n/**\n * Makes a sampling decision for the given options.\n *\n * Called every time a root span is created. Only root spans which emerge with a `sampled` value of `true` will be\n * sent to Sentry.\n */\nexport function sampleSpan(\n options: Pick<Options, 'tracesSampleRate' | 'tracesSampler'>,\n samplingContext: SamplingContext,\n sampleRand: number,\n): [sampled: boolean, sampleRate?: number, localSampleRateWasApplied?: boolean] {\n // nothing to do if span recording is not enabled\n if (!hasSpansEnabled(options)) {\n return [false];\n }\n\n let localSampleRateWasApplied = undefined;\n\n // we would have bailed already if neither `tracesSampler` nor `tracesSampleRate` were defined, so one of these should\n // work; prefer the hook if so\n let sampleRate;\n if (typeof options.tracesSampler === 'function') {\n sampleRate = options.tracesSampler({\n ...samplingContext,\n inheritOrSampleWith: fallbackSampleRate => {\n // If we have an incoming parent sample rate, we'll just use that one.\n // The sampling decision will be inherited because of the sample_rand that was generated when the trace reached the incoming boundaries of the SDK.\n if (typeof samplingContext.parentSampleRate === 'number') {\n return samplingContext.parentSampleRate;\n }\n\n // Fallback if parent sample rate is not on the incoming trace (e.g. if there is no baggage)\n // This is to provide backwards compatibility if there are incoming traces from older SDKs that don't send a parent sample rate or a sample rand. In these cases we just want to force either a sampling decision on the downstream traces via the sample rate.\n if (typeof samplingContext.parentSampled === 'boolean') {\n return Number(samplingContext.parentSampled);\n }\n\n return fallbackSampleRate;\n },\n });\n localSampleRateWasApplied = true;\n } else if (samplingContext.parentSampled !== undefined) {\n sampleRate = samplingContext.parentSampled;\n } else if (typeof options.tracesSampleRate !== 'undefined') {\n sampleRate = options.tracesSampleRate;\n localSampleRateWasApplied = true;\n }\n\n // Since this is coming from the user (or from a function provided by the user), who knows what we might get.\n // (The only valid values are booleans or numbers between 0 and 1.)\n const parsedSampleRate = parseSampleRate(sampleRate);\n\n if (parsedSampleRate === undefined) {\n DEBUG_BUILD &&\n logger.warn(\n `[Tracing] Discarding root span because of invalid sample rate. Sample rate must be a boolean or a number between 0 and 1. Got ${JSON.stringify(\n sampleRate,\n )} of type ${JSON.stringify(typeof sampleRate)}.`,\n );\n return [false];\n }\n\n // if the function returned 0 (or false), or if `tracesSampleRate` is 0, it's a sign the transaction should be dropped\n if (!parsedSampleRate) {\n DEBUG_BUILD &&\n logger.log(\n `[Tracing] Discarding transaction because ${\n typeof options.tracesSampler === 'function'\n ? 'tracesSampler returned 0 or false'\n : 'a negative sampling decision was inherited or tracesSampleRate is set to 0'\n }`,\n );\n return [false, parsedSampleRate, localSampleRateWasApplied];\n }\n\n // We always compare the sample rand for the current execution context against the chosen sample rate.\n // Read more: https://develop.sentry.dev/sdk/telemetry/traces/#propagated-random-value\n const shouldSample = sampleRand < parsedSampleRate;\n\n // if we're not going to keep it, we're done\n if (!shouldSample) {\n DEBUG_BUILD &&\n logger.log(\n `[Tracing] Discarding transaction because it's not included in the random sample (sampling rate = ${Number(\n sampleRate,\n )})`,\n );\n }\n\n return [shouldSample, parsedSampleRate, localSampleRateWasApplied];\n}\n","import type { Integration, SentrySpan, Span, SpanAttributes, SpanTimeInput, StartSpanOptions } from '@sentry/core';\nimport { getClient, getCurrentScope, spanToJSON, startInactiveSpan, withActiveSpan } from '@sentry/core';\nimport { WINDOW } from '../types';\n\n/**\n * Checks if a given value is a valid measurement value.\n */\nexport function isMeasurementValue(value: unknown): value is number {\n return typeof value === 'number' && isFinite(value);\n}\n\n/**\n * Helper function to start child on transactions. This function will make sure that the transaction will\n * use the start timestamp of the created child span if it is earlier than the transactions actual\n * start timestamp.\n */\nexport function startAndEndSpan(\n parentSpan: Span,\n startTimeInSeconds: number,\n endTime: SpanTimeInput,\n { ...ctx }: StartSpanOptions,\n): Span | undefined {\n const parentStartTime = spanToJSON(parentSpan).start_timestamp;\n if (parentStartTime && parentStartTime > startTimeInSeconds) {\n // We can only do this for SentrySpans...\n if (typeof (parentSpan as Partial<SentrySpan>).updateStartTime === 'function') {\n (parentSpan as SentrySpan).updateStartTime(startTimeInSeconds);\n }\n }\n\n // The return value only exists for tests\n return withActiveSpan(parentSpan, () => {\n const span = startInactiveSpan({\n startTime: startTimeInSeconds,\n ...ctx,\n });\n\n if (span) {\n span.end(endTime);\n }\n\n return span;\n });\n}\n\ninterface StandaloneWebVitalSpanOptions {\n name: string;\n transaction?: string;\n attributes: SpanAttributes;\n startTime: number;\n}\n\n/**\n * Starts an inactive, standalone span used to send web vital values to Sentry.\n * DO NOT use this for arbitrary spans, as these spans require special handling\n * during ingestion to extract metrics.\n *\n * This function adds a bunch of attributes and data to the span that's shared\n * by all web vital standalone spans. However, you need to take care of adding\n * the actual web vital value as an event to the span. Also, you need to assign\n * a transaction name and some other values that are specific to the web vital.\n *\n * Ultimately, you also need to take care of ending the span to send it off.\n *\n * @param options\n *\n * @returns an inactive, standalone and NOT YET ended span\n */\nexport function startStandaloneWebVitalSpan(options: StandaloneWebVitalSpanOptions): Span | undefined {\n const client = getClient();\n if (!client) {\n return;\n }\n\n const { name, transaction, attributes: passedAttributes, startTime } = options;\n\n const { release, environment, sendDefaultPii } = client.getOptions();\n // We need to get the replay, user, and activeTransaction from the current scope\n // so that we can associate replay id, profile id, and a user display to the span\n const replay = client.getIntegrationByName<Integration & { getReplayId: () => string }>('Replay');\n const replayId = replay?.getReplayId();\n\n const scope = getCurrentScope();\n\n const user = scope.getUser();\n const userDisplay = user !== undefined ? user.email || user.id || user.ip_address : undefined;\n\n let profileId: string | undefined;\n try {\n // @ts-expect-error skip optional chaining to save bundle size with try catch\n profileId = scope.getScopeData().contexts.profile.profile_id;\n } catch {\n // do nothing\n }\n\n const attributes: SpanAttributes = {\n release,\n environment,\n\n user: userDisplay || undefined,\n profile_id: profileId || undefined,\n replay_id: replayId || undefined,\n\n transaction,\n\n // Web vital score calculation relies on the user agent to account for different\n // browsers setting different thresholds for what is considered a good/meh/bad value.\n // For example: Chrome vs. Chrome Mobile\n 'user_agent.original': WINDOW.navigator?.userAgent,\n\n // This tells Sentry to infer the IP address from the request\n 'client.address': sendDefaultPii ? '{{auto}}' : undefined,\n\n ...passedAttributes,\n };\n\n return startInactiveSpan({\n name,\n attributes,\n startTime,\n experimental: {\n standalone: true,\n },\n });\n}\n\n/** Get the browser performance API. */\nexport function getBrowserPerformanceAPI(): Performance | undefined {\n // @ts-expect-error we want to make sure all of these are available, even if TS is sure they are\n return WINDOW.addEventListener && WINDOW.performance;\n}\n\n/**\n * Converts from milliseconds to seconds\n * @param time time in ms\n */\nexport function msToSec(time: number): number {\n return time / 1000;\n}\n\n/**\n * Converts ALPN protocol ids to name and version.\n *\n * (https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml#alpn-protocol-ids)\n * @param nextHopProtocol PerformanceResourceTiming.nextHopProtocol\n */\nexport function extractNetworkProtocol(nextHopProtocol: string): { name: string; version: string } {\n let name = 'unknown';\n let version = 'unknown';\n let _name = '';\n for (const char of nextHopProtocol) {\n // http/1.1 etc.\n if (char === '/') {\n [name, version] = nextHopProtocol.split('/') as [string, string];\n break;\n }\n // h2, h3 etc.\n if (!isNaN(Number(char))) {\n name = _name === 'h' ? 'http' : _name;\n version = nextHopProtocol.split(_name)[1] as string;\n break;\n }\n _name += char;\n }\n if (_name === nextHopProtocol) {\n // webrtc, ftp, etc.\n name = _name;\n }\n return { name, version };\n}\n","import {\n SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME,\n SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT,\n SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE,\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n getActiveSpan,\n getClient,\n getCurrentScope,\n getRootSpan,\n spanToJSON,\n} from '@sentry/core';\nimport { browserPerformanceTimeOrigin, htmlTreeAsString, logger } from '@sentry/core';\nimport type { SpanAttributes } from '@sentry/core';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { addClsInstrumentationHandler } from './instrument';\nimport { msToSec, startStandaloneWebVitalSpan } from './utils';\nimport { onHidden } from './web-vitals/lib/onHidden';\n\n/**\n * Starts tracking the Cumulative Layout Shift on the current page and collects the value once\n *\n * - the page visibility is hidden\n * - a navigation span is started (to stop CLS measurement for SPA soft navigations)\n *\n * Once either of these events triggers, the CLS value is sent as a standalone span and we stop\n * measuring CLS.\n */\nexport function trackClsAsStandaloneSpan(): void {\n let standaloneCLsValue = 0;\n let standaloneClsEntry: LayoutShift | undefined;\n let pageloadSpanId: string | undefined;\n\n if (!supportsLayoutShift()) {\n return;\n }\n\n let sentSpan = false;\n function _collectClsOnce() {\n if (sentSpan) {\n return;\n }\n sentSpan = true;\n if (pageloadSpanId) {\n sendStandaloneClsSpan(standaloneCLsValue, standaloneClsEntry, pageloadSpanId);\n }\n cleanupClsHandler();\n }\n\n const cleanupClsHandler = addClsInstrumentationHandler(({ metric }) => {\n const entry = metric.entries[metric.entries.length - 1] as LayoutShift | undefined;\n if (!entry) {\n return;\n }\n standaloneCLsValue = metric.value;\n standaloneClsEntry = entry;\n }, true);\n\n // use pagehide event from web-vitals\n onHidden(() => {\n _collectClsOnce();\n });\n\n // Since the call chain of this function is synchronous and evaluates before the SDK client is created,\n // we need to wait with subscribing to a client hook until the client is created. Therefore, we defer\n // to the next tick after the SDK setup.\n setTimeout(() => {\n const client = getClient();\n\n if (!client) {\n return;\n }\n\n const unsubscribeStartNavigation = client.on('startNavigationSpan', () => {\n _collectClsOnce();\n unsubscribeStartNavigation?.();\n });\n\n const activeSpan = getActiveSpan();\n if (activeSpan) {\n const rootSpan = getRootSpan(activeSpan);\n const spanJSON = spanToJSON(rootSpan);\n if (spanJSON.op === 'pageload') {\n pageloadSpanId = rootSpan.spanContext().spanId;\n }\n }\n }, 0);\n}\n\nfunction sendStandaloneClsSpan(clsValue: number, entry: LayoutShift | undefined, pageloadSpanId: string) {\n DEBUG_BUILD && logger.log(`Sending CLS span (${clsValue})`);\n\n const startTime = msToSec((browserPerformanceTimeOrigin() || 0) + (entry?.startTime || 0));\n const routeName = getCurrentScope().getScopeData().transactionName;\n\n const name = entry ? htmlTreeAsString(entry.sources[0]?.node) : 'Layout shift';\n\n const attributes: SpanAttributes = {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.browser.cls',\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'ui.webvital.cls',\n [SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME]: entry?.duration || 0,\n // attach the pageload span id to the CLS span so that we can link them in the UI\n 'sentry.pageload.span_id': pageloadSpanId,\n };\n\n const span = startStandaloneWebVitalSpan({\n name,\n transaction: routeName,\n attributes,\n startTime,\n });\n\n if (span) {\n span.addEvent('cls', {\n [SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT]: '',\n [SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE]: clsValue,\n });\n\n // LayoutShift performance entries always have a duration of 0, so we don't need to add `entry.duration` here\n // see: https://developer.mozilla.org/en-US/docs/Web/API/PerformanceEntry/duration\n span.end(startTime);\n }\n}\n\nfunction supportsLayoutShift(): boolean {\n try {\n return PerformanceObserver.supportedEntryTypes.includes('layout-shift');\n } catch {\n return false;\n }\n}\n","/* eslint-disable max-lines */\nimport type { Measurements, Span, SpanAttributes, StartSpanOptions } from '@sentry/core';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n browserPerformanceTimeOrigin,\n getActiveSpan,\n getComponentName,\n htmlTreeAsString,\n parseUrl,\n setMeasurement,\n spanToJSON,\n} from '@sentry/core';\nimport { WINDOW } from '../types';\nimport { trackClsAsStandaloneSpan } from './cls';\nimport {\n type PerformanceLongAnimationFrameTiming,\n addClsInstrumentationHandler,\n addFidInstrumentationHandler,\n addLcpInstrumentationHandler,\n addPerformanceInstrumentationHandler,\n addTtfbInstrumentationHandler,\n} from './instrument';\nimport {\n extractNetworkProtocol,\n getBrowserPerformanceAPI,\n isMeasurementValue,\n msToSec,\n startAndEndSpan,\n} from './utils';\nimport { getActivationStart } from './web-vitals/lib/getActivationStart';\nimport { getNavigationEntry } from './web-vitals/lib/getNavigationEntry';\nimport { getVisibilityWatcher } from './web-vitals/lib/getVisibilityWatcher';\n\ninterface NavigatorNetworkInformation {\n readonly connection?: NetworkInformation;\n}\n\n// http://wicg.github.io/netinfo/#connection-types\ntype ConnectionType = 'bluetooth' | 'cellular' | 'ethernet' | 'mixed' | 'none' | 'other' | 'unknown' | 'wifi' | 'wimax';\n\n// http://wicg.github.io/netinfo/#effectiveconnectiontype-enum\ntype EffectiveConnectionType = '2g' | '3g' | '4g' | 'slow-2g';\n\n// http://wicg.github.io/netinfo/#dom-megabit\ntype Megabit = number;\n// http://wicg.github.io/netinfo/#dom-millisecond\ntype Millisecond = number;\n\n// http://wicg.github.io/netinfo/#networkinformation-interface\ninterface NetworkInformation extends EventTarget {\n // http://wicg.github.io/netinfo/#type-attribute\n readonly type?: ConnectionType;\n // http://wicg.github.io/netinfo/#effectivetype-attribute\n readonly effectiveType?: EffectiveConnectionType;\n // http://wicg.github.io/netinfo/#downlinkmax-attribute\n readonly downlinkMax?: Megabit;\n // http://wicg.github.io/netinfo/#downlink-attribute\n readonly downlink?: Megabit;\n // http://wicg.github.io/netinfo/#rtt-attribute\n readonly rtt?: Millisecond;\n // http://wicg.github.io/netinfo/#savedata-attribute\n readonly saveData?: boolean;\n // http://wicg.github.io/netinfo/#handling-changes-to-the-underlying-connection\n onchange?: EventListener;\n}\n\n// https://w3c.github.io/device-memory/#sec-device-memory-js-api\ninterface NavigatorDeviceMemory {\n readonly deviceMemory?: number;\n}\n\nconst MAX_INT_AS_BYTES = 2147483647;\n\nlet _performanceCursor: number = 0;\n\nlet _measurements: Measurements = {};\nlet _lcpEntry: LargestContentfulPaint | undefined;\nlet _clsEntry: LayoutShift | undefined;\n\ninterface StartTrackingWebVitalsOptions {\n recordClsStandaloneSpans: boolean;\n}\n\n/**\n * Start tracking web vitals.\n * The callback returned by this function can be used to stop tracking & ensure all measurements are final & captured.\n *\n * @returns A function that forces web vitals collection\n */\nexport function startTrackingWebVitals({ recordClsStandaloneSpans }: StartTrackingWebVitalsOptions): () => void {\n const performance = getBrowserPerformanceAPI();\n if (performance && browserPerformanceTimeOrigin()) {\n // @ts-expect-error we want to make sure all of these are available, even if TS is sure they are\n if (performance.mark) {\n WINDOW.performance.mark('sentry-tracing-init');\n }\n const fidCleanupCallback = _trackFID();\n const lcpCleanupCallback = _trackLCP();\n const ttfbCleanupCallback = _trackTtfb();\n const clsCleanupCallback = recordClsStandaloneSpans ? trackClsAsStandaloneSpan() : _trackCLS();\n\n return (): void => {\n fidCleanupCallback();\n lcpCleanupCallback();\n ttfbCleanupCallback();\n clsCleanupCallback?.();\n };\n }\n\n return () => undefined;\n}\n\n/**\n * Start tracking long tasks.\n */\nexport function startTrackingLongTasks(): void {\n addPerformanceInstrumentationHandler('longtask', ({ entries }) => {\n const parent = getActiveSpan();\n if (!parent) {\n return;\n }\n\n const { op: parentOp, start_timestamp: parentStartTimestamp } = spanToJSON(parent);\n\n for (const entry of entries) {\n const startTime = msToSec((browserPerformanceTimeOrigin() as number) + entry.startTime);\n const duration = msToSec(entry.duration);\n\n if (parentOp === 'navigation' && parentStartTimestamp && startTime < parentStartTimestamp) {\n // Skip adding a span if the long task started before the navigation started.\n // `startAndEndSpan` will otherwise adjust the parent's start time to the span's start\n // time, potentially skewing the duration of the actual navigation as reported via our\n // routing instrumentations\n continue;\n }\n\n startAndEndSpan(parent, startTime, startTime + duration, {\n name: 'Main UI thread blocked',\n op: 'ui.long-task',\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.browser.metrics',\n },\n });\n }\n });\n}\n\n/**\n * Start tracking long animation frames.\n */\nexport function startTrackingLongAnimationFrames(): void {\n // NOTE: the current web-vitals version (3.5.2) does not support long-animation-frame, so\n // we directly observe `long-animation-frame` events instead of through the web-vitals\n // `observe` helper function.\n const observer = new PerformanceObserver(list => {\n const parent = getActiveSpan();\n if (!parent) {\n return;\n }\n for (const entry of list.getEntries() as PerformanceLongAnimationFrameTiming[]) {\n if (!entry.scripts[0]) {\n continue;\n }\n\n const startTime = msToSec((browserPerformanceTimeOrigin() as number) + entry.startTime);\n\n const { start_timestamp: parentStartTimestamp, op: parentOp } = spanToJSON(parent);\n\n if (parentOp === 'navigation' && parentStartTimestamp && startTime < parentStartTimestamp) {\n // Skip adding the span if the long animation frame started before the navigation started.\n // `startAndEndSpan` will otherwise adjust the parent's start time to the span's start\n // time, potentially skewing the duration of the actual navigation as reported via our\n // routing instrumentations\n continue;\n }\n const duration = msToSec(entry.duration);\n\n const attributes: SpanAttributes = {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.browser.metrics',\n };\n\n const initialScript = entry.scripts[0];\n const { invoker, invokerType, sourceURL, sourceFunctionName, sourceCharPosition } = initialScript;\n attributes['browser.script.invoker'] = invoker;\n attributes['browser.script.invoker_type'] = invokerType;\n if (sourceURL) {\n attributes['code.filepath'] = sourceURL;\n }\n if (sourceFunctionName) {\n attributes['code.function'] = sourceFunctionName;\n }\n if (sourceCharPosition !== -1) {\n attributes['browser.script.source_char_position'] = sourceCharPosition;\n }\n\n startAndEndSpan(parent, startTime, startTime + duration, {\n name: 'Main UI thread blocked',\n op: 'ui.long-animation-frame',\n attributes,\n });\n }\n });\n\n observer.observe({ type: 'long-animation-frame', buffered: true });\n}\n\n/**\n * Start tracking interaction events.\n */\nexport function startTrackingInteractions(): void {\n addPerformanceInstrumentationHandler('event', ({ entries }) => {\n const parent = getActiveSpan();\n if (!parent) {\n return;\n }\n for (const entry of entries) {\n if (entry.name === 'click') {\n const startTime = msToSec((browserPerformanceTimeOrigin() as number) + entry.startTime);\n const duration = msToSec(entry.duration);\n\n const spanOptions: StartSpanOptions & Required<Pick<StartSpanOptions, 'attributes'>> = {\n name: htmlTreeAsString(entry.target),\n op: `ui.interaction.${entry.name}`,\n startTime: startTime,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.browser.metrics',\n },\n };\n\n const componentName = getComponentName(entry.target);\n if (componentName) {\n spanOptions.attributes['ui.component_name'] = componentName;\n }\n\n startAndEndSpan(parent, startTime, startTime + duration, spanOptions);\n }\n }\n });\n}\n\nexport { registerInpInteractionListener, startTrackingINP } from './inp';\n\n/**\n * Starts tracking the Cumulative Layout Shift on the current page and collects the value and last entry\n * to the `_measurements` object which ultimately is applied to the pageload span's measurements.\n */\nfunction _trackCLS(): () => void {\n return addClsInstrumentationHandler(({ metric }) => {\n const entry = metric.entries[metric.entries.length - 1] as LayoutShift | undefined;\n if (!entry) {\n return;\n }\n _measurements['cls'] = { value: metric.value, unit: '' };\n _clsEntry = entry;\n }, true);\n}\n\n/** Starts tracking the Largest Contentful Paint on the current page. */\nfunction _trackLCP(): () => void {\n return addLcpInstrumentationHandler(({ metric }) => {\n const entry = metric.entries[metric.entries.length - 1];\n if (!entry) {\n return;\n }\n\n _measurements['lcp'] = { value: metric.value, unit: 'millisecond' };\n _lcpEntry = entry as LargestContentfulPaint;\n }, true);\n}\n\n/** Starts tracking the First Input Delay on the current page. */\nfunction _trackFID(): () => void {\n return addFidInstrumentationHandler(({ metric }) => {\n const entry = metric.entries[metric.entries.length - 1];\n if (!entry) {\n return;\n }\n\n const timeOrigin = msToSec(browserPerformanceTimeOrigin() as number);\n const startTime = msToSec(entry.startTime);\n _measurements['fid'] = { value: metric.value, unit: 'millisecond' };\n _measurements['mark.fid'] = { value: timeOrigin + startTime, unit: 'second' };\n });\n}\n\nfunction _trackTtfb(): () => void {\n return addTtfbInstrumentationHandler(({ metric }) => {\n const entry = metric.entries[metric.entries.length - 1];\n if (!entry) {\n return;\n }\n\n _measurements['ttfb'] = { value: metric.value, unit: 'millisecond' };\n });\n}\n\ninterface AddPerformanceEntriesOptions {\n /**\n * Flag to determine if CLS should be recorded as a measurement on the span or\n * sent as a standalone span instead.\n */\n recordClsOnPageloadSpan: boolean;\n}\n\n/** Add performance related spans to a transaction */\nexport function addPerformanceEntries(span: Span, options: AddPerformanceEntriesOptions): void {\n const performance = getBrowserPerformanceAPI();\n const origin = browserPerformanceTimeOrigin();\n if (!performance?.getEntries || !origin) {\n // Gatekeeper if performance API not available\n return;\n }\n\n const timeOrigin = msToSec(origin);\n\n const performanceEntries = performance.getEntries();\n\n const { op, start_timestamp: transactionStartTime } = spanToJSON(span);\n\n performanceEntries.slice(_performanceCursor).forEach(entry => {\n const startTime = msToSec(entry.startTime);\n const duration = msToSec(\n // Inexplicably, Chrome sometimes emits a negative duration. We need to work around this.\n // There is a SO post attempting to explain this, but it leaves one with open questions: https://stackoverflow.com/questions/23191918/peformance-getentries-and-negative-duration-display\n // The way we clamp the value is probably not accurate, since we have observed this happen for things that may take a while to load, like for example the replay worker.\n // TODO: Investigate why this happens and how to properly mitigate. For now, this is a workaround to prevent transactions being dropped due to negative duration spans.\n Math.max(0, entry.duration),\n );\n\n if (op === 'navigation' && transactionStartTime && timeOrigin + startTime < transactionStartTime) {\n return;\n }\n\n switch (entry.entryType) {\n case 'navigation': {\n _addNavigationSpans(span, entry as PerformanceNavigationTiming, timeOrigin);\n break;\n }\n case 'mark':\n case 'paint':\n case 'measure': {\n _addMeasureSpans(span, entry, startTime, duration, timeOrigin);\n\n // capture web vitals\n const firstHidden = getVisibilityWatcher();\n // Only report if the page wasn't hidden prior to the web vital.\n const shouldRecord = entry.startTime < firstHidden.firstHiddenTime;\n\n if (entry.name === 'first-paint' && shouldRecord) {\n _measurements['fp'] = { value: entry.startTime, unit: 'millisecond' };\n }\n if (entry.name === 'first-contentful-paint' && shouldRecord) {\n _measurements['fcp'] = { value: entry.startTime, unit: 'millisecond' };\n }\n break;\n }\n case 'resource': {\n _addResourceSpans(span, entry as PerformanceResourceTiming, entry.name, startTime, duration, timeOrigin);\n break;\n }\n // Ignore other entry types.\n }\n });\n\n _performanceCursor = Math.max(performanceEntries.length - 1, 0);\n\n _trackNavigator(span);\n\n // Measurements are only available for pageload transactions\n if (op === 'pageload') {\n _addTtfbRequestTimeToMeasurements(_measurements);\n\n const fidMark = _measurements['mark.fid'];\n if (fidMark && _measurements['fid']) {\n // create span for FID\n startAndEndSpan(span, fidMark.value, fidMark.value + msToSec(_measurements['fid'].value), {\n name: 'first input delay',\n op: 'ui.action',\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.browser.metrics',\n },\n });\n\n // Delete mark.fid as we don't want it to be part of final payload\n delete _measurements['mark.fid'];\n }\n\n // If FCP is not recorded we should not record the cls value\n // according to the new definition of CLS.\n // TODO: Check if the first condition is still necessary: `onCLS` already only fires once `onFCP` was called.\n if (!('fcp' in _measurements) || !options.recordClsOnPageloadSpan) {\n delete _measurements.cls;\n }\n\n Object.entries(_measurements).forEach(([measurementName, measurement]) => {\n setMeasurement(measurementName, measurement.value, measurement.unit);\n });\n\n // Set timeOrigin which denotes the timestamp which to base the LCP/FCP/FP/TTFB measurements on\n span.setAttribute('performance.timeOrigin', timeOrigin);\n\n // In prerendering scenarios, where a page might be prefetched and pre-rendered before the user clicks the link,\n // the navigation starts earlier than when the user clicks it. Web Vitals should always be based on the\n // user-perceived time, so they are not reported from the actual start of the navigation, but rather from the\n // time where the user actively started the navigation, for example by clicking a link.\n // This is user action is called \"activation\" and the time between navigation and activation is stored in\n // the `activationStart` attribute of the \"navigation\" PerformanceEntry.\n span.setAttribute('performance.activationStart', getActivationStart());\n\n _setWebVitalAttributes(span);\n }\n\n _lcpEntry = undefined;\n _clsEntry = undefined;\n _measurements = {};\n}\n\n/**\n * Create measure related spans.\n * Exported only for tests.\n */\nexport function _addMeasureSpans(\n span: Span,\n entry: PerformanceEntry,\n startTime: number,\n duration: number,\n timeOrigin: number,\n): void {\n const navEntry = getNavigationEntry(false);\n const requestTime = msToSec(navEntry ? navEntry.requestStart : 0);\n // Because performance.measure accepts arbitrary timestamps it can produce\n // spans that happen before the browser even makes a request for the page.\n //\n // An example of this is the automatically generated Next.js-before-hydration\n // spans created by the Next.js framework.\n //\n // To prevent this we will pin the start timestamp to the request start time\n // This does make duration inaccurate, so if this does happen, we will add\n // an attribute to the span\n const measureStartTimestamp = timeOrigin + Math.max(startTime, requestTime);\n const startTimeStamp = timeOrigin + startTime;\n const measureEndTimestamp = startTimeStamp + duration;\n\n const attributes: SpanAttributes = {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.resource.browser.metrics',\n };\n\n if (measureStartTimestamp !== startTimeStamp) {\n attributes['sentry.browser.measure_happened_before_request'] = true;\n attributes['sentry.browser.measure_start_time'] = measureStartTimestamp;\n }\n\n // Measurements from third parties can be off, which would create invalid spans, dropping transactions in the process.\n if (measureStartTimestamp <= measureEndTimestamp) {\n startAndEndSpan(span, measureStartTimestamp, measureEndTimestamp, {\n name: entry.name as string,\n op: entry.entryType as string,\n attributes,\n });\n }\n}\n\n/** Instrument navigation entries */\nfunction _addNavigationSpans(span: Span, entry: PerformanceNavigationTiming, timeOrigin: number): void {\n (['unloadEvent', 'redirect', 'domContentLoadedEvent', 'loadEvent', 'connect'] as const).forEach(event => {\n _addPerformanceNavigationTiming(span, entry, event, timeOrigin);\n });\n _addPerformanceNavigationTiming(span, entry, 'secureConnection', timeOrigin, 'TLS/SSL');\n _addPerformanceNavigationTiming(span, entry, 'fetch', timeOrigin, 'cache');\n _addPerformanceNavigationTiming(span, entry, 'domainLookup', timeOrigin, 'DNS');\n\n _addRequest(span, entry, timeOrigin);\n}\n\ntype StartEventName =\n | 'secureConnection'\n | 'fetch'\n | 'domainLookup'\n | 'unloadEvent'\n | 'redirect'\n | 'connect'\n | 'domContentLoadedEvent'\n | 'loadEvent';\n\ntype EndEventName =\n | 'connectEnd'\n | 'domainLookupStart'\n | 'domainLookupEnd'\n | 'unloadEventEnd'\n | 'redirectEnd'\n | 'connectEnd'\n | 'domContentLoadedEventEnd'\n | 'loadEventEnd';\n\n/** Create performance navigation related spans */\nfunction _addPerformanceNavigationTiming(\n span: Span,\n entry: PerformanceNavigationTiming,\n event: StartEventName,\n timeOrigin: number,\n name: string = event,\n): void {\n const eventEnd = _getEndPropertyNameForNavigationTiming(event) satisfies keyof PerformanceNavigationTiming;\n const end = entry[eventEnd];\n const start = entry[`${event}Start`];\n if (!start || !end) {\n return;\n }\n startAndEndSpan(span, timeOrigin + msToSec(start), timeOrigin + msToSec(end), {\n op: `browser.${name}`,\n name: entry.name,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.browser.metrics',\n },\n });\n}\n\nfunction _getEndPropertyNameForNavigationTiming(event: StartEventName): EndEventName {\n if (event === 'secureConnection') {\n return 'connectEnd';\n }\n if (event === 'fetch') {\n return 'domainLookupStart';\n }\n return `${event}End`;\n}\n\n/** Create request and response related spans */\nfunction _addRequest(span: Span, entry: PerformanceNavigationTiming, timeOrigin: number): void {\n const requestStartTimestamp = timeOrigin + msToSec(entry.requestStart as number);\n const responseEndTimestamp = timeOrigin + msToSec(entry.responseEnd as number);\n const responseStartTimestamp = timeOrigin + msToSec(entry.responseStart as number);\n if (entry.responseEnd) {\n // It is possible that we are collecting these metrics when the page hasn't finished loading yet, for example when the HTML slowly streams in.\n // In this case, ie. when the document request hasn't finished yet, `entry.responseEnd` will be 0.\n // In order not to produce faulty spans, where the end timestamp is before the start timestamp, we will only collect\n // these spans when the responseEnd value is available. The backend (Relay) would drop the entire span if it contained faulty spans.\n startAndEndSpan(span, requestStartTimestamp, responseEndTimestamp, {\n op: 'browser.request',\n name: entry.name,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.browser.metrics',\n },\n });\n\n startAndEndSpan(span, responseStartTimestamp, responseEndTimestamp, {\n op: 'browser.response',\n name: entry.name,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.browser.metrics',\n },\n });\n }\n}\n\n/**\n * Create resource-related spans.\n * Exported only for tests.\n */\nexport function _addResourceSpans(\n span: Span,\n entry: PerformanceResourceTiming,\n resourceUrl: string,\n startTime: number,\n duration: number,\n timeOrigin: number,\n): void {\n // we already instrument based on fetch and xhr, so we don't need to\n // duplicate spans here.\n if (entry.initiatorType === 'xmlhttprequest' || entry.initiatorType === 'fetch') {\n return;\n }\n\n const parsedUrl = parseUrl(resourceUrl);\n\n const attributes: SpanAttributes = {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.resource.browser.metrics',\n };\n setResourceEntrySizeData(attributes, entry, 'transferSize', 'http.response_transfer_size');\n setResourceEntrySizeData(attributes, entry, 'encodedBodySize', 'http.response_content_length');\n setResourceEntrySizeData(attributes, entry, 'decodedBodySize', 'http.decoded_response_content_length');\n\n // `deliveryType` is experimental and does not exist everywhere\n const deliveryType = (entry as { deliveryType?: 'cache' | 'navigational-prefetch' | '' }).deliveryType;\n if (deliveryType != null) {\n attributes['http.response_delivery_type'] = deliveryType;\n }\n\n // Types do not reflect this property yet\n const renderBlockingStatus = (entry as { renderBlockingStatus?: 'render-blocking' | 'non-render-blocking' })\n .renderBlockingStatus;\n if (renderBlockingStatus) {\n attributes['resource.render_blocking_status'] = renderBlockingStatus;\n }\n\n if (parsedUrl.protocol) {\n attributes['url.scheme'] = parsedUrl.protocol.split(':').pop(); // the protocol returned by parseUrl includes a :, but OTEL spec does not, so we remove it.\n }\n\n if (parsedUrl.host) {\n attributes['server.address'] = parsedUrl.host;\n }\n\n attributes['url.same_origin'] = resourceUrl.includes(WINDOW.location.origin);\n\n const { name, version } = extractNetworkProtocol(entry.nextHopProtocol);\n attributes['network.protocol.name'] = name;\n attributes['network.protocol.version'] = version;\n\n const startTimestamp = timeOrigin + startTime;\n const endTimestamp = startTimestamp + duration;\n\n startAndEndSpan(span, startTimestamp, endTimestamp, {\n name: resourceUrl.replace(WINDOW.location.origin, ''),\n op: entry.initiatorType ? `resource.${entry.initiatorType}` : 'resource.other',\n attributes,\n });\n}\n\n/**\n * Capture the information of the user agent.\n */\nfunction _trackNavigator(span: Span): void {\n const navigator = WINDOW.navigator as null | (Navigator & NavigatorNetworkInformation & NavigatorDeviceMemory);\n if (!navigator) {\n return;\n }\n\n // track network connectivity\n const connection = navigator.connection;\n if (connection) {\n if (connection.effectiveType) {\n span.setAttribute('effectiveConnectionType', connection.effectiveType);\n }\n\n if (connection.type) {\n span.setAttribute('connectionType', connection.type);\n }\n\n if (isMeasurementValue(connection.rtt)) {\n _measurements['connection.rtt'] = { value: connection.rtt, unit: 'millisecond' };\n }\n }\n\n if (isMeasurementValue(navigator.deviceMemory)) {\n span.setAttribute('deviceMemory', `${navigator.deviceMemory} GB`);\n }\n\n if (isMeasurementValue(navigator.hardwareConcurrency)) {\n span.setAttribute('hardwareConcurrency', String(navigator.hardwareConcurrency));\n }\n}\n\n/** Add LCP / CLS data to span to allow debugging */\nfunction _setWebVitalAttributes(span: Span): void {\n if (_lcpEntry) {\n // Capture Properties of the LCP element that contributes to the LCP.\n\n if (_lcpEntry.element) {\n span.setAttribute('lcp.element', htmlTreeAsString(_lcpEntry.element));\n }\n\n if (_lcpEntry.id) {\n span.setAttribute('lcp.id', _lcpEntry.id);\n }\n\n if (_lcpEntry.url) {\n // Trim URL to the first 200 characters.\n span.setAttribute('lcp.url', _lcpEntry.url.trim().slice(0, 200));\n }\n\n if (_lcpEntry.loadTime != null) {\n // loadTime is the time of LCP that's related to receiving the LCP element response..\n span.setAttribute('lcp.loadTime', _lcpEntry.loadTime);\n }\n\n if (_lcpEntry.renderTime != null) {\n // renderTime is loadTime + rendering time\n // it's 0 if the LCP element is loaded from a 3rd party origin that doesn't send the\n // `Timing-Allow-Origin` header.\n span.setAttribute('lcp.renderTime', _lcpEntry.renderTime);\n }\n\n span.setAttribute('lcp.size', _lcpEntry.size);\n }\n\n // See: https://developer.mozilla.org/en-US/docs/Web/API/LayoutShift\n if (_clsEntry?.sources) {\n _clsEntry.sources.forEach((source, index) =>\n span.setAttribute(`cls.source.${index + 1}`, htmlTreeAsString(source.node)),\n );\n }\n}\n\nfunction setResourceEntrySizeData(\n attributes: SpanAttributes,\n entry: PerformanceResourceTiming,\n key: keyof Pick<PerformanceResourceTiming, 'transferSize' | 'encodedBodySize' | 'decodedBodySize'>,\n dataKey: 'http.response_transfer_size' | 'http.response_content_length' | 'http.decoded_response_content_length',\n): void {\n const entryVal = entry[key];\n if (entryVal != null && entryVal < MAX_INT_AS_BYTES) {\n attributes[dataKey] = entryVal;\n }\n}\n\n/**\n * Add ttfb request time information to measurements.\n *\n * ttfb information is added via vendored web vitals library.\n */\nfunction _addTtfbRequestTimeToMeasurements(_measurements: Measurements): void {\n const navEntry = getNavigationEntry(false);\n if (!navEntry) {\n return;\n }\n\n const { responseStart, requestStart } = navEntry;\n\n if (requestStart <= responseStart) {\n _measurements['ttfb.requestTime'] = {\n value: responseStart - requestStart,\n unit: 'millisecond',\n };\n }\n}\n","import type { Span, SpanAttributes } from '@sentry/core';\nimport {\n SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME,\n SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT,\n SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE,\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n browserPerformanceTimeOrigin,\n getActiveSpan,\n getCurrentScope,\n getRootSpan,\n htmlTreeAsString,\n spanToJSON,\n} from '@sentry/core';\nimport {\n addInpInstrumentationHandler,\n addPerformanceInstrumentationHandler,\n isPerformanceEventTiming,\n} from './instrument';\nimport { getBrowserPerformanceAPI, msToSec, startStandaloneWebVitalSpan } from './utils';\n\nconst LAST_INTERACTIONS: number[] = [];\nconst INTERACTIONS_SPAN_MAP = new Map<number, Span>();\n\n/**\n * Start tracking INP webvital events.\n */\nexport function startTrackingINP(): () => void {\n const performance = getBrowserPerformanceAPI();\n if (performance && browserPerformanceTimeOrigin()) {\n const inpCallback = _trackINP();\n\n return (): void => {\n inpCallback();\n };\n }\n\n return () => undefined;\n}\n\nconst INP_ENTRY_MAP: Record<string, 'click' | 'hover' | 'drag' | 'press'> = {\n click: 'click',\n pointerdown: 'click',\n pointerup: 'click',\n mousedown: 'click',\n mouseup: 'click',\n touchstart: 'click',\n touchend: 'click',\n mouseover: 'hover',\n mouseout: 'hover',\n mouseenter: 'hover',\n mouseleave: 'hover',\n pointerover: 'hover',\n pointerout: 'hover',\n pointerenter: 'hover',\n pointerleave: 'hover',\n dragstart: 'drag',\n dragend: 'drag',\n drag: 'drag',\n dragenter: 'drag',\n dragleave: 'drag',\n dragover: 'drag',\n drop: 'drag',\n keydown: 'press',\n keyup: 'press',\n keypress: 'press',\n input: 'press',\n};\n\n/** Starts tracking the Interaction to Next Paint on the current page. */\nfunction _trackINP(): () => void {\n return addInpInstrumentationHandler(({ metric }) => {\n if (metric.value == undefined) {\n return;\n }\n\n const entry = metric.entries.find(entry => entry.duration === metric.value && INP_ENTRY_MAP[entry.name]);\n\n if (!entry) {\n return;\n }\n\n const { interactionId } = entry;\n const interactionType = INP_ENTRY_MAP[entry.name];\n\n /** Build the INP span, create an envelope from the span, and then send the envelope */\n const startTime = msToSec((browserPerformanceTimeOrigin() as number) + entry.startTime);\n const duration = msToSec(metric.value);\n const activeSpan = getActiveSpan();\n const rootSpan = activeSpan ? getRootSpan(activeSpan) : undefined;\n\n // We first try to lookup the span from our INTERACTIONS_SPAN_MAP,\n // where we cache the route per interactionId\n const cachedSpan = interactionId != null ? INTERACTIONS_SPAN_MAP.get(interactionId) : undefined;\n\n const spanToUse = cachedSpan || rootSpan;\n\n // Else, we try to use the active span.\n // Finally, we fall back to look at the transactionName on the scope\n const routeName = spanToUse ? spanToJSON(spanToUse).description : getCurrentScope().getScopeData().transactionName;\n\n const name = htmlTreeAsString(entry.target);\n const attributes: SpanAttributes = {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.browser.inp',\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: `ui.interaction.${interactionType}`,\n [SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME]: entry.duration,\n };\n\n const span = startStandaloneWebVitalSpan({\n name,\n transaction: routeName,\n attributes,\n startTime,\n });\n\n if (span) {\n span.addEvent('inp', {\n [SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT]: 'millisecond',\n [SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE]: metric.value,\n });\n\n span.end(startTime + duration);\n }\n });\n}\n\n/**\n * Register a listener to cache route information for INP interactions.\n */\nexport function registerInpInteractionListener(): void {\n const handleEntries = ({ entries }: { entries: PerformanceEntry[] }): void => {\n const activeSpan = getActiveSpan();\n const activeRootSpan = activeSpan && getRootSpan(activeSpan);\n\n entries.forEach(entry => {\n if (!isPerformanceEventTiming(entry) || !activeRootSpan) {\n return;\n }\n\n const interactionId = entry.interactionId;\n if (interactionId == null) {\n return;\n }\n\n // If the interaction was already recorded before, nothing more to do\n if (INTERACTIONS_SPAN_MAP.has(interactionId)) {\n return;\n }\n\n // We keep max. 10 interactions in the list, then remove the oldest one & clean up\n if (LAST_INTERACTIONS.length > 10) {\n const last = LAST_INTERACTIONS.shift() as number;\n INTERACTIONS_SPAN_MAP.delete(last);\n }\n\n // We add the interaction to the list of recorded interactions\n // and store the span for this interaction\n LAST_INTERACTIONS.push(interactionId);\n INTERACTIONS_SPAN_MAP.set(interactionId, activeRootSpan);\n });\n };\n\n addPerformanceInstrumentationHandler('event', handleEntries);\n addPerformanceInstrumentationHandler('first-input', handleEntries);\n}\n","import { DEBUG_BUILD } from '../debug-build';\nimport { logger } from '../logger';\nimport { getFunctionName } from '../stacktrace';\n\nexport type InstrumentHandlerType =\n | 'console'\n | 'dom'\n | 'fetch'\n | 'fetch-body-resolved'\n | 'history'\n | 'xhr'\n | 'error'\n | 'unhandledrejection';\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type InstrumentHandlerCallback = (data: any) => void;\n\n// We keep the handlers globally\nconst handlers: { [key in InstrumentHandlerType]?: InstrumentHandlerCallback[] } = {};\nconst instrumented: { [key in InstrumentHandlerType]?: boolean } = {};\n\n/** Add a handler function. */\nexport function addHandler(type: InstrumentHandlerType, handler: InstrumentHandlerCallback): void {\n handlers[type] = handlers[type] || [];\n (handlers[type] as InstrumentHandlerCallback[]).push(handler);\n}\n\n/**\n * Reset all instrumentation handlers.\n * This can be used by tests to ensure we have a clean slate of instrumentation handlers.\n */\nexport function resetInstrumentationHandlers(): void {\n Object.keys(handlers).forEach(key => {\n handlers[key as InstrumentHandlerType] = undefined;\n });\n}\n\n/** Maybe run an instrumentation function, unless it was already called. */\nexport function maybeInstrument(type: InstrumentHandlerType, instrumentFn: () => void): void {\n if (!instrumented[type]) {\n instrumented[type] = true;\n try {\n instrumentFn();\n } catch (e) {\n DEBUG_BUILD && logger.error(`Error while instrumenting ${type}`, e);\n }\n }\n}\n\n/** Trigger handlers for a given instrumentation type. */\nexport function triggerHandlers(type: InstrumentHandlerType, data: unknown): void {\n const typeHandlers = type && handlers[type];\n if (!typeHandlers) {\n return;\n }\n\n for (const handler of typeHandlers) {\n try {\n handler(data);\n } catch (e) {\n DEBUG_BUILD &&\n logger.error(\n `Error while triggering instrumentation handler.\\nType: ${type}\\nName: ${getFunctionName(handler)}\\nError:`,\n e,\n );\n }\n }\n}\n","import { DEBUG_BUILD } from './debug-build';\nimport { logger } from './logger';\nimport { GLOBAL_OBJ } from './worldwide';\n\nconst WINDOW = GLOBAL_OBJ as unknown as Window;\n\ndeclare const EdgeRuntime: string | undefined;\n\n/**\n * Tells whether current environment supports ErrorEvent objects\n * {@link supportsErrorEvent}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsErrorEvent(): boolean {\n try {\n new ErrorEvent('');\n return true;\n } catch (e) {\n return false;\n }\n}\n\n/**\n * Tells whether current environment supports DOMError objects\n * {@link supportsDOMError}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsDOMError(): boolean {\n try {\n // Chrome: VM89:1 Uncaught TypeError: Failed to construct 'DOMError':\n // 1 argument required, but only 0 present.\n // @ts-expect-error It really needs 1 argument, not 0.\n new DOMError('');\n return true;\n } catch (e) {\n return false;\n }\n}\n\n/**\n * Tells whether current environment supports DOMException objects\n * {@link supportsDOMException}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsDOMException(): boolean {\n try {\n new DOMException('');\n return true;\n } catch (e) {\n return false;\n }\n}\n\n/**\n * Tells whether current environment supports History API\n * {@link supportsHistory}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsHistory(): boolean {\n return 'history' in WINDOW && !!WINDOW.history;\n}\n\n/**\n * Tells whether current environment supports Fetch API\n * {@link supportsFetch}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsFetch(): boolean {\n if (!('fetch' in WINDOW)) {\n return false;\n }\n\n try {\n new Headers();\n new Request('http://www.example.com');\n new Response();\n return true;\n } catch (e) {\n return false;\n }\n}\n\n/**\n * isNative checks if the given function is a native implementation\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function isNativeFunction(func: Function): boolean {\n return func && /^function\\s+\\w+\\(\\)\\s+\\{\\s+\\[native code\\]\\s+\\}$/.test(func.toString());\n}\n\n/**\n * Tells whether current environment supports Fetch API natively\n * {@link supportsNativeFetch}.\n *\n * @returns true if `window.fetch` is natively implemented, false otherwise\n */\nexport function supportsNativeFetch(): boolean {\n if (typeof EdgeRuntime === 'string') {\n return true;\n }\n\n if (!supportsFetch()) {\n return false;\n }\n\n // Fast path to avoid DOM I/O\n // eslint-disable-next-line @typescript-eslint/unbound-method\n if (isNativeFunction(WINDOW.fetch)) {\n return true;\n }\n\n // window.fetch is implemented, but is polyfilled or already wrapped (e.g: by a chrome extension)\n // so create a \"pure\" iframe to see if that has native fetch\n let result = false;\n const doc = WINDOW.document;\n // eslint-disable-next-line deprecation/deprecation\n if (doc && typeof (doc.createElement as unknown) === 'function') {\n try {\n const sandbox = doc.createElement('iframe');\n sandbox.hidden = true;\n doc.head.appendChild(sandbox);\n if (sandbox.contentWindow?.fetch) {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n result = isNativeFunction(sandbox.contentWindow.fetch);\n }\n doc.head.removeChild(sandbox);\n } catch (err) {\n DEBUG_BUILD &&\n logger.warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', err);\n }\n }\n\n return result;\n}\n\n/**\n * Tells whether current environment supports ReportingObserver API\n * {@link supportsReportingObserver}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsReportingObserver(): boolean {\n return 'ReportingObserver' in WINDOW;\n}\n\n/**\n * Tells whether current environment supports Referrer Policy API\n * {@link supportsReferrerPolicy}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsReferrerPolicy(): boolean {\n // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default'\n // (see https://caniuse.com/#feat=referrer-policy),\n // it doesn't. And it throws an exception instead of ignoring this parameter...\n // REF: https://github.com/getsentry/raven-js/issues/1233\n\n if (!supportsFetch()) {\n return false;\n }\n\n try {\n new Request('_', {\n referrerPolicy: 'origin' as ReferrerPolicy,\n });\n return true;\n } catch (e) {\n return false;\n }\n}\n","import type { HandlerDataHistory } from '@sentry/core';\nimport { addHandler, fill, maybeInstrument, supportsHistory, triggerHandlers } from '@sentry/core';\nimport { WINDOW } from '../types';\n\nlet lastHref: string | undefined;\n\n/**\n * Add an instrumentation handler for when a fetch request happens.\n * The handler function is called once when the request starts and once when it ends,\n * which can be identified by checking if it has an `endTimestamp`.\n *\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nexport function addHistoryInstrumentationHandler(handler: (data: HandlerDataHistory) => void): void {\n const type = 'history';\n addHandler(type, handler);\n maybeInstrument(type, instrumentHistory);\n}\n\n/**\n * Exported just for testing\n */\nexport function instrumentHistory(): void {\n // The `popstate` event may also be triggered on `pushState`, but it may not always reliably be emitted by the browser\n // Which is why we also monkey-patch methods below, in addition to this\n WINDOW.addEventListener('popstate', () => {\n const to = WINDOW.location.href;\n // keep track of the current URL state, as we always receive only the updated state\n const from = lastHref;\n lastHref = to;\n\n if (from === to) {\n return;\n }\n\n const handlerData = { from, to } satisfies HandlerDataHistory;\n triggerHandlers('history', handlerData);\n });\n\n // Just guard against this not being available, in weird environments\n if (!supportsHistory()) {\n return;\n }\n\n function historyReplacementFunction(originalHistoryFunction: () => void): () => void {\n return function (this: History, ...args: unknown[]): void {\n const url = args.length > 2 ? args[2] : undefined;\n if (url) {\n // coerce to string (this is what pushState does)\n const from = lastHref;\n const to = String(url);\n // keep track of the current URL state, as we always receive only the updated state\n lastHref = to;\n\n if (from === to) {\n return originalHistoryFunction.apply(this, args);\n }\n\n const handlerData = { from, to } satisfies HandlerDataHistory;\n triggerHandlers('history', handlerData);\n }\n return originalHistoryFunction.apply(this, args);\n };\n }\n\n fill(WINDOW.history, 'pushState', historyReplacementFunction);\n fill(WINDOW.history, 'replaceState', historyReplacementFunction);\n}\n","import { getClient, getCurrentScope } from '../currentScopes';\nimport type { DynamicSamplingContext, Span, StartSpanOptions } from '../types-hoist';\n\nimport { DEBUG_BUILD } from '../debug-build';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON } from '../semanticAttributes';\nimport { logger } from '../utils-hoist/logger';\nimport { timestampInSeconds } from '../utils-hoist/time';\nimport { hasSpansEnabled } from '../utils/hasSpansEnabled';\nimport { _setSpanForScope } from '../utils/spanOnScope';\nimport {\n getActiveSpan,\n getSpanDescendants,\n removeChildSpanFromSpan,\n spanTimeInputToSeconds,\n spanToJSON,\n} from '../utils/spanUtils';\nimport { freezeDscOnSpan, getDynamicSamplingContextFromSpan } from './dynamicSamplingContext';\nimport { SentryNonRecordingSpan } from './sentryNonRecordingSpan';\nimport { SPAN_STATUS_ERROR } from './spanstatus';\nimport { startInactiveSpan } from './trace';\n\nexport const TRACING_DEFAULTS = {\n idleTimeout: 1_000,\n finalTimeout: 30_000,\n childSpanTimeout: 15_000,\n};\n\nconst FINISH_REASON_HEARTBEAT_FAILED = 'heartbeatFailed';\nconst FINISH_REASON_IDLE_TIMEOUT = 'idleTimeout';\nconst FINISH_REASON_FINAL_TIMEOUT = 'finalTimeout';\nconst FINISH_REASON_EXTERNAL_FINISH = 'externalFinish';\nconst FINISH_REASON_CANCELLED = 'cancelled';\n\n// unused\nconst FINISH_REASON_DOCUMENT_HIDDEN = 'documentHidden';\n\n// unused in this file, but used in BrowserTracing\nconst FINISH_REASON_INTERRUPTED = 'interactionInterrupted';\n\ntype IdleSpanFinishReason =\n | typeof FINISH_REASON_CANCELLED\n | typeof FINISH_REASON_DOCUMENT_HIDDEN\n | typeof FINISH_REASON_EXTERNAL_FINISH\n | typeof FINISH_REASON_FINAL_TIMEOUT\n | typeof FINISH_REASON_HEARTBEAT_FAILED\n | typeof FINISH_REASON_IDLE_TIMEOUT\n | typeof FINISH_REASON_INTERRUPTED;\n\ninterface IdleSpanOptions {\n /**\n * The time that has to pass without any span being created.\n * If this time is exceeded, the idle span will finish.\n */\n idleTimeout: number;\n /**\n * The max. time an idle span may run.\n * If this time is exceeded, the idle span will finish no matter what.\n */\n finalTimeout: number;\n /**\n * The max. time a child span may run.\n * If the time since the last span was started exceeds this time, the idle span will finish.\n */\n childSpanTimeout?: number;\n /**\n * When set to `true`, will disable the idle timeout and child timeout\n * until the `idleSpanEnableAutoFinish` hook is emitted for the idle span.\n * The final timeout mechanism will not be affected by this option,\n * meaning the idle span will definitely be finished when the final timeout is\n * reached, no matter what this option is configured to.\n *\n * Defaults to `false`.\n */\n disableAutoFinish?: boolean;\n /** Allows to configure a hook that is called when the idle span is ended, before it is processed. */\n beforeSpanEnd?: (span: Span) => void;\n}\n\n/**\n * An idle span is a span that automatically finishes. It does this by tracking child spans as activities.\n * An idle span is always the active span.\n */\nexport function startIdleSpan(startSpanOptions: StartSpanOptions, options: Partial<IdleSpanOptions> = {}): Span {\n // Activities store a list of active spans\n const activities = new Map<string, boolean>();\n\n // We should not use heartbeat if we finished a span\n let _finished = false;\n\n // Timer that tracks idleTimeout\n let _idleTimeoutID: ReturnType<typeof setTimeout> | undefined;\n\n // Timer that tracks maxSpanTime for child spans\n let _childSpanTimeoutID: ReturnType<typeof setTimeout> | undefined;\n\n // The reason why the span was finished\n let _finishReason: IdleSpanFinishReason = FINISH_REASON_EXTERNAL_FINISH;\n\n let _autoFinishAllowed: boolean = !options.disableAutoFinish;\n\n const _cleanupHooks: (() => void)[] = [];\n\n const {\n idleTimeout = TRACING_DEFAULTS.idleTimeout,\n finalTimeout = TRACING_DEFAULTS.finalTimeout,\n childSpanTimeout = TRACING_DEFAULTS.childSpanTimeout,\n beforeSpanEnd,\n } = options;\n\n const client = getClient();\n\n if (!client || !hasSpansEnabled()) {\n const span = new SentryNonRecordingSpan();\n\n const dsc = {\n sample_rate: '0',\n sampled: 'false',\n ...getDynamicSamplingContextFromSpan(span),\n } satisfies Partial<DynamicSamplingContext>;\n freezeDscOnSpan(span, dsc);\n\n return span;\n }\n\n const scope = getCurrentScope();\n const previousActiveSpan = getActiveSpan();\n const span = _startIdleSpan(startSpanOptions);\n\n // We patch span.end to ensure we can run some things before the span is ended\n // eslint-disable-next-line @typescript-eslint/unbound-method\n span.end = new Proxy(span.end, {\n apply(target, thisArg, args: Parameters<Span['end']>) {\n if (beforeSpanEnd) {\n beforeSpanEnd(span);\n }\n\n // If the span is non-recording, nothing more to do here...\n // This is the case if tracing is enabled but this specific span was not sampled\n if (thisArg instanceof SentryNonRecordingSpan) {\n return;\n }\n\n // Just ensuring that this keeps working, even if we ever have more arguments here\n const [definedEndTimestamp, ...rest] = args;\n const timestamp = definedEndTimestamp || timestampInSeconds();\n const spanEndTimestamp = spanTimeInputToSeconds(timestamp);\n\n // Ensure we end with the last span timestamp, if possible\n const spans = getSpanDescendants(span).filter(child => child !== span);\n\n // If we have no spans, we just end, nothing else to do here\n if (!spans.length) {\n onIdleSpanEnded(spanEndTimestamp);\n return Reflect.apply(target, thisArg, [spanEndTimestamp, ...rest]);\n }\n\n const childEndTimestamps = spans\n .map(span => spanToJSON(span).timestamp)\n .filter(timestamp => !!timestamp) as number[];\n const latestSpanEndTimestamp = childEndTimestamps.length ? Math.max(...childEndTimestamps) : undefined;\n\n // In reality this should always exist here, but type-wise it may be undefined...\n const spanStartTimestamp = spanToJSON(span).start_timestamp;\n\n // The final endTimestamp should:\n // * Never be before the span start timestamp\n // * Be the latestSpanEndTimestamp, if there is one, and it is smaller than the passed span end timestamp\n // * Otherwise be the passed end timestamp\n // Final timestamp can never be after finalTimeout\n const endTimestamp = Math.min(\n spanStartTimestamp ? spanStartTimestamp + finalTimeout / 1000 : Infinity,\n Math.max(spanStartTimestamp || -Infinity, Math.min(spanEndTimestamp, latestSpanEndTimestamp || Infinity)),\n );\n\n onIdleSpanEnded(endTimestamp);\n return Reflect.apply(target, thisArg, [endTimestamp, ...rest]);\n },\n });\n\n /**\n * Cancels the existing idle timeout, if there is one.\n */\n function _cancelIdleTimeout(): void {\n if (_idleTimeoutID) {\n clearTimeout(_idleTimeoutID);\n _idleTimeoutID = undefined;\n }\n }\n\n /**\n * Cancels the existing child span timeout, if there is one.\n */\n function _cancelChildSpanTimeout(): void {\n if (_childSpanTimeoutID) {\n clearTimeout(_childSpanTimeoutID);\n _childSpanTimeoutID = undefined;\n }\n }\n\n /**\n * Restarts idle timeout, if there is no running idle timeout it will start one.\n */\n function _restartIdleTimeout(endTimestamp?: number): void {\n _cancelIdleTimeout();\n _idleTimeoutID = setTimeout(() => {\n if (!_finished && activities.size === 0 && _autoFinishAllowed) {\n _finishReason = FINISH_REASON_IDLE_TIMEOUT;\n span.end(endTimestamp);\n }\n }, idleTimeout);\n }\n\n /**\n * Restarts child span timeout, if there is none running it will start one.\n */\n function _restartChildSpanTimeout(endTimestamp?: number): void {\n _cancelChildSpanTimeout();\n _idleTimeoutID = setTimeout(() => {\n if (!_finished && _autoFinishAllowed) {\n _finishReason = FINISH_REASON_HEARTBEAT_FAILED;\n span.end(endTimestamp);\n }\n }, childSpanTimeout);\n }\n\n /**\n * Start tracking a specific activity.\n * @param spanId The span id that represents the activity\n */\n function _pushActivity(spanId: string): void {\n _cancelIdleTimeout();\n activities.set(spanId, true);\n\n const endTimestamp = timestampInSeconds();\n // We need to add the timeout here to have the real endtimestamp of the idle span\n // Remember timestampInSeconds is in seconds, timeout is in ms\n _restartChildSpanTimeout(endTimestamp + childSpanTimeout / 1000);\n }\n\n /**\n * Remove an activity from usage\n * @param spanId The span id that represents the activity\n */\n function _popActivity(spanId: string): void {\n if (activities.has(spanId)) {\n activities.delete(spanId);\n }\n\n if (activities.size === 0) {\n const endTimestamp = timestampInSeconds();\n // We need to add the timeout here to have the real endtimestamp of the idle span\n // Remember timestampInSeconds is in seconds, timeout is in ms\n _restartIdleTimeout(endTimestamp + idleTimeout / 1000);\n _cancelChildSpanTimeout();\n }\n }\n\n function onIdleSpanEnded(endTimestamp: number): void {\n _finished = true;\n activities.clear();\n\n _cleanupHooks.forEach(cleanup => cleanup());\n\n _setSpanForScope(scope, previousActiveSpan);\n\n const spanJSON = spanToJSON(span);\n\n const { start_timestamp: startTimestamp } = spanJSON;\n // This should never happen, but to make TS happy...\n if (!startTimestamp) {\n return;\n }\n\n const attributes = spanJSON.data;\n if (!attributes[SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON]) {\n span.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON, _finishReason);\n }\n\n logger.log(`[Tracing] Idle span \"${spanJSON.op}\" finished`);\n\n const childSpans = getSpanDescendants(span).filter(child => child !== span);\n\n let discardedSpans = 0;\n childSpans.forEach(childSpan => {\n // We cancel all pending spans with status \"cancelled\" to indicate the idle span was finished early\n if (childSpan.isRecording()) {\n childSpan.setStatus({ code: SPAN_STATUS_ERROR, message: 'cancelled' });\n childSpan.end(endTimestamp);\n DEBUG_BUILD &&\n logger.log('[Tracing] Cancelling span since span ended early', JSON.stringify(childSpan, undefined, 2));\n }\n\n const childSpanJSON = spanToJSON(childSpan);\n const { timestamp: childEndTimestamp = 0, start_timestamp: childStartTimestamp = 0 } = childSpanJSON;\n\n const spanStartedBeforeIdleSpanEnd = childStartTimestamp <= endTimestamp;\n\n // Add a delta with idle timeout so that we prevent false positives\n const timeoutWithMarginOfError = (finalTimeout + idleTimeout) / 1000;\n const spanEndedBeforeFinalTimeout = childEndTimestamp - childStartTimestamp <= timeoutWithMarginOfError;\n\n if (DEBUG_BUILD) {\n const stringifiedSpan = JSON.stringify(childSpan, undefined, 2);\n if (!spanStartedBeforeIdleSpanEnd) {\n logger.log('[Tracing] Discarding span since it happened after idle span was finished', stringifiedSpan);\n } else if (!spanEndedBeforeFinalTimeout) {\n logger.log('[Tracing] Discarding span since it finished after idle span final timeout', stringifiedSpan);\n }\n }\n\n if (!spanEndedBeforeFinalTimeout || !spanStartedBeforeIdleSpanEnd) {\n removeChildSpanFromSpan(span, childSpan);\n discardedSpans++;\n }\n });\n\n if (discardedSpans > 0) {\n span.setAttribute('sentry.idle_span_discarded_spans', discardedSpans);\n }\n }\n\n _cleanupHooks.push(\n client.on('spanStart', startedSpan => {\n // If we already finished the idle span,\n // or if this is the idle span itself being started,\n // or if the started span has already been closed,\n // we don't care about it for activity\n if (_finished || startedSpan === span || !!spanToJSON(startedSpan).timestamp) {\n return;\n }\n\n const allSpans = getSpanDescendants(span);\n\n // If the span that was just started is a child of the idle span, we should track it\n if (allSpans.includes(startedSpan)) {\n _pushActivity(startedSpan.spanContext().spanId);\n }\n }),\n );\n\n _cleanupHooks.push(\n client.on('spanEnd', endedSpan => {\n if (_finished) {\n return;\n }\n\n _popActivity(endedSpan.spanContext().spanId);\n }),\n );\n\n _cleanupHooks.push(\n client.on('idleSpanEnableAutoFinish', spanToAllowAutoFinish => {\n if (spanToAllowAutoFinish === span) {\n _autoFinishAllowed = true;\n _restartIdleTimeout();\n\n if (activities.size) {\n _restartChildSpanTimeout();\n }\n }\n }),\n );\n\n // We only start the initial idle timeout if we are not delaying the auto finish\n if (!options.disableAutoFinish) {\n _restartIdleTimeout();\n }\n\n setTimeout(() => {\n if (!_finished) {\n span.setStatus({ code: SPAN_STATUS_ERROR, message: 'deadline_exceeded' });\n _finishReason = FINISH_REASON_FINAL_TIMEOUT;\n span.end();\n }\n }, finalTimeout);\n\n return span;\n}\n\nfunction _startIdleSpan(options: StartSpanOptions): Span {\n const span = startInactiveSpan(options);\n\n _setSpanForScope(getCurrentScope(), span);\n\n DEBUG_BUILD && logger.log('[Tracing] Started span is an idle span');\n\n return span;\n}\n","import type { HandlerDataError } from '../../types-hoist';\n\nimport { GLOBAL_OBJ } from '../worldwide';\nimport { addHandler, maybeInstrument, triggerHandlers } from './handlers';\n\nlet _oldOnErrorHandler: (typeof GLOBAL_OBJ)['onerror'] | null = null;\n\n/**\n * Add an instrumentation handler for when an error is captured by the global error handler.\n *\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nexport function addGlobalErrorInstrumentationHandler(handler: (data: HandlerDataError) => void): void {\n const type = 'error';\n addHandler(type, handler);\n maybeInstrument(type, instrumentError);\n}\n\nfunction instrumentError(): void {\n _oldOnErrorHandler = GLOBAL_OBJ.onerror;\n\n // Note: The reason we are doing window.onerror instead of window.addEventListener('error')\n // is that we are using this handler in the Loader Script, to handle buffered errors consistently\n GLOBAL_OBJ.onerror = function (\n msg: string | object,\n url?: string,\n line?: number,\n column?: number,\n error?: Error,\n ): boolean {\n const handlerData: HandlerDataError = {\n column,\n error,\n line,\n msg,\n url,\n };\n triggerHandlers('error', handlerData);\n\n if (_oldOnErrorHandler) {\n // eslint-disable-next-line prefer-rest-params\n return _oldOnErrorHandler.apply(this, arguments);\n }\n\n return false;\n };\n\n GLOBAL_OBJ.onerror.__SENTRY_INSTRUMENTED__ = true;\n}\n","import type { HandlerDataUnhandledRejection } from '../../types-hoist';\nimport { GLOBAL_OBJ } from '../worldwide';\nimport { addHandler, maybeInstrument, triggerHandlers } from './handlers';\n\nlet _oldOnUnhandledRejectionHandler: (typeof GLOBAL_OBJ)['onunhandledrejection'] | null = null;\n\n/**\n * Add an instrumentation handler for when an unhandled promise rejection is captured.\n *\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nexport function addGlobalUnhandledRejectionInstrumentationHandler(\n handler: (data: HandlerDataUnhandledRejection) => void,\n): void {\n const type = 'unhandledrejection';\n addHandler(type, handler);\n maybeInstrument(type, instrumentUnhandledRejection);\n}\n\nfunction instrumentUnhandledRejection(): void {\n _oldOnUnhandledRejectionHandler = GLOBAL_OBJ.onunhandledrejection;\n\n // Note: The reason we are doing window.onunhandledrejection instead of window.addEventListener('unhandledrejection')\n // is that we are using this handler in the Loader Script, to handle buffered rejections consistently\n GLOBAL_OBJ.onunhandledrejection = function (e: unknown): boolean {\n const handlerData: HandlerDataUnhandledRejection = e;\n triggerHandlers('unhandledrejection', handlerData);\n\n if (_oldOnUnhandledRejectionHandler) {\n // eslint-disable-next-line prefer-rest-params\n return _oldOnUnhandledRejectionHandler.apply(this, arguments);\n }\n\n return true;\n };\n\n GLOBAL_OBJ.onunhandledrejection.__SENTRY_INSTRUMENTED__ = true;\n}\n","import { DEBUG_BUILD } from '../debug-build';\nimport { addGlobalErrorInstrumentationHandler } from '../utils-hoist/instrument/globalError';\nimport { addGlobalUnhandledRejectionInstrumentationHandler } from '../utils-hoist/instrument/globalUnhandledRejection';\nimport { logger } from '../utils-hoist/logger';\nimport { getActiveSpan, getRootSpan } from '../utils/spanUtils';\nimport { SPAN_STATUS_ERROR } from './spanstatus';\n\nlet errorsInstrumented = false;\n\n/** Only exposed for testing */\nexport function _resetErrorsInstrumented(): void {\n errorsInstrumented = false;\n}\n\n/**\n * Ensure that global errors automatically set the active span status.\n */\nexport function registerSpanErrorInstrumentation(): void {\n if (errorsInstrumented) {\n return;\n }\n\n errorsInstrumented = true;\n addGlobalErrorInstrumentationHandler(errorCallback);\n addGlobalUnhandledRejectionInstrumentationHandler(errorCallback);\n}\n\n/**\n * If an error or unhandled promise occurs, we mark the active root span as failed\n */\nfunction errorCallback(): void {\n const activeSpan = getActiveSpan();\n const rootSpan = activeSpan && getRootSpan(activeSpan);\n if (rootSpan) {\n const message = 'internal_error';\n DEBUG_BUILD && logger.log(`[Tracing] Root span: ${message} -> Global error occurred`);\n rootSpan.setStatus({ code: SPAN_STATUS_ERROR, message });\n }\n}\n\n// The function name will be lost when bundling but we need to be able to identify this listener later to maintain the\n// node.js default exit behaviour\nerrorCallback.tag = 'sentry_tracingErrorCallback';\n","declare const __DEBUG_BUILD__: boolean;\n\n/**\n * This serves as a build time flag that will be true by default, but false in non-debug builds or if users replace `__SENTRY_DEBUG__` in their generated code.\n *\n * ATTENTION: This constant must never cross package boundaries (i.e. be exported) to guarantee that it can be used for tree shaking.\n */\nexport const DEBUG_BUILD = __DEBUG_BUILD__;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { isThenable } from './is';\n\n/** SyncPromise internal states */\nconst enum States {\n /** Pending */\n PENDING = 0,\n /** Resolved / OK */\n RESOLVED = 1,\n /** Rejected / Error */\n REJECTED = 2,\n}\n\n// Overloads so we can call resolvedSyncPromise without arguments and generic argument\nexport function resolvedSyncPromise(): PromiseLike<void>;\nexport function resolvedSyncPromise<T>(value: T | PromiseLike<T>): PromiseLike<T>;\n\n/**\n * Creates a resolved sync promise.\n *\n * @param value the value to resolve the promise with\n * @returns the resolved sync promise\n */\nexport function resolvedSyncPromise<T>(value?: T | PromiseLike<T>): PromiseLike<T> {\n return new SyncPromise(resolve => {\n resolve(value);\n });\n}\n\n/**\n * Creates a rejected sync promise.\n *\n * @param value the value to reject the promise with\n * @returns the rejected sync promise\n */\nexport function rejectedSyncPromise<T = never>(reason?: any): PromiseLike<T> {\n return new SyncPromise((_, reject) => {\n reject(reason);\n });\n}\n\ntype Executor<T> = (resolve: (value?: T | PromiseLike<T> | null) => void, reject: (reason?: any) => void) => void;\n\n/**\n * Thenable class that behaves like a Promise and follows it's interface\n * but is not async internally\n */\nexport class SyncPromise<T> implements PromiseLike<T> {\n private _state: States;\n private _handlers: Array<[boolean, (value: T) => void, (reason: any) => any]>;\n private _value: any;\n\n public constructor(executor: Executor<T>) {\n this._state = States.PENDING;\n this._handlers = [];\n\n this._runExecutor(executor);\n }\n\n /** @inheritdoc */\n public then<TResult1 = T, TResult2 = never>(\n onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null,\n ): PromiseLike<TResult1 | TResult2> {\n return new SyncPromise((resolve, reject) => {\n this._handlers.push([\n false,\n result => {\n if (!onfulfilled) {\n // TODO: ¯\\_(ツ)_/¯\n // TODO: FIXME\n resolve(result as any);\n } else {\n try {\n resolve(onfulfilled(result));\n } catch (e) {\n reject(e);\n }\n }\n },\n reason => {\n if (!onrejected) {\n reject(reason);\n } else {\n try {\n resolve(onrejected(reason));\n } catch (e) {\n reject(e);\n }\n }\n },\n ]);\n this._executeHandlers();\n });\n }\n\n /** @inheritdoc */\n public catch<TResult = never>(\n onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null,\n ): PromiseLike<T | TResult> {\n return this.then(val => val, onrejected);\n }\n\n /** @inheritdoc */\n public finally<TResult>(onfinally?: (() => void) | null): PromiseLike<TResult> {\n return new SyncPromise<TResult>((resolve, reject) => {\n let val: TResult | any;\n let isRejected: boolean;\n\n return this.then(\n value => {\n isRejected = false;\n val = value;\n if (onfinally) {\n onfinally();\n }\n },\n reason => {\n isRejected = true;\n val = reason;\n if (onfinally) {\n onfinally();\n }\n },\n ).then(() => {\n if (isRejected) {\n reject(val);\n return;\n }\n\n resolve(val as unknown as any);\n });\n });\n }\n\n /** Excute the resolve/reject handlers. */\n private _executeHandlers(): void {\n if (this._state === States.PENDING) {\n return;\n }\n\n const cachedHandlers = this._handlers.slice();\n this._handlers = [];\n\n cachedHandlers.forEach(handler => {\n if (handler[0]) {\n return;\n }\n\n if (this._state === States.RESOLVED) {\n handler[1](this._value as unknown as any);\n }\n\n if (this._state === States.REJECTED) {\n handler[2](this._value);\n }\n\n handler[0] = true;\n });\n }\n\n /** Run the executor for the SyncPromise. */\n private _runExecutor(executor: Executor<T>): void {\n const setResult = (state: States, value?: T | PromiseLike<T> | any): void => {\n if (this._state !== States.PENDING) {\n return;\n }\n\n if (isThenable(value)) {\n void (value as PromiseLike<T>).then(resolve, reject);\n return;\n }\n\n this._state = state;\n this._value = value;\n\n this._executeHandlers();\n };\n\n const resolve = (value: unknown): void => {\n setResult(States.RESOLVED, value);\n };\n\n const reject = (reason: unknown): void => {\n setResult(States.REJECTED, reason);\n };\n\n try {\n executor(resolve, reject);\n } catch (e) {\n reject(e);\n }\n }\n}\n","import { DEBUG_BUILD } from './debug-build';\nimport type { Event, EventHint, EventProcessor } from './types-hoist';\nimport { isThenable } from './utils-hoist/is';\nimport { logger } from './utils-hoist/logger';\nimport { SyncPromise } from './utils-hoist/syncpromise';\n\n/**\n * Process an array of event processors, returning the processed event (or `null` if the event was dropped).\n */\nexport function notifyEventProcessors(\n processors: EventProcessor[],\n event: Event | null,\n hint: EventHint,\n index: number = 0,\n): PromiseLike<Event | null> {\n return new SyncPromise<Event | null>((resolve, reject) => {\n const processor = processors[index];\n if (event === null || typeof processor !== 'function') {\n resolve(event);\n } else {\n const result = processor({ ...event }, hint) as Event | null;\n\n DEBUG_BUILD && processor.id && result === null && logger.log(`Event processor \"${processor.id}\" dropped event`);\n\n if (isThenable(result)) {\n void result\n .then(final => notifyEventProcessors(processors, final, hint, index + 1).then(resolve))\n .then(null, reject);\n } else {\n void notifyEventProcessors(processors, result, hint, index + 1)\n .then(resolve)\n .then(null, reject);\n }\n }\n });\n}\n","import type { DebugImage, StackParser } from '../types-hoist';\nimport { GLOBAL_OBJ } from './worldwide';\n\ntype StackString = string;\ntype CachedResult = [string, string];\n\nlet parsedStackResults: Record<StackString, CachedResult> | undefined;\nlet lastKeysCount: number | undefined;\nlet cachedFilenameDebugIds: Record<string, string> | undefined;\n\n/**\n * Returns a map of filenames to debug identifiers.\n */\nexport function getFilenameToDebugIdMap(stackParser: StackParser): Record<string, string> {\n const debugIdMap = GLOBAL_OBJ._sentryDebugIds;\n if (!debugIdMap) {\n return {};\n }\n\n const debugIdKeys = Object.keys(debugIdMap);\n\n // If the count of registered globals hasn't changed since the last call, we\n // can just return the cached result.\n if (cachedFilenameDebugIds && debugIdKeys.length === lastKeysCount) {\n return cachedFilenameDebugIds;\n }\n\n lastKeysCount = debugIdKeys.length;\n\n // Build a map of filename -> debug_id.\n cachedFilenameDebugIds = debugIdKeys.reduce<Record<string, string>>((acc, stackKey) => {\n if (!parsedStackResults) {\n parsedStackResults = {};\n }\n\n const result = parsedStackResults[stackKey];\n\n if (result) {\n acc[result[0]] = result[1];\n } else {\n const parsedStack = stackParser(stackKey);\n\n for (let i = parsedStack.length - 1; i >= 0; i--) {\n const stackFrame = parsedStack[i];\n const filename = stackFrame?.filename;\n const debugId = debugIdMap[stackKey];\n\n if (filename && debugId) {\n acc[filename] = debugId;\n parsedStackResults[stackKey] = [filename, debugId];\n break;\n }\n }\n }\n\n return acc;\n }, {});\n\n return cachedFilenameDebugIds;\n}\n\n/**\n * Returns a list of debug images for the given resources.\n */\nexport function getDebugImagesForResources(\n stackParser: StackParser,\n resource_paths: ReadonlyArray<string>,\n): DebugImage[] {\n const filenameDebugIdMap = getFilenameToDebugIdMap(stackParser);\n\n if (!filenameDebugIdMap) {\n return [];\n }\n\n const images: DebugImage[] = [];\n for (const path of resource_paths) {\n if (path && filenameDebugIdMap[path]) {\n images.push({\n type: 'sourcemap',\n code_file: path,\n debug_id: filenameDebugIdMap[path] as string,\n });\n }\n }\n\n return images;\n}\n","import type { ScopeData } from '../scope';\nimport { getDynamicSamplingContextFromSpan } from '../tracing/dynamicSamplingContext';\nimport type { Breadcrumb, Event, Span } from '../types-hoist';\nimport { merge } from './merge';\nimport { getRootSpan, spanToJSON, spanToTraceContext } from './spanUtils';\n\n/**\n * Applies data from the scope to the event and runs all event processors on it.\n */\nexport function applyScopeDataToEvent(event: Event, data: ScopeData): void {\n const { fingerprint, span, breadcrumbs, sdkProcessingMetadata } = data;\n\n // Apply general data\n applyDataToEvent(event, data);\n\n // We want to set the trace context for normal events only if there isn't already\n // a trace context on the event. There is a product feature in place where we link\n // errors with transaction and it relies on that.\n if (span) {\n applySpanToEvent(event, span);\n }\n\n applyFingerprintToEvent(event, fingerprint);\n applyBreadcrumbsToEvent(event, breadcrumbs);\n applySdkMetadataToEvent(event, sdkProcessingMetadata);\n}\n\n/** Merge data of two scopes together. */\nexport function mergeScopeData(data: ScopeData, mergeData: ScopeData): void {\n const {\n extra,\n tags,\n user,\n contexts,\n level,\n sdkProcessingMetadata,\n breadcrumbs,\n fingerprint,\n eventProcessors,\n attachments,\n propagationContext,\n transactionName,\n span,\n } = mergeData;\n\n mergeAndOverwriteScopeData(data, 'extra', extra);\n mergeAndOverwriteScopeData(data, 'tags', tags);\n mergeAndOverwriteScopeData(data, 'user', user);\n mergeAndOverwriteScopeData(data, 'contexts', contexts);\n\n data.sdkProcessingMetadata = merge(data.sdkProcessingMetadata, sdkProcessingMetadata, 2);\n\n if (level) {\n data.level = level;\n }\n\n if (transactionName) {\n data.transactionName = transactionName;\n }\n\n if (span) {\n data.span = span;\n }\n\n if (breadcrumbs.length) {\n data.breadcrumbs = [...data.breadcrumbs, ...breadcrumbs];\n }\n\n if (fingerprint.length) {\n data.fingerprint = [...data.fingerprint, ...fingerprint];\n }\n\n if (eventProcessors.length) {\n data.eventProcessors = [...data.eventProcessors, ...eventProcessors];\n }\n\n if (attachments.length) {\n data.attachments = [...data.attachments, ...attachments];\n }\n\n data.propagationContext = { ...data.propagationContext, ...propagationContext };\n}\n\n/**\n * Merges certain scope data. Undefined values will overwrite any existing values.\n * Exported only for tests.\n */\nexport function mergeAndOverwriteScopeData<\n Prop extends 'extra' | 'tags' | 'user' | 'contexts' | 'sdkProcessingMetadata',\n Data extends ScopeData,\n>(data: Data, prop: Prop, mergeVal: Data[Prop]): void {\n data[prop] = merge(data[prop], mergeVal, 1);\n}\n\n/** Exported only for tests */\nexport function mergeArray<Prop extends 'breadcrumbs' | 'fingerprint'>(\n event: Event,\n prop: Prop,\n mergeVal: ScopeData[Prop],\n): void {\n const prevVal = event[prop];\n // If we are not merging any new values,\n // we only need to proceed if there was an empty array before (as we want to replace it with undefined)\n if (!mergeVal.length && (!prevVal || prevVal.length)) {\n return;\n }\n\n const merged = [...(prevVal || []), ...mergeVal] as ScopeData[Prop];\n event[prop] = merged.length ? merged : undefined;\n}\n\nfunction applyDataToEvent(event: Event, data: ScopeData): void {\n const { extra, tags, user, contexts, level, transactionName } = data;\n\n if (Object.keys(extra).length) {\n event.extra = { ...extra, ...event.extra };\n }\n\n if (Object.keys(tags).length) {\n event.tags = { ...tags, ...event.tags };\n }\n\n if (Object.keys(user).length) {\n event.user = { ...user, ...event.user };\n }\n\n if (Object.keys(contexts).length) {\n event.contexts = { ...contexts, ...event.contexts };\n }\n\n if (level) {\n event.level = level;\n }\n\n // transaction events get their `transaction` from the root span name\n if (transactionName && event.type !== 'transaction') {\n event.transaction = transactionName;\n }\n}\n\nfunction applyBreadcrumbsToEvent(event: Event, breadcrumbs: Breadcrumb[]): void {\n const mergedBreadcrumbs = [...(event.breadcrumbs || []), ...breadcrumbs];\n event.breadcrumbs = mergedBreadcrumbs.length ? mergedBreadcrumbs : undefined;\n}\n\nfunction applySdkMetadataToEvent(event: Event, sdkProcessingMetadata: ScopeData['sdkProcessingMetadata']): void {\n event.sdkProcessingMetadata = {\n ...event.sdkProcessingMetadata,\n ...sdkProcessingMetadata,\n };\n}\n\nfunction applySpanToEvent(event: Event, span: Span): void {\n event.contexts = {\n trace: spanToTraceContext(span),\n ...event.contexts,\n };\n\n event.sdkProcessingMetadata = {\n dynamicSamplingContext: getDynamicSamplingContextFromSpan(span),\n ...event.sdkProcessingMetadata,\n };\n\n const rootSpan = getRootSpan(span);\n const transactionName = spanToJSON(rootSpan).description;\n if (transactionName && !event.transaction && event.type === 'transaction') {\n event.transaction = transactionName;\n }\n}\n\n/**\n * Applies fingerprint from the scope to the event if there's one,\n * uses message if there's one instead or get rid of empty fingerprint\n */\nfunction applyFingerprintToEvent(event: Event, fingerprint: ScopeData['fingerprint'] | undefined): void {\n // Make sure it's an array first and we actually have something in place\n event.fingerprint = event.fingerprint\n ? Array.isArray(event.fingerprint)\n ? event.fingerprint\n : [event.fingerprint]\n : [];\n\n // If we have something on the scope, then merge it with event\n if (fingerprint) {\n event.fingerprint = event.fingerprint.concat(fingerprint);\n }\n\n // If we have no data at all, remove empty array default\n if (!event.fingerprint.length) {\n delete event.fingerprint;\n }\n}\n","import type { Client } from '../client';\nimport { DEFAULT_ENVIRONMENT } from '../constants';\nimport { getGlobalScope } from '../currentScopes';\nimport { notifyEventProcessors } from '../eventProcessors';\nimport type { CaptureContext, ScopeContext } from '../scope';\nimport { Scope } from '../scope';\nimport type { ClientOptions, Event, EventHint, StackParser } from '../types-hoist';\nimport { getFilenameToDebugIdMap } from '../utils-hoist/debug-ids';\nimport { addExceptionMechanism, uuid4 } from '../utils-hoist/misc';\nimport { normalize } from '../utils-hoist/normalize';\nimport { truncate } from '../utils-hoist/string';\nimport { dateTimestampInSeconds } from '../utils-hoist/time';\nimport { applyScopeDataToEvent, mergeScopeData } from './applyScopeDataToEvent';\n\n/**\n * This type makes sure that we get either a CaptureContext, OR an EventHint.\n * It does not allow mixing them, which could lead to unexpected outcomes, e.g. this is disallowed:\n * { user: { id: '123' }, mechanism: { handled: false } }\n */\nexport type ExclusiveEventHintOrCaptureContext =\n | (CaptureContext & Partial<{ [key in keyof EventHint]: never }>)\n | (EventHint & Partial<{ [key in keyof ScopeContext]: never }>);\n\n/**\n * Adds common information to events.\n *\n * The information includes release and environment from `options`,\n * breadcrumbs and context (extra, tags and user) from the scope.\n *\n * Information that is already present in the event is never overwritten. For\n * nested objects, such as the context, keys are merged.\n *\n * @param event The original event.\n * @param hint May contain additional information about the original exception.\n * @param scope A scope containing event metadata.\n * @returns A new event with more information.\n * @hidden\n */\nexport function prepareEvent(\n options: ClientOptions,\n event: Event,\n hint: EventHint,\n scope?: Scope,\n client?: Client,\n isolationScope?: Scope,\n): PromiseLike<Event | null> {\n const { normalizeDepth = 3, normalizeMaxBreadth = 1_000 } = options;\n const prepared: Event = {\n ...event,\n event_id: event.event_id || hint.event_id || uuid4(),\n timestamp: event.timestamp || dateTimestampInSeconds(),\n };\n const integrations = hint.integrations || options.integrations.map(i => i.name);\n\n applyClientOptions(prepared, options);\n applyIntegrationsMetadata(prepared, integrations);\n\n if (client) {\n client.emit('applyFrameMetadata', event);\n }\n\n // Only put debug IDs onto frames for error events.\n if (event.type === undefined) {\n applyDebugIds(prepared, options.stackParser);\n }\n\n // If we have scope given to us, use it as the base for further modifications.\n // This allows us to prevent unnecessary copying of data if `captureContext` is not provided.\n const finalScope = getFinalScope(scope, hint.captureContext);\n\n if (hint.mechanism) {\n addExceptionMechanism(prepared, hint.mechanism);\n }\n\n const clientEventProcessors = client ? client.getEventProcessors() : [];\n\n // This should be the last thing called, since we want that\n // {@link Scope.addEventProcessor} gets the finished prepared event.\n // Merge scope data together\n const data = getGlobalScope().getScopeData();\n\n if (isolationScope) {\n const isolationData = isolationScope.getScopeData();\n mergeScopeData(data, isolationData);\n }\n\n if (finalScope) {\n const finalScopeData = finalScope.getScopeData();\n mergeScopeData(data, finalScopeData);\n }\n\n const attachments = [...(hint.attachments || []), ...data.attachments];\n if (attachments.length) {\n hint.attachments = attachments;\n }\n\n applyScopeDataToEvent(prepared, data);\n\n const eventProcessors = [\n ...clientEventProcessors,\n // Run scope event processors _after_ all other processors\n ...data.eventProcessors,\n ];\n\n const result = notifyEventProcessors(eventProcessors, prepared, hint);\n\n return result.then(evt => {\n if (evt) {\n // We apply the debug_meta field only after all event processors have ran, so that if any event processors modified\n // file names (e.g.the RewriteFrames integration) the filename -> debug ID relationship isn't destroyed.\n // This should not cause any PII issues, since we're only moving data that is already on the event and not adding\n // any new data\n applyDebugMeta(evt);\n }\n\n if (typeof normalizeDepth === 'number' && normalizeDepth > 0) {\n return normalizeEvent(evt, normalizeDepth, normalizeMaxBreadth);\n }\n return evt;\n });\n}\n\n/**\n * Enhances event using the client configuration.\n * It takes care of all \"static\" values like environment, release and `dist`,\n * as well as truncating overly long values.\n *\n * Only exported for tests.\n *\n * @param event event instance to be enhanced\n */\nexport function applyClientOptions(event: Event, options: ClientOptions): void {\n const { environment, release, dist, maxValueLength = 250 } = options;\n\n // empty strings do not make sense for environment, release, and dist\n // so we handle them the same as if they were not provided\n event.environment = event.environment || environment || DEFAULT_ENVIRONMENT;\n\n if (!event.release && release) {\n event.release = release;\n }\n\n if (!event.dist && dist) {\n event.dist = dist;\n }\n\n if (event.message) {\n event.message = truncate(event.message, maxValueLength);\n }\n\n const exception = event.exception?.values?.[0];\n if (exception?.value) {\n exception.value = truncate(exception.value, maxValueLength);\n }\n\n const request = event.request;\n if (request?.url) {\n request.url = truncate(request.url, maxValueLength);\n }\n}\n\n/**\n * Puts debug IDs into the stack frames of an error event.\n */\nexport function applyDebugIds(event: Event, stackParser: StackParser): void {\n // Build a map of filename -> debug_id\n const filenameDebugIdMap = getFilenameToDebugIdMap(stackParser);\n\n event.exception?.values?.forEach(exception => {\n exception.stacktrace?.frames?.forEach(frame => {\n if (frame.filename) {\n frame.debug_id = filenameDebugIdMap[frame.filename];\n }\n });\n });\n}\n\n/**\n * Moves debug IDs from the stack frames of an error event into the debug_meta field.\n */\nexport function applyDebugMeta(event: Event): void {\n // Extract debug IDs and filenames from the stack frames on the event.\n const filenameDebugIdMap: Record<string, string> = {};\n event.exception?.values?.forEach(exception => {\n exception.stacktrace?.frames?.forEach(frame => {\n if (frame.debug_id) {\n if (frame.abs_path) {\n filenameDebugIdMap[frame.abs_path] = frame.debug_id;\n } else if (frame.filename) {\n filenameDebugIdMap[frame.filename] = frame.debug_id;\n }\n delete frame.debug_id;\n }\n });\n });\n\n if (Object.keys(filenameDebugIdMap).length === 0) {\n return;\n }\n\n // Fill debug_meta information\n event.debug_meta = event.debug_meta || {};\n event.debug_meta.images = event.debug_meta.images || [];\n const images = event.debug_meta.images;\n Object.entries(filenameDebugIdMap).forEach(([filename, debug_id]) => {\n images.push({\n type: 'sourcemap',\n code_file: filename,\n debug_id,\n });\n });\n}\n\n/**\n * This function adds all used integrations to the SDK info in the event.\n * @param event The event that will be filled with all integrations.\n */\nfunction applyIntegrationsMetadata(event: Event, integrationNames: string[]): void {\n if (integrationNames.length > 0) {\n event.sdk = event.sdk || {};\n event.sdk.integrations = [...(event.sdk.integrations || []), ...integrationNames];\n }\n}\n\n/**\n * Applies `normalize` function on necessary `Event` attributes to make them safe for serialization.\n * Normalized keys:\n * - `breadcrumbs.data`\n * - `user`\n * - `contexts`\n * - `extra`\n * @param event Event\n * @returns Normalized event\n */\nfunction normalizeEvent(event: Event | null, depth: number, maxBreadth: number): Event | null {\n if (!event) {\n return null;\n }\n\n const normalized: Event = {\n ...event,\n ...(event.breadcrumbs && {\n breadcrumbs: event.breadcrumbs.map(b => ({\n ...b,\n ...(b.data && {\n data: normalize(b.data, depth, maxBreadth),\n }),\n })),\n }),\n ...(event.user && {\n user: normalize(event.user, depth, maxBreadth),\n }),\n ...(event.contexts && {\n contexts: normalize(event.contexts, depth, maxBreadth),\n }),\n ...(event.extra && {\n extra: normalize(event.extra, depth, maxBreadth),\n }),\n };\n\n // event.contexts.trace stores information about a Transaction. Similarly,\n // event.spans[] stores information about child Spans. Given that a\n // Transaction is conceptually a Span, normalization should apply to both\n // Transactions and Spans consistently.\n // For now the decision is to skip normalization of Transactions and Spans,\n // so this block overwrites the normalized event to add back the original\n // Transaction information prior to normalization.\n if (event.contexts?.trace && normalized.contexts) {\n normalized.contexts.trace = event.contexts.trace;\n\n // event.contexts.trace.data may contain circular/dangerous data so we need to normalize it\n if (event.contexts.trace.data) {\n normalized.contexts.trace.data = normalize(event.contexts.trace.data, depth, maxBreadth);\n }\n }\n\n // event.spans[].data may contain circular/dangerous data so we need to normalize it\n if (event.spans) {\n normalized.spans = event.spans.map(span => {\n return {\n ...span,\n ...(span.data && {\n data: normalize(span.data, depth, maxBreadth),\n }),\n };\n });\n }\n\n // event.contexts.flags (FeatureFlagContext) stores context for our feature\n // flag integrations. It has a greater nesting depth than our other typed\n // Contexts, so we re-normalize with a fixed depth of 3 here. We do not want\n // to skip this in case of conflicting, user-provided context.\n if (event.contexts?.flags && normalized.contexts) {\n normalized.contexts.flags = normalize(event.contexts.flags, 3, maxBreadth);\n }\n\n return normalized;\n}\n\nfunction getFinalScope(scope: Scope | undefined, captureContext: CaptureContext | undefined): Scope | undefined {\n if (!captureContext) {\n return scope;\n }\n\n const finalScope = scope ? scope.clone() : new Scope();\n finalScope.update(captureContext);\n return finalScope;\n}\n\n/**\n * Parse either an `EventHint` directly, or convert a `CaptureContext` to an `EventHint`.\n * This is used to allow to update method signatures that used to accept a `CaptureContext` but should now accept an `EventHint`.\n */\nexport function parseEventHintOrCaptureContext(\n hint: ExclusiveEventHintOrCaptureContext | undefined,\n): EventHint | undefined {\n if (!hint) {\n return undefined;\n }\n\n // If you pass a Scope or `() => Scope` as CaptureContext, we just return this as captureContext\n if (hintIsScopeOrFunction(hint)) {\n return { captureContext: hint };\n }\n\n if (hintIsScopeContext(hint)) {\n return {\n captureContext: hint,\n };\n }\n\n return hint;\n}\n\nfunction hintIsScopeOrFunction(hint: CaptureContext | EventHint): hint is Scope | ((scope: Scope) => Scope) {\n return hint instanceof Scope || typeof hint === 'function';\n}\n\ntype ScopeContextProperty = keyof ScopeContext;\nconst captureContextKeys: readonly ScopeContextProperty[] = [\n 'user',\n 'level',\n 'extra',\n 'contexts',\n 'tags',\n 'fingerprint',\n 'propagationContext',\n] as const;\n\nfunction hintIsScopeContext(hint: Partial<ScopeContext> | EventHint): hint is Partial<ScopeContext> {\n return Object.keys(hint).some(key => captureContextKeys.includes(key as ScopeContextProperty));\n}\n","import { getClient, getCurrentScope, getIsolationScope, withIsolationScope } from './currentScopes';\nimport { DEBUG_BUILD } from './debug-build';\nimport type { CaptureContext } from './scope';\nimport { closeSession, makeSession, updateSession } from './session';\nimport type {\n CheckIn,\n Event,\n EventHint,\n EventProcessor,\n Extra,\n Extras,\n FinishedCheckIn,\n MonitorConfig,\n Primitive,\n Session,\n SessionContext,\n SeverityLevel,\n User,\n} from './types-hoist';\nimport { isThenable } from './utils-hoist/is';\nimport { logger } from './utils-hoist/logger';\nimport { uuid4 } from './utils-hoist/misc';\nimport { timestampInSeconds } from './utils-hoist/time';\nimport { GLOBAL_OBJ } from './utils-hoist/worldwide';\nimport type { ExclusiveEventHintOrCaptureContext } from './utils/prepareEvent';\nimport { parseEventHintOrCaptureContext } from './utils/prepareEvent';\n\n/**\n * Captures an exception event and sends it to Sentry.\n *\n * @param exception The exception to capture.\n * @param hint Optional additional data to attach to the Sentry event.\n * @returns the id of the captured Sentry event.\n */\nexport function captureException(exception: unknown, hint?: ExclusiveEventHintOrCaptureContext): string {\n return getCurrentScope().captureException(exception, parseEventHintOrCaptureContext(hint));\n}\n\n/**\n * Captures a message event and sends it to Sentry.\n *\n * @param message The message to send to Sentry.\n * @param captureContext Define the level of the message or pass in additional data to attach to the message.\n * @returns the id of the captured message.\n */\nexport function captureMessage(message: string, captureContext?: CaptureContext | SeverityLevel): string {\n // This is necessary to provide explicit scopes upgrade, without changing the original\n // arity of the `captureMessage(message, level)` method.\n const level = typeof captureContext === 'string' ? captureContext : undefined;\n const context = typeof captureContext !== 'string' ? { captureContext } : undefined;\n return getCurrentScope().captureMessage(message, level, context);\n}\n\n/**\n * Captures a manually created event and sends it to Sentry.\n *\n * @param event The event to send to Sentry.\n * @param hint Optional additional data to attach to the Sentry event.\n * @returns the id of the captured event.\n */\nexport function captureEvent(event: Event, hint?: EventHint): string {\n return getCurrentScope().captureEvent(event, hint);\n}\n\n/**\n * Sets context data with the given name.\n * @param name of the context\n * @param context Any kind of data. This data will be normalized.\n */\nexport function setContext(name: string, context: { [key: string]: unknown } | null): void {\n getIsolationScope().setContext(name, context);\n}\n\n/**\n * Set an object that will be merged sent as extra data with the event.\n * @param extras Extras object to merge into current context.\n */\nexport function setExtras(extras: Extras): void {\n getIsolationScope().setExtras(extras);\n}\n\n/**\n * Set key:value that will be sent as extra data with the event.\n * @param key String of extra\n * @param extra Any kind of data. This data will be normalized.\n */\nexport function setExtra(key: string, extra: Extra): void {\n getIsolationScope().setExtra(key, extra);\n}\n\n/**\n * Set an object that will be merged sent as tags data with the event.\n * @param tags Tags context object to merge into current context.\n */\nexport function setTags(tags: { [key: string]: Primitive }): void {\n getIsolationScope().setTags(tags);\n}\n\n/**\n * Set key:value that will be sent as tags data with the event.\n *\n * Can also be used to unset a tag, by passing `undefined`.\n *\n * @param key String key of tag\n * @param value Value of tag\n */\nexport function setTag(key: string, value: Primitive): void {\n getIsolationScope().setTag(key, value);\n}\n\n/**\n * Updates user context information for future events.\n *\n * @param user User context object to be set in the current context. Pass `null` to unset the user.\n */\nexport function setUser(user: User | null): void {\n getIsolationScope().setUser(user);\n}\n\n/**\n * The last error event id of the isolation scope.\n *\n * Warning: This function really returns the last recorded error event id on the current\n * isolation scope. If you call this function after handling a certain error and another error\n * is captured in between, the last one is returned instead of the one you might expect.\n * Also, ids of events that were never sent to Sentry (for example because\n * they were dropped in `beforeSend`) could be returned.\n *\n * @returns The last event id of the isolation scope.\n */\nexport function lastEventId(): string | undefined {\n return getIsolationScope().lastEventId();\n}\n\n/**\n * Create a cron monitor check in and send it to Sentry.\n *\n * @param checkIn An object that describes a check in.\n * @param upsertMonitorConfig An optional object that describes a monitor config. Use this if you want\n * to create a monitor automatically when sending a check in.\n */\nexport function captureCheckIn(checkIn: CheckIn, upsertMonitorConfig?: MonitorConfig): string {\n const scope = getCurrentScope();\n const client = getClient();\n if (!client) {\n DEBUG_BUILD && logger.warn('Cannot capture check-in. No client defined.');\n } else if (!client.captureCheckIn) {\n DEBUG_BUILD && logger.warn('Cannot capture check-in. Client does not support sending check-ins.');\n } else {\n return client.captureCheckIn(checkIn, upsertMonitorConfig, scope);\n }\n\n return uuid4();\n}\n\n/**\n * Wraps a callback with a cron monitor check in. The check in will be sent to Sentry when the callback finishes.\n *\n * @param monitorSlug The distinct slug of the monitor.\n * @param upsertMonitorConfig An optional object that describes a monitor config. Use this if you want\n * to create a monitor automatically when sending a check in.\n */\nexport function withMonitor<T>(\n monitorSlug: CheckIn['monitorSlug'],\n callback: () => T,\n upsertMonitorConfig?: MonitorConfig,\n): T {\n const checkInId = captureCheckIn({ monitorSlug, status: 'in_progress' }, upsertMonitorConfig);\n const now = timestampInSeconds();\n\n function finishCheckIn(status: FinishedCheckIn['status']): void {\n captureCheckIn({ monitorSlug, status, checkInId, duration: timestampInSeconds() - now });\n }\n\n return withIsolationScope(() => {\n let maybePromiseResult: T;\n try {\n maybePromiseResult = callback();\n } catch (e) {\n finishCheckIn('error');\n throw e;\n }\n\n if (isThenable(maybePromiseResult)) {\n Promise.resolve(maybePromiseResult).then(\n () => {\n finishCheckIn('ok');\n },\n e => {\n finishCheckIn('error');\n throw e;\n },\n );\n } else {\n finishCheckIn('ok');\n }\n\n return maybePromiseResult;\n });\n}\n\n/**\n * Call `flush()` on the current client, if there is one. See {@link Client.flush}.\n *\n * @param timeout Maximum time in ms the client should wait to flush its event queue. Omitting this parameter will cause\n * the client to wait until all events are sent before resolving the promise.\n * @returns A promise which resolves to `true` if the queue successfully drains before the timeout, or `false` if it\n * doesn't (or if there's no client defined).\n */\nexport async function flush(timeout?: number): Promise<boolean> {\n const client = getClient();\n if (client) {\n return client.flush(timeout);\n }\n DEBUG_BUILD && logger.warn('Cannot flush events. No client defined.');\n return Promise.resolve(false);\n}\n\n/**\n * Call `close()` on the current client, if there is one. See {@link Client.close}.\n *\n * @param timeout Maximum time in ms the client should wait to flush its event queue before shutting down. Omitting this\n * parameter will cause the client to wait until all events are sent before disabling itself.\n * @returns A promise which resolves to `true` if the queue successfully drains before the timeout, or `false` if it\n * doesn't (or if there's no client defined).\n */\nexport async function close(timeout?: number): Promise<boolean> {\n const client = getClient();\n if (client) {\n return client.close(timeout);\n }\n DEBUG_BUILD && logger.warn('Cannot flush events and disable SDK. No client defined.');\n return Promise.resolve(false);\n}\n\n/**\n * Returns true if Sentry has been properly initialized.\n */\nexport function isInitialized(): boolean {\n return !!getClient();\n}\n\n/** If the SDK is initialized & enabled. */\nexport function isEnabled(): boolean {\n const client = getClient();\n return client?.getOptions().enabled !== false && !!client?.getTransport();\n}\n\n/**\n * Add an event processor.\n * This will be added to the current isolation scope, ensuring any event that is processed in the current execution\n * context will have the processor applied.\n */\nexport function addEventProcessor(callback: EventProcessor): void {\n getIsolationScope().addEventProcessor(callback);\n}\n\n/**\n * Start a session on the current isolation scope.\n *\n * @param context (optional) additional properties to be applied to the returned session object\n *\n * @returns the new active session\n */\nexport function startSession(context?: SessionContext): Session {\n const isolationScope = getIsolationScope();\n const currentScope = getCurrentScope();\n\n // Will fetch userAgent if called from browser sdk\n const { userAgent } = GLOBAL_OBJ.navigator || {};\n\n const session = makeSession({\n user: currentScope.getUser() || isolationScope.getUser(),\n ...(userAgent && { userAgent }),\n ...context,\n });\n\n // End existing session if there's one\n const currentSession = isolationScope.getSession();\n if (currentSession?.status === 'ok') {\n updateSession(currentSession, { status: 'exited' });\n }\n\n endSession();\n\n // Afterwards we set the new session on the scope\n isolationScope.setSession(session);\n\n return session;\n}\n\n/**\n * End the session on the current isolation scope.\n */\nexport function endSession(): void {\n const isolationScope = getIsolationScope();\n const currentScope = getCurrentScope();\n\n const session = currentScope.getSession() || isolationScope.getSession();\n if (session) {\n closeSession(session);\n }\n _sendSessionUpdate();\n\n // the session is over; take it off of the scope\n isolationScope.setSession();\n}\n\n/**\n * Sends the current Session on the scope\n */\nfunction _sendSessionUpdate(): void {\n const isolationScope = getIsolationScope();\n const client = getClient();\n const session = isolationScope.getSession();\n if (session && client) {\n client.captureSession(session);\n }\n}\n\n/**\n * Sends the current session on the scope to Sentry\n *\n * @param end If set the session will be marked as exited and removed from the scope.\n * Defaults to `false`.\n */\nexport function captureSession(end: boolean = false): void {\n // both send the update and pull the session from the scope\n if (end) {\n endSession();\n return;\n }\n\n // only send the update\n _sendSessionUpdate();\n}\n","import type { Mechanism, WrappedFunction } from '@sentry/core';\nimport {\n GLOBAL_OBJ,\n addExceptionMechanism,\n addExceptionTypeValue,\n addNonEnumerableProperty,\n captureException,\n getOriginalFunction,\n markFunctionWrapped,\n withScope,\n} from '@sentry/core';\n\nexport const WINDOW = GLOBAL_OBJ as typeof GLOBAL_OBJ & Window;\n\nlet ignoreOnError: number = 0;\n\n/**\n * @hidden\n */\nexport function shouldIgnoreOnError(): boolean {\n return ignoreOnError > 0;\n}\n\n/**\n * @hidden\n */\nexport function ignoreNextOnError(): void {\n // onerror should trigger before setTimeout\n ignoreOnError++;\n setTimeout(() => {\n ignoreOnError--;\n });\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\ntype WrappableFunction = Function;\n\nexport function wrap<T extends WrappableFunction>(\n fn: T,\n options?: {\n mechanism?: Mechanism;\n },\n): WrappedFunction<T>;\nexport function wrap<NonFunction>(\n fn: NonFunction,\n options?: {\n mechanism?: Mechanism;\n },\n): NonFunction;\n/**\n * Instruments the given function and sends an event to Sentry every time the\n * function throws an exception.\n *\n * @param fn A function to wrap. It is generally safe to pass an unbound function, because the returned wrapper always\n * has a correct `this` context.\n * @returns The wrapped function.\n * @hidden\n */\nexport function wrap<T extends WrappableFunction, NonFunction>(\n fn: T | NonFunction,\n options: {\n mechanism?: Mechanism;\n } = {},\n): NonFunction | WrappedFunction<T> {\n // for future readers what this does is wrap a function and then create\n // a bi-directional wrapping between them.\n //\n // example: wrapped = wrap(original);\n // original.__sentry_wrapped__ -> wrapped\n // wrapped.__sentry_original__ -> original\n\n function isFunction(fn: T | NonFunction): fn is T {\n return typeof fn === 'function';\n }\n\n if (!isFunction(fn)) {\n return fn;\n }\n\n try {\n // if we're dealing with a function that was previously wrapped, return\n // the original wrapper.\n const wrapper = (fn as WrappedFunction<T>).__sentry_wrapped__;\n if (wrapper) {\n if (typeof wrapper === 'function') {\n return wrapper;\n } else {\n // If we find that the `__sentry_wrapped__` function is not a function at the time of accessing it, it means\n // that something messed with it. In that case we want to return the originally passed function.\n return fn;\n }\n }\n\n // We don't wanna wrap it twice\n if (getOriginalFunction(fn)) {\n return fn;\n }\n } catch (e) {\n // Just accessing custom props in some Selenium environments\n // can cause a \"Permission denied\" exception (see raven-js#495).\n // Bail on wrapping and return the function as-is (defers to window.onerror).\n return fn;\n }\n\n // Wrap the function itself\n // It is important that `sentryWrapped` is not an arrow function to preserve the context of `this`\n const sentryWrapped = function (this: unknown, ...args: unknown[]): unknown {\n try {\n // Also wrap arguments that are themselves functions\n const wrappedArguments = args.map(arg => wrap(arg, options));\n\n // Attempt to invoke user-land function\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n // means the sentry.javascript SDK caught an error invoking your application code. This\n // is expected behavior and NOT indicative of a bug with sentry.javascript.\n return fn.apply(this, wrappedArguments);\n } catch (ex) {\n ignoreNextOnError();\n\n withScope(scope => {\n scope.addEventProcessor(event => {\n if (options.mechanism) {\n addExceptionTypeValue(event, undefined, undefined);\n addExceptionMechanism(event, options.mechanism);\n }\n\n event.extra = {\n ...event.extra,\n arguments: args,\n };\n\n return event;\n });\n\n captureException(ex);\n });\n\n throw ex;\n }\n } as unknown as WrappedFunction<T>;\n\n // Wrap the wrapped function in a proxy, to ensure any other properties of the original function remain available\n try {\n for (const property in fn) {\n if (Object.prototype.hasOwnProperty.call(fn, property)) {\n sentryWrapped[property as keyof T] = fn[property as keyof T];\n }\n }\n } catch {\n // Accessing some objects may throw\n // ref: https://github.com/getsentry/sentry-javascript/issues/1168\n }\n\n // Signal that this function has been wrapped/filled already\n // for both debugging and to prevent it to being wrapped/filled twice\n markFunctionWrapped(sentryWrapped, fn);\n\n addNonEnumerableProperty(fn, '__sentry_wrapped__', sentryWrapped);\n\n // Restore original function name (not all browsers allow that)\n try {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const descriptor = Object.getOwnPropertyDescriptor(sentryWrapped, 'name')!;\n if (descriptor.configurable) {\n Object.defineProperty(sentryWrapped, 'name', {\n get(): string {\n return fn.name;\n },\n });\n }\n } catch {\n // This may throw if e.g. the descriptor does not exist, or a browser does not allow redefining `name`.\n // to save some bytes we simply try-catch this\n }\n\n return sentryWrapped;\n}\n","import type { HandlerDataXhr, SentryWrappedXMLHttpRequest } from '@sentry/core';\nimport { addHandler, isString, maybeInstrument, timestampInSeconds, triggerHandlers } from '@sentry/core';\nimport { WINDOW } from '../types';\n\nexport const SENTRY_XHR_DATA_KEY = '__sentry_xhr_v3__';\n\ntype WindowWithXhr = Window & { XMLHttpRequest?: typeof XMLHttpRequest };\n\n/**\n * Add an instrumentation handler for when an XHR request happens.\n * The handler function is called once when the request starts and once when it ends,\n * which can be identified by checking if it has an `endTimestamp`.\n *\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nexport function addXhrInstrumentationHandler(handler: (data: HandlerDataXhr) => void): void {\n const type = 'xhr';\n addHandler(type, handler);\n maybeInstrument(type, instrumentXHR);\n}\n\n/** Exported only for tests. */\nexport function instrumentXHR(): void {\n if (!(WINDOW as WindowWithXhr).XMLHttpRequest) {\n return;\n }\n\n const xhrproto = XMLHttpRequest.prototype;\n\n // eslint-disable-next-line @typescript-eslint/unbound-method\n xhrproto.open = new Proxy(xhrproto.open, {\n apply(originalOpen, xhrOpenThisArg: XMLHttpRequest & SentryWrappedXMLHttpRequest, xhrOpenArgArray) {\n // NOTE: If you are a Sentry user, and you are seeing this stack frame,\n // it means the error, that was caused by your XHR call did not\n // have a stack trace. If you are using HttpClient integration,\n // this is the expected behavior, as we are using this virtual error to capture\n // the location of your XHR call, and group your HttpClient events accordingly.\n const virtualError = new Error();\n\n const startTimestamp = timestampInSeconds() * 1000;\n\n // open() should always be called with two or more arguments\n // But to be on the safe side, we actually validate this and bail out if we don't have a method & url\n const method = isString(xhrOpenArgArray[0]) ? xhrOpenArgArray[0].toUpperCase() : undefined;\n const url = parseUrl(xhrOpenArgArray[1]);\n\n if (!method || !url) {\n return originalOpen.apply(xhrOpenThisArg, xhrOpenArgArray);\n }\n\n xhrOpenThisArg[SENTRY_XHR_DATA_KEY] = {\n method,\n url,\n request_headers: {},\n };\n\n // if Sentry key appears in URL, don't capture it as a request\n if (method === 'POST' && url.match(/sentry_key/)) {\n xhrOpenThisArg.__sentry_own_request__ = true;\n }\n\n const onreadystatechangeHandler: () => void = () => {\n // For whatever reason, this is not the same instance here as from the outer method\n const xhrInfo = xhrOpenThisArg[SENTRY_XHR_DATA_KEY];\n\n if (!xhrInfo) {\n return;\n }\n\n if (xhrOpenThisArg.readyState === 4) {\n try {\n // touching statusCode in some platforms throws\n // an exception\n xhrInfo.status_code = xhrOpenThisArg.status;\n } catch (e) {\n /* do nothing */\n }\n\n const handlerData: HandlerDataXhr = {\n endTimestamp: timestampInSeconds() * 1000,\n startTimestamp,\n xhr: xhrOpenThisArg,\n virtualError,\n };\n triggerHandlers('xhr', handlerData);\n }\n };\n\n if ('onreadystatechange' in xhrOpenThisArg && typeof xhrOpenThisArg.onreadystatechange === 'function') {\n xhrOpenThisArg.onreadystatechange = new Proxy(xhrOpenThisArg.onreadystatechange, {\n apply(originalOnreadystatechange, onreadystatechangeThisArg, onreadystatechangeArgArray: unknown[]) {\n onreadystatechangeHandler();\n return originalOnreadystatechange.apply(onreadystatechangeThisArg, onreadystatechangeArgArray);\n },\n });\n } else {\n xhrOpenThisArg.addEventListener('readystatechange', onreadystatechangeHandler);\n }\n\n // Intercepting `setRequestHeader` to access the request headers of XHR instance.\n // This will only work for user/library defined headers, not for the default/browser-assigned headers.\n // Request cookies are also unavailable for XHR, as `Cookie` header can't be defined by `setRequestHeader`.\n xhrOpenThisArg.setRequestHeader = new Proxy(xhrOpenThisArg.setRequestHeader, {\n apply(\n originalSetRequestHeader,\n setRequestHeaderThisArg: SentryWrappedXMLHttpRequest,\n setRequestHeaderArgArray: unknown[],\n ) {\n const [header, value] = setRequestHeaderArgArray;\n\n const xhrInfo = setRequestHeaderThisArg[SENTRY_XHR_DATA_KEY];\n\n if (xhrInfo && isString(header) && isString(value)) {\n xhrInfo.request_headers[header.toLowerCase()] = value;\n }\n\n return originalSetRequestHeader.apply(setRequestHeaderThisArg, setRequestHeaderArgArray);\n },\n });\n\n return originalOpen.apply(xhrOpenThisArg, xhrOpenArgArray);\n },\n });\n\n // eslint-disable-next-line @typescript-eslint/unbound-method\n xhrproto.send = new Proxy(xhrproto.send, {\n apply(originalSend, sendThisArg: XMLHttpRequest & SentryWrappedXMLHttpRequest, sendArgArray: unknown[]) {\n const sentryXhrData = sendThisArg[SENTRY_XHR_DATA_KEY];\n\n if (!sentryXhrData) {\n return originalSend.apply(sendThisArg, sendArgArray);\n }\n\n if (sendArgArray[0] !== undefined) {\n sentryXhrData.body = sendArgArray[0];\n }\n\n const handlerData: HandlerDataXhr = {\n startTimestamp: timestampInSeconds() * 1000,\n xhr: sendThisArg,\n };\n triggerHandlers('xhr', handlerData);\n\n return originalSend.apply(sendThisArg, sendArgArray);\n },\n });\n}\n\nfunction parseUrl(url: string | unknown): string | undefined {\n if (isString(url)) {\n return url;\n }\n\n try {\n // url can be a string or URL\n // but since URL is not available in IE11, we do not check for it,\n // but simply assume it is an URL and return `toString()` from it (which returns the full URL)\n // If that fails, we just return undefined\n return (url as URL).toString();\n } catch {} // eslint-disable-line no-empty\n\n return undefined;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { HandlerDataFetch } from '../../types-hoist';\n\nimport { isError } from '../is';\nimport { addNonEnumerableProperty, fill } from '../object';\nimport { supportsNativeFetch } from '../supports';\nimport { timestampInSeconds } from '../time';\nimport { GLOBAL_OBJ } from '../worldwide';\nimport { addHandler, maybeInstrument, triggerHandlers } from './handlers';\n\ntype FetchResource = string | { toString(): string } | { url: string };\n\n/**\n * Add an instrumentation handler for when a fetch request happens.\n * The handler function is called once when the request starts and once when it ends,\n * which can be identified by checking if it has an `endTimestamp`.\n *\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nexport function addFetchInstrumentationHandler(\n handler: (data: HandlerDataFetch) => void,\n skipNativeFetchCheck?: boolean,\n): void {\n const type = 'fetch';\n addHandler(type, handler);\n maybeInstrument(type, () => instrumentFetch(undefined, skipNativeFetchCheck));\n}\n\n/**\n * Add an instrumentation handler for long-lived fetch requests, like consuming server-sent events (SSE) via fetch.\n * The handler will resolve the request body and emit the actual `endTimestamp`, so that the\n * span can be updated accordingly.\n *\n * Only used internally\n * @hidden\n */\nexport function addFetchEndInstrumentationHandler(handler: (data: HandlerDataFetch) => void): void {\n const type = 'fetch-body-resolved';\n addHandler(type, handler);\n maybeInstrument(type, () => instrumentFetch(streamHandler));\n}\n\nfunction instrumentFetch(onFetchResolved?: (response: Response) => void, skipNativeFetchCheck: boolean = false): void {\n if (skipNativeFetchCheck && !supportsNativeFetch()) {\n return;\n }\n\n fill(GLOBAL_OBJ, 'fetch', function (originalFetch: () => void): () => void {\n return function (...args: any[]): void {\n // We capture the error right here and not in the Promise error callback because Safari (and probably other\n // browsers too) will wipe the stack trace up to this point, only leaving us with this file which is useless.\n\n // NOTE: If you are a Sentry user, and you are seeing this stack frame,\n // it means the error, that was caused by your fetch call did not\n // have a stack trace, so the SDK backfilled the stack trace so\n // you can see which fetch call failed.\n const virtualError = new Error();\n\n const { method, url } = parseFetchArgs(args);\n const handlerData: HandlerDataFetch = {\n args,\n fetchData: {\n method,\n url,\n },\n startTimestamp: timestampInSeconds() * 1000,\n // // Adding the error to be able to fingerprint the failed fetch event in HttpClient instrumentation\n virtualError,\n };\n\n // if there is no callback, fetch is instrumented directly\n if (!onFetchResolved) {\n triggerHandlers('fetch', {\n ...handlerData,\n });\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return originalFetch.apply(GLOBAL_OBJ, args).then(\n async (response: Response) => {\n if (onFetchResolved) {\n onFetchResolved(response);\n } else {\n triggerHandlers('fetch', {\n ...handlerData,\n endTimestamp: timestampInSeconds() * 1000,\n response,\n });\n }\n\n return response;\n },\n (error: Error) => {\n triggerHandlers('fetch', {\n ...handlerData,\n endTimestamp: timestampInSeconds() * 1000,\n error,\n });\n\n if (isError(error) && error.stack === undefined) {\n // NOTE: If you are a Sentry user, and you are seeing this stack frame,\n // it means the error, that was caused by your fetch call did not\n // have a stack trace, so the SDK backfilled the stack trace so\n // you can see which fetch call failed.\n error.stack = virtualError.stack;\n addNonEnumerableProperty(error, 'framesToPop', 1);\n }\n\n // We enhance the not-so-helpful \"Failed to fetch\" error messages with the host\n // Possible messages we handle here:\n // * \"Failed to fetch\" (chromium)\n // * \"Load failed\" (webkit)\n // * \"NetworkError when attempting to fetch resource.\" (firefox)\n if (\n error instanceof TypeError &&\n (error.message === 'Failed to fetch' ||\n error.message === 'Load failed' ||\n error.message === 'NetworkError when attempting to fetch resource.')\n ) {\n try {\n const url = new URL(handlerData.fetchData.url);\n error.message = `${error.message} (${url.host})`;\n } catch {\n // ignore it if errors happen here\n }\n }\n\n // NOTE: If you are a Sentry user, and you are seeing this stack frame,\n // it means the sentry.javascript SDK caught an error invoking your application code.\n // This is expected behavior and NOT indicative of a bug with sentry.javascript.\n throw error;\n },\n );\n };\n });\n}\n\nasync function resolveResponse(res: Response | undefined, onFinishedResolving: () => void): Promise<void> {\n if (res?.body) {\n const body = res.body;\n const responseReader = body.getReader();\n\n // Define a maximum duration after which we just cancel\n const maxFetchDurationTimeout = setTimeout(\n () => {\n body.cancel().then(null, () => {\n // noop\n });\n },\n 90 * 1000, // 90s\n );\n\n let readingActive = true;\n while (readingActive) {\n let chunkTimeout;\n try {\n // abort reading if read op takes more than 5s\n chunkTimeout = setTimeout(() => {\n body.cancel().then(null, () => {\n // noop on error\n });\n }, 5000);\n\n // This .read() call will reject/throw when we abort due to timeouts through `body.cancel()`\n const { done } = await responseReader.read();\n\n clearTimeout(chunkTimeout);\n\n if (done) {\n onFinishedResolving();\n readingActive = false;\n }\n } catch (error) {\n readingActive = false;\n } finally {\n clearTimeout(chunkTimeout);\n }\n }\n\n clearTimeout(maxFetchDurationTimeout);\n\n responseReader.releaseLock();\n body.cancel().then(null, () => {\n // noop on error\n });\n }\n}\n\nfunction streamHandler(response: Response): void {\n // clone response for awaiting stream\n let clonedResponseForResolving: Response;\n try {\n clonedResponseForResolving = response.clone();\n } catch {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n resolveResponse(clonedResponseForResolving, () => {\n triggerHandlers('fetch-body-resolved', {\n endTimestamp: timestampInSeconds() * 1000,\n response,\n });\n });\n}\n\nfunction hasProp<T extends string>(obj: unknown, prop: T): obj is Record<string, string> {\n return !!obj && typeof obj === 'object' && !!(obj as Record<string, string>)[prop];\n}\n\nfunction getUrlFromResource(resource: FetchResource): string {\n if (typeof resource === 'string') {\n return resource;\n }\n\n if (!resource) {\n return '';\n }\n\n if (hasProp(resource, 'url')) {\n return resource.url;\n }\n\n if (resource.toString) {\n return resource.toString();\n }\n\n return '';\n}\n\n/**\n * Parses the fetch arguments to find the used Http method and the url of the request.\n * Exported for tests only.\n */\nexport function parseFetchArgs(fetchArgs: unknown[]): { method: string; url: string } {\n if (fetchArgs.length === 0) {\n return { method: 'GET', url: '' };\n }\n\n if (fetchArgs.length === 2) {\n const [url, options] = fetchArgs as [FetchResource, object];\n\n return {\n url: getUrlFromResource(url),\n method: hasProp(options, 'method') ? String(options.method).toUpperCase() : 'GET',\n };\n }\n\n const arg = fetchArgs[0];\n return {\n url: getUrlFromResource(arg as FetchResource),\n method: hasProp(arg, 'method') ? String(arg.method).toUpperCase() : 'GET',\n };\n}\n","import { getAsyncContextStrategy } from '../asyncContext';\nimport { getMainCarrier } from '../carrier';\nimport { getClient, getCurrentScope } from '../currentScopes';\nimport { isEnabled } from '../exports';\nimport type { Scope } from '../scope';\nimport { getDynamicSamplingContextFromScope, getDynamicSamplingContextFromSpan } from '../tracing';\nimport type { SerializedTraceData, Span } from '../types-hoist';\nimport { dynamicSamplingContextToSentryBaggageHeader } from '../utils-hoist/baggage';\nimport { logger } from '../utils-hoist/logger';\nimport { TRACEPARENT_REGEXP, generateSentryTraceHeader } from '../utils-hoist/tracing';\nimport { getActiveSpan, spanToTraceHeader } from './spanUtils';\n\n/**\n * Extracts trace propagation data from the current span or from the client's scope (via transaction or propagation\n * context) and serializes it to `sentry-trace` and `baggage` values to strings. These values can be used to propagate\n * a trace via our tracing Http headers or Html `<meta>` tags.\n *\n * This function also applies some validation to the generated sentry-trace and baggage values to ensure that\n * only valid strings are returned.\n *\n * @returns an object with the tracing data values. The object keys are the name of the tracing key to be used as header\n * or meta tag name.\n */\nexport function getTraceData(options: { span?: Span } = {}): SerializedTraceData {\n const client = getClient();\n if (!isEnabled() || !client) {\n return {};\n }\n\n const carrier = getMainCarrier();\n const acs = getAsyncContextStrategy(carrier);\n if (acs.getTraceData) {\n return acs.getTraceData(options);\n }\n\n const scope = getCurrentScope();\n const span = options.span || getActiveSpan();\n const sentryTrace = span ? spanToTraceHeader(span) : scopeToTraceHeader(scope);\n const dsc = span ? getDynamicSamplingContextFromSpan(span) : getDynamicSamplingContextFromScope(client, scope);\n const baggage = dynamicSamplingContextToSentryBaggageHeader(dsc);\n\n const isValidSentryTraceHeader = TRACEPARENT_REGEXP.test(sentryTrace);\n if (!isValidSentryTraceHeader) {\n logger.warn('Invalid sentry-trace data. Cannot generate trace data');\n return {};\n }\n\n return {\n 'sentry-trace': sentryTrace,\n baggage,\n };\n}\n\n/**\n * Get a sentry-trace header value for the given scope.\n */\nfunction scopeToTraceHeader(scope: Scope): string {\n const { traceId, sampled, propagationSpanId } = scope.getPropagationContext();\n return generateSentryTraceHeader(traceId, propagationSpanId, sampled);\n}\n","/* eslint-disable complexity */\nimport { getClient } from './currentScopes';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from './semanticAttributes';\nimport { SPAN_STATUS_ERROR, setHttpStatus, startInactiveSpan } from './tracing';\nimport { SentryNonRecordingSpan } from './tracing/sentryNonRecordingSpan';\nimport type { FetchBreadcrumbHint, HandlerDataFetch, Span, SpanOrigin } from './types-hoist';\nimport { SENTRY_BAGGAGE_KEY_PREFIX } from './utils-hoist/baggage';\nimport { isInstanceOf } from './utils-hoist/is';\nimport { parseStringToURL, stripUrlQueryAndFragment } from './utils-hoist/url';\nimport { hasSpansEnabled } from './utils/hasSpansEnabled';\nimport { getActiveSpan } from './utils/spanUtils';\nimport { getTraceData } from './utils/traceData';\n\ntype PolymorphicRequestHeaders =\n | Record<string, string | undefined>\n | Array<[string, string]>\n // the below is not precisely the Header type used in Request, but it'll pass duck-typing\n | {\n append: (key: string, value: string) => void;\n get: (key: string) => string | null | undefined;\n };\n\n/**\n * Create and track fetch request spans for usage in combination with `addFetchInstrumentationHandler`.\n *\n * @returns Span if a span was created, otherwise void.\n */\nexport function instrumentFetchRequest(\n handlerData: HandlerDataFetch,\n shouldCreateSpan: (url: string) => boolean,\n shouldAttachHeaders: (url: string) => boolean,\n spans: Record<string, Span>,\n spanOrigin: SpanOrigin = 'auto.http.browser',\n): Span | undefined {\n if (!handlerData.fetchData) {\n return undefined;\n }\n\n const { method, url } = handlerData.fetchData;\n\n const shouldCreateSpanResult = hasSpansEnabled() && shouldCreateSpan(url);\n\n if (handlerData.endTimestamp && shouldCreateSpanResult) {\n const spanId = handlerData.fetchData.__span;\n if (!spanId) return;\n\n const span = spans[spanId];\n if (span) {\n endSpan(span, handlerData);\n\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete spans[spanId];\n }\n return undefined;\n }\n\n // Curious about `thismessage:/`? See: https://www.rfc-editor.org/rfc/rfc2557.html\n // > When the methods above do not yield an absolute URI, a base URL\n // > of \"thismessage:/\" MUST be employed. This base URL has been\n // > defined for the sole purpose of resolving relative references\n // > within a multipart/related structure when no other base URI is\n // > specified.\n //\n // We need to provide a base URL to `parseStringToURL` because the fetch API gives us a\n // relative URL sometimes.\n //\n // This is the only case where we need to provide a base URL to `parseStringToURL`\n // because the relative URL is not valid on its own.\n const parsedUrl = url.startsWith('/') ? parseStringToURL(url, 'thismessage:/') : parseStringToURL(url);\n const fullUrl = url.startsWith('/') ? undefined : parsedUrl?.href;\n\n const hasParent = !!getActiveSpan();\n\n const span =\n shouldCreateSpanResult && hasParent\n ? startInactiveSpan({\n name: `${method} ${stripUrlQueryAndFragment(url)}`,\n attributes: {\n url,\n type: 'fetch',\n 'http.method': method,\n 'http.url': parsedUrl?.href,\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: spanOrigin,\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'http.client',\n ...(fullUrl && { 'http.url': fullUrl }),\n ...(fullUrl && parsedUrl?.host && { 'server.address': parsedUrl.host }),\n ...(parsedUrl?.search && { 'http.query': parsedUrl.search }),\n ...(parsedUrl?.hash && { 'http.fragment': parsedUrl.hash }),\n },\n })\n : new SentryNonRecordingSpan();\n\n handlerData.fetchData.__span = span.spanContext().spanId;\n spans[span.spanContext().spanId] = span;\n\n if (shouldAttachHeaders(handlerData.fetchData.url)) {\n const request: string | Request = handlerData.args[0];\n\n const options: { [key: string]: unknown } = handlerData.args[1] || {};\n\n const headers = _addTracingHeadersToFetchRequest(\n request,\n options,\n // If performance is disabled (TWP) or there's no active root span (pageload/navigation/interaction),\n // we do not want to use the span as base for the trace headers,\n // which means that the headers will be generated from the scope and the sampling decision is deferred\n hasSpansEnabled() && hasParent ? span : undefined,\n );\n if (headers) {\n // Ensure this is actually set, if no options have been passed previously\n handlerData.args[1] = options;\n options.headers = headers;\n }\n }\n\n const client = getClient();\n\n if (client) {\n const fetchHint = {\n input: handlerData.args,\n response: handlerData.response,\n startTimestamp: handlerData.startTimestamp,\n endTimestamp: handlerData.endTimestamp,\n } satisfies FetchBreadcrumbHint;\n\n client.emit('beforeOutgoingRequestSpan', span, fetchHint);\n }\n\n return span;\n}\n\n/**\n * Adds sentry-trace and baggage headers to the various forms of fetch headers.\n */\nfunction _addTracingHeadersToFetchRequest(\n request: string | Request,\n fetchOptionsObj: {\n headers?:\n | {\n [key: string]: string[] | string | undefined;\n }\n | PolymorphicRequestHeaders;\n },\n span?: Span,\n): PolymorphicRequestHeaders | undefined {\n const traceHeaders = getTraceData({ span });\n const sentryTrace = traceHeaders['sentry-trace'];\n const baggage = traceHeaders.baggage;\n\n // Nothing to do, when we return undefined here, the original headers will be used\n if (!sentryTrace) {\n return undefined;\n }\n\n const headers = fetchOptionsObj.headers || (isRequest(request) ? request.headers : undefined);\n\n if (!headers) {\n return { ...traceHeaders };\n } else if (isHeaders(headers)) {\n const newHeaders = new Headers(headers);\n newHeaders.set('sentry-trace', sentryTrace);\n\n if (baggage) {\n const prevBaggageHeader = newHeaders.get('baggage');\n if (prevBaggageHeader) {\n const prevHeaderStrippedFromSentryBaggage = stripBaggageHeaderOfSentryBaggageValues(prevBaggageHeader);\n newHeaders.set(\n 'baggage',\n // If there are non-sentry entries (i.e. if the stripped string is non-empty/truthy) combine the stripped header and sentry baggage header\n // otherwise just set the sentry baggage header\n prevHeaderStrippedFromSentryBaggage ? `${prevHeaderStrippedFromSentryBaggage},${baggage}` : baggage,\n );\n } else {\n newHeaders.set('baggage', baggage);\n }\n }\n\n return newHeaders;\n } else if (Array.isArray(headers)) {\n const newHeaders = [\n ...headers\n // Remove any existing sentry-trace headers\n .filter(header => {\n return !(Array.isArray(header) && header[0] === 'sentry-trace');\n })\n // Get rid of previous sentry baggage values in baggage header\n .map(header => {\n if (Array.isArray(header) && header[0] === 'baggage' && typeof header[1] === 'string') {\n const [headerName, headerValue, ...rest] = header;\n return [headerName, stripBaggageHeaderOfSentryBaggageValues(headerValue), ...rest];\n } else {\n return header;\n }\n }),\n // Attach the new sentry-trace header\n ['sentry-trace', sentryTrace],\n ];\n\n if (baggage) {\n // If there are multiple entries with the same key, the browser will merge the values into a single request header.\n // Its therefore safe to simply push a \"baggage\" entry, even though there might already be another baggage header.\n newHeaders.push(['baggage', baggage]);\n }\n\n return newHeaders as PolymorphicRequestHeaders;\n } else {\n const existingBaggageHeader = 'baggage' in headers ? headers.baggage : undefined;\n let newBaggageHeaders: string[] = [];\n\n if (Array.isArray(existingBaggageHeader)) {\n newBaggageHeaders = existingBaggageHeader\n .map(headerItem =>\n typeof headerItem === 'string' ? stripBaggageHeaderOfSentryBaggageValues(headerItem) : headerItem,\n )\n .filter(headerItem => headerItem === '');\n } else if (existingBaggageHeader) {\n newBaggageHeaders.push(stripBaggageHeaderOfSentryBaggageValues(existingBaggageHeader));\n }\n\n if (baggage) {\n newBaggageHeaders.push(baggage);\n }\n\n return {\n ...(headers as Exclude<typeof headers, Headers>),\n 'sentry-trace': sentryTrace,\n baggage: newBaggageHeaders.length > 0 ? newBaggageHeaders.join(',') : undefined,\n };\n }\n}\n\nfunction endSpan(span: Span, handlerData: HandlerDataFetch): void {\n if (handlerData.response) {\n setHttpStatus(span, handlerData.response.status);\n\n const contentLength = handlerData.response?.headers && handlerData.response.headers.get('content-length');\n\n if (contentLength) {\n const contentLengthNum = parseInt(contentLength);\n if (contentLengthNum > 0) {\n span.setAttribute('http.response_content_length', contentLengthNum);\n }\n }\n } else if (handlerData.error) {\n span.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n }\n span.end();\n}\n\nfunction stripBaggageHeaderOfSentryBaggageValues(baggageHeader: string): string {\n return (\n baggageHeader\n .split(',')\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n .filter(baggageEntry => !baggageEntry.split('=')[0]!.startsWith(SENTRY_BAGGAGE_KEY_PREFIX))\n .join(',')\n );\n}\n\nfunction isRequest(request: unknown): request is Request {\n return typeof Request !== 'undefined' && isInstanceOf(request, Request);\n}\n\nfunction isHeaders(headers: unknown): headers is Headers {\n return typeof Headers !== 'undefined' && isInstanceOf(headers, Headers);\n}\n","import {\n SENTRY_XHR_DATA_KEY,\n addPerformanceInstrumentationHandler,\n addXhrInstrumentationHandler,\n extractNetworkProtocol,\n} from '@sentry-internal/browser-utils';\nimport type { XhrHint } from '@sentry-internal/browser-utils';\nimport type { Client, HandlerDataXhr, SentryWrappedXMLHttpRequest, Span } from '@sentry/core';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SentryNonRecordingSpan,\n addFetchEndInstrumentationHandler,\n addFetchInstrumentationHandler,\n browserPerformanceTimeOrigin,\n getActiveSpan,\n getClient,\n getLocationHref,\n getTraceData,\n hasSpansEnabled,\n instrumentFetchRequest,\n parseUrl,\n setHttpStatus,\n spanToJSON,\n startInactiveSpan,\n stringMatchesSomePattern,\n stripUrlQueryAndFragment,\n} from '@sentry/core';\nimport { WINDOW } from '../helpers';\n\n/** Options for Request Instrumentation */\nexport interface RequestInstrumentationOptions {\n /**\n * List of strings and/or Regular Expressions used to determine which outgoing requests will have `sentry-trace` and `baggage`\n * headers attached.\n *\n * **Default:** If this option is not provided, tracing headers will be attached to all outgoing requests.\n * If you are using a browser SDK, by default, tracing headers will only be attached to outgoing requests to the same origin.\n *\n * **Disclaimer:** Carelessly setting this option in browser environments may result into CORS errors!\n * Only attach tracing headers to requests to the same origin, or to requests to services you can control CORS headers of.\n * Cross-origin requests, meaning requests to a different domain, for example a request to `https://api.example.com/` while you're on `https://example.com/`, take special care.\n * If you are attaching headers to cross-origin requests, make sure the backend handling the request returns a `\"Access-Control-Allow-Headers: sentry-trace, baggage\"` header to ensure your requests aren't blocked.\n *\n * If you provide a `tracePropagationTargets` array, the entries you provide will be matched against the entire URL of the outgoing request.\n * If you are using a browser SDK, the entries will also be matched against the pathname of the outgoing requests.\n * This is so you can have matchers for relative requests, for example, `/^\\/api/` if you want to trace requests to your `/api` routes on the same domain.\n *\n * If any of the two match any of the provided values, tracing headers will be attached to the outgoing request.\n * Both, the string values, and the RegExes you provide in the array will match if they partially match the URL or pathname.\n *\n * Examples:\n * - `tracePropagationTargets: [/^\\/api/]` and request to `https://same-origin.com/api/posts`:\n * - Tracing headers will be attached because the request is sent to the same origin and the regex matches the pathname \"/api/posts\".\n * - `tracePropagationTargets: [/^\\/api/]` and request to `https://different-origin.com/api/posts`:\n * - Tracing headers will not be attached because the pathname will only be compared when the request target lives on the same origin.\n * - `tracePropagationTargets: [/^\\/api/, 'https://external-api.com']` and request to `https://external-api.com/v1/data`:\n * - Tracing headers will be attached because the request URL matches the string `'https://external-api.com'`.\n */\n tracePropagationTargets?: Array<string | RegExp>;\n\n /**\n * Flag to disable patching all together for fetch requests.\n *\n * Default: true\n */\n traceFetch: boolean;\n\n /**\n * Flag to disable patching all together for xhr requests.\n *\n * Default: true\n */\n traceXHR: boolean;\n\n /**\n * Flag to disable tracking of long-lived streams, like server-sent events (SSE) via fetch.\n * Do not enable this in case you have live streams or very long running streams.\n *\n * Disabled by default since it can lead to issues with streams using the `cancel()` api\n * (https://github.com/getsentry/sentry-javascript/issues/13950)\n *\n * Default: false\n */\n trackFetchStreamPerformance: boolean;\n\n /**\n * If true, Sentry will capture http timings and add them to the corresponding http spans.\n *\n * Default: true\n */\n enableHTTPTimings: boolean;\n\n /**\n * This function will be called before creating a span for a request with the given url.\n * Return false if you don't want a span for the given url.\n *\n * Default: (url: string) => true\n */\n shouldCreateSpanForRequest?(this: void, url: string): boolean;\n}\n\nconst responseToSpanId = new WeakMap<object, string>();\nconst spanIdToEndTimestamp = new Map<string, number>();\n\nexport const defaultRequestInstrumentationOptions: RequestInstrumentationOptions = {\n traceFetch: true,\n traceXHR: true,\n enableHTTPTimings: true,\n trackFetchStreamPerformance: false,\n};\n\n/** Registers span creators for xhr and fetch requests */\nexport function instrumentOutgoingRequests(client: Client, _options?: Partial<RequestInstrumentationOptions>): void {\n const {\n traceFetch,\n traceXHR,\n trackFetchStreamPerformance,\n shouldCreateSpanForRequest,\n enableHTTPTimings,\n tracePropagationTargets,\n } = {\n traceFetch: defaultRequestInstrumentationOptions.traceFetch,\n traceXHR: defaultRequestInstrumentationOptions.traceXHR,\n trackFetchStreamPerformance: defaultRequestInstrumentationOptions.trackFetchStreamPerformance,\n ..._options,\n };\n\n const shouldCreateSpan =\n typeof shouldCreateSpanForRequest === 'function' ? shouldCreateSpanForRequest : (_: string) => true;\n\n const shouldAttachHeadersWithTargets = (url: string): boolean => shouldAttachHeaders(url, tracePropagationTargets);\n\n const spans: Record<string, Span> = {};\n\n if (traceFetch) {\n // Keeping track of http requests, whose body payloads resolved later than the initial resolved request\n // e.g. streaming using server sent events (SSE)\n client.addEventProcessor(event => {\n if (event.type === 'transaction' && event.spans) {\n event.spans.forEach(span => {\n if (span.op === 'http.client') {\n const updatedTimestamp = spanIdToEndTimestamp.get(span.span_id);\n if (updatedTimestamp) {\n span.timestamp = updatedTimestamp / 1000;\n spanIdToEndTimestamp.delete(span.span_id);\n }\n }\n });\n }\n return event;\n });\n\n if (trackFetchStreamPerformance) {\n addFetchEndInstrumentationHandler(handlerData => {\n if (handlerData.response) {\n const span = responseToSpanId.get(handlerData.response);\n if (span && handlerData.endTimestamp) {\n spanIdToEndTimestamp.set(span, handlerData.endTimestamp);\n }\n }\n });\n }\n\n addFetchInstrumentationHandler(handlerData => {\n const createdSpan = instrumentFetchRequest(handlerData, shouldCreateSpan, shouldAttachHeadersWithTargets, spans);\n\n if (handlerData.response && handlerData.fetchData.__span) {\n responseToSpanId.set(handlerData.response, handlerData.fetchData.__span);\n }\n\n // We cannot use `window.location` in the generic fetch instrumentation,\n // but we need it for reliable `server.address` attribute.\n // so we extend this in here\n if (createdSpan) {\n const fullUrl = getFullURL(handlerData.fetchData.url);\n const host = fullUrl ? parseUrl(fullUrl).host : undefined;\n createdSpan.setAttributes({\n 'http.url': fullUrl,\n 'server.address': host,\n });\n }\n\n if (enableHTTPTimings && createdSpan) {\n addHTTPTimings(createdSpan);\n }\n });\n }\n\n if (traceXHR) {\n addXhrInstrumentationHandler(handlerData => {\n const createdSpan = xhrCallback(handlerData, shouldCreateSpan, shouldAttachHeadersWithTargets, spans);\n if (enableHTTPTimings && createdSpan) {\n addHTTPTimings(createdSpan);\n }\n });\n }\n}\n\nfunction isPerformanceResourceTiming(entry: PerformanceEntry): entry is PerformanceResourceTiming {\n return (\n entry.entryType === 'resource' &&\n 'initiatorType' in entry &&\n typeof (entry as PerformanceResourceTiming).nextHopProtocol === 'string' &&\n (entry.initiatorType === 'fetch' || entry.initiatorType === 'xmlhttprequest')\n );\n}\n\n/**\n * Creates a temporary observer to listen to the next fetch/xhr resourcing timings,\n * so that when timings hit their per-browser limit they don't need to be removed.\n *\n * @param span A span that has yet to be finished, must contain `url` on data.\n */\nfunction addHTTPTimings(span: Span): void {\n const { url } = spanToJSON(span).data;\n\n if (!url || typeof url !== 'string') {\n return;\n }\n\n const cleanup = addPerformanceInstrumentationHandler('resource', ({ entries }) => {\n entries.forEach(entry => {\n if (isPerformanceResourceTiming(entry) && entry.name.endsWith(url)) {\n const spanData = resourceTimingEntryToSpanData(entry);\n spanData.forEach(data => span.setAttribute(...data));\n // In the next tick, clean this handler up\n // We have to wait here because otherwise this cleans itself up before it is fully done\n setTimeout(cleanup);\n }\n });\n });\n}\n\nfunction getAbsoluteTime(time: number = 0): number {\n return ((browserPerformanceTimeOrigin() || performance.timeOrigin) + time) / 1000;\n}\n\nfunction resourceTimingEntryToSpanData(resourceTiming: PerformanceResourceTiming): [string, string | number][] {\n const { name, version } = extractNetworkProtocol(resourceTiming.nextHopProtocol);\n\n const timingSpanData: [string, string | number][] = [];\n\n timingSpanData.push(['network.protocol.version', version], ['network.protocol.name', name]);\n\n if (!browserPerformanceTimeOrigin()) {\n return timingSpanData;\n }\n return [\n ...timingSpanData,\n ['http.request.redirect_start', getAbsoluteTime(resourceTiming.redirectStart)],\n ['http.request.fetch_start', getAbsoluteTime(resourceTiming.fetchStart)],\n ['http.request.domain_lookup_start', getAbsoluteTime(resourceTiming.domainLookupStart)],\n ['http.request.domain_lookup_end', getAbsoluteTime(resourceTiming.domainLookupEnd)],\n ['http.request.connect_start', getAbsoluteTime(resourceTiming.connectStart)],\n ['http.request.secure_connection_start', getAbsoluteTime(resourceTiming.secureConnectionStart)],\n ['http.request.connection_end', getAbsoluteTime(resourceTiming.connectEnd)],\n ['http.request.request_start', getAbsoluteTime(resourceTiming.requestStart)],\n ['http.request.response_start', getAbsoluteTime(resourceTiming.responseStart)],\n ['http.request.response_end', getAbsoluteTime(resourceTiming.responseEnd)],\n ];\n}\n\n/**\n * A function that determines whether to attach tracing headers to a request.\n * We only export this function for testing purposes.\n */\nexport function shouldAttachHeaders(\n targetUrl: string,\n tracePropagationTargets: (string | RegExp)[] | undefined,\n): boolean {\n // window.location.href not being defined is an edge case in the browser but we need to handle it.\n // Potentially dangerous situations where it may not be defined: Browser Extensions, Web Workers, patching of the location obj\n const href = getLocationHref();\n\n if (!href) {\n // If there is no window.location.origin, we default to only attaching tracing headers to relative requests, i.e. ones that start with `/`\n // BIG DISCLAIMER: Users can call URLs with a double slash (fetch(\"//example.com/api\")), this is a shorthand for \"send to the same protocol\",\n // so we need a to exclude those requests, because they might be cross origin.\n const isRelativeSameOriginRequest = !!targetUrl.match(/^\\/(?!\\/)/);\n if (!tracePropagationTargets) {\n return isRelativeSameOriginRequest;\n } else {\n return stringMatchesSomePattern(targetUrl, tracePropagationTargets);\n }\n } else {\n let resolvedUrl;\n let currentOrigin;\n\n // URL parsing may fail, we default to not attaching trace headers in that case.\n try {\n resolvedUrl = new URL(targetUrl, href);\n currentOrigin = new URL(href).origin;\n } catch (e) {\n return false;\n }\n\n const isSameOriginRequest = resolvedUrl.origin === currentOrigin;\n if (!tracePropagationTargets) {\n return isSameOriginRequest;\n } else {\n return (\n stringMatchesSomePattern(resolvedUrl.toString(), tracePropagationTargets) ||\n (isSameOriginRequest && stringMatchesSomePattern(resolvedUrl.pathname, tracePropagationTargets))\n );\n }\n }\n}\n\n/**\n * Create and track xhr request spans\n *\n * @returns Span if a span was created, otherwise void.\n */\nexport function xhrCallback(\n handlerData: HandlerDataXhr,\n shouldCreateSpan: (url: string) => boolean,\n shouldAttachHeaders: (url: string) => boolean,\n spans: Record<string, Span>,\n): Span | undefined {\n const xhr = handlerData.xhr;\n const sentryXhrData = xhr?.[SENTRY_XHR_DATA_KEY];\n\n if (!xhr || xhr.__sentry_own_request__ || !sentryXhrData) {\n return undefined;\n }\n\n const { url, method } = sentryXhrData;\n\n const shouldCreateSpanResult = hasSpansEnabled() && shouldCreateSpan(url);\n\n // check first if the request has finished and is tracked by an existing span which should now end\n if (handlerData.endTimestamp && shouldCreateSpanResult) {\n const spanId = xhr.__sentry_xhr_span_id__;\n if (!spanId) return;\n\n const span = spans[spanId];\n if (span && sentryXhrData.status_code !== undefined) {\n setHttpStatus(span, sentryXhrData.status_code);\n span.end();\n\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete spans[spanId];\n }\n return undefined;\n }\n\n const fullUrl = getFullURL(url);\n const parsedUrl = fullUrl ? parseUrl(fullUrl) : parseUrl(url);\n\n const urlForSpanName = stripUrlQueryAndFragment(url);\n\n const hasParent = !!getActiveSpan();\n\n const span =\n shouldCreateSpanResult && hasParent\n ? startInactiveSpan({\n name: `${method} ${urlForSpanName}`,\n attributes: {\n url,\n type: 'xhr',\n 'http.method': method,\n 'http.url': fullUrl,\n 'server.address': parsedUrl?.host,\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.browser',\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'http.client',\n ...(parsedUrl?.search && { 'http.query': parsedUrl?.search }),\n ...(parsedUrl?.hash && { 'http.fragment': parsedUrl?.hash }),\n },\n })\n : new SentryNonRecordingSpan();\n\n xhr.__sentry_xhr_span_id__ = span.spanContext().spanId;\n spans[xhr.__sentry_xhr_span_id__] = span;\n\n if (shouldAttachHeaders(url)) {\n addTracingHeadersToXhrRequest(\n xhr,\n // If performance is disabled (TWP) or there's no active root span (pageload/navigation/interaction),\n // we do not want to use the span as base for the trace headers,\n // which means that the headers will be generated from the scope and the sampling decision is deferred\n hasSpansEnabled() && hasParent ? span : undefined,\n );\n }\n\n const client = getClient();\n if (client) {\n client.emit('beforeOutgoingRequestSpan', span, handlerData as XhrHint);\n }\n\n return span;\n}\n\nfunction addTracingHeadersToXhrRequest(xhr: SentryWrappedXMLHttpRequest, span?: Span): void {\n const { 'sentry-trace': sentryTrace, baggage } = getTraceData({ span });\n\n if (sentryTrace) {\n setHeaderOnXhr(xhr, sentryTrace, baggage);\n }\n}\n\nfunction setHeaderOnXhr(\n xhr: SentryWrappedXMLHttpRequest,\n sentryTraceHeader: string,\n sentryBaggageHeader: string | undefined,\n): void {\n try {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n xhr.setRequestHeader!('sentry-trace', sentryTraceHeader);\n if (sentryBaggageHeader) {\n // From MDN: \"If this method is called several times with the same header, the values are merged into one single request header.\"\n // We can therefore simply set a baggage header without checking what was there before\n // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/setRequestHeader\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n xhr.setRequestHeader!('baggage', sentryBaggageHeader);\n }\n } catch (_) {\n // Error: InvalidStateError: Failed to execute 'setRequestHeader' on 'XMLHttpRequest': The object's state must be OPENED.\n }\n}\n\nfunction getFullURL(url: string): string | undefined {\n try {\n // By adding a base URL to new URL(), this will also work for relative urls\n // If `url` is a full URL, the base URL is ignored anyhow\n const parsed = new URL(url, WINDOW.location.origin);\n return parsed.href;\n } catch {\n return undefined;\n }\n}\n","import type { Span } from '@sentry/core';\nimport { logger, SEMANTIC_LINK_ATTRIBUTE_LINK_TYPE, spanToJSON, type SpanContextData } from '@sentry/core';\nimport { WINDOW } from '../exports';\nimport { DEBUG_BUILD } from '../debug-build';\n\nexport interface PreviousTraceInfo {\n /**\n * Span context of the previous trace's local root span\n */\n spanContext: SpanContextData;\n\n /**\n * Timestamp in seconds when the previous trace was started\n */\n startTimestamp: number;\n}\n\n// 1h in seconds\nexport const PREVIOUS_TRACE_MAX_DURATION = 3600;\n\n// session storage key\nexport const PREVIOUS_TRACE_KEY = 'sentry_previous_trace';\n\n/**\n * Adds a previous_trace span link to the passed span if the passed\n * previousTraceInfo is still valid.\n *\n * @returns the updated previous trace info (based on the current span/trace) to\n * be used on the next call\n */\nexport function addPreviousTraceSpanLink(\n previousTraceInfo: PreviousTraceInfo | undefined,\n span: Span,\n): PreviousTraceInfo {\n const spanJson = spanToJSON(span);\n\n if (!previousTraceInfo) {\n return {\n spanContext: span.spanContext(),\n startTimestamp: spanJson.start_timestamp,\n };\n }\n\n if (previousTraceInfo.spanContext.traceId === spanJson.trace_id) {\n // This means, we're still in the same trace so let's not update the previous trace info\n // or add a link to the current span.\n // Once we move away from the long-lived, route-based trace model, we can remove this cases\n return previousTraceInfo;\n }\n\n // Only add the link if the startTimeStamp of the previous trace's root span is within\n // PREVIOUS_TRACE_MAX_DURATION (1h) of the current root span's startTimestamp\n // This is done to\n // - avoid adding links to \"stale\" traces\n // - enable more efficient querying for previous/next traces in Sentry\n if (Date.now() / 1000 - previousTraceInfo.startTimestamp <= PREVIOUS_TRACE_MAX_DURATION) {\n if (DEBUG_BUILD) {\n logger.info(\n `Adding previous_trace ${previousTraceInfo.spanContext} link to span ${{\n op: spanJson.op,\n ...span.spanContext(),\n }}`,\n );\n }\n\n span.addLink({\n context: previousTraceInfo.spanContext,\n attributes: {\n [SEMANTIC_LINK_ATTRIBUTE_LINK_TYPE]: 'previous_trace',\n },\n });\n }\n\n return {\n spanContext: span.spanContext(),\n startTimestamp: spanToJSON(span).start_timestamp,\n };\n}\n\n/**\n * Stores @param previousTraceInfo in sessionStorage.\n */\nexport function storePreviousTraceInSessionStorage(previousTraceInfo: PreviousTraceInfo): void {\n try {\n WINDOW.sessionStorage.setItem(PREVIOUS_TRACE_KEY, JSON.stringify(previousTraceInfo));\n } catch (e) {\n // Ignore potential errors (e.g. if sessionStorage is not available)\n DEBUG_BUILD && logger.warn('Could not store previous trace in sessionStorage', e);\n }\n}\n\n/**\n * Retrieves the previous trace from sessionStorage if available.\n */\nexport function getPreviousTraceFromSessionStorage(): PreviousTraceInfo | undefined {\n try {\n const previousTraceInfo = WINDOW.sessionStorage?.getItem(PREVIOUS_TRACE_KEY);\n // @ts-expect-error - intentionally risking JSON.parse throwing when previousTraceInfo is null to save bundle size\n return JSON.parse(previousTraceInfo);\n } catch (e) {\n return undefined;\n }\n}\n","/* eslint-disable max-lines */\nimport {\n addHistoryInstrumentationHandler,\n addPerformanceEntries,\n registerInpInteractionListener,\n startTrackingINP,\n startTrackingInteractions,\n startTrackingLongAnimationFrames,\n startTrackingLongTasks,\n startTrackingWebVitals,\n} from '@sentry-internal/browser-utils';\nimport type { Client, IntegrationFn, Span, StartSpanOptions, TransactionSource } from '@sentry/core';\nimport {\n GLOBAL_OBJ,\n SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n TRACING_DEFAULTS,\n addNonEnumerableProperty,\n browserPerformanceTimeOrigin,\n generateTraceId,\n getClient,\n getCurrentScope,\n getDynamicSamplingContextFromSpan,\n getIsolationScope,\n getLocationHref,\n getRootSpan,\n logger,\n propagationContextFromHeaders,\n registerSpanErrorInstrumentation,\n spanIsSampled,\n spanToJSON,\n startIdleSpan,\n} from '@sentry/core';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { WINDOW } from '../helpers';\nimport { registerBackgroundTabDetection } from './backgroundtab';\nimport { defaultRequestInstrumentationOptions, instrumentOutgoingRequests } from './request';\nimport type { PreviousTraceInfo } from './previousTrace';\nimport {\n addPreviousTraceSpanLink,\n getPreviousTraceFromSessionStorage,\n storePreviousTraceInSessionStorage,\n} from './previousTrace';\n\nexport const BROWSER_TRACING_INTEGRATION_ID = 'BrowserTracing';\n\ninterface RouteInfo {\n name: string | undefined;\n source: TransactionSource | undefined;\n}\n\n/** Options for Browser Tracing integration */\nexport interface BrowserTracingOptions {\n /**\n * The time that has to pass without any span being created.\n * If this time is exceeded, the idle span will finish.\n *\n * Default: 1000 (ms)\n */\n idleTimeout: number;\n\n /**\n * The max. time an idle span may run.\n * If this time is exceeded, the idle span will finish no matter what.\n *\n * Default: 30000 (ms)\n */\n finalTimeout: number;\n\n /**\n The max. time an idle span may run.\n * If this time is exceeded, the idle span will finish no matter what.\n *\n * Default: 15000 (ms)\n */\n childSpanTimeout: number;\n\n /**\n * If a span should be created on page load.\n * If this is set to `false`, this integration will not start the default page load span.\n * Default: true\n */\n instrumentPageLoad: boolean;\n\n /**\n * If a span should be created on navigation (history change).\n * If this is set to `false`, this integration will not start the default navigation spans.\n * Default: true\n */\n instrumentNavigation: boolean;\n\n /**\n * Flag spans where tabs moved to background with \"cancelled\". Browser background tab timing is\n * not suited towards doing precise measurements of operations. By default, we recommend that this option\n * be enabled as background transactions can mess up your statistics in nondeterministic ways.\n *\n * Default: true\n */\n markBackgroundSpan: boolean;\n\n /**\n * If true, Sentry will capture long tasks and add them to the corresponding transaction.\n *\n * Default: true\n */\n enableLongTask: boolean;\n\n /**\n * If true, Sentry will capture long animation frames and add them to the corresponding transaction.\n *\n * Default: false\n */\n enableLongAnimationFrame: boolean;\n\n /**\n * If true, Sentry will capture first input delay and add it to the corresponding transaction.\n *\n * Default: true\n */\n enableInp: boolean;\n\n /**\n * Flag to disable patching all together for fetch requests.\n *\n * Default: true\n */\n traceFetch: boolean;\n\n /**\n * Flag to disable patching all together for xhr requests.\n *\n * Default: true\n */\n traceXHR: boolean;\n\n /**\n * Flag to disable tracking of long-lived streams, like server-sent events (SSE) via fetch.\n * Do not enable this in case you have live streams or very long running streams.\n *\n * Default: false\n */\n trackFetchStreamPerformance: boolean;\n\n /**\n * If true, Sentry will capture http timings and add them to the corresponding http spans.\n *\n * Default: true\n */\n enableHTTPTimings: boolean;\n\n /**\n * Link the currently started trace to a previous trace (e.g. a prior pageload, navigation or\n * manually started span). When enabled, this option will allow you to navigate between traces\n * in the Sentry UI.\n *\n * You can set this option to the following values:\n *\n * - `'in-memory'`: The previous trace data will be stored in memory.\n * This is useful for single-page applications and enabled by default.\n *\n * - `'session-storage'`: The previous trace data will be stored in the `sessionStorage`.\n * This is useful for multi-page applications or static sites but it means that the\n * Sentry SDK writes to the browser's `sessionStorage`.\n *\n * - `'off'`: The previous trace data will not be stored or linked.\n *\n * Note that your `tracesSampleRate` or `tracesSampler` config significantly influences\n * how often traces will be linked.\n *\n * @default 'in-memory' - see explanation above\n */\n linkPreviousTrace: 'in-memory' | 'session-storage' | 'off';\n\n /**\n * _experiments allows the user to send options to define how this integration works.\n *\n * Default: undefined\n */\n _experiments: Partial<{\n enableInteractions: boolean;\n enableStandaloneClsSpans: boolean;\n }>;\n\n /**\n * A callback which is called before a span for a pageload or navigation is started.\n * It receives the options passed to `startSpan`, and expects to return an updated options object.\n */\n beforeStartSpan?: (options: StartSpanOptions) => StartSpanOptions;\n\n /**\n * This function will be called before creating a span for a request with the given url.\n * Return false if you don't want a span for the given url.\n *\n * Default: (url: string) => true\n */\n shouldCreateSpanForRequest?(this: void, url: string): boolean;\n}\n\nconst DEFAULT_BROWSER_TRACING_OPTIONS: BrowserTracingOptions = {\n ...TRACING_DEFAULTS,\n instrumentNavigation: true,\n instrumentPageLoad: true,\n markBackgroundSpan: true,\n enableLongTask: true,\n enableLongAnimationFrame: true,\n enableInp: true,\n linkPreviousTrace: 'in-memory',\n _experiments: {},\n ...defaultRequestInstrumentationOptions,\n};\n\n/**\n * The Browser Tracing integration automatically instruments browser pageload/navigation\n * actions as transactions, and captures requests, metrics and errors as spans.\n *\n * The integration can be configured with a variety of options, and can be extended to use\n * any routing library.\n *\n * We explicitly export the proper type here, as this has to be extended in some cases.\n */\nexport const browserTracingIntegration = ((_options: Partial<BrowserTracingOptions> = {}) => {\n /**\n * This is just a small wrapper that makes `document` optional.\n * We want to be extra-safe and always check that this exists, to ensure weird environments do not blow up.\n */\n const optionalWindowDocument = WINDOW.document as (typeof WINDOW)['document'] | undefined;\n\n registerSpanErrorInstrumentation();\n\n const {\n enableInp,\n enableLongTask,\n enableLongAnimationFrame,\n _experiments: { enableInteractions, enableStandaloneClsSpans },\n beforeStartSpan,\n idleTimeout,\n finalTimeout,\n childSpanTimeout,\n markBackgroundSpan,\n traceFetch,\n traceXHR,\n trackFetchStreamPerformance,\n shouldCreateSpanForRequest,\n enableHTTPTimings,\n instrumentPageLoad,\n instrumentNavigation,\n linkPreviousTrace,\n } = {\n ...DEFAULT_BROWSER_TRACING_OPTIONS,\n ..._options,\n };\n\n const _collectWebVitals = startTrackingWebVitals({ recordClsStandaloneSpans: enableStandaloneClsSpans || false });\n\n if (enableInp) {\n startTrackingINP();\n }\n\n if (\n enableLongAnimationFrame &&\n GLOBAL_OBJ.PerformanceObserver &&\n PerformanceObserver.supportedEntryTypes &&\n PerformanceObserver.supportedEntryTypes.includes('long-animation-frame')\n ) {\n startTrackingLongAnimationFrames();\n } else if (enableLongTask) {\n startTrackingLongTasks();\n }\n\n if (enableInteractions) {\n startTrackingInteractions();\n }\n\n const latestRoute: RouteInfo = {\n name: undefined,\n source: undefined,\n };\n\n /** Create routing idle transaction. */\n function _createRouteSpan(client: Client, startSpanOptions: StartSpanOptions): void {\n const isPageloadTransaction = startSpanOptions.op === 'pageload';\n\n const finalStartSpanOptions: StartSpanOptions = beforeStartSpan\n ? beforeStartSpan(startSpanOptions)\n : startSpanOptions;\n\n const attributes = finalStartSpanOptions.attributes || {};\n\n // If `finalStartSpanOptions.name` is different than `startSpanOptions.name`\n // it is because `beforeStartSpan` set a custom name. Therefore we set the source to 'custom'.\n if (startSpanOptions.name !== finalStartSpanOptions.name) {\n attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE] = 'custom';\n finalStartSpanOptions.attributes = attributes;\n }\n\n latestRoute.name = finalStartSpanOptions.name;\n latestRoute.source = attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE];\n\n const idleSpan = startIdleSpan(finalStartSpanOptions, {\n idleTimeout,\n finalTimeout,\n childSpanTimeout,\n // should wait for finish signal if it's a pageload transaction\n disableAutoFinish: isPageloadTransaction,\n beforeSpanEnd: span => {\n _collectWebVitals();\n addPerformanceEntries(span, { recordClsOnPageloadSpan: !enableStandaloneClsSpans });\n setActiveIdleSpan(client, undefined);\n\n // A trace should stay consistent over the entire timespan of one route - even after the pageload/navigation ended.\n // Only when another navigation happens, we want to create a new trace.\n // This way, e.g. errors that occur after the pageload span ended are still associated to the pageload trace.\n const scope = getCurrentScope();\n const oldPropagationContext = scope.getPropagationContext();\n\n scope.setPropagationContext({\n ...oldPropagationContext,\n traceId: idleSpan.spanContext().traceId,\n sampled: spanIsSampled(idleSpan),\n dsc: getDynamicSamplingContextFromSpan(span),\n });\n },\n });\n setActiveIdleSpan(client, idleSpan);\n\n function emitFinish(): void {\n if (optionalWindowDocument && ['interactive', 'complete'].includes(optionalWindowDocument.readyState)) {\n client.emit('idleSpanEnableAutoFinish', idleSpan);\n }\n }\n\n if (isPageloadTransaction && optionalWindowDocument) {\n optionalWindowDocument.addEventListener('readystatechange', () => {\n emitFinish();\n });\n\n emitFinish();\n }\n }\n\n return {\n name: BROWSER_TRACING_INTEGRATION_ID,\n afterAllSetup(client) {\n let startingUrl: string | undefined = getLocationHref();\n\n function maybeEndActiveSpan(): void {\n const activeSpan = getActiveIdleSpan(client);\n\n if (activeSpan && !spanToJSON(activeSpan).timestamp) {\n DEBUG_BUILD && logger.log(`[Tracing] Finishing current active span with op: ${spanToJSON(activeSpan).op}`);\n // If there's an open active span, we need to finish it before creating an new one.\n activeSpan.end();\n }\n }\n\n client.on('startNavigationSpan', startSpanOptions => {\n if (getClient() !== client) {\n return;\n }\n\n maybeEndActiveSpan();\n\n getIsolationScope().setPropagationContext({ traceId: generateTraceId(), sampleRand: Math.random() });\n getCurrentScope().setPropagationContext({ traceId: generateTraceId(), sampleRand: Math.random() });\n\n _createRouteSpan(client, {\n op: 'navigation',\n ...startSpanOptions,\n });\n });\n\n client.on('startPageLoadSpan', (startSpanOptions, traceOptions = {}) => {\n if (getClient() !== client) {\n return;\n }\n maybeEndActiveSpan();\n\n const sentryTrace = traceOptions.sentryTrace || getMetaContent('sentry-trace');\n const baggage = traceOptions.baggage || getMetaContent('baggage');\n\n const propagationContext = propagationContextFromHeaders(sentryTrace, baggage);\n getCurrentScope().setPropagationContext(propagationContext);\n\n _createRouteSpan(client, {\n op: 'pageload',\n ...startSpanOptions,\n });\n });\n\n if (linkPreviousTrace !== 'off') {\n let inMemoryPreviousTraceInfo: PreviousTraceInfo | undefined = undefined;\n\n client.on('spanStart', span => {\n if (getRootSpan(span) !== span) {\n return;\n }\n\n if (linkPreviousTrace === 'session-storage') {\n const updatedPreviousTraceInfo = addPreviousTraceSpanLink(getPreviousTraceFromSessionStorage(), span);\n storePreviousTraceInSessionStorage(updatedPreviousTraceInfo);\n } else {\n inMemoryPreviousTraceInfo = addPreviousTraceSpanLink(inMemoryPreviousTraceInfo, span);\n }\n });\n }\n\n if (WINDOW.location) {\n if (instrumentPageLoad) {\n const origin = browserPerformanceTimeOrigin();\n startBrowserTracingPageLoadSpan(client, {\n name: WINDOW.location.pathname,\n // pageload should always start at timeOrigin (and needs to be in s, not ms)\n startTime: origin ? origin / 1000 : undefined,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'url',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.pageload.browser',\n },\n });\n }\n\n if (instrumentNavigation) {\n addHistoryInstrumentationHandler(({ to, from }) => {\n /**\n * This early return is there to account for some cases where a navigation transaction starts right after\n * long-running pageload. We make sure that if `from` is undefined and a valid `startingURL` exists, we don't\n * create an uneccessary navigation transaction.\n *\n * This was hard to duplicate, but this behavior stopped as soon as this fix was applied. This issue might also\n * only be caused in certain development environments where the usage of a hot module reloader is causing\n * errors.\n */\n if (from === undefined && startingUrl?.indexOf(to) !== -1) {\n startingUrl = undefined;\n return;\n }\n\n if (from !== to) {\n startingUrl = undefined;\n startBrowserTracingNavigationSpan(client, {\n name: WINDOW.location.pathname,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'url',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.navigation.browser',\n },\n });\n }\n });\n }\n }\n\n if (markBackgroundSpan) {\n registerBackgroundTabDetection();\n }\n\n if (enableInteractions) {\n registerInteractionListener(client, idleTimeout, finalTimeout, childSpanTimeout, latestRoute);\n }\n\n if (enableInp) {\n registerInpInteractionListener();\n }\n\n instrumentOutgoingRequests(client, {\n traceFetch,\n traceXHR,\n trackFetchStreamPerformance,\n tracePropagationTargets: client.getOptions().tracePropagationTargets,\n shouldCreateSpanForRequest,\n enableHTTPTimings,\n });\n },\n };\n}) satisfies IntegrationFn;\n\n/**\n * Manually start a page load span.\n * This will only do something if a browser tracing integration integration has been setup.\n *\n * If you provide a custom `traceOptions` object, it will be used to continue the trace\n * instead of the default behavior, which is to look it up on the <meta> tags.\n */\nexport function startBrowserTracingPageLoadSpan(\n client: Client,\n spanOptions: StartSpanOptions,\n traceOptions?: { sentryTrace?: string | undefined; baggage?: string | undefined },\n): Span | undefined {\n client.emit('startPageLoadSpan', spanOptions, traceOptions);\n getCurrentScope().setTransactionName(spanOptions.name);\n\n return getActiveIdleSpan(client);\n}\n\n/**\n * Manually start a navigation span.\n * This will only do something if a browser tracing integration has been setup.\n */\nexport function startBrowserTracingNavigationSpan(client: Client, spanOptions: StartSpanOptions): Span | undefined {\n client.emit('startNavigationSpan', spanOptions);\n\n getCurrentScope().setTransactionName(spanOptions.name);\n\n return getActiveIdleSpan(client);\n}\n\n/** Returns the value of a meta tag */\nexport function getMetaContent(metaName: string): string | undefined {\n /**\n * This is just a small wrapper that makes `document` optional.\n * We want to be extra-safe and always check that this exists, to ensure weird environments do not blow up.\n */\n const optionalWindowDocument = WINDOW.document as (typeof WINDOW)['document'] | undefined;\n\n const metaTag = optionalWindowDocument?.querySelector(`meta[name=${metaName}]`);\n return metaTag?.getAttribute('content') || undefined;\n}\n\n/** Start listener for interaction transactions */\nfunction registerInteractionListener(\n client: Client,\n idleTimeout: BrowserTracingOptions['idleTimeout'],\n finalTimeout: BrowserTracingOptions['finalTimeout'],\n childSpanTimeout: BrowserTracingOptions['childSpanTimeout'],\n latestRoute: RouteInfo,\n): void {\n /**\n * This is just a small wrapper that makes `document` optional.\n * We want to be extra-safe and always check that this exists, to ensure weird environments do not blow up.\n */\n const optionalWindowDocument = WINDOW.document as (typeof WINDOW)['document'] | undefined;\n\n let inflightInteractionSpan: Span | undefined;\n const registerInteractionTransaction = (): void => {\n const op = 'ui.action.click';\n\n const activeIdleSpan = getActiveIdleSpan(client);\n if (activeIdleSpan) {\n const currentRootSpanOp = spanToJSON(activeIdleSpan).op;\n if (['navigation', 'pageload'].includes(currentRootSpanOp as string)) {\n DEBUG_BUILD &&\n logger.warn(`[Tracing] Did not create ${op} span because a pageload or navigation span is in progress.`);\n return undefined;\n }\n }\n\n if (inflightInteractionSpan) {\n inflightInteractionSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON, 'interactionInterrupted');\n inflightInteractionSpan.end();\n inflightInteractionSpan = undefined;\n }\n\n if (!latestRoute.name) {\n DEBUG_BUILD && logger.warn(`[Tracing] Did not create ${op} transaction because _latestRouteName is missing.`);\n return undefined;\n }\n\n inflightInteractionSpan = startIdleSpan(\n {\n name: latestRoute.name,\n op,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: latestRoute.source || 'url',\n },\n },\n {\n idleTimeout,\n finalTimeout,\n childSpanTimeout,\n },\n );\n };\n\n if (optionalWindowDocument) {\n addEventListener('click', registerInteractionTransaction, { once: false, capture: true });\n }\n}\n\n// We store the active idle span on the client object, so we can access it from exported functions\nconst ACTIVE_IDLE_SPAN_PROPERTY = '_sentry_idleSpan';\nfunction getActiveIdleSpan(client: Client): Span | undefined {\n return (client as { [ACTIVE_IDLE_SPAN_PROPERTY]?: Span })[ACTIVE_IDLE_SPAN_PROPERTY];\n}\n\nfunction setActiveIdleSpan(client: Client, span: Span | undefined): void {\n addNonEnumerableProperty(client, ACTIVE_IDLE_SPAN_PROPERTY, span);\n}\n","import { SPAN_STATUS_ERROR, getActiveSpan, getRootSpan, logger, spanToJSON } from '@sentry/core';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { WINDOW } from '../helpers';\n\n/**\n * Add a listener that cancels and finishes a transaction when the global\n * document is hidden.\n */\nexport function registerBackgroundTabDetection(): void {\n if (WINDOW.document) {\n WINDOW.document.addEventListener('visibilitychange', () => {\n const activeSpan = getActiveSpan();\n if (!activeSpan) {\n return;\n }\n\n const rootSpan = getRootSpan(activeSpan);\n\n if (WINDOW.document.hidden && rootSpan) {\n const cancelledStatus = 'cancelled';\n\n const { op, status } = spanToJSON(rootSpan);\n\n if (DEBUG_BUILD) {\n logger.log(`[Tracing] Transaction: ${cancelledStatus} -> since tab moved to the background, op: ${op}`);\n }\n\n // We should not set status if it is already set, this prevent important statuses like\n // error or data loss from being overwritten on transaction.\n if (!status) {\n rootSpan.setStatus({ code: SPAN_STATUS_ERROR, message: cancelledStatus });\n }\n\n rootSpan.setAttribute('sentry.cancellation_reason', 'document.hidden');\n rootSpan.end();\n }\n });\n } else {\n DEBUG_BUILD && logger.warn('[Tracing] Could not set up background tab detection due to lack of global document');\n }\n}\n","import type { Client } from './client';\nimport { getClient } from './currentScopes';\nimport { DEBUG_BUILD } from './debug-build';\nimport type { Event, EventHint, Integration, IntegrationFn, Options } from './types-hoist';\nimport { logger } from './utils-hoist/logger';\n\nexport const installedIntegrations: string[] = [];\n\n/** Map of integrations assigned to a client */\nexport type IntegrationIndex = {\n [key: string]: Integration;\n};\n\ntype IntegrationWithDefaultInstance = Integration & { isDefaultInstance?: true };\n\n/**\n * Remove duplicates from the given array, preferring the last instance of any duplicate. Not guaranteed to\n * preserve the order of integrations in the array.\n *\n * @private\n */\nfunction filterDuplicates(integrations: Integration[]): Integration[] {\n const integrationsByName: { [key: string]: Integration } = {};\n\n integrations.forEach((currentInstance: IntegrationWithDefaultInstance) => {\n const { name } = currentInstance;\n\n const existingInstance: IntegrationWithDefaultInstance | undefined = integrationsByName[name];\n\n // We want integrations later in the array to overwrite earlier ones of the same type, except that we never want a\n // default instance to overwrite an existing user instance\n if (existingInstance && !existingInstance.isDefaultInstance && currentInstance.isDefaultInstance) {\n return;\n }\n\n integrationsByName[name] = currentInstance;\n });\n\n return Object.values(integrationsByName);\n}\n\n/** Gets integrations to install */\nexport function getIntegrationsToSetup(options: Pick<Options, 'defaultIntegrations' | 'integrations'>): Integration[] {\n const defaultIntegrations = options.defaultIntegrations || [];\n const userIntegrations = options.integrations;\n\n // We flag default instances, so that later we can tell them apart from any user-created instances of the same class\n defaultIntegrations.forEach((integration: IntegrationWithDefaultInstance) => {\n integration.isDefaultInstance = true;\n });\n\n let integrations: Integration[];\n\n if (Array.isArray(userIntegrations)) {\n integrations = [...defaultIntegrations, ...userIntegrations];\n } else if (typeof userIntegrations === 'function') {\n const resolvedUserIntegrations = userIntegrations(defaultIntegrations);\n integrations = Array.isArray(resolvedUserIntegrations) ? resolvedUserIntegrations : [resolvedUserIntegrations];\n } else {\n integrations = defaultIntegrations;\n }\n\n return filterDuplicates(integrations);\n}\n\n/**\n * Given a list of integration instances this installs them all. When `withDefaults` is set to `true` then all default\n * integrations are added unless they were already provided before.\n * @param integrations array of integration instances\n * @param withDefault should enable default integrations\n */\nexport function setupIntegrations(client: Client, integrations: Integration[]): IntegrationIndex {\n const integrationIndex: IntegrationIndex = {};\n\n integrations.forEach((integration: Integration | undefined) => {\n // guard against empty provided integrations\n if (integration) {\n setupIntegration(client, integration, integrationIndex);\n }\n });\n\n return integrationIndex;\n}\n\n/**\n * Execute the `afterAllSetup` hooks of the given integrations.\n */\nexport function afterSetupIntegrations(client: Client, integrations: Integration[]): void {\n for (const integration of integrations) {\n // guard against empty provided integrations\n if (integration?.afterAllSetup) {\n integration.afterAllSetup(client);\n }\n }\n}\n\n/** Setup a single integration. */\nexport function setupIntegration(client: Client, integration: Integration, integrationIndex: IntegrationIndex): void {\n if (integrationIndex[integration.name]) {\n DEBUG_BUILD && logger.log(`Integration skipped because it was already installed: ${integration.name}`);\n return;\n }\n integrationIndex[integration.name] = integration;\n\n // `setupOnce` is only called the first time\n if (installedIntegrations.indexOf(integration.name) === -1 && typeof integration.setupOnce === 'function') {\n integration.setupOnce();\n installedIntegrations.push(integration.name);\n }\n\n // `setup` is run for each client\n if (integration.setup && typeof integration.setup === 'function') {\n integration.setup(client);\n }\n\n if (typeof integration.preprocessEvent === 'function') {\n const callback = integration.preprocessEvent.bind(integration) as typeof integration.preprocessEvent;\n client.on('preprocessEvent', (event, hint) => callback(event, hint, client));\n }\n\n if (typeof integration.processEvent === 'function') {\n const callback = integration.processEvent.bind(integration) as typeof integration.processEvent;\n\n const processor = Object.assign((event: Event, hint: EventHint) => callback(event, hint, client), {\n id: integration.name,\n });\n\n client.addEventProcessor(processor);\n }\n\n DEBUG_BUILD && logger.log(`Integration installed: ${integration.name}`);\n}\n\n/** Add an integration to the current scope's client. */\nexport function addIntegration(integration: Integration): void {\n const client = getClient();\n\n if (!client) {\n DEBUG_BUILD && logger.warn(`Cannot add integration \"${integration.name}\" because no SDK Client is available.`);\n return;\n }\n\n client.addIntegration(integration);\n}\n\n/**\n * Define an integration function that can be used to create an integration instance.\n * Note that this by design hides the implementation details of the integration, as they are considered internal.\n */\nexport function defineIntegration<Fn extends IntegrationFn>(fn: Fn): (...args: Parameters<Fn>) => Integration {\n return fn;\n}\n","import type { Event } from '../types-hoist';\n\n/**\n * Get a list of possible event messages from a Sentry event.\n */\nexport function getPossibleEventMessages(event: Event): string[] {\n const possibleMessages: string[] = [];\n\n if (event.message) {\n possibleMessages.push(event.message);\n }\n\n try {\n // @ts-expect-error Try catching to save bundle size\n const lastException = event.exception.values[event.exception.values.length - 1];\n if (lastException?.value) {\n possibleMessages.push(lastException.value);\n if (lastException.type) {\n possibleMessages.push(`${lastException.type}: ${lastException.value}`);\n }\n }\n } catch (e) {\n // ignore errors here\n }\n\n return possibleMessages;\n}\n","import type { Event, IntegrationFn, StackFrame } from '../types-hoist';\n\nimport { DEBUG_BUILD } from '../debug-build';\nimport { defineIntegration } from '../integration';\nimport { logger } from '../utils-hoist/logger';\nimport { getEventDescription } from '../utils-hoist/misc';\nimport { stringMatchesSomePattern } from '../utils-hoist/string';\nimport { getPossibleEventMessages } from '../utils/eventUtils';\n\n// \"Script error.\" is hard coded into browsers for errors that it can't read.\n// this is the result of a script being pulled in from an external domain and CORS.\nconst DEFAULT_IGNORE_ERRORS = [\n /^Script error\\.?$/,\n /^Javascript error: Script error\\.? on line 0$/,\n /^ResizeObserver loop completed with undelivered notifications.$/, // The browser logs this when a ResizeObserver handler takes a bit longer. Usually this is not an actual issue though. It indicates slowness.\n /^Cannot redefine property: googletag$/, // This is thrown when google tag manager is used in combination with an ad blocker\n /^Can't find variable: gmo$/, // Error from Google Search App https://issuetracker.google.com/issues/396043331\n /^undefined is not an object \\(evaluating 'a\\.[A-Z]'\\)$/, // Random error that happens but not actionable or noticeable to end-users.\n 'can\\'t redefine non-configurable property \"solana\"', // Probably a browser extension or custom browser (Brave) throwing this error\n \"vv().getRestrictions is not a function. (In 'vv().getRestrictions(1,a)', 'vv().getRestrictions' is undefined)\", // Error thrown by GTM, seemingly not affecting end-users\n \"Can't find variable: _AutofillCallbackHandler\", // Unactionable error in instagram webview https://developers.facebook.com/community/threads/320013549791141/\n /^Non-Error promise rejection captured with value: Object Not Found Matching Id:\\d+, MethodName:simulateEvent, ParamCount:\\d+$/, // unactionable error from CEFSharp, a .NET library that embeds chromium in .NET apps\n /^Java exception was raised during method invocation$/, // error from Facebook Mobile browser (https://github.com/getsentry/sentry-javascript/issues/15065)\n];\n\n/** Options for the EventFilters integration */\nexport interface EventFiltersOptions {\n allowUrls: Array<string | RegExp>;\n denyUrls: Array<string | RegExp>;\n ignoreErrors: Array<string | RegExp>;\n ignoreTransactions: Array<string | RegExp>;\n ignoreInternal: boolean;\n disableErrorDefaults: boolean;\n}\n\nconst INTEGRATION_NAME = 'EventFilters';\n\n/**\n * An integration that filters out events (errors and transactions) based on:\n *\n * - (Errors) A curated list of known low-value or irrelevant errors (see {@link DEFAULT_IGNORE_ERRORS})\n * - (Errors) A list of error messages or urls/filenames passed in via\n * - Top level Sentry.init options (`ignoreErrors`, `denyUrls`, `allowUrls`)\n * - The same options passed to the integration directly via @param options\n * - (Transactions/Spans) A list of root span (transaction) names passed in via\n * - Top level Sentry.init option (`ignoreTransactions`)\n * - The same option passed to the integration directly via @param options\n *\n * Events filtered by this integration will not be sent to Sentry.\n */\nexport const eventFiltersIntegration = defineIntegration((options: Partial<EventFiltersOptions> = {}) => {\n let mergedOptions: Partial<EventFiltersOptions> | undefined;\n return {\n name: INTEGRATION_NAME,\n setup(client) {\n const clientOptions = client.getOptions();\n mergedOptions = _mergeOptions(options, clientOptions);\n },\n processEvent(event, _hint, client) {\n if (!mergedOptions) {\n const clientOptions = client.getOptions();\n mergedOptions = _mergeOptions(options, clientOptions);\n }\n return _shouldDropEvent(event, mergedOptions) ? null : event;\n },\n };\n});\n\n/**\n * An integration that filters out events (errors and transactions) based on:\n *\n * - (Errors) A curated list of known low-value or irrelevant errors (see {@link DEFAULT_IGNORE_ERRORS})\n * - (Errors) A list of error messages or urls/filenames passed in via\n * - Top level Sentry.init options (`ignoreErrors`, `denyUrls`, `allowUrls`)\n * - The same options passed to the integration directly via @param options\n * - (Transactions/Spans) A list of root span (transaction) names passed in via\n * - Top level Sentry.init option (`ignoreTransactions`)\n * - The same option passed to the integration directly via @param options\n *\n * Events filtered by this integration will not be sent to Sentry.\n *\n * @deprecated this integration was renamed and will be removed in a future major version.\n * Use `eventFiltersIntegration` instead.\n */\nexport const inboundFiltersIntegration = defineIntegration(((options: Partial<EventFiltersOptions> = {}) => {\n return {\n ...eventFiltersIntegration(options),\n name: 'InboundFilters',\n };\n}) satisfies IntegrationFn);\n\nfunction _mergeOptions(\n internalOptions: Partial<EventFiltersOptions> = {},\n clientOptions: Partial<EventFiltersOptions> = {},\n): Partial<EventFiltersOptions> {\n return {\n allowUrls: [...(internalOptions.allowUrls || []), ...(clientOptions.allowUrls || [])],\n denyUrls: [...(internalOptions.denyUrls || []), ...(clientOptions.denyUrls || [])],\n ignoreErrors: [\n ...(internalOptions.ignoreErrors || []),\n ...(clientOptions.ignoreErrors || []),\n ...(internalOptions.disableErrorDefaults ? [] : DEFAULT_IGNORE_ERRORS),\n ],\n ignoreTransactions: [...(internalOptions.ignoreTransactions || []), ...(clientOptions.ignoreTransactions || [])],\n ignoreInternal: internalOptions.ignoreInternal !== undefined ? internalOptions.ignoreInternal : true,\n };\n}\n\nfunction _shouldDropEvent(event: Event, options: Partial<EventFiltersOptions>): boolean {\n if (!event.type) {\n // Filter errors\n\n if (options.ignoreInternal && _isSentryError(event)) {\n DEBUG_BUILD &&\n logger.warn(`Event dropped due to being internal Sentry Error.\\nEvent: ${getEventDescription(event)}`);\n return true;\n }\n if (_isIgnoredError(event, options.ignoreErrors)) {\n DEBUG_BUILD &&\n logger.warn(\n `Event dropped due to being matched by \\`ignoreErrors\\` option.\\nEvent: ${getEventDescription(event)}`,\n );\n return true;\n }\n if (_isUselessError(event)) {\n DEBUG_BUILD &&\n logger.warn(\n `Event dropped due to not having an error message, error type or stacktrace.\\nEvent: ${getEventDescription(\n event,\n )}`,\n );\n return true;\n }\n if (_isDeniedUrl(event, options.denyUrls)) {\n DEBUG_BUILD &&\n logger.warn(\n `Event dropped due to being matched by \\`denyUrls\\` option.\\nEvent: ${getEventDescription(\n event,\n )}.\\nUrl: ${_getEventFilterUrl(event)}`,\n );\n return true;\n }\n if (!_isAllowedUrl(event, options.allowUrls)) {\n DEBUG_BUILD &&\n logger.warn(\n `Event dropped due to not being matched by \\`allowUrls\\` option.\\nEvent: ${getEventDescription(\n event,\n )}.\\nUrl: ${_getEventFilterUrl(event)}`,\n );\n return true;\n }\n } else if (event.type === 'transaction') {\n // Filter transactions\n\n if (_isIgnoredTransaction(event, options.ignoreTransactions)) {\n DEBUG_BUILD &&\n logger.warn(\n `Event dropped due to being matched by \\`ignoreTransactions\\` option.\\nEvent: ${getEventDescription(event)}`,\n );\n return true;\n }\n }\n return false;\n}\n\nfunction _isIgnoredError(event: Event, ignoreErrors?: Array<string | RegExp>): boolean {\n if (!ignoreErrors?.length) {\n return false;\n }\n\n return getPossibleEventMessages(event).some(message => stringMatchesSomePattern(message, ignoreErrors));\n}\n\nfunction _isIgnoredTransaction(event: Event, ignoreTransactions?: Array<string | RegExp>): boolean {\n if (!ignoreTransactions?.length) {\n return false;\n }\n\n const name = event.transaction;\n return name ? stringMatchesSomePattern(name, ignoreTransactions) : false;\n}\n\nfunction _isDeniedUrl(event: Event, denyUrls?: Array<string | RegExp>): boolean {\n if (!denyUrls?.length) {\n return false;\n }\n const url = _getEventFilterUrl(event);\n return !url ? false : stringMatchesSomePattern(url, denyUrls);\n}\n\nfunction _isAllowedUrl(event: Event, allowUrls?: Array<string | RegExp>): boolean {\n if (!allowUrls?.length) {\n return true;\n }\n const url = _getEventFilterUrl(event);\n return !url ? true : stringMatchesSomePattern(url, allowUrls);\n}\n\nfunction _isSentryError(event: Event): boolean {\n try {\n // @ts-expect-error can't be a sentry error if undefined\n return event.exception.values[0].type === 'SentryError';\n } catch (e) {\n // ignore\n }\n return false;\n}\n\nfunction _getLastValidUrl(frames: StackFrame[] = []): string | null {\n for (let i = frames.length - 1; i >= 0; i--) {\n const frame = frames[i];\n\n if (frame && frame.filename !== '<anonymous>' && frame.filename !== '[native code]') {\n return frame.filename || null;\n }\n }\n\n return null;\n}\n\nfunction _getEventFilterUrl(event: Event): string | null {\n try {\n // If there are linked exceptions or exception aggregates we only want to match against the top frame of the \"root\" (the main exception)\n // The root always comes last in linked exceptions\n const rootException = [...(event.exception?.values ?? [])]\n .reverse()\n .find(value => value.mechanism?.parent_id === undefined && value.stacktrace?.frames?.length);\n const frames = rootException?.stacktrace?.frames;\n return frames ? _getLastValidUrl(frames) : null;\n } catch (oO) {\n DEBUG_BUILD && logger.error(`Cannot extract url for event ${getEventDescription(event)}`);\n return null;\n }\n}\n\nfunction _isUselessError(event: Event): boolean {\n // We only want to consider events for dropping that actually have recorded exception values.\n if (!event.exception?.values?.length) {\n return false;\n }\n\n return (\n // No top-level message\n !event.message &&\n // There are no exception values that have a stacktrace, a non-generic-Error type or value\n !event.exception.values.some(value => value.stacktrace || (value.type && value.type !== 'Error') || value.value)\n );\n}\n","import type { Client } from '../client';\nimport { getClient } from '../currentScopes';\nimport { defineIntegration } from '../integration';\nimport type { IntegrationFn, WrappedFunction } from '../types-hoist';\nimport { getOriginalFunction } from '../utils-hoist/object';\n\nlet originalFunctionToString: () => void;\n\nconst INTEGRATION_NAME = 'FunctionToString';\n\nconst SETUP_CLIENTS = new WeakMap<Client, boolean>();\n\nconst _functionToStringIntegration = (() => {\n return {\n name: INTEGRATION_NAME,\n setupOnce() {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n originalFunctionToString = Function.prototype.toString;\n\n // intrinsics (like Function.prototype) might be immutable in some environments\n // e.g. Node with --frozen-intrinsics, XS (an embedded JavaScript engine) or SES (a JavaScript proposal)\n try {\n Function.prototype.toString = function (this: WrappedFunction, ...args: unknown[]): string {\n const originalFunction = getOriginalFunction(this);\n const context =\n SETUP_CLIENTS.has(getClient() as Client) && originalFunction !== undefined ? originalFunction : this;\n return originalFunctionToString.apply(context, args);\n };\n } catch {\n // ignore errors here, just don't patch this\n }\n },\n setup(client) {\n SETUP_CLIENTS.set(client, true);\n },\n };\n}) satisfies IntegrationFn;\n\n/**\n * Patch toString calls to return proper name for wrapped functions.\n *\n * ```js\n * Sentry.init({\n * integrations: [\n * functionToStringIntegration(),\n * ],\n * });\n * ```\n */\nexport const functionToStringIntegration = defineIntegration(_functionToStringIntegration);\n","import { defineIntegration } from '../integration';\nimport type { Event, Exception, IntegrationFn, StackFrame } from '../types-hoist';\n\nimport { DEBUG_BUILD } from '../debug-build';\nimport { logger } from '../utils-hoist/logger';\nimport { getFramesFromEvent } from '../utils-hoist/stacktrace';\n\nconst INTEGRATION_NAME = 'Dedupe';\n\nconst _dedupeIntegration = (() => {\n let previousEvent: Event | undefined;\n\n return {\n name: INTEGRATION_NAME,\n processEvent(currentEvent) {\n // We want to ignore any non-error type events, e.g. transactions or replays\n // These should never be deduped, and also not be compared against as _previousEvent.\n if (currentEvent.type) {\n return currentEvent;\n }\n\n // Juuust in case something goes wrong\n try {\n if (_shouldDropEvent(currentEvent, previousEvent)) {\n DEBUG_BUILD && logger.warn('Event dropped due to being a duplicate of previously captured event.');\n return null;\n }\n } catch (_oO) {} // eslint-disable-line no-empty\n\n return (previousEvent = currentEvent);\n },\n };\n}) satisfies IntegrationFn;\n\n/**\n * Deduplication filter.\n */\nexport const dedupeIntegration = defineIntegration(_dedupeIntegration);\n\n/** only exported for tests. */\nexport function _shouldDropEvent(currentEvent: Event, previousEvent?: Event): boolean {\n if (!previousEvent) {\n return false;\n }\n\n if (_isSameMessageEvent(currentEvent, previousEvent)) {\n return true;\n }\n\n if (_isSameExceptionEvent(currentEvent, previousEvent)) {\n return true;\n }\n\n return false;\n}\n\nfunction _isSameMessageEvent(currentEvent: Event, previousEvent: Event): boolean {\n const currentMessage = currentEvent.message;\n const previousMessage = previousEvent.message;\n\n // If neither event has a message property, they were both exceptions, so bail out\n if (!currentMessage && !previousMessage) {\n return false;\n }\n\n // If only one event has a stacktrace, but not the other one, they are not the same\n if ((currentMessage && !previousMessage) || (!currentMessage && previousMessage)) {\n return false;\n }\n\n if (currentMessage !== previousMessage) {\n return false;\n }\n\n if (!_isSameFingerprint(currentEvent, previousEvent)) {\n return false;\n }\n\n if (!_isSameStacktrace(currentEvent, previousEvent)) {\n return false;\n }\n\n return true;\n}\n\nfunction _isSameExceptionEvent(currentEvent: Event, previousEvent: Event): boolean {\n const previousException = _getExceptionFromEvent(previousEvent);\n const currentException = _getExceptionFromEvent(currentEvent);\n\n if (!previousException || !currentException) {\n return false;\n }\n\n if (previousException.type !== currentException.type || previousException.value !== currentException.value) {\n return false;\n }\n\n if (!_isSameFingerprint(currentEvent, previousEvent)) {\n return false;\n }\n\n if (!_isSameStacktrace(currentEvent, previousEvent)) {\n return false;\n }\n\n return true;\n}\n\nfunction _isSameStacktrace(currentEvent: Event, previousEvent: Event): boolean {\n let currentFrames = getFramesFromEvent(currentEvent);\n let previousFrames = getFramesFromEvent(previousEvent);\n\n // If neither event has a stacktrace, they are assumed to be the same\n if (!currentFrames && !previousFrames) {\n return true;\n }\n\n // If only one event has a stacktrace, but not the other one, they are not the same\n if ((currentFrames && !previousFrames) || (!currentFrames && previousFrames)) {\n return false;\n }\n\n currentFrames = currentFrames as StackFrame[];\n previousFrames = previousFrames as StackFrame[];\n\n // If number of frames differ, they are not the same\n if (previousFrames.length !== currentFrames.length) {\n return false;\n }\n\n // Otherwise, compare the two\n for (let i = 0; i < previousFrames.length; i++) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const frameA = previousFrames[i]!;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const frameB = currentFrames[i]!;\n\n if (\n frameA.filename !== frameB.filename ||\n frameA.lineno !== frameB.lineno ||\n frameA.colno !== frameB.colno ||\n frameA.function !== frameB.function\n ) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction _isSameFingerprint(currentEvent: Event, previousEvent: Event): boolean {\n let currentFingerprint = currentEvent.fingerprint;\n let previousFingerprint = previousEvent.fingerprint;\n\n // If neither event has a fingerprint, they are assumed to be the same\n if (!currentFingerprint && !previousFingerprint) {\n return true;\n }\n\n // If only one event has a fingerprint, but not the other one, they are not the same\n if ((currentFingerprint && !previousFingerprint) || (!currentFingerprint && previousFingerprint)) {\n return false;\n }\n\n currentFingerprint = currentFingerprint as string[];\n previousFingerprint = previousFingerprint as string[];\n\n // Otherwise, compare the two\n try {\n return !!(currentFingerprint.join('') === previousFingerprint.join(''));\n } catch (_oO) {\n return false;\n }\n}\n\nfunction _getExceptionFromEvent(event: Event): Exception | undefined {\n return event.exception?.values && event.exception.values[0];\n}\n","import type { Client } from './client';\nimport { getCurrentScope } from './currentScopes';\nimport { DEBUG_BUILD } from './debug-build';\nimport type { ClientOptions } from './types-hoist';\nimport { consoleSandbox, logger } from './utils-hoist/logger';\n\n/** A class object that can instantiate Client objects. */\nexport type ClientClass<F extends Client, O extends ClientOptions> = new (options: O) => F;\n\n/**\n * Internal function to create a new SDK client instance. The client is\n * installed and then bound to the current scope.\n *\n * @param clientClass The client class to instantiate.\n * @param options Options to pass to the client.\n */\nexport function initAndBind<F extends Client, O extends ClientOptions>(\n clientClass: ClientClass<F, O>,\n options: O,\n): Client {\n if (options.debug === true) {\n if (DEBUG_BUILD) {\n logger.enable();\n } else {\n // use `console.warn` rather than `logger.warn` since by non-debug bundles have all `logger.x` statements stripped\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.warn('[Sentry] Cannot initialize SDK with `debug` option using a non-debug bundle.');\n });\n }\n }\n const scope = getCurrentScope();\n scope.update(options.initialScope);\n\n const client = new clientClass(options);\n setCurrentClient(client);\n client.init();\n return client;\n}\n\n/**\n * Make the given client the current client.\n */\nexport function setCurrentClient(client: Client): void {\n getCurrentScope().setClient(client);\n}\n","import type { ReportDialogOptions } from './report-dialog';\nimport type { DsnComponents, DsnLike, SdkInfo } from './types-hoist';\nimport { dsnToString, makeDsn } from './utils-hoist/dsn';\n\nconst SENTRY_API_VERSION = '7';\n\n/** Returns the prefix to construct Sentry ingestion API endpoints. */\nfunction getBaseApiEndpoint(dsn: DsnComponents): string {\n const protocol = dsn.protocol ? `${dsn.protocol}:` : '';\n const port = dsn.port ? `:${dsn.port}` : '';\n return `${protocol}//${dsn.host}${port}${dsn.path ? `/${dsn.path}` : ''}/api/`;\n}\n\n/** Returns the ingest API endpoint for target. */\nfunction _getIngestEndpoint(dsn: DsnComponents): string {\n return `${getBaseApiEndpoint(dsn)}${dsn.projectId}/envelope/`;\n}\n\n/** Returns a URL-encoded string with auth config suitable for a query string. */\nfunction _encodedAuth(dsn: DsnComponents, sdkInfo: SdkInfo | undefined): string {\n const params: Record<string, string> = {\n sentry_version: SENTRY_API_VERSION,\n };\n\n if (dsn.publicKey) {\n // We send only the minimum set of required information. See\n // https://github.com/getsentry/sentry-javascript/issues/2572.\n params.sentry_key = dsn.publicKey;\n }\n\n if (sdkInfo) {\n params.sentry_client = `${sdkInfo.name}/${sdkInfo.version}`;\n }\n\n return new URLSearchParams(params).toString();\n}\n\n/**\n * Returns the envelope endpoint URL with auth in the query string.\n *\n * Sending auth as part of the query string and not as custom HTTP headers avoids CORS preflight requests.\n */\nexport function getEnvelopeEndpointWithUrlEncodedAuth(dsn: DsnComponents, tunnel?: string, sdkInfo?: SdkInfo): string {\n return tunnel ? tunnel : `${_getIngestEndpoint(dsn)}?${_encodedAuth(dsn, sdkInfo)}`;\n}\n\n/** Returns the url to the report dialog endpoint. */\nexport function getReportDialogEndpoint(dsnLike: DsnLike, dialogOptions: ReportDialogOptions): string {\n const dsn = makeDsn(dsnLike);\n if (!dsn) {\n return '';\n }\n\n const endpoint = `${getBaseApiEndpoint(dsn)}embed/error-page/`;\n\n let encodedOptions = `dsn=${dsnToString(dsn)}`;\n for (const key in dialogOptions) {\n if (key === 'dsn') {\n continue;\n }\n\n if (key === 'onClose') {\n continue;\n }\n\n if (key === 'user') {\n const user = dialogOptions.user;\n if (!user) {\n continue;\n }\n if (user.name) {\n encodedOptions += `&name=${encodeURIComponent(user.name)}`;\n }\n if (user.email) {\n encodedOptions += `&email=${encodeURIComponent(user.email)}`;\n }\n } else {\n encodedOptions += `&${encodeURIComponent(key)}=${encodeURIComponent(dialogOptions[key] as string)}`;\n }\n }\n\n return `${endpoint}?${encodedOptions}`;\n}\n","import type { ConsoleLevel } from '../types-hoist';\n\n/** An error emitted by Sentry SDKs and related utilities. */\nexport class SentryError extends Error {\n public logLevel: ConsoleLevel;\n\n public constructor(\n public message: string,\n logLevel: ConsoleLevel = 'warn',\n ) {\n super(message);\n\n this.logLevel = logLevel;\n }\n}\n","/* eslint-disable max-lines */\nimport type {\n Breadcrumb,\n BreadcrumbHint,\n CheckIn,\n ClientOptions,\n DataCategory,\n DsnComponents,\n DynamicSamplingContext,\n Envelope,\n ErrorEvent,\n Event,\n EventDropReason,\n EventHint,\n EventProcessor,\n FeedbackEvent,\n FetchBreadcrumbHint,\n Integration,\n MonitorConfig,\n Outcome,\n ParameterizedString,\n SdkMetadata,\n Session,\n SessionAggregates,\n SeverityLevel,\n Span,\n SpanAttributes,\n SpanContextData,\n SpanJSON,\n StartSpanOptions,\n TraceContext,\n TransactionEvent,\n Transport,\n TransportMakeRequestResponse,\n XhrBreadcrumbHint,\n} from './types-hoist';\n\nimport { getEnvelopeEndpointWithUrlEncodedAuth } from './api';\nimport { DEFAULT_ENVIRONMENT } from './constants';\nimport { getCurrentScope, getIsolationScope, getTraceContextFromScope } from './currentScopes';\nimport { DEBUG_BUILD } from './debug-build';\nimport { createEventEnvelope, createSessionEnvelope } from './envelope';\nimport type { IntegrationIndex } from './integration';\nimport { afterSetupIntegrations } from './integration';\nimport { setupIntegration, setupIntegrations } from './integration';\nimport type { Scope } from './scope';\nimport { updateSession } from './session';\nimport {\n getDynamicSamplingContextFromScope,\n getDynamicSamplingContextFromSpan,\n} from './tracing/dynamicSamplingContext';\nimport { createClientReportEnvelope } from './utils-hoist/clientreport';\nimport { dsnToString, makeDsn } from './utils-hoist/dsn';\nimport { addItemToEnvelope, createAttachmentEnvelopeItem } from './utils-hoist/envelope';\nimport { SentryError } from './utils-hoist/error';\nimport { isParameterizedString, isPlainObject, isPrimitive, isThenable } from './utils-hoist/is';\nimport { logger } from './utils-hoist/logger';\nimport { checkOrSetAlreadyCaught, uuid4 } from './utils-hoist/misc';\nimport { SyncPromise, rejectedSyncPromise, resolvedSyncPromise } from './utils-hoist/syncpromise';\nimport { getPossibleEventMessages } from './utils/eventUtils';\nimport { merge } from './utils/merge';\nimport { parseSampleRate } from './utils/parseSampleRate';\nimport { prepareEvent } from './utils/prepareEvent';\nimport { showSpanDropWarning, spanToTraceContext } from './utils/spanUtils';\nimport { convertSpanJsonToTransactionEvent, convertTransactionEventToSpanJson } from './utils/transactionEvent';\nimport { _getSpanForScope } from './utils/spanOnScope';\n\nconst ALREADY_SEEN_ERROR = \"Not capturing exception because it's already been captured.\";\nconst MISSING_RELEASE_FOR_SESSION_ERROR = 'Discarded session because of missing or non-string release';\n\n/**\n * Base implementation for all JavaScript SDK clients.\n *\n * Call the constructor with the corresponding options\n * specific to the client subclass. To access these options later, use\n * {@link Client.getOptions}.\n *\n * If a Dsn is specified in the options, it will be parsed and stored. Use\n * {@link Client.getDsn} to retrieve the Dsn at any moment. In case the Dsn is\n * invalid, the constructor will throw a {@link SentryException}. Note that\n * without a valid Dsn, the SDK will not send any events to Sentry.\n *\n * Before sending an event, it is passed through\n * {@link Client._prepareEvent} to add SDK information and scope data\n * (breadcrumbs and context). To add more custom information, override this\n * method and extend the resulting prepared event.\n *\n * To issue automatically created events (e.g. via instrumentation), use\n * {@link Client.captureEvent}. It will prepare the event and pass it through\n * the callback lifecycle. To issue auto-breadcrumbs, use\n * {@link Client.addBreadcrumb}.\n *\n * @example\n * class NodeClient extends Client<NodeOptions> {\n * public constructor(options: NodeOptions) {\n * super(options);\n * }\n *\n * // ...\n * }\n */\nexport abstract class Client<O extends ClientOptions = ClientOptions> {\n /** Options passed to the SDK. */\n protected readonly _options: O;\n\n /** The client Dsn, if specified in options. Without this Dsn, the SDK will be disabled. */\n protected readonly _dsn?: DsnComponents;\n\n protected readonly _transport?: Transport;\n\n /** Array of set up integrations. */\n protected _integrations: IntegrationIndex;\n\n /** Number of calls being processed */\n protected _numProcessing: number;\n\n protected _eventProcessors: EventProcessor[];\n\n /** Holds flushable */\n private _outcomes: { [key: string]: number };\n\n // eslint-disable-next-line @typescript-eslint/ban-types\n private _hooks: Record<string, Function[]>;\n\n /**\n * Initializes this client instance.\n *\n * @param options Options for the client.\n */\n protected constructor(options: O) {\n this._options = options;\n this._integrations = {};\n this._numProcessing = 0;\n this._outcomes = {};\n this._hooks = {};\n this._eventProcessors = [];\n\n if (options.dsn) {\n this._dsn = makeDsn(options.dsn);\n } else {\n DEBUG_BUILD && logger.warn('No DSN provided, client will not send events.');\n }\n\n if (this._dsn) {\n const url = getEnvelopeEndpointWithUrlEncodedAuth(\n this._dsn,\n options.tunnel,\n options._metadata ? options._metadata.sdk : undefined,\n );\n this._transport = options.transport({\n tunnel: this._options.tunnel,\n recordDroppedEvent: this.recordDroppedEvent.bind(this),\n ...options.transportOptions,\n url,\n });\n }\n }\n\n /**\n * Captures an exception event and sends it to Sentry.\n *\n * Unlike `captureException` exported from every SDK, this method requires that you pass it the current scope.\n */\n public captureException(exception: unknown, hint?: EventHint, scope?: Scope): string {\n const eventId = uuid4();\n\n // ensure we haven't captured this very object before\n if (checkOrSetAlreadyCaught(exception)) {\n DEBUG_BUILD && logger.log(ALREADY_SEEN_ERROR);\n return eventId;\n }\n\n const hintWithEventId = {\n event_id: eventId,\n ...hint,\n };\n\n this._process(\n this.eventFromException(exception, hintWithEventId).then(event =>\n this._captureEvent(event, hintWithEventId, scope),\n ),\n );\n\n return hintWithEventId.event_id;\n }\n\n /**\n * Captures a message event and sends it to Sentry.\n *\n * Unlike `captureMessage` exported from every SDK, this method requires that you pass it the current scope.\n */\n public captureMessage(\n message: ParameterizedString,\n level?: SeverityLevel,\n hint?: EventHint,\n currentScope?: Scope,\n ): string {\n const hintWithEventId = {\n event_id: uuid4(),\n ...hint,\n };\n\n const eventMessage = isParameterizedString(message) ? message : String(message);\n\n const promisedEvent = isPrimitive(message)\n ? this.eventFromMessage(eventMessage, level, hintWithEventId)\n : this.eventFromException(message, hintWithEventId);\n\n this._process(promisedEvent.then(event => this._captureEvent(event, hintWithEventId, currentScope)));\n\n return hintWithEventId.event_id;\n }\n\n /**\n * Captures a manually created event and sends it to Sentry.\n *\n * Unlike `captureEvent` exported from every SDK, this method requires that you pass it the current scope.\n */\n public captureEvent(event: Event, hint?: EventHint, currentScope?: Scope): string {\n const eventId = uuid4();\n\n // ensure we haven't captured this very object before\n if (hint?.originalException && checkOrSetAlreadyCaught(hint.originalException)) {\n DEBUG_BUILD && logger.log(ALREADY_SEEN_ERROR);\n return eventId;\n }\n\n const hintWithEventId = {\n event_id: eventId,\n ...hint,\n };\n\n const sdkProcessingMetadata = event.sdkProcessingMetadata || {};\n const capturedSpanScope: Scope | undefined = sdkProcessingMetadata.capturedSpanScope;\n const capturedSpanIsolationScope: Scope | undefined = sdkProcessingMetadata.capturedSpanIsolationScope;\n\n this._process(\n this._captureEvent(event, hintWithEventId, capturedSpanScope || currentScope, capturedSpanIsolationScope),\n );\n\n return hintWithEventId.event_id;\n }\n\n /**\n * Captures a session.\n */\n public captureSession(session: Session): void {\n this.sendSession(session);\n // After sending, we set init false to indicate it's not the first occurrence\n updateSession(session, { init: false });\n }\n\n /**\n * Create a cron monitor check in and send it to Sentry. This method is not available on all clients.\n *\n * @param checkIn An object that describes a check in.\n * @param upsertMonitorConfig An optional object that describes a monitor config. Use this if you want\n * to create a monitor automatically when sending a check in.\n * @param scope An optional scope containing event metadata.\n * @returns A string representing the id of the check in.\n */\n public captureCheckIn?(checkIn: CheckIn, monitorConfig?: MonitorConfig, scope?: Scope): string;\n\n /**\n * Get the current Dsn.\n */\n public getDsn(): DsnComponents | undefined {\n return this._dsn;\n }\n\n /**\n * Get the current options.\n */\n public getOptions(): O {\n return this._options;\n }\n\n /**\n * Get the SDK metadata.\n * @see SdkMetadata\n */\n public getSdkMetadata(): SdkMetadata | undefined {\n return this._options._metadata;\n }\n\n /**\n * Returns the transport that is used by the client.\n * Please note that the transport gets lazy initialized so it will only be there once the first event has been sent.\n */\n public getTransport(): Transport | undefined {\n return this._transport;\n }\n\n /**\n * Wait for all events to be sent or the timeout to expire, whichever comes first.\n *\n * @param timeout Maximum time in ms the client should wait for events to be flushed. Omitting this parameter will\n * cause the client to wait until all events are sent before resolving the promise.\n * @returns A promise that will resolve with `true` if all events are sent before the timeout, or `false` if there are\n * still events in the queue when the timeout is reached.\n */\n public flush(timeout?: number): PromiseLike<boolean> {\n const transport = this._transport;\n if (transport) {\n this.emit('flush');\n return this._isClientDoneProcessing(timeout).then(clientFinished => {\n return transport.flush(timeout).then(transportFlushed => clientFinished && transportFlushed);\n });\n } else {\n return resolvedSyncPromise(true);\n }\n }\n\n /**\n * Flush the event queue and set the client to `enabled = false`. See {@link Client.flush}.\n *\n * @param {number} timeout Maximum time in ms the client should wait before shutting down. Omitting this parameter will cause\n * the client to wait until all events are sent before disabling itself.\n * @returns {Promise<boolean>} A promise which resolves to `true` if the flush completes successfully before the timeout, or `false` if\n * it doesn't.\n */\n public close(timeout?: number): PromiseLike<boolean> {\n return this.flush(timeout).then(result => {\n this.getOptions().enabled = false;\n this.emit('close');\n return result;\n });\n }\n\n /**\n * Get all installed event processors.\n */\n public getEventProcessors(): EventProcessor[] {\n return this._eventProcessors;\n }\n\n /**\n * Adds an event processor that applies to any event processed by this client.\n */\n public addEventProcessor(eventProcessor: EventProcessor): void {\n this._eventProcessors.push(eventProcessor);\n }\n\n /**\n * Initialize this client.\n * Call this after the client was set on a scope.\n */\n public init(): void {\n if (\n this._isEnabled() ||\n // Force integrations to be setup even if no DSN was set when we have\n // Spotlight enabled. This is particularly important for browser as we\n // don't support the `spotlight` option there and rely on the users\n // adding the `spotlightBrowserIntegration()` to their integrations which\n // wouldn't get initialized with the check below when there's no DSN set.\n this._options.integrations.some(({ name }) => name.startsWith('Spotlight'))\n ) {\n this._setupIntegrations();\n }\n }\n\n /**\n * Gets an installed integration by its name.\n *\n * @returns {Integration|undefined} The installed integration or `undefined` if no integration with that `name` was installed.\n */\n public getIntegrationByName<T extends Integration = Integration>(integrationName: string): T | undefined {\n return this._integrations[integrationName] as T | undefined;\n }\n\n /**\n * Add an integration to the client.\n * This can be used to e.g. lazy load integrations.\n * In most cases, this should not be necessary,\n * and you're better off just passing the integrations via `integrations: []` at initialization time.\n * However, if you find the need to conditionally load & add an integration, you can use `addIntegration` to do so.\n */\n public addIntegration(integration: Integration): void {\n const isAlreadyInstalled = this._integrations[integration.name];\n\n // This hook takes care of only installing if not already installed\n setupIntegration(this, integration, this._integrations);\n // Here we need to check manually to make sure to not run this multiple times\n if (!isAlreadyInstalled) {\n afterSetupIntegrations(this, [integration]);\n }\n }\n\n /**\n * Send a fully prepared event to Sentry.\n */\n public sendEvent(event: Event, hint: EventHint = {}): void {\n this.emit('beforeSendEvent', event, hint);\n\n let env = createEventEnvelope(event, this._dsn, this._options._metadata, this._options.tunnel);\n\n for (const attachment of hint.attachments || []) {\n env = addItemToEnvelope(env, createAttachmentEnvelopeItem(attachment));\n }\n\n const promise = this.sendEnvelope(env);\n if (promise) {\n promise.then(sendResponse => this.emit('afterSendEvent', event, sendResponse), null);\n }\n }\n\n /**\n * Send a session or session aggregrates to Sentry.\n */\n public sendSession(session: Session | SessionAggregates): void {\n // Backfill release and environment on session\n const { release: clientReleaseOption, environment: clientEnvironmentOption = DEFAULT_ENVIRONMENT } = this._options;\n if ('aggregates' in session) {\n const sessionAttrs = session.attrs || {};\n if (!sessionAttrs.release && !clientReleaseOption) {\n DEBUG_BUILD && logger.warn(MISSING_RELEASE_FOR_SESSION_ERROR);\n return;\n }\n sessionAttrs.release = sessionAttrs.release || clientReleaseOption;\n sessionAttrs.environment = sessionAttrs.environment || clientEnvironmentOption;\n session.attrs = sessionAttrs;\n } else {\n if (!session.release && !clientReleaseOption) {\n DEBUG_BUILD && logger.warn(MISSING_RELEASE_FOR_SESSION_ERROR);\n return;\n }\n session.release = session.release || clientReleaseOption;\n session.environment = session.environment || clientEnvironmentOption;\n }\n\n this.emit('beforeSendSession', session);\n\n const env = createSessionEnvelope(session, this._dsn, this._options._metadata, this._options.tunnel);\n\n // sendEnvelope should not throw\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.sendEnvelope(env);\n }\n\n /**\n * Record on the client that an event got dropped (ie, an event that will not be sent to Sentry).\n */\n public recordDroppedEvent(reason: EventDropReason, category: DataCategory, count: number = 1): void {\n if (this._options.sendClientReports) {\n // We want to track each category (error, transaction, session, replay_event) separately\n // but still keep the distinction between different type of outcomes.\n // We could use nested maps, but it's much easier to read and type this way.\n // A correct type for map-based implementation if we want to go that route\n // would be `Partial<Record<SentryRequestType, Partial<Record<Outcome, number>>>>`\n // With typescript 4.1 we could even use template literal types\n const key = `${reason}:${category}`;\n DEBUG_BUILD && logger.log(`Recording outcome: \"${key}\"${count > 1 ? ` (${count} times)` : ''}`);\n this._outcomes[key] = (this._outcomes[key] || 0) + count;\n }\n }\n\n /* eslint-disable @typescript-eslint/unified-signatures */\n /**\n * Register a callback for whenever a span is started.\n * Receives the span as argument.\n * @returns {() => void} A function that, when executed, removes the registered callback.\n */\n public on(hook: 'spanStart', callback: (span: Span) => void): () => void;\n\n /**\n * Register a callback before span sampling runs. Receives a `samplingDecision` object argument with a `decision`\n * property that can be used to make a sampling decision that will be enforced, before any span sampling runs.\n * @returns {() => void} A function that, when executed, removes the registered callback.\n */\n public on(\n hook: 'beforeSampling',\n callback: (\n samplingData: {\n spanAttributes: SpanAttributes;\n spanName: string;\n parentSampled?: boolean;\n parentContext?: SpanContextData;\n },\n samplingDecision: { decision: boolean },\n ) => void,\n ): void;\n\n /**\n * Register a callback for whenever a span is ended.\n * Receives the span as argument.\n * @returns {() => void} A function that, when executed, removes the registered callback.\n */\n public on(hook: 'spanEnd', callback: (span: Span) => void): () => void;\n\n /**\n * Register a callback for when an idle span is allowed to auto-finish.\n * @returns {() => void} A function that, when executed, removes the registered callback.\n */\n public on(hook: 'idleSpanEnableAutoFinish', callback: (span: Span) => void): () => void;\n\n /**\n * Register a callback for transaction start and finish.\n * @returns {() => void} A function that, when executed, removes the registered callback.\n */\n public on(hook: 'beforeEnvelope', callback: (envelope: Envelope) => void): () => void;\n\n /**\n * Register a callback that runs when stack frame metadata should be applied to an event.\n * @returns {() => void} A function that, when executed, removes the registered callback.\n */\n public on(hook: 'applyFrameMetadata', callback: (event: Event) => void): () => void;\n\n /**\n * Register a callback for before sending an event.\n * This is called right before an event is sent and should not be used to mutate the event.\n * Receives an Event & EventHint as arguments.\n * @returns {() => void} A function that, when executed, removes the registered callback.\n */\n public on(hook: 'beforeSendEvent', callback: (event: Event, hint?: EventHint | undefined) => void): () => void;\n\n /**\n * Register a callback for before sending a session or session aggregrates..\n * Receives the session/aggregate as second argument.\n * @returns {() => void} A function that, when executed, removes the registered callback.\n */\n public on(hook: 'beforeSendSession', callback: (session: Session | SessionAggregates) => void): () => void;\n\n /**\n * Register a callback for preprocessing an event,\n * before it is passed to (global) event processors.\n * Receives an Event & EventHint as arguments.\n * @returns {() => void} A function that, when executed, removes the registered callback.\n */\n public on(hook: 'preprocessEvent', callback: (event: Event, hint?: EventHint | undefined) => void): () => void;\n\n /**\n * Register a callback for postprocessing an event,\n * after it was passed to (global) event processors, before it is being sent.\n * Receives an Event & EventHint as arguments.\n * @returns {() => void} A function that, when executed, removes the registered callback.\n */\n public on(hook: 'postprocessEvent', callback: (event: Event, hint?: EventHint | undefined) => void): () => void;\n\n /**\n * Register a callback for when an event has been sent.\n * @returns {() => void} A function that, when executed, removes the registered callback.\n */\n public on(\n hook: 'afterSendEvent',\n callback: (event: Event, sendResponse: TransportMakeRequestResponse) => void,\n ): () => void;\n\n /**\n * Register a callback before a breadcrumb is added.\n * @returns {() => void} A function that, when executed, removes the registered callback.\n */\n public on(hook: 'beforeAddBreadcrumb', callback: (breadcrumb: Breadcrumb, hint?: BreadcrumbHint) => void): () => void;\n\n /**\n * Register a callback when a DSC (Dynamic Sampling Context) is created.\n * @returns {() => void} A function that, when executed, removes the registered callback.\n */\n public on(hook: 'createDsc', callback: (dsc: DynamicSamplingContext, rootSpan?: Span) => void): () => void;\n\n /**\n * Register a callback when a Feedback event has been prepared.\n * This should be used to mutate the event. The options argument can hint\n * about what kind of mutation it expects.\n * @returns {() => void} A function that, when executed, removes the registered callback.\n */\n public on(\n hook: 'beforeSendFeedback',\n callback: (feedback: FeedbackEvent, options?: { includeReplay?: boolean }) => void,\n ): () => void;\n\n /**\n * Register a callback when the feedback widget is opened in a user's browser\n */\n public on(hook: 'openFeedbackWidget', callback: () => void): () => void;\n\n /**\n * A hook for the browser tracing integrations to trigger a span start for a page load.\n * @returns {() => void} A function that, when executed, removes the registered callback.\n */\n public on(\n hook: 'startPageLoadSpan',\n callback: (\n options: StartSpanOptions,\n traceOptions?: { sentryTrace?: string | undefined; baggage?: string | undefined },\n ) => void,\n ): () => void;\n\n /**\n * A hook for browser tracing integrations to trigger a span for a navigation.\n * @returns {() => void} A function that, when executed, removes the registered callback.\n */\n public on(hook: 'startNavigationSpan', callback: (options: StartSpanOptions) => void): () => void;\n\n /**\n * A hook for GraphQL client integration to enhance a span with request data.\n * @returns A function that, when executed, removes the registered callback.\n */\n public on(\n hook: 'beforeOutgoingRequestSpan',\n callback: (span: Span, hint: XhrBreadcrumbHint | FetchBreadcrumbHint) => void,\n ): () => void;\n\n /**\n * A hook for GraphQL client integration to enhance a breadcrumb with request data.\n * @returns A function that, when executed, removes the registered callback.\n */\n public on(\n hook: 'beforeOutgoingRequestBreadcrumb',\n callback: (breadcrumb: Breadcrumb, hint: XhrBreadcrumbHint | FetchBreadcrumbHint) => void,\n ): () => void;\n\n /**\n * A hook that is called when the client is flushing\n * @returns {() => void} A function that, when executed, removes the registered callback.\n */\n public on(hook: 'flush', callback: () => void): () => void;\n\n /**\n * A hook that is called when the client is closing\n * @returns {() => void} A function that, when executed, removes the registered callback.\n */\n public on(hook: 'close', callback: () => void): () => void;\n\n /**\n * Register a hook on this client.\n */\n public on(hook: string, callback: unknown): () => void {\n const hooks = (this._hooks[hook] = this._hooks[hook] || []);\n\n // @ts-expect-error We assume the types are correct\n hooks.push(callback);\n\n // This function returns a callback execution handler that, when invoked,\n // deregisters a callback. This is crucial for managing instances where callbacks\n // need to be unregistered to prevent self-referencing in callback closures,\n // ensuring proper garbage collection.\n return () => {\n // @ts-expect-error We assume the types are correct\n const cbIndex = hooks.indexOf(callback);\n if (cbIndex > -1) {\n hooks.splice(cbIndex, 1);\n }\n };\n }\n\n /** Fire a hook whenever a span starts. */\n public emit(hook: 'spanStart', span: Span): void;\n\n /** A hook that is called every time before a span is sampled. */\n public emit(\n hook: 'beforeSampling',\n samplingData: {\n spanAttributes: SpanAttributes;\n spanName: string;\n parentSampled?: boolean;\n parentContext?: SpanContextData;\n },\n samplingDecision: { decision: boolean },\n ): void;\n\n /** Fire a hook whenever a span ends. */\n public emit(hook: 'spanEnd', span: Span): void;\n\n /**\n * Fire a hook indicating that an idle span is allowed to auto finish.\n */\n public emit(hook: 'idleSpanEnableAutoFinish', span: Span): void;\n\n /*\n * Fire a hook event for envelope creation and sending. Expects to be given an envelope as the\n * second argument.\n */\n public emit(hook: 'beforeEnvelope', envelope: Envelope): void;\n\n /*\n * Fire a hook indicating that stack frame metadata should be applied to the event passed to the hook.\n */\n public emit(hook: 'applyFrameMetadata', event: Event): void;\n\n /**\n * Fire a hook event before sending an event.\n * This is called right before an event is sent and should not be used to mutate the event.\n * Expects to be given an Event & EventHint as the second/third argument.\n */\n public emit(hook: 'beforeSendEvent', event: Event, hint?: EventHint): void;\n\n /**\n * Fire a hook event before sending a session/aggregates.\n * Expects to be given the prepared session/aggregates as second argument.\n */\n public emit(hook: 'beforeSendSession', session: Session | SessionAggregates): void;\n\n /**\n * Fire a hook event to process events before they are passed to (global) event processors.\n * Expects to be given an Event & EventHint as the second/third argument.\n */\n public emit(hook: 'preprocessEvent', event: Event, hint?: EventHint): void;\n\n /**\n * Fire a hook event to process a user on an event before it is sent to Sentry, after all other processors have run.\n * Expects to be given an Event & EventHint as the second/third argument.\n */\n public emit(hook: 'postprocessEvent', event: Event, hint?: EventHint): void;\n\n /*\n * Fire a hook event after sending an event. Expects to be given an Event as the\n * second argument.\n */\n public emit(hook: 'afterSendEvent', event: Event, sendResponse: TransportMakeRequestResponse): void;\n\n /**\n * Fire a hook for when a breadcrumb is added. Expects the breadcrumb as second argument.\n */\n public emit(hook: 'beforeAddBreadcrumb', breadcrumb: Breadcrumb, hint?: BreadcrumbHint): void;\n\n /**\n * Fire a hook for when a DSC (Dynamic Sampling Context) is created. Expects the DSC as second argument.\n */\n public emit(hook: 'createDsc', dsc: DynamicSamplingContext, rootSpan?: Span): void;\n\n /**\n * Fire a hook event for after preparing a feedback event. Events to be given\n * a feedback event as the second argument, and an optional options object as\n * third argument.\n */\n public emit(hook: 'beforeSendFeedback', feedback: FeedbackEvent, options?: { includeReplay?: boolean }): void;\n\n /**\n * Fire a hook event for when the feedback widget is opened in a user's browser\n */\n public emit(hook: 'openFeedbackWidget'): void;\n\n /**\n * Emit a hook event for browser tracing integrations to trigger a span start for a page load.\n */\n public emit(\n hook: 'startPageLoadSpan',\n options: StartSpanOptions,\n traceOptions?: { sentryTrace?: string | undefined; baggage?: string | undefined },\n ): void;\n\n /**\n * Emit a hook event for browser tracing integrations to trigger a span for a navigation.\n */\n public emit(hook: 'startNavigationSpan', options: StartSpanOptions): void;\n\n /**\n * Emit a hook event for GraphQL client integration to enhance a span with request data.\n */\n public emit(hook: 'beforeOutgoingRequestSpan', span: Span, hint: XhrBreadcrumbHint | FetchBreadcrumbHint): void;\n\n /**\n * Emit a hook event for GraphQL client integration to enhance a breadcrumb with request data.\n */\n public emit(\n hook: 'beforeOutgoingRequestBreadcrumb',\n breadcrumb: Breadcrumb,\n hint: XhrBreadcrumbHint | FetchBreadcrumbHint,\n ): void;\n\n /**\n * Emit a hook event for client flush\n */\n public emit(hook: 'flush'): void;\n\n /**\n * Emit a hook event for client close\n */\n public emit(hook: 'close'): void;\n\n /**\n * Emit a hook that was previously registered via `on()`.\n */\n public emit(hook: string, ...rest: unknown[]): void {\n const callbacks = this._hooks[hook];\n if (callbacks) {\n callbacks.forEach(callback => callback(...rest));\n }\n }\n\n /**\n * Send an envelope to Sentry.\n */\n public sendEnvelope(envelope: Envelope): PromiseLike<TransportMakeRequestResponse> {\n this.emit('beforeEnvelope', envelope);\n\n if (this._isEnabled() && this._transport) {\n return this._transport.send(envelope).then(null, reason => {\n DEBUG_BUILD && logger.error('Error while sending envelope:', reason);\n return reason;\n });\n }\n\n DEBUG_BUILD && logger.error('Transport disabled');\n\n return resolvedSyncPromise({});\n }\n\n /* eslint-enable @typescript-eslint/unified-signatures */\n\n /** Setup integrations for this client. */\n protected _setupIntegrations(): void {\n const { integrations } = this._options;\n this._integrations = setupIntegrations(this, integrations);\n afterSetupIntegrations(this, integrations);\n }\n\n /** Updates existing session based on the provided event */\n protected _updateSessionFromEvent(session: Session, event: Event): void {\n let crashed = event.level === 'fatal';\n let errored = false;\n const exceptions = event.exception?.values;\n\n if (exceptions) {\n errored = true;\n\n for (const ex of exceptions) {\n const mechanism = ex.mechanism;\n if (mechanism?.handled === false) {\n crashed = true;\n break;\n }\n }\n }\n\n // A session is updated and that session update is sent in only one of the two following scenarios:\n // 1. Session with non terminal status and 0 errors + an error occurred -> Will set error count to 1 and send update\n // 2. Session with non terminal status and 1 error + a crash occurred -> Will set status crashed and send update\n const sessionNonTerminal = session.status === 'ok';\n const shouldUpdateAndSend = (sessionNonTerminal && session.errors === 0) || (sessionNonTerminal && crashed);\n\n if (shouldUpdateAndSend) {\n updateSession(session, {\n ...(crashed && { status: 'crashed' }),\n errors: session.errors || Number(errored || crashed),\n });\n this.captureSession(session);\n }\n }\n\n /**\n * Determine if the client is finished processing. Returns a promise because it will wait `timeout` ms before saying\n * \"no\" (resolving to `false`) in order to give the client a chance to potentially finish first.\n *\n * @param timeout The time, in ms, after which to resolve to `false` if the client is still busy. Passing `0` (or not\n * passing anything) will make the promise wait as long as it takes for processing to finish before resolving to\n * `true`.\n * @returns A promise which will resolve to `true` if processing is already done or finishes before the timeout, and\n * `false` otherwise\n */\n protected _isClientDoneProcessing(timeout?: number): PromiseLike<boolean> {\n return new SyncPromise(resolve => {\n let ticked: number = 0;\n const tick: number = 1;\n\n const interval = setInterval(() => {\n if (this._numProcessing == 0) {\n clearInterval(interval);\n resolve(true);\n } else {\n ticked += tick;\n if (timeout && ticked >= timeout) {\n clearInterval(interval);\n resolve(false);\n }\n }\n }, tick);\n });\n }\n\n /** Determines whether this SDK is enabled and a transport is present. */\n protected _isEnabled(): boolean {\n return this.getOptions().enabled !== false && this._transport !== undefined;\n }\n\n /**\n * Adds common information to events.\n *\n * The information includes release and environment from `options`,\n * breadcrumbs and context (extra, tags and user) from the scope.\n *\n * Information that is already present in the event is never overwritten. For\n * nested objects, such as the context, keys are merged.\n *\n * @param event The original event.\n * @param hint May contain additional information about the original exception.\n * @param currentScope A scope containing event metadata.\n * @returns A new event with more information.\n */\n protected _prepareEvent(\n event: Event,\n hint: EventHint,\n currentScope: Scope,\n isolationScope: Scope,\n ): PromiseLike<Event | null> {\n const options = this.getOptions();\n const integrations = Object.keys(this._integrations);\n if (!hint.integrations && integrations?.length) {\n hint.integrations = integrations;\n }\n\n this.emit('preprocessEvent', event, hint);\n\n if (!event.type) {\n isolationScope.setLastEventId(event.event_id || hint.event_id);\n }\n\n return prepareEvent(options, event, hint, currentScope, this, isolationScope).then(evt => {\n if (evt === null) {\n return evt;\n }\n\n this.emit('postprocessEvent', evt, hint);\n\n evt.contexts = {\n trace: getTraceContextFromScope(currentScope),\n ...evt.contexts,\n };\n\n const dynamicSamplingContext = getDynamicSamplingContextFromScope(this, currentScope);\n\n evt.sdkProcessingMetadata = {\n dynamicSamplingContext,\n ...evt.sdkProcessingMetadata,\n };\n\n return evt;\n });\n }\n\n /**\n * Processes the event and logs an error in case of rejection\n * @param event\n * @param hint\n * @param scope\n */\n protected _captureEvent(\n event: Event,\n hint: EventHint = {},\n currentScope = getCurrentScope(),\n isolationScope = getIsolationScope(),\n ): PromiseLike<string | undefined> {\n if (DEBUG_BUILD && isErrorEvent(event)) {\n logger.log(`Captured error event \\`${getPossibleEventMessages(event)[0] || '<unknown>'}\\``);\n }\n\n return this._processEvent(event, hint, currentScope, isolationScope).then(\n finalEvent => {\n return finalEvent.event_id;\n },\n reason => {\n if (DEBUG_BUILD) {\n // If something's gone wrong, log the error as a warning. If it's just us having used a `SentryError` for\n // control flow, log just the message (no stack) as a log-level log.\n if (reason instanceof SentryError && reason.logLevel === 'log') {\n logger.log(reason.message);\n } else {\n logger.warn(reason);\n }\n }\n return undefined;\n },\n );\n }\n\n /**\n * Processes an event (either error or message) and sends it to Sentry.\n *\n * This also adds breadcrumbs and context information to the event. However,\n * platform specific meta data (such as the User's IP address) must be added\n * by the SDK implementor.\n *\n *\n * @param event The event to send to Sentry.\n * @param hint May contain additional information about the original exception.\n * @param currentScope A scope containing event metadata.\n * @returns A SyncPromise that resolves with the event or rejects in case event was/will not be send.\n */\n protected _processEvent(\n event: Event,\n hint: EventHint,\n currentScope: Scope,\n isolationScope: Scope,\n ): PromiseLike<Event> {\n const options = this.getOptions();\n const { sampleRate } = options;\n\n const isTransaction = isTransactionEvent(event);\n const isError = isErrorEvent(event);\n const eventType = event.type || 'error';\n const beforeSendLabel = `before send for type \\`${eventType}\\``;\n\n // 1.0 === 100% events are sent\n // 0.0 === 0% events are sent\n // Sampling for transaction happens somewhere else\n const parsedSampleRate = typeof sampleRate === 'undefined' ? undefined : parseSampleRate(sampleRate);\n if (isError && typeof parsedSampleRate === 'number' && Math.random() > parsedSampleRate) {\n this.recordDroppedEvent('sample_rate', 'error');\n return rejectedSyncPromise(\n new SentryError(\n `Discarding event because it's not included in the random sample (sampling rate = ${sampleRate})`,\n 'log',\n ),\n );\n }\n\n const dataCategory = (eventType === 'replay_event' ? 'replay' : eventType) satisfies DataCategory;\n\n return this._prepareEvent(event, hint, currentScope, isolationScope)\n .then(prepared => {\n if (prepared === null) {\n this.recordDroppedEvent('event_processor', dataCategory);\n throw new SentryError('An event processor returned `null`, will not send event.', 'log');\n }\n\n const isInternalException = hint.data && (hint.data as { __sentry__: boolean }).__sentry__ === true;\n if (isInternalException) {\n return prepared;\n }\n\n const result = processBeforeSend(this, options, prepared, hint);\n return _validateBeforeSendResult(result, beforeSendLabel);\n })\n .then(processedEvent => {\n if (processedEvent === null) {\n this.recordDroppedEvent('before_send', dataCategory);\n if (isTransaction) {\n const spans = event.spans || [];\n // the transaction itself counts as one span, plus all the child spans that are added\n const spanCount = 1 + spans.length;\n this.recordDroppedEvent('before_send', 'span', spanCount);\n }\n throw new SentryError(`${beforeSendLabel} returned \\`null\\`, will not send event.`, 'log');\n }\n\n const session = currentScope.getSession() || isolationScope.getSession();\n if (isError && session) {\n this._updateSessionFromEvent(session, processedEvent);\n }\n\n if (isTransaction) {\n const spanCountBefore = processedEvent.sdkProcessingMetadata?.spanCountBeforeProcessing || 0;\n const spanCountAfter = processedEvent.spans ? processedEvent.spans.length : 0;\n\n const droppedSpanCount = spanCountBefore - spanCountAfter;\n if (droppedSpanCount > 0) {\n this.recordDroppedEvent('before_send', 'span', droppedSpanCount);\n }\n }\n\n // None of the Sentry built event processor will update transaction name,\n // so if the transaction name has been changed by an event processor, we know\n // it has to come from custom event processor added by a user\n const transactionInfo = processedEvent.transaction_info;\n if (isTransaction && transactionInfo && processedEvent.transaction !== event.transaction) {\n const source = 'custom';\n processedEvent.transaction_info = {\n ...transactionInfo,\n source,\n };\n }\n\n this.sendEvent(processedEvent, hint);\n return processedEvent;\n })\n .then(null, reason => {\n if (reason instanceof SentryError) {\n throw reason;\n }\n\n this.captureException(reason, {\n data: {\n __sentry__: true,\n },\n originalException: reason,\n });\n throw new SentryError(\n `Event processing pipeline threw an error, original event will not be sent. Details have been sent as a new event.\\nReason: ${reason}`,\n );\n });\n }\n\n /**\n * Occupies the client with processing and event\n */\n protected _process<T>(promise: PromiseLike<T>): void {\n this._numProcessing++;\n void promise.then(\n value => {\n this._numProcessing--;\n return value;\n },\n reason => {\n this._numProcessing--;\n return reason;\n },\n );\n }\n\n /**\n * Clears outcomes on this client and returns them.\n */\n protected _clearOutcomes(): Outcome[] {\n const outcomes = this._outcomes;\n this._outcomes = {};\n return Object.entries(outcomes).map(([key, quantity]) => {\n const [reason, category] = key.split(':') as [EventDropReason, DataCategory];\n return {\n reason,\n category,\n quantity,\n };\n });\n }\n\n /**\n * Sends client reports as an envelope.\n */\n protected _flushOutcomes(): void {\n DEBUG_BUILD && logger.log('Flushing outcomes...');\n\n const outcomes = this._clearOutcomes();\n\n if (outcomes.length === 0) {\n DEBUG_BUILD && logger.log('No outcomes to send');\n return;\n }\n\n // This is really the only place where we want to check for a DSN and only send outcomes then\n if (!this._dsn) {\n DEBUG_BUILD && logger.log('No dsn provided, will not send outcomes');\n return;\n }\n\n DEBUG_BUILD && logger.log('Sending outcomes:', outcomes);\n\n const envelope = createClientReportEnvelope(outcomes, this._options.tunnel && dsnToString(this._dsn));\n\n // sendEnvelope should not throw\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.sendEnvelope(envelope);\n }\n\n /**\n * Creates an {@link Event} from all inputs to `captureException` and non-primitive inputs to `captureMessage`.\n */\n public abstract eventFromException(_exception: unknown, _hint?: EventHint): PromiseLike<Event>;\n\n /**\n * Creates an {@link Event} from primitive inputs to `captureMessage`.\n */\n public abstract eventFromMessage(\n _message: ParameterizedString,\n _level?: SeverityLevel,\n _hint?: EventHint,\n ): PromiseLike<Event>;\n}\n\n/**\n * @deprecated Use `Client` instead. This alias may be removed in a future major version.\n */\n// TODO(v10): Remove\nexport type BaseClient = Client;\n\n/**\n * @deprecated Use `Client` instead. This alias may be removed in a future major version.\n */\n// TODO(v10): Remove\nexport const BaseClient = Client;\n\n/**\n * Verifies that return value of configured `beforeSend` or `beforeSendTransaction` is of expected type, and returns the value if so.\n */\nfunction _validateBeforeSendResult(\n beforeSendResult: PromiseLike<Event | null> | Event | null,\n beforeSendLabel: string,\n): PromiseLike<Event | null> | Event | null {\n const invalidValueError = `${beforeSendLabel} must return \\`null\\` or a valid event.`;\n if (isThenable(beforeSendResult)) {\n return beforeSendResult.then(\n event => {\n if (!isPlainObject(event) && event !== null) {\n throw new SentryError(invalidValueError);\n }\n return event;\n },\n e => {\n throw new SentryError(`${beforeSendLabel} rejected with ${e}`);\n },\n );\n } else if (!isPlainObject(beforeSendResult) && beforeSendResult !== null) {\n throw new SentryError(invalidValueError);\n }\n return beforeSendResult;\n}\n\n/**\n * Process the matching `beforeSendXXX` callback.\n */\nfunction processBeforeSend(\n client: Client,\n options: ClientOptions,\n event: Event,\n hint: EventHint,\n): PromiseLike<Event | null> | Event | null {\n const { beforeSend, beforeSendTransaction, beforeSendSpan } = options;\n let processedEvent = event;\n\n if (isErrorEvent(processedEvent) && beforeSend) {\n return beforeSend(processedEvent, hint);\n }\n\n if (isTransactionEvent(processedEvent)) {\n if (beforeSendSpan) {\n // process root span\n const processedRootSpanJson = beforeSendSpan(convertTransactionEventToSpanJson(processedEvent));\n if (!processedRootSpanJson) {\n showSpanDropWarning();\n } else {\n // update event with processed root span values\n processedEvent = merge(event, convertSpanJsonToTransactionEvent(processedRootSpanJson));\n }\n\n // process child spans\n if (processedEvent.spans) {\n const processedSpans: SpanJSON[] = [];\n for (const span of processedEvent.spans) {\n const processedSpan = beforeSendSpan(span);\n if (!processedSpan) {\n showSpanDropWarning();\n processedSpans.push(span);\n } else {\n processedSpans.push(processedSpan);\n }\n }\n processedEvent.spans = processedSpans;\n }\n }\n\n if (beforeSendTransaction) {\n if (processedEvent.spans) {\n // We store the # of spans before processing in SDK metadata,\n // so we can compare it afterwards to determine how many spans were dropped\n const spanCountBefore = processedEvent.spans.length;\n processedEvent.sdkProcessingMetadata = {\n ...event.sdkProcessingMetadata,\n spanCountBeforeProcessing: spanCountBefore,\n };\n }\n return beforeSendTransaction(processedEvent as TransactionEvent, hint);\n }\n }\n\n return processedEvent;\n}\n\nfunction isErrorEvent(event: Event): event is ErrorEvent {\n return event.type === undefined;\n}\n\nfunction isTransactionEvent(event: Event): event is TransactionEvent {\n return event.type === 'transaction';\n}\n\n/** Extract trace information from scope */\nexport function _getTraceInfoFromScope(\n client: Client,\n scope: Scope | undefined,\n): [dynamicSamplingContext: Partial<DynamicSamplingContext> | undefined, traceContext: TraceContext | undefined] {\n if (!scope) {\n return [undefined, undefined];\n }\n\n const span = _getSpanForScope(scope);\n const traceContext = span ? spanToTraceContext(span) : getTraceContextFromScope(scope);\n const dynamicSamplingContext = span\n ? getDynamicSamplingContextFromSpan(span)\n : getDynamicSamplingContextFromScope(client, scope);\n return [dynamicSamplingContext, traceContext];\n}\n","import { SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME, SEMANTIC_ATTRIBUTE_PROFILE_ID } from '../semanticAttributes';\nimport type { SpanJSON, TransactionEvent } from '../types-hoist';\nimport { dropUndefinedKeys } from '../utils-hoist';\n\n/**\n * Converts a transaction event to a span JSON object.\n */\nexport function convertTransactionEventToSpanJson(event: TransactionEvent): SpanJSON {\n const { trace_id, parent_span_id, span_id, status, origin, data, op } = event.contexts?.trace ?? {};\n\n return dropUndefinedKeys({\n data: data ?? {},\n description: event.transaction,\n op,\n parent_span_id,\n span_id: span_id ?? '',\n start_timestamp: event.start_timestamp ?? 0,\n status,\n timestamp: event.timestamp,\n trace_id: trace_id ?? '',\n origin,\n profile_id: data?.[SEMANTIC_ATTRIBUTE_PROFILE_ID] as string | undefined,\n exclusive_time: data?.[SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME] as number | undefined,\n measurements: event.measurements,\n is_segment: true,\n });\n}\n\n/**\n * Converts a span JSON object to a transaction event.\n */\nexport function convertSpanJsonToTransactionEvent(span: SpanJSON): TransactionEvent {\n const event: TransactionEvent = {\n type: 'transaction',\n timestamp: span.timestamp,\n start_timestamp: span.start_timestamp,\n transaction: span.description,\n contexts: {\n trace: {\n trace_id: span.trace_id,\n span_id: span.span_id,\n parent_span_id: span.parent_span_id,\n op: span.op,\n status: span.status,\n origin: span.origin,\n data: {\n ...span.data,\n ...(span.profile_id && { [SEMANTIC_ATTRIBUTE_PROFILE_ID]: span.profile_id }),\n ...(span.exclusive_time && { [SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME]: span.exclusive_time }),\n },\n },\n },\n measurements: span.measurements,\n };\n\n return dropUndefinedKeys(event);\n}\n","import type { ClientReport, ClientReportEnvelope, ClientReportItem } from '../types-hoist';\n\nimport { createEnvelope } from './envelope';\nimport { dateTimestampInSeconds } from './time';\n\n/**\n * Creates client report envelope\n * @param discarded_events An array of discard events\n * @param dsn A DSN that can be set on the header. Optional.\n */\nexport function createClientReportEnvelope(\n discarded_events: ClientReport['discarded_events'],\n dsn?: string,\n timestamp?: number,\n): ClientReportEnvelope {\n const clientReportItem: ClientReportItem = [\n { type: 'client_report' },\n {\n timestamp: timestamp || dateTimestampInSeconds(),\n discarded_events,\n },\n ];\n return createEnvelope<ClientReportEnvelope>(dsn ? { dsn } : {}, [clientReportItem]);\n}\n","import type { Session, SessionAggregates, User } from '../types-hoist';\n\n// By default, we want to infer the IP address, unless this is explicitly set to `null`\n// We do this after all other processing is done\n// If `ip_address` is explicitly set to `null` or a value, we leave it as is\n\n/**\n * @internal\n */\nexport function addAutoIpAddressToUser(objWithMaybeUser: { user?: User | null }): void {\n if (objWithMaybeUser.user?.ip_address === undefined) {\n objWithMaybeUser.user = {\n ...objWithMaybeUser.user,\n ip_address: '{{auto}}',\n };\n }\n}\n\n/**\n * @internal\n */\nexport function addAutoIpAddressToSession(session: Session | SessionAggregates): void {\n if ('aggregates' in session) {\n if (session.attrs?.['ip_address'] === undefined) {\n session.attrs = {\n ...session.attrs,\n ip_address: '{{auto}}',\n };\n }\n } else {\n if (session.ipAddress === undefined) {\n session.ipAddress = '{{auto}}';\n }\n }\n}\n","import type {\n Event,\n EventHint,\n Exception,\n ParameterizedString,\n SeverityLevel,\n StackFrame,\n StackParser,\n} from '@sentry/core';\nimport {\n addExceptionMechanism,\n addExceptionTypeValue,\n extractExceptionKeysForMessage,\n getClient,\n isDOMError,\n isDOMException,\n isError,\n isErrorEvent,\n isEvent,\n isParameterizedString,\n isPlainObject,\n normalizeToSize,\n resolvedSyncPromise,\n} from '@sentry/core';\n\ntype Prototype = { constructor: (...args: unknown[]) => unknown };\n\n/**\n * This function creates an exception from a JavaScript Error\n */\nexport function exceptionFromError(stackParser: StackParser, ex: Error): Exception {\n // Get the frames first since Opera can lose the stack if we touch anything else first\n const frames = parseStackFrames(stackParser, ex);\n\n const exception: Exception = {\n type: extractType(ex),\n value: extractMessage(ex),\n };\n\n if (frames.length) {\n exception.stacktrace = { frames };\n }\n\n if (exception.type === undefined && exception.value === '') {\n exception.value = 'Unrecoverable error caught';\n }\n\n return exception;\n}\n\nfunction eventFromPlainObject(\n stackParser: StackParser,\n exception: Record<string, unknown>,\n syntheticException?: Error,\n isUnhandledRejection?: boolean,\n): Event {\n const client = getClient();\n const normalizeDepth = client?.getOptions().normalizeDepth;\n\n // If we can, we extract an exception from the object properties\n const errorFromProp = getErrorPropertyFromObject(exception);\n\n const extra = {\n __serialized__: normalizeToSize(exception, normalizeDepth),\n };\n\n if (errorFromProp) {\n return {\n exception: {\n values: [exceptionFromError(stackParser, errorFromProp)],\n },\n extra,\n };\n }\n\n const event = {\n exception: {\n values: [\n {\n type: isEvent(exception) ? exception.constructor.name : isUnhandledRejection ? 'UnhandledRejection' : 'Error',\n value: getNonErrorObjectExceptionValue(exception, { isUnhandledRejection }),\n } as Exception,\n ],\n },\n extra,\n } satisfies Event;\n\n if (syntheticException) {\n const frames = parseStackFrames(stackParser, syntheticException);\n if (frames.length) {\n // event.exception.values[0] has been set above\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n event.exception.values[0]!.stacktrace = { frames };\n }\n }\n\n return event;\n}\n\nfunction eventFromError(stackParser: StackParser, ex: Error): Event {\n return {\n exception: {\n values: [exceptionFromError(stackParser, ex)],\n },\n };\n}\n\n/** Parses stack frames from an error */\nfunction parseStackFrames(\n stackParser: StackParser,\n ex: Error & { framesToPop?: number; stacktrace?: string },\n): StackFrame[] {\n // Access and store the stacktrace property before doing ANYTHING\n // else to it because Opera is not very good at providing it\n // reliably in other circumstances.\n const stacktrace = ex.stacktrace || ex.stack || '';\n\n const skipLines = getSkipFirstStackStringLines(ex);\n const framesToPop = getPopFirstTopFrames(ex);\n\n try {\n return stackParser(stacktrace, skipLines, framesToPop);\n } catch (e) {\n // no-empty\n }\n\n return [];\n}\n\n// Based on our own mapping pattern - https://github.com/getsentry/sentry/blob/9f08305e09866c8bd6d0c24f5b0aabdd7dd6c59c/src/sentry/lang/javascript/errormapping.py#L83-L108\nconst reactMinifiedRegexp = /Minified React error #\\d+;/i;\n\n/**\n * Certain known React errors contain links that would be falsely\n * parsed as frames. This function check for these errors and\n * returns number of the stack string lines to skip.\n */\nfunction getSkipFirstStackStringLines(ex: Error): number {\n if (ex && reactMinifiedRegexp.test(ex.message)) {\n return 1;\n }\n\n return 0;\n}\n\n/**\n * If error has `framesToPop` property, it means that the\n * creator tells us the first x frames will be useless\n * and should be discarded. Typically error from wrapper function\n * which don't point to the actual location in the developer's code.\n *\n * Example: https://github.com/zertosh/invariant/blob/master/invariant.js#L46\n */\nfunction getPopFirstTopFrames(ex: Error & { framesToPop?: unknown }): number {\n if (typeof ex.framesToPop === 'number') {\n return ex.framesToPop;\n }\n\n return 0;\n}\n\n// https://developer.mozilla.org/en-US/docs/WebAssembly/JavaScript_interface/Exception\n// @ts-expect-error - WebAssembly.Exception is a valid class\nfunction isWebAssemblyException(exception: unknown): exception is WebAssembly.Exception {\n // Check for support\n // @ts-expect-error - WebAssembly.Exception is a valid class\n if (typeof WebAssembly !== 'undefined' && typeof WebAssembly.Exception !== 'undefined') {\n // @ts-expect-error - WebAssembly.Exception is a valid class\n return exception instanceof WebAssembly.Exception;\n } else {\n return false;\n }\n}\n\n/**\n * Extracts from errors what we use as the exception `type` in error events.\n *\n * Usually, this is the `name` property on Error objects but WASM errors need to be treated differently.\n */\nexport function extractType(ex: Error & { message: { error?: Error } }): string | undefined {\n const name = ex?.name;\n\n // The name for WebAssembly.Exception Errors needs to be extracted differently.\n // Context: https://github.com/getsentry/sentry-javascript/issues/13787\n if (!name && isWebAssemblyException(ex)) {\n // Emscripten sets array[type, message] to the \"message\" property on the WebAssembly.Exception object\n const hasTypeInMessage = ex.message && Array.isArray(ex.message) && ex.message.length == 2;\n return hasTypeInMessage ? ex.message[0] : 'WebAssembly.Exception';\n }\n\n return name;\n}\n\n/**\n * There are cases where stacktrace.message is an Event object\n * https://github.com/getsentry/sentry-javascript/issues/1949\n * In this specific case we try to extract stacktrace.message.error.message\n */\nexport function extractMessage(ex: Error & { message: { error?: Error } }): string {\n const message = ex?.message;\n\n if (isWebAssemblyException(ex)) {\n // For Node 18, Emscripten sets array[type, message] to the \"message\" property on the WebAssembly.Exception object\n if (Array.isArray(ex.message) && ex.message.length == 2) {\n return ex.message[1];\n }\n return 'wasm exception';\n }\n\n if (!message) {\n return 'No error message';\n }\n\n if (message.error && typeof message.error.message === 'string') {\n return message.error.message;\n }\n\n return message;\n}\n\n/**\n * Creates an {@link Event} from all inputs to `captureException` and non-primitive inputs to `captureMessage`.\n * @hidden\n */\nexport function eventFromException(\n stackParser: StackParser,\n exception: unknown,\n hint?: EventHint,\n attachStacktrace?: boolean,\n): PromiseLike<Event> {\n const syntheticException = hint?.syntheticException || undefined;\n const event = eventFromUnknownInput(stackParser, exception, syntheticException, attachStacktrace);\n addExceptionMechanism(event); // defaults to { type: 'generic', handled: true }\n event.level = 'error';\n if (hint?.event_id) {\n event.event_id = hint.event_id;\n }\n return resolvedSyncPromise(event);\n}\n\n/**\n * Builds and Event from a Message\n * @hidden\n */\nexport function eventFromMessage(\n stackParser: StackParser,\n message: ParameterizedString,\n level: SeverityLevel = 'info',\n hint?: EventHint,\n attachStacktrace?: boolean,\n): PromiseLike<Event> {\n const syntheticException = hint?.syntheticException || undefined;\n const event = eventFromString(stackParser, message, syntheticException, attachStacktrace);\n event.level = level;\n if (hint?.event_id) {\n event.event_id = hint.event_id;\n }\n return resolvedSyncPromise(event);\n}\n\n/**\n * @hidden\n */\nexport function eventFromUnknownInput(\n stackParser: StackParser,\n exception: unknown,\n syntheticException?: Error,\n attachStacktrace?: boolean,\n isUnhandledRejection?: boolean,\n): Event {\n let event: Event;\n\n if (isErrorEvent(exception as ErrorEvent) && (exception as ErrorEvent).error) {\n // If it is an ErrorEvent with `error` property, extract it to get actual Error\n const errorEvent = exception as ErrorEvent;\n return eventFromError(stackParser, errorEvent.error as Error);\n }\n\n // If it is a `DOMError` (which is a legacy API, but still supported in some browsers) then we just extract the name\n // and message, as it doesn't provide anything else. According to the spec, all `DOMExceptions` should also be\n // `Error`s, but that's not the case in IE11, so in that case we treat it the same as we do a `DOMError`.\n //\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMError\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMException\n // https://webidl.spec.whatwg.org/#es-DOMException-specialness\n if (isDOMError(exception) || isDOMException(exception as DOMException)) {\n const domException = exception as DOMException;\n\n if ('stack' in (exception as Error)) {\n event = eventFromError(stackParser, exception as Error);\n } else {\n const name = domException.name || (isDOMError(domException) ? 'DOMError' : 'DOMException');\n const message = domException.message ? `${name}: ${domException.message}` : name;\n event = eventFromString(stackParser, message, syntheticException, attachStacktrace);\n addExceptionTypeValue(event, message);\n }\n if ('code' in domException) {\n // eslint-disable-next-line deprecation/deprecation\n event.tags = { ...event.tags, 'DOMException.code': `${domException.code}` };\n }\n\n return event;\n }\n if (isError(exception)) {\n // we have a real Error object, do nothing\n return eventFromError(stackParser, exception);\n }\n if (isPlainObject(exception) || isEvent(exception)) {\n // If it's a plain object or an instance of `Event` (the built-in JS kind, not this SDK's `Event` type), serialize\n // it manually. This will allow us to group events based on top-level keys which is much better than creating a new\n // group on any key/value change.\n const objectException = exception as Record<string, unknown>;\n event = eventFromPlainObject(stackParser, objectException, syntheticException, isUnhandledRejection);\n addExceptionMechanism(event, {\n synthetic: true,\n });\n return event;\n }\n\n // If none of previous checks were valid, then it means that it's not:\n // - an instance of DOMError\n // - an instance of DOMException\n // - an instance of Event\n // - an instance of Error\n // - a valid ErrorEvent (one with an error property)\n // - a plain Object\n //\n // So bail out and capture it as a simple message:\n event = eventFromString(stackParser, exception as string, syntheticException, attachStacktrace);\n addExceptionTypeValue(event, `${exception}`, undefined);\n addExceptionMechanism(event, {\n synthetic: true,\n });\n\n return event;\n}\n\nfunction eventFromString(\n stackParser: StackParser,\n message: ParameterizedString,\n syntheticException?: Error,\n attachStacktrace?: boolean,\n): Event {\n const event: Event = {};\n\n if (attachStacktrace && syntheticException) {\n const frames = parseStackFrames(stackParser, syntheticException);\n if (frames.length) {\n event.exception = {\n values: [{ value: message, stacktrace: { frames } }],\n };\n }\n addExceptionMechanism(event, { synthetic: true });\n }\n\n if (isParameterizedString(message)) {\n const { __sentry_template_string__, __sentry_template_values__ } = message;\n\n event.logentry = {\n message: __sentry_template_string__,\n params: __sentry_template_values__,\n };\n return event;\n }\n\n event.message = message;\n return event;\n}\n\nfunction getNonErrorObjectExceptionValue(\n exception: Record<string, unknown>,\n { isUnhandledRejection }: { isUnhandledRejection?: boolean },\n): string {\n const keys = extractExceptionKeysForMessage(exception);\n const captureType = isUnhandledRejection ? 'promise rejection' : 'exception';\n\n // Some ErrorEvent instances do not have an `error` property, which is why they are not handled before\n // We still want to try to get a decent message for these cases\n if (isErrorEvent(exception)) {\n return `Event \\`ErrorEvent\\` captured as ${captureType} with message \\`${exception.message}\\``;\n }\n\n if (isEvent(exception)) {\n const className = getObjectClassName(exception);\n return `Event \\`${className}\\` (type=${exception.type}) captured as ${captureType}`;\n }\n\n return `Object captured as ${captureType} with keys: ${keys}`;\n}\n\nfunction getObjectClassName(obj: unknown): string | undefined | void {\n try {\n const prototype: Prototype | null = Object.getPrototypeOf(obj);\n return prototype ? prototype.constructor.name : undefined;\n } catch (e) {\n // ignore errors here\n }\n}\n\n/** If a plain object has a property that is an `Error`, return this error. */\nfunction getErrorPropertyFromObject(obj: Record<string, unknown>): Error | undefined {\n for (const prop in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, prop)) {\n const value = obj[prop];\n if (value instanceof Error) {\n return value;\n }\n }\n }\n\n return undefined;\n}\n","import type {\n BrowserClientProfilingOptions,\n BrowserClientReplayOptions,\n ClientOptions,\n Event,\n EventHint,\n Options,\n ParameterizedString,\n Scope,\n SeverityLevel,\n} from '@sentry/core';\nimport {\n Client,\n addAutoIpAddressToSession,\n addAutoIpAddressToUser,\n applySdkMetadata,\n getSDKSource,\n} from '@sentry/core';\nimport { eventFromException, eventFromMessage } from './eventbuilder';\nimport { WINDOW } from './helpers';\nimport type { BrowserTransportOptions } from './transports/types';\n\n/**\n * Configuration options for the Sentry Browser SDK.\n * @see @sentry/core Options for more information.\n */\nexport type BrowserOptions = Options<BrowserTransportOptions> &\n BrowserClientReplayOptions &\n BrowserClientProfilingOptions & {\n /**\n * Important: Only set this option if you know what you are doing!\n *\n * By default, the SDK will check if `Sentry.init` is called in a browser extension.\n * In case it is, it will stop initialization and log a warning\n * because browser extensions require a different Sentry initialization process:\n * https://docs.sentry.io/platforms/javascript/best-practices/shared-environments/\n *\n * Setting up the SDK in a browser extension with global error monitoring is not recommended\n * and will likely flood you with errors from other web sites or extensions. This can heavily\n * impact your quota and cause interference with your and other Sentry SDKs in shared environments.\n *\n * If this check wrongfully flags your setup as a browser extension, you can set this\n * option to `true` to skip the check.\n *\n * @default false\n */\n skipBrowserExtensionCheck?: boolean;\n };\n\n/**\n * Configuration options for the Sentry Browser SDK Client class\n * @see BrowserClient for more information.\n */\nexport type BrowserClientOptions = ClientOptions<BrowserTransportOptions> &\n BrowserClientReplayOptions &\n BrowserClientProfilingOptions & {\n /** If configured, this URL will be used as base URL for lazy loading integration. */\n cdnBaseUrl?: string;\n };\n\n/**\n * The Sentry Browser SDK Client.\n *\n * @see BrowserOptions for documentation on configuration options.\n * @see SentryClient for usage documentation.\n */\nexport class BrowserClient extends Client<BrowserClientOptions> {\n /**\n * Creates a new Browser SDK instance.\n *\n * @param options Configuration options for this SDK.\n */\n public constructor(options: BrowserClientOptions) {\n const opts = {\n // We default this to true, as it is the safer scenario\n parentSpanIsAlwaysRootSpan: true,\n ...options,\n };\n const sdkSource = WINDOW.SENTRY_SDK_SOURCE || getSDKSource();\n applySdkMetadata(opts, 'browser', ['browser'], sdkSource);\n\n super(opts);\n\n if (opts.sendClientReports && WINDOW.document) {\n WINDOW.document.addEventListener('visibilitychange', () => {\n if (WINDOW.document.visibilityState === 'hidden') {\n this._flushOutcomes();\n }\n });\n }\n\n if (this._options.sendDefaultPii) {\n this.on('postprocessEvent', addAutoIpAddressToUser);\n this.on('beforeSendSession', addAutoIpAddressToSession);\n }\n }\n\n /**\n * @inheritDoc\n */\n public eventFromException(exception: unknown, hint?: EventHint): PromiseLike<Event> {\n return eventFromException(this._options.stackParser, exception, hint, this._options.attachStacktrace);\n }\n\n /**\n * @inheritDoc\n */\n public eventFromMessage(\n message: ParameterizedString,\n level: SeverityLevel = 'info',\n hint?: EventHint,\n ): PromiseLike<Event> {\n return eventFromMessage(this._options.stackParser, message, level, hint, this._options.attachStacktrace);\n }\n\n /**\n * @inheritDoc\n */\n protected _prepareEvent(\n event: Event,\n hint: EventHint,\n currentScope: Scope,\n isolationScope: Scope,\n ): PromiseLike<Event | null> {\n event.platform = event.platform || 'javascript';\n\n return super._prepareEvent(event, hint, currentScope, isolationScope);\n }\n}\n","import type { Options } from '../types-hoist';\nimport { SDK_VERSION } from '../utils-hoist/version';\n\n/**\n * A builder for the SDK metadata in the options for the SDK initialization.\n *\n * Note: This function is identical to `buildMetadata` in Remix and NextJS and SvelteKit.\n * We don't extract it for bundle size reasons.\n * @see https://github.com/getsentry/sentry-javascript/pull/7404\n * @see https://github.com/getsentry/sentry-javascript/pull/4196\n *\n * If you make changes to this function consider updating the others as well.\n *\n * @param options SDK options object that gets mutated\n * @param names list of package names\n */\nexport function applySdkMetadata(options: Options, name: string, names = [name], source = 'npm'): void {\n const metadata = options._metadata || {};\n\n if (!metadata.sdk) {\n metadata.sdk = {\n name: `sentry.javascript.${name}`,\n packages: names.map(name => ({\n name: `${source}:@sentry/${name}`,\n version: SDK_VERSION,\n })),\n version: SDK_VERSION,\n };\n }\n\n options._metadata = metadata;\n}\n","/*\n * This module exists for optimizations in the build process through rollup and terser. We define some global\n * constants, which can be overridden during build. By guarding certain pieces of code with functions that return these\n * constants, we can control whether or not they appear in the final bundle. (Any code guarded by a false condition will\n * never run, and will hence be dropped during treeshaking.) The two primary uses for this are stripping out calls to\n * `logger` and preventing node-related code from appearing in browser bundles.\n *\n * Attention:\n * This file should not be used to define constants/flags that are intended to be used for tree-shaking conducted by\n * users. These flags should live in their respective packages, as we identified user tooling (specifically webpack)\n * having issues tree-shaking these constants across package boundaries.\n * An example for this is the __SENTRY_DEBUG__ constant. It is declared in each package individually because we want\n * users to be able to shake away expressions that it guards.\n */\n\ndeclare const __SENTRY_BROWSER_BUNDLE__: boolean | undefined;\n\nexport type SdkSource = 'npm' | 'cdn' | 'loader';\n\n/**\n * Figures out if we're building a browser bundle.\n *\n * @returns true if this is a browser bundle build.\n */\nexport function isBrowserBundle(): boolean {\n return typeof __SENTRY_BROWSER_BUNDLE__ !== 'undefined' && !!__SENTRY_BROWSER_BUNDLE__;\n}\n\n/**\n * Get source of SDK.\n */\nexport function getSDKSource(): SdkSource {\n // This comment is used to identify this line in the CDN bundle build step and replace this with \"return 'cdn';\"\n /* __SENTRY_SDK_SOURCE__ */ return 'npm';\n}\n","import type { HandlerDataDom } from '@sentry/core';\nimport { addHandler, addNonEnumerableProperty, fill, maybeInstrument, triggerHandlers, uuid4 } from '@sentry/core';\nimport { WINDOW } from '../types';\n\ntype SentryWrappedTarget = HTMLElement & { _sentryId?: string };\n\ntype AddEventListener = (\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n) => void;\ntype RemoveEventListener = (\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | EventListenerOptions,\n) => void;\n\ntype InstrumentedElement = Element & {\n __sentry_instrumentation_handlers__?: {\n [key in 'click' | 'keypress']?: {\n handler?: unknown;\n /** The number of custom listeners attached to this element */\n refCount: number;\n };\n };\n};\n\nconst DEBOUNCE_DURATION = 1000;\n\nlet debounceTimerID: number | undefined;\nlet lastCapturedEventType: string | undefined;\nlet lastCapturedEventTargetId: string | undefined;\n\n/**\n * Add an instrumentation handler for when a click or a keypress happens.\n *\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nexport function addClickKeypressInstrumentationHandler(handler: (data: HandlerDataDom) => void): void {\n const type = 'dom';\n addHandler(type, handler);\n maybeInstrument(type, instrumentDOM);\n}\n\n/** Exported for tests only. */\nexport function instrumentDOM(): void {\n if (!WINDOW.document) {\n return;\n }\n\n // Make it so that any click or keypress that is unhandled / bubbled up all the way to the document triggers our dom\n // handlers. (Normally we have only one, which captures a breadcrumb for each click or keypress.) Do this before\n // we instrument `addEventListener` so that we don't end up attaching this handler twice.\n const triggerDOMHandler = triggerHandlers.bind(null, 'dom');\n const globalDOMEventHandler = makeDOMEventHandler(triggerDOMHandler, true);\n WINDOW.document.addEventListener('click', globalDOMEventHandler, false);\n WINDOW.document.addEventListener('keypress', globalDOMEventHandler, false);\n\n // After hooking into click and keypress events bubbled up to `document`, we also hook into user-handled\n // clicks & keypresses, by adding an event listener of our own to any element to which they add a listener. That\n // way, whenever one of their handlers is triggered, ours will be, too. (This is needed because their handler\n // could potentially prevent the event from bubbling up to our global listeners. This way, our handler are still\n // guaranteed to fire at least once.)\n ['EventTarget', 'Node'].forEach((target: string) => {\n const globalObject = WINDOW as unknown as Record<string, { prototype?: object }>;\n const proto = globalObject[target]?.prototype;\n\n // eslint-disable-next-line no-prototype-builtins\n if (!proto?.hasOwnProperty?.('addEventListener')) {\n return;\n }\n\n fill(proto, 'addEventListener', function (originalAddEventListener: AddEventListener): AddEventListener {\n return function (this: InstrumentedElement, type, listener, options): AddEventListener {\n if (type === 'click' || type == 'keypress') {\n try {\n const handlers = (this.__sentry_instrumentation_handlers__ =\n this.__sentry_instrumentation_handlers__ || {});\n const handlerForType = (handlers[type] = handlers[type] || { refCount: 0 });\n\n if (!handlerForType.handler) {\n const handler = makeDOMEventHandler(triggerDOMHandler);\n handlerForType.handler = handler;\n originalAddEventListener.call(this, type, handler, options);\n }\n\n handlerForType.refCount++;\n } catch (e) {\n // Accessing dom properties is always fragile.\n // Also allows us to skip `addEventListeners` calls with no proper `this` context.\n }\n }\n\n return originalAddEventListener.call(this, type, listener, options);\n };\n });\n\n fill(\n proto,\n 'removeEventListener',\n function (originalRemoveEventListener: RemoveEventListener): RemoveEventListener {\n return function (this: InstrumentedElement, type, listener, options): () => void {\n if (type === 'click' || type == 'keypress') {\n try {\n const handlers = this.__sentry_instrumentation_handlers__ || {};\n const handlerForType = handlers[type];\n\n if (handlerForType) {\n handlerForType.refCount--;\n // If there are no longer any custom handlers of the current type on this element, we can remove ours, too.\n if (handlerForType.refCount <= 0) {\n originalRemoveEventListener.call(this, type, handlerForType.handler, options);\n handlerForType.handler = undefined;\n delete handlers[type]; // eslint-disable-line @typescript-eslint/no-dynamic-delete\n }\n\n // If there are no longer any custom handlers of any type on this element, cleanup everything.\n if (Object.keys(handlers).length === 0) {\n delete this.__sentry_instrumentation_handlers__;\n }\n }\n } catch (e) {\n // Accessing dom properties is always fragile.\n // Also allows us to skip `addEventListeners` calls with no proper `this` context.\n }\n }\n\n return originalRemoveEventListener.call(this, type, listener, options);\n };\n },\n );\n });\n}\n\n/**\n * Check whether the event is similar to the last captured one. For example, two click events on the same button.\n */\nfunction isSimilarToLastCapturedEvent(event: Event): boolean {\n // If both events have different type, then user definitely performed two separate actions. e.g. click + keypress.\n if (event.type !== lastCapturedEventType) {\n return false;\n }\n\n try {\n // If both events have the same type, it's still possible that actions were performed on different targets.\n // e.g. 2 clicks on different buttons.\n if (!event.target || (event.target as SentryWrappedTarget)._sentryId !== lastCapturedEventTargetId) {\n return false;\n }\n } catch (e) {\n // just accessing `target` property can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/sentry-javascript/issues/838\n }\n\n // If both events have the same type _and_ same `target` (an element which triggered an event, _not necessarily_\n // to which an event listener was attached), we treat them as the same action, as we want to capture\n // only one breadcrumb. e.g. multiple clicks on the same button, or typing inside a user input box.\n return true;\n}\n\n/**\n * Decide whether an event should be captured.\n * @param event event to be captured\n */\nfunction shouldSkipDOMEvent(eventType: string, target: SentryWrappedTarget | null): boolean {\n // We are only interested in filtering `keypress` events for now.\n if (eventType !== 'keypress') {\n return false;\n }\n\n if (!target?.tagName) {\n return true;\n }\n\n // Only consider keypress events on actual input elements. This will disregard keypresses targeting body\n // e.g.tabbing through elements, hotkeys, etc.\n if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Wraps addEventListener to capture UI breadcrumbs\n */\nfunction makeDOMEventHandler(\n handler: (data: HandlerDataDom) => void,\n globalListener: boolean = false,\n): (event: Event) => void {\n return (event: Event & { _sentryCaptured?: true }): void => {\n // It's possible this handler might trigger multiple times for the same\n // event (e.g. event propagation through node ancestors).\n // Ignore if we've already captured that event.\n if (!event || event['_sentryCaptured']) {\n return;\n }\n\n const target = getEventTarget(event);\n\n // We always want to skip _some_ events.\n if (shouldSkipDOMEvent(event.type, target)) {\n return;\n }\n\n // Mark event as \"seen\"\n addNonEnumerableProperty(event, '_sentryCaptured', true);\n\n if (target && !target._sentryId) {\n // Add UUID to event target so we can identify if\n addNonEnumerableProperty(target, '_sentryId', uuid4());\n }\n\n const name = event.type === 'keypress' ? 'input' : event.type;\n\n // If there is no last captured event, it means that we can safely capture the new event and store it for future comparisons.\n // If there is a last captured event, see if the new event is different enough to treat it as a unique one.\n // If that's the case, emit the previous event and store locally the newly-captured DOM event.\n if (!isSimilarToLastCapturedEvent(event)) {\n const handlerData: HandlerDataDom = { event, name, global: globalListener };\n handler(handlerData);\n lastCapturedEventType = event.type;\n lastCapturedEventTargetId = target ? target._sentryId : undefined;\n }\n\n // Start a new debounce timer that will prevent us from capturing multiple events that should be grouped together.\n clearTimeout(debounceTimerID);\n debounceTimerID = WINDOW.setTimeout(() => {\n lastCapturedEventTargetId = undefined;\n lastCapturedEventType = undefined;\n }, DEBOUNCE_DURATION);\n };\n}\n\nfunction getEventTarget(event: Event): SentryWrappedTarget | null {\n try {\n return event.target as SentryWrappedTarget | null;\n } catch (e) {\n // just accessing `target` property can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/sentry-javascript/issues/838\n return null;\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/ban-types */\nimport type { ConsoleLevel, HandlerDataConsole } from '../../types-hoist';\n\nimport { CONSOLE_LEVELS, originalConsoleMethods } from '../logger';\nimport { fill } from '../object';\nimport { GLOBAL_OBJ } from '../worldwide';\nimport { addHandler, maybeInstrument, triggerHandlers } from './handlers';\n\n/**\n * Add an instrumentation handler for when a console.xxx method is called.\n *\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nexport function addConsoleInstrumentationHandler(handler: (data: HandlerDataConsole) => void): void {\n const type = 'console';\n addHandler(type, handler);\n maybeInstrument(type, instrumentConsole);\n}\n\nfunction instrumentConsole(): void {\n if (!('console' in GLOBAL_OBJ)) {\n return;\n }\n\n CONSOLE_LEVELS.forEach(function (level: ConsoleLevel): void {\n if (!(level in GLOBAL_OBJ.console)) {\n return;\n }\n\n fill(GLOBAL_OBJ.console, level, function (originalConsoleMethod: () => any): Function {\n originalConsoleMethods[level] = originalConsoleMethod;\n\n return function (...args: any[]): void {\n const handlerData: HandlerDataConsole = { args, level };\n triggerHandlers('console', handlerData);\n\n const log = originalConsoleMethods[level];\n log?.apply(GLOBAL_OBJ.console, args);\n };\n });\n });\n}\n","import { getClient, getIsolationScope } from './currentScopes';\nimport type { Breadcrumb, BreadcrumbHint } from './types-hoist';\nimport { consoleSandbox } from './utils-hoist/logger';\nimport { dateTimestampInSeconds } from './utils-hoist/time';\n\n/**\n * Default maximum number of breadcrumbs added to an event. Can be overwritten\n * with {@link Options.maxBreadcrumbs}.\n */\nconst DEFAULT_BREADCRUMBS = 100;\n\n/**\n * Records a new breadcrumb which will be attached to future events.\n *\n * Breadcrumbs will be added to subsequent events to provide more context on\n * user's actions prior to an error or crash.\n */\nexport function addBreadcrumb(breadcrumb: Breadcrumb, hint?: BreadcrumbHint): void {\n const client = getClient();\n const isolationScope = getIsolationScope();\n\n if (!client) return;\n\n const { beforeBreadcrumb = null, maxBreadcrumbs = DEFAULT_BREADCRUMBS } = client.getOptions();\n\n if (maxBreadcrumbs <= 0) return;\n\n const timestamp = dateTimestampInSeconds();\n const mergedBreadcrumb = { timestamp, ...breadcrumb };\n const finalBreadcrumb = beforeBreadcrumb\n ? (consoleSandbox(() => beforeBreadcrumb(mergedBreadcrumb, hint)) as Breadcrumb | null)\n : mergedBreadcrumb;\n\n if (finalBreadcrumb === null) return;\n\n if (client.emit) {\n client.emit('beforeAddBreadcrumb', finalBreadcrumb, hint);\n }\n\n isolationScope.addBreadcrumb(finalBreadcrumb, maxBreadcrumbs);\n}\n","import type { SeverityLevel } from '../types-hoist';\n\n/**\n * Converts a string-based level into a `SeverityLevel`, normalizing it along the way.\n *\n * @param level String representation of desired `SeverityLevel`.\n * @returns The `SeverityLevel` corresponding to the given string, or 'log' if the string isn't a valid level.\n */\nexport function severityLevelFromString(level: SeverityLevel | string): SeverityLevel {\n return (\n level === 'warn' ? 'warning' : ['fatal', 'error', 'warning', 'log', 'info', 'debug'].includes(level) ? level : 'log'\n ) as SeverityLevel;\n}\n","import type { SeverityLevel } from '../types-hoist';\n\n/**\n * Determine a breadcrumb's log level (only `warning` or `error`) based on an HTTP status code.\n */\nexport function getBreadcrumbLogLevelFromHttpStatusCode(statusCode: number | undefined): SeverityLevel | undefined {\n // NOTE: undefined defaults to 'info' in Sentry\n if (statusCode === undefined) {\n return undefined;\n } else if (statusCode >= 400 && statusCode < 500) {\n return 'warning';\n } else if (statusCode >= 500) {\n return 'error';\n } else {\n return undefined;\n }\n}\n","/* eslint-disable max-lines */\n\nimport {\n SENTRY_XHR_DATA_KEY,\n addClickKeypressInstrumentationHandler,\n addHistoryInstrumentationHandler,\n addXhrInstrumentationHandler,\n} from '@sentry-internal/browser-utils';\nimport type { FetchHint, XhrHint } from '@sentry-internal/browser-utils';\nimport type {\n Breadcrumb,\n Client,\n Event as SentryEvent,\n FetchBreadcrumbData,\n FetchBreadcrumbHint,\n HandlerDataConsole,\n HandlerDataDom,\n HandlerDataFetch,\n HandlerDataHistory,\n HandlerDataXhr,\n IntegrationFn,\n XhrBreadcrumbData,\n XhrBreadcrumbHint,\n} from '@sentry/core';\nimport {\n addBreadcrumb,\n addConsoleInstrumentationHandler,\n addFetchInstrumentationHandler,\n defineIntegration,\n getBreadcrumbLogLevelFromHttpStatusCode,\n getClient,\n getComponentName,\n getEventDescription,\n htmlTreeAsString,\n logger,\n parseUrl,\n safeJoin,\n severityLevelFromString,\n} from '@sentry/core';\n\nimport { DEBUG_BUILD } from '../debug-build';\nimport { WINDOW } from '../helpers';\n\ninterface BreadcrumbsOptions {\n console: boolean;\n dom:\n | boolean\n | {\n serializeAttribute?: string | string[];\n maxStringLength?: number;\n };\n fetch: boolean;\n history: boolean;\n sentry: boolean;\n xhr: boolean;\n}\n\n/** maxStringLength gets capped to prevent 100 breadcrumbs exceeding 1MB event payload size */\nconst MAX_ALLOWED_STRING_LENGTH = 1024;\n\nconst INTEGRATION_NAME = 'Breadcrumbs';\n\nconst _breadcrumbsIntegration = ((options: Partial<BreadcrumbsOptions> = {}) => {\n const _options = {\n console: true,\n dom: true,\n fetch: true,\n history: true,\n sentry: true,\n xhr: true,\n ...options,\n };\n\n return {\n name: INTEGRATION_NAME,\n setup(client) {\n if (_options.console) {\n addConsoleInstrumentationHandler(_getConsoleBreadcrumbHandler(client));\n }\n if (_options.dom) {\n addClickKeypressInstrumentationHandler(_getDomBreadcrumbHandler(client, _options.dom));\n }\n if (_options.xhr) {\n addXhrInstrumentationHandler(_getXhrBreadcrumbHandler(client));\n }\n if (_options.fetch) {\n addFetchInstrumentationHandler(_getFetchBreadcrumbHandler(client));\n }\n if (_options.history) {\n addHistoryInstrumentationHandler(_getHistoryBreadcrumbHandler(client));\n }\n if (_options.sentry) {\n client.on('beforeSendEvent', _getSentryBreadcrumbHandler(client));\n }\n },\n };\n}) satisfies IntegrationFn;\n\nexport const breadcrumbsIntegration = defineIntegration(_breadcrumbsIntegration);\n\n/**\n * Adds a breadcrumb for Sentry events or transactions if this option is enabled.\n */\nfunction _getSentryBreadcrumbHandler(client: Client): (event: SentryEvent) => void {\n return function addSentryBreadcrumb(event: SentryEvent): void {\n if (getClient() !== client) {\n return;\n }\n\n addBreadcrumb(\n {\n category: `sentry.${event.type === 'transaction' ? 'transaction' : 'event'}`,\n event_id: event.event_id,\n level: event.level,\n message: getEventDescription(event),\n },\n {\n event,\n },\n );\n };\n}\n\n/**\n * A HOC that creates a function that creates breadcrumbs from DOM API calls.\n * This is a HOC so that we get access to dom options in the closure.\n */\nfunction _getDomBreadcrumbHandler(\n client: Client,\n dom: BreadcrumbsOptions['dom'],\n): (handlerData: HandlerDataDom) => void {\n return function _innerDomBreadcrumb(handlerData: HandlerDataDom): void {\n if (getClient() !== client) {\n return;\n }\n\n let target;\n let componentName;\n let keyAttrs = typeof dom === 'object' ? dom.serializeAttribute : undefined;\n\n let maxStringLength =\n typeof dom === 'object' && typeof dom.maxStringLength === 'number' ? dom.maxStringLength : undefined;\n if (maxStringLength && maxStringLength > MAX_ALLOWED_STRING_LENGTH) {\n DEBUG_BUILD &&\n logger.warn(\n `\\`dom.maxStringLength\\` cannot exceed ${MAX_ALLOWED_STRING_LENGTH}, but a value of ${maxStringLength} was configured. Sentry will use ${MAX_ALLOWED_STRING_LENGTH} instead.`,\n );\n maxStringLength = MAX_ALLOWED_STRING_LENGTH;\n }\n\n if (typeof keyAttrs === 'string') {\n keyAttrs = [keyAttrs];\n }\n\n // Accessing event.target can throw (see getsentry/raven-js#838, #768)\n try {\n const event = handlerData.event as Event | Node;\n const element = _isEvent(event) ? event.target : event;\n\n target = htmlTreeAsString(element, { keyAttrs, maxStringLength });\n componentName = getComponentName(element);\n } catch (e) {\n target = '<unknown>';\n }\n\n if (target.length === 0) {\n return;\n }\n\n const breadcrumb: Breadcrumb = {\n category: `ui.${handlerData.name}`,\n message: target,\n };\n\n if (componentName) {\n breadcrumb.data = { 'ui.component_name': componentName };\n }\n\n addBreadcrumb(breadcrumb, {\n event: handlerData.event,\n name: handlerData.name,\n global: handlerData.global,\n });\n };\n}\n\n/**\n * Creates breadcrumbs from console API calls\n */\nfunction _getConsoleBreadcrumbHandler(client: Client): (handlerData: HandlerDataConsole) => void {\n return function _consoleBreadcrumb(handlerData: HandlerDataConsole): void {\n if (getClient() !== client) {\n return;\n }\n\n const breadcrumb = {\n category: 'console',\n data: {\n arguments: handlerData.args,\n logger: 'console',\n },\n level: severityLevelFromString(handlerData.level),\n message: safeJoin(handlerData.args, ' '),\n };\n\n if (handlerData.level === 'assert') {\n if (handlerData.args[0] === false) {\n breadcrumb.message = `Assertion failed: ${safeJoin(handlerData.args.slice(1), ' ') || 'console.assert'}`;\n breadcrumb.data.arguments = handlerData.args.slice(1);\n } else {\n // Don't capture a breadcrumb for passed assertions\n return;\n }\n }\n\n addBreadcrumb(breadcrumb, {\n input: handlerData.args,\n level: handlerData.level,\n });\n };\n}\n\n/**\n * Creates breadcrumbs from XHR API calls\n */\nfunction _getXhrBreadcrumbHandler(client: Client): (handlerData: HandlerDataXhr) => void {\n return function _xhrBreadcrumb(handlerData: HandlerDataXhr): void {\n if (getClient() !== client) {\n return;\n }\n\n const { startTimestamp, endTimestamp } = handlerData;\n\n const sentryXhrData = handlerData.xhr[SENTRY_XHR_DATA_KEY];\n\n // We only capture complete, non-sentry requests\n if (!startTimestamp || !endTimestamp || !sentryXhrData) {\n return;\n }\n\n const { method, url, status_code, body } = sentryXhrData;\n\n const data: XhrBreadcrumbData = {\n method,\n url,\n status_code,\n };\n\n const hint: XhrBreadcrumbHint = {\n xhr: handlerData.xhr,\n input: body,\n startTimestamp,\n endTimestamp,\n };\n\n const breadcrumb = {\n category: 'xhr',\n data,\n type: 'http',\n level: getBreadcrumbLogLevelFromHttpStatusCode(status_code),\n };\n\n client.emit('beforeOutgoingRequestBreadcrumb', breadcrumb, hint as XhrHint);\n\n addBreadcrumb(breadcrumb, hint);\n };\n}\n\n/**\n * Creates breadcrumbs from fetch API calls\n */\nfunction _getFetchBreadcrumbHandler(client: Client): (handlerData: HandlerDataFetch) => void {\n return function _fetchBreadcrumb(handlerData: HandlerDataFetch): void {\n if (getClient() !== client) {\n return;\n }\n\n const { startTimestamp, endTimestamp } = handlerData;\n\n // We only capture complete fetch requests\n if (!endTimestamp) {\n return;\n }\n\n if (handlerData.fetchData.url.match(/sentry_key/) && handlerData.fetchData.method === 'POST') {\n // We will not create breadcrumbs for fetch requests that contain `sentry_key` (internal sentry requests)\n return;\n }\n\n const breadcrumbData: FetchBreadcrumbData = {\n method: handlerData.fetchData.method,\n url: handlerData.fetchData.url,\n };\n\n if (handlerData.error) {\n const data: FetchBreadcrumbData = handlerData.fetchData;\n const hint: FetchBreadcrumbHint = {\n data: handlerData.error,\n input: handlerData.args,\n startTimestamp,\n endTimestamp,\n };\n\n const breadcrumb = {\n category: 'fetch',\n data,\n level: 'error',\n type: 'http',\n } satisfies Breadcrumb;\n\n client.emit('beforeOutgoingRequestBreadcrumb', breadcrumb, hint as FetchHint);\n\n addBreadcrumb(breadcrumb, hint);\n } else {\n const response = handlerData.response as Response | undefined;\n const data: FetchBreadcrumbData = {\n ...handlerData.fetchData,\n status_code: response?.status,\n };\n\n breadcrumbData.request_body_size = handlerData.fetchData.request_body_size;\n breadcrumbData.response_body_size = handlerData.fetchData.response_body_size;\n breadcrumbData.status_code = response?.status;\n\n const hint: FetchBreadcrumbHint = {\n input: handlerData.args,\n response,\n startTimestamp,\n endTimestamp,\n };\n\n const breadcrumb = {\n category: 'fetch',\n data,\n type: 'http',\n level: getBreadcrumbLogLevelFromHttpStatusCode(data.status_code),\n };\n\n client.emit('beforeOutgoingRequestBreadcrumb', breadcrumb, hint as FetchHint);\n\n addBreadcrumb(breadcrumb, hint);\n }\n };\n}\n\n/**\n * Creates breadcrumbs from history API calls\n */\nfunction _getHistoryBreadcrumbHandler(client: Client): (handlerData: HandlerDataHistory) => void {\n return function _historyBreadcrumb(handlerData: HandlerDataHistory): void {\n if (getClient() !== client) {\n return;\n }\n\n let from: string | undefined = handlerData.from;\n let to: string | undefined = handlerData.to;\n const parsedLoc = parseUrl(WINDOW.location.href);\n let parsedFrom = from ? parseUrl(from) : undefined;\n const parsedTo = parseUrl(to);\n\n // Initial pushState doesn't provide `from` information\n if (!parsedFrom?.path) {\n parsedFrom = parsedLoc;\n }\n\n // Use only the path component of the URL if the URL matches the current\n // document (almost all the time when using pushState)\n if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host) {\n to = parsedTo.relative;\n }\n if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host) {\n from = parsedFrom.relative;\n }\n\n addBreadcrumb({\n category: 'navigation',\n data: {\n from,\n to,\n },\n });\n };\n}\n\nfunction _isEvent(event: unknown): event is Event {\n return !!event && !!(event as Record<string, unknown>).target;\n}\n","import type { IntegrationFn, WrappedFunction } from '@sentry/core';\nimport { defineIntegration, fill, getFunctionName, getOriginalFunction } from '@sentry/core';\n\nimport { WINDOW, wrap } from '../helpers';\n\nconst DEFAULT_EVENT_TARGET = [\n 'EventTarget',\n 'Window',\n 'Node',\n 'ApplicationCache',\n 'AudioTrackList',\n 'BroadcastChannel',\n 'ChannelMergerNode',\n 'CryptoOperation',\n 'EventSource',\n 'FileReader',\n 'HTMLUnknownElement',\n 'IDBDatabase',\n 'IDBRequest',\n 'IDBTransaction',\n 'KeyOperation',\n 'MediaController',\n 'MessagePort',\n 'ModalWindow',\n 'Notification',\n 'SVGElementInstance',\n 'Screen',\n 'SharedWorker',\n 'TextTrack',\n 'TextTrackCue',\n 'TextTrackList',\n 'WebSocket',\n 'WebSocketWorker',\n 'Worker',\n 'XMLHttpRequest',\n 'XMLHttpRequestEventTarget',\n 'XMLHttpRequestUpload',\n];\n\nconst INTEGRATION_NAME = 'BrowserApiErrors';\n\ntype XMLHttpRequestProp = 'onload' | 'onerror' | 'onprogress' | 'onreadystatechange';\n\ninterface BrowserApiErrorsOptions {\n setTimeout: boolean;\n setInterval: boolean;\n requestAnimationFrame: boolean;\n XMLHttpRequest: boolean;\n eventTarget: boolean | string[];\n}\n\nconst _browserApiErrorsIntegration = ((options: Partial<BrowserApiErrorsOptions> = {}) => {\n const _options = {\n XMLHttpRequest: true,\n eventTarget: true,\n requestAnimationFrame: true,\n setInterval: true,\n setTimeout: true,\n ...options,\n };\n\n return {\n name: INTEGRATION_NAME,\n // TODO: This currently only works for the first client this is setup\n // We may want to adjust this to check for client etc.\n setupOnce() {\n if (_options.setTimeout) {\n fill(WINDOW, 'setTimeout', _wrapTimeFunction);\n }\n\n if (_options.setInterval) {\n fill(WINDOW, 'setInterval', _wrapTimeFunction);\n }\n\n if (_options.requestAnimationFrame) {\n fill(WINDOW, 'requestAnimationFrame', _wrapRAF);\n }\n\n if (_options.XMLHttpRequest && 'XMLHttpRequest' in WINDOW) {\n fill(XMLHttpRequest.prototype, 'send', _wrapXHR);\n }\n\n const eventTargetOption = _options.eventTarget;\n if (eventTargetOption) {\n const eventTarget = Array.isArray(eventTargetOption) ? eventTargetOption : DEFAULT_EVENT_TARGET;\n eventTarget.forEach(_wrapEventTarget);\n }\n },\n };\n}) satisfies IntegrationFn;\n\n/**\n * Wrap timer functions and event targets to catch errors and provide better meta data.\n */\nexport const browserApiErrorsIntegration = defineIntegration(_browserApiErrorsIntegration);\n\nfunction _wrapTimeFunction(original: () => void): () => number {\n return function (this: unknown, ...args: unknown[]): number {\n const originalCallback = args[0];\n args[0] = wrap(originalCallback, {\n mechanism: {\n data: { function: getFunctionName(original) },\n handled: false,\n type: 'instrument',\n },\n });\n return original.apply(this, args);\n };\n}\n\nfunction _wrapRAF(original: () => void): (callback: () => void) => unknown {\n return function (this: unknown, callback: () => void): () => void {\n return original.apply(this, [\n wrap(callback, {\n mechanism: {\n data: {\n function: 'requestAnimationFrame',\n handler: getFunctionName(original),\n },\n handled: false,\n type: 'instrument',\n },\n }),\n ]);\n };\n}\n\nfunction _wrapXHR(originalSend: () => void): () => void {\n return function (this: XMLHttpRequest, ...args: unknown[]): void {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const xhr = this;\n const xmlHttpRequestProps: XMLHttpRequestProp[] = ['onload', 'onerror', 'onprogress', 'onreadystatechange'];\n\n xmlHttpRequestProps.forEach(prop => {\n if (prop in xhr && typeof xhr[prop] === 'function') {\n fill(xhr, prop, function (original) {\n const wrapOptions = {\n mechanism: {\n data: {\n function: prop,\n handler: getFunctionName(original),\n },\n handled: false,\n type: 'instrument',\n },\n };\n\n // If Instrument integration has been called before BrowserApiErrors, get the name of original function\n const originalFunction = getOriginalFunction(original);\n if (originalFunction) {\n wrapOptions.mechanism.data.handler = getFunctionName(originalFunction);\n }\n\n // Otherwise wrap directly\n return wrap(original, wrapOptions);\n });\n }\n });\n\n return originalSend.apply(this, args);\n };\n}\n\nfunction _wrapEventTarget(target: string): void {\n const globalObject = WINDOW as unknown as Record<string, { prototype?: object }>;\n const proto = globalObject[target]?.prototype;\n\n // eslint-disable-next-line no-prototype-builtins\n if (!proto?.hasOwnProperty?.('addEventListener')) {\n return;\n }\n\n fill(proto, 'addEventListener', function (original: VoidFunction): (\n ...args: Parameters<typeof WINDOW.addEventListener>\n ) => ReturnType<typeof WINDOW.addEventListener> {\n return function (this: unknown, eventName, fn, options): VoidFunction {\n try {\n if (isEventListenerObject(fn)) {\n // ESlint disable explanation:\n // First, it is generally safe to call `wrap` with an unbound function. Furthermore, using `.bind()` would\n // introduce a bug here, because bind returns a new function that doesn't have our\n // flags(like __sentry_original__) attached. `wrap` checks for those flags to avoid unnecessary wrapping.\n // Without those flags, every call to addEventListener wraps the function again, causing a memory leak.\n // eslint-disable-next-line @typescript-eslint/unbound-method\n fn.handleEvent = wrap(fn.handleEvent, {\n mechanism: {\n data: {\n function: 'handleEvent',\n handler: getFunctionName(fn),\n target,\n },\n handled: false,\n type: 'instrument',\n },\n });\n }\n } catch {\n // can sometimes get 'Permission denied to access property \"handle Event'\n }\n\n return original.apply(this, [\n eventName,\n wrap(fn, {\n mechanism: {\n data: {\n function: 'addEventListener',\n handler: getFunctionName(fn),\n target,\n },\n handled: false,\n type: 'instrument',\n },\n }),\n options,\n ]);\n };\n });\n\n fill(proto, 'removeEventListener', function (originalRemoveEventListener: VoidFunction): (\n this: unknown,\n ...args: Parameters<typeof WINDOW.removeEventListener>\n ) => ReturnType<typeof WINDOW.removeEventListener> {\n return function (this: unknown, eventName, fn, options): VoidFunction {\n /**\n * There are 2 possible scenarios here:\n *\n * 1. Someone passes a callback, which was attached prior to Sentry initialization, or by using unmodified\n * method, eg. `document.addEventListener.call(el, name, handler). In this case, we treat this function\n * as a pass-through, and call original `removeEventListener` with it.\n *\n * 2. Someone passes a callback, which was attached after Sentry was initialized, which means that it was using\n * our wrapped version of `addEventListener`, which internally calls `wrap` helper.\n * This helper \"wraps\" whole callback inside a try/catch statement, and attached appropriate metadata to it,\n * in order for us to make a distinction between wrapped/non-wrapped functions possible.\n * If a function was wrapped, it has additional property of `__sentry_wrapped__`, holding the handler.\n *\n * When someone adds a handler prior to initialization, and then do it again, but after,\n * then we have to detach both of them. Otherwise, if we'd detach only wrapped one, it'd be impossible\n * to get rid of the initial handler and it'd stick there forever.\n */\n try {\n const originalEventHandler = (fn as WrappedFunction).__sentry_wrapped__;\n if (originalEventHandler) {\n originalRemoveEventListener.call(this, eventName, originalEventHandler, options);\n }\n } catch (e) {\n // ignore, accessing __sentry_wrapped__ will throw in some Selenium environments\n }\n return originalRemoveEventListener.call(this, eventName, fn, options);\n };\n });\n}\n\nfunction isEventListenerObject(obj: unknown): obj is EventListenerObject {\n return typeof (obj as EventListenerObject).handleEvent === 'function';\n}\n","import { addHistoryInstrumentationHandler } from '@sentry-internal/browser-utils';\nimport { captureSession, defineIntegration, logger, startSession } from '@sentry/core';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { WINDOW } from '../helpers';\n\n/**\n * When added, automatically creates sessions which allow you to track adoption and crashes (crash free rate) in your Releases in Sentry.\n * More information: https://docs.sentry.io/product/releases/health/\n *\n * Note: In order for session tracking to work, you need to set up Releases: https://docs.sentry.io/product/releases/\n */\nexport const browserSessionIntegration = defineIntegration(() => {\n return {\n name: 'BrowserSession',\n setupOnce() {\n if (typeof WINDOW.document === 'undefined') {\n DEBUG_BUILD &&\n logger.warn('Using the `browserSessionIntegration` in non-browser environments is not supported.');\n return;\n }\n\n // The session duration for browser sessions does not track a meaningful\n // concept that can be used as a metric.\n // Automatically captured sessions are akin to page views, and thus we\n // discard their duration.\n startSession({ ignoreDuration: true });\n captureSession();\n\n // We want to create a session for every navigation as well\n addHistoryInstrumentationHandler(({ from, to }) => {\n // Don't create an additional session for the initial route or if the location did not change\n if (from !== undefined && from !== to) {\n startSession({ ignoreDuration: true });\n captureSession();\n }\n });\n },\n };\n});\n","import type { Client, Event, IntegrationFn, Primitive, StackParser } from '@sentry/core';\nimport {\n UNKNOWN_FUNCTION,\n addGlobalErrorInstrumentationHandler,\n addGlobalUnhandledRejectionInstrumentationHandler,\n captureEvent,\n defineIntegration,\n getClient,\n getLocationHref,\n isPrimitive,\n isString,\n logger,\n} from '@sentry/core';\n\nimport type { BrowserClient } from '../client';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { eventFromUnknownInput } from '../eventbuilder';\nimport { shouldIgnoreOnError } from '../helpers';\n\ntype GlobalHandlersIntegrationsOptionKeys = 'onerror' | 'onunhandledrejection';\n\ntype GlobalHandlersIntegrations = Record<GlobalHandlersIntegrationsOptionKeys, boolean>;\n\nconst INTEGRATION_NAME = 'GlobalHandlers';\n\nconst _globalHandlersIntegration = ((options: Partial<GlobalHandlersIntegrations> = {}) => {\n const _options = {\n onerror: true,\n onunhandledrejection: true,\n ...options,\n };\n\n return {\n name: INTEGRATION_NAME,\n setupOnce() {\n Error.stackTraceLimit = 50;\n },\n setup(client) {\n if (_options.onerror) {\n _installGlobalOnErrorHandler(client);\n globalHandlerLog('onerror');\n }\n if (_options.onunhandledrejection) {\n _installGlobalOnUnhandledRejectionHandler(client);\n globalHandlerLog('onunhandledrejection');\n }\n },\n };\n}) satisfies IntegrationFn;\n\nexport const globalHandlersIntegration = defineIntegration(_globalHandlersIntegration);\n\nfunction _installGlobalOnErrorHandler(client: Client): void {\n addGlobalErrorInstrumentationHandler(data => {\n const { stackParser, attachStacktrace } = getOptions();\n\n if (getClient() !== client || shouldIgnoreOnError()) {\n return;\n }\n\n const { msg, url, line, column, error } = data;\n\n const event = _enhanceEventWithInitialFrame(\n eventFromUnknownInput(stackParser, error || msg, undefined, attachStacktrace, false),\n url,\n line,\n column,\n );\n\n event.level = 'error';\n\n captureEvent(event, {\n originalException: error,\n mechanism: {\n handled: false,\n type: 'onerror',\n },\n });\n });\n}\n\nfunction _installGlobalOnUnhandledRejectionHandler(client: Client): void {\n addGlobalUnhandledRejectionInstrumentationHandler(e => {\n const { stackParser, attachStacktrace } = getOptions();\n\n if (getClient() !== client || shouldIgnoreOnError()) {\n return;\n }\n\n const error = _getUnhandledRejectionError(e as unknown);\n\n const event = isPrimitive(error)\n ? _eventFromRejectionWithPrimitive(error)\n : eventFromUnknownInput(stackParser, error, undefined, attachStacktrace, true);\n\n event.level = 'error';\n\n captureEvent(event, {\n originalException: error,\n mechanism: {\n handled: false,\n type: 'onunhandledrejection',\n },\n });\n });\n}\n\nfunction _getUnhandledRejectionError(error: unknown): unknown {\n if (isPrimitive(error)) {\n return error;\n }\n\n // dig the object of the rejection out of known event types\n try {\n type ErrorWithReason = { reason: unknown };\n // PromiseRejectionEvents store the object of the rejection under 'reason'\n // see https://developer.mozilla.org/en-US/docs/Web/API/PromiseRejectionEvent\n if ('reason' in (error as ErrorWithReason)) {\n return (error as ErrorWithReason).reason;\n }\n\n type CustomEventWithDetail = { detail: { reason: unknown } };\n // something, somewhere, (likely a browser extension) effectively casts PromiseRejectionEvents\n // to CustomEvents, moving the `promise` and `reason` attributes of the PRE into\n // the CustomEvent's `detail` attribute, since they're not part of CustomEvent's spec\n // see https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent and\n // https://github.com/getsentry/sentry-javascript/issues/2380\n if ('detail' in (error as CustomEventWithDetail) && 'reason' in (error as CustomEventWithDetail).detail) {\n return (error as CustomEventWithDetail).detail.reason;\n }\n } catch {} // eslint-disable-line no-empty\n\n return error;\n}\n\n/**\n * Create an event from a promise rejection where the `reason` is a primitive.\n *\n * @param reason: The `reason` property of the promise rejection\n * @returns An Event object with an appropriate `exception` value\n */\nfunction _eventFromRejectionWithPrimitive(reason: Primitive): Event {\n return {\n exception: {\n values: [\n {\n type: 'UnhandledRejection',\n // String() is needed because the Primitive type includes symbols (which can't be automatically stringified)\n value: `Non-Error promise rejection captured with value: ${String(reason)}`,\n },\n ],\n },\n };\n}\n\nfunction _enhanceEventWithInitialFrame(\n event: Event,\n url: string | undefined,\n line: number | undefined,\n column: number | undefined,\n): Event {\n // event.exception\n const e = (event.exception = event.exception || {});\n // event.exception.values\n const ev = (e.values = e.values || []);\n // event.exception.values[0]\n const ev0 = (ev[0] = ev[0] || {});\n // event.exception.values[0].stacktrace\n const ev0s = (ev0.stacktrace = ev0.stacktrace || {});\n // event.exception.values[0].stacktrace.frames\n const ev0sf = (ev0s.frames = ev0s.frames || []);\n\n const colno = column;\n const lineno = line;\n const filename = isString(url) && url.length > 0 ? url : getLocationHref();\n\n // event.exception.values[0].stacktrace.frames\n if (ev0sf.length === 0) {\n ev0sf.push({\n colno,\n filename,\n function: UNKNOWN_FUNCTION,\n in_app: true,\n lineno,\n });\n }\n\n return event;\n}\n\nfunction globalHandlerLog(type: string): void {\n DEBUG_BUILD && logger.log(`Global Handler attached: ${type}`);\n}\n\nfunction getOptions(): { stackParser: StackParser; attachStacktrace?: boolean } {\n const client = getClient<BrowserClient>();\n const options = client?.getOptions() || {\n stackParser: () => [],\n attachStacktrace: false,\n };\n return options;\n}\n","import { defineIntegration, getLocationHref } from '@sentry/core';\nimport { WINDOW } from '../helpers';\n\n/**\n * Collects information about HTTP request headers and\n * attaches them to the event.\n */\nexport const httpContextIntegration = defineIntegration(() => {\n return {\n name: 'HttpContext',\n preprocessEvent(event) {\n // if none of the information we want exists, don't bother\n if (!WINDOW.navigator && !WINDOW.location && !WINDOW.document) {\n return;\n }\n\n // grab as much info as exists and add it to the event\n const url = event.request?.url || getLocationHref();\n const { referrer } = WINDOW.document || {};\n const { userAgent } = WINDOW.navigator || {};\n\n const headers = {\n ...event.request?.headers,\n ...(referrer && { Referer: referrer }),\n ...(userAgent && { 'User-Agent': userAgent }),\n };\n const request = {\n ...event.request,\n ...(url && { url }),\n headers,\n };\n\n event.request = request;\n },\n };\n});\n","import type { Event, EventHint, Exception, ExtendedError, StackParser } from '../types-hoist';\n\nimport { isInstanceOf } from './is';\nimport { truncate } from './string';\n\n/**\n * Creates exceptions inside `event.exception.values` for errors that are nested on properties based on the `key` parameter.\n */\nexport function applyAggregateErrorsToEvent(\n exceptionFromErrorImplementation: (stackParser: StackParser, ex: Error) => Exception,\n parser: StackParser,\n maxValueLimit: number = 250,\n key: string,\n limit: number,\n event: Event,\n hint?: EventHint,\n): void {\n if (!event.exception?.values || !hint || !isInstanceOf(hint.originalException, Error)) {\n return;\n }\n\n // Generally speaking the last item in `event.exception.values` is the exception originating from the original Error\n const originalException: Exception | undefined =\n event.exception.values.length > 0 ? event.exception.values[event.exception.values.length - 1] : undefined;\n\n // We only create exception grouping if there is an exception in the event.\n if (originalException) {\n event.exception.values = truncateAggregateExceptions(\n aggregateExceptionsFromError(\n exceptionFromErrorImplementation,\n parser,\n limit,\n hint.originalException as ExtendedError,\n key,\n event.exception.values,\n originalException,\n 0,\n ),\n maxValueLimit,\n );\n }\n}\n\nfunction aggregateExceptionsFromError(\n exceptionFromErrorImplementation: (stackParser: StackParser, ex: Error) => Exception,\n parser: StackParser,\n limit: number,\n error: ExtendedError,\n key: string,\n prevExceptions: Exception[],\n exception: Exception,\n exceptionId: number,\n): Exception[] {\n if (prevExceptions.length >= limit + 1) {\n return prevExceptions;\n }\n\n let newExceptions = [...prevExceptions];\n\n // Recursively call this function in order to walk down a chain of errors\n if (isInstanceOf(error[key], Error)) {\n applyExceptionGroupFieldsForParentException(exception, exceptionId);\n const newException = exceptionFromErrorImplementation(parser, error[key]);\n const newExceptionId = newExceptions.length;\n applyExceptionGroupFieldsForChildException(newException, key, newExceptionId, exceptionId);\n newExceptions = aggregateExceptionsFromError(\n exceptionFromErrorImplementation,\n parser,\n limit,\n error[key],\n key,\n [newException, ...newExceptions],\n newException,\n newExceptionId,\n );\n }\n\n // This will create exception grouping for AggregateErrors\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/AggregateError\n if (Array.isArray(error.errors)) {\n error.errors.forEach((childError, i) => {\n if (isInstanceOf(childError, Error)) {\n applyExceptionGroupFieldsForParentException(exception, exceptionId);\n const newException = exceptionFromErrorImplementation(parser, childError);\n const newExceptionId = newExceptions.length;\n applyExceptionGroupFieldsForChildException(newException, `errors[${i}]`, newExceptionId, exceptionId);\n newExceptions = aggregateExceptionsFromError(\n exceptionFromErrorImplementation,\n parser,\n limit,\n childError,\n key,\n [newException, ...newExceptions],\n newException,\n newExceptionId,\n );\n }\n });\n }\n\n return newExceptions;\n}\n\nfunction applyExceptionGroupFieldsForParentException(exception: Exception, exceptionId: number): void {\n // Don't know if this default makes sense. The protocol requires us to set these values so we pick *some* default.\n exception.mechanism = exception.mechanism || { type: 'generic', handled: true };\n\n exception.mechanism = {\n ...exception.mechanism,\n ...(exception.type === 'AggregateError' && { is_exception_group: true }),\n exception_id: exceptionId,\n };\n}\n\nfunction applyExceptionGroupFieldsForChildException(\n exception: Exception,\n source: string,\n exceptionId: number,\n parentId: number | undefined,\n): void {\n // Don't know if this default makes sense. The protocol requires us to set these values so we pick *some* default.\n exception.mechanism = exception.mechanism || { type: 'generic', handled: true };\n\n exception.mechanism = {\n ...exception.mechanism,\n type: 'chained',\n source,\n exception_id: exceptionId,\n parent_id: parentId,\n };\n}\n\n/**\n * Truncate the message (exception.value) of all exceptions in the event.\n * Because this event processor is ran after `applyClientOptions`,\n * we need to truncate the message of the added exceptions here.\n */\nfunction truncateAggregateExceptions(exceptions: Exception[], maxValueLength: number): Exception[] {\n return exceptions.map(exception => {\n if (exception.value) {\n exception.value = truncate(exception.value, maxValueLength);\n }\n return exception;\n });\n}\n","import type { IntegrationFn } from '@sentry/core';\nimport { applyAggregateErrorsToEvent, defineIntegration } from '@sentry/core';\nimport { exceptionFromError } from '../eventbuilder';\n\ninterface LinkedErrorsOptions {\n key?: string;\n limit?: number;\n}\n\nconst DEFAULT_KEY = 'cause';\nconst DEFAULT_LIMIT = 5;\n\nconst INTEGRATION_NAME = 'LinkedErrors';\n\nconst _linkedErrorsIntegration = ((options: LinkedErrorsOptions = {}) => {\n const limit = options.limit || DEFAULT_LIMIT;\n const key = options.key || DEFAULT_KEY;\n\n return {\n name: INTEGRATION_NAME,\n preprocessEvent(event, hint, client) {\n const options = client.getOptions();\n\n applyAggregateErrorsToEvent(\n // This differs from the LinkedErrors integration in core by using a different exceptionFromError function\n exceptionFromError,\n options.stackParser,\n options.maxValueLength,\n key,\n limit,\n event,\n hint,\n );\n },\n };\n}) satisfies IntegrationFn;\n\n/**\n * Aggregrate linked errors in an event.\n */\nexport const linkedErrorsIntegration = defineIntegration(_linkedErrorsIntegration);\n","// This was originally forked from https://github.com/csnover/TraceKit, and was largely\n// re - written as part of raven - js.\n//\n// This code was later copied to the JavaScript mono - repo and further modified and\n// refactored over the years.\n\n// Copyright (c) 2013 Onur Can Cakmak onur.cakmak@gmail.com and all TraceKit contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this\n// software and associated documentation files(the 'Software'), to deal in the Software\n// without restriction, including without limitation the rights to use, copy, modify,\n// merge, publish, distribute, sublicense, and / or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to the following\n// conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies\n// or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n// PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n// CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE\n// OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nimport { UNKNOWN_FUNCTION, createStackParser } from '@sentry/core';\nimport type { StackFrame, StackLineParser, StackLineParserFn } from '@sentry/core';\n\nconst OPERA10_PRIORITY = 10;\nconst OPERA11_PRIORITY = 20;\nconst CHROME_PRIORITY = 30;\nconst WINJS_PRIORITY = 40;\nconst GECKO_PRIORITY = 50;\n\nfunction createFrame(filename: string, func: string, lineno?: number, colno?: number): StackFrame {\n const frame: StackFrame = {\n filename,\n function: func === '<anonymous>' ? UNKNOWN_FUNCTION : func,\n in_app: true, // All browser frames are considered in_app\n };\n\n if (lineno !== undefined) {\n frame.lineno = lineno;\n }\n\n if (colno !== undefined) {\n frame.colno = colno;\n }\n\n return frame;\n}\n\n// This regex matches frames that have no function name (ie. are at the top level of a module).\n// For example \"at http://localhost:5000//script.js:1:126\"\n// Frames _with_ function names usually look as follows: \"at commitLayoutEffects (react-dom.development.js:23426:1)\"\nconst chromeRegexNoFnName = /^\\s*at (\\S+?)(?::(\\d+))(?::(\\d+))\\s*$/i;\n\n// This regex matches all the frames that have a function name.\nconst chromeRegex =\n /^\\s*at (?:(.+?\\)(?: \\[.+\\])?|.*?) ?\\((?:address at )?)?(?:async )?((?:<anonymous>|[-a-z]+:|.*bundle|\\/)?.*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i;\n\nconst chromeEvalRegex = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/;\n\n// Chromium based browsers: Chrome, Brave, new Opera, new Edge\n// We cannot call this variable `chrome` because it can conflict with global `chrome` variable in certain environments\n// See: https://github.com/getsentry/sentry-javascript/issues/6880\nconst chromeStackParserFn: StackLineParserFn = line => {\n // If the stack line has no function name, we need to parse it differently\n const noFnParts = chromeRegexNoFnName.exec(line) as null | [string, string, string, string];\n\n if (noFnParts) {\n const [, filename, line, col] = noFnParts;\n return createFrame(filename, UNKNOWN_FUNCTION, +line, +col);\n }\n\n const parts = chromeRegex.exec(line) as null | [string, string, string, string, string];\n\n if (parts) {\n const isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line\n\n if (isEval) {\n const subMatch = chromeEvalRegex.exec(parts[2]) as null | [string, string, string, string];\n\n if (subMatch) {\n // throw out eval line/column and use top-most line/column number\n parts[2] = subMatch[1]; // url\n parts[3] = subMatch[2]; // line\n parts[4] = subMatch[3]; // column\n }\n }\n\n // Kamil: One more hack won't hurt us right? Understanding and adding more rules on top of these regexps right now\n // would be way too time consuming. (TODO: Rewrite whole RegExp to be more readable)\n const [func, filename] = extractSafariExtensionDetails(parts[1] || UNKNOWN_FUNCTION, parts[2]);\n\n return createFrame(filename, func, parts[3] ? +parts[3] : undefined, parts[4] ? +parts[4] : undefined);\n }\n\n return;\n};\n\nexport const chromeStackLineParser: StackLineParser = [CHROME_PRIORITY, chromeStackParserFn];\n\n// gecko regex: `(?:bundle|\\d+\\.js)`: `bundle` is for react native, `\\d+\\.js` also but specifically for ram bundles because it\n// generates filenames without a prefix like `file://` the filenames in the stacktrace are just 42.js\n// We need this specific case for now because we want no other regex to match.\nconst geckoREgex =\n /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)?((?:[-a-z]+)?:\\/.*?|\\[native code\\]|[^@]*(?:bundle|\\d+\\.js)|\\/[\\w\\-. /=]+)(?::(\\d+))?(?::(\\d+))?\\s*$/i;\nconst geckoEvalRegex = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i;\n\nconst gecko: StackLineParserFn = line => {\n const parts = geckoREgex.exec(line) as null | [string, string, string, string, string, string];\n\n if (parts) {\n const isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n if (isEval) {\n const subMatch = geckoEvalRegex.exec(parts[3]) as null | [string, string, string];\n\n if (subMatch) {\n // throw out eval line/column and use top-most line number\n parts[1] = parts[1] || 'eval';\n parts[3] = subMatch[1];\n parts[4] = subMatch[2];\n parts[5] = ''; // no column when eval\n }\n }\n\n let filename = parts[3];\n let func = parts[1] || UNKNOWN_FUNCTION;\n [func, filename] = extractSafariExtensionDetails(func, filename);\n\n return createFrame(filename, func, parts[4] ? +parts[4] : undefined, parts[5] ? +parts[5] : undefined);\n }\n\n return;\n};\n\nexport const geckoStackLineParser: StackLineParser = [GECKO_PRIORITY, gecko];\n\nconst winjsRegex = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:[-a-z]+):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\n\nconst winjs: StackLineParserFn = line => {\n const parts = winjsRegex.exec(line) as null | [string, string, string, string, string];\n\n return parts\n ? createFrame(parts[2], parts[1] || UNKNOWN_FUNCTION, +parts[3], parts[4] ? +parts[4] : undefined)\n : undefined;\n};\n\nexport const winjsStackLineParser: StackLineParser = [WINJS_PRIORITY, winjs];\n\nconst opera10Regex = / line (\\d+).*script (?:in )?(\\S+)(?:: in function (\\S+))?$/i;\n\nconst opera10: StackLineParserFn = line => {\n const parts = opera10Regex.exec(line) as null | [string, string, string, string];\n return parts ? createFrame(parts[2], parts[3] || UNKNOWN_FUNCTION, +parts[1]) : undefined;\n};\n\nexport const opera10StackLineParser: StackLineParser = [OPERA10_PRIORITY, opera10];\n\nconst opera11Regex =\n / line (\\d+), column (\\d+)\\s*(?:in (?:<anonymous function: ([^>]+)>|([^)]+))\\(.*\\))? in (.*):\\s*$/i;\n\nconst opera11: StackLineParserFn = line => {\n const parts = opera11Regex.exec(line) as null | [string, string, string, string, string, string];\n return parts ? createFrame(parts[5], parts[3] || parts[4] || UNKNOWN_FUNCTION, +parts[1], +parts[2]) : undefined;\n};\n\nexport const opera11StackLineParser: StackLineParser = [OPERA11_PRIORITY, opera11];\n\nexport const defaultStackLineParsers = [chromeStackLineParser, geckoStackLineParser];\n\nexport const defaultStackParser = createStackParser(...defaultStackLineParsers);\n\n/**\n * Safari web extensions, starting version unknown, can produce \"frames-only\" stacktraces.\n * What it means, is that instead of format like:\n *\n * Error: wat\n * at function@url:row:col\n * at function@url:row:col\n * at function@url:row:col\n *\n * it produces something like:\n *\n * function@url:row:col\n * function@url:row:col\n * function@url:row:col\n *\n * Because of that, it won't be captured by `chrome` RegExp and will fall into `Gecko` branch.\n * This function is extracted so that we can use it in both places without duplicating the logic.\n * Unfortunately \"just\" changing RegExp is too complicated now and making it pass all tests\n * and fix this case seems like an impossible, or at least way too time-consuming task.\n */\nconst extractSafariExtensionDetails = (func: string, filename: string): [string, string] => {\n const isSafariExtension = func.indexOf('safari-extension') !== -1;\n const isSafariWebExtension = func.indexOf('safari-web-extension') !== -1;\n\n return isSafariExtension || isSafariWebExtension\n ? [\n func.indexOf('@') !== -1 ? (func.split('@')[0] as string) : UNKNOWN_FUNCTION,\n isSafariExtension ? `safari-extension:${filename}` : `safari-web-extension:${filename}`,\n ]\n : [func, filename];\n};\n","import { isNativeFunction, logger } from '@sentry/core';\nimport { DEBUG_BUILD } from './debug-build';\nimport { WINDOW } from './types';\n\n/**\n * We generally want to use window.fetch / window.setTimeout.\n * However, in some cases this may be wrapped (e.g. by Zone.js for Angular),\n * so we try to get an unpatched version of this from a sandboxed iframe.\n */\n\ninterface CacheableImplementations {\n setTimeout: typeof WINDOW.setTimeout;\n fetch: typeof WINDOW.fetch;\n}\n\nconst cachedImplementations: Partial<CacheableImplementations> = {};\n\n/**\n * Get the native implementation of a browser function.\n *\n * This can be used to ensure we get an unwrapped version of a function, in cases where a wrapped function can lead to problems.\n *\n * The following methods can be retrieved:\n * - `setTimeout`: This can be wrapped by e.g. Angular, causing change detection to be triggered.\n * - `fetch`: This can be wrapped by e.g. ad-blockers, causing an infinite loop when a request is blocked.\n */\nexport function getNativeImplementation<T extends keyof CacheableImplementations>(\n name: T,\n): CacheableImplementations[T] {\n const cached = cachedImplementations[name];\n if (cached) {\n return cached;\n }\n\n let impl = WINDOW[name] as CacheableImplementations[T];\n\n // Fast path to avoid DOM I/O\n if (isNativeFunction(impl)) {\n return (cachedImplementations[name] = impl.bind(WINDOW) as CacheableImplementations[T]);\n }\n\n const document = WINDOW.document;\n // eslint-disable-next-line deprecation/deprecation\n if (document && typeof document.createElement === 'function') {\n try {\n const sandbox = document.createElement('iframe');\n sandbox.hidden = true;\n document.head.appendChild(sandbox);\n const contentWindow = sandbox.contentWindow;\n if (contentWindow?.[name]) {\n impl = contentWindow[name] as CacheableImplementations[T];\n }\n document.head.removeChild(sandbox);\n } catch (e) {\n // Could not create sandbox iframe, just use window.xxx\n DEBUG_BUILD && logger.warn(`Could not create sandbox iframe for ${name} check, bailing to window.${name}: `, e);\n }\n }\n\n // Sanity check: This _should_ not happen, but if it does, we just skip caching...\n // This can happen e.g. in tests where fetch may not be available in the env, or similar.\n if (!impl) {\n return impl;\n }\n\n return (cachedImplementations[name] = impl.bind(WINDOW) as CacheableImplementations[T]);\n}\n\n/** Clear a cached implementation. */\nexport function clearCachedImplementation(name: keyof CacheableImplementations): void {\n cachedImplementations[name] = undefined;\n}\n\n/**\n * A special usecase for incorrectly wrapped Fetch APIs in conjunction with ad-blockers.\n * Whenever someone wraps the Fetch API and returns the wrong promise chain,\n * this chain becomes orphaned and there is no possible way to capture it's rejections\n * other than allowing it bubble up to this very handler. eg.\n *\n * const f = window.fetch;\n * window.fetch = function () {\n * const p = f.apply(this, arguments);\n *\n * p.then(function() {\n * console.log('hi.');\n * });\n *\n * return p;\n * }\n *\n * `p.then(function () { ... })` is producing a completely separate promise chain,\n * however, what's returned is `p` - the result of original `fetch` call.\n *\n * This mean, that whenever we use the Fetch API to send our own requests, _and_\n * some ad-blocker blocks it, this orphaned chain will _always_ reject,\n * effectively causing another event to be captured.\n * This makes a whole process become an infinite loop, which we need to somehow\n * deal with, and break it in one way or another.\n *\n * To deal with this issue, we are making sure that we _always_ use the real\n * browser Fetch API, instead of relying on what `window.fetch` exposes.\n * The only downside to this would be missing our own requests as breadcrumbs,\n * but because we are already not doing this, it should be just fine.\n *\n * Possible failed fetch error messages per-browser:\n *\n * Chrome: Failed to fetch\n * Edge: Failed to Fetch\n * Firefox: NetworkError when attempting to fetch resource\n * Safari: resource blocked by content blocker\n */\nexport function fetch(...rest: Parameters<typeof WINDOW.fetch>): ReturnType<typeof WINDOW.fetch> {\n return getNativeImplementation('fetch')(...rest);\n}\n\n/**\n * Get an unwrapped `setTimeout` method.\n * This ensures that even if e.g. Angular wraps `setTimeout`, we get the native implementation,\n * avoiding triggering change detection.\n */\nexport function setTimeout(...rest: Parameters<typeof WINDOW.setTimeout>): ReturnType<typeof WINDOW.setTimeout> {\n return getNativeImplementation('setTimeout')(...rest);\n}\n","import { SentryError } from './error';\nimport { SyncPromise, rejectedSyncPromise, resolvedSyncPromise } from './syncpromise';\n\nexport interface PromiseBuffer<T> {\n // exposes the internal array so tests can assert on the state of it.\n // XXX: this really should not be public api.\n $: Array<PromiseLike<T>>;\n add(taskProducer: () => PromiseLike<T>): PromiseLike<T>;\n drain(timeout?: number): PromiseLike<boolean>;\n}\n\n/**\n * Creates an new PromiseBuffer object with the specified limit\n * @param limit max number of promises that can be stored in the buffer\n */\nexport function makePromiseBuffer<T>(limit?: number): PromiseBuffer<T> {\n const buffer: Array<PromiseLike<T>> = [];\n\n function isReady(): boolean {\n return limit === undefined || buffer.length < limit;\n }\n\n /**\n * Remove a promise from the queue.\n *\n * @param task Can be any PromiseLike<T>\n * @returns Removed promise.\n */\n function remove(task: PromiseLike<T>): PromiseLike<T | void> {\n return buffer.splice(buffer.indexOf(task), 1)[0] || Promise.resolve(undefined);\n }\n\n /**\n * Add a promise (representing an in-flight action) to the queue, and set it to remove itself on fulfillment.\n *\n * @param taskProducer A function producing any PromiseLike<T>; In previous versions this used to be `task:\n * PromiseLike<T>`, but under that model, Promises were instantly created on the call-site and their executor\n * functions therefore ran immediately. Thus, even if the buffer was full, the action still happened. By\n * requiring the promise to be wrapped in a function, we can defer promise creation until after the buffer\n * limit check.\n * @returns The original promise.\n */\n function add(taskProducer: () => PromiseLike<T>): PromiseLike<T> {\n if (!isReady()) {\n return rejectedSyncPromise(new SentryError('Not adding Promise because buffer limit was reached.'));\n }\n\n // start the task and add its promise to the queue\n const task = taskProducer();\n if (buffer.indexOf(task) === -1) {\n buffer.push(task);\n }\n void task\n .then(() => remove(task))\n // Use `then(null, rejectionHandler)` rather than `catch(rejectionHandler)` so that we can use `PromiseLike`\n // rather than `Promise`. `PromiseLike` doesn't have a `.catch` method, making its polyfill smaller. (ES5 didn't\n // have promises, so TS has to polyfill when down-compiling.)\n .then(null, () =>\n remove(task).then(null, () => {\n // We have to add another catch here because `remove()` starts a new promise chain.\n }),\n );\n return task;\n }\n\n /**\n * Wait for all promises in the queue to resolve or for timeout to expire, whichever comes first.\n *\n * @param timeout The time, in ms, after which to resolve to `false` if the queue is still non-empty. Passing `0` (or\n * not passing anything) will make the promise wait as long as it takes for the queue to drain before resolving to\n * `true`.\n * @returns A promise which will resolve to `true` if the queue is already empty or drains before the timeout, and\n * `false` otherwise\n */\n function drain(timeout?: number): PromiseLike<boolean> {\n return new SyncPromise<boolean>((resolve, reject) => {\n let counter = buffer.length;\n\n if (!counter) {\n return resolve(true);\n }\n\n // wait for `timeout` ms and then resolve to `false` (if not cancelled first)\n const capturedSetTimeout = setTimeout(() => {\n if (timeout && timeout > 0) {\n resolve(false);\n }\n }, timeout);\n\n // if all promises resolve in time, cancel the timer and resolve to `true`\n buffer.forEach(item => {\n void resolvedSyncPromise(item).then(() => {\n if (!--counter) {\n clearTimeout(capturedSetTimeout);\n resolve(true);\n }\n }, reject);\n });\n });\n }\n\n return {\n $: buffer,\n add,\n drain,\n };\n}\n","import type { DataCategory, TransportMakeRequestResponse } from '../types-hoist';\n\n// Intentionally keeping the key broad, as we don't know for sure what rate limit headers get returned from backend\nexport type RateLimits = Record<string, number>;\n\nexport const DEFAULT_RETRY_AFTER = 60 * 1000; // 60 seconds\n\n/**\n * Extracts Retry-After value from the request header or returns default value\n * @param header string representation of 'Retry-After' header\n * @param now current unix timestamp\n *\n */\nexport function parseRetryAfterHeader(header: string, now: number = Date.now()): number {\n const headerDelay = parseInt(`${header}`, 10);\n if (!isNaN(headerDelay)) {\n return headerDelay * 1000;\n }\n\n const headerDate = Date.parse(`${header}`);\n if (!isNaN(headerDate)) {\n return headerDate - now;\n }\n\n return DEFAULT_RETRY_AFTER;\n}\n\n/**\n * Gets the time that the given category is disabled until for rate limiting.\n * In case no category-specific limit is set but a general rate limit across all categories is active,\n * that time is returned.\n *\n * @return the time in ms that the category is disabled until or 0 if there's no active rate limit.\n */\nexport function disabledUntil(limits: RateLimits, dataCategory: DataCategory): number {\n return limits[dataCategory] || limits.all || 0;\n}\n\n/**\n * Checks if a category is rate limited\n */\nexport function isRateLimited(limits: RateLimits, dataCategory: DataCategory, now: number = Date.now()): boolean {\n return disabledUntil(limits, dataCategory) > now;\n}\n\n/**\n * Update ratelimits from incoming headers.\n *\n * @return the updated RateLimits object.\n */\nexport function updateRateLimits(\n limits: RateLimits,\n { statusCode, headers }: TransportMakeRequestResponse,\n now: number = Date.now(),\n): RateLimits {\n const updatedRateLimits: RateLimits = {\n ...limits,\n };\n\n // \"The name is case-insensitive.\"\n // https://developer.mozilla.org/en-US/docs/Web/API/Headers/get\n const rateLimitHeader = headers?.['x-sentry-rate-limits'];\n const retryAfterHeader = headers?.['retry-after'];\n\n if (rateLimitHeader) {\n /**\n * rate limit headers are of the form\n * <header>,<header>,..\n * where each <header> is of the form\n * <retry_after>: <categories>: <scope>: <reason_code>: <namespaces>\n * where\n * <retry_after> is a delay in seconds\n * <categories> is the event type(s) (error, transaction, etc) being rate limited and is of the form\n * <category>;<category>;...\n * <scope> is what's being limited (org, project, or key) - ignored by SDK\n * <reason_code> is an arbitrary string like \"org_quota\" - ignored by SDK\n * <namespaces> Semicolon-separated list of metric namespace identifiers. Defines which namespace(s) will be affected.\n * Only present if rate limit applies to the metric_bucket data category.\n */\n for (const limit of rateLimitHeader.trim().split(',')) {\n const [retryAfter, categories, , , namespaces] = limit.split(':', 5) as [string, ...string[]];\n const headerDelay = parseInt(retryAfter, 10);\n const delay = (!isNaN(headerDelay) ? headerDelay : 60) * 1000; // 60sec default\n if (!categories) {\n updatedRateLimits.all = now + delay;\n } else {\n for (const category of categories.split(';')) {\n if (category === 'metric_bucket') {\n // namespaces will be present when category === 'metric_bucket'\n if (!namespaces || namespaces.split(';').includes('custom')) {\n updatedRateLimits[category] = now + delay;\n }\n } else {\n updatedRateLimits[category] = now + delay;\n }\n }\n }\n }\n } else if (retryAfterHeader) {\n updatedRateLimits.all = now + parseRetryAfterHeader(retryAfterHeader, now);\n } else if (statusCode === 429) {\n updatedRateLimits.all = now + 60 * 1000;\n }\n\n return updatedRateLimits;\n}\n","import { DEBUG_BUILD } from '../debug-build';\nimport type {\n Envelope,\n EnvelopeItem,\n EventDropReason,\n InternalBaseTransportOptions,\n Transport,\n TransportMakeRequestResponse,\n TransportRequestExecutor,\n} from '../types-hoist';\nimport {\n createEnvelope,\n envelopeItemTypeToDataCategory,\n forEachEnvelopeItem,\n serializeEnvelope,\n} from '../utils-hoist/envelope';\nimport { SentryError } from '../utils-hoist/error';\nimport { logger } from '../utils-hoist/logger';\nimport { type PromiseBuffer, makePromiseBuffer } from '../utils-hoist/promisebuffer';\nimport { type RateLimits, isRateLimited, updateRateLimits } from '../utils-hoist/ratelimit';\nimport { resolvedSyncPromise } from '../utils-hoist/syncpromise';\n\nexport const DEFAULT_TRANSPORT_BUFFER_SIZE = 64;\n\n/**\n * Creates an instance of a Sentry `Transport`\n *\n * @param options\n * @param makeRequest\n */\nexport function createTransport(\n options: InternalBaseTransportOptions,\n makeRequest: TransportRequestExecutor,\n buffer: PromiseBuffer<TransportMakeRequestResponse> = makePromiseBuffer(\n options.bufferSize || DEFAULT_TRANSPORT_BUFFER_SIZE,\n ),\n): Transport {\n let rateLimits: RateLimits = {};\n const flush = (timeout?: number): PromiseLike<boolean> => buffer.drain(timeout);\n\n function send(envelope: Envelope): PromiseLike<TransportMakeRequestResponse> {\n const filteredEnvelopeItems: EnvelopeItem[] = [];\n\n // Drop rate limited items from envelope\n forEachEnvelopeItem(envelope, (item, type) => {\n const dataCategory = envelopeItemTypeToDataCategory(type);\n if (isRateLimited(rateLimits, dataCategory)) {\n options.recordDroppedEvent('ratelimit_backoff', dataCategory);\n } else {\n filteredEnvelopeItems.push(item);\n }\n });\n\n // Skip sending if envelope is empty after filtering out rate limited events\n if (filteredEnvelopeItems.length === 0) {\n return resolvedSyncPromise({});\n }\n\n const filteredEnvelope: Envelope = createEnvelope(envelope[0], filteredEnvelopeItems as (typeof envelope)[1]);\n\n // Creates client report for each item in an envelope\n const recordEnvelopeLoss = (reason: EventDropReason): void => {\n forEachEnvelopeItem(filteredEnvelope, (item, type) => {\n options.recordDroppedEvent(reason, envelopeItemTypeToDataCategory(type));\n });\n };\n\n const requestTask = (): PromiseLike<TransportMakeRequestResponse> =>\n makeRequest({ body: serializeEnvelope(filteredEnvelope) }).then(\n response => {\n // We don't want to throw on NOK responses, but we want to at least log them\n if (response.statusCode !== undefined && (response.statusCode < 200 || response.statusCode >= 300)) {\n DEBUG_BUILD && logger.warn(`Sentry responded with status code ${response.statusCode} to sent event.`);\n }\n\n rateLimits = updateRateLimits(rateLimits, response);\n return response;\n },\n error => {\n recordEnvelopeLoss('network_error');\n throw error;\n },\n );\n\n return buffer.add(requestTask).then(\n result => result,\n error => {\n if (error instanceof SentryError) {\n DEBUG_BUILD && logger.error('Skipped sending event because buffer is full.');\n recordEnvelopeLoss('queue_overflow');\n return resolvedSyncPromise({});\n } else {\n throw error;\n }\n },\n );\n }\n\n return {\n send,\n flush,\n };\n}\n","import { clearCachedImplementation, getNativeImplementation } from '@sentry-internal/browser-utils';\nimport type { Transport, TransportMakeRequestResponse, TransportRequest } from '@sentry/core';\nimport { createTransport, rejectedSyncPromise } from '@sentry/core';\nimport type { WINDOW } from '../helpers';\nimport type { BrowserTransportOptions } from './types';\n\n/**\n * Creates a Transport that uses the Fetch API to send events to Sentry.\n */\nexport function makeFetchTransport(\n options: BrowserTransportOptions,\n nativeFetch: typeof WINDOW.fetch | undefined = getNativeImplementation('fetch'),\n): Transport {\n let pendingBodySize = 0;\n let pendingCount = 0;\n\n function makeRequest(request: TransportRequest): PromiseLike<TransportMakeRequestResponse> {\n const requestSize = request.body.length;\n pendingBodySize += requestSize;\n pendingCount++;\n\n const requestOptions: RequestInit = {\n body: request.body,\n method: 'POST',\n referrerPolicy: 'strict-origin',\n headers: options.headers,\n // Outgoing requests are usually cancelled when navigating to a different page, causing a \"TypeError: Failed to\n // fetch\" error and sending a \"network_error\" client-outcome - in Chrome, the request status shows \"(cancelled)\".\n // The `keepalive` flag keeps outgoing requests alive, even when switching pages. We want this since we're\n // frequently sending events right before the user is switching pages (eg. when finishing navigation transactions).\n // Gotchas:\n // - `keepalive` isn't supported by Firefox\n // - As per spec (https://fetch.spec.whatwg.org/#http-network-or-cache-fetch):\n // If the sum of contentLength and inflightKeepaliveBytes is greater than 64 kibibytes, then return a network error.\n // We will therefore only activate the flag when we're below that limit.\n // There is also a limit of requests that can be open at the same time, so we also limit this to 15\n // See https://github.com/getsentry/sentry-javascript/pull/7553 for details\n keepalive: pendingBodySize <= 60_000 && pendingCount < 15,\n ...options.fetchOptions,\n };\n\n if (!nativeFetch) {\n clearCachedImplementation('fetch');\n return rejectedSyncPromise('No fetch implementation available');\n }\n\n try {\n // TODO: This may need a `suppressTracing` call in the future when we switch the browser SDK to OTEL\n return nativeFetch(options.url, requestOptions).then(response => {\n pendingBodySize -= requestSize;\n pendingCount--;\n return {\n statusCode: response.status,\n headers: {\n 'x-sentry-rate-limits': response.headers.get('X-Sentry-Rate-Limits'),\n 'retry-after': response.headers.get('Retry-After'),\n },\n };\n });\n } catch (e) {\n clearCachedImplementation('fetch');\n pendingBodySize -= requestSize;\n pendingCount--;\n return rejectedSyncPromise(e);\n }\n }\n\n return createTransport(options, makeRequest);\n}\n","import type { Client, Integration, Options, ReportDialogOptions } from '@sentry/core';\nimport {\n consoleSandbox,\n dedupeIntegration,\n functionToStringIntegration,\n getCurrentScope,\n getIntegrationsToSetup,\n getLocationHref,\n getReportDialogEndpoint,\n inboundFiltersIntegration,\n initAndBind,\n lastEventId,\n logger,\n stackParserFromStackParserOptions,\n supportsFetch,\n} from '@sentry/core';\nimport type { BrowserClientOptions, BrowserOptions } from './client';\nimport { BrowserClient } from './client';\nimport { DEBUG_BUILD } from './debug-build';\nimport { WINDOW } from './helpers';\nimport { breadcrumbsIntegration } from './integrations/breadcrumbs';\nimport { browserApiErrorsIntegration } from './integrations/browserapierrors';\nimport { browserSessionIntegration } from './integrations/browsersession';\nimport { globalHandlersIntegration } from './integrations/globalhandlers';\nimport { httpContextIntegration } from './integrations/httpcontext';\nimport { linkedErrorsIntegration } from './integrations/linkederrors';\nimport { defaultStackParser } from './stack-parsers';\nimport { makeFetchTransport } from './transports/fetch';\n\n/** Get the default integrations for the browser SDK. */\nexport function getDefaultIntegrations(_options: Options): Integration[] {\n /**\n * Note: Please make sure this stays in sync with Angular SDK, which re-exports\n * `getDefaultIntegrations` but with an adjusted set of integrations.\n */\n return [\n // TODO(v10): Replace with `eventFiltersIntegration` once we remove the deprecated `inboundFiltersIntegration`\n // eslint-disable-next-line deprecation/deprecation\n inboundFiltersIntegration(),\n functionToStringIntegration(),\n browserApiErrorsIntegration(),\n breadcrumbsIntegration(),\n globalHandlersIntegration(),\n linkedErrorsIntegration(),\n dedupeIntegration(),\n httpContextIntegration(),\n browserSessionIntegration(),\n ];\n}\n\n/** Exported only for tests. */\nexport function applyDefaultOptions(optionsArg: BrowserOptions = {}): BrowserOptions {\n const defaultOptions: BrowserOptions = {\n defaultIntegrations: getDefaultIntegrations(optionsArg),\n release:\n typeof __SENTRY_RELEASE__ === 'string' // This allows build tooling to find-and-replace __SENTRY_RELEASE__ to inject a release value\n ? __SENTRY_RELEASE__\n : WINDOW.SENTRY_RELEASE?.id, // This supports the variable that sentry-webpack-plugin injects\n sendClientReports: true,\n };\n\n return {\n ...defaultOptions,\n ...dropTopLevelUndefinedKeys(optionsArg),\n };\n}\n\n/**\n * In contrast to the regular `dropUndefinedKeys` method,\n * this one does not deep-drop keys, but only on the top level.\n */\nfunction dropTopLevelUndefinedKeys<T extends object>(obj: T): Partial<T> {\n const mutatetedObj: Partial<T> = {};\n\n for (const k of Object.getOwnPropertyNames(obj)) {\n const key = k as keyof T;\n if (obj[key] !== undefined) {\n mutatetedObj[key] = obj[key];\n }\n }\n\n return mutatetedObj;\n}\n\ntype ExtensionProperties = {\n chrome?: Runtime;\n browser?: Runtime;\n nw?: unknown;\n};\ntype Runtime = {\n runtime?: {\n id?: string;\n };\n};\n\nfunction shouldShowBrowserExtensionError(): boolean {\n const windowWithMaybeExtension =\n typeof WINDOW.window !== 'undefined' && (WINDOW as typeof WINDOW & ExtensionProperties);\n if (!windowWithMaybeExtension) {\n // No need to show the error if we're not in a browser window environment (e.g. service workers)\n return false;\n }\n\n const extensionKey = windowWithMaybeExtension.chrome ? 'chrome' : 'browser';\n const extensionObject = windowWithMaybeExtension[extensionKey];\n\n const runtimeId = extensionObject?.runtime?.id;\n const href = getLocationHref() || '';\n\n const extensionProtocols = ['chrome-extension:', 'moz-extension:', 'ms-browser-extension:', 'safari-web-extension:'];\n\n // Running the SDK in a dedicated extension page and calling Sentry.init is fine; no risk of data leakage\n const isDedicatedExtensionPage =\n !!runtimeId && WINDOW === WINDOW.top && extensionProtocols.some(protocol => href.startsWith(`${protocol}//`));\n\n // Running the SDK in NW.js, which appears like a browser extension but isn't, is also fine\n // see: https://github.com/getsentry/sentry-javascript/issues/12668\n const isNWjs = typeof windowWithMaybeExtension.nw !== 'undefined';\n\n return !!runtimeId && !isDedicatedExtensionPage && !isNWjs;\n}\n\n/**\n * A magic string that build tooling can leverage in order to inject a release value into the SDK.\n */\ndeclare const __SENTRY_RELEASE__: string | undefined;\n\n/**\n * The Sentry Browser SDK Client.\n *\n * To use this SDK, call the {@link init} function as early as possible when\n * loading the web page. To set context information or send manual events, use\n * the provided methods.\n *\n * @example\n *\n * ```\n *\n * import { init } from '@sentry/browser';\n *\n * init({\n * dsn: '__DSN__',\n * // ...\n * });\n * ```\n *\n * @example\n * ```\n *\n * import { addBreadcrumb } from '@sentry/browser';\n * addBreadcrumb({\n * message: 'My Breadcrumb',\n * // ...\n * });\n * ```\n *\n * @example\n *\n * ```\n *\n * import * as Sentry from '@sentry/browser';\n * Sentry.captureMessage('Hello, world!');\n * Sentry.captureException(new Error('Good bye'));\n * Sentry.captureEvent({\n * message: 'Manual',\n * stacktrace: [\n * // ...\n * ],\n * });\n * ```\n *\n * @see {@link BrowserOptions} for documentation on configuration options.\n */\nexport function init(browserOptions: BrowserOptions = {}): Client | undefined {\n const options = applyDefaultOptions(browserOptions);\n\n if (!options.skipBrowserExtensionCheck && shouldShowBrowserExtensionError()) {\n if (DEBUG_BUILD) {\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.error(\n '[Sentry] You cannot run Sentry this way in a browser extension, check: https://docs.sentry.io/platforms/javascript/best-practices/browser-extensions/',\n );\n });\n }\n return;\n }\n\n if (DEBUG_BUILD && !supportsFetch()) {\n logger.warn(\n 'No Fetch API detected. The Sentry SDK requires a Fetch API compatible environment to send events. Please add a Fetch API polyfill.',\n );\n }\n const clientOptions: BrowserClientOptions = {\n ...options,\n stackParser: stackParserFromStackParserOptions(options.stackParser || defaultStackParser),\n integrations: getIntegrationsToSetup(options),\n transport: options.transport || makeFetchTransport,\n };\n\n return initAndBind(BrowserClient, clientOptions);\n}\n\n/**\n * Present the user with a report dialog.\n *\n * @param options Everything is optional, we try to fetch all info need from the global scope.\n */\nexport function showReportDialog(options: ReportDialogOptions = {}): void {\n // doesn't work without a document (React Native)\n if (!WINDOW.document) {\n DEBUG_BUILD && logger.error('Global document not defined in showReportDialog call');\n return;\n }\n\n const scope = getCurrentScope();\n const client = scope.getClient();\n const dsn = client?.getDsn();\n\n if (!dsn) {\n DEBUG_BUILD && logger.error('DSN not configured for showReportDialog call');\n return;\n }\n\n if (scope) {\n options.user = {\n ...scope.getUser(),\n ...options.user,\n };\n }\n\n if (!options.eventId) {\n const eventId = lastEventId();\n if (eventId) {\n options.eventId = eventId;\n }\n }\n\n const script = WINDOW.document.createElement('script');\n script.async = true;\n script.crossOrigin = 'anonymous';\n script.src = getReportDialogEndpoint(dsn, options);\n\n if (options.onLoad) {\n script.onload = options.onLoad;\n }\n\n const { onClose } = options;\n if (onClose) {\n const reportDialogClosedMessageHandler = (event: MessageEvent): void => {\n if (event.data === '__sentry_reportdialog_closed__') {\n try {\n onClose();\n } finally {\n WINDOW.removeEventListener('message', reportDialogClosedMessageHandler);\n }\n }\n };\n WINDOW.addEventListener('message', reportDialogClosedMessageHandler);\n }\n\n const injectionPoint = WINDOW.document.head || WINDOW.document.body;\n if (injectionPoint) {\n injectionPoint.appendChild(script);\n } else {\n DEBUG_BUILD && logger.error('Not injecting report dialog. No injection point found in HTML');\n }\n}\n\n/**\n * This function is here to be API compatible with the loader.\n * @hidden\n */\nexport function forceLoad(): void {\n // Noop\n}\n\n/**\n * This function is here to be API compatible with the loader.\n * @hidden\n */\nexport function onLoad(callback: () => void): void {\n callback();\n}\n","// This is a magic string replaced by rollup\ndeclare const __SENTRY_SDK_VERSION__: string;\n\nexport const SDK_VERSION = typeof __SENTRY_SDK_VERSION__ === 'string' ? __SENTRY_SDK_VERSION__ : '0.0.0-unknown.0';\n","import type { BrowserOptions } from '@sentry/browser';\nimport { init as browserInit, setContext } from '@sentry/browser';\nimport { applySdkMetadata } from '@sentry/core';\nimport type { Client } from '@sentry/core';\n\nimport { version } from 'react';\n\n/**\n * Inits the React SDK\n */\nexport function init(options: BrowserOptions): Client | undefined {\n const opts = {\n ...options,\n };\n\n applySdkMetadata(opts, 'react');\n setContext('react', { version });\n return browserInit(opts);\n}\n","import type { Options } from '../types-hoist';\nimport { SDK_VERSION } from '../utils-hoist/version';\n\n/**\n * A builder for the SDK metadata in the options for the SDK initialization.\n *\n * Note: This function is identical to `buildMetadata` in Remix and NextJS and SvelteKit.\n * We don't extract it for bundle size reasons.\n * @see https://github.com/getsentry/sentry-javascript/pull/7404\n * @see https://github.com/getsentry/sentry-javascript/pull/4196\n *\n * If you make changes to this function consider updating the others as well.\n *\n * @param options SDK options object that gets mutated\n * @param names list of package names\n */\nexport function applySdkMetadata(options: Options, name: string, names = [name], source = 'npm'): void {\n const metadata = options._metadata || {};\n\n if (!metadata.sdk) {\n metadata.sdk = {\n name: `sentry.javascript.${name}`,\n packages: names.map(name => ({\n name: `${source}:@sentry/${name}`,\n version: SDK_VERSION,\n })),\n version: SDK_VERSION,\n };\n }\n\n options._metadata = metadata;\n}\n","/* @flow */\n\nimport * as SentryBrowser from '@sentry/browser';\nimport * as SentryReact from '@sentry/react';\nimport { type SentryDataType, SentryLevel, SentryTagName } from './sentryTypes';\nimport { parseFloat } from '../jsHelpers/parser';\n\nexport default class SentryWrapper {\n static subscriberId: string = '';\n\n // $FlowFixMe: Flow does not support symbols yet\n get [Symbol.toStringTag]() {\n return 'SentryWrapper';\n }\n\n static initialize: (sessionId: string) => void = (sessionId) => {\n if (SentryReact.isInitialized()) {\n // Already initialized\n return;\n }\n\n SentryReact.init({\n debug: process.env.REACT_APP_DEBUG_MODE,\n dsn: process.env.REACT_APP_SENTRY_DSN,\n environment: process.env.REACT_APP_SENTRY_ENVIRONMENT,\n initialScope: {\n tags: { [(SentryTagName.Session: string)]: sessionId },\n },\n integrations: [SentryBrowser.browserTracingIntegration()],\n release: process.env.REACT_APP_VERSION,\n sampleRate: parseFloat(process.env.REACT_APP_SENTRY_SAMPLE_RATE, 1),\n sendClientReports: false,\n sendDefaultPii: true,\n tracesSampleRate: parseFloat(process.env.REACT_APP_SENTRY_TRACES_SAMPLE_RATE, 1),\n });\n };\n\n static updateSubscriberId: (subscriberId: string) => void = (subscriberId) => {\n SentryWrapper.subscriberId = subscriberId;\n };\n\n static notify: (level: SentryLevel, data: SentryDataType) => void = (level, data) => {\n const { breadcrumbs, context, error, message, tagName, tagValue } = data;\n\n SentryReact.withScope((scope) => {\n scope.setLevel((level: string));\n\n if (tagName && tagValue) {\n scope.setTag(tagName, tagValue);\n }\n\n if (SentryWrapper.subscriberId) {\n scope.setTag(SentryTagName.SubscriberId, SentryWrapper.subscriberId);\n }\n\n if (context) {\n scope.setContext('data', context);\n }\n\n breadcrumbs?.forEach((msg) => scope.addBreadcrumb({ message: msg }));\n\n if (error) {\n SentryReact.captureException(error);\n } else {\n SentryReact.captureMessage(message);\n }\n });\n };\n\n static info: (data: SentryDataType) => void = (data) => {\n SentryWrapper.notify(SentryLevel.Info, data);\n };\n\n static warning: (data: SentryDataType) => void = (data) => {\n SentryWrapper.notify(SentryLevel.Warning, data);\n };\n\n static error: (data: SentryDataType) => void = (data) => {\n SentryWrapper.notify(SentryLevel.Error, data);\n };\n}\n","/* @flow */\n\nimport * as React from 'react';\nimport {\n type AllTracks,\n type AudioTrack,\n type IndexedShakaTrack,\n type ShakaConfiguration,\n type ShakaError,\n ShakaErrors,\n type ShakaLanguageRole,\n type ShakaOfflineContent,\n type ShakaOfflineExtraMetadata,\n type ShakaPlayerSettings,\n type ShakaTrack,\n type ShakaTrackList,\n type VideoTrack,\n} from './shakaTypes';\nimport type { BasicPromiseFunction, KeyValuePair } from '@ntg/utils/dist/types';\nimport { CAPTIONS, SUBTITLES, isHearingImpairedSubtitlesTrack } from '../../../helpers/ui/language';\nimport { DRM_KEY_SYSTEM, Drm } from '../../../helpers/jsHelpers/Drm';\nimport { HeaderName, HeaderValue } from '../../../libs/netgemLibrary/v8/constants/Headers';\nimport {\n HtmlMediaError,\n VIDEOPLAYER_ERRORS,\n VIDEOPLAYER_NAME,\n type VideoPlayerBitrateInfo,\n type VideoPlayerExternalSubtitles,\n type VideoPlayerInitData,\n type VideoPlayerLiveMetrics,\n type VideoPlayerMediaInfo,\n VideoPlayerMediaType,\n} from './types';\nimport { Messenger, MessengerEvents } from '@ntg/utils/dist/messenger';\nimport { SentryTagName, SentryTagValue } from '../../../helpers/debug/sentryTypes';\nimport { cloneAllTracks, generateUpdateDownloadProgress, getContentId, selectDownloadTracks } from './shakaHelpers';\nimport { logError, logInfo } from '../../../helpers/debug/debug';\nimport { ContentType } from '../constantsAndTypes';\nimport { HttpStatus } from '../../../libs/netgemLibrary/v8/constants/NetworkCodesAndMessages';\nimport { MILLISECONDS_PER_SECOND } from '../../../helpers/dateTime/Format';\nimport { MediametrieState } from '../../../helpers/mediametrie/types';\nimport { PlayerError } from '../../../helpers/playerError/PlayerError';\nimport SentryWrapper from '../../../helpers/debug/sentry';\nimport ShakaStorage from './shakaStorage';\nimport { fireAndForget } from '../../../helpers/jsHelpers/promise';\nimport { getBoundedValue } from '../../../helpers/maths/maths';\nimport shaka from 'shaka-player/dist/shaka-player.compiled';\n\nconst ONE_MILLION = 1_000_000;\n\n// If an error occurred during media decoding on Safari (Fairplay), retry up to MAX_RETRIES with an increasing delay between attempts\nconst MAX_RETRIES = 3;\n\n// Wait 3s before attempt #2, then 6s before attempt #3, then 12s, etc. (in ms)\nconst RETRY_DELAY = 3_000;\n\n// Timeshift capabilities lower than 300 s (5 min) is considered as no timeshift at all\nconst LIVE_TIMESHIFT_BUFFER_DEPTH_THRESHOLD = 300;\n\n// Default max attempts in case of error\nconst DEFAULT_MAX_ATTEMPTS = 6;\n\n// When playing start over items, duration retrieved by player is huge and incorrect\nconst INFINITY_LIKE = 1e9;\n\nclass PlayerShaka {\n authenticationToken: string | null;\n\n bufferingCallback: () => void;\n\n bufferLoadedCallback: () => void;\n\n certificate: ArrayBuffer;\n\n contentType: ContentType;\n\n duration: number;\n\n endPosition: ?number;\n\n errorCallback: (category: number, code: number, mediaErrorCode: number, errorMsg?: string, isForbidden?: boolean) => Promise<void> | void;\n\n hasVUDrmToken: boolean;\n\n initData: VideoPlayerInitData | null;\n\n isStopped: boolean;\n\n isVerimatrixFairplay: boolean;\n\n isVod: boolean;\n\n liveBufferLengthUpdatedCallback: (liveBufferLength: number) => void;\n\n name: string = VIDEOPLAYER_NAME;\n\n playbackEndedCallback: () => Promise<void> | void;\n\n playbackPausedCallback: () => void;\n\n playbackPlayingCallback: () => void;\n\n playbackTimeUpdatedCallback: (time: number, timeshift?: number) => void;\n\n retryCount: number;\n\n retryTimer: ?TimeoutID;\n\n safariVodWorkaroundCallback: BasicPromiseFunction;\n\n // Id of selected audio track\n selectedAudioId: number | null;\n\n // Id of selected text track\n selectedTextId: number | null;\n\n // Id of selected video track\n selectedVideoId: number | null;\n\n settings: ShakaPlayerSettings;\n\n // $FlowFixMe: not Flow-typed\n shakaPlayer: shaka.Player | null;\n\n skdUri: string;\n\n streamInfoUpdatedCallback: () => void;\n\n streamInitializedCallback: (duration: number) => void;\n\n title: string;\n\n tracks: AllTracks;\n\n videoContainer: HTMLElement | null;\n\n videoElement: HTMLVideoElement;\n\n volumeChangedCallback: (volume: number) => void;\n\n constructor(\n videoElement: HTMLVideoElement,\n videoContainer: HTMLElement | null,\n settings: ShakaPlayerSettings,\n authenticationToken: string | null,\n isVod: boolean,\n contentType: ContentType,\n title: string,\n ) {\n this.authenticationToken = authenticationToken;\n this.contentType = contentType;\n this.duration = NaN;\n this.endPosition = null;\n this.hasVUDrmToken = false;\n this.initData = null;\n this.isStopped = true;\n this.isVerimatrixFairplay = false;\n this.isVod = isVod;\n this.retryCount = 0;\n this.retryTimer = null;\n this.selectedAudioId = null;\n this.selectedTextId = null;\n this.selectedVideoId = null;\n this.settings = settings;\n this.shakaPlayer = null;\n this.skdUri = '';\n this.title = title;\n this.tracks = {\n audio: [],\n text: [],\n video: [],\n };\n this.videoElement = videoElement;\n this.videoContainer = videoContainer;\n\n // Install built-in polyfills to patch browser incompatibilities\n shaka.polyfill.installAll();\n\n /*\n * To debug Shaka Player, replace the import by:\n * import shaka from 'shaka-player/dist/shaka-player.compiled.debug';\n *\n * and set the desired log level (DEBUG, V1 or V2):\n * shaka.log.setLevel(shaka.log.Level.V2);\n */\n\n // Check to see if the browser supports the basic APIs Shaka needs\n if (!shaka.Player.isBrowserSupported()) {\n throw new Error('BrowserNotSupported');\n }\n }\n\n showDebug: () => void = () => {\n const { shakaPlayer } = this;\n\n if (shakaPlayer) {\n logInfo('---------- Shaka Player configuration');\n logInfo(shakaPlayer.getConfiguration());\n logInfo(`Presentation delay: ${shakaPlayer.getManifest().presentationTimeline.getDelay()}`);\n } else {\n logInfo('Shaka Player not initialized');\n }\n };\n\n updateMaxBitrate: (maxBitrate: number) => boolean = (maxBitrate) => {\n const { shakaPlayer } = this;\n\n return shakaPlayer?.configure('restrictions.maxBandwidth', maxBitrate === -1 ? Infinity : maxBitrate * ONE_MILLION) ?? false;\n };\n\n getName: () => string = () => this.name;\n\n getVersion: () => string = () => shaka.Player.version;\n\n getState: () => MediametrieState = () => {\n const { videoElement } = this;\n\n if (videoElement.ended) {\n return MediametrieState.Stop;\n }\n\n return videoElement.paused ? MediametrieState.Pause : MediametrieState.Play;\n };\n\n // Only used for Mediametrie\n getPosition: () => number = () => {\n const { contentType, endPosition, shakaPlayer, videoElement } = this;\n\n if (!shakaPlayer) {\n return 0;\n }\n\n // Property contentType cannot be LiveRecording here, since Mediametrie is disabled for recordings\n if (contentType === ContentType.Live || videoElement.ended) {\n return endPosition ?? 0;\n }\n\n return videoElement.currentTime;\n };\n\n initialize: (initData: VideoPlayerInitData) => Promise<void> = async (initData) => {\n const { videoContainer, videoElement } = this;\n const { fairplayCertificateUrl, fairplayContentKeySystem, laUrl } = initData;\n\n await this.reset();\n\n this.isVerimatrixFairplay = fairplayContentKeySystem === 'verimatrix';\n\n if (this.isVerimatrixFairplay) {\n shaka.polyfill.PatchedMediaKeysApple.install(true);\n }\n\n this.shakaPlayer = new shaka.Player();\n const { shakaPlayer } = this;\n\n if (!shakaPlayer) {\n throw new Error('Cannot initialize Shaka Player');\n }\n\n this.initData = initData;\n\n if (videoContainer) {\n // Provide video container (for subtitles)\n shakaPlayer.setVideoContainer(videoContainer);\n }\n\n // Add callbacks\n this.plugCallbacks(shakaPlayer, videoElement);\n\n try {\n // Attach HTML element\n await shakaPlayer.attach(videoElement);\n\n if (fairplayCertificateUrl && laUrl) {\n // Fairplay DRM (hence Safari)\n const certificate = await this.loadCertificate(fairplayCertificateUrl);\n if (certificate) {\n this.certificate = certificate;\n }\n return this.configureAndStart(shakaPlayer, initData);\n }\n\n // Widevine, Playready or no DRM\n return this.configureAndStart(shakaPlayer, initData);\n } catch (error) {\n logInfo('Error initializing Shaka Player');\n throw error;\n }\n };\n\n initializeOffline: () => Promise<void> = async () => {\n const { videoContainer, videoElement } = this;\n\n this.shakaPlayer = new shaka.Player();\n const { shakaPlayer } = this;\n\n if (!shakaPlayer) {\n throw new Error('Cannot initialize Shaka Player');\n }\n\n if (videoContainer) {\n // Provide video container (for subtitles)\n shakaPlayer.setVideoContainer(videoContainer);\n }\n\n // Add callbacks\n this.plugCallbacks(shakaPlayer, videoElement);\n\n try {\n // Attach HTML element\n await shakaPlayer.attach(videoElement);\n\n /*\n * TODO:\n * if (fairplayCertificateUrl && laUrl) {\n * // Fairplay DRM (hence Safari)\n * const certificate = await this.loadCertificate(fairplayCertificateUrl);\n * if (certificate) {\n * this.certificate = certificate;\n * }\n * return this.configureAndStart(shakaPlayer, initData);\n * }\n *\n * // Widevine, Playready or no DRM\n * return this.configureAndStart(shakaPlayer, initData);\n */\n } catch (error) {\n logInfo('Error attaching videoElement');\n throw error;\n }\n };\n\n startOffline: (content: ShakaOfflineContent) => Promise<void> = async (content) => {\n const { shakaPlayer, videoElement } = this;\n const { offlineUri } = content;\n\n if (!shakaPlayer) {\n return Promise.reject(new PlayerError(VIDEOPLAYER_ERRORS.VS994OfflineContentError));\n }\n\n if (await ShakaStorage.loadContent(shakaPlayer, offlineUri)) {\n return videoElement.play();\n }\n\n return Promise.resolve();\n };\n\n configureAndStart: (shakaPlayer: any, initData: VideoPlayerInitData) => Promise<any> = (shakaPlayer, initData) => {\n this.configurePlayer(shakaPlayer, initData);\n\n // Loads manifest and play\n return this.start(shakaPlayer, initData);\n };\n\n start: (shakaPlayer: any, initData: VideoPlayerInitData) => Promise<any> = async (shakaPlayer, initData) => {\n const { videoElement } = this;\n const { url } = initData;\n\n try {\n await shakaPlayer.load(url);\n this.initializeAudioAndVideoTracks();\n await videoElement.play();\n } catch (error) {\n logInfo(`Error in play() promise (${error.message})`);\n throw error;\n }\n };\n\n loadCertificate: (fairplayCertificateUrl: string) => Promise<?ArrayBuffer> = async (fairplayCertificateUrl) => {\n const response = await fetch(fairplayCertificateUrl);\n return response.arrayBuffer();\n };\n\n // $FlowFixMe: not Flow-typed\n plugCallbacks: (shakaPlayer: shaka.Player, videoElement: HTMLElement) => void = (shakaPlayer, videoElement) => {\n shakaPlayer.addEventListener('error', this.errorEvent, { passive: true });\n shakaPlayer.addEventListener('buffering', this.bufferingEvent, { passive: true });\n shakaPlayer.addEventListener('textchanged', this.textChangedEvent, { passive: true });\n shakaPlayer.addEventListener('trackschanged', this.tracksChangedEvent, { passive: true });\n shakaPlayer.addEventListener('adaptation', this.adaptationEvent, { passive: true });\n shakaPlayer.addEventListener('variantchanged', this.variantChangedEvent, { passive: true });\n\n videoElement.addEventListener('ended', this.endedEvent, { passive: true });\n videoElement.addEventListener('pause', this.pausedEvent, { passive: true });\n videoElement.addEventListener('playing', this.playingEvent, { passive: true });\n videoElement.addEventListener('timeupdate', this.timeUpdateEvent, { passive: true });\n videoElement.addEventListener('durationchange', this.durationChangeEvent, { passive: true });\n videoElement.addEventListener('volumechange', this.volumeChangedEvent, { passive: true });\n };\n\n configurePlayer: (shakaPlayer: any, initData: VideoPlayerInitData) => boolean = (shakaPlayer, initData) => {\n const {\n settings: { bufferBehind, bufferingGoal, rebufferingGoal },\n } = this;\n const { audioLanguage, maxBitrate, subtitlesLanguage } = initData;\n\n const configuration: ShakaConfiguration = {\n streaming: {\n autoLowLatencyMode: true,\n bufferBehind,\n bufferingGoal,\n ignoreTextStreamFailures: true,\n rebufferingGoal,\n retryParameters: { maxAttempts: DEFAULT_MAX_ATTEMPTS },\n },\n };\n\n // DRM\n this.addDrmConfiguration(initData, configuration);\n\n // Auto-select audio track\n if (audioLanguage) {\n configuration.preferredAudioLanguage = audioLanguage;\n }\n\n // Auto-select subtitles track\n if (subtitlesLanguage) {\n configuration.preferredTextLanguage = subtitlesLanguage;\n }\n\n // Green streaming\n if (typeof maxBitrate === 'number') {\n configuration.restrictions = { maxBandwidth: maxBitrate === -1 ? Infinity : maxBitrate * ONE_MILLION };\n }\n\n return shakaPlayer.configure(configuration);\n };\n\n resetRetryTimer: () => void = () => {\n const { retryTimer } = this;\n\n if (retryTimer) {\n clearTimeout(retryTimer);\n this.retryTimer = null;\n }\n };\n\n reset: () => Promise<void> = async () => {\n const { videoElement, shakaPlayer } = this;\n\n this.resetRetryTimer();\n\n this.endPosition = null;\n this.initData = null;\n this.retryCount = 0;\n\n if (this.isVerimatrixFairplay) {\n shaka.polyfill.PatchedMediaKeysApple.uninstall();\n }\n\n videoElement.removeEventListener('ended', this.endedEvent, { passive: true });\n videoElement.removeEventListener('pause', this.pausedEvent, { passive: true });\n videoElement.removeEventListener('playing', this.playingEvent, { passive: true });\n videoElement.removeEventListener('timeupdate', this.timeUpdateEvent, { passive: true });\n videoElement.removeEventListener('durationchange', this.durationChangeEvent, { passive: true });\n videoElement.removeEventListener('volumechange', this.volumeChangedEvent, { passive: true });\n\n if (!shakaPlayer) {\n return;\n }\n\n shakaPlayer.removeEventListener('error', this.errorEvent, { passive: true });\n shakaPlayer.removeEventListener('buffering', this.bufferingEvent, { passive: true });\n shakaPlayer.removeEventListener('textchanged', this.textChangedEvent, { passive: true });\n shakaPlayer.removeEventListener('trackschanged', this.tracksChangedEvent, { passive: true });\n shakaPlayer.removeEventListener('adaptation', this.adaptationEvent, { passive: true });\n shakaPlayer.removeEventListener('variantchanged', this.variantChangedEvent, { passive: true });\n\n try {\n await shakaPlayer.detach();\n await shakaPlayer.destroy();\n delete this.shakaPlayer;\n } catch (error) {\n logError('Error detaching videoElement or destroying player');\n logError(error);\n }\n };\n\n // $FlowFixMe: not Flow-typed\n configureRequestFilter: (shakaPlayer: shaka.Player, initData: VideoPlayerInitData) => void = (shakaPlayer, initData) => {\n const { customHeaders, drm, vuDrmToken } = initData;\n\n if (!customHeaders && !vuDrmToken && drm !== Drm.Fairplay) {\n return;\n }\n\n shakaPlayer.getNetworkingEngine().registerRequestFilter((type, request) => {\n if (type !== shaka.net.NetworkingEngine.RequestType.LICENSE) {\n return;\n }\n\n if (customHeaders) {\n request.headers = customHeaders;\n }\n\n if (vuDrmToken) {\n // FTV special Dash/Widevine case\n this.hasVUDrmToken = true;\n request.headers[HeaderName.VuDrmToken] = vuDrmToken;\n }\n\n // Our entitlement server needs a JSON body, plus authorization header\n if (drm === Drm.Fairplay) {\n // Add auth token in headers and build payload\n request.headers[HeaderName.ContentType] = HeaderValue.ApplicationJson;\n request.headers[HeaderName.Authorization] = `Bearer ${this.authenticationToken ?? ''}`;\n const spc = shaka.util.Uint8ArrayUtils.toStandardBase64(request.body);\n const { skdUri: skd } = this;\n\n request.body = shaka.util.StringUtils.toUTF8(\n JSON.stringify({\n skd,\n spc,\n }),\n );\n }\n });\n };\n\n // $FlowFixMe: not Flow-typed\n configureResponseFilter: (shakaPlayer: shaka.Player, initData: VideoPlayerInitData) => void = (shakaPlayer, initData) => {\n const { drm } = initData;\n\n if (drm !== Drm.Fairplay) {\n return;\n }\n\n // Our entitlement server sends back the ckc inside a JSON object\n shakaPlayer.getNetworkingEngine().registerResponseFilter((type, response) => {\n if (type !== shaka.net.NetworkingEngine.RequestType.LICENSE) {\n return;\n }\n\n const { ckc } = JSON.parse(shaka.util.StringUtils.fromUTF8(response.data));\n response.data = shaka.util.Uint8ArrayUtils.fromBase64(ckc).buffer;\n });\n };\n\n configureServers: (configuration: any, drm: Drm, serverUrl: string) => void = (configuration, drm, serverUrl) => {\n const { certificate } = this;\n\n switch (drm) {\n case Drm.Fairplay:\n configuration.drm = {\n advanced: { [DRM_KEY_SYSTEM.Fairplay]: { serverCertificate: new Uint8Array(certificate) } },\n // eslint-disable-next-line no-unused-vars\n initDataTransform: (initData, initDataType, drmInfo) => {\n if (initDataType !== 'skd') {\n return initData;\n }\n\n /*\n * Variable 'initData' is a buffer containing an 'skd://' URL as a UTF-8 string\n * It's stored for future use, when building the entitlement request (to retrieve the CKC)\n */\n this.skdUri = shaka.util.StringUtils.fromBytesAutoDetect(initData);\n const contentId = getContentId(this.skdUri, this.isVerimatrixFairplay);\n\n if (contentId === this.skdUri) {\n // Regular case: return untouched initData\n return initData;\n }\n\n // Verimatrix case: return initData with SKD URI replaced by content Id\n return shaka.util.FairPlayUtils.initDataTransform(initData, contentId, drmInfo.serverCertificate);\n },\n servers: { [DRM_KEY_SYSTEM.Fairplay]: serverUrl },\n };\n break;\n\n case Drm.Playready:\n configuration.drm = { servers: { [(DRM_KEY_SYSTEM.Playready: string)]: serverUrl } };\n break;\n\n case Drm.Widevine:\n configuration.drm = {\n advanced: {\n [(DRM_KEY_SYSTEM.Widevine: string)]: {\n audioRobustness: ['SW_SECURE_CRYPTO'],\n videoRobustness: ['SW_SECURE_CRYPTO'],\n },\n },\n servers: { [(DRM_KEY_SYSTEM.Widevine: string)]: serverUrl },\n };\n\n // No default\n }\n };\n\n addDrmConfiguration: (initData: VideoPlayerInitData, configuration: ShakaConfiguration) => void =\n // eslint-disable-next-line consistent-return\n (initData, configuration) => {\n const { drm, laUrl } = initData;\n const { shakaPlayer } = this;\n\n if (!shakaPlayer || drm === undefined) {\n return;\n }\n\n if (!laUrl) {\n logError('DRM without laUrl');\n return;\n }\n\n const serverUrl = laUrl.replace(/^http:/iu, 'https:');\n\n this.configureRequestFilter(shakaPlayer, initData);\n this.configureResponseFilter(shakaPlayer, initData);\n this.configureServers(configuration, drm, serverUrl);\n };\n\n compareNumbers: (a: ?number, b: ?number) => number | null = (a, b) => {\n if (typeof a !== 'number' && typeof b !== 'number') {\n return null;\n }\n\n if (typeof a !== 'number') {\n return 1;\n }\n\n if (typeof b !== 'number') {\n return -1;\n }\n\n return a - b;\n };\n\n sortAudioTrack: (a: AudioTrack, b: AudioTrack) => number = (a, b) => {\n const result = this.compareNumbers(a.id, b.id);\n if (typeof result === 'number') {\n return result;\n }\n\n return 0;\n };\n\n sortVideoTrack: (a: VideoTrack, b: VideoTrack) => number = (a, b) => {\n let result = this.compareNumbers(a.height, b.height);\n if (typeof result === 'number') {\n return result;\n }\n\n result = this.compareNumbers(a.videoBandwidth, b.videoBandwidth);\n if (typeof result === 'number') {\n return result;\n }\n\n result = this.compareNumbers(a.id, b.id);\n if (typeof result === 'number') {\n return result;\n }\n\n return 0;\n };\n\n getInitializeTrack: (audioTracks: {| [number]: AudioTrack |}, videoTracks: {| [number]: VideoTrack |}) => (track: ShakaTrack) => void = (audioTracks, videoTracks) => (track) => {\n const {\n active,\n audioBandwidth,\n audioCodec,\n audioId,\n audioMimeType,\n bandwidth,\n frameRate,\n height,\n id,\n label,\n language,\n mimeType,\n originalAudioId,\n originalVideoId,\n roles,\n type,\n videoBandwidth,\n videoCodec,\n videoId,\n videoMimeType,\n width,\n } = track;\n\n if (type === 'variant') {\n // Audio/video track\n if (active) {\n this.selectedAudioId = audioId;\n this.selectedVideoId = videoId;\n }\n\n if (audioId && !(audioId in audioTracks)) {\n audioTracks[audioId] = {\n audioBandwidth,\n audioCodec,\n audioId,\n audioMimeType,\n bandwidth,\n id,\n label,\n language,\n mimeType,\n originalAudioId,\n roles,\n };\n }\n\n if (videoId && !(videoId in videoTracks)) {\n videoTracks[videoId] = {\n bandwidth,\n frameRate,\n height,\n id,\n label,\n language,\n mimeType,\n originalVideoId,\n roles,\n videoBandwidth,\n videoCodec,\n videoId,\n videoMimeType,\n width,\n };\n }\n }\n };\n\n initializeAudioAndVideoTracks: () => void = () => {\n const { shakaPlayer } = this;\n const audioTracks: {| [number]: AudioTrack |} = {};\n const videoTracks: {| [number]: VideoTrack |} = {};\n\n const initializeTrack = this.getInitializeTrack(audioTracks, videoTracks);\n\n shakaPlayer?.getVariantTracks().forEach(initializeTrack);\n\n this.tracks.audio = Object.values(audioTracks).sort(this.sortAudioTrack);\n this.tracks.video = Object.values(videoTracks).sort(this.sortVideoTrack);\n };\n\n // Adds external subtitles if and only if the same subtitles have not already been loaded from manifest\n addSubtitles: (subtitles: Array<VideoPlayerExternalSubtitles>) => Promise<void> = async (subtitles) => {\n const { shakaPlayer, streamInfoUpdatedCallback } = this;\n\n if (!shakaPlayer) {\n return;\n }\n\n // Build a lookup map of subtitles found in manifest\n const subtitlesMap: KeyValuePair<Set<string>> = {};\n shakaPlayer.getTextTracks().forEach((track) => {\n let { language: subsForLang } = subtitlesMap;\n\n if (!subsForLang) {\n const { language } = track;\n\n subsForLang = new Set<string>();\n subtitlesMap[language] = subsForLang;\n }\n\n subsForLang.add(isHearingImpairedSubtitlesTrack(track) ? CAPTIONS : SUBTITLES);\n });\n\n const promises = [];\n\n subtitles.forEach((track) => {\n const { captions, language, mimeType, url } = track;\n\n if (!subtitlesMap[language]?.has(captions ? CAPTIONS : SUBTITLES)) {\n // External subtitles track not present in manifest\n const promise = shakaPlayer.addTextTrackAsync(url, language, captions ? CAPTIONS : SUBTITLES, mimeType).catch((error) => {\n SentryWrapper.error({\n breadcrumbs: ['Shaka Player', 'addSubtitles'],\n context: {\n language,\n mimeType,\n url,\n },\n error,\n tagName: SentryTagName.Component,\n tagValue: SentryTagValue.Player,\n });\n });\n\n promises.push(promise);\n }\n });\n\n await Promise.allSettled(promises);\n\n // Update Player instance so that it's aware of the new subtitles\n streamInfoUpdatedCallback();\n };\n\n /*\n * Fired when a playback error occurs\n */\n errorEvent: (error: ShakaError) => void = (error) => {\n const { errorCallback, isVod, retryCount, safariVodWorkaroundCallback } = this;\n const {\n detail,\n detail: {\n category,\n code,\n data: [untypedMediaErrorCode, httpStatus, untypedErrorMsg],\n },\n } = error;\n\n const mediaErrorCode = typeof untypedMediaErrorCode === 'number' ? untypedMediaErrorCode : 0;\n\n logError(detail);\n\n if (\n // Shaka error category and code\n category === shaka.util.Error.Category.MEDIA &&\n code === shaka.util.Error.Code.VIDEO_ERROR &&\n // HTML MEDIA_ERR_DECODE\n mediaErrorCode === (HtmlMediaError.Decode: number) &&\n // Fairplay DRM\n this.skdUri !== '' &&\n // Not too many retries\n retryCount < MAX_RETRIES\n ) {\n // MEDIA_ERR_DECODE while decoding Fairplay content on Safari: hide error and retry\n\n if (isVod) {\n // VOD case: exit player, wait a bit then retry\n safariVodWorkaroundCallback();\n } else {\n // Live/catchup case: retry a few times without exiting player\n this.resetRetryTimer();\n this.retryCount += 1;\n const timeout = RETRY_DELAY * this.retryCount;\n logInfo(`Fairplay decode error: retry ${this.retryCount}/${MAX_RETRIES} in ${timeout / MILLISECONDS_PER_SECOND} seconds...`);\n\n this.retryTimer = setTimeout(() => {\n const { initData, shakaPlayer } = this;\n\n if (initData && shakaPlayer) {\n logInfo(`Retrying now (${this.retryCount}/${MAX_RETRIES})`);\n fireAndForget(this.start(shakaPlayer, initData));\n }\n }, timeout);\n }\n\n // Hide error\n return;\n }\n\n errorCallback(category, code, mediaErrorCode, untypedErrorMsg?.toString(), httpStatus === HttpStatus.Forbidden);\n };\n\n durationChangeEvent: () => void = () => {\n const {\n contentType,\n shakaPlayer,\n streamInitializedCallback,\n videoElement: { duration },\n } = this;\n\n let value = 0;\n\n if (shakaPlayer) {\n // Live and LiveRecording contents returns Infinity\n value = contentType === ContentType.Static && duration < INFINITY_LIKE ? duration : Infinity;\n }\n\n streamInitializedCallback(value);\n };\n\n /*\n * Return playhead position\n * - catchup: duration from beginning in seconds\n * - live: timestamp in seconds\n */\n timeUpdateEvent: () => void = () => {\n const {\n contentType,\n liveBufferLengthUpdatedCallback,\n playbackTimeUpdatedCallback,\n shakaPlayer,\n videoElement: { currentTime },\n } = this;\n\n if (!shakaPlayer) {\n return;\n }\n\n /*\n * It takes a small amount of time to Shaka Player before isLive() actually returns \"true\".\n * So when we play live content but isLive() returns false, we skip this callback\n */\n if (contentType !== ContentType.Static && !shakaPlayer.isLive()) {\n return;\n }\n\n if (contentType === ContentType.Static) {\n // Catchup, finished recording, VOD\n playbackTimeUpdatedCallback(currentTime);\n } else {\n // Live (including live recording)\n const { end, start } = shakaPlayer.seekRange();\n\n // Current time is sometimes (mostly in Safari) greater than the seek range's end, so buffer length is capped to 0\n const liveBufferLength = Math.max(0, end - start);\n\n if (liveBufferLength >= LIVE_TIMESHIFT_BUFFER_DEPTH_THRESHOLD) {\n liveBufferLengthUpdatedCallback(liveBufferLength);\n }\n\n // In some rare cases, Shaka cannot tell the playhead position\n let position = (shakaPlayer.getPlayheadTimeAsDate()?.getTime() ?? 0) / MILLISECONDS_PER_SECOND;\n const timeshift = end - currentTime;\n\n if (contentType === ContentType.LiveRecording) {\n position = currentTime - start;\n if (position < 0) {\n position = 0;\n }\n }\n\n playbackTimeUpdatedCallback(position, timeshift);\n }\n };\n\n /*\n * Fired when the player's buffering state changes\n */\n bufferingEvent: (buffering: any) => void = (buffering) => {\n const { bufferingCallback, bufferLoadedCallback } = this;\n const { buffering: isBuffering } = buffering;\n\n if (isBuffering) {\n bufferingCallback();\n } else {\n bufferLoadedCallback();\n }\n };\n\n /*\n * Fired when a call from the application caused a text stream change\n * Can be triggered by calls to selectTextTrack() or selectTextLanguage()\n */\n textChangedEvent: () => void = () => {\n const { shakaPlayer, streamInfoUpdatedCallback } = this;\n\n if (!shakaPlayer) {\n return;\n }\n\n this.selectedTextId = this.findSelectedTrackId(shakaPlayer.getTextTracks());\n streamInfoUpdatedCallback();\n };\n\n /*\n * Fired when the list of tracks changes\n * For example, this will happen when new tracks are added/removed or when track restrictions change\n */\n tracksChangedEvent: () => void = () => {\n const { shakaPlayer } = this;\n\n if (!shakaPlayer) {\n return;\n }\n\n const textTracks = shakaPlayer.getTextTracks();\n this.tracks.text = textTracks.map((track) => {\n const { forced, id, kind, label, language, mimeType, roles } = track;\n\n return {\n forced,\n id,\n kind,\n label,\n language,\n mimeType,\n roles,\n };\n });\n\n this.selectedTextId = this.findSelectedTrackId(textTracks);\n };\n\n findSelectedTrackId: (tracks: ShakaTrackList) => number | null = (tracks) => tracks.find((track) => track.active)?.id ?? null;\n\n /*\n * Fired when an automatic adaptation (i.e. ABR manager) causes the active tracks to change\n * Does not fire when the application calls selectVariantTrack(), selectTextTrack(), selectAudioLanguage(), or selectTextLanguage()\n */\n adaptationEvent: () => void = () => {\n this.initializeAudioAndVideoTracks();\n };\n\n /*\n * Fired when a call from the application (i.e. user action) caused a variant change\n * Can be triggered by calls to selectVariantTrack() or selectAudioLanguage()\n * Does not fire when an automatic adaptation causes a variant change\n */\n variantChangedEvent: () => void = () => {\n this.initializeAudioAndVideoTracks();\n };\n\n endedEvent: () => void = () => {\n const {\n playbackEndedCallback,\n shakaPlayer,\n videoElement: { currentTime },\n } = this;\n\n if (!shakaPlayer) {\n return;\n }\n\n // Catchup, recording or VOD\n this.endPosition = currentTime;\n\n playbackEndedCallback();\n };\n\n pausedEvent: () => void = () => {\n const { playbackPausedCallback } = this;\n\n playbackPausedCallback();\n };\n\n playingEvent: () => void = () => {\n const { playbackPlayingCallback, streamInfoUpdatedCallback } = this;\n\n this.retryCount = 0;\n this.resetRetryTimer();\n\n streamInfoUpdatedCallback();\n playbackPlayingCallback();\n };\n\n volumeChangedEvent: () => void = () => {\n const { volumeChangedCallback, videoElement } = this;\n\n volumeChangedCallback(videoElement.volume);\n };\n\n /* eslint-disable no-unused-vars, no-empty-function, arrow-body-style */\n getBitrateInfoListFor: (mediaType: VideoPlayerMediaType) => Array<VideoPlayerBitrateInfo> = (mediaType) => {\n return [];\n };\n\n getQualityFor: (mediaType: VideoPlayerMediaType) => number = (mediaType) => {\n return -1;\n };\n\n getAutoSwitchQualityFor: (mediaType: VideoPlayerMediaType) => boolean = (mediaType) => {\n return false;\n };\n\n setQualityFor: (mediaType: VideoPlayerMediaType, index: number) => void = (mediaType, index) => {};\n\n setAutoSwitchQualityFor: (mediaType: VideoPlayerMediaType, value: boolean) => void = (mediaType, value) => {};\n /* eslint-enable no-unused-vars, no-empty-function, arrow-body-style */\n\n pause: () => void = () => {\n const { videoElement } = this;\n\n videoElement.pause();\n };\n\n play: () => Promise<void> = () => {\n const { videoElement } = this;\n\n return videoElement.play();\n };\n\n isPaused: () => boolean = () => {\n const { videoElement } = this;\n\n return videoElement.paused ?? false;\n };\n\n setVolume: (volume: number) => void = (volume) => {\n const { videoElement } = this;\n\n videoElement.volume = volume;\n };\n\n isMuted: () => boolean = () => {\n const { videoElement } = this;\n\n return videoElement.muted ?? false;\n };\n\n setMute: (mute: boolean) => void = (mute) => {\n const { videoElement } = this;\n\n videoElement.muted = mute;\n };\n\n /*\n * Seek in a live stream\n * value: positive or negative number (in seconds), representing the delta between current time and target time\n */\n liveSeek: (value: number) => void = (value) => {\n const {\n contentType,\n shakaPlayer,\n videoElement,\n videoElement: { currentTime },\n } = this;\n\n if (!shakaPlayer || contentType !== ContentType.Live) {\n return;\n }\n\n const { end, start } = shakaPlayer.seekRange();\n videoElement.currentTime = getBoundedValue(currentTime + value, start, end);\n };\n\n goBackToLive: () => void = () => {\n const { contentType, shakaPlayer } = this;\n\n if (!shakaPlayer || contentType !== ContentType.Live) {\n return;\n }\n\n shakaPlayer.goToLive();\n };\n\n /*\n * Seek in a static stream (or a live stream in the case of an in-progress recording)\n * value (in-progress recording): positive number (in seconds), representing the delta between start time and target time\n * value (catchup, recording or VOD): positive number (in seconds), representing the target time\n */\n seek: (value: number) => void = (value) => {\n const { contentType, shakaPlayer, videoElement } = this;\n\n if (!shakaPlayer) {\n return;\n }\n\n if (contentType === ContentType.Static) {\n // Static content: catchup, finished recording, VOD\n videoElement.currentTime = value;\n } else if (contentType === ContentType.LiveRecording) {\n // Live recording: only used for recordings still in progress\n const { start } = shakaPlayer.seekRange();\n videoElement.currentTime = start + value;\n }\n };\n\n download: (downloadOperationId: string, metadata: ShakaOfflineExtraMetadata) => Promise<void> = async (downloadOperationId, metadata) => {\n const { initData, shakaPlayer } = this;\n\n if (!initData || !shakaPlayer) {\n return;\n }\n\n const updateDownloadProgress = generateUpdateDownloadProgress(downloadOperationId, metadata.title);\n\n try {\n await ShakaStorage.downloadContent(shakaPlayer, downloadOperationId, initData.url, metadata, selectDownloadTracks, updateDownloadProgress);\n updateDownloadProgress(null, 1);\n } catch (error) {\n const { code } = error;\n if (code === ShakaErrors.OperationAborted) {\n Messenger.emit(MessengerEvents.NOTIFY_WARNING, <div>Téléchargement interrompu</div>);\n return;\n }\n\n logError(error);\n updateDownloadProgress(null, -1);\n }\n };\n\n setCurrentTrack: (mediaInfo: VideoPlayerMediaInfo) => void = (mediaInfo) => {\n const { shakaPlayer, streamInfoUpdatedCallback } = this;\n const { index, type } = mediaInfo;\n\n if (!shakaPlayer) {\n return;\n }\n\n const typeEnum = VideoPlayerMediaType.cast(type.toLowerCase());\n\n if (typeEnum === VideoPlayerMediaType.Audio) {\n // Audio track\n const { lang, roles } = mediaInfo;\n shakaPlayer.selectAudioLanguage(lang, roles && roles.length > 0 ? roles[0] : '');\n } else if (typeEnum === VideoPlayerMediaType.Subtitles) {\n // Subtitles track\n const textTracks = shakaPlayer.getTextTracks();\n shakaPlayer.setTextTrackVisibility(true);\n shakaPlayer.selectTextTrack(textTracks[index]);\n }\n\n streamInfoUpdatedCallback();\n };\n\n unsetCurrentTrack: (mediaType: VideoPlayerMediaType) => void = (mediaType) => {\n const { shakaPlayer, streamInfoUpdatedCallback } = this;\n\n if (!shakaPlayer) {\n return;\n }\n\n switch (mediaType) {\n case VideoPlayerMediaType.Audio:\n // Audio track\n shakaPlayer.audioTrack = -1;\n this.selectedAudioId = null;\n break;\n\n case VideoPlayerMediaType.Subtitles:\n // Subtitles track\n this.selectedTextId = null;\n shakaPlayer.setTextTrackVisibility(false);\n streamInfoUpdatedCallback();\n break;\n\n default:\n }\n };\n\n // Current audio track is found amongst all variants via getVariantTracks() but the selection is done through getAudioLanguagesAndRoles(), which returns a smaller list\n getAudioTrackIndex: (shakaPlayer: any, audioTrack: IndexedShakaTrack) => number = (shakaPlayer, audioTrack) => {\n const {\n track: { label, language, roles },\n } = audioTrack;\n const role = roles && roles.length > 0 ? roles[0] : '';\n const languageAndRoles = shakaPlayer.getAudioLanguagesAndRoles();\n\n for (let i = 0; i < languageAndRoles.length; ++i) {\n const {\n [i]: { language: currLanguage, role: currRole, label: currLabel },\n } = languageAndRoles;\n if (((typeof label !== 'string' && typeof currLabel !== 'string') || (typeof label === 'string' && currLabel === label)) && currLanguage === language && currRole === role) {\n return i;\n }\n }\n\n return -1;\n };\n\n getActiveTrack: (tracks: ShakaTrackList) => IndexedShakaTrack | null = (tracks) => {\n if (!tracks) {\n return null;\n }\n\n for (let index = 0; index < tracks.length; index += 1) {\n const track = tracks[index];\n const { active, language } = track;\n\n if (active && language !== '') {\n return {\n index,\n track,\n };\n }\n }\n\n return null;\n };\n\n getActiveAudioTrack: (shakaPlayer: any) => IndexedShakaTrack | null = (shakaPlayer) => this.getActiveTrack(shakaPlayer.getVariantTracks());\n\n getActiveTextTrack: (shakaPlayer: any) => IndexedShakaTrack | null = (shakaPlayer) => {\n const { selectedTextId } = this;\n\n if (selectedTextId === null) {\n // No text track is currently selected (either none is active or one is active but subtitles are hidden)\n return null;\n }\n\n return this.getActiveTrack(shakaPlayer.getTextTracks());\n };\n\n getCurrentTrackFor: (mediaType: VideoPlayerMediaType) => VideoPlayerMediaInfo | null =\n // eslint-disable-next-line consistent-return\n (mediaType) => {\n const { shakaPlayer } = this;\n\n if (!shakaPlayer) {\n return null;\n }\n\n switch (mediaType) {\n case VideoPlayerMediaType.Audio: {\n const indexedTrack = this.getActiveAudioTrack(shakaPlayer);\n if (indexedTrack) {\n // Index returned by getActiveAudioTrack() is the index among all variants, but we want the index in the list of tracks as seen by user\n const index = this.getAudioTrackIndex(shakaPlayer, indexedTrack);\n const { track } = indexedTrack;\n return this.mapAudioShakaTrack(track, index);\n }\n return null;\n }\n\n case VideoPlayerMediaType.Subtitles: {\n const indexedTrack = this.getActiveTextTrack(shakaPlayer);\n if (indexedTrack) {\n const { index, track } = indexedTrack;\n return this.mapTextTrack(track, index);\n }\n return null;\n }\n\n case VideoPlayerMediaType.Video:\n return null;\n\n // No default\n }\n };\n\n mapAudioShakaTrack: (track: ShakaTrack, index: number) => VideoPlayerMediaInfo | null = (track, index) => {\n const { label, kind, language, roles } = track;\n\n if (!language) {\n return null;\n }\n\n const role = roles && roles.length > 0 ? roles[0] : '';\n\n return {\n index,\n kind: kind ?? role,\n lang: language,\n name: label ?? undefined,\n type: (VideoPlayerMediaType.Audio: string),\n };\n };\n\n mapAudioShakaLanguageRole: (track: ShakaLanguageRole, index: number) => VideoPlayerMediaInfo | null = (track, index) => {\n const { label, language, role } = track;\n\n if (!language) {\n return null;\n }\n\n return {\n index,\n kind: role,\n lang: language,\n name: label ?? undefined,\n type: (VideoPlayerMediaType.Audio: string),\n };\n };\n\n mapTextTrack: (track: ShakaTrack, index: number) => VideoPlayerMediaInfo = (track, index) => {\n const { kind, label, language } = track;\n\n return {\n index,\n kind: isHearingImpairedSubtitlesTrack(track) ? CAPTIONS : (kind ?? undefined),\n lang: language,\n name: label ?? undefined,\n type: (VideoPlayerMediaType.Subtitles: string),\n };\n };\n\n mapAudioTracks: (tracks: Array<ShakaLanguageRole>) => Array<VideoPlayerMediaInfo> = (tracks) => {\n if (!tracks) {\n return [];\n }\n\n const result = [];\n for (let i = 0; i < tracks.length; i += 1) {\n const track = this.mapAudioShakaLanguageRole(tracks[i], i);\n\n if (track) {\n result.push(track);\n }\n }\n return result;\n };\n\n mapTextTracks: (textTracks: Array<ShakaTrack>) => Array<VideoPlayerMediaInfo> = (textTracks) => {\n const result = [];\n for (let i = 0; i < textTracks.length; i += 1) {\n const { [i]: track } = textTracks;\n const { language } = track;\n\n if (language !== '') {\n result.push(this.mapTextTrack(track, i));\n }\n }\n return result;\n };\n\n getTracksFor: (mediaType: VideoPlayerMediaType) => Array<VideoPlayerMediaInfo> =\n // eslint-disable-next-line consistent-return\n (mediaType) => {\n const { shakaPlayer } = this;\n\n if (!shakaPlayer) {\n return [];\n }\n\n switch (mediaType) {\n case VideoPlayerMediaType.Audio:\n return this.mapAudioTracks(shakaPlayer.getAudioLanguagesAndRoles());\n\n case VideoPlayerMediaType.Subtitles:\n return this.mapTextTracks(shakaPlayer.getTextTracks());\n\n case VideoPlayerMediaType.Video:\n return [];\n\n // No default\n }\n };\n\n getMetrics: () => VideoPlayerLiveMetrics | null = () => {\n const { hasVUDrmToken, selectedAudioId, selectedTextId, selectedVideoId, shakaPlayer, tracks } = this;\n\n if (!shakaPlayer) {\n return null;\n }\n\n return {\n shakaMetrics: {\n bufferFullness: shakaPlayer.getBufferFullness(),\n bufferedInfo: shakaPlayer.getBufferedInfo(),\n drmInfo: {\n ...shakaPlayer.drmInfo(),\n hasVUDrmToken,\n },\n selectedTrackIds: {\n audio: selectedAudioId,\n text: selectedTextId,\n video: selectedVideoId,\n },\n stats: shakaPlayer.getStats(),\n tracks: cloneAllTracks(tracks),\n },\n };\n };\n}\n\nexport default PlayerShaka;\n","/* @flow */\n\nimport './Channel.css';\nimport * as React from 'react';\nimport { CHANNEL_IMAGE_HEIGHT, CHANNEL_IMAGE_WIDTH } from '../../../../helpers/ui/constants';\nimport { type ImageUrlType, getImageUrl } from '../../../../redux/netgemApi/actions/v8/metadataImage';\nimport type { Dispatch } from '../../../../redux/types/types';\nimport { Luminosity } from '@ntg/ui/dist/theme';\nimport clsx from 'clsx';\nimport { connect } from 'react-redux';\nimport { ignoreIfAborted } from '../../../../libs/netgemLibrary/helpers/cancellablePromise/promiseHelper';\n\ntype ReduxChannelDispatchToPropsType = {|\n +localGetImageUrl: (data: ImageUrlType, signal?: AbortSignal) => Promise<any>,\n|};\n\ntype ReduxChannelReducerStateType = {||};\n\ntype ChannelPropType = {|\n +id: string,\n +imageId: ?string,\n +isUIDisabled: boolean,\n +name: string,\n +onClick: (id: string) => void,\n|};\n\ntype CompleteChannelPropType = {|\n ...ChannelPropType,\n ...ReduxChannelDispatchToPropsType,\n ...ReduxChannelReducerStateType,\n|};\n\ntype ChannelStateType = {|\n displayChannelName: boolean,\n imageUrl: string,\n|};\n\nconst InitialState = Object.freeze({\n displayChannelName: false,\n imageUrl: '',\n});\n\nclass ChannelView extends React.PureComponent<CompleteChannelPropType, ChannelStateType> {\n abortController: AbortController;\n\n constructor(props: CompleteChannelPropType) {\n super(props);\n\n this.abortController = new AbortController();\n\n this.state = { ...InitialState };\n }\n\n componentDidMount() {\n this.loadImage();\n }\n\n componentWillUnmount() {\n const { abortController } = this;\n\n abortController.abort('Component Channel will unmount');\n }\n\n loadImage = async (): Promise<void> => {\n const { imageId, localGetImageUrl } = this.props;\n const {\n abortController: { signal },\n } = this;\n\n if (!imageId) {\n // Channel (probably a FAST one) without image: display its name\n this.setState({ displayChannelName: true });\n return;\n }\n\n try {\n const imageUrl: string = await localGetImageUrl(\n {\n assetId: imageId,\n height: CHANNEL_IMAGE_HEIGHT,\n luminosity: Luminosity.Light,\n width: CHANNEL_IMAGE_WIDTH,\n },\n signal,\n );\n\n signal.throwIfAborted();\n\n if (imageUrl !== '') {\n this.setState({ imageUrl });\n } else {\n // 404 HTTP code is generally not considered as an error for images but in the particular context of a channel image in the zapper, it is\n this.setState({ displayChannelName: true });\n }\n } catch (error) {\n await ignoreIfAborted(signal, error);\n\n // Error loading channel image: display its name\n this.setState({ displayChannelName: true });\n }\n };\n\n handleOnClick = () => {\n const { id, onClick } = this.props;\n\n onClick(id);\n };\n\n render(): React.Node {\n const { isUIDisabled, name } = this.props;\n const { imageUrl, displayChannelName } = this.state;\n\n return (\n <div className={clsx('channel', isUIDisabled && 'disabled')} onClick={this.handleOnClick}>\n <div className='channelImage' style={{ backgroundImage: `url('${imageUrl}')` }} />\n {displayChannelName ? <div className='channelName'>{name}</div> : null}\n </div>\n );\n }\n}\n\nconst mapDispatchToProps = (dispatch: Dispatch): ReduxChannelDispatchToPropsType => {\n return {\n localGetImageUrl: (data: ImageUrlType, signal?: AbortSignal): Promise<any> => dispatch(getImageUrl(data, signal)),\n };\n};\n\nconst Channel: React.ComponentType<ChannelPropType> = connect(null, mapDispatchToProps, null, { forwardRef: true })(ChannelView);\n\nexport default Channel;\n","/* @flow */\n\nimport './ChannelZapper.css';\nimport * as React from 'react';\nimport type { BasicFunction, Undefined } from '@ntg/utils/dist/types';\nimport type { ChannelMap, NETGEM_API_CHANNEL } from '../../../../libs/netgemLibrary/v8/types/Channel';\nimport { Messenger, MessengerEvents } from '@ntg/utils/dist/messenger';\nimport { PictoArrowDown, PictoArrowUp } from '@ntg/components/dist/pictos/Element';\nimport Channel from './Channel';\nimport type { CombinedReducers } from '../../../../redux/reducers';\nimport { FEATURE_SUBSCRIPTION } from '../../../../redux/appConf/constants';\nimport type { NETGEM_API_V8_RIGHTS } from '../../../../libs/netgemLibrary/v8/types/Rights';\nimport clsx from 'clsx';\nimport { connect } from 'react-redux';\nimport { isChannelPlaybackGranted } from '../../../../helpers/rights/playback';\n\nconst CHANNEL = Object.freeze({\n // Channel change will be effective after this time (in milliseconds). This allows not to send multiple channel changes in a short time\n ChangeDebounceTimeout: 300,\n // If there are strictly fewer channels than this number, the channel list cannot be opened\n CountThreshold: 2,\n // Same value as in CSS\n ImageContainerHeight: 60,\n // Channel list will stay open for that long after the mouse cursor left (in milliseconds)\n ListTimeout: 500,\n});\n\ntype ReduxChannelZapperDispatchToPropsType = {||};\n\ntype ReduxChannelZapperReducerStateType = {|\n +channels: ChannelMap,\n +defaultRights: ?NETGEM_API_V8_RIGHTS,\n +isSubscriptionFeatureEnabled: boolean,\n +userRights: Array<string> | null,\n|};\n\ntype ChannelZapperPropType = {|\n +channelId: ?string,\n +onChannelChangedCallback: (channel: NETGEM_API_CHANNEL) => void,\n|};\n\ntype CompleteChannelZapperPropType = {|\n ...ChannelZapperPropType,\n ...ReduxChannelZapperDispatchToPropsType,\n ...ReduxChannelZapperReducerStateType,\n|};\n\ntype ChannelZapperStateType = {|\n channelElementsArray: Array<React.Node>,\n channelIndex: number,\n isOpen: boolean,\n translateY: number,\n|};\n\nconst InitialState: $ReadOnly<ChannelZapperStateType> = Object.freeze({\n channelElementsArray: [],\n channelIndex: -1,\n isOpen: false,\n translateY: 0,\n});\n\nclass ChannelZapperView extends React.PureComponent<CompleteChannelZapperPropType, ChannelZapperStateType> {\n channelChangeDebounceTimer: TimeoutID | null;\n\n channelCount: number;\n\n channelIds: Array<string>;\n\n channelIndices: Map<string, number>;\n\n channelListTimer: TimeoutID | null;\n\n isUIDisabled: boolean;\n\n savedChannelIndex: ?number;\n\n constructor(props: CompleteChannelZapperPropType) {\n super(props);\n\n this.channelChangeDebounceTimer = null;\n this.channelCount = 0;\n this.channelIds = [];\n this.channelIndices = new Map();\n this.channelListTimer = null;\n this.isUIDisabled = true;\n this.savedChannelIndex = null;\n\n this.state = { ...InitialState };\n }\n\n componentDidMount() {\n const { channelId, channels } = this.props;\n\n this.channelCount = Object.keys(channels)\n .map((key) => channels[key])\n .filter((channel) => !channel.isHidden).length;\n this.isUIDisabled = this.channelCount < CHANNEL.CountThreshold;\n\n this.createChannelElements();\n Messenger.on(MessengerEvents.CLOSE_CHANNEL_LIST, this.closeChannelList);\n\n if (channelId) {\n // A channel Id was passed to the component: use it to initialize\n this.setChannelById(channelId, true);\n } else {\n // No channel Id was passed to the component: select the first channel\n this.setChannelByIndex(0, true);\n }\n }\n\n componentWillUnmount() {\n this.resetChannelChangeDebounceTimer();\n this.resetChannelListTimer();\n Messenger.off(MessengerEvents.CLOSE_CHANNEL_LIST, this.closeChannelList);\n }\n\n resetChannelChangeDebounceTimer = () => {\n if (this.channelChangeDebounceTimer) {\n clearTimeout(this.channelChangeDebounceTimer);\n this.channelChangeDebounceTimer = null;\n }\n };\n\n resetChannelListTimer = () => {\n if (this.channelListTimer) {\n clearTimeout(this.channelListTimer);\n this.channelListTimer = null;\n }\n };\n\n openChannelList = () => {\n const { channelIndex } = this.state;\n const { isUIDisabled } = this;\n\n if (isUIDisabled) {\n return;\n }\n\n this.savedChannelIndex = channelIndex;\n this.setState({ isOpen: true });\n };\n\n closeChannelList = (id?: string) => {\n const { channelIds, savedChannelIndex } = this;\n const savedChannelId = typeof savedChannelIndex === 'number' ? channelIds[savedChannelIndex] : null;\n\n let callback: Undefined<BasicFunction> = undefined;\n\n if (id && id !== savedChannelId) {\n callback = () => this.setChannelById(id, false);\n } else if (typeof savedChannelIndex === 'number') {\n callback = () => this.setChannelByIndex(savedChannelIndex, true);\n }\n\n this.savedChannelIndex = null;\n this.setState({ isOpen: false }, callback);\n };\n\n createChannelElements = () => {\n const { channels, defaultRights, isSubscriptionFeatureEnabled, userRights } = this.props;\n const { channelIds, channelIndices, isUIDisabled } = this;\n const channelElementsArray: Array<React.Node> = [];\n let i = 0;\n\n Object.keys(channels)\n .map((key) => channels[key])\n .sort((c1, c2) => c1.number - c2.number)\n .forEach((channel) => {\n const { consolidated, epgid, info, isHidden, name } = channel;\n\n if (!isHidden && isChannelPlaybackGranted(isSubscriptionFeatureEnabled, info?.rights, defaultRights, userRights)) {\n channelIds.push(epgid);\n channelIndices.set(epgid, i);\n i += 1;\n\n channelElementsArray.push(<Channel id={epgid} imageId={consolidated?.imageId} isUIDisabled={isUIDisabled} key={epgid} name={name} onClick={this.handleChannelOnClick} />);\n }\n });\n\n this.setState({ channelElementsArray });\n };\n\n setChannelByIndex = (newIndex: number, skipNotification: boolean) => {\n this.setState({ channelIndex: newIndex }, () => {\n if (!skipNotification) {\n this.debounceChannelChange(newIndex);\n }\n this.slide();\n });\n };\n\n setChannelById = (id: string, skipNotification: boolean) => {\n const { channelIndices } = this;\n\n const index = channelIndices.get(id);\n if (typeof index === 'number') {\n this.setChannelByIndex(index, skipNotification);\n }\n };\n\n debounceChannelChange = (newIndex: number) => {\n this.resetChannelChangeDebounceTimer();\n this.channelChangeDebounceTimer = setTimeout(this.notifyChannelChange, CHANNEL.ChangeDebounceTimeout, newIndex);\n };\n\n notifyChannelChange = (newIndex: number) => {\n const { channels, onChannelChangedCallback } = this.props;\n const { channelIds } = this;\n\n const channelId = channelIds[newIndex];\n const { [channelId]: channel } = channels;\n\n if (channel) {\n onChannelChangedCallback(channel);\n }\n };\n\n slide = () => {\n const { channelIndex } = this.state;\n\n const translateY = channelIndex * CHANNEL.ImageContainerHeight;\n\n this.setState({ translateY });\n };\n\n handleArrowUpOnClick = () => {\n const { channelIndex, isOpen } = this.state;\n const { channelCount, isUIDisabled } = this;\n\n if (isUIDisabled) {\n return;\n }\n\n this.setChannelByIndex((channelIndex + 1) % channelCount, isOpen);\n };\n\n handleArrowDownOnClick = () => {\n const { channelIndex, isOpen } = this.state;\n const { channelCount, isUIDisabled } = this;\n\n if (isUIDisabled) {\n return;\n }\n\n this.setChannelByIndex((channelIndex + channelCount - 1) % channelCount, isOpen);\n };\n\n handleChannelZapperOnMouseEnter = () => {\n this.resetChannelListTimer();\n };\n\n handleChannelZapperOnMouseLeave = () => {\n const { isOpen } = this.state;\n\n this.resetChannelListTimer();\n\n if (!isOpen) {\n return;\n }\n\n this.channelListTimer = setTimeout(() => {\n this.channelListTimer = null;\n this.closeChannelList();\n }, CHANNEL.ListTimeout);\n };\n\n handleOnWheel = (event: SyntheticWheelEvent<HTMLElement>) => {\n const { deltaY } = event;\n const { isUIDisabled } = this;\n\n if (isUIDisabled) {\n return;\n }\n\n if (deltaY < 0) {\n this.goToNextChannel();\n } else {\n this.goToPreviousChannel();\n }\n };\n\n handleChannelOnClick = (id: string) => {\n const { isOpen } = this.state;\n\n if (isOpen) {\n this.closeChannelList(id);\n } else {\n this.openChannelList();\n }\n };\n\n handleChannelListOpenerOnMouseEnter: () => void = this.openChannelList;\n\n goToPreviousChannel: () => void = this.handleArrowDownOnClick;\n\n goToNextChannel: () => void = this.handleArrowUpOnClick;\n\n render(): React.Node {\n const { channelElementsArray, isOpen, translateY } = this.state;\n const { isUIDisabled } = this;\n\n return (\n <div className={clsx('channelZapper', isOpen && 'open')} onMouseEnter={this.handleChannelZapperOnMouseEnter} onMouseLeave={this.handleChannelZapperOnMouseLeave} onWheel={this.handleOnWheel}>\n <div className={clsx('channelListOpener', isUIDisabled && 'disabled')} onMouseEnter={this.handleChannelListOpenerOnMouseEnter} />\n <div className='channelList'>\n {isOpen ? null : <PictoArrowUp className={clsx(isUIDisabled && 'disabled')} onClick={this.handleArrowUpOnClick} />}\n <div className='channelContainer'>\n <div className='channelSlider' style={{ transform: `translateY(${translateY}px)` }}>\n {channelElementsArray}\n </div>\n </div>\n {isOpen ? null : <PictoArrowDown className={clsx(isUIDisabled && 'disabled')} onClick={this.handleArrowDownOnClick} />}\n </div>\n </div>\n );\n }\n}\n\nconst mapStateToProps = (state: CombinedReducers): ReduxChannelZapperReducerStateType => {\n return {\n channels: state.appConfiguration.deviceChannels,\n defaultRights: state.appConfiguration.rightsDefault,\n isSubscriptionFeatureEnabled: state.appConfiguration.features[FEATURE_SUBSCRIPTION],\n userRights: state.appConfiguration.rightsUser,\n };\n};\n\nconst ChannelZapper: React.ComponentType<ChannelZapperPropType> = connect(mapStateToProps, null, null, { forwardRef: true })(ChannelZapperView);\n\nexport default ChannelZapper;\n","/* @flow */\n\nimport '../ProgressBar.css';\nimport * as React from 'react';\n\ntype EmptyProgressBarPropType = {||};\n\nclass EmptyProgressBarView extends React.PureComponent<EmptyProgressBarPropType> {\n render(): React.Node {\n return (\n <div className='progressBar'>\n <div className='reactiveBackground'>\n <div className='mainContainer' />\n </div>\n </div>\n );\n }\n}\n\nexport default EmptyProgressBarView;\n","/* @flow */\n\nimport '../ProgressBar.css';\nimport './LiveProgressBar.css';\nimport * as React from 'react';\nimport { getDurationDisplay, getTimestampDisplay, showDebug } from '../../../../../helpers/debug/debug';\nimport AccurateTimestamp from '../../../../../helpers/dateTime/AccurateTimestamp';\nimport { PictoDot } from '@ntg/components/dist/pictos/Element';\nimport clsx from 'clsx';\nimport { formatTimeFromSeconds } from '../../../../../helpers/dateTime/Format';\nimport { getBoundedValue } from '../../../../../helpers/maths/maths';\n\ntype LiveProgressBarPropType = {|\n +isTimeshiftEnabled: boolean,\n +liveBufferLength: number,\n +liveProgramEndTime: number,\n +liveProgramStartTime: number,\n +onSeekChanged: (time: number) => void,\n +playheadPosition: number,\n|};\n\ntype LiveProgressBarStateType = {|\n canSeek: boolean,\n currentTimePosition: number,\n displayedTime: string,\n dragDelta: number,\n hoverPosition: number,\n hoverTime: number | null,\n isThumbDragged: boolean,\n // True when playhead has been dragged, and we're waiting for current seek position to be updated\n isWaitingForCurrentPositionUpdate: boolean,\n percentAvailable: number,\n percentProgress: number,\n percentStartProgressBar: number,\n|};\n\nconst InitialState = Object.freeze({\n canSeek: false,\n currentTimePosition: 0,\n displayedTime: '',\n dragDelta: 0,\n hoverPosition: 0,\n hoverTime: null,\n isThumbDragged: false,\n isWaitingForCurrentPositionUpdate: false,\n percentAvailable: 0,\n percentProgress: 0,\n percentStartProgressBar: 0,\n});\n\n// When timeshift is disabled, hovering the progress bar at now -/+ LIVE_THRESHOLD displays the time badge (in seconds)\nconst LIVE_THRESHOLD = 4;\n\n// When live player is paused, time is updated every second\nconst LIVE_TIME_UPDATE_TIMEOUT = 1_000;\n\nconst ONE_HUNDRED = 100;\n\nclass LiveProgressBar extends React.PureComponent<LiveProgressBarPropType, LiveProgressBarStateType> {\n initialSeekPosition: number;\n\n initialTimeStamp: number;\n\n liveTimeUpdateInterval: IntervalID | null;\n\n mainContainer: HTMLElement | null;\n\n programDuration: number;\n\n programEnd: number;\n\n programStart: number;\n\n constructor(props: LiveProgressBarPropType) {\n super(props);\n\n const { isTimeshiftEnabled, liveBufferLength } = props;\n\n this.initialSeekPosition = 0;\n this.initialTimeStamp = 0;\n this.liveTimeUpdateInterval = null;\n this.mainContainer = null;\n this.programDuration = 0;\n this.programEnd = 0;\n this.programStart = 0;\n\n this.state = { ...InitialState };\n\n this.state = {\n ...InitialState,\n canSeek: isTimeshiftEnabled && liveBufferLength > 0,\n };\n }\n\n componentDidMount() {\n this.initialize();\n }\n\n componentDidUpdate(prevProps: LiveProgressBarPropType) {\n const { isTimeshiftEnabled, liveBufferLength, playheadPosition } = this.props;\n const { isTimeshiftEnabled: prevIsTimeshiftEnabled, liveBufferLength: prevLiveBufferLength, playheadPosition: prevPlayheadPosition } = prevProps;\n\n this.updateProgressBar();\n\n if (playheadPosition === prevPlayheadPosition && liveBufferLength === prevLiveBufferLength) {\n return;\n }\n\n if (isTimeshiftEnabled !== prevIsTimeshiftEnabled || liveBufferLength !== prevLiveBufferLength) {\n this.updateCanSeek(liveBufferLength);\n }\n\n if (playheadPosition !== prevPlayheadPosition) {\n if (prevPlayheadPosition <= 0) {\n this.initialize();\n }\n\n this.onPlayheadChanged();\n }\n }\n\n componentWillUnmount() {\n this.resetLiveTimeUpdateInterval();\n\n window.removeEventListener('mousemove', this.handleThumbMouseMove, { capture: true });\n window.removeEventListener('mouseup', this.handleThumbMouseUp, { capture: true });\n }\n\n showDebugInfo = () => {\n const {\n initialSeekPosition,\n initialTimeStamp,\n programDuration,\n programEnd,\n programStart,\n props: { liveBufferLength, liveProgramEndTime, liveProgramStartTime, playheadPosition },\n state,\n state: { currentTimePosition, hoverTime },\n } = this;\n\n showDebug('Standard progress bar', {\n misc: {\n currentTimePosition: getTimestampDisplay(currentTimePosition),\n hoverTime: getDurationDisplay(hoverTime),\n initialSeekPosition: getTimestampDisplay(initialSeekPosition),\n initialTimeStamp: getTimestampDisplay(initialTimeStamp),\n liveBufferLength: getDurationDisplay(liveBufferLength),\n liveProgramEndTime: getTimestampDisplay(liveProgramEndTime),\n liveProgramStartTime: getTimestampDisplay(liveProgramStartTime),\n playheadPosition: getTimestampDisplay(playheadPosition),\n programDuration: getDurationDisplay(programDuration),\n programEnd: getTimestampDisplay(programEnd),\n programStart: getTimestampDisplay(programStart),\n },\n state,\n stateFields: ['canSeek', 'displayedTime', 'dragDelta', 'hoverPosition', 'isThumbDragged', 'isWaitingForCurrentPositionUpdate', 'percentAvailable', 'percentProgress', 'percentStartProgressBar'],\n });\n };\n\n onPlayheadChanged = () => {\n this.setState({ isWaitingForCurrentPositionUpdate: false });\n };\n\n initialize = () => {\n const { playheadPosition } = this.props;\n\n if (playheadPosition > 0) {\n // Player initialized\n this.initialTimeStamp = AccurateTimestamp.nowInSeconds();\n this.initialSeekPosition = playheadPosition;\n } else {\n // Player not initialized yet\n this.initialTimeStamp = 0;\n this.initialSeekPosition = 0;\n this.programDuration = 0;\n this.programStart = 0;\n this.programEnd = 0;\n\n this.setState({ percentProgress: 0 });\n }\n\n if (this.liveTimeUpdateInterval === null) {\n this.liveTimeUpdateInterval = setInterval(this.updateLiveTime, LIVE_TIME_UPDATE_TIMEOUT);\n }\n };\n\n resetLiveTimeUpdateInterval: () => void = () => {\n if (this.liveTimeUpdateInterval) {\n clearInterval(this.liveTimeUpdateInterval);\n this.liveTimeUpdateInterval = null;\n }\n };\n\n updateLiveTime: () => void = () => {\n const { initialSeekPosition, initialTimeStamp } = this;\n\n const delta = AccurateTimestamp.nowInSeconds() - initialTimeStamp;\n this.setState({ currentTimePosition: initialSeekPosition + delta });\n };\n\n updateCanSeek = (liveBufferLength: number) => {\n const { isTimeshiftEnabled } = this.props;\n\n this.setState({ canSeek: isTimeshiftEnabled && liveBufferLength > 0 });\n };\n\n updateProgressBar = () => {\n const { liveBufferLength, playheadPosition } = this.props;\n const { canSeek, isWaitingForCurrentPositionUpdate, isThumbDragged, currentTimePosition } = this.state;\n const { programDuration, programStart } = this;\n\n if (isWaitingForCurrentPositionUpdate) {\n // Skip calculation until playheadPosition is updated (avoid playhead jumps after dragging it)\n return;\n }\n\n if (isThumbDragged) {\n this.updateAvailableBar();\n return;\n }\n\n let percentProgress = getBoundedValue(((playheadPosition - programStart) * ONE_HUNDRED) / programDuration);\n let percentStartProgressBar = 0;\n\n if (canSeek) {\n // Progress bar start will be greater than 0 when the elapsed duration of the program is greater than the timeshift buffer depth\n const leftOffset = currentTimePosition - liveBufferLength - programStart;\n percentStartProgressBar = leftOffset > 0 ? (leftOffset * ONE_HUNDRED) / programDuration : 0;\n\n percentProgress -= Math.max(0, percentStartProgressBar);\n } else {\n // Timeshift is not available: display simple progress bar\n percentStartProgressBar = 0;\n }\n\n this.setState(\n {\n percentProgress,\n percentStartProgressBar,\n },\n () => this.updateAvailableBar(),\n );\n };\n\n updateAvailableBar = () => {\n const { liveBufferLength, liveProgramEndTime, liveProgramStartTime } = this.props;\n const { currentTimePosition, percentStartProgressBar } = this.state;\n const { initialSeekPosition, initialTimeStamp } = this;\n\n let percentAvailable = 0;\n\n if (liveProgramStartTime && liveProgramEndTime) {\n // Start and end of program are known\n this.programDuration = liveProgramEndTime - liveProgramStartTime;\n this.programStart = initialSeekPosition + (liveProgramStartTime - initialTimeStamp);\n this.programEnd = initialSeekPosition + (liveProgramEndTime - initialTimeStamp);\n\n if (currentTimePosition > this.programEnd) {\n // Ensure we don't overshoot\n percentAvailable = ONE_HUNDRED;\n } else {\n percentAvailable = ((currentTimePosition - this.programStart) * ONE_HUNDRED) / this.programDuration;\n\n if (this.programStart < currentTimePosition - liveBufferLength) {\n // Program started outside the live buffer window\n percentAvailable -= percentStartProgressBar;\n }\n\n if (percentStartProgressBar + percentAvailable > ONE_HUNDRED) {\n // Calculation error: let's reduce it a bit\n percentAvailable = ONE_HUNDRED - percentStartProgressBar;\n }\n }\n } else {\n // Start and end of program are unknown\n this.programDuration = liveBufferLength;\n this.programEnd = currentTimePosition;\n this.programStart = this.programEnd - liveBufferLength;\n percentAvailable = ONE_HUNDRED;\n }\n\n this.setState({ percentAvailable });\n };\n\n // Given value is the difference between wanted position and current position (negative value means going backward, positive means forward)\n seekTo = (value: number) => {\n const { onSeekChanged } = this.props;\n\n onSeekChanged(value);\n };\n\n // Returned value 'hoverTime' is the time relative to the start of the program\n getHoverTimeFromMousePosition = (clientX: number): {| hoverTime: number, mousePosition: number |} => {\n const { mainContainer } = this;\n\n let hoverTime = 0;\n let mousePosition = 0;\n\n if (mainContainer) {\n const { left } = mainContainer.getBoundingClientRect();\n mousePosition = clientX - left;\n const { offsetWidth } = mainContainer;\n hoverTime = (this.programDuration * mousePosition) / offsetWidth;\n }\n\n return {\n hoverTime,\n mousePosition,\n };\n };\n\n handleMainContainerOnClick = (event: SyntheticMouseEvent<HTMLElement>): void => {\n const { playheadPosition } = this.props;\n const { canSeek, hoverTime, isWaitingForCurrentPositionUpdate } = this.state;\n const { programStart } = this;\n const { altKey, ctrlKey } = event;\n\n if (ctrlKey || altKey) {\n this.showDebugInfo();\n return;\n }\n\n if (!canSeek || isWaitingForCurrentPositionUpdate) {\n return;\n }\n\n if (hoverTime) {\n const delta = hoverTime - playheadPosition + programStart;\n this.seekTo(delta);\n }\n };\n\n handleMouseMove = (event: SyntheticMouseEvent<HTMLElement>) => {\n const { liveBufferLength, liveProgramStartTime } = this.props;\n const { canSeek } = this.state;\n const { clientX } = event;\n\n const { hoverTime, mousePosition } = this.getHoverTimeFromMousePosition(clientX);\n\n const absoluteHoverTime = liveProgramStartTime + hoverTime;\n\n // Difference between live time and time where mouse cursor is\n const liveDelta = absoluteHoverTime - AccurateTimestamp.nowInSeconds();\n\n // If timeshift is enabled, the time badge is displayed when the mouse cursor is between live position and timeshift buffer start, otherwise a short span is used\n const liveTimeRef = canSeek ? liveBufferLength : LIVE_THRESHOLD;\n\n if (-liveTimeRef <= liveDelta && liveDelta <= LIVE_THRESHOLD) {\n // Mouse cursor is over a seekable point\n this.displayTimeBadge(mousePosition, hoverTime);\n } else {\n this.handleMouseLeave();\n }\n };\n\n displayTimeBadge = (mousePosition: number, hoverTime: number) => {\n const { liveProgramStartTime } = this.props;\n\n this.setState({\n displayedTime: formatTimeFromSeconds(liveProgramStartTime + hoverTime),\n hoverPosition: mousePosition,\n hoverTime,\n });\n };\n\n handleMouseLeave = () => {\n this.setState({\n displayedTime: '',\n hoverPosition: 0,\n hoverTime: null,\n });\n };\n\n // Start playhead dragging\n handleThumbMouseDown = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => {\n const { canSeek } = this.state;\n\n if (!canSeek) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n this.setState({ isThumbDragged: true });\n\n window.addEventListener('mousemove', this.handleThumbMouseMove, { capture: true });\n window.addEventListener('mouseup', this.handleThumbMouseUp, { capture: true });\n };\n\n handleThumbMouseMove = (event: SyntheticMouseEvent<HTMLElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n const { liveProgramStartTime, playheadPosition } = this.props;\n const { isThumbDragged, percentStartProgressBar } = this.state;\n const { programDuration, programStart } = this;\n const { clientX } = event;\n\n if (!isThumbDragged) {\n // Shouldn't be possible since handleThumbMouseMove is not defined when isThumbDragged is false, but what do we know?\n return;\n }\n\n const { hoverTime, mousePosition } = this.getHoverTimeFromMousePosition(clientX);\n const absoluteHoverTime = liveProgramStartTime + hoverTime;\n\n if (absoluteHoverTime > AccurateTimestamp.nowInSeconds()) {\n // We cannot timeshift in the future (or can we?)\n return;\n }\n\n const dragDelta = hoverTime - playheadPosition + programStart;\n const percentProgress = getBoundedValue((hoverTime * ONE_HUNDRED) / programDuration - percentStartProgressBar);\n\n this.setState({\n dragDelta,\n percentProgress,\n });\n\n this.displayTimeBadge(mousePosition, hoverTime);\n };\n\n // Stop playhead dragging\n handleThumbMouseUp = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n this.performSeek();\n\n this.setState({\n dragDelta: 0,\n isThumbDragged: false,\n isWaitingForCurrentPositionUpdate: true,\n });\n\n window.removeEventListener('mousemove', this.handleThumbMouseMove, { capture: true });\n window.removeEventListener('mouseup', this.handleThumbMouseUp, { capture: true });\n };\n\n performSeek = () => {\n const { dragDelta } = this.state;\n\n this.seekTo(dragDelta);\n };\n\n renderAvailableBar = (): React.Node => {\n const { percentAvailable, percentStartProgressBar } = this.state;\n\n return (\n <div\n className='available'\n style={{\n left: `${percentStartProgressBar}%`,\n width: `${percentAvailable}%`,\n }}\n />\n );\n };\n\n renderProgressBar = (): React.Node => {\n const { canSeek, isThumbDragged, percentProgress, percentStartProgressBar } = this.state;\n\n return (\n <div\n className='progress'\n style={{\n left: `${percentStartProgressBar}%`,\n width: `${percentProgress}%`,\n }}\n >\n <PictoDot className={clsx('thumb', isThumbDragged && 'dragged')} draggable={canSeek} onMouseDown={this.handleThumbMouseDown} />\n </div>\n );\n };\n\n renderTimeBadge = (): React.Node => {\n const { hoverPosition, displayedTime } = this.state;\n\n if (displayedTime === '') {\n return null;\n }\n\n return (\n <div className='timeBadge' draggable={false} style={{ transform: `translateX(calc(${hoverPosition}px - 50%))` }}>\n {displayedTime}\n </div>\n );\n };\n\n render(): React.Node {\n const { hoverTime } = this.state;\n\n return (\n <div className='progressBar live'>\n <div className='reactiveBackground'>\n <div\n className={clsx('mainContainer', hoverTime ? 'hoveredGood' : 'hoveredBad')}\n onClick={this.handleMainContainerOnClick}\n onMouseLeave={this.handleMouseLeave}\n onMouseMove={this.handleMouseMove}\n ref={(instance) => {\n this.mainContainer = instance;\n }}\n >\n {this.renderAvailableBar()}\n {this.renderProgressBar()}\n {this.renderTimeBadge()}\n </div>\n </div>\n </div>\n );\n }\n}\n\nexport default (LiveProgressBar: React.ComponentType<LiveProgressBarPropType>);\n","/* @flow */\n\nimport './Options.css';\nimport * as React from 'react';\nimport { PictoArrowLeft, PictoCheck, PictoHearingImpaired, PictoLeaf } from '@ntg/components/dist/pictos/Element';\nimport { convertToHumanReadable, isHearingImpairedSubtitlesTrack, isVisuallyImpairedAudioTrack } from '../../../../helpers/ui/language';\nimport type { BasicFunction } from '@ntg/utils/dist/types';\nimport type { CombinedReducers } from '../../../../redux/reducers';\nimport type { Dispatch } from '../../../../redux/types/types';\nimport { ExtendedItemType } from '../../../../helpers/ui/item/types';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport { Setting } from '../../../../helpers/settings/types';\nimport { type SettingValueType } from '../../../settings/SettingsConstsAndTypes';\nimport { type VideoPlayerMediaInfo } from '../../implementation/types';\nimport clsx from 'clsx';\nimport { connect } from 'react-redux';\nimport { updateSetting } from '../../../../redux/ui/actions';\n\nenum OptionsType {\n Audio,\n Subtitles,\n}\n\ntype OPTIONS_AND_SELECTION_TYPE = {|\n optionsElement: React.Node,\n selectionElement: React.Node,\n|};\n\ntype ReduxOptionsDispatchToPropsType = {|\n +localUpdateSetting: (setting?: Setting, value: SettingValueType) => Promise<any>,\n|};\n\ntype ReduxOptionsReducerStateType = {|\n +isBitrateLimited: boolean,\n +isMaxBitrateAllowed: boolean,\n|};\n\ntype OptionsPropType = {|\n +audioMediaInfo: Array<VideoPlayerMediaInfo>,\n +itemType: ExtendedItemType,\n +onMouseEnter: BasicFunction,\n +onMouseLeave: BasicFunction,\n +onNewAudioTrackSelected: (index: number) => void,\n +onNewSubtitlesTrackSelected: (index: number) => void,\n +selectedAudioMediaInfo: number,\n +selectedSubtitlesMediaInfo: number,\n +subtitlesMediaInfo: Array<VideoPlayerMediaInfo>,\n|};\n\ntype CompleteOptionsPropType = {|\n ...OptionsPropType,\n ...ReduxOptionsDispatchToPropsType,\n ...ReduxOptionsReducerStateType,\n|};\n\ntype OptionsStateType = {|\n displayedOptions: OptionsType | null,\n|};\n\nclass OptionsView extends React.PureComponent<CompleteOptionsPropType, OptionsStateType> {\n constructor(props: CompleteOptionsPropType) {\n super(props);\n this.state = { displayedOptions: null };\n }\n\n handleAudioOnClick = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>): void => {\n event.preventDefault();\n event.stopPropagation();\n\n this.toggleOptions(OptionsType.Audio);\n };\n\n handleSubtitlesOnClick = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>): void => {\n event.preventDefault();\n event.stopPropagation();\n\n this.toggleOptions(OptionsType.Subtitles);\n };\n\n toggleOptions = (optionsType: OptionsType): void => {\n const { displayedOptions: currentDisplayedOptions } = this.state;\n const displayedOptions = optionsType === currentDisplayedOptions ? null : optionsType;\n\n this.setState({ displayedOptions });\n };\n\n handleNewAudioTrackOnClick = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>): void => {\n event.preventDefault();\n event.stopPropagation();\n\n const { onNewAudioTrackSelected, selectedAudioMediaInfo } = this.props;\n this.handleNewOptionSelected(event, onNewAudioTrackSelected, selectedAudioMediaInfo);\n };\n\n handleNewSubtitlesTrackOnClick = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>): void => {\n event.preventDefault();\n event.stopPropagation();\n\n const { onNewSubtitlesTrackSelected, selectedSubtitlesMediaInfo } = this.props;\n this.handleNewOptionSelected(event, onNewSubtitlesTrackSelected, selectedSubtitlesMediaInfo);\n };\n\n handleNewOptionSelected = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>, newOptionSelected: (index: number) => void, currentSelection: number): void => {\n const { currentTarget } = event;\n\n // Get track index from HTML element or from its parent\n let id = currentTarget.getAttribute('data-id');\n if (id === null || id === '') {\n const { parentElement } = currentTarget;\n if (parentElement) {\n id = parentElement.getAttribute('data-id');\n }\n }\n\n // Empty string is magically converted to 0\n if (id !== null && id !== '' && !isNaN(id)) {\n const idNumber = Number(id);\n if (idNumber !== currentSelection) {\n newOptionSelected(idNumber);\n }\n }\n };\n\n getCurrentAudio = (): {| currentAudio: string | null, isVisuallyImpaired: boolean |} => {\n const { audioMediaInfo, selectedAudioMediaInfo } = this.props;\n\n const currentAudioMediaInfo = audioMediaInfo.find((elt) => elt.index === selectedAudioMediaInfo) ?? null;\n\n return {\n currentAudio: currentAudioMediaInfo ? convertToHumanReadable(currentAudioMediaInfo.lang) : null,\n isVisuallyImpaired: isVisuallyImpairedAudioTrack(currentAudioMediaInfo),\n };\n };\n\n getCurrentSubtitles = (): {| currentSubtitles: string | null, isHearingImpaired: boolean |} => {\n const { subtitlesMediaInfo, selectedSubtitlesMediaInfo } = this.props;\n\n const currentSubtitlesMediaInfo = subtitlesMediaInfo.find((elt) => elt.index === selectedSubtitlesMediaInfo) ?? null;\n\n return {\n currentSubtitles: currentSubtitlesMediaInfo ? convertToHumanReadable(currentSubtitlesMediaInfo.lang) : null,\n isHearingImpaired: isHearingImpairedSubtitlesTrack(currentSubtitlesMediaInfo),\n };\n };\n\n buildAudioMediaInfoList = (): Array<React.Node> => {\n const { audioMediaInfo, selectedAudioMediaInfo } = this.props;\n\n const audioMediaInfoList: Array<React.Node> = [];\n for (let i = 0; i < audioMediaInfo.length; i++) {\n const { [i]: audio } = audioMediaInfo;\n const { index, lang } = audio;\n const audioIndicator = index === selectedAudioMediaInfo ? <PictoCheck className='cell' /> : <div className='cell' />;\n\n audioMediaInfoList.push(\n <div className='option' data-id={index} key={index} onClick={this.handleNewAudioTrackOnClick}>\n {audioIndicator}\n <div className='cell optionLabel'>{convertToHumanReadable(lang)}</div>\n </div>,\n );\n }\n\n return audioMediaInfoList;\n };\n\n buildSubtitlesMediaInfoList = (): Array<React.Node> => {\n const { subtitlesMediaInfo, selectedSubtitlesMediaInfo } = this.props;\n\n if (subtitlesMediaInfo.length === 0) {\n return [];\n }\n\n const subtitlesMediaInfoList: Array<React.Node> = [\n <div className='option' data-id={-1} key='-1' onClick={this.handleNewSubtitlesTrackOnClick}>\n {selectedSubtitlesMediaInfo < 0 ? <PictoCheck className='cell' /> : <div className='cell' />}\n <div className='cell optionLabel'>{Localizer.localize('player.subtitles.none')}</div>\n </div>,\n ];\n\n for (let i = 0; i < subtitlesMediaInfo.length; ++i) {\n const { [i]: subtitles } = subtitlesMediaInfo;\n const { index, lang } = subtitles;\n const subtitlesIndicator = index === selectedSubtitlesMediaInfo ? <PictoCheck className='cell' /> : <div className='cell' />;\n\n const hearingImpairedElt = isHearingImpairedSubtitlesTrack(subtitles) ? <PictoHearingImpaired className='impaired' /> : null;\n\n subtitlesMediaInfoList.push(\n <div className='option' data-id={index} key={index} onClick={this.handleNewSubtitlesTrackOnClick}>\n {subtitlesIndicator}\n <div className='cell optionLabel'>\n {convertToHumanReadable(lang)}\n {hearingImpairedElt}\n </div>\n </div>,\n );\n }\n\n return subtitlesMediaInfoList;\n };\n\n renderAudio = (): OPTIONS_AND_SELECTION_TYPE => {\n const audioMediaInfoList = this.buildAudioMediaInfoList();\n\n if (audioMediaInfoList.length <= 1) {\n // 0 or 1 audio stream: no choice for the user\n return {\n optionsElement: null,\n selectionElement: null,\n };\n }\n\n const { currentAudio } = this.getCurrentAudio();\n\n return this.renderSelectionAndOptions(OptionsType.Audio, audioMediaInfoList, Localizer.localize('player.options.audio'), currentAudio, null, this.handleAudioOnClick);\n };\n\n renderSubtitles = (): OPTIONS_AND_SELECTION_TYPE => {\n const subtitlesMediaInfoList = this.buildSubtitlesMediaInfoList();\n\n if (subtitlesMediaInfoList.length === 0) {\n // 0 subtitles stream: no choice for the user\n return {\n optionsElement: null,\n selectionElement: null,\n };\n }\n\n const { isHearingImpaired, currentSubtitles } = this.getCurrentSubtitles();\n const hearingImpairedElt = isHearingImpaired ? <PictoHearingImpaired className='impaired' /> : null;\n\n return this.renderSelectionAndOptions(\n OptionsType.Subtitles,\n subtitlesMediaInfoList,\n Localizer.localize('player.options.subtitles'),\n currentSubtitles ?? Localizer.localize('player.subtitles.none'),\n hearingImpairedElt,\n this.handleSubtitlesOnClick,\n );\n };\n\n renderSelectionAndOptions = (\n optionsType: OptionsType,\n optionsList: Array<React.Node>,\n label: string,\n selection: string | null,\n impairedPicto: React.Node,\n clickCallback: (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => void,\n ): OPTIONS_AND_SELECTION_TYPE => {\n const { displayedOptions } = this.state;\n\n const optionsElement = <div className={clsx('optionsContainer', optionsType === displayedOptions && 'visible')}>{optionsList}</div>;\n\n const selectionElement = (\n <div className={clsx('selection', optionsType === displayedOptions && 'highlighted')} onClick={clickCallback}>\n <PictoArrowLeft className='cell' forceHoverEffect />\n <div className='cell selectionTitle'>{label}</div>\n <div className='cell selectionInfo'>\n {selection}\n {impairedPicto}\n </div>\n </div>\n );\n\n return {\n optionsElement,\n selectionElement,\n };\n };\n\n handleLimitBitrateOnClick = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>): void => {\n event.preventDefault();\n event.stopPropagation();\n\n const { isBitrateLimited, localUpdateSetting } = this.props;\n\n localUpdateSetting(Setting.GreenStreaming, !isBitrateLimited);\n };\n\n renderGreenStreamingOption = (): React.Node => {\n const { isBitrateLimited, isMaxBitrateAllowed, itemType } = this.props;\n\n if (!isMaxBitrateAllowed || itemType === ExtendedItemType.OfflineContent) {\n return null;\n }\n\n return (\n <div className='selection greenStreaming' onClick={this.handleLimitBitrateOnClick}>\n {isBitrateLimited ? <PictoCheck className='cell' /> : <div className='cell' />}\n <div className='cell selectionTitle'>\n {Localizer.localize('settings.audio_video.green_streaming.label')}\n <PictoLeaf className='leaf' />\n </div>\n </div>\n );\n };\n\n render(): React.Node {\n const { onMouseEnter, onMouseLeave } = this.props;\n const { optionsElement: audioOptions, selectionElement: audioSelection } = this.renderAudio();\n const { optionsElement: subtitlesOptions, selectionElement: subtitlesSelection } = this.renderSubtitles();\n\n return (\n <div className='options' onMouseEnter={onMouseEnter} onMouseLeave={onMouseLeave}>\n {audioOptions}\n {subtitlesOptions}\n {audioSelection}\n {subtitlesSelection}\n {this.renderGreenStreamingOption()}\n </div>\n );\n }\n}\n\nconst mapStateToProps = (state: CombinedReducers): ReduxOptionsReducerStateType => {\n return {\n isBitrateLimited: state.ui.settings[Setting.GreenStreaming],\n isMaxBitrateAllowed: state.appConfiguration.isMaxBitrateAllowed,\n };\n};\n\nconst mapDispatchToProps = (dispatch: Dispatch): ReduxOptionsDispatchToPropsType => {\n return {\n localUpdateSetting: (setting?: Setting, value: SettingValueType) => dispatch(updateSetting(setting, value)),\n };\n};\n\nconst Options: React.ComponentType<OptionsPropType> = connect(mapStateToProps, mapDispatchToProps, null, { forwardRef: true })(OptionsView);\n\nexport default Options;\n","/* @flow */\n\nimport './Volume.css';\nimport * as React from 'react';\nimport { PictoVolume, PictoVolumeDown, PictoVolumeMute, PictoVolumeUp } from '@ntg/components/dist/pictos/Element';\nimport type { BasicFunction } from '@ntg/utils/dist/types';\nimport { getBoundedValue } from '../../../../helpers/maths/maths';\n\nconst ONE_HUNDRED = 100;\n\n/* eslint-disable no-magic-numbers */\nconst VOLUME = Object.freeze({\n BarCount: 5,\n BarLimits: Object.freeze([0, 0.25, 0.45, 0.7, 0.9]),\n MiddleValue: 0.5,\n});\n/* eslint-enable no-magic-numbers */\n\ntype DefaultProps = {|\n +onVolumeClickCallback?: BasicFunction,\n +onVolumeControllerClickCallback?: (volume: number) => void,\n|};\n\ntype PlayerVolumePropType = {|\n ...DefaultProps,\n +isDisabled: boolean,\n +isMuted: boolean,\n +volume: number,\n|};\n\ntype PlayerVolumeStateType = {||};\n\nclass PlayerVolume extends React.PureComponent<PlayerVolumePropType, PlayerVolumeStateType> {\n volumeController: HTMLElement | null;\n\n static defaultProps: DefaultProps = {\n onVolumeClickCallback: undefined,\n onVolumeControllerClickCallback: undefined,\n };\n\n constructor(...args: Array<any>) {\n super(...args);\n\n this.volumeController = null;\n }\n\n handleVolumeControllerOnClick = (event: SyntheticMouseEvent<HTMLElement>): void => {\n const { isDisabled, onVolumeControllerClickCallback } = this.props;\n const { volumeController } = this;\n\n if (isDisabled || !onVolumeControllerClickCallback || !volumeController) {\n return;\n }\n\n const { clientX } = event;\n const { left, width } = volumeController.getBoundingClientRect();\n const mousePosX = clientX - left;\n const newVolumeValue = getBoundedValue(Math.round((mousePosX * ONE_HUNDRED) / width) / ONE_HUNDRED, 0, 1);\n onVolumeControllerClickCallback(newVolumeValue);\n };\n\n handleVolumeOnClick: () => void = () => {\n const { isDisabled, onVolumeClickCallback } = this.props;\n\n if (isDisabled || !onVolumeClickCallback) {\n return;\n }\n\n onVolumeClickCallback();\n };\n\n render(): React.Node {\n const { isDisabled, isMuted, volume } = this.props;\n\n const volumeBarClasses = Array(VOLUME.BarCount).fill('volumeBar');\n\n if (!isMuted && !isDisabled) {\n VOLUME.BarLimits.forEach((limit, i) => {\n if (volume >= limit) {\n volumeBarClasses[i] += ' active';\n }\n });\n }\n\n let pictoVolumeDown = null;\n let pictoVolumeUp = null;\n let pictoVolumeMuted = null;\n\n if (!isMuted) {\n if (volume > 0 && volume < VOLUME.MiddleValue) {\n // Display picto with 1 sound wave\n pictoVolumeDown = <PictoVolumeDown className='pictoVolumeDown' forceHoverEffect isDisabled={isDisabled} />;\n } else if (volume >= VOLUME.MiddleValue) {\n // Display picto with 2 sound waves\n pictoVolumeUp = <PictoVolumeUp className='pictoVolumeUp' forceHoverEffect isDisabled={isDisabled} />;\n }\n } else {\n // Display picto with cross\n pictoVolumeMuted = <PictoVolumeMute className='pictoVolumeMuted' forceHoverEffect isDisabled={isDisabled} />;\n }\n\n /* eslint-disable react/no-array-index-key */\n return (\n <div className='playerVolumeContainer'>\n {pictoVolumeDown}\n {pictoVolumeUp}\n {pictoVolumeMuted}\n <PictoVolume isDisabled={isDisabled} onClick={this.handleVolumeOnClick} />\n <div\n className='volumeController'\n onClick={this.handleVolumeControllerOnClick}\n ref={(instance) => {\n this.volumeController = instance;\n }}\n >\n {volumeBarClasses.map((barClass, i) => (\n <div className={barClass} key={i} />\n ))}\n </div>\n </div>\n );\n /* eslint-enable react/no-array-index-key */\n }\n}\n\nexport default (PlayerVolume: React.ComponentType<PlayerVolumePropType>);\n","/* @flow */\n\nimport '../ProgressBar.css';\nimport './StandardProgressBar.css';\nimport * as React from 'react';\nimport { getBoundedValue, getRealPercentage } from '../../../../../helpers/maths/maths';\nimport { getDurationDisplay, getTimeRangesAsString, getTimestampDisplay, showDebug } from '../../../../../helpers/debug/debug';\nimport AccurateTimestamp from '../../../../../helpers/dateTime/AccurateTimestamp';\nimport { DRAG_TIMEOUT_DELAY } from '../Common';\nimport { PictoDot } from '@ntg/components/dist/pictos/Element';\nimport { formatSecondsToHHMMSS } from '../../../../../helpers/dateTime/Format';\n\n/*\n * Role of the props:\n *\n * Case 1: program fully recorded\n * +-------------------------+---+-----------------------+---+---------------------+\n * +-------- startMargin --------+ program +------- endMargin -------+\n * +-- userViewStartOffset --+ user view window +- userViewEndOffset -+\n *\n * Case 2: program partially recorded\n * +---------------------+---+---------------------------+---+---------------------+\n * +---- startMargin ----+ program +------- endMargin -------+\n * +-- userViewStartOffset --+ user view window +- userViewEndOffset -+\n */\n\n/*\n * To avoid the case where the progress bar is mostly filled with margins (think 5-minute programs),\n * start and end margins always represent 10% and 20% of the progress bar\n */\nconst PERCENT_START_MARGIN = 0.1;\nconst PERCENT_END_MARGIN = 0.2;\n\n// Small amount of time used to compare target time to now when navigating in an in-progress recording (in seconds)\nconst LIVE_DELTA = 5;\n\ntype PartsWidth = {|\n contentWidth: number,\n endMarginWidth: number,\n startMarginWidth: number,\n|};\n\ntype StandardProgressBarPropType = {|\n +bufferedTimeRanges: TimeRanges | null,\n +duration: number,\n +endMargin: number,\n +endTime: number,\n +isLiveRecording: boolean,\n +onPlayingInMargin: (value: boolean) => void,\n +onSeekChanged: (time: number) => void,\n +playheadPosition: number,\n +realEnd: number,\n +realStart: number,\n +startMargin: number,\n +startTime: number,\n +totalDuration: number,\n +userViewEndOffset: number,\n +userViewStartOffset: number,\n|};\n\ntype StandardProgressBarStateType = {|\n availableBarWidth: string | null,\n bufferedBarWidth: number | null,\n hoverPosition: number,\n hoverTime: string | null,\n isHoveringMargin: boolean,\n isThumbDragged: boolean,\n progressBarWidth: number | null,\n|};\n\nconst InitialState = Object.freeze({\n availableBarWidth: null,\n bufferedBarWidth: null,\n hoverPosition: 0,\n hoverTime: null,\n isHoveringMargin: false,\n isThumbDragged: false,\n progressBarWidth: null,\n});\n\nclass StandardProgressBar extends React.PureComponent<StandardProgressBarPropType, StandardProgressBarStateType> {\n dragSeekPosition: number;\n\n dragTimer: TimeoutID | null;\n\n mainContainer: HTMLElement | null;\n\n // Only used when dragging progress bar thumb\n realDuration: number;\n\n constructor(props: StandardProgressBarPropType) {\n super(props);\n\n this.dragSeekPosition = 0;\n this.dragTimer = null;\n this.mainContainer = null;\n this.realDuration = 0;\n\n this.state = { ...InitialState };\n }\n\n componentDidUpdate(prevProps: StandardProgressBarPropType) {\n const { bufferedTimeRanges, duration, endMargin, playheadPosition, startMargin, totalDuration, userViewEndOffset, userViewStartOffset } = this.props;\n const {\n bufferedTimeRanges: prevBufferedTimeRanges,\n duration: prevDuration,\n endMargin: prevEndMargin,\n playheadPosition: prevPlayheadPosition,\n startMargin: prevStartMargin,\n totalDuration: prevTotalDuration,\n userViewEndOffset: prevUserViewEndOffset,\n userViewStartOffset: prevUserViewStartOffset,\n } = prevProps;\n\n if (\n bufferedTimeRanges === prevBufferedTimeRanges &&\n playheadPosition === prevPlayheadPosition &&\n duration === prevDuration &&\n endMargin === prevEndMargin &&\n startMargin === prevStartMargin &&\n totalDuration === prevTotalDuration &&\n userViewEndOffset === prevUserViewEndOffset &&\n userViewStartOffset === prevUserViewStartOffset\n ) {\n return;\n }\n\n // Duration actually used to draw the progress bar\n const realDuration = this.getRealDuration();\n\n this.updateProgressBar(realDuration);\n\n // Available part of the video\n this.updateAvailableBar(realDuration);\n\n // Buffered part of the video\n this.updateBufferedBar(realDuration);\n }\n\n componentWillUnmount() {\n window.removeEventListener('mousemove', this.handleThumbMouseMove, { capture: true });\n window.removeEventListener('mouseup', this.handleThumbMouseUp, { capture: true });\n this.resetDragTimer();\n }\n\n showDebugInfo = () => {\n const {\n props,\n props: { bufferedTimeRanges, duration, endMargin, endTime, playheadPosition, realEnd, realStart, startMargin, startTime, totalDuration, userViewEndOffset, userViewStartOffset },\n realDuration,\n state,\n } = this;\n\n showDebug('Standard progress bar', {\n instance: this,\n instanceFields: ['dragSeekPosition'],\n misc: {\n bufferedTimeRanges: getTimeRangesAsString(bufferedTimeRanges),\n duration: getDurationDisplay(duration),\n endMargin: getDurationDisplay(endMargin),\n endTime: getTimestampDisplay(endTime),\n playheadPosition: getTimestampDisplay(playheadPosition),\n realDuration: getDurationDisplay(realDuration),\n realEnd: getTimestampDisplay(realEnd),\n realStart: getTimestampDisplay(realStart),\n startMargin: getDurationDisplay(startMargin),\n startTime: getTimestampDisplay(startTime),\n totalDuration: getDurationDisplay(totalDuration),\n userViewEndOffset: getDurationDisplay(userViewEndOffset),\n userViewStartOffset: getDurationDisplay(userViewStartOffset),\n },\n props,\n propsFields: ['isLiveRecording'],\n state,\n stateFields: ['availableBarWidth', 'bufferedBarWidth', 'hoverPosition', 'hoverTime', 'isHoveringMargin', 'isThumbDragged', 'progressBarWidth'],\n });\n };\n\n resetDragTimer: () => void = () => {\n if (this.dragTimer) {\n clearTimeout(this.dragTimer);\n this.dragTimer = null;\n }\n };\n\n getRealDuration = (): number => {\n const { duration, totalDuration } = this.props;\n\n if (duration > 0 && duration < Infinity) {\n // Real duration set by the player, including margins\n return duration;\n }\n\n if (totalDuration > 0) {\n // Duration from metadata where margins have been added\n return totalDuration;\n }\n\n return 0;\n };\n\n updateProgressBar = (realDuration: number): void => {\n const { playheadPosition, endMargin, onPlayingInMargin, startMargin } = this.props;\n const { isThumbDragged } = this.state;\n\n if (isThumbDragged) {\n return;\n }\n\n let progressBarWidth: ?number = null;\n\n if (realDuration > 0) {\n onPlayingInMargin(playheadPosition < startMargin || playheadPosition > realDuration - endMargin);\n\n progressBarWidth = this.calculateProgressWidth(playheadPosition, realDuration);\n }\n\n this.setState({ progressBarWidth });\n };\n\n updateAvailableBar = (realDuration: number): void => {\n const { duration, endMargin, endTime, isLiveRecording, startMargin, startTime, userViewEndOffset, userViewStartOffset } = this.props;\n\n const localDuration = duration < Infinity ? duration : realDuration;\n let availableBarWidth = localDuration > 0 ? '100%' : null;\n\n if (isLiveRecording) {\n // In-progress recording: available bar is limited by current time\n const partsWidth = this.calculatePartsWidth();\n\n if (!partsWidth) {\n return;\n }\n\n const { contentWidth, endMarginWidth, startMarginWidth } = partsWidth;\n\n const now = AccurateTimestamp.nowInSeconds();\n\n const viewableEndMarginDuration = endMargin - userViewEndOffset;\n if (now < endTime + viewableEndMarginDuration) {\n // In-progress recording and current time is within the user view window\n let adjustedWidth = startMarginWidth;\n\n if (now <= endTime) {\n // Before program end\n const missedContent = userViewStartOffset - startMargin;\n adjustedWidth += contentWidth * getRealPercentage(now, startTime + (missedContent > 0 ? missedContent : 0), endTime);\n } else {\n // In end margin\n adjustedWidth += contentWidth + endMarginWidth * getRealPercentage(now, endTime, endTime + viewableEndMarginDuration);\n }\n\n availableBarWidth = `${adjustedWidth}px`;\n }\n }\n\n this.setState({ availableBarWidth });\n };\n\n updateBufferedBar = (realDuration: number): void => {\n const { bufferedTimeRanges, playheadPosition, endMargin, startMargin } = this.props;\n\n let bufferedBarWidth = 0;\n\n if (realDuration > 0 && bufferedTimeRanges && bufferedTimeRanges.length > 0 && startMargin <= playheadPosition && playheadPosition <= realDuration - endMargin) {\n let end = bufferedTimeRanges.end(bufferedTimeRanges.length - 1);\n\n if (end > realDuration - endMargin) {\n // Sometimes buffered time ranges returns wrong value (very high)\n end = realDuration - endMargin;\n }\n\n bufferedBarWidth = this.calculateProgressWidth(end, realDuration);\n }\n\n this.setState({ bufferedBarWidth });\n };\n\n // Margins are included in 'duration'\n calculateProgressWidth = (position: number, realDuration: number): number => {\n const { endMargin, realEnd, realStart, startMargin, userViewEndOffset, userViewStartOffset } = this.props;\n const { mainContainer } = this;\n\n const mainContainerWidth = mainContainer?.offsetWidth ?? 0;\n\n let width = 0;\n\n if (position < userViewStartOffset) {\n // Before userView: width = 0\n } else if (position < startMargin) {\n // Inside the first 10%\n const relativePosition = position - userViewStartOffset;\n const relativeDuration = startMargin - userViewStartOffset;\n width = (mainContainerWidth * PERCENT_START_MARGIN * relativePosition) / relativeDuration;\n } else if (position > realDuration - endMargin) {\n // Inside the last 20%\n const relativePosition = position - (realDuration - endMargin);\n const relativeDuration = endMargin - userViewEndOffset;\n width = mainContainerWidth * (1 - PERCENT_END_MARGIN);\n width += (mainContainerWidth * PERCENT_END_MARGIN * relativePosition) / relativeDuration;\n } else {\n // Inside the middle 70%\n const relativePosition = position - realStart;\n const relativeDuration = realDuration - (realStart + realEnd);\n let relativeWidth = mainContainerWidth;\n\n if (userViewStartOffset <= startMargin && startMargin > 0) {\n // Start margin is only displayed when it's greater than userViewStartOffset\n relativeWidth -= mainContainerWidth * PERCENT_START_MARGIN;\n width += mainContainerWidth * PERCENT_START_MARGIN;\n }\n if (userViewEndOffset <= endMargin && endMargin > 0) {\n // End margin is only displayed when it's greater than userViewEndOffset\n relativeWidth -= mainContainerWidth * PERCENT_END_MARGIN;\n }\n width += (relativeWidth * relativePosition) / relativeDuration;\n }\n\n // Ensure returned width stays valid\n return getBoundedValue(width, 0, mainContainerWidth);\n };\n\n calculatePartsWidth = (): PartsWidth | null => {\n const { endMargin, startMargin, userViewEndOffset, userViewStartOffset } = this.props;\n const { mainContainer } = this;\n\n if (!mainContainer) {\n return null;\n }\n\n const mainContainerWidth = mainContainer.offsetWidth;\n const startMarginWidth = startMargin > 0 && startMargin >= userViewStartOffset ? mainContainerWidth * PERCENT_START_MARGIN : 0;\n const endMarginWidth = endMargin > 0 && endMargin >= userViewEndOffset ? mainContainerWidth * PERCENT_END_MARGIN : 0;\n const contentWidth = mainContainerWidth - startMarginWidth - endMarginWidth;\n\n return {\n contentWidth,\n endMarginWidth,\n startMarginWidth,\n };\n };\n\n getRelativeMousePosition = (mouseX: number): number => {\n const { mainContainer } = this;\n\n if (!mainContainer) {\n return mouseX;\n }\n\n const { left, width } = mainContainer.getBoundingClientRect();\n const relativePosition = mouseX - left;\n\n if (relativePosition < 0) {\n return 0;\n }\n\n if (relativePosition > width) {\n return width;\n }\n\n return relativePosition;\n };\n\n calculateTimeFromMousePosition = (mousePos: number): number => {\n const { duration, endMargin, realStart, startMargin, userViewEndOffset, userViewStartOffset } = this.props;\n const partsWidth = this.calculatePartsWidth();\n\n if (!partsWidth) {\n return 0;\n }\n\n const { contentWidth, endMarginWidth, startMarginWidth } = partsWidth;\n\n const programDuration = duration - realStart - endMargin;\n const startMarginDuration = Math.max(0, startMargin - userViewStartOffset);\n const endMarginDuration = Math.max(0, endMargin - userViewEndOffset);\n\n let time = 0;\n let isHoveringMargin = true;\n\n if (mousePos < startMarginWidth) {\n // Mouse is over start margin\n time = (mousePos * startMarginDuration) / startMarginWidth;\n } else if (mousePos > startMarginWidth + contentWidth) {\n // Mouse is over end margin\n const endMousePos = mousePos - startMarginWidth - contentWidth;\n time = startMarginDuration + programDuration + (endMousePos * endMarginDuration) / endMarginWidth;\n } else {\n // Mouse is between margins\n isHoveringMargin = false;\n const mousePosInProgram = mousePos - startMarginWidth;\n time = startMarginDuration + (mousePosInProgram * programDuration) / contentWidth;\n }\n\n this.setState({ isHoveringMargin });\n return time;\n };\n\n handleMainContainerOnClick = (event: SyntheticMouseEvent<HTMLElement>): void => {\n const { onSeekChanged, userViewStartOffset } = this.props;\n const { altKey, clientX, ctrlKey } = event;\n\n if (ctrlKey || altKey) {\n this.showDebugInfo();\n return;\n }\n\n const mousePos = this.getRelativeMousePosition(clientX);\n onSeekChanged(this.calculateTimeFromMousePosition(mousePos) + userViewStartOffset);\n };\n\n handleMouseMove = (event: SyntheticMouseEvent<HTMLElement>): void => {\n const { clientX } = event;\n\n this.displayTimeBadge(this.getRelativeMousePosition(clientX));\n };\n\n displayTimeBadge = (mousePosition: number): void => {\n const { startMargin, userViewStartOffset } = this.props;\n\n const startMarginDuration = Math.max(0, startMargin - userViewStartOffset);\n this.setState({\n hoverPosition: mousePosition,\n hoverTime: formatSecondsToHHMMSS(this.calculateTimeFromMousePosition(mousePosition) - startMarginDuration),\n });\n };\n\n handleMouseLeave: () => void = () => {\n this.setState({\n hoverPosition: 0,\n hoverTime: null,\n });\n };\n\n handleThumbMouseDown = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>): void => {\n event.preventDefault();\n event.stopPropagation();\n\n this.setState({ isThumbDragged: true });\n this.realDuration = this.getRealDuration();\n\n window.addEventListener('mousemove', this.handleThumbMouseMove, { capture: true });\n window.addEventListener('mouseup', this.handleThumbMouseUp, { capture: true });\n };\n\n handleThumbMouseMove = (event: SyntheticMouseEvent<HTMLElement>): void => {\n event.preventDefault();\n event.stopPropagation();\n\n const { startMargin, startTime, userViewStartOffset } = this.props;\n const { isThumbDragged } = this.state;\n const { realDuration } = this;\n const { clientX } = event;\n\n if (!isThumbDragged) {\n return;\n }\n\n const mousePosition = this.getRelativeMousePosition(clientX);\n const mouseTime = this.calculateTimeFromMousePosition(mousePosition);\n const now = AccurateTimestamp.nowInSeconds();\n let absoluteTime = startTime + mouseTime;\n\n const missedContent = userViewStartOffset - startMargin;\n if (missedContent > 0) {\n // Partial recording\n absoluteTime += missedContent;\n } else {\n // Full recording\n absoluteTime -= missedContent;\n }\n\n if (absoluteTime + LIVE_DELTA > now) {\n // Cannot move beyond live (obviously)\n return;\n }\n\n this.dragSeekPosition = mouseTime + userViewStartOffset;\n\n if (realDuration > 0) {\n const progressBarWidth = this.calculateProgressWidth(this.dragSeekPosition, realDuration);\n this.setState({ progressBarWidth });\n }\n\n // Throttling: only the last seek of each 300ms window will be performed\n if (!this.dragTimer) {\n this.dragTimer = setTimeout(this.performSeek, DRAG_TIMEOUT_DELAY);\n }\n\n this.displayTimeBadge(mousePosition);\n };\n\n performSeek: () => void = () => {\n const { onSeekChanged } = this.props;\n const { dragSeekPosition } = this;\n\n this.resetDragTimer();\n onSeekChanged(dragSeekPosition);\n };\n\n handleThumbMouseUp = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>): void => {\n event.preventDefault();\n event.stopPropagation();\n\n if (this.dragTimer) {\n this.resetDragTimer();\n this.performSeek();\n }\n\n this.setState({ isThumbDragged: false });\n this.realDuration = 0;\n\n window.removeEventListener('mousemove', this.handleThumbMouseMove, { capture: true });\n window.removeEventListener('mouseup', this.handleThumbMouseUp, { capture: true });\n };\n\n renderAvailableBar = (): React.Node => {\n const { availableBarWidth } = this.state;\n\n if (!availableBarWidth) {\n return null;\n }\n\n return <div className='available' style={{ width: availableBarWidth }} />;\n };\n\n renderBufferedBar = (): React.Node => {\n const { bufferedBarWidth } = this.state;\n\n if (!bufferedBarWidth) {\n return null;\n }\n\n return <div className='buffered' style={{ width: `${bufferedBarWidth}px` }} />;\n };\n\n renderProgressBar = (): React.Node => {\n const { isThumbDragged, progressBarWidth } = this.state;\n\n if (!progressBarWidth) {\n return null;\n }\n\n return (\n <div className='progress' style={{ width: `${progressBarWidth}px` }}>\n <PictoDot className={`thumb ${isThumbDragged ? 'dragged' : ''}`} draggable onMouseDown={this.handleThumbMouseDown} />\n </div>\n );\n };\n\n renderTimeBadge = (): React.Node => {\n const { hoverPosition, hoverTime, isHoveringMargin } = this.state;\n\n if (!hoverTime) {\n return null;\n }\n\n const translate = `translateX(calc(${hoverPosition}px - 50%))`;\n\n return (\n <div className={`timeBadge ${isHoveringMargin ? 'inMargin' : ''}`} draggable={false} style={{ transform: translate }}>\n {hoverTime}\n </div>\n );\n };\n\n render(): React.Node {\n const { isLiveRecording } = this.props;\n\n return (\n <div className='progressBar standard'>\n <div className='reactiveBackground'>\n <div\n className={`mainContainer ${!isLiveRecording ? 'allowed' : ''}`}\n onClick={this.handleMainContainerOnClick}\n onMouseLeave={this.handleMouseLeave}\n onMouseMove={this.handleMouseMove}\n ref={(instance) => {\n this.mainContainer = instance;\n }}\n >\n {this.renderAvailableBar()}\n {this.renderBufferedBar()}\n {this.renderProgressBar()}\n {this.renderTimeBadge()}\n </div>\n </div>\n </div>\n );\n }\n}\n\nexport default (StandardProgressBar: React.ComponentType<StandardProgressBarPropType>);\n","/* @flow */\n\n// All progress bar thumb drags occurring during this time window will be grouped (only the last one will be applied)\nexport const DRAG_TIMEOUT_DELAY = 300;\n","/* @flow */\nimport './PlayerController.css';\n\nimport * as React from 'react';\nimport type { BasicFunction, BasicPromiseFunction } from '@ntg/utils/dist/types';\nimport { ContentType, TIMESHIFT_THRESHOLD } from '../constantsAndTypes';\nimport { type NETGEM_API_V8_FEED_ITEM, NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING } from '../../../libs/netgemLibrary/v8/types/FeedItem';\nimport type { NETGEM_API_V8_METADATA_PROGRAM, NETGEM_API_V8_METADATA_SERIES } from '../../../libs/netgemLibrary/v8/types/MetadataProgram';\nimport {\n PictoBigPlay,\n PictoCog,\n PictoCompress,\n PictoDownload,\n PictoExpand,\n PictoForward10,\n PictoForward30,\n PictoForward60,\n PictoInfo,\n PictoLeaf,\n PictoPause,\n PictoRecord,\n PictoRewind10,\n PictoRewind30,\n PictoRewind60,\n} from '@ntg/components/dist/pictos/Element';\nimport RecordButton, { ContextKind, DisplayMode } from '../../recordButton/RecordButton';\nimport { formatSecondsToHHMMSS, formatTimeFromSeconds } from '../../../helpers/dateTime/Format';\nimport { BroadcastStatus } from '../../../helpers/ui/location/Format';\nimport ChannelZapper from './zapper/ChannelZapper';\nimport type { CombinedReducers } from '../../../redux/reducers';\nimport { ControlLevel } from '../../../helpers/ui/player';\nimport { Definition } from '../../../helpers/ui/metadata/Types';\nimport EmptyProgressBar from './progressBar/empty/EmptyProgressBar';\nimport { ExtendedItemType } from '../../../helpers/ui/item/types';\nimport LiveProgressBar from './progressBar/live/LiveProgressBar';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport MediaController from '../../../helpers/mediaSession/mediaController';\nimport type { NETGEM_API_CHANNEL } from '../../../libs/netgemLibrary/v8/types/Channel';\nimport type { NETGEM_API_V8_METADATA_SCHEDULE_LOCATION } from '../../../libs/netgemLibrary/v8/types/MetadataSchedule';\nimport Options from './options/Options';\nimport PlayerVolume from './volume/Volume';\nimport { Setting } from '../../../helpers/settings/types';\nimport StandardProgressBar from './progressBar/standard/StandardProgressBar';\nimport StatusPicto from '../../statusPicto/StatusPicto';\nimport { TileConfigTileType } from '../../../libs/netgemLibrary/v8/types/WidgetConfig';\nimport { type VideoPlayerMediaInfo } from '../implementation/types';\nimport clsx from 'clsx';\nimport { connect } from 'react-redux';\nimport { getTitle } from '../../../helpers/ui/metadata/Format';\n\n// Timespan allowed to move cursor outside options element without closing it (in ms)\nconst OPTIONS_TIMEOUT = 500;\n\ntype ReduxPlayerControllerDispatchToPropsType = {||};\n\ntype ReduxPlayerControllerReducerStateType = {|\n +isBitrateLimited: boolean,\n +isDebugModeEnabled: boolean,\n +isMaxBitrateAllowed: boolean,\n|};\n\ntype PlayerControllerPropType = {|\n +audioMediaInfo: Array<VideoPlayerMediaInfo>,\n +bufferedTimeRanges: TimeRanges | null,\n +channelId: string | null,\n +channelImageUrl: string,\n +channelName: string,\n +contentType: ContentType,\n +controlLevel: ControlLevel,\n +currentItem: NETGEM_API_V8_FEED_ITEM | null,\n +duration: number,\n +endMargin: number,\n +isBlackOutEnabled: boolean,\n +isControllerEnabled: boolean,\n +isInFullscreen: boolean,\n +isLiveRecording: boolean,\n +isMuted: boolean,\n +isPlaying: boolean,\n +isProgramInfoHidden: boolean,\n +isTimeshiftEnabled: boolean,\n +isTrailer: boolean,\n +isVisible: boolean,\n +itemType: ExtendedItemType,\n +liveBufferLength: number,\n +location: NETGEM_API_V8_METADATA_SCHEDULE_LOCATION | null,\n +onChannelChanged: (channel: NETGEM_API_CHANNEL) => Promise<void> | void,\n +onDownloadClick: () => Promise<void> | void,\n +onEnterFullScreenClick: BasicFunction,\n +onExitFullScreenClick: BasicFunction,\n +onGoToLiveClick: BasicFunction | BasicPromiseFunction,\n +onInfoClick: BasicFunction,\n +onLiveProgressBarSeekChanged: (seekTime: number) => void,\n +onMouseEnter: BasicFunction,\n +onMouseLeave: BasicFunction,\n +onNewAudioTrackSelected: (index: number) => void,\n +onNewSubtitlesTrackSelected: (index: number) => void,\n +onPauseClick: BasicFunction | BasicPromiseFunction,\n +onPlayClick: BasicFunction | BasicPromiseFunction,\n +onSkipBackwardClick: (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement> | SyntheticKeyboardEvent<HTMLElement>) => void,\n +onSkipForwardClick: (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement> | SyntheticKeyboardEvent<HTMLElement>) => void,\n +onStandardProgressBarSeekChanged: (seekTime: number) => void,\n +onVolumeChanged: (volume: number) => void,\n +onVolumeClick: BasicFunction,\n +playheadPosition: number,\n +programMetadata: NETGEM_API_V8_METADATA_PROGRAM | null,\n +realEnd: number,\n +realStart: number,\n +selectedAudioMediaInfo: number,\n +selectedSubtitlesMediaInfo: number,\n +seriesEpisodeText: string | null,\n +seriesMetadata: NETGEM_API_V8_METADATA_SERIES | null,\n +startMargin: number,\n +subtitlesMediaInfo: Array<VideoPlayerMediaInfo>,\n +tileType: TileConfigTileType,\n +title: string | null,\n +timeshift: number,\n +totalDuration: number,\n +userViewEndOffset: number,\n +userViewStartOffset: number,\n +videoQuality: Definition,\n +volume: number,\n|};\n\ntype CompletePlayerControllerPropType = {|\n ...PlayerControllerPropType,\n ...ReduxPlayerControllerDispatchToPropsType,\n ...ReduxPlayerControllerReducerStateType,\n|};\n\ntype PlayerControllerStateType = {|\n areOptionsVisible: boolean,\n isWaitingForDeleteConfirmation: boolean,\n isWaitingForRecordConfirmation: boolean,\n playingInMargin: boolean,\n|};\n\nconst InitialState = Object.freeze({\n areOptionsVisible: false,\n isWaitingForDeleteConfirmation: false,\n isWaitingForRecordConfirmation: false,\n playingInMargin: false,\n});\n\nclass PlayerControllerView extends React.PureComponent<CompletePlayerControllerPropType, PlayerControllerStateType> {\n channelZapper: React.ElementRef<any> | null;\n\n optionsTimer: TimeoutID | null;\n\n constructor(props: CompletePlayerControllerPropType) {\n super(props);\n\n this.channelZapper = null;\n this.optionsTimer = null;\n\n this.state = { ...InitialState };\n }\n\n componentDidUpdate(prevProps: CompletePlayerControllerPropType) {\n const { isVisible } = this.props;\n const { isVisible: prevIsVisible } = prevProps;\n\n if (!isVisible && isVisible !== prevIsVisible) {\n this.setPlayerOptionsVisibility(false);\n }\n }\n\n componentWillUnmount() {\n this.resetOptionsTimer();\n }\n\n resetOptionsTimer = () => {\n if (this.optionsTimer) {\n clearTimeout(this.optionsTimer);\n this.optionsTimer = null;\n }\n };\n\n startOptionsTimer = () => {\n this.resetOptionsTimer();\n this.optionsTimer = setTimeout(this.closePlayerOptions, OPTIONS_TIMEOUT);\n };\n\n handlePlayerOptionsOnMouseEnter = () => {\n this.resetOptionsTimer();\n };\n\n handlePlayerOptionsOnMouseLeave = () => {\n // Start a timer to allow the user to move the mouse cursor a short time outside the options element\n this.startOptionsTimer();\n };\n\n closePlayerOptions = () => {\n this.resetOptionsTimer();\n this.setPlayerOptionsVisibility(false);\n };\n\n setPlayerOptionsVisibility = (value: boolean) => {\n this.setState({ areOptionsVisible: value });\n };\n\n handleOnClickOverlay = () => {\n this.setPlayerOptionsVisibility(false);\n };\n\n handlePictoCogOnClick = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n const { areOptionsVisible } = this.state;\n this.setPlayerOptionsVisibility(!areOptionsVisible);\n };\n\n handleChannelZapperChannelChanged = (channel: NETGEM_API_CHANNEL) => {\n const { onChannelChanged } = this.props;\n\n onChannelChanged(channel);\n };\n\n handlePlayInMargin = (value: boolean) => {\n this.setState({ playingInMargin: value });\n };\n\n // eslint-disable-next-line react/no-unused-class-component-methods\n goToPreviousChannel = () => {\n const { channelZapper } = this;\n\n if (channelZapper) {\n channelZapper.goToPreviousChannel();\n }\n };\n\n // eslint-disable-next-line react/no-unused-class-component-methods\n goToNextChannel = () => {\n const { channelZapper } = this;\n\n if (channelZapper) {\n channelZapper.goToNextChannel();\n }\n };\n\n renderProgressBar = (): React.Node => {\n const {\n bufferedTimeRanges,\n contentType,\n currentItem,\n duration,\n endMargin,\n isTimeshiftEnabled,\n isTrailer,\n itemType,\n liveBufferLength,\n onLiveProgressBarSeekChanged,\n onStandardProgressBarSeekChanged,\n playheadPosition,\n realEnd,\n realStart,\n startMargin,\n totalDuration,\n userViewEndOffset,\n userViewStartOffset,\n } = this.props;\n\n if (!currentItem && !isTrailer && itemType !== ExtendedItemType.OfflineContent) {\n return <EmptyProgressBar />;\n }\n\n const liveStartTime = currentItem?.startTime ?? 0;\n const liveEndTime = currentItem?.endTime ?? 0;\n\n let progressBarElement = null;\n\n if (contentType === ContentType.Live) {\n // Live\n progressBarElement = (\n <LiveProgressBar\n isTimeshiftEnabled={isTimeshiftEnabled}\n liveBufferLength={liveBufferLength}\n liveProgramEndTime={liveEndTime}\n liveProgramStartTime={liveStartTime}\n onSeekChanged={onLiveProgressBarSeekChanged}\n playheadPosition={playheadPosition}\n />\n );\n } else {\n // Static or live recording\n progressBarElement = (\n <StandardProgressBar\n bufferedTimeRanges={bufferedTimeRanges}\n duration={duration}\n endMargin={endMargin}\n endTime={liveEndTime}\n isLiveRecording={contentType === ContentType.LiveRecording}\n onPlayingInMargin={this.handlePlayInMargin}\n onSeekChanged={onStandardProgressBarSeekChanged}\n playheadPosition={playheadPosition}\n realEnd={realEnd}\n realStart={realStart}\n startMargin={startMargin}\n startTime={liveStartTime}\n totalDuration={totalDuration}\n userViewEndOffset={userViewEndOffset}\n userViewStartOffset={userViewStartOffset}\n />\n );\n }\n\n return progressBarElement;\n };\n\n renderDownloadPicto = (): React.Node => {\n const { contentType, isDebugModeEnabled, itemType, onDownloadClick } = this.props;\n\n if (!isDebugModeEnabled || contentType === ContentType.Live || itemType === ExtendedItemType.OfflineContent) {\n return null;\n }\n\n return <PictoDownload onClick={onDownloadClick} />;\n };\n\n renderOptionsPicto = (): React.Node => {\n const { audioMediaInfo, isMaxBitrateAllowed, itemType, subtitlesMediaInfo } = this.props;\n\n /*\n * Options are enabled if at least one of these 3 things happens:\n * - Green streaming is allowed\n * - There are more than 1 audio track\n * - There are at least 1 subtitles track\n */\n const areOptionsEnabled = (isMaxBitrateAllowed && itemType !== ExtendedItemType.OfflineContent) || audioMediaInfo.length > 1 || subtitlesMediaInfo.length > 0;\n\n const onClickHandler = areOptionsEnabled ? this.handlePictoCogOnClick : undefined;\n\n return <PictoCog isDisabled={!areOptionsEnabled} onClick={onClickHandler} onMouseEnter={this.handlePlayerOptionsOnMouseEnter} />;\n };\n\n renderFullScreenPicto = (): React.Node => {\n const { isInFullscreen, onEnterFullScreenClick, onExitFullScreenClick } = this.props;\n\n return isInFullscreen ? <PictoCompress onClick={onExitFullScreenClick} /> : <PictoExpand onClick={onEnterFullScreenClick} />;\n };\n\n renderLiveIndicator = (): React.Node => {\n const { contentType, currentItem, isLiveRecording, onGoToLiveClick, timeshift } = this.props;\n\n if (contentType !== ContentType.Live || !currentItem) {\n return null;\n }\n\n const isLive = timeshift <= TIMESHIFT_THRESHOLD;\n const { endTime, startTime } = currentItem;\n\n if ((!startTime && endTime) || (startTime && !endTime)) {\n return null;\n }\n\n const recordingPicto = isLiveRecording ? (\n <div className='liveRecording'>\n <PictoRecord className='recording live' hasBackground />\n <div className='text'>{Localizer.localize('common.status.live_recording')}</div>\n </div>\n ) : null;\n\n return (\n <>\n <StatusPicto\n className={clsx(!isLive && 'notLive')}\n forcedText={isLive ? undefined : Localizer.localize('player.back_to_live')}\n item={currentItem}\n onClick={isLive ? undefined : onGoToLiveClick}\n />\n {recordingPicto}\n </>\n );\n };\n\n renderTitleElement = (liveIndicator: React.Node): React.Node => {\n const { isProgramInfoHidden, isTrailer, seriesEpisodeText, seriesMetadata, title } = this.props;\n const seriesTitle = getTitle(seriesMetadata, Localizer.language);\n const episodeTitle = !isTrailer && seriesEpisodeText && title ? `${seriesEpisodeText} - ${title}` : title;\n\n if (isProgramInfoHidden) {\n return null;\n }\n\n const mainLineTitle = <div className='title main'>{seriesTitle || episodeTitle || Localizer.localize('player.no_program_info')}</div>;\n\n const subLineTitle = seriesTitle && episodeTitle && seriesTitle !== episodeTitle ? <div className='title'>{episodeTitle}</div> : null;\n\n MediaController.setTitles(episodeTitle, seriesTitle);\n\n return (\n <div className={clsx('titlesAndStatus', subLineTitle && 'multiline')}>\n <div className='mainLine'>\n {mainLineTitle}\n {liveIndicator}\n </div>\n {subLineTitle}\n </div>\n );\n };\n\n renderChannelImage = (): React.Node => {\n const { channelImageUrl, channelName, contentType } = this.props;\n\n if (contentType === ContentType.Live || channelImageUrl === '') {\n // No channel image for live program (channel list instead), trailer and VOD\n return null;\n }\n\n return <div className='channelImage'>{channelImageUrl ? <img alt={channelName} draggable={false} src={channelImageUrl} /> : null}</div>;\n };\n\n renderPictoLeaf = (): React.Node => {\n const { isBitrateLimited } = this.props;\n\n if (!isBitrateLimited) {\n return null;\n }\n\n return <PictoLeaf className='leaf' />;\n };\n\n renderVideoQuality = (): React.Node => {\n const { videoQuality } = this.props;\n\n return (\n <div className='videoQuality'>\n {videoQuality !== Definition.SD ? <div>{(videoQuality: string)}</div> : null}\n {this.renderPictoLeaf()}\n </div>\n );\n };\n\n getDisplayedDuration = (): number => {\n const { duration, realEnd, realStart, totalDuration } = this.props;\n let displayedDuration = 0;\n\n if (duration > 0 && duration < Infinity) {\n displayedDuration = duration;\n } else if (totalDuration > 0) {\n displayedDuration = totalDuration;\n }\n\n displayedDuration -= realStart + realEnd;\n if (displayedDuration < 0) {\n displayedDuration = 0;\n }\n\n return displayedDuration;\n };\n\n renderTimeInfo = (): React.Node => {\n const { contentType, currentItem, duration, isProgramInfoHidden, playheadPosition, realStart } = this.props;\n const { playingInMargin } = this.state;\n\n if (isProgramInfoHidden) {\n return null;\n }\n\n if (contentType === ContentType.Live) {\n if (!currentItem) {\n return null;\n }\n // Live program: display start and end times\n const { endTime, startTime } = currentItem;\n\n return (\n <div className='timeInfo'>\n <div>{formatTimeFromSeconds(startTime)}</div>\n <div className='timeSeparator'>-</div>\n <div>{formatTimeFromSeconds(endTime)}</div>\n </div>\n );\n }\n\n if (duration === 0) {\n return null;\n }\n\n const displayedSeekPosition = playheadPosition - realStart;\n const displayedDuration = this.getDisplayedDuration();\n\n return (\n <div className='timeInfo'>\n <div className={clsx('first', contentType !== ContentType.Live && playingInMargin && 'margin')}>{formatSecondsToHHMMSS(displayedSeekPosition)}</div>\n <div className='timeSeparator'>/</div>\n <div>{formatSecondsToHHMMSS(displayedDuration)}</div>\n </div>\n );\n };\n\n renderOptions = (): React.Node => {\n const { audioMediaInfo, itemType, onNewAudioTrackSelected, onNewSubtitlesTrackSelected, selectedAudioMediaInfo, selectedSubtitlesMediaInfo, subtitlesMediaInfo } = this.props;\n const { areOptionsVisible } = this.state;\n\n if (!areOptionsVisible) {\n return null;\n }\n\n return (\n <Options\n audioMediaInfo={audioMediaInfo}\n itemType={itemType}\n onMouseEnter={this.handlePlayerOptionsOnMouseEnter}\n onMouseLeave={this.handlePlayerOptionsOnMouseLeave}\n onNewAudioTrackSelected={onNewAudioTrackSelected}\n onNewSubtitlesTrackSelected={onNewSubtitlesTrackSelected}\n selectedAudioMediaInfo={selectedAudioMediaInfo}\n selectedSubtitlesMediaInfo={selectedSubtitlesMediaInfo}\n subtitlesMediaInfo={subtitlesMediaInfo}\n />\n );\n };\n\n renderChannelZapper = (): React.Node => {\n const { channelId, contentType } = this.props;\n\n if (contentType !== ContentType.Live) {\n return null;\n }\n\n return (\n <ChannelZapper\n channelId={channelId}\n onChannelChangedCallback={this.handleChannelZapperChannelChanged}\n ref={(instance) => {\n this.channelZapper = instance;\n }}\n />\n );\n };\n\n renderRecordButton = (): React.Node => {\n const { contentType, currentItem, isBlackOutEnabled, isControllerEnabled, location, programMetadata, seriesMetadata, tileType, timeshift } = this.props;\n\n if (!currentItem || !programMetadata) {\n return null;\n }\n\n const { locType } = currentItem;\n if (locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING) {\n // User is not allowed to delete a recording from the player when they're playing it\n return null;\n }\n\n const broadcastStatus = contentType === ContentType.Live && timeshift <= TIMESHIFT_THRESHOLD ? BroadcastStatus.Live : BroadcastStatus.Past;\n\n return (\n <RecordButton\n broadcastStatus={broadcastStatus}\n context={ContextKind.Player}\n displayMode={DisplayMode.Picto}\n isDisabled={!isControllerEnabled || isBlackOutEnabled}\n item={currentItem}\n location={location}\n previewCatchupScheduledEventId={null}\n programMetadata={programMetadata}\n seriesMetadata={seriesMetadata}\n tileType={tileType}\n />\n );\n };\n\n // eslint-disable-next-line consistent-return\n renderSkipBackwardButton = (): React.Node => {\n const { contentType, controlLevel, isControllerEnabled, isTimeshiftEnabled, onSkipBackwardClick } = this.props;\n\n const isDisabled = !isControllerEnabled || (contentType === ContentType.Live && !isTimeshiftEnabled);\n\n switch (controlLevel) {\n case ControlLevel.Level0:\n return <PictoRewind10 className='skipPicto' isDisabled={isDisabled} onClick={onSkipBackwardClick} />;\n\n case ControlLevel.Level1:\n return <PictoRewind30 className='skipPicto' isDisabled={isDisabled} onClick={onSkipBackwardClick} />;\n\n case ControlLevel.Level2:\n return <PictoRewind60 className='skipPicto' isDisabled={isDisabled} onClick={onSkipBackwardClick} />;\n\n // No default\n }\n };\n\n // eslint-disable-next-line consistent-return\n renderSkipForwardButton = (): React.Node => {\n const { contentType, controlLevel, isControllerEnabled, isTimeshiftEnabled, onSkipForwardClick, timeshift } = this.props;\n\n const isDisabled = !isControllerEnabled || (contentType === ContentType.Live && (timeshift <= TIMESHIFT_THRESHOLD || !isTimeshiftEnabled));\n\n switch (controlLevel) {\n case ControlLevel.Level0:\n return <PictoForward10 className='skipPicto' isDisabled={isDisabled} onClick={onSkipForwardClick} />;\n\n case ControlLevel.Level1:\n return <PictoForward30 className='skipPicto' isDisabled={isDisabled} onClick={onSkipForwardClick} />;\n\n case ControlLevel.Level2:\n return <PictoForward60 className='skipPicto' isDisabled={isDisabled} onClick={onSkipForwardClick} />;\n\n // No default\n }\n };\n\n renderPlayOrPauseButton = (): React.Node => {\n const { contentType, isControllerEnabled, isPlaying, isTimeshiftEnabled, onPauseClick, onPlayClick } = this.props;\n\n const isDisabled = !isControllerEnabled || (contentType === ContentType.Live && !isTimeshiftEnabled);\n\n if (isPlaying) {\n // Playing: display pause button\n return <PictoPause isDisabled={isDisabled} onClick={onPauseClick} />;\n }\n\n // Paused: display play button\n return <PictoBigPlay className='play' isDisabled={isDisabled} onClick={onPlayClick} />;\n };\n\n render(): React.Node {\n const { isBlackOutEnabled, isControllerEnabled, isMuted, isTrailer, isVisible, itemType, onInfoClick, onMouseEnter, onMouseLeave, onVolumeChanged, onVolumeClick, volume } = this.props;\n\n const playPauseButton = this.renderPlayOrPauseButton();\n const liveIndicator = this.renderLiveIndicator();\n const recordButton = this.renderRecordButton();\n\n return (\n <div className={clsx('videoController', isVisible && 'visible')} onClick={this.handleOnClickOverlay} onMouseEnter={onMouseEnter} onMouseLeave={onMouseLeave}>\n {this.renderChannelZapper()}\n <div className='controller'>\n <div className='textInfo'>\n {this.renderChannelImage()}\n {this.renderTitleElement(liveIndicator)}\n <div className='videoQualityAndTime'>\n {this.renderVideoQuality()}\n {this.renderTimeInfo()}\n </div>\n </div>\n {this.renderProgressBar()}\n <div className='buttons'>\n <div className='controlButtonContainer'>\n {this.renderSkipBackwardButton()}\n {playPauseButton}\n {this.renderSkipForwardButton()}\n {recordButton}\n <PlayerVolume\n isDisabled={!isControllerEnabled || isBlackOutEnabled}\n isMuted={isMuted}\n onVolumeClickCallback={onVolumeClick}\n onVolumeControllerClickCallback={onVolumeChanged}\n volume={volume}\n />\n </div>\n <div className='infoButtonContainer'>\n {this.renderDownloadPicto()}\n {this.renderOptionsPicto()}\n <PictoInfo isDisabled={isTrailer || itemType === ExtendedItemType.OfflineContent} onClick={onInfoClick} />\n {this.renderFullScreenPicto()}\n </div>\n </div>\n {this.renderOptions()}\n </div>\n </div>\n );\n }\n}\n\nconst mapStateToProps = (state: CombinedReducers): ReduxPlayerControllerReducerStateType => {\n return {\n isBitrateLimited: state.ui.settings[Setting.GreenStreaming],\n isDebugModeEnabled: state.appConfiguration.isDebugModeEnabled,\n isMaxBitrateAllowed: state.appConfiguration.isMaxBitrateAllowed,\n };\n};\n\nconst PlayerController: React.ComponentType<PlayerControllerPropType> = connect(mapStateToProps, null, null, { forwardRef: true })(PlayerControllerView);\n\nexport default PlayerController;\n","/* @flow */\n\nimport { BO_PURCHASE_UNKNOWN_ERROR, mapV2ErrorToV1Error } from '../../../../libs/netgemLibrary/videofutur/types/ErrorCodes';\nimport { type BO_API_ERROR_TYPE } from '../videofutur/types/common';\nimport { CustomNetworkError } from '../../../../libs/netgemLibrary/helpers/CustomNetworkError';\nimport { Localizer } from '@ntg/utils/dist/localization';\n\nconst buildErrorResponse: (defaultStatus: ?string, data: any) => BO_API_ERROR_TYPE = (defaultStatus, data) => {\n if (data instanceof CustomNetworkError) {\n const status = mapV2ErrorToV1Error(data);\n if (status !== null) {\n return {\n errorMsg: '',\n status,\n };\n }\n }\n\n const { errormsg, message, status } = data;\n\n let errorMsg1: ?string = null;\n let errorMsg2: ?string = null;\n let errorStatus: ?string = null;\n\n if (errormsg) {\n if (typeof errormsg === 'string') {\n errorMsg2 = errormsg;\n } else {\n ({ _text: errorMsg2 } = errormsg);\n }\n }\n\n if (status) {\n if (typeof status === 'string') {\n errorStatus = status;\n } else {\n ({ _text: errorStatus } = status);\n }\n }\n\n if (message) {\n try {\n const messageObj = JSON.parse(message);\n if (messageObj) {\n const { result, status: errStatus } = messageObj;\n if (result && result.message) {\n errorMsg1 = result.message;\n }\n if (errStatus) {\n errorStatus = errStatus;\n }\n }\n } catch {\n errorMsg1 = message;\n }\n }\n\n return {\n errorMsg: errorMsg1 || errorMsg2 || Localizer.localize('common.messages.errors.unknown_bo_error'),\n status: defaultStatus || errorStatus || BO_PURCHASE_UNKNOWN_ERROR,\n };\n};\n\nexport { buildErrorResponse };\n","const key = {\n fullscreenEnabled: 0,\n fullscreenElement: 1,\n requestFullscreen: 2,\n exitFullscreen: 3,\n fullscreenchange: 4,\n fullscreenerror: 5,\n fullscreen: 6\n};\n\nconst webkit = [\n 'webkitFullscreenEnabled',\n 'webkitFullscreenElement',\n 'webkitRequestFullscreen',\n 'webkitExitFullscreen',\n 'webkitfullscreenchange',\n 'webkitfullscreenerror',\n '-webkit-full-screen',\n];\n\nconst moz = [\n 'mozFullScreenEnabled',\n 'mozFullScreenElement',\n 'mozRequestFullScreen',\n 'mozCancelFullScreen',\n 'mozfullscreenchange',\n 'mozfullscreenerror',\n '-moz-full-screen',\n];\n\nconst ms = [\n 'msFullscreenEnabled',\n 'msFullscreenElement',\n 'msRequestFullscreen',\n 'msExitFullscreen',\n 'MSFullscreenChange',\n 'MSFullscreenError',\n '-ms-fullscreen',\n];\n\n// so it doesn't throw if no window or document\nconst document = typeof window !== 'undefined' && typeof window.document !== 'undefined' ? window.document : {};\n\nconst vendor = (\n ('fullscreenEnabled' in document && Object.keys(key)) ||\n (webkit[0] in document && webkit) ||\n (moz[0] in document && moz) ||\n (ms[0] in document && ms) ||\n []\n);\n\nexport default {\n requestFullscreen: element => element[vendor[key.requestFullscreen]](),\n requestFullscreenFunction: element => element[vendor[key.requestFullscreen]],\n get exitFullscreen() { return document[vendor[key.exitFullscreen]].bind(document); },\n get fullscreenPseudoClass() { return `:${vendor[key.fullscreen]}`; },\n addEventListener: (type, handler, options) => document.addEventListener(vendor[key[type]], handler, options),\n removeEventListener: (type, handler, options) => document.removeEventListener(vendor[key[type]], handler, options),\n get fullscreenEnabled() { return Boolean(document[vendor[key.fullscreenEnabled]]); },\n set fullscreenEnabled(val) {},\n get fullscreenElement() { return document[vendor[key.fullscreenElement]]; },\n set fullscreenElement(val) {},\n get onfullscreenchange() { return document[`on${vendor[key.fullscreenchange]}`.toLowerCase()]; },\n set onfullscreenchange(handler) { return document[`on${vendor[key.fullscreenchange]}`.toLowerCase()] = handler; },\n get onfullscreenerror() { return document[`on${vendor[key.fullscreenerror]}`.toLowerCase()]; },\n set onfullscreenerror(handler) { return document[`on${vendor[key.fullscreenerror]}`.toLowerCase()] = handler; },\n};\n","/* @flow */\n\nimport type { NetgemApiEmitterType, RequestResponseMethodDefinitionType } from '../emitter';\nimport { BO_API_PURCHASE_LIST } from './types/common';\nimport type { CombinedReducers } from '../../../reducers';\nimport type { Dispatch } from '../../../types/types';\nimport { REDUX_MSG_REQUEST_BO_PURCHASE_LIST } from '../../constants';\nimport getRequestDetails from './helpers/requestCommon';\n\nconst sendPurchaseListRequest: (distributorId: string, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (distributorId, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const {\n ui: {\n purchaseListETagCache: { [distributorId]: eTag },\n },\n } = getState();\n\n return dispatch(getRequestDetails(distributorId, BO_API_PURCHASE_LIST)).then((requestDetails) =>\n // Object 'requestDetails' contains 'headers', 'method' and 'uri' parameters\n NetgemApiEmitter.emit(REDUX_MSG_REQUEST_BO_PURCHASE_LIST, {\n ...requestDetails,\n eTag,\n signal,\n }),\n );\n };\n\nexport default sendPurchaseListRequest;\n","/* @flow */\n\nimport { type AllSettledPromises, SettledPromiseFulfilled } from '../../../../../helpers/jsHelpers/promise';\nimport { type BO_PURCHASE_LIST_BY_DISTRIBUTOR_TYPE, Purchase, PurchaseSubType } from '../types/purchase';\nimport { MILLISECONDS_PER_SECOND, SECONDS_PER_DAY, SECONDS_PER_HOUR, SECONDS_PER_MINUTE } from '../../../../../helpers/dateTime/Format';\nimport { updateBOPurchaseListForDistributor, updateBOPurchaseListsForAllDistributors } from '../../../../ui/actions';\nimport AccurateTimestamp from '../../../../../helpers/dateTime/AccurateTimestamp';\nimport type { BO_RESPONSE_WITH_ETAG } from '../types/common';\nimport type { CombinedReducers } from '../../../../reducers';\nimport type { Dispatch } from '../../../../types/types';\nimport { HttpStatus } from '../../../../../libs/netgemLibrary/v8/constants/NetworkCodesAndMessages';\nimport type { RequestResponseMethodDefinitionType } from '../../emitter';\nimport { logError } from '../../../../../helpers/debug/debug';\nimport sendPurchaseListRequest from '../purchaseList';\n\nconst DATE_PATTERN = /^(\\d\\d)\\/(\\d\\d)\\/(\\d\\d\\d\\d).*(\\d\\d):(\\d\\d)$/u;\n\n// Returns an expiration date as a timestamp in seconds\nconst convertTimeLeftToExpirationTime: (timeLeft?: string) => number = (timeLeft) => {\n if (!timeLeft) {\n return 0;\n }\n\n const now = AccurateTimestamp.nowInSeconds();\n\n const value = parseInt(timeLeft.slice(0, -1), 10);\n const kind = timeLeft[timeLeft.length - 1];\n\n if (kind === 'J') {\n // Add days\n return now + value * SECONDS_PER_DAY;\n }\n\n if (kind === 'H') {\n // Add hours\n return now + value * SECONDS_PER_HOUR;\n }\n\n // Add minutes\n return now + value * SECONDS_PER_MINUTE;\n};\n\n// Forced to parse because of a freaking non-standard weird format from BO\nconst convertToIsoDate: (date: string) => string | null = (date) => {\n const res: Array<string> | null = DATE_PATTERN.exec(date);\n\n if (!res) {\n return null;\n }\n\n const [, days, months, years, hours, minutes] = res.map((n) => Number(n));\n return new Date(years, months, days, hours, minutes).toISOString();\n};\n\nconst getPurchaseList: (signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers): Promise<any> => {\n const {\n netgemApi: { distributors },\n } = getState();\n\n const promises = Array.from(Object.keys(distributors)).map((distributorId) => dispatch(getPurchaseListForDistributor(distributorId, signal, true)));\n\n return Promise.allSettled(promises).then((results: AllSettledPromises) => {\n if (signal?.aborted) {\n return;\n }\n\n const allPurchaseLists = [];\n\n results.forEach(({ status, value }) => {\n // When a response is the same as previously (HTTP 304), 'value' is undefined\n if (status === SettledPromiseFulfilled && value !== undefined) {\n allPurchaseLists.push(value);\n }\n });\n\n dispatch(updateBOPurchaseListsForAllDistributors(allPurchaseLists));\n });\n };\n\nconst getPurchaseListForDistributor: (distributorId: string, signal?: AbortSignal, skipStoreUpdate?: boolean) => RequestResponseMethodDefinitionType =\n (distributorId, signal, skipStoreUpdate) =>\n (dispatch: Dispatch): Promise<any> =>\n dispatch(sendPurchaseListRequest(distributorId, signal))\n .then(({ eTag, response }: BO_RESPONSE_WITH_ETAG) => {\n if (signal?.aborted || !response) {\n return Promise.reject(new Error(`Could not get purchase list for ${distributorId}`));\n }\n\n const purchaseList: BO_PURCHASE_LIST_BY_DISTRIBUTOR_TYPE = {};\n\n if (response.body) {\n // BO API v2\n const { body } = response;\n body.forEach((p) => {\n const {\n data: {\n purchaseTitleData: { licenseExpirationDate, licenseTimeLeft, packVtiId, vhiDate, videoPosition, vtiId },\n subType,\n },\n } = p;\n const existingItem = purchaseList[vtiId.toString()];\n\n if (!existingItem || (existingItem.packVtiId === undefined && packVtiId !== undefined)) {\n purchaseList[vtiId.toString()] = {\n expirationTime: licenseExpirationDate ? new Date(licenseExpirationDate).getTime() / MILLISECONDS_PER_SECOND : 0,\n lastBookmark: videoPosition,\n packVtiId,\n purchaseDate: vhiDate,\n subType,\n type: licenseTimeLeft === undefined || licenseTimeLeft === null ? Purchase.Buy : Purchase.Rent,\n };\n }\n });\n } else {\n // BO API v1\n const { purchases = [] } = response;\n\n purchases.forEach((p) => {\n const { currentTime: lastBookmark, licenseTimeLeft, vhiDate, vtiId } = p;\n\n purchaseList[vtiId.toString()] = {\n expirationTime: convertTimeLeftToExpirationTime(licenseTimeLeft),\n lastBookmark,\n purchaseDate: convertToIsoDate(vhiDate),\n subType: PurchaseSubType.Movie,\n type: licenseTimeLeft === undefined || licenseTimeLeft === null ? Purchase.Buy : Purchase.Rent,\n };\n });\n }\n\n if (!skipStoreUpdate) {\n dispatch(updateBOPurchaseListForDistributor(distributorId, purchaseList, eTag));\n }\n\n return { distributorId, eTag, purchaseList };\n })\n .catch((error) => {\n if (error.getStatus() !== HttpStatus.NotModified) {\n logError(`Error retrieving purchase list for \"${distributorId}\": ${error.message}`);\n }\n });\n\nexport { getPurchaseList, getPurchaseListForDistributor };\n","/* @flow */\n\nimport { SubtitlesMimeType, type VideoPlayerExternalSubtitles } from '../../../../../components/player/implementation/types';\nimport { type BO_API_SUBTITLE_TRACK_METADATA } from '../types/stream';\nimport { type Undefined } from '@ntg/utils/dist/types';\n\nconst convertSubtitleTrackMetadataToExternalSubtitles = (subtitles?: Array<BO_API_SUBTITLE_TRACK_METADATA>): Undefined<Array<VideoPlayerExternalSubtitles>> =>\n subtitles?.map((subs) => {\n return {\n captions: subs.caption,\n format: subs.format,\n language: subs.language,\n mimeType: SubtitlesMimeType.cast(subs.mimeType),\n url: subs.url,\n };\n });\n\nexport { convertSubtitleTrackMetadataToExternalSubtitles };\n","/* @flow */\n\nimport { BO_API_CREATE_STREAM2, type BO_RESPONSE_WITH_ETAG } from './types/common';\nimport type { BO_API_STREAM_TYPE, BO_API_TICKET_TYPE } from './types/stream';\nimport { Drm, getDrmName, getFirstSupportedDrm } from '../../../../helpers/jsHelpers/Drm';\nimport type { NetgemApiEmitterType, RequestResponseMethodDefinitionType } from '../emitter';\nimport type { BO_API_PARAMETERS_TYPE } from '../../../../helpers/videofutur/queryParameters';\nimport type { CombinedReducers } from '../../../reducers';\nimport type { Dispatch } from '../../../types/types';\nimport { REDUX_MSG_REQUEST_BO_STREAM_CREATE } from '../../constants';\nimport { StreamType } from '../../../../libs/netgemLibrary/v8/types/MetadataSchedule';\nimport { convertSubtitleTrackMetadataToExternalSubtitles } from './helpers/subtitles';\nimport { getIso8601DurationInSeconds } from '../../../../helpers/dateTime/Format';\nimport getRequestDetails from './helpers/requestCommon';\n\nconst sendCreateStreamRequest: (distributorId: string, vtiId: number, license: boolean, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (distributorId, vtiId, license, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const params: BO_API_PARAMETERS_TYPE = {\n license,\n vtiId,\n };\n\n if (license) {\n const drm = getFirstSupportedDrm();\n params.drm = getDrmName(drm);\n params.format = drm === Drm.Fairplay ? (StreamType.HLS: string) : (StreamType.DASH: string);\n }\n\n return dispatch(getRequestDetails(distributorId, BO_API_CREATE_STREAM2))\n .then((requestDetails) =>\n // Object 'requestDetails' contains 'headers', 'method' and 'uri' parameters\n NetgemApiEmitter.emit(REDUX_MSG_REQUEST_BO_STREAM_CREATE, {\n ...requestDetails,\n params,\n signal,\n }),\n )\n .then(({ response }: BO_RESPONSE_WITH_ETAG) => {\n const {\n body: {\n data: { grantedTicket, lastBookmark, subtitleTrackMetadatas, type: streamType, vstId },\n },\n } = response;\n\n const stream: BO_API_STREAM_TYPE = {\n appId: '',\n id: vstId,\n lastBookmark: getIso8601DurationInSeconds(lastBookmark),\n subtitles: convertSubtitleTrackMetadataToExternalSubtitles(subtitleTrackMetadatas),\n type: streamType,\n vtiId,\n };\n\n if (grantedTicket !== undefined) {\n const gt: BO_API_TICKET_TYPE = {\n contentUrl: grantedTicket.contentUrl,\n fairplayCertificateUrl: grantedTicket.fairplayCertificateUrl,\n fairplayContentKeySystem: grantedTicket.fairplayContentKeySystem,\n laUrl: grantedTicket.laUrl,\n licenceIssuer: grantedTicket.licenseIssuer,\n status: '',\n };\n\n const { heartbeat, type } = grantedTicket.urlLifecycle;\n if (typeof heartbeat === 'string' && typeof type === 'string') {\n gt.urlLifecycle = grantedTicket.urlLifecycle;\n }\n\n stream.grantedTicket = gt;\n }\n\n return { stream };\n });\n };\n\nexport default sendCreateStreamRequest;\n","/* @flow */\n\nimport { BO_API_PURCHASE, type BO_RESPONSE_WITH_ETAG } from './types/common';\nimport type { NetgemApiEmitterType, RequestResponseMethodDefinitionType } from '../emitter';\nimport { type BO_API_PURCHASE_RESPONSE_TYPE } from './types/purchase';\nimport { BO_PURCHASE_STATUS_OK } from '../../../../libs/netgemLibrary/videofutur/types/ErrorCodes';\nimport type { CombinedReducers } from '../../../reducers';\nimport type { Dispatch } from '../../../types/types';\nimport { REDUX_MSG_REQUEST_BO_PURCHASE } from '../../constants';\nimport { buildErrorResponse } from '../helpers/bo';\nimport getRequestDetails from './helpers/requestCommon';\n\nconst mapResponse: (response: any) => BO_API_PURCHASE_RESPONSE_TYPE = (response) => {\n const { body } = response;\n\n if (!body?.data) {\n return buildErrorResponse(null, {});\n }\n\n const {\n // TODO: when BO API v2 is OK, use 'price' which is already a number\n data: { displayPrice },\n } = body;\n\n return {\n price: displayPrice,\n status: BO_PURCHASE_STATUS_OK,\n };\n};\n\nconst sendPurchaseRequest: (distributorId: string, vtiId: number, promocode: string, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (distributorId, vtiId, promocode, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> =>\n dispatch(getRequestDetails(distributorId, BO_API_PURCHASE)).then((requestDetails) =>\n // Object 'requestDetails' contains 'headers', 'method' and 'uri' parameters\n NetgemApiEmitter.emit(REDUX_MSG_REQUEST_BO_PURCHASE, {\n ...requestDetails,\n promocode,\n signal,\n vtiId,\n }).then(({ response }: BO_RESPONSE_WITH_ETAG) => mapResponse(response)),\n );\n\nexport default sendPurchaseRequest;\n","function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}\nexport { _typeof as default };","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nfunction toPropertyKey(t) {\n var i = toPrimitive(t, \"string\");\n return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\nexport { toPropertyKey as default };","import _typeof from \"./typeof.js\";\nfunction toPrimitive(t, r) {\n if (\"object\" != _typeof(t) || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != _typeof(i)) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nexport { toPrimitive as default };","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperty(e, r, t) {\n return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[r] = t, e;\n}\nexport { _defineProperty as default };","/*!\n * @kurkle/color v0.3.4\n * https://github.com/kurkle/color#readme\n * (c) 2024 Jukka Kurkela\n * Released under the MIT License\n */\nfunction round(v) {\n return v + 0.5 | 0;\n}\nconst lim = (v, l, h) => Math.max(Math.min(v, h), l);\nfunction p2b(v) {\n return lim(round(v * 2.55), 0, 255);\n}\nfunction b2p(v) {\n return lim(round(v / 2.55), 0, 100);\n}\nfunction n2b(v) {\n return lim(round(v * 255), 0, 255);\n}\nfunction b2n(v) {\n return lim(round(v / 2.55) / 100, 0, 1);\n}\nfunction n2p(v) {\n return lim(round(v * 100), 0, 100);\n}\n\nconst map$1 = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, A: 10, B: 11, C: 12, D: 13, E: 14, F: 15, a: 10, b: 11, c: 12, d: 13, e: 14, f: 15};\nconst hex = [...'0123456789ABCDEF'];\nconst h1 = b => hex[b & 0xF];\nconst h2 = b => hex[(b & 0xF0) >> 4] + hex[b & 0xF];\nconst eq = b => ((b & 0xF0) >> 4) === (b & 0xF);\nconst isShort = v => eq(v.r) && eq(v.g) && eq(v.b) && eq(v.a);\nfunction hexParse(str) {\n var len = str.length;\n var ret;\n if (str[0] === '#') {\n if (len === 4 || len === 5) {\n ret = {\n r: 255 & map$1[str[1]] * 17,\n g: 255 & map$1[str[2]] * 17,\n b: 255 & map$1[str[3]] * 17,\n a: len === 5 ? map$1[str[4]] * 17 : 255\n };\n } else if (len === 7 || len === 9) {\n ret = {\n r: map$1[str[1]] << 4 | map$1[str[2]],\n g: map$1[str[3]] << 4 | map$1[str[4]],\n b: map$1[str[5]] << 4 | map$1[str[6]],\n a: len === 9 ? (map$1[str[7]] << 4 | map$1[str[8]]) : 255\n };\n }\n }\n return ret;\n}\nconst alpha = (a, f) => a < 255 ? f(a) : '';\nfunction hexString(v) {\n var f = isShort(v) ? h1 : h2;\n return v\n ? '#' + f(v.r) + f(v.g) + f(v.b) + alpha(v.a, f)\n : undefined;\n}\n\nconst HUE_RE = /^(hsla?|hwb|hsv)\\(\\s*([-+.e\\d]+)(?:deg)?[\\s,]+([-+.e\\d]+)%[\\s,]+([-+.e\\d]+)%(?:[\\s,]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction hsl2rgbn(h, s, l) {\n const a = s * Math.min(l, 1 - l);\n const f = (n, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return [f(0), f(8), f(4)];\n}\nfunction hsv2rgbn(h, s, v) {\n const f = (n, k = (n + h / 60) % 6) => v - v * s * Math.max(Math.min(k, 4 - k, 1), 0);\n return [f(5), f(3), f(1)];\n}\nfunction hwb2rgbn(h, w, b) {\n const rgb = hsl2rgbn(h, 1, 0.5);\n let i;\n if (w + b > 1) {\n i = 1 / (w + b);\n w *= i;\n b *= i;\n }\n for (i = 0; i < 3; i++) {\n rgb[i] *= 1 - w - b;\n rgb[i] += w;\n }\n return rgb;\n}\nfunction hueValue(r, g, b, d, max) {\n if (r === max) {\n return ((g - b) / d) + (g < b ? 6 : 0);\n }\n if (g === max) {\n return (b - r) / d + 2;\n }\n return (r - g) / d + 4;\n}\nfunction rgb2hsl(v) {\n const range = 255;\n const r = v.r / range;\n const g = v.g / range;\n const b = v.b / range;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n let h, s, d;\n if (max !== min) {\n d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n h = hueValue(r, g, b, d, max);\n h = h * 60 + 0.5;\n }\n return [h | 0, s || 0, l];\n}\nfunction calln(f, a, b, c) {\n return (\n Array.isArray(a)\n ? f(a[0], a[1], a[2])\n : f(a, b, c)\n ).map(n2b);\n}\nfunction hsl2rgb(h, s, l) {\n return calln(hsl2rgbn, h, s, l);\n}\nfunction hwb2rgb(h, w, b) {\n return calln(hwb2rgbn, h, w, b);\n}\nfunction hsv2rgb(h, s, v) {\n return calln(hsv2rgbn, h, s, v);\n}\nfunction hue(h) {\n return (h % 360 + 360) % 360;\n}\nfunction hueParse(str) {\n const m = HUE_RE.exec(str);\n let a = 255;\n let v;\n if (!m) {\n return;\n }\n if (m[5] !== v) {\n a = m[6] ? p2b(+m[5]) : n2b(+m[5]);\n }\n const h = hue(+m[2]);\n const p1 = +m[3] / 100;\n const p2 = +m[4] / 100;\n if (m[1] === 'hwb') {\n v = hwb2rgb(h, p1, p2);\n } else if (m[1] === 'hsv') {\n v = hsv2rgb(h, p1, p2);\n } else {\n v = hsl2rgb(h, p1, p2);\n }\n return {\n r: v[0],\n g: v[1],\n b: v[2],\n a: a\n };\n}\nfunction rotate(v, deg) {\n var h = rgb2hsl(v);\n h[0] = hue(h[0] + deg);\n h = hsl2rgb(h);\n v.r = h[0];\n v.g = h[1];\n v.b = h[2];\n}\nfunction hslString(v) {\n if (!v) {\n return;\n }\n const a = rgb2hsl(v);\n const h = a[0];\n const s = n2p(a[1]);\n const l = n2p(a[2]);\n return v.a < 255\n ? `hsla(${h}, ${s}%, ${l}%, ${b2n(v.a)})`\n : `hsl(${h}, ${s}%, ${l}%)`;\n}\n\nconst map = {\n\tx: 'dark',\n\tZ: 'light',\n\tY: 're',\n\tX: 'blu',\n\tW: 'gr',\n\tV: 'medium',\n\tU: 'slate',\n\tA: 'ee',\n\tT: 'ol',\n\tS: 'or',\n\tB: 'ra',\n\tC: 'lateg',\n\tD: 'ights',\n\tR: 'in',\n\tQ: 'turquois',\n\tE: 'hi',\n\tP: 'ro',\n\tO: 'al',\n\tN: 'le',\n\tM: 'de',\n\tL: 'yello',\n\tF: 'en',\n\tK: 'ch',\n\tG: 'arks',\n\tH: 'ea',\n\tI: 'ightg',\n\tJ: 'wh'\n};\nconst names$1 = {\n\tOiceXe: 'f0f8ff',\n\tantiquewEte: 'faebd7',\n\taqua: 'ffff',\n\taquamarRe: '7fffd4',\n\tazuY: 'f0ffff',\n\tbeige: 'f5f5dc',\n\tbisque: 'ffe4c4',\n\tblack: '0',\n\tblanKedOmond: 'ffebcd',\n\tXe: 'ff',\n\tXeviTet: '8a2be2',\n\tbPwn: 'a52a2a',\n\tburlywood: 'deb887',\n\tcaMtXe: '5f9ea0',\n\tKartYuse: '7fff00',\n\tKocTate: 'd2691e',\n\tcSO: 'ff7f50',\n\tcSnflowerXe: '6495ed',\n\tcSnsilk: 'fff8dc',\n\tcrimson: 'dc143c',\n\tcyan: 'ffff',\n\txXe: '8b',\n\txcyan: '8b8b',\n\txgTMnPd: 'b8860b',\n\txWay: 'a9a9a9',\n\txgYF: '6400',\n\txgYy: 'a9a9a9',\n\txkhaki: 'bdb76b',\n\txmagFta: '8b008b',\n\txTivegYF: '556b2f',\n\txSange: 'ff8c00',\n\txScEd: '9932cc',\n\txYd: '8b0000',\n\txsOmon: 'e9967a',\n\txsHgYF: '8fbc8f',\n\txUXe: '483d8b',\n\txUWay: '2f4f4f',\n\txUgYy: '2f4f4f',\n\txQe: 'ced1',\n\txviTet: '9400d3',\n\tdAppRk: 'ff1493',\n\tdApskyXe: 'bfff',\n\tdimWay: '696969',\n\tdimgYy: '696969',\n\tdodgerXe: '1e90ff',\n\tfiYbrick: 'b22222',\n\tflSOwEte: 'fffaf0',\n\tfoYstWAn: '228b22',\n\tfuKsia: 'ff00ff',\n\tgaRsbSo: 'dcdcdc',\n\tghostwEte: 'f8f8ff',\n\tgTd: 'ffd700',\n\tgTMnPd: 'daa520',\n\tWay: '808080',\n\tgYF: '8000',\n\tgYFLw: 'adff2f',\n\tgYy: '808080',\n\thoneyMw: 'f0fff0',\n\thotpRk: 'ff69b4',\n\tRdianYd: 'cd5c5c',\n\tRdigo: '4b0082',\n\tivSy: 'fffff0',\n\tkhaki: 'f0e68c',\n\tlavFMr: 'e6e6fa',\n\tlavFMrXsh: 'fff0f5',\n\tlawngYF: '7cfc00',\n\tNmoncEffon: 'fffacd',\n\tZXe: 'add8e6',\n\tZcSO: 'f08080',\n\tZcyan: 'e0ffff',\n\tZgTMnPdLw: 'fafad2',\n\tZWay: 'd3d3d3',\n\tZgYF: '90ee90',\n\tZgYy: 'd3d3d3',\n\tZpRk: 'ffb6c1',\n\tZsOmon: 'ffa07a',\n\tZsHgYF: '20b2aa',\n\tZskyXe: '87cefa',\n\tZUWay: '778899',\n\tZUgYy: '778899',\n\tZstAlXe: 'b0c4de',\n\tZLw: 'ffffe0',\n\tlime: 'ff00',\n\tlimegYF: '32cd32',\n\tlRF: 'faf0e6',\n\tmagFta: 'ff00ff',\n\tmaPon: '800000',\n\tVaquamarRe: '66cdaa',\n\tVXe: 'cd',\n\tVScEd: 'ba55d3',\n\tVpurpN: '9370db',\n\tVsHgYF: '3cb371',\n\tVUXe: '7b68ee',\n\tVsprRggYF: 'fa9a',\n\tVQe: '48d1cc',\n\tVviTetYd: 'c71585',\n\tmidnightXe: '191970',\n\tmRtcYam: 'f5fffa',\n\tmistyPse: 'ffe4e1',\n\tmoccasR: 'ffe4b5',\n\tnavajowEte: 'ffdead',\n\tnavy: '80',\n\tTdlace: 'fdf5e6',\n\tTive: '808000',\n\tTivedBb: '6b8e23',\n\tSange: 'ffa500',\n\tSangeYd: 'ff4500',\n\tScEd: 'da70d6',\n\tpOegTMnPd: 'eee8aa',\n\tpOegYF: '98fb98',\n\tpOeQe: 'afeeee',\n\tpOeviTetYd: 'db7093',\n\tpapayawEp: 'ffefd5',\n\tpHKpuff: 'ffdab9',\n\tperu: 'cd853f',\n\tpRk: 'ffc0cb',\n\tplum: 'dda0dd',\n\tpowMrXe: 'b0e0e6',\n\tpurpN: '800080',\n\tYbeccapurpN: '663399',\n\tYd: 'ff0000',\n\tPsybrown: 'bc8f8f',\n\tPyOXe: '4169e1',\n\tsaddNbPwn: '8b4513',\n\tsOmon: 'fa8072',\n\tsandybPwn: 'f4a460',\n\tsHgYF: '2e8b57',\n\tsHshell: 'fff5ee',\n\tsiFna: 'a0522d',\n\tsilver: 'c0c0c0',\n\tskyXe: '87ceeb',\n\tUXe: '6a5acd',\n\tUWay: '708090',\n\tUgYy: '708090',\n\tsnow: 'fffafa',\n\tsprRggYF: 'ff7f',\n\tstAlXe: '4682b4',\n\ttan: 'd2b48c',\n\tteO: '8080',\n\ttEstN: 'd8bfd8',\n\ttomato: 'ff6347',\n\tQe: '40e0d0',\n\tviTet: 'ee82ee',\n\tJHt: 'f5deb3',\n\twEte: 'ffffff',\n\twEtesmoke: 'f5f5f5',\n\tLw: 'ffff00',\n\tLwgYF: '9acd32'\n};\nfunction unpack() {\n const unpacked = {};\n const keys = Object.keys(names$1);\n const tkeys = Object.keys(map);\n let i, j, k, ok, nk;\n for (i = 0; i < keys.length; i++) {\n ok = nk = keys[i];\n for (j = 0; j < tkeys.length; j++) {\n k = tkeys[j];\n nk = nk.replace(k, map[k]);\n }\n k = parseInt(names$1[ok], 16);\n unpacked[nk] = [k >> 16 & 0xFF, k >> 8 & 0xFF, k & 0xFF];\n }\n return unpacked;\n}\n\nlet names;\nfunction nameParse(str) {\n if (!names) {\n names = unpack();\n names.transparent = [0, 0, 0, 0];\n }\n const a = names[str.toLowerCase()];\n return a && {\n r: a[0],\n g: a[1],\n b: a[2],\n a: a.length === 4 ? a[3] : 255\n };\n}\n\nconst RGB_RE = /^rgba?\\(\\s*([-+.\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?(?:[\\s,/]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction rgbParse(str) {\n const m = RGB_RE.exec(str);\n let a = 255;\n let r, g, b;\n if (!m) {\n return;\n }\n if (m[7] !== r) {\n const v = +m[7];\n a = m[8] ? p2b(v) : lim(v * 255, 0, 255);\n }\n r = +m[1];\n g = +m[3];\n b = +m[5];\n r = 255 & (m[2] ? p2b(r) : lim(r, 0, 255));\n g = 255 & (m[4] ? p2b(g) : lim(g, 0, 255));\n b = 255 & (m[6] ? p2b(b) : lim(b, 0, 255));\n return {\n r: r,\n g: g,\n b: b,\n a: a\n };\n}\nfunction rgbString(v) {\n return v && (\n v.a < 255\n ? `rgba(${v.r}, ${v.g}, ${v.b}, ${b2n(v.a)})`\n : `rgb(${v.r}, ${v.g}, ${v.b})`\n );\n}\n\nconst to = v => v <= 0.0031308 ? v * 12.92 : Math.pow(v, 1.0 / 2.4) * 1.055 - 0.055;\nconst from = v => v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\nfunction interpolate(rgb1, rgb2, t) {\n const r = from(b2n(rgb1.r));\n const g = from(b2n(rgb1.g));\n const b = from(b2n(rgb1.b));\n return {\n r: n2b(to(r + t * (from(b2n(rgb2.r)) - r))),\n g: n2b(to(g + t * (from(b2n(rgb2.g)) - g))),\n b: n2b(to(b + t * (from(b2n(rgb2.b)) - b))),\n a: rgb1.a + t * (rgb2.a - rgb1.a)\n };\n}\n\nfunction modHSL(v, i, ratio) {\n if (v) {\n let tmp = rgb2hsl(v);\n tmp[i] = Math.max(0, Math.min(tmp[i] + tmp[i] * ratio, i === 0 ? 360 : 1));\n tmp = hsl2rgb(tmp);\n v.r = tmp[0];\n v.g = tmp[1];\n v.b = tmp[2];\n }\n}\nfunction clone(v, proto) {\n return v ? Object.assign(proto || {}, v) : v;\n}\nfunction fromObject(input) {\n var v = {r: 0, g: 0, b: 0, a: 255};\n if (Array.isArray(input)) {\n if (input.length >= 3) {\n v = {r: input[0], g: input[1], b: input[2], a: 255};\n if (input.length > 3) {\n v.a = n2b(input[3]);\n }\n }\n } else {\n v = clone(input, {r: 0, g: 0, b: 0, a: 1});\n v.a = n2b(v.a);\n }\n return v;\n}\nfunction functionParse(str) {\n if (str.charAt(0) === 'r') {\n return rgbParse(str);\n }\n return hueParse(str);\n}\nclass Color {\n constructor(input) {\n if (input instanceof Color) {\n return input;\n }\n const type = typeof input;\n let v;\n if (type === 'object') {\n v = fromObject(input);\n } else if (type === 'string') {\n v = hexParse(input) || nameParse(input) || functionParse(input);\n }\n this._rgb = v;\n this._valid = !!v;\n }\n get valid() {\n return this._valid;\n }\n get rgb() {\n var v = clone(this._rgb);\n if (v) {\n v.a = b2n(v.a);\n }\n return v;\n }\n set rgb(obj) {\n this._rgb = fromObject(obj);\n }\n rgbString() {\n return this._valid ? rgbString(this._rgb) : undefined;\n }\n hexString() {\n return this._valid ? hexString(this._rgb) : undefined;\n }\n hslString() {\n return this._valid ? hslString(this._rgb) : undefined;\n }\n mix(color, weight) {\n if (color) {\n const c1 = this.rgb;\n const c2 = color.rgb;\n let w2;\n const p = weight === w2 ? 0.5 : weight;\n const w = 2 * p - 1;\n const a = c1.a - c2.a;\n const w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n w2 = 1 - w1;\n c1.r = 0xFF & w1 * c1.r + w2 * c2.r + 0.5;\n c1.g = 0xFF & w1 * c1.g + w2 * c2.g + 0.5;\n c1.b = 0xFF & w1 * c1.b + w2 * c2.b + 0.5;\n c1.a = p * c1.a + (1 - p) * c2.a;\n this.rgb = c1;\n }\n return this;\n }\n interpolate(color, t) {\n if (color) {\n this._rgb = interpolate(this._rgb, color._rgb, t);\n }\n return this;\n }\n clone() {\n return new Color(this.rgb);\n }\n alpha(a) {\n this._rgb.a = n2b(a);\n return this;\n }\n clearer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 - ratio;\n return this;\n }\n greyscale() {\n const rgb = this._rgb;\n const val = round(rgb.r * 0.3 + rgb.g * 0.59 + rgb.b * 0.11);\n rgb.r = rgb.g = rgb.b = val;\n return this;\n }\n opaquer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 + ratio;\n return this;\n }\n negate() {\n const v = this._rgb;\n v.r = 255 - v.r;\n v.g = 255 - v.g;\n v.b = 255 - v.b;\n return this;\n }\n lighten(ratio) {\n modHSL(this._rgb, 2, ratio);\n return this;\n }\n darken(ratio) {\n modHSL(this._rgb, 2, -ratio);\n return this;\n }\n saturate(ratio) {\n modHSL(this._rgb, 1, ratio);\n return this;\n }\n desaturate(ratio) {\n modHSL(this._rgb, 1, -ratio);\n return this;\n }\n rotate(deg) {\n rotate(this._rgb, deg);\n return this;\n }\n}\n\nfunction index_esm(input) {\n return new Color(input);\n}\n\nexport { Color, b2n, b2p, index_esm as default, hexParse, hexString, hsl2rgb, hslString, hsv2rgb, hueParse, hwb2rgb, lim, n2b, n2p, nameParse, p2b, rgb2hsl, rgbParse, rgbString, rotate, round };\n","/**\n * @namespace Chart.helpers\n */\n\nimport type {AnyObject} from '../types/basic.js';\nimport type {ActiveDataPoint, ChartEvent} from '../types/index.js';\n\n/**\n * An empty function that can be used, for example, for optional callback.\n */\nexport function noop() {\n /* noop */\n}\n\n/**\n * Returns a unique id, sequentially generated from a global variable.\n */\nexport const uid = (() => {\n let id = 0;\n return () => id++;\n})();\n\n/**\n * Returns true if `value` is neither null nor undefined, else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */\nexport function isNullOrUndef(value: unknown): value is null | undefined {\n return value === null || value === undefined;\n}\n\n/**\n * Returns true if `value` is an array (including typed arrays), else returns false.\n * @param value - The value to test.\n * @function\n */\nexport function isArray<T = unknown>(value: unknown): value is T[] {\n if (Array.isArray && Array.isArray(value)) {\n return true;\n }\n const type = Object.prototype.toString.call(value);\n if (type.slice(0, 7) === '[object' && type.slice(-6) === 'Array]') {\n return true;\n }\n return false;\n}\n\n/**\n * Returns true if `value` is an object (excluding null), else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */\nexport function isObject(value: unknown): value is AnyObject {\n return value !== null && Object.prototype.toString.call(value) === '[object Object]';\n}\n\n/**\n * Returns true if `value` is a finite number, else returns false\n * @param value - The value to test.\n */\nfunction isNumberFinite(value: unknown): value is number {\n return (typeof value === 'number' || value instanceof Number) && isFinite(+value);\n}\nexport {\n isNumberFinite as isFinite,\n};\n\n/**\n * Returns `value` if finite, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is not finite.\n */\nexport function finiteOrDefault(value: unknown, defaultValue: number) {\n return isNumberFinite(value) ? value : defaultValue;\n}\n\n/**\n * Returns `value` if defined, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is undefined.\n */\nexport function valueOrDefault<T>(value: T | undefined, defaultValue: T) {\n return typeof value === 'undefined' ? defaultValue : value;\n}\n\nexport const toPercentage = (value: number | string, dimension: number) =>\n typeof value === 'string' && value.endsWith('%') ?\n parseFloat(value) / 100\n : +value / dimension;\n\nexport const toDimension = (value: number | string, dimension: number) =>\n typeof value === 'string' && value.endsWith('%') ?\n parseFloat(value) / 100 * dimension\n : +value;\n\n/**\n * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the\n * value returned by `fn`. If `fn` is not a function, this method returns undefined.\n * @param fn - The function to call.\n * @param args - The arguments with which `fn` should be called.\n * @param [thisArg] - The value of `this` provided for the call to `fn`.\n */\nexport function callback<T extends (this: TA, ...restArgs: unknown[]) => R, TA, R>(\n fn: T | undefined,\n args: unknown[],\n thisArg?: TA\n): R | undefined {\n if (fn && typeof fn.call === 'function') {\n return fn.apply(thisArg, args);\n }\n}\n\n/**\n * Note(SB) for performance sake, this method should only be used when loopable type\n * is unknown or in none intensive code (not called often and small loopable). Else\n * it's preferable to use a regular for() loop and save extra function calls.\n * @param loopable - The object or array to be iterated.\n * @param fn - The function to call for each item.\n * @param [thisArg] - The value of `this` provided for the call to `fn`.\n * @param [reverse] - If true, iterates backward on the loopable.\n */\nexport function each<T, TA>(\n loopable: Record<string, T>,\n fn: (this: TA, v: T, i: string) => void,\n thisArg?: TA,\n reverse?: boolean\n): void;\nexport function each<T, TA>(\n loopable: T[],\n fn: (this: TA, v: T, i: number) => void,\n thisArg?: TA,\n reverse?: boolean\n): void;\nexport function each<T, TA>(\n loopable: T[] | Record<string, T>,\n fn: (this: TA, v: T, i: any) => void,\n thisArg?: TA,\n reverse?: boolean\n) {\n let i: number, len: number, keys: string[];\n if (isArray(loopable)) {\n len = loopable.length;\n if (reverse) {\n for (i = len - 1; i >= 0; i--) {\n fn.call(thisArg, loopable[i], i);\n }\n } else {\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[i], i);\n }\n }\n } else if (isObject(loopable)) {\n keys = Object.keys(loopable);\n len = keys.length;\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[keys[i]], keys[i]);\n }\n }\n}\n\n/**\n * Returns true if the `a0` and `a1` arrays have the same content, else returns false.\n * @param a0 - The array to compare\n * @param a1 - The array to compare\n * @private\n */\nexport function _elementsEqual(a0: ActiveDataPoint[], a1: ActiveDataPoint[]) {\n let i: number, ilen: number, v0: ActiveDataPoint, v1: ActiveDataPoint;\n\n if (!a0 || !a1 || a0.length !== a1.length) {\n return false;\n }\n\n for (i = 0, ilen = a0.length; i < ilen; ++i) {\n v0 = a0[i];\n v1 = a1[i];\n\n if (v0.datasetIndex !== v1.datasetIndex || v0.index !== v1.index) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Returns a deep copy of `source` without keeping references on objects and arrays.\n * @param source - The value to clone.\n */\nexport function clone<T>(source: T): T {\n if (isArray(source)) {\n return source.map(clone) as unknown as T;\n }\n\n if (isObject(source)) {\n const target = Object.create(null);\n const keys = Object.keys(source);\n const klen = keys.length;\n let k = 0;\n\n for (; k < klen; ++k) {\n target[keys[k]] = clone(source[keys[k]]);\n }\n\n return target;\n }\n\n return source;\n}\n\nfunction isValidKey(key: string) {\n return ['__proto__', 'prototype', 'constructor'].indexOf(key) === -1;\n}\n\n/**\n * The default merger when Chart.helpers.merge is called without merger option.\n * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback.\n * @private\n */\nexport function _merger(key: string, target: AnyObject, source: AnyObject, options: AnyObject) {\n if (!isValidKey(key)) {\n return;\n }\n\n const tval = target[key];\n const sval = source[key];\n\n if (isObject(tval) && isObject(sval)) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n merge(tval, sval, options);\n } else {\n target[key] = clone(sval);\n }\n}\n\nexport interface MergeOptions {\n merger?: (key: string, target: AnyObject, source: AnyObject, options?: AnyObject) => void;\n}\n\n/**\n * Recursively deep copies `source` properties into `target` with the given `options`.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param target - The target object in which all sources are merged into.\n * @param source - Object(s) to merge into `target`.\n * @param [options] - Merging options:\n * @param [options.merger] - The merge method (key, target, source, options)\n * @returns The `target` object.\n */\nexport function merge<T>(target: T, source: [], options?: MergeOptions): T;\nexport function merge<T, S1>(target: T, source: S1, options?: MergeOptions): T & S1;\nexport function merge<T, S1>(target: T, source: [S1], options?: MergeOptions): T & S1;\nexport function merge<T, S1, S2>(target: T, source: [S1, S2], options?: MergeOptions): T & S1 & S2;\nexport function merge<T, S1, S2, S3>(target: T, source: [S1, S2, S3], options?: MergeOptions): T & S1 & S2 & S3;\nexport function merge<T, S1, S2, S3, S4>(\n target: T,\n source: [S1, S2, S3, S4],\n options?: MergeOptions\n): T & S1 & S2 & S3 & S4;\nexport function merge<T>(target: T, source: AnyObject[], options?: MergeOptions): AnyObject;\nexport function merge<T>(target: T, source: AnyObject[], options?: MergeOptions): AnyObject {\n const sources = isArray(source) ? source : [source];\n const ilen = sources.length;\n\n if (!isObject(target)) {\n return target as AnyObject;\n }\n\n options = options || {};\n const merger = options.merger || _merger;\n let current: AnyObject;\n\n for (let i = 0; i < ilen; ++i) {\n current = sources[i];\n if (!isObject(current)) {\n continue;\n }\n\n const keys = Object.keys(current);\n for (let k = 0, klen = keys.length; k < klen; ++k) {\n merger(keys[k], target, current, options as AnyObject);\n }\n }\n\n return target;\n}\n\n/**\n * Recursively deep copies `source` properties into `target` *only* if not defined in target.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param target - The target object in which all sources are merged into.\n * @param source - Object(s) to merge into `target`.\n * @returns The `target` object.\n */\nexport function mergeIf<T>(target: T, source: []): T;\nexport function mergeIf<T, S1>(target: T, source: S1): T & S1;\nexport function mergeIf<T, S1>(target: T, source: [S1]): T & S1;\nexport function mergeIf<T, S1, S2>(target: T, source: [S1, S2]): T & S1 & S2;\nexport function mergeIf<T, S1, S2, S3>(target: T, source: [S1, S2, S3]): T & S1 & S2 & S3;\nexport function mergeIf<T, S1, S2, S3, S4>(target: T, source: [S1, S2, S3, S4]): T & S1 & S2 & S3 & S4;\nexport function mergeIf<T>(target: T, source: AnyObject[]): AnyObject;\nexport function mergeIf<T>(target: T, source: AnyObject[]): AnyObject {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n return merge<T>(target, source, {merger: _mergerIf});\n}\n\n/**\n * Merges source[key] in target[key] only if target[key] is undefined.\n * @private\n */\nexport function _mergerIf(key: string, target: AnyObject, source: AnyObject) {\n if (!isValidKey(key)) {\n return;\n }\n\n const tval = target[key];\n const sval = source[key];\n\n if (isObject(tval) && isObject(sval)) {\n mergeIf(tval, sval);\n } else if (!Object.prototype.hasOwnProperty.call(target, key)) {\n target[key] = clone(sval);\n }\n}\n\n/**\n * @private\n */\nexport function _deprecated(scope: string, value: unknown, previous: string, current: string) {\n if (value !== undefined) {\n console.warn(scope + ': \"' + previous +\n '\" is deprecated. Please use \"' + current + '\" instead');\n }\n}\n\n// resolveObjectKey resolver cache\nconst keyResolvers = {\n // Chart.helpers.core resolveObjectKey should resolve empty key to root object\n '': v => v,\n // default resolvers\n x: o => o.x,\n y: o => o.y\n};\n\n/**\n * @private\n */\nexport function _splitKey(key: string) {\n const parts = key.split('.');\n const keys: string[] = [];\n let tmp = '';\n for (const part of parts) {\n tmp += part;\n if (tmp.endsWith('\\\\')) {\n tmp = tmp.slice(0, -1) + '.';\n } else {\n keys.push(tmp);\n tmp = '';\n }\n }\n return keys;\n}\n\nfunction _getKeyResolver(key: string) {\n const keys = _splitKey(key);\n return obj => {\n for (const k of keys) {\n if (k === '') {\n // For backward compatibility:\n // Chart.helpers.core resolveObjectKey should break at empty key\n break;\n }\n obj = obj && obj[k];\n }\n return obj;\n };\n}\n\nexport function resolveObjectKey(obj: AnyObject, key: string): any {\n const resolver = keyResolvers[key] || (keyResolvers[key] = _getKeyResolver(key));\n return resolver(obj);\n}\n\n/**\n * @private\n */\nexport function _capitalize(str: string) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n\nexport const defined = (value: unknown) => typeof value !== 'undefined';\n\nexport const isFunction = (value: unknown): value is (...args: any[]) => any => typeof value === 'function';\n\n// Adapted from https://stackoverflow.com/questions/31128855/comparing-ecma6-sets-for-equality#31129384\nexport const setsEqual = <T>(a: Set<T>, b: Set<T>) => {\n if (a.size !== b.size) {\n return false;\n }\n\n for (const item of a) {\n if (!b.has(item)) {\n return false;\n }\n }\n\n return true;\n};\n\n/**\n * @param e - The event\n * @private\n */\nexport function _isClickEvent(e: ChartEvent) {\n return e.type === 'mouseup' || e.type === 'click' || e.type === 'contextmenu';\n}\n","import type {Point} from '../types/geometric.js';\nimport {isFinite as isFiniteNumber} from './helpers.core.js';\n\n/**\n * @alias Chart.helpers.math\n * @namespace\n */\n\nexport const PI = Math.PI;\nexport const TAU = 2 * PI;\nexport const PITAU = TAU + PI;\nexport const INFINITY = Number.POSITIVE_INFINITY;\nexport const RAD_PER_DEG = PI / 180;\nexport const HALF_PI = PI / 2;\nexport const QUARTER_PI = PI / 4;\nexport const TWO_THIRDS_PI = PI * 2 / 3;\n\nexport const log10 = Math.log10;\nexport const sign = Math.sign;\n\nexport function almostEquals(x: number, y: number, epsilon: number) {\n return Math.abs(x - y) < epsilon;\n}\n\n/**\n * Implementation of the nice number algorithm used in determining where axis labels will go\n */\nexport function niceNum(range: number) {\n const roundedRange = Math.round(range);\n range = almostEquals(range, roundedRange, range / 1000) ? roundedRange : range;\n const niceRange = Math.pow(10, Math.floor(log10(range)));\n const fraction = range / niceRange;\n const niceFraction = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10;\n return niceFraction * niceRange;\n}\n\n/**\n * Returns an array of factors sorted from 1 to sqrt(value)\n * @private\n */\nexport function _factorize(value: number) {\n const result: number[] = [];\n const sqrt = Math.sqrt(value);\n let i: number;\n\n for (i = 1; i < sqrt; i++) {\n if (value % i === 0) {\n result.push(i);\n result.push(value / i);\n }\n }\n if (sqrt === (sqrt | 0)) { // if value is a square number\n result.push(sqrt);\n }\n\n result.sort((a, b) => a - b).pop();\n return result;\n}\n\n/**\n * Verifies that attempting to coerce n to string or number won't throw a TypeError.\n */\nfunction isNonPrimitive(n: unknown) {\n return typeof n === 'symbol' || (typeof n === 'object' && n !== null && !(Symbol.toPrimitive in n || 'toString' in n || 'valueOf' in n));\n}\n\nexport function isNumber(n: unknown): n is number {\n return !isNonPrimitive(n) && !isNaN(parseFloat(n as string)) && isFinite(n as number);\n}\n\nexport function almostWhole(x: number, epsilon: number) {\n const rounded = Math.round(x);\n return ((rounded - epsilon) <= x) && ((rounded + epsilon) >= x);\n}\n\n/**\n * @private\n */\nexport function _setMinAndMaxByKey(\n array: Record<string, number>[],\n target: { min: number, max: number },\n property: string\n) {\n let i: number, ilen: number, value: number;\n\n for (i = 0, ilen = array.length; i < ilen; i++) {\n value = array[i][property];\n if (!isNaN(value)) {\n target.min = Math.min(target.min, value);\n target.max = Math.max(target.max, value);\n }\n }\n}\n\nexport function toRadians(degrees: number) {\n return degrees * (PI / 180);\n}\n\nexport function toDegrees(radians: number) {\n return radians * (180 / PI);\n}\n\n/**\n * Returns the number of decimal places\n * i.e. the number of digits after the decimal point, of the value of this Number.\n * @param x - A number.\n * @returns The number of decimal places.\n * @private\n */\nexport function _decimalPlaces(x: number) {\n if (!isFiniteNumber(x)) {\n return;\n }\n let e = 1;\n let p = 0;\n while (Math.round(x * e) / e !== x) {\n e *= 10;\n p++;\n }\n return p;\n}\n\n// Gets the angle from vertical upright to the point about a centre.\nexport function getAngleFromPoint(\n centrePoint: Point,\n anglePoint: Point\n) {\n const distanceFromXCenter = anglePoint.x - centrePoint.x;\n const distanceFromYCenter = anglePoint.y - centrePoint.y;\n const radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n\n let angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n\n if (angle < (-0.5 * PI)) {\n angle += TAU; // make sure the returned angle is in the range of (-PI/2, 3PI/2]\n }\n\n return {\n angle,\n distance: radialDistanceFromCenter\n };\n}\n\nexport function distanceBetweenPoints(pt1: Point, pt2: Point) {\n return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n}\n\n/**\n * Shortest distance between angles, in either direction.\n * @private\n */\nexport function _angleDiff(a: number, b: number) {\n return (a - b + PITAU) % TAU - PI;\n}\n\n/**\n * Normalize angle to be between 0 and 2*PI\n * @private\n */\nexport function _normalizeAngle(a: number) {\n return (a % TAU + TAU) % TAU;\n}\n\n/**\n * @private\n */\nexport function _angleBetween(angle: number, start: number, end: number, sameAngleIsFullCircle?: boolean) {\n const a = _normalizeAngle(angle);\n const s = _normalizeAngle(start);\n const e = _normalizeAngle(end);\n const angleToStart = _normalizeAngle(s - a);\n const angleToEnd = _normalizeAngle(e - a);\n const startToAngle = _normalizeAngle(a - s);\n const endToAngle = _normalizeAngle(a - e);\n return a === s || a === e || (sameAngleIsFullCircle && s === e)\n || (angleToStart > angleToEnd && startToAngle < endToAngle);\n}\n\n/**\n * Limit `value` between `min` and `max`\n * @param value\n * @param min\n * @param max\n * @private\n */\nexport function _limitValue(value: number, min: number, max: number) {\n return Math.max(min, Math.min(max, value));\n}\n\n/**\n * @param {number} value\n * @private\n */\nexport function _int16Range(value: number) {\n return _limitValue(value, -32768, 32767);\n}\n\n/**\n * @param value\n * @param start\n * @param end\n * @param [epsilon]\n * @private\n */\nexport function _isBetween(value: number, start: number, end: number, epsilon = 1e-6) {\n return value >= Math.min(start, end) - epsilon && value <= Math.max(start, end) + epsilon;\n}\n","import {_capitalize} from './helpers.core.js';\n\n/**\n * Binary search\n * @param table - the table search. must be sorted!\n * @param value - value to find\n * @param cmp\n * @private\n */\nexport function _lookup(\n table: number[],\n value: number,\n cmp?: (value: number) => boolean\n): {lo: number, hi: number};\nexport function _lookup<T>(\n table: T[],\n value: number,\n cmp: (value: number) => boolean\n): {lo: number, hi: number};\nexport function _lookup(\n table: unknown[],\n value: number,\n cmp?: (value: number) => boolean\n) {\n cmp = cmp || ((index) => table[index] < value);\n let hi = table.length - 1;\n let lo = 0;\n let mid: number;\n\n while (hi - lo > 1) {\n mid = (lo + hi) >> 1;\n if (cmp(mid)) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n\n return {lo, hi};\n}\n\n/**\n * Binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @param last - lookup last index\n * @private\n */\nexport const _lookupByKey = (\n table: Record<string, number>[],\n key: string,\n value: number,\n last?: boolean\n) =>\n _lookup(table, value, last\n ? index => {\n const ti = table[index][key];\n return ti < value || ti === value && table[index + 1][key] === value;\n }\n : index => table[index][key] < value);\n\n/**\n * Reverse binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @private\n */\nexport const _rlookupByKey = (\n table: Record<string, number>[],\n key: string,\n value: number\n) =>\n _lookup(table, value, index => table[index][key] >= value);\n\n/**\n * Return subset of `values` between `min` and `max` inclusive.\n * Values are assumed to be in sorted order.\n * @param values - sorted array of values\n * @param min - min value\n * @param max - max value\n */\nexport function _filterBetween(values: number[], min: number, max: number) {\n let start = 0;\n let end = values.length;\n\n while (start < end && values[start] < min) {\n start++;\n }\n while (end > start && values[end - 1] > max) {\n end--;\n }\n\n return start > 0 || end < values.length\n ? values.slice(start, end)\n : values;\n}\n\nconst arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'] as const;\n\nexport interface ArrayListener<T> {\n _onDataPush?(...item: T[]): void;\n _onDataPop?(): void;\n _onDataShift?(): void;\n _onDataSplice?(index: number, deleteCount: number, ...items: T[]): void;\n _onDataUnshift?(...item: T[]): void;\n}\n\n/**\n * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice',\n * 'unshift') and notify the listener AFTER the array has been altered. Listeners are\n * called on the '_onData*' callbacks (e.g. _onDataPush, etc.) with same arguments.\n */\nexport function listenArrayEvents<T>(array: T[], listener: ArrayListener<T>): void;\nexport function listenArrayEvents(array, listener) {\n if (array._chartjs) {\n array._chartjs.listeners.push(listener);\n return;\n }\n\n Object.defineProperty(array, '_chartjs', {\n configurable: true,\n enumerable: false,\n value: {\n listeners: [listener]\n }\n });\n\n arrayEvents.forEach((key) => {\n const method = '_onData' + _capitalize(key);\n const base = array[key];\n\n Object.defineProperty(array, key, {\n configurable: true,\n enumerable: false,\n value(...args) {\n const res = base.apply(this, args);\n\n array._chartjs.listeners.forEach((object) => {\n if (typeof object[method] === 'function') {\n object[method](...args);\n }\n });\n\n return res;\n }\n });\n });\n}\n\n\n/**\n * Removes the given array event listener and cleanup extra attached properties (such as\n * the _chartjs stub and overridden methods) if array doesn't have any more listeners.\n */\nexport function unlistenArrayEvents<T>(array: T[], listener: ArrayListener<T>): void;\nexport function unlistenArrayEvents(array, listener) {\n const stub = array._chartjs;\n if (!stub) {\n return;\n }\n\n const listeners = stub.listeners;\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n\n if (listeners.length > 0) {\n return;\n }\n\n arrayEvents.forEach((key) => {\n delete array[key];\n });\n\n delete array._chartjs;\n}\n\n/**\n * @param items\n */\nexport function _arrayUnique<T>(items: T[]) {\n const set = new Set<T>(items);\n\n if (set.size === items.length) {\n return items;\n }\n\n return Array.from(set);\n}\n","import type {ChartMeta, PointElement} from '../types/index.js';\n\nimport {_limitValue} from './helpers.math.js';\nimport {_lookupByKey} from './helpers.collection.js';\nimport {isNullOrUndef} from './helpers.core.js';\n\nexport function fontString(pixelSize: number, fontStyle: string, fontFamily: string) {\n return fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n}\n\n/**\n* Request animation polyfill\n*/\nexport const requestAnimFrame = (function() {\n if (typeof window === 'undefined') {\n return function(callback) {\n return callback();\n };\n }\n return window.requestAnimationFrame;\n}());\n\n/**\n * Throttles calling `fn` once per animation frame\n * Latest arguments are used on the actual call\n */\nexport function throttled<TArgs extends Array<any>>(\n fn: (...args: TArgs) => void,\n thisArg: any,\n) {\n let argsToUse = [] as TArgs;\n let ticking = false;\n\n return function(...args: TArgs) {\n // Save the args for use later\n argsToUse = args;\n if (!ticking) {\n ticking = true;\n requestAnimFrame.call(window, () => {\n ticking = false;\n fn.apply(thisArg, argsToUse);\n });\n }\n };\n}\n\n/**\n * Debounces calling `fn` for `delay` ms\n */\nexport function debounce<TArgs extends Array<any>>(fn: (...args: TArgs) => void, delay: number) {\n let timeout;\n return function(...args: TArgs) {\n if (delay) {\n clearTimeout(timeout);\n timeout = setTimeout(fn, delay, args);\n } else {\n fn.apply(this, args);\n }\n return delay;\n };\n}\n\n/**\n * Converts 'start' to 'left', 'end' to 'right' and others to 'center'\n * @private\n */\nexport const _toLeftRightCenter = (align: 'start' | 'end' | 'center') => align === 'start' ? 'left' : align === 'end' ? 'right' : 'center';\n\n/**\n * Returns `start`, `end` or `(start + end) / 2` depending on `align`. Defaults to `center`\n * @private\n */\nexport const _alignStartEnd = (align: 'start' | 'end' | 'center', start: number, end: number) => align === 'start' ? start : align === 'end' ? end : (start + end) / 2;\n\n/**\n * Returns `left`, `right` or `(left + right) / 2` depending on `align`. Defaults to `left`\n * @private\n */\nexport const _textX = (align: 'left' | 'right' | 'center', left: number, right: number, rtl: boolean) => {\n const check = rtl ? 'left' : 'right';\n return align === check ? right : align === 'center' ? (left + right) / 2 : left;\n};\n\n/**\n * Return start and count of visible points.\n * @private\n */\nexport function _getStartAndCountOfVisiblePoints(meta: ChartMeta<'line' | 'scatter'>, points: PointElement[], animationsDisabled: boolean) {\n const pointCount = points.length;\n\n let start = 0;\n let count = pointCount;\n\n if (meta._sorted) {\n const {iScale, vScale, _parsed} = meta;\n const spanGaps = meta.dataset ? meta.dataset.options ? meta.dataset.options.spanGaps : null : null;\n const axis = iScale.axis;\n const {min, max, minDefined, maxDefined} = iScale.getUserBounds();\n\n if (minDefined) {\n start = Math.min(\n // @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, axis, min).lo,\n // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? pointCount : _lookupByKey(points, axis, iScale.getPixelForValue(min)).lo);\n if (spanGaps) {\n const distanceToDefinedLo = (_parsed\n .slice(0, start + 1)\n .reverse()\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n start -= Math.max(0, distanceToDefinedLo);\n }\n start = _limitValue(start, 0, pointCount - 1);\n }\n if (maxDefined) {\n let end = Math.max(\n // @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, iScale.axis, max, true).hi + 1,\n // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? 0 : _lookupByKey(points, axis, iScale.getPixelForValue(max), true).hi + 1);\n if (spanGaps) {\n const distanceToDefinedHi = (_parsed\n .slice(end - 1)\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n end += Math.max(0, distanceToDefinedHi);\n }\n count = _limitValue(end, start, pointCount) - start;\n } else {\n count = pointCount - start;\n }\n }\n\n return {start, count};\n}\n\n/**\n * Checks if the scale ranges have changed.\n * @param {object} meta - dataset meta.\n * @returns {boolean}\n * @private\n */\nexport function _scaleRangesChanged(meta) {\n const {xScale, yScale, _scaleRanges} = meta;\n const newRanges = {\n xmin: xScale.min,\n xmax: xScale.max,\n ymin: yScale.min,\n ymax: yScale.max\n };\n if (!_scaleRanges) {\n meta._scaleRanges = newRanges;\n return true;\n }\n const changed = _scaleRanges.xmin !== xScale.min\n\t\t|| _scaleRanges.xmax !== xScale.max\n\t\t|| _scaleRanges.ymin !== yScale.min\n\t\t|| _scaleRanges.ymax !== yScale.max;\n\n Object.assign(_scaleRanges, newRanges);\n return changed;\n}\n","import {PI, TAU, HALF_PI} from './helpers.math.js';\n\nconst atEdge = (t: number) => t === 0 || t === 1;\nconst elasticIn = (t: number, s: number, p: number) => -(Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * TAU / p));\nconst elasticOut = (t: number, s: number, p: number) => Math.pow(2, -10 * t) * Math.sin((t - s) * TAU / p) + 1;\n\n/**\n * Easing functions adapted from Robert Penner's easing equations.\n * @namespace Chart.helpers.easing.effects\n * @see http://www.robertpenner.com/easing/\n */\nconst effects = {\n linear: (t: number) => t,\n\n easeInQuad: (t: number) => t * t,\n\n easeOutQuad: (t: number) => -t * (t - 2),\n\n easeInOutQuad: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t\n : -0.5 * ((--t) * (t - 2) - 1),\n\n easeInCubic: (t: number) => t * t * t,\n\n easeOutCubic: (t: number) => (t -= 1) * t * t + 1,\n\n easeInOutCubic: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t\n : 0.5 * ((t -= 2) * t * t + 2),\n\n easeInQuart: (t: number) => t * t * t * t,\n\n easeOutQuart: (t: number) => -((t -= 1) * t * t * t - 1),\n\n easeInOutQuart: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t * t\n : -0.5 * ((t -= 2) * t * t * t - 2),\n\n easeInQuint: (t: number) => t * t * t * t * t,\n\n easeOutQuint: (t: number) => (t -= 1) * t * t * t * t + 1,\n\n easeInOutQuint: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t * t * t\n : 0.5 * ((t -= 2) * t * t * t * t + 2),\n\n easeInSine: (t: number) => -Math.cos(t * HALF_PI) + 1,\n\n easeOutSine: (t: number) => Math.sin(t * HALF_PI),\n\n easeInOutSine: (t: number) => -0.5 * (Math.cos(PI * t) - 1),\n\n easeInExpo: (t: number) => (t === 0) ? 0 : Math.pow(2, 10 * (t - 1)),\n\n easeOutExpo: (t: number) => (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1,\n\n easeInOutExpo: (t: number) => atEdge(t) ? t : t < 0.5\n ? 0.5 * Math.pow(2, 10 * (t * 2 - 1))\n : 0.5 * (-Math.pow(2, -10 * (t * 2 - 1)) + 2),\n\n easeInCirc: (t: number) => (t >= 1) ? t : -(Math.sqrt(1 - t * t) - 1),\n\n easeOutCirc: (t: number) => Math.sqrt(1 - (t -= 1) * t),\n\n easeInOutCirc: (t: number) => ((t /= 0.5) < 1)\n ? -0.5 * (Math.sqrt(1 - t * t) - 1)\n : 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1),\n\n easeInElastic: (t: number) => atEdge(t) ? t : elasticIn(t, 0.075, 0.3),\n\n easeOutElastic: (t: number) => atEdge(t) ? t : elasticOut(t, 0.075, 0.3),\n\n easeInOutElastic(t: number) {\n const s = 0.1125;\n const p = 0.45;\n return atEdge(t) ? t :\n t < 0.5\n ? 0.5 * elasticIn(t * 2, s, p)\n : 0.5 + 0.5 * elasticOut(t * 2 - 1, s, p);\n },\n\n easeInBack(t: number) {\n const s = 1.70158;\n return t * t * ((s + 1) * t - s);\n },\n\n easeOutBack(t: number) {\n const s = 1.70158;\n return (t -= 1) * t * ((s + 1) * t + s) + 1;\n },\n\n easeInOutBack(t: number) {\n let s = 1.70158;\n if ((t /= 0.5) < 1) {\n return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s));\n }\n return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);\n },\n\n easeInBounce: (t: number) => 1 - effects.easeOutBounce(1 - t),\n\n easeOutBounce(t: number) {\n const m = 7.5625;\n const d = 2.75;\n if (t < (1 / d)) {\n return m * t * t;\n }\n if (t < (2 / d)) {\n return m * (t -= (1.5 / d)) * t + 0.75;\n }\n if (t < (2.5 / d)) {\n return m * (t -= (2.25 / d)) * t + 0.9375;\n }\n return m * (t -= (2.625 / d)) * t + 0.984375;\n },\n\n easeInOutBounce: (t: number) => (t < 0.5)\n ? effects.easeInBounce(t * 2) * 0.5\n : effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5,\n} as const;\n\nexport type EasingFunction = keyof typeof effects\n\nexport default effects;\n","import {Color} from '@kurkle/color';\n\nexport function isPatternOrGradient(value: unknown): value is CanvasPattern | CanvasGradient {\n if (value && typeof value === 'object') {\n const type = value.toString();\n return type === '[object CanvasPattern]' || type === '[object CanvasGradient]';\n }\n\n return false;\n}\n\nexport function color(value: CanvasGradient): CanvasGradient;\nexport function color(value: CanvasPattern): CanvasPattern;\nexport function color(\n value:\n | string\n | { r: number; g: number; b: number; a: number }\n | [number, number, number]\n | [number, number, number, number]\n): Color;\nexport function color(value) {\n return isPatternOrGradient(value) ? value : new Color(value);\n}\n\nexport function getHoverColor(value: CanvasGradient): CanvasGradient;\nexport function getHoverColor(value: CanvasPattern): CanvasPattern;\nexport function getHoverColor(value: string): string;\nexport function getHoverColor(value) {\n return isPatternOrGradient(value)\n ? value\n : new Color(value).saturate(0.5).darken(0.1).hexString();\n}\n","const numbers = ['x', 'y', 'borderWidth', 'radius', 'tension'];\nconst colors = ['color', 'borderColor', 'backgroundColor'];\n\nexport function applyAnimationsDefaults(defaults) {\n defaults.set('animation', {\n delay: undefined,\n duration: 1000,\n easing: 'easeOutQuart',\n fn: undefined,\n from: undefined,\n loop: undefined,\n to: undefined,\n type: undefined,\n });\n\n defaults.describe('animation', {\n _fallback: false,\n _indexable: false,\n _scriptable: (name) => name !== 'onProgress' && name !== 'onComplete' && name !== 'fn',\n });\n\n defaults.set('animations', {\n colors: {\n type: 'color',\n properties: colors\n },\n numbers: {\n type: 'number',\n properties: numbers\n },\n });\n\n defaults.describe('animations', {\n _fallback: 'animation',\n });\n\n defaults.set('transitions', {\n active: {\n animation: {\n duration: 400\n }\n },\n resize: {\n animation: {\n duration: 0\n }\n },\n show: {\n animations: {\n colors: {\n from: 'transparent'\n },\n visible: {\n type: 'boolean',\n duration: 0 // show immediately\n },\n }\n },\n hide: {\n animations: {\n colors: {\n to: 'transparent'\n },\n visible: {\n type: 'boolean',\n easing: 'linear',\n fn: v => v | 0 // for keeping the dataset visible all the way through the animation\n },\n }\n }\n });\n}\n","\nconst intlCache = new Map<string, Intl.NumberFormat>();\n\nfunction getNumberFormat(locale: string, options?: Intl.NumberFormatOptions) {\n options = options || {};\n const cacheKey = locale + JSON.stringify(options);\n let formatter = intlCache.get(cacheKey);\n if (!formatter) {\n formatter = new Intl.NumberFormat(locale, options);\n intlCache.set(cacheKey, formatter);\n }\n return formatter;\n}\n\nexport function formatNumber(num: number, locale: string, options?: Intl.NumberFormatOptions) {\n return getNumberFormat(locale, options).format(num);\n}\n","import {isArray} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {log10} from '../helpers/helpers.math.js';\n\n/**\n * Namespace to hold formatters for different types of ticks\n * @namespace Chart.Ticks.formatters\n */\nconst formatters = {\n /**\n * Formatter for value labels\n * @method Chart.Ticks.formatters.values\n * @param value the value to display\n * @return {string|string[]} the label to display\n */\n values(value) {\n return isArray(value) ? /** @type {string[]} */ (value) : '' + value;\n },\n\n /**\n * Formatter for numeric ticks\n * @method Chart.Ticks.formatters.numeric\n * @param tickValue {number} the value to be formatted\n * @param index {number} the position of the tickValue parameter in the ticks array\n * @param ticks {object[]} the list of ticks being converted\n * @return {string} string representation of the tickValue parameter\n */\n numeric(tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0'; // never show decimal places for 0\n }\n\n const locale = this.chart.options.locale;\n let notation;\n let delta = tickValue; // This is used when there are less than 2 ticks as the tick interval.\n\n if (ticks.length > 1) {\n // all ticks are small or there huge numbers; use scientific notation\n const maxTick = Math.max(Math.abs(ticks[0].value), Math.abs(ticks[ticks.length - 1].value));\n if (maxTick < 1e-4 || maxTick > 1e+15) {\n notation = 'scientific';\n }\n\n delta = calculateDelta(tickValue, ticks);\n }\n\n const logDelta = log10(Math.abs(delta));\n\n // When datasets have values approaching Number.MAX_VALUE, the tick calculations might result in\n // infinity and eventually NaN. Passing NaN for minimumFractionDigits or maximumFractionDigits\n // will make the number formatter throw. So instead we check for isNaN and use a fallback value.\n //\n // toFixed has a max of 20 decimal places\n const numDecimal = isNaN(logDelta) ? 1 : Math.max(Math.min(-1 * Math.floor(logDelta), 20), 0);\n\n const options = {notation, minimumFractionDigits: numDecimal, maximumFractionDigits: numDecimal};\n Object.assign(options, this.options.ticks.format);\n\n return formatNumber(tickValue, locale, options);\n },\n\n\n /**\n * Formatter for logarithmic ticks\n * @method Chart.Ticks.formatters.logarithmic\n * @param tickValue {number} the value to be formatted\n * @param index {number} the position of the tickValue parameter in the ticks array\n * @param ticks {object[]} the list of ticks being converted\n * @return {string} string representation of the tickValue parameter\n */\n logarithmic(tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0';\n }\n const remain = ticks[index].significand || (tickValue / (Math.pow(10, Math.floor(log10(tickValue)))));\n if ([1, 2, 3, 5, 10, 15].includes(remain) || index > 0.8 * ticks.length) {\n return formatters.numeric.call(this, tickValue, index, ticks);\n }\n return '';\n }\n\n};\n\n\nfunction calculateDelta(tickValue, ticks) {\n // Figure out how many digits to show\n // The space between the first two ticks might be smaller than normal spacing\n let delta = ticks.length > 3 ? ticks[2].value - ticks[1].value : ticks[1].value - ticks[0].value;\n\n // If we have a number like 2.5 as the delta, figure out how many decimal places we need\n if (Math.abs(delta) >= 1 && tickValue !== Math.floor(tickValue)) {\n // not an integer\n delta = tickValue - Math.floor(tickValue);\n }\n return delta;\n}\n\n/**\n * Namespace to hold static tick generation functions\n * @namespace Chart.Ticks\n */\nexport default {formatters};\n","import {getHoverColor} from '../helpers/helpers.color.js';\nimport {isObject, merge, valueOrDefault} from '../helpers/helpers.core.js';\nimport {applyAnimationsDefaults} from './core.animations.defaults.js';\nimport {applyLayoutsDefaults} from './core.layouts.defaults.js';\nimport {applyScaleDefaults} from './core.scale.defaults.js';\n\nexport const overrides = Object.create(null);\nexport const descriptors = Object.create(null);\n\n/**\n * @param {object} node\n * @param {string} key\n * @return {object}\n */\nfunction getScope(node, key) {\n if (!key) {\n return node;\n }\n const keys = key.split('.');\n for (let i = 0, n = keys.length; i < n; ++i) {\n const k = keys[i];\n node = node[k] || (node[k] = Object.create(null));\n }\n return node;\n}\n\nfunction set(root, scope, values) {\n if (typeof scope === 'string') {\n return merge(getScope(root, scope), values);\n }\n return merge(getScope(root, ''), scope);\n}\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is exported for typedoc\n */\nexport class Defaults {\n constructor(_descriptors, _appliers) {\n this.animation = undefined;\n this.backgroundColor = 'rgba(0,0,0,0.1)';\n this.borderColor = 'rgba(0,0,0,0.1)';\n this.color = '#666';\n this.datasets = {};\n this.devicePixelRatio = (context) => context.chart.platform.getDevicePixelRatio();\n this.elements = {};\n this.events = [\n 'mousemove',\n 'mouseout',\n 'click',\n 'touchstart',\n 'touchmove'\n ];\n this.font = {\n family: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n size: 12,\n style: 'normal',\n lineHeight: 1.2,\n weight: null\n };\n this.hover = {};\n this.hoverBackgroundColor = (ctx, options) => getHoverColor(options.backgroundColor);\n this.hoverBorderColor = (ctx, options) => getHoverColor(options.borderColor);\n this.hoverColor = (ctx, options) => getHoverColor(options.color);\n this.indexAxis = 'x';\n this.interaction = {\n mode: 'nearest',\n intersect: true,\n includeInvisible: false\n };\n this.maintainAspectRatio = true;\n this.onHover = null;\n this.onClick = null;\n this.parsing = true;\n this.plugins = {};\n this.responsive = true;\n this.scale = undefined;\n this.scales = {};\n this.showLine = true;\n this.drawActiveElementsOnTop = true;\n\n this.describe(_descriptors);\n this.apply(_appliers);\n }\n\n /**\n\t * @param {string|object} scope\n\t * @param {object} [values]\n\t */\n set(scope, values) {\n return set(this, scope, values);\n }\n\n /**\n\t * @param {string} scope\n\t */\n get(scope) {\n return getScope(this, scope);\n }\n\n /**\n\t * @param {string|object} scope\n\t * @param {object} [values]\n\t */\n describe(scope, values) {\n return set(descriptors, scope, values);\n }\n\n override(scope, values) {\n return set(overrides, scope, values);\n }\n\n /**\n\t * Routes the named defaults to fallback to another scope/name.\n\t * This routing is useful when those target values, like defaults.color, are changed runtime.\n\t * If the values would be copied, the runtime change would not take effect. By routing, the\n\t * fallback is evaluated at each access, so its always up to date.\n\t *\n\t * Example:\n\t *\n\t * \tdefaults.route('elements.arc', 'backgroundColor', '', 'color')\n\t * - reads the backgroundColor from defaults.color when undefined locally\n\t *\n\t * @param {string} scope Scope this route applies to.\n\t * @param {string} name Property name that should be routed to different namespace when not defined here.\n\t * @param {string} targetScope The namespace where those properties should be routed to.\n\t * Empty string ('') is the root of defaults.\n\t * @param {string} targetName The target name in the target scope the property should be routed to.\n\t */\n route(scope, name, targetScope, targetName) {\n const scopeObject = getScope(this, scope);\n const targetScopeObject = getScope(this, targetScope);\n const privateName = '_' + name;\n\n Object.defineProperties(scopeObject, {\n // A private property is defined to hold the actual value, when this property is set in its scope (set in the setter)\n [privateName]: {\n value: scopeObject[name],\n writable: true\n },\n // The actual property is defined as getter/setter so we can do the routing when value is not locally set.\n [name]: {\n enumerable: true,\n get() {\n const local = this[privateName];\n const target = targetScopeObject[targetName];\n if (isObject(local)) {\n return Object.assign({}, target, local);\n }\n return valueOrDefault(local, target);\n },\n set(value) {\n this[privateName] = value;\n }\n }\n });\n }\n\n apply(appliers) {\n appliers.forEach((apply) => apply(this));\n }\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Defaults({\n _scriptable: (name) => !name.startsWith('on'),\n _indexable: (name) => name !== 'events',\n hover: {\n _fallback: 'interaction'\n },\n interaction: {\n _scriptable: false,\n _indexable: false,\n }\n}, [applyAnimationsDefaults, applyLayoutsDefaults, applyScaleDefaults]);\n","export function applyLayoutsDefaults(defaults) {\n defaults.set('layout', {\n autoPadding: true,\n padding: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n }\n });\n}\n","import Ticks from './core.ticks.js';\n\nexport function applyScaleDefaults(defaults) {\n defaults.set('scale', {\n display: true,\n offset: false,\n reverse: false,\n beginAtZero: false,\n\n /**\n * Scale boundary strategy (bypassed by min/max time options)\n * - `data`: make sure data are fully visible, ticks outside are removed\n * - `ticks`: make sure ticks are fully visible, data outside are truncated\n * @see https://github.com/chartjs/Chart.js/pull/4556\n * @since 3.0.0\n */\n bounds: 'ticks',\n\n clip: true,\n\n /**\n * Addition grace added to max and reduced from min data value.\n * @since 3.0.0\n */\n grace: 0,\n\n // grid line settings\n grid: {\n display: true,\n lineWidth: 1,\n drawOnChartArea: true,\n drawTicks: true,\n tickLength: 8,\n tickWidth: (_ctx, options) => options.lineWidth,\n tickColor: (_ctx, options) => options.color,\n offset: false,\n },\n\n border: {\n display: true,\n dash: [],\n dashOffset: 0.0,\n width: 1\n },\n\n // scale title\n title: {\n // display property\n display: false,\n\n // actual label\n text: '',\n\n // top/bottom padding\n padding: {\n top: 4,\n bottom: 4\n }\n },\n\n // label settings\n ticks: {\n minRotation: 0,\n maxRotation: 50,\n mirror: false,\n textStrokeWidth: 0,\n textStrokeColor: '',\n padding: 3,\n display: true,\n autoSkip: true,\n autoSkipPadding: 3,\n labelOffset: 0,\n // We pass through arrays to be rendered as multiline labels, we convert Others to strings here.\n callback: Ticks.formatters.values,\n minor: {},\n major: {},\n align: 'center',\n crossAlign: 'near',\n\n showLabelBackdrop: false,\n backdropColor: 'rgba(255, 255, 255, 0.75)',\n backdropPadding: 2,\n }\n });\n\n defaults.route('scale.ticks', 'color', '', 'color');\n defaults.route('scale.grid', 'color', '', 'borderColor');\n defaults.route('scale.border', 'color', '', 'borderColor');\n defaults.route('scale.title', 'color', '', 'color');\n\n defaults.describe('scale', {\n _fallback: false,\n _scriptable: (name) => !name.startsWith('before') && !name.startsWith('after') && name !== 'callback' && name !== 'parser',\n _indexable: (name) => name !== 'borderDash' && name !== 'tickBorderDash' && name !== 'dash',\n });\n\n defaults.describe('scales', {\n _fallback: 'scale',\n });\n\n defaults.describe('scale.ticks', {\n _scriptable: (name) => name !== 'backdropPadding' && name !== 'callback',\n _indexable: (name) => name !== 'backdropPadding',\n });\n}\n","import type {\n Chart,\n Point,\n FontSpec,\n CanvasFontSpec,\n PointStyle,\n RenderTextOpts,\n BackdropOptions\n} from '../types/index.js';\nimport type {\n TRBL,\n SplinePoint,\n RoundedRect,\n TRBLCorners\n} from '../types/geometric.js';\nimport {isArray, isNullOrUndef} from './helpers.core.js';\nimport {PI, TAU, HALF_PI, QUARTER_PI, TWO_THIRDS_PI, RAD_PER_DEG} from './helpers.math.js';\n\n/**\n * Converts the given font object into a CSS font string.\n * @param font - A font object.\n * @return The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font\n * @private\n */\nexport function toFontString(font: FontSpec) {\n if (!font || isNullOrUndef(font.size) || isNullOrUndef(font.family)) {\n return null;\n }\n\n return (font.style ? font.style + ' ' : '')\n\t\t+ (font.weight ? font.weight + ' ' : '')\n\t\t+ font.size + 'px '\n\t\t+ font.family;\n}\n\n/**\n * @private\n */\nexport function _measureText(\n ctx: CanvasRenderingContext2D,\n data: Record<string, number>,\n gc: string[],\n longest: number,\n string: string\n) {\n let textWidth = data[string];\n if (!textWidth) {\n textWidth = data[string] = ctx.measureText(string).width;\n gc.push(string);\n }\n if (textWidth > longest) {\n longest = textWidth;\n }\n return longest;\n}\n\ntype Thing = string | undefined | null\ntype Things = (Thing | Thing[])[]\n\n/**\n * @private\n */\n// eslint-disable-next-line complexity\nexport function _longestText(\n ctx: CanvasRenderingContext2D,\n font: string,\n arrayOfThings: Things,\n cache?: {data?: Record<string, number>, garbageCollect?: string[], font?: string}\n) {\n cache = cache || {};\n let data = cache.data = cache.data || {};\n let gc = cache.garbageCollect = cache.garbageCollect || [];\n\n if (cache.font !== font) {\n data = cache.data = {};\n gc = cache.garbageCollect = [];\n cache.font = font;\n }\n\n ctx.save();\n\n ctx.font = font;\n let longest = 0;\n const ilen = arrayOfThings.length;\n let i: number, j: number, jlen: number, thing: Thing | Thing[], nestedThing: Thing | Thing[];\n for (i = 0; i < ilen; i++) {\n thing = arrayOfThings[i];\n\n // Undefined strings and arrays should not be measured\n if (thing !== undefined && thing !== null && !isArray(thing)) {\n longest = _measureText(ctx, data, gc, longest, thing);\n } else if (isArray(thing)) {\n // if it is an array lets measure each element\n // to do maybe simplify this function a bit so we can do this more recursively?\n for (j = 0, jlen = thing.length; j < jlen; j++) {\n nestedThing = thing[j];\n // Undefined strings and arrays should not be measured\n if (nestedThing !== undefined && nestedThing !== null && !isArray(nestedThing)) {\n longest = _measureText(ctx, data, gc, longest, nestedThing);\n }\n }\n }\n }\n\n ctx.restore();\n\n const gcLen = gc.length / 2;\n if (gcLen > arrayOfThings.length) {\n for (i = 0; i < gcLen; i++) {\n delete data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n return longest;\n}\n\n/**\n * Returns the aligned pixel value to avoid anti-aliasing blur\n * @param chart - The chart instance.\n * @param pixel - A pixel value.\n * @param width - The width of the element.\n * @returns The aligned pixel value.\n * @private\n */\nexport function _alignPixel(chart: Chart, pixel: number, width: number) {\n const devicePixelRatio = chart.currentDevicePixelRatio;\n const halfWidth = width !== 0 ? Math.max(width / 2, 0.5) : 0;\n return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth;\n}\n\n/**\n * Clears the entire canvas.\n */\nexport function clearCanvas(canvas?: HTMLCanvasElement, ctx?: CanvasRenderingContext2D) {\n if (!ctx && !canvas) {\n return;\n }\n\n ctx = ctx || canvas.getContext('2d');\n\n ctx.save();\n // canvas.width and canvas.height do not consider the canvas transform,\n // while clearRect does\n ctx.resetTransform();\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.restore();\n}\n\nexport interface DrawPointOptions {\n pointStyle: PointStyle;\n rotation?: number;\n radius: number;\n borderWidth: number;\n}\n\nexport function drawPoint(\n ctx: CanvasRenderingContext2D,\n options: DrawPointOptions,\n x: number,\n y: number\n) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n drawPointLegend(ctx, options, x, y, null);\n}\n\n// eslint-disable-next-line complexity\nexport function drawPointLegend(\n ctx: CanvasRenderingContext2D,\n options: DrawPointOptions,\n x: number,\n y: number,\n w: number\n) {\n let type: string, xOffset: number, yOffset: number, size: number, cornerRadius: number, width: number, xOffsetW: number, yOffsetW: number;\n const style = options.pointStyle;\n const rotation = options.rotation;\n const radius = options.radius;\n let rad = (rotation || 0) * RAD_PER_DEG;\n\n if (style && typeof style === 'object') {\n type = style.toString();\n if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate(rad);\n ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height);\n ctx.restore();\n return;\n }\n }\n\n if (isNaN(radius) || radius <= 0) {\n return;\n }\n\n ctx.beginPath();\n\n switch (style) {\n // Default includes circle\n default:\n if (w) {\n ctx.ellipse(x, y, w / 2, radius, 0, 0, TAU);\n } else {\n ctx.arc(x, y, radius, 0, TAU);\n }\n ctx.closePath();\n break;\n case 'triangle':\n width = w ? w / 2 : radius;\n ctx.moveTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n ctx.closePath();\n break;\n case 'rectRounded':\n // NOTE: the rounded rect implementation changed to use `arc` instead of\n // `quadraticCurveTo` since it generates better results when rect is\n // almost a circle. 0.516 (instead of 0.5) produces results with visually\n // closer proportion to the previous impl and it is inscribed in the\n // circle with `radius`. For more details, see the following PRs:\n // https://github.com/chartjs/Chart.js/issues/5597\n // https://github.com/chartjs/Chart.js/issues/5858\n cornerRadius = radius * 0.516;\n size = radius - cornerRadius;\n xOffset = Math.cos(rad + QUARTER_PI) * size;\n xOffsetW = Math.cos(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n yOffset = Math.sin(rad + QUARTER_PI) * size;\n yOffsetW = Math.sin(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n ctx.arc(x - xOffsetW, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);\n ctx.arc(x + yOffsetW, y - xOffset, cornerRadius, rad - HALF_PI, rad);\n ctx.arc(x + xOffsetW, y + yOffset, cornerRadius, rad, rad + HALF_PI);\n ctx.arc(x - yOffsetW, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);\n ctx.closePath();\n break;\n case 'rect':\n if (!rotation) {\n size = Math.SQRT1_2 * radius;\n width = w ? w / 2 : size;\n ctx.rect(x - width, y - size, 2 * width, 2 * size);\n break;\n }\n rad += QUARTER_PI;\n /* falls through */\n case 'rectRot':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n ctx.closePath();\n break;\n case 'crossRot':\n rad += QUARTER_PI;\n /* falls through */\n case 'cross':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'star':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n rad += QUARTER_PI;\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'line':\n xOffset = w ? w / 2 : Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n break;\n case 'dash':\n ctx.moveTo(x, y);\n ctx.lineTo(x + Math.cos(rad) * (w ? w / 2 : radius), y + Math.sin(rad) * radius);\n break;\n case false:\n ctx.closePath();\n break;\n }\n\n ctx.fill();\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n}\n\n/**\n * Returns true if the point is inside the rectangle\n * @param point - The point to test\n * @param area - The rectangle\n * @param margin - allowed margin\n * @private\n */\nexport function _isPointInArea(\n point: Point,\n area: TRBL,\n margin?: number\n) {\n margin = margin || 0.5; // margin - default is to match rounded decimals\n\n return !area || (point && point.x > area.left - margin && point.x < area.right + margin &&\n\t\tpoint.y > area.top - margin && point.y < area.bottom + margin);\n}\n\nexport function clipArea(ctx: CanvasRenderingContext2D, area: TRBL) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\n ctx.clip();\n}\n\nexport function unclipArea(ctx: CanvasRenderingContext2D) {\n ctx.restore();\n}\n\n/**\n * @private\n */\nexport function _steppedLineTo(\n ctx: CanvasRenderingContext2D,\n previous: Point,\n target: Point,\n flip?: boolean,\n mode?: string\n) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n if (mode === 'middle') {\n const midpoint = (previous.x + target.x) / 2.0;\n ctx.lineTo(midpoint, previous.y);\n ctx.lineTo(midpoint, target.y);\n } else if (mode === 'after' !== !!flip) {\n ctx.lineTo(previous.x, target.y);\n } else {\n ctx.lineTo(target.x, previous.y);\n }\n ctx.lineTo(target.x, target.y);\n}\n\n/**\n * @private\n */\nexport function _bezierCurveTo(\n ctx: CanvasRenderingContext2D,\n previous: SplinePoint,\n target: SplinePoint,\n flip?: boolean\n) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n ctx.bezierCurveTo(\n flip ? previous.cp1x : previous.cp2x,\n flip ? previous.cp1y : previous.cp2y,\n flip ? target.cp2x : target.cp1x,\n flip ? target.cp2y : target.cp1y,\n target.x,\n target.y);\n}\n\nfunction setRenderOpts(ctx: CanvasRenderingContext2D, opts: RenderTextOpts) {\n if (opts.translation) {\n ctx.translate(opts.translation[0], opts.translation[1]);\n }\n\n if (!isNullOrUndef(opts.rotation)) {\n ctx.rotate(opts.rotation);\n }\n\n if (opts.color) {\n ctx.fillStyle = opts.color;\n }\n\n if (opts.textAlign) {\n ctx.textAlign = opts.textAlign;\n }\n\n if (opts.textBaseline) {\n ctx.textBaseline = opts.textBaseline;\n }\n}\n\nfunction decorateText(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n line: string,\n opts: RenderTextOpts\n) {\n if (opts.strikethrough || opts.underline) {\n /**\n * Now that IE11 support has been dropped, we can use more\n * of the TextMetrics object. The actual bounding boxes\n * are unflagged in Chrome, Firefox, Edge, and Safari so they\n * can be safely used.\n * See https://developer.mozilla.org/en-US/docs/Web/API/TextMetrics#Browser_compatibility\n */\n const metrics = ctx.measureText(line);\n const left = x - metrics.actualBoundingBoxLeft;\n const right = x + metrics.actualBoundingBoxRight;\n const top = y - metrics.actualBoundingBoxAscent;\n const bottom = y + metrics.actualBoundingBoxDescent;\n const yDecoration = opts.strikethrough ? (top + bottom) / 2 : bottom;\n\n ctx.strokeStyle = ctx.fillStyle;\n ctx.beginPath();\n ctx.lineWidth = opts.decorationWidth || 2;\n ctx.moveTo(left, yDecoration);\n ctx.lineTo(right, yDecoration);\n ctx.stroke();\n }\n}\n\nfunction drawBackdrop(ctx: CanvasRenderingContext2D, opts: BackdropOptions) {\n const oldColor = ctx.fillStyle;\n\n ctx.fillStyle = opts.color as string;\n ctx.fillRect(opts.left, opts.top, opts.width, opts.height);\n ctx.fillStyle = oldColor;\n}\n\n/**\n * Render text onto the canvas\n */\nexport function renderText(\n ctx: CanvasRenderingContext2D,\n text: string | string[],\n x: number,\n y: number,\n font: CanvasFontSpec,\n opts: RenderTextOpts = {}\n) {\n const lines = isArray(text) ? text : [text];\n const stroke = opts.strokeWidth > 0 && opts.strokeColor !== '';\n let i: number, line: string;\n\n ctx.save();\n ctx.font = font.string;\n setRenderOpts(ctx, opts);\n\n for (i = 0; i < lines.length; ++i) {\n line = lines[i];\n\n if (opts.backdrop) {\n drawBackdrop(ctx, opts.backdrop);\n }\n\n if (stroke) {\n if (opts.strokeColor) {\n ctx.strokeStyle = opts.strokeColor;\n }\n\n if (!isNullOrUndef(opts.strokeWidth)) {\n ctx.lineWidth = opts.strokeWidth;\n }\n\n ctx.strokeText(line, x, y, opts.maxWidth);\n }\n\n ctx.fillText(line, x, y, opts.maxWidth);\n decorateText(ctx, x, y, line, opts);\n\n y += Number(font.lineHeight);\n }\n\n ctx.restore();\n}\n\n/**\n * Add a path of a rectangle with rounded corners to the current sub-path\n * @param ctx - Context\n * @param rect - Bounding rect\n */\nexport function addRoundedRectPath(\n ctx: CanvasRenderingContext2D,\n rect: RoundedRect & { radius: TRBLCorners }\n) {\n const {x, y, w, h, radius} = rect;\n\n // top left arc\n ctx.arc(x + radius.topLeft, y + radius.topLeft, radius.topLeft, 1.5 * PI, PI, true);\n\n // line from top left to bottom left\n ctx.lineTo(x, y + h - radius.bottomLeft);\n\n // bottom left arc\n ctx.arc(x + radius.bottomLeft, y + h - radius.bottomLeft, radius.bottomLeft, PI, HALF_PI, true);\n\n // line from bottom left to bottom right\n ctx.lineTo(x + w - radius.bottomRight, y + h);\n\n // bottom right arc\n ctx.arc(x + w - radius.bottomRight, y + h - radius.bottomRight, radius.bottomRight, HALF_PI, 0, true);\n\n // line from bottom right to top right\n ctx.lineTo(x + w, y + radius.topRight);\n\n // top right arc\n ctx.arc(x + w - radius.topRight, y + radius.topRight, radius.topRight, 0, -HALF_PI, true);\n\n // line from top right to top left\n ctx.lineTo(x + radius.topLeft, y);\n}\n","import defaults from '../core/core.defaults.js';\nimport {isArray, isObject, toDimension, valueOrDefault} from './helpers.core.js';\nimport {toFontString} from './helpers.canvas.js';\nimport type {ChartArea, FontSpec, Point} from '../types/index.js';\nimport type {TRBL, TRBLCorners} from '../types/geometric.js';\n\nconst LINE_HEIGHT = /^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/;\nconst FONT_STYLE = /^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;\n\n/**\n * @alias Chart.helpers.options\n * @namespace\n */\n/**\n * Converts the given line height `value` in pixels for a specific font `size`.\n * @param value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em').\n * @param size - The font size (in pixels) used to resolve relative `value`.\n * @returns The effective line height in pixels (size * 1.2 if value is invalid).\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\n * @since 2.7.0\n */\nexport function toLineHeight(value: number | string, size: number): number {\n const matches = ('' + value).match(LINE_HEIGHT);\n if (!matches || matches[1] === 'normal') {\n return size * 1.2;\n }\n\n value = +matches[2];\n\n switch (matches[3]) {\n case 'px':\n return value;\n case '%':\n value /= 100;\n break;\n default:\n break;\n }\n\n return size * value;\n}\n\nconst numberOrZero = (v: unknown) => +v || 0;\n\n/**\n * @param value\n * @param props\n */\nexport function _readValueToProps<K extends string>(value: number | Record<K, number>, props: K[]): Record<K, number>;\nexport function _readValueToProps<K extends string, T extends string>(value: number | Record<K & T, number>, props: Record<T, K>): Record<T, number>;\nexport function _readValueToProps(value: number | Record<string, number>, props: string[] | Record<string, string>) {\n const ret = {};\n const objProps = isObject(props);\n const keys = objProps ? Object.keys(props) : props;\n const read = isObject(value)\n ? objProps\n ? prop => valueOrDefault(value[prop], value[props[prop]])\n : prop => value[prop]\n : () => value;\n\n for (const prop of keys) {\n ret[prop] = numberOrZero(read(prop));\n }\n return ret;\n}\n\n/**\n * Converts the given value into a TRBL object.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left)\n * @since 3.0.0\n */\nexport function toTRBL(value: number | TRBL | Point) {\n return _readValueToProps(value, {top: 'y', right: 'x', bottom: 'y', left: 'x'});\n}\n\n/**\n * Converts the given value into a TRBL corners object (similar with css border-radius).\n * @param value - If a number, set the value to all TRBL corner components,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * @returns The TRBL corner values (topLeft, topRight, bottomLeft, bottomRight)\n * @since 3.0.0\n */\nexport function toTRBLCorners(value: number | TRBLCorners) {\n return _readValueToProps(value, ['topLeft', 'topRight', 'bottomLeft', 'bottomRight']);\n}\n\n/**\n * Converts the given value into a padding object with pre-computed width/height.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left, width, height)\n * @since 2.7.0\n */\nexport function toPadding(value?: number | TRBL): ChartArea {\n const obj = toTRBL(value) as ChartArea;\n\n obj.width = obj.left + obj.right;\n obj.height = obj.top + obj.bottom;\n\n return obj;\n}\n\n/**\n * Parses font options and returns the font object.\n * @param options - A object that contains font options to be parsed.\n * @param fallback - A object that contains fallback font options.\n * @return The font object.\n * @private\n */\n\nexport function toFont(options: Partial<FontSpec>, fallback?: Partial<FontSpec>) {\n options = options || {};\n fallback = fallback || defaults.font as FontSpec;\n\n let size = valueOrDefault(options.size, fallback.size);\n\n if (typeof size === 'string') {\n size = parseInt(size, 10);\n }\n let style = valueOrDefault(options.style, fallback.style);\n if (style && !('' + style).match(FONT_STYLE)) {\n console.warn('Invalid font style specified: \"' + style + '\"');\n style = undefined;\n }\n\n const font = {\n family: valueOrDefault(options.family, fallback.family),\n lineHeight: toLineHeight(valueOrDefault(options.lineHeight, fallback.lineHeight), size),\n size,\n style,\n weight: valueOrDefault(options.weight, fallback.weight),\n string: ''\n };\n\n font.string = toFontString(font);\n return font;\n}\n\n/**\n * Evaluates the given `inputs` sequentially and returns the first defined value.\n * @param inputs - An array of values, falling back to the last value.\n * @param context - If defined and the current value is a function, the value\n * is called with `context` as first argument and the result becomes the new input.\n * @param index - If defined and the current value is an array, the value\n * at `index` become the new input.\n * @param info - object to return information about resolution in\n * @param info.cacheable - Will be set to `false` if option is not cacheable.\n * @since 2.7.0\n */\nexport function resolve(inputs: Array<unknown>, context?: object, index?: number, info?: { cacheable: boolean }) {\n let cacheable = true;\n let i: number, ilen: number, value: unknown;\n\n for (i = 0, ilen = inputs.length; i < ilen; ++i) {\n value = inputs[i];\n if (value === undefined) {\n continue;\n }\n if (context !== undefined && typeof value === 'function') {\n value = value(context);\n cacheable = false;\n }\n if (index !== undefined && isArray(value)) {\n value = value[index % value.length];\n cacheable = false;\n }\n if (value !== undefined) {\n if (info && !cacheable) {\n info.cacheable = false;\n }\n return value;\n }\n }\n}\n\n/**\n * @param minmax\n * @param grace\n * @param beginAtZero\n * @private\n */\nexport function _addGrace(minmax: { min: number; max: number; }, grace: number | string, beginAtZero: boolean) {\n const {min, max} = minmax;\n const change = toDimension(grace, (max - min) / 2);\n const keepZero = (value: number, add: number) => beginAtZero && value === 0 ? 0 : value + add;\n return {\n min: keepZero(min, -Math.abs(change)),\n max: keepZero(max, change)\n };\n}\n\n/**\n * Create a context inheriting parentContext\n * @param parentContext\n * @param context\n * @returns\n */\nexport function createContext<T extends object>(parentContext: null, context: T): T;\nexport function createContext<T extends object, P extends T>(parentContext: P, context: T): P & T;\nexport function createContext(parentContext: object, context: object) {\n return Object.assign(Object.create(parentContext), context);\n}\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport type {AnyObject} from '../types/basic.js';\nimport type {ChartMeta} from '../types/index.js';\nimport type {\n ResolverObjectKey,\n ResolverCache,\n ResolverProxy,\n DescriptorDefaults,\n Descriptor,\n ContextCache,\n ContextProxy\n} from './helpers.config.types.js';\nimport {isArray, isFunction, isObject, resolveObjectKey, _capitalize} from './helpers.core.js';\n\nexport * from './helpers.config.types.js';\n\n/**\n * Creates a Proxy for resolving raw values for options.\n * @param scopes - The option scopes to look for values, in resolution order\n * @param prefixes - The prefixes for values, in resolution order.\n * @param rootScopes - The root option scopes\n * @param fallback - Parent scopes fallback\n * @param getTarget - callback for getting the target for changed values\n * @returns Proxy\n * @private\n */\nexport function _createResolver<\n T extends AnyObject[] = AnyObject[],\n R extends AnyObject[] = T\n>(\n scopes: T,\n prefixes = [''],\n rootScopes?: R,\n fallback?: ResolverObjectKey,\n getTarget = () => scopes[0]\n) {\n const finalRootScopes = rootScopes || scopes;\n if (typeof fallback === 'undefined') {\n fallback = _resolve('_fallback', scopes);\n }\n const cache: ResolverCache<T, R> = {\n [Symbol.toStringTag]: 'Object',\n _cacheable: true,\n _scopes: scopes,\n _rootScopes: finalRootScopes,\n _fallback: fallback,\n _getTarget: getTarget,\n override: (scope: AnyObject) => _createResolver([scope, ...scopes], prefixes, finalRootScopes, fallback),\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */\n deleteProperty(target, prop: string) {\n delete target[prop]; // remove from cache\n delete target._keys; // remove cached keys\n delete scopes[0][prop]; // remove from top level scope\n return true;\n },\n\n /**\n * A trap for getting property values.\n */\n get(target, prop: string) {\n return _cached(target, prop,\n () => _resolveWithPrefixes(prop, prefixes, scopes, target));\n },\n\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */\n getOwnPropertyDescriptor(target, prop) {\n return Reflect.getOwnPropertyDescriptor(target._scopes[0], prop);\n },\n\n /**\n * A trap for Object.getPrototypeOf.\n */\n getPrototypeOf() {\n return Reflect.getPrototypeOf(scopes[0]);\n },\n\n /**\n * A trap for the in operator.\n */\n has(target, prop: string) {\n return getKeysFromAllScopes(target).includes(prop);\n },\n\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */\n ownKeys(target) {\n return getKeysFromAllScopes(target);\n },\n\n /**\n * A trap for setting property values.\n */\n set(target, prop: string, value) {\n const storage = target._storage || (target._storage = getTarget());\n target[prop] = storage[prop] = value; // set to top level scope + cache\n delete target._keys; // remove cached keys\n return true;\n }\n }) as ResolverProxy<T, R>;\n}\n\n/**\n * Returns an Proxy for resolving option values with context.\n * @param proxy - The Proxy returned by `_createResolver`\n * @param context - Context object for scriptable/indexable options\n * @param subProxy - The proxy provided for scriptable options\n * @param descriptorDefaults - Defaults for descriptors\n * @private\n */\nexport function _attachContext<\n T extends AnyObject[] = AnyObject[],\n R extends AnyObject[] = T\n>(\n proxy: ResolverProxy<T, R>,\n context: AnyObject,\n subProxy?: ResolverProxy<T, R>,\n descriptorDefaults?: DescriptorDefaults\n) {\n const cache: ContextCache<T, R> = {\n _cacheable: false,\n _proxy: proxy,\n _context: context,\n _subProxy: subProxy,\n _stack: new Set(),\n _descriptors: _descriptors(proxy, descriptorDefaults),\n setContext: (ctx: AnyObject) => _attachContext(proxy, ctx, subProxy, descriptorDefaults),\n override: (scope: AnyObject) => _attachContext(proxy.override(scope), context, subProxy, descriptorDefaults)\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */\n deleteProperty(target, prop) {\n delete target[prop]; // remove from cache\n delete proxy[prop]; // remove from proxy\n return true;\n },\n\n /**\n * A trap for getting property values.\n */\n get(target, prop: string, receiver) {\n return _cached(target, prop,\n () => _resolveWithContext(target, prop, receiver));\n },\n\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */\n getOwnPropertyDescriptor(target, prop) {\n return target._descriptors.allKeys\n ? Reflect.has(proxy, prop) ? {enumerable: true, configurable: true} : undefined\n : Reflect.getOwnPropertyDescriptor(proxy, prop);\n },\n\n /**\n * A trap for Object.getPrototypeOf.\n */\n getPrototypeOf() {\n return Reflect.getPrototypeOf(proxy);\n },\n\n /**\n * A trap for the in operator.\n */\n has(target, prop) {\n return Reflect.has(proxy, prop);\n },\n\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */\n ownKeys() {\n return Reflect.ownKeys(proxy);\n },\n\n /**\n * A trap for setting property values.\n */\n set(target, prop, value) {\n proxy[prop] = value; // set to proxy\n delete target[prop]; // remove from cache\n return true;\n }\n }) as ContextProxy<T, R>;\n}\n\n/**\n * @private\n */\nexport function _descriptors(\n proxy: ResolverCache,\n defaults: DescriptorDefaults = {scriptable: true, indexable: true}\n): Descriptor {\n const {_scriptable = defaults.scriptable, _indexable = defaults.indexable, _allKeys = defaults.allKeys} = proxy;\n return {\n allKeys: _allKeys,\n scriptable: _scriptable,\n indexable: _indexable,\n isScriptable: isFunction(_scriptable) ? _scriptable : () => _scriptable,\n isIndexable: isFunction(_indexable) ? _indexable : () => _indexable\n };\n}\n\nconst readKey = (prefix: string, name: string) => prefix ? prefix + _capitalize(name) : name;\nconst needsSubResolver = (prop: string, value: unknown) => isObject(value) && prop !== 'adapters' &&\n (Object.getPrototypeOf(value) === null || value.constructor === Object);\n\nfunction _cached(\n target: AnyObject,\n prop: string,\n resolve: () => unknown\n) {\n if (Object.prototype.hasOwnProperty.call(target, prop) || prop === 'constructor') {\n return target[prop];\n }\n\n const value = resolve();\n // cache the resolved value\n target[prop] = value;\n return value;\n}\n\nfunction _resolveWithContext(\n target: ContextCache,\n prop: string,\n receiver: AnyObject\n) {\n const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n let value = _proxy[prop]; // resolve from proxy\n\n // resolve with context\n if (isFunction(value) && descriptors.isScriptable(prop)) {\n value = _resolveScriptable(prop, value, target, receiver);\n }\n if (isArray(value) && value.length) {\n value = _resolveArray(prop, value, target, descriptors.isIndexable);\n }\n if (needsSubResolver(prop, value)) {\n // if the resolved value is an object, create a sub resolver for it\n value = _attachContext(value, _context, _subProxy && _subProxy[prop], descriptors);\n }\n return value;\n}\n\nfunction _resolveScriptable(\n prop: string,\n getValue: (ctx: AnyObject, sub: AnyObject) => unknown,\n target: ContextCache,\n receiver: AnyObject\n) {\n const {_proxy, _context, _subProxy, _stack} = target;\n if (_stack.has(prop)) {\n throw new Error('Recursion detected: ' + Array.from(_stack).join('->') + '->' + prop);\n }\n _stack.add(prop);\n let value = getValue(_context, _subProxy || receiver);\n _stack.delete(prop);\n if (needsSubResolver(prop, value)) {\n // When scriptable option returns an object, create a resolver on that.\n value = createSubResolver(_proxy._scopes, _proxy, prop, value);\n }\n return value;\n}\n\nfunction _resolveArray(\n prop: string,\n value: unknown[],\n target: ContextCache,\n isIndexable: (key: string) => boolean\n) {\n const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n\n if (typeof _context.index !== 'undefined' && isIndexable(prop)) {\n return value[_context.index % value.length];\n } else if (isObject(value[0])) {\n // Array of objects, return array or resolvers\n const arr = value;\n const scopes = _proxy._scopes.filter(s => s !== arr);\n value = [];\n for (const item of arr) {\n const resolver = createSubResolver(scopes, _proxy, prop, item);\n value.push(_attachContext(resolver, _context, _subProxy && _subProxy[prop], descriptors));\n }\n }\n return value;\n}\n\nfunction resolveFallback(\n fallback: ResolverObjectKey | ((prop: ResolverObjectKey, value: unknown) => ResolverObjectKey),\n prop: ResolverObjectKey,\n value: unknown\n) {\n return isFunction(fallback) ? fallback(prop, value) : fallback;\n}\n\nconst getScope = (key: ResolverObjectKey, parent: AnyObject) => key === true ? parent\n : typeof key === 'string' ? resolveObjectKey(parent, key) : undefined;\n\nfunction addScopes(\n set: Set<AnyObject>,\n parentScopes: AnyObject[],\n key: ResolverObjectKey,\n parentFallback: ResolverObjectKey,\n value: unknown\n) {\n for (const parent of parentScopes) {\n const scope = getScope(key, parent);\n if (scope) {\n set.add(scope);\n const fallback = resolveFallback(scope._fallback, key, value);\n if (typeof fallback !== 'undefined' && fallback !== key && fallback !== parentFallback) {\n // When we reach the descriptor that defines a new _fallback, return that.\n // The fallback will resume to that new scope.\n return fallback;\n }\n } else if (scope === false && typeof parentFallback !== 'undefined' && key !== parentFallback) {\n // Fallback to `false` results to `false`, when falling back to different key.\n // For example `interaction` from `hover` or `plugins.tooltip` and `animation` from `animations`\n return null;\n }\n }\n return false;\n}\n\nfunction createSubResolver(\n parentScopes: AnyObject[],\n resolver: ResolverCache,\n prop: ResolverObjectKey,\n value: unknown\n) {\n const rootScopes = resolver._rootScopes;\n const fallback = resolveFallback(resolver._fallback, prop, value);\n const allScopes = [...parentScopes, ...rootScopes];\n const set = new Set<AnyObject>();\n set.add(value);\n let key = addScopesFromKey(set, allScopes, prop, fallback || prop, value);\n if (key === null) {\n return false;\n }\n if (typeof fallback !== 'undefined' && fallback !== prop) {\n key = addScopesFromKey(set, allScopes, fallback, key, value);\n if (key === null) {\n return false;\n }\n }\n return _createResolver(Array.from(set), [''], rootScopes, fallback,\n () => subGetTarget(resolver, prop as string, value));\n}\n\nfunction addScopesFromKey(\n set: Set<AnyObject>,\n allScopes: AnyObject[],\n key: ResolverObjectKey,\n fallback: ResolverObjectKey,\n item: unknown\n) {\n while (key) {\n key = addScopes(set, allScopes, key, fallback, item);\n }\n return key;\n}\n\nfunction subGetTarget(\n resolver: ResolverCache,\n prop: string,\n value: unknown\n) {\n const parent = resolver._getTarget();\n if (!(prop in parent)) {\n parent[prop] = {};\n }\n const target = parent[prop];\n if (isArray(target) && isObject(value)) {\n // For array of objects, the object is used to store updated values\n return value;\n }\n return target || {};\n}\n\nfunction _resolveWithPrefixes(\n prop: string,\n prefixes: string[],\n scopes: AnyObject[],\n proxy: ResolverProxy\n) {\n let value: unknown;\n for (const prefix of prefixes) {\n value = _resolve(readKey(prefix, prop), scopes);\n if (typeof value !== 'undefined') {\n return needsSubResolver(prop, value)\n ? createSubResolver(scopes, proxy, prop, value)\n : value;\n }\n }\n}\n\nfunction _resolve(key: string, scopes: AnyObject[]) {\n for (const scope of scopes) {\n if (!scope) {\n continue;\n }\n const value = scope[key];\n if (typeof value !== 'undefined') {\n return value;\n }\n }\n}\n\nfunction getKeysFromAllScopes(target: ResolverCache) {\n let keys = target._keys;\n if (!keys) {\n keys = target._keys = resolveKeysFromAllScopes(target._scopes);\n }\n return keys;\n}\n\nfunction resolveKeysFromAllScopes(scopes: AnyObject[]) {\n const set = new Set<string>();\n for (const scope of scopes) {\n for (const key of Object.keys(scope).filter(k => !k.startsWith('_'))) {\n set.add(key);\n }\n }\n return Array.from(set);\n}\n\nexport function _parseObjectDataRadialScale(\n meta: ChartMeta<'line' | 'scatter'>,\n data: AnyObject[],\n start: number,\n count: number\n) {\n const {iScale} = meta;\n const {key = 'r'} = this._parsing;\n const parsed = new Array<{r: unknown}>(count);\n let i: number, ilen: number, index: number, item: AnyObject;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n r: iScale.parse(resolveObjectKey(item, key), index)\n };\n }\n return parsed;\n}\n","import {almostEquals, distanceBetweenPoints, sign} from './helpers.math.js';\nimport {_isPointInArea} from './helpers.canvas.js';\nimport type {ChartArea} from '../types/index.js';\nimport type {SplinePoint} from '../types/geometric.js';\n\nconst EPSILON = Number.EPSILON || 1e-14;\n\ntype OptionalSplinePoint = SplinePoint | false\nconst getPoint = (points: SplinePoint[], i: number): OptionalSplinePoint => i < points.length && !points[i].skip && points[i];\nconst getValueAxis = (indexAxis: 'x' | 'y') => indexAxis === 'x' ? 'y' : 'x';\n\nexport function splineCurve(\n firstPoint: SplinePoint,\n middlePoint: SplinePoint,\n afterPoint: SplinePoint,\n t: number\n): {\n previous: SplinePoint\n next: SplinePoint\n } {\n // Props to Rob Spencer at scaled innovation for his post on splining between points\n // http://scaledinnovation.com/analytics/splines/aboutSplines.html\n\n // This function must also respect \"skipped\" points\n\n const previous = firstPoint.skip ? middlePoint : firstPoint;\n const current = middlePoint;\n const next = afterPoint.skip ? middlePoint : afterPoint;\n const d01 = distanceBetweenPoints(current, previous);\n const d12 = distanceBetweenPoints(next, current);\n\n let s01 = d01 / (d01 + d12);\n let s12 = d12 / (d01 + d12);\n\n // If all points are the same, s01 & s02 will be inf\n s01 = isNaN(s01) ? 0 : s01;\n s12 = isNaN(s12) ? 0 : s12;\n\n const fa = t * s01; // scaling factor for triangle Ta\n const fb = t * s12;\n\n return {\n previous: {\n x: current.x - fa * (next.x - previous.x),\n y: current.y - fa * (next.y - previous.y)\n },\n next: {\n x: current.x + fb * (next.x - previous.x),\n y: current.y + fb * (next.y - previous.y)\n }\n };\n}\n\n/**\n * Adjust tangents to ensure monotonic properties\n */\nfunction monotoneAdjust(points: SplinePoint[], deltaK: number[], mK: number[]) {\n const pointsLen = points.length;\n\n let alphaK: number, betaK: number, tauK: number, squaredMagnitude: number, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n for (let i = 0; i < pointsLen - 1; ++i) {\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent || !pointAfter) {\n continue;\n }\n\n if (almostEquals(deltaK[i], 0, EPSILON)) {\n mK[i] = mK[i + 1] = 0;\n continue;\n }\n\n alphaK = mK[i] / deltaK[i];\n betaK = mK[i + 1] / deltaK[i];\n squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n if (squaredMagnitude <= 9) {\n continue;\n }\n\n tauK = 3 / Math.sqrt(squaredMagnitude);\n mK[i] = alphaK * tauK * deltaK[i];\n mK[i + 1] = betaK * tauK * deltaK[i];\n }\n}\n\nfunction monotoneCompute(points: SplinePoint[], mK: number[], indexAxis: 'x' | 'y' = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n let delta: number, pointBefore: OptionalSplinePoint, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n\n for (let i = 0; i < pointsLen; ++i) {\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n\n const iPixel = pointCurrent[indexAxis];\n const vPixel = pointCurrent[valueAxis];\n if (pointBefore) {\n delta = (iPixel - pointBefore[indexAxis]) / 3;\n pointCurrent[`cp1${indexAxis}`] = iPixel - delta;\n pointCurrent[`cp1${valueAxis}`] = vPixel - delta * mK[i];\n }\n if (pointAfter) {\n delta = (pointAfter[indexAxis] - iPixel) / 3;\n pointCurrent[`cp2${indexAxis}`] = iPixel + delta;\n pointCurrent[`cp2${valueAxis}`] = vPixel + delta * mK[i];\n }\n }\n}\n\n/**\n * This function calculates Bézier control points in a similar way than |splineCurve|,\n * but preserves monotonicity of the provided data and ensures no local extremums are added\n * between the dataset discrete points due to the interpolation.\n * See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation\n */\nexport function splineCurveMonotone(points: SplinePoint[], indexAxis: 'x' | 'y' = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n const deltaK: number[] = Array(pointsLen).fill(0);\n const mK: number[] = Array(pointsLen);\n\n // Calculate slopes (deltaK) and initialize tangents (mK)\n let i, pointBefore: OptionalSplinePoint, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n\n for (i = 0; i < pointsLen; ++i) {\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n\n if (pointAfter) {\n const slopeDelta = pointAfter[indexAxis] - pointCurrent[indexAxis];\n\n // In the case of two points that appear at the same x pixel, slopeDeltaX is 0\n deltaK[i] = slopeDelta !== 0 ? (pointAfter[valueAxis] - pointCurrent[valueAxis]) / slopeDelta : 0;\n }\n mK[i] = !pointBefore ? deltaK[i]\n : !pointAfter ? deltaK[i - 1]\n : (sign(deltaK[i - 1]) !== sign(deltaK[i])) ? 0\n : (deltaK[i - 1] + deltaK[i]) / 2;\n }\n\n monotoneAdjust(points, deltaK, mK);\n\n monotoneCompute(points, mK, indexAxis);\n}\n\nfunction capControlPoint(pt: number, min: number, max: number) {\n return Math.max(Math.min(pt, max), min);\n}\n\nfunction capBezierPoints(points: SplinePoint[], area: ChartArea) {\n let i, ilen, point, inArea, inAreaPrev;\n let inAreaNext = _isPointInArea(points[0], area);\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n inAreaPrev = inArea;\n inArea = inAreaNext;\n inAreaNext = i < ilen - 1 && _isPointInArea(points[i + 1], area);\n if (!inArea) {\n continue;\n }\n point = points[i];\n if (inAreaPrev) {\n point.cp1x = capControlPoint(point.cp1x, area.left, area.right);\n point.cp1y = capControlPoint(point.cp1y, area.top, area.bottom);\n }\n if (inAreaNext) {\n point.cp2x = capControlPoint(point.cp2x, area.left, area.right);\n point.cp2y = capControlPoint(point.cp2y, area.top, area.bottom);\n }\n }\n}\n\n/**\n * @private\n */\nexport function _updateBezierControlPoints(\n points: SplinePoint[],\n options,\n area: ChartArea,\n loop: boolean,\n indexAxis: 'x' | 'y'\n) {\n let i: number, ilen: number, point: SplinePoint, controlPoints: ReturnType<typeof splineCurve>;\n\n // Only consider points that are drawn in case the spanGaps option is used\n if (options.spanGaps) {\n points = points.filter((pt) => !pt.skip);\n }\n\n if (options.cubicInterpolationMode === 'monotone') {\n splineCurveMonotone(points, indexAxis);\n } else {\n let prev = loop ? points[points.length - 1] : points[0];\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n point = points[i];\n controlPoints = splineCurve(\n prev,\n point,\n points[Math.min(i + 1, ilen - (loop ? 0 : 1)) % ilen],\n options.tension\n );\n point.cp1x = controlPoints.previous.x;\n point.cp1y = controlPoints.previous.y;\n point.cp2x = controlPoints.next.x;\n point.cp2y = controlPoints.next.y;\n prev = point;\n }\n }\n\n if (options.capBezierPoints) {\n capBezierPoints(points, area);\n }\n}\n","import type {ChartArea, Scale} from '../types/index.js';\nimport type PrivateChart from '../core/core.controller.js';\nimport type {Chart, ChartEvent} from '../types.js';\nimport {INFINITY} from './helpers.math.js';\n\n/**\n * @private\n */\nexport function _isDomSupported(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\n/**\n * @private\n */\nexport function _getParentNode(domNode: HTMLCanvasElement): HTMLCanvasElement {\n let parent = domNode.parentNode;\n if (parent && parent.toString() === '[object ShadowRoot]') {\n parent = (parent as ShadowRoot).host;\n }\n return parent as HTMLCanvasElement;\n}\n\n/**\n * convert max-width/max-height values that may be percentages into a number\n * @private\n */\n\nfunction parseMaxStyle(styleValue: string | number, node: HTMLElement, parentProperty: string) {\n let valueInPixels: number;\n if (typeof styleValue === 'string') {\n valueInPixels = parseInt(styleValue, 10);\n\n if (styleValue.indexOf('%') !== -1) {\n // percentage * size in dimension\n valueInPixels = (valueInPixels / 100) * node.parentNode[parentProperty];\n }\n } else {\n valueInPixels = styleValue;\n }\n\n return valueInPixels;\n}\n\nconst getComputedStyle = (element: HTMLElement): CSSStyleDeclaration =>\n element.ownerDocument.defaultView.getComputedStyle(element, null);\n\nexport function getStyle(el: HTMLElement, property: string): string {\n return getComputedStyle(el).getPropertyValue(property);\n}\n\nconst positions = ['top', 'right', 'bottom', 'left'];\nfunction getPositionedStyle(styles: CSSStyleDeclaration, style: string, suffix?: string): ChartArea {\n const result = {} as ChartArea;\n suffix = suffix ? '-' + suffix : '';\n for (let i = 0; i < 4; i++) {\n const pos = positions[i];\n result[pos] = parseFloat(styles[style + '-' + pos + suffix]) || 0;\n }\n result.width = result.left + result.right;\n result.height = result.top + result.bottom;\n return result;\n}\n\nconst useOffsetPos = (x: number, y: number, target: HTMLElement | EventTarget) =>\n (x > 0 || y > 0) && (!target || !(target as HTMLElement).shadowRoot);\n\n/**\n * @param e\n * @param canvas\n * @returns Canvas position\n */\nfunction getCanvasPosition(\n e: Event | TouchEvent | MouseEvent,\n canvas: HTMLCanvasElement\n): {\n x: number;\n y: number;\n box: boolean;\n } {\n const touches = (e as TouchEvent).touches;\n const source = (touches && touches.length ? touches[0] : e) as MouseEvent;\n const {offsetX, offsetY} = source as MouseEvent;\n let box = false;\n let x, y;\n if (useOffsetPos(offsetX, offsetY, e.target)) {\n x = offsetX;\n y = offsetY;\n } else {\n const rect = canvas.getBoundingClientRect();\n x = source.clientX - rect.left;\n y = source.clientY - rect.top;\n box = true;\n }\n return {x, y, box};\n}\n\n/**\n * Gets an event's x, y coordinates, relative to the chart area\n * @param event\n * @param chart\n * @returns x and y coordinates of the event\n */\n\nexport function getRelativePosition(\n event: Event | ChartEvent | TouchEvent | MouseEvent,\n chart: Chart | PrivateChart\n): { x: number; y: number } {\n if ('native' in event) {\n return event;\n }\n\n const {canvas, currentDevicePixelRatio} = chart;\n const style = getComputedStyle(canvas);\n const borderBox = style.boxSizing === 'border-box';\n const paddings = getPositionedStyle(style, 'padding');\n const borders = getPositionedStyle(style, 'border', 'width');\n const {x, y, box} = getCanvasPosition(event, canvas);\n const xOffset = paddings.left + (box && borders.left);\n const yOffset = paddings.top + (box && borders.top);\n\n let {width, height} = chart;\n if (borderBox) {\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n return {\n x: Math.round((x - xOffset) / width * canvas.width / currentDevicePixelRatio),\n y: Math.round((y - yOffset) / height * canvas.height / currentDevicePixelRatio)\n };\n}\n\nfunction getContainerSize(canvas: HTMLCanvasElement, width: number, height: number): Partial<Scale> {\n let maxWidth: number, maxHeight: number;\n\n if (width === undefined || height === undefined) {\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n width = canvas.clientWidth;\n height = canvas.clientHeight;\n } else {\n const rect = container.getBoundingClientRect(); // this is the border box of the container\n const containerStyle = getComputedStyle(container);\n const containerBorder = getPositionedStyle(containerStyle, 'border', 'width');\n const containerPadding = getPositionedStyle(containerStyle, 'padding');\n width = rect.width - containerPadding.width - containerBorder.width;\n height = rect.height - containerPadding.height - containerBorder.height;\n maxWidth = parseMaxStyle(containerStyle.maxWidth, container, 'clientWidth');\n maxHeight = parseMaxStyle(containerStyle.maxHeight, container, 'clientHeight');\n }\n }\n return {\n width,\n height,\n maxWidth: maxWidth || INFINITY,\n maxHeight: maxHeight || INFINITY\n };\n}\n\nconst round1 = (v: number) => Math.round(v * 10) / 10;\n\n// eslint-disable-next-line complexity\nexport function getMaximumSize(\n canvas: HTMLCanvasElement,\n bbWidth?: number,\n bbHeight?: number,\n aspectRatio?: number\n): { width: number; height: number } {\n const style = getComputedStyle(canvas);\n const margins = getPositionedStyle(style, 'margin');\n const maxWidth = parseMaxStyle(style.maxWidth, canvas, 'clientWidth') || INFINITY;\n const maxHeight = parseMaxStyle(style.maxHeight, canvas, 'clientHeight') || INFINITY;\n const containerSize = getContainerSize(canvas, bbWidth, bbHeight);\n let {width, height} = containerSize;\n\n if (style.boxSizing === 'content-box') {\n const borders = getPositionedStyle(style, 'border', 'width');\n const paddings = getPositionedStyle(style, 'padding');\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n width = Math.max(0, width - margins.width);\n height = Math.max(0, aspectRatio ? width / aspectRatio : height - margins.height);\n width = round1(Math.min(width, maxWidth, containerSize.maxWidth));\n height = round1(Math.min(height, maxHeight, containerSize.maxHeight));\n if (width && !height) {\n // https://github.com/chartjs/Chart.js/issues/4659\n // If the canvas has width, but no height, default to aspectRatio of 2 (canvas default)\n height = round1(width / 2);\n }\n\n const maintainHeight = bbWidth !== undefined || bbHeight !== undefined;\n\n if (maintainHeight && aspectRatio && containerSize.height && height > containerSize.height) {\n height = containerSize.height;\n width = round1(Math.floor(height * aspectRatio));\n }\n\n return {width, height};\n}\n\n/**\n * @param chart\n * @param forceRatio\n * @param forceStyle\n * @returns True if the canvas context size or transformation has changed.\n */\nexport function retinaScale(\n chart: Chart | PrivateChart,\n forceRatio: number,\n forceStyle?: boolean\n): boolean | void {\n const pixelRatio = forceRatio || 1;\n const deviceHeight = Math.floor(chart.height * pixelRatio);\n const deviceWidth = Math.floor(chart.width * pixelRatio);\n\n (chart as PrivateChart).height = Math.floor(chart.height);\n (chart as PrivateChart).width = Math.floor(chart.width);\n\n const canvas = chart.canvas;\n\n // If no style has been set on the canvas, the render size is used as display size,\n // making the chart visually bigger, so let's enforce it to the \"correct\" values.\n // See https://github.com/chartjs/Chart.js/issues/3575\n if (canvas.style && (forceStyle || (!canvas.style.height && !canvas.style.width))) {\n canvas.style.height = `${chart.height}px`;\n canvas.style.width = `${chart.width}px`;\n }\n\n if (chart.currentDevicePixelRatio !== pixelRatio\n || canvas.height !== deviceHeight\n || canvas.width !== deviceWidth) {\n (chart as PrivateChart).currentDevicePixelRatio = pixelRatio;\n canvas.height = deviceHeight;\n canvas.width = deviceWidth;\n chart.ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n return true;\n }\n return false;\n}\n\n/**\n * Detects support for options object argument in addEventListener.\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support\n * @private\n */\nexport const supportsEventListenerOptions = (function() {\n let passiveSupported = false;\n try {\n const options = {\n get passive() { // This function will be called when the browser attempts to access the passive property.\n passiveSupported = true;\n return false;\n }\n } as EventListenerOptions;\n\n if (_isDomSupported()) {\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n }\n } catch (e) {\n // continue regardless of error\n }\n return passiveSupported;\n}());\n\n/**\n * The \"used\" size is the final value of a dimension property after all calculations have\n * been performed. This method uses the computed style of `element` but returns undefined\n * if the computed style is not expressed in pixels. That can happen in some cases where\n * `element` has a size relative to its parent and this last one is not yet displayed,\n * for example because of `display: none` on a parent node.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\n * @returns Size in pixels or undefined if unknown.\n */\n\nexport function readUsedSize(\n element: HTMLElement,\n property: 'width' | 'height'\n): number | undefined {\n const value = getStyle(element, property);\n const matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n return matches ? +matches[1] : undefined;\n}\n","import type {Point, SplinePoint} from '../types/geometric.js';\n\n/**\n * @private\n */\nexport function _pointInLine(p1: Point, p2: Point, t: number, mode?) { // eslint-disable-line @typescript-eslint/no-unused-vars\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: p1.y + t * (p2.y - p1.y)\n };\n}\n\n/**\n * @private\n */\nexport function _steppedInterpolation(\n p1: Point,\n p2: Point,\n t: number, mode: 'middle' | 'after' | unknown\n) {\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: mode === 'middle' ? t < 0.5 ? p1.y : p2.y\n : mode === 'after' ? t < 1 ? p1.y : p2.y\n : t > 0 ? p2.y : p1.y\n };\n}\n\n/**\n * @private\n */\nexport function _bezierInterpolation(p1: SplinePoint, p2: SplinePoint, t: number, mode?) { // eslint-disable-line @typescript-eslint/no-unused-vars\n const cp1 = {x: p1.cp2x, y: p1.cp2y};\n const cp2 = {x: p2.cp1x, y: p2.cp1y};\n const a = _pointInLine(p1, cp1, t);\n const b = _pointInLine(cp1, cp2, t);\n const c = _pointInLine(cp2, p2, t);\n const d = _pointInLine(a, b, t);\n const e = _pointInLine(b, c, t);\n return _pointInLine(d, e, t);\n}\n","export interface RTLAdapter {\n x(x: number): number;\n setWidth(w: number): void;\n textAlign(align: 'center' | 'left' | 'right'): 'center' | 'left' | 'right';\n xPlus(x: number, value: number): number;\n leftForLtr(x: number, itemWidth: number): number;\n}\n\nconst getRightToLeftAdapter = function(rectX: number, width: number): RTLAdapter {\n return {\n x(x) {\n return rectX + rectX + width - x;\n },\n setWidth(w) {\n width = w;\n },\n textAlign(align) {\n if (align === 'center') {\n return align;\n }\n return align === 'right' ? 'left' : 'right';\n },\n xPlus(x, value) {\n return x - value;\n },\n leftForLtr(x, itemWidth) {\n return x - itemWidth;\n },\n };\n};\n\nconst getLeftToRightAdapter = function(): RTLAdapter {\n return {\n x(x) {\n return x;\n },\n setWidth(w) { // eslint-disable-line no-unused-vars\n },\n textAlign(align) {\n return align;\n },\n xPlus(x, value) {\n return x + value;\n },\n leftForLtr(x, _itemWidth) { // eslint-disable-line @typescript-eslint/no-unused-vars\n return x;\n },\n };\n};\n\nexport function getRtlAdapter(rtl: boolean, rectX: number, width: number) {\n return rtl ? getRightToLeftAdapter(rectX, width) : getLeftToRightAdapter();\n}\n\nexport function overrideTextDirection(ctx: CanvasRenderingContext2D, direction: 'ltr' | 'rtl') {\n let style: CSSStyleDeclaration, original: [string, string];\n if (direction === 'ltr' || direction === 'rtl') {\n style = ctx.canvas.style;\n original = [\n style.getPropertyValue('direction'),\n style.getPropertyPriority('direction'),\n ];\n\n style.setProperty('direction', direction, 'important');\n (ctx as { prevTextDirection?: [string, string] }).prevTextDirection = original;\n }\n}\n\nexport function restoreTextDirection(ctx: CanvasRenderingContext2D, original?: [string, string]) {\n if (original !== undefined) {\n delete (ctx as { prevTextDirection?: [string, string] }).prevTextDirection;\n ctx.canvas.style.setProperty('direction', original[0], original[1]);\n }\n}\n","import {_angleBetween, _angleDiff, _isBetween, _normalizeAngle} from './helpers.math.js';\nimport {createContext} from './helpers.options.js';\nimport {isPatternOrGradient} from './helpers.color.js';\n\n/**\n * @typedef { import('../elements/element.line.js').default } LineElement\n * @typedef { import('../elements/element.point.js').default } PointElement\n * @typedef {{start: number, end: number, loop: boolean, style?: any}} Segment\n */\n\nfunction propertyFn(property) {\n if (property === 'angle') {\n return {\n between: _angleBetween,\n compare: _angleDiff,\n normalize: _normalizeAngle,\n };\n }\n return {\n between: _isBetween,\n compare: (a, b) => a - b,\n normalize: x => x\n };\n}\n\nfunction normalizeSegment({start, end, count, loop, style}) {\n return {\n start: start % count,\n end: end % count,\n loop: loop && (end - start + 1) % count === 0,\n style\n };\n}\n\nfunction getSegment(segment, points, bounds) {\n const {property, start: startBound, end: endBound} = bounds;\n const {between, normalize} = propertyFn(property);\n const count = points.length;\n // eslint-disable-next-line prefer-const\n let {start, end, loop} = segment;\n let i, ilen;\n\n if (loop) {\n start += count;\n end += count;\n for (i = 0, ilen = count; i < ilen; ++i) {\n if (!between(normalize(points[start % count][property]), startBound, endBound)) {\n break;\n }\n start--;\n end--;\n }\n start %= count;\n end %= count;\n }\n\n if (end < start) {\n end += count;\n }\n return {start, end, loop, style: segment.style};\n}\n\n/**\n * Returns the sub-segment(s) of a line segment that fall in the given bounds\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} [segment.style] - segment style\n * @param {PointElement[]} points - the points that this segment refers to\n * @param {object} [bounds]\n * @param {string} bounds.property - the property of a `PointElement` we are bounding. `x`, `y` or `angle`.\n * @param {number} bounds.start - start value of the property\n * @param {number} bounds.end - end value of the property\n * @private\n **/\nexport function _boundSegment(segment, points, bounds) {\n if (!bounds) {\n return [segment];\n }\n\n const {property, start: startBound, end: endBound} = bounds;\n const count = points.length;\n const {compare, between, normalize} = propertyFn(property);\n const {start, end, loop, style} = getSegment(segment, points, bounds);\n\n const result = [];\n let inside = false;\n let subStart = null;\n let value, point, prevValue;\n\n const startIsBefore = () => between(startBound, prevValue, value) && compare(startBound, prevValue) !== 0;\n const endIsBefore = () => compare(endBound, value) === 0 || between(endBound, prevValue, value);\n const shouldStart = () => inside || startIsBefore();\n const shouldStop = () => !inside || endIsBefore();\n\n for (let i = start, prev = start; i <= end; ++i) {\n point = points[i % count];\n\n if (point.skip) {\n continue;\n }\n\n value = normalize(point[property]);\n\n if (value === prevValue) {\n continue;\n }\n\n inside = between(value, startBound, endBound);\n\n if (subStart === null && shouldStart()) {\n subStart = compare(value, startBound) === 0 ? i : prev;\n }\n\n if (subStart !== null && shouldStop()) {\n result.push(normalizeSegment({start: subStart, end: i, loop, count, style}));\n subStart = null;\n }\n prev = i;\n prevValue = value;\n }\n\n if (subStart !== null) {\n result.push(normalizeSegment({start: subStart, end, loop, count, style}));\n }\n\n return result;\n}\n\n\n/**\n * Returns the segments of the line that are inside given bounds\n * @param {LineElement} line\n * @param {object} [bounds]\n * @param {string} bounds.property - the property we are bounding with. `x`, `y` or `angle`.\n * @param {number} bounds.start - start value of the `property`\n * @param {number} bounds.end - end value of the `property`\n * @private\n */\nexport function _boundSegments(line, bounds) {\n const result = [];\n const segments = line.segments;\n\n for (let i = 0; i < segments.length; i++) {\n const sub = _boundSegment(segments[i], line.points, bounds);\n if (sub.length) {\n result.push(...sub);\n }\n }\n return result;\n}\n\n/**\n * Find start and end index of a line.\n */\nfunction findStartAndEnd(points, count, loop, spanGaps) {\n let start = 0;\n let end = count - 1;\n\n if (loop && !spanGaps) {\n // loop and not spanning gaps, first find a gap to start from\n while (start < count && !points[start].skip) {\n start++;\n }\n }\n\n // find first non skipped point (after the first gap possibly)\n while (start < count && points[start].skip) {\n start++;\n }\n\n // if we looped to count, start needs to be 0\n start %= count;\n\n if (loop) {\n // loop will go past count, if start > 0\n end += start;\n }\n\n while (end > start && points[end % count].skip) {\n end--;\n }\n\n // end could be more than count, normalize\n end %= count;\n\n return {start, end};\n}\n\n/**\n * Compute solid segments from Points, when spanGaps === false\n * @param {PointElement[]} points - the points\n * @param {number} start - start index\n * @param {number} max - max index (can go past count on a loop)\n * @param {boolean} loop - boolean indicating that this would be a loop if no gaps are found\n */\nfunction solidSegments(points, start, max, loop) {\n const count = points.length;\n const result = [];\n let last = start;\n let prev = points[start];\n let end;\n\n for (end = start + 1; end <= max; ++end) {\n const cur = points[end % count];\n if (cur.skip || cur.stop) {\n if (!prev.skip) {\n loop = false;\n result.push({start: start % count, end: (end - 1) % count, loop});\n // @ts-ignore\n start = last = cur.stop ? end : null;\n }\n } else {\n last = end;\n if (prev.skip) {\n start = end;\n }\n }\n prev = cur;\n }\n\n if (last !== null) {\n result.push({start: start % count, end: last % count, loop});\n }\n\n return result;\n}\n\n/**\n * Compute the continuous segments that define the whole line\n * There can be skipped points within a segment, if spanGaps is true.\n * @param {LineElement} line\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n * @private\n */\nexport function _computeSegments(line, segmentOptions) {\n const points = line.points;\n const spanGaps = line.options.spanGaps;\n const count = points.length;\n\n if (!count) {\n return [];\n }\n\n const loop = !!line._loop;\n const {start, end} = findStartAndEnd(points, count, loop, spanGaps);\n\n if (spanGaps === true) {\n return splitByStyles(line, [{start, end, loop}], points, segmentOptions);\n }\n\n const max = end < start ? end + count : end;\n const completeLoop = !!line._fullLoop && start === 0 && end === count - 1;\n return splitByStyles(line, solidSegments(points, start, max, completeLoop), points, segmentOptions);\n}\n\n/**\n * @param {Segment[]} segments\n * @param {PointElement[]} points\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n */\nfunction splitByStyles(line, segments, points, segmentOptions) {\n if (!segmentOptions || !segmentOptions.setContext || !points) {\n return segments;\n }\n return doSplitByStyles(line, segments, points, segmentOptions);\n}\n\n/**\n * @param {LineElement} line\n * @param {Segment[]} segments\n * @param {PointElement[]} points\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n */\nfunction doSplitByStyles(line, segments, points, segmentOptions) {\n const chartContext = line._chart.getContext();\n const baseStyle = readStyle(line.options);\n const {_datasetIndex: datasetIndex, options: {spanGaps}} = line;\n const count = points.length;\n const result = [];\n let prevStyle = baseStyle;\n let start = segments[0].start;\n let i = start;\n\n function addStyle(s, e, l, st) {\n const dir = spanGaps ? -1 : 1;\n if (s === e) {\n return;\n }\n // Style can not start/end on a skipped point, adjust indices accordingly\n s += count;\n while (points[s % count].skip) {\n s -= dir;\n }\n while (points[e % count].skip) {\n e += dir;\n }\n if (s % count !== e % count) {\n result.push({start: s % count, end: e % count, loop: l, style: st});\n prevStyle = st;\n start = e % count;\n }\n }\n\n for (const segment of segments) {\n start = spanGaps ? start : segment.start;\n let prev = points[start % count];\n let style;\n for (i = start + 1; i <= segment.end; i++) {\n const pt = points[i % count];\n style = readStyle(segmentOptions.setContext(createContext(chartContext, {\n type: 'segment',\n p0: prev,\n p1: pt,\n p0DataIndex: (i - 1) % count,\n p1DataIndex: i % count,\n datasetIndex\n })));\n if (styleChanged(style, prevStyle)) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n prev = pt;\n prevStyle = style;\n }\n if (start < i - 1) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n }\n\n return result;\n}\n\nfunction readStyle(options) {\n return {\n backgroundColor: options.backgroundColor,\n borderCapStyle: options.borderCapStyle,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderJoinStyle: options.borderJoinStyle,\n borderWidth: options.borderWidth,\n borderColor: options.borderColor\n };\n}\n\nfunction styleChanged(style, prevStyle) {\n if (!prevStyle) {\n return false;\n }\n const cache = [];\n const replacer = function(key, value) {\n if (!isPatternOrGradient(value)) {\n return value;\n }\n if (!cache.includes(value)) {\n cache.push(value);\n }\n return cache.indexOf(value);\n };\n return JSON.stringify(style, replacer) !== JSON.stringify(prevStyle, replacer);\n}\n","import {requestAnimFrame} from '../helpers/helpers.extras.js';\n\n/**\n * @typedef { import('./core.animation.js').default } Animation\n * @typedef { import('./core.controller.js').default } Chart\n */\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is export for typedoc\n */\nexport class Animator {\n constructor() {\n this._request = null;\n this._charts = new Map();\n this._running = false;\n this._lastDate = undefined;\n }\n\n /**\n\t * @private\n\t */\n _notify(chart, anims, date, type) {\n const callbacks = anims.listeners[type];\n const numSteps = anims.duration;\n\n callbacks.forEach(fn => fn({\n chart,\n initial: anims.initial,\n numSteps,\n currentStep: Math.min(date - anims.start, numSteps)\n }));\n }\n\n /**\n\t * @private\n\t */\n _refresh() {\n if (this._request) {\n return;\n }\n this._running = true;\n\n this._request = requestAnimFrame.call(window, () => {\n this._update();\n this._request = null;\n\n if (this._running) {\n this._refresh();\n }\n });\n }\n\n /**\n\t * @private\n\t */\n _update(date = Date.now()) {\n let remaining = 0;\n\n this._charts.forEach((anims, chart) => {\n if (!anims.running || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n let draw = false;\n let item;\n\n for (; i >= 0; --i) {\n item = items[i];\n\n if (item._active) {\n if (item._total > anims.duration) {\n // if the animation has been updated and its duration prolonged,\n // update to total duration of current animations run (for progress event)\n anims.duration = item._total;\n }\n item.tick(date);\n draw = true;\n } else {\n // Remove the item by replacing it with last item and removing the last\n // A lot faster than splice.\n items[i] = items[items.length - 1];\n items.pop();\n }\n }\n\n if (draw) {\n chart.draw();\n this._notify(chart, anims, date, 'progress');\n }\n\n if (!items.length) {\n anims.running = false;\n this._notify(chart, anims, date, 'complete');\n anims.initial = false;\n }\n\n remaining += items.length;\n });\n\n this._lastDate = date;\n\n if (remaining === 0) {\n this._running = false;\n }\n }\n\n /**\n\t * @private\n\t */\n _getAnims(chart) {\n const charts = this._charts;\n let anims = charts.get(chart);\n if (!anims) {\n anims = {\n running: false,\n initial: true,\n items: [],\n listeners: {\n complete: [],\n progress: []\n }\n };\n charts.set(chart, anims);\n }\n return anims;\n }\n\n /**\n\t * @param {Chart} chart\n\t * @param {string} event - event name\n\t * @param {Function} cb - callback\n\t */\n listen(chart, event, cb) {\n this._getAnims(chart).listeners[event].push(cb);\n }\n\n /**\n\t * Add animations\n\t * @param {Chart} chart\n\t * @param {Animation[]} items - animations\n\t */\n add(chart, items) {\n if (!items || !items.length) {\n return;\n }\n this._getAnims(chart).items.push(...items);\n }\n\n /**\n\t * Counts number of active animations for the chart\n\t * @param {Chart} chart\n\t */\n has(chart) {\n return this._getAnims(chart).items.length > 0;\n }\n\n /**\n\t * Start animating (all charts)\n\t * @param {Chart} chart\n\t */\n start(chart) {\n const anims = this._charts.get(chart);\n if (!anims) {\n return;\n }\n anims.running = true;\n anims.start = Date.now();\n anims.duration = anims.items.reduce((acc, cur) => Math.max(acc, cur._duration), 0);\n this._refresh();\n }\n\n running(chart) {\n if (!this._running) {\n return false;\n }\n const anims = this._charts.get(chart);\n if (!anims || !anims.running || !anims.items.length) {\n return false;\n }\n return true;\n }\n\n /**\n\t * Stop all animations for the chart\n\t * @param {Chart} chart\n\t */\n stop(chart) {\n const anims = this._charts.get(chart);\n if (!anims || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n\n for (; i >= 0; --i) {\n items[i].cancel();\n }\n anims.items = [];\n this._notify(chart, anims, Date.now(), 'complete');\n }\n\n /**\n\t * Remove chart from Animator\n\t * @param {Chart} chart\n\t */\n remove(chart) {\n return this._charts.delete(chart);\n }\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Animator();\n","import effects from '../helpers/helpers.easing.js';\nimport {resolve} from '../helpers/helpers.options.js';\nimport {color as helpersColor} from '../helpers/helpers.color.js';\n\nconst transparent = 'transparent';\nconst interpolators = {\n boolean(from, to, factor) {\n return factor > 0.5 ? to : from;\n },\n /**\n * @param {string} from\n * @param {string} to\n * @param {number} factor\n */\n color(from, to, factor) {\n const c0 = helpersColor(from || transparent);\n const c1 = c0.valid && helpersColor(to || transparent);\n return c1 && c1.valid\n ? c1.mix(c0, factor).hexString()\n : to;\n },\n number(from, to, factor) {\n return from + (to - from) * factor;\n }\n};\n\nexport default class Animation {\n constructor(cfg, target, prop, to) {\n const currentValue = target[prop];\n\n to = resolve([cfg.to, to, currentValue, cfg.from]);\n const from = resolve([cfg.from, currentValue, to]);\n\n this._active = true;\n this._fn = cfg.fn || interpolators[cfg.type || typeof from];\n this._easing = effects[cfg.easing] || effects.linear;\n this._start = Math.floor(Date.now() + (cfg.delay || 0));\n this._duration = this._total = Math.floor(cfg.duration);\n this._loop = !!cfg.loop;\n this._target = target;\n this._prop = prop;\n this._from = from;\n this._to = to;\n this._promises = undefined;\n }\n\n active() {\n return this._active;\n }\n\n update(cfg, to, date) {\n if (this._active) {\n this._notify(false);\n\n const currentValue = this._target[this._prop];\n const elapsed = date - this._start;\n const remain = this._duration - elapsed;\n this._start = date;\n this._duration = Math.floor(Math.max(remain, cfg.duration));\n this._total += elapsed;\n this._loop = !!cfg.loop;\n this._to = resolve([cfg.to, to, currentValue, cfg.from]);\n this._from = resolve([cfg.from, currentValue, to]);\n }\n }\n\n cancel() {\n if (this._active) {\n // update current evaluated value, for smoother animations\n this.tick(Date.now());\n this._active = false;\n this._notify(false);\n }\n }\n\n tick(date) {\n const elapsed = date - this._start;\n const duration = this._duration;\n const prop = this._prop;\n const from = this._from;\n const loop = this._loop;\n const to = this._to;\n let factor;\n\n this._active = from !== to && (loop || (elapsed < duration));\n\n if (!this._active) {\n this._target[prop] = to;\n this._notify(true);\n return;\n }\n\n if (elapsed < 0) {\n this._target[prop] = from;\n return;\n }\n\n factor = (elapsed / duration) % 2;\n factor = loop && factor > 1 ? 2 - factor : factor;\n factor = this._easing(Math.min(1, Math.max(0, factor)));\n\n this._target[prop] = this._fn(from, to, factor);\n }\n\n wait() {\n const promises = this._promises || (this._promises = []);\n return new Promise((res, rej) => {\n promises.push({res, rej});\n });\n }\n\n _notify(resolved) {\n const method = resolved ? 'res' : 'rej';\n const promises = this._promises || [];\n for (let i = 0; i < promises.length; i++) {\n promises[i][method]();\n }\n }\n}\n","import animator from './core.animator.js';\nimport Animation from './core.animation.js';\nimport defaults from './core.defaults.js';\nimport {isArray, isObject} from '../helpers/helpers.core.js';\n\nexport default class Animations {\n constructor(chart, config) {\n this._chart = chart;\n this._properties = new Map();\n this.configure(config);\n }\n\n configure(config) {\n if (!isObject(config)) {\n return;\n }\n\n const animationOptions = Object.keys(defaults.animation);\n const animatedProps = this._properties;\n\n Object.getOwnPropertyNames(config).forEach(key => {\n const cfg = config[key];\n if (!isObject(cfg)) {\n return;\n }\n const resolved = {};\n for (const option of animationOptions) {\n resolved[option] = cfg[option];\n }\n\n (isArray(cfg.properties) && cfg.properties || [key]).forEach((prop) => {\n if (prop === key || !animatedProps.has(prop)) {\n animatedProps.set(prop, resolved);\n }\n });\n });\n }\n\n /**\n\t * Utility to handle animation of `options`.\n\t * @private\n\t */\n _animateOptions(target, values) {\n const newOptions = values.options;\n const options = resolveTargetOptions(target, newOptions);\n if (!options) {\n return [];\n }\n\n const animations = this._createAnimations(options, newOptions);\n if (newOptions.$shared) {\n // Going to shared options:\n // After all animations are done, assign the shared options object to the element\n // So any new updates to the shared options are observed\n awaitAll(target.options.$animations, newOptions).then(() => {\n target.options = newOptions;\n }, () => {\n // rejected, noop\n });\n }\n\n return animations;\n }\n\n /**\n\t * @private\n\t */\n _createAnimations(target, values) {\n const animatedProps = this._properties;\n const animations = [];\n const running = target.$animations || (target.$animations = {});\n const props = Object.keys(values);\n const date = Date.now();\n let i;\n\n for (i = props.length - 1; i >= 0; --i) {\n const prop = props[i];\n if (prop.charAt(0) === '$') {\n continue;\n }\n\n if (prop === 'options') {\n animations.push(...this._animateOptions(target, values));\n continue;\n }\n const value = values[prop];\n let animation = running[prop];\n const cfg = animatedProps.get(prop);\n\n if (animation) {\n if (cfg && animation.active()) {\n // There is an existing active animation, let's update that\n animation.update(cfg, value, date);\n continue;\n } else {\n animation.cancel();\n }\n }\n if (!cfg || !cfg.duration) {\n // not animated, set directly to new value\n target[prop] = value;\n continue;\n }\n\n running[prop] = animation = new Animation(cfg, target, prop, value);\n animations.push(animation);\n }\n return animations;\n }\n\n\n /**\n\t * Update `target` properties to new values, using configured animations\n\t * @param {object} target - object to update\n\t * @param {object} values - new target properties\n\t * @returns {boolean|undefined} - `true` if animations were started\n\t **/\n update(target, values) {\n if (this._properties.size === 0) {\n // Nothing is animated, just apply the new values.\n Object.assign(target, values);\n return;\n }\n\n const animations = this._createAnimations(target, values);\n\n if (animations.length) {\n animator.add(this._chart, animations);\n return true;\n }\n }\n}\n\nfunction awaitAll(animations, properties) {\n const running = [];\n const keys = Object.keys(properties);\n for (let i = 0; i < keys.length; i++) {\n const anim = animations[keys[i]];\n if (anim && anim.active()) {\n running.push(anim.wait());\n }\n }\n // @ts-ignore\n return Promise.all(running);\n}\n\nfunction resolveTargetOptions(target, newOptions) {\n if (!newOptions) {\n return;\n }\n let options = target.options;\n if (!options) {\n target.options = newOptions;\n return;\n }\n if (options.$shared) {\n // Going from shared options to distinct one:\n // Create new options object containing the old shared values and start updating that.\n target.options = options = Object.assign({}, options, {$shared: false, $animations: {}});\n }\n return options;\n}\n","import Animations from './core.animations.js';\nimport defaults from './core.defaults.js';\nimport {isArray, isFinite, isObject, valueOrDefault, resolveObjectKey, defined} from '../helpers/helpers.core.js';\nimport {listenArrayEvents, unlistenArrayEvents} from '../helpers/helpers.collection.js';\nimport {createContext, sign} from '../helpers/index.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('./core.scale.js').default } Scale\n */\n\nfunction scaleClip(scale, allowedOverflow) {\n const opts = scale && scale.options || {};\n const reverse = opts.reverse;\n const min = opts.min === undefined ? allowedOverflow : 0;\n const max = opts.max === undefined ? allowedOverflow : 0;\n return {\n start: reverse ? max : min,\n end: reverse ? min : max\n };\n}\n\nfunction defaultClip(xScale, yScale, allowedOverflow) {\n if (allowedOverflow === false) {\n return false;\n }\n const x = scaleClip(xScale, allowedOverflow);\n const y = scaleClip(yScale, allowedOverflow);\n\n return {\n top: y.end,\n right: x.end,\n bottom: y.start,\n left: x.start\n };\n}\n\nfunction toClip(value) {\n let t, r, b, l;\n\n if (isObject(value)) {\n t = value.top;\n r = value.right;\n b = value.bottom;\n l = value.left;\n } else {\n t = r = b = l = value;\n }\n\n return {\n top: t,\n right: r,\n bottom: b,\n left: l,\n disabled: value === false\n };\n}\n\nfunction getSortedDatasetIndices(chart, filterVisible) {\n const keys = [];\n const metasets = chart._getSortedDatasetMetas(filterVisible);\n let i, ilen;\n\n for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n keys.push(metasets[i].index);\n }\n return keys;\n}\n\nfunction applyStack(stack, value, dsIndex, options = {}) {\n const keys = stack.keys;\n const singleMode = options.mode === 'single';\n let i, ilen, datasetIndex, otherValue;\n\n if (value === null) {\n return;\n }\n\n let found = false;\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n datasetIndex = +keys[i];\n if (datasetIndex === dsIndex) {\n found = true;\n if (options.all) {\n continue;\n }\n break;\n }\n otherValue = stack.values[datasetIndex];\n if (isFinite(otherValue) && (singleMode || (value === 0 || sign(value) === sign(otherValue)))) {\n value += otherValue;\n }\n }\n\n if (!found && !options.all) {\n return 0;\n }\n\n return value;\n}\n\nfunction convertObjectDataToArray(data, meta) {\n const {iScale, vScale} = meta;\n const iAxisKey = iScale.axis === 'x' ? 'x' : 'y';\n const vAxisKey = vScale.axis === 'x' ? 'x' : 'y';\n const keys = Object.keys(data);\n const adata = new Array(keys.length);\n let i, ilen, key;\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n key = keys[i];\n adata[i] = {\n [iAxisKey]: key,\n [vAxisKey]: data[key]\n };\n }\n return adata;\n}\n\nfunction isStacked(scale, meta) {\n const stacked = scale && scale.options.stacked;\n return stacked || (stacked === undefined && meta.stack !== undefined);\n}\n\nfunction getStackKey(indexScale, valueScale, meta) {\n return `${indexScale.id}.${valueScale.id}.${meta.stack || meta.type}`;\n}\n\nfunction getUserBounds(scale) {\n const {min, max, minDefined, maxDefined} = scale.getUserBounds();\n return {\n min: minDefined ? min : Number.NEGATIVE_INFINITY,\n max: maxDefined ? max : Number.POSITIVE_INFINITY\n };\n}\n\nfunction getOrCreateStack(stacks, stackKey, indexValue) {\n const subStack = stacks[stackKey] || (stacks[stackKey] = {});\n return subStack[indexValue] || (subStack[indexValue] = {});\n}\n\nfunction getLastIndexInStack(stack, vScale, positive, type) {\n for (const meta of vScale.getMatchingVisibleMetas(type).reverse()) {\n const value = stack[meta.index];\n if ((positive && value > 0) || (!positive && value < 0)) {\n return meta.index;\n }\n }\n\n return null;\n}\n\nfunction updateStacks(controller, parsed) {\n const {chart, _cachedMeta: meta} = controller;\n const stacks = chart._stacks || (chart._stacks = {}); // map structure is {stackKey: {datasetIndex: value}}\n const {iScale, vScale, index: datasetIndex} = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const key = getStackKey(iScale, vScale, meta);\n const ilen = parsed.length;\n let stack;\n\n for (let i = 0; i < ilen; ++i) {\n const item = parsed[i];\n const {[iAxis]: index, [vAxis]: value} = item;\n const itemStacks = item._stacks || (item._stacks = {});\n stack = itemStacks[vAxis] = getOrCreateStack(stacks, key, index);\n stack[datasetIndex] = value;\n\n stack._top = getLastIndexInStack(stack, vScale, true, meta.type);\n stack._bottom = getLastIndexInStack(stack, vScale, false, meta.type);\n\n const visualValues = stack._visualValues || (stack._visualValues = {});\n visualValues[datasetIndex] = value;\n }\n}\n\nfunction getFirstScaleId(chart, axis) {\n const scales = chart.scales;\n return Object.keys(scales).filter(key => scales[key].axis === axis).shift();\n}\n\nfunction createDatasetContext(parent, index) {\n return createContext(parent,\n {\n active: false,\n dataset: undefined,\n datasetIndex: index,\n index,\n mode: 'default',\n type: 'dataset'\n }\n );\n}\n\nfunction createDataContext(parent, index, element) {\n return createContext(parent, {\n active: false,\n dataIndex: index,\n parsed: undefined,\n raw: undefined,\n element,\n index,\n mode: 'default',\n type: 'data'\n });\n}\n\nfunction clearStacks(meta, items) {\n // Not using meta.index here, because it might be already updated if the dataset changed location\n const datasetIndex = meta.controller.index;\n const axis = meta.vScale && meta.vScale.axis;\n if (!axis) {\n return;\n }\n\n items = items || meta._parsed;\n for (const parsed of items) {\n const stacks = parsed._stacks;\n if (!stacks || stacks[axis] === undefined || stacks[axis][datasetIndex] === undefined) {\n return;\n }\n delete stacks[axis][datasetIndex];\n if (stacks[axis]._visualValues !== undefined && stacks[axis]._visualValues[datasetIndex] !== undefined) {\n delete stacks[axis]._visualValues[datasetIndex];\n }\n }\n}\n\nconst isDirectUpdateMode = (mode) => mode === 'reset' || mode === 'none';\nconst cloneIfNotShared = (cached, shared) => shared ? cached : Object.assign({}, cached);\nconst createStack = (canStack, meta, chart) => canStack && !meta.hidden && meta._stacked\n && {keys: getSortedDatasetIndices(chart, true), values: null};\n\nexport default class DatasetController {\n\n /**\n * @type {any}\n */\n static defaults = {};\n\n /**\n * Element type used to generate a meta dataset (e.g. Chart.element.LineElement).\n */\n static datasetElementType = null;\n\n /**\n * Element type used to generate a meta data (e.g. Chart.element.PointElement).\n */\n static dataElementType = null;\n\n /**\n\t * @param {Chart} chart\n\t * @param {number} datasetIndex\n\t */\n constructor(chart, datasetIndex) {\n this.chart = chart;\n this._ctx = chart.ctx;\n this.index = datasetIndex;\n this._cachedDataOpts = {};\n this._cachedMeta = this.getMeta();\n this._type = this._cachedMeta.type;\n this.options = undefined;\n /** @type {boolean | object} */\n this._parsing = false;\n this._data = undefined;\n this._objectData = undefined;\n this._sharedOptions = undefined;\n this._drawStart = undefined;\n this._drawCount = undefined;\n this.enableOptionSharing = false;\n this.supportsDecimation = false;\n this.$context = undefined;\n this._syncList = [];\n this.datasetElementType = new.target.datasetElementType;\n this.dataElementType = new.target.dataElementType;\n\n this.initialize();\n }\n\n initialize() {\n const meta = this._cachedMeta;\n this.configure();\n this.linkScales();\n meta._stacked = isStacked(meta.vScale, meta);\n this.addElements();\n\n if (this.options.fill && !this.chart.isPluginEnabled('filler')) {\n console.warn(\"Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options\");\n }\n }\n\n updateIndex(datasetIndex) {\n if (this.index !== datasetIndex) {\n clearStacks(this._cachedMeta);\n }\n this.index = datasetIndex;\n }\n\n linkScales() {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n\n const chooseId = (axis, x, y, r) => axis === 'x' ? x : axis === 'r' ? r : y;\n\n const xid = meta.xAxisID = valueOrDefault(dataset.xAxisID, getFirstScaleId(chart, 'x'));\n const yid = meta.yAxisID = valueOrDefault(dataset.yAxisID, getFirstScaleId(chart, 'y'));\n const rid = meta.rAxisID = valueOrDefault(dataset.rAxisID, getFirstScaleId(chart, 'r'));\n const indexAxis = meta.indexAxis;\n const iid = meta.iAxisID = chooseId(indexAxis, xid, yid, rid);\n const vid = meta.vAxisID = chooseId(indexAxis, yid, xid, rid);\n meta.xScale = this.getScaleForId(xid);\n meta.yScale = this.getScaleForId(yid);\n meta.rScale = this.getScaleForId(rid);\n meta.iScale = this.getScaleForId(iid);\n meta.vScale = this.getScaleForId(vid);\n }\n\n getDataset() {\n return this.chart.data.datasets[this.index];\n }\n\n getMeta() {\n return this.chart.getDatasetMeta(this.index);\n }\n\n /**\n\t * @param {string} scaleID\n\t * @return {Scale}\n\t */\n getScaleForId(scaleID) {\n return this.chart.scales[scaleID];\n }\n\n /**\n\t * @private\n\t */\n _getOtherScale(scale) {\n const meta = this._cachedMeta;\n return scale === meta.iScale\n ? meta.vScale\n : meta.iScale;\n }\n\n reset() {\n this._update('reset');\n }\n\n /**\n\t * @private\n\t */\n _destroy() {\n const meta = this._cachedMeta;\n if (this._data) {\n unlistenArrayEvents(this._data, this);\n }\n if (meta._stacked) {\n clearStacks(meta);\n }\n }\n\n /**\n\t * @private\n\t */\n _dataCheck() {\n const dataset = this.getDataset();\n const data = dataset.data || (dataset.data = []);\n const _data = this._data;\n\n // In order to correctly handle data addition/deletion animation (and thus simulate\n // real-time charts), we need to monitor these data modifications and synchronize\n // the internal metadata accordingly.\n\n if (isObject(data)) {\n const meta = this._cachedMeta;\n this._data = convertObjectDataToArray(data, meta);\n } else if (_data !== data) {\n if (_data) {\n // This case happens when the user replaced the data array instance.\n unlistenArrayEvents(_data, this);\n // Discard old parsed data and stacks\n const meta = this._cachedMeta;\n clearStacks(meta);\n meta._parsed = [];\n }\n if (data && Object.isExtensible(data)) {\n listenArrayEvents(data, this);\n }\n this._syncList = [];\n this._data = data;\n }\n }\n\n addElements() {\n const meta = this._cachedMeta;\n\n this._dataCheck();\n\n if (this.datasetElementType) {\n meta.dataset = new this.datasetElementType();\n }\n }\n\n buildOrUpdateElements(resetNewElements) {\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n let stackChanged = false;\n\n this._dataCheck();\n\n // make sure cached _stacked status is current\n const oldStacked = meta._stacked;\n meta._stacked = isStacked(meta.vScale, meta);\n\n // detect change in stack option\n if (meta.stack !== dataset.stack) {\n stackChanged = true;\n // remove values from old stack\n clearStacks(meta);\n meta.stack = dataset.stack;\n }\n\n // Re-sync meta data in case the user replaced the data array or if we missed\n // any updates and so make sure that we handle number of datapoints changing.\n this._resyncElements(resetNewElements);\n\n // if stack changed, update stack values for the whole dataset\n if (stackChanged || oldStacked !== meta._stacked) {\n updateStacks(this, meta._parsed);\n meta._stacked = isStacked(meta.vScale, meta);\n }\n }\n\n /**\n\t * Merges user-supplied and default dataset-level options\n\t * @private\n\t */\n configure() {\n const config = this.chart.config;\n const scopeKeys = config.datasetScopeKeys(this._type);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys, true);\n this.options = config.createResolver(scopes, this.getContext());\n this._parsing = this.options.parsing;\n this._cachedDataOpts = {};\n }\n\n /**\n\t * @param {number} start\n\t * @param {number} count\n\t */\n parse(start, count) {\n const {_cachedMeta: meta, _data: data} = this;\n const {iScale, _stacked} = meta;\n const iAxis = iScale.axis;\n\n let sorted = start === 0 && count === data.length ? true : meta._sorted;\n let prev = start > 0 && meta._parsed[start - 1];\n let i, cur, parsed;\n\n if (this._parsing === false) {\n meta._parsed = data;\n meta._sorted = true;\n parsed = data;\n } else {\n if (isArray(data[start])) {\n parsed = this.parseArrayData(meta, data, start, count);\n } else if (isObject(data[start])) {\n parsed = this.parseObjectData(meta, data, start, count);\n } else {\n parsed = this.parsePrimitiveData(meta, data, start, count);\n }\n\n const isNotInOrderComparedToPrev = () => cur[iAxis] === null || (prev && cur[iAxis] < prev[iAxis]);\n for (i = 0; i < count; ++i) {\n meta._parsed[i + start] = cur = parsed[i];\n if (sorted) {\n if (isNotInOrderComparedToPrev()) {\n sorted = false;\n }\n prev = cur;\n }\n }\n meta._sorted = sorted;\n }\n\n if (_stacked) {\n updateStacks(this, parsed);\n }\n }\n\n /**\n\t * Parse array of primitive values\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [1,3,4]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id.\n\t * Example: {xScale0: 0, yScale0: 1}\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n const {iScale, vScale} = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = new Array(count);\n let i, ilen, index;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n parsed[i] = {\n [iAxis]: singleScale || iScale.parse(labels[index], index),\n [vAxis]: vScale.parse(data[index], index)\n };\n }\n return parsed;\n }\n\n /**\n\t * Parse array of arrays\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [[1,2],[3,4]]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id.\n\t * Example: {x: 0, y: 1}\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n const {xScale, yScale} = meta;\n const parsed = new Array(count);\n let i, ilen, index, item;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(item[0], index),\n y: yScale.parse(item[1], index)\n };\n }\n return parsed;\n }\n\n /**\n\t * Parse array of objects\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [{x:1, y:5}, {x:2, y:10}]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id. _custom is optional\n\t * Example: {xScale0: 0, yScale0: 1, _custom: {r: 10, foo: 'bar'}}\n\t * @protected\n\t */\n parseObjectData(meta, data, start, count) {\n const {xScale, yScale} = meta;\n const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n const parsed = new Array(count);\n let i, ilen, index, item;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(resolveObjectKey(item, xAxisKey), index),\n y: yScale.parse(resolveObjectKey(item, yAxisKey), index)\n };\n }\n return parsed;\n }\n\n /**\n\t * @protected\n\t */\n getParsed(index) {\n return this._cachedMeta._parsed[index];\n }\n\n /**\n\t * @protected\n\t */\n getDataElement(index) {\n return this._cachedMeta.data[index];\n }\n\n /**\n\t * @protected\n\t */\n applyStack(scale, parsed, mode) {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const value = parsed[scale.axis];\n const stack = {\n keys: getSortedDatasetIndices(chart, true),\n values: parsed._stacks[scale.axis]._visualValues\n };\n return applyStack(stack, value, meta.index, {mode});\n }\n\n /**\n\t * @protected\n\t */\n updateRangeFromParsed(range, scale, parsed, stack) {\n const parsedValue = parsed[scale.axis];\n let value = parsedValue === null ? NaN : parsedValue;\n const values = stack && parsed._stacks[scale.axis];\n if (stack && values) {\n stack.values = values;\n value = applyStack(stack, parsedValue, this._cachedMeta.index);\n }\n range.min = Math.min(range.min, value);\n range.max = Math.max(range.max, value);\n }\n\n /**\n\t * @protected\n\t */\n getMinMax(scale, canStack) {\n const meta = this._cachedMeta;\n const _parsed = meta._parsed;\n const sorted = meta._sorted && scale === meta.iScale;\n const ilen = _parsed.length;\n const otherScale = this._getOtherScale(scale);\n const stack = createStack(canStack, meta, this.chart);\n const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n const {min: otherMin, max: otherMax} = getUserBounds(otherScale);\n let i, parsed;\n\n function _skip() {\n parsed = _parsed[i];\n const otherValue = parsed[otherScale.axis];\n return !isFinite(parsed[scale.axis]) || otherMin > otherValue || otherMax < otherValue;\n }\n\n for (i = 0; i < ilen; ++i) {\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n if (sorted) {\n // if the data is sorted, we don't need to check further from this end of array\n break;\n }\n }\n if (sorted) {\n // in the sorted case, find first non-skipped value from other end of array\n for (i = ilen - 1; i >= 0; --i) {\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n break;\n }\n }\n return range;\n }\n\n getAllParsedValues(scale) {\n const parsed = this._cachedMeta._parsed;\n const values = [];\n let i, ilen, value;\n\n for (i = 0, ilen = parsed.length; i < ilen; ++i) {\n value = parsed[i][scale.axis];\n if (isFinite(value)) {\n values.push(value);\n }\n }\n return values;\n }\n\n /**\n\t * @return {number|boolean}\n\t * @protected\n\t */\n getMaxOverflow() {\n return false;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const parsed = this.getParsed(index);\n return {\n label: iScale ? '' + iScale.getLabelForValue(parsed[iScale.axis]) : '',\n value: vScale ? '' + vScale.getLabelForValue(parsed[vScale.axis]) : ''\n };\n }\n\n /**\n\t * @private\n\t */\n _update(mode) {\n const meta = this._cachedMeta;\n this.update(mode || 'default');\n meta._clip = toClip(valueOrDefault(this.options.clip, defaultClip(meta.xScale, meta.yScale, this.getMaxOverflow())));\n }\n\n /**\n\t * @param {string} mode\n\t */\n update(mode) {} // eslint-disable-line no-unused-vars\n\n draw() {\n const ctx = this._ctx;\n const chart = this.chart;\n const meta = this._cachedMeta;\n const elements = meta.data || [];\n const area = chart.chartArea;\n const active = [];\n const start = this._drawStart || 0;\n const count = this._drawCount || (elements.length - start);\n const drawActiveElementsOnTop = this.options.drawActiveElementsOnTop;\n let i;\n\n if (meta.dataset) {\n meta.dataset.draw(ctx, area, start, count);\n }\n\n for (i = start; i < start + count; ++i) {\n const element = elements[i];\n if (element.hidden) {\n continue;\n }\n if (element.active && drawActiveElementsOnTop) {\n active.push(element);\n } else {\n element.draw(ctx, area);\n }\n }\n\n for (i = 0; i < active.length; ++i) {\n active[i].draw(ctx, area);\n }\n }\n\n /**\n\t * Returns a set of predefined style properties that should be used to represent the dataset\n\t * or the data if the index is specified\n\t * @param {number} index - data index\n\t * @param {boolean} [active] - true if hover\n\t * @return {object} style object\n\t */\n getStyle(index, active) {\n const mode = active ? 'active' : 'default';\n return index === undefined && this._cachedMeta.dataset\n ? this.resolveDatasetElementOptions(mode)\n : this.resolveDataElementOptions(index || 0, mode);\n }\n\n /**\n\t * @protected\n\t */\n getContext(index, active, mode) {\n const dataset = this.getDataset();\n let context;\n if (index >= 0 && index < this._cachedMeta.data.length) {\n const element = this._cachedMeta.data[index];\n context = element.$context ||\n (element.$context = createDataContext(this.getContext(), index, element));\n context.parsed = this.getParsed(index);\n context.raw = dataset.data[index];\n context.index = context.dataIndex = index;\n } else {\n context = this.$context ||\n (this.$context = createDatasetContext(this.chart.getContext(), this.index));\n context.dataset = dataset;\n context.index = context.datasetIndex = this.index;\n }\n\n context.active = !!active;\n context.mode = mode;\n return context;\n }\n\n /**\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDatasetElementOptions(mode) {\n return this._resolveElementOptions(this.datasetElementType.id, mode);\n }\n\n /**\n\t * @param {number} index\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDataElementOptions(index, mode) {\n return this._resolveElementOptions(this.dataElementType.id, mode, index);\n }\n\n /**\n\t * @private\n\t */\n _resolveElementOptions(elementType, mode = 'default', index) {\n const active = mode === 'active';\n const cache = this._cachedDataOpts;\n const cacheKey = elementType + '-' + mode;\n const cached = cache[cacheKey];\n const sharing = this.enableOptionSharing && defined(index);\n if (cached) {\n return cloneIfNotShared(cached, sharing);\n }\n const config = this.chart.config;\n const scopeKeys = config.datasetElementScopeKeys(this._type, elementType);\n const prefixes = active ? [`${elementType}Hover`, 'hover', elementType, ''] : [elementType, ''];\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n const names = Object.keys(defaults.elements[elementType]);\n // context is provided as a function, and is called only if needed,\n // so we don't create a context for each element if not needed.\n const context = () => this.getContext(index, active, mode);\n const values = config.resolveNamedOptions(scopes, names, context, prefixes);\n\n if (values.$shared) {\n // `$shared` indicates this set of options can be shared between multiple elements.\n // Sharing is used to reduce number of properties to change during animation.\n values.$shared = sharing;\n\n // We cache options by `mode`, which can be 'active' for example. This enables us\n // to have the 'active' element options and 'default' options to switch between\n // when interacting.\n cache[cacheKey] = Object.freeze(cloneIfNotShared(values, sharing));\n }\n\n return values;\n }\n\n\n /**\n\t * @private\n\t */\n _resolveAnimations(index, transition, active) {\n const chart = this.chart;\n const cache = this._cachedDataOpts;\n const cacheKey = `animation-${transition}`;\n const cached = cache[cacheKey];\n if (cached) {\n return cached;\n }\n let options;\n if (chart.options.animation !== false) {\n const config = this.chart.config;\n const scopeKeys = config.datasetAnimationScopeKeys(this._type, transition);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n options = config.createResolver(scopes, this.getContext(index, active, transition));\n }\n const animations = new Animations(chart, options && options.animations);\n if (options && options._cacheable) {\n cache[cacheKey] = Object.freeze(animations);\n }\n return animations;\n }\n\n /**\n\t * Utility for getting the options object shared between elements\n\t * @protected\n\t */\n getSharedOptions(options) {\n if (!options.$shared) {\n return;\n }\n return this._sharedOptions || (this._sharedOptions = Object.assign({}, options));\n }\n\n /**\n\t * Utility for determining if `options` should be included in the updated properties\n\t * @protected\n\t */\n includeOptions(mode, sharedOptions) {\n return !sharedOptions || isDirectUpdateMode(mode) || this.chart._animationsDisabled;\n }\n\n /**\n * @todo v4, rename to getSharedOptions and remove excess functions\n */\n _getSharedOptions(start, mode) {\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const previouslySharedOptions = this._sharedOptions;\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions) || (sharedOptions !== previouslySharedOptions);\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n return {sharedOptions, includeOptions};\n }\n\n /**\n\t * Utility for updating an element with new properties, using animations when appropriate.\n\t * @protected\n\t */\n updateElement(element, index, properties, mode) {\n if (isDirectUpdateMode(mode)) {\n Object.assign(element, properties);\n } else {\n this._resolveAnimations(index, mode).update(element, properties);\n }\n }\n\n /**\n\t * Utility to animate the shared options, that are potentially affecting multiple elements.\n\t * @protected\n\t */\n updateSharedOptions(sharedOptions, mode, newOptions) {\n if (sharedOptions && !isDirectUpdateMode(mode)) {\n this._resolveAnimations(undefined, mode).update(sharedOptions, newOptions);\n }\n }\n\n /**\n\t * @private\n\t */\n _setStyle(element, index, mode, active) {\n element.active = active;\n const options = this.getStyle(index, active);\n this._resolveAnimations(index, mode, active).update(element, {\n // When going from active to inactive, we need to update to the shared options.\n // This way the once hovered element will end up with the same original shared options instance, after animation.\n options: (!active && this.getSharedOptions(options)) || options\n });\n }\n\n removeHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', false);\n }\n\n setHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', true);\n }\n\n /**\n\t * @private\n\t */\n _removeDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n\n if (element) {\n this._setStyle(element, undefined, 'active', false);\n }\n }\n\n /**\n\t * @private\n\t */\n _setDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n\n if (element) {\n this._setStyle(element, undefined, 'active', true);\n }\n }\n\n /**\n\t * @private\n\t */\n _resyncElements(resetNewElements) {\n const data = this._data;\n const elements = this._cachedMeta.data;\n\n // Apply changes detected through array listeners\n for (const [method, arg1, arg2] of this._syncList) {\n this[method](arg1, arg2);\n }\n this._syncList = [];\n\n const numMeta = elements.length;\n const numData = data.length;\n const count = Math.min(numData, numMeta);\n\n if (count) {\n // TODO: It is not optimal to always parse the old data\n // This is done because we are not detecting direct assignments:\n // chart.data.datasets[0].data[5] = 10;\n // chart.data.datasets[0].data[5].y = 10;\n this.parse(0, count);\n }\n\n if (numData > numMeta) {\n this._insertElements(numMeta, numData - numMeta, resetNewElements);\n } else if (numData < numMeta) {\n this._removeElements(numData, numMeta - numData);\n }\n }\n\n /**\n\t * @private\n\t */\n _insertElements(start, count, resetNewElements = true) {\n const meta = this._cachedMeta;\n const data = meta.data;\n const end = start + count;\n let i;\n\n const move = (arr) => {\n arr.length += count;\n for (i = arr.length - 1; i >= end; i--) {\n arr[i] = arr[i - count];\n }\n };\n move(data);\n\n for (i = start; i < end; ++i) {\n data[i] = new this.dataElementType();\n }\n\n if (this._parsing) {\n move(meta._parsed);\n }\n this.parse(start, count);\n\n if (resetNewElements) {\n this.updateElements(data, start, count, 'reset');\n }\n }\n\n updateElements(element, start, count, mode) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * @private\n\t */\n _removeElements(start, count) {\n const meta = this._cachedMeta;\n if (this._parsing) {\n const removed = meta._parsed.splice(start, count);\n if (meta._stacked) {\n clearStacks(meta, removed);\n }\n }\n meta.data.splice(start, count);\n }\n\n /**\n\t * @private\n */\n _sync(args) {\n if (this._parsing) {\n this._syncList.push(args);\n } else {\n const [method, arg1, arg2] = args;\n this[method](arg1, arg2);\n }\n this.chart._dataChanges.push([this.index, ...args]);\n }\n\n _onDataPush() {\n const count = arguments.length;\n this._sync(['_insertElements', this.getDataset().data.length - count, count]);\n }\n\n _onDataPop() {\n this._sync(['_removeElements', this._cachedMeta.data.length - 1, 1]);\n }\n\n _onDataShift() {\n this._sync(['_removeElements', 0, 1]);\n }\n\n _onDataSplice(start, count) {\n if (count) {\n this._sync(['_removeElements', start, count]);\n }\n const newCount = arguments.length - 2;\n if (newCount) {\n this._sync(['_insertElements', start, newCount]);\n }\n }\n\n _onDataUnshift() {\n this._sync(['_insertElements', 0, arguments.length]);\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {\n _arrayUnique, isArray, isNullOrUndef,\n valueOrDefault, resolveObjectKey, sign, defined\n} from '../helpers/index.js';\n\nfunction getAllScaleValues(scale, type) {\n if (!scale._cache.$bar) {\n const visibleMetas = scale.getMatchingVisibleMetas(type);\n let values = [];\n\n for (let i = 0, ilen = visibleMetas.length; i < ilen; i++) {\n values = values.concat(visibleMetas[i].controller.getAllParsedValues(scale));\n }\n scale._cache.$bar = _arrayUnique(values.sort((a, b) => a - b));\n }\n return scale._cache.$bar;\n}\n\n/**\n * Computes the \"optimal\" sample size to maintain bars equally sized while preventing overlap.\n * @private\n */\nfunction computeMinSampleSize(meta) {\n const scale = meta.iScale;\n const values = getAllScaleValues(scale, meta.type);\n let min = scale._length;\n let i, ilen, curr, prev;\n const updateMinAndPrev = () => {\n if (curr === 32767 || curr === -32768) {\n // Ignore truncated pixels\n return;\n }\n if (defined(prev)) {\n // curr - prev === 0 is ignored\n min = Math.min(min, Math.abs(curr - prev) || min);\n }\n prev = curr;\n };\n\n for (i = 0, ilen = values.length; i < ilen; ++i) {\n curr = scale.getPixelForValue(values[i]);\n updateMinAndPrev();\n }\n\n prev = undefined;\n for (i = 0, ilen = scale.ticks.length; i < ilen; ++i) {\n curr = scale.getPixelForTick(i);\n updateMinAndPrev();\n }\n\n return min;\n}\n\n/**\n * Computes an \"ideal\" category based on the absolute bar thickness or, if undefined or null,\n * uses the smallest interval (see computeMinSampleSize) that prevents bar overlapping. This\n * mode currently always generates bars equally sized (until we introduce scriptable options?).\n * @private\n */\nfunction computeFitCategoryTraits(index, ruler, options, stackCount) {\n const thickness = options.barThickness;\n let size, ratio;\n\n if (isNullOrUndef(thickness)) {\n size = ruler.min * options.categoryPercentage;\n ratio = options.barPercentage;\n } else {\n // When bar thickness is enforced, category and bar percentages are ignored.\n // Note(SB): we could add support for relative bar thickness (e.g. barThickness: '50%')\n // and deprecate barPercentage since this value is ignored when thickness is absolute.\n size = thickness * stackCount;\n ratio = 1;\n }\n\n return {\n chunk: size / stackCount,\n ratio,\n start: ruler.pixels[index] - (size / 2)\n };\n}\n\n/**\n * Computes an \"optimal\" category that globally arranges bars side by side (no gap when\n * percentage options are 1), based on the previous and following categories. This mode\n * generates bars with different widths when data are not evenly spaced.\n * @private\n */\nfunction computeFlexCategoryTraits(index, ruler, options, stackCount) {\n const pixels = ruler.pixels;\n const curr = pixels[index];\n let prev = index > 0 ? pixels[index - 1] : null;\n let next = index < pixels.length - 1 ? pixels[index + 1] : null;\n const percent = options.categoryPercentage;\n\n if (prev === null) {\n // first data: its size is double based on the next point or,\n // if it's also the last data, we use the scale size.\n prev = curr - (next === null ? ruler.end - ruler.start : next - curr);\n }\n\n if (next === null) {\n // last data: its size is also double based on the previous point.\n next = curr + curr - prev;\n }\n\n const start = curr - (curr - Math.min(prev, next)) / 2 * percent;\n const size = Math.abs(next - prev) / 2 * percent;\n\n return {\n chunk: size / stackCount,\n ratio: options.barPercentage,\n start\n };\n}\n\nfunction parseFloatBar(entry, item, vScale, i) {\n const startValue = vScale.parse(entry[0], i);\n const endValue = vScale.parse(entry[1], i);\n const min = Math.min(startValue, endValue);\n const max = Math.max(startValue, endValue);\n let barStart = min;\n let barEnd = max;\n\n if (Math.abs(min) > Math.abs(max)) {\n barStart = max;\n barEnd = min;\n }\n\n // Store `barEnd` (furthest away from origin) as parsed value,\n // to make stacking straight forward\n item[vScale.axis] = barEnd;\n\n item._custom = {\n barStart,\n barEnd,\n start: startValue,\n end: endValue,\n min,\n max\n };\n}\n\nfunction parseValue(entry, item, vScale, i) {\n if (isArray(entry)) {\n parseFloatBar(entry, item, vScale, i);\n } else {\n item[vScale.axis] = vScale.parse(entry, i);\n }\n return item;\n}\n\nfunction parseArrayOrPrimitive(meta, data, start, count) {\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = [];\n let i, ilen, item, entry;\n\n for (i = start, ilen = start + count; i < ilen; ++i) {\n entry = data[i];\n item = {};\n item[iScale.axis] = singleScale || iScale.parse(labels[i], i);\n parsed.push(parseValue(entry, item, vScale, i));\n }\n return parsed;\n}\n\nfunction isFloatBar(custom) {\n return custom && custom.barStart !== undefined && custom.barEnd !== undefined;\n}\n\nfunction barSign(size, vScale, actualBase) {\n if (size !== 0) {\n return sign(size);\n }\n return (vScale.isHorizontal() ? 1 : -1) * (vScale.min >= actualBase ? 1 : -1);\n}\n\nfunction borderProps(properties) {\n let reverse, start, end, top, bottom;\n if (properties.horizontal) {\n reverse = properties.base > properties.x;\n start = 'left';\n end = 'right';\n } else {\n reverse = properties.base < properties.y;\n start = 'bottom';\n end = 'top';\n }\n if (reverse) {\n top = 'end';\n bottom = 'start';\n } else {\n top = 'start';\n bottom = 'end';\n }\n return {start, end, reverse, top, bottom};\n}\n\nfunction setBorderSkipped(properties, options, stack, index) {\n let edge = options.borderSkipped;\n const res = {};\n\n if (!edge) {\n properties.borderSkipped = res;\n return;\n }\n\n if (edge === true) {\n properties.borderSkipped = {top: true, right: true, bottom: true, left: true};\n return;\n }\n\n const {start, end, reverse, top, bottom} = borderProps(properties);\n\n if (edge === 'middle' && stack) {\n properties.enableBorderRadius = true;\n if ((stack._top || 0) === index) {\n edge = top;\n } else if ((stack._bottom || 0) === index) {\n edge = bottom;\n } else {\n res[parseEdge(bottom, start, end, reverse)] = true;\n edge = top;\n }\n }\n\n res[parseEdge(edge, start, end, reverse)] = true;\n properties.borderSkipped = res;\n}\n\nfunction parseEdge(edge, a, b, reverse) {\n if (reverse) {\n edge = swap(edge, a, b);\n edge = startEnd(edge, b, a);\n } else {\n edge = startEnd(edge, a, b);\n }\n return edge;\n}\n\nfunction swap(orig, v1, v2) {\n return orig === v1 ? v2 : orig === v2 ? v1 : orig;\n}\n\nfunction startEnd(v, start, end) {\n return v === 'start' ? start : v === 'end' ? end : v;\n}\n\nfunction setInflateAmount(properties, {inflateAmount}, ratio) {\n properties.inflateAmount = inflateAmount === 'auto'\n ? ratio === 1 ? 0.33 : 0\n : inflateAmount;\n}\n\nexport default class BarController extends DatasetController {\n\n static id = 'bar';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'bar',\n\n categoryPercentage: 0.8,\n barPercentage: 0.9,\n grouped: true,\n\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'base', 'width', 'height']\n }\n }\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n _index_: {\n type: 'category',\n offset: true,\n grid: {\n offset: true\n }\n },\n _value_: {\n type: 'linear',\n beginAtZero: true,\n }\n }\n };\n\n\n /**\n\t * Overriding primitive data parsing since we support mixed primitive/array\n\t * data for float bars\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n\n /**\n\t * Overriding array data parsing since we support mixed primitive/array\n\t * data for float bars\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n\n /**\n\t * Overriding object data parsing since we support mixed primitive/array\n\t * value-scale data for float bars\n\t * @protected\n\t */\n parseObjectData(meta, data, start, count) {\n const {iScale, vScale} = meta;\n const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n const iAxisKey = iScale.axis === 'x' ? xAxisKey : yAxisKey;\n const vAxisKey = vScale.axis === 'x' ? xAxisKey : yAxisKey;\n const parsed = [];\n let i, ilen, item, obj;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n obj = data[i];\n item = {};\n item[iScale.axis] = iScale.parse(resolveObjectKey(obj, iAxisKey), i);\n parsed.push(parseValue(resolveObjectKey(obj, vAxisKey), item, vScale, i));\n }\n return parsed;\n }\n\n /**\n\t * @protected\n\t */\n updateRangeFromParsed(range, scale, parsed, stack) {\n super.updateRangeFromParsed(range, scale, parsed, stack);\n const custom = parsed._custom;\n if (custom && scale === this._cachedMeta.vScale) {\n // float bar: only one end of the bar is considered by `super`\n range.min = Math.min(range.min, custom.min);\n range.max = Math.max(range.max, custom.max);\n }\n }\n\n /**\n\t * @return {number|boolean}\n\t * @protected\n\t */\n getMaxOverflow() {\n return 0;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const {iScale, vScale} = meta;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const value = isFloatBar(custom)\n ? '[' + custom.start + ', ' + custom.end + ']'\n : '' + vScale.getLabelForValue(parsed[vScale.axis]);\n\n return {\n label: '' + iScale.getLabelForValue(parsed[iScale.axis]),\n value\n };\n }\n\n initialize() {\n this.enableOptionSharing = true;\n\n super.initialize();\n\n const meta = this._cachedMeta;\n meta.stack = this.getDataset().stack;\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n this.updateElements(meta.data, 0, meta.data.length, mode);\n }\n\n updateElements(bars, start, count, mode) {\n const reset = mode === 'reset';\n const {index, _cachedMeta: {vScale}} = this;\n const base = vScale.getBasePixel();\n const horizontal = vScale.isHorizontal();\n const ruler = this._getRuler();\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n\n for (let i = start; i < start + count; i++) {\n const parsed = this.getParsed(i);\n const vpixels = reset || isNullOrUndef(parsed[vScale.axis]) ? {base, head: base} : this._calculateBarValuePixels(i);\n const ipixels = this._calculateBarIndexPixels(i, ruler);\n const stack = (parsed._stacks || {})[vScale.axis];\n\n const properties = {\n horizontal,\n base: vpixels.base,\n enableBorderRadius: !stack || isFloatBar(parsed._custom) || (index === stack._top || index === stack._bottom),\n x: horizontal ? vpixels.head : ipixels.center,\n y: horizontal ? ipixels.center : vpixels.head,\n height: horizontal ? ipixels.size : Math.abs(vpixels.size),\n width: horizontal ? Math.abs(vpixels.size) : ipixels.size\n };\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, bars[i].active ? 'active' : mode);\n }\n const options = properties.options || bars[i].options;\n setBorderSkipped(properties, options, stack, index);\n setInflateAmount(properties, options, ruler.ratio);\n this.updateElement(bars[i], i, properties, mode);\n }\n }\n\n /**\n\t * Returns the stacks based on groups and bar visibility.\n\t * @param {number} [last] - The dataset index\n\t * @param {number} [dataIndex] - The data index of the ruler\n\t * @returns {string[]} The list of stack IDs\n\t * @private\n\t */\n _getStacks(last, dataIndex) {\n const {iScale} = this._cachedMeta;\n const metasets = iScale.getMatchingVisibleMetas(this._type)\n .filter(meta => meta.controller.options.grouped);\n const stacked = iScale.options.stacked;\n const stacks = [];\n const currentParsed = this._cachedMeta.controller.getParsed(dataIndex);\n const iScaleValue = currentParsed && currentParsed[iScale.axis];\n\n const skipNull = (meta) => {\n const parsed = meta._parsed.find(item => item[iScale.axis] === iScaleValue);\n const val = parsed && parsed[meta.vScale.axis];\n\n if (isNullOrUndef(val) || isNaN(val)) {\n return true;\n }\n };\n\n for (const meta of metasets) {\n if (dataIndex !== undefined && skipNull(meta)) {\n continue;\n }\n\n // stacked | meta.stack\n // | found | not found | undefined\n // false | x | x | x\n // true | | x |\n // undefined | | x | x\n if (stacked === false || stacks.indexOf(meta.stack) === -1 ||\n\t\t\t\t(stacked === undefined && meta.stack === undefined)) {\n stacks.push(meta.stack);\n }\n if (meta.index === last) {\n break;\n }\n }\n\n // No stacks? that means there is no visible data. Let's still initialize an `undefined`\n // stack where possible invisible bars will be located.\n // https://github.com/chartjs/Chart.js/issues/6368\n if (!stacks.length) {\n stacks.push(undefined);\n }\n\n return stacks;\n }\n\n /**\n\t * Returns the effective number of stacks based on groups and bar visibility.\n\t * @private\n\t */\n _getStackCount(index) {\n return this._getStacks(undefined, index).length;\n }\n\n /**\n\t * Returns the stack index for the given dataset based on groups and bar visibility.\n\t * @param {number} [datasetIndex] - The dataset index\n\t * @param {string} [name] - The stack name to find\n * @param {number} [dataIndex]\n\t * @returns {number} The stack index\n\t * @private\n\t */\n _getStackIndex(datasetIndex, name, dataIndex) {\n const stacks = this._getStacks(datasetIndex, dataIndex);\n const index = (name !== undefined)\n ? stacks.indexOf(name)\n : -1; // indexOf returns -1 if element is not present\n\n return (index === -1)\n ? stacks.length - 1\n : index;\n }\n\n /**\n\t * @private\n\t */\n _getRuler() {\n const opts = this.options;\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const pixels = [];\n let i, ilen;\n\n for (i = 0, ilen = meta.data.length; i < ilen; ++i) {\n pixels.push(iScale.getPixelForValue(this.getParsed(i)[iScale.axis], i));\n }\n\n const barThickness = opts.barThickness;\n const min = barThickness || computeMinSampleSize(meta);\n\n return {\n min,\n pixels,\n start: iScale._startPixel,\n end: iScale._endPixel,\n stackCount: this._getStackCount(),\n scale: iScale,\n grouped: opts.grouped,\n // bar thickness ratio used for non-grouped bars\n ratio: barThickness ? 1 : opts.categoryPercentage * opts.barPercentage\n };\n }\n\n /**\n\t * Note: pixel values are not clamped to the scale area.\n\t * @private\n\t */\n _calculateBarValuePixels(index) {\n const {_cachedMeta: {vScale, _stacked, index: datasetIndex}, options: {base: baseValue, minBarLength}} = this;\n const actualBase = baseValue || 0;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const floating = isFloatBar(custom);\n let value = parsed[vScale.axis];\n let start = 0;\n let length = _stacked ? this.applyStack(vScale, parsed, _stacked) : value;\n let head, size;\n\n if (length !== value) {\n start = length - value;\n length = value;\n }\n\n if (floating) {\n value = custom.barStart;\n length = custom.barEnd - custom.barStart;\n // bars crossing origin are not stacked\n if (value !== 0 && sign(value) !== sign(custom.barEnd)) {\n start = 0;\n }\n start += value;\n }\n\n const startValue = !isNullOrUndef(baseValue) && !floating ? baseValue : start;\n let base = vScale.getPixelForValue(startValue);\n\n if (this.chart.getDataVisibility(index)) {\n head = vScale.getPixelForValue(start + length);\n } else {\n // When not visible, no height\n head = base;\n }\n\n size = head - base;\n\n if (Math.abs(size) < minBarLength) {\n size = barSign(size, vScale, actualBase) * minBarLength;\n if (value === actualBase) {\n base -= size / 2;\n }\n const startPixel = vScale.getPixelForDecimal(0);\n const endPixel = vScale.getPixelForDecimal(1);\n const min = Math.min(startPixel, endPixel);\n const max = Math.max(startPixel, endPixel);\n base = Math.max(Math.min(base, max), min);\n head = base + size;\n\n if (_stacked && !floating) {\n // visual data coordinates after applying minBarLength\n parsed._stacks[vScale.axis]._visualValues[datasetIndex] = vScale.getValueForPixel(head) - vScale.getValueForPixel(base);\n }\n }\n\n if (base === vScale.getPixelForValue(actualBase)) {\n const halfGrid = sign(size) * vScale.getLineWidthForValue(actualBase) / 2;\n base += halfGrid;\n size -= halfGrid;\n }\n\n return {\n size,\n base,\n head,\n center: head + size / 2\n };\n }\n\n /**\n\t * @private\n\t */\n _calculateBarIndexPixels(index, ruler) {\n const scale = ruler.scale;\n const options = this.options;\n const skipNull = options.skipNull;\n const maxBarThickness = valueOrDefault(options.maxBarThickness, Infinity);\n let center, size;\n if (ruler.grouped) {\n const stackCount = skipNull ? this._getStackCount(index) : ruler.stackCount;\n const range = options.barThickness === 'flex'\n ? computeFlexCategoryTraits(index, ruler, options, stackCount)\n : computeFitCategoryTraits(index, ruler, options, stackCount);\n\n const stackIndex = this._getStackIndex(this.index, this._cachedMeta.stack, skipNull ? index : undefined);\n center = range.start + (range.chunk * stackIndex) + (range.chunk / 2);\n size = Math.min(maxBarThickness, range.chunk * range.ratio);\n } else {\n // For non-grouped bar charts, exact pixel values are used\n center = scale.getPixelForValue(this.getParsed(index)[scale.axis], index);\n size = Math.min(maxBarThickness, ruler.min * ruler.ratio);\n }\n\n return {\n base: center - size / 2,\n head: center + size / 2,\n center,\n size\n };\n }\n\n draw() {\n const meta = this._cachedMeta;\n const vScale = meta.vScale;\n const rects = meta.data;\n const ilen = rects.length;\n let i = 0;\n\n for (; i < ilen; ++i) {\n if (this.getParsed(i)[vScale.axis] !== null && !rects[i].hidden) {\n rects[i].draw(this._ctx);\n }\n }\n }\n\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {valueOrDefault} from '../helpers/helpers.core.js';\n\nexport default class BubbleController extends DatasetController {\n\n static id = 'bubble';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'borderWidth', 'radius']\n }\n }\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n\n initialize() {\n this.enableOptionSharing = true;\n super.initialize();\n }\n\n /**\n\t * Parse array of primitive values\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n const parsed = super.parsePrimitiveData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n parsed[i]._custom = this.resolveDataElementOptions(i + start).radius;\n }\n return parsed;\n }\n\n /**\n\t * Parse array of arrays\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n const parsed = super.parseArrayData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item[2], this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n\n /**\n\t * Parse array of objects\n\t * @protected\n\t */\n parseObjectData(meta, data, start, count) {\n const parsed = super.parseObjectData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item && item.r && +item.r, this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const data = this._cachedMeta.data;\n\n let max = 0;\n for (let i = data.length - 1; i >= 0; --i) {\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const {xScale, yScale} = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n const r = parsed._custom;\n\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + (r ? ', ' + r : '') + ')'\n };\n }\n\n update(mode) {\n const points = this._cachedMeta.data;\n\n // Update Points\n this.updateElements(points, 0, points.length, mode);\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale} = this._cachedMeta;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n\n for (let i = start; i < start + count; i++) {\n const point = points[i];\n const parsed = !reset && this.getParsed(i);\n const properties = {};\n const iPixel = properties[iAxis] = reset ? iScale.getPixelForDecimal(0.5) : iScale.getPixelForValue(parsed[iAxis]);\n const vPixel = properties[vAxis] = reset ? vScale.getBasePixel() : vScale.getPixelForValue(parsed[vAxis]);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel);\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n\n if (reset) {\n properties.options.radius = 0;\n }\n }\n\n this.updateElement(point, i, properties, mode);\n }\n }\n\n /**\n\t * @param {number} index\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDataElementOptions(index, mode) {\n const parsed = this.getParsed(index);\n let values = super.resolveDataElementOptions(index, mode);\n\n // In case values were cached (and thus frozen), we need to clone the values\n if (values.$shared) {\n values = Object.assign({}, values, {$shared: false});\n }\n\n // Custom radius resolution\n const radius = values.radius;\n if (mode !== 'active') {\n values.radius = 0;\n }\n values.radius += valueOrDefault(parsed && parsed._custom, radius);\n\n return values;\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isObject, resolveObjectKey, toPercentage, toDimension, valueOrDefault} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {toRadians, PI, TAU, HALF_PI, _angleBetween} from '../helpers/helpers.math.js';\n\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\nfunction getRatioAndOffset(rotation, circumference, cutout) {\n let ratioX = 1;\n let ratioY = 1;\n let offsetX = 0;\n let offsetY = 0;\n // If the chart's circumference isn't a full circle, calculate size as a ratio of the width/height of the arc\n if (circumference < TAU) {\n const startAngle = rotation;\n const endAngle = startAngle + circumference;\n const startX = Math.cos(startAngle);\n const startY = Math.sin(startAngle);\n const endX = Math.cos(endAngle);\n const endY = Math.sin(endAngle);\n const calcMax = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? 1 : Math.max(a, a * cutout, b, b * cutout);\n const calcMin = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? -1 : Math.min(a, a * cutout, b, b * cutout);\n const maxX = calcMax(0, startX, endX);\n const maxY = calcMax(HALF_PI, startY, endY);\n const minX = calcMin(PI, startX, endX);\n const minY = calcMin(PI + HALF_PI, startY, endY);\n ratioX = (maxX - minX) / 2;\n ratioY = (maxY - minY) / 2;\n offsetX = -(maxX + minX) / 2;\n offsetY = -(maxY + minY) / 2;\n }\n return {ratioX, ratioY, offsetX, offsetY};\n}\n\nexport default class DoughnutController extends DatasetController {\n\n static id = 'doughnut';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'arc',\n animation: {\n // Boolean - Whether we animate the rotation of the Doughnut\n animateRotate: true,\n // Boolean - Whether we animate scaling the Doughnut from the centre\n animateScale: false\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['circumference', 'endAngle', 'innerRadius', 'outerRadius', 'startAngle', 'x', 'y', 'offset', 'borderWidth', 'spacing']\n },\n },\n // The percentage of the chart that we cut out of the middle.\n cutout: '50%',\n\n // The rotation of the chart, where the first data arc begins.\n rotation: 0,\n\n // The total circumference of the chart.\n circumference: 360,\n\n // The outer radius of the chart\n radius: '100%',\n\n // Spacing between arcs\n spacing: 0,\n\n indexAxis: 'r',\n };\n\n static descriptors = {\n _scriptable: (name) => name !== 'spacing',\n _indexable: (name) => name !== 'spacing' && !name.startsWith('borderDash') && !name.startsWith('hoverBorderDash'),\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n // Need to override these to give a nice default\n plugins: {\n legend: {\n labels: {\n generateLabels(chart) {\n const data = chart.data;\n if (data.labels.length && data.datasets.length) {\n const {labels: {pointStyle, color}} = chart.legend.options;\n\n return data.labels.map((label, i) => {\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n\n return {\n text: label,\n fillStyle: style.backgroundColor,\n strokeStyle: style.borderColor,\n fontColor: color,\n lineWidth: style.borderWidth,\n pointStyle: pointStyle,\n hidden: !chart.getDataVisibility(i),\n\n // Extra data used for toggling the correct item\n index: i\n };\n });\n }\n return [];\n }\n },\n\n onClick(e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n }\n };\n\n constructor(chart, datasetIndex) {\n super(chart, datasetIndex);\n\n this.enableOptionSharing = true;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.offsetX = undefined;\n this.offsetY = undefined;\n }\n\n linkScales() {}\n\n /**\n\t * Override data parsing, since we are not using scales\n\t */\n parse(start, count) {\n const data = this.getDataset().data;\n const meta = this._cachedMeta;\n\n if (this._parsing === false) {\n meta._parsed = data;\n } else {\n let getter = (i) => +data[i];\n\n if (isObject(data[start])) {\n const {key = 'value'} = this._parsing;\n getter = (i) => +resolveObjectKey(data[i], key);\n }\n\n let i, ilen;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n meta._parsed[i] = getter(i);\n }\n }\n }\n\n /**\n\t * @private\n\t */\n _getRotation() {\n return toRadians(this.options.rotation - 90);\n }\n\n /**\n\t * @private\n\t */\n _getCircumference() {\n return toRadians(this.options.circumference);\n }\n\n /**\n\t * Get the maximal rotation & circumference extents\n\t * across all visible datasets.\n\t */\n _getRotationExtents() {\n let min = TAU;\n let max = -TAU;\n\n for (let i = 0; i < this.chart.data.datasets.length; ++i) {\n if (this.chart.isDatasetVisible(i) && this.chart.getDatasetMeta(i).type === this._type) {\n const controller = this.chart.getDatasetMeta(i).controller;\n const rotation = controller._getRotation();\n const circumference = controller._getCircumference();\n\n min = Math.min(min, rotation);\n max = Math.max(max, rotation + circumference);\n }\n }\n\n return {\n rotation: min,\n circumference: max - min,\n };\n }\n\n /**\n\t * @param {string} mode\n\t */\n update(mode) {\n const chart = this.chart;\n const {chartArea} = chart;\n const meta = this._cachedMeta;\n const arcs = meta.data;\n const spacing = this.getMaxBorderWidth() + this.getMaxOffset(arcs) + this.options.spacing;\n const maxSize = Math.max((Math.min(chartArea.width, chartArea.height) - spacing) / 2, 0);\n const cutout = Math.min(toPercentage(this.options.cutout, maxSize), 1);\n const chartWeight = this._getRingWeight(this.index);\n\n // Compute the maximal rotation & circumference limits.\n // If we only consider our dataset, this can cause problems when two datasets\n // are both less than a circle with different rotations (starting angles)\n const {circumference, rotation} = this._getRotationExtents();\n const {ratioX, ratioY, offsetX, offsetY} = getRatioAndOffset(rotation, circumference, cutout);\n const maxWidth = (chartArea.width - spacing) / ratioX;\n const maxHeight = (chartArea.height - spacing) / ratioY;\n const maxRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0);\n const outerRadius = toDimension(this.options.radius, maxRadius);\n const innerRadius = Math.max(outerRadius * cutout, 0);\n const radiusLength = (outerRadius - innerRadius) / this._getVisibleDatasetWeightTotal();\n this.offsetX = offsetX * outerRadius;\n this.offsetY = offsetY * outerRadius;\n\n meta.total = this.calculateTotal();\n\n this.outerRadius = outerRadius - radiusLength * this._getRingWeightOffset(this.index);\n this.innerRadius = Math.max(this.outerRadius - radiusLength * chartWeight, 0);\n\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n\n /**\n * @private\n */\n _circumference(i, reset) {\n const opts = this.options;\n const meta = this._cachedMeta;\n const circumference = this._getCircumference();\n if ((reset && opts.animation.animateRotate) || !this.chart.getDataVisibility(i) || meta._parsed[i] === null || meta.data[i].hidden) {\n return 0;\n }\n return this.calculateCircumference(meta._parsed[i] * circumference / TAU);\n }\n\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const centerX = (chartArea.left + chartArea.right) / 2;\n const centerY = (chartArea.top + chartArea.bottom) / 2;\n const animateScale = reset && animationOpts.animateScale;\n const innerRadius = animateScale ? 0 : this.innerRadius;\n const outerRadius = animateScale ? 0 : this.outerRadius;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n let startAngle = this._getRotation();\n let i;\n\n for (i = 0; i < start; ++i) {\n startAngle += this._circumference(i, reset);\n }\n\n for (i = start; i < start + count; ++i) {\n const circumference = this._circumference(i, reset);\n const arc = arcs[i];\n const properties = {\n x: centerX + this.offsetX,\n y: centerY + this.offsetY,\n startAngle,\n endAngle: startAngle + circumference,\n circumference,\n outerRadius,\n innerRadius\n };\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, arc.active ? 'active' : mode);\n }\n startAngle += circumference;\n\n this.updateElement(arc, i, properties, mode);\n }\n }\n\n calculateTotal() {\n const meta = this._cachedMeta;\n const metaData = meta.data;\n let total = 0;\n let i;\n\n for (i = 0; i < metaData.length; i++) {\n const value = meta._parsed[i];\n if (value !== null && !isNaN(value) && this.chart.getDataVisibility(i) && !metaData[i].hidden) {\n total += Math.abs(value);\n }\n }\n\n return total;\n }\n\n calculateCircumference(value) {\n const total = this._cachedMeta.total;\n if (total > 0 && !isNaN(value)) {\n return TAU * (Math.abs(value) / total);\n }\n return 0;\n }\n\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index], chart.options.locale);\n\n return {\n label: labels[index] || '',\n value,\n };\n }\n\n getMaxBorderWidth(arcs) {\n let max = 0;\n const chart = this.chart;\n let i, ilen, meta, controller, options;\n\n if (!arcs) {\n // Find the outmost visible dataset\n for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) {\n if (chart.isDatasetVisible(i)) {\n meta = chart.getDatasetMeta(i);\n arcs = meta.data;\n controller = meta.controller;\n break;\n }\n }\n }\n\n if (!arcs) {\n return 0;\n }\n\n for (i = 0, ilen = arcs.length; i < ilen; ++i) {\n options = controller.resolveDataElementOptions(i);\n if (options.borderAlign !== 'inner') {\n max = Math.max(max, options.borderWidth || 0, options.hoverBorderWidth || 0);\n }\n }\n return max;\n }\n\n getMaxOffset(arcs) {\n let max = 0;\n\n for (let i = 0, ilen = arcs.length; i < ilen; ++i) {\n const options = this.resolveDataElementOptions(i);\n max = Math.max(max, options.offset || 0, options.hoverOffset || 0);\n }\n return max;\n }\n\n /**\n\t * Get radius length offset of the dataset in relation to the visible datasets weights. This allows determining the inner and outer radius correctly\n\t * @private\n\t */\n _getRingWeightOffset(datasetIndex) {\n let ringWeightOffset = 0;\n\n for (let i = 0; i < datasetIndex; ++i) {\n if (this.chart.isDatasetVisible(i)) {\n ringWeightOffset += this._getRingWeight(i);\n }\n }\n\n return ringWeightOffset;\n }\n\n /**\n\t * @private\n\t */\n _getRingWeight(datasetIndex) {\n return Math.max(valueOrDefault(this.chart.data.datasets[datasetIndex].weight, 1), 0);\n }\n\n /**\n\t * Returns the sum of all visible data set weights.\n\t * @private\n\t */\n _getVisibleDatasetWeightTotal() {\n return this._getRingWeightOffset(this.chart.data.datasets.length) || 1;\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isNullOrUndef} from '../helpers/index.js';\nimport {isNumber} from '../helpers/helpers.math.js';\nimport {_getStartAndCountOfVisiblePoints, _scaleRangesChanged} from '../helpers/helpers.extras.js';\n\nexport default class LineController extends DatasetController {\n\n static id = 'line';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n\n showLine: true,\n spanGaps: false,\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n _index_: {\n type: 'category',\n },\n _value_: {\n type: 'linear',\n },\n }\n };\n\n initialize() {\n this.enableOptionSharing = true;\n this.supportsDecimation = true;\n super.initialize();\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const {dataset: line, data: points = [], _dataset} = meta;\n // @ts-ignore\n const animationsDisabled = this.chart._animationsDisabled;\n let {start, count} = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n\n this._drawStart = start;\n this._drawCount = count;\n\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n\n // Update Line\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n\n // Update Points\n this.updateElements(points, start, count, mode);\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale, _stacked, _dataset} = this._cachedMeta;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const {spanGaps, segment} = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n const end = start + count;\n const pointsCount = points.length;\n let prevParsed = start > 0 && this.getParsed(start - 1);\n\n for (let i = 0; i < pointsCount; ++i) {\n const point = points[i];\n const properties = directUpdate ? point : {};\n\n if (i < start || i >= end) {\n properties.skip = true;\n continue;\n }\n\n const parsed = this.getParsed(i);\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && (Math.abs(parsed[iAxis] - prevParsed[iAxis])) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n\n prevParsed = parsed;\n }\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n const data = meta.data || [];\n if (!data.length) {\n return border;\n }\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n\n draw() {\n const meta = this._cachedMeta;\n meta.dataset.updateControlPoints(this.chart.chartArea, meta.iScale.axis);\n super.draw();\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {toRadians, PI, formatNumber, _parseObjectDataRadialScale} from '../helpers/index.js';\n\nexport default class PolarAreaController extends DatasetController {\n\n static id = 'polarArea';\n\n /**\n * @type {any}\n */\n static defaults = {\n dataElementType: 'arc',\n animation: {\n animateRotate: true,\n animateScale: true\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'startAngle', 'endAngle', 'innerRadius', 'outerRadius']\n },\n },\n indexAxis: 'r',\n startAngle: 0,\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n plugins: {\n legend: {\n labels: {\n generateLabels(chart) {\n const data = chart.data;\n if (data.labels.length && data.datasets.length) {\n const {labels: {pointStyle, color}} = chart.legend.options;\n\n return data.labels.map((label, i) => {\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n\n return {\n text: label,\n fillStyle: style.backgroundColor,\n strokeStyle: style.borderColor,\n fontColor: color,\n lineWidth: style.borderWidth,\n pointStyle: pointStyle,\n hidden: !chart.getDataVisibility(i),\n\n // Extra data used for toggling the correct item\n index: i\n };\n });\n }\n return [];\n }\n },\n\n onClick(e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n },\n\n scales: {\n r: {\n type: 'radialLinear',\n angleLines: {\n display: false\n },\n beginAtZero: true,\n grid: {\n circular: true\n },\n pointLabels: {\n display: false\n },\n startAngle: 0\n }\n }\n };\n\n constructor(chart, datasetIndex) {\n super(chart, datasetIndex);\n\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n }\n\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index].r, chart.options.locale);\n\n return {\n label: labels[index] || '',\n value,\n };\n }\n\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n\n update(mode) {\n const arcs = this._cachedMeta.data;\n\n this._updateRadius();\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n\n /**\n * @protected\n */\n getMinMax() {\n const meta = this._cachedMeta;\n const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n\n meta.data.forEach((element, index) => {\n const parsed = this.getParsed(index).r;\n\n if (!isNaN(parsed) && this.chart.getDataVisibility(index)) {\n if (parsed < range.min) {\n range.min = parsed;\n }\n\n if (parsed > range.max) {\n range.max = parsed;\n }\n }\n });\n\n return range;\n }\n\n /**\n\t * @private\n\t */\n _updateRadius() {\n const chart = this.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n\n const outerRadius = Math.max(minSize / 2, 0);\n const innerRadius = Math.max(opts.cutoutPercentage ? (outerRadius / 100) * (opts.cutoutPercentage) : 1, 0);\n const radiusLength = (outerRadius - innerRadius) / chart.getVisibleDatasetCount();\n\n this.outerRadius = outerRadius - (radiusLength * this.index);\n this.innerRadius = this.outerRadius - radiusLength;\n }\n\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.chart;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const scale = this._cachedMeta.rScale;\n const centerX = scale.xCenter;\n const centerY = scale.yCenter;\n const datasetStartAngle = scale.getIndexAngle(0) - 0.5 * PI;\n let angle = datasetStartAngle;\n let i;\n\n const defaultAngle = 360 / this.countVisibleElements();\n\n for (i = 0; i < start; ++i) {\n angle += this._computeAngle(i, mode, defaultAngle);\n }\n for (i = start; i < start + count; i++) {\n const arc = arcs[i];\n let startAngle = angle;\n let endAngle = angle + this._computeAngle(i, mode, defaultAngle);\n let outerRadius = chart.getDataVisibility(i) ? scale.getDistanceFromCenterForValue(this.getParsed(i).r) : 0;\n angle = endAngle;\n\n if (reset) {\n if (animationOpts.animateScale) {\n outerRadius = 0;\n }\n if (animationOpts.animateRotate) {\n startAngle = endAngle = datasetStartAngle;\n }\n }\n\n const properties = {\n x: centerX,\n y: centerY,\n innerRadius: 0,\n outerRadius,\n startAngle,\n endAngle,\n options: this.resolveDataElementOptions(i, arc.active ? 'active' : mode)\n };\n\n this.updateElement(arc, i, properties, mode);\n }\n }\n\n countVisibleElements() {\n const meta = this._cachedMeta;\n let count = 0;\n\n meta.data.forEach((element, index) => {\n if (!isNaN(this.getParsed(index).r) && this.chart.getDataVisibility(index)) {\n count++;\n }\n });\n\n return count;\n }\n\n /**\n\t * @private\n\t */\n _computeAngle(index, mode, defaultAngle) {\n return this.chart.getDataVisibility(index)\n ? toRadians(this.resolveDataElementOptions(index, mode).angle || defaultAngle)\n : 0;\n }\n}\n","import DoughnutController from './controller.doughnut.js';\n\n// Pie charts are Doughnut chart with different defaults\nexport default class PieController extends DoughnutController {\n\n static id = 'pie';\n\n /**\n * @type {any}\n */\n static defaults = {\n // The percentage of the chart that we cut out of the middle.\n cutout: 0,\n\n // The rotation of the chart, where the first data arc begins.\n rotation: 0,\n\n // The total circumference of the chart.\n circumference: 360,\n\n // The outer radius of the chart\n radius: '100%'\n };\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {_parseObjectDataRadialScale} from '../helpers/index.js';\n\nexport default class RadarController extends DatasetController {\n\n static id = 'radar';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n indexAxis: 'r',\n showLine: true,\n elements: {\n line: {\n fill: 'start'\n }\n },\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n scales: {\n r: {\n type: 'radialLinear',\n }\n }\n };\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const vScale = this._cachedMeta.vScale;\n const parsed = this.getParsed(index);\n\n return {\n label: vScale.getLabels()[index],\n value: '' + vScale.getLabelForValue(parsed[vScale.axis])\n };\n }\n\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const line = meta.dataset;\n const points = meta.data || [];\n const labels = meta.iScale.getLabels();\n\n // Update Line\n line.points = points;\n // In resize mode only point locations change, so no need to set the points or options.\n if (mode !== 'resize') {\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n\n const properties = {\n _loop: true,\n _fullLoop: labels.length === points.length,\n options\n };\n\n this.updateElement(line, undefined, properties, mode);\n }\n\n // Update Points\n this.updateElements(points, 0, points.length, mode);\n }\n\n updateElements(points, start, count, mode) {\n const scale = this._cachedMeta.rScale;\n const reset = mode === 'reset';\n\n for (let i = start; i < start + count; i++) {\n const point = points[i];\n const options = this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n const pointPosition = scale.getPointPositionForValue(i, this.getParsed(i).r);\n\n const x = reset ? scale.xCenter : pointPosition.x;\n const y = reset ? scale.yCenter : pointPosition.y;\n\n const properties = {\n x,\n y,\n angle: pointPosition.angle,\n skip: isNaN(x) || isNaN(y),\n options\n };\n\n this.updateElement(point, i, properties, mode);\n }\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isNullOrUndef} from '../helpers/index.js';\nimport {isNumber} from '../helpers/helpers.math.js';\nimport {_getStartAndCountOfVisiblePoints, _scaleRangesChanged} from '../helpers/helpers.extras.js';\n\nexport default class ScatterController extends DatasetController {\n\n static id = 'scatter';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n showLine: false,\n fill: false\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n\n interaction: {\n mode: 'point'\n },\n\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const {xScale, yScale} = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + ')'\n };\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const {data: points = []} = meta;\n // @ts-ignore\n const animationsDisabled = this.chart._animationsDisabled;\n let {start, count} = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n\n this._drawStart = start;\n this._drawCount = count;\n\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n\n if (this.options.showLine) {\n\n // https://github.com/chartjs/Chart.js/issues/11333\n if (!this.datasetElementType) {\n this.addElements();\n }\n const {dataset: line, _dataset} = meta;\n\n // Update Line\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n\n const options = this.resolveDatasetElementOptions(mode);\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n } else if (this.datasetElementType) {\n // https://github.com/chartjs/Chart.js/issues/11333\n delete meta.dataset;\n this.datasetElementType = false;\n }\n\n // Update Points\n this.updateElements(points, start, count, mode);\n }\n\n addElements() {\n const {showLine} = this.options;\n\n if (!this.datasetElementType && showLine) {\n this.datasetElementType = this.chart.registry.getElement('line');\n }\n\n super.addElements();\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale, _stacked, _dataset} = this._cachedMeta;\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const {spanGaps, segment} = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n let prevParsed = start > 0 && this.getParsed(start - 1);\n\n for (let i = start; i < start + count; ++i) {\n const point = points[i];\n const parsed = this.getParsed(i);\n const properties = directUpdate ? point : {};\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && (Math.abs(parsed[iAxis] - prevParsed[iAxis])) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n\n prevParsed = parsed;\n }\n\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const data = meta.data || [];\n\n if (!this.options.showLine) {\n let max = 0;\n for (let i = data.length - 1; i >= 0; --i) {\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n\n if (!data.length) {\n return border;\n }\n\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n}\n","/**\n * @namespace Chart._adapters\n * @since 2.8.0\n * @private\n */\n\nimport type {AnyObject} from '../types/basic.js';\nimport type {ChartOptions} from '../types/index.js';\n\nexport type TimeUnit = 'millisecond' | 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'quarter' | 'year';\n\nexport interface DateAdapter<T extends AnyObject = AnyObject> {\n readonly options: T;\n /**\n * Will called with chart options after adapter creation.\n */\n init(this: DateAdapter<T>, chartOptions: ChartOptions): void;\n /**\n * Returns a map of time formats for the supported formatting units defined\n * in Unit as well as 'datetime' representing a detailed date/time string.\n */\n formats(this: DateAdapter<T>): Record<TimeUnit | 'datetime', string>;\n /**\n * Parses the given `value` and return the associated timestamp.\n * @param value - the value to parse (usually comes from the data)\n * @param [format] - the expected data format\n */\n parse(this: DateAdapter<T>, value: unknown, format?: string): number | null;\n /**\n * Returns the formatted date in the specified `format` for a given `timestamp`.\n * @param timestamp - the timestamp to format\n * @param format - the date/time token\n */\n format(this: DateAdapter<T>, timestamp: number, format: string): string;\n /**\n * Adds the specified `amount` of `unit` to the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param amount - the amount to add\n * @param unit - the unit as string\n */\n add(this: DateAdapter<T>, timestamp: number, amount: number, unit: TimeUnit): number;\n /**\n * Returns the number of `unit` between the given timestamps.\n * @param a - the input timestamp (reference)\n * @param b - the timestamp to subtract\n * @param unit - the unit as string\n */\n diff(this: DateAdapter<T>, a: number, b: number, unit: TimeUnit): number;\n /**\n * Returns start of `unit` for the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param unit - the unit as string\n * @param [weekday] - the ISO day of the week with 1 being Monday\n * and 7 being Sunday (only needed if param *unit* is `isoWeek`).\n */\n startOf(this: DateAdapter<T>, timestamp: number, unit: TimeUnit | 'isoWeek', weekday?: number | boolean): number;\n /**\n * Returns end of `unit` for the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param unit - the unit as string\n */\n endOf(this: DateAdapter<T>, timestamp: number, unit: TimeUnit): number;\n}\n\nfunction abstract<T = void>(): T {\n throw new Error('This method is not implemented: Check that a complete date adapter is provided.');\n}\n\n/**\n * Date adapter (current used by the time scale)\n * @namespace Chart._adapters._date\n * @memberof Chart._adapters\n * @private\n */\nclass DateAdapterBase implements DateAdapter {\n\n /**\n * Override default date adapter methods.\n * Accepts type parameter to define options type.\n * @example\n * Chart._adapters._date.override<{myAdapterOption: string}>({\n * init() {\n * console.log(this.options.myAdapterOption);\n * }\n * })\n */\n static override<T extends AnyObject = AnyObject>(\n members: Partial<Omit<DateAdapter<T>, 'options'>>\n ) {\n Object.assign(DateAdapterBase.prototype, members);\n }\n\n readonly options: AnyObject;\n\n constructor(options?: AnyObject) {\n this.options = options || {};\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n init() {}\n\n formats(): Record<TimeUnit | 'datetime', string> {\n return abstract();\n }\n\n parse(): number | null {\n return abstract();\n }\n\n format(): string {\n return abstract();\n }\n\n add(): number {\n return abstract();\n }\n\n diff(): number {\n return abstract();\n }\n\n startOf(): number {\n return abstract();\n }\n\n endOf(): number {\n return abstract();\n }\n}\n\nexport default {\n _date: DateAdapterBase as {\n new (options?: AnyObject): DateAdapter;\n override<T extends AnyObject = AnyObject>(\n members: Partial<Omit<DateAdapter<T>, 'options'>>\n ): void;\n }\n};\n","import {_lookupByKey, _rlookupByKey} from '../helpers/helpers.collection.js';\nimport {getRelativePosition} from '../helpers/helpers.dom.js';\nimport {_angleBetween, getAngleFromPoint} from '../helpers/helpers.math.js';\nimport {_isPointInArea, isNullOrUndef} from '../helpers/index.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef {{axis?: string, intersect?: boolean, includeInvisible?: boolean}} InteractionOptions\n * @typedef {{datasetIndex: number, index: number, element: import('./core.element.js').default}} InteractionItem\n * @typedef { import('../types/index.js').Point } Point\n */\n\n/**\n * Helper function to do binary search when possible\n * @param {object} metaset - the dataset meta\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {number} value - the value to find\n * @param {boolean} [intersect] - should the element intersect\n * @returns {{lo:number, hi:number}} indices to search data array between\n */\nfunction binarySearch(metaset, axis, value, intersect) {\n const {controller, data, _sorted} = metaset;\n const iScale = controller._cachedMeta.iScale;\n const spanGaps = metaset.dataset ? metaset.dataset.options ? metaset.dataset.options.spanGaps : null : null;\n\n if (iScale && axis === iScale.axis && axis !== 'r' && _sorted && data.length) {\n const lookupMethod = iScale._reversePixels ? _rlookupByKey : _lookupByKey;\n if (!intersect) {\n const result = lookupMethod(data, axis, value);\n if (spanGaps) {\n const {vScale} = controller._cachedMeta;\n const {_parsed} = metaset;\n\n const distanceToDefinedLo = (_parsed\n .slice(0, result.lo + 1)\n .reverse()\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n result.lo -= Math.max(0, distanceToDefinedLo);\n\n const distanceToDefinedHi = (_parsed\n .slice(result.hi)\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n result.hi += Math.max(0, distanceToDefinedHi);\n }\n return result;\n } else if (controller._sharedOptions) {\n // _sharedOptions indicates that each element has equal options -> equal proportions\n // So we can do a ranged binary search based on the range of first element and\n // be confident to get the full range of indices that can intersect with the value.\n const el = data[0];\n const range = typeof el.getRange === 'function' && el.getRange(axis);\n if (range) {\n const start = lookupMethod(data, axis, value - range);\n const end = lookupMethod(data, axis, value + range);\n return {lo: start.lo, hi: end.hi};\n }\n }\n }\n // Default to all elements, when binary search can not be used.\n return {lo: 0, hi: data.length - 1};\n}\n\n/**\n * Helper function to select candidate elements for interaction\n * @param {Chart} chart - the chart\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {function} handler - the callback to execute for each visible item\n * @param {boolean} [intersect] - consider intersecting items\n */\nfunction evaluateInteractionItems(chart, axis, position, handler, intersect) {\n const metasets = chart.getSortedVisibleDatasetMetas();\n const value = position[axis];\n for (let i = 0, ilen = metasets.length; i < ilen; ++i) {\n const {index, data} = metasets[i];\n const {lo, hi} = binarySearch(metasets[i], axis, value, intersect);\n for (let j = lo; j <= hi; ++j) {\n const element = data[j];\n if (!element.skip) {\n handler(element, index, j);\n }\n }\n }\n}\n\n/**\n * Get a distance metric function for two points based on the\n * axis mode setting\n * @param {string} axis - the axis mode. x|y|xy|r\n */\nfunction getDistanceMetricForAxis(axis) {\n const useX = axis.indexOf('x') !== -1;\n const useY = axis.indexOf('y') !== -1;\n\n return function(pt1, pt2) {\n const deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n const deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n };\n}\n\n/**\n * Helper function to get the items that intersect the event position\n * @param {Chart} chart - the chart\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) {\n const items = [];\n\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return items;\n }\n\n const evaluationFunc = function(element, datasetIndex, index) {\n if (!includeInvisible && !_isPointInArea(element, chart.chartArea, 0)) {\n return;\n }\n if (element.inRange(position.x, position.y, useFinalPosition)) {\n items.push({element, datasetIndex, index});\n }\n };\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc, true);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position for a radial chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestRadialItems(chart, position, axis, useFinalPosition) {\n let items = [];\n\n function evaluationFunc(element, datasetIndex, index) {\n const {startAngle, endAngle} = element.getProps(['startAngle', 'endAngle'], useFinalPosition);\n const {angle} = getAngleFromPoint(element, {x: position.x, y: position.y});\n\n if (_angleBetween(angle, startAngle, endAngle)) {\n items.push({element, datasetIndex, index});\n }\n }\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position for a cartesian chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n let items = [];\n const distanceMetric = getDistanceMetricForAxis(axis);\n let minDistance = Number.POSITIVE_INFINITY;\n\n function evaluationFunc(element, datasetIndex, index) {\n const inRange = element.inRange(position.x, position.y, useFinalPosition);\n if (intersect && !inRange) {\n return;\n }\n\n const center = element.getCenterPoint(useFinalPosition);\n const pointInArea = !!includeInvisible || chart.isPointInArea(center);\n if (!pointInArea && !inRange) {\n return;\n }\n\n const distance = distanceMetric(position, center);\n if (distance < minDistance) {\n items = [{element, datasetIndex, index}];\n minDistance = distance;\n } else if (distance === minDistance) {\n // Can have multiple items at the same distance in which case we sort by size\n items.push({element, datasetIndex, index});\n }\n }\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position considering all visible items in the chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return [];\n }\n\n return axis === 'r' && !intersect\n ? getNearestRadialItems(chart, position, axis, useFinalPosition)\n : getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible);\n}\n\n/**\n * Helper function to get the items matching along the given X or Y axis\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axis to match\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @return {InteractionItem[]} the nearest items\n */\nfunction getAxisItems(chart, position, axis, intersect, useFinalPosition) {\n const items = [];\n const rangeMethod = axis === 'x' ? 'inXRange' : 'inYRange';\n let intersectsItem = false;\n\n evaluateInteractionItems(chart, axis, position, (element, datasetIndex, index) => {\n if (element[rangeMethod] && element[rangeMethod](position[axis], useFinalPosition)) {\n items.push({element, datasetIndex, index});\n intersectsItem = intersectsItem || element.inRange(position.x, position.y, useFinalPosition);\n }\n });\n\n // If we want to trigger on an intersect and we don't have any items\n // that intersect the position, return nothing\n if (intersect && !intersectsItem) {\n return [];\n }\n return items;\n}\n\n/**\n * Contains interaction related functions\n * @namespace Chart.Interaction\n */\nexport default {\n // Part of the public API to facilitate developers creating their own modes\n evaluateInteractionItems,\n\n // Helper function for different modes\n modes: {\n /**\n\t\t * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item\n\t\t * @function Chart.Interaction.modes.index\n\t\t * @since v2.4.0\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n index(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n // Default axis for index mode is 'x' to match old behaviour\n const axis = options.axis || 'x';\n const includeInvisible = options.includeInvisible || false;\n const items = options.intersect\n ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible)\n : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n const elements = [];\n\n if (!items.length) {\n return [];\n }\n\n chart.getSortedVisibleDatasetMetas().forEach((meta) => {\n const index = items[0].index;\n const element = meta.data[index];\n\n // don't count items that are skipped (null data)\n if (element && !element.skip) {\n elements.push({element, datasetIndex: meta.index, index});\n }\n });\n\n return elements;\n },\n\n /**\n\t\t * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t * If the options.intersect is false, we find the nearest item and return the items in that dataset\n\t\t * @function Chart.Interaction.modes.dataset\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n dataset(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n let items = options.intersect\n ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) :\n getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n\n if (items.length > 0) {\n const datasetIndex = items[0].datasetIndex;\n const data = chart.getDatasetMeta(datasetIndex).data;\n items = [];\n for (let i = 0; i < data.length; ++i) {\n items.push({element: data[i], datasetIndex, index: i});\n }\n }\n\n return items;\n },\n\n /**\n\t\t * Point mode returns all elements that hit test based on the event position\n\t\t * of the event\n\t\t * @function Chart.Interaction.modes.intersect\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n point(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible);\n },\n\n /**\n\t\t * nearest mode returns the element closest to the point\n\t\t * @function Chart.Interaction.modes.intersect\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n nearest(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getNearestItems(chart, position, axis, options.intersect, useFinalPosition, includeInvisible);\n },\n\n /**\n\t\t * x mode returns the elements that hit-test at the current x coordinate\n\t\t * @function Chart.Interaction.modes.x\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n x(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'x', options.intersect, useFinalPosition);\n },\n\n /**\n\t\t * y mode returns the elements that hit-test at the current y coordinate\n\t\t * @function Chart.Interaction.modes.y\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n y(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'y', options.intersect, useFinalPosition);\n }\n }\n};\n","import {defined, each, isObject} from '../helpers/helpers.core.js';\nimport {toPadding} from '../helpers/helpers.options.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n */\n\nconst STATIC_POSITIONS = ['left', 'top', 'right', 'bottom'];\n\nfunction filterByPosition(array, position) {\n return array.filter(v => v.pos === position);\n}\n\nfunction filterDynamicPositionByAxis(array, axis) {\n return array.filter(v => STATIC_POSITIONS.indexOf(v.pos) === -1 && v.box.axis === axis);\n}\n\nfunction sortByWeight(array, reverse) {\n return array.sort((a, b) => {\n const v0 = reverse ? b : a;\n const v1 = reverse ? a : b;\n return v0.weight === v1.weight ?\n v0.index - v1.index :\n v0.weight - v1.weight;\n });\n}\n\nfunction wrapBoxes(boxes) {\n const layoutBoxes = [];\n let i, ilen, box, pos, stack, stackWeight;\n\n for (i = 0, ilen = (boxes || []).length; i < ilen; ++i) {\n box = boxes[i];\n ({position: pos, options: {stack, stackWeight = 1}} = box);\n layoutBoxes.push({\n index: i,\n box,\n pos,\n horizontal: box.isHorizontal(),\n weight: box.weight,\n stack: stack && (pos + stack),\n stackWeight\n });\n }\n return layoutBoxes;\n}\n\nfunction buildStacks(layouts) {\n const stacks = {};\n for (const wrap of layouts) {\n const {stack, pos, stackWeight} = wrap;\n if (!stack || !STATIC_POSITIONS.includes(pos)) {\n continue;\n }\n const _stack = stacks[stack] || (stacks[stack] = {count: 0, placed: 0, weight: 0, size: 0});\n _stack.count++;\n _stack.weight += stackWeight;\n }\n return stacks;\n}\n\n/**\n * store dimensions used instead of available chartArea in fitBoxes\n **/\nfunction setLayoutDims(layouts, params) {\n const stacks = buildStacks(layouts);\n const {vBoxMaxWidth, hBoxMaxHeight} = params;\n let i, ilen, layout;\n for (i = 0, ilen = layouts.length; i < ilen; ++i) {\n layout = layouts[i];\n const {fullSize} = layout.box;\n const stack = stacks[layout.stack];\n const factor = stack && layout.stackWeight / stack.weight;\n if (layout.horizontal) {\n layout.width = factor ? factor * vBoxMaxWidth : fullSize && params.availableWidth;\n layout.height = hBoxMaxHeight;\n } else {\n layout.width = vBoxMaxWidth;\n layout.height = factor ? factor * hBoxMaxHeight : fullSize && params.availableHeight;\n }\n }\n return stacks;\n}\n\nfunction buildLayoutBoxes(boxes) {\n const layoutBoxes = wrapBoxes(boxes);\n const fullSize = sortByWeight(layoutBoxes.filter(wrap => wrap.box.fullSize), true);\n const left = sortByWeight(filterByPosition(layoutBoxes, 'left'), true);\n const right = sortByWeight(filterByPosition(layoutBoxes, 'right'));\n const top = sortByWeight(filterByPosition(layoutBoxes, 'top'), true);\n const bottom = sortByWeight(filterByPosition(layoutBoxes, 'bottom'));\n const centerHorizontal = filterDynamicPositionByAxis(layoutBoxes, 'x');\n const centerVertical = filterDynamicPositionByAxis(layoutBoxes, 'y');\n\n return {\n fullSize,\n leftAndTop: left.concat(top),\n rightAndBottom: right.concat(centerVertical).concat(bottom).concat(centerHorizontal),\n chartArea: filterByPosition(layoutBoxes, 'chartArea'),\n vertical: left.concat(right).concat(centerVertical),\n horizontal: top.concat(bottom).concat(centerHorizontal)\n };\n}\n\nfunction getCombinedMax(maxPadding, chartArea, a, b) {\n return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]);\n}\n\nfunction updateMaxPadding(maxPadding, boxPadding) {\n maxPadding.top = Math.max(maxPadding.top, boxPadding.top);\n maxPadding.left = Math.max(maxPadding.left, boxPadding.left);\n maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom);\n maxPadding.right = Math.max(maxPadding.right, boxPadding.right);\n}\n\nfunction updateDims(chartArea, params, layout, stacks) {\n const {pos, box} = layout;\n const maxPadding = chartArea.maxPadding;\n\n // dynamically placed boxes size is not considered\n if (!isObject(pos)) {\n if (layout.size) {\n // this layout was already counted for, lets first reduce old size\n chartArea[pos] -= layout.size;\n }\n const stack = stacks[layout.stack] || {size: 0, count: 1};\n stack.size = Math.max(stack.size, layout.horizontal ? box.height : box.width);\n layout.size = stack.size / stack.count;\n chartArea[pos] += layout.size;\n }\n\n if (box.getPadding) {\n updateMaxPadding(maxPadding, box.getPadding());\n }\n\n const newWidth = Math.max(0, params.outerWidth - getCombinedMax(maxPadding, chartArea, 'left', 'right'));\n const newHeight = Math.max(0, params.outerHeight - getCombinedMax(maxPadding, chartArea, 'top', 'bottom'));\n const widthChanged = newWidth !== chartArea.w;\n const heightChanged = newHeight !== chartArea.h;\n chartArea.w = newWidth;\n chartArea.h = newHeight;\n\n // return booleans on the changes per direction\n return layout.horizontal\n ? {same: widthChanged, other: heightChanged}\n : {same: heightChanged, other: widthChanged};\n}\n\nfunction handleMaxPadding(chartArea) {\n const maxPadding = chartArea.maxPadding;\n\n function updatePos(pos) {\n const change = Math.max(maxPadding[pos] - chartArea[pos], 0);\n chartArea[pos] += change;\n return change;\n }\n chartArea.y += updatePos('top');\n chartArea.x += updatePos('left');\n updatePos('right');\n updatePos('bottom');\n}\n\nfunction getMargins(horizontal, chartArea) {\n const maxPadding = chartArea.maxPadding;\n\n function marginForPositions(positions) {\n const margin = {left: 0, top: 0, right: 0, bottom: 0};\n positions.forEach((pos) => {\n margin[pos] = Math.max(chartArea[pos], maxPadding[pos]);\n });\n return margin;\n }\n\n return horizontal\n ? marginForPositions(['left', 'right'])\n : marginForPositions(['top', 'bottom']);\n}\n\nfunction fitBoxes(boxes, chartArea, params, stacks) {\n const refitBoxes = [];\n let i, ilen, layout, box, refit, changed;\n\n for (i = 0, ilen = boxes.length, refit = 0; i < ilen; ++i) {\n layout = boxes[i];\n box = layout.box;\n\n box.update(\n layout.width || chartArea.w,\n layout.height || chartArea.h,\n getMargins(layout.horizontal, chartArea)\n );\n const {same, other} = updateDims(chartArea, params, layout, stacks);\n\n // Dimensions changed and there were non full width boxes before this\n // -> we have to refit those\n refit |= same && refitBoxes.length;\n\n // Chart area changed in the opposite direction\n changed = changed || other;\n\n if (!box.fullSize) { // fullSize boxes don't need to be re-fitted in any case\n refitBoxes.push(layout);\n }\n }\n\n return refit && fitBoxes(refitBoxes, chartArea, params, stacks) || changed;\n}\n\nfunction setBoxDims(box, left, top, width, height) {\n box.top = top;\n box.left = left;\n box.right = left + width;\n box.bottom = top + height;\n box.width = width;\n box.height = height;\n}\n\nfunction placeBoxes(boxes, chartArea, params, stacks) {\n const userPadding = params.padding;\n let {x, y} = chartArea;\n\n for (const layout of boxes) {\n const box = layout.box;\n const stack = stacks[layout.stack] || {count: 1, placed: 0, weight: 1};\n const weight = (layout.stackWeight / stack.weight) || 1;\n if (layout.horizontal) {\n const width = chartArea.w * weight;\n const height = stack.size || box.height;\n if (defined(stack.start)) {\n y = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, userPadding.left, y, params.outerWidth - userPadding.right - userPadding.left, height);\n } else {\n setBoxDims(box, chartArea.left + stack.placed, y, width, height);\n }\n stack.start = y;\n stack.placed += width;\n y = box.bottom;\n } else {\n const height = chartArea.h * weight;\n const width = stack.size || box.width;\n if (defined(stack.start)) {\n x = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, x, userPadding.top, width, params.outerHeight - userPadding.bottom - userPadding.top);\n } else {\n setBoxDims(box, x, chartArea.top + stack.placed, width, height);\n }\n stack.start = x;\n stack.placed += height;\n x = box.right;\n }\n }\n\n chartArea.x = x;\n chartArea.y = y;\n}\n\n/**\n * @interface LayoutItem\n * @typedef {object} LayoutItem\n * @prop {string} position - The position of the item in the chart layout. Possible values are\n * 'left', 'top', 'right', 'bottom', and 'chartArea'\n * @prop {number} weight - The weight used to sort the item. Higher weights are further away from the chart area\n * @prop {boolean} fullSize - if true, and the item is horizontal, then push vertical boxes down\n * @prop {function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom)\n * @prop {function} update - Takes two parameters: width and height. Returns size of item\n * @prop {function} draw - Draws the element\n * @prop {function} [getPadding] - Returns an object with padding on the edges\n * @prop {number} width - Width of item. Must be valid after update()\n * @prop {number} height - Height of item. Must be valid after update()\n * @prop {number} left - Left edge of the item. Set by layout system and cannot be used in update\n * @prop {number} top - Top edge of the item. Set by layout system and cannot be used in update\n * @prop {number} right - Right edge of the item. Set by layout system and cannot be used in update\n * @prop {number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update\n */\n\n// The layout service is very self explanatory. It's responsible for the layout within a chart.\n// Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need\n// It is this service's responsibility of carrying out that layout.\nexport default {\n\n /**\n\t * Register a box to a chart.\n\t * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title.\n\t * @param {Chart} chart - the chart to use\n\t * @param {LayoutItem} item - the item to add to be laid out\n\t */\n addBox(chart, item) {\n if (!chart.boxes) {\n chart.boxes = [];\n }\n\n // initialize item with default values\n item.fullSize = item.fullSize || false;\n item.position = item.position || 'top';\n item.weight = item.weight || 0;\n // @ts-ignore\n item._layers = item._layers || function() {\n return [{\n z: 0,\n draw(chartArea) {\n item.draw(chartArea);\n }\n }];\n };\n\n chart.boxes.push(item);\n },\n\n /**\n\t * Remove a layoutItem from a chart\n\t * @param {Chart} chart - the chart to remove the box from\n\t * @param {LayoutItem} layoutItem - the item to remove from the layout\n\t */\n removeBox(chart, layoutItem) {\n const index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n if (index !== -1) {\n chart.boxes.splice(index, 1);\n }\n },\n\n /**\n\t * Sets (or updates) options on the given `item`.\n\t * @param {Chart} chart - the chart in which the item lives (or will be added to)\n\t * @param {LayoutItem} item - the item to configure with the given options\n\t * @param {object} options - the new item options.\n\t */\n configure(chart, item, options) {\n item.fullSize = options.fullSize;\n item.position = options.position;\n item.weight = options.weight;\n },\n\n /**\n\t * Fits boxes of the given chart into the given size by having each box measure itself\n\t * then running a fitting algorithm\n\t * @param {Chart} chart - the chart\n\t * @param {number} width - the width to fit into\n\t * @param {number} height - the height to fit into\n * @param {number} minPadding - minimum padding required for each side of chart area\n\t */\n update(chart, width, height, minPadding) {\n if (!chart) {\n return;\n }\n\n const padding = toPadding(chart.options.layout.padding);\n const availableWidth = Math.max(width - padding.width, 0);\n const availableHeight = Math.max(height - padding.height, 0);\n const boxes = buildLayoutBoxes(chart.boxes);\n const verticalBoxes = boxes.vertical;\n const horizontalBoxes = boxes.horizontal;\n\n // Before any changes are made, notify boxes that an update is about to being\n // This is used to clear any cached data (e.g. scale limits)\n each(chart.boxes, box => {\n if (typeof box.beforeLayout === 'function') {\n box.beforeLayout();\n }\n });\n\n // Essentially we now have any number of boxes on each of the 4 sides.\n // Our canvas looks like the following.\n // The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and\n // B1 is the bottom axis\n // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays\n // These locations are single-box locations only, when trying to register a chartArea location that is already taken,\n // an error will be thrown.\n //\n // |----------------------------------------------------|\n // | T1 (Full Width) |\n // |----------------------------------------------------|\n // | | | T2 | |\n // | |----|-------------------------------------|----|\n // | | | C1 | | C2 | |\n // | | |----| |----| |\n // | | | | |\n // | L1 | L2 | ChartArea (C0) | R1 |\n // | | | | |\n // | | |----| |----| |\n // | | | C3 | | C4 | |\n // | |----|-------------------------------------|----|\n // | | | B1 | |\n // |----------------------------------------------------|\n // | B2 (Full Width) |\n // |----------------------------------------------------|\n //\n\n const visibleVerticalBoxCount = verticalBoxes.reduce((total, wrap) =>\n wrap.box.options && wrap.box.options.display === false ? total : total + 1, 0) || 1;\n\n const params = Object.freeze({\n outerWidth: width,\n outerHeight: height,\n padding,\n availableWidth,\n availableHeight,\n vBoxMaxWidth: availableWidth / 2 / visibleVerticalBoxCount,\n hBoxMaxHeight: availableHeight / 2\n });\n const maxPadding = Object.assign({}, padding);\n updateMaxPadding(maxPadding, toPadding(minPadding));\n const chartArea = Object.assign({\n maxPadding,\n w: availableWidth,\n h: availableHeight,\n x: padding.left,\n y: padding.top\n }, padding);\n\n const stacks = setLayoutDims(verticalBoxes.concat(horizontalBoxes), params);\n\n // First fit the fullSize boxes, to reduce probability of re-fitting.\n fitBoxes(boxes.fullSize, chartArea, params, stacks);\n\n // Then fit vertical boxes\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n\n // Then fit horizontal boxes\n if (fitBoxes(horizontalBoxes, chartArea, params, stacks)) {\n // if the area changed, re-fit vertical boxes\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n }\n\n handleMaxPadding(chartArea);\n\n // Finally place the boxes to correct coordinates\n placeBoxes(boxes.leftAndTop, chartArea, params, stacks);\n\n // Move to opposite side of chart\n chartArea.x += chartArea.w;\n chartArea.y += chartArea.h;\n\n placeBoxes(boxes.rightAndBottom, chartArea, params, stacks);\n\n chart.chartArea = {\n left: chartArea.left,\n top: chartArea.top,\n right: chartArea.left + chartArea.w,\n bottom: chartArea.top + chartArea.h,\n height: chartArea.h,\n width: chartArea.w,\n };\n\n // Finally update boxes in chartArea (radial scale for example)\n each(boxes.chartArea, (layout) => {\n const box = layout.box;\n Object.assign(box, chart.chartArea);\n box.update(chartArea.w, chartArea.h, {left: 0, top: 0, right: 0, bottom: 0});\n });\n }\n};\n","\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\n/**\n * Abstract class that allows abstracting platform dependencies away from the chart.\n */\nexport default class BasePlatform {\n /**\n\t * Called at chart construction time, returns a context2d instance implementing\n\t * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}.\n\t * @param {HTMLCanvasElement} canvas - The canvas from which to acquire context (platform specific)\n\t * @param {number} [aspectRatio] - The chart options\n\t */\n acquireContext(canvas, aspectRatio) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Called at chart destruction time, releases any resources associated to the context\n\t * previously returned by the acquireContext() method.\n\t * @param {CanvasRenderingContext2D} context - The context2d instance\n\t * @returns {boolean} true if the method succeeded, else false\n\t */\n releaseContext(context) { // eslint-disable-line no-unused-vars\n return false;\n }\n\n /**\n\t * Registers the specified listener on the given chart.\n\t * @param {Chart} chart - Chart from which to listen for event\n\t * @param {string} type - The ({@link ChartEvent}) type to listen for\n\t * @param {function} listener - Receives a notification (an object that implements\n\t * the {@link ChartEvent} interface) when an event of the specified type occurs.\n\t */\n addEventListener(chart, type, listener) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Removes the specified listener previously registered with addEventListener.\n\t * @param {Chart} chart - Chart from which to remove the listener\n\t * @param {string} type - The ({@link ChartEvent}) type to remove\n\t * @param {function} listener - The listener function to remove from the event target.\n\t */\n removeEventListener(chart, type, listener) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * @returns {number} the current devicePixelRatio of the device this platform is connected to.\n\t */\n getDevicePixelRatio() {\n return 1;\n }\n\n /**\n\t * Returns the maximum size in pixels of given canvas element.\n\t * @param {HTMLCanvasElement} element\n\t * @param {number} [width] - content width of parent element\n\t * @param {number} [height] - content height of parent element\n\t * @param {number} [aspectRatio] - aspect ratio to maintain\n\t */\n getMaximumSize(element, width, height, aspectRatio) {\n width = Math.max(0, width || element.width);\n height = height || element.height;\n return {\n width,\n height: Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height)\n };\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @returns {boolean} true if the canvas is attached to the platform, false if not.\n\t */\n isAttached(canvas) { // eslint-disable-line no-unused-vars\n return true;\n }\n\n /**\n * Updates config with platform specific requirements\n * @param {import('../core/core.config.js').default} config\n */\n updateConfig(config) { // eslint-disable-line no-unused-vars\n // no-op\n }\n}\n","/**\n * Platform fallback implementation (minimal).\n * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939\n */\n\nimport BasePlatform from './platform.base.js';\n\n/**\n * Platform class for charts without access to the DOM or to many element properties\n * This platform is used by default for any chart passed an OffscreenCanvas.\n * @extends BasePlatform\n */\nexport default class BasicPlatform extends BasePlatform {\n acquireContext(item) {\n // To prevent canvas fingerprinting, some add-ons undefine the getContext\n // method, for example: https://github.com/kkapsner/CanvasBlocker\n // https://github.com/chartjs/Chart.js/issues/2807\n return item && item.getContext && item.getContext('2d') || null;\n }\n updateConfig(config) {\n config.options.animation = false;\n }\n}\n","/**\n * Chart.Platform implementation for targeting a web browser\n */\n\nimport BasePlatform from './platform.base.js';\nimport {_getParentNode, getRelativePosition, supportsEventListenerOptions, readUsedSize, getMaximumSize} from '../helpers/helpers.dom.js';\nimport {throttled} from '../helpers/helpers.extras.js';\nimport {isNullOrUndef} from '../helpers/helpers.core.js';\n\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\nconst EXPANDO_KEY = '$chartjs';\n\n/**\n * DOM event types -> Chart.js event types.\n * Note: only events with different types are mapped.\n * @see https://developer.mozilla.org/en-US/docs/Web/Events\n */\nconst EVENT_TYPES = {\n touchstart: 'mousedown',\n touchmove: 'mousemove',\n touchend: 'mouseup',\n pointerenter: 'mouseenter',\n pointerdown: 'mousedown',\n pointermove: 'mousemove',\n pointerup: 'mouseup',\n pointerleave: 'mouseout',\n pointerout: 'mouseout'\n};\n\nconst isNullOrEmpty = value => value === null || value === '';\n/**\n * Initializes the canvas style and render size without modifying the canvas display size,\n * since responsiveness is handled by the controller.resize() method. The config is used\n * to determine the aspect ratio to apply in case no explicit height has been specified.\n * @param {HTMLCanvasElement} canvas\n * @param {number} [aspectRatio]\n */\nfunction initCanvas(canvas, aspectRatio) {\n const style = canvas.style;\n\n // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it\n // returns null or '' if no explicit value has been set to the canvas attribute.\n const renderHeight = canvas.getAttribute('height');\n const renderWidth = canvas.getAttribute('width');\n\n // Chart.js modifies some canvas values that we want to restore on destroy\n canvas[EXPANDO_KEY] = {\n initial: {\n height: renderHeight,\n width: renderWidth,\n style: {\n display: style.display,\n height: style.height,\n width: style.width\n }\n }\n };\n\n // Force canvas to display as block to avoid extra space caused by inline\n // elements, which would interfere with the responsive resize process.\n // https://github.com/chartjs/Chart.js/issues/2538\n style.display = style.display || 'block';\n // Include possible borders in the size\n style.boxSizing = style.boxSizing || 'border-box';\n\n if (isNullOrEmpty(renderWidth)) {\n const displayWidth = readUsedSize(canvas, 'width');\n if (displayWidth !== undefined) {\n canvas.width = displayWidth;\n }\n }\n\n if (isNullOrEmpty(renderHeight)) {\n if (canvas.style.height === '') {\n // If no explicit render height and style height, let's apply the aspect ratio,\n // which one can be specified by the user but also by charts as default option\n // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2.\n canvas.height = canvas.width / (aspectRatio || 2);\n } else {\n const displayHeight = readUsedSize(canvas, 'height');\n if (displayHeight !== undefined) {\n canvas.height = displayHeight;\n }\n }\n }\n\n return canvas;\n}\n\n// Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events.\n// https://github.com/chartjs/Chart.js/issues/4287\nconst eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false;\n\nfunction addListener(node, type, listener) {\n if (node) {\n node.addEventListener(type, listener, eventListenerOptions);\n }\n}\n\nfunction removeListener(chart, type, listener) {\n if (chart && chart.canvas) {\n chart.canvas.removeEventListener(type, listener, eventListenerOptions);\n }\n}\n\nfunction fromNativeEvent(event, chart) {\n const type = EVENT_TYPES[event.type] || event.type;\n const {x, y} = getRelativePosition(event, chart);\n return {\n type,\n chart,\n native: event,\n x: x !== undefined ? x : null,\n y: y !== undefined ? y : null,\n };\n}\n\nfunction nodeListContains(nodeList, canvas) {\n for (const node of nodeList) {\n if (node === canvas || node.contains(canvas)) {\n return true;\n }\n }\n}\n\nfunction createAttachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver(entries => {\n let trigger = false;\n for (const entry of entries) {\n trigger = trigger || nodeListContains(entry.addedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.removedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {childList: true, subtree: true});\n return observer;\n}\n\nfunction createDetachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver(entries => {\n let trigger = false;\n for (const entry of entries) {\n trigger = trigger || nodeListContains(entry.removedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.addedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {childList: true, subtree: true});\n return observer;\n}\n\nconst drpListeningCharts = new Map();\nlet oldDevicePixelRatio = 0;\n\nfunction onWindowResize() {\n const dpr = window.devicePixelRatio;\n if (dpr === oldDevicePixelRatio) {\n return;\n }\n oldDevicePixelRatio = dpr;\n drpListeningCharts.forEach((resize, chart) => {\n if (chart.currentDevicePixelRatio !== dpr) {\n resize();\n }\n });\n}\n\nfunction listenDevicePixelRatioChanges(chart, resize) {\n if (!drpListeningCharts.size) {\n window.addEventListener('resize', onWindowResize);\n }\n drpListeningCharts.set(chart, resize);\n}\n\nfunction unlistenDevicePixelRatioChanges(chart) {\n drpListeningCharts.delete(chart);\n if (!drpListeningCharts.size) {\n window.removeEventListener('resize', onWindowResize);\n }\n}\n\nfunction createResizeObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n return;\n }\n const resize = throttled((width, height) => {\n const w = container.clientWidth;\n listener(width, height);\n if (w < container.clientWidth) {\n // If the container size shrank during chart resize, let's assume\n // scrollbar appeared. So we resize again with the scrollbar visible -\n // effectively making chart smaller and the scrollbar hidden again.\n // Because we are inside `throttled`, and currently `ticking`, scroll\n // events are ignored during this whole 2 resize process.\n // If we assumed wrong and something else happened, we are resizing\n // twice in a frame (potential performance issue)\n listener();\n }\n }, window);\n\n // @ts-ignore until https://github.com/microsoft/TypeScript/issues/37861 implemented\n const observer = new ResizeObserver(entries => {\n const entry = entries[0];\n const width = entry.contentRect.width;\n const height = entry.contentRect.height;\n // When its container's display is set to 'none' the callback will be called with a\n // size of (0, 0), which will cause the chart to lose its original height, so skip\n // resizing in such case.\n if (width === 0 && height === 0) {\n return;\n }\n resize(width, height);\n });\n observer.observe(container);\n listenDevicePixelRatioChanges(chart, resize);\n\n return observer;\n}\n\nfunction releaseObserver(chart, type, observer) {\n if (observer) {\n observer.disconnect();\n }\n if (type === 'resize') {\n unlistenDevicePixelRatioChanges(chart);\n }\n}\n\nfunction createProxyAndListen(chart, type, listener) {\n const canvas = chart.canvas;\n const proxy = throttled((event) => {\n // This case can occur if the chart is destroyed while waiting\n // for the throttled function to occur. We prevent crashes by checking\n // for a destroyed chart\n if (chart.ctx !== null) {\n listener(fromNativeEvent(event, chart));\n }\n }, chart);\n\n addListener(canvas, type, proxy);\n\n return proxy;\n}\n\n/**\n * Platform class for charts that can access the DOM and global window/document properties\n * @extends BasePlatform\n */\nexport default class DomPlatform extends BasePlatform {\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @param {number} [aspectRatio]\n\t * @return {CanvasRenderingContext2D|null}\n\t */\n acquireContext(canvas, aspectRatio) {\n // To prevent canvas fingerprinting, some add-ons undefine the getContext\n // method, for example: https://github.com/kkapsner/CanvasBlocker\n // https://github.com/chartjs/Chart.js/issues/2807\n const context = canvas && canvas.getContext && canvas.getContext('2d');\n\n // `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the canvas is\n // inside an iframe or when running in a protected environment. We could guess the\n // types from their toString() value but let's keep things flexible and assume it's\n // a sufficient condition if the canvas has a context2D which has canvas as `canvas`.\n // https://github.com/chartjs/Chart.js/issues/3887\n // https://github.com/chartjs/Chart.js/issues/4102\n // https://github.com/chartjs/Chart.js/issues/4152\n if (context && context.canvas === canvas) {\n // Load platform resources on first chart creation, to make it possible to\n // import the library before setting platform options.\n initCanvas(canvas, aspectRatio);\n return context;\n }\n\n return null;\n }\n\n /**\n\t * @param {CanvasRenderingContext2D} context\n\t */\n releaseContext(context) {\n const canvas = context.canvas;\n if (!canvas[EXPANDO_KEY]) {\n return false;\n }\n\n const initial = canvas[EXPANDO_KEY].initial;\n ['height', 'width'].forEach((prop) => {\n const value = initial[prop];\n if (isNullOrUndef(value)) {\n canvas.removeAttribute(prop);\n } else {\n canvas.setAttribute(prop, value);\n }\n });\n\n const style = initial.style || {};\n Object.keys(style).forEach((key) => {\n canvas.style[key] = style[key];\n });\n\n // The canvas render size might have been changed (and thus the state stack discarded),\n // we can't use save() and restore() to restore the initial state. So make sure that at\n // least the canvas context is reset to the default state by setting the canvas width.\n // https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html\n // eslint-disable-next-line no-self-assign\n canvas.width = canvas.width;\n\n delete canvas[EXPANDO_KEY];\n return true;\n }\n\n /**\n\t *\n\t * @param {Chart} chart\n\t * @param {string} type\n\t * @param {function} listener\n\t */\n addEventListener(chart, type, listener) {\n // Can have only one listener per type, so make sure previous is removed\n this.removeEventListener(chart, type);\n\n const proxies = chart.$proxies || (chart.$proxies = {});\n const handlers = {\n attach: createAttachObserver,\n detach: createDetachObserver,\n resize: createResizeObserver\n };\n const handler = handlers[type] || createProxyAndListen;\n proxies[type] = handler(chart, type, listener);\n }\n\n\n /**\n\t * @param {Chart} chart\n\t * @param {string} type\n\t */\n removeEventListener(chart, type) {\n const proxies = chart.$proxies || (chart.$proxies = {});\n const proxy = proxies[type];\n\n if (!proxy) {\n return;\n }\n\n const handlers = {\n attach: releaseObserver,\n detach: releaseObserver,\n resize: releaseObserver\n };\n const handler = handlers[type] || removeListener;\n handler(chart, type, proxy);\n proxies[type] = undefined;\n }\n\n getDevicePixelRatio() {\n return window.devicePixelRatio;\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @param {number} [width] - content width of parent element\n\t * @param {number} [height] - content height of parent element\n\t * @param {number} [aspectRatio] - aspect ratio to maintain\n\t */\n getMaximumSize(canvas, width, height, aspectRatio) {\n return getMaximumSize(canvas, width, height, aspectRatio);\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t */\n isAttached(canvas) {\n const container = canvas && _getParentNode(canvas);\n return !!(container && container.isConnected);\n }\n}\n","import type {AnyObject} from '../types/basic.js';\nimport type {Point} from '../types/geometric.js';\nimport type {Animation} from '../types/animation.js';\nimport {isNumber} from '../helpers/helpers.math.js';\n\nexport default class Element<T = AnyObject, O = AnyObject> {\n\n static defaults = {};\n static defaultRoutes = undefined;\n\n x: number;\n y: number;\n active = false;\n options: O;\n $animations: Record<keyof T, Animation>;\n\n tooltipPosition(useFinalPosition: boolean): Point {\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return {x, y} as Point;\n }\n\n hasValue() {\n return isNumber(this.x) && isNumber(this.y);\n }\n\n /**\n * Gets the current or final value of each prop. Can return extra properties (whole object).\n * @param props - properties to get\n * @param [final] - get the final value (animation target)\n */\n getProps<P extends (keyof T)[]>(props: P, final?: boolean): Pick<T, P[number]>;\n getProps<P extends string>(props: P[], final?: boolean): Partial<Record<P, unknown>>;\n getProps(props: string[], final?: boolean): Partial<Record<string, unknown>> {\n const anims = this.$animations;\n if (!final || !anims) {\n // let's not create an object, if not needed\n return this as Record<string, unknown>;\n }\n const ret: Record<string, unknown> = {};\n props.forEach((prop) => {\n ret[prop] = anims[prop] && anims[prop].active() ? anims[prop]._to : this[prop as string];\n });\n return ret;\n }\n}\n","import {isNullOrUndef, valueOrDefault} from '../helpers/helpers.core.js';\nimport {_factorize} from '../helpers/helpers.math.js';\n\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef {{value:number | string, label?:string, major?:boolean, $context?:any}} Tick\n */\n\n/**\n * Returns a subset of ticks to be plotted to avoid overlapping labels.\n * @param {import('./core.scale.js').default} scale\n * @param {Tick[]} ticks\n * @return {Tick[]}\n * @private\n */\nexport function autoSkip(scale, ticks) {\n const tickOpts = scale.options.ticks;\n const determinedMaxTicks = determineMaxTicks(scale);\n const ticksLimit = Math.min(tickOpts.maxTicksLimit || determinedMaxTicks, determinedMaxTicks);\n const majorIndices = tickOpts.major.enabled ? getMajorIndices(ticks) : [];\n const numMajorIndices = majorIndices.length;\n const first = majorIndices[0];\n const last = majorIndices[numMajorIndices - 1];\n const newTicks = [];\n\n // If there are too many major ticks to display them all\n if (numMajorIndices > ticksLimit) {\n skipMajors(ticks, newTicks, majorIndices, numMajorIndices / ticksLimit);\n return newTicks;\n }\n\n const spacing = calculateSpacing(majorIndices, ticks, ticksLimit);\n\n if (numMajorIndices > 0) {\n let i, ilen;\n const avgMajorSpacing = numMajorIndices > 1 ? Math.round((last - first) / (numMajorIndices - 1)) : null;\n skip(ticks, newTicks, spacing, isNullOrUndef(avgMajorSpacing) ? 0 : first - avgMajorSpacing, first);\n for (i = 0, ilen = numMajorIndices - 1; i < ilen; i++) {\n skip(ticks, newTicks, spacing, majorIndices[i], majorIndices[i + 1]);\n }\n skip(ticks, newTicks, spacing, last, isNullOrUndef(avgMajorSpacing) ? ticks.length : last + avgMajorSpacing);\n return newTicks;\n }\n skip(ticks, newTicks, spacing);\n return newTicks;\n}\n\nfunction determineMaxTicks(scale) {\n const offset = scale.options.offset;\n const tickLength = scale._tickSize();\n const maxScale = scale._length / tickLength + (offset ? 0 : 1);\n const maxChart = scale._maxLength / tickLength;\n return Math.floor(Math.min(maxScale, maxChart));\n}\n\n/**\n * @param {number[]} majorIndices\n * @param {Tick[]} ticks\n * @param {number} ticksLimit\n */\nfunction calculateSpacing(majorIndices, ticks, ticksLimit) {\n const evenMajorSpacing = getEvenSpacing(majorIndices);\n const spacing = ticks.length / ticksLimit;\n\n // If the major ticks are evenly spaced apart, place the minor ticks\n // so that they divide the major ticks into even chunks\n if (!evenMajorSpacing) {\n return Math.max(spacing, 1);\n }\n\n const factors = _factorize(evenMajorSpacing);\n for (let i = 0, ilen = factors.length - 1; i < ilen; i++) {\n const factor = factors[i];\n if (factor > spacing) {\n return factor;\n }\n }\n return Math.max(spacing, 1);\n}\n\n/**\n * @param {Tick[]} ticks\n */\nfunction getMajorIndices(ticks) {\n const result = [];\n let i, ilen;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n if (ticks[i].major) {\n result.push(i);\n }\n }\n return result;\n}\n\n/**\n * @param {Tick[]} ticks\n * @param {Tick[]} newTicks\n * @param {number[]} majorIndices\n * @param {number} spacing\n */\nfunction skipMajors(ticks, newTicks, majorIndices, spacing) {\n let count = 0;\n let next = majorIndices[0];\n let i;\n\n spacing = Math.ceil(spacing);\n for (i = 0; i < ticks.length; i++) {\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = majorIndices[count * spacing];\n }\n }\n}\n\n/**\n * @param {Tick[]} ticks\n * @param {Tick[]} newTicks\n * @param {number} spacing\n * @param {number} [majorStart]\n * @param {number} [majorEnd]\n */\nfunction skip(ticks, newTicks, spacing, majorStart, majorEnd) {\n const start = valueOrDefault(majorStart, 0);\n const end = Math.min(valueOrDefault(majorEnd, ticks.length), ticks.length);\n let count = 0;\n let length, i, next;\n\n spacing = Math.ceil(spacing);\n if (majorEnd) {\n length = majorEnd - majorStart;\n spacing = length / Math.floor(length / spacing);\n }\n\n next = start;\n\n while (next < 0) {\n count++;\n next = Math.round(start + count * spacing);\n }\n\n for (i = Math.max(start, 0); i < end; i++) {\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = Math.round(start + count * spacing);\n }\n }\n}\n\n\n/**\n * @param {number[]} arr\n */\nfunction getEvenSpacing(arr) {\n const len = arr.length;\n let i, diff;\n\n if (len < 2) {\n return false;\n }\n\n for (diff = arr[0], i = 1; i < len; ++i) {\n if (arr[i] - arr[i - 1] !== diff) {\n return false;\n }\n }\n return diff;\n}\n","import Element from './core.element.js';\nimport {_alignPixel, _measureText, renderText, clipArea, unclipArea} from '../helpers/helpers.canvas.js';\nimport {callback as call, each, finiteOrDefault, isArray, isFinite, isNullOrUndef, isObject, valueOrDefault} from '../helpers/helpers.core.js';\nimport {toDegrees, toRadians, _int16Range, _limitValue, HALF_PI} from '../helpers/helpers.math.js';\nimport {_alignStartEnd, _toLeftRightCenter} from '../helpers/helpers.extras.js';\nimport {createContext, toFont, toPadding, _addGrace} from '../helpers/helpers.options.js';\nimport {autoSkip} from './core.scale.autoskip.js';\n\nconst reverseAlign = (align) => align === 'left' ? 'right' : align === 'right' ? 'left' : align;\nconst offsetFromEdge = (scale, edge, offset) => edge === 'top' || edge === 'left' ? scale[edge] + offset : scale[edge] - offset;\nconst getTicksLimit = (ticksLength, maxTicksLimit) => Math.min(maxTicksLimit || ticksLength, ticksLength);\n\n/**\n * @typedef { import('../types/index.js').Chart } Chart\n * @typedef {{value:number | string, label?:string, major?:boolean, $context?:any}} Tick\n */\n\n/**\n * Returns a new array containing numItems from arr\n * @param {any[]} arr\n * @param {number} numItems\n */\nfunction sample(arr, numItems) {\n const result = [];\n const increment = arr.length / numItems;\n const len = arr.length;\n let i = 0;\n\n for (; i < len; i += increment) {\n result.push(arr[Math.floor(i)]);\n }\n return result;\n}\n\n/**\n * @param {Scale} scale\n * @param {number} index\n * @param {boolean} offsetGridLines\n */\nfunction getPixelForGridLine(scale, index, offsetGridLines) {\n const length = scale.ticks.length;\n const validIndex = Math.min(index, length - 1);\n const start = scale._startPixel;\n const end = scale._endPixel;\n const epsilon = 1e-6; // 1e-6 is margin in pixels for accumulated error.\n let lineValue = scale.getPixelForTick(validIndex);\n let offset;\n\n if (offsetGridLines) {\n if (length === 1) {\n offset = Math.max(lineValue - start, end - lineValue);\n } else if (index === 0) {\n offset = (scale.getPixelForTick(1) - lineValue) / 2;\n } else {\n offset = (lineValue - scale.getPixelForTick(validIndex - 1)) / 2;\n }\n lineValue += validIndex < index ? offset : -offset;\n\n // Return undefined if the pixel is out of the range\n if (lineValue < start - epsilon || lineValue > end + epsilon) {\n return;\n }\n }\n return lineValue;\n}\n\n/**\n * @param {object} caches\n * @param {number} length\n */\nfunction garbageCollect(caches, length) {\n each(caches, (cache) => {\n const gc = cache.gc;\n const gcLen = gc.length / 2;\n let i;\n if (gcLen > length) {\n for (i = 0; i < gcLen; ++i) {\n delete cache.data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n });\n}\n\n/**\n * @param {object} options\n */\nfunction getTickMarkLength(options) {\n return options.drawTicks ? options.tickLength : 0;\n}\n\n/**\n * @param {object} options\n */\nfunction getTitleHeight(options, fallback) {\n if (!options.display) {\n return 0;\n }\n\n const font = toFont(options.font, fallback);\n const padding = toPadding(options.padding);\n const lines = isArray(options.text) ? options.text.length : 1;\n\n return (lines * font.lineHeight) + padding.height;\n}\n\nfunction createScaleContext(parent, scale) {\n return createContext(parent, {\n scale,\n type: 'scale'\n });\n}\n\nfunction createTickContext(parent, index, tick) {\n return createContext(parent, {\n tick,\n index,\n type: 'tick'\n });\n}\n\nfunction titleAlign(align, position, reverse) {\n /** @type {CanvasTextAlign} */\n let ret = _toLeftRightCenter(align);\n if ((reverse && position !== 'right') || (!reverse && position === 'right')) {\n ret = reverseAlign(ret);\n }\n return ret;\n}\n\nfunction titleArgs(scale, offset, position, align) {\n const {top, left, bottom, right, chart} = scale;\n const {chartArea, scales} = chart;\n let rotation = 0;\n let maxWidth, titleX, titleY;\n const height = bottom - top;\n const width = right - left;\n\n if (scale.isHorizontal()) {\n titleX = _alignStartEnd(align, left, right);\n\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleY = scales[positionAxisID].getPixelForValue(value) + height - offset;\n } else if (position === 'center') {\n titleY = (chartArea.bottom + chartArea.top) / 2 + height - offset;\n } else {\n titleY = offsetFromEdge(scale, position, offset);\n }\n maxWidth = right - left;\n } else {\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleX = scales[positionAxisID].getPixelForValue(value) - width + offset;\n } else if (position === 'center') {\n titleX = (chartArea.left + chartArea.right) / 2 - width + offset;\n } else {\n titleX = offsetFromEdge(scale, position, offset);\n }\n titleY = _alignStartEnd(align, bottom, top);\n rotation = position === 'left' ? -HALF_PI : HALF_PI;\n }\n return {titleX, titleY, maxWidth, rotation};\n}\n\nexport default class Scale extends Element {\n\n // eslint-disable-next-line max-statements\n constructor(cfg) {\n super();\n\n /** @type {string} */\n this.id = cfg.id;\n /** @type {string} */\n this.type = cfg.type;\n /** @type {any} */\n this.options = undefined;\n /** @type {CanvasRenderingContext2D} */\n this.ctx = cfg.ctx;\n /** @type {Chart} */\n this.chart = cfg.chart;\n\n // implements box\n /** @type {number} */\n this.top = undefined;\n /** @type {number} */\n this.bottom = undefined;\n /** @type {number} */\n this.left = undefined;\n /** @type {number} */\n this.right = undefined;\n /** @type {number} */\n this.width = undefined;\n /** @type {number} */\n this.height = undefined;\n this._margins = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n };\n /** @type {number} */\n this.maxWidth = undefined;\n /** @type {number} */\n this.maxHeight = undefined;\n /** @type {number} */\n this.paddingTop = undefined;\n /** @type {number} */\n this.paddingBottom = undefined;\n /** @type {number} */\n this.paddingLeft = undefined;\n /** @type {number} */\n this.paddingRight = undefined;\n\n // scale-specific properties\n /** @type {string=} */\n this.axis = undefined;\n /** @type {number=} */\n this.labelRotation = undefined;\n this.min = undefined;\n this.max = undefined;\n this._range = undefined;\n /** @type {Tick[]} */\n this.ticks = [];\n /** @type {object[]|null} */\n this._gridLineItems = null;\n /** @type {object[]|null} */\n this._labelItems = null;\n /** @type {object|null} */\n this._labelSizes = null;\n this._length = 0;\n this._maxLength = 0;\n this._longestTextCache = {};\n /** @type {number} */\n this._startPixel = undefined;\n /** @type {number} */\n this._endPixel = undefined;\n this._reversePixels = false;\n this._userMax = undefined;\n this._userMin = undefined;\n this._suggestedMax = undefined;\n this._suggestedMin = undefined;\n this._ticksLength = 0;\n this._borderValue = 0;\n this._cache = {};\n this._dataLimitsCached = false;\n this.$context = undefined;\n }\n\n /**\n\t * @param {any} options\n\t * @since 3.0\n\t */\n init(options) {\n this.options = options.setContext(this.getContext());\n\n this.axis = options.axis;\n\n // parse min/max value, so we can properly determine min/max for other scales\n this._userMin = this.parse(options.min);\n this._userMax = this.parse(options.max);\n this._suggestedMin = this.parse(options.suggestedMin);\n this._suggestedMax = this.parse(options.suggestedMax);\n }\n\n /**\n\t * Parse a supported input value to internal representation.\n\t * @param {*} raw\n\t * @param {number} [index]\n\t * @since 3.0\n\t */\n parse(raw, index) { // eslint-disable-line no-unused-vars\n return raw;\n }\n\n /**\n\t * @return {{min: number, max: number, minDefined: boolean, maxDefined: boolean}}\n\t * @protected\n\t * @since 3.0\n\t */\n getUserBounds() {\n let {_userMin, _userMax, _suggestedMin, _suggestedMax} = this;\n _userMin = finiteOrDefault(_userMin, Number.POSITIVE_INFINITY);\n _userMax = finiteOrDefault(_userMax, Number.NEGATIVE_INFINITY);\n _suggestedMin = finiteOrDefault(_suggestedMin, Number.POSITIVE_INFINITY);\n _suggestedMax = finiteOrDefault(_suggestedMax, Number.NEGATIVE_INFINITY);\n return {\n min: finiteOrDefault(_userMin, _suggestedMin),\n max: finiteOrDefault(_userMax, _suggestedMax),\n minDefined: isFinite(_userMin),\n maxDefined: isFinite(_userMax)\n };\n }\n\n /**\n\t * @param {boolean} canStack\n\t * @return {{min: number, max: number}}\n\t * @protected\n\t * @since 3.0\n\t */\n getMinMax(canStack) {\n let {min, max, minDefined, maxDefined} = this.getUserBounds();\n let range;\n\n if (minDefined && maxDefined) {\n return {min, max};\n }\n\n const metas = this.getMatchingVisibleMetas();\n for (let i = 0, ilen = metas.length; i < ilen; ++i) {\n range = metas[i].controller.getMinMax(this, canStack);\n if (!minDefined) {\n min = Math.min(min, range.min);\n }\n if (!maxDefined) {\n max = Math.max(max, range.max);\n }\n }\n\n // Make sure min <= max when only min or max is defined by user and the data is outside that range\n min = maxDefined && min > max ? max : min;\n max = minDefined && min > max ? min : max;\n\n return {\n min: finiteOrDefault(min, finiteOrDefault(max, min)),\n max: finiteOrDefault(max, finiteOrDefault(min, max))\n };\n }\n\n /**\n\t * Get the padding needed for the scale\n\t * @return {{top: number, left: number, bottom: number, right: number}} the necessary padding\n\t * @private\n\t */\n getPadding() {\n return {\n left: this.paddingLeft || 0,\n top: this.paddingTop || 0,\n right: this.paddingRight || 0,\n bottom: this.paddingBottom || 0\n };\n }\n\n /**\n\t * Returns the scale tick objects\n\t * @return {Tick[]}\n\t * @since 2.7\n\t */\n getTicks() {\n return this.ticks;\n }\n\n /**\n\t * @return {string[]}\n\t */\n getLabels() {\n const data = this.chart.data;\n return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || [];\n }\n\n /**\n * @return {import('../types.js').LabelItem[]}\n */\n getLabelItems(chartArea = this.chart.chartArea) {\n const items = this._labelItems || (this._labelItems = this._computeLabelItems(chartArea));\n return items;\n }\n\n // When a new layout is created, reset the data limits cache\n beforeLayout() {\n this._cache = {};\n this._dataLimitsCached = false;\n }\n\n // These methods are ordered by lifecycle. Utilities then follow.\n // Any function defined here is inherited by all scale types.\n // Any function can be extended by the scale type\n\n beforeUpdate() {\n call(this.options.beforeUpdate, [this]);\n }\n\n /**\n\t * @param {number} maxWidth - the max width in pixels\n\t * @param {number} maxHeight - the max height in pixels\n\t * @param {{top: number, left: number, bottom: number, right: number}} margins - the space between the edge of the other scales and edge of the chart\n\t * This space comes from two sources:\n\t * - padding - space that's required to show the labels at the edges of the scale\n\t * - thickness of scales or legends in another orientation\n\t */\n update(maxWidth, maxHeight, margins) {\n const {beginAtZero, grace, ticks: tickOpts} = this.options;\n const sampleSize = tickOpts.sampleSize;\n\n // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n this.beforeUpdate();\n\n // Absorb the master measurements\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins = Object.assign({\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n }, margins);\n\n this.ticks = null;\n this._labelSizes = null;\n this._gridLineItems = null;\n this._labelItems = null;\n\n // Dimensions\n this.beforeSetDimensions();\n this.setDimensions();\n this.afterSetDimensions();\n\n this._maxLength = this.isHorizontal()\n ? this.width + margins.left + margins.right\n : this.height + margins.top + margins.bottom;\n\n // Data min/max\n if (!this._dataLimitsCached) {\n this.beforeDataLimits();\n this.determineDataLimits();\n this.afterDataLimits();\n this._range = _addGrace(this, grace, beginAtZero);\n this._dataLimitsCached = true;\n }\n\n this.beforeBuildTicks();\n\n this.ticks = this.buildTicks() || [];\n\n // Allow modification of ticks in callback.\n this.afterBuildTicks();\n\n // Compute tick rotation and fit using a sampled subset of labels\n // We generally don't need to compute the size of every single label for determining scale size\n const samplingEnabled = sampleSize < this.ticks.length;\n this._convertTicksToLabels(samplingEnabled ? sample(this.ticks, sampleSize) : this.ticks);\n\n // configure is called twice, once here, once from core.controller.updateLayout.\n // Here we haven't been positioned yet, but dimensions are correct.\n // Variables set in configure are needed for calculateLabelRotation, and\n // it's ok that coordinates are not correct there, only dimensions matter.\n this.configure();\n\n // Tick Rotation\n this.beforeCalculateLabelRotation();\n this.calculateLabelRotation(); // Preconditions: number of ticks and sizes of largest labels must be calculated beforehand\n this.afterCalculateLabelRotation();\n\n // Auto-skip\n if (tickOpts.display && (tickOpts.autoSkip || tickOpts.source === 'auto')) {\n this.ticks = autoSkip(this, this.ticks);\n this._labelSizes = null;\n this.afterAutoSkip();\n }\n\n if (samplingEnabled) {\n // Generate labels using all non-skipped ticks\n this._convertTicksToLabels(this.ticks);\n }\n\n this.beforeFit();\n this.fit(); // Preconditions: label rotation and label sizes must be calculated beforehand\n this.afterFit();\n\n // IMPORTANT: after this point, we consider that `this.ticks` will NEVER change!\n\n this.afterUpdate();\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n let reversePixels = this.options.reverse;\n let startPixel, endPixel;\n\n if (this.isHorizontal()) {\n startPixel = this.left;\n endPixel = this.right;\n } else {\n startPixel = this.top;\n endPixel = this.bottom;\n // by default vertical scales are from bottom to top, so pixels are reversed\n reversePixels = !reversePixels;\n }\n this._startPixel = startPixel;\n this._endPixel = endPixel;\n this._reversePixels = reversePixels;\n this._length = endPixel - startPixel;\n this._alignToPixels = this.options.alignToPixels;\n }\n\n afterUpdate() {\n call(this.options.afterUpdate, [this]);\n }\n\n //\n\n beforeSetDimensions() {\n call(this.options.beforeSetDimensions, [this]);\n }\n setDimensions() {\n // Set the unconstrained dimension before label rotation\n if (this.isHorizontal()) {\n // Reset position before calculating rotation\n this.width = this.maxWidth;\n this.left = 0;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n\n // Reset position before calculating rotation\n this.top = 0;\n this.bottom = this.height;\n }\n\n // Reset padding\n this.paddingLeft = 0;\n this.paddingTop = 0;\n this.paddingRight = 0;\n this.paddingBottom = 0;\n }\n afterSetDimensions() {\n call(this.options.afterSetDimensions, [this]);\n }\n\n _callHooks(name) {\n this.chart.notifyPlugins(name, this.getContext());\n call(this.options[name], [this]);\n }\n\n // Data limits\n beforeDataLimits() {\n this._callHooks('beforeDataLimits');\n }\n determineDataLimits() {}\n afterDataLimits() {\n this._callHooks('afterDataLimits');\n }\n\n //\n beforeBuildTicks() {\n this._callHooks('beforeBuildTicks');\n }\n /**\n\t * @return {object[]} the ticks\n\t */\n buildTicks() {\n return [];\n }\n afterBuildTicks() {\n this._callHooks('afterBuildTicks');\n }\n\n beforeTickToLabelConversion() {\n call(this.options.beforeTickToLabelConversion, [this]);\n }\n /**\n\t * Convert ticks to label strings\n\t * @param {Tick[]} ticks\n\t */\n generateTickLabels(ticks) {\n const tickOpts = this.options.ticks;\n let i, ilen, tick;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n tick = ticks[i];\n tick.label = call(tickOpts.callback, [tick.value, i, ticks], this);\n }\n }\n afterTickToLabelConversion() {\n call(this.options.afterTickToLabelConversion, [this]);\n }\n\n //\n\n beforeCalculateLabelRotation() {\n call(this.options.beforeCalculateLabelRotation, [this]);\n }\n calculateLabelRotation() {\n const options = this.options;\n const tickOpts = options.ticks;\n const numTicks = getTicksLimit(this.ticks.length, options.ticks.maxTicksLimit);\n const minRotation = tickOpts.minRotation || 0;\n const maxRotation = tickOpts.maxRotation;\n let labelRotation = minRotation;\n let tickWidth, maxHeight, maxLabelDiagonal;\n\n if (!this._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !this.isHorizontal()) {\n this.labelRotation = minRotation;\n return;\n }\n\n const labelSizes = this._getLabelSizes();\n const maxLabelWidth = labelSizes.widest.width;\n const maxLabelHeight = labelSizes.highest.height;\n\n // Estimate the width of each grid based on the canvas width, the maximum\n // label width and the number of tick intervals\n const maxWidth = _limitValue(this.chart.width - maxLabelWidth, 0, this.maxWidth);\n tickWidth = options.offset ? this.maxWidth / numTicks : maxWidth / (numTicks - 1);\n\n // Allow 3 pixels x2 padding either side for label readability\n if (maxLabelWidth + 6 > tickWidth) {\n tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1));\n maxHeight = this.maxHeight - getTickMarkLength(options.grid)\n\t\t\t\t- tickOpts.padding - getTitleHeight(options.title, this.chart.options.font);\n maxLabelDiagonal = Math.sqrt(maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight);\n labelRotation = toDegrees(Math.min(\n Math.asin(_limitValue((labelSizes.highest.height + 6) / tickWidth, -1, 1)),\n Math.asin(_limitValue(maxHeight / maxLabelDiagonal, -1, 1)) - Math.asin(_limitValue(maxLabelHeight / maxLabelDiagonal, -1, 1))\n ));\n labelRotation = Math.max(minRotation, Math.min(maxRotation, labelRotation));\n }\n\n this.labelRotation = labelRotation;\n }\n afterCalculateLabelRotation() {\n call(this.options.afterCalculateLabelRotation, [this]);\n }\n afterAutoSkip() {}\n\n //\n\n beforeFit() {\n call(this.options.beforeFit, [this]);\n }\n fit() {\n // Reset\n const minSize = {\n width: 0,\n height: 0\n };\n\n const {chart, options: {ticks: tickOpts, title: titleOpts, grid: gridOpts}} = this;\n const display = this._isVisible();\n const isHorizontal = this.isHorizontal();\n\n if (display) {\n const titleHeight = getTitleHeight(titleOpts, chart.options.font);\n if (isHorizontal) {\n minSize.width = this.maxWidth;\n minSize.height = getTickMarkLength(gridOpts) + titleHeight;\n } else {\n minSize.height = this.maxHeight; // fill all the height\n minSize.width = getTickMarkLength(gridOpts) + titleHeight;\n }\n\n // Don't bother fitting the ticks if we are not showing the labels\n if (tickOpts.display && this.ticks.length) {\n const {first, last, widest, highest} = this._getLabelSizes();\n const tickPadding = tickOpts.padding * 2;\n const angleRadians = toRadians(this.labelRotation);\n const cos = Math.cos(angleRadians);\n const sin = Math.sin(angleRadians);\n\n if (isHorizontal) {\n // A horizontal axis is more constrained by the height.\n const labelHeight = tickOpts.mirror ? 0 : sin * widest.width + cos * highest.height;\n minSize.height = Math.min(this.maxHeight, minSize.height + labelHeight + tickPadding);\n } else {\n // A vertical axis is more constrained by the width. Labels are the\n // dominant factor here, so get that length first and account for padding\n const labelWidth = tickOpts.mirror ? 0 : cos * widest.width + sin * highest.height;\n\n minSize.width = Math.min(this.maxWidth, minSize.width + labelWidth + tickPadding);\n }\n this._calculatePadding(first, last, sin, cos);\n }\n }\n\n this._handleMargins();\n\n if (isHorizontal) {\n this.width = this._length = chart.width - this._margins.left - this._margins.right;\n this.height = minSize.height;\n } else {\n this.width = minSize.width;\n this.height = this._length = chart.height - this._margins.top - this._margins.bottom;\n }\n }\n\n _calculatePadding(first, last, sin, cos) {\n const {ticks: {align, padding}, position} = this.options;\n const isRotated = this.labelRotation !== 0;\n const labelsBelowTicks = position !== 'top' && this.axis === 'x';\n\n if (this.isHorizontal()) {\n const offsetLeft = this.getPixelForTick(0) - this.left;\n const offsetRight = this.right - this.getPixelForTick(this.ticks.length - 1);\n let paddingLeft = 0;\n let paddingRight = 0;\n\n // Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned\n // which means that the right padding is dominated by the font height\n if (isRotated) {\n if (labelsBelowTicks) {\n paddingLeft = cos * first.width;\n paddingRight = sin * last.height;\n } else {\n paddingLeft = sin * first.height;\n paddingRight = cos * last.width;\n }\n } else if (align === 'start') {\n paddingRight = last.width;\n } else if (align === 'end') {\n paddingLeft = first.width;\n } else if (align !== 'inner') {\n paddingLeft = first.width / 2;\n paddingRight = last.width / 2;\n }\n\n // Adjust padding taking into account changes in offsets\n this.paddingLeft = Math.max((paddingLeft - offsetLeft + padding) * this.width / (this.width - offsetLeft), 0);\n this.paddingRight = Math.max((paddingRight - offsetRight + padding) * this.width / (this.width - offsetRight), 0);\n } else {\n let paddingTop = last.height / 2;\n let paddingBottom = first.height / 2;\n\n if (align === 'start') {\n paddingTop = 0;\n paddingBottom = first.height;\n } else if (align === 'end') {\n paddingTop = last.height;\n paddingBottom = 0;\n }\n\n this.paddingTop = paddingTop + padding;\n this.paddingBottom = paddingBottom + padding;\n }\n }\n\n /**\n\t * Handle margins and padding interactions\n\t * @private\n\t */\n _handleMargins() {\n if (this._margins) {\n this._margins.left = Math.max(this.paddingLeft, this._margins.left);\n this._margins.top = Math.max(this.paddingTop, this._margins.top);\n this._margins.right = Math.max(this.paddingRight, this._margins.right);\n this._margins.bottom = Math.max(this.paddingBottom, this._margins.bottom);\n }\n }\n\n afterFit() {\n call(this.options.afterFit, [this]);\n }\n\n // Shared Methods\n /**\n\t * @return {boolean}\n\t */\n isHorizontal() {\n const {axis, position} = this.options;\n return position === 'top' || position === 'bottom' || axis === 'x';\n }\n /**\n\t * @return {boolean}\n\t */\n isFullSize() {\n return this.options.fullSize;\n }\n\n /**\n\t * @param {Tick[]} ticks\n\t * @private\n\t */\n _convertTicksToLabels(ticks) {\n this.beforeTickToLabelConversion();\n\n this.generateTickLabels(ticks);\n\n // Ticks should be skipped when callback returns null or undef, so lets remove those.\n let i, ilen;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n if (isNullOrUndef(ticks[i].label)) {\n ticks.splice(i, 1);\n ilen--;\n i--;\n }\n }\n\n this.afterTickToLabelConversion();\n }\n\n /**\n\t * @return {{ first: object, last: object, widest: object, highest: object, widths: Array, heights: array }}\n\t * @private\n\t */\n _getLabelSizes() {\n let labelSizes = this._labelSizes;\n\n if (!labelSizes) {\n const sampleSize = this.options.ticks.sampleSize;\n let ticks = this.ticks;\n if (sampleSize < ticks.length) {\n ticks = sample(ticks, sampleSize);\n }\n\n this._labelSizes = labelSizes = this._computeLabelSizes(ticks, ticks.length, this.options.ticks.maxTicksLimit);\n }\n\n return labelSizes;\n }\n\n /**\n\t * Returns {width, height, offset} objects for the first, last, widest, highest tick\n\t * labels where offset indicates the anchor point offset from the top in pixels.\n\t * @return {{ first: object, last: object, widest: object, highest: object, widths: Array, heights: array }}\n\t * @private\n\t */\n _computeLabelSizes(ticks, length, maxTicksLimit) {\n const {ctx, _longestTextCache: caches} = this;\n const widths = [];\n const heights = [];\n const increment = Math.floor(length / getTicksLimit(length, maxTicksLimit));\n let widestLabelSize = 0;\n let highestLabelSize = 0;\n let i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel;\n\n for (i = 0; i < length; i += increment) {\n label = ticks[i].label;\n tickFont = this._resolveTickFontOptions(i);\n ctx.font = fontString = tickFont.string;\n cache = caches[fontString] = caches[fontString] || {data: {}, gc: []};\n lineHeight = tickFont.lineHeight;\n width = height = 0;\n // Undefined labels and arrays should not be measured\n if (!isNullOrUndef(label) && !isArray(label)) {\n width = _measureText(ctx, cache.data, cache.gc, width, label);\n height = lineHeight;\n } else if (isArray(label)) {\n // if it is an array let's measure each element\n for (j = 0, jlen = label.length; j < jlen; ++j) {\n nestedLabel = /** @type {string} */ (label[j]);\n // Undefined labels and arrays should not be measured\n if (!isNullOrUndef(nestedLabel) && !isArray(nestedLabel)) {\n width = _measureText(ctx, cache.data, cache.gc, width, nestedLabel);\n height += lineHeight;\n }\n }\n }\n widths.push(width);\n heights.push(height);\n widestLabelSize = Math.max(width, widestLabelSize);\n highestLabelSize = Math.max(height, highestLabelSize);\n }\n garbageCollect(caches, length);\n\n const widest = widths.indexOf(widestLabelSize);\n const highest = heights.indexOf(highestLabelSize);\n\n const valueAt = (idx) => ({width: widths[idx] || 0, height: heights[idx] || 0});\n\n return {\n first: valueAt(0),\n last: valueAt(length - 1),\n widest: valueAt(widest),\n highest: valueAt(highest),\n widths,\n heights,\n };\n }\n\n /**\n\t * Used to get the label to display in the tooltip for the given value\n\t * @param {*} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n return value;\n }\n\n /**\n\t * Returns the location of the given data point. Value can either be an index or a numerical value\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {*} value\n\t * @param {number} [index]\n\t * @return {number}\n\t */\n getPixelForValue(value, index) { // eslint-disable-line no-unused-vars\n return NaN;\n }\n\n /**\n\t * Used to get the data value from a given pixel. This is the inverse of getPixelForValue\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} pixel\n\t * @return {*}\n\t */\n getValueForPixel(pixel) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Returns the location of the tick at the given index\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} index\n\t * @return {number}\n\t */\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n\n /**\n\t * Utility for getting the pixel location of a percentage of scale\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} decimal\n\t * @return {number}\n\t */\n getPixelForDecimal(decimal) {\n if (this._reversePixels) {\n decimal = 1 - decimal;\n }\n\n const pixel = this._startPixel + decimal * this._length;\n return _int16Range(this._alignToPixels ? _alignPixel(this.chart, pixel, 0) : pixel);\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getDecimalForPixel(pixel) {\n const decimal = (pixel - this._startPixel) / this._length;\n return this._reversePixels ? 1 - decimal : decimal;\n }\n\n /**\n\t * Returns the pixel for the minimum chart value\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @return {number}\n\t */\n getBasePixel() {\n return this.getPixelForValue(this.getBaseValue());\n }\n\n /**\n\t * @return {number}\n\t */\n getBaseValue() {\n const {min, max} = this;\n\n return min < 0 && max < 0 ? max :\n min > 0 && max > 0 ? min :\n 0;\n }\n\n /**\n\t * @protected\n\t */\n getContext(index) {\n const ticks = this.ticks || [];\n\n if (index >= 0 && index < ticks.length) {\n const tick = ticks[index];\n return tick.$context ||\n\t\t\t\t(tick.$context = createTickContext(this.getContext(), index, tick));\n }\n return this.$context ||\n\t\t\t(this.$context = createScaleContext(this.chart.getContext(), this));\n }\n\n /**\n\t * @return {number}\n\t * @private\n\t */\n _tickSize() {\n const optionTicks = this.options.ticks;\n\n // Calculate space needed by label in axis direction.\n const rot = toRadians(this.labelRotation);\n const cos = Math.abs(Math.cos(rot));\n const sin = Math.abs(Math.sin(rot));\n\n const labelSizes = this._getLabelSizes();\n const padding = optionTicks.autoSkipPadding || 0;\n const w = labelSizes ? labelSizes.widest.width + padding : 0;\n const h = labelSizes ? labelSizes.highest.height + padding : 0;\n\n // Calculate space needed for 1 tick in axis direction.\n return this.isHorizontal()\n ? h * cos > w * sin ? w / cos : h / sin\n : h * sin < w * cos ? h / cos : w / sin;\n }\n\n /**\n\t * @return {boolean}\n\t * @private\n\t */\n _isVisible() {\n const display = this.options.display;\n\n if (display !== 'auto') {\n return !!display;\n }\n\n return this.getMatchingVisibleMetas().length > 0;\n }\n\n /**\n\t * @private\n\t */\n _computeGridLineItems(chartArea) {\n const axis = this.axis;\n const chart = this.chart;\n const options = this.options;\n const {grid, position, border} = options;\n const offset = grid.offset;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const ticksLength = ticks.length + (offset ? 1 : 0);\n const tl = getTickMarkLength(grid);\n const items = [];\n\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = borderOpts.display ? borderOpts.width : 0;\n const axisHalfWidth = axisWidth / 2;\n const alignBorderValue = function(pixel) {\n return _alignPixel(chart, pixel, axisWidth);\n };\n let borderValue, i, lineValue, alignedLineValue;\n let tx1, ty1, tx2, ty2, x1, y1, x2, y2;\n\n if (position === 'top') {\n borderValue = alignBorderValue(this.bottom);\n ty1 = this.bottom - tl;\n ty2 = borderValue - axisHalfWidth;\n y1 = alignBorderValue(chartArea.top) + axisHalfWidth;\n y2 = chartArea.bottom;\n } else if (position === 'bottom') {\n borderValue = alignBorderValue(this.top);\n y1 = chartArea.top;\n y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth;\n ty1 = borderValue + axisHalfWidth;\n ty2 = this.top + tl;\n } else if (position === 'left') {\n borderValue = alignBorderValue(this.right);\n tx1 = this.right - tl;\n tx2 = borderValue - axisHalfWidth;\n x1 = alignBorderValue(chartArea.left) + axisHalfWidth;\n x2 = chartArea.right;\n } else if (position === 'right') {\n borderValue = alignBorderValue(this.left);\n x1 = chartArea.left;\n x2 = alignBorderValue(chartArea.right) - axisHalfWidth;\n tx1 = borderValue + axisHalfWidth;\n tx2 = this.left + tl;\n } else if (axis === 'x') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.top + chartArea.bottom) / 2 + 0.5);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n\n y1 = chartArea.top;\n y2 = chartArea.bottom;\n ty1 = borderValue + axisHalfWidth;\n ty2 = ty1 + tl;\n } else if (axis === 'y') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.left + chartArea.right) / 2);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n\n tx1 = borderValue - axisHalfWidth;\n tx2 = tx1 - tl;\n x1 = chartArea.left;\n x2 = chartArea.right;\n }\n\n const limit = valueOrDefault(options.ticks.maxTicksLimit, ticksLength);\n const step = Math.max(1, Math.ceil(ticksLength / limit));\n for (i = 0; i < ticksLength; i += step) {\n const context = this.getContext(i);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n\n const lineWidth = optsAtIndex.lineWidth;\n const lineColor = optsAtIndex.color;\n const borderDash = optsAtIndexBorder.dash || [];\n const borderDashOffset = optsAtIndexBorder.dashOffset;\n\n const tickWidth = optsAtIndex.tickWidth;\n const tickColor = optsAtIndex.tickColor;\n const tickBorderDash = optsAtIndex.tickBorderDash || [];\n const tickBorderDashOffset = optsAtIndex.tickBorderDashOffset;\n\n lineValue = getPixelForGridLine(this, i, offset);\n\n // Skip if the pixel is out of the range\n if (lineValue === undefined) {\n continue;\n }\n\n alignedLineValue = _alignPixel(chart, lineValue, lineWidth);\n\n if (isHorizontal) {\n tx1 = tx2 = x1 = x2 = alignedLineValue;\n } else {\n ty1 = ty2 = y1 = y2 = alignedLineValue;\n }\n\n items.push({\n tx1,\n ty1,\n tx2,\n ty2,\n x1,\n y1,\n x2,\n y2,\n width: lineWidth,\n color: lineColor,\n borderDash,\n borderDashOffset,\n tickWidth,\n tickColor,\n tickBorderDash,\n tickBorderDashOffset,\n });\n }\n\n this._ticksLength = ticksLength;\n this._borderValue = borderValue;\n\n return items;\n }\n\n /**\n\t * @private\n\t */\n _computeLabelItems(chartArea) {\n const axis = this.axis;\n const options = this.options;\n const {position, ticks: optionTicks} = options;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const {align, crossAlign, padding, mirror} = optionTicks;\n const tl = getTickMarkLength(options.grid);\n const tickAndPadding = tl + padding;\n const hTickAndPadding = mirror ? -padding : tickAndPadding;\n const rotation = -toRadians(this.labelRotation);\n const items = [];\n let i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset;\n let textBaseline = 'middle';\n\n if (position === 'top') {\n y = this.bottom - hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'bottom') {\n y = this.top + hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'left') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (position === 'right') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (axis === 'x') {\n if (position === 'center') {\n y = ((chartArea.top + chartArea.bottom) / 2) + tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n y = this.chart.scales[positionAxisID].getPixelForValue(value) + tickAndPadding;\n }\n textAlign = this._getXAxisLabelAlignment();\n } else if (axis === 'y') {\n if (position === 'center') {\n x = ((chartArea.left + chartArea.right) / 2) - tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n x = this.chart.scales[positionAxisID].getPixelForValue(value);\n }\n textAlign = this._getYAxisLabelAlignment(tl).textAlign;\n }\n\n if (axis === 'y') {\n if (align === 'start') {\n textBaseline = 'top';\n } else if (align === 'end') {\n textBaseline = 'bottom';\n }\n }\n\n const labelSizes = this._getLabelSizes();\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n tick = ticks[i];\n label = tick.label;\n\n const optsAtIndex = optionTicks.setContext(this.getContext(i));\n pixel = this.getPixelForTick(i) + optionTicks.labelOffset;\n font = this._resolveTickFontOptions(i);\n lineHeight = font.lineHeight;\n lineCount = isArray(label) ? label.length : 1;\n const halfCount = lineCount / 2;\n const color = optsAtIndex.color;\n const strokeColor = optsAtIndex.textStrokeColor;\n const strokeWidth = optsAtIndex.textStrokeWidth;\n let tickTextAlign = textAlign;\n\n if (isHorizontal) {\n x = pixel;\n\n if (textAlign === 'inner') {\n if (i === ilen - 1) {\n tickTextAlign = !this.options.reverse ? 'right' : 'left';\n } else if (i === 0) {\n tickTextAlign = !this.options.reverse ? 'left' : 'right';\n } else {\n tickTextAlign = 'center';\n }\n }\n\n if (position === 'top') {\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = -lineCount * lineHeight + lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = -labelSizes.highest.height / 2 - halfCount * lineHeight + lineHeight;\n } else {\n textOffset = -labelSizes.highest.height + lineHeight / 2;\n }\n } else {\n // eslint-disable-next-line no-lonely-if\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = labelSizes.highest.height / 2 - halfCount * lineHeight;\n } else {\n textOffset = labelSizes.highest.height - lineCount * lineHeight;\n }\n }\n if (mirror) {\n textOffset *= -1;\n }\n if (rotation !== 0 && !optsAtIndex.showLabelBackdrop) {\n x += (lineHeight / 2) * Math.sin(rotation);\n }\n } else {\n y = pixel;\n textOffset = (1 - lineCount) * lineHeight / 2;\n }\n\n let backdrop;\n\n if (optsAtIndex.showLabelBackdrop) {\n const labelPadding = toPadding(optsAtIndex.backdropPadding);\n const height = labelSizes.heights[i];\n const width = labelSizes.widths[i];\n\n let top = textOffset - labelPadding.top;\n let left = 0 - labelPadding.left;\n\n switch (textBaseline) {\n case 'middle':\n top -= height / 2;\n break;\n case 'bottom':\n top -= height;\n break;\n default:\n break;\n }\n\n switch (textAlign) {\n case 'center':\n left -= width / 2;\n break;\n case 'right':\n left -= width;\n break;\n case 'inner':\n if (i === ilen - 1) {\n left -= width;\n } else if (i > 0) {\n left -= width / 2;\n }\n break;\n default:\n break;\n }\n\n backdrop = {\n left,\n top,\n width: width + labelPadding.width,\n height: height + labelPadding.height,\n\n color: optsAtIndex.backdropColor,\n };\n }\n\n items.push({\n label,\n font,\n textOffset,\n options: {\n rotation,\n color,\n strokeColor,\n strokeWidth,\n textAlign: tickTextAlign,\n textBaseline,\n translation: [x, y],\n backdrop,\n }\n });\n }\n\n return items;\n }\n\n _getXAxisLabelAlignment() {\n const {position, ticks} = this.options;\n const rotation = -toRadians(this.labelRotation);\n\n if (rotation) {\n return position === 'top' ? 'left' : 'right';\n }\n\n let align = 'center';\n\n if (ticks.align === 'start') {\n align = 'left';\n } else if (ticks.align === 'end') {\n align = 'right';\n } else if (ticks.align === 'inner') {\n align = 'inner';\n }\n\n return align;\n }\n\n _getYAxisLabelAlignment(tl) {\n const {position, ticks: {crossAlign, mirror, padding}} = this.options;\n const labelSizes = this._getLabelSizes();\n const tickAndPadding = tl + padding;\n const widest = labelSizes.widest.width;\n\n let textAlign;\n let x;\n\n if (position === 'left') {\n if (mirror) {\n x = this.right + padding;\n\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += (widest / 2);\n } else {\n textAlign = 'right';\n x += widest;\n }\n } else {\n x = this.right - tickAndPadding;\n\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= (widest / 2);\n } else {\n textAlign = 'left';\n x = this.left;\n }\n }\n } else if (position === 'right') {\n if (mirror) {\n x = this.left + padding;\n\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= (widest / 2);\n } else {\n textAlign = 'left';\n x -= widest;\n }\n } else {\n x = this.left + tickAndPadding;\n\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += widest / 2;\n } else {\n textAlign = 'right';\n x = this.right;\n }\n }\n } else {\n textAlign = 'right';\n }\n\n return {textAlign, x};\n }\n\n /**\n\t * @private\n\t */\n _computeLabelArea() {\n if (this.options.ticks.mirror) {\n return;\n }\n\n const chart = this.chart;\n const position = this.options.position;\n\n if (position === 'left' || position === 'right') {\n return {top: 0, left: this.left, bottom: chart.height, right: this.right};\n } if (position === 'top' || position === 'bottom') {\n return {top: this.top, left: 0, bottom: this.bottom, right: chart.width};\n }\n }\n\n /**\n * @protected\n */\n drawBackground() {\n const {ctx, options: {backgroundColor}, left, top, width, height} = this;\n if (backgroundColor) {\n ctx.save();\n ctx.fillStyle = backgroundColor;\n ctx.fillRect(left, top, width, height);\n ctx.restore();\n }\n }\n\n getLineWidthForValue(value) {\n const grid = this.options.grid;\n if (!this._isVisible() || !grid.display) {\n return 0;\n }\n const ticks = this.ticks;\n const index = ticks.findIndex(t => t.value === value);\n if (index >= 0) {\n const opts = grid.setContext(this.getContext(index));\n return opts.lineWidth;\n }\n return 0;\n }\n\n /**\n\t * @protected\n\t */\n drawGrid(chartArea) {\n const grid = this.options.grid;\n const ctx = this.ctx;\n const items = this._gridLineItems || (this._gridLineItems = this._computeGridLineItems(chartArea));\n let i, ilen;\n\n const drawLine = (p1, p2, style) => {\n if (!style.width || !style.color) {\n return;\n }\n ctx.save();\n ctx.lineWidth = style.width;\n ctx.strokeStyle = style.color;\n ctx.setLineDash(style.borderDash || []);\n ctx.lineDashOffset = style.borderDashOffset;\n\n ctx.beginPath();\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n ctx.stroke();\n ctx.restore();\n };\n\n if (grid.display) {\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n const item = items[i];\n\n if (grid.drawOnChartArea) {\n drawLine(\n {x: item.x1, y: item.y1},\n {x: item.x2, y: item.y2},\n item\n );\n }\n\n if (grid.drawTicks) {\n drawLine(\n {x: item.tx1, y: item.ty1},\n {x: item.tx2, y: item.ty2},\n {\n color: item.tickColor,\n width: item.tickWidth,\n borderDash: item.tickBorderDash,\n borderDashOffset: item.tickBorderDashOffset\n }\n );\n }\n }\n }\n }\n\n /**\n\t * @protected\n\t */\n drawBorder() {\n const {chart, ctx, options: {border, grid}} = this;\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = border.display ? borderOpts.width : 0;\n if (!axisWidth) {\n return;\n }\n const lastLineWidth = grid.setContext(this.getContext(0)).lineWidth;\n const borderValue = this._borderValue;\n let x1, x2, y1, y2;\n\n if (this.isHorizontal()) {\n x1 = _alignPixel(chart, this.left, axisWidth) - axisWidth / 2;\n x2 = _alignPixel(chart, this.right, lastLineWidth) + lastLineWidth / 2;\n y1 = y2 = borderValue;\n } else {\n y1 = _alignPixel(chart, this.top, axisWidth) - axisWidth / 2;\n y2 = _alignPixel(chart, this.bottom, lastLineWidth) + lastLineWidth / 2;\n x1 = x2 = borderValue;\n }\n ctx.save();\n ctx.lineWidth = borderOpts.width;\n ctx.strokeStyle = borderOpts.color;\n\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n\n ctx.restore();\n }\n\n /**\n\t * @protected\n\t */\n drawLabels(chartArea) {\n const optionTicks = this.options.ticks;\n\n if (!optionTicks.display) {\n return;\n }\n\n const ctx = this.ctx;\n\n const area = this._computeLabelArea();\n if (area) {\n clipArea(ctx, area);\n }\n\n const items = this.getLabelItems(chartArea);\n for (const item of items) {\n const renderTextOptions = item.options;\n const tickFont = item.font;\n const label = item.label;\n const y = item.textOffset;\n renderText(ctx, label, 0, y, tickFont, renderTextOptions);\n }\n\n if (area) {\n unclipArea(ctx);\n }\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {\n const {ctx, options: {position, title, reverse}} = this;\n\n if (!title.display) {\n return;\n }\n\n const font = toFont(title.font);\n const padding = toPadding(title.padding);\n const align = title.align;\n let offset = font.lineHeight / 2;\n\n if (position === 'bottom' || position === 'center' || isObject(position)) {\n offset += padding.bottom;\n if (isArray(title.text)) {\n offset += font.lineHeight * (title.text.length - 1);\n }\n } else {\n offset += padding.top;\n }\n\n const {titleX, titleY, maxWidth, rotation} = titleArgs(this, offset, position, align);\n\n renderText(ctx, title.text, 0, 0, font, {\n color: title.color,\n maxWidth,\n rotation,\n textAlign: titleAlign(align, position, reverse),\n textBaseline: 'middle',\n translation: [titleX, titleY],\n });\n }\n\n draw(chartArea) {\n if (!this._isVisible()) {\n return;\n }\n\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawBorder();\n this.drawTitle();\n this.drawLabels(chartArea);\n }\n\n /**\n\t * @return {object[]}\n\t * @private\n\t */\n _layers() {\n const opts = this.options;\n const tz = opts.ticks && opts.ticks.z || 0;\n const gz = valueOrDefault(opts.grid && opts.grid.z, -1);\n const bz = valueOrDefault(opts.border && opts.border.z, 0);\n\n if (!this._isVisible() || this.draw !== Scale.prototype.draw) {\n // backward compatibility: draw has been overridden by custom scale\n return [{\n z: tz,\n draw: (chartArea) => {\n this.draw(chartArea);\n }\n }];\n }\n\n return [{\n z: gz,\n draw: (chartArea) => {\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawTitle();\n }\n }, {\n z: bz,\n draw: () => {\n this.drawBorder();\n }\n }, {\n z: tz,\n draw: (chartArea) => {\n this.drawLabels(chartArea);\n }\n }];\n }\n\n /**\n\t * Returns visible dataset metas that are attached to this scale\n\t * @param {string} [type] - if specified, also filter by dataset type\n\t * @return {object[]}\n\t */\n getMatchingVisibleMetas(type) {\n const metas = this.chart.getSortedVisibleDatasetMetas();\n const axisID = this.axis + 'AxisID';\n const result = [];\n let i, ilen;\n\n for (i = 0, ilen = metas.length; i < ilen; ++i) {\n const meta = metas[i];\n if (meta[axisID] === this.id && (!type || meta.type === type)) {\n result.push(meta);\n }\n }\n return result;\n }\n\n /**\n\t * @param {number} index\n\t * @return {object}\n\t * @protected\n \t */\n _resolveTickFontOptions(index) {\n const opts = this.options.ticks.setContext(this.getContext(index));\n return toFont(opts.font);\n }\n\n /**\n * @protected\n */\n _maxDigits() {\n const fontSize = this._resolveTickFontOptions(0).lineHeight;\n return (this.isHorizontal() ? this.width : this.height) / fontSize;\n }\n}\n","import {merge} from '../helpers/index.js';\nimport defaults, {overrides} from './core.defaults.js';\n\n/**\n * @typedef {{id: string, defaults: any, overrides?: any, defaultRoutes: any}} IChartComponent\n */\n\nexport default class TypedRegistry {\n constructor(type, scope, override) {\n this.type = type;\n this.scope = scope;\n this.override = override;\n this.items = Object.create(null);\n }\n\n isForType(type) {\n return Object.prototype.isPrototypeOf.call(this.type.prototype, type.prototype);\n }\n\n /**\n\t * @param {IChartComponent} item\n\t * @returns {string} The scope where items defaults were registered to.\n\t */\n register(item) {\n const proto = Object.getPrototypeOf(item);\n let parentScope;\n\n if (isIChartComponent(proto)) {\n // Make sure the parent is registered and note the scope where its defaults are.\n parentScope = this.register(proto);\n }\n\n const items = this.items;\n const id = item.id;\n const scope = this.scope + '.' + id;\n\n if (!id) {\n throw new Error('class does not have id: ' + item);\n }\n\n if (id in items) {\n // already registered\n return scope;\n }\n\n items[id] = item;\n registerDefaults(item, scope, parentScope);\n if (this.override) {\n defaults.override(item.id, item.overrides);\n }\n\n return scope;\n }\n\n /**\n\t * @param {string} id\n\t * @returns {object?}\n\t */\n get(id) {\n return this.items[id];\n }\n\n /**\n\t * @param {IChartComponent} item\n\t */\n unregister(item) {\n const items = this.items;\n const id = item.id;\n const scope = this.scope;\n\n if (id in items) {\n delete items[id];\n }\n\n if (scope && id in defaults[scope]) {\n delete defaults[scope][id];\n if (this.override) {\n delete overrides[id];\n }\n }\n }\n}\n\nfunction registerDefaults(item, scope, parentScope) {\n // Inherit the parent's defaults and keep existing defaults\n const itemDefaults = merge(Object.create(null), [\n parentScope ? defaults.get(parentScope) : {},\n defaults.get(scope),\n item.defaults\n ]);\n\n defaults.set(scope, itemDefaults);\n\n if (item.defaultRoutes) {\n routeDefaults(scope, item.defaultRoutes);\n }\n\n if (item.descriptors) {\n defaults.describe(scope, item.descriptors);\n }\n}\n\nfunction routeDefaults(scope, routes) {\n Object.keys(routes).forEach(property => {\n const propertyParts = property.split('.');\n const sourceName = propertyParts.pop();\n const sourceScope = [scope].concat(propertyParts).join('.');\n const parts = routes[property].split('.');\n const targetName = parts.pop();\n const targetScope = parts.join('.');\n defaults.route(sourceScope, sourceName, targetScope, targetName);\n });\n}\n\nfunction isIChartComponent(proto) {\n return 'id' in proto && 'defaults' in proto;\n}\n","import DatasetController from './core.datasetController.js';\nimport Element from './core.element.js';\nimport Scale from './core.scale.js';\nimport TypedRegistry from './core.typedRegistry.js';\nimport {each, callback as call, _capitalize} from '../helpers/helpers.core.js';\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is exported for typedoc\n */\nexport class Registry {\n constructor() {\n this.controllers = new TypedRegistry(DatasetController, 'datasets', true);\n this.elements = new TypedRegistry(Element, 'elements');\n this.plugins = new TypedRegistry(Object, 'plugins');\n this.scales = new TypedRegistry(Scale, 'scales');\n // Order is important, Scale has Element in prototype chain,\n // so Scales must be before Elements. Plugins are a fallback, so not listed here.\n this._typedRegistries = [this.controllers, this.scales, this.elements];\n }\n\n /**\n\t * @param {...any} args\n\t */\n add(...args) {\n this._each('register', args);\n }\n\n remove(...args) {\n this._each('unregister', args);\n }\n\n /**\n\t * @param {...typeof DatasetController} args\n\t */\n addControllers(...args) {\n this._each('register', args, this.controllers);\n }\n\n /**\n\t * @param {...typeof Element} args\n\t */\n addElements(...args) {\n this._each('register', args, this.elements);\n }\n\n /**\n\t * @param {...any} args\n\t */\n addPlugins(...args) {\n this._each('register', args, this.plugins);\n }\n\n /**\n\t * @param {...typeof Scale} args\n\t */\n addScales(...args) {\n this._each('register', args, this.scales);\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof DatasetController}\n\t */\n getController(id) {\n return this._get(id, this.controllers, 'controller');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof Element}\n\t */\n getElement(id) {\n return this._get(id, this.elements, 'element');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {object}\n\t */\n getPlugin(id) {\n return this._get(id, this.plugins, 'plugin');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof Scale}\n\t */\n getScale(id) {\n return this._get(id, this.scales, 'scale');\n }\n\n /**\n\t * @param {...typeof DatasetController} args\n\t */\n removeControllers(...args) {\n this._each('unregister', args, this.controllers);\n }\n\n /**\n\t * @param {...typeof Element} args\n\t */\n removeElements(...args) {\n this._each('unregister', args, this.elements);\n }\n\n /**\n\t * @param {...any} args\n\t */\n removePlugins(...args) {\n this._each('unregister', args, this.plugins);\n }\n\n /**\n\t * @param {...typeof Scale} args\n\t */\n removeScales(...args) {\n this._each('unregister', args, this.scales);\n }\n\n /**\n\t * @private\n\t */\n _each(method, args, typedRegistry) {\n [...args].forEach(arg => {\n const reg = typedRegistry || this._getRegistryForType(arg);\n if (typedRegistry || reg.isForType(arg) || (reg === this.plugins && arg.id)) {\n this._exec(method, reg, arg);\n } else {\n // Handle loopable args\n // Use case:\n // import * as plugins from './plugins.js';\n // Chart.register(plugins);\n each(arg, item => {\n // If there are mixed types in the loopable, make sure those are\n // registered in correct registry\n // Use case: (treemap exporting controller, elements etc)\n // import * as treemap from 'chartjs-chart-treemap.js';\n // Chart.register(treemap);\n\n const itemReg = typedRegistry || this._getRegistryForType(item);\n this._exec(method, itemReg, item);\n });\n }\n });\n }\n\n /**\n\t * @private\n\t */\n _exec(method, registry, component) {\n const camelMethod = _capitalize(method);\n call(component['before' + camelMethod], [], component); // beforeRegister / beforeUnregister\n registry[method](component);\n call(component['after' + camelMethod], [], component); // afterRegister / afterUnregister\n }\n\n /**\n\t * @private\n\t */\n _getRegistryForType(type) {\n for (let i = 0; i < this._typedRegistries.length; i++) {\n const reg = this._typedRegistries[i];\n if (reg.isForType(type)) {\n return reg;\n }\n }\n // plugins is the fallback registry\n return this.plugins;\n }\n\n /**\n\t * @private\n\t */\n _get(id, typedRegistry, type) {\n const item = typedRegistry.get(id);\n if (item === undefined) {\n throw new Error('\"' + id + '\" is not a registered ' + type + '.');\n }\n return item;\n }\n\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Registry();\n","import registry from './core.registry.js';\nimport {callback as callCallback, isNullOrUndef, valueOrDefault} from '../helpers/helpers.core.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../plugins/plugin.tooltip.js').default } Tooltip\n */\n\n/**\n * @callback filterCallback\n * @param {{plugin: object, options: object}} value\n * @param {number} [index]\n * @param {array} [array]\n * @param {object} [thisArg]\n * @return {boolean}\n */\n\n\nexport default class PluginService {\n constructor() {\n this._init = [];\n }\n\n /**\n\t * Calls enabled plugins for `chart` on the specified hook and with the given args.\n\t * This method immediately returns as soon as a plugin explicitly returns false. The\n\t * returned value can be used, for instance, to interrupt the current action.\n\t * @param {Chart} chart - The chart instance for which plugins should be called.\n\t * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n\t * @param {object} [args] - Extra arguments to apply to the hook call.\n * @param {filterCallback} [filter] - Filtering function for limiting which plugins are notified\n\t * @returns {boolean} false if any of the plugins return false, else returns true.\n\t */\n notify(chart, hook, args, filter) {\n if (hook === 'beforeInit') {\n this._init = this._createDescriptors(chart, true);\n this._notify(this._init, chart, 'install');\n }\n\n const descriptors = filter ? this._descriptors(chart).filter(filter) : this._descriptors(chart);\n const result = this._notify(descriptors, chart, hook, args);\n\n if (hook === 'afterDestroy') {\n this._notify(descriptors, chart, 'stop');\n this._notify(this._init, chart, 'uninstall');\n }\n return result;\n }\n\n /**\n\t * @private\n\t */\n _notify(descriptors, chart, hook, args) {\n args = args || {};\n for (const descriptor of descriptors) {\n const plugin = descriptor.plugin;\n const method = plugin[hook];\n const params = [chart, args, descriptor.options];\n if (callCallback(method, params, plugin) === false && args.cancelable) {\n return false;\n }\n }\n\n return true;\n }\n\n invalidate() {\n // When plugins are registered, there is the possibility of a double\n // invalidate situation. In this case, we only want to invalidate once.\n // If we invalidate multiple times, the `_oldCache` is lost and all of the\n // plugins are restarted without being correctly stopped.\n // See https://github.com/chartjs/Chart.js/issues/8147\n if (!isNullOrUndef(this._cache)) {\n this._oldCache = this._cache;\n this._cache = undefined;\n }\n }\n\n /**\n\t * @param {Chart} chart\n\t * @private\n\t */\n _descriptors(chart) {\n if (this._cache) {\n return this._cache;\n }\n\n const descriptors = this._cache = this._createDescriptors(chart);\n\n this._notifyStateChanges(chart);\n\n return descriptors;\n }\n\n _createDescriptors(chart, all) {\n const config = chart && chart.config;\n const options = valueOrDefault(config.options && config.options.plugins, {});\n const plugins = allPlugins(config);\n // options === false => all plugins are disabled\n return options === false && !all ? [] : createDescriptors(chart, plugins, options, all);\n }\n\n /**\n\t * @param {Chart} chart\n\t * @private\n\t */\n _notifyStateChanges(chart) {\n const previousDescriptors = this._oldCache || [];\n const descriptors = this._cache;\n const diff = (a, b) => a.filter(x => !b.some(y => x.plugin.id === y.plugin.id));\n this._notify(diff(previousDescriptors, descriptors), chart, 'stop');\n this._notify(diff(descriptors, previousDescriptors), chart, 'start');\n }\n}\n\n/**\n * @param {import('./core.config.js').default} config\n */\nfunction allPlugins(config) {\n const localIds = {};\n const plugins = [];\n const keys = Object.keys(registry.plugins.items);\n for (let i = 0; i < keys.length; i++) {\n plugins.push(registry.getPlugin(keys[i]));\n }\n\n const local = config.plugins || [];\n for (let i = 0; i < local.length; i++) {\n const plugin = local[i];\n\n if (plugins.indexOf(plugin) === -1) {\n plugins.push(plugin);\n localIds[plugin.id] = true;\n }\n }\n\n return {plugins, localIds};\n}\n\nfunction getOpts(options, all) {\n if (!all && options === false) {\n return null;\n }\n if (options === true) {\n return {};\n }\n return options;\n}\n\nfunction createDescriptors(chart, {plugins, localIds}, options, all) {\n const result = [];\n const context = chart.getContext();\n\n for (const plugin of plugins) {\n const id = plugin.id;\n const opts = getOpts(options[id], all);\n if (opts === null) {\n continue;\n }\n result.push({\n plugin,\n options: pluginOpts(chart.config, {plugin, local: localIds[id]}, opts, context)\n });\n }\n\n return result;\n}\n\nfunction pluginOpts(config, {plugin, local}, opts, context) {\n const keys = config.pluginScopeKeys(plugin);\n const scopes = config.getOptionScopes(opts, keys);\n if (local && plugin.defaults) {\n // make sure plugin defaults are in scopes for local (not registered) plugins\n scopes.push(plugin.defaults);\n }\n return config.createResolver(scopes, context, [''], {\n // These are just defaults that plugins can override\n scriptable: false,\n indexable: false,\n allKeys: true\n });\n}\n","import defaults, {overrides, descriptors} from './core.defaults.js';\nimport {mergeIf, resolveObjectKey, isArray, isFunction, valueOrDefault, isObject} from '../helpers/helpers.core.js';\nimport {_attachContext, _createResolver, _descriptors} from '../helpers/helpers.config.js';\n\nexport function getIndexAxis(type, options) {\n const datasetDefaults = defaults.datasets[type] || {};\n const datasetOptions = (options.datasets || {})[type] || {};\n return datasetOptions.indexAxis || options.indexAxis || datasetDefaults.indexAxis || 'x';\n}\n\nfunction getAxisFromDefaultScaleID(id, indexAxis) {\n let axis = id;\n if (id === '_index_') {\n axis = indexAxis;\n } else if (id === '_value_') {\n axis = indexAxis === 'x' ? 'y' : 'x';\n }\n return axis;\n}\n\nfunction getDefaultScaleIDFromAxis(axis, indexAxis) {\n return axis === indexAxis ? '_index_' : '_value_';\n}\n\nfunction idMatchesAxis(id) {\n if (id === 'x' || id === 'y' || id === 'r') {\n return id;\n }\n}\n\nfunction axisFromPosition(position) {\n if (position === 'top' || position === 'bottom') {\n return 'x';\n }\n if (position === 'left' || position === 'right') {\n return 'y';\n }\n}\n\nexport function determineAxis(id, ...scaleOptions) {\n if (idMatchesAxis(id)) {\n return id;\n }\n for (const opts of scaleOptions) {\n const axis = opts.axis\n || axisFromPosition(opts.position)\n || id.length > 1 && idMatchesAxis(id[0].toLowerCase());\n if (axis) {\n return axis;\n }\n }\n throw new Error(`Cannot determine type of '${id}' axis. Please provide 'axis' or 'position' option.`);\n}\n\nfunction getAxisFromDataset(id, axis, dataset) {\n if (dataset[axis + 'AxisID'] === id) {\n return {axis};\n }\n}\n\nfunction retrieveAxisFromDatasets(id, config) {\n if (config.data && config.data.datasets) {\n const boundDs = config.data.datasets.filter((d) => d.xAxisID === id || d.yAxisID === id);\n if (boundDs.length) {\n return getAxisFromDataset(id, 'x', boundDs[0]) || getAxisFromDataset(id, 'y', boundDs[0]);\n }\n }\n return {};\n}\n\nfunction mergeScaleConfig(config, options) {\n const chartDefaults = overrides[config.type] || {scales: {}};\n const configScales = options.scales || {};\n const chartIndexAxis = getIndexAxis(config.type, options);\n const scales = Object.create(null);\n\n // First figure out first scale id's per axis.\n Object.keys(configScales).forEach(id => {\n const scaleConf = configScales[id];\n if (!isObject(scaleConf)) {\n return console.error(`Invalid scale configuration for scale: ${id}`);\n }\n if (scaleConf._proxy) {\n return console.warn(`Ignoring resolver passed as options for scale: ${id}`);\n }\n const axis = determineAxis(id, scaleConf, retrieveAxisFromDatasets(id, config), defaults.scales[scaleConf.type]);\n const defaultId = getDefaultScaleIDFromAxis(axis, chartIndexAxis);\n const defaultScaleOptions = chartDefaults.scales || {};\n scales[id] = mergeIf(Object.create(null), [{axis}, scaleConf, defaultScaleOptions[axis], defaultScaleOptions[defaultId]]);\n });\n\n // Then merge dataset defaults to scale configs\n config.data.datasets.forEach(dataset => {\n const type = dataset.type || config.type;\n const indexAxis = dataset.indexAxis || getIndexAxis(type, options);\n const datasetDefaults = overrides[type] || {};\n const defaultScaleOptions = datasetDefaults.scales || {};\n Object.keys(defaultScaleOptions).forEach(defaultID => {\n const axis = getAxisFromDefaultScaleID(defaultID, indexAxis);\n const id = dataset[axis + 'AxisID'] || axis;\n scales[id] = scales[id] || Object.create(null);\n mergeIf(scales[id], [{axis}, configScales[id], defaultScaleOptions[defaultID]]);\n });\n });\n\n // apply scale defaults, if not overridden by dataset defaults\n Object.keys(scales).forEach(key => {\n const scale = scales[key];\n mergeIf(scale, [defaults.scales[scale.type], defaults.scale]);\n });\n\n return scales;\n}\n\nfunction initOptions(config) {\n const options = config.options || (config.options = {});\n\n options.plugins = valueOrDefault(options.plugins, {});\n options.scales = mergeScaleConfig(config, options);\n}\n\nfunction initData(data) {\n data = data || {};\n data.datasets = data.datasets || [];\n data.labels = data.labels || [];\n return data;\n}\n\nfunction initConfig(config) {\n config = config || {};\n config.data = initData(config.data);\n\n initOptions(config);\n\n return config;\n}\n\nconst keyCache = new Map();\nconst keysCached = new Set();\n\nfunction cachedKeys(cacheKey, generate) {\n let keys = keyCache.get(cacheKey);\n if (!keys) {\n keys = generate();\n keyCache.set(cacheKey, keys);\n keysCached.add(keys);\n }\n return keys;\n}\n\nconst addIfFound = (set, obj, key) => {\n const opts = resolveObjectKey(obj, key);\n if (opts !== undefined) {\n set.add(opts);\n }\n};\n\nexport default class Config {\n constructor(config) {\n this._config = initConfig(config);\n this._scopeCache = new Map();\n this._resolverCache = new Map();\n }\n\n get platform() {\n return this._config.platform;\n }\n\n get type() {\n return this._config.type;\n }\n\n set type(type) {\n this._config.type = type;\n }\n\n get data() {\n return this._config.data;\n }\n\n set data(data) {\n this._config.data = initData(data);\n }\n\n get options() {\n return this._config.options;\n }\n\n set options(options) {\n this._config.options = options;\n }\n\n get plugins() {\n return this._config.plugins;\n }\n\n update() {\n const config = this._config;\n this.clearCache();\n initOptions(config);\n }\n\n clearCache() {\n this._scopeCache.clear();\n this._resolverCache.clear();\n }\n\n /**\n * Returns the option scope keys for resolving dataset options.\n * These keys do not include the dataset itself, because it is not under options.\n * @param {string} datasetType\n * @return {string[][]}\n */\n datasetScopeKeys(datasetType) {\n return cachedKeys(datasetType,\n () => [[\n `datasets.${datasetType}`,\n ''\n ]]);\n }\n\n /**\n * Returns the option scope keys for resolving dataset animation options.\n * These keys do not include the dataset itself, because it is not under options.\n * @param {string} datasetType\n * @param {string} transition\n * @return {string[][]}\n */\n datasetAnimationScopeKeys(datasetType, transition) {\n return cachedKeys(`${datasetType}.transition.${transition}`,\n () => [\n [\n `datasets.${datasetType}.transitions.${transition}`,\n `transitions.${transition}`,\n ],\n // The following are used for looking up the `animations` and `animation` keys\n [\n `datasets.${datasetType}`,\n ''\n ]\n ]);\n }\n\n /**\n * Returns the options scope keys for resolving element options that belong\n * to an dataset. These keys do not include the dataset itself, because it\n * is not under options.\n * @param {string} datasetType\n * @param {string} elementType\n * @return {string[][]}\n */\n datasetElementScopeKeys(datasetType, elementType) {\n return cachedKeys(`${datasetType}-${elementType}`,\n () => [[\n `datasets.${datasetType}.elements.${elementType}`,\n `datasets.${datasetType}`,\n `elements.${elementType}`,\n ''\n ]]);\n }\n\n /**\n * Returns the options scope keys for resolving plugin options.\n * @param {{id: string, additionalOptionScopes?: string[]}} plugin\n * @return {string[][]}\n */\n pluginScopeKeys(plugin) {\n const id = plugin.id;\n const type = this.type;\n return cachedKeys(`${type}-plugin-${id}`,\n () => [[\n `plugins.${id}`,\n ...plugin.additionalOptionScopes || [],\n ]]);\n }\n\n /**\n * @private\n */\n _cachedScopes(mainScope, resetCache) {\n const _scopeCache = this._scopeCache;\n let cache = _scopeCache.get(mainScope);\n if (!cache || resetCache) {\n cache = new Map();\n _scopeCache.set(mainScope, cache);\n }\n return cache;\n }\n\n /**\n * Resolves the objects from options and defaults for option value resolution.\n * @param {object} mainScope - The main scope object for options\n * @param {string[][]} keyLists - The arrays of keys in resolution order\n * @param {boolean} [resetCache] - reset the cache for this mainScope\n */\n getOptionScopes(mainScope, keyLists, resetCache) {\n const {options, type} = this;\n const cache = this._cachedScopes(mainScope, resetCache);\n const cached = cache.get(keyLists);\n if (cached) {\n return cached;\n }\n\n const scopes = new Set();\n\n keyLists.forEach(keys => {\n if (mainScope) {\n scopes.add(mainScope);\n keys.forEach(key => addIfFound(scopes, mainScope, key));\n }\n keys.forEach(key => addIfFound(scopes, options, key));\n keys.forEach(key => addIfFound(scopes, overrides[type] || {}, key));\n keys.forEach(key => addIfFound(scopes, defaults, key));\n keys.forEach(key => addIfFound(scopes, descriptors, key));\n });\n\n const array = Array.from(scopes);\n if (array.length === 0) {\n array.push(Object.create(null));\n }\n if (keysCached.has(keyLists)) {\n cache.set(keyLists, array);\n }\n return array;\n }\n\n /**\n * Returns the option scopes for resolving chart options\n * @return {object[]}\n */\n chartOptionScopes() {\n const {options, type} = this;\n\n return [\n options,\n overrides[type] || {},\n defaults.datasets[type] || {}, // https://github.com/chartjs/Chart.js/issues/8531\n {type},\n defaults,\n descriptors\n ];\n }\n\n /**\n * @param {object[]} scopes\n * @param {string[]} names\n * @param {function|object} context\n * @param {string[]} [prefixes]\n * @return {object}\n */\n resolveNamedOptions(scopes, names, context, prefixes = ['']) {\n const result = {$shared: true};\n const {resolver, subPrefixes} = getResolver(this._resolverCache, scopes, prefixes);\n let options = resolver;\n if (needContext(resolver, names)) {\n result.$shared = false;\n context = isFunction(context) ? context() : context;\n // subResolver is passed to scriptable options. It should not resolve to hover options.\n const subResolver = this.createResolver(scopes, context, subPrefixes);\n options = _attachContext(resolver, context, subResolver);\n }\n\n for (const prop of names) {\n result[prop] = options[prop];\n }\n return result;\n }\n\n /**\n * @param {object[]} scopes\n * @param {object} [context]\n * @param {string[]} [prefixes]\n * @param {{scriptable: boolean, indexable: boolean, allKeys?: boolean}} [descriptorDefaults]\n */\n createResolver(scopes, context, prefixes = [''], descriptorDefaults) {\n const {resolver} = getResolver(this._resolverCache, scopes, prefixes);\n return isObject(context)\n ? _attachContext(resolver, context, undefined, descriptorDefaults)\n : resolver;\n }\n}\n\nfunction getResolver(resolverCache, scopes, prefixes) {\n let cache = resolverCache.get(scopes);\n if (!cache) {\n cache = new Map();\n resolverCache.set(scopes, cache);\n }\n const cacheKey = prefixes.join();\n let cached = cache.get(cacheKey);\n if (!cached) {\n const resolver = _createResolver(scopes, prefixes);\n cached = {\n resolver,\n subPrefixes: prefixes.filter(p => !p.toLowerCase().includes('hover'))\n };\n cache.set(cacheKey, cached);\n }\n return cached;\n}\n\nconst hasFunction = value => isObject(value)\n && Object.getOwnPropertyNames(value).some((key) => isFunction(value[key]));\n\nfunction needContext(proxy, names) {\n const {isScriptable, isIndexable} = _descriptors(proxy);\n\n for (const prop of names) {\n const scriptable = isScriptable(prop);\n const indexable = isIndexable(prop);\n const value = (indexable || scriptable) && proxy[prop];\n if ((scriptable && (isFunction(value) || hasFunction(value)))\n || (indexable && isArray(value))) {\n return true;\n }\n }\n return false;\n}\n","import animator from './core.animator.js';\nimport defaults, {overrides} from './core.defaults.js';\nimport Interaction from './core.interaction.js';\nimport layouts from './core.layouts.js';\nimport {_detectPlatform} from '../platform/index.js';\nimport PluginService from './core.plugins.js';\nimport registry from './core.registry.js';\nimport Config, {determineAxis, getIndexAxis} from './core.config.js';\nimport {retinaScale, _isDomSupported} from '../helpers/helpers.dom.js';\nimport {each, callback as callCallback, uid, valueOrDefault, _elementsEqual, isNullOrUndef, setsEqual, defined, isFunction, _isClickEvent} from '../helpers/helpers.core.js';\nimport {clearCanvas, clipArea, createContext, unclipArea, _isPointInArea} from '../helpers/index.js';\n// @ts-ignore\nimport {version} from '../../package.json';\nimport {debounce} from '../helpers/helpers.extras.js';\n\n/**\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../types/index.js').Point } Point\n */\n\nconst KNOWN_POSITIONS = ['top', 'bottom', 'left', 'right', 'chartArea'];\nfunction positionIsHorizontal(position, axis) {\n return position === 'top' || position === 'bottom' || (KNOWN_POSITIONS.indexOf(position) === -1 && axis === 'x');\n}\n\nfunction compare2Level(l1, l2) {\n return function(a, b) {\n return a[l1] === b[l1]\n ? a[l2] - b[l2]\n : a[l1] - b[l1];\n };\n}\n\nfunction onAnimationsComplete(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n\n chart.notifyPlugins('afterRender');\n callCallback(animationOptions && animationOptions.onComplete, [context], chart);\n}\n\nfunction onAnimationProgress(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n callCallback(animationOptions && animationOptions.onProgress, [context], chart);\n}\n\n/**\n * Chart.js can take a string id of a canvas element, a 2d context, or a canvas element itself.\n * Attempt to unwrap the item passed into the chart constructor so that it is a canvas element (if possible).\n */\nfunction getCanvas(item) {\n if (_isDomSupported() && typeof item === 'string') {\n item = document.getElementById(item);\n } else if (item && item.length) {\n // Support for array based queries (such as jQuery)\n item = item[0];\n }\n\n if (item && item.canvas) {\n // Support for any object associated to a canvas (including a context2d)\n item = item.canvas;\n }\n return item;\n}\n\nconst instances = {};\nconst getChart = (key) => {\n const canvas = getCanvas(key);\n return Object.values(instances).filter((c) => c.canvas === canvas).pop();\n};\n\nfunction moveNumericKeys(obj, start, move) {\n const keys = Object.keys(obj);\n for (const key of keys) {\n const intKey = +key;\n if (intKey >= start) {\n const value = obj[key];\n delete obj[key];\n if (move > 0 || intKey > start) {\n obj[intKey + move] = value;\n }\n }\n }\n}\n\n/**\n * @param {ChartEvent} e\n * @param {ChartEvent|null} lastEvent\n * @param {boolean} inChartArea\n * @param {boolean} isClick\n * @returns {ChartEvent|null}\n */\nfunction determineLastEvent(e, lastEvent, inChartArea, isClick) {\n if (!inChartArea || e.type === 'mouseout') {\n return null;\n }\n if (isClick) {\n return lastEvent;\n }\n return e;\n}\n\nfunction getSizeForArea(scale, chartArea, field) {\n return scale.options.clip ? scale[field] : chartArea[field];\n}\n\nfunction getDatasetArea(meta, chartArea) {\n const {xScale, yScale} = meta;\n if (xScale && yScale) {\n return {\n left: getSizeForArea(xScale, chartArea, 'left'),\n right: getSizeForArea(xScale, chartArea, 'right'),\n top: getSizeForArea(yScale, chartArea, 'top'),\n bottom: getSizeForArea(yScale, chartArea, 'bottom')\n };\n }\n return chartArea;\n}\n\nclass Chart {\n\n static defaults = defaults;\n static instances = instances;\n static overrides = overrides;\n static registry = registry;\n static version = version;\n static getChart = getChart;\n\n static register(...items) {\n registry.add(...items);\n invalidatePlugins();\n }\n\n static unregister(...items) {\n registry.remove(...items);\n invalidatePlugins();\n }\n\n // eslint-disable-next-line max-statements\n constructor(item, userConfig) {\n const config = this.config = new Config(userConfig);\n const initialCanvas = getCanvas(item);\n const existingChart = getChart(initialCanvas);\n if (existingChart) {\n throw new Error(\n 'Canvas is already in use. Chart with ID \\'' + existingChart.id + '\\'' +\n\t\t\t\t' must be destroyed before the canvas with ID \\'' + existingChart.canvas.id + '\\' can be reused.'\n );\n }\n\n const options = config.createResolver(config.chartOptionScopes(), this.getContext());\n\n this.platform = new (config.platform || _detectPlatform(initialCanvas))();\n this.platform.updateConfig(config);\n\n const context = this.platform.acquireContext(initialCanvas, options.aspectRatio);\n const canvas = context && context.canvas;\n const height = canvas && canvas.height;\n const width = canvas && canvas.width;\n\n this.id = uid();\n this.ctx = context;\n this.canvas = canvas;\n this.width = width;\n this.height = height;\n this._options = options;\n // Store the previously used aspect ratio to determine if a resize\n // is needed during updates. Do this after _options is set since\n // aspectRatio uses a getter\n this._aspectRatio = this.aspectRatio;\n this._layers = [];\n this._metasets = [];\n this._stacks = undefined;\n this.boxes = [];\n this.currentDevicePixelRatio = undefined;\n this.chartArea = undefined;\n this._active = [];\n this._lastEvent = undefined;\n this._listeners = {};\n /** @type {?{attach?: function, detach?: function, resize?: function}} */\n this._responsiveListeners = undefined;\n this._sortedMetasets = [];\n this.scales = {};\n this._plugins = new PluginService();\n this.$proxies = {};\n this._hiddenIndices = {};\n this.attached = false;\n this._animationsDisabled = undefined;\n this.$context = undefined;\n this._doResize = debounce(mode => this.update(mode), options.resizeDelay || 0);\n this._dataChanges = [];\n\n // Add the chart instance to the global namespace\n instances[this.id] = this;\n\n if (!context || !canvas) {\n // The given item is not a compatible context2d element, let's return before finalizing\n // the chart initialization but after setting basic chart / controller properties that\n // can help to figure out that the chart is not valid (e.g chart.canvas !== null);\n // https://github.com/chartjs/Chart.js/issues/2807\n console.error(\"Failed to create chart: can't acquire context from the given item\");\n return;\n }\n\n animator.listen(this, 'complete', onAnimationsComplete);\n animator.listen(this, 'progress', onAnimationProgress);\n\n this._initialize();\n if (this.attached) {\n this.update();\n }\n }\n\n get aspectRatio() {\n const {options: {aspectRatio, maintainAspectRatio}, width, height, _aspectRatio} = this;\n if (!isNullOrUndef(aspectRatio)) {\n // If aspectRatio is defined in options, use that.\n return aspectRatio;\n }\n\n if (maintainAspectRatio && _aspectRatio) {\n // If maintainAspectRatio is truthly and we had previously determined _aspectRatio, use that\n return _aspectRatio;\n }\n\n // Calculate\n return height ? width / height : null;\n }\n\n get data() {\n return this.config.data;\n }\n\n set data(data) {\n this.config.data = data;\n }\n\n get options() {\n return this._options;\n }\n\n set options(options) {\n this.config.options = options;\n }\n\n get registry() {\n return registry;\n }\n\n /**\n\t * @private\n\t */\n _initialize() {\n // Before init plugin notification\n this.notifyPlugins('beforeInit');\n\n if (this.options.responsive) {\n this.resize();\n } else {\n retinaScale(this, this.options.devicePixelRatio);\n }\n\n this.bindEvents();\n\n // After init plugin notification\n this.notifyPlugins('afterInit');\n\n return this;\n }\n\n clear() {\n clearCanvas(this.canvas, this.ctx);\n return this;\n }\n\n stop() {\n animator.stop(this);\n return this;\n }\n\n /**\n\t * Resize the chart to its container or to explicit dimensions.\n\t * @param {number} [width]\n\t * @param {number} [height]\n\t */\n resize(width, height) {\n if (!animator.running(this)) {\n this._resize(width, height);\n } else {\n this._resizeBeforeDraw = {width, height};\n }\n }\n\n _resize(width, height) {\n const options = this.options;\n const canvas = this.canvas;\n const aspectRatio = options.maintainAspectRatio && this.aspectRatio;\n const newSize = this.platform.getMaximumSize(canvas, width, height, aspectRatio);\n const newRatio = options.devicePixelRatio || this.platform.getDevicePixelRatio();\n const mode = this.width ? 'resize' : 'attach';\n\n this.width = newSize.width;\n this.height = newSize.height;\n this._aspectRatio = this.aspectRatio;\n if (!retinaScale(this, newRatio, true)) {\n return;\n }\n\n this.notifyPlugins('resize', {size: newSize});\n\n callCallback(options.onResize, [this, newSize], this);\n\n if (this.attached) {\n if (this._doResize(mode)) {\n // The resize update is delayed, only draw without updating.\n this.render();\n }\n }\n }\n\n ensureScalesHaveIDs() {\n const options = this.options;\n const scalesOptions = options.scales || {};\n\n each(scalesOptions, (axisOptions, axisID) => {\n axisOptions.id = axisID;\n });\n }\n\n /**\n\t * Builds a map of scale ID to scale object for future lookup.\n\t */\n buildOrUpdateScales() {\n const options = this.options;\n const scaleOpts = options.scales;\n const scales = this.scales;\n const updated = Object.keys(scales).reduce((obj, id) => {\n obj[id] = false;\n return obj;\n }, {});\n let items = [];\n\n if (scaleOpts) {\n items = items.concat(\n Object.keys(scaleOpts).map((id) => {\n const scaleOptions = scaleOpts[id];\n const axis = determineAxis(id, scaleOptions);\n const isRadial = axis === 'r';\n const isHorizontal = axis === 'x';\n return {\n options: scaleOptions,\n dposition: isRadial ? 'chartArea' : isHorizontal ? 'bottom' : 'left',\n dtype: isRadial ? 'radialLinear' : isHorizontal ? 'category' : 'linear'\n };\n })\n );\n }\n\n each(items, (item) => {\n const scaleOptions = item.options;\n const id = scaleOptions.id;\n const axis = determineAxis(id, scaleOptions);\n const scaleType = valueOrDefault(scaleOptions.type, item.dtype);\n\n if (scaleOptions.position === undefined || positionIsHorizontal(scaleOptions.position, axis) !== positionIsHorizontal(item.dposition)) {\n scaleOptions.position = item.dposition;\n }\n\n updated[id] = true;\n let scale = null;\n if (id in scales && scales[id].type === scaleType) {\n scale = scales[id];\n } else {\n const scaleClass = registry.getScale(scaleType);\n scale = new scaleClass({\n id,\n type: scaleType,\n ctx: this.ctx,\n chart: this\n });\n scales[scale.id] = scale;\n }\n\n scale.init(scaleOptions, options);\n });\n // clear up discarded scales\n each(updated, (hasUpdated, id) => {\n if (!hasUpdated) {\n delete scales[id];\n }\n });\n\n each(scales, (scale) => {\n layouts.configure(this, scale, scale.options);\n layouts.addBox(this, scale);\n });\n }\n\n /**\n\t * @private\n\t */\n _updateMetasets() {\n const metasets = this._metasets;\n const numData = this.data.datasets.length;\n const numMeta = metasets.length;\n\n metasets.sort((a, b) => a.index - b.index);\n if (numMeta > numData) {\n for (let i = numData; i < numMeta; ++i) {\n this._destroyDatasetMeta(i);\n }\n metasets.splice(numData, numMeta - numData);\n }\n this._sortedMetasets = metasets.slice(0).sort(compare2Level('order', 'index'));\n }\n\n /**\n\t * @private\n\t */\n _removeUnreferencedMetasets() {\n const {_metasets: metasets, data: {datasets}} = this;\n if (metasets.length > datasets.length) {\n delete this._stacks;\n }\n metasets.forEach((meta, index) => {\n if (datasets.filter(x => x === meta._dataset).length === 0) {\n this._destroyDatasetMeta(index);\n }\n });\n }\n\n buildOrUpdateControllers() {\n const newControllers = [];\n const datasets = this.data.datasets;\n let i, ilen;\n\n this._removeUnreferencedMetasets();\n\n for (i = 0, ilen = datasets.length; i < ilen; i++) {\n const dataset = datasets[i];\n let meta = this.getDatasetMeta(i);\n const type = dataset.type || this.config.type;\n\n if (meta.type && meta.type !== type) {\n this._destroyDatasetMeta(i);\n meta = this.getDatasetMeta(i);\n }\n meta.type = type;\n meta.indexAxis = dataset.indexAxis || getIndexAxis(type, this.options);\n meta.order = dataset.order || 0;\n meta.index = i;\n meta.label = '' + dataset.label;\n meta.visible = this.isDatasetVisible(i);\n\n if (meta.controller) {\n meta.controller.updateIndex(i);\n meta.controller.linkScales();\n } else {\n const ControllerClass = registry.getController(type);\n const {datasetElementType, dataElementType} = defaults.datasets[type];\n Object.assign(ControllerClass, {\n dataElementType: registry.getElement(dataElementType),\n datasetElementType: datasetElementType && registry.getElement(datasetElementType)\n });\n meta.controller = new ControllerClass(this, i);\n newControllers.push(meta.controller);\n }\n }\n\n this._updateMetasets();\n return newControllers;\n }\n\n /**\n\t * Reset the elements of all datasets\n\t * @private\n\t */\n _resetElements() {\n each(this.data.datasets, (dataset, datasetIndex) => {\n this.getDatasetMeta(datasetIndex).controller.reset();\n }, this);\n }\n\n /**\n\t* Resets the chart back to its state before the initial animation\n\t*/\n reset() {\n this._resetElements();\n this.notifyPlugins('reset');\n }\n\n update(mode) {\n const config = this.config;\n\n config.update();\n const options = this._options = config.createResolver(config.chartOptionScopes(), this.getContext());\n const animsDisabled = this._animationsDisabled = !options.animation;\n\n this._updateScales();\n this._checkEventBindings();\n this._updateHiddenIndices();\n\n // plugins options references might have change, let's invalidate the cache\n // https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167\n this._plugins.invalidate();\n\n if (this.notifyPlugins('beforeUpdate', {mode, cancelable: true}) === false) {\n return;\n }\n\n // Make sure dataset controllers are updated and new controllers are reset\n const newControllers = this.buildOrUpdateControllers();\n\n this.notifyPlugins('beforeElementsUpdate');\n\n // Make sure all dataset controllers have correct meta data counts\n let minPadding = 0;\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; i++) {\n const {controller} = this.getDatasetMeta(i);\n const reset = !animsDisabled && newControllers.indexOf(controller) === -1;\n // New controllers will be reset after the layout pass, so we only want to modify\n // elements added to new datasets\n controller.buildOrUpdateElements(reset);\n minPadding = Math.max(+controller.getMaxOverflow(), minPadding);\n }\n minPadding = this._minPadding = options.layout.autoPadding ? minPadding : 0;\n this._updateLayout(minPadding);\n\n // Only reset the controllers if we have animations\n if (!animsDisabled) {\n // Can only reset the new controllers after the scales have been updated\n // Reset is done to get the starting point for the initial animation\n each(newControllers, (controller) => {\n controller.reset();\n });\n }\n\n this._updateDatasets(mode);\n\n // Do this before render so that any plugins that need final scale updates can use it\n this.notifyPlugins('afterUpdate', {mode});\n\n this._layers.sort(compare2Level('z', '_idx'));\n\n // Replay last event from before update, or set hover styles on active elements\n const {_active, _lastEvent} = this;\n if (_lastEvent) {\n this._eventHandler(_lastEvent, true);\n } else if (_active.length) {\n this._updateHoverStyles(_active, _active, true);\n }\n\n this.render();\n }\n\n /**\n * @private\n */\n _updateScales() {\n each(this.scales, (scale) => {\n layouts.removeBox(this, scale);\n });\n\n this.ensureScalesHaveIDs();\n this.buildOrUpdateScales();\n }\n\n /**\n * @private\n */\n _checkEventBindings() {\n const options = this.options;\n const existingEvents = new Set(Object.keys(this._listeners));\n const newEvents = new Set(options.events);\n\n if (!setsEqual(existingEvents, newEvents) || !!this._responsiveListeners !== options.responsive) {\n // The configured events have changed. Rebind.\n this.unbindEvents();\n this.bindEvents();\n }\n }\n\n /**\n * @private\n */\n _updateHiddenIndices() {\n const {_hiddenIndices} = this;\n const changes = this._getUniformDataChanges() || [];\n for (const {method, start, count} of changes) {\n const move = method === '_removeElements' ? -count : count;\n moveNumericKeys(_hiddenIndices, start, move);\n }\n }\n\n /**\n * @private\n */\n _getUniformDataChanges() {\n const _dataChanges = this._dataChanges;\n if (!_dataChanges || !_dataChanges.length) {\n return;\n }\n\n this._dataChanges = [];\n const datasetCount = this.data.datasets.length;\n const makeSet = (idx) => new Set(\n _dataChanges\n .filter(c => c[0] === idx)\n .map((c, i) => i + ',' + c.splice(1).join(','))\n );\n\n const changeSet = makeSet(0);\n for (let i = 1; i < datasetCount; i++) {\n if (!setsEqual(changeSet, makeSet(i))) {\n return;\n }\n }\n return Array.from(changeSet)\n .map(c => c.split(','))\n .map(a => ({method: a[1], start: +a[2], count: +a[3]}));\n }\n\n /**\n\t * Updates the chart layout unless a plugin returns `false` to the `beforeLayout`\n\t * hook, in which case, plugins will not be called on `afterLayout`.\n\t * @private\n\t */\n _updateLayout(minPadding) {\n if (this.notifyPlugins('beforeLayout', {cancelable: true}) === false) {\n return;\n }\n\n layouts.update(this, this.width, this.height, minPadding);\n\n const area = this.chartArea;\n const noArea = area.width <= 0 || area.height <= 0;\n\n this._layers = [];\n each(this.boxes, (box) => {\n if (noArea && box.position === 'chartArea') {\n // Skip drawing and configuring chartArea boxes when chartArea is zero or negative\n return;\n }\n\n // configure is called twice, once in core.scale.update and once here.\n // Here the boxes are fully updated and at their final positions.\n if (box.configure) {\n box.configure();\n }\n this._layers.push(...box._layers());\n }, this);\n\n this._layers.forEach((item, index) => {\n item._idx = index;\n });\n\n this.notifyPlugins('afterLayout');\n }\n\n /**\n\t * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate`\n\t * hook, in which case, plugins will not be called on `afterDatasetsUpdate`.\n\t * @private\n\t */\n _updateDatasets(mode) {\n if (this.notifyPlugins('beforeDatasetsUpdate', {mode, cancelable: true}) === false) {\n return;\n }\n\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this.getDatasetMeta(i).controller.configure();\n }\n\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this._updateDataset(i, isFunction(mode) ? mode({datasetIndex: i}) : mode);\n }\n\n this.notifyPlugins('afterDatasetsUpdate', {mode});\n }\n\n /**\n\t * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate`\n\t * hook, in which case, plugins will not be called on `afterDatasetUpdate`.\n\t * @private\n\t */\n _updateDataset(index, mode) {\n const meta = this.getDatasetMeta(index);\n const args = {meta, index, mode, cancelable: true};\n\n if (this.notifyPlugins('beforeDatasetUpdate', args) === false) {\n return;\n }\n\n meta.controller._update(mode);\n\n args.cancelable = false;\n this.notifyPlugins('afterDatasetUpdate', args);\n }\n\n render() {\n if (this.notifyPlugins('beforeRender', {cancelable: true}) === false) {\n return;\n }\n\n if (animator.has(this)) {\n if (this.attached && !animator.running(this)) {\n animator.start(this);\n }\n } else {\n this.draw();\n onAnimationsComplete({chart: this});\n }\n }\n\n draw() {\n let i;\n if (this._resizeBeforeDraw) {\n const {width, height} = this._resizeBeforeDraw;\n // Unset pending resize request now to avoid possible recursion within _resize\n this._resizeBeforeDraw = null;\n this._resize(width, height);\n }\n this.clear();\n\n if (this.width <= 0 || this.height <= 0) {\n return;\n }\n\n if (this.notifyPlugins('beforeDraw', {cancelable: true}) === false) {\n return;\n }\n\n // Because of plugin hooks (before/afterDatasetsDraw), datasets can't\n // currently be part of layers. Instead, we draw\n // layers <= 0 before(default, backward compat), and the rest after\n const layers = this._layers;\n for (i = 0; i < layers.length && layers[i].z <= 0; ++i) {\n layers[i].draw(this.chartArea);\n }\n\n this._drawDatasets();\n\n // Rest of layers\n for (; i < layers.length; ++i) {\n layers[i].draw(this.chartArea);\n }\n\n this.notifyPlugins('afterDraw');\n }\n\n /**\n\t * @private\n\t */\n _getSortedDatasetMetas(filterVisible) {\n const metasets = this._sortedMetasets;\n const result = [];\n let i, ilen;\n\n for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n const meta = metasets[i];\n if (!filterVisible || meta.visible) {\n result.push(meta);\n }\n }\n\n return result;\n }\n\n /**\n\t * Gets the visible dataset metas in drawing order\n\t * @return {object[]}\n\t */\n getSortedVisibleDatasetMetas() {\n return this._getSortedDatasetMetas(true);\n }\n\n /**\n\t * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw`\n\t * hook, in which case, plugins will not be called on `afterDatasetsDraw`.\n\t * @private\n\t */\n _drawDatasets() {\n if (this.notifyPlugins('beforeDatasetsDraw', {cancelable: true}) === false) {\n return;\n }\n\n const metasets = this.getSortedVisibleDatasetMetas();\n for (let i = metasets.length - 1; i >= 0; --i) {\n this._drawDataset(metasets[i]);\n }\n\n this.notifyPlugins('afterDatasetsDraw');\n }\n\n /**\n\t * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw`\n\t * hook, in which case, plugins will not be called on `afterDatasetDraw`.\n\t * @private\n\t */\n _drawDataset(meta) {\n const ctx = this.ctx;\n const clip = meta._clip;\n const useClip = !clip.disabled;\n const area = getDatasetArea(meta, this.chartArea);\n const args = {\n meta,\n index: meta.index,\n cancelable: true\n };\n\n if (this.notifyPlugins('beforeDatasetDraw', args) === false) {\n return;\n }\n\n if (useClip) {\n clipArea(ctx, {\n left: clip.left === false ? 0 : area.left - clip.left,\n right: clip.right === false ? this.width : area.right + clip.right,\n top: clip.top === false ? 0 : area.top - clip.top,\n bottom: clip.bottom === false ? this.height : area.bottom + clip.bottom\n });\n }\n\n meta.controller.draw();\n\n if (useClip) {\n unclipArea(ctx);\n }\n\n args.cancelable = false;\n this.notifyPlugins('afterDatasetDraw', args);\n }\n\n /**\n * Checks whether the given point is in the chart area.\n * @param {Point} point - in relative coordinates (see, e.g., getRelativePosition)\n * @returns {boolean}\n */\n isPointInArea(point) {\n return _isPointInArea(point, this.chartArea, this._minPadding);\n }\n\n getElementsAtEventForMode(e, mode, options, useFinalPosition) {\n const method = Interaction.modes[mode];\n if (typeof method === 'function') {\n return method(this, e, options, useFinalPosition);\n }\n\n return [];\n }\n\n getDatasetMeta(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n const metasets = this._metasets;\n let meta = metasets.filter(x => x && x._dataset === dataset).pop();\n\n if (!meta) {\n meta = {\n type: null,\n data: [],\n dataset: null,\n controller: null,\n hidden: null,\t\t\t// See isDatasetVisible() comment\n xAxisID: null,\n yAxisID: null,\n order: dataset && dataset.order || 0,\n index: datasetIndex,\n _dataset: dataset,\n _parsed: [],\n _sorted: false\n };\n metasets.push(meta);\n }\n\n return meta;\n }\n\n getContext() {\n return this.$context || (this.$context = createContext(null, {chart: this, type: 'chart'}));\n }\n\n getVisibleDatasetCount() {\n return this.getSortedVisibleDatasetMetas().length;\n }\n\n isDatasetVisible(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n if (!dataset) {\n return false;\n }\n\n const meta = this.getDatasetMeta(datasetIndex);\n\n // meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false,\n // the dataset.hidden value is ignored, else if null, the dataset hidden state is returned.\n return typeof meta.hidden === 'boolean' ? !meta.hidden : !dataset.hidden;\n }\n\n setDatasetVisibility(datasetIndex, visible) {\n const meta = this.getDatasetMeta(datasetIndex);\n meta.hidden = !visible;\n }\n\n toggleDataVisibility(index) {\n this._hiddenIndices[index] = !this._hiddenIndices[index];\n }\n\n getDataVisibility(index) {\n return !this._hiddenIndices[index];\n }\n\n /**\n\t * @private\n\t */\n _updateVisibility(datasetIndex, dataIndex, visible) {\n const mode = visible ? 'show' : 'hide';\n const meta = this.getDatasetMeta(datasetIndex);\n const anims = meta.controller._resolveAnimations(undefined, mode);\n\n if (defined(dataIndex)) {\n meta.data[dataIndex].hidden = !visible;\n this.update();\n } else {\n this.setDatasetVisibility(datasetIndex, visible);\n // Animate visible state, so hide animation can be seen. This could be handled better if update / updateDataset returned a Promise.\n anims.update(meta, {visible});\n this.update((ctx) => ctx.datasetIndex === datasetIndex ? mode : undefined);\n }\n }\n\n hide(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, false);\n }\n\n show(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, true);\n }\n\n /**\n\t * @private\n\t */\n _destroyDatasetMeta(datasetIndex) {\n const meta = this._metasets[datasetIndex];\n if (meta && meta.controller) {\n meta.controller._destroy();\n }\n delete this._metasets[datasetIndex];\n }\n\n _stop() {\n let i, ilen;\n this.stop();\n animator.remove(this);\n\n for (i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this._destroyDatasetMeta(i);\n }\n }\n\n destroy() {\n this.notifyPlugins('beforeDestroy');\n const {canvas, ctx} = this;\n\n this._stop();\n this.config.clearCache();\n\n if (canvas) {\n this.unbindEvents();\n clearCanvas(canvas, ctx);\n this.platform.releaseContext(ctx);\n this.canvas = null;\n this.ctx = null;\n }\n\n delete instances[this.id];\n\n this.notifyPlugins('afterDestroy');\n }\n\n toBase64Image(...args) {\n return this.canvas.toDataURL(...args);\n }\n\n /**\n\t * @private\n\t */\n bindEvents() {\n this.bindUserEvents();\n if (this.options.responsive) {\n this.bindResponsiveEvents();\n } else {\n this.attached = true;\n }\n }\n\n /**\n * @private\n */\n bindUserEvents() {\n const listeners = this._listeners;\n const platform = this.platform;\n\n const _add = (type, listener) => {\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n\n const listener = (e, x, y) => {\n e.offsetX = x;\n e.offsetY = y;\n this._eventHandler(e);\n };\n\n each(this.options.events, (type) => _add(type, listener));\n }\n\n /**\n * @private\n */\n bindResponsiveEvents() {\n if (!this._responsiveListeners) {\n this._responsiveListeners = {};\n }\n const listeners = this._responsiveListeners;\n const platform = this.platform;\n\n const _add = (type, listener) => {\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n const _remove = (type, listener) => {\n if (listeners[type]) {\n platform.removeEventListener(this, type, listener);\n delete listeners[type];\n }\n };\n\n const listener = (width, height) => {\n if (this.canvas) {\n this.resize(width, height);\n }\n };\n\n let detached; // eslint-disable-line prefer-const\n const attached = () => {\n _remove('attach', attached);\n\n this.attached = true;\n this.resize();\n\n _add('resize', listener);\n _add('detach', detached);\n };\n\n detached = () => {\n this.attached = false;\n\n _remove('resize', listener);\n\n // Stop animating and remove metasets, so when re-attached, the animations start from beginning.\n this._stop();\n this._resize(0, 0);\n\n _add('attach', attached);\n };\n\n if (platform.isAttached(this.canvas)) {\n attached();\n } else {\n detached();\n }\n }\n\n /**\n\t * @private\n\t */\n unbindEvents() {\n each(this._listeners, (listener, type) => {\n this.platform.removeEventListener(this, type, listener);\n });\n this._listeners = {};\n\n each(this._responsiveListeners, (listener, type) => {\n this.platform.removeEventListener(this, type, listener);\n });\n this._responsiveListeners = undefined;\n }\n\n updateHoverStyle(items, mode, enabled) {\n const prefix = enabled ? 'set' : 'remove';\n let meta, item, i, ilen;\n\n if (mode === 'dataset') {\n meta = this.getDatasetMeta(items[0].datasetIndex);\n meta.controller['_' + prefix + 'DatasetHoverStyle']();\n }\n\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n item = items[i];\n const controller = item && this.getDatasetMeta(item.datasetIndex).controller;\n if (controller) {\n controller[prefix + 'HoverStyle'](item.element, item.datasetIndex, item.index);\n }\n }\n }\n\n /**\n\t * Get active (hovered) elements\n\t * @returns array\n\t */\n getActiveElements() {\n return this._active || [];\n }\n\n /**\n\t * Set active (hovered) elements\n\t * @param {array} activeElements New active data points\n\t */\n setActiveElements(activeElements) {\n const lastActive = this._active || [];\n const active = activeElements.map(({datasetIndex, index}) => {\n const meta = this.getDatasetMeta(datasetIndex);\n if (!meta) {\n throw new Error('No dataset found at index ' + datasetIndex);\n }\n\n return {\n datasetIndex,\n element: meta.data[index],\n index,\n };\n });\n const changed = !_elementsEqual(active, lastActive);\n\n if (changed) {\n this._active = active;\n // Make sure we don't use the previous mouse event to override the active elements in update.\n this._lastEvent = null;\n this._updateHoverStyles(active, lastActive);\n }\n }\n\n /**\n\t * Calls enabled plugins on the specified hook and with the given args.\n\t * This method immediately returns as soon as a plugin explicitly returns false. The\n\t * returned value can be used, for instance, to interrupt the current action.\n\t * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n\t * @param {Object} [args] - Extra arguments to apply to the hook call.\n * @param {import('./core.plugins.js').filterCallback} [filter] - Filtering function for limiting which plugins are notified\n\t * @returns {boolean} false if any of the plugins return false, else returns true.\n\t */\n notifyPlugins(hook, args, filter) {\n return this._plugins.notify(this, hook, args, filter);\n }\n\n /**\n * Check if a plugin with the specific ID is registered and enabled\n * @param {string} pluginId - The ID of the plugin of which to check if it is enabled\n * @returns {boolean}\n */\n isPluginEnabled(pluginId) {\n return this._plugins._cache.filter(p => p.plugin.id === pluginId).length === 1;\n }\n\n /**\n\t * @private\n\t */\n _updateHoverStyles(active, lastActive, replay) {\n const hoverOptions = this.options.hover;\n const diff = (a, b) => a.filter(x => !b.some(y => x.datasetIndex === y.datasetIndex && x.index === y.index));\n const deactivated = diff(lastActive, active);\n const activated = replay ? active : diff(active, lastActive);\n\n if (deactivated.length) {\n this.updateHoverStyle(deactivated, hoverOptions.mode, false);\n }\n\n if (activated.length && hoverOptions.mode) {\n this.updateHoverStyle(activated, hoverOptions.mode, true);\n }\n }\n\n /**\n\t * @private\n\t */\n _eventHandler(e, replay) {\n const args = {\n event: e,\n replay,\n cancelable: true,\n inChartArea: this.isPointInArea(e)\n };\n const eventFilter = (plugin) => (plugin.options.events || this.options.events).includes(e.native.type);\n\n if (this.notifyPlugins('beforeEvent', args, eventFilter) === false) {\n return;\n }\n\n const changed = this._handleEvent(e, replay, args.inChartArea);\n\n args.cancelable = false;\n this.notifyPlugins('afterEvent', args, eventFilter);\n\n if (changed || args.changed) {\n this.render();\n }\n\n return this;\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e the event to handle\n\t * @param {boolean} [replay] - true if the event was replayed by `update`\n * @param {boolean} [inChartArea] - true if the event is inside chartArea\n\t * @return {boolean} true if the chart needs to re-render\n\t * @private\n\t */\n _handleEvent(e, replay, inChartArea) {\n const {_active: lastActive = [], options} = this;\n\n // If the event is replayed from `update`, we should evaluate with the final positions.\n //\n // The `replay`:\n // It's the last event (excluding click) that has occurred before `update`.\n // So mouse has not moved. It's also over the chart, because there is a `replay`.\n //\n // The why:\n // If animations are active, the elements haven't moved yet compared to state before update.\n // But if they will, we are activating the elements that would be active, if this check\n // was done after the animations have completed. => \"final positions\".\n // If there is no animations, the \"final\" and \"current\" positions are equal.\n // This is done so we do not have to evaluate the active elements each animation frame\n // - it would be expensive.\n const useFinalPosition = replay;\n const active = this._getActiveElements(e, lastActive, inChartArea, useFinalPosition);\n const isClick = _isClickEvent(e);\n const lastEvent = determineLastEvent(e, this._lastEvent, inChartArea, isClick);\n\n if (inChartArea) {\n // Set _lastEvent to null while we are processing the event handlers.\n // This prevents recursion if the handler calls chart.update()\n this._lastEvent = null;\n\n // Invoke onHover hook\n callCallback(options.onHover, [e, active, this], this);\n\n if (isClick) {\n callCallback(options.onClick, [e, active, this], this);\n }\n }\n\n const changed = !_elementsEqual(active, lastActive);\n if (changed || replay) {\n this._active = active;\n this._updateHoverStyles(active, lastActive, replay);\n }\n\n this._lastEvent = lastEvent;\n\n return changed;\n }\n\n /**\n * @param {ChartEvent} e - The event\n * @param {import('../types/index.js').ActiveElement[]} lastActive - Previously active elements\n * @param {boolean} inChartArea - Is the event inside chartArea\n * @param {boolean} useFinalPosition - Should the evaluation be done with current or final (after animation) element positions\n * @returns {import('../types/index.js').ActiveElement[]} - The active elements\n * @pravate\n */\n _getActiveElements(e, lastActive, inChartArea, useFinalPosition) {\n if (e.type === 'mouseout') {\n return [];\n }\n\n if (!inChartArea) {\n // Let user control the active elements outside chartArea. Eg. using Legend.\n return lastActive;\n }\n\n const hoverOptions = this.options.hover;\n return this.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions, useFinalPosition);\n }\n}\n\n// @ts-ignore\nfunction invalidatePlugins() {\n return each(Chart.instances, (chart) => chart._plugins.invalidate());\n}\n\nexport default Chart;\n","import {_isDomSupported} from '../helpers/index.js';\nimport BasePlatform from './platform.base.js';\nimport BasicPlatform from './platform.basic.js';\nimport DomPlatform from './platform.dom.js';\n\nexport function _detectPlatform(canvas) {\n if (!_isDomSupported() || (typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas)) {\n return BasicPlatform;\n }\n return DomPlatform;\n}\n\nexport {BasePlatform, BasicPlatform, DomPlatform};\n","import Element from '../core/core.element.js';\nimport {_angleBetween, getAngleFromPoint, TAU, HALF_PI, valueOrDefault} from '../helpers/index.js';\nimport {PI, _isBetween, _limitValue} from '../helpers/helpers.math.js';\nimport {_readValueToProps} from '../helpers/helpers.options.js';\nimport type {ArcOptions, Point} from '../types/index.js';\n\n\nfunction clipArc(ctx: CanvasRenderingContext2D, element: ArcElement, endAngle: number) {\n const {startAngle, pixelMargin, x, y, outerRadius, innerRadius} = element;\n let angleMargin = pixelMargin / outerRadius;\n\n // Draw an inner border by clipping the arc and drawing a double-width border\n // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders\n ctx.beginPath();\n ctx.arc(x, y, outerRadius, startAngle - angleMargin, endAngle + angleMargin);\n if (innerRadius > pixelMargin) {\n angleMargin = pixelMargin / innerRadius;\n ctx.arc(x, y, innerRadius, endAngle + angleMargin, startAngle - angleMargin, true);\n } else {\n ctx.arc(x, y, pixelMargin, endAngle + HALF_PI, startAngle - HALF_PI);\n }\n ctx.closePath();\n ctx.clip();\n}\n\nfunction toRadiusCorners(value) {\n return _readValueToProps(value, ['outerStart', 'outerEnd', 'innerStart', 'innerEnd']);\n}\n\n/**\n * Parse border radius from the provided options\n */\nfunction parseBorderRadius(arc: ArcElement, innerRadius: number, outerRadius: number, angleDelta: number) {\n const o = toRadiusCorners(arc.options.borderRadius);\n const halfThickness = (outerRadius - innerRadius) / 2;\n const innerLimit = Math.min(halfThickness, angleDelta * innerRadius / 2);\n\n // Outer limits are complicated. We want to compute the available angular distance at\n // a radius of outerRadius - borderRadius because for small angular distances, this term limits.\n // We compute at r = outerRadius - borderRadius because this circle defines the center of the border corners.\n //\n // If the borderRadius is large, that value can become negative.\n // This causes the outer borders to lose their radius entirely, which is rather unexpected. To solve that, if borderRadius > outerRadius\n // we know that the thickness term will dominate and compute the limits at that point\n const computeOuterLimit = (val) => {\n const outerArcLimit = (outerRadius - Math.min(halfThickness, val)) * angleDelta / 2;\n return _limitValue(val, 0, Math.min(halfThickness, outerArcLimit));\n };\n\n return {\n outerStart: computeOuterLimit(o.outerStart),\n outerEnd: computeOuterLimit(o.outerEnd),\n innerStart: _limitValue(o.innerStart, 0, innerLimit),\n innerEnd: _limitValue(o.innerEnd, 0, innerLimit),\n };\n}\n\n/**\n * Convert (r, 𝜃) to (x, y)\n */\nfunction rThetaToXY(r: number, theta: number, x: number, y: number) {\n return {\n x: x + r * Math.cos(theta),\n y: y + r * Math.sin(theta),\n };\n}\n\n\n/**\n * Path the arc, respecting border radius by separating into left and right halves.\n *\n * Start End\n *\n * 1--->a--->2 Outer\n * / \\\n * 8 3\n * | |\n * | |\n * 7 4\n * \\ /\n * 6<---b<---5 Inner\n */\nfunction pathArc(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n end: number,\n circular: boolean,\n) {\n const {x, y, startAngle: start, pixelMargin, innerRadius: innerR} = element;\n\n const outerRadius = Math.max(element.outerRadius + spacing + offset - pixelMargin, 0);\n const innerRadius = innerR > 0 ? innerR + spacing + offset + pixelMargin : 0;\n\n let spacingOffset = 0;\n const alpha = end - start;\n\n if (spacing) {\n // When spacing is present, it is the same for all items\n // So we adjust the start and end angle of the arc such that\n // the distance is the same as it would be without the spacing\n const noSpacingInnerRadius = innerR > 0 ? innerR - spacing : 0;\n const noSpacingOuterRadius = outerRadius > 0 ? outerRadius - spacing : 0;\n const avNogSpacingRadius = (noSpacingInnerRadius + noSpacingOuterRadius) / 2;\n const adjustedAngle = avNogSpacingRadius !== 0 ? (alpha * avNogSpacingRadius) / (avNogSpacingRadius + spacing) : alpha;\n spacingOffset = (alpha - adjustedAngle) / 2;\n }\n\n const beta = Math.max(0.001, alpha * outerRadius - offset / PI) / outerRadius;\n const angleOffset = (alpha - beta) / 2;\n const startAngle = start + angleOffset + spacingOffset;\n const endAngle = end - angleOffset - spacingOffset;\n const {outerStart, outerEnd, innerStart, innerEnd} = parseBorderRadius(element, innerRadius, outerRadius, endAngle - startAngle);\n\n const outerStartAdjustedRadius = outerRadius - outerStart;\n const outerEndAdjustedRadius = outerRadius - outerEnd;\n const outerStartAdjustedAngle = startAngle + outerStart / outerStartAdjustedRadius;\n const outerEndAdjustedAngle = endAngle - outerEnd / outerEndAdjustedRadius;\n\n const innerStartAdjustedRadius = innerRadius + innerStart;\n const innerEndAdjustedRadius = innerRadius + innerEnd;\n const innerStartAdjustedAngle = startAngle + innerStart / innerStartAdjustedRadius;\n const innerEndAdjustedAngle = endAngle - innerEnd / innerEndAdjustedRadius;\n\n ctx.beginPath();\n\n if (circular) {\n // The first arc segments from point 1 to point a to point 2\n const outerMidAdjustedAngle = (outerStartAdjustedAngle + outerEndAdjustedAngle) / 2;\n ctx.arc(x, y, outerRadius, outerStartAdjustedAngle, outerMidAdjustedAngle);\n ctx.arc(x, y, outerRadius, outerMidAdjustedAngle, outerEndAdjustedAngle);\n\n // The corner segment from point 2 to point 3\n if (outerEnd > 0) {\n const pCenter = rThetaToXY(outerEndAdjustedRadius, outerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerEnd, outerEndAdjustedAngle, endAngle + HALF_PI);\n }\n\n // The line from point 3 to point 4\n const p4 = rThetaToXY(innerEndAdjustedRadius, endAngle, x, y);\n ctx.lineTo(p4.x, p4.y);\n\n // The corner segment from point 4 to point 5\n if (innerEnd > 0) {\n const pCenter = rThetaToXY(innerEndAdjustedRadius, innerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerEnd, endAngle + HALF_PI, innerEndAdjustedAngle + Math.PI);\n }\n\n // The inner arc from point 5 to point b to point 6\n const innerMidAdjustedAngle = ((endAngle - (innerEnd / innerRadius)) + (startAngle + (innerStart / innerRadius))) / 2;\n ctx.arc(x, y, innerRadius, endAngle - (innerEnd / innerRadius), innerMidAdjustedAngle, true);\n ctx.arc(x, y, innerRadius, innerMidAdjustedAngle, startAngle + (innerStart / innerRadius), true);\n\n // The corner segment from point 6 to point 7\n if (innerStart > 0) {\n const pCenter = rThetaToXY(innerStartAdjustedRadius, innerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerStart, innerStartAdjustedAngle + Math.PI, startAngle - HALF_PI);\n }\n\n // The line from point 7 to point 8\n const p8 = rThetaToXY(outerStartAdjustedRadius, startAngle, x, y);\n ctx.lineTo(p8.x, p8.y);\n\n // The corner segment from point 8 to point 1\n if (outerStart > 0) {\n const pCenter = rThetaToXY(outerStartAdjustedRadius, outerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerStart, startAngle - HALF_PI, outerStartAdjustedAngle);\n }\n } else {\n ctx.moveTo(x, y);\n\n const outerStartX = Math.cos(outerStartAdjustedAngle) * outerRadius + x;\n const outerStartY = Math.sin(outerStartAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerStartX, outerStartY);\n\n const outerEndX = Math.cos(outerEndAdjustedAngle) * outerRadius + x;\n const outerEndY = Math.sin(outerEndAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerEndX, outerEndY);\n }\n\n ctx.closePath();\n}\n\nfunction drawArc(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n circular: boolean,\n) {\n const {fullCircles, startAngle, circumference} = element;\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for (let i = 0; i < fullCircles; ++i) {\n ctx.fill();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.fill();\n return endAngle;\n}\n\nfunction drawBorder(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n circular: boolean,\n) {\n const {fullCircles, startAngle, circumference, options} = element;\n const {borderWidth, borderJoinStyle, borderDash, borderDashOffset} = options;\n const inner = options.borderAlign === 'inner';\n\n if (!borderWidth) {\n return;\n }\n\n ctx.setLineDash(borderDash || []);\n ctx.lineDashOffset = borderDashOffset;\n\n if (inner) {\n ctx.lineWidth = borderWidth * 2;\n ctx.lineJoin = borderJoinStyle || 'round';\n } else {\n ctx.lineWidth = borderWidth;\n ctx.lineJoin = borderJoinStyle || 'bevel';\n }\n\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for (let i = 0; i < fullCircles; ++i) {\n ctx.stroke();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n\n if (inner) {\n clipArc(ctx, element, endAngle);\n }\n\n if (!fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.stroke();\n }\n}\n\nexport interface ArcProps extends Point {\n startAngle: number;\n endAngle: number;\n innerRadius: number;\n outerRadius: number;\n circumference: number;\n}\n\nexport default class ArcElement extends Element<ArcProps, ArcOptions> {\n\n static id = 'arc';\n\n static defaults = {\n borderAlign: 'center',\n borderColor: '#fff',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: undefined,\n borderRadius: 0,\n borderWidth: 2,\n offset: 0,\n spacing: 0,\n angle: undefined,\n circular: true,\n };\n\n static defaultRoutes = {\n backgroundColor: 'backgroundColor'\n };\n\n static descriptors = {\n _scriptable: true,\n _indexable: (name) => name !== 'borderDash'\n };\n\n circumference: number;\n endAngle: number;\n fullCircles: number;\n innerRadius: number;\n outerRadius: number;\n pixelMargin: number;\n startAngle: number;\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.circumference = undefined;\n this.startAngle = undefined;\n this.endAngle = undefined;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.pixelMargin = 0;\n this.fullCircles = 0;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n inRange(chartX: number, chartY: number, useFinalPosition: boolean) {\n const point = this.getProps(['x', 'y'], useFinalPosition);\n const {angle, distance} = getAngleFromPoint(point, {x: chartX, y: chartY});\n const {startAngle, endAngle, innerRadius, outerRadius, circumference} = this.getProps([\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius',\n 'circumference'\n ], useFinalPosition);\n const rAdjust = (this.options.spacing + this.options.borderWidth) / 2;\n const _circumference = valueOrDefault(circumference, endAngle - startAngle);\n const nonZeroBetween = _angleBetween(angle, startAngle, endAngle) && startAngle !== endAngle;\n const betweenAngles = _circumference >= TAU || nonZeroBetween;\n const withinRadius = _isBetween(distance, innerRadius + rAdjust, outerRadius + rAdjust);\n\n return (betweenAngles && withinRadius);\n }\n\n getCenterPoint(useFinalPosition: boolean) {\n const {x, y, startAngle, endAngle, innerRadius, outerRadius} = this.getProps([\n 'x',\n 'y',\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius'\n ], useFinalPosition);\n const {offset, spacing} = this.options;\n const halfAngle = (startAngle + endAngle) / 2;\n const halfRadius = (innerRadius + outerRadius + spacing + offset) / 2;\n return {\n x: x + Math.cos(halfAngle) * halfRadius,\n y: y + Math.sin(halfAngle) * halfRadius\n };\n }\n\n tooltipPosition(useFinalPosition: boolean) {\n return this.getCenterPoint(useFinalPosition);\n }\n\n draw(ctx: CanvasRenderingContext2D) {\n const {options, circumference} = this;\n const offset = (options.offset || 0) / 4;\n const spacing = (options.spacing || 0) / 2;\n const circular = options.circular;\n this.pixelMargin = (options.borderAlign === 'inner') ? 0.33 : 0;\n this.fullCircles = circumference > TAU ? Math.floor(circumference / TAU) : 0;\n\n if (circumference === 0 || this.innerRadius < 0 || this.outerRadius < 0) {\n return;\n }\n\n ctx.save();\n\n const halfAngle = (this.startAngle + this.endAngle) / 2;\n ctx.translate(Math.cos(halfAngle) * offset, Math.sin(halfAngle) * offset);\n const fix = 1 - Math.sin(Math.min(PI, circumference || 0));\n const radiusOffset = offset * fix;\n\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n\n drawArc(ctx, this, radiusOffset, spacing, circular);\n drawBorder(ctx, this, radiusOffset, spacing, circular);\n\n ctx.restore();\n }\n}\n","import Element from '../core/core.element.js';\nimport {_bezierInterpolation, _pointInLine, _steppedInterpolation} from '../helpers/helpers.interpolation.js';\nimport {_computeSegments, _boundSegments} from '../helpers/helpers.segment.js';\nimport {_steppedLineTo, _bezierCurveTo} from '../helpers/helpers.canvas.js';\nimport {_updateBezierControlPoints} from '../helpers/helpers.curve.js';\nimport {valueOrDefault} from '../helpers/index.js';\n\n/**\n * @typedef { import('./element.point.js').default } PointElement\n */\n\nfunction setStyle(ctx, options, style = options) {\n ctx.lineCap = valueOrDefault(style.borderCapStyle, options.borderCapStyle);\n ctx.setLineDash(valueOrDefault(style.borderDash, options.borderDash));\n ctx.lineDashOffset = valueOrDefault(style.borderDashOffset, options.borderDashOffset);\n ctx.lineJoin = valueOrDefault(style.borderJoinStyle, options.borderJoinStyle);\n ctx.lineWidth = valueOrDefault(style.borderWidth, options.borderWidth);\n ctx.strokeStyle = valueOrDefault(style.borderColor, options.borderColor);\n}\n\nfunction lineTo(ctx, previous, target) {\n ctx.lineTo(target.x, target.y);\n}\n\n/**\n * @returns {any}\n */\nfunction getLineMethod(options) {\n if (options.stepped) {\n return _steppedLineTo;\n }\n\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierCurveTo;\n }\n\n return lineTo;\n}\n\nfunction pathVars(points, segment, params = {}) {\n const count = points.length;\n const {start: paramsStart = 0, end: paramsEnd = count - 1} = params;\n const {start: segmentStart, end: segmentEnd} = segment;\n const start = Math.max(paramsStart, segmentStart);\n const end = Math.min(paramsEnd, segmentEnd);\n const outside = paramsStart < segmentStart && paramsEnd < segmentStart || paramsStart > segmentEnd && paramsEnd > segmentEnd;\n\n return {\n count,\n start,\n loop: segment.loop,\n ilen: end < start && !outside ? count + end - start : end - start\n };\n}\n\n/**\n * Create path from points, grouping by truncated x-coordinate\n * Points need to be in order by x-coordinate for this to work efficiently\n * @param {CanvasRenderingContext2D|Path2D} ctx - Context\n * @param {LineElement} line\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} params\n * @param {boolean} params.move - move to starting point (vs line to it)\n * @param {boolean} params.reverse - path the segment from end to start\n * @param {number} params.start - limit segment to points starting from `start` index\n * @param {number} params.end - limit segment to points ending at `start` + `count` index\n */\nfunction pathSegment(ctx, line, segment, params) {\n const {points, options} = line;\n const {count, start, loop, ilen} = pathVars(points, segment, params);\n const lineMethod = getLineMethod(options);\n // eslint-disable-next-line prefer-const\n let {move = true, reverse} = params || {};\n let i, point, prev;\n\n for (i = 0; i <= ilen; ++i) {\n point = points[(start + (reverse ? ilen - i : i)) % count];\n\n if (point.skip) {\n // If there is a skipped point inside a segment, spanGaps must be true\n continue;\n } else if (move) {\n ctx.moveTo(point.x, point.y);\n move = false;\n } else {\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n\n prev = point;\n }\n\n if (loop) {\n point = points[(start + (reverse ? ilen : 0)) % count];\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n\n return !!loop;\n}\n\n/**\n * Create path from points, grouping by truncated x-coordinate\n * Points need to be in order by x-coordinate for this to work efficiently\n * @param {CanvasRenderingContext2D|Path2D} ctx - Context\n * @param {LineElement} line\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} params\n * @param {boolean} params.move - move to starting point (vs line to it)\n * @param {boolean} params.reverse - path the segment from end to start\n * @param {number} params.start - limit segment to points starting from `start` index\n * @param {number} params.end - limit segment to points ending at `start` + `count` index\n */\nfunction fastPathSegment(ctx, line, segment, params) {\n const points = line.points;\n const {count, start, ilen} = pathVars(points, segment, params);\n const {move = true, reverse} = params || {};\n let avgX = 0;\n let countX = 0;\n let i, point, prevX, minY, maxY, lastY;\n\n const pointIndex = (index) => (start + (reverse ? ilen - index : index)) % count;\n const drawX = () => {\n if (minY !== maxY) {\n // Draw line to maxY and minY, using the average x-coordinate\n ctx.lineTo(avgX, maxY);\n ctx.lineTo(avgX, minY);\n // Line to y-value of last point in group. So the line continues\n // from correct position. Not using move, to have solid path.\n ctx.lineTo(avgX, lastY);\n }\n };\n\n if (move) {\n point = points[pointIndex(0)];\n ctx.moveTo(point.x, point.y);\n }\n\n for (i = 0; i <= ilen; ++i) {\n point = points[pointIndex(i)];\n\n if (point.skip) {\n // If there is a skipped point inside a segment, spanGaps must be true\n continue;\n }\n\n const x = point.x;\n const y = point.y;\n const truncX = x | 0; // truncated x-coordinate\n\n if (truncX === prevX) {\n // Determine `minY` / `maxY` and `avgX` while we stay within same x-position\n if (y < minY) {\n minY = y;\n } else if (y > maxY) {\n maxY = y;\n }\n // For first point in group, countX is `0`, so average will be `x` / 1.\n avgX = (countX * avgX + x) / ++countX;\n } else {\n drawX();\n // Draw line to next x-position, using the first (or only)\n // y-value in that group\n ctx.lineTo(x, y);\n\n prevX = truncX;\n countX = 0;\n minY = maxY = y;\n }\n // Keep track of the last y-value in group\n lastY = y;\n }\n drawX();\n}\n\n/**\n * @param {LineElement} line - the line\n * @returns {function}\n * @private\n */\nfunction _getSegmentMethod(line) {\n const opts = line.options;\n const borderDash = opts.borderDash && opts.borderDash.length;\n const useFastPath = !line._decimated && !line._loop && !opts.tension && opts.cubicInterpolationMode !== 'monotone' && !opts.stepped && !borderDash;\n return useFastPath ? fastPathSegment : pathSegment;\n}\n\n/**\n * @private\n */\nfunction _getInterpolationMethod(options) {\n if (options.stepped) {\n return _steppedInterpolation;\n }\n\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierInterpolation;\n }\n\n return _pointInLine;\n}\n\nfunction strokePathWithCache(ctx, line, start, count) {\n let path = line._path;\n if (!path) {\n path = line._path = new Path2D();\n if (line.path(path, start, count)) {\n path.closePath();\n }\n }\n setStyle(ctx, line.options);\n ctx.stroke(path);\n}\n\nfunction strokePathDirect(ctx, line, start, count) {\n const {segments, options} = line;\n const segmentMethod = _getSegmentMethod(line);\n\n for (const segment of segments) {\n setStyle(ctx, options, segment.style);\n ctx.beginPath();\n if (segmentMethod(ctx, line, segment, {start, end: start + count - 1})) {\n ctx.closePath();\n }\n ctx.stroke();\n }\n}\n\nconst usePath2D = typeof Path2D === 'function';\n\nfunction draw(ctx, line, start, count) {\n if (usePath2D && !line.options.segment) {\n strokePathWithCache(ctx, line, start, count);\n } else {\n strokePathDirect(ctx, line, start, count);\n }\n}\n\nexport default class LineElement extends Element {\n\n static id = 'line';\n\n /**\n * @type {any}\n */\n static defaults = {\n borderCapStyle: 'butt',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: 'miter',\n borderWidth: 3,\n capBezierPoints: true,\n cubicInterpolationMode: 'default',\n fill: false,\n spanGaps: false,\n stepped: false,\n tension: 0,\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n\n static descriptors = {\n _scriptable: true,\n _indexable: (name) => name !== 'borderDash' && name !== 'fill',\n };\n\n\n constructor(cfg) {\n super();\n\n this.animated = true;\n this.options = undefined;\n this._chart = undefined;\n this._loop = undefined;\n this._fullLoop = undefined;\n this._path = undefined;\n this._points = undefined;\n this._segments = undefined;\n this._decimated = false;\n this._pointsUpdated = false;\n this._datasetIndex = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n updateControlPoints(chartArea, indexAxis) {\n const options = this.options;\n if ((options.tension || options.cubicInterpolationMode === 'monotone') && !options.stepped && !this._pointsUpdated) {\n const loop = options.spanGaps ? this._loop : this._fullLoop;\n _updateBezierControlPoints(this._points, options, chartArea, loop, indexAxis);\n this._pointsUpdated = true;\n }\n }\n\n set points(points) {\n this._points = points;\n delete this._segments;\n delete this._path;\n this._pointsUpdated = false;\n }\n\n get points() {\n return this._points;\n }\n\n get segments() {\n return this._segments || (this._segments = _computeSegments(this, this.options.segment));\n }\n\n /**\n\t * First non-skipped point on this line\n\t * @returns {PointElement|undefined}\n\t */\n first() {\n const segments = this.segments;\n const points = this.points;\n return segments.length && points[segments[0].start];\n }\n\n /**\n\t * Last non-skipped point on this line\n\t * @returns {PointElement|undefined}\n\t */\n last() {\n const segments = this.segments;\n const points = this.points;\n const count = segments.length;\n return count && points[segments[count - 1].end];\n }\n\n /**\n\t * Interpolate a point in this line at the same value on `property` as\n\t * the reference `point` provided\n\t * @param {PointElement} point - the reference point\n\t * @param {string} property - the property to match on\n\t * @returns {PointElement|undefined}\n\t */\n interpolate(point, property) {\n const options = this.options;\n const value = point[property];\n const points = this.points;\n const segments = _boundSegments(this, {property, start: value, end: value});\n\n if (!segments.length) {\n return;\n }\n\n const result = [];\n const _interpolate = _getInterpolationMethod(options);\n let i, ilen;\n for (i = 0, ilen = segments.length; i < ilen; ++i) {\n const {start, end} = segments[i];\n const p1 = points[start];\n const p2 = points[end];\n if (p1 === p2) {\n result.push(p1);\n continue;\n }\n const t = Math.abs((value - p1[property]) / (p2[property] - p1[property]));\n const interpolated = _interpolate(p1, p2, t, options.stepped);\n interpolated[property] = point[property];\n result.push(interpolated);\n }\n return result.length === 1 ? result[0] : result;\n }\n\n /**\n\t * Append a segment of this line to current path.\n\t * @param {CanvasRenderingContext2D} ctx\n\t * @param {object} segment\n\t * @param {number} segment.start - start index of the segment, referring the points array\n \t * @param {number} segment.end - end index of the segment, referring the points array\n \t * @param {boolean} segment.loop - indicates that the segment is a loop\n\t * @param {object} params\n\t * @param {boolean} params.move - move to starting point (vs line to it)\n\t * @param {boolean} params.reverse - path the segment from end to start\n\t * @param {number} params.start - limit segment to points starting from `start` index\n\t * @param {number} params.end - limit segment to points ending at `start` + `count` index\n\t * @returns {undefined|boolean} - true if the segment is a full loop (path should be closed)\n\t */\n pathSegment(ctx, segment, params) {\n const segmentMethod = _getSegmentMethod(this);\n return segmentMethod(ctx, this, segment, params);\n }\n\n /**\n\t * Append all segments of this line to current path.\n\t * @param {CanvasRenderingContext2D|Path2D} ctx\n\t * @param {number} [start]\n\t * @param {number} [count]\n\t * @returns {undefined|boolean} - true if line is a full loop (path should be closed)\n\t */\n path(ctx, start, count) {\n const segments = this.segments;\n const segmentMethod = _getSegmentMethod(this);\n let loop = this._loop;\n\n start = start || 0;\n count = count || (this.points.length - start);\n\n for (const segment of segments) {\n loop &= segmentMethod(ctx, this, segment, {start, end: start + count - 1});\n }\n return !!loop;\n }\n\n /**\n\t * Draw\n\t * @param {CanvasRenderingContext2D} ctx\n\t * @param {object} chartArea\n\t * @param {number} [start]\n\t * @param {number} [count]\n\t */\n draw(ctx, chartArea, start, count) {\n const options = this.options || {};\n const points = this.points || [];\n\n if (points.length && options.borderWidth) {\n ctx.save();\n\n draw(ctx, this, start, count);\n\n ctx.restore();\n }\n\n if (this.animated) {\n // When line is animated, the control points and path are not cached.\n this._pointsUpdated = false;\n this._path = undefined;\n }\n }\n}\n","import Element from '../core/core.element.js';\nimport {drawPoint, _isPointInArea} from '../helpers/helpers.canvas.js';\nimport type {\n CartesianParsedData,\n ChartArea,\n Point,\n PointHoverOptions,\n PointOptions,\n} from '../types/index.js';\n\nfunction inRange(el: PointElement, pos: number, axis: 'x' | 'y', useFinalPosition?: boolean) {\n const options = el.options;\n const {[axis]: value} = el.getProps([axis], useFinalPosition);\n\n return (Math.abs(pos - value) < options.radius + options.hitRadius);\n}\n\nexport type PointProps = Point\n\nexport default class PointElement extends Element<PointProps, PointOptions & PointHoverOptions> {\n\n static id = 'point';\n\n parsed: CartesianParsedData;\n skip?: boolean;\n stop?: boolean;\n\n /**\n * @type {any}\n */\n static defaults = {\n borderWidth: 1,\n hitRadius: 1,\n hoverBorderWidth: 1,\n hoverRadius: 4,\n pointStyle: 'circle',\n radius: 3,\n rotation: 0\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.parsed = undefined;\n this.skip = undefined;\n this.stop = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n inRange(mouseX: number, mouseY: number, useFinalPosition?: boolean) {\n const options = this.options;\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return ((Math.pow(mouseX - x, 2) + Math.pow(mouseY - y, 2)) < Math.pow(options.hitRadius + options.radius, 2));\n }\n\n inXRange(mouseX: number, useFinalPosition?: boolean) {\n return inRange(this, mouseX, 'x', useFinalPosition);\n }\n\n inYRange(mouseY: number, useFinalPosition?: boolean) {\n return inRange(this, mouseY, 'y', useFinalPosition);\n }\n\n getCenterPoint(useFinalPosition?: boolean) {\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return {x, y};\n }\n\n size(options?: Partial<PointOptions & PointHoverOptions>) {\n options = options || this.options || {};\n let radius = options.radius || 0;\n radius = Math.max(radius, radius && options.hoverRadius || 0);\n const borderWidth = radius && options.borderWidth || 0;\n return (radius + borderWidth) * 2;\n }\n\n draw(ctx: CanvasRenderingContext2D, area: ChartArea) {\n const options = this.options;\n\n if (this.skip || options.radius < 0.1 || !_isPointInArea(this, area, this.size(options) / 2)) {\n return;\n }\n\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n ctx.fillStyle = options.backgroundColor;\n drawPoint(ctx, options, this.x, this.y);\n }\n\n getRange() {\n const options = this.options || {};\n // @ts-expect-error Fallbacks should never be hit in practice\n return options.radius + options.hitRadius;\n }\n}\n","import Element from '../core/core.element.js';\nimport {isObject, _isBetween, _limitValue} from '../helpers/index.js';\nimport {addRoundedRectPath} from '../helpers/helpers.canvas.js';\nimport {toTRBL, toTRBLCorners} from '../helpers/helpers.options.js';\n\n/** @typedef {{ x: number, y: number, base: number, horizontal: boolean, width: number, height: number }} BarProps */\n\n/**\n * Helper function to get the bounds of the bar regardless of the orientation\n * @param {BarElement} bar the bar\n * @param {boolean} [useFinalPosition]\n * @return {object} bounds of the bar\n * @private\n */\nfunction getBarBounds(bar, useFinalPosition) {\n const {x, y, base, width, height} = /** @type {BarProps} */ (bar.getProps(['x', 'y', 'base', 'width', 'height'], useFinalPosition));\n\n let left, right, top, bottom, half;\n\n if (bar.horizontal) {\n half = height / 2;\n left = Math.min(x, base);\n right = Math.max(x, base);\n top = y - half;\n bottom = y + half;\n } else {\n half = width / 2;\n left = x - half;\n right = x + half;\n top = Math.min(y, base);\n bottom = Math.max(y, base);\n }\n\n return {left, top, right, bottom};\n}\n\nfunction skipOrLimit(skip, value, min, max) {\n return skip ? 0 : _limitValue(value, min, max);\n}\n\nfunction parseBorderWidth(bar, maxW, maxH) {\n const value = bar.options.borderWidth;\n const skip = bar.borderSkipped;\n const o = toTRBL(value);\n\n return {\n t: skipOrLimit(skip.top, o.top, 0, maxH),\n r: skipOrLimit(skip.right, o.right, 0, maxW),\n b: skipOrLimit(skip.bottom, o.bottom, 0, maxH),\n l: skipOrLimit(skip.left, o.left, 0, maxW)\n };\n}\n\nfunction parseBorderRadius(bar, maxW, maxH) {\n const {enableBorderRadius} = bar.getProps(['enableBorderRadius']);\n const value = bar.options.borderRadius;\n const o = toTRBLCorners(value);\n const maxR = Math.min(maxW, maxH);\n const skip = bar.borderSkipped;\n\n // If the value is an object, assume the user knows what they are doing\n // and apply as directed.\n const enableBorder = enableBorderRadius || isObject(value);\n\n return {\n topLeft: skipOrLimit(!enableBorder || skip.top || skip.left, o.topLeft, 0, maxR),\n topRight: skipOrLimit(!enableBorder || skip.top || skip.right, o.topRight, 0, maxR),\n bottomLeft: skipOrLimit(!enableBorder || skip.bottom || skip.left, o.bottomLeft, 0, maxR),\n bottomRight: skipOrLimit(!enableBorder || skip.bottom || skip.right, o.bottomRight, 0, maxR)\n };\n}\n\nfunction boundingRects(bar) {\n const bounds = getBarBounds(bar);\n const width = bounds.right - bounds.left;\n const height = bounds.bottom - bounds.top;\n const border = parseBorderWidth(bar, width / 2, height / 2);\n const radius = parseBorderRadius(bar, width / 2, height / 2);\n\n return {\n outer: {\n x: bounds.left,\n y: bounds.top,\n w: width,\n h: height,\n radius\n },\n inner: {\n x: bounds.left + border.l,\n y: bounds.top + border.t,\n w: width - border.l - border.r,\n h: height - border.t - border.b,\n radius: {\n topLeft: Math.max(0, radius.topLeft - Math.max(border.t, border.l)),\n topRight: Math.max(0, radius.topRight - Math.max(border.t, border.r)),\n bottomLeft: Math.max(0, radius.bottomLeft - Math.max(border.b, border.l)),\n bottomRight: Math.max(0, radius.bottomRight - Math.max(border.b, border.r)),\n }\n }\n };\n}\n\nfunction inRange(bar, x, y, useFinalPosition) {\n const skipX = x === null;\n const skipY = y === null;\n const skipBoth = skipX && skipY;\n const bounds = bar && !skipBoth && getBarBounds(bar, useFinalPosition);\n\n return bounds\n\t\t&& (skipX || _isBetween(x, bounds.left, bounds.right))\n\t\t&& (skipY || _isBetween(y, bounds.top, bounds.bottom));\n}\n\nfunction hasRadius(radius) {\n return radius.topLeft || radius.topRight || radius.bottomLeft || radius.bottomRight;\n}\n\n/**\n * Add a path of a rectangle to the current sub-path\n * @param {CanvasRenderingContext2D} ctx Context\n * @param {*} rect Bounding rect\n */\nfunction addNormalRectPath(ctx, rect) {\n ctx.rect(rect.x, rect.y, rect.w, rect.h);\n}\n\nfunction inflateRect(rect, amount, refRect = {}) {\n const x = rect.x !== refRect.x ? -amount : 0;\n const y = rect.y !== refRect.y ? -amount : 0;\n const w = (rect.x + rect.w !== refRect.x + refRect.w ? amount : 0) - x;\n const h = (rect.y + rect.h !== refRect.y + refRect.h ? amount : 0) - y;\n return {\n x: rect.x + x,\n y: rect.y + y,\n w: rect.w + w,\n h: rect.h + h,\n radius: rect.radius\n };\n}\n\nexport default class BarElement extends Element {\n\n static id = 'bar';\n\n /**\n * @type {any}\n */\n static defaults = {\n borderSkipped: 'start',\n borderWidth: 0,\n borderRadius: 0,\n inflateAmount: 'auto',\n pointStyle: undefined\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.horizontal = undefined;\n this.base = undefined;\n this.width = undefined;\n this.height = undefined;\n this.inflateAmount = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n draw(ctx) {\n const {inflateAmount, options: {borderColor, backgroundColor}} = this;\n const {inner, outer} = boundingRects(this);\n const addRectPath = hasRadius(outer.radius) ? addRoundedRectPath : addNormalRectPath;\n\n ctx.save();\n\n if (outer.w !== inner.w || outer.h !== inner.h) {\n ctx.beginPath();\n addRectPath(ctx, inflateRect(outer, inflateAmount, inner));\n ctx.clip();\n addRectPath(ctx, inflateRect(inner, -inflateAmount, outer));\n ctx.fillStyle = borderColor;\n ctx.fill('evenodd');\n }\n\n ctx.beginPath();\n addRectPath(ctx, inflateRect(inner, inflateAmount));\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n\n ctx.restore();\n }\n\n inRange(mouseX, mouseY, useFinalPosition) {\n return inRange(this, mouseX, mouseY, useFinalPosition);\n }\n\n inXRange(mouseX, useFinalPosition) {\n return inRange(this, mouseX, null, useFinalPosition);\n }\n\n inYRange(mouseY, useFinalPosition) {\n return inRange(this, null, mouseY, useFinalPosition);\n }\n\n getCenterPoint(useFinalPosition) {\n const {x, y, base, horizontal} = /** @type {BarProps} */ (this.getProps(['x', 'y', 'base', 'horizontal'], useFinalPosition));\n return {\n x: horizontal ? (x + base) / 2 : x,\n y: horizontal ? y : (y + base) / 2\n };\n }\n\n getRange(axis) {\n return axis === 'x' ? this.width / 2 : this.height / 2;\n }\n}\n","import {Title} from './plugin.title.js';\nimport layouts from '../core/core.layouts.js';\n\nconst map = new WeakMap();\n\nexport default {\n id: 'subtitle',\n\n start(chart, _args, options) {\n const title = new Title({\n ctx: chart.ctx,\n options,\n chart\n });\n\n layouts.configure(chart, title, options);\n layouts.addBox(chart, title);\n map.set(chart, title);\n },\n\n stop(chart) {\n layouts.removeBox(chart, map.get(chart));\n map.delete(chart);\n },\n\n beforeUpdate(chart, _args, options) {\n const title = map.get(chart);\n layouts.configure(chart, title, options);\n title.options = options;\n },\n\n defaults: {\n align: 'center',\n display: false,\n font: {\n weight: 'normal',\n },\n fullSize: true,\n padding: 0,\n position: 'top',\n text: '',\n weight: 1500 // by default greater than legend (1000) and smaller than title (2000)\n },\n\n defaultRoutes: {\n color: 'color'\n },\n\n descriptors: {\n _scriptable: true,\n _indexable: false,\n },\n};\n","import Animations from '../core/core.animations.js';\nimport Element from '../core/core.element.js';\nimport {addRoundedRectPath} from '../helpers/helpers.canvas.js';\nimport {each, noop, isNullOrUndef, isArray, _elementsEqual, isObject} from '../helpers/helpers.core.js';\nimport {toFont, toPadding, toTRBLCorners} from '../helpers/helpers.options.js';\nimport {getRtlAdapter, overrideTextDirection, restoreTextDirection} from '../helpers/helpers.rtl.js';\nimport {distanceBetweenPoints, _limitValue} from '../helpers/helpers.math.js';\nimport {createContext, drawPoint} from '../helpers/index.js';\n\n/**\n * @typedef { import('../platform/platform.base.js').Chart } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../types/index.js').ActiveElement } ActiveElement\n * @typedef { import('../core/core.interaction.js').InteractionItem } InteractionItem\n */\n\nconst positioners = {\n /**\n\t * Average mode places the tooltip at the average position of the elements shown\n\t */\n average(items) {\n if (!items.length) {\n return false;\n }\n\n let i, len;\n let xSet = new Set();\n let y = 0;\n let count = 0;\n\n for (i = 0, len = items.length; i < len; ++i) {\n const el = items[i].element;\n if (el && el.hasValue()) {\n const pos = el.tooltipPosition();\n xSet.add(pos.x);\n y += pos.y;\n ++count;\n }\n }\n\n // No visible items where found, return false so we don't have to divide by 0 which reduces in NaN\n if (count === 0 || xSet.size === 0) {\n return false;\n }\n\n const xAverage = [...xSet].reduce((a, b) => a + b) / xSet.size;\n\n return {\n x: xAverage,\n y: y / count\n };\n },\n\n /**\n\t * Gets the tooltip position nearest of the item nearest to the event position\n\t */\n nearest(items, eventPosition) {\n if (!items.length) {\n return false;\n }\n\n let x = eventPosition.x;\n let y = eventPosition.y;\n let minDistance = Number.POSITIVE_INFINITY;\n let i, len, nearestElement;\n\n for (i = 0, len = items.length; i < len; ++i) {\n const el = items[i].element;\n if (el && el.hasValue()) {\n const center = el.getCenterPoint();\n const d = distanceBetweenPoints(eventPosition, center);\n\n if (d < minDistance) {\n minDistance = d;\n nearestElement = el;\n }\n }\n }\n\n if (nearestElement) {\n const tp = nearestElement.tooltipPosition();\n x = tp.x;\n y = tp.y;\n }\n\n return {\n x,\n y\n };\n }\n};\n\n// Helper to push or concat based on if the 2nd parameter is an array or not\nfunction pushOrConcat(base, toPush) {\n if (toPush) {\n if (isArray(toPush)) {\n // base = base.concat(toPush);\n Array.prototype.push.apply(base, toPush);\n } else {\n base.push(toPush);\n }\n }\n\n return base;\n}\n\n/**\n * Returns array of strings split by newline\n * @param {*} str - The value to split by newline.\n * @returns {string|string[]} value if newline present - Returned from String split() method\n * @function\n */\nfunction splitNewlines(str) {\n if ((typeof str === 'string' || str instanceof String) && str.indexOf('\\n') > -1) {\n return str.split('\\n');\n }\n return str;\n}\n\n\n/**\n * Private helper to create a tooltip item model\n * @param {Chart} chart\n * @param {ActiveElement} item - {element, index, datasetIndex} to create the tooltip item for\n * @return new tooltip item\n */\nfunction createTooltipItem(chart, item) {\n const {element, datasetIndex, index} = item;\n const controller = chart.getDatasetMeta(datasetIndex).controller;\n const {label, value} = controller.getLabelAndValue(index);\n\n return {\n chart,\n label,\n parsed: controller.getParsed(index),\n raw: chart.data.datasets[datasetIndex].data[index],\n formattedValue: value,\n dataset: controller.getDataset(),\n dataIndex: index,\n datasetIndex,\n element\n };\n}\n\n/**\n * Get the size of the tooltip\n */\nfunction getTooltipSize(tooltip, options) {\n const ctx = tooltip.chart.ctx;\n const {body, footer, title} = tooltip;\n const {boxWidth, boxHeight} = options;\n const bodyFont = toFont(options.bodyFont);\n const titleFont = toFont(options.titleFont);\n const footerFont = toFont(options.footerFont);\n const titleLineCount = title.length;\n const footerLineCount = footer.length;\n const bodyLineItemCount = body.length;\n\n const padding = toPadding(options.padding);\n let height = padding.height;\n let width = 0;\n\n // Count of all lines in the body\n let combinedBodyLength = body.reduce((count, bodyItem) => count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length, 0);\n combinedBodyLength += tooltip.beforeBody.length + tooltip.afterBody.length;\n\n if (titleLineCount) {\n height += titleLineCount * titleFont.lineHeight\n\t\t\t+ (titleLineCount - 1) * options.titleSpacing\n\t\t\t+ options.titleMarginBottom;\n }\n if (combinedBodyLength) {\n // Body lines may include some extra height depending on boxHeight\n const bodyLineHeight = options.displayColors ? Math.max(boxHeight, bodyFont.lineHeight) : bodyFont.lineHeight;\n height += bodyLineItemCount * bodyLineHeight\n\t\t\t+ (combinedBodyLength - bodyLineItemCount) * bodyFont.lineHeight\n\t\t\t+ (combinedBodyLength - 1) * options.bodySpacing;\n }\n if (footerLineCount) {\n height += options.footerMarginTop\n\t\t\t+ footerLineCount * footerFont.lineHeight\n\t\t\t+ (footerLineCount - 1) * options.footerSpacing;\n }\n\n // Title width\n let widthPadding = 0;\n const maxLineWidth = function(line) {\n width = Math.max(width, ctx.measureText(line).width + widthPadding);\n };\n\n ctx.save();\n\n ctx.font = titleFont.string;\n each(tooltip.title, maxLineWidth);\n\n // Body width\n ctx.font = bodyFont.string;\n each(tooltip.beforeBody.concat(tooltip.afterBody), maxLineWidth);\n\n // Body lines may include some extra width due to the color box\n widthPadding = options.displayColors ? (boxWidth + 2 + options.boxPadding) : 0;\n each(body, (bodyItem) => {\n each(bodyItem.before, maxLineWidth);\n each(bodyItem.lines, maxLineWidth);\n each(bodyItem.after, maxLineWidth);\n });\n\n // Reset back to 0\n widthPadding = 0;\n\n // Footer width\n ctx.font = footerFont.string;\n each(tooltip.footer, maxLineWidth);\n\n ctx.restore();\n\n // Add padding\n width += padding.width;\n\n return {width, height};\n}\n\nfunction determineYAlign(chart, size) {\n const {y, height} = size;\n\n if (y < height / 2) {\n return 'top';\n } else if (y > (chart.height - height / 2)) {\n return 'bottom';\n }\n return 'center';\n}\n\nfunction doesNotFitWithAlign(xAlign, chart, options, size) {\n const {x, width} = size;\n const caret = options.caretSize + options.caretPadding;\n if (xAlign === 'left' && x + width + caret > chart.width) {\n return true;\n }\n\n if (xAlign === 'right' && x - width - caret < 0) {\n return true;\n }\n}\n\nfunction determineXAlign(chart, options, size, yAlign) {\n const {x, width} = size;\n const {width: chartWidth, chartArea: {left, right}} = chart;\n let xAlign = 'center';\n\n if (yAlign === 'center') {\n xAlign = x <= (left + right) / 2 ? 'left' : 'right';\n } else if (x <= width / 2) {\n xAlign = 'left';\n } else if (x >= chartWidth - width / 2) {\n xAlign = 'right';\n }\n\n if (doesNotFitWithAlign(xAlign, chart, options, size)) {\n xAlign = 'center';\n }\n\n return xAlign;\n}\n\n/**\n * Helper to get the alignment of a tooltip given the size\n */\nfunction determineAlignment(chart, options, size) {\n const yAlign = size.yAlign || options.yAlign || determineYAlign(chart, size);\n\n return {\n xAlign: size.xAlign || options.xAlign || determineXAlign(chart, options, size, yAlign),\n yAlign\n };\n}\n\nfunction alignX(size, xAlign) {\n let {x, width} = size;\n if (xAlign === 'right') {\n x -= width;\n } else if (xAlign === 'center') {\n x -= (width / 2);\n }\n return x;\n}\n\nfunction alignY(size, yAlign, paddingAndSize) {\n // eslint-disable-next-line prefer-const\n let {y, height} = size;\n if (yAlign === 'top') {\n y += paddingAndSize;\n } else if (yAlign === 'bottom') {\n y -= height + paddingAndSize;\n } else {\n y -= (height / 2);\n }\n return y;\n}\n\n/**\n * Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment\n */\nfunction getBackgroundPoint(options, size, alignment, chart) {\n const {caretSize, caretPadding, cornerRadius} = options;\n const {xAlign, yAlign} = alignment;\n const paddingAndSize = caretSize + caretPadding;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(cornerRadius);\n\n let x = alignX(size, xAlign);\n const y = alignY(size, yAlign, paddingAndSize);\n\n if (yAlign === 'center') {\n if (xAlign === 'left') {\n x += paddingAndSize;\n } else if (xAlign === 'right') {\n x -= paddingAndSize;\n }\n } else if (xAlign === 'left') {\n x -= Math.max(topLeft, bottomLeft) + caretSize;\n } else if (xAlign === 'right') {\n x += Math.max(topRight, bottomRight) + caretSize;\n }\n\n return {\n x: _limitValue(x, 0, chart.width - size.width),\n y: _limitValue(y, 0, chart.height - size.height)\n };\n}\n\nfunction getAlignedX(tooltip, align, options) {\n const padding = toPadding(options.padding);\n\n return align === 'center'\n ? tooltip.x + tooltip.width / 2\n : align === 'right'\n ? tooltip.x + tooltip.width - padding.right\n : tooltip.x + padding.left;\n}\n\n/**\n * Helper to build before and after body lines\n */\nfunction getBeforeAfterBodyLines(callback) {\n return pushOrConcat([], splitNewlines(callback));\n}\n\nfunction createTooltipContext(parent, tooltip, tooltipItems) {\n return createContext(parent, {\n tooltip,\n tooltipItems,\n type: 'tooltip'\n });\n}\n\nfunction overrideCallbacks(callbacks, context) {\n const override = context && context.dataset && context.dataset.tooltip && context.dataset.tooltip.callbacks;\n return override ? callbacks.override(override) : callbacks;\n}\n\nconst defaultCallbacks = {\n // Args are: (tooltipItems, data)\n beforeTitle: noop,\n title(tooltipItems) {\n if (tooltipItems.length > 0) {\n const item = tooltipItems[0];\n const labels = item.chart.data.labels;\n const labelCount = labels ? labels.length : 0;\n\n if (this && this.options && this.options.mode === 'dataset') {\n return item.dataset.label || '';\n } else if (item.label) {\n return item.label;\n } else if (labelCount > 0 && item.dataIndex < labelCount) {\n return labels[item.dataIndex];\n }\n }\n\n return '';\n },\n afterTitle: noop,\n\n // Args are: (tooltipItems, data)\n beforeBody: noop,\n\n // Args are: (tooltipItem, data)\n beforeLabel: noop,\n label(tooltipItem) {\n if (this && this.options && this.options.mode === 'dataset') {\n return tooltipItem.label + ': ' + tooltipItem.formattedValue || tooltipItem.formattedValue;\n }\n\n let label = tooltipItem.dataset.label || '';\n\n if (label) {\n label += ': ';\n }\n const value = tooltipItem.formattedValue;\n if (!isNullOrUndef(value)) {\n label += value;\n }\n return label;\n },\n labelColor(tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n borderColor: options.borderColor,\n backgroundColor: options.backgroundColor,\n borderWidth: options.borderWidth,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderRadius: 0,\n };\n },\n labelTextColor() {\n return this.options.bodyColor;\n },\n labelPointStyle(tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n pointStyle: options.pointStyle,\n rotation: options.rotation,\n };\n },\n afterLabel: noop,\n\n // Args are: (tooltipItems, data)\n afterBody: noop,\n\n // Args are: (tooltipItems, data)\n beforeFooter: noop,\n footer: noop,\n afterFooter: noop\n};\n\n/**\n * Invoke callback from object with context and arguments.\n * If callback returns `undefined`, then will be invoked default callback.\n * @param {Record<keyof typeof defaultCallbacks, Function>} callbacks\n * @param {keyof typeof defaultCallbacks} name\n * @param {*} ctx\n * @param {*} arg\n * @returns {any}\n */\nfunction invokeCallbackWithFallback(callbacks, name, ctx, arg) {\n const result = callbacks[name].call(ctx, arg);\n\n if (typeof result === 'undefined') {\n return defaultCallbacks[name].call(ctx, arg);\n }\n\n return result;\n}\n\nexport class Tooltip extends Element {\n\n /**\n * @namespace Chart.Tooltip.positioners\n */\n static positioners = positioners;\n\n constructor(config) {\n super();\n\n this.opacity = 0;\n this._active = [];\n this._eventPosition = undefined;\n this._size = undefined;\n this._cachedAnimations = undefined;\n this._tooltipItems = [];\n this.$animations = undefined;\n this.$context = undefined;\n this.chart = config.chart;\n this.options = config.options;\n this.dataPoints = undefined;\n this.title = undefined;\n this.beforeBody = undefined;\n this.body = undefined;\n this.afterBody = undefined;\n this.footer = undefined;\n this.xAlign = undefined;\n this.yAlign = undefined;\n this.x = undefined;\n this.y = undefined;\n this.height = undefined;\n this.width = undefined;\n this.caretX = undefined;\n this.caretY = undefined;\n // TODO: V4, make this private, rename to `_labelStyles`, and combine with `labelPointStyles`\n // and `labelTextColors` to create a single variable\n this.labelColors = undefined;\n this.labelPointStyles = undefined;\n this.labelTextColors = undefined;\n }\n\n initialize(options) {\n this.options = options;\n this._cachedAnimations = undefined;\n this.$context = undefined;\n }\n\n /**\n\t * @private\n\t */\n _resolveAnimations() {\n const cached = this._cachedAnimations;\n\n if (cached) {\n return cached;\n }\n\n const chart = this.chart;\n const options = this.options.setContext(this.getContext());\n const opts = options.enabled && chart.options.animation && options.animations;\n const animations = new Animations(this.chart, opts);\n if (opts._cacheable) {\n this._cachedAnimations = Object.freeze(animations);\n }\n\n return animations;\n }\n\n /**\n\t * @protected\n\t */\n getContext() {\n return this.$context ||\n\t\t\t(this.$context = createTooltipContext(this.chart.getContext(), this, this._tooltipItems));\n }\n\n getTitle(context, options) {\n const {callbacks} = options;\n\n const beforeTitle = invokeCallbackWithFallback(callbacks, 'beforeTitle', this, context);\n const title = invokeCallbackWithFallback(callbacks, 'title', this, context);\n const afterTitle = invokeCallbackWithFallback(callbacks, 'afterTitle', this, context);\n\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeTitle));\n lines = pushOrConcat(lines, splitNewlines(title));\n lines = pushOrConcat(lines, splitNewlines(afterTitle));\n\n return lines;\n }\n\n getBeforeBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(\n invokeCallbackWithFallback(options.callbacks, 'beforeBody', this, tooltipItems)\n );\n }\n\n getBody(tooltipItems, options) {\n const {callbacks} = options;\n const bodyItems = [];\n\n each(tooltipItems, (context) => {\n const bodyItem = {\n before: [],\n lines: [],\n after: []\n };\n const scoped = overrideCallbacks(callbacks, context);\n pushOrConcat(bodyItem.before, splitNewlines(invokeCallbackWithFallback(scoped, 'beforeLabel', this, context)));\n pushOrConcat(bodyItem.lines, invokeCallbackWithFallback(scoped, 'label', this, context));\n pushOrConcat(bodyItem.after, splitNewlines(invokeCallbackWithFallback(scoped, 'afterLabel', this, context)));\n\n bodyItems.push(bodyItem);\n });\n\n return bodyItems;\n }\n\n getAfterBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(\n invokeCallbackWithFallback(options.callbacks, 'afterBody', this, tooltipItems)\n );\n }\n\n // Get the footer and beforeFooter and afterFooter lines\n getFooter(tooltipItems, options) {\n const {callbacks} = options;\n\n const beforeFooter = invokeCallbackWithFallback(callbacks, 'beforeFooter', this, tooltipItems);\n const footer = invokeCallbackWithFallback(callbacks, 'footer', this, tooltipItems);\n const afterFooter = invokeCallbackWithFallback(callbacks, 'afterFooter', this, tooltipItems);\n\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeFooter));\n lines = pushOrConcat(lines, splitNewlines(footer));\n lines = pushOrConcat(lines, splitNewlines(afterFooter));\n\n return lines;\n }\n\n /**\n\t * @private\n\t */\n _createItems(options) {\n const active = this._active;\n const data = this.chart.data;\n const labelColors = [];\n const labelPointStyles = [];\n const labelTextColors = [];\n let tooltipItems = [];\n let i, len;\n\n for (i = 0, len = active.length; i < len; ++i) {\n tooltipItems.push(createTooltipItem(this.chart, active[i]));\n }\n\n // If the user provided a filter function, use it to modify the tooltip items\n if (options.filter) {\n tooltipItems = tooltipItems.filter((element, index, array) => options.filter(element, index, array, data));\n }\n\n // If the user provided a sorting function, use it to modify the tooltip items\n if (options.itemSort) {\n tooltipItems = tooltipItems.sort((a, b) => options.itemSort(a, b, data));\n }\n\n // Determine colors for boxes\n each(tooltipItems, (context) => {\n const scoped = overrideCallbacks(options.callbacks, context);\n labelColors.push(invokeCallbackWithFallback(scoped, 'labelColor', this, context));\n labelPointStyles.push(invokeCallbackWithFallback(scoped, 'labelPointStyle', this, context));\n labelTextColors.push(invokeCallbackWithFallback(scoped, 'labelTextColor', this, context));\n });\n\n this.labelColors = labelColors;\n this.labelPointStyles = labelPointStyles;\n this.labelTextColors = labelTextColors;\n this.dataPoints = tooltipItems;\n return tooltipItems;\n }\n\n update(changed, replay) {\n const options = this.options.setContext(this.getContext());\n const active = this._active;\n let properties;\n let tooltipItems = [];\n\n if (!active.length) {\n if (this.opacity !== 0) {\n properties = {\n opacity: 0\n };\n }\n } else {\n const position = positioners[options.position].call(this, active, this._eventPosition);\n tooltipItems = this._createItems(options);\n\n this.title = this.getTitle(tooltipItems, options);\n this.beforeBody = this.getBeforeBody(tooltipItems, options);\n this.body = this.getBody(tooltipItems, options);\n this.afterBody = this.getAfterBody(tooltipItems, options);\n this.footer = this.getFooter(tooltipItems, options);\n\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, size);\n const alignment = determineAlignment(this.chart, options, positionAndSize);\n const backgroundPoint = getBackgroundPoint(options, positionAndSize, alignment, this.chart);\n\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n\n properties = {\n opacity: 1,\n x: backgroundPoint.x,\n y: backgroundPoint.y,\n width: size.width,\n height: size.height,\n caretX: position.x,\n caretY: position.y\n };\n }\n\n this._tooltipItems = tooltipItems;\n this.$context = undefined;\n\n if (properties) {\n this._resolveAnimations().update(this, properties);\n }\n\n if (changed && options.external) {\n options.external.call(this, {chart: this.chart, tooltip: this, replay});\n }\n }\n\n drawCaret(tooltipPoint, ctx, size, options) {\n const caretPosition = this.getCaretPosition(tooltipPoint, size, options);\n\n ctx.lineTo(caretPosition.x1, caretPosition.y1);\n ctx.lineTo(caretPosition.x2, caretPosition.y2);\n ctx.lineTo(caretPosition.x3, caretPosition.y3);\n }\n\n getCaretPosition(tooltipPoint, size, options) {\n const {xAlign, yAlign} = this;\n const {caretSize, cornerRadius} = options;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(cornerRadius);\n const {x: ptX, y: ptY} = tooltipPoint;\n const {width, height} = size;\n let x1, x2, x3, y1, y2, y3;\n\n if (yAlign === 'center') {\n y2 = ptY + (height / 2);\n\n if (xAlign === 'left') {\n x1 = ptX;\n x2 = x1 - caretSize;\n\n // Left draws bottom -> top, this y1 is on the bottom\n y1 = y2 + caretSize;\n y3 = y2 - caretSize;\n } else {\n x1 = ptX + width;\n x2 = x1 + caretSize;\n\n // Right draws top -> bottom, thus y1 is on the top\n y1 = y2 - caretSize;\n y3 = y2 + caretSize;\n }\n\n x3 = x1;\n } else {\n if (xAlign === 'left') {\n x2 = ptX + Math.max(topLeft, bottomLeft) + (caretSize);\n } else if (xAlign === 'right') {\n x2 = ptX + width - Math.max(topRight, bottomRight) - caretSize;\n } else {\n x2 = this.caretX;\n }\n\n if (yAlign === 'top') {\n y1 = ptY;\n y2 = y1 - caretSize;\n\n // Top draws left -> right, thus x1 is on the left\n x1 = x2 - caretSize;\n x3 = x2 + caretSize;\n } else {\n y1 = ptY + height;\n y2 = y1 + caretSize;\n\n // Bottom draws right -> left, thus x1 is on the right\n x1 = x2 + caretSize;\n x3 = x2 - caretSize;\n }\n y3 = y1;\n }\n return {x1, x2, x3, y1, y2, y3};\n }\n\n drawTitle(pt, ctx, options) {\n const title = this.title;\n const length = title.length;\n let titleFont, titleSpacing, i;\n\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n pt.x = getAlignedX(this, options.titleAlign, options);\n\n ctx.textAlign = rtlHelper.textAlign(options.titleAlign);\n ctx.textBaseline = 'middle';\n\n titleFont = toFont(options.titleFont);\n titleSpacing = options.titleSpacing;\n\n ctx.fillStyle = options.titleColor;\n ctx.font = titleFont.string;\n\n for (i = 0; i < length; ++i) {\n ctx.fillText(title[i], rtlHelper.x(pt.x), pt.y + titleFont.lineHeight / 2);\n pt.y += titleFont.lineHeight + titleSpacing; // Line Height and spacing\n\n if (i + 1 === length) {\n pt.y += options.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing\n }\n }\n }\n }\n\n /**\n\t * @private\n\t */\n _drawColorBox(ctx, pt, i, rtlHelper, options) {\n const labelColor = this.labelColors[i];\n const labelPointStyle = this.labelPointStyles[i];\n const {boxHeight, boxWidth} = options;\n const bodyFont = toFont(options.bodyFont);\n const colorX = getAlignedX(this, 'left', options);\n const rtlColorX = rtlHelper.x(colorX);\n const yOffSet = boxHeight < bodyFont.lineHeight ? (bodyFont.lineHeight - boxHeight) / 2 : 0;\n const colorY = pt.y + yOffSet;\n\n if (options.usePointStyle) {\n const drawOptions = {\n radius: Math.min(boxWidth, boxHeight) / 2, // fit the circle in the box\n pointStyle: labelPointStyle.pointStyle,\n rotation: labelPointStyle.rotation,\n borderWidth: 1\n };\n // Recalculate x and y for drawPoint() because its expecting\n // x and y to be center of figure (instead of top left)\n const centerX = rtlHelper.leftForLtr(rtlColorX, boxWidth) + boxWidth / 2;\n const centerY = colorY + boxHeight / 2;\n\n // Fill the point with white so that colours merge nicely if the opacity is < 1\n ctx.strokeStyle = options.multiKeyBackground;\n ctx.fillStyle = options.multiKeyBackground;\n drawPoint(ctx, drawOptions, centerX, centerY);\n\n // Draw the point\n ctx.strokeStyle = labelColor.borderColor;\n ctx.fillStyle = labelColor.backgroundColor;\n drawPoint(ctx, drawOptions, centerX, centerY);\n } else {\n // Border\n ctx.lineWidth = isObject(labelColor.borderWidth) ? Math.max(...Object.values(labelColor.borderWidth)) : (labelColor.borderWidth || 1); // TODO, v4 remove fallback\n ctx.strokeStyle = labelColor.borderColor;\n ctx.setLineDash(labelColor.borderDash || []);\n ctx.lineDashOffset = labelColor.borderDashOffset || 0;\n\n // Fill a white rect so that colours merge nicely if the opacity is < 1\n const outerX = rtlHelper.leftForLtr(rtlColorX, boxWidth);\n const innerX = rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), boxWidth - 2);\n const borderRadius = toTRBLCorners(labelColor.borderRadius);\n\n if (Object.values(borderRadius).some(v => v !== 0)) {\n ctx.beginPath();\n ctx.fillStyle = options.multiKeyBackground;\n addRoundedRectPath(ctx, {\n x: outerX,\n y: colorY,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius,\n });\n ctx.fill();\n ctx.stroke();\n\n // Inner square\n ctx.fillStyle = labelColor.backgroundColor;\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: innerX,\n y: colorY + 1,\n w: boxWidth - 2,\n h: boxHeight - 2,\n radius: borderRadius,\n });\n ctx.fill();\n } else {\n // Normal rect\n ctx.fillStyle = options.multiKeyBackground;\n ctx.fillRect(outerX, colorY, boxWidth, boxHeight);\n ctx.strokeRect(outerX, colorY, boxWidth, boxHeight);\n // Inner square\n ctx.fillStyle = labelColor.backgroundColor;\n ctx.fillRect(innerX, colorY + 1, boxWidth - 2, boxHeight - 2);\n }\n }\n\n // restore fillStyle\n ctx.fillStyle = this.labelTextColors[i];\n }\n\n drawBody(pt, ctx, options) {\n const {body} = this;\n const {bodySpacing, bodyAlign, displayColors, boxHeight, boxWidth, boxPadding} = options;\n const bodyFont = toFont(options.bodyFont);\n let bodyLineHeight = bodyFont.lineHeight;\n let xLinePadding = 0;\n\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n const fillLineOfText = function(line) {\n ctx.fillText(line, rtlHelper.x(pt.x + xLinePadding), pt.y + bodyLineHeight / 2);\n pt.y += bodyLineHeight + bodySpacing;\n };\n\n const bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign);\n let bodyItem, textColor, lines, i, j, ilen, jlen;\n\n ctx.textAlign = bodyAlign;\n ctx.textBaseline = 'middle';\n ctx.font = bodyFont.string;\n\n pt.x = getAlignedX(this, bodyAlignForCalculation, options);\n\n // Before body lines\n ctx.fillStyle = options.bodyColor;\n each(this.beforeBody, fillLineOfText);\n\n xLinePadding = displayColors && bodyAlignForCalculation !== 'right'\n ? bodyAlign === 'center' ? (boxWidth / 2 + boxPadding) : (boxWidth + 2 + boxPadding)\n : 0;\n\n // Draw body lines now\n for (i = 0, ilen = body.length; i < ilen; ++i) {\n bodyItem = body[i];\n textColor = this.labelTextColors[i];\n\n ctx.fillStyle = textColor;\n each(bodyItem.before, fillLineOfText);\n\n lines = bodyItem.lines;\n // Draw Legend-like boxes if needed\n if (displayColors && lines.length) {\n this._drawColorBox(ctx, pt, i, rtlHelper, options);\n bodyLineHeight = Math.max(bodyFont.lineHeight, boxHeight);\n }\n\n for (j = 0, jlen = lines.length; j < jlen; ++j) {\n fillLineOfText(lines[j]);\n // Reset for any lines that don't include colorbox\n bodyLineHeight = bodyFont.lineHeight;\n }\n\n each(bodyItem.after, fillLineOfText);\n }\n\n // Reset back to 0 for after body\n xLinePadding = 0;\n bodyLineHeight = bodyFont.lineHeight;\n\n // After body lines\n each(this.afterBody, fillLineOfText);\n pt.y -= bodySpacing; // Remove last body spacing\n }\n\n drawFooter(pt, ctx, options) {\n const footer = this.footer;\n const length = footer.length;\n let footerFont, i;\n\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n pt.x = getAlignedX(this, options.footerAlign, options);\n pt.y += options.footerMarginTop;\n\n ctx.textAlign = rtlHelper.textAlign(options.footerAlign);\n ctx.textBaseline = 'middle';\n\n footerFont = toFont(options.footerFont);\n\n ctx.fillStyle = options.footerColor;\n ctx.font = footerFont.string;\n\n for (i = 0; i < length; ++i) {\n ctx.fillText(footer[i], rtlHelper.x(pt.x), pt.y + footerFont.lineHeight / 2);\n pt.y += footerFont.lineHeight + options.footerSpacing;\n }\n }\n }\n\n drawBackground(pt, ctx, tooltipSize, options) {\n const {xAlign, yAlign} = this;\n const {x, y} = pt;\n const {width, height} = tooltipSize;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(options.cornerRadius);\n\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n\n ctx.beginPath();\n ctx.moveTo(x + topLeft, y);\n if (yAlign === 'top') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width - topRight, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + topRight);\n if (yAlign === 'center' && xAlign === 'right') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width, y + height - bottomRight);\n ctx.quadraticCurveTo(x + width, y + height, x + width - bottomRight, y + height);\n if (yAlign === 'bottom') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + bottomLeft, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - bottomLeft);\n if (yAlign === 'center' && xAlign === 'left') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x, y + topLeft);\n ctx.quadraticCurveTo(x, y, x + topLeft, y);\n ctx.closePath();\n\n ctx.fill();\n\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n }\n\n /**\n\t * Update x/y animation targets when _active elements are animating too\n\t * @private\n\t */\n _updateAnimationTarget(options) {\n const chart = this.chart;\n const anims = this.$animations;\n const animX = anims && anims.x;\n const animY = anims && anims.y;\n if (animX || animY) {\n const position = positioners[options.position].call(this, this._active, this._eventPosition);\n if (!position) {\n return;\n }\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, this._size);\n const alignment = determineAlignment(chart, options, positionAndSize);\n const point = getBackgroundPoint(options, positionAndSize, alignment, chart);\n if (animX._to !== point.x || animY._to !== point.y) {\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n this.width = size.width;\n this.height = size.height;\n this.caretX = position.x;\n this.caretY = position.y;\n this._resolveAnimations().update(this, point);\n }\n }\n }\n\n /**\n * Determine if the tooltip will draw anything\n * @returns {boolean} True if the tooltip will render\n */\n _willRender() {\n return !!this.opacity;\n }\n\n draw(ctx) {\n const options = this.options.setContext(this.getContext());\n let opacity = this.opacity;\n\n if (!opacity) {\n return;\n }\n\n this._updateAnimationTarget(options);\n\n const tooltipSize = {\n width: this.width,\n height: this.height\n };\n const pt = {\n x: this.x,\n y: this.y\n };\n\n // IE11/Edge does not like very small opacities, so snap to 0\n opacity = Math.abs(opacity) < 1e-3 ? 0 : opacity;\n\n const padding = toPadding(options.padding);\n\n // Truthy/falsey value for empty tooltip\n const hasTooltipContent = this.title.length || this.beforeBody.length || this.body.length || this.afterBody.length || this.footer.length;\n\n if (options.enabled && hasTooltipContent) {\n ctx.save();\n ctx.globalAlpha = opacity;\n\n // Draw Background\n this.drawBackground(pt, ctx, tooltipSize, options);\n\n overrideTextDirection(ctx, options.textDirection);\n\n pt.y += padding.top;\n\n // Titles\n this.drawTitle(pt, ctx, options);\n\n // Body\n this.drawBody(pt, ctx, options);\n\n // Footer\n this.drawFooter(pt, ctx, options);\n\n restoreTextDirection(ctx, options.textDirection);\n\n ctx.restore();\n }\n }\n\n /**\n\t * Get active elements in the tooltip\n\t * @returns {Array} Array of elements that are active in the tooltip\n\t */\n getActiveElements() {\n return this._active || [];\n }\n\n /**\n\t * Set active elements in the tooltip\n\t * @param {array} activeElements Array of active datasetIndex/index pairs.\n\t * @param {object} eventPosition Synthetic event position used in positioning\n\t */\n setActiveElements(activeElements, eventPosition) {\n const lastActive = this._active;\n const active = activeElements.map(({datasetIndex, index}) => {\n const meta = this.chart.getDatasetMeta(datasetIndex);\n\n if (!meta) {\n throw new Error('Cannot find a dataset at index ' + datasetIndex);\n }\n\n return {\n datasetIndex,\n element: meta.data[index],\n index,\n };\n });\n const changed = !_elementsEqual(lastActive, active);\n const positionChanged = this._positionChanged(active, eventPosition);\n\n if (changed || positionChanged) {\n this._active = active;\n this._eventPosition = eventPosition;\n this._ignoreReplayEvents = true;\n this.update(true);\n }\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e - The event to handle\n\t * @param {boolean} [replay] - This is a replayed event (from update)\n\t * @param {boolean} [inChartArea] - The event is inside chartArea\n\t * @returns {boolean} true if the tooltip changed\n\t */\n handleEvent(e, replay, inChartArea = true) {\n if (replay && this._ignoreReplayEvents) {\n return false;\n }\n this._ignoreReplayEvents = false;\n\n const options = this.options;\n const lastActive = this._active || [];\n const active = this._getActiveElements(e, lastActive, replay, inChartArea);\n\n // When there are multiple items shown, but the tooltip position is nearest mode\n // an update may need to be made because our position may have changed even though\n // the items are the same as before.\n const positionChanged = this._positionChanged(active, e);\n\n // Remember Last Actives\n const changed = replay || !_elementsEqual(active, lastActive) || positionChanged;\n\n // Only handle target event on tooltip change\n if (changed) {\n this._active = active;\n\n if (options.enabled || options.external) {\n this._eventPosition = {\n x: e.x,\n y: e.y\n };\n\n this.update(true, replay);\n }\n }\n\n return changed;\n }\n\n /**\n\t * Helper for determining the active elements for event\n\t * @param {ChartEvent} e - The event to handle\n\t * @param {InteractionItem[]} lastActive - Previously active elements\n\t * @param {boolean} [replay] - This is a replayed event (from update)\n\t * @param {boolean} [inChartArea] - The event is inside chartArea\n\t * @returns {InteractionItem[]} - Active elements\n\t * @private\n\t */\n _getActiveElements(e, lastActive, replay, inChartArea) {\n const options = this.options;\n\n if (e.type === 'mouseout') {\n return [];\n }\n\n if (!inChartArea) {\n // Let user control the active elements outside chartArea. Eg. using Legend.\n // But make sure that active elements are still valid.\n return lastActive.filter(i =>\n this.chart.data.datasets[i.datasetIndex] &&\n this.chart.getDatasetMeta(i.datasetIndex).controller.getParsed(i.index) !== undefined\n );\n }\n\n // Find Active Elements for tooltips\n const active = this.chart.getElementsAtEventForMode(e, options.mode, options, replay);\n\n if (options.reverse) {\n active.reverse();\n }\n\n return active;\n }\n\n /**\n\t * Determine if the active elements + event combination changes the\n\t * tooltip position\n\t * @param {array} active - Active elements\n\t * @param {ChartEvent} e - Event that triggered the position change\n\t * @returns {boolean} True if the position has changed\n\t */\n _positionChanged(active, e) {\n const {caretX, caretY, options} = this;\n const position = positioners[options.position].call(this, active, e);\n return position !== false && (caretX !== position.x || caretY !== position.y);\n }\n}\n\nexport default {\n id: 'tooltip',\n _element: Tooltip,\n positioners,\n\n afterInit(chart, _args, options) {\n if (options) {\n chart.tooltip = new Tooltip({chart, options});\n }\n },\n\n beforeUpdate(chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n\n reset(chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n\n afterDraw(chart) {\n const tooltip = chart.tooltip;\n\n if (tooltip && tooltip._willRender()) {\n const args = {\n tooltip\n };\n\n if (chart.notifyPlugins('beforeTooltipDraw', {...args, cancelable: true}) === false) {\n return;\n }\n\n tooltip.draw(chart.ctx);\n\n chart.notifyPlugins('afterTooltipDraw', args);\n }\n },\n\n afterEvent(chart, args) {\n if (chart.tooltip) {\n // If the event is replayed from `update`, we should evaluate with the final positions.\n const useFinalPosition = args.replay;\n if (chart.tooltip.handleEvent(args.event, useFinalPosition, args.inChartArea)) {\n // notify chart about the change, so it will render\n args.changed = true;\n }\n }\n },\n\n defaults: {\n enabled: true,\n external: null,\n position: 'average',\n backgroundColor: 'rgba(0,0,0,0.8)',\n titleColor: '#fff',\n titleFont: {\n weight: 'bold',\n },\n titleSpacing: 2,\n titleMarginBottom: 6,\n titleAlign: 'left',\n bodyColor: '#fff',\n bodySpacing: 2,\n bodyFont: {\n },\n bodyAlign: 'left',\n footerColor: '#fff',\n footerSpacing: 2,\n footerMarginTop: 6,\n footerFont: {\n weight: 'bold',\n },\n footerAlign: 'left',\n padding: 6,\n caretPadding: 2,\n caretSize: 5,\n cornerRadius: 6,\n boxHeight: (ctx, opts) => opts.bodyFont.size,\n boxWidth: (ctx, opts) => opts.bodyFont.size,\n multiKeyBackground: '#fff',\n displayColors: true,\n boxPadding: 0,\n borderColor: 'rgba(0,0,0,0)',\n borderWidth: 0,\n animation: {\n duration: 400,\n easing: 'easeOutQuart',\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'width', 'height', 'caretX', 'caretY'],\n },\n opacity: {\n easing: 'linear',\n duration: 200\n }\n },\n callbacks: defaultCallbacks\n },\n\n defaultRoutes: {\n bodyFont: 'font',\n footerFont: 'font',\n titleFont: 'font'\n },\n\n descriptors: {\n _scriptable: (name) => name !== 'filter' && name !== 'itemSort' && name !== 'external',\n _indexable: false,\n callbacks: {\n _scriptable: false,\n _indexable: false,\n },\n animation: {\n _fallback: false\n },\n animations: {\n _fallback: 'animation'\n }\n },\n\n // Resolve additionally from `interaction` options and defaults.\n additionalOptionScopes: ['interaction']\n};\n","import Scale from '../core/core.scale.js';\nimport {isNullOrUndef, valueOrDefault, _limitValue} from '../helpers/index.js';\n\nconst addIfString = (labels, raw, index, addedLabels) => {\n if (typeof raw === 'string') {\n index = labels.push(raw) - 1;\n addedLabels.unshift({index, label: raw});\n } else if (isNaN(raw)) {\n index = null;\n }\n return index;\n};\n\nfunction findOrAddLabel(labels, raw, index, addedLabels) {\n const first = labels.indexOf(raw);\n if (first === -1) {\n return addIfString(labels, raw, index, addedLabels);\n }\n const last = labels.lastIndexOf(raw);\n return first !== last ? index : first;\n}\n\nconst validIndex = (index, max) => index === null ? null : _limitValue(Math.round(index), 0, max);\n\nfunction _getLabelForValue(value) {\n const labels = this.getLabels();\n\n if (value >= 0 && value < labels.length) {\n return labels[value];\n }\n return value;\n}\n\nexport default class CategoryScale extends Scale {\n\n static id = 'category';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: _getLabelForValue\n }\n };\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this._startValue = undefined;\n this._valueRange = 0;\n this._addedLabels = [];\n }\n\n init(scaleOptions) {\n const added = this._addedLabels;\n if (added.length) {\n const labels = this.getLabels();\n for (const {index, label} of added) {\n if (labels[index] === label) {\n labels.splice(index, 1);\n }\n }\n this._addedLabels = [];\n }\n super.init(scaleOptions);\n }\n\n parse(raw, index) {\n if (isNullOrUndef(raw)) {\n return null;\n }\n const labels = this.getLabels();\n index = isFinite(index) && labels[index] === raw ? index\n : findOrAddLabel(labels, raw, valueOrDefault(index, raw), this._addedLabels);\n return validIndex(index, labels.length - 1);\n }\n\n determineDataLimits() {\n const {minDefined, maxDefined} = this.getUserBounds();\n let {min, max} = this.getMinMax(true);\n\n if (this.options.bounds === 'ticks') {\n if (!minDefined) {\n min = 0;\n }\n if (!maxDefined) {\n max = this.getLabels().length - 1;\n }\n }\n\n this.min = min;\n this.max = max;\n }\n\n buildTicks() {\n const min = this.min;\n const max = this.max;\n const offset = this.options.offset;\n const ticks = [];\n let labels = this.getLabels();\n\n // If we are viewing some subset of labels, slice the original array\n labels = (min === 0 && max === labels.length - 1) ? labels : labels.slice(min, max + 1);\n\n this._valueRange = Math.max(labels.length - (offset ? 0 : 1), 1);\n this._startValue = this.min - (offset ? 0.5 : 0);\n\n for (let value = min; value <= max; value++) {\n ticks.push({value});\n }\n return ticks;\n }\n\n getLabelForValue(value) {\n return _getLabelForValue.call(this, value);\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n super.configure();\n\n if (!this.isHorizontal()) {\n // For backward compatibility, vertical category scale reverse is inverted.\n this._reversePixels = !this._reversePixels;\n }\n }\n\n // Used to get data value locations. Value can either be an index or a numerical value\n getPixelForValue(value) {\n if (typeof value !== 'number') {\n value = this.parse(value);\n }\n\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n\n // Must override base implementation because it calls getPixelForValue\n // and category scale can have duplicate values\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n\n getValueForPixel(pixel) {\n return Math.round(this._startValue + this.getDecimalForPixel(pixel) * this._valueRange);\n }\n\n getBasePixel() {\n return this.bottom;\n }\n}\n","import {isNullOrUndef} from '../helpers/helpers.core.js';\nimport {almostEquals, almostWhole, niceNum, _decimalPlaces, _setMinAndMaxByKey, sign, toRadians} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\n\n/**\n * Generate a set of linear ticks for an axis\n * 1. If generationOptions.min, generationOptions.max, and generationOptions.step are defined:\n * if (max - min) / step is an integer, ticks are generated as [min, min + step, ..., max]\n * Note that the generationOptions.maxCount setting is respected in this scenario\n *\n * 2. If generationOptions.min, generationOptions.max, and generationOptions.count is defined\n * spacing = (max - min) / count\n * Ticks are generated as [min, min + spacing, ..., max]\n *\n * 3. If generationOptions.count is defined\n * spacing = (niceMax - niceMin) / count\n *\n * 4. Compute optimal spacing of ticks using niceNum algorithm\n *\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {object[]} array of tick objects\n */\nfunction generateTicks(generationOptions, dataRange) {\n const ticks = [];\n // To get a \"nice\" value for the tick spacing, we will use the appropriately named\n // \"nice number\" algorithm. See https://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks\n // for details.\n\n const MIN_SPACING = 1e-14;\n const {bounds, step, min, max, precision, count, maxTicks, maxDigits, includeBounds} = generationOptions;\n const unit = step || 1;\n const maxSpaces = maxTicks - 1;\n const {min: rmin, max: rmax} = dataRange;\n const minDefined = !isNullOrUndef(min);\n const maxDefined = !isNullOrUndef(max);\n const countDefined = !isNullOrUndef(count);\n const minSpacing = (rmax - rmin) / (maxDigits + 1);\n let spacing = niceNum((rmax - rmin) / maxSpaces / unit) * unit;\n let factor, niceMin, niceMax, numSpaces;\n\n // Beyond MIN_SPACING floating point numbers being to lose precision\n // such that we can't do the math necessary to generate ticks\n if (spacing < MIN_SPACING && !minDefined && !maxDefined) {\n return [{value: rmin}, {value: rmax}];\n }\n\n numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing);\n if (numSpaces > maxSpaces) {\n // If the calculated num of spaces exceeds maxNumSpaces, recalculate it\n spacing = niceNum(numSpaces * spacing / maxSpaces / unit) * unit;\n }\n\n if (!isNullOrUndef(precision)) {\n // If the user specified a precision, round to that number of decimal places\n factor = Math.pow(10, precision);\n spacing = Math.ceil(spacing * factor) / factor;\n }\n\n if (bounds === 'ticks') {\n niceMin = Math.floor(rmin / spacing) * spacing;\n niceMax = Math.ceil(rmax / spacing) * spacing;\n } else {\n niceMin = rmin;\n niceMax = rmax;\n }\n\n if (minDefined && maxDefined && step && almostWhole((max - min) / step, spacing / 1000)) {\n // Case 1: If min, max and stepSize are set and they make an evenly spaced scale use it.\n // spacing = step;\n // numSpaces = (max - min) / spacing;\n // Note that we round here to handle the case where almostWhole translated an FP error\n numSpaces = Math.round(Math.min((max - min) / spacing, maxTicks));\n spacing = (max - min) / numSpaces;\n niceMin = min;\n niceMax = max;\n } else if (countDefined) {\n // Cases 2 & 3, we have a count specified. Handle optional user defined edges to the range.\n // Sometimes these are no-ops, but it makes the code a lot clearer\n // and when a user defined range is specified, we want the correct ticks\n niceMin = minDefined ? min : niceMin;\n niceMax = maxDefined ? max : niceMax;\n numSpaces = count - 1;\n spacing = (niceMax - niceMin) / numSpaces;\n } else {\n // Case 4\n numSpaces = (niceMax - niceMin) / spacing;\n\n // If very close to our rounded value, use it.\n if (almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n numSpaces = Math.round(numSpaces);\n } else {\n numSpaces = Math.ceil(numSpaces);\n }\n }\n\n // The spacing will have changed in cases 1, 2, and 3 so the factor cannot be computed\n // until this point\n const decimalPlaces = Math.max(\n _decimalPlaces(spacing),\n _decimalPlaces(niceMin)\n );\n factor = Math.pow(10, isNullOrUndef(precision) ? decimalPlaces : precision);\n niceMin = Math.round(niceMin * factor) / factor;\n niceMax = Math.round(niceMax * factor) / factor;\n\n let j = 0;\n if (minDefined) {\n if (includeBounds && niceMin !== min) {\n ticks.push({value: min});\n\n if (niceMin < min) {\n j++; // Skip niceMin\n }\n // If the next nice tick is close to min, skip it\n if (almostEquals(Math.round((niceMin + j * spacing) * factor) / factor, min, relativeLabelSize(min, minSpacing, generationOptions))) {\n j++;\n }\n } else if (niceMin < min) {\n j++;\n }\n }\n\n for (; j < numSpaces; ++j) {\n const tickValue = Math.round((niceMin + j * spacing) * factor) / factor;\n if (maxDefined && tickValue > max) {\n break;\n }\n ticks.push({value: tickValue});\n }\n\n if (maxDefined && includeBounds && niceMax !== max) {\n // If the previous tick is too close to max, replace it with max, else add max\n if (ticks.length && almostEquals(ticks[ticks.length - 1].value, max, relativeLabelSize(max, minSpacing, generationOptions))) {\n ticks[ticks.length - 1].value = max;\n } else {\n ticks.push({value: max});\n }\n } else if (!maxDefined || niceMax === max) {\n ticks.push({value: niceMax});\n }\n\n return ticks;\n}\n\nfunction relativeLabelSize(value, minSpacing, {horizontal, minRotation}) {\n const rad = toRadians(minRotation);\n const ratio = (horizontal ? Math.sin(rad) : Math.cos(rad)) || 0.001;\n const length = 0.75 * minSpacing * ('' + value).length;\n return Math.min(minSpacing / ratio, length);\n}\n\nexport default class LinearScaleBase extends Scale {\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.start = undefined;\n /** @type {number} */\n this.end = undefined;\n /** @type {number} */\n this._startValue = undefined;\n /** @type {number} */\n this._endValue = undefined;\n this._valueRange = 0;\n }\n\n parse(raw, index) { // eslint-disable-line no-unused-vars\n if (isNullOrUndef(raw)) {\n return null;\n }\n if ((typeof raw === 'number' || raw instanceof Number) && !isFinite(+raw)) {\n return null;\n }\n\n return +raw;\n }\n\n handleTickRangeOptions() {\n const {beginAtZero} = this.options;\n const {minDefined, maxDefined} = this.getUserBounds();\n let {min, max} = this;\n\n const setMin = v => (min = minDefined ? min : v);\n const setMax = v => (max = maxDefined ? max : v);\n\n if (beginAtZero) {\n const minSign = sign(min);\n const maxSign = sign(max);\n\n if (minSign < 0 && maxSign < 0) {\n setMax(0);\n } else if (minSign > 0 && maxSign > 0) {\n setMin(0);\n }\n }\n\n if (min === max) {\n let offset = max === 0 ? 1 : Math.abs(max * 0.05);\n\n setMax(max + offset);\n\n if (!beginAtZero) {\n setMin(min - offset);\n }\n }\n this.min = min;\n this.max = max;\n }\n\n getTickLimit() {\n const tickOpts = this.options.ticks;\n // eslint-disable-next-line prefer-const\n let {maxTicksLimit, stepSize} = tickOpts;\n let maxTicks;\n\n if (stepSize) {\n maxTicks = Math.ceil(this.max / stepSize) - Math.floor(this.min / stepSize) + 1;\n if (maxTicks > 1000) {\n console.warn(`scales.${this.id}.ticks.stepSize: ${stepSize} would result generating up to ${maxTicks} ticks. Limiting to 1000.`);\n maxTicks = 1000;\n }\n } else {\n maxTicks = this.computeTickLimit();\n maxTicksLimit = maxTicksLimit || 11;\n }\n\n if (maxTicksLimit) {\n maxTicks = Math.min(maxTicksLimit, maxTicks);\n }\n\n return maxTicks;\n }\n\n /**\n\t * @protected\n\t */\n computeTickLimit() {\n return Number.POSITIVE_INFINITY;\n }\n\n buildTicks() {\n const opts = this.options;\n const tickOpts = opts.ticks;\n\n // Figure out what the max number of ticks we can support it is based on the size of\n // the axis area. For now, we say that the minimum tick spacing in pixels must be 40\n // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\n // the graph. Make sure we always have at least 2 ticks\n let maxTicks = this.getTickLimit();\n maxTicks = Math.max(2, maxTicks);\n\n const numericGeneratorOptions = {\n maxTicks,\n bounds: opts.bounds,\n min: opts.min,\n max: opts.max,\n precision: tickOpts.precision,\n step: tickOpts.stepSize,\n count: tickOpts.count,\n maxDigits: this._maxDigits(),\n horizontal: this.isHorizontal(),\n minRotation: tickOpts.minRotation || 0,\n includeBounds: tickOpts.includeBounds !== false\n };\n const dataRange = this._range || this;\n const ticks = generateTicks(numericGeneratorOptions, dataRange);\n\n // At this point, we need to update our max and min given the tick values,\n // since we probably have expanded the range of the scale\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n\n if (opts.reverse) {\n ticks.reverse();\n\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n\n return ticks;\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n const ticks = this.ticks;\n let start = this.min;\n let end = this.max;\n\n super.configure();\n\n if (this.options.offset && ticks.length) {\n const offset = (end - start) / Math.max(ticks.length - 1, 1) / 2;\n start -= offset;\n end += offset;\n }\n this._startValue = start;\n this._endValue = end;\n this._valueRange = end - start;\n }\n\n getLabelForValue(value) {\n return formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n}\n","import {isFinite} from '../helpers/helpers.core.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\nimport {toRadians} from '../helpers/index.js';\n\nexport default class LinearScale extends LinearScaleBase {\n\n static id = 'linear';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: Ticks.formatters.numeric\n }\n };\n\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(true);\n\n this.min = isFinite(min) ? min : 0;\n this.max = isFinite(max) ? max : 1;\n\n // Common base implementation to handle min, max, beginAtZero\n this.handleTickRangeOptions();\n }\n\n /**\n\t * Returns the maximum number of ticks based on the scale dimension\n\t * @protected\n \t */\n computeTickLimit() {\n const horizontal = this.isHorizontal();\n const length = horizontal ? this.width : this.height;\n const minRotation = toRadians(this.options.ticks.minRotation);\n const ratio = (horizontal ? Math.sin(minRotation) : Math.cos(minRotation)) || 0.001;\n const tickFont = this._resolveTickFontOptions(0);\n return Math.ceil(length / Math.min(40, tickFont.lineHeight / ratio));\n }\n\n // Utils\n getPixelForValue(value) {\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n\n getValueForPixel(pixel) {\n return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange;\n }\n}\n","import {finiteOrDefault, isFinite} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {_setMinAndMaxByKey, log10} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\n\nconst log10Floor = v => Math.floor(log10(v));\nconst changeExponent = (v, m) => Math.pow(10, log10Floor(v) + m);\n\nfunction isMajor(tickVal) {\n const remain = tickVal / (Math.pow(10, log10Floor(tickVal)));\n return remain === 1;\n}\n\nfunction steps(min, max, rangeExp) {\n const rangeStep = Math.pow(10, rangeExp);\n const start = Math.floor(min / rangeStep);\n const end = Math.ceil(max / rangeStep);\n return end - start;\n}\n\nfunction startExp(min, max) {\n const range = max - min;\n let rangeExp = log10Floor(range);\n while (steps(min, max, rangeExp) > 10) {\n rangeExp++;\n }\n while (steps(min, max, rangeExp) < 10) {\n rangeExp--;\n }\n return Math.min(rangeExp, log10Floor(min));\n}\n\n\n/**\n * Generate a set of logarithmic ticks\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {object[]} array of tick objects\n */\nfunction generateTicks(generationOptions, {min, max}) {\n min = finiteOrDefault(generationOptions.min, min);\n const ticks = [];\n const minExp = log10Floor(min);\n let exp = startExp(min, max);\n let precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;\n const stepSize = Math.pow(10, exp);\n const base = minExp > exp ? Math.pow(10, minExp) : 0;\n const start = Math.round((min - base) * precision) / precision;\n const offset = Math.floor((min - base) / stepSize / 10) * stepSize * 10;\n let significand = Math.floor((start - offset) / Math.pow(10, exp));\n let value = finiteOrDefault(generationOptions.min, Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision);\n while (value < max) {\n ticks.push({value, major: isMajor(value), significand});\n if (significand >= 10) {\n significand = significand < 15 ? 15 : 20;\n } else {\n significand++;\n }\n if (significand >= 20) {\n exp++;\n significand = 2;\n precision = exp >= 0 ? 1 : precision;\n }\n value = Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision;\n }\n const lastTick = finiteOrDefault(generationOptions.max, value);\n ticks.push({value: lastTick, major: isMajor(lastTick), significand});\n\n return ticks;\n}\n\nexport default class LogarithmicScale extends Scale {\n\n static id = 'logarithmic';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: Ticks.formatters.logarithmic,\n major: {\n enabled: true\n }\n }\n };\n\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.start = undefined;\n /** @type {number} */\n this.end = undefined;\n /** @type {number} */\n this._startValue = undefined;\n this._valueRange = 0;\n }\n\n parse(raw, index) {\n const value = LinearScaleBase.prototype.parse.apply(this, [raw, index]);\n if (value === 0) {\n this._zero = true;\n return undefined;\n }\n return isFinite(value) && value > 0 ? value : null;\n }\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(true);\n\n this.min = isFinite(min) ? Math.max(0, min) : null;\n this.max = isFinite(max) ? Math.max(0, max) : null;\n\n if (this.options.beginAtZero) {\n this._zero = true;\n }\n\n // if data has `0` in it or `beginAtZero` is true, min (non zero) value is at bottom\n // of scale, and it does not equal suggestedMin, lower the min bound by one exp.\n if (this._zero && this.min !== this._suggestedMin && !isFinite(this._userMin)) {\n this.min = min === changeExponent(this.min, 0) ? changeExponent(this.min, -1) : changeExponent(this.min, 0);\n }\n\n this.handleTickRangeOptions();\n }\n\n handleTickRangeOptions() {\n const {minDefined, maxDefined} = this.getUserBounds();\n let min = this.min;\n let max = this.max;\n\n const setMin = v => (min = minDefined ? min : v);\n const setMax = v => (max = maxDefined ? max : v);\n\n if (min === max) {\n if (min <= 0) { // includes null\n setMin(1);\n setMax(10);\n } else {\n setMin(changeExponent(min, -1));\n setMax(changeExponent(max, +1));\n }\n }\n if (min <= 0) {\n setMin(changeExponent(max, -1));\n }\n if (max <= 0) {\n\n setMax(changeExponent(min, +1));\n }\n\n this.min = min;\n this.max = max;\n }\n\n buildTicks() {\n const opts = this.options;\n\n const generationOptions = {\n min: this._userMin,\n max: this._userMax\n };\n const ticks = generateTicks(generationOptions, this);\n\n // At this point, we need to update our max and min given the tick values,\n // since we probably have expanded the range of the scale\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n\n if (opts.reverse) {\n ticks.reverse();\n\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n\n return ticks;\n }\n\n /**\n\t * @param {number} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n return value === undefined\n ? '0'\n : formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n const start = this.min;\n\n super.configure();\n\n this._startValue = log10(start);\n this._valueRange = log10(this.max) - log10(start);\n }\n\n getPixelForValue(value) {\n if (value === undefined || value === 0) {\n value = this.min;\n }\n if (value === null || isNaN(value)) {\n return NaN;\n }\n return this.getPixelForDecimal(value === this.min\n ? 0\n : (log10(value) - this._startValue) / this._valueRange);\n }\n\n getValueForPixel(pixel) {\n const decimal = this.getDecimalForPixel(pixel);\n return Math.pow(10, this._startValue + decimal * this._valueRange);\n }\n}\n","import defaults from '../core/core.defaults.js';\nimport {_longestText, addRoundedRectPath, renderText, _isPointInArea} from '../helpers/helpers.canvas.js';\nimport {HALF_PI, TAU, toDegrees, toRadians, _normalizeAngle, PI} from '../helpers/helpers.math.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\nimport {valueOrDefault, isArray, isFinite, callback as callCallback, isNullOrUndef} from '../helpers/helpers.core.js';\nimport {createContext, toFont, toPadding, toTRBLCorners} from '../helpers/helpers.options.js';\n\nfunction getTickBackdropHeight(opts) {\n const tickOpts = opts.ticks;\n\n if (tickOpts.display && opts.display) {\n const padding = toPadding(tickOpts.backdropPadding);\n return valueOrDefault(tickOpts.font && tickOpts.font.size, defaults.font.size) + padding.height;\n }\n return 0;\n}\n\nfunction measureLabelSize(ctx, font, label) {\n label = isArray(label) ? label : [label];\n return {\n w: _longestText(ctx, font.string, label),\n h: label.length * font.lineHeight\n };\n}\n\nfunction determineLimits(angle, pos, size, min, max) {\n if (angle === min || angle === max) {\n return {\n start: pos - (size / 2),\n end: pos + (size / 2)\n };\n } else if (angle < min || angle > max) {\n return {\n start: pos - size,\n end: pos\n };\n }\n\n return {\n start: pos,\n end: pos + size\n };\n}\n\n/**\n * Helper function to fit a radial linear scale with point labels\n */\nfunction fitWithPointLabels(scale) {\n\n // Right, this is really confusing and there is a lot of maths going on here\n // The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9\n //\n // Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif\n //\n // Solution:\n //\n // We assume the radius of the polygon is half the size of the canvas at first\n // at each index we check if the text overlaps.\n //\n // Where it does, we store that angle and that index.\n //\n // After finding the largest index and angle we calculate how much we need to remove\n // from the shape radius to move the point inwards by that x.\n //\n // We average the left and right distances to get the maximum shape radius that can fit in the box\n // along with labels.\n //\n // Once we have that, we can find the centre point for the chart, by taking the x text protrusion\n // on each side, removing that from the size, halving it and adding the left x protrusion width.\n //\n // This will mean we have a shape fitted to the canvas, as large as it can be with the labels\n // and position it in the most space efficient manner\n //\n // https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif\n\n // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width.\n // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points\n const orig = {\n l: scale.left + scale._padding.left,\n r: scale.right - scale._padding.right,\n t: scale.top + scale._padding.top,\n b: scale.bottom - scale._padding.bottom\n };\n const limits = Object.assign({}, orig);\n const labelSizes = [];\n const padding = [];\n const valueCount = scale._pointLabels.length;\n const pointLabelOpts = scale.options.pointLabels;\n const additionalAngle = pointLabelOpts.centerPointLabels ? PI / valueCount : 0;\n\n for (let i = 0; i < valueCount; i++) {\n const opts = pointLabelOpts.setContext(scale.getPointLabelContext(i));\n padding[i] = opts.padding;\n const pointPosition = scale.getPointPosition(i, scale.drawingArea + padding[i], additionalAngle);\n const plFont = toFont(opts.font);\n const textSize = measureLabelSize(scale.ctx, plFont, scale._pointLabels[i]);\n labelSizes[i] = textSize;\n\n const angleRadians = _normalizeAngle(scale.getIndexAngle(i) + additionalAngle);\n const angle = Math.round(toDegrees(angleRadians));\n const hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n const vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n updateLimits(limits, orig, angleRadians, hLimits, vLimits);\n }\n\n scale.setCenterPoint(\n orig.l - limits.l,\n limits.r - orig.r,\n orig.t - limits.t,\n limits.b - orig.b\n );\n\n // Now that text size is determined, compute the full positions\n scale._pointLabelItems = buildPointLabelItems(scale, labelSizes, padding);\n}\n\nfunction updateLimits(limits, orig, angle, hLimits, vLimits) {\n const sin = Math.abs(Math.sin(angle));\n const cos = Math.abs(Math.cos(angle));\n let x = 0;\n let y = 0;\n if (hLimits.start < orig.l) {\n x = (orig.l - hLimits.start) / sin;\n limits.l = Math.min(limits.l, orig.l - x);\n } else if (hLimits.end > orig.r) {\n x = (hLimits.end - orig.r) / sin;\n limits.r = Math.max(limits.r, orig.r + x);\n }\n if (vLimits.start < orig.t) {\n y = (orig.t - vLimits.start) / cos;\n limits.t = Math.min(limits.t, orig.t - y);\n } else if (vLimits.end > orig.b) {\n y = (vLimits.end - orig.b) / cos;\n limits.b = Math.max(limits.b, orig.b + y);\n }\n}\n\nfunction createPointLabelItem(scale, index, itemOpts) {\n const outerDistance = scale.drawingArea;\n const {extra, additionalAngle, padding, size} = itemOpts;\n const pointLabelPosition = scale.getPointPosition(index, outerDistance + extra + padding, additionalAngle);\n const angle = Math.round(toDegrees(_normalizeAngle(pointLabelPosition.angle + HALF_PI)));\n const y = yForAngle(pointLabelPosition.y, size.h, angle);\n const textAlign = getTextAlignForAngle(angle);\n const left = leftForTextAlign(pointLabelPosition.x, size.w, textAlign);\n return {\n // if to draw or overlapped\n visible: true,\n\n // Text position\n x: pointLabelPosition.x,\n y,\n\n // Text rendering data\n textAlign,\n\n // Bounding box\n left,\n top: y,\n right: left + size.w,\n bottom: y + size.h\n };\n}\n\nfunction isNotOverlapped(item, area) {\n if (!area) {\n return true;\n }\n const {left, top, right, bottom} = item;\n const apexesInArea = _isPointInArea({x: left, y: top}, area) || _isPointInArea({x: left, y: bottom}, area) ||\n _isPointInArea({x: right, y: top}, area) || _isPointInArea({x: right, y: bottom}, area);\n return !apexesInArea;\n}\n\nfunction buildPointLabelItems(scale, labelSizes, padding) {\n const items = [];\n const valueCount = scale._pointLabels.length;\n const opts = scale.options;\n const {centerPointLabels, display} = opts.pointLabels;\n const itemOpts = {\n extra: getTickBackdropHeight(opts) / 2,\n additionalAngle: centerPointLabels ? PI / valueCount : 0\n };\n let area;\n\n for (let i = 0; i < valueCount; i++) {\n itemOpts.padding = padding[i];\n itemOpts.size = labelSizes[i];\n\n const item = createPointLabelItem(scale, i, itemOpts);\n items.push(item);\n if (display === 'auto') {\n item.visible = isNotOverlapped(item, area);\n if (item.visible) {\n area = item;\n }\n }\n }\n return items;\n}\n\nfunction getTextAlignForAngle(angle) {\n if (angle === 0 || angle === 180) {\n return 'center';\n } else if (angle < 180) {\n return 'left';\n }\n\n return 'right';\n}\n\nfunction leftForTextAlign(x, w, align) {\n if (align === 'right') {\n x -= w;\n } else if (align === 'center') {\n x -= (w / 2);\n }\n return x;\n}\n\nfunction yForAngle(y, h, angle) {\n if (angle === 90 || angle === 270) {\n y -= (h / 2);\n } else if (angle > 270 || angle < 90) {\n y -= h;\n }\n return y;\n}\n\nfunction drawPointLabelBox(ctx, opts, item) {\n const {left, top, right, bottom} = item;\n const {backdropColor} = opts;\n\n if (!isNullOrUndef(backdropColor)) {\n const borderRadius = toTRBLCorners(opts.borderRadius);\n const padding = toPadding(opts.backdropPadding);\n ctx.fillStyle = backdropColor;\n\n const backdropLeft = left - padding.left;\n const backdropTop = top - padding.top;\n const backdropWidth = right - left + padding.width;\n const backdropHeight = bottom - top + padding.height;\n\n if (Object.values(borderRadius).some(v => v !== 0)) {\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: backdropLeft,\n y: backdropTop,\n w: backdropWidth,\n h: backdropHeight,\n radius: borderRadius,\n });\n ctx.fill();\n } else {\n ctx.fillRect(backdropLeft, backdropTop, backdropWidth, backdropHeight);\n }\n }\n}\n\nfunction drawPointLabels(scale, labelCount) {\n const {ctx, options: {pointLabels}} = scale;\n\n for (let i = labelCount - 1; i >= 0; i--) {\n const item = scale._pointLabelItems[i];\n if (!item.visible) {\n // overlapping\n continue;\n }\n const optsAtIndex = pointLabels.setContext(scale.getPointLabelContext(i));\n drawPointLabelBox(ctx, optsAtIndex, item);\n const plFont = toFont(optsAtIndex.font);\n const {x, y, textAlign} = item;\n\n renderText(\n ctx,\n scale._pointLabels[i],\n x,\n y + (plFont.lineHeight / 2),\n plFont,\n {\n color: optsAtIndex.color,\n textAlign: textAlign,\n textBaseline: 'middle'\n }\n );\n }\n}\n\nfunction pathRadiusLine(scale, radius, circular, labelCount) {\n const {ctx} = scale;\n if (circular) {\n // Draw circular arcs between the points\n ctx.arc(scale.xCenter, scale.yCenter, radius, 0, TAU);\n } else {\n // Draw straight lines connecting each index\n let pointPosition = scale.getPointPosition(0, radius);\n ctx.moveTo(pointPosition.x, pointPosition.y);\n\n for (let i = 1; i < labelCount; i++) {\n pointPosition = scale.getPointPosition(i, radius);\n ctx.lineTo(pointPosition.x, pointPosition.y);\n }\n }\n}\n\nfunction drawRadiusLine(scale, gridLineOpts, radius, labelCount, borderOpts) {\n const ctx = scale.ctx;\n const circular = gridLineOpts.circular;\n\n const {color, lineWidth} = gridLineOpts;\n\n if ((!circular && !labelCount) || !color || !lineWidth || radius < 0) {\n return;\n }\n\n ctx.save();\n ctx.strokeStyle = color;\n ctx.lineWidth = lineWidth;\n ctx.setLineDash(borderOpts.dash || []);\n ctx.lineDashOffset = borderOpts.dashOffset;\n\n ctx.beginPath();\n pathRadiusLine(scale, radius, circular, labelCount);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n}\n\nfunction createPointLabelContext(parent, index, label) {\n return createContext(parent, {\n label,\n index,\n type: 'pointLabel'\n });\n}\n\nexport default class RadialLinearScale extends LinearScaleBase {\n\n static id = 'radialLinear';\n\n /**\n * @type {any}\n */\n static defaults = {\n display: true,\n\n // Boolean - Whether to animate scaling the chart from the centre\n animate: true,\n position: 'chartArea',\n\n angleLines: {\n display: true,\n lineWidth: 1,\n borderDash: [],\n borderDashOffset: 0.0\n },\n\n grid: {\n circular: false\n },\n\n startAngle: 0,\n\n // label settings\n ticks: {\n // Boolean - Show a backdrop to the scale label\n showLabelBackdrop: true,\n\n callback: Ticks.formatters.numeric\n },\n\n pointLabels: {\n backdropColor: undefined,\n\n // Number - The backdrop padding above & below the label in pixels\n backdropPadding: 2,\n\n // Boolean - if true, show point labels\n display: true,\n\n // Number - Point label font size in pixels\n font: {\n size: 10\n },\n\n // Function - Used to convert point labels\n callback(label) {\n return label;\n },\n\n // Number - Additionl padding between scale and pointLabel\n padding: 5,\n\n // Boolean - if true, center point labels to slices in polar chart\n centerPointLabels: false\n }\n };\n\n static defaultRoutes = {\n 'angleLines.color': 'borderColor',\n 'pointLabels.color': 'color',\n 'ticks.color': 'color'\n };\n\n static descriptors = {\n angleLines: {\n _fallback: 'grid'\n }\n };\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.xCenter = undefined;\n /** @type {number} */\n this.yCenter = undefined;\n /** @type {number} */\n this.drawingArea = undefined;\n /** @type {string[]} */\n this._pointLabels = [];\n this._pointLabelItems = [];\n }\n\n setDimensions() {\n // Set the unconstrained dimension before label rotation\n const padding = this._padding = toPadding(getTickBackdropHeight(this.options) / 2);\n const w = this.width = this.maxWidth - padding.width;\n const h = this.height = this.maxHeight - padding.height;\n this.xCenter = Math.floor(this.left + w / 2 + padding.left);\n this.yCenter = Math.floor(this.top + h / 2 + padding.top);\n this.drawingArea = Math.floor(Math.min(w, h) / 2);\n }\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(false);\n\n this.min = isFinite(min) && !isNaN(min) ? min : 0;\n this.max = isFinite(max) && !isNaN(max) ? max : 0;\n\n // Common base implementation to handle min, max, beginAtZero\n this.handleTickRangeOptions();\n }\n\n /**\n\t * Returns the maximum number of ticks based on the scale dimension\n\t * @protected\n\t */\n computeTickLimit() {\n return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options));\n }\n\n generateTickLabels(ticks) {\n LinearScaleBase.prototype.generateTickLabels.call(this, ticks);\n\n // Point labels\n this._pointLabels = this.getLabels()\n .map((value, index) => {\n const label = callCallback(this.options.pointLabels.callback, [value, index], this);\n return label || label === 0 ? label : '';\n })\n .filter((v, i) => this.chart.getDataVisibility(i));\n }\n\n fit() {\n const opts = this.options;\n\n if (opts.display && opts.pointLabels.display) {\n fitWithPointLabels(this);\n } else {\n this.setCenterPoint(0, 0, 0, 0);\n }\n }\n\n setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) {\n this.xCenter += Math.floor((leftMovement - rightMovement) / 2);\n this.yCenter += Math.floor((topMovement - bottomMovement) / 2);\n this.drawingArea -= Math.min(this.drawingArea / 2, Math.max(leftMovement, rightMovement, topMovement, bottomMovement));\n }\n\n getIndexAngle(index) {\n const angleMultiplier = TAU / (this._pointLabels.length || 1);\n const startAngle = this.options.startAngle || 0;\n\n return _normalizeAngle(index * angleMultiplier + toRadians(startAngle));\n }\n\n getDistanceFromCenterForValue(value) {\n if (isNullOrUndef(value)) {\n return NaN;\n }\n\n // Take into account half font size + the yPadding of the top value\n const scalingFactor = this.drawingArea / (this.max - this.min);\n if (this.options.reverse) {\n return (this.max - value) * scalingFactor;\n }\n return (value - this.min) * scalingFactor;\n }\n\n getValueForDistanceFromCenter(distance) {\n if (isNullOrUndef(distance)) {\n return NaN;\n }\n\n const scaledDistance = distance / (this.drawingArea / (this.max - this.min));\n return this.options.reverse ? this.max - scaledDistance : this.min + scaledDistance;\n }\n\n getPointLabelContext(index) {\n const pointLabels = this._pointLabels || [];\n\n if (index >= 0 && index < pointLabels.length) {\n const pointLabel = pointLabels[index];\n return createPointLabelContext(this.getContext(), index, pointLabel);\n }\n }\n\n getPointPosition(index, distanceFromCenter, additionalAngle = 0) {\n const angle = this.getIndexAngle(index) - HALF_PI + additionalAngle;\n return {\n x: Math.cos(angle) * distanceFromCenter + this.xCenter,\n y: Math.sin(angle) * distanceFromCenter + this.yCenter,\n angle\n };\n }\n\n getPointPositionForValue(index, value) {\n return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n }\n\n getBasePosition(index) {\n return this.getPointPositionForValue(index || 0, this.getBaseValue());\n }\n\n getPointLabelPosition(index) {\n const {left, top, right, bottom} = this._pointLabelItems[index];\n return {\n left,\n top,\n right,\n bottom,\n };\n }\n\n /**\n\t * @protected\n\t */\n drawBackground() {\n const {backgroundColor, grid: {circular}} = this.options;\n if (backgroundColor) {\n const ctx = this.ctx;\n ctx.save();\n ctx.beginPath();\n pathRadiusLine(this, this.getDistanceFromCenterForValue(this._endValue), circular, this._pointLabels.length);\n ctx.closePath();\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n ctx.restore();\n }\n }\n\n /**\n\t * @protected\n\t */\n drawGrid() {\n const ctx = this.ctx;\n const opts = this.options;\n const {angleLines, grid, border} = opts;\n const labelCount = this._pointLabels.length;\n\n let i, offset, position;\n\n if (opts.pointLabels.display) {\n drawPointLabels(this, labelCount);\n }\n\n if (grid.display) {\n this.ticks.forEach((tick, index) => {\n if (index !== 0 || (index === 0 && this.min < 0)) {\n offset = this.getDistanceFromCenterForValue(tick.value);\n const context = this.getContext(index);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n\n drawRadiusLine(this, optsAtIndex, offset, labelCount, optsAtIndexBorder);\n }\n });\n }\n\n if (angleLines.display) {\n ctx.save();\n\n for (i = labelCount - 1; i >= 0; i--) {\n const optsAtIndex = angleLines.setContext(this.getPointLabelContext(i));\n const {color, lineWidth} = optsAtIndex;\n\n if (!lineWidth || !color) {\n continue;\n }\n\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = color;\n\n ctx.setLineDash(optsAtIndex.borderDash);\n ctx.lineDashOffset = optsAtIndex.borderDashOffset;\n\n offset = this.getDistanceFromCenterForValue(opts.reverse ? this.min : this.max);\n position = this.getPointPosition(i, offset);\n ctx.beginPath();\n ctx.moveTo(this.xCenter, this.yCenter);\n ctx.lineTo(position.x, position.y);\n ctx.stroke();\n }\n\n ctx.restore();\n }\n }\n\n /**\n\t * @protected\n\t */\n drawBorder() {}\n\n /**\n\t * @protected\n\t */\n drawLabels() {\n const ctx = this.ctx;\n const opts = this.options;\n const tickOpts = opts.ticks;\n\n if (!tickOpts.display) {\n return;\n }\n\n const startAngle = this.getIndexAngle(0);\n let offset, width;\n\n ctx.save();\n ctx.translate(this.xCenter, this.yCenter);\n ctx.rotate(startAngle);\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n\n this.ticks.forEach((tick, index) => {\n if ((index === 0 && this.min >= 0) && !opts.reverse) {\n return;\n }\n\n const optsAtIndex = tickOpts.setContext(this.getContext(index));\n const tickFont = toFont(optsAtIndex.font);\n offset = this.getDistanceFromCenterForValue(this.ticks[index].value);\n\n if (optsAtIndex.showLabelBackdrop) {\n ctx.font = tickFont.string;\n width = ctx.measureText(tick.label).width;\n ctx.fillStyle = optsAtIndex.backdropColor;\n\n const padding = toPadding(optsAtIndex.backdropPadding);\n ctx.fillRect(\n -width / 2 - padding.left,\n -offset - tickFont.size / 2 - padding.top,\n width + padding.width,\n tickFont.size + padding.height\n );\n }\n\n renderText(ctx, tick.label, 0, -offset, tickFont, {\n color: optsAtIndex.color,\n strokeColor: optsAtIndex.textStrokeColor,\n strokeWidth: optsAtIndex.textStrokeWidth,\n });\n });\n\n ctx.restore();\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {}\n}\n","import adapters from '../core/core.adapters.js';\nimport {callback as call, isFinite, isNullOrUndef, mergeIf, valueOrDefault} from '../helpers/helpers.core.js';\nimport {toRadians, isNumber, _limitValue} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport {_arrayUnique, _filterBetween, _lookup} from '../helpers/helpers.collection.js';\n\n/**\n * @typedef { import('../core/core.adapters.js').TimeUnit } Unit\n * @typedef {{common: boolean, size: number, steps?: number}} Interval\n * @typedef { import('../core/core.adapters.js').DateAdapter } DateAdapter\n */\n\n/**\n * @type {Object<Unit, Interval>}\n */\nconst INTERVALS = {\n millisecond: {common: true, size: 1, steps: 1000},\n second: {common: true, size: 1000, steps: 60},\n minute: {common: true, size: 60000, steps: 60},\n hour: {common: true, size: 3600000, steps: 24},\n day: {common: true, size: 86400000, steps: 30},\n week: {common: false, size: 604800000, steps: 4},\n month: {common: true, size: 2.628e9, steps: 12},\n quarter: {common: false, size: 7.884e9, steps: 4},\n year: {common: true, size: 3.154e10}\n};\n\n/**\n * @type {Unit[]}\n */\nconst UNITS = /** @type Unit[] */ /* #__PURE__ */ (Object.keys(INTERVALS));\n\n/**\n * @param {number} a\n * @param {number} b\n */\nfunction sorter(a, b) {\n return a - b;\n}\n\n/**\n * @param {TimeScale} scale\n * @param {*} input\n * @return {number}\n */\nfunction parse(scale, input) {\n if (isNullOrUndef(input)) {\n return null;\n }\n\n const adapter = scale._adapter;\n const {parser, round, isoWeekday} = scale._parseOpts;\n let value = input;\n\n if (typeof parser === 'function') {\n value = parser(value);\n }\n\n // Only parse if it's not a timestamp already\n if (!isFinite(value)) {\n value = typeof parser === 'string'\n ? adapter.parse(value, parser)\n : adapter.parse(value);\n }\n\n if (value === null) {\n return null;\n }\n\n if (round) {\n value = round === 'week' && (isNumber(isoWeekday) || isoWeekday === true)\n ? adapter.startOf(value, 'isoWeek', isoWeekday)\n : adapter.startOf(value, round);\n }\n\n return +value;\n}\n\n/**\n * Figures out what unit results in an appropriate number of auto-generated ticks\n * @param {Unit} minUnit\n * @param {number} min\n * @param {number} max\n * @param {number} capacity\n * @return {object}\n */\nfunction determineUnitForAutoTicks(minUnit, min, max, capacity) {\n const ilen = UNITS.length;\n\n for (let i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) {\n const interval = INTERVALS[UNITS[i]];\n const factor = interval.steps ? interval.steps : Number.MAX_SAFE_INTEGER;\n\n if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n return UNITS[i];\n }\n }\n\n return UNITS[ilen - 1];\n}\n\n/**\n * Figures out what unit to format a set of ticks with\n * @param {TimeScale} scale\n * @param {number} numTicks\n * @param {Unit} minUnit\n * @param {number} min\n * @param {number} max\n * @return {Unit}\n */\nfunction determineUnitForFormatting(scale, numTicks, minUnit, min, max) {\n for (let i = UNITS.length - 1; i >= UNITS.indexOf(minUnit); i--) {\n const unit = UNITS[i];\n if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= numTicks - 1) {\n return unit;\n }\n }\n\n return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];\n}\n\n/**\n * @param {Unit} unit\n * @return {object}\n */\nfunction determineMajorUnit(unit) {\n for (let i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) {\n if (INTERVALS[UNITS[i]].common) {\n return UNITS[i];\n }\n }\n}\n\n/**\n * @param {object} ticks\n * @param {number} time\n * @param {number[]} [timestamps] - if defined, snap to these timestamps\n */\nfunction addTick(ticks, time, timestamps) {\n if (!timestamps) {\n ticks[time] = true;\n } else if (timestamps.length) {\n const {lo, hi} = _lookup(timestamps, time);\n const timestamp = timestamps[lo] >= time ? timestamps[lo] : timestamps[hi];\n ticks[timestamp] = true;\n }\n}\n\n/**\n * @param {TimeScale} scale\n * @param {object[]} ticks\n * @param {object} map\n * @param {Unit} majorUnit\n * @return {object[]}\n */\nfunction setMajorTicks(scale, ticks, map, majorUnit) {\n const adapter = scale._adapter;\n const first = +adapter.startOf(ticks[0].value, majorUnit);\n const last = ticks[ticks.length - 1].value;\n let major, index;\n\n for (major = first; major <= last; major = +adapter.add(major, 1, majorUnit)) {\n index = map[major];\n if (index >= 0) {\n ticks[index].major = true;\n }\n }\n return ticks;\n}\n\n/**\n * @param {TimeScale} scale\n * @param {number[]} values\n * @param {Unit|undefined} [majorUnit]\n * @return {object[]}\n */\nfunction ticksFromTimestamps(scale, values, majorUnit) {\n const ticks = [];\n /** @type {Object<number,object>} */\n const map = {};\n const ilen = values.length;\n let i, value;\n\n for (i = 0; i < ilen; ++i) {\n value = values[i];\n map[value] = i;\n\n ticks.push({\n value,\n major: false\n });\n }\n\n // We set the major ticks separately from the above loop because calling startOf for every tick\n // is expensive when there is a large number of ticks\n return (ilen === 0 || !majorUnit) ? ticks : setMajorTicks(scale, ticks, map, majorUnit);\n}\n\nexport default class TimeScale extends Scale {\n\n static id = 'time';\n\n /**\n * @type {any}\n */\n static defaults = {\n /**\n * Scale boundary strategy (bypassed by min/max time options)\n * - `data`: make sure data are fully visible, ticks outside are removed\n * - `ticks`: make sure ticks are fully visible, data outside are truncated\n * @see https://github.com/chartjs/Chart.js/pull/4556\n * @since 2.7.0\n */\n bounds: 'data',\n\n adapters: {},\n time: {\n parser: false, // false == a pattern string from or a custom callback that converts its argument to a timestamp\n unit: false, // false == automatic or override with week, month, year, etc.\n round: false, // none, or override with week, month, year, etc.\n isoWeekday: false, // override week start day\n minUnit: 'millisecond',\n displayFormats: {}\n },\n ticks: {\n /**\n * Ticks generation input values:\n * - 'auto': generates \"optimal\" ticks based on scale size and time options.\n * - 'data': generates ticks from data (including labels from data {t|x|y} objects).\n * - 'labels': generates ticks from user given `data.labels` values ONLY.\n * @see https://github.com/chartjs/Chart.js/pull/4507\n * @since 2.7.0\n */\n source: 'auto',\n\n callback: false,\n\n major: {\n enabled: false\n }\n }\n };\n\n /**\n\t * @param {object} props\n\t */\n constructor(props) {\n super(props);\n\n /** @type {{data: number[], labels: number[], all: number[]}} */\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n\n /** @type {Unit} */\n this._unit = 'day';\n /** @type {Unit=} */\n this._majorUnit = undefined;\n this._offsets = {};\n this._normalized = false;\n this._parseOpts = undefined;\n }\n\n init(scaleOpts, opts = {}) {\n const time = scaleOpts.time || (scaleOpts.time = {});\n /** @type {DateAdapter} */\n const adapter = this._adapter = new adapters._date(scaleOpts.adapters.date);\n\n adapter.init(opts);\n\n // Backward compatibility: before introducing adapter, `displayFormats` was\n // supposed to contain *all* unit/string pairs but this can't be resolved\n // when loading the scale (adapters are loaded afterward), so let's populate\n // missing formats on update\n mergeIf(time.displayFormats, adapter.formats());\n\n this._parseOpts = {\n parser: time.parser,\n round: time.round,\n isoWeekday: time.isoWeekday\n };\n\n super.init(scaleOpts);\n\n this._normalized = opts.normalized;\n }\n\n /**\n\t * @param {*} raw\n\t * @param {number?} [index]\n\t * @return {number}\n\t */\n parse(raw, index) { // eslint-disable-line no-unused-vars\n if (raw === undefined) {\n return null;\n }\n return parse(this, raw);\n }\n\n beforeLayout() {\n super.beforeLayout();\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n }\n\n determineDataLimits() {\n const options = this.options;\n const adapter = this._adapter;\n const unit = options.time.unit || 'day';\n // eslint-disable-next-line prefer-const\n let {min, max, minDefined, maxDefined} = this.getUserBounds();\n\n /**\n\t\t * @param {object} bounds\n\t\t */\n function _applyBounds(bounds) {\n if (!minDefined && !isNaN(bounds.min)) {\n min = Math.min(min, bounds.min);\n }\n if (!maxDefined && !isNaN(bounds.max)) {\n max = Math.max(max, bounds.max);\n }\n }\n\n // If we have user provided `min` and `max` labels / data bounds can be ignored\n if (!minDefined || !maxDefined) {\n // Labels are always considered, when user did not force bounds\n _applyBounds(this._getLabelBounds());\n\n // If `bounds` is `'ticks'` and `ticks.source` is `'labels'`,\n // data bounds are ignored (and don't need to be determined)\n if (options.bounds !== 'ticks' || options.ticks.source !== 'labels') {\n _applyBounds(this.getMinMax(false));\n }\n }\n\n min = isFinite(min) && !isNaN(min) ? min : +adapter.startOf(Date.now(), unit);\n max = isFinite(max) && !isNaN(max) ? max : +adapter.endOf(Date.now(), unit) + 1;\n\n // Make sure that max is strictly higher than min (required by the timeseries lookup table)\n this.min = Math.min(min, max - 1);\n this.max = Math.max(min + 1, max);\n }\n\n /**\n\t * @private\n\t */\n _getLabelBounds() {\n const arr = this.getLabelTimestamps();\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n\n if (arr.length) {\n min = arr[0];\n max = arr[arr.length - 1];\n }\n return {min, max};\n }\n\n /**\n\t * @return {object[]}\n\t */\n buildTicks() {\n const options = this.options;\n const timeOpts = options.time;\n const tickOpts = options.ticks;\n const timestamps = tickOpts.source === 'labels' ? this.getLabelTimestamps() : this._generate();\n\n if (options.bounds === 'ticks' && timestamps.length) {\n this.min = this._userMin || timestamps[0];\n this.max = this._userMax || timestamps[timestamps.length - 1];\n }\n\n const min = this.min;\n const max = this.max;\n\n const ticks = _filterBetween(timestamps, min, max);\n\n // PRIVATE\n // determineUnitForFormatting relies on the number of ticks so we don't use it when\n // autoSkip is enabled because we don't yet know what the final number of ticks will be\n this._unit = timeOpts.unit || (tickOpts.autoSkip\n ? determineUnitForAutoTicks(timeOpts.minUnit, this.min, this.max, this._getLabelCapacity(min))\n : determineUnitForFormatting(this, ticks.length, timeOpts.minUnit, this.min, this.max));\n this._majorUnit = !tickOpts.major.enabled || this._unit === 'year' ? undefined\n : determineMajorUnit(this._unit);\n this.initOffsets(timestamps);\n\n if (options.reverse) {\n ticks.reverse();\n }\n\n return ticksFromTimestamps(this, ticks, this._majorUnit);\n }\n\n afterAutoSkip() {\n // Offsets for bar charts need to be handled with the auto skipped\n // ticks. Once ticks have been skipped, we re-compute the offsets.\n if (this.options.offsetAfterAutoskip) {\n this.initOffsets(this.ticks.map(tick => +tick.value));\n }\n }\n\n /**\n\t * Returns the start and end offsets from edges in the form of {start, end}\n\t * where each value is a relative width to the scale and ranges between 0 and 1.\n\t * They add extra margins on the both sides by scaling down the original scale.\n\t * Offsets are added when the `offset` option is true.\n\t * @param {number[]} timestamps\n\t * @protected\n\t */\n initOffsets(timestamps = []) {\n let start = 0;\n let end = 0;\n let first, last;\n\n if (this.options.offset && timestamps.length) {\n first = this.getDecimalForValue(timestamps[0]);\n if (timestamps.length === 1) {\n start = 1 - first;\n } else {\n start = (this.getDecimalForValue(timestamps[1]) - first) / 2;\n }\n last = this.getDecimalForValue(timestamps[timestamps.length - 1]);\n if (timestamps.length === 1) {\n end = last;\n } else {\n end = (last - this.getDecimalForValue(timestamps[timestamps.length - 2])) / 2;\n }\n }\n const limit = timestamps.length < 3 ? 0.5 : 0.25;\n start = _limitValue(start, 0, limit);\n end = _limitValue(end, 0, limit);\n\n this._offsets = {start, end, factor: 1 / (start + 1 + end)};\n }\n\n /**\n\t * Generates a maximum of `capacity` timestamps between min and max, rounded to the\n\t * `minor` unit using the given scale time `options`.\n\t * Important: this method can return ticks outside the min and max range, it's the\n\t * responsibility of the calling code to clamp values if needed.\n\t * @protected\n\t */\n _generate() {\n const adapter = this._adapter;\n const min = this.min;\n const max = this.max;\n const options = this.options;\n const timeOpts = options.time;\n // @ts-ignore\n const minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, this._getLabelCapacity(min));\n const stepSize = valueOrDefault(options.ticks.stepSize, 1);\n const weekday = minor === 'week' ? timeOpts.isoWeekday : false;\n const hasWeekday = isNumber(weekday) || weekday === true;\n const ticks = {};\n let first = min;\n let time, count;\n\n // For 'week' unit, handle the first day of week option\n if (hasWeekday) {\n first = +adapter.startOf(first, 'isoWeek', weekday);\n }\n\n // Align first ticks on unit\n first = +adapter.startOf(first, hasWeekday ? 'day' : minor);\n\n // Prevent browser from freezing in case user options request millions of milliseconds\n if (adapter.diff(max, min, minor) > 100000 * stepSize) {\n throw new Error(min + ' and ' + max + ' are too far apart with stepSize of ' + stepSize + ' ' + minor);\n }\n\n const timestamps = options.ticks.source === 'data' && this.getDataTimestamps();\n for (time = first, count = 0; time < max; time = +adapter.add(time, stepSize, minor), count++) {\n addTick(ticks, time, timestamps);\n }\n\n if (time === max || options.bounds === 'ticks' || count === 1) {\n addTick(ticks, time, timestamps);\n }\n\n // @ts-ignore\n return Object.keys(ticks).sort(sorter).map(x => +x);\n }\n\n /**\n\t * @param {number} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n const adapter = this._adapter;\n const timeOpts = this.options.time;\n\n if (timeOpts.tooltipFormat) {\n return adapter.format(value, timeOpts.tooltipFormat);\n }\n return adapter.format(value, timeOpts.displayFormats.datetime);\n }\n\n /**\n\t * @param {number} value\n\t * @param {string|undefined} format\n\t * @return {string}\n\t */\n format(value, format) {\n const options = this.options;\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const fmt = format || formats[unit];\n return this._adapter.format(value, fmt);\n }\n\n /**\n\t * Function to format an individual tick mark\n\t * @param {number} time\n\t * @param {number} index\n\t * @param {object[]} ticks\n\t * @param {string|undefined} [format]\n\t * @return {string}\n\t * @private\n\t */\n _tickFormatFunction(time, index, ticks, format) {\n const options = this.options;\n const formatter = options.ticks.callback;\n\n if (formatter) {\n return call(formatter, [time, index, ticks], this);\n }\n\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const majorUnit = this._majorUnit;\n const minorFormat = unit && formats[unit];\n const majorFormat = majorUnit && formats[majorUnit];\n const tick = ticks[index];\n const major = majorUnit && majorFormat && tick && tick.major;\n\n return this._adapter.format(time, format || (major ? majorFormat : minorFormat));\n }\n\n /**\n\t * @param {object[]} ticks\n\t */\n generateTickLabels(ticks) {\n let i, ilen, tick;\n\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n tick = ticks[i];\n tick.label = this._tickFormatFunction(tick.value, i, ticks);\n }\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getDecimalForValue(value) {\n return value === null ? NaN : (value - this.min) / (this.max - this.min);\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getPixelForValue(value) {\n const offsets = this._offsets;\n const pos = this.getDecimalForValue(value);\n return this.getPixelForDecimal((offsets.start + pos) * offsets.factor);\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const pos = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return this.min + pos * (this.max - this.min);\n }\n\n /**\n\t * @param {string} label\n\t * @return {{w:number, h:number}}\n\t * @private\n\t */\n _getLabelSize(label) {\n const ticksOpts = this.options.ticks;\n const tickLabelWidth = this.ctx.measureText(label).width;\n const angle = toRadians(this.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation);\n const cosRotation = Math.cos(angle);\n const sinRotation = Math.sin(angle);\n const tickFontSize = this._resolveTickFontOptions(0).size;\n\n return {\n w: (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation),\n h: (tickLabelWidth * sinRotation) + (tickFontSize * cosRotation)\n };\n }\n\n /**\n\t * @param {number} exampleTime\n\t * @return {number}\n\t * @private\n\t */\n _getLabelCapacity(exampleTime) {\n const timeOpts = this.options.time;\n const displayFormats = timeOpts.displayFormats;\n\n // pick the longest format (milliseconds) for guesstimation\n const format = displayFormats[timeOpts.unit] || displayFormats.millisecond;\n const exampleLabel = this._tickFormatFunction(exampleTime, 0, ticksFromTimestamps(this, [exampleTime], this._majorUnit), format);\n const size = this._getLabelSize(exampleLabel);\n // subtract 1 - if offset then there's one less label than tick\n // if not offset then one half label padding is added to each end leaving room for one less label\n const capacity = Math.floor(this.isHorizontal() ? this.width / size.w : this.height / size.h) - 1;\n return capacity > 0 ? capacity : 1;\n }\n\n /**\n\t * @protected\n\t */\n getDataTimestamps() {\n let timestamps = this._cache.data || [];\n let i, ilen;\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const metas = this.getMatchingVisibleMetas();\n\n if (this._normalized && metas.length) {\n return (this._cache.data = metas[0].controller.getAllParsedValues(this));\n }\n\n for (i = 0, ilen = metas.length; i < ilen; ++i) {\n timestamps = timestamps.concat(metas[i].controller.getAllParsedValues(this));\n }\n\n return (this._cache.data = this.normalize(timestamps));\n }\n\n /**\n\t * @protected\n\t */\n getLabelTimestamps() {\n const timestamps = this._cache.labels || [];\n let i, ilen;\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const labels = this.getLabels();\n for (i = 0, ilen = labels.length; i < ilen; ++i) {\n timestamps.push(parse(this, labels[i]));\n }\n\n return (this._cache.labels = this._normalized ? timestamps : this.normalize(timestamps));\n }\n\n /**\n\t * @param {number[]} values\n\t * @protected\n\t */\n normalize(values) {\n // It seems to be somewhat faster to do sorting first\n return _arrayUnique(values.sort(sorter));\n }\n}\n","import TimeScale from './scale.time.js';\nimport {_lookupByKey} from '../helpers/helpers.collection.js';\n\n/**\n * Linearly interpolates the given source `val` using the table. If value is out of bounds, values\n * at edges are used for the interpolation.\n * @param {object} table\n * @param {number} val\n * @param {boolean} [reverse] lookup time based on position instead of vice versa\n * @return {object}\n */\nfunction interpolate(table, val, reverse) {\n let lo = 0;\n let hi = table.length - 1;\n let prevSource, nextSource, prevTarget, nextTarget;\n if (reverse) {\n if (val >= table[lo].pos && val <= table[hi].pos) {\n ({lo, hi} = _lookupByKey(table, 'pos', val));\n }\n ({pos: prevSource, time: prevTarget} = table[lo]);\n ({pos: nextSource, time: nextTarget} = table[hi]);\n } else {\n if (val >= table[lo].time && val <= table[hi].time) {\n ({lo, hi} = _lookupByKey(table, 'time', val));\n }\n ({time: prevSource, pos: prevTarget} = table[lo]);\n ({time: nextSource, pos: nextTarget} = table[hi]);\n }\n\n const span = nextSource - prevSource;\n return span ? prevTarget + (nextTarget - prevTarget) * (val - prevSource) / span : prevTarget;\n}\n\nclass TimeSeriesScale extends TimeScale {\n\n static id = 'timeseries';\n\n /**\n * @type {any}\n */\n static defaults = TimeScale.defaults;\n\n /**\n\t * @param {object} props\n\t */\n constructor(props) {\n super(props);\n\n /** @type {object[]} */\n this._table = [];\n /** @type {number} */\n this._minPos = undefined;\n /** @type {number} */\n this._tableRange = undefined;\n }\n\n /**\n\t * @protected\n\t */\n initOffsets() {\n const timestamps = this._getTimestampsForTable();\n const table = this._table = this.buildLookupTable(timestamps);\n this._minPos = interpolate(table, this.min);\n this._tableRange = interpolate(table, this.max) - this._minPos;\n super.initOffsets(timestamps);\n }\n\n /**\n\t * Returns an array of {time, pos} objects used to interpolate a specific `time` or position\n\t * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is\n\t * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other\n\t * extremity (left + width or top + height). Note that it would be more optimized to directly\n\t * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need\n\t * to create the lookup table. The table ALWAYS contains at least two items: min and max.\n\t * @param {number[]} timestamps\n\t * @return {object[]}\n\t * @protected\n\t */\n buildLookupTable(timestamps) {\n const {min, max} = this;\n const items = [];\n const table = [];\n let i, ilen, prev, curr, next;\n\n for (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n curr = timestamps[i];\n if (curr >= min && curr <= max) {\n items.push(curr);\n }\n }\n\n if (items.length < 2) {\n // In case there is less that 2 timestamps between min and max, the scale is defined by min and max\n return [\n {time: min, pos: 0},\n {time: max, pos: 1}\n ];\n }\n\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n next = items[i + 1];\n prev = items[i - 1];\n curr = items[i];\n\n // only add points that breaks the scale linearity\n if (Math.round((next + prev) / 2) !== curr) {\n table.push({time: curr, pos: i / (ilen - 1)});\n }\n }\n return table;\n }\n\n /**\n * Generates all timestamps defined in the data.\n * Important: this method can return ticks outside the min and max range, it's the\n * responsibility of the calling code to clamp values if needed.\n * @protected\n */\n _generate() {\n const min = this.min;\n const max = this.max;\n let timestamps = super.getDataTimestamps();\n if (!timestamps.includes(min) || !timestamps.length) {\n timestamps.splice(0, 0, min);\n }\n if (!timestamps.includes(max) || timestamps.length === 1) {\n timestamps.push(max);\n }\n return timestamps.sort((a, b) => a - b);\n }\n\n /**\n\t * Returns all timestamps\n\t * @return {number[]}\n\t * @private\n\t */\n _getTimestampsForTable() {\n let timestamps = this._cache.all || [];\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const data = this.getDataTimestamps();\n const label = this.getLabelTimestamps();\n if (data.length && label.length) {\n // If combining labels and data (data might not contain all labels),\n // we need to recheck uniqueness and sort\n timestamps = this.normalize(data.concat(label));\n } else {\n timestamps = data.length ? data : label;\n }\n timestamps = this._cache.all = timestamps;\n\n return timestamps;\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getDecimalForValue(value) {\n return (interpolate(this._table, value) - this._minPos) / this._tableRange;\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const decimal = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return interpolate(this._table, decimal * this._tableRange + this._minPos, true);\n }\n}\n\nexport default TimeSeriesScale;\n","import { _adapters } from 'chart.js';\n\nimport dayjs, { QUnitType } from 'dayjs';\n\nimport type { TimeUnit } from 'chart.js';\n\n// Needed to handle the custom parsing\nimport CustomParseFormat from 'dayjs/plugin/customParseFormat';\n\n// Needed to handle quarter format\nimport AdvancedFormat from 'dayjs/plugin/advancedFormat';\n\n// Needed to handle adding/subtracting quarter\nimport QuarterOfYear from 'dayjs/plugin/quarterOfYear';\n\n// Needed to handle localization format\nimport LocalizedFormat from 'dayjs/plugin/localizedFormat';\n\nimport isoWeek from 'dayjs/plugin/isoWeek';\n\ndayjs.extend(AdvancedFormat);\n\ndayjs.extend(QuarterOfYear);\n\ndayjs.extend(LocalizedFormat);\n\ndayjs.extend(CustomParseFormat);\n\ndayjs.extend(isoWeek);\n\nconst FORMATS = {\n datetime: 'MMM D, YYYY, h:mm:ss a',\n millisecond: 'h:mm:ss.SSS a',\n second: 'h:mm:ss a',\n minute: 'h:mm a',\n hour: 'hA',\n day: 'MMM D',\n week: 'll',\n month: 'MMM YYYY',\n quarter: '[Q]Q - YYYY',\n year: 'YYYY',\n};\n\n_adapters._date.override({\n //_id: 'dayjs', //DEBUG,\n formats: () => FORMATS,\n parse: function (value: any, format?: TimeUnit) {\n const valueType = typeof value;\n\n if (value === null || valueType === 'undefined') {\n return null;\n }\n\n if (valueType === 'string' && typeof format === 'string') {\n return dayjs(value, format).isValid() ? dayjs(value, format).valueOf() : null;\n } else if (!(value instanceof dayjs)) {\n return dayjs(value).isValid() ? dayjs(value).valueOf() : null;\n }\n return null;\n },\n format: function (time: any, format: TimeUnit): string {\n return dayjs(time).format(format);\n },\n add: function (time: any, amount: number, unit: QUnitType & TimeUnit) {\n return dayjs(time).add(amount, unit).valueOf();\n },\n diff: function (max: any, min: any, unit: TimeUnit) {\n return dayjs(max).diff(dayjs(min), unit);\n },\n startOf: function (time: any, unit: (TimeUnit & QUnitType) | 'isoWeek', weekday?: number) {\n if (unit === 'isoWeek') {\n // Ensure that weekday has a valid format\n //const formattedWeekday\n\n const validatedWeekday: number =\n typeof weekday === 'number' && weekday > 0 && weekday < 7 ? weekday : 1;\n\n return dayjs(time).isoWeekday(validatedWeekday).startOf('day').valueOf();\n }\n\n return dayjs(time).startOf(unit).valueOf();\n },\n endOf: function (time: any, unit: TimeUnit & QUnitType) {\n return dayjs(time).endOf(unit).valueOf();\n },\n});\n","import type { MouseEvent } from 'react';\nimport type {\n ChartType,\n ChartData,\n DefaultDataPoint,\n ChartDataset,\n ChartOptions,\n Chart,\n} from 'chart.js';\n\nimport type { ForwardedRef } from './types.js';\n\nconst defaultDatasetIdKey = 'label';\n\nexport function reforwardRef<T>(ref: ForwardedRef<T>, value: T) {\n if (typeof ref === 'function') {\n ref(value);\n } else if (ref) {\n ref.current = value;\n }\n}\n\nexport function setOptions<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint<TType>,\n TLabel = unknown,\n>(chart: Chart<TType, TData, TLabel>, nextOptions: ChartOptions<TType>) {\n const options = chart.options;\n\n if (options && nextOptions) {\n Object.assign(options, nextOptions);\n }\n}\n\nexport function setLabels<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint<TType>,\n TLabel = unknown,\n>(\n currentData: ChartData<TType, TData, TLabel>,\n nextLabels: TLabel[] | undefined\n) {\n currentData.labels = nextLabels;\n}\n\nexport function setDatasets<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint<TType>,\n TLabel = unknown,\n>(\n currentData: ChartData<TType, TData, TLabel>,\n nextDatasets: ChartDataset<TType, TData>[],\n datasetIdKey = defaultDatasetIdKey\n) {\n const addedDatasets: ChartDataset<TType, TData>[] = [];\n\n currentData.datasets = nextDatasets.map(\n (nextDataset: Record<string, unknown>) => {\n // given the new set, find it's current match\n const currentDataset = currentData.datasets.find(\n (dataset: Record<string, unknown>) =>\n dataset[datasetIdKey] === nextDataset[datasetIdKey]\n );\n\n // There is no original to update, so simply add new one\n if (\n !currentDataset ||\n !nextDataset.data ||\n addedDatasets.includes(currentDataset)\n ) {\n return { ...nextDataset } as ChartDataset<TType, TData>;\n }\n\n addedDatasets.push(currentDataset);\n\n Object.assign(currentDataset, nextDataset);\n\n return currentDataset;\n }\n );\n}\n\nexport function cloneData<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint<TType>,\n TLabel = unknown,\n>(data: ChartData<TType, TData, TLabel>, datasetIdKey = defaultDatasetIdKey) {\n const nextData: ChartData<TType, TData, TLabel> = {\n labels: [],\n datasets: [],\n };\n\n setLabels(nextData, data.labels);\n setDatasets(nextData, data.datasets, datasetIdKey);\n\n return nextData;\n}\n\n/**\n * Get dataset from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */\nexport function getDatasetAtEvent(\n chart: Chart,\n event: MouseEvent<HTMLCanvasElement>\n) {\n return chart.getElementsAtEventForMode(\n event.nativeEvent,\n 'dataset',\n { intersect: true },\n false\n );\n}\n\n/**\n * Get single dataset element from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */\nexport function getElementAtEvent(\n chart: Chart,\n event: MouseEvent<HTMLCanvasElement>\n) {\n return chart.getElementsAtEventForMode(\n event.nativeEvent,\n 'nearest',\n { intersect: true },\n false\n );\n}\n\n/**\n * Get all dataset elements from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */\nexport function getElementsAtEvent(\n chart: Chart,\n event: MouseEvent<HTMLCanvasElement>\n) {\n return chart.getElementsAtEventForMode(\n event.nativeEvent,\n 'index',\n { intersect: true },\n false\n );\n}\n","import React, { useEffect, useRef, forwardRef } from 'react';\nimport { Chart as ChartJS } from 'chart.js';\nimport type { ChartType, DefaultDataPoint } from 'chart.js';\n\nimport type { ForwardedRef, ChartProps, BaseChartComponent } from './types.js';\nimport {\n reforwardRef,\n cloneData,\n setOptions,\n setLabels,\n setDatasets,\n} from './utils.js';\n\nfunction ChartComponent<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint<TType>,\n TLabel = unknown,\n>(\n props: ChartProps<TType, TData, TLabel>,\n ref: ForwardedRef<ChartJS<TType, TData, TLabel>>\n) {\n const {\n height = 150,\n width = 300,\n redraw = false,\n datasetIdKey,\n type,\n data,\n options,\n plugins = [],\n fallbackContent,\n updateMode,\n ...canvasProps\n } = props;\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const chartRef = useRef<ChartJS<TType, TData, TLabel> | null>(null);\n\n const renderChart = () => {\n if (!canvasRef.current) return;\n\n chartRef.current = new ChartJS(canvasRef.current, {\n type,\n data: cloneData(data, datasetIdKey),\n options: options && { ...options },\n plugins,\n });\n\n reforwardRef(ref, chartRef.current);\n };\n\n const destroyChart = () => {\n reforwardRef(ref, null);\n\n if (chartRef.current) {\n chartRef.current.destroy();\n chartRef.current = null;\n }\n };\n\n useEffect(() => {\n if (!redraw && chartRef.current && options) {\n setOptions(chartRef.current, options);\n }\n }, [redraw, options]);\n\n useEffect(() => {\n if (!redraw && chartRef.current) {\n setLabels(chartRef.current.config.data, data.labels);\n }\n }, [redraw, data.labels]);\n\n useEffect(() => {\n if (!redraw && chartRef.current && data.datasets) {\n setDatasets(chartRef.current.config.data, data.datasets, datasetIdKey);\n }\n }, [redraw, data.datasets]);\n\n useEffect(() => {\n if (!chartRef.current) return;\n\n if (redraw) {\n destroyChart();\n setTimeout(renderChart);\n } else {\n chartRef.current.update(updateMode);\n }\n }, [redraw, options, data.labels, data.datasets, updateMode]);\n\n useEffect(() => {\n if (!chartRef.current) return;\n\n destroyChart();\n setTimeout(renderChart);\n }, [type]);\n\n useEffect(() => {\n renderChart();\n\n return () => destroyChart();\n }, []);\n\n return (\n <canvas\n ref={canvasRef}\n role='img'\n height={height}\n width={width}\n {...canvasProps}\n >\n {fallbackContent}\n </canvas>\n );\n}\n\nexport const Chart = forwardRef(ChartComponent) as BaseChartComponent;\n","import React, { forwardRef } from 'react';\nimport {\n Chart as ChartJS,\n LineController,\n BarController,\n RadarController,\n DoughnutController,\n PolarAreaController,\n BubbleController,\n PieController,\n ScatterController,\n} from 'chart.js';\nimport type { ChartType, ChartComponentLike } from 'chart.js';\n\nimport type {\n ChartProps,\n ChartJSOrUndefined,\n TypedChartComponent,\n} from './types.js';\nimport { Chart } from './chart.js';\n\nfunction createTypedChart<T extends ChartType>(\n type: T,\n registerables: ChartComponentLike\n) {\n ChartJS.register(registerables);\n\n return forwardRef<ChartJSOrUndefined<T>, Omit<ChartProps<T>, 'type'>>(\n (props, ref) => <Chart {...props} ref={ref} type={type} />\n ) as TypedChartComponent<T>;\n}\n\nexport const Line = /* #__PURE__ */ createTypedChart('line', LineController);\n\nexport const Bar = /* #__PURE__ */ createTypedChart('bar', BarController);\n\nexport const Radar = /* #__PURE__ */ createTypedChart('radar', RadarController);\n\nexport const Doughnut = /* #__PURE__ */ createTypedChart(\n 'doughnut',\n DoughnutController\n);\n\nexport const PolarArea = /* #__PURE__ */ createTypedChart(\n 'polarArea',\n PolarAreaController\n);\n\nexport const Bubble = /* #__PURE__ */ createTypedChart(\n 'bubble',\n BubbleController\n);\n\nexport const Pie = /* #__PURE__ */ createTypedChart('pie', PieController);\n\nexport const Scatter = /* #__PURE__ */ createTypedChart(\n 'scatter',\n ScatterController\n);\n","/*!\n * @robloche/chartjs-plugin-streaming v3.0.4\n * https://github.com/Robloche/chartjs-plugin-streaming\n * (c) 2017-2023 Akihiko Kusanagi\n * Released under the MIT license\n */\nimport { registry, defaults, TimeScale, DatasetController, Chart } from 'chart.js';\nimport { each, valueOrDefault, requestAnimFrame, callback, noop, isFinite, clipArea, unclipArea, isNumber, _lookup, isArray, getRelativePosition } from 'chart.js/helpers';\n\nfunction clamp(value, lower, upper) {\n return Math.min(Math.max(value, lower), upper);\n}\nfunction resolveOption(scale, key) {\n const realtimeOpts = scale.options.realtime;\n const streamingOpts = scale.chart.options.plugins.streaming;\n return valueOrDefault(realtimeOpts[key], streamingOpts[key]);\n}\nfunction getAxisMap(element, {x, y}, {xAxisID, yAxisID}) {\n const axisMap = {};\n each(x, key => {\n axisMap[key] = {axisId: xAxisID};\n });\n each(y, key => {\n axisMap[key] = {axisId: yAxisID};\n });\n return axisMap;\n}\nconst cancelAnimFrame = (function() {\n if (typeof window === 'undefined') {\n return noop;\n }\n return window.cancelAnimationFrame;\n}());\nfunction startFrameRefreshTimer(context, func) {\n if (!context.frameRequestID) {\n const refresh = () => {\n const nextRefresh = context.nextRefresh || 0;\n const now = Date.now();\n if (nextRefresh <= now) {\n const newFrameRate = callback(func);\n const frameDuration = 1000 / (Math.max(newFrameRate, 0) || 30);\n const newNextRefresh = context.nextRefresh + frameDuration || 0;\n context.nextRefresh = newNextRefresh > now ? newNextRefresh : now + frameDuration;\n }\n context.frameRequestID = requestAnimFrame.call(window, refresh);\n };\n context.frameRequestID = requestAnimFrame.call(window, refresh);\n }\n}\nfunction stopFrameRefreshTimer(context) {\n const frameRequestID = context.frameRequestID;\n if (frameRequestID) {\n cancelAnimFrame.call(window, frameRequestID);\n delete context.frameRequestID;\n }\n}\nfunction stopDataRefreshTimer(context) {\n const refreshTimerID = context.refreshTimerID;\n if (refreshTimerID) {\n clearInterval(refreshTimerID);\n delete context.refreshTimerID;\n delete context.refreshInterval;\n }\n}\nfunction startDataRefreshTimer(context, func, interval) {\n if (!context.refreshTimerID) {\n context.refreshTimerID = setInterval(() => {\n const newInterval = callback(func);\n if (context.refreshInterval !== newInterval && !isNaN(newInterval)) {\n stopDataRefreshTimer(context);\n startDataRefreshTimer(context, func, newInterval);\n }\n }, interval || 0);\n context.refreshInterval = interval || 0;\n }\n}\n\nfunction scaleValue(scale, value, fallback) {\n value = typeof value === 'number' ? value : scale.parse(value);\n return isFinite(value) ?\n {value: scale.getPixelForValue(value), transitionable: true} :\n {value: fallback};\n}\nfunction updateBoxAnnotation(element, chart, options) {\n const {scales, chartArea} = chart;\n const {xScaleID, yScaleID, xMin, xMax, yMin, yMax} = options;\n const xScale = scales[xScaleID];\n const yScale = scales[yScaleID];\n const {top, left, bottom, right} = chartArea;\n const streaming = element.$streaming = {};\n if (xScale) {\n const min = scaleValue(xScale, xMin, left);\n const max = scaleValue(xScale, xMax, right);\n const reverse = min.value > max.value;\n if (min.transitionable) {\n streaming[reverse ? 'x2' : 'x'] = {axisId: xScaleID};\n }\n if (max.transitionable) {\n streaming[reverse ? 'x' : 'x2'] = {axisId: xScaleID};\n }\n if (min.transitionable !== max.transitionable) {\n streaming.width = {axisId: xScaleID, reverse: min.transitionable};\n }\n }\n if (yScale) {\n const min = scaleValue(yScale, yMin, top);\n const max = scaleValue(yScale, yMax, bottom);\n const reverse = min.value > max.value;\n if (min.transitionable) {\n streaming[reverse ? 'y2' : 'y'] = {axisId: yScaleID};\n }\n if (max.transitionable) {\n streaming[reverse ? 'y' : 'y2'] = {axisId: yScaleID};\n }\n if (min.transitionable !== max.transitionable) {\n streaming.height = {axisId: yScaleID, reverse: min.transitionable};\n }\n }\n}\nfunction updateLineAnnotation(element, chart, options) {\n const {scales, chartArea} = chart;\n const {scaleID, value} = options;\n const scale = scales[scaleID];\n const {top, left, bottom, right} = chartArea;\n const streaming = element.$streaming = {};\n if (scale) {\n const isHorizontal = scale.isHorizontal();\n const pixel = scaleValue(scale, value);\n if (pixel.transitionable) {\n streaming[isHorizontal ? 'x' : 'y'] = {axisId: scaleID};\n streaming[isHorizontal ? 'x2' : 'y2'] = {axisId: scaleID};\n }\n return isHorizontal ? {top, bottom} : {left, right};\n }\n const {xScaleID, yScaleID, xMin, xMax, yMin, yMax} = options;\n const xScale = scales[xScaleID];\n const yScale = scales[yScaleID];\n const clip = {};\n if (xScale) {\n const min = scaleValue(xScale, xMin);\n const max = scaleValue(xScale, xMax);\n if (min.transitionable) {\n streaming.x = {axisId: xScaleID};\n } else {\n clip.left = left;\n }\n if (max.transitionable) {\n streaming.x2 = {axisId: xScaleID};\n } else {\n clip.right = right;\n }\n }\n if (yScale) {\n const min = scaleValue(yScale, yMin);\n const max = scaleValue(yScale, yMax);\n if (min.transitionable) {\n streaming.y = {axisId: yScaleID};\n } else {\n clip.top = top;\n }\n if (max.transitionable) {\n streaming.y2 = {axisId: yScaleID};\n } else {\n clip.bottom = bottom;\n }\n }\n return clip;\n}\nfunction updatePointAnnotation(element, chart, options) {\n const scales = chart.scales;\n const {xScaleID, yScaleID, xValue, yValue} = options;\n const xScale = scales[xScaleID];\n const yScale = scales[yScaleID];\n const streaming = element.$streaming = {};\n if (xScale) {\n const x = scaleValue(xScale, xValue);\n if (x.transitionable) {\n streaming.x = {axisId: xScaleID};\n }\n }\n if (yScale) {\n const y = scaleValue(yScale, yValue);\n if (y.transitionable) {\n streaming.y = {axisId: yScaleID};\n }\n }\n}\nfunction initAnnotationPlugin() {\n const BoxAnnotation = registry.getElement('boxAnnotation');\n const LineAnnotation = registry.getElement('lineAnnotation');\n const PointAnnotation = registry.getElement('pointAnnotation');\n const resolveBoxAnnotationProperties = BoxAnnotation.prototype.resolveElementProperties;\n const resolveLineAnnotationProperties = LineAnnotation.prototype.resolveElementProperties;\n const resolvePointAnnotationProperties = PointAnnotation.prototype.resolveElementProperties;\n BoxAnnotation.prototype.resolveElementProperties = function(chart, options) {\n updateBoxAnnotation(this, chart, options);\n return resolveBoxAnnotationProperties.call(this, chart, options);\n };\n LineAnnotation.prototype.resolveElementProperties = function(chart, options) {\n const chartArea = chart.chartArea;\n chart.chartArea = updateLineAnnotation(this, chart, options);\n const properties = resolveLineAnnotationProperties.call(this, chart, options);\n chart.chartArea = chartArea;\n return properties;\n };\n PointAnnotation.prototype.resolveElementProperties = function(chart, options) {\n updatePointAnnotation(this, chart, options);\n return resolvePointAnnotationProperties.call(this, chart, options);\n };\n}\nfunction attachChart$1(plugin, chart) {\n const streaming = chart.$streaming;\n if (streaming.annotationPlugin !== plugin) {\n const afterUpdate = plugin.afterUpdate;\n initAnnotationPlugin();\n streaming.annotationPlugin = plugin;\n plugin.afterUpdate = (_chart, args, options) => {\n const mode = args.mode;\n const animationOpts = options.animation;\n if (mode === 'quiet') {\n options.animation = false;\n }\n afterUpdate.call(this, _chart, args, options);\n if (mode === 'quiet') {\n options.animation = animationOpts;\n }\n };\n }\n}\nfunction getElements(chart) {\n const plugin = chart.$streaming.annotationPlugin;\n if (plugin) {\n const state = plugin._getState(chart);\n return state && state.elements || [];\n }\n return [];\n}\nfunction detachChart$1(chart) {\n delete chart.$streaming.annotationPlugin;\n}\n\nconst transitionKeys$1 = {x: ['x', 'caretX'], y: ['y', 'caretY']};\nfunction update$1(...args) {\n const me = this;\n const element = me.getActiveElements()[0];\n if (element) {\n const meta = me.chart.getDatasetMeta(element.datasetIndex);\n me.$streaming = getAxisMap(me, transitionKeys$1, meta);\n } else {\n me.$streaming = {};\n }\n me.constructor.prototype.update.call(me, ...args);\n}\n\nconst chartStates = new WeakMap();\nfunction getState(chart) {\n let state = chartStates.get(chart);\n if (!state) {\n state = {originalScaleOptions: {}};\n chartStates.set(chart, state);\n }\n return state;\n}\nfunction removeState(chart) {\n chartStates.delete(chart);\n}\nfunction storeOriginalScaleOptions(chart) {\n const {originalScaleOptions} = getState(chart);\n const scales = chart.scales;\n each(scales, scale => {\n const id = scale.id;\n if (!originalScaleOptions[id]) {\n originalScaleOptions[id] = {\n duration: resolveOption(scale, 'duration'),\n delay: resolveOption(scale, 'delay')\n };\n }\n });\n each(originalScaleOptions, (opt, key) => {\n if (!scales[key]) {\n delete originalScaleOptions[key];\n }\n });\n return originalScaleOptions;\n}\nfunction zoomRealTimeScale(scale, zoom, center, limits) {\n const {chart, axis} = scale;\n const {minDuration = 0, maxDuration = Infinity, minDelay = -Infinity, maxDelay = Infinity} = limits && limits[axis] || {};\n const realtimeOpts = scale.options.realtime;\n const duration = resolveOption(scale, 'duration');\n const delay = resolveOption(scale, 'delay');\n const newDuration = clamp(duration * (2 - zoom), minDuration, maxDuration);\n let maxPercent, newDelay;\n storeOriginalScaleOptions(chart);\n if (scale.isHorizontal()) {\n maxPercent = (scale.right - center.x) / (scale.right - scale.left);\n } else {\n maxPercent = (scale.bottom - center.y) / (scale.bottom - scale.top);\n }\n newDelay = delay + maxPercent * (duration - newDuration);\n realtimeOpts.duration = newDuration;\n realtimeOpts.delay = clamp(newDelay, minDelay, maxDelay);\n return newDuration !== scale.max - scale.min;\n}\nfunction panRealTimeScale(scale, delta, limits) {\n const {chart, axis} = scale;\n const {minDelay = -Infinity, maxDelay = Infinity} = limits && limits[axis] || {};\n const delay = resolveOption(scale, 'delay');\n const newDelay = delay + (scale.getValueForPixel(delta) - scale.getValueForPixel(0));\n storeOriginalScaleOptions(chart);\n scale.options.realtime.delay = clamp(newDelay, minDelay, maxDelay);\n return true;\n}\nfunction resetRealTimeScaleOptions(chart) {\n const originalScaleOptions = storeOriginalScaleOptions(chart);\n each(chart.scales, scale => {\n const realtimeOptions = scale.options.realtime;\n if (realtimeOptions) {\n const original = originalScaleOptions[scale.id];\n if (original) {\n realtimeOptions.duration = original.duration;\n realtimeOptions.delay = original.delay;\n } else {\n delete realtimeOptions.duration;\n delete realtimeOptions.delay;\n }\n }\n });\n}\nfunction initZoomPlugin(plugin) {\n plugin.zoomFunctions.realtime = zoomRealTimeScale;\n plugin.panFunctions.realtime = panRealTimeScale;\n}\nfunction attachChart(plugin, chart) {\n const streaming = chart.$streaming;\n if (streaming.zoomPlugin !== plugin) {\n const resetZoom = streaming.resetZoom = chart.resetZoom;\n initZoomPlugin(plugin);\n chart.resetZoom = transition => {\n resetRealTimeScaleOptions(chart);\n resetZoom(transition);\n };\n streaming.zoomPlugin = plugin;\n }\n}\nfunction detachChart(chart) {\n const streaming = chart.$streaming;\n if (streaming.zoomPlugin) {\n chart.resetZoom = streaming.resetZoom;\n removeState(chart);\n delete streaming.resetZoom;\n delete streaming.zoomPlugin;\n }\n}\n\nconst INTERVALS = {\n millisecond: {\n common: true,\n size: 1,\n steps: [1, 2, 5, 10, 20, 50, 100, 250, 500]\n },\n second: {\n common: true,\n size: 1000,\n steps: [1, 2, 5, 10, 15, 30]\n },\n minute: {\n common: true,\n size: 60000,\n steps: [1, 2, 5, 10, 15, 30]\n },\n hour: {\n common: true,\n size: 3600000,\n steps: [1, 2, 3, 6, 12]\n },\n day: {\n common: true,\n size: 86400000,\n steps: [1, 2, 5]\n },\n week: {\n common: false,\n size: 604800000,\n steps: [1, 2, 3, 4]\n },\n month: {\n common: true,\n size: 2.628e9,\n steps: [1, 2, 3]\n },\n quarter: {\n common: false,\n size: 7.884e9,\n steps: [1, 2, 3, 4]\n },\n year: {\n common: true,\n size: 3.154e10\n }\n};\nconst UNITS = Object.keys(INTERVALS);\nfunction determineStepSize(min, max, unit, capacity) {\n const range = max - min;\n const {size: milliseconds, steps} = INTERVALS[unit];\n let factor;\n if (!steps) {\n return Math.ceil(range / (capacity * milliseconds));\n }\n for (let i = 0, ilen = steps.length; i < ilen; ++i) {\n factor = steps[i];\n if (Math.ceil(range / (milliseconds * factor)) <= capacity) {\n break;\n }\n }\n return factor;\n}\nfunction determineUnitForAutoTicks(minUnit, min, max, capacity) {\n const range = max - min;\n const ilen = UNITS.length;\n for (let i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) {\n const {common, size, steps} = INTERVALS[UNITS[i]];\n const factor = steps ? steps[steps.length - 1] : Number.MAX_SAFE_INTEGER;\n if (common && Math.ceil(range / (factor * size)) <= capacity) {\n return UNITS[i];\n }\n }\n return UNITS[ilen - 1];\n}\nfunction determineMajorUnit(unit) {\n for (let i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) {\n if (INTERVALS[UNITS[i]].common) {\n return UNITS[i];\n }\n }\n}\nfunction addTick(ticks, time, timestamps) {\n if (!timestamps) {\n ticks[time] = true;\n } else if (timestamps.length) {\n const {lo, hi} = _lookup(timestamps, time);\n const timestamp = timestamps[lo] >= time ? timestamps[lo] : timestamps[hi];\n ticks[timestamp] = true;\n }\n}\nconst datasetPropertyKeys = [\n 'pointBackgroundColor',\n 'pointBorderColor',\n 'pointBorderWidth',\n 'pointRadius',\n 'pointRotation',\n 'pointStyle',\n 'pointHitRadius',\n 'pointHoverBackgroundColor',\n 'pointHoverBorderColor',\n 'pointHoverBorderWidth',\n 'pointHoverRadius',\n 'backgroundColor',\n 'borderColor',\n 'borderSkipped',\n 'borderWidth',\n 'hoverBackgroundColor',\n 'hoverBorderColor',\n 'hoverBorderWidth',\n 'hoverRadius',\n 'hitRadius',\n 'radius',\n 'rotation'\n];\nfunction clean(scale) {\n const {chart, id, max} = scale;\n const duration = resolveOption(scale, 'duration');\n const delay = resolveOption(scale, 'delay');\n const ttl = resolveOption(scale, 'ttl');\n const pause = resolveOption(scale, 'pause');\n const min = Date.now() - (isNaN(ttl) ? duration + delay : ttl);\n let i, start, count, removalRange;\n each(chart.data.datasets, (dataset, datasetIndex) => {\n const meta = chart.getDatasetMeta(datasetIndex);\n const axis = id === meta.xAxisID && 'x' || id === meta.yAxisID && 'y';\n if (axis) {\n const controller = meta.controller;\n const data = dataset.data;\n const length = data.length;\n if (pause) {\n for (i = 0; i < length; ++i) {\n const point = controller.getParsed(i);\n if (point && !(point[axis] < max)) {\n break;\n }\n }\n start = i + 2;\n } else {\n start = 0;\n }\n for (i = start; i < length; ++i) {\n const point = controller.getParsed(i);\n if (!point || !(point[axis] <= min)) {\n break;\n }\n }\n count = i - start;\n if (isNaN(ttl)) {\n count = Math.max(count - 2, 0);\n }\n data.splice(start, count);\n each(datasetPropertyKeys, key => {\n if (isArray(dataset[key])) {\n dataset[key].splice(start, count);\n }\n });\n each(dataset.datalabels, value => {\n if (isArray(value)) {\n value.splice(start, count);\n }\n });\n if (typeof data[0] !== 'object') {\n removalRange = {\n start: start,\n count: count\n };\n }\n each(chart._active, (item, index) => {\n if (item.datasetIndex === datasetIndex && item.index >= start) {\n if (item.index >= start + count) {\n item.index -= count;\n } else {\n chart._active.splice(index, 1);\n }\n }\n }, null, true);\n }\n });\n if (removalRange) {\n chart.data.labels.splice(removalRange.start, removalRange.count);\n }\n}\nfunction transition(element, id, translate) {\n const animations = element.$animations || {};\n each(element.$streaming, (item, key) => {\n if (item.axisId === id) {\n const delta = item.reverse ? -translate : translate;\n const animation = animations[key];\n if (isFinite(element[key])) {\n element[key] -= delta;\n }\n if (animation) {\n animation._from -= delta;\n animation._to -= delta;\n }\n }\n });\n}\nfunction scroll(scale) {\n const {chart, id, $realtime: realtime} = scale;\n const duration = resolveOption(scale, 'duration');\n const delay = resolveOption(scale, 'delay');\n const isHorizontal = scale.isHorizontal();\n const length = isHorizontal ? scale.width : scale.height;\n const now = Date.now();\n const tooltip = chart.tooltip;\n const annotations = getElements(chart);\n let offset = length * (now - realtime.head) / duration;\n if (isHorizontal === !!scale.options.reverse) {\n offset = -offset;\n }\n each(chart.data.datasets, (dataset, datasetIndex) => {\n const meta = chart.getDatasetMeta(datasetIndex);\n const {data: elements = [], dataset: element} = meta;\n for (let i = 0, ilen = elements.length; i < ilen; ++i) {\n transition(elements[i], id, offset);\n }\n if (element) {\n transition(element, id, offset);\n delete element._path;\n }\n });\n for (let i = 0, ilen = annotations.length; i < ilen; ++i) {\n transition(annotations[i], id, offset);\n }\n if (tooltip) {\n transition(tooltip, id, offset);\n }\n scale.max = now - delay;\n scale.min = scale.max - duration;\n realtime.head = now;\n}\nclass RealTimeScale extends TimeScale {\n constructor(props) {\n super(props);\n this.$realtime = this.$realtime || {};\n }\n init(scaleOpts, opts) {\n const me = this;\n super.init(scaleOpts, opts);\n startDataRefreshTimer(me.$realtime, () => {\n const chart = me.chart;\n const onRefresh = resolveOption(me, 'onRefresh');\n callback(onRefresh, [chart], me);\n clean(me);\n chart.update('quiet');\n return resolveOption(me, 'refresh');\n });\n }\n update(maxWidth, maxHeight, margins) {\n const me = this;\n const {$realtime: realtime, options} = me;\n const {bounds, offset, ticks: ticksOpts} = options;\n const {autoSkip, source, major: majorTicksOpts} = ticksOpts;\n const majorEnabled = majorTicksOpts.enabled;\n if (resolveOption(me, 'pause')) {\n stopFrameRefreshTimer(realtime);\n } else {\n if (!realtime.frameRequestID) {\n realtime.head = Date.now();\n }\n startFrameRefreshTimer(realtime, () => {\n const chart = me.chart;\n const streaming = chart.$streaming;\n scroll(me);\n if (streaming) {\n callback(streaming.render, [chart]);\n }\n return resolveOption(me, 'frameRate');\n });\n }\n options.bounds = undefined;\n options.offset = false;\n ticksOpts.autoSkip = false;\n ticksOpts.source = source === 'auto' ? '' : source;\n majorTicksOpts.enabled = true;\n super.update(maxWidth, maxHeight, margins);\n options.bounds = bounds;\n options.offset = offset;\n ticksOpts.autoSkip = autoSkip;\n ticksOpts.source = source;\n majorTicksOpts.enabled = majorEnabled;\n }\n buildTicks() {\n const me = this;\n const duration = resolveOption(me, 'duration');\n const delay = resolveOption(me, 'delay');\n const max = me.$realtime.head - delay;\n const min = max - duration;\n const maxArray = [1e15, max];\n const minArray = [-1e15, min];\n Object.defineProperty(me, 'min', {\n get: () => minArray.shift(),\n set: noop\n });\n Object.defineProperty(me, 'max', {\n get: () => maxArray.shift(),\n set: noop\n });\n const ticks = super.buildTicks();\n delete me.min;\n delete me.max;\n me.min = min;\n me.max = max;\n return ticks;\n }\n calculateLabelRotation() {\n const ticksOpts = this.options.ticks;\n const maxRotation = ticksOpts.maxRotation;\n ticksOpts.maxRotation = ticksOpts.minRotation || 0;\n super.calculateLabelRotation();\n ticksOpts.maxRotation = maxRotation;\n }\n fit() {\n const me = this;\n const options = me.options;\n super.fit();\n if (options.ticks.display && options.display && me.isHorizontal()) {\n me.paddingLeft = 3;\n me.paddingRight = 3;\n me._handleMargins();\n }\n }\n draw(chartArea) {\n const me = this;\n const {chart, ctx} = me;\n const area = me.isHorizontal() ?\n {\n left: chartArea.left,\n top: 0,\n right: chartArea.right,\n bottom: chart.height\n } : {\n left: 0,\n top: chartArea.top,\n right: chart.width,\n bottom: chartArea.bottom\n };\n me._gridLineItems = null;\n me._labelItems = null;\n clipArea(ctx, area);\n super.draw(chartArea);\n unclipArea(ctx);\n }\n destroy() {\n const realtime = this.$realtime;\n stopFrameRefreshTimer(realtime);\n stopDataRefreshTimer(realtime);\n }\n _generate() {\n const me = this;\n const adapter = me._adapter;\n const duration = resolveOption(me, 'duration');\n const delay = resolveOption(me, 'delay');\n const refresh = resolveOption(me, 'refresh');\n const max = me.$realtime.head - delay;\n const min = max - duration;\n const capacity = me._getLabelCapacity(min);\n const {time: timeOpts, ticks: ticksOpts} = me.options;\n const minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, capacity);\n const major = determineMajorUnit(minor);\n const stepSize = timeOpts.stepSize || determineStepSize(min, max, minor, capacity);\n const weekday = minor === 'week' ? timeOpts.isoWeekday : false;\n const majorTicksEnabled = ticksOpts.major.enabled;\n const hasWeekday = isNumber(weekday) || weekday === true;\n const interval = INTERVALS[minor];\n const ticks = {};\n let first = min;\n let time, count;\n if (hasWeekday) {\n first = +adapter.startOf(first, 'isoWeek', weekday);\n }\n first = +adapter.startOf(first, hasWeekday ? 'day' : minor);\n if (adapter.diff(max, min, minor) > 100000 * stepSize) {\n throw new Error(min + ' and ' + max + ' are too far apart with stepSize of ' + stepSize + ' ' + minor);\n }\n time = first;\n if (majorTicksEnabled && major && !hasWeekday && !timeOpts.round) {\n time = +adapter.startOf(time, major);\n time = +adapter.add(time, ~~((first - time) / (interval.size * stepSize)) * stepSize, minor);\n }\n const timestamps = ticksOpts.source === 'data' && me.getDataTimestamps();\n for (count = 0; time < max + refresh; time = +adapter.add(time, stepSize, minor), count++) {\n addTick(ticks, time, timestamps);\n }\n if (time === max + refresh || count === 1) {\n addTick(ticks, time, timestamps);\n }\n return Object.keys(ticks).sort((a, b) => a - b).map(x => +x);\n }\n}\nRealTimeScale.id = 'realtime';\nRealTimeScale.defaults = {\n bounds: 'data',\n adapters: {},\n time: {\n parser: false,\n unit: false,\n round: false,\n isoWeekday: false,\n minUnit: 'millisecond',\n displayFormats: {}\n },\n realtime: {},\n ticks: {\n autoSkip: false,\n source: 'auto',\n major: {\n enabled: true\n }\n }\n};\ndefaults.describe('scale.realtime', {\n _scriptable: name => name !== 'onRefresh'\n});\n\nvar version = \"3.0.4\";\n\ndefaults.set('transitions', {\n quiet: {\n animation: {\n duration: 0\n }\n }\n});\nconst transitionKeys = {x: ['x', 'cp1x', 'cp2x'], y: ['y', 'cp1y', 'cp2y']};\nfunction update(mode) {\n const me = this;\n if (mode === 'quiet') {\n each(me.data.datasets, (dataset, datasetIndex) => {\n const controller = me.getDatasetMeta(datasetIndex).controller;\n controller._setStyle = function(element, index, _mode, active) {\n DatasetController.prototype._setStyle.call(this, element, index, 'quiet', active);\n };\n });\n }\n Chart.prototype.update.call(me, mode);\n if (mode === 'quiet') {\n each(me.data.datasets, (dataset, datasetIndex) => {\n delete me.getDatasetMeta(datasetIndex).controller._setStyle;\n });\n }\n}\nfunction render(chart) {\n const streaming = chart.$streaming;\n chart.render();\n if (streaming.lastMouseEvent) {\n setTimeout(() => {\n const lastMouseEvent = streaming.lastMouseEvent;\n if (lastMouseEvent) {\n chart._eventHandler(lastMouseEvent);\n }\n }, 0);\n }\n}\nvar StreamingPlugin = {\n id: 'streaming',\n version,\n beforeInit(chart) {\n const streaming = chart.$streaming = chart.$streaming || {render};\n const canvas = streaming.canvas = chart.canvas;\n const mouseEventListener = streaming.mouseEventListener = event => {\n const pos = getRelativePosition(event, chart);\n streaming.lastMouseEvent = {\n type: 'mousemove',\n chart: chart,\n native: event,\n x: pos.x,\n y: pos.y\n };\n };\n canvas.addEventListener('mousedown', mouseEventListener);\n canvas.addEventListener('mouseup', mouseEventListener);\n },\n afterInit(chart) {\n chart.update = update;\n },\n beforeUpdate(chart) {\n const {scales, elements} = chart.options;\n const tooltip = chart.tooltip;\n each(scales, ({type}) => {\n if (type === 'realtime') {\n elements.line.capBezierPoints = false;\n }\n });\n if (tooltip) {\n tooltip.update = update$1;\n }\n try {\n const plugin = registry.getPlugin('annotation');\n attachChart$1(plugin, chart);\n } catch (e) {\n detachChart$1(chart);\n }\n try {\n const plugin = registry.getPlugin('zoom');\n attachChart(plugin, chart);\n } catch (e) {\n detachChart(chart);\n }\n },\n beforeDatasetUpdate(chart, args) {\n const {meta, mode} = args;\n if (mode === 'quiet') {\n const {controller, $animations} = meta;\n if ($animations && $animations.visible && $animations.visible._active) {\n controller.updateElement = noop;\n controller.updateSharedOptions = noop;\n }\n }\n },\n afterDatasetUpdate(chart, args) {\n const {meta, mode} = args;\n const {data: elements = [], dataset: element, controller} = meta;\n for (let i = 0, ilen = elements.length; i < ilen; ++i) {\n elements[i].$streaming = getAxisMap(elements[i], transitionKeys, meta);\n }\n if (element) {\n element.$streaming = getAxisMap(element, transitionKeys, meta);\n }\n if (mode === 'quiet') {\n delete controller.updateElement;\n delete controller.updateSharedOptions;\n }\n },\n beforeDatasetDraw(chart, args) {\n const {ctx, chartArea, width, height} = chart;\n const {xAxisID, yAxisID, controller} = args.meta;\n const area = {\n left: 0,\n top: 0,\n right: width,\n bottom: height\n };\n if (xAxisID && controller.getScaleForId(xAxisID) instanceof RealTimeScale) {\n area.left = chartArea.left;\n area.right = chartArea.right;\n }\n if (yAxisID && controller.getScaleForId(yAxisID) instanceof RealTimeScale) {\n area.top = chartArea.top;\n area.bottom = chartArea.bottom;\n }\n clipArea(ctx, area);\n },\n afterDatasetDraw(chart) {\n unclipArea(chart.ctx);\n },\n beforeEvent(chart, args) {\n const streaming = chart.$streaming;\n const event = args.event;\n if (event.type === 'mousemove') {\n streaming.lastMouseEvent = event;\n } else if (event.type === 'mouseout') {\n delete streaming.lastMouseEvent;\n }\n },\n afterDestroy(chart) {\n const {scales, $streaming: streaming, tooltip} = chart;\n const {canvas, mouseEventListener} = streaming;\n delete chart.update;\n if (tooltip) {\n delete tooltip.update;\n }\n canvas.removeEventListener('mousedown', mouseEventListener);\n canvas.removeEventListener('mouseup', mouseEventListener);\n each(scales, scale => {\n if (scale instanceof RealTimeScale) {\n scale.destroy();\n }\n });\n },\n defaults: {\n duration: 10000,\n delay: 0,\n frameRate: 30,\n refresh: 1000,\n onRefresh: null,\n pause: false,\n ttl: undefined\n },\n descriptors: {\n _scriptable: name => name !== 'onRefresh'\n }\n};\n\nconst registerables = [StreamingPlugin, RealTimeScale];\n\nexport { RealTimeScale, StreamingPlugin, registerables as default };\n","/* @flow */\n\nimport './Graph.scss';\nimport 'chartjs-adapter-dayjs-3';\nimport * as React from 'react';\n// $FlowFixMe: Flow cannot resolve chart.js module (although it could until v4.1.1)\nimport { CategoryScale, Chart, LineElement, LinearScale, PointElement } from 'chart.js';\nimport AccurateTimestamp from '../../helpers/dateTime/AccurateTimestamp';\n// $FlowFixMe: Flow cannot resolve react-chartjs-2 module\nimport { Line } from 'react-chartjs-2';\nimport type { ReadOnlyKeyValuePair } from '@ntg/utils/dist/types';\nimport StreamingPlugin from '@robloche/chartjs-plugin-streaming';\nimport clsx from 'clsx';\nimport { useMemo } from 'react';\n\nChart.register(CategoryScale, LinearScale, LineElement, PointElement, StreamingPlugin);\nChart.defaults.font.size = 8;\nChart.defaults.responsive = true;\nChart.defaults.maintainAspectRatio = false;\nChart.defaults.color = '#FFF';\nChart.defaults.backgroundColor = '#FFF';\nChart.defaults.elements.line.borderWidth = 2;\n\nexport enum Theme {\n Blue = 'blue',\n Green = 'green',\n Red = 'red',\n Yellow = 'yellow',\n}\n\nconst ThemeColors: ReadOnlyKeyValuePair<{| borderColor: Array<string> |}> = Object.freeze({\n blue: {\n borderColor: ['rgb(0, 0, 157)', 'rgb(100, 100, 157)'],\n },\n green: {\n borderColor: ['rgb(0, 157, 0)', 'rgb(100, 157, 100)'],\n },\n red: {\n borderColor: ['rgb(157, 0, 0)', 'rgb(157, 100, 100)'],\n },\n yellow: {\n borderColor: ['rgb(157, 157, 0)', 'rgb(157, 157, 100)'],\n },\n});\n\ntype Options = {|\n afterBuildTicks?: (axis: any) => void,\n beginAtZero: boolean,\n display: boolean,\n suggestedMax?: number,\n ticks?: {|\n callback?: (value: number) => string,\n stepSize?: number,\n |},\n|};\n\ntype Dataset = {|\n borderColor: string,\n data: Array<number>,\n|};\n\nconst buildInitialDatasets = (count: number, theme: Theme): Array<Dataset> => {\n const datasets: Array<Dataset> = [];\n\n for (let i = 0; i < count; ++i) {\n datasets.push({\n borderColor: ThemeColors[(theme: string)].borderColor[i],\n data: [],\n });\n }\n\n return datasets;\n};\n\nconst buildYOptions = (afterBuildTicksCallback?: (axis: any) => void, beginAtZero: boolean, maxValue?: number, tickCallback?: (value: number) => string, tickStep?: number): any => {\n const options: Options = {\n beginAtZero,\n display: true,\n };\n\n if (typeof maxValue === 'number') {\n options.suggestedMax = maxValue;\n }\n\n if (afterBuildTicksCallback) {\n options.afterBuildTicks = afterBuildTicksCallback;\n }\n\n if (tickCallback) {\n options.ticks = {\n callback: tickCallback,\n };\n }\n\n if (tickStep) {\n options.ticks = {\n ...options.ticks,\n stepSize: tickStep,\n };\n }\n\n return options;\n};\n\n/* eslint-disable react/require-default-props */\ntype DefaultProps = {|\n +afterBuildTicksCallback?: (axis: any) => void,\n +beginAtZero?: boolean,\n +datasetCount?: number,\n +maxValue?: number,\n +tickCallback?: (value: number) => string,\n +tickStep?: number,\n|};\n/* eslint-enable react/require-default-props */\n\nexport type GraphPropType = {|\n ...DefaultProps,\n +getY: () => Array<number>,\n +theme: Theme,\n +title: string,\n|};\n\nconst Graph = ({ afterBuildTicksCallback, beginAtZero = true, datasetCount = 1, getY, maxValue, theme, tickCallback, tickStep, title }: GraphPropType): React.Node => {\n const datasets = useMemo(() => buildInitialDatasets(datasetCount, theme), [datasetCount, theme]);\n\n const yOptions = useMemo(() => buildYOptions(afterBuildTicksCallback, beginAtZero, maxValue, tickCallback, tickStep), [afterBuildTicksCallback, beginAtZero, maxValue, tickCallback, tickStep]);\n\n return (\n <div className={clsx('graphRoot', (theme: string))}>\n <div className='graphTitle'>{title}</div>\n <div className='graphData'>\n <Line\n data={{ datasets }}\n options={{\n scales: {\n x: {\n display: false,\n realtime: {\n delay: 1000,\n onRefresh: (chart) => {\n const x = AccurateTimestamp.now();\n const y = getY();\n chart.data.datasets.forEach((dataset, i) => {\n dataset.data.push({\n x,\n y: y[i],\n });\n });\n },\n },\n type: 'realtime',\n },\n y: yOptions,\n },\n }}\n />\n </div>\n </div>\n );\n};\n\nexport default Graph;\n","/* @flow */\n\nimport * as React from 'react';\nimport { ContentType, ONE_HUNDRED, ONE_THOUSAND, type PlayerStateType, TIMESHIFT_THRESHOLD } from './constantsAndTypes';\nimport Graph, { Theme } from './Graph';\nimport type { ShakaInitData, ShakaMetrics, VideoTrack } from './implementation/shakaTypes';\nimport { logError, logInfo, logWarning } from '../../helpers/debug/debug';\nimport AccurateTimestamp from '../../helpers/dateTime/AccurateTimestamp';\nimport type { BasicFunction } from '@ntg/utils/dist/types';\nimport { KeepAliveState } from './keepAlive';\nimport { PictoX } from '@ntg/components/dist/pictos/Element';\nimport { VIDEOPLAYER_DEBUG } from './implementation/types';\n\nconst formatBitrate = (bitrate: number): string => `${Math.round(bitrate).toLocaleString()} kbps`;\n\n// Takes a bitrate in bit/s and format a string in kpbs\nconst formatBpsBitrate = (bitrate: number): string => formatBitrate(bitrate / ONE_THOUSAND);\n\n// Takes a bitrate in megabit/s and format a string in kpbs\nconst formatMbpsBitrate = (bitrate: number): string => formatBitrate(bitrate * ONE_THOUSAND);\n\nconst ROUNDING_DIGITS = 2;\n\nconst round = (value: number): string => value.toFixed(ROUNDING_DIGITS);\n\nconst renderDebugInfoLine = (label: string, value: string | number | boolean, noValue?: boolean): React.Node => (\n <div className='data'>\n <span className='label'>{label}:</span>\n {noValue ? null : <span className='value'>{value !== undefined ? value.toString() : VIDEOPLAYER_DEBUG.UnknownMetric}</span>}\n </div>\n);\n\nconst renderDebugInfoLabel = (label: string): React.Node => renderDebugInfoLine(label, 0, true);\n\nconst renderGeneralDebug = (state: PlayerStateType, isBitrateLimited: boolean, maxBitrate: number, keepAliveState: KeepAliveState | null): React.Node => {\n const {\n contentType,\n currentItem,\n debugInfo: { isPlayheadPositionFallback, playerName, playerVersion, state: playerState, time, totalTime },\n isMuted,\n liveBufferLength,\n timeshift,\n volume,\n } = state;\n\n const displayTime =\n totalTime === Infinity ? `${time} (${new Date(time * ONE_THOUSAND).toLocaleString()})${isPlayheadPositionFallback ? ' [F]' : ''}` : `${time.toLocaleString()} s / ${totalTime.toLocaleString()} s`;\n\n const now = AccurateTimestamp.nowInSeconds();\n const currentTime = `${now} (${new Date(now * ONE_THOUSAND).toLocaleString()})`;\n\n return (\n <>\n <div className='title'>General</div>\n {renderDebugInfoLine('Player name', playerName)}\n {renderDebugInfoLine('Player version', playerVersion)}\n {currentItem ? renderDebugInfoLine('Location type', currentItem.locType ?? VIDEOPLAYER_DEBUG.UnknownMetric) : null}\n {renderDebugInfoLine('Type', (contentType: string))}\n {renderDebugInfoLine('State', playerState ?? VIDEOPLAYER_DEBUG.NoKeepAlive)}\n {renderDebugInfoLine('Keep-alive', keepAliveState ? (keepAliveState: string) : VIDEOPLAYER_DEBUG.NoKeepAlive)}\n {contentType === ContentType.Live ? renderDebugInfoLine('Current time', currentTime) : null}\n {renderDebugInfoLine('Playhead pos', displayTime)}\n {contentType === ContentType.Live ? renderDebugInfoLine('Timeshift buffer', `${Math.floor(liveBufferLength).toLocaleString()} s`) : null}\n {contentType === ContentType.Live ? renderDebugInfoLine('Timeshift', `${timeshift.toFixed(1)} s (${timeshift <= TIMESHIFT_THRESHOLD ? 'off' : 'on'})`) : null}\n {renderDebugInfoLine('Volume', `${Math.round(volume * ONE_HUNDRED)}%`)}\n {renderDebugInfoLine('Muted', isMuted)}\n {renderDebugInfoLine('Green streaming', `${isBitrateLimited ? 'on' : 'off'}${isBitrateLimited ? ` (${formatMbpsBitrate(maxBitrate)})` : ''}`)}\n </>\n );\n};\n\nconst renderHtmlVideoElementDebug = (state: PlayerStateType): React.Node => {\n const {\n debugInfo: { bufferChunkCount, bufferLength, elementHeight, elementWidth, playbackRate, videoHeight, videoWidth },\n } = state;\n\n return (\n <>\n <div className='title'>HTML Video Element</div>\n {renderDebugInfoLine('Element size', typeof elementWidth === 'number' && typeof elementHeight === 'number' ? `${elementWidth} x ${elementHeight}` : VIDEOPLAYER_DEBUG.UnknownMetric)}\n {renderDebugInfoLine('Video size', typeof videoWidth === 'number' && typeof videoHeight === 'number' ? `${videoWidth} x ${videoHeight}` : VIDEOPLAYER_DEBUG.UnknownMetric)}\n {renderDebugInfoLine('Buffer', bufferLength && bufferChunkCount ? `${bufferLength} s (${bufferChunkCount} chunk${bufferChunkCount > 1 ? 's' : ''})` : VIDEOPLAYER_DEBUG.BufferFlushed)}\n {renderDebugInfoLine('Playback rate', playbackRate ?? VIDEOPLAYER_DEBUG.UnknownMetric)}\n </>\n );\n};\n\nconst renderShakaVideoDebug = (state: PlayerStateType): React.Node => {\n const {\n contentType,\n debugInfo: { shakaMetrics, streamType },\n } = state;\n\n if (!shakaMetrics) {\n return null;\n }\n\n const {\n bufferFullness,\n selectedTrackIds: { video: selectedVideoId },\n stats: {\n bufferingTime,\n completionPercent,\n corruptedFrames,\n decodedFrames,\n droppedFrames,\n estimatedBandwidth,\n gapsJumped,\n liveLatency,\n loadLatency,\n manifestTimeSeconds,\n maxSegmentDuration,\n pauseTime,\n playTime,\n stallsDetected,\n },\n tracks: { video: videoTracks },\n } = shakaMetrics;\n\n const currentLevel = videoTracks.findIndex((track) => track.videoId === selectedVideoId);\n const currentTrack = currentLevel > -1 ? videoTracks[currentLevel] : null;\n\n const videoBandwidth = currentTrack?.videoBandwidth ?? 0;\n\n return (\n <>\n {renderDebugInfoLine('Stream type', streamType ? (streamType: string).toUpperCase() : VIDEOPLAYER_DEBUG.UnknownMetric)}\n {renderDebugInfoLine('Manifest load & parse time', isNaN(manifestTimeSeconds) ? VIDEOPLAYER_DEBUG.NotApplicable : `${round(manifestTimeSeconds)} s`)}\n {renderDebugInfoLine('Max segment duration', isNaN(maxSegmentDuration) ? VIDEOPLAYER_DEBUG.NotApplicable : `${round(maxSegmentDuration)} s`)}\n {renderDebugInfoLine('Load latency', `${round(loadLatency)} s`)}\n {contentType !== ContentType.Static ? renderDebugInfoLine('Live latency', isNaN(liveLatency) ? VIDEOPLAYER_DEBUG.UnknownMetric : `${round(liveLatency)} s`) : null}\n {renderDebugInfoLine('Play time', `${round(playTime).toLocaleString()} s`)}\n {renderDebugInfoLine('Pause time', `${round(pauseTime).toLocaleString()} s`)}\n {renderDebugInfoLine('Playback stalls', stallsDetected.toLocaleString())}\n {renderDebugInfoLine('Gaps jumped', gapsJumped.toLocaleString())}\n {renderDebugInfoLine('Buffer', `${round(bufferFullness * ONE_HUNDRED)} %`)}\n {renderDebugInfoLine('Buffering time', `${round(bufferingTime).toLocaleString()} s`)}\n {renderDebugInfoLine('Decoded frames', decodedFrames.toLocaleString())}\n {renderDebugInfoLine('Dropped frames', droppedFrames.toLocaleString())}\n {renderDebugInfoLine('Corrupted frames', corruptedFrames.toLocaleString())}\n {renderDebugInfoLine('Estimated bandwidth', isNaN(estimatedBandwidth) ? VIDEOPLAYER_DEBUG.NotApplicable : formatBpsBitrate(estimatedBandwidth))}\n {contentType !== ContentType.Live ? renderDebugInfoLine('Completion percent', `${completionPercent} %`) : null}\n {renderDebugInfoLine('Available levels', videoTracks.length)}\n {videoTracks.length > 0 ? (\n <>\n {renderDebugInfoLabel('Current level')}\n <div className='subsection'>\n {renderDebugInfoLine('Level', `${currentLevel > -1 ? `${currentLevel + 1}` : VIDEOPLAYER_DEBUG.UnknownMetric} / ${videoTracks.length}`)}\n {renderDebugInfoLine('Variant Id', currentTrack?.id ?? VIDEOPLAYER_DEBUG.UnknownMetric)}\n {renderDebugInfoLine('Video Id', currentTrack?.videoId ?? VIDEOPLAYER_DEBUG.UnknownMetric)}\n {renderDebugInfoLine('Original video Id', currentTrack?.originalVideoId ?? VIDEOPLAYER_DEBUG.UnknownMetric)}\n {renderDebugInfoLine('Label', currentTrack?.label ?? VIDEOPLAYER_DEBUG.UnknownMetric)}\n {renderDebugInfoLine('Resolution', `${currentTrack?.width ?? VIDEOPLAYER_DEBUG.UnknownMetric} x ${currentTrack?.height ?? VIDEOPLAYER_DEBUG.UnknownMetric}`)}\n {renderDebugInfoLine('Language', currentTrack?.language ?? VIDEOPLAYER_DEBUG.UnknownMetric)}\n {renderDebugInfoLine('Mime type', currentTrack?.videoMimeType ?? VIDEOPLAYER_DEBUG.UnknownMetric)}\n {renderDebugInfoLine('Codec', currentTrack?.videoCodec ?? VIDEOPLAYER_DEBUG.UnknownMetric)}\n {renderDebugInfoLine('Roles', currentTrack?.roles.join(' | ') ?? VIDEOPLAYER_DEBUG.UnknownMetric)}\n {renderDebugInfoLine('Frame rate', currentTrack?.frameRate ?? VIDEOPLAYER_DEBUG.UnknownMetric)}\n {renderDebugInfoLine('Required bandwidth', videoBandwidth > 0 ? formatBpsBitrate(videoBandwidth) : VIDEOPLAYER_DEBUG.UnknownMetric)}\n </div>\n </>\n ) : null}\n </>\n );\n};\n\nconst renderShakaAudioDebug = (state: PlayerStateType): React.Node => {\n const {\n debugInfo: { shakaMetrics },\n } = state;\n\n if (!shakaMetrics) {\n return null;\n }\n\n const {\n selectedTrackIds: { audio: selectedAudioId },\n tracks: { audio: audioTracks },\n } = shakaMetrics || {};\n\n const currentIndex = audioTracks.findIndex((track) => track.audioId === selectedAudioId);\n const currentTrack = currentIndex > -1 ? audioTracks[currentIndex] : null;\n\n const audioBandwidth = currentTrack?.audioBandwidth ?? 0;\n\n return (\n <>\n {renderDebugInfoLine('Available tracks', audioTracks.length)}\n {audioTracks.length > 0 ? (\n <>\n {renderDebugInfoLabel('Current track')}\n <div className='subsection'>\n {renderDebugInfoLine('Variant Id', currentTrack?.id ?? VIDEOPLAYER_DEBUG.UnknownMetric)}\n {renderDebugInfoLine('Audio Id', currentTrack?.audioId ?? VIDEOPLAYER_DEBUG.UnknownMetric)}\n {renderDebugInfoLine('Original audio Id', currentTrack?.originalAudioId ?? VIDEOPLAYER_DEBUG.UnknownMetric)}\n {renderDebugInfoLine('Label', currentTrack?.label ?? VIDEOPLAYER_DEBUG.UnknownMetric)}\n {renderDebugInfoLine('Language', currentTrack?.language ?? VIDEOPLAYER_DEBUG.UnknownMetric)}\n {renderDebugInfoLine('Mime type', currentTrack?.audioMimeType ?? VIDEOPLAYER_DEBUG.UnknownMetric)}\n {renderDebugInfoLine('Codec', currentTrack?.audioCodec ?? VIDEOPLAYER_DEBUG.UnknownMetric)}\n {renderDebugInfoLine('Roles', currentTrack?.roles.join(' | ') ?? VIDEOPLAYER_DEBUG.UnknownMetric)}\n {renderDebugInfoLine('Required bandwidth', audioBandwidth > 0 ? formatBpsBitrate(audioBandwidth) : VIDEOPLAYER_DEBUG.UnknownMetric)}\n </div>\n </>\n ) : null}\n </>\n );\n};\n\nconst renderLegacySubtitlesDebug = (state: PlayerStateType): React.Node => {\n const { selectedSubtitlesMediaInfo, subtitlesMediaInfo } = state;\n const subs = subtitlesMediaInfo.find((s) => s.index === selectedSubtitlesMediaInfo);\n const { id, index, lang } = subs || {};\n\n const areSubtitlesEnabled = subtitlesMediaInfo.length > 0 && subs;\n const currentTrackLabel = areSubtitlesEnabled ? renderDebugInfoLabel('Current track') : renderDebugInfoLine('Current track', 'None');\n const currentTrackDetails = areSubtitlesEnabled ? (\n <div className='subsection'>\n {renderDebugInfoLine('Id', id ?? VIDEOPLAYER_DEBUG.UnknownMetric)}\n {renderDebugInfoLine('Index', index ?? VIDEOPLAYER_DEBUG.UnknownMetric)}\n {renderDebugInfoLine('Language', lang ?? VIDEOPLAYER_DEBUG.UnknownMetric)}\n </div>\n ) : null;\n\n return (\n <>\n <div className='title'>Subtitles</div>\n {renderDebugInfoLine('Available tracks', subtitlesMediaInfo.length)}\n {subtitlesMediaInfo.length > 0 ? (\n <>\n {currentTrackLabel}\n {currentTrackDetails}\n </>\n ) : null}\n </>\n );\n};\n\nconst renderSubtitlesDebug = (state: PlayerStateType): React.Node => {\n const {\n debugInfo: { shakaMetrics },\n } = state;\n\n if (!shakaMetrics) {\n return renderLegacySubtitlesDebug(state);\n }\n\n const {\n selectedTrackIds: { text: selectedTextId },\n tracks: { text: textTracks },\n } = shakaMetrics;\n\n const currentIndex = textTracks.findIndex((track) => track.id === selectedTextId);\n const currentTrack = currentIndex > -1 ? textTracks[currentIndex] : null;\n\n const currentTrackIntro = currentIndex > -1 ? renderDebugInfoLabel('Current track') : renderDebugInfoLine('Current track', 'None');\n const currentTrackDetails = currentTrack ? (\n <div className='subsection'>\n {renderDebugInfoLine('Id', currentTrack.id)}\n {renderDebugInfoLine('Language', currentTrack.language)}\n {renderDebugInfoLine('Label', currentTrack.label ?? VIDEOPLAYER_DEBUG.UnknownMetric)}\n {renderDebugInfoLine('Kind', currentTrack.kind ?? VIDEOPLAYER_DEBUG.UnknownMetric)}\n {renderDebugInfoLine('Roles', currentTrack.roles.join(' | '))}\n {renderDebugInfoLine('Mime type', currentTrack.mimeType ?? VIDEOPLAYER_DEBUG.UnknownMetric)}\n {renderDebugInfoLine('Forced', currentTrack.forced)}\n </div>\n ) : null;\n\n return (\n <>\n <div className='title'>Subtitles</div>\n {renderDebugInfoLine('Available tracks', textTracks.length)}\n {textTracks.length > 0 ? (\n <>\n {currentTrackIntro}\n {currentTrackDetails}\n </>\n ) : null}\n </>\n );\n};\n\nconst getInitDataType = (initData: Array<ShakaInitData>): string => {\n if (initData.length > 0) {\n return initData.map((data) => data.initDataType).join(' | ');\n }\n\n return VIDEOPLAYER_DEBUG.UnknownMetric;\n};\n\nconst renderDrmDetails = (shakaMetrics: ShakaMetrics): React.Node => {\n const {\n drmInfo: { hasVUDrmToken, initData, keySystem },\n stats: { drmTimeSeconds, licenseTime },\n } = shakaMetrics;\n\n if (!keySystem) {\n return (\n <div className='data'>\n <span className='label'>No DRM</span>\n </div>\n );\n }\n\n return (\n <>\n {renderDebugInfoLine('Key system', keySystem)}\n {renderDebugInfoLine('Init data type', getInitDataType(initData))}\n {renderDebugInfoLine('DRM download time', `${round(drmTimeSeconds)} s`)}\n {renderDebugInfoLine('License requests time', `${round(licenseTime)} s`)}\n {renderDebugInfoLine('VU DRM token', hasVUDrmToken ? 'yes' : 'no')}\n </>\n );\n};\n\nconst renderDrmDebug = (state: PlayerStateType): React.Node => {\n const {\n debugInfo: { shakaMetrics },\n } = state;\n\n if (!shakaMetrics) {\n return null;\n }\n\n return (\n <>\n <div className='title'>DRM</div>\n {renderDrmDetails(shakaMetrics)}\n </>\n );\n};\n\nconst getBuffer = (state: PlayerStateType) => () => [state.debugInfo.shakaMetrics?.bufferFullness ?? 0];\n\nconst getCurrentLevelAndTrack = (shakaMetrics: ShakaMetrics): {| currentLevel: number, currentTrack: VideoTrack | null |} => {\n const {\n selectedTrackIds: { video: selectedVideoId },\n tracks: { video: videoTracks },\n } = shakaMetrics;\n\n const currentLevel = videoTracks.findIndex((track) => track.videoId === selectedVideoId);\n const currentTrack = currentLevel > -1 ? videoTracks[currentLevel] : null;\n\n return {\n currentLevel,\n currentTrack,\n };\n};\n\nconst getLevel = (state: PlayerStateType) => () => {\n const {\n debugInfo: { shakaMetrics },\n } = state;\n\n if (!shakaMetrics) {\n return [0];\n }\n\n const { currentLevel } = getCurrentLevelAndTrack(shakaMetrics);\n\n return [currentLevel];\n};\n\nconst getResolution = (state: PlayerStateType) => () => {\n const {\n debugInfo: { videoHeight },\n } = state;\n\n return typeof videoHeight === 'number' ? [videoHeight] : [0];\n};\n\nconst getBandwidths = (state: PlayerStateType) => () => {\n const {\n debugInfo: { shakaMetrics },\n } = state;\n\n if (!shakaMetrics) {\n return [0, 0];\n }\n\n const { currentTrack } = getCurrentLevelAndTrack(shakaMetrics);\n const requiredBandwidth = currentTrack?.videoBandwidth ?? 0;\n\n const {\n stats: { estimatedBandwidth },\n } = shakaMetrics;\n\n return [estimatedBandwidth / ONE_THOUSAND, requiredBandwidth / ONE_THOUSAND];\n};\n\nconst bufferYAxisCallback = (value: number): string => `${(value * ONE_HUNDRED).toFixed(0)} %`;\n\nconst resolutionAfterBuildTicksCallback = (axis: any) => {\n // eslint-disable-next-line no-magic-numbers\n axis.ticks = [144, 360, 504, 720, 936, 1080].map((v) => {\n return { value: v };\n });\n};\n\nconst renderGraphs = (state: PlayerStateType) => {\n const {\n debugInfo: { shakaMetrics },\n } = state;\n\n if (!shakaMetrics) {\n return null;\n }\n\n const {\n tracks: { video: videoTracks },\n } = shakaMetrics;\n const levelGraph = videoTracks.length > 0 ? <Graph getY={getLevel(state)} maxValue={videoTracks.length - 1} theme={Theme.Blue} tickStep={1} title='Video level' /> : null;\n\n return (\n <>\n {levelGraph}\n <Graph afterBuildTicksCallback={resolutionAfterBuildTicksCallback} getY={getResolution(state)} maxValue={1080} theme={Theme.Yellow} title='Video resolution' />\n <Graph getY={getBuffer(state)} maxValue={1} theme={Theme.Red} tickCallback={bufferYAxisCallback} title='Buffer' />\n <Graph datasetCount={2} getY={getBandwidths(state)} theme={Theme.Green} title='Estimated & required bandwidths (kpbs)' />\n </>\n );\n};\n\nlet panelContainer: HTMLElement | null = null;\nlet panel: HTMLElement | null = null;\nlet offsetX = 0;\nlet offsetY = 0;\n\nconst handleOnMouseDown = (event: SyntheticMouseEvent<HTMLElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n const { clientX, clientY, currentTarget } = event;\n\n const panelElt = currentTarget.closest('.debugOverlay');\n if (!panelElt || !(panelElt instanceof HTMLElement)) {\n return;\n }\n\n const panelContainerElt = panelElt.parentElement;\n if (!panelContainerElt || !(panelContainerElt instanceof HTMLElement)) {\n return;\n }\n\n // Initialize dragging\n panel = panelElt;\n panelContainer = panelContainerElt;\n offsetX = panel.offsetLeft - clientX;\n offsetY = panel.offsetTop - clientY;\n};\n\nconst handleOnMouseUp = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n // End dragging\n panel = null;\n panelContainer = null;\n};\n\nconst handleOnMouseMove = (event: SyntheticMouseEvent<HTMLElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n if (!panel || !panelContainer) {\n // Not dragging\n return;\n }\n\n const { clientX, clientY } = event;\n let newLeft = clientX + offsetX;\n let newTop = clientY + offsetY;\n\n if (newLeft < panelContainer.offsetLeft) {\n newLeft = panelContainer.offsetLeft;\n } else {\n const maxLeft = panelContainer.offsetWidth - panel.offsetWidth;\n if (newLeft > maxLeft) {\n newLeft = maxLeft;\n }\n }\n\n if (newTop < panelContainer.offsetTop) {\n newTop = panelContainer.offsetTop;\n } else {\n const maxTop = panelContainer.offsetHeight - panel.offsetHeight;\n if (newTop > maxTop) {\n newTop = maxTop;\n }\n }\n\n panel.style.left = `${newLeft}px`;\n panel.style.top = `${newTop}px`;\n};\n\nconst copyUrl = async (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>): Promise<void> => {\n event.preventDefault();\n event.stopPropagation();\n\n const { currentTarget } = event;\n const label = currentTarget.getAttribute('data-label') ?? 'URL';\n const url = currentTarget.getAttribute('data-url');\n\n if (!url) {\n logWarning(`${label} not found`);\n return;\n }\n\n try {\n await navigator.clipboard.writeText(url);\n logInfo(`${label} was copied to clipboard`);\n } catch {\n logError(`Error copying ${label} to clipboard`);\n }\n};\n\nconst renderUrl = (label: string, url: string): React.Node => {\n if (url === undefined || url === '') {\n return null;\n }\n\n return (\n <div className='wholeRow'>\n <div className='title'>{label}</div>\n <div className='data'>\n <div className='label button' data-label={label} data-url={url} onClick={copyUrl}>\n COPY\n </div>\n <span className='value'>{url}</span>\n </div>\n </div>\n );\n};\n\nconst renderDebugOverlay = (state: PlayerStateType, isBitrateLimited: boolean, maxBitrate: number, keepAliveState: KeepAliveState | null, onCloseHandler: BasicFunction): React.Node => {\n const {\n debugInfo: { laUrl, streamUrl },\n isDebugOverlayVisible,\n } = state;\n\n if (!isDebugOverlayVisible) {\n return null;\n }\n\n return (\n <div className='debugOverlay' onMouseDown={handleOnMouseDown} onMouseMove={handleOnMouseMove} onMouseUp={handleOnMouseUp}>\n <PictoX onClick={onCloseHandler} />\n {renderUrl('Stream URL', streamUrl)}\n {renderUrl('LA URL', laUrl)}\n <div className='column1'>\n {renderGeneralDebug(state, isBitrateLimited, maxBitrate, keepAliveState)}\n {renderHtmlVideoElementDebug(state)}\n <div className='title'>Audio</div>\n {renderShakaAudioDebug(state)}\n {renderSubtitlesDebug(state)}\n </div>\n <div className='column2'>\n <div className='title'>Video</div>\n {renderShakaVideoDebug(state)}\n {renderDrmDebug(state)}\n </div>\n <div className='column3'>{renderGraphs(state)}</div>\n </div>\n );\n};\n\nexport { renderDebugOverlay };\n","/* @flow */\n\nimport { BO_API_START_STREAM, type BO_RESPONSE_WITH_ETAG } from './types/common';\nimport type { NetgemApiEmitterType, RequestResponseMethodDefinitionType } from '../emitter';\nimport type { CombinedReducers } from '../../../reducers';\nimport type { Dispatch } from '../../../types/types';\nimport { REDUX_MSG_REQUEST_BO_STREAM_START } from '../../constants';\nimport getRequestDetails from './helpers/requestCommon';\n\nconst sendStreamStartRequest: (distributorId: string, streamId: number, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (distributorId, streamId, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> =>\n dispatch(getRequestDetails(distributorId, BO_API_START_STREAM))\n .then((requestDetails) =>\n // Object 'requestDetails' contains 'headers', 'method' and 'uri' parameters\n NetgemApiEmitter.emit(REDUX_MSG_REQUEST_BO_STREAM_START, {\n ...requestDetails,\n signal,\n streamId,\n }),\n )\n .then(({ response }: BO_RESPONSE_WITH_ETAG) => response);\n\nexport default sendStreamStartRequest;\n","/* @flow */\n\nimport { BO_API_STOP_STREAM, type BO_RESPONSE_WITH_ETAG } from './types/common';\nimport type { NetgemApiEmitterType, RequestResponseMethodDefinitionType } from '../emitter';\nimport type { CombinedReducers } from '../../../reducers';\nimport type { Dispatch } from '../../../types/types';\nimport { REDUX_MSG_REQUEST_BO_STREAM_STOP } from '../../constants';\nimport getRequestDetails from './helpers/requestCommon';\n\nconst sendStreamStopRequest: (distributorId: string, streamId: number, bookmark?: string, signal?: AbortSignal, keepAlive?: boolean) => RequestResponseMethodDefinitionType =\n (distributorId, streamId, bookmark, signal, keepAlive) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> =>\n dispatch(getRequestDetails(distributorId, BO_API_STOP_STREAM))\n .then((requestDetails) =>\n // Object 'requestDetails' contains 'headers', 'method' and 'uri' parameters\n NetgemApiEmitter.emit(REDUX_MSG_REQUEST_BO_STREAM_STOP, {\n ...requestDetails,\n bookmark,\n keepAlive,\n signal,\n streamId,\n }),\n )\n .then(({ response }: BO_RESPONSE_WITH_ETAG) => response);\n\nexport default sendStreamStopRequest;\n","/* @flow */\n\nimport type { NetgemApiEmitterType, RequestResponseMethodDefinitionType } from '../emitter';\nimport type { CombinedReducers } from '../../../reducers';\nimport { REDUX_MSG_REQUEST_ENTITLEMENT_GET } from '../../constants/';\nimport { createCustomNetworkErrorFromKey } from '../../../../libs/netgemLibrary/helpers/CreateCustomNetworkError';\nimport { generateApiUrl } from '../helpers/api';\n\nconst sendNtgEntitlementGetRequest: (customData: string, service: string, url: string, channelName: string, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (customData, service, url, channelName, signal) =>\n (dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const state = getState();\n const {\n appRegistration: { applicationId },\n netgemApi: { entitlementGetUrl },\n } = state;\n\n if (!entitlementGetUrl) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definition', { urlDef: 'entitlementGetUrl' }));\n }\n\n const { method, authent } = entitlementGetUrl;\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_ENTITLEMENT_GET, {\n applicationId,\n authent,\n channelName,\n customData,\n method,\n service,\n signal,\n uri: generateApiUrl(entitlementGetUrl, {}, state),\n url,\n });\n };\n\nexport default sendNtgEntitlementGetRequest;\n","/* @flow */\n\nimport type { NetgemApiEmitterType, RequestResponseMethodDefinitionType } from '../emitter';\nimport type { CombinedReducers } from '../../../reducers';\nimport type { Dispatch } from '../../../types/types';\nimport { REDUX_MSG_REQUEST_ENTITLEMENT_RELEASE } from '../../constants/';\nimport { createCustomNetworkErrorFromKey } from '../../../../libs/netgemLibrary/helpers/CreateCustomNetworkError';\nimport { generateApiUrl } from '../helpers/api';\n\nconst sendNtgEntitlementReleaseRequest: (customData: string, service: string, url: string, channelName: string, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (customData, service, url, channelName, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const state = getState();\n const {\n appRegistration: { applicationId },\n netgemApi: { entitlementReleaseUrl },\n } = state;\n\n if (!entitlementReleaseUrl) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definition', { urlDef: 'entitlementReleaseUrl' }));\n }\n\n const { method, authent } = entitlementReleaseUrl;\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_ENTITLEMENT_RELEASE, {\n applicationId,\n authent,\n channelName,\n customData,\n method,\n service,\n signal,\n uri: generateApiUrl(entitlementReleaseUrl, {}, state),\n url,\n });\n };\n\nexport default sendNtgEntitlementReleaseRequest;\n","/* @flow */\n\nimport { BO_API_GET_STREAMS, type BO_RESPONSE_WITH_ETAG } from './types/common';\nimport type { NetgemApiEmitterType, RequestResponseMethodDefinitionType } from '../emitter';\nimport type { CombinedReducers } from '../../../reducers';\nimport type { Dispatch } from '../../../types/types';\nimport { REDUX_MSG_REQUEST_BO_STREAMS_GET } from '../../constants';\nimport getRequestDetails from './helpers/requestCommon';\n\nconst sendGetStreamsRequest: (distributorId: string, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (distributorId, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> =>\n dispatch(getRequestDetails(distributorId, BO_API_GET_STREAMS))\n .then((requestDetails) =>\n // Object 'requestDetails' contains 'headers', 'method' and 'uri' parameters\n NetgemApiEmitter.emit(REDUX_MSG_REQUEST_BO_STREAMS_GET, {\n ...requestDetails,\n signal,\n }),\n )\n .then(({ response }: BO_RESPONSE_WITH_ETAG) => response);\n\nexport default sendGetStreamsRequest;\n","/* @flow */\n\nimport type { BO_API_GET_STREAMS_TYPE, BO_API_STREAM_TYPE } from '../types/stream';\nimport type { BO_API_REQUEST_RESPONSE_BASE } from '../../../../../libs/netgemLibrary/videofutur/types/RequestResponseBase';\nimport type { CombinedReducers } from '../../../../reducers';\nimport type { Dispatch } from '../../../../types/types';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport type { RequestResponseMethodDefinitionType } from '../../emitter';\nimport { createCustomNetworkErrorFromKey } from '../../../../../libs/netgemLibrary/helpers/CreateCustomNetworkError';\nimport { logError } from '../../../../../helpers/debug/debug';\nimport sendGetStreamsRequest from '../getStreams';\nimport sendStreamStopRequest from '../streamStop';\n\nconst stopStreamsForThisDevice: (distributorId: string, streams: Array<BO_API_STREAM_TYPE>, applicationId: string, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (distributorId, streams, applicationId, bookmark, signal) =>\n (dispatch: Dispatch): Promise<any> => {\n const promises = streams.filter((stream) => stream.appId === applicationId).map((stream) => dispatch(sendStreamStopRequest(distributorId, stream.id, undefined, signal)));\n return Promise.allSettled(promises);\n };\n\nconst stopOpenStreams: (distributorId: string | null, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (distributorId, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers): Promise<any> => {\n const state = getState();\n const {\n appConfiguration: { mainDistributorId },\n appRegistration: { applicationId },\n } = state;\n\n if (!applicationId) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_application_id'));\n }\n\n const distributor = distributorId ?? mainDistributorId;\n\n if (!distributor) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_distributor_id'));\n }\n\n return dispatch(sendGetStreamsRequest(distributor, signal)).then((response: BO_API_REQUEST_RESPONSE_BASE) => {\n const { body, streams } = (response: BO_API_GET_STREAMS_TYPE);\n\n const openStreamCount = (body ?? streams).length;\n\n if (openStreamCount > 0) {\n dispatch(stopStreamsForThisDevice(distributor, body ? mapStreams(body) : streams, applicationId, signal)).catch(() =>\n logError(Localizer.localize('common.messages.errors.streams_stop_failure')),\n );\n }\n\n return Promise.resolve(openStreamCount);\n });\n };\n\n// TODO: use correct type (BO API v2)\nconst mapStreams = (body: any): Array<BO_API_STREAM_TYPE> =>\n body.map((stream) => {\n const {\n data: { appId, vstId },\n } = stream;\n\n return {\n appId,\n id: vstId,\n };\n });\n\nexport { stopOpenStreams };\n","/* @flow */\n\nimport './Player.css';\nimport * as React from 'react';\nimport {\n BLINKING_PICTO_DURATION,\n COVER_IMAGE_HEIGHT,\n COVER_IMAGE_WIDTH,\n type CloseData,\n type CompletePlayerPropType,\n ContentType,\n DEBUG_INFO_METRICS_TIMEOUT,\n DOUBLE_CLICK,\n type ErrorCallback,\n GMC_IMAGE_HEIGHT,\n GMC_IMAGE_WIDTH,\n NORMAL_PLAYBACK_INDEX,\n NO_ERROR_CODE,\n type NTGENTITLEMENT_PARAMS,\n OVERLAY_TIMEOUT,\n PLAYBACK_DURATION_ERROR_THRESHOLD,\n PLAYBACK_RATES,\n PLAYHEAD_POSITION_CHANGE_THRESHOLD,\n type PlayerPropType,\n type PlayerStateInitializationType,\n type PlayerStateType,\n ProgramInfoLoadStatus,\n RESOLUTION,\n RESUME_REWIND_DURATION,\n type ReduxPlayerDispatchToPropsType,\n type ReduxPlayerReducerStateType,\n type ResumeData,\n ResumeState,\n SkippingKind,\n StopStreamKind,\n TIMESHIFT_THRESHOLD,\n VOLUME_STEP,\n type ViewingHistoryIds,\n} from './constantsAndTypes';\nimport { type BO_API_CREATE_STREAM_TYPE, type BO_API_STREAM_TYPE } from '../../redux/netgemApi/actions/videofutur/types/stream';\nimport {\n BO_INVALID_APPLICATION_V2,\n BO_INVALID_JWT_V2,\n BO_INVALID_SUBSCRIBER_V2,\n BO_STREAM_DEVICE_NOT_FOUND,\n BO_STREAM_INVALID_USER_IP,\n BO_STREAM_MAX_CONCURRENT_STREAMS_REACHED,\n BO_STREAM_NO_SVOD_CONTENT_RIGHT,\n} from '../../libs/netgemLibrary/videofutur/types/ErrorCodes';\nimport type { BasicFunction, Undefined } from '@ntg/utils/dist/types';\nimport { CHANNEL_IMAGE_HEIGHT, CHANNEL_IMAGE_WIDTH, VOD_TILE_HEIGHT, VOD_TILE_WIDTH } from '../../helpers/ui/constants';\nimport { type CONFIRMATION_DATA_MODAL_TYPE, ConfirmationModalResult } from '../modal/confirmationModal/ConfirmationModal';\nimport { ControlLevel, eventToControlLevel, getSkippingTypeAndValue } from '../../helpers/ui/player';\nimport { type DATA_COLLECTION_INTERNAL_MESSAGE, DataCollectionMessage, DataCollectionPlayerState, DataCollectionStream } from '../../libs/netgemLibrary/v8/types/DataCollection';\nimport { Drm, getFirstSupportedDrm } from '../../helpers/jsHelpers/Drm';\nimport { ExtendedItemType, FAKE_EPG_LIVE_PREFIX, FAKE_LIVE_CHANNEL_PREFIX } from '../../helpers/ui/item/types';\nimport { HttpStatus, NetgemNetworkCode } from '../../libs/netgemLibrary/v8/constants/NetworkCodesAndMessages';\nimport KeepAlive, { KeepAliveState } from './keepAlive';\nimport { Luminosity, type LuminosityType } from '@ntg/ui/dist/theme';\nimport {\n METADATA_KIND_PROGRAM,\n METADATA_KIND_SERIES,\n type MetadataKind,\n type NETGEM_API_V8_METADATA,\n type NETGEM_API_V8_METADATA_PROGRAM,\n type NETGEM_API_V8_METADATA_SERIES,\n} from '../../libs/netgemLibrary/v8/types/MetadataProgram';\nimport { METRICS_ESTAT, MetricsStreamType, type NETGEM_API_CHANNEL } from '../../libs/netgemLibrary/v8/types/Channel';\nimport { MILLISECONDS_PER_SECOND, formatDuration, getIso8601DateInSeconds, getIso8601DurationInSeconds } from '../../helpers/dateTime/Format';\nimport { Messenger, MessengerEvents } from '@ntg/utils/dist/messenger';\nimport type { NETGEM_API_ENTITLEMENT_RESULT, NETGEM_API_URL_LIFECYCLE } from '../../libs/netgemLibrary/ntgEntitlement/types';\nimport {\n type NETGEM_API_V8_FEED_ITEM,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_CATCHUP,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_EST,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_SVOD,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_TVOD,\n} from '../../libs/netgemLibrary/v8/types/FeedItem';\nimport {\n type NETGEM_API_V8_METADATA_LOCATION_VIDEO_STREAM_PARAM,\n type NETGEM_API_V8_METADATA_SCHEDULE_LOCATION,\n type NETGEM_API_V8_METADATA_SCHEDULE_VIDEO_STREAM_ENTITLEMENT_PARAM,\n type NETGEM_API_V8_METADATA_SCHEDULE_VIDEO_STREAM_PARAM,\n StreamType,\n} from '../../libs/netgemLibrary/v8/types/MetadataSchedule';\nimport { PictoBigPlay, PictoForward10, PictoForward30, PictoForward60, PictoPause, PictoRewind10, PictoRewind30, PictoRewind60 } from '@ntg/components/dist/pictos/Element';\nimport { SentryTagName, SentryTagValue } from '../../helpers/debug/sentryTypes';\nimport { type ShakaOfflineContent, getShakaErrorCategoryAsText, getShakaErrorCodeAsText, shouldErrorBeIgnored } from './implementation/shakaTypes';\nimport { VIDEOPLAYER_DEBUG, VIDEOPLAYER_ERRORS, type VideoPlayerInitData, type VideoPlayerMediaInfo, VideoPlayerMediaType } from './implementation/types';\nimport { WebAppHelpersLocationStatus, getLocationStatus } from '../../helpers/ui/location/Format';\nimport { channelHasTimeshift, getChannelImageId, getChannelMetrics, getChannelUrlLifecycle } from '../../helpers/channel/helper';\nimport { filterExternalSubtitles, getHtmlMediaErrorText, getInitDataAsSentryContext, getStreamsFromPlaybackUrls, getVideoStreamDataFromChannel, isInvalidTokenError } from './helper';\nimport { formatSeasonEpisodeNbr, getTitle } from '../../helpers/ui/metadata/Format';\nimport { getAudioSettingCode, getSubtitlesSettingCode, getSubtitlesTrackFromCode } from '../../helpers/ui/language';\nimport { getDurationDisplay, getTimeRangesAsString, getTimestampDisplay, logDebug, logError, logWarning, showDebug } from '../../helpers/debug/debug';\nimport { getTrailer, hasBeenPurchased } from '../../helpers/videofutur/metadata';\nimport { hideModal, showConfirmationModal } from '../../redux/modal/actions';\nimport AccurateTimestamp from '../../helpers/dateTime/AccurateTimestamp';\nimport { AppMobileAppLogo } from '../../helpers/applicationCustomization/ui';\nimport type { BO_API_ERROR_TYPE } from '../../redux/netgemApi/actions/videofutur/types/common';\nimport ButtonBack from '../buttons/ButtonBack';\nimport Collector from '../../helpers/dataCollection/collector';\nimport type { CombinedReducers } from '../../redux/reducers';\nimport { CustomNetworkError } from '../../libs/netgemLibrary/helpers/CustomNetworkError';\nimport type { DATA_COLLECTION_MESSAGE_SETTINGS } from '../../helpers/dataCollection/types';\nimport { Definition } from '../../helpers/ui/metadata/Types';\nimport type { Dispatch } from '../../redux/types/types';\nimport EpgManager from '../../helpers/epg/epgManager';\nimport HotKeys from '../../helpers/hotKeys/hotKeys';\nimport InfiniteCircleLoaderArc from '../loader/infiniteCircleLoaderArc';\nimport { LoadableStatus } from '../../helpers/loadable/loadable';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport MediaController from '../../helpers/mediaSession/mediaController';\nimport Mediametrie from '../../helpers/mediametrie/Mediametrie';\nimport { type NETGEM_API_V8_AUTHENT_REALM } from '../../libs/netgemLibrary/v8/types/Realm';\nimport type { NETGEM_API_V8_URL_DEFINITION } from '../../libs/netgemLibrary/v8/types/NtgVideoFeed';\nimport { type NETGEM_API_VIEWINGHISTORY_ITEM } from '../../libs/netgemLibrary/v8/types/ViewingHistory';\nimport { PlayerError } from '../../helpers/playerError/PlayerError';\nimport PlayerShaka from './implementation/playerShaka';\nimport { RecordingOutcome } from '../../libs/netgemLibrary/v8/types/Npvr';\nimport { RegistrationType } from '../../redux/appRegistration/types/types';\nimport SentryWrapper from '../../helpers/debug/sentry';\nimport { Setting } from '../../helpers/settings/types';\nimport { type SettingValueType } from '../settings/SettingsConstsAndTypes';\nimport ShakaStorage from './implementation/shakaStorage';\nimport { SkipDirection } from '../../helpers/ui/types';\nimport { TileConfigTileType } from '../../libs/netgemLibrary/v8/types/WidgetConfig';\nimport VideoController from './controller/PlayerController';\nimport { buildErrorResponse as buildBOErrorResponse } from '../../redux/netgemApi/actions/helpers/bo';\nimport { buildViewingHistoryItem } from '../../helpers/viewingHistory/ViewingHistory';\nimport clsx from 'clsx';\nimport { connect } from 'react-redux';\nimport { fireAndForget } from '../../helpers/jsHelpers/promise';\nimport fscreen from 'fscreen';\nimport { generateApiUrl } from '../../redux/netgemApi/actions/helpers/api';\nimport { getBoundedValue } from '../../helpers/maths/maths';\nimport { getCommonMetrics } from './implementation/metrics';\nimport { getImageUrl } from '../../redux/netgemApi/actions/v8/metadataImage';\nimport { getLocationType } from '../../libs/netgemLibrary/v8/helpers/Item';\nimport { getRoundedDurationToISOString } from '../../libs/netgemLibrary/v8/helpers/Date';\nimport { getSettingValueByNameFromDeviceSettings } from '../../redux/netgemApi/actions/helpers/settings';\nimport { ignoreIfAborted } from '../../libs/netgemLibrary/helpers/cancellablePromise/promiseHelper';\nimport { isRecordingMatching } from '../../helpers/npvr/recording';\nimport { parseBoolean } from '../../helpers/jsHelpers/parser';\nimport { produce } from 'immer';\nimport { purchaseAndCreate } from '../../redux/netgemApi/actions/videofutur/helpers/purchase';\nimport { renderDebugOverlay } from './debug';\nimport sendBOStreamCreateRequest from '../../redux/netgemApi/actions/videofutur/createStream';\nimport sendBOStreamStartRequest from '../../redux/netgemApi/actions/videofutur/streamStart';\nimport sendBOStreamStopRequest from '../../redux/netgemApi/actions/videofutur/streamStop';\nimport sendNtgEntitlementGetRequest from '../../redux/netgemApi/actions/ntgEntitlement/get';\nimport sendNtgEntitlementReleaseRequest from '../../redux/netgemApi/actions/ntgEntitlement/release';\nimport sendV8LocationEpgRequest from '../../redux/netgemApi/actions/v8/epg';\nimport sendV8MetadataLocationRequest from '../../redux/netgemApi/actions/v8/metadataLocation';\nimport sendV8MetadataRequest from '../../redux/netgemApi/actions/v8/metadata';\nimport { sendV8RecordingsMetadataRequest } from '../../redux/netgemApi/actions/v8/recordings';\nimport { stopOpenStreams } from '../../redux/netgemApi/actions/videofutur/helpers/stopOpenStreams';\nimport { updateSetting } from '../../redux/ui/actions';\nimport { updateViewingHistory } from '../../redux/netgemApi/actions/personalData/viewingHistory';\n\nconst InitialState: PlayerStateType = {\n audioMediaInfo: [],\n bufferedTimeRanges: null,\n channel: null,\n channelImageUrl: '',\n contentType: ContentType.Static,\n controlLevel: ControlLevel.Level0,\n currentItem: null,\n dataCollectionLastPlaybackTime: 0,\n dataCollectionMessage: null,\n dataCollectionStartTime: 0,\n debugInfo: {\n isPlayheadPositionFallback: false,\n laUrl: '',\n playerName: '',\n playerVersion: '',\n state: VIDEOPLAYER_DEBUG.StateInitializing,\n streamUrl: '',\n time: 0,\n totalTime: 0,\n },\n downloadOperationId: null,\n duration: 0,\n endMargin: 0,\n externalSubtitles: [],\n forcedResumePosition: null,\n imageUrl: null,\n isBOStreamRequestPending: false,\n isBuffering: true,\n isControllerEnabled: false,\n isCurrentItemBlackedOut: false,\n isDebugOverlayVisible: false,\n isInFullscreen: false,\n isLiveRecording: false,\n isMuted: false,\n isOverlayVisible: false,\n isPlaying: false,\n isTimeshiftEnabled: false,\n isTimeshiftSwitching: false,\n isTrailer: false,\n isVideoQualityAuto: false,\n isVideofuturAsset: false,\n liveBufferLength: 0,\n location: null,\n locationId: null,\n locationMetrics: null,\n locationStatus: null,\n playheadPosition: 0,\n programInfoLoadStatus: ProgramInfoLoadStatus.NotStarted,\n programMetadata: null,\n realEnd: 0,\n realStart: 0,\n resumePosition: -1,\n resumeState: ResumeState.NotChecked,\n selectedAudioMediaInfo: 0,\n selectedSubtitlesMediaInfo: 0,\n selectedVideoQuality: 0,\n seriesEpisodeText: null,\n seriesMetadata: null,\n skipping: SkippingKind.None,\n startMargin: 0,\n subtitlesMediaInfo: [],\n timeshift: 0,\n title: '',\n totalDuration: 0,\n userViewEndOffset: 0,\n userViewStartOffset: 0,\n videoStreamData: null,\n viewingHistoryId: null,\n volume: 0,\n vtiId: null,\n};\n\nclass PlayerView extends React.PureComponent<CompletePlayerPropType, PlayerStateType> {\n abortController: AbortController;\n\n checkEndFunction: Undefined<BasicFunction>;\n\n clickTimer: TimeoutID | null;\n\n currentEntitlementParams: NTGENTITLEMENT_PARAMS | null;\n\n currentFeedItemTime: number;\n\n // Stream Id of Videofutur VOD currently being played (changes on every pause/play)\n currentVideofuturStreamId: number | null;\n\n // Timers used to collect data during start (ramp up period)\n dataCollectionRampUpTimers: Array<TimeoutID>;\n\n // Settings for data collection (enabled, stream type, ramp up, frequency)\n dataCollectionSettings: DATA_COLLECTION_MESSAGE_SETTINGS | null;\n\n // Timer used for the data collection heartbeat\n dataCollectionSamplingTimer: IntervalID | null;\n\n debugInfoMetricsTimer: TimeoutID | null;\n\n distributorId: string;\n\n hidePlayPicto: boolean;\n\n initialChannelId: string | null;\n\n // Used to avoid closing the player when starting a recording that's still being recorded in its end margin (but no more in the user view)\n isFirstPass: boolean;\n\n isOverlayHovered: boolean;\n\n isPlayStarted: boolean;\n\n isRestartingSession: boolean;\n\n isSubtitlesAutoSelectionApplied: boolean;\n\n isZapping: boolean;\n\n keepAlive: KeepAlive | null;\n\n lastViewingHistoryItem: {| locationId: ?string, playheadPosition: number |} | null;\n\n mediametrie: Mediametrie | null;\n\n nextChannel: NETGEM_API_CHANNEL | null;\n\n overlayTimer: TimeoutID | null;\n\n playbackRateIndex: number;\n\n // Only used for debug purpose\n playerSessionStart: number;\n\n resumeTimer: TimeoutID | null;\n\n videoContainer: HTMLElement | null;\n\n videoController: React.ElementRef<any> | null;\n\n videoElement: HTMLVideoElement | null;\n\n videoPlayer: PlayerShaka | null;\n\n constructor(props: CompletePlayerPropType) {\n super(props);\n\n this.abortController = new AbortController();\n this.checkEndFunction = undefined;\n this.clickTimer = null;\n this.currentEntitlementParams = null;\n this.currentFeedItemTime = 0;\n this.currentVideofuturStreamId = null;\n this.dataCollectionRampUpTimers = [];\n this.dataCollectionSamplingTimer = null;\n this.dataCollectionSettings = Collector.getPlayerStateSettings();\n this.distributorId = '';\n this.hidePlayPicto = true;\n this.initialChannelId = null;\n this.isFirstPass = true;\n this.isOverlayHovered = false;\n this.isPlayStarted = false;\n this.isRestartingSession = false;\n this.isSubtitlesAutoSelectionApplied = false;\n this.isZapping = false;\n this.keepAlive = null;\n this.lastViewingHistoryItem = null;\n this.mediametrie = null;\n this.nextChannel = null;\n this.overlayTimer = null;\n this.playbackRateIndex = 9;\n this.playerSessionStart = AccurateTimestamp.now();\n this.resumeTimer = null;\n this.videoContainer = null;\n this.videoController = null;\n this.videoElement = null;\n this.videoPlayer = null;\n\n fscreen.onfullscreenchange = this.onFullScreenChange;\n\n const {\n settings: { [Setting.Volume]: volume },\n } = props;\n\n this.state = {\n ...InitialState,\n volume,\n };\n }\n\n async componentDidMount(): Promise<void> {\n const { playerItem, playerOfflineContent } = this.props;\n\n window.addEventListener('keydown', this.handleLevelControlKey);\n window.addEventListener('keyup', this.handleLevelControlKey);\n window.addEventListener('beforeunload', this.stopBOStream, { passive: true });\n\n Messenger.on(MessengerEvents.AUTHENTICATION_REQUIRED, this.handleAuthenticationRequired);\n\n HotKeys.register(['ctrl+shift+d', 'alt+shift+d'], this.handleShowDebugHotKey, { name: 'Player.showDebug' });\n HotKeys.register('alt+ctrl+shift+d', this.handleShowDebugOverlayHotKey, { name: 'Player.showDebugOverlay' });\n HotKeys.register('f', this.handleFullscreenHotKey, { name: 'Player.fullscreen' });\n HotKeys.register('h', this.handleHideControlsHotKey, { name: 'Player.hideControls' });\n HotKeys.register('i', this.handleShowInfoHotKey, { name: 'Player.showInfo' });\n HotKeys.register('m', this.handleMuteHotKey, { name: 'Player.mute' });\n HotKeys.register('l', this.handleGoBackToLiveHotKey, { name: 'Player.backToLive' });\n HotKeys.register(['left', 'alt+left', 'ctrl+left', 'shift+left'], this.handleBackwardHotKey, { name: 'Player.backward' });\n HotKeys.register(['right', 'alt+right', 'ctrl+right', 'shift+right'], this.handleForwardHotKey, { name: 'Player.forward' });\n HotKeys.register('down', this.handlePreviousChannelHotKey, { name: 'Player.previousChannel' });\n HotKeys.register('up', this.handleNextChannelHotKey, { name: 'Player.nextChannel' });\n HotKeys.register('space', this.handlePlayHotKey, { name: 'Player.play' });\n HotKeys.register('escape', this.handleExitHotKey, { name: 'Player.exit' });\n HotKeys.register(['minus', 'numpad_minus'], this.handleVolumeDownHotKey, { name: 'Player.volumeDown' });\n HotKeys.register(['plus', 'numpad_plus'], this.handleVolumeUpHotKey, { name: 'Player.volumeUp' });\n HotKeys.register('less_than', this.handleSlowerHotKey, { name: 'Player.slower' });\n HotKeys.register('shift+less_than', this.handleFasterHotKey, { name: 'Player.faster' });\n HotKeys.register(['ctrl+shift+less_than', 'alt+shift+less_than'], this.handleNormalSpeedHotKey, { name: 'Player.normalSpeed' });\n\n if (playerOfflineContent !== null) {\n // Offline content\n return await this.openOfflineContent(playerOfflineContent);\n }\n\n if (playerItem === null) {\n return Promise.resolve();\n }\n\n // Everything else\n const { authority, item, locationId, programMetadata = null, seriesMetadata = null, type, viewingHistoryId = null, vtiId = null } = playerItem;\n\n if (type === ExtendedItemType.TV) {\n // Live, catchup, recording and SVOD with Netgem authority\n return this.openTVItem(item, programMetadata, seriesMetadata, authority);\n } else if (programMetadata) {\n fireAndForget(this.loadImageFromMetadata(programMetadata, seriesMetadata));\n if (type === ExtendedItemType.Trailer) {\n // Trailer\n return this.openTrailerItem(programMetadata, seriesMetadata);\n }\n\n // TVOD, EST and SVOD with non-Netgem authority\n return this.openVodItem(item, programMetadata, seriesMetadata, vtiId, viewingHistoryId, locationId ?? null);\n }\n\n return Promise.resolve();\n }\n\n componentDidUpdate(prevProps: CompletePlayerPropType, prevState: PlayerStateType) {\n const {\n applicationName,\n npvrRecordingsList,\n settings: { [Setting.GreenStreaming]: isBitrateLimited },\n } = this.props;\n const {\n npvrRecordingsList: prevNpvrRecordingsList,\n settings: { [Setting.GreenStreaming]: prevIsBitrateLimited },\n } = prevProps;\n const { channel, contentType, currentItem, isControllerEnabled, isDebugOverlayVisible, isOverlayVisible, liveBufferLength, playheadPosition, programMetadata, resumeState, timeshift } = this.state;\n const {\n channel: prevChannel,\n currentItem: prevCurrentItem,\n isControllerEnabled: prevIsControllerEnabled,\n isDebugOverlayVisible: prevIsDebugOverlayVisible,\n isOverlayVisible: prevIsOverlayVisible,\n liveBufferLength: prevLiveBufferLength,\n playheadPosition: prevPlayheadPosition,\n programMetadata: prevProgramMetadata,\n resumeState: prevResumeState,\n timeshift: prevTimeshift,\n } = prevState;\n const { checkEndFunction, mediametrie } = this;\n\n if (isBitrateLimited !== prevIsBitrateLimited) {\n this.updateMaxBitrate(isBitrateLimited);\n }\n\n if (channel !== prevChannel || liveBufferLength !== prevLiveBufferLength) {\n this.updateTimeshiftStatus(liveBufferLength);\n }\n\n if (isDebugOverlayVisible !== prevIsDebugOverlayVisible) {\n this.toggleDebugInfoMetrics(isDebugOverlayVisible);\n }\n\n if (currentItem && currentItem !== prevCurrentItem) {\n // Live playing: item changed\n MediaController.initialize(applicationName);\n this.mcLoadProgramImage();\n fireAndForget(this.loadLiveItemLocationMetadata(currentItem));\n }\n\n if (playheadPosition !== prevPlayheadPosition && checkEndFunction) {\n checkEndFunction();\n }\n\n if (contentType === ContentType.Live && prevChannel !== channel && channel) {\n // Channel has changed: search new item in EPG\n this.findPlayedItemInEpgFeed(channel, playheadPosition);\n }\n\n if (programMetadata && programMetadata !== prevProgramMetadata) {\n // Refresh recordings in case the new item is being recorded\n this.refreshNpvr();\n }\n\n if ((timeshift === 0 && prevTimeshift > TIMESHIFT_THRESHOLD) || (timeshift > TIMESHIFT_THRESHOLD && prevTimeshift === 0)) {\n this.setTimeshiftSwitch(true);\n }\n\n if (mediametrie && timeshift !== prevTimeshift) {\n mediametrie.updateTimeshift(timeshift);\n }\n\n if (!isOverlayVisible && prevIsOverlayVisible) {\n Messenger.emit(MessengerEvents.CLOSE_CHANNEL_LIST);\n }\n\n if (resumeState === ResumeState.PromptUserIfNeeded && resumeState !== prevResumeState) {\n this.promptUserToResume();\n }\n\n if (npvrRecordingsList !== prevNpvrRecordingsList) {\n this.checkLiveRecordingStatus();\n }\n\n if (isControllerEnabled && isControllerEnabled !== prevIsControllerEnabled) {\n this.checkDebugOverlayAutoOpen();\n }\n }\n\n componentWillUnmount() {\n const { abortController, mediametrie } = this;\n\n abortController.abort('Component Player will unmount');\n\n window.removeEventListener('keydown', this.handleLevelControlKey);\n window.removeEventListener('keyup', this.handleLevelControlKey);\n window.removeEventListener('beforeunload', this.stopBOStream, { passive: true });\n\n Messenger.off(MessengerEvents.AUTHENTICATION_REQUIRED, this.handleAuthenticationRequired);\n\n HotKeys.unregister(['ctrl+shift+d', 'alt+shift+d'], this.handleShowDebugHotKey);\n HotKeys.unregister('alt+ctrl+shift+d', this.handleShowDebugOverlayHotKey);\n HotKeys.unregister('f', this.handleFullscreenHotKey);\n HotKeys.unregister('h', this.handleHideControlsHotKey);\n HotKeys.unregister('i', this.handleShowInfoHotKey);\n HotKeys.unregister('m', this.handleMuteHotKey);\n HotKeys.unregister('l', this.handleGoBackToLiveHotKey);\n HotKeys.unregister('left', this.handleBackwardHotKey);\n HotKeys.unregister('right', this.handleForwardHotKey);\n HotKeys.unregister('down', this.handlePreviousChannelHotKey);\n HotKeys.unregister('up', this.handleNextChannelHotKey);\n HotKeys.unregister('space', this.handlePlayHotKey);\n HotKeys.unregister('escape', this.handleExitHotKey);\n HotKeys.unregister(['minus', 'numpad_minus'], this.handleVolumeDownHotKey);\n HotKeys.unregister(['plus', 'numpad_plus'], this.handleVolumeUpHotKey);\n HotKeys.unregister('less_than', this.handleSlowerHotKey);\n HotKeys.unregister('shift+less_than', this.handleFasterHotKey);\n HotKeys.unregister(['ctrl+shift+less_than', 'alt+shift+less_than'], this.handleNormalSpeedHotKey);\n\n this.resetOverlayTimer();\n this.resetResumeTimer();\n this.resetClickTimer();\n this.resetDebugInfoMetricsTimer();\n\n if (mediametrie) {\n mediametrie.notifyStop();\n mediametrie.destroy();\n this.mediametrie = null;\n }\n }\n\n // Show debug info\n handleShowDebugHotKey = (event: SyntheticKeyboardEvent<HTMLElement>) => {\n const { isDebugModeEnabled } = this.props;\n const { videoPlayer } = this;\n\n event.preventDefault();\n event.stopPropagation();\n\n if (isDebugModeEnabled) {\n this.showDebugInfo();\n\n if (videoPlayer) {\n videoPlayer.showDebug();\n }\n }\n };\n\n // Toggle debug overlay\n handleShowDebugOverlayHotKey = (event: SyntheticKeyboardEvent<HTMLElement>) => {\n const { isControllerEnabled } = this.state;\n\n if (!isControllerEnabled) {\n // Play not started yet\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n this.setState(\n produce((draft) => {\n draft.isDebugOverlayVisible = !draft.isDebugOverlayVisible;\n }),\n );\n };\n\n setDebugInfoUrls = (streamUrl: string, laUrl: string = ''): void => {\n this.setState(\n produce((draft) => {\n draft.debugInfo.laUrl = laUrl;\n draft.debugInfo.streamUrl = streamUrl;\n }),\n );\n };\n\n checkDebugOverlayAutoOpen = () => {\n const {\n isDebugModeEnabled,\n settings: { [Setting.AutoOpenPlayerDebugPanel]: autoOpenPlayerDebugPanel },\n } = this.props;\n\n if (!isDebugModeEnabled || !autoOpenPlayerDebugPanel) {\n return;\n }\n\n this.setState({ isDebugOverlayVisible: true });\n };\n\n /*\n * Attempt at correctly closing the stream when page unloads (navigation, refresh, etc.)\n * WARNING: no guarantee of success (but \"forgotten\" streams are closed at next startup in this case)\n */\n stopBOStream = () => {\n const { localSendVideofuturStreamStopRequest } = this.props;\n const { currentVideofuturStreamId, distributorId } = this;\n\n if (currentVideofuturStreamId) {\n localSendVideofuturStreamStopRequest(distributorId, currentVideofuturStreamId, this.getBookmark(), undefined, true);\n }\n };\n\n // Toggle fullscreen\n handleFullscreenHotKey = (event: SyntheticKeyboardEvent<HTMLElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n this.toggleFullscreen();\n };\n\n // Hide controls\n handleHideControlsHotKey = (event: SyntheticKeyboardEvent<HTMLElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n this.hideControls();\n };\n\n // Show program card\n handleShowInfoHotKey = (event: SyntheticKeyboardEvent<HTMLElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n this.handleInfoOnClick();\n };\n\n // Toggle sound\n handleMuteHotKey = (event: SyntheticKeyboardEvent<HTMLElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n this.handleVolumeOnClick();\n };\n\n // Skip backward\n handleBackwardHotKey = (event: SyntheticKeyboardEvent<HTMLElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n this.skip(SkipDirection.Backward, event);\n };\n\n // Skip forward\n handleForwardHotKey = (event: SyntheticKeyboardEvent<HTMLElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n this.skip(SkipDirection.Forward, event);\n };\n\n // Previous channel (live only)\n handlePreviousChannelHotKey = (event: SyntheticKeyboardEvent<HTMLElement>) => {\n const { contentType } = this.state;\n\n event.preventDefault();\n event.stopPropagation();\n\n if (contentType === ContentType.Live) {\n this.goToPreviousChannel();\n }\n };\n\n // Next channel (live only)\n handleNextChannelHotKey = (event: SyntheticKeyboardEvent<HTMLElement>) => {\n const { contentType } = this.state;\n\n event.preventDefault();\n event.stopPropagation();\n\n if (contentType === ContentType.Live) {\n this.goToNextChannel();\n }\n };\n\n // Toggle play/pause\n handlePlayHotKey = (event: SyntheticKeyboardEvent<HTMLElement>): Promise<void> => {\n event.preventDefault();\n event.stopPropagation();\n\n return this.togglePlayVideo();\n };\n\n // Exit\n handleExitHotKey = (event: SyntheticKeyboardEvent<HTMLElement>): Promise<void> => {\n event.preventDefault();\n event.stopPropagation();\n\n return this.handleClose({ errorCode: NO_ERROR_CODE });\n };\n\n // Sound down\n handleVolumeDownHotKey = (event: SyntheticKeyboardEvent<HTMLElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n this.changeVolume(-VOLUME_STEP);\n };\n\n // Sound up\n handleVolumeUpHotKey = (event: SyntheticKeyboardEvent<HTMLElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n this.changeVolume(VOLUME_STEP);\n };\n\n setPlaybackRate = (playbackRateIndex: number) => {\n const { contentType, isControllerEnabled, isTimeshiftEnabled } = this.state;\n\n const { videoElement } = this;\n\n if (!isControllerEnabled || (contentType === ContentType.Live && !isTimeshiftEnabled)) {\n // Play not started yet or timeshift disabled\n return;\n }\n\n if (!videoElement) {\n return;\n }\n\n this.playbackRateIndex = playbackRateIndex;\n videoElement.playbackRate = PLAYBACK_RATES[playbackRateIndex];\n\n logDebug(`Playback rate: ${videoElement.playbackRate}`);\n };\n\n handleSlowerHotKey = (event: SyntheticKeyboardEvent<HTMLElement>) => {\n const { playbackRateIndex } = this;\n\n event.preventDefault();\n event.stopPropagation();\n\n if (playbackRateIndex > 0) {\n this.setPlaybackRate(playbackRateIndex - 1);\n }\n };\n\n handleFasterHotKey = (event: SyntheticKeyboardEvent<HTMLElement>) => {\n const { playbackRateIndex } = this;\n\n event.preventDefault();\n event.stopPropagation();\n\n if (playbackRateIndex < PLAYBACK_RATES.length - 1) {\n this.setPlaybackRate(playbackRateIndex + 1);\n }\n };\n\n handleNormalSpeedHotKey = (event: SyntheticKeyboardEvent<HTMLElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n this.setPlaybackRate(NORMAL_PLAYBACK_INDEX);\n };\n\n handleLevelControlKey = (event: SyntheticKeyboardEvent<HTMLElement>) => {\n this.setState({ controlLevel: eventToControlLevel(event) });\n };\n\n updateTimeshiftStatus = (liveBufferLength: number) => {\n const { channels } = this.props;\n const { channel } = this.state;\n\n this.setState({ isTimeshiftEnabled: channelHasTimeshift(channels, channel?.epgid) && liveBufferLength > 0 });\n };\n\n // Functions starting with 'mc' are only used for Global Media Controls\n\n initializeMediaController = () => {\n const { applicationName } = this.props;\n const { contentType, imageUrl, isTrailer, isVideofuturAsset } = this.state;\n\n MediaController.initialize(applicationName);\n\n if (isTrailer || isVideofuturAsset) {\n // VOD item or VOD trailer\n if (imageUrl) {\n MediaController.setImage(imageUrl, 'image/jpeg', VOD_TILE_WIDTH, VOD_TILE_HEIGHT);\n }\n } else {\n // Live, catchup or recording\n this.mcLoadProgramImage();\n }\n\n MediaController.setPlayHandler(this.playVideo);\n MediaController.setPauseHandler(this.pauseVideo);\n MediaController.setSeekBackwardHandler(this.mcSkipBackward);\n MediaController.setSeekForwardHandler(this.mcSkipForward);\n\n if (contentType === ContentType.Live) {\n MediaController.setPreviousTrackHandler(this.goToPreviousChannel);\n MediaController.setNextTrackHandler(this.goToNextChannel);\n } else {\n MediaController.setPreviousTrackHandler(undefined);\n MediaController.setNextTrackHandler(undefined);\n }\n };\n\n goToPreviousChannel = () => {\n const { videoController } = this;\n\n if (!videoController) {\n return;\n }\n\n videoController.goToPreviousChannel();\n this.showOverlay();\n };\n\n goToNextChannel = () => {\n const { videoController } = this;\n\n if (!videoController) {\n return;\n }\n\n videoController.goToNextChannel();\n this.showOverlay();\n };\n\n mcSkipBackward = () => {\n this.skip(SkipDirection.Backward);\n };\n\n mcSkipForward = () => {\n this.skip(SkipDirection.Forward);\n };\n\n mcLoadProgramImage = () => {\n const { localGetImageUrl } = this.props;\n const { currentItem } = this.state;\n const {\n abortController: { signal },\n } = this;\n\n if (!currentItem) {\n return;\n }\n\n const { selectedProgramId } = currentItem;\n\n localGetImageUrl(selectedProgramId, GMC_IMAGE_WIDTH, GMC_IMAGE_HEIGHT, undefined, signal)\n .then((imageUrl: string) => MediaController.setImage(imageUrl, 'image/jpeg', GMC_IMAGE_WIDTH, GMC_IMAGE_HEIGHT))\n .catch((error) => ignoreIfAborted(signal, error));\n };\n\n showDebugInfo = () => {\n const {\n currentFeedItemTime,\n props,\n state,\n state: {\n bufferedTimeRanges,\n dataCollectionLastPlaybackTime,\n dataCollectionStartTime,\n duration,\n endMargin,\n liveBufferLength,\n playheadPosition,\n realEnd,\n realStart,\n startMargin,\n timeshift,\n totalDuration,\n userViewEndOffset,\n userViewStartOffset,\n },\n } = this;\n\n showDebug('Player', {\n instance: this,\n instanceFields: [\n 'currentEntitlementParams',\n 'currentVideofuturStreamId',\n 'dataCollectionSettings',\n 'distributorId',\n 'hidePlayPicto',\n 'initialChannelId',\n 'isFirstPass',\n 'isOverlayHovered',\n 'isPlayStarted',\n 'isSubtitlesAutoSelectionApplied',\n 'isZapping',\n 'lastViewingHistoryItem',\n 'mediametrie',\n 'nextChannel',\n 'videoPlayer',\n ],\n misc: {\n bufferedTimeRanges: getTimeRangesAsString(bufferedTimeRanges),\n currentFeedItemTime: getTimestampDisplay(currentFeedItemTime),\n dataCollectionLastPlaybackTime: getTimestampDisplay(dataCollectionLastPlaybackTime),\n dataCollectionStartTime: getTimestampDisplay(dataCollectionStartTime),\n duration: getDurationDisplay(duration),\n endMargin: getDurationDisplay(endMargin),\n liveBufferLength: getDurationDisplay(liveBufferLength),\n playheadPosition: getTimestampDisplay(playheadPosition),\n realEnd: getTimestampDisplay(realEnd),\n realStart: getTimestampDisplay(realStart),\n startMargin: getDurationDisplay(startMargin),\n timeshift: getDurationDisplay(timeshift),\n totalDuration: getDurationDisplay(totalDuration),\n userViewEndOffset: getDurationDisplay(userViewEndOffset),\n userViewStartOffset: getDurationDisplay(userViewStartOffset),\n },\n props,\n propsFields: ['isDebugModeEnabled', 'playerItem', 'playerOfflineContent', 'settings'],\n state,\n stateFields: [\n 'audioMediaInfo',\n 'channel',\n 'channelImageUrl',\n 'contentType',\n 'controlLevel',\n 'currentItem',\n 'dataCollectionLastPlaybackTime',\n 'dataCollectionMessage',\n 'dataCollectionStartTime',\n 'debugInfo',\n 'duration',\n 'endMargin',\n 'externalSubtitles',\n 'forcedResumePosition',\n 'imageUrl',\n 'isBOStreamRequestPending',\n 'isBuffering',\n 'isControllerEnabled',\n 'isCurrentItemBlackedOut',\n 'isDebugOverlayVisible',\n 'isInFullscreen',\n 'isLiveRecording',\n 'isMuted',\n 'isOverlayVisible',\n 'isPlaying',\n 'isTimeshiftEnabled',\n 'isTimeshiftSwitching',\n 'isTrailer',\n 'isVideoQualityAuto',\n 'isVideofuturAsset',\n 'liveBufferLength',\n 'location',\n 'locationId',\n 'locationMetrics',\n 'locationStatus',\n 'playheadPosition',\n 'programInfoLoadStatus',\n 'programMetadata',\n 'realEnd',\n 'realStart',\n 'resumePosition',\n 'resumeState',\n 'selectedAudioMediaInfo',\n 'selectedSubtitlesMediaInfo',\n 'selectedVideoQuality',\n 'seriesEpisodeText',\n 'seriesMetadata',\n 'skipping',\n 'startMargin',\n 'subtitlesMediaInfo',\n 'timeshift',\n 'title',\n 'totalDuration',\n 'userViewEndOffset',\n 'userViewStartOffset',\n 'videoStreamData',\n 'viewingHistoryId',\n 'volume',\n 'vtiId',\n ],\n });\n };\n\n startDebugInfoMetricsTimer = () => {\n this.resetDebugInfoMetricsTimer();\n this.debugInfoMetricsTimer = setTimeout(this.updateDebugInfoMetrics, DEBUG_INFO_METRICS_TIMEOUT);\n };\n\n resetDebugInfoMetricsTimer = () => {\n if (this.debugInfoMetricsTimer) {\n clearTimeout(this.debugInfoMetricsTimer);\n this.debugInfoMetricsTimer = null;\n }\n };\n\n resetOverlayTimer = () => {\n if (this.overlayTimer) {\n clearTimeout(this.overlayTimer);\n this.overlayTimer = null;\n }\n };\n\n resetResumeTimer = () => {\n if (this.resumeTimer) {\n clearTimeout(this.resumeTimer);\n this.resumeTimer = null;\n }\n };\n\n resetClickTimer = () => {\n if (this.clickTimer) {\n clearTimeout(this.clickTimer);\n this.clickTimer = null;\n }\n };\n\n displayChannelNotAvailableMsg = () => {\n Messenger.emit(MessengerEvents.NOTIFY_ERROR, <div>{Localizer.localize('player.errors.channel_unavailable')}</div>);\n this.finishZapping();\n };\n\n displayErrorMessage = (code: string, message: ?string, isLargeNotificationNeeded?: boolean) => {\n const msgText = message ? message : Localizer.localize('common.messages.errors.retry');\n const codeElement = code !== '' ? <div className='errorCode'>{Localizer.localize('common.messages.errors.code', { code })}</div> : null;\n\n Messenger.emit(\n MessengerEvents.NOTIFY_ERROR,\n <>\n <div className='errorMessage'>{msgText}</div>\n {codeElement}\n </>,\n isLargeNotificationNeeded ? { className: 'large' } : undefined,\n );\n };\n\n handleAuthenticationRequired = async () => {\n await this.handleClose({ errorCode: NO_ERROR_CODE });\n };\n\n promptUserToCancelDownload = (operationId: string): void => {\n const { localShowConfirmation } = this.props;\n\n const data = {\n button1Title: 'Interrompre & Fermer',\n button2Title: 'Poursuivre',\n question: \"Si vous quittez le lecteur vidéo, le téléchargement en cours sera interrompu.\\n\\nSouhaitez-vous poursuivre ce téléchargement ou bien l'interrompre et fermer le lecteur ?\",\n title: 'Téléchargement en cours',\n };\n\n Messenger.once(MessengerEvents.MODAL_CONFIRMATION_CLOSED, (result: ConfirmationModalResult) => this.cancelDownloadConfirmationClosedCallback(result, operationId));\n localShowConfirmation(data);\n };\n\n cancelDownloadConfirmationClosedCallback = (result: ConfirmationModalResult, operationId: string): Promise<void> => {\n if (result !== ConfirmationModalResult.Button1) {\n return Promise.resolve();\n }\n\n // Close toast\n Messenger.emit(MessengerEvents.NOTIFY_CLOSE, operationId);\n\n // Cancel download\n ShakaStorage.cancelDownload(operationId);\n\n // Close player\n return this.closePlayer({ errorCode: NO_ERROR_CODE });\n };\n\n handleClose = (data: CloseData): Promise<void> => {\n const { errorCode } = data;\n const { downloadOperationId } = this.state;\n\n if (errorCode === NO_ERROR_CODE && downloadOperationId !== null) {\n // User tried to exit player while a download was in progress\n this.promptUserToCancelDownload(downloadOperationId);\n return Promise.resolve();\n }\n\n return this.closePlayer(data);\n };\n\n closePlayer = async (data: CloseData): Promise<void> => {\n const { errorCode, errorMsg, isSafariWorkaround, isLargeNotificationNeeded } = data;\n const { closeCallback, closeConfirmation } = this.props;\n\n MediaController.reset();\n\n if (!isSafariWorkaround) {\n // Send last player state and flush\n this.sendCurrentPlayerState(errorCode ? DataCollectionPlayerState.Error : DataCollectionPlayerState.Stop, false, errorCode);\n Messenger.emit(MessengerEvents.FLUSH_COLLECTOR);\n }\n\n this.stopDataCollection();\n\n const { fullscreenElement, fullscreenEnabled } = fscreen;\n if (fullscreenElement !== null && fullscreenEnabled) {\n fscreen.exitFullscreen();\n }\n\n closeConfirmation();\n\n // Notify user except for specific codes which should be ignored\n if (errorCode && !shouldErrorBeIgnored(errorCode)) {\n this.displayErrorMessage(errorCode, errorMsg, isLargeNotificationNeeded);\n }\n\n try {\n await this.stopVideo(StopStreamKind.FinalStop);\n } catch {\n // Error can be ignored\n } finally {\n closeCallback(isSafariWorkaround === true);\n }\n };\n\n checkEnd = () => {\n const { duration, playheadPosition, userViewEndOffset } = this.state;\n const { isFirstPass, videoPlayer } = this;\n\n if (playheadPosition > duration - userViewEndOffset) {\n if (isFirstPass) {\n // First time this code is reached is during initialization\n this.isFirstPass = false;\n } else {\n videoPlayer?.endedEvent();\n }\n }\n };\n\n refreshNpvr = () => {\n Messenger.emit(MessengerEvents.REFRESH_NPVR);\n };\n\n updateViewingHistory = () => {\n const { localUpdateViewingHistory } = this.props;\n const { contentType, isTrailer, resumeState } = this.state;\n\n if (isTrailer || contentType === ContentType.Live || (resumeState !== ResumeState.Done && resumeState !== ResumeState.NoResumePosition)) {\n return;\n }\n\n const item = this.getViewingHistoryItem();\n if (!item) {\n return;\n }\n\n localUpdateViewingHistory(item);\n };\n\n // Margins are removed so that only the program's duration is taken into account\n getViewingHistoryItem = (): NETGEM_API_VIEWINGHISTORY_ITEM | null => {\n const { viewingHistory } = this.props;\n const { currentItem, duration, realEnd, realStart } = this.state;\n const { playheadPosition: exactPlayheadPosition } = this.state;\n const { lastViewingHistoryItem } = this;\n\n const viewingHistoryIds = this.getViewingHistoryIds();\n if (!viewingHistoryIds) {\n return null;\n }\n\n const { locationId, programId, seriesId } = viewingHistoryIds;\n if (!locationId) {\n return null;\n }\n\n const channelId = currentItem?.selectedLocation.channelId;\n const playheadPosition = Math.floor(exactPlayheadPosition);\n\n // Check last viewing history item before sending then same update request\n if (lastViewingHistoryItem) {\n const { locationId: lastLocationId, playheadPosition: lastPlayheadPosition } = lastViewingHistoryItem;\n if (lastLocationId === locationId && lastPlayheadPosition === playheadPosition) {\n return null;\n }\n }\n\n // Only saved for checking purpose\n this.lastViewingHistoryItem = {\n locationId,\n playheadPosition,\n };\n\n return buildViewingHistoryItem(viewingHistory, locationId, programId, seriesId, playheadPosition, duration, realStart, realEnd, channelId);\n };\n\n getViewingHistoryIds = (): ViewingHistoryIds | null => {\n const { playerItem } = this.props;\n const { locationId, viewingHistoryId: stateViewingHistoryId } = this.state;\n\n if (!playerItem?.programMetadata) {\n return null;\n }\n\n const { programMetadata, seriesMetadata } = playerItem;\n\n const { providerInfo: programProviderInfo } = programMetadata;\n if (programProviderInfo) {\n // VOD item\n if (!stateViewingHistoryId) {\n // Location Id is missing\n return null;\n }\n\n const { viewingHistoryId } = programProviderInfo;\n return {\n isVod: true,\n locationId: stateViewingHistoryId,\n programId: viewingHistoryId,\n seriesId: seriesMetadata?.providerInfo.viewingHistoryId ?? null,\n };\n }\n\n // TV item\n const { id } = programMetadata;\n\n return {\n isVod: false,\n locationId,\n programId: id,\n seriesId: seriesMetadata?.id ?? null,\n };\n };\n\n getResumeData = (locationId: string | null, programId: string, seriesId: string | null): ResumeData => {\n const { viewingHistory } = this.props;\n const { duration, realStart, userViewEndOffset } = this.state;\n\n let resumePosition = -1;\n let item: NETGEM_API_VIEWINGHISTORY_ITEM | null = null;\n\n if (seriesId) {\n // Series episode\n const { [seriesId]: series } = viewingHistory;\n const episodes = series?.episodes;\n\n if (episodes) {\n item = episodes.find((ep) => ep.id === programId) ?? null;\n }\n } else {\n // Single\n ({ [programId]: item } = viewingHistory);\n }\n\n if (item && locationId) {\n const { playeditems } = item;\n if (playeditems) {\n const { [locationId]: matchingItem } = playeditems;\n\n if (matchingItem) {\n const { position } = matchingItem;\n\n if (position > 0) {\n resumePosition = position + realStart;\n\n const maxPositionThreshold = duration - userViewEndOffset - RESUME_REWIND_DURATION;\n if (resumePosition > maxPositionThreshold) {\n resumePosition = -1;\n }\n }\n }\n }\n }\n\n return {\n resumePosition,\n resumeState: resumePosition > 0 ? ResumeState.PromptUserIfNeeded : ResumeState.NoResumePosition,\n };\n };\n\n // Margins are added so that the returned value is a valid seek position\n checkResumePosition = () => {\n const { playerItem, viewingHistoryStatus } = this.props;\n const { duration, forcedResumePosition, locationId: fullLocationId, resumeState: currentResumeState } = this.state;\n\n if (forcedResumePosition !== null) {\n // Broadpeak session expired and has been restarted\n this.setState({\n resumePosition: forcedResumePosition,\n resumeState: ResumeState.PromptUserIfNeeded,\n });\n return;\n }\n\n if (currentResumeState !== ResumeState.NotChecked) {\n // Already checked\n return;\n }\n\n const viewingHistoryIds = this.getViewingHistoryIds();\n\n if (!viewingHistoryIds) {\n this.setState({\n resumePosition: -1,\n resumeState: ResumeState.NoResumePosition,\n });\n return;\n }\n\n const { isVod, locationId, programId, seriesId } = viewingHistoryIds;\n\n if (viewingHistoryStatus === LoadableStatus.NotInitialized) {\n this.setState({\n resumePosition: -1,\n resumeState: ResumeState.NotChecked,\n });\n return;\n }\n\n if (viewingHistoryStatus === LoadableStatus.Error || !locationId || !programId || !duration) {\n this.setState({\n resumePosition: -1,\n resumeState: ResumeState.NoResumePosition,\n });\n return;\n }\n\n let resumeData = this.getResumeData(locationId, programId, seriesId);\n const { resumeState } = resumeData;\n if (playerItem && resumeState === ResumeState.NoResumePosition && isVod) {\n // Backward compatibility: check resume position with full location Id\n const { programMetadata, seriesMetadata } = playerItem;\n\n if (programMetadata) {\n const { id } = programMetadata;\n resumeData = this.getResumeData(fullLocationId, id, seriesMetadata?.id ?? null);\n }\n }\n\n this.setState(resumeData);\n };\n\n stopMediametrie = () => {\n const { mediametrie } = this;\n\n if (mediametrie) {\n mediametrie.notifyStop();\n mediametrie.destroy();\n this.mediametrie = null;\n }\n };\n\n stopVideo = async (stopType: StopStreamKind): Promise<any> => {\n const { keepAlive, videoElement, videoPlayer } = this;\n\n this.stopMediametrie();\n\n if (videoElement?.textTracks) {\n // Hide subtitles (if any)\n for (let i = 0; i < videoElement.textTracks.length; ++i) {\n videoElement.textTracks[i].mode = 'hidden';\n }\n }\n\n if (stopType === StopStreamKind.FinalStop && videoPlayer) {\n // Clean up video player\n await videoPlayer.reset();\n this.videoPlayer = null;\n\n if (keepAlive) {\n await keepAlive.stop();\n }\n }\n\n return this.sendStreamStop(stopType);\n };\n\n setInitAudioAndSubtitlesLanguages = (data: VideoPlayerInitData): VideoPlayerInitData => {\n const {\n settings: {\n [Setting.AutoSelectAudioTrack]: autoSelectAudioTrack,\n [Setting.AutoSelectSubtitlesTrack]: autoSelectSubtitlesTrack,\n [Setting.LastAudioTrack]: lastAudioTrack,\n [Setting.LastSubtitlesTrack]: lastSubtitlesTrack,\n },\n } = this.props;\n\n return {\n ...data,\n audioLanguage: autoSelectAudioTrack && lastAudioTrack ? lastAudioTrack : undefined,\n subtitlesLanguage: autoSelectSubtitlesTrack && lastSubtitlesTrack ? lastSubtitlesTrack : undefined,\n };\n };\n\n plugCallbacks = (videoPlayer: PlayerShaka): void => {\n if (videoPlayer.bufferingCallback) {\n // Callbacks already plugged in (we're probably zapping between two live channels)\n return;\n }\n\n videoPlayer.bufferingCallback = this.buffering;\n videoPlayer.bufferLoadedCallback = this.bufferLoaded;\n videoPlayer.errorCallback = this.playerError;\n videoPlayer.liveBufferLengthUpdatedCallback = this.liveBufferLengthUpdated;\n videoPlayer.playbackEndedCallback = this.playbackEnded;\n videoPlayer.playbackPausedCallback = this.playbackPaused;\n videoPlayer.playbackPlayingCallback = this.playbackPlaying;\n videoPlayer.playbackTimeUpdatedCallback = this.playbackTimeUpdated;\n videoPlayer.safariVodWorkaroundCallback = this.safariVodWorkaround;\n videoPlayer.streamInfoUpdatedCallback = this.streamInfoUpdated;\n videoPlayer.streamInitializedCallback = this.streamInitialized;\n videoPlayer.volumeChangedCallback = this.setVolume;\n };\n\n createVideoPlayer = (): PlayerShaka | null => {\n const {\n authenticationToken,\n settings: { [Setting.BufferBehind]: bufferBehind, [Setting.BufferingGoal]: bufferingGoal, [Setting.RebufferingGoal]: rebufferingGoal },\n } = this.props;\n const { contentType, isVideofuturAsset, title } = this.state;\n const { videoContainer, videoElement, videoPlayer } = this;\n\n if (videoPlayer) {\n // Reuse existing player in case of channel change while playing live stream\n return videoPlayer;\n }\n\n if (!videoElement || !videoContainer) {\n // No HTML video element or container as parent (not supposed to happen)\n return null;\n }\n\n const settings = {\n bufferBehind,\n bufferingGoal,\n rebufferingGoal,\n };\n\n // Instantiate Shaka Player (passing video container makes Shaka uses its UITextDisplayer)\n try {\n return new PlayerShaka(videoElement, videoContainer, settings, authenticationToken, isVideofuturAsset, contentType, title ?? 'unknown title');\n } catch (error) {\n const { message } = error;\n\n Messenger.emit(MessengerEvents.NOTIFY_ERROR, <div className='errorMessage'>{message === 'BrowserNotSupported' ? 'Navigateur non supporté' : message}</div>);\n return null;\n }\n };\n\n startVideoInternal = async (initData: VideoPlayerInitData | null, errorAction: ErrorCallback): Promise<void> => {\n const { channels, deviceSettings } = this.props;\n const { contentType, locationMetrics, locationStatus } = this.state;\n\n if (!initData) {\n return errorAction();\n }\n\n // Update stream type in debug info\n const { type: streamType } = initData;\n this.setState(\n produce((draft) => {\n draft.debugInfo.streamType = streamType;\n }),\n );\n\n this.videoPlayer = this.createVideoPlayer();\n const { videoPlayer } = this;\n\n if (!videoPlayer) {\n SentryWrapper.error({\n breadcrumbs: ['Function startVideoInternal'],\n context: getInitDataAsSentryContext(initData),\n message: 'Missing videoPlayer',\n tagName: SentryTagName.Component,\n tagValue: SentryTagValue.Player,\n });\n return errorAction();\n }\n\n this.plugCallbacks(videoPlayer);\n\n // Initialize eStat if metrics exist for current channel\n if (contentType === ContentType.Live || locationStatus === WebAppHelpersLocationStatus.Catchup) {\n const { channelId } = initData;\n const metrics = getChannelMetrics(channels, channelId, METRICS_ESTAT, contentType === ContentType.Live ? MetricsStreamType.Live : MetricsStreamType.Catchup, locationMetrics);\n\n if (metrics) {\n const forceOptOutConsent = parseBoolean(getSettingValueByNameFromDeviceSettings(deviceSettings, 'mediametrie', 'forceOptOutConsentType'));\n this.mediametrie = new Mediametrie(metrics, videoPlayer.name, videoPlayer.getVersion(), videoPlayer.getState, videoPlayer.getPosition, forceOptOutConsent);\n }\n }\n\n try {\n const data = await this.startVideoWithPromise(initData);\n\n if (data === null) {\n // Player exited while starting: silently close\n return Promise.reject(new PlayerError('7000'));\n }\n\n return await this.startVideoWithPromiseSuccess(videoPlayer, data);\n } catch (error) {\n // Start failed\n this.setState({ videoStreamData: null });\n const { code, message } = error;\n return this.handleClose({ errorCode: code === VIDEOPLAYER_ERRORS.VS996StartupCancelled ? null : (code ?? VIDEOPLAYER_ERRORS.VS998InternalError), errorMsg: message });\n }\n };\n\n startVideoWithPromiseSuccess = async (videoPlayer: PlayerShaka, data: VideoPlayerInitData): Promise<void> => {\n const {\n isMaxBitrateAllowed,\n maxBitrate,\n settings: { [Setting.GreenStreaming]: isBitrateLimited, [Setting.Volume]: volume },\n state,\n } = this.props;\n const { externalSubtitles, locationId } = this.state;\n const { keepAlive, videoElement } = this;\n\n // Now use this data to start the player\n\n // Pixel tracking\n const { trackingStart } = data;\n if (trackingStart) {\n const trackingUrl = generateApiUrl(trackingStart, null, state);\n if (trackingUrl) {\n fetch(trackingUrl, { mode: 'no-cors' }).catch(() => {\n // Errors while initializing pixel tracking are ignored\n logWarning('Error initializing pixel tracking');\n });\n }\n }\n\n // Set audio and subtitles track (if settings say so)\n const dataWithLanguage = this.setInitAudioAndSubtitlesLanguages(data);\n\n if (locationId && getLocationType(locationId) === NETGEM_API_V8_ITEM_LOCATION_TYPE_TVOD) {\n // Refresh purchase list to get new expiration for TVOD\n Messenger.emit(MessengerEvents.REFRESH_PURCHASE_LIST);\n }\n\n if (isMaxBitrateAllowed && isBitrateLimited && maxBitrate > 0) {\n // If maxBitrate is greater than 0, enforce it, otherwise sky is the limit\n dataWithLanguage.maxBitrate = maxBitrate;\n }\n\n try {\n // Initialize player\n await videoPlayer.initialize(dataWithLanguage);\n\n // Handle external subtitles (sidecar)\n const { drm } = data;\n if (videoElement && drm !== Drm.Fairplay && externalSubtitles.length > 0) {\n // Sidecar subtitles handled by Shaka Player\n await videoPlayer.addSubtitles(externalSubtitles);\n }\n\n videoPlayer.setVolume(volume);\n this.initializeMediaController();\n this.finishZapping();\n\n if (keepAlive) {\n keepAlive.start();\n }\n\n return Promise.resolve();\n } catch (error) {\n // $FlowFixMe: flow doesn't know DOMException\n if (error instanceof DOMException && error.name === 'AbortError') {\n // User probably exited player while it was loading: ignore error\n return Promise.resolve();\n }\n\n logError('Error initializing player');\n logError(error);\n throw error;\n }\n };\n\n startVideo = async (initData: VideoPlayerInitData | null, errorAction: ErrorCallback) => {\n try {\n await this.stopVideo(StopStreamKind.Initialization);\n\n if (!initData) {\n errorAction();\n return;\n }\n\n await this.startVideoInternal(initData, errorAction);\n } catch (error) {\n this.finishZapping();\n }\n };\n\n startIfReady = (errorAction: ErrorCallback): Promise<void> => {\n const { videoStreamData } = this.state;\n const { isPlayStarted } = this;\n\n if (isPlayStarted || !videoStreamData) {\n errorAction();\n return Promise.resolve();\n }\n\n this.isPlayStarted = true;\n\n return this.startVideo(videoStreamData, errorAction);\n };\n\n openOfflineContent = async (offlineContent: ShakaOfflineContent): Promise<void> => {\n this.videoPlayer = this.createVideoPlayer();\n const { videoPlayer } = this;\n\n if (!videoPlayer) {\n SentryWrapper.error({\n breadcrumbs: ['Function openOfflineContent'],\n context: offlineContent,\n message: 'Missing videoPlayer',\n tagName: SentryTagName.Component,\n tagValue: SentryTagValue.Player,\n });\n return this.handleClose({ errorCode: VIDEOPLAYER_ERRORS.VS998InternalError });\n }\n\n this.plugCallbacks(videoPlayer);\n\n const {\n appMetadata: { assetId, channelId, title },\n } = offlineContent;\n this.setState({ programInfoLoadStatus: ProgramInfoLoadStatus.Loaded, title });\n\n fireAndForget(this.loadChannelImage(channelId));\n\n if (assetId) {\n fireAndForget(this.loadImageFromAssetId(assetId));\n }\n\n try {\n await videoPlayer.initializeOffline();\n return await videoPlayer.startOffline(offlineContent);\n } catch (error) {\n return this.handleClose({ errorCode: VIDEOPLAYER_ERRORS.VS994OfflineContentError, errorMsg: error.message });\n }\n };\n\n // Live, catchup, recording and SVOD with Netgem authority\n openTVItem = (\n item: NETGEM_API_V8_FEED_ITEM,\n programMetadata: NETGEM_API_V8_METADATA_PROGRAM | null,\n seriesMetadata: NETGEM_API_V8_METADATA_SERIES | null,\n authority?: NETGEM_API_V8_AUTHENT_REALM,\n ) => {\n const { channels } = this.props;\n const {\n locType,\n selectedLocation: { channelId, id: locationId },\n } = item;\n\n this.showOverlay();\n\n const locationStatus = locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING ? WebAppHelpersLocationStatus.Recording : getLocationStatus(item, authority);\n\n if (!locationStatus) {\n return;\n }\n\n let title: string | null = null;\n const contentType = locationStatus === WebAppHelpersLocationStatus.Live ? ContentType.Live : ContentType.Static;\n\n if (programMetadata) {\n title = getTitle(programMetadata, Localizer.language);\n if (!title && seriesMetadata) {\n title = getTitle(seriesMetadata, Localizer.language);\n }\n }\n\n if (contentType === ContentType.Live) {\n this.initialChannelId = channelId ?? null;\n }\n\n const channel = channelId ? channels[channelId] : null;\n\n this.setState(\n produce((draft) => {\n draft.channel = channel;\n draft.contentType = contentType;\n draft.currentItem = item;\n draft.locationId = locationId;\n draft.locationStatus = locationStatus;\n draft.programMetadata = programMetadata;\n draft.seriesEpisodeText = formatSeasonEpisodeNbr(programMetadata);\n draft.seriesMetadata = seriesMetadata;\n draft.title = title;\n }),\n () => {\n if (locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_SVOD && programMetadata) {\n fireAndForget(this.loadImageFromMetadata(programMetadata, seriesMetadata));\n } else {\n fireAndForget(this.loadChannelImage(channelId));\n }\n this.checkLiveRecordingStatus();\n return this.initializePlayer();\n },\n );\n };\n\n checkLiveRecordingStatus = () => {\n const { contentType } = this.state;\n\n this.setState({ isLiveRecording: contentType === ContentType.Live && this.isBeingLiveRecorded() });\n };\n\n isBeingLiveRecorded = (): boolean => {\n const { npvrRecordingsList } = this.props;\n const { currentItem } = this.state;\n\n if (!currentItem) {\n return false;\n }\n\n const { selectedProgramId } = currentItem;\n const recording = selectedProgramId ? npvrRecordingsList[selectedProgramId] : null;\n return Boolean(recording?.some((r) => r.recordOutcome === RecordingOutcome.Recorded && isRecordingMatching(currentItem, r)));\n };\n\n loadImageFromAssetId = async (assetId: string): Promise<void> => {\n const { localGetImageUrl } = this.props;\n const {\n abortController: { signal },\n } = this;\n\n try {\n const url: string = await localGetImageUrl(assetId, COVER_IMAGE_WIDTH, COVER_IMAGE_HEIGHT, undefined, signal);\n this.setState({ imageUrl: url });\n return Promise.resolve();\n } catch (error) {\n return ignoreIfAborted(signal, error);\n }\n };\n\n loadImageFromMetadata = (programMetadata: NETGEM_API_V8_METADATA_PROGRAM, seriesMetadata: NETGEM_API_V8_METADATA_SERIES | null): Promise<void> => {\n const { id: programId } = programMetadata;\n const { id: seriesId } = seriesMetadata ?? {};\n\n return this.loadImageFromAssetId(seriesId ?? programId);\n };\n\n loadChannelImage = async (channelId: ?string): Promise<void> => {\n const { channels, localGetImageUrl } = this.props;\n const { currentItem, programMetadata, seriesMetadata } = this.state;\n const {\n abortController: { signal },\n } = this;\n\n const channelImageId = getChannelImageId(channels, channelId);\n\n if (!channelImageId) {\n return Promise.resolve();\n }\n\n try {\n const channelImageUrl: string = await localGetImageUrl(channelImageId, CHANNEL_IMAGE_WIDTH, CHANNEL_IMAGE_HEIGHT, Luminosity.Light, signal);\n this.setState({ channelImageUrl });\n\n // Notify media controller\n MediaController.setImage(channelImageUrl, 'image/png', CHANNEL_IMAGE_WIDTH, CHANNEL_IMAGE_HEIGHT);\n\n if (channelImageUrl === '' && currentItem?.locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_SVOD && programMetadata) {\n // No channel image: try to load item image\n return this.loadImageFromMetadata(programMetadata, seriesMetadata);\n }\n\n return Promise.resolve();\n } catch (error) {\n return ignoreIfAborted(signal, error);\n }\n };\n\n // Trailer\n openTrailerItem = (programMetadata: NETGEM_API_V8_METADATA_PROGRAM, seriesMetadata: NETGEM_API_V8_METADATA_SERIES | null): Promise<void> => {\n const { streamPriorities } = this.props;\n\n const trailer: NETGEM_API_V8_METADATA_SCHEDULE_VIDEO_STREAM_PARAM | null = getTrailer(streamPriorities, programMetadata, seriesMetadata);\n\n if (!trailer) {\n return this.handleClose({ errorCode: VIDEOPLAYER_ERRORS.VS997NoTrailerError, errorMsg: Localizer.localize('player.trailer.not_found') });\n }\n\n this.showOverlay();\n\n const { path: url, type } = trailer;\n\n this.setDebugInfoUrls(url);\n\n this.getSubtitlesFromMetadata(seriesMetadata ?? programMetadata);\n\n this.setState(\n produce((draft) => {\n draft.isTrailer = true;\n draft.programInfoLoadStatus = ProgramInfoLoadStatus.Loaded;\n draft.programMetadata = programMetadata;\n draft.seriesEpisodeText = formatSeasonEpisodeNbr(programMetadata);\n draft.seriesMetadata = seriesMetadata;\n draft.title = getTitle(seriesMetadata || programMetadata, Localizer.language);\n draft.videoStreamData = {\n type,\n url,\n };\n }),\n () => this.startIfReady(() => this.handleClose({ errorCode: VIDEOPLAYER_ERRORS.VS998InternalError })),\n );\n\n return Promise.resolve();\n };\n\n handleVodPlayError = (\n error: BO_API_ERROR_TYPE | Error,\n item: NETGEM_API_V8_FEED_ITEM,\n programMetadata: NETGEM_API_V8_METADATA_PROGRAM,\n seriesMetadata: NETGEM_API_V8_METADATA_SERIES | null,\n vtiId: number,\n ): Promise<void> => {\n let status: ?(string | number) = null;\n let errorMsg: string | null = null;\n let maxNbStreams = 1;\n\n if (error instanceof PlayerError) {\n ({ code: status, message: errorMsg } = error);\n } else if (error instanceof CustomNetworkError) {\n if (isInvalidTokenError(error)) {\n // Nothing to do: app will restart\n return this.handleClose({ errorCode: NO_ERROR_CODE });\n }\n\n const {\n networkError: { result },\n } = error;\n\n if (result) {\n ({ code: status, message: errorMsg } = result);\n const maxNbStreamsStr = result.variables?.maxNbStreams;\n maxNbStreams = typeof maxNbStreamsStr === 'number' ? Number(maxNbStreamsStr) : 1;\n }\n }\n\n if (status === null) {\n ({ errorMsg, status } = buildBOErrorResponse(null, error));\n }\n\n let isLargeNotificationNeeded = false;\n if (status === BO_STREAM_MAX_CONCURRENT_STREAMS_REACHED) {\n // BO error code when max number of concurrent streams being played is reached\n errorMsg = Localizer.localize('player.errors.max_concurrent_streams_reached', { count: maxNbStreams });\n isLargeNotificationNeeded = true;\n } else if (status === BO_STREAM_NO_SVOD_CONTENT_RIGHT) {\n // BO error code when no right has been found\n errorMsg = Localizer.localize('player.errors.missing_right');\n } else if (status === BO_STREAM_INVALID_USER_IP) {\n // BO error code when user IP is geo locked\n errorMsg = Localizer.localize('player.errors.content_unavailable_in_country');\n } else if (status === BO_STREAM_DEVICE_NOT_FOUND || status === BO_INVALID_JWT_V2 || status === BO_INVALID_APPLICATION_V2 || status === BO_INVALID_SUBSCRIBER_V2) {\n // Nothing to do: app will restart\n return this.handleClose({ errorCode: NO_ERROR_CODE });\n }\n\n SentryWrapper.error({\n breadcrumbs: ['Function openVodItem', 'playFunc rejected'],\n context: {\n item: JSON.stringify(item),\n programMetadata: JSON.stringify(programMetadata),\n seriesMetadata: JSON.stringify(seriesMetadata),\n vtiId,\n },\n error: error instanceof Error ? error : undefined,\n message: errorMsg ?? 'playFunc failure',\n tagName: SentryTagName.Component,\n tagValue: SentryTagValue.Player,\n });\n\n return this.handleClose({ errorCode: status?.toString(), errorMsg, isLargeNotificationNeeded });\n };\n\n // VOD\n openVodItem = async (\n item: NETGEM_API_V8_FEED_ITEM,\n programMetadata: NETGEM_API_V8_METADATA_PROGRAM,\n seriesMetadata: NETGEM_API_V8_METADATA_SERIES | null,\n vtiId: number | null,\n viewingHistoryId: string | null,\n locationId: string | null,\n forcedResumePosition?: number,\n ): Promise<void> => {\n const { localCreateVodStreamFromId, localCreateSvodStreamFromId, playerItem, purchaseList } = this.props;\n const {\n abortController: { signal },\n } = this;\n\n // Use given location Id (which tells if the video is a TVOD or an EST, and if not defined, use the first location's\n const {\n selectedLocation: { id },\n } = item;\n const localLocationId = locationId ?? id;\n\n if (!playerItem || !localLocationId) {\n return this.handleClose({ errorCode: VIDEOPLAYER_ERRORS.VS998InternalError });\n }\n\n const { distributorId } = playerItem;\n\n if (!distributorId) {\n SentryWrapper.error({\n breadcrumbs: ['Function openVodItem'],\n context: {\n item: JSON.stringify(item),\n programMetadata: JSON.stringify(programMetadata),\n seriesMetadata: JSON.stringify(seriesMetadata),\n vtiId,\n },\n message: 'Missing distributorId',\n tagName: SentryTagName.Component,\n tagValue: SentryTagValue.Player,\n });\n logWarning('Cannot open player without distributorId');\n\n return this.handleClose({ errorCode: VIDEOPLAYER_ERRORS.VS998InternalError });\n }\n\n if (!vtiId) {\n SentryWrapper.error({\n breadcrumbs: ['Function openVodItem'],\n context: {\n distributorId,\n item: JSON.stringify(item),\n programMetadata: JSON.stringify(programMetadata),\n seriesMetadata: JSON.stringify(seriesMetadata),\n },\n message: 'Missing vtiId',\n tagName: SentryTagName.Component,\n tagValue: SentryTagValue.Player,\n });\n logWarning('Cannot open player without vtiId');\n\n return this.handleClose({ errorCode: VIDEOPLAYER_ERRORS.VS998InternalError });\n }\n\n this.showOverlay();\n this.isPlayStarted = true;\n this.distributorId = distributorId;\n\n this.setState(\n produce((draft) => {\n draft.currentItem = item;\n\n if (typeof forcedResumePosition === 'number') {\n draft.forcedResumePosition = forcedResumePosition;\n }\n }),\n );\n\n const createStream = typeof forcedResumePosition === 'number' || hasBeenPurchased(purchaseList, distributorId, vtiId) ? localCreateVodStreamFromId : localCreateSvodStreamFromId;\n\n /*\n * In case a stream was not correctly closed, we receive a 1002 error when trying to play it again.\n * So, in this case, we try once to kill all open streams (just like at startup) and try again to create the stream\n */\n const createStreamWithRetry = async (isRetry: boolean): Promise<BO_API_CREATE_STREAM_TYPE> => {\n const { localStopOpenStreams } = this.props;\n\n try {\n return await createStream(distributorId, vtiId, signal);\n } catch (error) {\n // BO_API_ERROR_TYPE | CustomNetworkError | PlayerError\n if (error instanceof CustomNetworkError && !isRetry && error.getCustomCode() === BO_STREAM_MAX_CONCURRENT_STREAMS_REACHED) {\n await localStopOpenStreams(distributorId, signal);\n signal.throwIfAborted();\n return createStreamWithRetry(true);\n }\n\n throw error;\n }\n };\n\n try {\n const createdStream: BO_API_CREATE_STREAM_TYPE = await createStreamWithRetry(false);\n return this.startVideofuturStream(createdStream.stream, localLocationId, programMetadata, seriesMetadata, viewingHistoryId);\n } catch (error) {\n // BO_API_ERROR_TYPE | CustomNetworkError | PlayerError\n return ignoreIfAborted(signal, error, () => this.handleVodPlayError(error, item, programMetadata, seriesMetadata, vtiId));\n }\n };\n\n getSubtitlesFromMetadata = (metadata: NETGEM_API_V8_METADATA_SCHEDULE_LOCATION | NETGEM_API_V8_METADATA) => {\n const { externalSubtitles } = this.state;\n const { playbackUrls, trailerUrl } = metadata;\n\n if (externalSubtitles.length > 0) {\n // Subtitles already set (at stream creation)\n return;\n }\n\n let start: NETGEM_API_V8_URL_DEFINITION | null = null;\n if (playbackUrls && playbackUrls.length > 0) {\n // Schedule location\n [{ start }] = playbackUrls;\n } else if (trailerUrl) {\n // Program metadata\n ({ start } = trailerUrl);\n } else {\n return;\n }\n\n const { params } = start;\n const videostreams = params?.find((i) => i.name === 'videostreams');\n\n const propertiesArg = videostreams?.value.args.find((i) => ((i: any): NETGEM_API_V8_METADATA_LOCATION_VIDEO_STREAM_PARAM).properties);\n if (!propertiesArg) {\n return;\n }\n\n const { properties } = ((propertiesArg: any): NETGEM_API_V8_METADATA_LOCATION_VIDEO_STREAM_PARAM);\n if (!properties) {\n return;\n }\n\n const { subtitles } = properties;\n if (!subtitles) {\n return;\n }\n\n this.setState(\n produce((draft) => {\n draft.externalSubtitles = filterExternalSubtitles(subtitles);\n }),\n );\n };\n\n loadVodLocationMetadata = async (locationId: string): Promise<void> => {\n const { localSendV8MetadataLocationRequest } = this.props;\n const { videoStreamData } = this.state;\n const {\n abortController: { signal },\n } = this;\n\n try {\n // NETGEM_API_V8_REQUEST_RESPONSE\n const {\n result: { location: locationMetadata },\n } = await localSendV8MetadataLocationRequest(locationId, signal);\n\n this.setState(\n produce((draft) => {\n draft.location = locationMetadata;\n }),\n );\n this.getSubtitlesFromMetadata(locationMetadata);\n return this.startVideoInternal(videoStreamData, () => this.handleClose({ errorCode: VIDEOPLAYER_ERRORS.VS998InternalError }));\n } catch (error) {\n return ignoreIfAborted(signal, error);\n }\n };\n\n // VOD\n startVideofuturStream = async (\n stream: BO_API_STREAM_TYPE,\n locationId: string,\n programMetadata: NETGEM_API_V8_METADATA_PROGRAM,\n seriesMetadata: NETGEM_API_V8_METADATA_SERIES | null,\n viewingHistoryId: string | null,\n ): Promise<void> => {\n // Following method creates 'videoStreamData'\n const newState = await this.initializeVideofuturData(stream, programMetadata, seriesMetadata, locationId, viewingHistoryId);\n\n if (!newState) {\n return;\n }\n\n this.setState(\n produce((draft) => {\n draft.endMargin = newState.endMargin;\n draft.externalSubtitles = newState.externalSubtitles;\n draft.isBuffering = newState.isBuffering;\n draft.isVideofuturAsset = newState.isVideofuturAsset;\n draft.locationId = newState.locationId;\n draft.programInfoLoadStatus = newState.programInfoLoadStatus;\n draft.programMetadata = newState.programMetadata;\n draft.realEnd = newState.realEnd;\n draft.realStart = newState.realStart;\n draft.seriesEpisodeText = newState.seriesEpisodeText;\n draft.seriesMetadata = newState.seriesMetadata;\n draft.startMargin = newState.startMargin;\n draft.title = newState.title;\n draft.videoStreamData = newState.videoStreamData;\n draft.viewingHistoryId = newState.viewingHistoryId;\n draft.vtiId = newState.vtiId;\n }),\n () => this.loadVodLocationMetadata(locationId),\n );\n };\n\n // VOD\n initializeVideofuturData = async (\n stream: BO_API_STREAM_TYPE,\n programMetadata: NETGEM_API_V8_METADATA_PROGRAM,\n seriesMetadata: NETGEM_API_V8_METADATA_SERIES | null,\n locationId: string,\n viewingHistoryId: string | null,\n ): Promise<PlayerStateInitializationType | null> => {\n const { grantedTicket, id, subtitles, vtiId } = stream;\n\n this.isRestartingSession = false;\n\n if (!grantedTicket) {\n await this.handleClose({ errorCode: VIDEOPLAYER_ERRORS.VS998InternalError });\n return null;\n }\n\n const { contentUrl: url, fairplayCertificateUrl, fairplayContentKeySystem, laUrl, urlLifecycle } = grantedTicket;\n const drm: Undefined<Drm> = getFirstSupportedDrm();\n\n // Check if keep-alive is enabled\n const redirectUrl: string | null = await this.initializeKeepAliveIfRequired(urlLifecycle, url);\n\n const videoStreamData: VideoPlayerInitData = {\n drm,\n fairplayCertificateUrl,\n fairplayContentKeySystem,\n laUrl,\n type: fairplayCertificateUrl ? StreamType.HLS : StreamType.DASH,\n url: redirectUrl ?? url,\n };\n\n this.setDebugInfoUrls(videoStreamData.url, videoStreamData.laUrl);\n\n this.currentVideofuturStreamId = id > 0 ? id : null;\n\n // Data collection (EST, SVOD, TVOD)\n const { duration } = programMetadata;\n this.startDataCollection(programMetadata, locationId, duration);\n\n return {\n endMargin: 0,\n externalSubtitles: filterExternalSubtitles(subtitles),\n isBuffering: true,\n isVideofuturAsset: true,\n locationId,\n programInfoLoadStatus: ProgramInfoLoadStatus.Loaded,\n programMetadata,\n realEnd: 0,\n realStart: 0,\n seriesEpisodeText: formatSeasonEpisodeNbr(programMetadata),\n seriesMetadata,\n startMargin: 0,\n title: getTitle(programMetadata, Localizer.language),\n videoStreamData,\n viewingHistoryId,\n vtiId,\n };\n };\n\n initializeCatchupPlayer = async (locationId: string): Promise<void> => {\n const { localSendV8MetadataLocationRequest } = this.props;\n const {\n abortController: { signal },\n } = this;\n\n this.checkEndFunction = this.checkEnd;\n this.setState({ programInfoLoadStatus: ProgramInfoLoadStatus.Loaded });\n\n try {\n // NETGEM_API_V8_REQUEST_RESPONSE\n const {\n result: { location },\n } = await localSendV8MetadataLocationRequest(locationId, signal);\n\n this.setState(\n produce((draft) => {\n draft.location = location;\n }),\n );\n this.getSubtitlesFromMetadata(location);\n await this.launchPlayer(location);\n } catch (error) {\n await ignoreIfAborted(signal, error, () => {\n this.setState({ videoStreamData: null });\n this.handleClose({ errorCode: VIDEOPLAYER_ERRORS.VP001MetadataLocationRequestError });\n });\n }\n };\n\n initializeRecordingPlayer = async (locationId: string): Promise<void> => {\n const { localSendV8RecordingsMetadataRequest } = this.props;\n const {\n abortController: { signal },\n } = this;\n\n this.checkEndFunction = this.checkEnd;\n this.setState({ programInfoLoadStatus: ProgramInfoLoadStatus.Loaded });\n\n try {\n // NETGEM_API_V8_REQUEST_RESPONSE\n const {\n result: { location },\n } = await localSendV8RecordingsMetadataRequest(locationId, signal);\n\n this.setState(\n produce((draft) => {\n draft.location = location;\n }),\n );\n await this.launchPlayer(location);\n } catch (error) {\n await ignoreIfAborted(signal, error, () => {\n this.setState({ videoStreamData: null });\n this.handleClose({ errorCode: VIDEOPLAYER_ERRORS.VP003MetadataRecordingsRequestError });\n });\n }\n };\n\n loadLiveItemLocationMetadata = async (currentItem: NETGEM_API_V8_FEED_ITEM): Promise<void> => {\n const { localSendV8MetadataLocationRequest } = this.props;\n const {\n abortController: { signal },\n } = this;\n\n const {\n locType,\n selectedLocation: { id: locationId },\n selectedProgramId,\n } = currentItem;\n\n // Live play could have been originated from a live tile or a record tile\n if (locType !== NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT || selectedProgramId.startsWith(FAKE_EPG_LIVE_PREFIX) || selectedProgramId.startsWith(FAKE_LIVE_CHANNEL_PREFIX)) {\n return;\n }\n\n // For real live program, location is needed to enable the record button\n try {\n // NETGEM_API_V8_REQUEST_RESPONSE\n const {\n result: { location },\n } = await localSendV8MetadataLocationRequest(locationId, signal);\n\n this.setState(\n produce((draft) => {\n draft.location = location;\n }),\n () => this.checkBlackOut(location),\n );\n } catch (error) {\n await ignoreIfAborted(signal, error, () => this.handleClose({ errorCode: VIDEOPLAYER_ERRORS.VP001MetadataLocationRequestError }));\n }\n };\n\n // Live, catchup, recording\n initializePlayer = (): Promise<void> => {\n const { currentItem, locationStatus, locationId, programMetadata } = this.state;\n\n if (!currentItem || (!programMetadata && locationStatus !== WebAppHelpersLocationStatus.Live) || !locationId) {\n return this.handleClose({ errorCode: VIDEOPLAYER_ERRORS.VS998InternalError });\n }\n\n // Start data collection for live, catchup and recording\n\n const {\n selectedLocation: { duration, scheduledEventDuration },\n } = currentItem;\n this.startDataCollection(programMetadata, locationId, duration ?? scheduledEventDuration);\n\n if (locationStatus === WebAppHelpersLocationStatus.Recording) {\n // Recording\n return this.initializeRecordingPlayer(locationId);\n } else if (locationStatus === WebAppHelpersLocationStatus.Catchup) {\n // Catchup\n return this.initializeCatchupPlayer(locationId);\n } else if (locationStatus === WebAppHelpersLocationStatus.Live) {\n // Live\n return this.initializeLivePlayer(ProgramInfoLoadStatus.Loaded);\n }\n\n return this.handleClose({ errorCode: VIDEOPLAYER_ERRORS.VS998InternalError });\n };\n\n // Start playing a live program\n initializeLivePlayer = (programInfoLoadStatus: ProgramInfoLoadStatus): Promise<void> => {\n const { channel } = this.state;\n\n if (!channel) {\n return this.handleClose({ errorCode: VIDEOPLAYER_ERRORS.VS998InternalError });\n }\n\n try {\n const { errorCode, initData } = getVideoStreamDataFromChannel(channel);\n if (errorCode !== undefined) {\n return this.handleClose({ errorCode });\n }\n\n this.isPlayStarted = false;\n\n this.setState(\n produce((draft) => {\n draft.isBuffering = true;\n draft.playheadPosition = 0;\n draft.programInfoLoadStatus = programInfoLoadStatus;\n draft.timeshift = 0;\n draft.videoStreamData = initData;\n }),\n () => this.startIfReady(this.displayChannelNotAvailableMsg),\n );\n\n return Promise.resolve();\n } catch (error) {\n return this.handleClose({ errorCode: VIDEOPLAYER_ERRORS.VS999StreamUnknownError });\n }\n };\n\n // Start playing for catchup, recording\n launchPlayer = (location: NETGEM_API_V8_METADATA_SCHEDULE_LOCATION): Promise<void> => {\n const { state, streamPriorities } = this.props;\n const { currentItem, locationStatus } = this.state;\n const {\n endMargin: locEndMargin,\n metrics,\n playbackUrls,\n tracking,\n startMargin: locStartMargin,\n userViewEndOffset: locUserViewEndOffset,\n userViewStartOffset: locUserViewStartOffset,\n duration,\n } = location;\n if (!playbackUrls || playbackUrls.length === 0) {\n // No playback URL\n SentryWrapper.error({\n breadcrumbs: ['Function launchPlayer', 'playback URL error'],\n context: { location: JSON.stringify(location) },\n message: 'Missing playback URL',\n tagName: SentryTagName.Component,\n tagValue: SentryTagValue.Player,\n });\n\n return this.handleClose({ errorCode: VIDEOPLAYER_ERRORS.VS002StreamNotFound });\n }\n\n const [{ start: playbackUrlDefinition }] = playbackUrls;\n const { allStreams, errorCode } = getStreamsFromPlaybackUrls(streamPriorities, playbackUrls);\n\n if (!allStreams || errorCode) {\n // No supported stream or DRM found\n SentryWrapper.error({\n breadcrumbs: ['Function launchPlayer', 'stream error'],\n context: { location: JSON.stringify(location) },\n message: `Error looking for stream: ${errorCode ?? VIDEOPLAYER_ERRORS.VS999StreamUnknownError}`,\n tagName: SentryTagName.Component,\n tagValue: SentryTagValue.Player,\n });\n\n return this.handleClose({ errorCode });\n }\n\n const [stream] = allStreams;\n\n // Margins and user view offsets\n const startMargin = getIso8601DurationInSeconds(locStartMargin);\n const endMargin = getIso8601DurationInSeconds(locEndMargin);\n const userViewStartOffset = getIso8601DurationInSeconds(locUserViewStartOffset);\n const userViewEndOffset = getIso8601DurationInSeconds(locUserViewEndOffset);\n const realStart = Math.max(startMargin, userViewStartOffset);\n const realEnd = Math.max(endMargin, userViewEndOffset);\n\n // Total duration = program duration + start margin + end margin\n const totalDuration = getIso8601DurationInSeconds(duration);\n\n const videoStreamData: VideoPlayerInitData = {\n channelId: location.channelId,\n drm: stream.drm,\n laUrl: stream.laUrl,\n manifestUpdatePeriod: 0,\n ntgEntitlement: stream.ntgEntitlement,\n trackingStart: tracking?.start,\n type: stream.type,\n url: generateApiUrl(playbackUrlDefinition, { videostreams: stream.path }, state),\n };\n\n // Check if we're trying to play a recording in progress\n if (currentItem && locationStatus === WebAppHelpersLocationStatus.Recording) {\n const {\n selectedLocation: { scheduledEventDuration, scheduledEventStartDate },\n } = currentItem;\n const now = AccurateTimestamp.nowInSeconds();\n const startDate = getIso8601DateInSeconds(scheduledEventStartDate);\n const endDate = startDate + getIso8601DurationInSeconds(scheduledEventDuration);\n\n if (realStart <= now && now < endDate + endMargin) {\n this.setState({ contentType: ContentType.LiveRecording });\n }\n }\n\n this.setState(\n produce((draft) => {\n draft.endMargin = endMargin;\n draft.isBuffering = true;\n draft.locationMetrics = metrics;\n draft.realEnd = realEnd;\n draft.realStart = realStart;\n draft.startMargin = startMargin;\n draft.totalDuration = totalDuration;\n draft.userViewEndOffset = userViewEndOffset;\n draft.userViewStartOffset = userViewStartOffset;\n draft.videoStreamData = videoStreamData;\n }),\n () => this.startIfReady(() => this.handleClose({ errorCode: VIDEOPLAYER_ERRORS.VS001NoStreamSupported })),\n );\n\n return Promise.resolve();\n };\n\n setTimeshiftSwitch = (isSwitching: boolean) => {\n this.setState({ isTimeshiftSwitching: isSwitching });\n };\n\n startDataCollection = (programMetadata: ?NETGEM_API_V8_METADATA_PROGRAM, locationId: string, isoDuration: ?string) => {\n const { dataCollectionSettings } = this;\n\n if (!dataCollectionSettings || !programMetadata) {\n // Data collection disabled\n return;\n }\n\n const locType = getLocationType(locationId);\n const { frequency, isEnabled, rampUp, streamTypes } = dataCollectionSettings;\n\n if (!isEnabled || !streamTypes || !locType) {\n // Data collection disabled for player state or not enough settings\n return;\n }\n\n let streamType: Undefined<DataCollectionStream> = undefined;\n switch (locType) {\n case NETGEM_API_V8_ITEM_LOCATION_TYPE_CATCHUP:\n streamType = DataCollectionStream.Catchup;\n break;\n case NETGEM_API_V8_ITEM_LOCATION_TYPE_EST:\n streamType = DataCollectionStream.EST;\n break;\n case NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING:\n streamType = DataCollectionStream.Recording;\n break;\n case NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT:\n streamType = DataCollectionStream.Live;\n break;\n case NETGEM_API_V8_ITEM_LOCATION_TYPE_SVOD:\n streamType = DataCollectionStream.SVOD;\n break;\n case NETGEM_API_V8_ITEM_LOCATION_TYPE_TVOD:\n streamType = DataCollectionStream.TVOD;\n break;\n default:\n return;\n }\n\n if (streamTypes.indexOf(streamType) === -1) {\n // Stream type not to be collected\n return;\n }\n\n const { id: programId } = programMetadata;\n\n this.setState(\n produce((draft) => {\n draft.dataCollectionStartTime = AccurateTimestamp.nowInSeconds();\n draft.dataCollectionMessage = {\n locationId,\n playbackDuration: 0,\n position: 0,\n programDuration: getIso8601DurationInSeconds(isoDuration),\n programId,\n sessionDuration: 0,\n sessionGuid: crypto.randomUUID(),\n state: DataCollectionPlayerState.Start,\n streamType,\n };\n }),\n () => this.finalizeDataCollectionStart(rampUp, frequency),\n );\n };\n\n finalizeDataCollectionStart = (rampUp?: Array<number>, frequency?: number) => {\n const { dataCollectionRampUpTimers } = this;\n\n if (rampUp) {\n rampUp.forEach((t) => dataCollectionRampUpTimers.push(setTimeout(this.sendCurrentPlayerState, t)));\n }\n\n if (typeof frequency === 'number' && frequency > -1) {\n this.dataCollectionSamplingTimer = setInterval(this.sendCurrentPlayerState, frequency);\n }\n };\n\n stopProgramDataCollection = (useLastPosition: boolean) => {\n this.sendCurrentPlayerState(DataCollectionPlayerState.Stop, useLastPosition);\n this.setState({ dataCollectionStartTime: AccurateTimestamp.nowInSeconds() });\n };\n\n // Happens when switching from live to timeshift (and reverse) inside the same program\n restartProgramDataCollection = () => {\n this.stopProgramDataCollection(true);\n this.sendCurrentPlayerState(DataCollectionPlayerState.Start);\n };\n\n updateProgramDataCollection = (programMetadata: NETGEM_API_V8_METADATA_PROGRAM, locationId: string | null, isoDuration?: string) => {\n const { dataCollectionMessage } = this.state;\n\n if (!dataCollectionMessage || !locationId || !isoDuration) {\n // Not enabled or problem somewhere\n return;\n }\n\n const { id } = programMetadata;\n\n this.setState(\n produce((draft) => {\n draft.dataCollectionMessage = {\n locationId,\n playbackDuration: 0,\n position: 0,\n programDuration: getIso8601DurationInSeconds(isoDuration),\n programId: id,\n sessionDuration: 0,\n sessionGuid: crypto.randomUUID(),\n };\n }),\n () => this.sendCurrentPlayerState(DataCollectionPlayerState.Start),\n );\n };\n\n stopDataCollection = () => {\n const { dataCollectionRampUpTimers } = this;\n\n while (dataCollectionRampUpTimers.length > 0) {\n clearTimeout(dataCollectionRampUpTimers.pop());\n }\n\n if (this.dataCollectionSamplingTimer) {\n clearInterval(this.dataCollectionSamplingTimer);\n this.dataCollectionSamplingTimer = null;\n }\n\n this.setState({\n dataCollectionMessage: null,\n dataCollectionStartTime: 0,\n });\n };\n\n sendCurrentPlayerState = (state?: DataCollectionPlayerState, useLastPosition: ?boolean, errorCode: ?string) => {\n const { dataCollectionMessage } = this.state;\n\n if (!dataCollectionMessage) {\n return;\n }\n\n this.setState(\n produce((draft) => {\n // Without line below, Flow complains about draft.dataCollectionMessage that could be null\n const dcMsg = draft.dataCollectionMessage;\n\n if (dcMsg === null) {\n return;\n }\n\n const now = AccurateTimestamp.nowInSeconds();\n\n // Update properties\n const localChannelId = draft.channel?.epgid ?? draft.location?.channelId;\n if (localChannelId) {\n dcMsg.channelId = localChannelId;\n }\n dcMsg.sessionDuration = now - draft.dataCollectionStartTime;\n\n if (draft.dataCollectionLastPlaybackTime > 0) {\n dcMsg.playbackDuration = (dcMsg.playbackDuration ?? 0) + now - draft.dataCollectionLastPlaybackTime;\n\n // Check for abnormal duration and send error to Sentry if needed\n this.checkPlaybackDuration(dcMsg, now, draft.dataCollectionLastPlaybackTime);\n }\n\n if (\n (state || (dcMsg.state !== DataCollectionPlayerState.Start && dcMsg.state !== DataCollectionPlayerState.Play)) &&\n state !== DataCollectionPlayerState.Start &&\n state !== DataCollectionPlayerState.Play\n ) {\n draft.dataCollectionLastPlaybackTime = 0;\n } else {\n draft.dataCollectionLastPlaybackTime = now;\n }\n\n if (draft.contentType === ContentType.Live) {\n // Live with or without timeshift\n dcMsg.streamType = draft.timeshift <= TIMESHIFT_THRESHOLD ? DataCollectionStream.Live : DataCollectionStream.Timeshift;\n if (!useLastPosition && draft.currentItem) {\n const { startTime } = draft.currentItem;\n dcMsg.position = now - draft.timeshift - startTime;\n }\n } else {\n // Catchup, finished or in-progress recording, VOD, trailer\n dcMsg.position = Math.round(draft.playheadPosition - draft.realStart);\n }\n\n if (dcMsg.state === DataCollectionPlayerState.Start && typeof dcMsg.position === 'number' && dcMsg.position < 0) {\n // Special case at startup\n dcMsg.position = 0;\n }\n\n if (state) {\n // Update state only if specified, otherwise keep current state\n dcMsg.state = state;\n }\n\n if (errorCode) {\n dcMsg.errorDetails = errorCode;\n }\n\n Messenger.emit(DataCollectionMessage.PlayerState, dcMsg);\n\n if (dcMsg.state === DataCollectionPlayerState.Start) {\n // Start state is only sent once\n dcMsg.state = DataCollectionPlayerState.Play;\n }\n }),\n );\n };\n\n checkPlaybackDuration = (dataCollectionMessage: DATA_COLLECTION_INTERNAL_MESSAGE, now: number, dataCollectionLastPlaybackTime: number) => {\n const { playbackDuration, programDuration } = dataCollectionMessage;\n const { playerSessionStart } = this;\n\n if (typeof playbackDuration !== 'number' || typeof programDuration !== 'number' || programDuration === 0 || playbackDuration <= programDuration * PLAYBACK_DURATION_ERROR_THRESHOLD) {\n // Duration is OK\n return;\n }\n\n // Playback duration exceeds program duration by at least 10%\n SentryWrapper.error({\n breadcrumbs: ['Function sendCurrentPlayerState', 'Playback duration too high'],\n context: {\n dataCollectionLastPlaybackTime,\n dataCollectionMessage: JSON.stringify(dataCollectionMessage),\n now,\n playerSessionDuration: AccurateTimestamp.now() - playerSessionStart,\n timeOrigin: AccurateTimestamp.origin(),\n },\n message: `Playback duration (${playbackDuration}) is greater than program duration (${programDuration})`,\n tagName: SentryTagName.Component,\n tagValue: SentryTagValue.Player,\n });\n };\n\n onFullScreenChange = () => {\n const { fullscreenElement } = fscreen;\n\n if (fullscreenElement === null) {\n // Exited fullscreen\n this.setState({ isInFullscreen: false });\n this.showOverlay();\n } else {\n // Entered fullscreen\n this.setState({ isInFullscreen: true });\n }\n };\n\n playbackPaused = () => {\n const { skipping } = this.state;\n const { mediametrie } = this;\n\n this.setState(\n produce((draft) => {\n draft.debugInfo.state = VIDEOPLAYER_DEBUG.StatePaused;\n }),\n );\n\n if (skipping !== SkippingKind.None) {\n return;\n }\n\n if (mediametrie) {\n mediametrie.notifyPause();\n }\n\n MediaController.setPausedState();\n\n this.setState({ isPlaying: false });\n this.showOverlay();\n };\n\n playbackPlaying = () => {\n const { skipping } = this.state;\n const { mediametrie } = this;\n\n this.setState(\n produce((draft) => {\n draft.debugInfo.state = VIDEOPLAYER_DEBUG.StatePlaying;\n }),\n );\n\n if (skipping !== SkippingKind.None) {\n return;\n }\n\n if (mediametrie) {\n mediametrie.notifyPlay();\n }\n\n MediaController.setPlayingState();\n\n this.setState({\n isControllerEnabled: true,\n isPlaying: true,\n });\n };\n\n playbackEnded = (): Promise<void> => {\n this.setState(\n produce((draft) => {\n draft.debugInfo.state = VIDEOPLAYER_DEBUG.StateEnded;\n }),\n );\n\n return this.handleClose({ errorCode: NO_ERROR_CODE });\n };\n\n playbackTimeUpdated = (time: number, timeshift?: number) => {\n const { contentType } = this.state;\n const { videoElement } = this;\n\n if (videoElement) {\n this.setState(\n produce((draft) => {\n draft.bufferedTimeRanges = videoElement.buffered;\n }),\n );\n }\n\n const isPlayheadPositionFallback = time === 0 && contentType !== ContentType.Static;\n const playheadPosition = isPlayheadPositionFallback ? AccurateTimestamp.nowInSeconds() : time;\n\n this.setState(\n produce((draft) => {\n draft.debugInfo.isPlayheadPositionFallback = isPlayheadPositionFallback;\n draft.debugInfo.time = Math.floor(playheadPosition);\n draft.playheadPosition = playheadPosition;\n draft.timeshift = typeof timeshift === 'number' ? timeshift : 0;\n }),\n this.checkCurrentPlayedItem,\n );\n\n this.checkResumeState();\n };\n\n checkResumeState = () => {\n const { resumePosition, resumeState } = this.state;\n\n if (resumeState !== ResumeState.Seeking) {\n return;\n }\n\n this.setState({ resumeState: ResumeState.Done }, () => {\n this.seek(resumePosition, true);\n });\n };\n\n // Called with a Shaka Player error code\n playerError = (category: number, code: number, mediaErrorCode: number, errorMsg?: string, isForbidden?: boolean): Promise<void> => {\n /*\n * Shaka Player categories:\n * 1: network stack\n * 2: parsing text streams\n * 3: parsing or processing audio or video streams\n * 4: parsing the manifest\n * 5: related to streaming\n * 6: related to DRM\n * 7: miscellaneous errors\n * 8: related to cast\n * 9: database storage (offline)\n * 10: related to ad insertion\n *\n * HTML media error codes:\n * 1: play aborted by user MEDIA_ERR_ABORTED\n * 2: network error MEDIA_ERR_NETWORK\n * 3: decoding error MEDIA_ERR_DECODE\n * 4: unsupported format MEDIA_ERR_SRC_NOT_SUPPORTED\n *\n * All other error codes are listed in shakaTypes.js\n */\n\n const { playerItem } = this.props;\n const { title, videoStreamData } = this.state;\n const { keepAlive, isRestartingSession } = this;\n\n // Broadpeak keep-alive safeguard\n if (keepAlive && isForbidden) {\n if (isRestartingSession) {\n return Promise.resolve();\n }\n keepAlive.stop();\n return this.restartSession();\n }\n\n const playerVersion = this.videoPlayer?.getVersion() ?? 'unknown';\n\n if (shouldErrorBeIgnored(code)) {\n // Player exited while starting: silently close\n return this.handleClose({ errorCode: NO_ERROR_CODE });\n }\n\n if (!playerItem) {\n // Offline content\n return this.handleClose({ errorCode: VIDEOPLAYER_ERRORS.VS994OfflineContentError });\n }\n\n const {\n item: {\n locType: locationType,\n selectedLocation: { channelId, id: locationId },\n selectedProgramId: programId,\n seriesId,\n },\n } = playerItem;\n\n SentryWrapper.error({\n breadcrumbs: ['Function playerError', getShakaErrorCategoryAsText(category), getShakaErrorCodeAsText(code), getHtmlMediaErrorText(mediaErrorCode)],\n context: {\n channelId,\n drm: videoStreamData?.drm ?? 'unknown',\n locationId,\n locationType,\n playerVersion,\n programId,\n seriesId,\n streamType: videoStreamData?.type ?? 'unknown',\n streamUrl: videoStreamData?.url ?? 'unknown',\n title,\n },\n message: `[${category}.${code}.${mediaErrorCode}] ${errorMsg ?? 'Player error'}`,\n tagName: SentryTagName.Component,\n tagValue: SentryTagValue.Player,\n });\n\n return this.handleClose({ errorCode: `${category}.${code}.${mediaErrorCode}`, errorMsg: Localizer.localize('player.errors.generic_error') });\n };\n\n // Called when a VOD play triggers a MEDIA_ERR_DECODE error on Safari\n safariVodWorkaround = (): Promise<void> => this.handleClose({ isSafariWorkaround: true });\n\n bufferLoaded = () => {\n this.setState({ isBuffering: false });\n };\n\n buffering = () => {\n this.setState({ isBuffering: true });\n };\n\n liveBufferLengthUpdated = (liveBufferLength: number) => {\n this.setState({ liveBufferLength });\n };\n\n toggleDebugInfoMetrics = (isDebugOverlayVisible: boolean) => {\n const { localUpdateSetting } = this.props;\n\n localUpdateSetting(Setting.AutoOpenPlayerDebugPanel, isDebugOverlayVisible);\n\n if (isDebugOverlayVisible) {\n this.updateDebugInfoMetrics();\n } else {\n this.resetDebugInfoMetricsTimer();\n }\n };\n\n updateDebugInfoMetrics = () => {\n const { videoElement, videoPlayer } = this;\n\n if (!videoElement || !videoPlayer) {\n return;\n }\n\n const commonMetrics = getCommonMetrics(videoElement);\n\n /*\n * When playing HLS+Fairplay content, Shaka Player let native HTML player handle everything.\n * In this particular case, shakaPlayer.getVariantTracks() and video.videoTracks only return 1 track (with empty values)\n * Hence, the debug panel does not offer much information.\n * Shaka Player can handle HLS on its own, but only without any DRM.\n *\n * More on this at: https://github.com/shaka-project/shaka-player/issues/2802\n */\n const specificMetrics = videoPlayer.getMetrics();\n\n if (!specificMetrics) {\n this.startDebugInfoMetricsTimer();\n return;\n }\n\n this.setState(\n produce((draft) => {\n draft.debugInfo.bufferChunkCount = commonMetrics.bufferChunkCount;\n draft.debugInfo.bufferLength = commonMetrics.bufferLength;\n draft.debugInfo.elementHeight = commonMetrics.elementHeight;\n draft.debugInfo.elementWidth = commonMetrics.elementWidth;\n draft.debugInfo.playbackRate = commonMetrics.playbackRate;\n draft.debugInfo.videoHeight = commonMetrics.videoHeight;\n draft.debugInfo.videoWidth = commonMetrics.videoWidth;\n draft.debugInfo.shakaMetrics = specificMetrics?.shakaMetrics;\n }),\n this.startDebugInfoMetricsTimer,\n );\n };\n\n initializeDebugInfo = (playerDuration: number) => {\n const { videoPlayer } = this;\n\n if (!videoPlayer) {\n return;\n }\n\n this.setState(\n produce((draft) => {\n draft.debugInfo.playerName = videoPlayer.getName();\n draft.debugInfo.playerVersion = videoPlayer.getVersion();\n draft.debugInfo.totalTime = Math.round(playerDuration);\n }),\n );\n };\n\n streamInitialized = (playerDuration: number) => {\n const { contentType, currentItem, isPlaying, realStart, resumeState } = this.state;\n const { mediametrie } = this;\n\n let duration = playerDuration;\n\n if (contentType !== ContentType.Live) {\n // Static content: catchup, in-progress recording, VOD\n if (playerDuration === Infinity && currentItem) {\n const {\n selectedLocation: { duration: durationWithMargins },\n } = currentItem;\n duration = getIso8601DurationInSeconds(durationWithMargins);\n }\n this.setState({ duration }, this.checkResumePosition);\n\n if (mediametrie) {\n mediametrie.setDuration(duration);\n }\n }\n\n if (!isPlaying) {\n this.showOverlay();\n }\n\n this.initializeDebugInfo(duration);\n\n if (contentType === ContentType.Live) {\n // Live\n fireAndForget(this.goBackToLive());\n } else if (resumeState !== ResumeState.NoResumePosition && resumeState !== ResumeState.Seeking && resumeState !== ResumeState.Done && realStart > 0) {\n // Catchup, finished or in-progress recording, VOD\n this.seek(realStart);\n }\n };\n\n promptUserToResume = (): void => {\n const {\n localShowConfirmation,\n settings: { [Setting.AutoResume]: isAutoResumeEnabled },\n } = this.props;\n const { forcedResumePosition, realStart, resumePosition } = this.state;\n\n if (isAutoResumeEnabled || forcedResumePosition !== null) {\n // User setting override resume\n this.resumeConfirmationClosedCallback(ConfirmationModalResult.Button2, resumePosition, realStart);\n this.setState({ forcedResumePosition: null });\n return;\n }\n\n const duration = Math.abs(Math.floor(resumePosition - realStart));\n\n if (duration > 0) {\n const data = {\n button1Title: Localizer.localize('player.resume.start_over'),\n button2Title: Localizer.localize('player.resume.resume', { position: formatDuration(duration) }),\n question: Localizer.localize('player.resume.question'),\n title: Localizer.localize('player.resume.title'),\n };\n\n Messenger.once(MessengerEvents.MODAL_CONFIRMATION_CLOSED, (result: ConfirmationModalResult) => this.resumeConfirmationClosedCallback(result, resumePosition, realStart));\n localShowConfirmation(data);\n }\n };\n\n resumeConfirmationClosedCallback = (result: ConfirmationModalResult, resumePosition: number, startPosition: number): void => {\n if (result !== ConfirmationModalResult.Button1 && result !== ConfirmationModalResult.Button2) {\n // CANCEL: do nothing and simply close popup\n this.setState({ resumeState: ResumeState.NoResumePosition });\n return;\n }\n\n /*\n * BUTTON1: Start from beginning\n * BUTTON2: Resume from last position\n */\n const nextPosition = result === ConfirmationModalResult.Button1 ? startPosition : resumePosition;\n\n this.setState({\n resumePosition: nextPosition,\n resumeState: ResumeState.Seeking,\n });\n };\n\n getTrackFromLang = (mediaType: VideoPlayerMediaType, language: string): ?VideoPlayerMediaInfo => {\n const { audioMediaInfo, subtitlesMediaInfo } = this.state;\n\n if (mediaType === VideoPlayerMediaType.Audio) {\n return audioMediaInfo.find((track) => track.lang === language);\n }\n\n return getSubtitlesTrackFromCode(subtitlesMediaInfo, language);\n };\n\n autoSelectTracks = () => {\n const {\n settings: { [Setting.AutoSelectSubtitlesTrack]: autoSelectSubtitlesTrack, [Setting.LastSubtitlesTrack]: lastSubtitlesTrack },\n } = this.props;\n const { selectedSubtitlesMediaInfo } = this.state;\n const { isSubtitlesAutoSelectionApplied } = this;\n\n // Auto select subtitles track if required and available\n if (autoSelectSubtitlesTrack && !isSubtitlesAutoSelectionApplied) {\n const subtitlesTrack = this.getTrackFromLang(VideoPlayerMediaType.Subtitles, lastSubtitlesTrack);\n\n if (!subtitlesTrack) {\n return;\n }\n\n this.isSubtitlesAutoSelectionApplied = true;\n\n if ((subtitlesTrack?.index ?? -1) !== selectedSubtitlesMediaInfo) {\n this.setSubtitlesTrack(subtitlesTrack, false);\n }\n }\n };\n\n streamInfoUpdated = () => {\n const { videoPlayer } = this;\n\n if (!videoPlayer) {\n return;\n }\n\n const audioTracks = videoPlayer.getTracksFor(VideoPlayerMediaType.Audio);\n const currentAudioTrack = videoPlayer.getCurrentTrackFor(VideoPlayerMediaType.Audio);\n\n const currentSubtitlesTrack = videoPlayer.getCurrentTrackFor(VideoPlayerMediaType.Subtitles);\n const subtitlesTracks = videoPlayer.getTracksFor(VideoPlayerMediaType.Subtitles);\n\n this.setState(\n produce((draft) => {\n draft.audioMediaInfo = audioTracks;\n draft.selectedAudioMediaInfo = currentAudioTrack?.index ?? -1;\n draft.selectedSubtitlesMediaInfo = currentSubtitlesTrack?.index ?? -1;\n draft.subtitlesMediaInfo = subtitlesTracks;\n }),\n this.autoSelectTracks,\n );\n };\n\n handleBackOnClick = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>): Promise<void> => {\n event.preventDefault();\n event.stopPropagation();\n\n return this.handleClose({ errorCode: NO_ERROR_CODE });\n };\n\n // Parameter 'seekTime' is in seconds\n handleStandardProgressBarSeekChanged = (seekTime: number) => {\n this.seek(seekTime);\n };\n\n // Parameter 'seekTime' is the difference between wanted position and current position (in seconds)\n handleLiveProgressBarSeekChanged = (seekTime: number) => {\n const { videoPlayer } = this;\n\n if (videoPlayer) {\n videoPlayer.liveSeek(seekTime);\n }\n };\n\n // Parameter 'seekTime' is in seconds\n seek = (seekTime: number, forcePlay?: boolean) => {\n const { userViewStartOffset } = this.state;\n const { videoPlayer } = this;\n\n if (videoPlayer && seekTime >= userViewStartOffset) {\n // DEBUG: check userViewStartOffset and startMargin to ensure user doesn't go before what's allowed\n\n videoPlayer.seek(seekTime);\n\n if (forcePlay) {\n fireAndForget(this.playVideo(false));\n }\n }\n };\n\n checkCurrentPlayedItem = () => {\n const { channel, playheadPosition, programInfoLoadStatus } = this.state;\n\n if (playheadPosition <= AccurateTimestamp.startOfDayInSeconds() || playheadPosition > AccurateTimestamp.nowInSeconds()) {\n return;\n }\n\n const newTime = Math.floor(playheadPosition);\n\n if (Math.abs(this.currentFeedItemTime - newTime) >= PLAYHEAD_POSITION_CHANGE_THRESHOLD) {\n this.currentFeedItemTime = newTime;\n if (programInfoLoadStatus !== ProgramInfoLoadStatus.NotStarted && channel) {\n this.findPlayedItemInEpgFeed(channel, playheadPosition);\n }\n }\n };\n\n // Parameter 'initData' is set only at player startup\n startVideoWithPromise = (initData: VideoPlayerInitData | null): Promise<VideoPlayerInitData | null> => {\n // Videofutur: at initial play and at every play following a pause\n const { isVideofuturAsset } = this.state;\n\n return isVideofuturAsset ? this.startVFVideoWithPromise(initData) : this.startTVVideoWithPromise(initData);\n };\n\n createVFStream = (initData: VideoPlayerInitData | null, vtiId: number): Promise<number> => {\n const { localSendVideofuturStreamCreateRequest } = this.props;\n const {\n abortController: { signal },\n currentVideofuturStreamId,\n distributorId,\n } = this;\n\n if (currentVideofuturStreamId !== null) {\n return Promise.resolve(currentVideofuturStreamId);\n }\n\n const isLicenceNeeded = Boolean(initData?.drm);\n\n // If no streamId, call createStream()\n return localSendVideofuturStreamCreateRequest(distributorId, vtiId, isLicenceNeeded, signal).then((response: BO_API_CREATE_STREAM_TYPE) => response.stream.id);\n };\n\n // Videofutur: at initial play and at every play following a pause\n startVFVideoWithPromise = async (initData: VideoPlayerInitData | null): Promise<VideoPlayerInitData | null> => {\n const { localSendVideofuturStreamStartRequest } = this.props;\n const { isBOStreamRequestPending, vtiId } = this.state;\n const {\n abortController: { signal },\n distributorId,\n } = this;\n\n if (isBOStreamRequestPending) {\n return Promise.reject(new PlayerError(VIDEOPLAYER_ERRORS.VS004StreamRequestPending));\n }\n\n if (!vtiId) {\n SentryWrapper.error({\n breadcrumbs: ['Function startVFVideoWithPromise', 'Before stream creation'],\n context: getInitDataAsSentryContext(initData),\n message: 'Missing vtiId',\n tagName: SentryTagName.Component,\n tagValue: SentryTagValue.Player,\n });\n return Promise.reject(new PlayerError(VIDEOPLAYER_ERRORS.VS998InternalError));\n }\n\n this.setState({ isBOStreamRequestPending: true });\n\n try {\n const id = await this.createVFStream(initData, vtiId);\n\n this.currentVideofuturStreamId = id > 0 ? id : null;\n\n if (!id) {\n this.setState({ isBOStreamRequestPending: false });\n SentryWrapper.error({\n breadcrumbs: ['Function startVFVideoWithPromise', 'Stream creation fulfilled'],\n context: getInitDataAsSentryContext(initData),\n message: 'Missing stream Id',\n tagName: SentryTagName.Component,\n tagValue: SentryTagValue.Player,\n });\n throw new PlayerError(VIDEOPLAYER_ERRORS.VS998InternalError);\n }\n\n await localSendVideofuturStreamStartRequest(distributorId, id, signal);\n\n this.setState({ isBOStreamRequestPending: false });\n\n // Return original initData\n return initData;\n } catch (error) {\n // BO_API_ERROR_TYPE or CustomNetworkError\n await ignoreIfAborted(signal, error, () => {\n this.startVFVideoWithPromiseErrorHandler(error, initData);\n });\n\n return null;\n }\n };\n\n startVFVideoWithPromiseErrorHandler = async (error: BO_API_ERROR_TYPE | CustomNetworkError, initData: VideoPlayerInitData | null): Promise<void> => {\n if (isInvalidTokenError(error)) {\n // Nothing to do: app will restart\n return;\n }\n\n if (error instanceof CustomNetworkError) {\n const {\n networkError: { result },\n } = error;\n const code = error.getCustomCode();\n\n // BO error code when max number of concurrent streams being played is reached\n if (code === BO_STREAM_MAX_CONCURRENT_STREAMS_REACHED && result) {\n const maxNbStreamsStr = result.variables?.maxNbStreams;\n const maxNbStreams = typeof maxNbStreamsStr === 'number' ? Number(maxNbStreamsStr) : 1;\n const errorMsg = Localizer.localize('player.errors.max_concurrent_streams_reached', { count: maxNbStreams });\n await this.handleClose({ errorCode: code.toString(), errorMsg, isLargeNotificationNeeded: true });\n }\n }\n\n // Other errors\n this.setState({ isBOStreamRequestPending: false });\n const { errorMsg, status } = buildBOErrorResponse(null, error);\n\n SentryWrapper.error({\n breadcrumbs: ['Function startVFVideoWithPromise', 'Stream creation rejected'],\n context: getInitDataAsSentryContext(initData),\n error: error instanceof Error ? error : undefined,\n message: errorMsg,\n tagName: SentryTagName.Component,\n tagValue: SentryTagValue.Player,\n });\n\n this.displayErrorMessage(status, errorMsg);\n throw error;\n };\n\n initializeKeepAliveIfRequired = (urlLifecycle?: NETGEM_API_URL_LIFECYCLE, url: string): Promise<string | null> => {\n if (!urlLifecycle || urlLifecycle.type === undefined || urlLifecycle.heartbeat === undefined) {\n return Promise.resolve(null);\n }\n\n const { heartbeat, type } = urlLifecycle;\n this.keepAlive = new KeepAlive(type, heartbeat);\n return this.keepAlive.initialize(url);\n };\n\n startTVVideoWithPromiseWithoutEntitlement = async (initData: VideoPlayerInitData): Promise<VideoPlayerInitData> => {\n const { channels } = this.props;\n const { channelId, url: originalUrl } = initData;\n\n const urlLifecycleDms: NETGEM_API_URL_LIFECYCLE | null = getChannelUrlLifecycle(channels, channelId);\n if (!urlLifecycleDms) {\n this.setDebugInfoUrls(originalUrl);\n return Promise.resolve(initData);\n }\n\n // Check if keep-alive is enabled\n const redirectUrl: string | null = await this.initializeKeepAliveIfRequired(urlLifecycleDms, originalUrl);\n\n if (!redirectUrl) {\n this.setDebugInfoUrls(originalUrl);\n return Promise.resolve(initData);\n }\n\n this.setDebugInfoUrls(redirectUrl);\n return Promise.resolve({\n ...initData,\n url: redirectUrl,\n });\n };\n\n startTVVideoWithPromiseWithEntitlement = async (initData: VideoPlayerInitData, entitlement: NETGEM_API_V8_METADATA_SCHEDULE_VIDEO_STREAM_ENTITLEMENT_PARAM): Promise<VideoPlayerInitData> => {\n const { localSendNtgEntitlementGetRequest } = this.props;\n const {\n abortController: { signal },\n } = this;\n\n const { channelId, drm, manifestUpdatePeriod, trackingStart, type } = initData;\n const { customData: entCustomData, service, url: entUrl } = entitlement;\n\n // Call entitlement to get streams params\n try {\n const requestResponse: NETGEM_API_ENTITLEMENT_RESULT = await localSendNtgEntitlementGetRequest(entCustomData, service, entUrl, channelId || '', signal);\n\n const { action, customHeaders, fairplayCertificateUrl, fairplayContentKeySystem, laUrl, streamUrl: url, urlLifecycle, vuDrmToken } = requestResponse;\n if (!url) {\n const errorCode = action === 'subscribe' ? VIDEOPLAYER_ERRORS.VP004NtgEntitlementNoSubscriptionError : VIDEOPLAYER_ERRORS.VP002NtgEntitlementRequestError;\n SentryWrapper.error({\n breadcrumbs: ['Function startTVVideoWithPromise', 'Entitlement get fulfilled'],\n context: {\n initData: JSON.stringify(initData),\n requestResponse: JSON.stringify(requestResponse),\n },\n message: `No URL returned${action ? ` (${action})` : ''}`,\n tagName: SentryTagName.Component,\n tagValue: SentryTagValue.Player,\n });\n return Promise.reject(new PlayerError(errorCode, Localizer.localize('player.unsubscribed_channel')));\n }\n\n // Save entitlement for later release\n this.currentEntitlementParams = {\n channelId,\n customData: entCustomData,\n service,\n url: entUrl,\n };\n\n // Check if keep-alive is enabled\n const redirectUrl: string | null = await this.initializeKeepAliveIfRequired(urlLifecycle, url);\n\n this.setDebugInfoUrls(url, laUrl);\n\n // Return definitive initData to pass to player\n return {\n channelId,\n customHeaders,\n drm,\n fairplayCertificateUrl,\n fairplayContentKeySystem,\n laUrl,\n manifestUpdatePeriod,\n trackingStart,\n type,\n url: redirectUrl ?? url,\n vuDrmToken,\n };\n } catch (error) {\n if (signal.aborted) {\n // Player was closed while starting\n throw new PlayerError(VIDEOPLAYER_ERRORS.VS996StartupCancelled);\n }\n\n SentryWrapper.error({\n breadcrumbs: ['Function startTVVideoWithPromise', 'Entitlement get rejected'],\n context: getInitDataAsSentryContext(initData),\n error,\n tagName: SentryTagName.Component,\n tagValue: SentryTagValue.Player,\n });\n\n // Entitlement error\n logError(error);\n let errorCode: ?string = VIDEOPLAYER_ERRORS.VP002NtgEntitlementRequestError;\n let message: ?string = undefined;\n\n if (error instanceof CustomNetworkError) {\n const {\n networkError: { result },\n } = error;\n\n if (result) {\n ({ ntgCode: errorCode } = result);\n\n if (errorCode === NetgemNetworkCode.MissingDmsChannel) {\n message = Localizer.localize('player.errors.missing_channel');\n } else if (errorCode === NetgemNetworkCode.ConcurrencyLimit) {\n message = Localizer.localize('player.errors.max_concurrency_exceeded');\n } else if (errorCode === NetgemNetworkCode.Geolock) {\n message = Localizer.localize('player.errors.content_unavailable_in_country');\n } else if (errorCode === NetgemNetworkCode.MissingRight) {\n message = Localizer.localize('player.errors.missing_right');\n }\n }\n } else if (error instanceof PlayerError) {\n ({ code: errorCode } = error);\n }\n\n throw new PlayerError(errorCode ?? VIDEOPLAYER_ERRORS.VP002NtgEntitlementRequestError, message ?? undefined);\n }\n };\n\n startTVVideoWithPromise = (initData: VideoPlayerInitData | null): Promise<VideoPlayerInitData | null> => {\n // Entitlement: at initial start only\n if (!initData) {\n return Promise.resolve(null);\n }\n\n const { ntgEntitlement: entitlement } = initData;\n if (entitlement) {\n return this.startTVVideoWithPromiseWithEntitlement(initData, entitlement);\n }\n\n return this.startTVVideoWithPromiseWithoutEntitlement(initData);\n };\n\n // Return playhead position in ISO8601 format\n getBookmark = (): string => {\n const { playheadPosition } = this.state;\n\n return getRoundedDurationToISOString(playheadPosition * MILLISECONDS_PER_SECOND, 1);\n };\n\n sendVideofuturStreamStop = async (streamId: number, stopType: StopStreamKind): Promise<void> => {\n const { localSendVideofuturStreamStopRequest } = this.props;\n const { distributorId } = this;\n\n this.currentVideofuturStreamId = null;\n\n this.setState({ isBOStreamRequestPending: true });\n try {\n await localSendVideofuturStreamStopRequest(distributorId, streamId, this.getBookmark());\n } catch (error) {\n // CustomNetworkError\n\n if (isInvalidTokenError(error)) {\n // Nothing to do: app will restart\n throw error;\n }\n\n SentryWrapper.error({\n breadcrumbs: ['Function sendStreamStop', 'Stream stop rejected'],\n context: {\n distributorId,\n stopType,\n streamId,\n },\n message: error.message,\n tagName: SentryTagName.Component,\n tagValue: SentryTagValue.Player,\n });\n\n throw new PlayerError(VIDEOPLAYER_ERRORS.VS005StreamStopError);\n } finally {\n this.setState({ isBOStreamRequestPending: false });\n }\n };\n\n sendStreamStop = async (stopType: StopStreamKind): Promise<void> => {\n const { localSendNtgEntitlementReleaseRequest, playerItem } = this.props;\n const { isBOStreamRequestPending } = this.state;\n const { distributorId } = this;\n\n if (!playerItem || playerItem.type === ExtendedItemType.OfflineContent) {\n // Offline content: nothing to stop\n return Promise.resolve();\n }\n\n if (stopType === StopStreamKind.Initialization) {\n // Stop occurring at initialization\n return Promise.resolve();\n }\n\n // Final stop or pause\n this.updateViewingHistory();\n\n if (isBOStreamRequestPending) {\n throw new PlayerError(VIDEOPLAYER_ERRORS.VS004StreamRequestPending);\n }\n\n // Videofutur: at every pause and at final stop\n const { currentVideofuturStreamId: streamId } = this;\n if (streamId) {\n return this.sendVideofuturStreamStop(streamId, stopType);\n }\n\n if (stopType === StopStreamKind.Pause || this.currentEntitlementParams === null) {\n // Pause\n return Promise.resolve();\n }\n\n // Final stop: release entitlement\n const { customData, service, url, channelId } = this.currentEntitlementParams;\n this.currentEntitlementParams = null;\n\n try {\n return await localSendNtgEntitlementReleaseRequest(customData, service, url, channelId || '');\n } catch (error) {\n SentryWrapper.error({\n breadcrumbs: ['Function sendStreamStop', 'Entitlement release rejected'],\n context: {\n currentEntitlementParams: JSON.stringify(this.currentEntitlementParams),\n distributorId,\n stopType,\n },\n error,\n tagName: SentryTagName.Component,\n tagValue: SentryTagValue.Player,\n });\n\n const { message, status } = error;\n if (status === HttpStatus.NotFound) {\n // Entitlement release failed but that's not a problem: let's ignore it\n return Promise.resolve();\n }\n\n this.displayErrorMessage(status, message);\n throw new PlayerError(VIDEOPLAYER_ERRORS.VP005NtgEntitlementReleaseError);\n }\n };\n\n skip = (direction: SkipDirection, event?: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement> | SyntheticKeyboardEvent<HTMLElement>) => {\n const { contentType, duration, isControllerEnabled, isTimeshiftEnabled, playheadPosition } = this.state;\n const { videoController, videoPlayer } = this;\n\n if (!videoPlayer || !videoController || !isControllerEnabled || (contentType === ContentType.Live && !isTimeshiftEnabled)) {\n // Player or controller not initialized, play not started yet or timeshift disabled\n return;\n }\n\n const { type: skipping, value: skipValue } = getSkippingTypeAndValue(direction, event);\n\n this.brieflyShow(skipping);\n\n if (contentType === ContentType.Live) {\n // Timeshifting\n videoPlayer.liveSeek(skipValue);\n } else {\n // Regular seeking\n this.seek(getBoundedValue(playheadPosition + skipValue, 0, duration));\n }\n };\n\n handleSkipBackwardOnClick = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement> | SyntheticKeyboardEvent<HTMLElement>) => {\n this.skip(SkipDirection.Backward, event);\n };\n\n handleSkipForwardOnClick = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement> | SyntheticKeyboardEvent<HTMLElement>) => {\n this.skip(SkipDirection.Forward, event);\n };\n\n brieflyShow = (skipping: SkippingKind) => {\n this.setState({ skipping });\n setTimeout(() => this.setState({ skipping: SkippingKind.None }), BLINKING_PICTO_DURATION);\n };\n\n changeVolume = (step: number) => {\n const { isControllerEnabled, isCurrentItemBlackedOut, volume } = this.state;\n\n if (!isControllerEnabled || isCurrentItemBlackedOut) {\n // Play not started yet or black out is enabled\n return;\n }\n\n let newVolume = volume + step;\n\n if (newVolume < 0) {\n newVolume = 0;\n } else if (newVolume > 1) {\n newVolume = 1;\n }\n\n this.handleVolumeChanged(newVolume);\n };\n\n handleVolumeChanged = (volume: number) => {\n const { videoPlayer } = this;\n const { isMuted } = this.state;\n\n if (!videoPlayer) {\n return;\n }\n\n if (isMuted) {\n this.setMute(false);\n } else {\n videoPlayer.setVolume(volume);\n this.setVolume(volume);\n }\n };\n\n handleVolumeOnClick = () => {\n const { isControllerEnabled, isCurrentItemBlackedOut, isMuted } = this.state;\n\n if (!isControllerEnabled || isCurrentItemBlackedOut) {\n // Play not started yet or black out is enabled\n return;\n }\n\n this.setMute(!isMuted);\n };\n\n setAudioTrack = (track: ?VideoPlayerMediaInfo, saveSetting: boolean) => {\n const { localUpdateSetting } = this.props;\n const { videoPlayer } = this;\n\n if (videoPlayer && track) {\n videoPlayer.setCurrentTrack(track);\n\n if (saveSetting) {\n // Save audio track in settings for future use\n localUpdateSetting(Setting.LastAudioTrack, getAudioSettingCode(track));\n }\n }\n };\n\n setSubtitlesTrack = (track: VideoPlayerMediaInfo | null, saveSetting: boolean) => {\n const { localUpdateSetting } = this.props;\n const { videoPlayer } = this;\n\n if (!videoPlayer) {\n return;\n }\n\n if (saveSetting) {\n // Save subtitles track in settings for future use (empty string means \"no subtitles\")\n localUpdateSetting(Setting.LastSubtitlesTrack, getSubtitlesSettingCode(track));\n }\n\n if (track) {\n videoPlayer.setCurrentTrack(track);\n } else {\n videoPlayer.unsetCurrentTrack(VideoPlayerMediaType.Subtitles);\n }\n };\n\n handleNewAudioTrackSelected = (index: number) => {\n const { audioMediaInfo } = this.state;\n\n this.setAudioTrack(\n audioMediaInfo.find((elt) => elt.index === index),\n true,\n );\n };\n\n handleNewSubtitlesTrackSelected = (index: number) => {\n const { subtitlesMediaInfo } = this.state;\n\n this.setSubtitlesTrack(subtitlesMediaInfo.find((elt) => elt.index === index) ?? null, true);\n };\n\n // eslint-disable-next-line react/no-unused-class-component-methods\n handleNewVideoQualitySelected = (index: number) => {\n const { videoPlayer } = this;\n\n if (!videoPlayer) {\n return;\n }\n\n if (index === -1) {\n videoPlayer.setAutoSwitchQualityFor(VideoPlayerMediaType.Video, true);\n } else {\n videoPlayer.setAutoSwitchQualityFor(VideoPlayerMediaType.Video, false);\n videoPlayer.setQualityFor(VideoPlayerMediaType.Video, index);\n }\n };\n\n setVolume = (volume: number) => {\n const { localUpdateSetting } = this.props;\n\n this.setState({ volume });\n\n // Store volume setting\n localUpdateSetting(Setting.Volume, volume);\n };\n\n setMute = (mute: boolean) => {\n const { videoPlayer } = this;\n\n if (!videoPlayer) {\n return;\n }\n\n const isMuted = videoPlayer.isMuted();\n\n // New mute value is only applied if it makes sense\n if (mute && !isMuted) {\n videoPlayer.setMute(true);\n this.setState({ isMuted: true });\n } else if (!mute && isMuted) {\n videoPlayer.setMute(false);\n this.setState({ isMuted: false });\n }\n };\n\n goBackToLive = (): Promise<void> => {\n const { mediametrie, videoPlayer } = this;\n\n if (!videoPlayer) {\n return this.handleClose({ errorCode: VIDEOPLAYER_ERRORS.VS998InternalError });\n }\n\n if (mediametrie) {\n mediametrie.notifyStop();\n }\n\n videoPlayer.goBackToLive();\n return this.playVideo(false);\n };\n\n handleGoToLiveOnClick: () => Promise<void> = this.goBackToLive;\n\n // Go back to live (live only when timeshifting)\n handleGoBackToLiveHotKey = (event: SyntheticKeyboardEvent<HTMLElement>) => {\n const { contentType, timeshift } = this.state;\n\n event.preventDefault();\n event.stopPropagation();\n\n if (contentType === ContentType.Live && timeshift > 0) {\n fireAndForget(this.goBackToLive());\n }\n };\n\n toggleFullscreen = () => {\n const { isInFullscreen } = this.state;\n\n if (isInFullscreen) {\n this.handleExitFullScreenOnClick();\n } else {\n this.handleEnterFullScreenOnClick();\n }\n };\n\n handleEnterFullScreenOnClick = () => {\n const { fullscreenEnabled } = fscreen;\n\n if (fullscreenEnabled) {\n fscreen.requestFullscreen(document.body);\n }\n\n this.showOverlay();\n };\n\n handleExitFullScreenOnClick = () => {\n const { fullscreenElement, fullscreenEnabled } = fscreen;\n\n if (fullscreenElement !== null && fullscreenEnabled) {\n fscreen.exitFullscreen();\n }\n\n this.showOverlay();\n };\n\n handleOnMouseMoveOnVideo = () => {\n this.showOverlay();\n };\n\n handleOnClickOnVideo = (event: SyntheticMouseEvent<HTMLElement>) => {\n if (this.clickTimer) {\n // Double click\n this.resetClickTimer();\n this.executeDoubleClick(event);\n return;\n }\n\n this.clickTimer = setTimeout(() => {\n // Single click\n this.resetClickTimer();\n\n fireAndForget(this.togglePlayVideo());\n }, DOUBLE_CLICK.MaxDuration);\n };\n\n togglePlayVideo = (): Promise<void> => {\n const { contentType, isTimeshiftEnabled } = this.state;\n const { videoPlayer } = this;\n\n if (!videoPlayer || (contentType === ContentType.Live && !isTimeshiftEnabled)) {\n // No player or timeshift disabled\n return Promise.resolve();\n }\n\n if (videoPlayer.isPaused()) {\n return this.playVideo();\n }\n\n return this.pauseVideo();\n };\n\n executeDoubleClick = (event: SyntheticMouseEvent<HTMLElement>) => {\n const { videoContainer } = this;\n\n if (!videoContainer) {\n return;\n }\n\n const { offsetWidth: videoWidth } = videoContainer;\n const { clientX: mouseX } = event;\n const { fullscreenElement, fullscreenEnabled } = fscreen;\n\n if (mouseX <= videoWidth * DOUBLE_CLICK.BackwardSkipAreaThreshold) {\n // Skip backward\n this.handleSkipBackwardOnClick(event);\n } else if (mouseX >= videoWidth * DOUBLE_CLICK.ForwardSkipAreaThreshold) {\n // Skip forward\n this.handleSkipForwardOnClick(event);\n } else if (fullscreenElement !== null && fullscreenEnabled) {\n // Exit fullscreen\n this.handleExitFullScreenOnClick();\n } else {\n // Enter fullscreen\n this.handleEnterFullScreenOnClick();\n }\n };\n\n handleOnMouseEnterController = () => {\n this.isOverlayHovered = true;\n this.showOverlay(false);\n };\n\n handleOnMouseLeaveController = () => {\n this.isOverlayHovered = false;\n this.hideOverlay();\n };\n\n showOverlay = (thenHide: boolean = true) => {\n const { isOverlayHovered } = this;\n\n this.resetOverlayTimer();\n this.setState({ isOverlayVisible: true }, thenHide && !isOverlayHovered ? this.hideOverlay : undefined);\n };\n\n hideOverlay = () => {\n this.resetOverlayTimer();\n this.overlayTimer = setTimeout(() => this.setState({ isOverlayVisible: false }), OVERLAY_TIMEOUT);\n };\n\n hideControls = () => {\n this.resetOverlayTimer();\n this.setState({ isOverlayVisible: false });\n };\n\n pauseVideo = async (): Promise<void> => {\n const { isControllerEnabled } = this.state;\n const { videoPlayer } = this;\n\n if (!isControllerEnabled) {\n // Play not started yet\n return;\n }\n\n this.sendCurrentPlayerState(DataCollectionPlayerState.Pause);\n this.hidePlayPicto = false;\n\n if (videoPlayer && !videoPlayer.isPaused()) {\n videoPlayer.pause();\n\n try {\n await this.sendStreamStop(StopStreamKind.Pause);\n } catch (error) {\n if (isInvalidTokenError(error)) {\n // Nothing to do: app will restart\n return;\n }\n if (error instanceof PlayerError) {\n const { code } = error;\n if (typeof code === 'string' && code !== VIDEOPLAYER_ERRORS.VS004StreamRequestPending) {\n this.displayErrorMessage(code);\n }\n }\n }\n }\n };\n\n restartSession = async (): Promise<void> => {\n const { playerItem } = this.props;\n const { playheadPosition } = this.state;\n\n if (!playerItem?.programMetadata) {\n return this.handleClose({ errorCode: VIDEOPLAYER_ERRORS.VS995SessionTimeOut });\n }\n\n const { item, locationId, programMetadata, seriesMetadata, viewingHistoryId, vtiId } = playerItem;\n\n this.isRestartingSession = true;\n\n this.stopMediametrie();\n this.stopDataCollection();\n\n try {\n await this.sendStreamStop(StopStreamKind.FinalStop);\n return await this.openVodItem(item, programMetadata, seriesMetadata ?? null, vtiId ?? null, viewingHistoryId ?? null, locationId ?? null, playheadPosition);\n } catch (error) {\n if (isInvalidTokenError(error)) {\n // Nothing to do: app will restart\n return Promise.resolve();\n }\n if (error instanceof PlayerError) {\n const { code } = error;\n if (typeof code === 'string' && code !== VIDEOPLAYER_ERRORS.VS004StreamRequestPending) {\n this.displayErrorMessage(code);\n return Promise.resolve();\n }\n }\n throw error;\n }\n };\n\n playVideo = async (notifyDataCollector: boolean = true): Promise<void> => {\n const { isControllerEnabled } = this.state;\n const { videoPlayer } = this;\n\n if (!isControllerEnabled || !videoPlayer) {\n // Play not started yet\n return Promise.resolve();\n }\n\n if (notifyDataCollector) {\n this.sendCurrentPlayerState(DataCollectionPlayerState.Play);\n }\n\n if (videoPlayer.isPaused() === false) {\n return Promise.resolve();\n }\n\n if (this.keepAlive?.getState() === KeepAliveState.ForbiddenError) {\n // Session has expired: start a new one\n return this.restartSession();\n }\n\n // Resume play as usual\n try {\n await this.startVideoWithPromise(null);\n return await videoPlayer.play();\n } catch (error) {\n if (isInvalidTokenError(error)) {\n // Nothing to do: app will restart\n return Promise.resolve();\n }\n if (error instanceof PlayerError) {\n const { code } = error;\n if (typeof code === 'string' && code !== VIDEOPLAYER_ERRORS.VS004StreamRequestPending) {\n this.displayErrorMessage(code);\n }\n }\n\n throw error;\n }\n };\n\n handlePauseOnClick: () => Promise<void> = this.pauseVideo;\n\n handlePlayOnClick: (notifyDataCollector?: boolean) => Promise<void> = this.playVideo;\n\n getTileType = (): TileConfigTileType => {\n const { playerItem } = this.props;\n\n if (!playerItem) {\n // Default type\n return TileConfigTileType.Gemtv;\n }\n\n const { tileType, type } = playerItem;\n return tileType ?? (type === ExtendedItemType.VOD ? TileConfigTileType.Portrait : TileConfigTileType.Gemtv);\n };\n\n handleDownloadOnClick = async (): Promise<void> => {\n const {\n channel,\n debugInfo: { streamUrl },\n downloadOperationId: inProgressDownloadOperationId,\n programMetadata,\n seriesMetadata,\n title,\n } = this.state;\n const { videoPlayer } = this;\n\n if (!videoPlayer || inProgressDownloadOperationId !== null) {\n return;\n }\n\n if (await ShakaStorage.exists(streamUrl)) {\n Messenger.emit(MessengerEvents.NOTIFY_INFO, <div>« {title} » a déjà été téléchargé</div>);\n return;\n }\n\n // Id of the download operation (used for the toast and ShakaStorage operation)\n const downloadOperationId: string = crypto.randomUUID();\n\n const assetId = seriesMetadata?.id ?? programMetadata?.id;\n const channelId = channel?.epgid;\n\n this.setState({ downloadOperationId }, async () => {\n await videoPlayer.download(downloadOperationId, { assetId, channelId, title: title ?? '' });\n this.setState({ downloadOperationId: null });\n });\n };\n\n handleInfoOnClick = () => {\n const { contentType, currentItem, programMetadata, seriesMetadata, timeshift } = this.state;\n\n if (currentItem && programMetadata) {\n Messenger.emit(MessengerEvents.OPEN_CARD, {\n displayedSectionCount: 0,\n isOpenFromPlayer: true,\n isTimeshifting: contentType === ContentType.Live && timeshift > TIMESHIFT_THRESHOLD,\n item: currentItem,\n programMetadata,\n seriesMetadata,\n tileType: this.getTileType(),\n });\n }\n };\n\n updateMaxBitrate = (isBitrateLimited: boolean) => {\n const { maxBitrate } = this.props;\n const { videoPlayer } = this;\n\n videoPlayer?.updateMaxBitrate(isBitrateLimited ? maxBitrate : -1);\n };\n\n handleChannelZapperChannelChanged = (channel: NETGEM_API_CHANNEL): Promise<void> => {\n const { timeshift } = this.state;\n const { isZapping, videoPlayer } = this;\n\n if (isZapping) {\n // If a channel us currently initializing, we skip all following changes and keep the last one to execute it at the end\n this.nextChannel = channel;\n return Promise.resolve();\n }\n\n if (timeshift > TIMESHIFT_THRESHOLD) {\n videoPlayer?.goBackToLive();\n }\n\n this.isZapping = true;\n\n // Reset auto-selection of subtitles track\n this.isSubtitlesAutoSelectionApplied = false;\n\n this.setState(\n produce((draft) => {\n draft.channel = channel;\n draft.channelImageUrl = '';\n draft.currentItem = null;\n }),\n () => {\n this.stopProgramDataCollection(false);\n fireAndForget(this.loadChannelImage(channel.epgid));\n return this.initializeLivePlayer(ProgramInfoLoadStatus.NotStarted);\n },\n );\n\n return Promise.resolve();\n };\n\n finishZapping = () => {\n const { isZapping, nextChannel } = this;\n\n if (!isZapping) {\n return;\n }\n\n this.isZapping = false;\n\n if (nextChannel) {\n fireAndForget(this.handleChannelZapperChannelChanged(nextChannel));\n this.nextChannel = null;\n }\n };\n\n // Find which program is being played ('playheadPosition', if provided, is in seconds)\n findPlayedItemInEpgFeed = (channel: NETGEM_API_CHANNEL, playheadPosition?: number) => {\n const { currentItem, isTimeshiftSwitching } = this.state;\n const { isZapping } = this;\n const { epgid: channelId } = channel;\n\n const time = typeof playheadPosition === 'number' && playheadPosition > 0 ? playheadPosition : AccurateTimestamp.nowInSeconds();\n\n // When a live program starts, there's a brief period during which playheadPosition is 0\n const matchingItem = EpgManager.findItem(channelId, time);\n\n if (!matchingItem) {\n // No matching item in EPG\n this.setState({\n currentItem: null,\n duration: 0,\n programInfoLoadStatus: ProgramInfoLoadStatus.ItemNotFound,\n programMetadata: null,\n seriesEpisodeText: null,\n seriesMetadata: null,\n title: '',\n });\n\n return;\n }\n\n if (currentItem) {\n const { selectedProgramId: currentProgramId } = currentItem;\n const { selectedProgramId: matchingProgramId } = matchingItem;\n\n if (currentProgramId === matchingProgramId) {\n // Same program: no need to retrieve metadata again\n if (isTimeshiftSwitching) {\n this.restartProgramDataCollection();\n this.setTimeshiftSwitch(false);\n }\n return;\n }\n }\n\n this.setTimeshiftSwitch(false);\n\n // Reset auto-selection of subtitles track\n this.isSubtitlesAutoSelectionApplied = false;\n\n if (!isZapping) {\n // Program ended or user used timeshift to watch another program from the same timeshift buffer\n this.stopProgramDataCollection(true);\n }\n\n this.setState(\n produce((draft) => {\n draft.currentItem = matchingItem;\n }),\n this.updateEpgInfo,\n );\n };\n\n loadProgramMetadata = async (currentItem: NETGEM_API_V8_FEED_ITEM): Promise<void> => {\n const { localSendV8MetadataRequest } = this.props;\n const {\n abortController: { signal },\n } = this;\n\n const { selectedProgramId, seriesId } = currentItem;\n\n try {\n const metadata: NETGEM_API_V8_METADATA = await localSendV8MetadataRequest(selectedProgramId, METADATA_KIND_PROGRAM, signal);\n\n const programMetadata = ((metadata: any): NETGEM_API_V8_METADATA_PROGRAM);\n const { duration } = programMetadata;\n const title = getTitle(programMetadata, Localizer.language);\n\n // Program duration: used to initialize the duration (that will be adjusted by the player later)\n this.setState(\n produce((draft) => {\n draft.duration = getIso8601DurationInSeconds(duration);\n draft.programMetadata = programMetadata;\n draft.seriesEpisodeText = formatSeasonEpisodeNbr(programMetadata);\n draft.title = title;\n }),\n );\n\n this.checkLiveRecordingStatus();\n\n if (seriesId) {\n // Series metadata\n this.setState({ programInfoLoadStatus: ProgramInfoLoadStatus.LoadingSeriesMetadata }, () => this.loadSeriesMetadata(seriesId));\n } else {\n this.setState({\n programInfoLoadStatus: ProgramInfoLoadStatus.Loaded,\n seriesMetadata: null,\n });\n }\n\n // Update data collection message\n const {\n selectedLocation: { duration: liveDuration, id: locationId },\n } = currentItem;\n this.updateProgramDataCollection(programMetadata, locationId ?? null, liveDuration);\n } catch (error) {\n await ignoreIfAborted(signal, error, () =>\n this.setState({\n duration: 0,\n programInfoLoadStatus: ProgramInfoLoadStatus.ItemNotFound,\n programMetadata: null,\n seriesEpisodeText: null,\n title: '',\n }),\n );\n }\n };\n\n // Only happens in live (channel or program change)\n updateEpgInfo = () => {\n const { currentItem } = this.state;\n\n if (!currentItem) {\n // Not suppose to happen since the caller sets currentItem with a non-null value beforehand\n return;\n }\n\n // Program metadata\n this.setState({ programInfoLoadStatus: ProgramInfoLoadStatus.LoadingProgramMetadata }, () => this.loadProgramMetadata(currentItem));\n };\n\n loadSeriesMetadata = async (seriesId: string): Promise<void> => {\n const { localSendV8MetadataRequest } = this.props;\n const {\n abortController: { signal },\n } = this;\n\n try {\n const metadata: NETGEM_API_V8_METADATA = await localSendV8MetadataRequest(seriesId, METADATA_KIND_SERIES, signal);\n const seriesMetadata = ((metadata: any): NETGEM_API_V8_METADATA_SERIES);\n this.setState(\n produce((draft) => {\n draft.programInfoLoadStatus = ProgramInfoLoadStatus.Loaded;\n draft.seriesMetadata = seriesMetadata;\n }),\n );\n } catch (error) {\n await ignoreIfAborted(signal, error, () =>\n this.setState({\n programInfoLoadStatus: ProgramInfoLoadStatus.Loaded,\n seriesMetadata: null,\n }),\n );\n }\n };\n\n checkBlackOut = (location: NETGEM_API_V8_METADATA_SCHEDULE_LOCATION): void => {\n const { isCurrentItemBlackedOut: prevIsCurrentItemBlackedOut } = this.state;\n const { isLivePlaybackEnabled } = location;\n\n const isCurrentItemBlackedOut = isLivePlaybackEnabled === false;\n\n if (isCurrentItemBlackedOut && !prevIsCurrentItemBlackedOut) {\n // Entering black out\n this.setMute(true);\n } else if (!isCurrentItemBlackedOut && prevIsCurrentItemBlackedOut) {\n // Exiting black out\n this.setMute(false);\n }\n\n this.setState({ isCurrentItemBlackedOut });\n\n // All other cases are ignored since there is no change\n };\n\n renderBlackOutOverlay = (): React.Node => {\n const { applicationName } = this.props;\n const { isCurrentItemBlackedOut } = this.state;\n\n return isCurrentItemBlackedOut ? (\n <div className='blackOutWrapper'>\n <img alt={applicationName} src={AppMobileAppLogo} />\n <div className='blackOutTitle'>{Localizer.localize('player.blackout.title')}</div>\n <div>{Localizer.localize('player.blackout.text')}</div>\n </div>\n ) : null;\n };\n\n renderLoader = (): React.Node => {\n const { channelImageUrl, isBuffering, isVideofuturAsset } = this.state;\n const visibilityClass = isBuffering ? 'visible' : '';\n\n if (isVideofuturAsset) {\n // VOD\n return (\n <div className={clsx('loaderWrapper', visibilityClass)}>\n <InfiniteCircleLoaderArc />\n </div>\n );\n }\n\n // TV\n if (!channelImageUrl) {\n return null;\n }\n\n return (\n <div className={clsx('loaderWrapper', visibilityClass)}>\n <img alt='' draggable={false} src={channelImageUrl} />\n </div>\n );\n };\n\n getVideoQuality = (): Definition => {\n const { videoElement } = this;\n\n if (!videoElement) {\n return Definition.SD;\n }\n\n const { videoHeight, videoWidth } = videoElement;\n if (videoHeight >= RESOLUTION.FourK.Height && videoWidth >= RESOLUTION.FourK.Width) {\n // 4K\n return Definition.FourK;\n }\n\n if (videoHeight >= RESOLUTION.HD.Height && videoWidth >= RESOLUTION.HD.Width) {\n // HD Ready\n return Definition.HD;\n }\n\n // SD\n return Definition.SD;\n };\n\n renderVideoController = (): React.Node => {\n const { playerItem } = this.props;\n const {\n audioMediaInfo,\n bufferedTimeRanges,\n channel,\n channelImageUrl,\n contentType,\n controlLevel,\n currentItem,\n duration,\n endMargin,\n isControllerEnabled,\n isCurrentItemBlackedOut,\n isInFullscreen,\n isLiveRecording,\n isMuted,\n isOverlayVisible,\n isPlaying,\n isTimeshiftEnabled,\n isTrailer,\n liveBufferLength,\n location,\n playheadPosition,\n programInfoLoadStatus,\n programMetadata,\n realEnd,\n realStart,\n selectedAudioMediaInfo,\n selectedSubtitlesMediaInfo,\n seriesEpisodeText,\n seriesMetadata,\n startMargin,\n subtitlesMediaInfo,\n timeshift,\n title,\n totalDuration,\n userViewEndOffset,\n userViewStartOffset,\n volume,\n } = this.state;\n const { initialChannelId } = this;\n\n const { epgid: channelId, name: channelName } = channel || {};\n const isProgramInfoHidden = programInfoLoadStatus !== ProgramInfoLoadStatus.Loaded && programInfoLoadStatus !== ProgramInfoLoadStatus.ItemNotFound;\n const type = playerItem?.type ?? ExtendedItemType.OfflineContent;\n\n return (\n <VideoController\n audioMediaInfo={audioMediaInfo}\n bufferedTimeRanges={bufferedTimeRanges}\n channelId={channelId || initialChannelId}\n channelImageUrl={channelImageUrl}\n channelName={channelName || ''}\n contentType={contentType}\n controlLevel={controlLevel}\n currentItem={currentItem}\n duration={duration}\n endMargin={endMargin}\n isBlackOutEnabled={isCurrentItemBlackedOut}\n isControllerEnabled={isControllerEnabled}\n isInFullscreen={isInFullscreen}\n isLiveRecording={isLiveRecording}\n isMuted={isMuted}\n isPlaying={isPlaying}\n isProgramInfoHidden={isProgramInfoHidden}\n isTimeshiftEnabled={isTimeshiftEnabled}\n isTrailer={isTrailer}\n isVisible={isOverlayVisible}\n itemType={type}\n liveBufferLength={liveBufferLength}\n location={location}\n onChannelChanged={this.handleChannelZapperChannelChanged}\n onDownloadClick={this.handleDownloadOnClick}\n onEnterFullScreenClick={this.handleEnterFullScreenOnClick}\n onExitFullScreenClick={this.handleExitFullScreenOnClick}\n onGoToLiveClick={this.handleGoToLiveOnClick}\n onInfoClick={this.handleInfoOnClick}\n onLiveProgressBarSeekChanged={this.handleLiveProgressBarSeekChanged}\n onMouseEnter={this.handleOnMouseEnterController}\n onMouseLeave={this.handleOnMouseLeaveController}\n onNewAudioTrackSelected={this.handleNewAudioTrackSelected}\n onNewSubtitlesTrackSelected={this.handleNewSubtitlesTrackSelected}\n onPauseClick={this.handlePauseOnClick}\n onPlayClick={this.handlePlayOnClick}\n onSkipBackwardClick={this.handleSkipBackwardOnClick}\n onSkipForwardClick={this.handleSkipForwardOnClick}\n onStandardProgressBarSeekChanged={this.handleStandardProgressBarSeekChanged}\n onVolumeChanged={this.handleVolumeChanged}\n onVolumeClick={this.handleVolumeOnClick}\n playheadPosition={playheadPosition}\n programMetadata={programMetadata}\n realEnd={realEnd}\n realStart={realStart}\n ref={(instance) => {\n this.videoController = instance;\n }}\n selectedAudioMediaInfo={selectedAudioMediaInfo}\n selectedSubtitlesMediaInfo={selectedSubtitlesMediaInfo}\n seriesEpisodeText={seriesEpisodeText}\n seriesMetadata={seriesMetadata ?? null}\n startMargin={startMargin}\n subtitlesMediaInfo={subtitlesMediaInfo}\n tileType={this.getTileType()}\n timeshift={timeshift}\n title={title}\n totalDuration={totalDuration}\n userViewEndOffset={userViewEndOffset}\n userViewStartOffset={userViewStartOffset}\n videoQuality={this.getVideoQuality()}\n volume={volume}\n />\n );\n };\n\n renderBackwardPicto = (): React.Node => {\n const { skipping } = this.state;\n\n if (skipping === SkippingKind.BackwardLevel2) {\n return <PictoRewind60 />;\n }\n\n if (skipping === SkippingKind.BackwardLevel1) {\n return <PictoRewind30 />;\n }\n\n return <PictoRewind10 />;\n };\n\n renderForwardPicto = (): React.Node => {\n const { skipping } = this.state;\n\n if (skipping === SkippingKind.ForwardLevel2) {\n return <PictoForward60 />;\n }\n\n if (skipping === SkippingKind.ForwardLevel1) {\n return <PictoForward30 />;\n }\n\n return <PictoForward10 />;\n };\n\n renderPictos = (): React.Node => {\n const { isBuffering, isPlaying, skipping } = this.state;\n const { hidePlayPicto } = this;\n\n const backwardPicto = this.renderBackwardPicto();\n const forwardPicto = this.renderForwardPicto();\n const playOrPausePicto = isPlaying ? <PictoBigPlay className='play' /> : <PictoPause />;\n\n const backwardClass = clsx(\n 'statusPictoBackground',\n (skipping === SkippingKind.BackwardLevel0 || skipping === SkippingKind.BackwardLevel1 || skipping === SkippingKind.BackwardLevel2) && 'skipBackward',\n );\n\n const forwardClass = clsx(\n 'statusPictoBackground',\n (skipping === SkippingKind.ForwardLevel0 || skipping === SkippingKind.ForwardLevel1 || skipping === SkippingKind.ForwardLevel2) && 'skipForward',\n );\n\n return (\n <>\n <div className={backwardClass}>{backwardPicto}</div>\n {isBuffering || hidePlayPicto ? null : <div className={clsx('statusPictoBackground', isPlaying ? 'play' : 'pause')}>{playOrPausePicto}</div>}\n <div className={forwardClass}>{forwardPicto}</div>\n </>\n );\n };\n\n debugOverlayCloseHandler = () => {\n this.setState({ isDebugOverlayVisible: false });\n };\n\n render(): React.Node {\n const {\n maxBitrate,\n settings: { [Setting.GreenStreaming]: isBitrateLimited },\n } = this.props;\n\n const { isOverlayVisible } = this.state;\n const { keepAlive, videoPlayer } = this;\n\n return (\n <div className={clsx('playerView', videoPlayer?.name.toLowerCase(), isOverlayVisible && 'visibleCursor')}>\n <figure\n className='videoContainer'\n ref={(instance) => {\n this.videoContainer = instance;\n }}\n >\n <video\n className={clsx(isOverlayVisible && 'shifted')}\n onClick={this.handleOnClickOnVideo}\n onMouseMove={this.handleOnMouseMoveOnVideo}\n ref={(instance) => {\n this.videoElement = instance;\n }}\n src=''\n />\n {this.renderLoader()}\n {this.renderBlackOutOverlay()}\n {this.renderVideoController()}\n {this.renderPictos()}\n </figure>\n <ButtonBack\n className={clsx('backBar', isOverlayVisible && 'visible')}\n hasShaft\n hasText={false}\n onClick={this.handleBackOnClick}\n onMouseEnter={this.handleOnMouseEnterController}\n onMouseLeave={this.handleOnMouseLeaveController}\n />\n {renderDebugOverlay(this.state, isBitrateLimited, maxBitrate, keepAlive?.getState() ?? null, this.debugOverlayCloseHandler)}\n </div>\n );\n }\n}\n\nconst mapStateToProps = (state: CombinedReducers): ReduxPlayerReducerStateType => {\n return {\n applicationName: state.appConfiguration.applicationName,\n authenticationToken: state.appRegistration.authenticationToken,\n channels: state.appConfiguration.deviceChannels,\n deviceSettings: state.appConfiguration.deviceSettings,\n isDebugModeEnabled: state.appConfiguration.isDebugModeEnabled,\n isMaxBitrateAllowed: state.appConfiguration.isMaxBitrateAllowed,\n maxBitrate: state.appConfiguration.maxBitrate,\n npvrRecordingsList: state.npvr.npvrRecordingsList,\n purchaseList: state.appRegistration.registration === RegistrationType.RegisteredAsGuest ? {} : (state.ui.purchaseList ?? {}),\n settings: state.ui.settings,\n state,\n streamPriorities: state.appConfiguration.playerStreamPriorities,\n viewingHistory: state.ui.viewingHistory,\n viewingHistoryStatus: state.ui.viewingHistoryStatus,\n };\n};\n\nconst mapDispatchToProps = (dispatch: Dispatch): ReduxPlayerDispatchToPropsType => {\n return {\n closeConfirmation: () => dispatch(hideModal()),\n\n localCreateSvodStreamFromId: (distributorId: string, vtiId: number, signal?: AbortSignal): Promise<any> => dispatch(purchaseAndCreate(distributorId, vtiId, '', signal)),\n\n localCreateVodStreamFromId: (distributorId: string, vtiId: number, signal?: AbortSignal): Promise<any> => dispatch(sendBOStreamCreateRequest(distributorId, vtiId, true, signal)),\n\n localGetImageUrl: (assetId: string, width: number, height: number, luminosity?: LuminosityType, signal?: AbortSignal): Promise<any> =>\n dispatch(\n getImageUrl(\n {\n assetId,\n height,\n luminosity,\n width,\n },\n signal,\n ),\n ),\n\n localSendNtgEntitlementGetRequest: (customData: string, service: string, url: string, channelId: string, signal?: AbortSignal): Promise<any> =>\n dispatch(sendNtgEntitlementGetRequest(customData, service, url, channelId, signal)),\n\n localSendNtgEntitlementReleaseRequest: (customData: string, service: string, url: string, channelId: string, signal?: AbortSignal): Promise<any> =>\n dispatch(sendNtgEntitlementReleaseRequest(customData, service, url, channelId, signal)),\n\n localSendV8LocationEpgRequest: (startTime: number, range: number, channelIds: Array<string>, signal?: AbortSignal): Promise<any> =>\n dispatch(sendV8LocationEpgRequest(startTime, range, undefined, channelIds, signal)),\n\n localSendV8MetadataLocationRequest: (assetId: string, signal?: AbortSignal): Promise<any> => dispatch(sendV8MetadataLocationRequest(assetId, signal)),\n\n localSendV8MetadataRequest: (assetId: string, type: MetadataKind, signal?: AbortSignal): Promise<any> => dispatch(sendV8MetadataRequest(assetId, type, signal)),\n\n localSendV8RecordingsMetadataRequest: (recordId: string, signal?: AbortSignal): Promise<any> => dispatch(sendV8RecordingsMetadataRequest(recordId, signal)),\n\n localSendVideofuturStreamCreateRequest: (distributorId: string, vtiId: number, licence: boolean, signal?: AbortSignal): Promise<any> =>\n dispatch(sendBOStreamCreateRequest(distributorId, vtiId, licence, signal)),\n\n localSendVideofuturStreamStartRequest: (distributorId: string, streamId: number, signal?: AbortSignal): Promise<any> => dispatch(sendBOStreamStartRequest(distributorId, streamId, signal)),\n\n localSendVideofuturStreamStopRequest: (distributorId: string, streamId: number, bookmark?: string, signal?: AbortSignal, keepAlive?: boolean): Promise<any> =>\n dispatch(sendBOStreamStopRequest(distributorId, streamId, bookmark, signal, keepAlive)),\n\n localShowConfirmation: (data: CONFIRMATION_DATA_MODAL_TYPE) => dispatch(showConfirmationModal(data)),\n\n localStopOpenStreams: (distributorId: string, signal?: AbortSignal): Promise<any> => dispatch(stopOpenStreams(distributorId, signal)),\n\n localUpdateSetting: (setting?: Setting, value: SettingValueType) => dispatch(updateSetting(setting, value)),\n\n localUpdateViewingHistory: (item: NETGEM_API_VIEWINGHISTORY_ITEM, signal?: AbortSignal): Promise<any> => dispatch(updateViewingHistory(item, signal)),\n };\n};\n\nconst Player: React.ComponentType<PlayerPropType> = connect(mapStateToProps, mapDispatchToProps, null, { forwardRef: true })(PlayerView);\n\nexport default Player;\n","/* @flow */\n\nimport type { VideoPlayerCommonMetrics } from './types';\nimport { round } from '../../../helpers/maths/maths';\n\nconst getCommonMetrics = (video: HTMLVideoElement): VideoPlayerCommonMetrics => {\n const buffer = video.buffered;\n const { length: bufferChunkCount } = buffer;\n\n let bufferLength = 0;\n for (let i = 0; i < bufferChunkCount; ++i) {\n bufferLength += buffer.end(i) - buffer.start(i);\n }\n\n const { height, width } = video.getBoundingClientRect();\n\n return {\n bufferChunkCount,\n bufferLength: Math.round(bufferLength),\n elementHeight: height,\n elementWidth: width,\n playbackRate: round(video.playbackRate, 1),\n videoHeight: video.videoHeight,\n videoWidth: video.videoWidth,\n };\n};\n\nexport { getCommonMetrics };\n","/* @flow */\n\nimport { BO_PURCHASE_ALREADY_PURCHASED_V2, BO_PURCHASE_SVOD_CONTENT_RIGHT_NOT_FOUND, BO_STREAM_NO_SVOD_CONTENT_RIGHT } from '../../../../../libs/netgemLibrary/videofutur/types/ErrorCodes';\nimport { type BO_API_CREATE_STREAM_TYPE } from '../types/stream';\nimport { CustomNetworkError } from '../../../../../libs/netgemLibrary/helpers/CustomNetworkError';\nimport type { Dispatch } from '../../../../types/types';\nimport { HttpStatus } from '../../../../../libs/netgemLibrary/v8/constants/NetworkCodesAndMessages';\nimport type { RequestResponseMethodDefinitionType } from '../../emitter';\nimport { getPurchaseListForDistributor } from './purchaseList';\nimport sendCreateStreamRequest from '../createStream';\nimport sendPurchaseRequest from '../purchase';\n\nconst purchase: (distributorId: string, vtiId: number, promocode: string, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (distributorId, vtiId, promocode, signal) =>\n (dispatch: Dispatch): Promise<any> =>\n // Purchase asset\n dispatch(sendPurchaseRequest(distributorId, vtiId, promocode, signal)).then((response) => {\n // Purchase list refresh\n dispatch(getPurchaseListForDistributor(distributorId));\n\n return Promise.resolve(response);\n });\n\nconst purchaseAndCreate: (distributorId: string, vtiId: number, promocode: string, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (distributorId, vtiId, promocode, signal) =>\n (dispatch: Dispatch): Promise<any> => {\n const create = () =>\n dispatch(sendCreateStreamRequest(distributorId, vtiId, true, signal)).then((createResponse: BO_API_CREATE_STREAM_TYPE) =>\n // Purchase list refresh\n dispatch(getPurchaseListForDistributor(distributorId)).then(() => createResponse),\n );\n\n // Purchase asset\n return dispatch(sendPurchaseRequest(distributorId, vtiId, promocode, signal))\n .then((purchaseResponse) => {\n const { status } = purchaseResponse;\n\n if (status === BO_PURCHASE_SVOD_CONTENT_RIGHT_NOT_FOUND) {\n // Throw same kind of error as stream create\n throw new CustomNetworkError({\n message: status,\n result: { code: BO_STREAM_NO_SVOD_CONTENT_RIGHT },\n status: HttpStatus.Forbidden,\n });\n }\n\n // Create stream\n return create();\n })\n .catch((error) => {\n if (error.getCustomCode() === BO_PURCHASE_ALREADY_PURCHASED_V2) {\n // Item already purchased (this could happen e.g. Gaumont user clicks \"Play\" when in guest mode, then after signing in, player tries to purchase item\n return create();\n }\n\n throw error;\n });\n };\n\nexport { purchase, purchaseAndCreate };\n","/* @flow */\n\nimport './VideoCarousel.css';\nimport * as React from 'react';\nimport { Messenger, MessengerEvents } from '@ntg/utils/dist/messenger';\nimport { logWarning, showDebug } from '../../helpers/debug/debug';\nimport { updateVideoCarouselMuted, updateVideoCarouselPaused, updateVideoCarouselPlaying, updateVideoCarouselUnmuted } from '../../redux/ui/actions';\nimport type { BasicFunction } from '@ntg/utils/dist/types';\nimport ButtonBack from '../buttons/ButtonBack';\nimport type { CombinedReducers } from '../../redux/reducers';\nimport type { Dispatch } from '../../redux/types/types';\nimport HotKeys from '../../helpers/hotKeys/hotKeys';\nimport { SkipDirection } from '../../helpers/ui/types';\nimport clsx from 'clsx';\nimport { connect } from 'react-redux';\nimport fscreen from 'fscreen';\nimport { getSkippingTypeAndValue } from '../../helpers/ui/player';\n\nconst ONE_HUNDRED: number = 100;\n\ntype VideoCarouselPropType = {||};\n\ntype ReduxVideoCarouselDispatchToPropsType = {|\n +localUpdateVideoCarouselMuted: BasicFunction,\n +localUpdateVideoCarouselPaused: BasicFunction,\n +localUpdateVideoCarouselPlaying: BasicFunction,\n +localUpdateVideoCarouselUnmuted: BasicFunction,\n|};\n\ntype ReduxVideoCarouselReducerStateType = {|\n +gridSectionId: string | null,\n +isDebugModeEnabled: boolean,\n +isMuted: boolean,\n +isPlaying: boolean,\n|};\n\ntype CompleteVideoCarouselPropType = {|\n ...VideoCarouselPropType,\n ...ReduxVideoCarouselReducerStateType,\n ...ReduxVideoCarouselDispatchToPropsType,\n|};\n\ntype VideoCarouselStateType = {|\n currentIndex: number,\n isHidden: boolean,\n isInitializingPlay: boolean,\n isMaskHidden: boolean,\n isMaskReduced: boolean,\n trailerUrlList: ?Array<string>,\n|};\n\nconst InitialState = Object.freeze({\n currentIndex: -1,\n isHidden: false,\n isInitializingPlay: false,\n isMaskHidden: false,\n isMaskReduced: false,\n trailerUrlList: null,\n});\n\nclass VideoCarouselView extends React.PureComponent<CompleteVideoCarouselPropType, VideoCarouselStateType> {\n isPlayPromiseCancelled: boolean;\n\n video: HTMLMediaElement | null;\n\n videoContainer: HTMLElement | null;\n\n wasTrailerPlayingBeforePause: boolean;\n\n constructor(props: CompleteVideoCarouselPropType) {\n super(props);\n\n this.isPlayPromiseCancelled = false;\n this.video = null;\n this.videoContainer = null;\n this.wasTrailerPlayingBeforePause = false;\n\n const { gridSectionId } = props;\n\n this.state = {\n ...InitialState,\n isHidden: gridSectionId !== null,\n };\n }\n\n componentDidMount() {\n fscreen.addEventListener('fullscreenchange', this.onFullscreenChange, { passive: true });\n\n HotKeys.register('left', this.handleBackwardHotKey, { name: 'VideoCarousel.backward' });\n HotKeys.register('right', this.handleForwardHotKey, { name: 'VideoCarousel.forward' });\n\n Messenger.on(MessengerEvents.CAROUSEL_SHOW_DEBUG, this.showDebug);\n Messenger.on(MessengerEvents.REDUCE_VIDEO_CAROUSEL_MASK, this.reduceMask);\n Messenger.on(MessengerEvents.ENLARGE_VIDEO_CAROUSEL_MASK, this.enlargeMask);\n Messenger.on(MessengerEvents.CAROUSEL_SET_CURRENT_INDEX, this.setCurrentIndex);\n Messenger.on(MessengerEvents.CAROUSEL_SHOW, this.show);\n Messenger.on(MessengerEvents.CAROUSEL_HIDE, this.hide);\n Messenger.on(MessengerEvents.VIDEO_CAROUSEL_SET, this.setTrailers);\n Messenger.on(MessengerEvents.VIDEO_CAROUSEL_STOP, this.stopVideo);\n Messenger.on(MessengerEvents.VIDEO_CAROUSEL_ENTER_FULLSCREEN, this.enterFullscreen);\n Messenger.on(MessengerEvents.VIDEO_CAROUSEL_EXIT_FULLSCREEN, this.exitFullscreen);\n Messenger.on(MessengerEvents.VIDEO_CAROUSEL_TOGGLE_FULLSCREEN, this.toggleFullscreen);\n Messenger.on(MessengerEvents.VIDEO_CAROUSEL_TRAILER_HIDDEN, this.handleTrailerHidden);\n Messenger.on(MessengerEvents.VIDEO_CAROUSEL_TRAILER_VISIBLE, this.handleTrailerVisible);\n }\n\n componentDidUpdate(prevProps: CompleteVideoCarouselPropType) {\n const { isMuted, isPlaying } = this.props;\n const { isMuted: prevIsMuted, isPlaying: prevIsPlaying } = prevProps;\n\n if (isPlaying !== prevIsPlaying) {\n if (isPlaying) {\n this.playVideo();\n } else {\n this.pauseVideo();\n }\n }\n\n if (isMuted !== prevIsMuted) {\n if (isMuted) {\n this.muteVideo();\n } else {\n this.unmuteVideo();\n }\n }\n }\n\n componentWillUnmount() {\n this.isPlayPromiseCancelled = true;\n\n fscreen.removeEventListener('fullscreenchange', this.onFullscreenChange, { passive: true });\n\n HotKeys.unregister('left', this.handleBackwardHotKey);\n HotKeys.unregister('right', this.handleForwardHotKey);\n\n Messenger.off(MessengerEvents.CAROUSEL_SHOW_DEBUG, this.showDebug);\n Messenger.off(MessengerEvents.REDUCE_VIDEO_CAROUSEL_MASK, this.reduceMask);\n Messenger.off(MessengerEvents.ENLARGE_VIDEO_CAROUSEL_MASK, this.enlargeMask);\n Messenger.off(MessengerEvents.CAROUSEL_SET_CURRENT_INDEX, this.setCurrentIndex);\n Messenger.off(MessengerEvents.CAROUSEL_SHOW, this.show);\n Messenger.off(MessengerEvents.CAROUSEL_HIDE, this.hide);\n Messenger.off(MessengerEvents.VIDEO_CAROUSEL_SET, this.setTrailers);\n Messenger.off(MessengerEvents.VIDEO_CAROUSEL_STOP, this.stopVideo);\n Messenger.off(MessengerEvents.VIDEO_CAROUSEL_ENTER_FULLSCREEN, this.enterFullscreen);\n Messenger.off(MessengerEvents.VIDEO_CAROUSEL_EXIT_FULLSCREEN, this.exitFullscreen);\n Messenger.off(MessengerEvents.VIDEO_CAROUSEL_TOGGLE_FULLSCREEN, this.toggleFullscreen);\n Messenger.off(MessengerEvents.VIDEO_CAROUSEL_TRAILER_HIDDEN, this.handleTrailerHidden);\n Messenger.off(MessengerEvents.VIDEO_CAROUSEL_TRAILER_VISIBLE, this.handleTrailerVisible);\n }\n\n showDebug: () => void = () => {\n const { props, state } = this;\n const { isDebugModeEnabled } = props;\n\n if (!isDebugModeEnabled) {\n return;\n }\n\n showDebug('Background Trailers', {\n instance: this,\n instanceFields: ['wasTrailerPlayingBeforePause'],\n props,\n propsFields: ['isMuted', 'isPlaying'],\n state,\n stateFields: ['currentIndex', 'isHidden', 'isInitializingPlay', 'isMaskHidden', 'isMaskReduced', 'trailerUrlList'],\n });\n };\n\n reduceMask: () => void = () => {\n this.setState({ isMaskReduced: true });\n };\n\n enlargeMask: () => void = () => {\n this.setState({ isMaskReduced: false });\n };\n\n setTrailers = (trailerUrlList: Array<string>) => {\n this.setState({ trailerUrlList });\n };\n\n setCurrentIndex = (currentIndex: number) => {\n this.setState({ currentIndex }, this.playVideo);\n };\n\n show: () => void = () => {\n this.setState({ isHidden: false });\n };\n\n hide: () => void = () => {\n this.setState({ isHidden: true });\n };\n\n onFullscreenChange: () => void = () => {\n const { videoContainer } = this;\n\n if (videoContainer && fscreen.fullscreenEnabled) {\n if (fscreen.fullscreenElement !== null) {\n // Fullscreen activated\n videoContainer.classList.add('fullscreen');\n this.setState({ isMaskHidden: true });\n } else {\n // Fullscreen deactivated\n videoContainer.classList.remove('fullscreen');\n Messenger.emit(MessengerEvents.VIDEO_CAROUSEL_FULLSCREEN_EXITED);\n this.setState({ isMaskHidden: false });\n }\n }\n };\n\n isInFullscreen = (): boolean => fscreen.fullscreenElement !== null && fscreen.fullscreenEnabled;\n\n enterFullscreen: () => void = () => {\n const { video, videoContainer } = this;\n\n if (videoContainer && fscreen.fullscreenEnabled && fscreen.fullscreenElement === null) {\n if (video) {\n // Show video controls\n video.controls = true;\n }\n\n fscreen.requestFullscreen(videoContainer).catch((error) => logWarning(`Fullscreen unavailable at the moment (${error.message})`));\n }\n };\n\n exitFullscreen: () => void = () => {\n const { video } = this;\n\n if (this.isInFullscreen()) {\n if (video) {\n // Hide video controls\n video.controls = false;\n }\n\n fscreen.exitFullscreen();\n this.setState({ isMaskHidden: false });\n }\n };\n\n toggleFullscreen: () => void = () => {\n if (this.isInFullscreen()) {\n this.exitFullscreen();\n } else {\n this.enterFullscreen();\n }\n };\n\n // Skip backward\n handleBackwardHotKey = (event: SyntheticKeyboardEvent<HTMLElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n this.skipVideo(SkipDirection.Backward, event);\n };\n\n handleForwardHotKey = (event: SyntheticKeyboardEvent<HTMLElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n this.skipVideo(SkipDirection.Forward, event);\n };\n\n handleOnEnded: () => void = () => {\n const { currentIndex } = this.state;\n\n this.exitFullscreen();\n Messenger.emit(MessengerEvents.VIDEO_CAROUSEL_UPDATE_PROGRESS, currentIndex, 0);\n Messenger.emit(MessengerEvents.VIDEO_CAROUSEL_ENDED);\n };\n\n handleOnPause: () => void = () => {\n const { localUpdateVideoCarouselPaused } = this.props;\n\n localUpdateVideoCarouselPaused();\n };\n\n handleOnPlay: () => void = () => {\n const { localUpdateVideoCarouselPlaying } = this.props;\n\n localUpdateVideoCarouselPlaying();\n };\n\n handleOnVolumeChange: () => void = () => {\n const { localUpdateVideoCarouselMuted, localUpdateVideoCarouselUnmuted } = this.props;\n const { video } = this;\n\n if (!video) {\n return;\n }\n\n if (video.muted) {\n localUpdateVideoCarouselMuted();\n } else {\n localUpdateVideoCarouselUnmuted();\n }\n };\n\n handleOnTimeUpdate: () => void = () => {\n const { currentIndex } = this.state;\n const { video } = this;\n\n if (!video || isNaN(video.duration)) {\n return;\n }\n\n const percent = Math.floor((video.currentTime / video.duration) * ONE_HUNDRED);\n Messenger.emit(MessengerEvents.VIDEO_CAROUSEL_UPDATE_PROGRESS, currentIndex, percent);\n };\n\n handleOnDoubleClick: () => void = this.toggleFullscreen;\n\n playVideo: () => void = () => {\n const { video } = this;\n\n if (!video) {\n return;\n }\n\n if (video.paused) {\n const playPromise = video.play();\n\n if (playPromise) {\n this.setState({ isInitializingPlay: true });\n playPromise\n .then(() => {\n if (!this.isPlayPromiseCancelled) {\n this.setState({ isInitializingPlay: false });\n }\n })\n .catch(() => {\n // Nothing to do (user probably navigated or changed video)\n });\n }\n }\n };\n\n pauseVideo: () => void = () => {\n const { isInitializingPlay } = this.state;\n const { video } = this;\n\n if (!video) {\n return;\n }\n\n if (!isInitializingPlay && !video.paused) {\n video.pause();\n }\n };\n\n stopVideo: () => void = () => {\n this.pauseVideo();\n this.setState({ currentIndex: 0 });\n };\n\n handleTrailerHidden: () => void = () => {\n const { video } = this;\n\n if (!video) {\n return;\n }\n\n this.wasTrailerPlayingBeforePause = !video.paused;\n this.pauseVideo();\n };\n\n handleTrailerVisible: () => void = () => {\n const { video, wasTrailerPlayingBeforePause } = this;\n\n if (!video) {\n return;\n }\n\n if (wasTrailerPlayingBeforePause) {\n this.wasTrailerPlayingBeforePause = false;\n this.playVideo();\n }\n };\n\n muteVideo: () => void = () => {\n const { video } = this;\n\n if (video) {\n video.muted = true;\n }\n };\n\n unmuteVideo: () => void = () => {\n const { video } = this;\n\n if (video) {\n video.muted = false;\n }\n };\n\n handleBackOnClick: () => void = () => {\n this.exitFullscreen();\n };\n\n skipVideo = (direction: SkipDirection, event: SyntheticKeyboardEvent<HTMLElement>) => {\n const { video } = this;\n\n if (!video || isNaN(video.duration)) {\n return;\n }\n\n const { currentTime, duration } = video;\n const { value } = getSkippingTypeAndValue(direction, event);\n\n let time = currentTime + value;\n if (time < 0) {\n time = 0;\n } else if (time > duration) {\n time = duration;\n }\n\n video.currentTime = time;\n };\n\n render(): React.Node {\n const { isMuted } = this.props;\n const { currentIndex, isHidden, isMaskHidden, isMaskReduced, trailerUrlList } = this.state;\n\n if (isHidden || !trailerUrlList || currentIndex === -1) {\n return false;\n }\n\n const url = trailerUrlList[currentIndex];\n\n const maskElement = isMaskHidden ? null : <div className={clsx('mask', isMaskReduced && 'reduced')} />;\n\n return (\n <div\n className='videoCarousel'\n ref={(instance) => {\n this.videoContainer = instance;\n }}\n >\n <video\n controlsList='nofullscreen nodownload noremoteplayback'\n muted={isMuted}\n onDoubleClick={this.handleOnDoubleClick}\n onEnded={this.handleOnEnded}\n onPause={this.handleOnPause}\n onPlay={this.handleOnPlay}\n onTimeUpdate={this.handleOnTimeUpdate}\n onVolumeChange={this.handleOnVolumeChange}\n ref={(instance) => {\n this.video = instance;\n }}\n src={url}\n />\n {maskElement}\n <ButtonBack className='backBar' hasText={false} onClick={this.handleBackOnClick} />\n </div>\n );\n }\n}\n\nconst mapStateToProps = (state: CombinedReducers): ReduxVideoCarouselReducerStateType => {\n return {\n gridSectionId: state.ui.gridSectionId,\n isDebugModeEnabled: state.appConfiguration.isDebugModeEnabled,\n isMuted: state.ui.videoCarousel.isMuted,\n isPlaying: state.ui.videoCarousel.isPlaying,\n };\n};\n\nconst mapDispatchToProps = (dispatch: Dispatch): ReduxVideoCarouselDispatchToPropsType => {\n return {\n localUpdateVideoCarouselMuted: () => dispatch(updateVideoCarouselMuted()),\n\n localUpdateVideoCarouselPaused: () => dispatch(updateVideoCarouselPaused()),\n\n localUpdateVideoCarouselPlaying: () => dispatch(updateVideoCarouselPlaying()),\n\n localUpdateVideoCarouselUnmuted: () => dispatch(updateVideoCarouselUnmuted()),\n };\n};\n\nconst VideoCarousel: React.ComponentType<VideoCarouselPropType> = connect(mapStateToProps, mapDispatchToProps, null, { forwardRef: true })(VideoCarouselView);\n\nexport default VideoCarousel;\n","/* @flow */\n\nimport { AVENUE_ID_EXPLORE, AVENUE_ID_MYVIDEOS } from '../../../helpers/ui/avenue/constants';\nimport { AvenueType, type NAVIGATION_AVENUE_TYPE } from '../../../helpers/ui/avenue/types';\nimport type { KeyValuePair } from '@ntg/utils/dist/types';\nimport type { NETGEM_API_V8_HUB } from '../../../libs/netgemLibrary/v8/types/Hub';\n\nconst getAvenueIndexFromId: (avenueList: NETGEM_API_V8_HUB | null, id: string) => number = (avenueList, id) => {\n if (avenueList) {\n return avenueList.findIndex((avenue) => avenue.id === id);\n }\n\n return -1;\n};\n\nconst getAvenueFromIndex: (avenueList: NETGEM_API_V8_HUB, index: number) => NAVIGATION_AVENUE_TYPE = (avenueList, index) => {\n const {\n [index]: { id, title },\n } = avenueList;\n\n let type: AvenueType = AvenueType.Regular;\n if (id === AVENUE_ID_EXPLORE) {\n type = AvenueType.Explore;\n } else if (id === AVENUE_ID_MYVIDEOS) {\n type = AvenueType.Myvideos;\n }\n\n return {\n index,\n title,\n type,\n };\n};\n\nconst getMainAvenue: (avenueList: NETGEM_API_V8_HUB | null) => NAVIGATION_AVENUE_TYPE | null = (avenueList) => {\n if (!avenueList || avenueList.length === 0) {\n return null;\n }\n\n const index = avenueList.findIndex((avenue) => avenue.isMain);\n\n // If main avenue is not defined, the first one is used\n return getAvenueFromIndex(avenueList, index > -1 ? index : 0);\n};\n\nconst removeKeysWithPrefix: (obj: KeyValuePair<number>, prefix?: string) => KeyValuePair<number> = (obj, prefix) => {\n if (typeof prefix !== 'string' || prefix === '') {\n return {};\n }\n\n Object.keys(obj).forEach((key) => {\n if (key.startsWith(prefix)) {\n delete obj[key];\n }\n });\n\n return obj;\n};\n\nexport { getAvenueIndexFromId, getMainAvenue, removeKeysWithPrefix };\n","/* @flow */\n\nimport { DunningStatus, InvoiceStatus, PaymentStatus, type SubscriptionList, SubscriptionStatus, type UserInfo } from '../../redux/appRegistration/types/types';\nimport AccurateTimestamp from '../dateTime/AccurateTimestamp';\nimport LocalStorageManager from '../localStorage/localStorageManager';\nimport { MIN_DATE } from '../dateTime/Format';\nimport { MessengerEvents } from '@ntg/utils/dist/messenger';\nimport { StorageKeys } from '../localStorage/keys';\nimport { logError } from '../debug/debug';\n\nconst hasPaymentExpirationPoppedToday = () => {\n const lastNotification = LocalStorageManager.loadIsoDate(StorageKeys.LastPaymentExpirationNotification, MIN_DATE);\n const now = AccurateTimestamp.nowAsDate();\n return lastNotification.getMonth() === now.getMonth() && lastNotification.getDate() === now.getDate();\n};\n\nconst hasActiveSubscription = (subscriptions: SubscriptionList): boolean =>\n Object.values(subscriptions).some((status) => status === SubscriptionStatus.Active || status === SubscriptionStatus.InTrial || status === SubscriptionStatus.NonRenewing);\n\nconst getUserInfoStatuses: (userInfo: ?UserInfo) => Array<{| key: string, notificationType: string |}> | null = (userInfo) => {\n if (!userInfo?.paymentInfo) {\n logError('No user or payment info');\n return null;\n }\n\n const {\n paymentInfo: { dunningStatus, invoiceStatus, status },\n subscriptions,\n } = userInfo;\n\n const statuses = [];\n\n if (status === PaymentStatus.Expiring && !hasPaymentExpirationPoppedToday()) {\n // Payment method will expire in the current month\n LocalStorageManager.save(StorageKeys.LastPaymentExpirationNotification, AccurateTimestamp.nowAsDate());\n statuses.push({\n key: 'subscription.payment.expire_soon',\n notificationType: MessengerEvents.NOTIFY_WARNING,\n });\n }\n\n if (invoiceStatus === InvoiceStatus.Paid || invoiceStatus === InvoiceStatus.Voided) {\n // Invoice status is OK: no need to check dunning status\n return null;\n }\n\n if (hasActiveSubscription(subscriptions)) {\n // An active subscription exists: no need to check dunning status\n return null;\n }\n\n if (dunningStatus === DunningStatus.InProgress) {\n // Dunning in progress\n statuses.push({\n key: 'subscription.payment.dunning_in_progress',\n notificationType: MessengerEvents.NOTIFY_WARNING,\n });\n } else if (dunningStatus === DunningStatus.Exhausted) {\n // Dunning has expired as well\n statuses.push({\n key: 'subscription.payment.dunning_expired',\n notificationType: MessengerEvents.NOTIFY_ERROR,\n });\n }\n\n // All is well: nothing to report\n return statuses;\n};\n\nconst hasActiveSubscriptionForPlan: (userInfo: UserInfo, planId: string) => boolean = (userInfo, planId) => {\n const { subscriptions } = userInfo;\n\n if (!subscriptions) {\n return false;\n }\n\n const { [planId]: status } = subscriptions;\n\n return status === SubscriptionStatus.Active || status === SubscriptionStatus.InTrial || status === SubscriptionStatus.NonRenewing;\n};\n\nconst hasPods: (userInfo: ?UserInfo) => boolean = (userInfo) => {\n if (!userInfo) {\n logError('No user info');\n return false;\n }\n\n return hasActiveSubscriptionForPlan(userInfo, 'super-stream-2-pods') || hasActiveSubscriptionForPlan(userInfo, 'super-stream-3-pods');\n};\n\nexport { getUserInfoStatuses, hasPods };\n","const isString = obj => typeof obj === 'string';\nconst defer = () => {\n let res;\n let rej;\n const promise = new Promise((resolve, reject) => {\n res = resolve;\n rej = reject;\n });\n promise.resolve = res;\n promise.reject = rej;\n return promise;\n};\nconst makeString = object => {\n if (object == null) return '';\n return '' + object;\n};\nconst copy = (a, s, t) => {\n a.forEach(m => {\n if (s[m]) t[m] = s[m];\n });\n};\nconst lastOfPathSeparatorRegExp = /###/g;\nconst cleanKey = key => key && key.indexOf('###') > -1 ? key.replace(lastOfPathSeparatorRegExp, '.') : key;\nconst canNotTraverseDeeper = object => !object || isString(object);\nconst getLastOfPath = (object, path, Empty) => {\n const stack = !isString(path) ? path : path.split('.');\n let stackIndex = 0;\n while (stackIndex < stack.length - 1) {\n if (canNotTraverseDeeper(object)) return {};\n const key = cleanKey(stack[stackIndex]);\n if (!object[key] && Empty) object[key] = new Empty();\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n object = object[key];\n } else {\n object = {};\n }\n ++stackIndex;\n }\n if (canNotTraverseDeeper(object)) return {};\n return {\n obj: object,\n k: cleanKey(stack[stackIndex])\n };\n};\nconst setPath = (object, path, newValue) => {\n const {\n obj,\n k\n } = getLastOfPath(object, path, Object);\n if (obj !== undefined || path.length === 1) {\n obj[k] = newValue;\n return;\n }\n let e = path[path.length - 1];\n let p = path.slice(0, path.length - 1);\n let last = getLastOfPath(object, p, Object);\n while (last.obj === undefined && p.length) {\n e = `${p[p.length - 1]}.${e}`;\n p = p.slice(0, p.length - 1);\n last = getLastOfPath(object, p, Object);\n if (last && last.obj && typeof last.obj[`${last.k}.${e}`] !== 'undefined') {\n last.obj = undefined;\n }\n }\n last.obj[`${last.k}.${e}`] = newValue;\n};\nconst pushPath = (object, path, newValue, concat) => {\n const {\n obj,\n k\n } = getLastOfPath(object, path, Object);\n obj[k] = obj[k] || [];\n obj[k].push(newValue);\n};\nconst getPath = (object, path) => {\n const {\n obj,\n k\n } = getLastOfPath(object, path);\n if (!obj) return undefined;\n return obj[k];\n};\nconst getPathWithDefaults = (data, defaultData, key) => {\n const value = getPath(data, key);\n if (value !== undefined) {\n return value;\n }\n return getPath(defaultData, key);\n};\nconst deepExtend = (target, source, overwrite) => {\n for (const prop in source) {\n if (prop !== '__proto__' && prop !== 'constructor') {\n if (prop in target) {\n if (isString(target[prop]) || target[prop] instanceof String || isString(source[prop]) || source[prop] instanceof String) {\n if (overwrite) target[prop] = source[prop];\n } else {\n deepExtend(target[prop], source[prop], overwrite);\n }\n } else {\n target[prop] = source[prop];\n }\n }\n }\n return target;\n};\nconst regexEscape = str => str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, '\\\\$&');\nvar _entityMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '/': '/'\n};\nconst escape = data => {\n if (isString(data)) {\n return data.replace(/[&<>\"'\\/]/g, s => _entityMap[s]);\n }\n return data;\n};\nclass RegExpCache {\n constructor(capacity) {\n this.capacity = capacity;\n this.regExpMap = new Map();\n this.regExpQueue = [];\n }\n getRegExp(pattern) {\n const regExpFromCache = this.regExpMap.get(pattern);\n if (regExpFromCache !== undefined) {\n return regExpFromCache;\n }\n const regExpNew = new RegExp(pattern);\n if (this.regExpQueue.length === this.capacity) {\n this.regExpMap.delete(this.regExpQueue.shift());\n }\n this.regExpMap.set(pattern, regExpNew);\n this.regExpQueue.push(pattern);\n return regExpNew;\n }\n}\nconst chars = [' ', ',', '?', '!', ';'];\nconst looksLikeObjectPathRegExpCache = new RegExpCache(20);\nconst looksLikeObjectPath = (key, nsSeparator, keySeparator) => {\n nsSeparator = nsSeparator || '';\n keySeparator = keySeparator || '';\n const possibleChars = chars.filter(c => nsSeparator.indexOf(c) < 0 && keySeparator.indexOf(c) < 0);\n if (possibleChars.length === 0) return true;\n const r = looksLikeObjectPathRegExpCache.getRegExp(`(${possibleChars.map(c => c === '?' ? '\\\\?' : c).join('|')})`);\n let matched = !r.test(key);\n if (!matched) {\n const ki = key.indexOf(keySeparator);\n if (ki > 0 && !r.test(key.substring(0, ki))) {\n matched = true;\n }\n }\n return matched;\n};\nconst deepFind = function (obj, path) {\n let keySeparator = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '.';\n if (!obj) return undefined;\n if (obj[path]) return obj[path];\n const tokens = path.split(keySeparator);\n let current = obj;\n for (let i = 0; i < tokens.length;) {\n if (!current || typeof current !== 'object') {\n return undefined;\n }\n let next;\n let nextPath = '';\n for (let j = i; j < tokens.length; ++j) {\n if (j !== i) {\n nextPath += keySeparator;\n }\n nextPath += tokens[j];\n next = current[nextPath];\n if (next !== undefined) {\n if (['string', 'number', 'boolean'].indexOf(typeof next) > -1 && j < tokens.length - 1) {\n continue;\n }\n i += j - i + 1;\n break;\n }\n }\n current = next;\n }\n return current;\n};\nconst getCleanedCode = code => code && code.replace('_', '-');\n\nconst consoleLogger = {\n type: 'logger',\n log(args) {\n this.output('log', args);\n },\n warn(args) {\n this.output('warn', args);\n },\n error(args) {\n this.output('error', args);\n },\n output(type, args) {\n if (console && console[type]) console[type].apply(console, args);\n }\n};\nclass Logger {\n constructor(concreteLogger) {\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n this.init(concreteLogger, options);\n }\n init(concreteLogger) {\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n this.prefix = options.prefix || 'i18next:';\n this.logger = concreteLogger || consoleLogger;\n this.options = options;\n this.debug = options.debug;\n }\n log() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n return this.forward(args, 'log', '', true);\n }\n warn() {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n return this.forward(args, 'warn', '', true);\n }\n error() {\n for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n args[_key3] = arguments[_key3];\n }\n return this.forward(args, 'error', '');\n }\n deprecate() {\n for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n args[_key4] = arguments[_key4];\n }\n return this.forward(args, 'warn', 'WARNING DEPRECATED: ', true);\n }\n forward(args, lvl, prefix, debugOnly) {\n if (debugOnly && !this.debug) return null;\n if (isString(args[0])) args[0] = `${prefix}${this.prefix} ${args[0]}`;\n return this.logger[lvl](args);\n }\n create(moduleName) {\n return new Logger(this.logger, {\n ...{\n prefix: `${this.prefix}:${moduleName}:`\n },\n ...this.options\n });\n }\n clone(options) {\n options = options || this.options;\n options.prefix = options.prefix || this.prefix;\n return new Logger(this.logger, options);\n }\n}\nvar baseLogger = new Logger();\n\nclass EventEmitter {\n constructor() {\n this.observers = {};\n }\n on(events, listener) {\n events.split(' ').forEach(event => {\n if (!this.observers[event]) this.observers[event] = new Map();\n const numListeners = this.observers[event].get(listener) || 0;\n this.observers[event].set(listener, numListeners + 1);\n });\n return this;\n }\n off(event, listener) {\n if (!this.observers[event]) return;\n if (!listener) {\n delete this.observers[event];\n return;\n }\n this.observers[event].delete(listener);\n }\n emit(event) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n if (this.observers[event]) {\n const cloned = Array.from(this.observers[event].entries());\n cloned.forEach(_ref => {\n let [observer, numTimesAdded] = _ref;\n for (let i = 0; i < numTimesAdded; i++) {\n observer(...args);\n }\n });\n }\n if (this.observers['*']) {\n const cloned = Array.from(this.observers['*'].entries());\n cloned.forEach(_ref2 => {\n let [observer, numTimesAdded] = _ref2;\n for (let i = 0; i < numTimesAdded; i++) {\n observer.apply(observer, [event, ...args]);\n }\n });\n }\n }\n}\n\nclass ResourceStore extends EventEmitter {\n constructor(data) {\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n ns: ['translation'],\n defaultNS: 'translation'\n };\n super();\n this.data = data || {};\n this.options = options;\n if (this.options.keySeparator === undefined) {\n this.options.keySeparator = '.';\n }\n if (this.options.ignoreJSONStructure === undefined) {\n this.options.ignoreJSONStructure = true;\n }\n }\n addNamespaces(ns) {\n if (this.options.ns.indexOf(ns) < 0) {\n this.options.ns.push(ns);\n }\n }\n removeNamespaces(ns) {\n const index = this.options.ns.indexOf(ns);\n if (index > -1) {\n this.options.ns.splice(index, 1);\n }\n }\n getResource(lng, ns, key) {\n let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n const keySeparator = options.keySeparator !== undefined ? options.keySeparator : this.options.keySeparator;\n const ignoreJSONStructure = options.ignoreJSONStructure !== undefined ? options.ignoreJSONStructure : this.options.ignoreJSONStructure;\n let path;\n if (lng.indexOf('.') > -1) {\n path = lng.split('.');\n } else {\n path = [lng, ns];\n if (key) {\n if (Array.isArray(key)) {\n path.push(...key);\n } else if (isString(key) && keySeparator) {\n path.push(...key.split(keySeparator));\n } else {\n path.push(key);\n }\n }\n }\n const result = getPath(this.data, path);\n if (!result && !ns && !key && lng.indexOf('.') > -1) {\n lng = path[0];\n ns = path[1];\n key = path.slice(2).join('.');\n }\n if (result || !ignoreJSONStructure || !isString(key)) return result;\n return deepFind(this.data && this.data[lng] && this.data[lng][ns], key, keySeparator);\n }\n addResource(lng, ns, key, value) {\n let options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {\n silent: false\n };\n const keySeparator = options.keySeparator !== undefined ? options.keySeparator : this.options.keySeparator;\n let path = [lng, ns];\n if (key) path = path.concat(keySeparator ? key.split(keySeparator) : key);\n if (lng.indexOf('.') > -1) {\n path = lng.split('.');\n value = ns;\n ns = path[1];\n }\n this.addNamespaces(ns);\n setPath(this.data, path, value);\n if (!options.silent) this.emit('added', lng, ns, key, value);\n }\n addResources(lng, ns, resources) {\n let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {\n silent: false\n };\n for (const m in resources) {\n if (isString(resources[m]) || Array.isArray(resources[m])) this.addResource(lng, ns, m, resources[m], {\n silent: true\n });\n }\n if (!options.silent) this.emit('added', lng, ns, resources);\n }\n addResourceBundle(lng, ns, resources, deep, overwrite) {\n let options = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {\n silent: false,\n skipCopy: false\n };\n let path = [lng, ns];\n if (lng.indexOf('.') > -1) {\n path = lng.split('.');\n deep = resources;\n resources = ns;\n ns = path[1];\n }\n this.addNamespaces(ns);\n let pack = getPath(this.data, path) || {};\n if (!options.skipCopy) resources = JSON.parse(JSON.stringify(resources));\n if (deep) {\n deepExtend(pack, resources, overwrite);\n } else {\n pack = {\n ...pack,\n ...resources\n };\n }\n setPath(this.data, path, pack);\n if (!options.silent) this.emit('added', lng, ns, resources);\n }\n removeResourceBundle(lng, ns) {\n if (this.hasResourceBundle(lng, ns)) {\n delete this.data[lng][ns];\n }\n this.removeNamespaces(ns);\n this.emit('removed', lng, ns);\n }\n hasResourceBundle(lng, ns) {\n return this.getResource(lng, ns) !== undefined;\n }\n getResourceBundle(lng, ns) {\n if (!ns) ns = this.options.defaultNS;\n if (this.options.compatibilityAPI === 'v1') return {\n ...{},\n ...this.getResource(lng, ns)\n };\n return this.getResource(lng, ns);\n }\n getDataByLanguage(lng) {\n return this.data[lng];\n }\n hasLanguageSomeTranslations(lng) {\n const data = this.getDataByLanguage(lng);\n const n = data && Object.keys(data) || [];\n return !!n.find(v => data[v] && Object.keys(data[v]).length > 0);\n }\n toJSON() {\n return this.data;\n }\n}\n\nvar postProcessor = {\n processors: {},\n addPostProcessor(module) {\n this.processors[module.name] = module;\n },\n handle(processors, value, key, options, translator) {\n processors.forEach(processor => {\n if (this.processors[processor]) value = this.processors[processor].process(value, key, options, translator);\n });\n return value;\n }\n};\n\nconst checkedLoadedFor = {};\nclass Translator extends EventEmitter {\n constructor(services) {\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n super();\n copy(['resourceStore', 'languageUtils', 'pluralResolver', 'interpolator', 'backendConnector', 'i18nFormat', 'utils'], services, this);\n this.options = options;\n if (this.options.keySeparator === undefined) {\n this.options.keySeparator = '.';\n }\n this.logger = baseLogger.create('translator');\n }\n changeLanguage(lng) {\n if (lng) this.language = lng;\n }\n exists(key) {\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n interpolation: {}\n };\n if (key === undefined || key === null) {\n return false;\n }\n const resolved = this.resolve(key, options);\n return resolved && resolved.res !== undefined;\n }\n extractFromKey(key, options) {\n let nsSeparator = options.nsSeparator !== undefined ? options.nsSeparator : this.options.nsSeparator;\n if (nsSeparator === undefined) nsSeparator = ':';\n const keySeparator = options.keySeparator !== undefined ? options.keySeparator : this.options.keySeparator;\n let namespaces = options.ns || this.options.defaultNS || [];\n const wouldCheckForNsInKey = nsSeparator && key.indexOf(nsSeparator) > -1;\n const seemsNaturalLanguage = !this.options.userDefinedKeySeparator && !options.keySeparator && !this.options.userDefinedNsSeparator && !options.nsSeparator && !looksLikeObjectPath(key, nsSeparator, keySeparator);\n if (wouldCheckForNsInKey && !seemsNaturalLanguage) {\n const m = key.match(this.interpolator.nestingRegexp);\n if (m && m.length > 0) {\n return {\n key,\n namespaces: isString(namespaces) ? [namespaces] : namespaces\n };\n }\n const parts = key.split(nsSeparator);\n if (nsSeparator !== keySeparator || nsSeparator === keySeparator && this.options.ns.indexOf(parts[0]) > -1) namespaces = parts.shift();\n key = parts.join(keySeparator);\n }\n return {\n key,\n namespaces: isString(namespaces) ? [namespaces] : namespaces\n };\n }\n translate(keys, options, lastKey) {\n if (typeof options !== 'object' && this.options.overloadTranslationOptionHandler) {\n options = this.options.overloadTranslationOptionHandler(arguments);\n }\n if (typeof options === 'object') options = {\n ...options\n };\n if (!options) options = {};\n if (keys === undefined || keys === null) return '';\n if (!Array.isArray(keys)) keys = [String(keys)];\n const returnDetails = options.returnDetails !== undefined ? options.returnDetails : this.options.returnDetails;\n const keySeparator = options.keySeparator !== undefined ? options.keySeparator : this.options.keySeparator;\n const {\n key,\n namespaces\n } = this.extractFromKey(keys[keys.length - 1], options);\n const namespace = namespaces[namespaces.length - 1];\n const lng = options.lng || this.language;\n const appendNamespaceToCIMode = options.appendNamespaceToCIMode || this.options.appendNamespaceToCIMode;\n if (lng && lng.toLowerCase() === 'cimode') {\n if (appendNamespaceToCIMode) {\n const nsSeparator = options.nsSeparator || this.options.nsSeparator;\n if (returnDetails) {\n return {\n res: `${namespace}${nsSeparator}${key}`,\n usedKey: key,\n exactUsedKey: key,\n usedLng: lng,\n usedNS: namespace,\n usedParams: this.getUsedParamsDetails(options)\n };\n }\n return `${namespace}${nsSeparator}${key}`;\n }\n if (returnDetails) {\n return {\n res: key,\n usedKey: key,\n exactUsedKey: key,\n usedLng: lng,\n usedNS: namespace,\n usedParams: this.getUsedParamsDetails(options)\n };\n }\n return key;\n }\n const resolved = this.resolve(keys, options);\n let res = resolved && resolved.res;\n const resUsedKey = resolved && resolved.usedKey || key;\n const resExactUsedKey = resolved && resolved.exactUsedKey || key;\n const resType = Object.prototype.toString.apply(res);\n const noObject = ['[object Number]', '[object Function]', '[object RegExp]'];\n const joinArrays = options.joinArrays !== undefined ? options.joinArrays : this.options.joinArrays;\n const handleAsObjectInI18nFormat = !this.i18nFormat || this.i18nFormat.handleAsObject;\n const handleAsObject = !isString(res) && typeof res !== 'boolean' && typeof res !== 'number';\n if (handleAsObjectInI18nFormat && res && handleAsObject && noObject.indexOf(resType) < 0 && !(isString(joinArrays) && Array.isArray(res))) {\n if (!options.returnObjects && !this.options.returnObjects) {\n if (!this.options.returnedObjectHandler) {\n this.logger.warn('accessing an object - but returnObjects options is not enabled!');\n }\n const r = this.options.returnedObjectHandler ? this.options.returnedObjectHandler(resUsedKey, res, {\n ...options,\n ns: namespaces\n }) : `key '${key} (${this.language})' returned an object instead of string.`;\n if (returnDetails) {\n resolved.res = r;\n resolved.usedParams = this.getUsedParamsDetails(options);\n return resolved;\n }\n return r;\n }\n if (keySeparator) {\n const resTypeIsArray = Array.isArray(res);\n const copy = resTypeIsArray ? [] : {};\n const newKeyToUse = resTypeIsArray ? resExactUsedKey : resUsedKey;\n for (const m in res) {\n if (Object.prototype.hasOwnProperty.call(res, m)) {\n const deepKey = `${newKeyToUse}${keySeparator}${m}`;\n copy[m] = this.translate(deepKey, {\n ...options,\n ...{\n joinArrays: false,\n ns: namespaces\n }\n });\n if (copy[m] === deepKey) copy[m] = res[m];\n }\n }\n res = copy;\n }\n } else if (handleAsObjectInI18nFormat && isString(joinArrays) && Array.isArray(res)) {\n res = res.join(joinArrays);\n if (res) res = this.extendTranslation(res, keys, options, lastKey);\n } else {\n let usedDefault = false;\n let usedKey = false;\n const needsPluralHandling = options.count !== undefined && !isString(options.count);\n const hasDefaultValue = Translator.hasDefaultValue(options);\n const defaultValueSuffix = needsPluralHandling ? this.pluralResolver.getSuffix(lng, options.count, options) : '';\n const defaultValueSuffixOrdinalFallback = options.ordinal && needsPluralHandling ? this.pluralResolver.getSuffix(lng, options.count, {\n ordinal: false\n }) : '';\n const needsZeroSuffixLookup = needsPluralHandling && !options.ordinal && options.count === 0 && this.pluralResolver.shouldUseIntlApi();\n const defaultValue = needsZeroSuffixLookup && options[`defaultValue${this.options.pluralSeparator}zero`] || options[`defaultValue${defaultValueSuffix}`] || options[`defaultValue${defaultValueSuffixOrdinalFallback}`] || options.defaultValue;\n if (!this.isValidLookup(res) && hasDefaultValue) {\n usedDefault = true;\n res = defaultValue;\n }\n if (!this.isValidLookup(res)) {\n usedKey = true;\n res = key;\n }\n const missingKeyNoValueFallbackToKey = options.missingKeyNoValueFallbackToKey || this.options.missingKeyNoValueFallbackToKey;\n const resForMissing = missingKeyNoValueFallbackToKey && usedKey ? undefined : res;\n const updateMissing = hasDefaultValue && defaultValue !== res && this.options.updateMissing;\n if (usedKey || usedDefault || updateMissing) {\n this.logger.log(updateMissing ? 'updateKey' : 'missingKey', lng, namespace, key, updateMissing ? defaultValue : res);\n if (keySeparator) {\n const fk = this.resolve(key, {\n ...options,\n keySeparator: false\n });\n if (fk && fk.res) this.logger.warn('Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.');\n }\n let lngs = [];\n const fallbackLngs = this.languageUtils.getFallbackCodes(this.options.fallbackLng, options.lng || this.language);\n if (this.options.saveMissingTo === 'fallback' && fallbackLngs && fallbackLngs[0]) {\n for (let i = 0; i < fallbackLngs.length; i++) {\n lngs.push(fallbackLngs[i]);\n }\n } else if (this.options.saveMissingTo === 'all') {\n lngs = this.languageUtils.toResolveHierarchy(options.lng || this.language);\n } else {\n lngs.push(options.lng || this.language);\n }\n const send = (l, k, specificDefaultValue) => {\n const defaultForMissing = hasDefaultValue && specificDefaultValue !== res ? specificDefaultValue : resForMissing;\n if (this.options.missingKeyHandler) {\n this.options.missingKeyHandler(l, namespace, k, defaultForMissing, updateMissing, options);\n } else if (this.backendConnector && this.backendConnector.saveMissing) {\n this.backendConnector.saveMissing(l, namespace, k, defaultForMissing, updateMissing, options);\n }\n this.emit('missingKey', l, namespace, k, res);\n };\n if (this.options.saveMissing) {\n if (this.options.saveMissingPlurals && needsPluralHandling) {\n lngs.forEach(language => {\n const suffixes = this.pluralResolver.getSuffixes(language, options);\n if (needsZeroSuffixLookup && options[`defaultValue${this.options.pluralSeparator}zero`] && suffixes.indexOf(`${this.options.pluralSeparator}zero`) < 0) {\n suffixes.push(`${this.options.pluralSeparator}zero`);\n }\n suffixes.forEach(suffix => {\n send([language], key + suffix, options[`defaultValue${suffix}`] || defaultValue);\n });\n });\n } else {\n send(lngs, key, defaultValue);\n }\n }\n }\n res = this.extendTranslation(res, keys, options, resolved, lastKey);\n if (usedKey && res === key && this.options.appendNamespaceToMissingKey) res = `${namespace}:${key}`;\n if ((usedKey || usedDefault) && this.options.parseMissingKeyHandler) {\n if (this.options.compatibilityAPI !== 'v1') {\n res = this.options.parseMissingKeyHandler(this.options.appendNamespaceToMissingKey ? `${namespace}:${key}` : key, usedDefault ? res : undefined);\n } else {\n res = this.options.parseMissingKeyHandler(res);\n }\n }\n }\n if (returnDetails) {\n resolved.res = res;\n resolved.usedParams = this.getUsedParamsDetails(options);\n return resolved;\n }\n return res;\n }\n extendTranslation(res, key, options, resolved, lastKey) {\n var _this = this;\n if (this.i18nFormat && this.i18nFormat.parse) {\n res = this.i18nFormat.parse(res, {\n ...this.options.interpolation.defaultVariables,\n ...options\n }, options.lng || this.language || resolved.usedLng, resolved.usedNS, resolved.usedKey, {\n resolved\n });\n } else if (!options.skipInterpolation) {\n if (options.interpolation) this.interpolator.init({\n ...options,\n ...{\n interpolation: {\n ...this.options.interpolation,\n ...options.interpolation\n }\n }\n });\n const skipOnVariables = isString(res) && (options && options.interpolation && options.interpolation.skipOnVariables !== undefined ? options.interpolation.skipOnVariables : this.options.interpolation.skipOnVariables);\n let nestBef;\n if (skipOnVariables) {\n const nb = res.match(this.interpolator.nestingRegexp);\n nestBef = nb && nb.length;\n }\n let data = options.replace && !isString(options.replace) ? options.replace : options;\n if (this.options.interpolation.defaultVariables) data = {\n ...this.options.interpolation.defaultVariables,\n ...data\n };\n res = this.interpolator.interpolate(res, data, options.lng || this.language || resolved.usedLng, options);\n if (skipOnVariables) {\n const na = res.match(this.interpolator.nestingRegexp);\n const nestAft = na && na.length;\n if (nestBef < nestAft) options.nest = false;\n }\n if (!options.lng && this.options.compatibilityAPI !== 'v1' && resolved && resolved.res) options.lng = this.language || resolved.usedLng;\n if (options.nest !== false) res = this.interpolator.nest(res, function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (lastKey && lastKey[0] === args[0] && !options.context) {\n _this.logger.warn(`It seems you are nesting recursively key: ${args[0]} in key: ${key[0]}`);\n return null;\n }\n return _this.translate(...args, key);\n }, options);\n if (options.interpolation) this.interpolator.reset();\n }\n const postProcess = options.postProcess || this.options.postProcess;\n const postProcessorNames = isString(postProcess) ? [postProcess] : postProcess;\n if (res !== undefined && res !== null && postProcessorNames && postProcessorNames.length && options.applyPostProcessor !== false) {\n res = postProcessor.handle(postProcessorNames, res, key, this.options && this.options.postProcessPassResolved ? {\n i18nResolved: {\n ...resolved,\n usedParams: this.getUsedParamsDetails(options)\n },\n ...options\n } : options, this);\n }\n return res;\n }\n resolve(keys) {\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n let found;\n let usedKey;\n let exactUsedKey;\n let usedLng;\n let usedNS;\n if (isString(keys)) keys = [keys];\n keys.forEach(k => {\n if (this.isValidLookup(found)) return;\n const extracted = this.extractFromKey(k, options);\n const key = extracted.key;\n usedKey = key;\n let namespaces = extracted.namespaces;\n if (this.options.fallbackNS) namespaces = namespaces.concat(this.options.fallbackNS);\n const needsPluralHandling = options.count !== undefined && !isString(options.count);\n const needsZeroSuffixLookup = needsPluralHandling && !options.ordinal && options.count === 0 && this.pluralResolver.shouldUseIntlApi();\n const needsContextHandling = options.context !== undefined && (isString(options.context) || typeof options.context === 'number') && options.context !== '';\n const codes = options.lngs ? options.lngs : this.languageUtils.toResolveHierarchy(options.lng || this.language, options.fallbackLng);\n namespaces.forEach(ns => {\n if (this.isValidLookup(found)) return;\n usedNS = ns;\n if (!checkedLoadedFor[`${codes[0]}-${ns}`] && this.utils && this.utils.hasLoadedNamespace && !this.utils.hasLoadedNamespace(usedNS)) {\n checkedLoadedFor[`${codes[0]}-${ns}`] = true;\n this.logger.warn(`key \"${usedKey}\" for languages \"${codes.join(', ')}\" won't get resolved as namespace \"${usedNS}\" was not yet loaded`, 'This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!');\n }\n codes.forEach(code => {\n if (this.isValidLookup(found)) return;\n usedLng = code;\n const finalKeys = [key];\n if (this.i18nFormat && this.i18nFormat.addLookupKeys) {\n this.i18nFormat.addLookupKeys(finalKeys, key, code, ns, options);\n } else {\n let pluralSuffix;\n if (needsPluralHandling) pluralSuffix = this.pluralResolver.getSuffix(code, options.count, options);\n const zeroSuffix = `${this.options.pluralSeparator}zero`;\n const ordinalPrefix = `${this.options.pluralSeparator}ordinal${this.options.pluralSeparator}`;\n if (needsPluralHandling) {\n finalKeys.push(key + pluralSuffix);\n if (options.ordinal && pluralSuffix.indexOf(ordinalPrefix) === 0) {\n finalKeys.push(key + pluralSuffix.replace(ordinalPrefix, this.options.pluralSeparator));\n }\n if (needsZeroSuffixLookup) {\n finalKeys.push(key + zeroSuffix);\n }\n }\n if (needsContextHandling) {\n const contextKey = `${key}${this.options.contextSeparator}${options.context}`;\n finalKeys.push(contextKey);\n if (needsPluralHandling) {\n finalKeys.push(contextKey + pluralSuffix);\n if (options.ordinal && pluralSuffix.indexOf(ordinalPrefix) === 0) {\n finalKeys.push(contextKey + pluralSuffix.replace(ordinalPrefix, this.options.pluralSeparator));\n }\n if (needsZeroSuffixLookup) {\n finalKeys.push(contextKey + zeroSuffix);\n }\n }\n }\n }\n let possibleKey;\n while (possibleKey = finalKeys.pop()) {\n if (!this.isValidLookup(found)) {\n exactUsedKey = possibleKey;\n found = this.getResource(code, ns, possibleKey, options);\n }\n }\n });\n });\n });\n return {\n res: found,\n usedKey,\n exactUsedKey,\n usedLng,\n usedNS\n };\n }\n isValidLookup(res) {\n return res !== undefined && !(!this.options.returnNull && res === null) && !(!this.options.returnEmptyString && res === '');\n }\n getResource(code, ns, key) {\n let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n if (this.i18nFormat && this.i18nFormat.getResource) return this.i18nFormat.getResource(code, ns, key, options);\n return this.resourceStore.getResource(code, ns, key, options);\n }\n getUsedParamsDetails() {\n let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n const optionsKeys = ['defaultValue', 'ordinal', 'context', 'replace', 'lng', 'lngs', 'fallbackLng', 'ns', 'keySeparator', 'nsSeparator', 'returnObjects', 'returnDetails', 'joinArrays', 'postProcess', 'interpolation'];\n const useOptionsReplaceForData = options.replace && !isString(options.replace);\n let data = useOptionsReplaceForData ? options.replace : options;\n if (useOptionsReplaceForData && typeof options.count !== 'undefined') {\n data.count = options.count;\n }\n if (this.options.interpolation.defaultVariables) {\n data = {\n ...this.options.interpolation.defaultVariables,\n ...data\n };\n }\n if (!useOptionsReplaceForData) {\n data = {\n ...data\n };\n for (const key of optionsKeys) {\n delete data[key];\n }\n }\n return data;\n }\n static hasDefaultValue(options) {\n const prefix = 'defaultValue';\n for (const option in options) {\n if (Object.prototype.hasOwnProperty.call(options, option) && prefix === option.substring(0, prefix.length) && undefined !== options[option]) {\n return true;\n }\n }\n return false;\n }\n}\n\nconst capitalize = string => string.charAt(0).toUpperCase() + string.slice(1);\nclass LanguageUtil {\n constructor(options) {\n this.options = options;\n this.supportedLngs = this.options.supportedLngs || false;\n this.logger = baseLogger.create('languageUtils');\n }\n getScriptPartFromCode(code) {\n code = getCleanedCode(code);\n if (!code || code.indexOf('-') < 0) return null;\n const p = code.split('-');\n if (p.length === 2) return null;\n p.pop();\n if (p[p.length - 1].toLowerCase() === 'x') return null;\n return this.formatLanguageCode(p.join('-'));\n }\n getLanguagePartFromCode(code) {\n code = getCleanedCode(code);\n if (!code || code.indexOf('-') < 0) return code;\n const p = code.split('-');\n return this.formatLanguageCode(p[0]);\n }\n formatLanguageCode(code) {\n if (isString(code) && code.indexOf('-') > -1) {\n if (typeof Intl !== 'undefined' && typeof Intl.getCanonicalLocales !== 'undefined') {\n try {\n let formattedCode = Intl.getCanonicalLocales(code)[0];\n if (formattedCode && this.options.lowerCaseLng) {\n formattedCode = formattedCode.toLowerCase();\n }\n if (formattedCode) return formattedCode;\n } catch (e) {}\n }\n const specialCases = ['hans', 'hant', 'latn', 'cyrl', 'cans', 'mong', 'arab'];\n let p = code.split('-');\n if (this.options.lowerCaseLng) {\n p = p.map(part => part.toLowerCase());\n } else if (p.length === 2) {\n p[0] = p[0].toLowerCase();\n p[1] = p[1].toUpperCase();\n if (specialCases.indexOf(p[1].toLowerCase()) > -1) p[1] = capitalize(p[1].toLowerCase());\n } else if (p.length === 3) {\n p[0] = p[0].toLowerCase();\n if (p[1].length === 2) p[1] = p[1].toUpperCase();\n if (p[0] !== 'sgn' && p[2].length === 2) p[2] = p[2].toUpperCase();\n if (specialCases.indexOf(p[1].toLowerCase()) > -1) p[1] = capitalize(p[1].toLowerCase());\n if (specialCases.indexOf(p[2].toLowerCase()) > -1) p[2] = capitalize(p[2].toLowerCase());\n }\n return p.join('-');\n }\n return this.options.cleanCode || this.options.lowerCaseLng ? code.toLowerCase() : code;\n }\n isSupportedCode(code) {\n if (this.options.load === 'languageOnly' || this.options.nonExplicitSupportedLngs) {\n code = this.getLanguagePartFromCode(code);\n }\n return !this.supportedLngs || !this.supportedLngs.length || this.supportedLngs.indexOf(code) > -1;\n }\n getBestMatchFromCodes(codes) {\n if (!codes) return null;\n let found;\n codes.forEach(code => {\n if (found) return;\n const cleanedLng = this.formatLanguageCode(code);\n if (!this.options.supportedLngs || this.isSupportedCode(cleanedLng)) found = cleanedLng;\n });\n if (!found && this.options.supportedLngs) {\n codes.forEach(code => {\n if (found) return;\n const lngOnly = this.getLanguagePartFromCode(code);\n if (this.isSupportedCode(lngOnly)) return found = lngOnly;\n found = this.options.supportedLngs.find(supportedLng => {\n if (supportedLng === lngOnly) return supportedLng;\n if (supportedLng.indexOf('-') < 0 && lngOnly.indexOf('-') < 0) return;\n if (supportedLng.indexOf('-') > 0 && lngOnly.indexOf('-') < 0 && supportedLng.substring(0, supportedLng.indexOf('-')) === lngOnly) return supportedLng;\n if (supportedLng.indexOf(lngOnly) === 0 && lngOnly.length > 1) return supportedLng;\n });\n });\n }\n if (!found) found = this.getFallbackCodes(this.options.fallbackLng)[0];\n return found;\n }\n getFallbackCodes(fallbacks, code) {\n if (!fallbacks) return [];\n if (typeof fallbacks === 'function') fallbacks = fallbacks(code);\n if (isString(fallbacks)) fallbacks = [fallbacks];\n if (Array.isArray(fallbacks)) return fallbacks;\n if (!code) return fallbacks.default || [];\n let found = fallbacks[code];\n if (!found) found = fallbacks[this.getScriptPartFromCode(code)];\n if (!found) found = fallbacks[this.formatLanguageCode(code)];\n if (!found) found = fallbacks[this.getLanguagePartFromCode(code)];\n if (!found) found = fallbacks.default;\n return found || [];\n }\n toResolveHierarchy(code, fallbackCode) {\n const fallbackCodes = this.getFallbackCodes(fallbackCode || this.options.fallbackLng || [], code);\n const codes = [];\n const addCode = c => {\n if (!c) return;\n if (this.isSupportedCode(c)) {\n codes.push(c);\n } else {\n this.logger.warn(`rejecting language code not found in supportedLngs: ${c}`);\n }\n };\n if (isString(code) && (code.indexOf('-') > -1 || code.indexOf('_') > -1)) {\n if (this.options.load !== 'languageOnly') addCode(this.formatLanguageCode(code));\n if (this.options.load !== 'languageOnly' && this.options.load !== 'currentOnly') addCode(this.getScriptPartFromCode(code));\n if (this.options.load !== 'currentOnly') addCode(this.getLanguagePartFromCode(code));\n } else if (isString(code)) {\n addCode(this.formatLanguageCode(code));\n }\n fallbackCodes.forEach(fc => {\n if (codes.indexOf(fc) < 0) addCode(this.formatLanguageCode(fc));\n });\n return codes;\n }\n}\n\nlet sets = [{\n lngs: ['ach', 'ak', 'am', 'arn', 'br', 'fil', 'gun', 'ln', 'mfe', 'mg', 'mi', 'oc', 'pt', 'pt-BR', 'tg', 'tl', 'ti', 'tr', 'uz', 'wa'],\n nr: [1, 2],\n fc: 1\n}, {\n lngs: ['af', 'an', 'ast', 'az', 'bg', 'bn', 'ca', 'da', 'de', 'dev', 'el', 'en', 'eo', 'es', 'et', 'eu', 'fi', 'fo', 'fur', 'fy', 'gl', 'gu', 'ha', 'hi', 'hu', 'hy', 'ia', 'it', 'kk', 'kn', 'ku', 'lb', 'mai', 'ml', 'mn', 'mr', 'nah', 'nap', 'nb', 'ne', 'nl', 'nn', 'no', 'nso', 'pa', 'pap', 'pms', 'ps', 'pt-PT', 'rm', 'sco', 'se', 'si', 'so', 'son', 'sq', 'sv', 'sw', 'ta', 'te', 'tk', 'ur', 'yo'],\n nr: [1, 2],\n fc: 2\n}, {\n lngs: ['ay', 'bo', 'cgg', 'fa', 'ht', 'id', 'ja', 'jbo', 'ka', 'km', 'ko', 'ky', 'lo', 'ms', 'sah', 'su', 'th', 'tt', 'ug', 'vi', 'wo', 'zh'],\n nr: [1],\n fc: 3\n}, {\n lngs: ['be', 'bs', 'cnr', 'dz', 'hr', 'ru', 'sr', 'uk'],\n nr: [1, 2, 5],\n fc: 4\n}, {\n lngs: ['ar'],\n nr: [0, 1, 2, 3, 11, 100],\n fc: 5\n}, {\n lngs: ['cs', 'sk'],\n nr: [1, 2, 5],\n fc: 6\n}, {\n lngs: ['csb', 'pl'],\n nr: [1, 2, 5],\n fc: 7\n}, {\n lngs: ['cy'],\n nr: [1, 2, 3, 8],\n fc: 8\n}, {\n lngs: ['fr'],\n nr: [1, 2],\n fc: 9\n}, {\n lngs: ['ga'],\n nr: [1, 2, 3, 7, 11],\n fc: 10\n}, {\n lngs: ['gd'],\n nr: [1, 2, 3, 20],\n fc: 11\n}, {\n lngs: ['is'],\n nr: [1, 2],\n fc: 12\n}, {\n lngs: ['jv'],\n nr: [0, 1],\n fc: 13\n}, {\n lngs: ['kw'],\n nr: [1, 2, 3, 4],\n fc: 14\n}, {\n lngs: ['lt'],\n nr: [1, 2, 10],\n fc: 15\n}, {\n lngs: ['lv'],\n nr: [1, 2, 0],\n fc: 16\n}, {\n lngs: ['mk'],\n nr: [1, 2],\n fc: 17\n}, {\n lngs: ['mnk'],\n nr: [0, 1, 2],\n fc: 18\n}, {\n lngs: ['mt'],\n nr: [1, 2, 11, 20],\n fc: 19\n}, {\n lngs: ['or'],\n nr: [2, 1],\n fc: 2\n}, {\n lngs: ['ro'],\n nr: [1, 2, 20],\n fc: 20\n}, {\n lngs: ['sl'],\n nr: [5, 1, 2, 3],\n fc: 21\n}, {\n lngs: ['he', 'iw'],\n nr: [1, 2, 20, 21],\n fc: 22\n}];\nlet _rulesPluralsTypes = {\n 1: n => Number(n > 1),\n 2: n => Number(n != 1),\n 3: n => 0,\n 4: n => Number(n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2),\n 5: n => Number(n == 0 ? 0 : n == 1 ? 1 : n == 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5),\n 6: n => Number(n == 1 ? 0 : n >= 2 && n <= 4 ? 1 : 2),\n 7: n => Number(n == 1 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2),\n 8: n => Number(n == 1 ? 0 : n == 2 ? 1 : n != 8 && n != 11 ? 2 : 3),\n 9: n => Number(n >= 2),\n 10: n => Number(n == 1 ? 0 : n == 2 ? 1 : n < 7 ? 2 : n < 11 ? 3 : 4),\n 11: n => Number(n == 1 || n == 11 ? 0 : n == 2 || n == 12 ? 1 : n > 2 && n < 20 ? 2 : 3),\n 12: n => Number(n % 10 != 1 || n % 100 == 11),\n 13: n => Number(n !== 0),\n 14: n => Number(n == 1 ? 0 : n == 2 ? 1 : n == 3 ? 2 : 3),\n 15: n => Number(n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2),\n 16: n => Number(n % 10 == 1 && n % 100 != 11 ? 0 : n !== 0 ? 1 : 2),\n 17: n => Number(n == 1 || n % 10 == 1 && n % 100 != 11 ? 0 : 1),\n 18: n => Number(n == 0 ? 0 : n == 1 ? 1 : 2),\n 19: n => Number(n == 1 ? 0 : n == 0 || n % 100 > 1 && n % 100 < 11 ? 1 : n % 100 > 10 && n % 100 < 20 ? 2 : 3),\n 20: n => Number(n == 1 ? 0 : n == 0 || n % 100 > 0 && n % 100 < 20 ? 1 : 2),\n 21: n => Number(n % 100 == 1 ? 1 : n % 100 == 2 ? 2 : n % 100 == 3 || n % 100 == 4 ? 3 : 0),\n 22: n => Number(n == 1 ? 0 : n == 2 ? 1 : (n < 0 || n > 10) && n % 10 == 0 ? 2 : 3)\n};\nconst nonIntlVersions = ['v1', 'v2', 'v3'];\nconst intlVersions = ['v4'];\nconst suffixesOrder = {\n zero: 0,\n one: 1,\n two: 2,\n few: 3,\n many: 4,\n other: 5\n};\nconst createRules = () => {\n const rules = {};\n sets.forEach(set => {\n set.lngs.forEach(l => {\n rules[l] = {\n numbers: set.nr,\n plurals: _rulesPluralsTypes[set.fc]\n };\n });\n });\n return rules;\n};\nclass PluralResolver {\n constructor(languageUtils) {\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n this.languageUtils = languageUtils;\n this.options = options;\n this.logger = baseLogger.create('pluralResolver');\n if ((!this.options.compatibilityJSON || intlVersions.includes(this.options.compatibilityJSON)) && (typeof Intl === 'undefined' || !Intl.PluralRules)) {\n this.options.compatibilityJSON = 'v3';\n this.logger.error('Your environment seems not to be Intl API compatible, use an Intl.PluralRules polyfill. Will fallback to the compatibilityJSON v3 format handling.');\n }\n this.rules = createRules();\n this.pluralRulesCache = {};\n }\n addRule(lng, obj) {\n this.rules[lng] = obj;\n }\n clearCache() {\n this.pluralRulesCache = {};\n }\n getRule(code) {\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n if (this.shouldUseIntlApi()) {\n const cleanedCode = getCleanedCode(code === 'dev' ? 'en' : code);\n const type = options.ordinal ? 'ordinal' : 'cardinal';\n const cacheKey = JSON.stringify({\n cleanedCode,\n type\n });\n if (cacheKey in this.pluralRulesCache) {\n return this.pluralRulesCache[cacheKey];\n }\n let rule;\n try {\n rule = new Intl.PluralRules(cleanedCode, {\n type\n });\n } catch (err) {\n if (!code.match(/-|_/)) return;\n const lngPart = this.languageUtils.getLanguagePartFromCode(code);\n rule = this.getRule(lngPart, options);\n }\n this.pluralRulesCache[cacheKey] = rule;\n return rule;\n }\n return this.rules[code] || this.rules[this.languageUtils.getLanguagePartFromCode(code)];\n }\n needsPlural(code) {\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n const rule = this.getRule(code, options);\n if (this.shouldUseIntlApi()) {\n return rule && rule.resolvedOptions().pluralCategories.length > 1;\n }\n return rule && rule.numbers.length > 1;\n }\n getPluralFormsOfKey(code, key) {\n let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n return this.getSuffixes(code, options).map(suffix => `${key}${suffix}`);\n }\n getSuffixes(code) {\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n const rule = this.getRule(code, options);\n if (!rule) {\n return [];\n }\n if (this.shouldUseIntlApi()) {\n return rule.resolvedOptions().pluralCategories.sort((pluralCategory1, pluralCategory2) => suffixesOrder[pluralCategory1] - suffixesOrder[pluralCategory2]).map(pluralCategory => `${this.options.prepend}${options.ordinal ? `ordinal${this.options.prepend}` : ''}${pluralCategory}`);\n }\n return rule.numbers.map(number => this.getSuffix(code, number, options));\n }\n getSuffix(code, count) {\n let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n const rule = this.getRule(code, options);\n if (rule) {\n if (this.shouldUseIntlApi()) {\n return `${this.options.prepend}${options.ordinal ? `ordinal${this.options.prepend}` : ''}${rule.select(count)}`;\n }\n return this.getSuffixRetroCompatible(rule, count);\n }\n this.logger.warn(`no plural rule found for: ${code}`);\n return '';\n }\n getSuffixRetroCompatible(rule, count) {\n const idx = rule.noAbs ? rule.plurals(count) : rule.plurals(Math.abs(count));\n let suffix = rule.numbers[idx];\n if (this.options.simplifyPluralSuffix && rule.numbers.length === 2 && rule.numbers[0] === 1) {\n if (suffix === 2) {\n suffix = 'plural';\n } else if (suffix === 1) {\n suffix = '';\n }\n }\n const returnSuffix = () => this.options.prepend && suffix.toString() ? this.options.prepend + suffix.toString() : suffix.toString();\n if (this.options.compatibilityJSON === 'v1') {\n if (suffix === 1) return '';\n if (typeof suffix === 'number') return `_plural_${suffix.toString()}`;\n return returnSuffix();\n } else if (this.options.compatibilityJSON === 'v2') {\n return returnSuffix();\n } else if (this.options.simplifyPluralSuffix && rule.numbers.length === 2 && rule.numbers[0] === 1) {\n return returnSuffix();\n }\n return this.options.prepend && idx.toString() ? this.options.prepend + idx.toString() : idx.toString();\n }\n shouldUseIntlApi() {\n return !nonIntlVersions.includes(this.options.compatibilityJSON);\n }\n}\n\nconst deepFindWithDefaults = function (data, defaultData, key) {\n let keySeparator = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '.';\n let ignoreJSONStructure = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n let path = getPathWithDefaults(data, defaultData, key);\n if (!path && ignoreJSONStructure && isString(key)) {\n path = deepFind(data, key, keySeparator);\n if (path === undefined) path = deepFind(defaultData, key, keySeparator);\n }\n return path;\n};\nconst regexSafe = val => val.replace(/\\$/g, '$$$$');\nclass Interpolator {\n constructor() {\n let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.logger = baseLogger.create('interpolator');\n this.options = options;\n this.format = options.interpolation && options.interpolation.format || (value => value);\n this.init(options);\n }\n init() {\n let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n if (!options.interpolation) options.interpolation = {\n escapeValue: true\n };\n const {\n escape: escape$1,\n escapeValue,\n useRawValueToEscape,\n prefix,\n prefixEscaped,\n suffix,\n suffixEscaped,\n formatSeparator,\n unescapeSuffix,\n unescapePrefix,\n nestingPrefix,\n nestingPrefixEscaped,\n nestingSuffix,\n nestingSuffixEscaped,\n nestingOptionsSeparator,\n maxReplaces,\n alwaysFormat\n } = options.interpolation;\n this.escape = escape$1 !== undefined ? escape$1 : escape;\n this.escapeValue = escapeValue !== undefined ? escapeValue : true;\n this.useRawValueToEscape = useRawValueToEscape !== undefined ? useRawValueToEscape : false;\n this.prefix = prefix ? regexEscape(prefix) : prefixEscaped || '{{';\n this.suffix = suffix ? regexEscape(suffix) : suffixEscaped || '}}';\n this.formatSeparator = formatSeparator || ',';\n this.unescapePrefix = unescapeSuffix ? '' : unescapePrefix || '-';\n this.unescapeSuffix = this.unescapePrefix ? '' : unescapeSuffix || '';\n this.nestingPrefix = nestingPrefix ? regexEscape(nestingPrefix) : nestingPrefixEscaped || regexEscape('$t(');\n this.nestingSuffix = nestingSuffix ? regexEscape(nestingSuffix) : nestingSuffixEscaped || regexEscape(')');\n this.nestingOptionsSeparator = nestingOptionsSeparator || ',';\n this.maxReplaces = maxReplaces || 1000;\n this.alwaysFormat = alwaysFormat !== undefined ? alwaysFormat : false;\n this.resetRegExp();\n }\n reset() {\n if (this.options) this.init(this.options);\n }\n resetRegExp() {\n const getOrResetRegExp = (existingRegExp, pattern) => {\n if (existingRegExp && existingRegExp.source === pattern) {\n existingRegExp.lastIndex = 0;\n return existingRegExp;\n }\n return new RegExp(pattern, 'g');\n };\n this.regexp = getOrResetRegExp(this.regexp, `${this.prefix}(.+?)${this.suffix}`);\n this.regexpUnescape = getOrResetRegExp(this.regexpUnescape, `${this.prefix}${this.unescapePrefix}(.+?)${this.unescapeSuffix}${this.suffix}`);\n this.nestingRegexp = getOrResetRegExp(this.nestingRegexp, `${this.nestingPrefix}(.+?)${this.nestingSuffix}`);\n }\n interpolate(str, data, lng, options) {\n let match;\n let value;\n let replaces;\n const defaultData = this.options && this.options.interpolation && this.options.interpolation.defaultVariables || {};\n const handleFormat = key => {\n if (key.indexOf(this.formatSeparator) < 0) {\n const path = deepFindWithDefaults(data, defaultData, key, this.options.keySeparator, this.options.ignoreJSONStructure);\n return this.alwaysFormat ? this.format(path, undefined, lng, {\n ...options,\n ...data,\n interpolationkey: key\n }) : path;\n }\n const p = key.split(this.formatSeparator);\n const k = p.shift().trim();\n const f = p.join(this.formatSeparator).trim();\n return this.format(deepFindWithDefaults(data, defaultData, k, this.options.keySeparator, this.options.ignoreJSONStructure), f, lng, {\n ...options,\n ...data,\n interpolationkey: k\n });\n };\n this.resetRegExp();\n const missingInterpolationHandler = options && options.missingInterpolationHandler || this.options.missingInterpolationHandler;\n const skipOnVariables = options && options.interpolation && options.interpolation.skipOnVariables !== undefined ? options.interpolation.skipOnVariables : this.options.interpolation.skipOnVariables;\n const todos = [{\n regex: this.regexpUnescape,\n safeValue: val => regexSafe(val)\n }, {\n regex: this.regexp,\n safeValue: val => this.escapeValue ? regexSafe(this.escape(val)) : regexSafe(val)\n }];\n todos.forEach(todo => {\n replaces = 0;\n while (match = todo.regex.exec(str)) {\n const matchedVar = match[1].trim();\n value = handleFormat(matchedVar);\n if (value === undefined) {\n if (typeof missingInterpolationHandler === 'function') {\n const temp = missingInterpolationHandler(str, match, options);\n value = isString(temp) ? temp : '';\n } else if (options && Object.prototype.hasOwnProperty.call(options, matchedVar)) {\n value = '';\n } else if (skipOnVariables) {\n value = match[0];\n continue;\n } else {\n this.logger.warn(`missed to pass in variable ${matchedVar} for interpolating ${str}`);\n value = '';\n }\n } else if (!isString(value) && !this.useRawValueToEscape) {\n value = makeString(value);\n }\n const safeValue = todo.safeValue(value);\n str = str.replace(match[0], safeValue);\n if (skipOnVariables) {\n todo.regex.lastIndex += value.length;\n todo.regex.lastIndex -= match[0].length;\n } else {\n todo.regex.lastIndex = 0;\n }\n replaces++;\n if (replaces >= this.maxReplaces) {\n break;\n }\n }\n });\n return str;\n }\n nest(str, fc) {\n let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n let match;\n let value;\n let clonedOptions;\n const handleHasOptions = (key, inheritedOptions) => {\n const sep = this.nestingOptionsSeparator;\n if (key.indexOf(sep) < 0) return key;\n const c = key.split(new RegExp(`${sep}[ ]*{`));\n let optionsString = `{${c[1]}`;\n key = c[0];\n optionsString = this.interpolate(optionsString, clonedOptions);\n const matchedSingleQuotes = optionsString.match(/'/g);\n const matchedDoubleQuotes = optionsString.match(/\"/g);\n if (matchedSingleQuotes && matchedSingleQuotes.length % 2 === 0 && !matchedDoubleQuotes || matchedDoubleQuotes.length % 2 !== 0) {\n optionsString = optionsString.replace(/'/g, '\"');\n }\n try {\n clonedOptions = JSON.parse(optionsString);\n if (inheritedOptions) clonedOptions = {\n ...inheritedOptions,\n ...clonedOptions\n };\n } catch (e) {\n this.logger.warn(`failed parsing options string in nesting for key ${key}`, e);\n return `${key}${sep}${optionsString}`;\n }\n if (clonedOptions.defaultValue && clonedOptions.defaultValue.indexOf(this.prefix) > -1) delete clonedOptions.defaultValue;\n return key;\n };\n while (match = this.nestingRegexp.exec(str)) {\n let formatters = [];\n clonedOptions = {\n ...options\n };\n clonedOptions = clonedOptions.replace && !isString(clonedOptions.replace) ? clonedOptions.replace : clonedOptions;\n clonedOptions.applyPostProcessor = false;\n delete clonedOptions.defaultValue;\n let doReduce = false;\n if (match[0].indexOf(this.formatSeparator) !== -1 && !/{.*}/.test(match[1])) {\n const r = match[1].split(this.formatSeparator).map(elem => elem.trim());\n match[1] = r.shift();\n formatters = r;\n doReduce = true;\n }\n value = fc(handleHasOptions.call(this, match[1].trim(), clonedOptions), clonedOptions);\n if (value && match[0] === str && !isString(value)) return value;\n if (!isString(value)) value = makeString(value);\n if (!value) {\n this.logger.warn(`missed to resolve ${match[1]} for nesting ${str}`);\n value = '';\n }\n if (doReduce) {\n value = formatters.reduce((v, f) => this.format(v, f, options.lng, {\n ...options,\n interpolationkey: match[1].trim()\n }), value.trim());\n }\n str = str.replace(match[0], value);\n this.regexp.lastIndex = 0;\n }\n return str;\n }\n}\n\nconst parseFormatStr = formatStr => {\n let formatName = formatStr.toLowerCase().trim();\n const formatOptions = {};\n if (formatStr.indexOf('(') > -1) {\n const p = formatStr.split('(');\n formatName = p[0].toLowerCase().trim();\n const optStr = p[1].substring(0, p[1].length - 1);\n if (formatName === 'currency' && optStr.indexOf(':') < 0) {\n if (!formatOptions.currency) formatOptions.currency = optStr.trim();\n } else if (formatName === 'relativetime' && optStr.indexOf(':') < 0) {\n if (!formatOptions.range) formatOptions.range = optStr.trim();\n } else {\n const opts = optStr.split(';');\n opts.forEach(opt => {\n if (opt) {\n const [key, ...rest] = opt.split(':');\n const val = rest.join(':').trim().replace(/^'+|'+$/g, '');\n const trimmedKey = key.trim();\n if (!formatOptions[trimmedKey]) formatOptions[trimmedKey] = val;\n if (val === 'false') formatOptions[trimmedKey] = false;\n if (val === 'true') formatOptions[trimmedKey] = true;\n if (!isNaN(val)) formatOptions[trimmedKey] = parseInt(val, 10);\n }\n });\n }\n }\n return {\n formatName,\n formatOptions\n };\n};\nconst createCachedFormatter = fn => {\n const cache = {};\n return (val, lng, options) => {\n let optForCache = options;\n if (options && options.interpolationkey && options.formatParams && options.formatParams[options.interpolationkey] && options[options.interpolationkey]) {\n optForCache = {\n ...optForCache,\n [options.interpolationkey]: undefined\n };\n }\n const key = lng + JSON.stringify(optForCache);\n let formatter = cache[key];\n if (!formatter) {\n formatter = fn(getCleanedCode(lng), options);\n cache[key] = formatter;\n }\n return formatter(val);\n };\n};\nclass Formatter {\n constructor() {\n let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.logger = baseLogger.create('formatter');\n this.options = options;\n this.formats = {\n number: createCachedFormatter((lng, opt) => {\n const formatter = new Intl.NumberFormat(lng, {\n ...opt\n });\n return val => formatter.format(val);\n }),\n currency: createCachedFormatter((lng, opt) => {\n const formatter = new Intl.NumberFormat(lng, {\n ...opt,\n style: 'currency'\n });\n return val => formatter.format(val);\n }),\n datetime: createCachedFormatter((lng, opt) => {\n const formatter = new Intl.DateTimeFormat(lng, {\n ...opt\n });\n return val => formatter.format(val);\n }),\n relativetime: createCachedFormatter((lng, opt) => {\n const formatter = new Intl.RelativeTimeFormat(lng, {\n ...opt\n });\n return val => formatter.format(val, opt.range || 'day');\n }),\n list: createCachedFormatter((lng, opt) => {\n const formatter = new Intl.ListFormat(lng, {\n ...opt\n });\n return val => formatter.format(val);\n })\n };\n this.init(options);\n }\n init(services) {\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n interpolation: {}\n };\n this.formatSeparator = options.interpolation.formatSeparator || ',';\n }\n add(name, fc) {\n this.formats[name.toLowerCase().trim()] = fc;\n }\n addCached(name, fc) {\n this.formats[name.toLowerCase().trim()] = createCachedFormatter(fc);\n }\n format(value, format, lng) {\n let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n const formats = format.split(this.formatSeparator);\n if (formats.length > 1 && formats[0].indexOf('(') > 1 && formats[0].indexOf(')') < 0 && formats.find(f => f.indexOf(')') > -1)) {\n const lastIndex = formats.findIndex(f => f.indexOf(')') > -1);\n formats[0] = [formats[0], ...formats.splice(1, lastIndex)].join(this.formatSeparator);\n }\n const result = formats.reduce((mem, f) => {\n const {\n formatName,\n formatOptions\n } = parseFormatStr(f);\n if (this.formats[formatName]) {\n let formatted = mem;\n try {\n const valOptions = options && options.formatParams && options.formatParams[options.interpolationkey] || {};\n const l = valOptions.locale || valOptions.lng || options.locale || options.lng || lng;\n formatted = this.formats[formatName](mem, l, {\n ...formatOptions,\n ...options,\n ...valOptions\n });\n } catch (error) {\n this.logger.warn(error);\n }\n return formatted;\n } else {\n this.logger.warn(`there was no format function for ${formatName}`);\n }\n return mem;\n }, value);\n return result;\n }\n}\n\nconst removePending = (q, name) => {\n if (q.pending[name] !== undefined) {\n delete q.pending[name];\n q.pendingCount--;\n }\n};\nclass Connector extends EventEmitter {\n constructor(backend, store, services) {\n let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n super();\n this.backend = backend;\n this.store = store;\n this.services = services;\n this.languageUtils = services.languageUtils;\n this.options = options;\n this.logger = baseLogger.create('backendConnector');\n this.waitingReads = [];\n this.maxParallelReads = options.maxParallelReads || 10;\n this.readingCalls = 0;\n this.maxRetries = options.maxRetries >= 0 ? options.maxRetries : 5;\n this.retryTimeout = options.retryTimeout >= 1 ? options.retryTimeout : 350;\n this.state = {};\n this.queue = [];\n if (this.backend && this.backend.init) {\n this.backend.init(services, options.backend, options);\n }\n }\n queueLoad(languages, namespaces, options, callback) {\n const toLoad = {};\n const pending = {};\n const toLoadLanguages = {};\n const toLoadNamespaces = {};\n languages.forEach(lng => {\n let hasAllNamespaces = true;\n namespaces.forEach(ns => {\n const name = `${lng}|${ns}`;\n if (!options.reload && this.store.hasResourceBundle(lng, ns)) {\n this.state[name] = 2;\n } else if (this.state[name] < 0) ; else if (this.state[name] === 1) {\n if (pending[name] === undefined) pending[name] = true;\n } else {\n this.state[name] = 1;\n hasAllNamespaces = false;\n if (pending[name] === undefined) pending[name] = true;\n if (toLoad[name] === undefined) toLoad[name] = true;\n if (toLoadNamespaces[ns] === undefined) toLoadNamespaces[ns] = true;\n }\n });\n if (!hasAllNamespaces) toLoadLanguages[lng] = true;\n });\n if (Object.keys(toLoad).length || Object.keys(pending).length) {\n this.queue.push({\n pending,\n pendingCount: Object.keys(pending).length,\n loaded: {},\n errors: [],\n callback\n });\n }\n return {\n toLoad: Object.keys(toLoad),\n pending: Object.keys(pending),\n toLoadLanguages: Object.keys(toLoadLanguages),\n toLoadNamespaces: Object.keys(toLoadNamespaces)\n };\n }\n loaded(name, err, data) {\n const s = name.split('|');\n const lng = s[0];\n const ns = s[1];\n if (err) this.emit('failedLoading', lng, ns, err);\n if (!err && data) {\n this.store.addResourceBundle(lng, ns, data, undefined, undefined, {\n skipCopy: true\n });\n }\n this.state[name] = err ? -1 : 2;\n if (err && data) this.state[name] = 0;\n const loaded = {};\n this.queue.forEach(q => {\n pushPath(q.loaded, [lng], ns);\n removePending(q, name);\n if (err) q.errors.push(err);\n if (q.pendingCount === 0 && !q.done) {\n Object.keys(q.loaded).forEach(l => {\n if (!loaded[l]) loaded[l] = {};\n const loadedKeys = q.loaded[l];\n if (loadedKeys.length) {\n loadedKeys.forEach(n => {\n if (loaded[l][n] === undefined) loaded[l][n] = true;\n });\n }\n });\n q.done = true;\n if (q.errors.length) {\n q.callback(q.errors);\n } else {\n q.callback();\n }\n }\n });\n this.emit('loaded', loaded);\n this.queue = this.queue.filter(q => !q.done);\n }\n read(lng, ns, fcName) {\n let tried = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n let wait = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : this.retryTimeout;\n let callback = arguments.length > 5 ? arguments[5] : undefined;\n if (!lng.length) return callback(null, {});\n if (this.readingCalls >= this.maxParallelReads) {\n this.waitingReads.push({\n lng,\n ns,\n fcName,\n tried,\n wait,\n callback\n });\n return;\n }\n this.readingCalls++;\n const resolver = (err, data) => {\n this.readingCalls--;\n if (this.waitingReads.length > 0) {\n const next = this.waitingReads.shift();\n this.read(next.lng, next.ns, next.fcName, next.tried, next.wait, next.callback);\n }\n if (err && data && tried < this.maxRetries) {\n setTimeout(() => {\n this.read.call(this, lng, ns, fcName, tried + 1, wait * 2, callback);\n }, wait);\n return;\n }\n callback(err, data);\n };\n const fc = this.backend[fcName].bind(this.backend);\n if (fc.length === 2) {\n try {\n const r = fc(lng, ns);\n if (r && typeof r.then === 'function') {\n r.then(data => resolver(null, data)).catch(resolver);\n } else {\n resolver(null, r);\n }\n } catch (err) {\n resolver(err);\n }\n return;\n }\n return fc(lng, ns, resolver);\n }\n prepareLoading(languages, namespaces) {\n let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n let callback = arguments.length > 3 ? arguments[3] : undefined;\n if (!this.backend) {\n this.logger.warn('No backend was added via i18next.use. Will not load resources.');\n return callback && callback();\n }\n if (isString(languages)) languages = this.languageUtils.toResolveHierarchy(languages);\n if (isString(namespaces)) namespaces = [namespaces];\n const toLoad = this.queueLoad(languages, namespaces, options, callback);\n if (!toLoad.toLoad.length) {\n if (!toLoad.pending.length) callback();\n return null;\n }\n toLoad.toLoad.forEach(name => {\n this.loadOne(name);\n });\n }\n load(languages, namespaces, callback) {\n this.prepareLoading(languages, namespaces, {}, callback);\n }\n reload(languages, namespaces, callback) {\n this.prepareLoading(languages, namespaces, {\n reload: true\n }, callback);\n }\n loadOne(name) {\n let prefix = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n const s = name.split('|');\n const lng = s[0];\n const ns = s[1];\n this.read(lng, ns, 'read', undefined, undefined, (err, data) => {\n if (err) this.logger.warn(`${prefix}loading namespace ${ns} for language ${lng} failed`, err);\n if (!err && data) this.logger.log(`${prefix}loaded namespace ${ns} for language ${lng}`, data);\n this.loaded(name, err, data);\n });\n }\n saveMissing(languages, namespace, key, fallbackValue, isUpdate) {\n let options = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};\n let clb = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : () => {};\n if (this.services.utils && this.services.utils.hasLoadedNamespace && !this.services.utils.hasLoadedNamespace(namespace)) {\n this.logger.warn(`did not save key \"${key}\" as the namespace \"${namespace}\" was not yet loaded`, 'This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!');\n return;\n }\n if (key === undefined || key === null || key === '') return;\n if (this.backend && this.backend.create) {\n const opts = {\n ...options,\n isUpdate\n };\n const fc = this.backend.create.bind(this.backend);\n if (fc.length < 6) {\n try {\n let r;\n if (fc.length === 5) {\n r = fc(languages, namespace, key, fallbackValue, opts);\n } else {\n r = fc(languages, namespace, key, fallbackValue);\n }\n if (r && typeof r.then === 'function') {\n r.then(data => clb(null, data)).catch(clb);\n } else {\n clb(null, r);\n }\n } catch (err) {\n clb(err);\n }\n } else {\n fc(languages, namespace, key, fallbackValue, clb, opts);\n }\n }\n if (!languages || !languages[0]) return;\n this.store.addResource(languages[0], namespace, key, fallbackValue);\n }\n}\n\nconst get = () => ({\n debug: false,\n initImmediate: true,\n ns: ['translation'],\n defaultNS: ['translation'],\n fallbackLng: ['dev'],\n fallbackNS: false,\n supportedLngs: false,\n nonExplicitSupportedLngs: false,\n load: 'all',\n preload: false,\n simplifyPluralSuffix: true,\n keySeparator: '.',\n nsSeparator: ':',\n pluralSeparator: '_',\n contextSeparator: '_',\n partialBundledLanguages: false,\n saveMissing: false,\n updateMissing: false,\n saveMissingTo: 'fallback',\n saveMissingPlurals: true,\n missingKeyHandler: false,\n missingInterpolationHandler: false,\n postProcess: false,\n postProcessPassResolved: false,\n returnNull: false,\n returnEmptyString: true,\n returnObjects: false,\n joinArrays: false,\n returnedObjectHandler: false,\n parseMissingKeyHandler: false,\n appendNamespaceToMissingKey: false,\n appendNamespaceToCIMode: false,\n overloadTranslationOptionHandler: args => {\n let ret = {};\n if (typeof args[1] === 'object') ret = args[1];\n if (isString(args[1])) ret.defaultValue = args[1];\n if (isString(args[2])) ret.tDescription = args[2];\n if (typeof args[2] === 'object' || typeof args[3] === 'object') {\n const options = args[3] || args[2];\n Object.keys(options).forEach(key => {\n ret[key] = options[key];\n });\n }\n return ret;\n },\n interpolation: {\n escapeValue: true,\n format: value => value,\n prefix: '{{',\n suffix: '}}',\n formatSeparator: ',',\n unescapePrefix: '-',\n nestingPrefix: '$t(',\n nestingSuffix: ')',\n nestingOptionsSeparator: ',',\n maxReplaces: 1000,\n skipOnVariables: true\n }\n});\nconst transformOptions = options => {\n if (isString(options.ns)) options.ns = [options.ns];\n if (isString(options.fallbackLng)) options.fallbackLng = [options.fallbackLng];\n if (isString(options.fallbackNS)) options.fallbackNS = [options.fallbackNS];\n if (options.supportedLngs && options.supportedLngs.indexOf('cimode') < 0) {\n options.supportedLngs = options.supportedLngs.concat(['cimode']);\n }\n return options;\n};\n\nconst noop = () => {};\nconst bindMemberFunctions = inst => {\n const mems = Object.getOwnPropertyNames(Object.getPrototypeOf(inst));\n mems.forEach(mem => {\n if (typeof inst[mem] === 'function') {\n inst[mem] = inst[mem].bind(inst);\n }\n });\n};\nclass I18n extends EventEmitter {\n constructor() {\n let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n let callback = arguments.length > 1 ? arguments[1] : undefined;\n super();\n this.options = transformOptions(options);\n this.services = {};\n this.logger = baseLogger;\n this.modules = {\n external: []\n };\n bindMemberFunctions(this);\n if (callback && !this.isInitialized && !options.isClone) {\n if (!this.options.initImmediate) {\n this.init(options, callback);\n return this;\n }\n setTimeout(() => {\n this.init(options, callback);\n }, 0);\n }\n }\n init() {\n var _this = this;\n let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n let callback = arguments.length > 1 ? arguments[1] : undefined;\n this.isInitializing = true;\n if (typeof options === 'function') {\n callback = options;\n options = {};\n }\n if (!options.defaultNS && options.defaultNS !== false && options.ns) {\n if (isString(options.ns)) {\n options.defaultNS = options.ns;\n } else if (options.ns.indexOf('translation') < 0) {\n options.defaultNS = options.ns[0];\n }\n }\n const defOpts = get();\n this.options = {\n ...defOpts,\n ...this.options,\n ...transformOptions(options)\n };\n if (this.options.compatibilityAPI !== 'v1') {\n this.options.interpolation = {\n ...defOpts.interpolation,\n ...this.options.interpolation\n };\n }\n if (options.keySeparator !== undefined) {\n this.options.userDefinedKeySeparator = options.keySeparator;\n }\n if (options.nsSeparator !== undefined) {\n this.options.userDefinedNsSeparator = options.nsSeparator;\n }\n const createClassOnDemand = ClassOrObject => {\n if (!ClassOrObject) return null;\n if (typeof ClassOrObject === 'function') return new ClassOrObject();\n return ClassOrObject;\n };\n if (!this.options.isClone) {\n if (this.modules.logger) {\n baseLogger.init(createClassOnDemand(this.modules.logger), this.options);\n } else {\n baseLogger.init(null, this.options);\n }\n let formatter;\n if (this.modules.formatter) {\n formatter = this.modules.formatter;\n } else if (typeof Intl !== 'undefined') {\n formatter = Formatter;\n }\n const lu = new LanguageUtil(this.options);\n this.store = new ResourceStore(this.options.resources, this.options);\n const s = this.services;\n s.logger = baseLogger;\n s.resourceStore = this.store;\n s.languageUtils = lu;\n s.pluralResolver = new PluralResolver(lu, {\n prepend: this.options.pluralSeparator,\n compatibilityJSON: this.options.compatibilityJSON,\n simplifyPluralSuffix: this.options.simplifyPluralSuffix\n });\n if (formatter && (!this.options.interpolation.format || this.options.interpolation.format === defOpts.interpolation.format)) {\n s.formatter = createClassOnDemand(formatter);\n s.formatter.init(s, this.options);\n this.options.interpolation.format = s.formatter.format.bind(s.formatter);\n }\n s.interpolator = new Interpolator(this.options);\n s.utils = {\n hasLoadedNamespace: this.hasLoadedNamespace.bind(this)\n };\n s.backendConnector = new Connector(createClassOnDemand(this.modules.backend), s.resourceStore, s, this.options);\n s.backendConnector.on('*', function (event) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n _this.emit(event, ...args);\n });\n if (this.modules.languageDetector) {\n s.languageDetector = createClassOnDemand(this.modules.languageDetector);\n if (s.languageDetector.init) s.languageDetector.init(s, this.options.detection, this.options);\n }\n if (this.modules.i18nFormat) {\n s.i18nFormat = createClassOnDemand(this.modules.i18nFormat);\n if (s.i18nFormat.init) s.i18nFormat.init(this);\n }\n this.translator = new Translator(this.services, this.options);\n this.translator.on('*', function (event) {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n _this.emit(event, ...args);\n });\n this.modules.external.forEach(m => {\n if (m.init) m.init(this);\n });\n }\n this.format = this.options.interpolation.format;\n if (!callback) callback = noop;\n if (this.options.fallbackLng && !this.services.languageDetector && !this.options.lng) {\n const codes = this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);\n if (codes.length > 0 && codes[0] !== 'dev') this.options.lng = codes[0];\n }\n if (!this.services.languageDetector && !this.options.lng) {\n this.logger.warn('init: no languageDetector is used and no lng is defined');\n }\n const storeApi = ['getResource', 'hasResourceBundle', 'getResourceBundle', 'getDataByLanguage'];\n storeApi.forEach(fcName => {\n this[fcName] = function () {\n return _this.store[fcName](...arguments);\n };\n });\n const storeApiChained = ['addResource', 'addResources', 'addResourceBundle', 'removeResourceBundle'];\n storeApiChained.forEach(fcName => {\n this[fcName] = function () {\n _this.store[fcName](...arguments);\n return _this;\n };\n });\n const deferred = defer();\n const load = () => {\n const finish = (err, t) => {\n this.isInitializing = false;\n if (this.isInitialized && !this.initializedStoreOnce) this.logger.warn('init: i18next is already initialized. You should call init just once!');\n this.isInitialized = true;\n if (!this.options.isClone) this.logger.log('initialized', this.options);\n this.emit('initialized', this.options);\n deferred.resolve(t);\n callback(err, t);\n };\n if (this.languages && this.options.compatibilityAPI !== 'v1' && !this.isInitialized) return finish(null, this.t.bind(this));\n this.changeLanguage(this.options.lng, finish);\n };\n if (this.options.resources || !this.options.initImmediate) {\n load();\n } else {\n setTimeout(load, 0);\n }\n return deferred;\n }\n loadResources(language) {\n let callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : noop;\n let usedCallback = callback;\n const usedLng = isString(language) ? language : this.language;\n if (typeof language === 'function') usedCallback = language;\n if (!this.options.resources || this.options.partialBundledLanguages) {\n if (usedLng && usedLng.toLowerCase() === 'cimode' && (!this.options.preload || this.options.preload.length === 0)) return usedCallback();\n const toLoad = [];\n const append = lng => {\n if (!lng) return;\n if (lng === 'cimode') return;\n const lngs = this.services.languageUtils.toResolveHierarchy(lng);\n lngs.forEach(l => {\n if (l === 'cimode') return;\n if (toLoad.indexOf(l) < 0) toLoad.push(l);\n });\n };\n if (!usedLng) {\n const fallbacks = this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);\n fallbacks.forEach(l => append(l));\n } else {\n append(usedLng);\n }\n if (this.options.preload) {\n this.options.preload.forEach(l => append(l));\n }\n this.services.backendConnector.load(toLoad, this.options.ns, e => {\n if (!e && !this.resolvedLanguage && this.language) this.setResolvedLanguage(this.language);\n usedCallback(e);\n });\n } else {\n usedCallback(null);\n }\n }\n reloadResources(lngs, ns, callback) {\n const deferred = defer();\n if (typeof lngs === 'function') {\n callback = lngs;\n lngs = undefined;\n }\n if (typeof ns === 'function') {\n callback = ns;\n ns = undefined;\n }\n if (!lngs) lngs = this.languages;\n if (!ns) ns = this.options.ns;\n if (!callback) callback = noop;\n this.services.backendConnector.reload(lngs, ns, err => {\n deferred.resolve();\n callback(err);\n });\n return deferred;\n }\n use(module) {\n if (!module) throw new Error('You are passing an undefined module! Please check the object you are passing to i18next.use()');\n if (!module.type) throw new Error('You are passing a wrong module! Please check the object you are passing to i18next.use()');\n if (module.type === 'backend') {\n this.modules.backend = module;\n }\n if (module.type === 'logger' || module.log && module.warn && module.error) {\n this.modules.logger = module;\n }\n if (module.type === 'languageDetector') {\n this.modules.languageDetector = module;\n }\n if (module.type === 'i18nFormat') {\n this.modules.i18nFormat = module;\n }\n if (module.type === 'postProcessor') {\n postProcessor.addPostProcessor(module);\n }\n if (module.type === 'formatter') {\n this.modules.formatter = module;\n }\n if (module.type === '3rdParty') {\n this.modules.external.push(module);\n }\n return this;\n }\n setResolvedLanguage(l) {\n if (!l || !this.languages) return;\n if (['cimode', 'dev'].indexOf(l) > -1) return;\n for (let li = 0; li < this.languages.length; li++) {\n const lngInLngs = this.languages[li];\n if (['cimode', 'dev'].indexOf(lngInLngs) > -1) continue;\n if (this.store.hasLanguageSomeTranslations(lngInLngs)) {\n this.resolvedLanguage = lngInLngs;\n break;\n }\n }\n }\n changeLanguage(lng, callback) {\n var _this2 = this;\n this.isLanguageChangingTo = lng;\n const deferred = defer();\n this.emit('languageChanging', lng);\n const setLngProps = l => {\n this.language = l;\n this.languages = this.services.languageUtils.toResolveHierarchy(l);\n this.resolvedLanguage = undefined;\n this.setResolvedLanguage(l);\n };\n const done = (err, l) => {\n if (l) {\n setLngProps(l);\n this.translator.changeLanguage(l);\n this.isLanguageChangingTo = undefined;\n this.emit('languageChanged', l);\n this.logger.log('languageChanged', l);\n } else {\n this.isLanguageChangingTo = undefined;\n }\n deferred.resolve(function () {\n return _this2.t(...arguments);\n });\n if (callback) callback(err, function () {\n return _this2.t(...arguments);\n });\n };\n const setLng = lngs => {\n if (!lng && !lngs && this.services.languageDetector) lngs = [];\n const l = isString(lngs) ? lngs : this.services.languageUtils.getBestMatchFromCodes(lngs);\n if (l) {\n if (!this.language) {\n setLngProps(l);\n }\n if (!this.translator.language) this.translator.changeLanguage(l);\n if (this.services.languageDetector && this.services.languageDetector.cacheUserLanguage) this.services.languageDetector.cacheUserLanguage(l);\n }\n this.loadResources(l, err => {\n done(err, l);\n });\n };\n if (!lng && this.services.languageDetector && !this.services.languageDetector.async) {\n setLng(this.services.languageDetector.detect());\n } else if (!lng && this.services.languageDetector && this.services.languageDetector.async) {\n if (this.services.languageDetector.detect.length === 0) {\n this.services.languageDetector.detect().then(setLng);\n } else {\n this.services.languageDetector.detect(setLng);\n }\n } else {\n setLng(lng);\n }\n return deferred;\n }\n getFixedT(lng, ns, keyPrefix) {\n var _this3 = this;\n const fixedT = function (key, opts) {\n let options;\n if (typeof opts !== 'object') {\n for (var _len3 = arguments.length, rest = new Array(_len3 > 2 ? _len3 - 2 : 0), _key3 = 2; _key3 < _len3; _key3++) {\n rest[_key3 - 2] = arguments[_key3];\n }\n options = _this3.options.overloadTranslationOptionHandler([key, opts].concat(rest));\n } else {\n options = {\n ...opts\n };\n }\n options.lng = options.lng || fixedT.lng;\n options.lngs = options.lngs || fixedT.lngs;\n options.ns = options.ns || fixedT.ns;\n if (options.keyPrefix !== '') options.keyPrefix = options.keyPrefix || keyPrefix || fixedT.keyPrefix;\n const keySeparator = _this3.options.keySeparator || '.';\n let resultKey;\n if (options.keyPrefix && Array.isArray(key)) {\n resultKey = key.map(k => `${options.keyPrefix}${keySeparator}${k}`);\n } else {\n resultKey = options.keyPrefix ? `${options.keyPrefix}${keySeparator}${key}` : key;\n }\n return _this3.t(resultKey, options);\n };\n if (isString(lng)) {\n fixedT.lng = lng;\n } else {\n fixedT.lngs = lng;\n }\n fixedT.ns = ns;\n fixedT.keyPrefix = keyPrefix;\n return fixedT;\n }\n t() {\n return this.translator && this.translator.translate(...arguments);\n }\n exists() {\n return this.translator && this.translator.exists(...arguments);\n }\n setDefaultNamespace(ns) {\n this.options.defaultNS = ns;\n }\n hasLoadedNamespace(ns) {\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n if (!this.isInitialized) {\n this.logger.warn('hasLoadedNamespace: i18next was not initialized', this.languages);\n return false;\n }\n if (!this.languages || !this.languages.length) {\n this.logger.warn('hasLoadedNamespace: i18n.languages were undefined or empty', this.languages);\n return false;\n }\n const lng = options.lng || this.resolvedLanguage || this.languages[0];\n const fallbackLng = this.options ? this.options.fallbackLng : false;\n const lastLng = this.languages[this.languages.length - 1];\n if (lng.toLowerCase() === 'cimode') return true;\n const loadNotPending = (l, n) => {\n const loadState = this.services.backendConnector.state[`${l}|${n}`];\n return loadState === -1 || loadState === 0 || loadState === 2;\n };\n if (options.precheck) {\n const preResult = options.precheck(this, loadNotPending);\n if (preResult !== undefined) return preResult;\n }\n if (this.hasResourceBundle(lng, ns)) return true;\n if (!this.services.backendConnector.backend || this.options.resources && !this.options.partialBundledLanguages) return true;\n if (loadNotPending(lng, ns) && (!fallbackLng || loadNotPending(lastLng, ns))) return true;\n return false;\n }\n loadNamespaces(ns, callback) {\n const deferred = defer();\n if (!this.options.ns) {\n if (callback) callback();\n return Promise.resolve();\n }\n if (isString(ns)) ns = [ns];\n ns.forEach(n => {\n if (this.options.ns.indexOf(n) < 0) this.options.ns.push(n);\n });\n this.loadResources(err => {\n deferred.resolve();\n if (callback) callback(err);\n });\n return deferred;\n }\n loadLanguages(lngs, callback) {\n const deferred = defer();\n if (isString(lngs)) lngs = [lngs];\n const preloaded = this.options.preload || [];\n const newLngs = lngs.filter(lng => preloaded.indexOf(lng) < 0 && this.services.languageUtils.isSupportedCode(lng));\n if (!newLngs.length) {\n if (callback) callback();\n return Promise.resolve();\n }\n this.options.preload = preloaded.concat(newLngs);\n this.loadResources(err => {\n deferred.resolve();\n if (callback) callback(err);\n });\n return deferred;\n }\n dir(lng) {\n if (!lng) lng = this.resolvedLanguage || (this.languages && this.languages.length > 0 ? this.languages[0] : this.language);\n if (!lng) return 'rtl';\n const rtlLngs = ['ar', 'shu', 'sqr', 'ssh', 'xaa', 'yhd', 'yud', 'aao', 'abh', 'abv', 'acm', 'acq', 'acw', 'acx', 'acy', 'adf', 'ads', 'aeb', 'aec', 'afb', 'ajp', 'apc', 'apd', 'arb', 'arq', 'ars', 'ary', 'arz', 'auz', 'avl', 'ayh', 'ayl', 'ayn', 'ayp', 'bbz', 'pga', 'he', 'iw', 'ps', 'pbt', 'pbu', 'pst', 'prp', 'prd', 'ug', 'ur', 'ydd', 'yds', 'yih', 'ji', 'yi', 'hbo', 'men', 'xmn', 'fa', 'jpr', 'peo', 'pes', 'prs', 'dv', 'sam', 'ckb'];\n const languageUtils = this.services && this.services.languageUtils || new LanguageUtil(get());\n return rtlLngs.indexOf(languageUtils.getLanguagePartFromCode(lng)) > -1 || lng.toLowerCase().indexOf('-arab') > 1 ? 'rtl' : 'ltr';\n }\n static createInstance() {\n let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n let callback = arguments.length > 1 ? arguments[1] : undefined;\n return new I18n(options, callback);\n }\n cloneInstance() {\n let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n let callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : noop;\n const forkResourceStore = options.forkResourceStore;\n if (forkResourceStore) delete options.forkResourceStore;\n const mergedOptions = {\n ...this.options,\n ...options,\n ...{\n isClone: true\n }\n };\n const clone = new I18n(mergedOptions);\n if (options.debug !== undefined || options.prefix !== undefined) {\n clone.logger = clone.logger.clone(options);\n }\n const membersToCopy = ['store', 'services', 'language'];\n membersToCopy.forEach(m => {\n clone[m] = this[m];\n });\n clone.services = {\n ...this.services\n };\n clone.services.utils = {\n hasLoadedNamespace: clone.hasLoadedNamespace.bind(clone)\n };\n if (forkResourceStore) {\n clone.store = new ResourceStore(this.store.data, mergedOptions);\n clone.services.resourceStore = clone.store;\n }\n clone.translator = new Translator(clone.services, mergedOptions);\n clone.translator.on('*', function (event) {\n for (var _len4 = arguments.length, args = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {\n args[_key4 - 1] = arguments[_key4];\n }\n clone.emit(event, ...args);\n });\n clone.init(mergedOptions, callback);\n clone.translator.options = mergedOptions;\n clone.translator.backendConnector.services.utils = {\n hasLoadedNamespace: clone.hasLoadedNamespace.bind(clone)\n };\n return clone;\n }\n toJSON() {\n return {\n options: this.options,\n store: this.store,\n language: this.language,\n languages: this.languages,\n resolvedLanguage: this.resolvedLanguage\n };\n }\n}\nconst instance = I18n.createInstance();\ninstance.createInstance = I18n.createInstance;\n\nconst createInstance = instance.createInstance;\nconst dir = instance.dir;\nconst init = instance.init;\nconst loadResources = instance.loadResources;\nconst reloadResources = instance.reloadResources;\nconst use = instance.use;\nconst changeLanguage = instance.changeLanguage;\nconst getFixedT = instance.getFixedT;\nconst t = instance.t;\nconst exists = instance.exists;\nconst setDefaultNamespace = instance.setDefaultNamespace;\nconst hasLoadedNamespace = instance.hasLoadedNamespace;\nconst loadNamespaces = instance.loadNamespaces;\nconst loadLanguages = instance.loadLanguages;\n\nexport { changeLanguage, createInstance, instance as default, dir, exists, getFixedT, hasLoadedNamespace, init, loadLanguages, loadNamespaces, loadResources, reloadResources, setDefaultNamespace, t, use };\n","/* @flow */\n\nimport type { CombinedReducers } from '../../../reducers';\nimport type { Dispatch } from '../../../types/types';\nimport type { RequestResponseMethodDefinitionType } from '../emitter';\nimport { createCustomNetworkErrorFromKey } from '../../../../libs/netgemLibrary/helpers/CreateCustomNetworkError';\nimport { getSettingValueByName } from '../helpers/settings';\nimport { sendV8HubRequest } from './hub';\n\nconst search: (signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers): Promise<any> => {\n const { appConfiguration } = getState();\n const key = getSettingValueByName('platform.hubkeys', 'search', appConfiguration);\n\n if (!key) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_search_key'));\n }\n\n return dispatch(sendV8HubRequest(key, signal));\n };\n\nexport default search;\n","/* @flow */\n\nimport type { NetgemApiEmitterType, RequestResponseMethodDefinitionType } from '../emitter';\nimport type { CombinedReducers } from '../../../reducers';\nimport type { Dispatch } from '../../../types/types';\nimport { ItemType } from '../../../../libs/netgemLibrary/v8/types/FeedItem';\nimport type { NETGEM_API_V8_URL_DEFINITION } from '../../../../libs/netgemLibrary/v8/types/NtgVideoFeed';\nimport { REDUX_MSG_REQUEST_GENERIC } from '../../constants';\nimport { createCustomNetworkErrorFromKey } from '../../../../libs/netgemLibrary/helpers/CreateCustomNetworkError';\nimport { generateApiUrl } from '../helpers/api';\n\nconst sendV8AssetIdForDeeplinkRequestV1: (\n type: ItemType,\n cncProgramGetUrl: ?NETGEM_API_V8_URL_DEFINITION,\n cncSeriesGetUrl: ?NETGEM_API_V8_URL_DEFINITION,\n cncParameter: string,\n state: CombinedReducers,\n NetgemApiEmitter: NetgemApiEmitterType,\n signal?: AbortSignal,\n) => Promise<any> = (type, cncProgramGetUrl, cncSeriesGetUrl, cncParameter, state, NetgemApiEmitter, signal) => {\n const urlDef = type === ItemType.Program ? cncProgramGetUrl : cncSeriesGetUrl;\n\n if (!urlDef) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definition', { urlDef: type === ItemType.Program ? 'cncProgramGetUrl' : 'cncSeriesGetUrl' }));\n }\n\n const { authent, method } = urlDef;\n\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_GENERIC, {\n authent,\n method,\n signal,\n state,\n uri: generateApiUrl(urlDef, { cncParameter }, state),\n });\n};\n\nconst sendV8AssetIdForDeeplinkRequestV2: (\n type: ItemType,\n deeplinkProgramGetUrl: NETGEM_API_V8_URL_DEFINITION,\n deeplinkSeriesGetUrl: NETGEM_API_V8_URL_DEFINITION,\n deeplinkParameter: string,\n state: CombinedReducers,\n NetgemApiEmitter: NetgemApiEmitterType,\n signal?: AbortSignal,\n) => Promise<any> = (type, deeplinkProgramGetUrl, deeplinkSeriesGetUrl, deeplinkParameter, state, NetgemApiEmitter, signal) => {\n const urlDef = type === ItemType.Program ? deeplinkProgramGetUrl : deeplinkSeriesGetUrl;\n\n if (!urlDef) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definition', { urlDef: type === ItemType.Program ? 'deeplinkProgramGetUrl' : 'deeplinkSeriesGetUrl' }));\n }\n\n const { authent, method } = urlDef;\n\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_GENERIC, {\n authent,\n method,\n signal,\n state,\n uri: generateApiUrl(urlDef, { deeplinkParameter }, state),\n });\n};\n\nconst sendV8AssetIdForDeeplinkRequest: (type: ItemType, deeplinkParameter: string, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (type, deeplinkParameter, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const state = getState();\n const {\n netgemApi: { cncProgramGetUrl, cncSeriesGetUrl, deeplinkProgramGetUrl, deeplinkSeriesGetUrl },\n } = state;\n\n // Backward compatibility: deeplink > CNC\n if (deeplinkProgramGetUrl && deeplinkSeriesGetUrl) {\n return sendV8AssetIdForDeeplinkRequestV2(type, deeplinkProgramGetUrl, deeplinkSeriesGetUrl, deeplinkParameter, state, NetgemApiEmitter, signal);\n }\n\n return sendV8AssetIdForDeeplinkRequestV1(type, cncProgramGetUrl, cncSeriesGetUrl, deeplinkParameter, state, NetgemApiEmitter, signal);\n };\n\nexport default sendV8AssetIdForDeeplinkRequest;\n","/* @flow */\n\nimport type { NetgemApiEmitterType, RequestResponseMethodDefinitionType } from '../emitter';\nimport type { CombinedReducers } from '../../../reducers';\nimport type { Dispatch } from '../../../types/types';\nimport type { NETGEM_API_V8_FEED_ITEM } from '../../../../libs/netgemLibrary/v8/types/FeedItem';\nimport type { NETGEM_API_V8_URL_DEFINITION } from '../../../../libs/netgemLibrary/v8/types/NtgVideoFeed';\nimport { REDUX_MSG_REQUEST_CUSTOM_STRATEGY } from '../../constants';\nimport { generateApiUrl } from '../helpers/api';\n\nconst sendV8CustomStrategyRequest: (urlDefinition: NETGEM_API_V8_URL_DEFINITION, item: NETGEM_API_V8_FEED_ITEM, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (urlDefinition, item, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const state = getState();\n\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_CUSTOM_STRATEGY, {\n signal,\n uri: generateApiUrl(\n urlDefinition,\n {\n assetId: item.id,\n item,\n },\n state\n ),\n });\n };\n\nexport default sendV8CustomStrategyRequest;\n","/* @flow */\n\nimport { Messenger, MessengerEvents } from '@ntg/utils/dist/messenger';\nimport { SentryTagName, SentryTagValue } from '../debug/sentryTypes';\nimport { logError, logInfo } from '../debug/debug';\nimport type { KeyValuePair } from '@ntg/utils/dist/types';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport React from 'react';\nimport SentryWrapper from '../debug/sentry';\nimport { Timer } from '@ntg/utils/dist/timer';\nimport { getPriceAsInteger } from '../maths/maths';\n\n// After this time, page load is considered a failure (in ms)\nconst EXTERNAL_PAYMENT_SYSTEM_LOAD_TIMEOUT = 20_000;\n\nlet ChargebeeWrapper = null;\n\nconst initialize: (token: string, urls: KeyValuePair<string>) => void = (token, urls) => {\n if (!process.env.REACT_APP_CHARGEBEE_INSTANCE) {\n // Chargebee disabled\n return;\n }\n\n if (ChargebeeWrapper !== null) {\n // Chargebee already initialized\n ChargebeeWrapper.updateToken(token);\n return;\n }\n\n import('@ntg/utils/dist/payment/chargebee').then((module) => {\n ChargebeeWrapper = module.default;\n ChargebeeWrapper.initialize(token, urls).catch((error) => {\n Messenger.emit(MessengerEvents.NOTIFY_ERROR, <div>{Localizer.localize('common.messages.errors.payment_system_not_loaded')}</div>);\n logError(error.message);\n SentryWrapper.error({\n breadcrumbs: ['ChargebeeWrapper.initialize error'],\n message: error.message,\n tagName: SentryTagName.Component,\n tagValue: SentryTagValue.PaymentSystem,\n });\n });\n });\n};\n\nconst destroy: () => void = () => {\n if (!ChargebeeWrapper) {\n return;\n }\n\n ChargebeeWrapper.destroy();\n ChargebeeWrapper = null;\n};\n\nconst showDebug: () => void = () => {\n if (!ChargebeeWrapper) {\n logInfo('Chargebee not initialized');\n return;\n }\n\n ChargebeeWrapper.showDebug();\n};\n\nconst genericErrorCallback: (error: Error | string) => void = (error) => {\n const message = typeof error === 'string' ? error : error.message;\n Messenger.emit(MessengerEvents.NOTIFY_ERROR, <div>{message}</div>);\n};\n\nconst openSelfCare: () => void = () => {\n if (!ChargebeeWrapper) {\n logError('Chargebee not initialized');\n return;\n }\n\n const timer = new Timer(EXTERNAL_PAYMENT_SYSTEM_LOAD_TIMEOUT, genericErrorCallback, new Error(Localizer.localize('external_payment_system.portal.load_failure')));\n\n if (!ChargebeeWrapper) {\n timer.clear();\n return;\n }\n\n ChargebeeWrapper.openPortal(timer).catch((error) => {\n if (timer.timedOut) {\n // Ignore error since time out message has already been displayed\n return;\n }\n\n timer.clear();\n genericErrorCallback(error);\n });\n};\n\nconst openCheckOut: (identity: string, vtiId: number, title: string, originalPrice: string, promoCode: string | null, discountPrice: string | null) => Promise<any> = (\n identity,\n vtiId,\n title,\n originalPrice,\n promoCode,\n discountPrice,\n) => {\n if (!ChargebeeWrapper) {\n return Promise.reject(new Error('Chargebee not initialized'));\n }\n\n let description = title;\n if (promoCode) {\n description = `${description} (prix original : ${originalPrice})`;\n }\n\n const discountPriceAsInteger = discountPrice !== null ? getPriceAsInteger(discountPrice) : null;\n const timer = new Timer(EXTERNAL_PAYMENT_SYSTEM_LOAD_TIMEOUT, genericErrorCallback, new Error(Localizer.localize('external_payment_system.check_out.load_failure')));\n\n return new Promise((resolve, reject) => {\n ChargebeeWrapper?.openCheckOut(identity, vtiId, description, getPriceAsInteger(originalPrice), promoCode, discountPriceAsInteger, timer)\n .then(resolve)\n .catch((error) => {\n if (timer.timedOut) {\n // Ignore error since time out message has already been displayed\n return;\n }\n\n timer.clear();\n reject(error);\n });\n });\n};\n\nexport { destroy, initialize, openSelfCare, openCheckOut, showDebug };\n","/* @flow */\n\nimport { getRandomInteger } from '../maths/maths';\nimport { logDebug } from './debug';\n\n// https://codepen.io/brandonmcconnell/full/WNOeYLp\n\nconst drawingsDescription = [\n // Sonic\n {\n colors: [\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '2149deff',\n '2149deff',\n '2149deff',\n '2149deff',\n '2149deff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '2149deff',\n '2149deff',\n '2149deff',\n '2149deff',\n '2149deff',\n '2149deff',\n '2149deff',\n '2149deff',\n '2149deff',\n '2149deff',\n '2149deff',\n '2149deff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '212494ff',\n '212494ff',\n '212494ff',\n '212494ff',\n '2149deff',\n '2149deff',\n '2149deff',\n '2149deff',\n '2149deff',\n '212494ff',\n '212494ff',\n '2149deff',\n '2149deff',\n '2149deff',\n '2149deff',\n '2149deff',\n 't',\n 't',\n 't',\n 't',\n '212494ff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '212494ff',\n '212494ff',\n '212494ff',\n '212494ff',\n '212494ff',\n '2149deff',\n '2149deff',\n '212494ff',\n 'ffb694ff',\n '212494ff',\n '2149deff',\n '6b6dffff',\n '2149deff',\n '2149deff',\n '2149deff',\n '2149deff',\n 't',\n '212494ff',\n '212494ff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '212494ff',\n '212494ff',\n '212494ff',\n '212494ff',\n 'b56d4aff',\n 'ffb694ff',\n 'ffb694ff',\n '212494ff',\n '2149deff',\n '6b6dffff',\n '6b6dffff',\n '2149deff',\n '2149deff',\n '2149deff',\n '212494ff',\n '212494ff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '212494ff',\n '2149deff',\n '212494ff',\n 'b56d4aff',\n 'ffb694ff',\n 'ffb694ff',\n 'ffb694ff',\n '2149deff',\n '6b6dffff',\n '6b6dffff',\n '6b6dffff',\n '2149deff',\n '2149deff',\n '2149deff',\n '212494ff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '2149deff',\n '2149deff',\n '2149deff',\n '212494ff',\n 'b56d4aff',\n 'b56d4aff',\n '2149deff',\n '2149deff',\n '6b6dffff',\n '6b6dffff',\n 'dedbffff',\n '6b6dffff',\n '6b6dffff',\n '2149deff',\n '2149deff',\n '2149deff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '2149deff',\n '2149deff',\n '2149deff',\n '2149deff',\n '2149deff',\n '2149deff',\n '2149deff',\n '2149deff',\n '2149deff',\n '2149deff',\n '6b6dffff',\n '6b6dffff',\n '2149deff',\n '2149deff',\n '6b6dffff',\n '6b6dffff',\n '6b6dffff',\n '2149deff',\n '2149deff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '2149deff',\n '2149deff',\n '2149deff',\n '2149deff',\n '2149deff',\n '2149deff',\n '2149deff',\n '6b6dffff',\n '6b6dffff',\n '6b6dffff',\n '6b6dffff',\n '6b6dffff',\n '6b6dffff',\n '212494ff',\n 'b5b6deff',\n 'b5b6deff',\n 'dedbffff',\n '6b6dffff',\n '6b6dffff',\n '2149deff',\n '2149deff',\n '2149deff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '2149deff',\n '2149deff',\n '2149deff',\n '2149deff',\n '2149deff',\n '2149deff',\n '2149deff',\n '2149deff',\n '2149deff',\n '6b6dffff',\n 'ffffffff',\n '6b6dffff',\n '6b6dffff',\n '212494ff',\n '6b6d94ff',\n 'dedbffff',\n 'ffffffff',\n 'ffffffff',\n '2149deff',\n '6b6dffff',\n '6b6dffff',\n '2149deff',\n '2149deff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '2149deff',\n '212494ff',\n '212494ff',\n '212494ff',\n '212494ff',\n '212494ff',\n '212494ff',\n '212494ff',\n '2149deff',\n '2149deff',\n '2149deff',\n '6b6dffff',\n '2149deff',\n '6b6dffff',\n '212494ff',\n 'b5b6deff',\n 'b5b6deff',\n 'b5b6deff',\n 'ffffffff',\n 'dedbffff',\n '2149deff',\n '6b6dffff',\n '2149deff',\n '212494ff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '212494ff',\n '212494ff',\n '212494ff',\n '212494ff',\n '212494ff',\n '212494ff',\n '212494ff',\n '212494ff',\n '212494ff',\n '212494ff',\n '2149deff',\n '2149deff',\n '2149deff',\n '2149deff',\n '212494ff',\n 'b5b6deff',\n '212421ff',\n 'b5b6deff',\n 'ffffffff',\n 'b5b6deff',\n '2149deff',\n '6b6dffff',\n '6b6dffff',\n '212494ff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '212494ff',\n '212494ff',\n '212494ff',\n '212494ff',\n '212494ff',\n '2149deff',\n '2149deff',\n '2149deff',\n '2149deff',\n '2149deff',\n 'b5b6deff',\n '212421ff',\n '6b6d94ff',\n 'ffffffff',\n 'ffffffff',\n 'dedbffff',\n '212494ff',\n '212494ff',\n 'b5b6deff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '212494ff',\n '212494ff',\n '212494ff',\n '212494ff',\n '2149deff',\n '2149deff',\n '2149deff',\n '2149deff',\n '6b6dffff',\n '212421ff',\n 'b5b6deff',\n 'ffffffff',\n 'ffffffff',\n 'ffffffff',\n '6b6d94ff',\n '212421ff',\n '6b6d94ff',\n '6b6d94ff',\n 't',\n 't',\n 't',\n 't',\n 'b5b6deff',\n 'ffffffff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '2149deff',\n '2149deff',\n '212494ff',\n '212494ff',\n '212494ff',\n '212494ff',\n '2149deff',\n 'b56d4aff',\n 'ffb694ff',\n 'ffb694ff',\n 'b5b6deff',\n 'ffffffff',\n 'ffffffff',\n 'ffffffff',\n 'ffffffff',\n 'b56d4aff',\n 'b5b6deff',\n '212421ff',\n 't',\n 't',\n 't',\n 't',\n 'b5b6deff',\n 'ffffffff',\n 'ffffffff',\n 't',\n 't',\n 't',\n 't',\n 't',\n '2149deff',\n '2149deff',\n '2149deff',\n '2149deff',\n '212494ff',\n '212494ff',\n '212494ff',\n 'b56d4aff',\n 'ffb694ff',\n 'ffffffff',\n 'b56d4aff',\n 'ffb694ff',\n 'ffb694ff',\n 'dedbffff',\n 'dedbffff',\n 'ffb694ff',\n 'ffb694ff',\n '212421ff',\n '212421ff',\n 't',\n 't',\n 't',\n 'b5b6deff',\n 'ffffffff',\n 'ffffffff',\n 't',\n 't',\n 't',\n 't',\n 't',\n '2149deff',\n '2149deff',\n '2149deff',\n '212494ff',\n '212494ff',\n '212494ff',\n '212494ff',\n '212494ff',\n 'b56d4aff',\n 'ffb694ff',\n 'ffb694ff',\n 'b56d4aff',\n 'ffb694ff',\n 'ffb694ff',\n 'ffb694ff',\n 'ffb694ff',\n 'ffb694ff',\n 'ffb694ff',\n 'b56d4aff',\n 't',\n 't',\n 'dedbffff',\n 'b5b6deff',\n 'ffffffff',\n 'ffffffff',\n 't',\n 't',\n 't',\n 't',\n 't',\n '2149deff',\n '2149deff',\n '212494ff',\n '212494ff',\n '212494ff',\n '212494ff',\n '212494ff',\n '212494ff',\n '212494ff',\n '212494ff',\n 'b56d4aff',\n 'b56d4aff',\n 'b56d4aff',\n 'b56d4aff',\n 'ffb694ff',\n 'ffb694ff',\n 'ffb694ff',\n 'b56d4aff',\n 'b56d4aff',\n 't',\n 't',\n 'dedbffff',\n 'ffffffff',\n 'ffffffff',\n 'b5b6deff',\n 'ffffffff',\n 'ffffffff',\n 't',\n 't',\n 't',\n 't',\n '2149deff',\n '212494ff',\n 't',\n 't',\n 't',\n 't',\n '212494ff',\n '212494ff',\n '212494ff',\n '212494ff',\n '212494ff',\n '212494ff',\n 'b56d4aff',\n 'b56d4aff',\n 'b56d4aff',\n 'b56d4aff',\n 'b56d4aff',\n 't',\n 't',\n 't',\n 't',\n 'dedbffff',\n 'ffffffff',\n 'b5b6deff',\n 'ffffffff',\n 'ffffffff',\n 'ffffffff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '212494ff',\n '212494ff',\n '212494ff',\n '212494ff',\n '212494ff',\n '212494ff',\n '212494ff',\n '212494ff',\n '212494ff',\n '212494ff',\n '212494ff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'dedbffff',\n 'ffffffff',\n '6b6d94ff',\n 'ffffffff',\n 'ffffffff',\n 'b5b6deff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b56d4aff',\n 'b56d4aff',\n 'b56d4aff',\n 'ffb694ff',\n 'ffb694ff',\n 'b56d4aff',\n '212494ff',\n '2149deff',\n 'b56d4aff',\n 'ffb694ff',\n 'ffffffff',\n 'b56d4aff',\n 't',\n 't',\n 't',\n 'dedbffff',\n 'b5b6deff',\n 'dedbffff',\n 'ffffffff',\n '6b6d94ff',\n 'b5b6deff',\n 'b5b6deff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b56d4aff',\n 'b56d4aff',\n 'ffb694ff',\n 'ffb694ff',\n 'ffb694ff',\n 'b56d4aff',\n 'b56d4aff',\n '212494ff',\n '2149deff',\n 'b56d4aff',\n 'ffb694ff',\n 'ffffffff',\n 'ffffffff',\n 'ffffffff',\n 'b56d4aff',\n 'b56d4aff',\n 't',\n 'b56d4aff',\n 'dedbffff',\n 'b5b6deff',\n 'dedbffff',\n 'ffffffff',\n 'b5b6deff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b56d4aff',\n 'ffb694ff',\n 'b56d4aff',\n 'b56d4aff',\n 'b56d4aff',\n '212494ff',\n '212494ff',\n '212494ff',\n '2149deff',\n 'b56d4aff',\n 'ffb694ff',\n 'ffb694ff',\n 'ffffffff',\n 'ffb694ff',\n 'b56d4aff',\n 'b56d4aff',\n 'b56d4aff',\n 'b56d4aff',\n 'ffb694ff',\n 'b5b6deff',\n 'b5b6deff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b56d4aff',\n 'b56d4aff',\n 'ffb694ff',\n 'ffb694ff',\n 'b56d4aff',\n '6b6d94ff',\n '212494ff',\n '212494ff',\n '2149deff',\n 'b56d4aff',\n 'ffb694ff',\n 'ffb694ff',\n 'ffb694ff',\n 'ffb694ff',\n 't',\n 'b56d4aff',\n 'ffb694ff',\n 'ffb694ff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '6b6d94ff',\n '6b6d94ff',\n 'b56d4aff',\n 'ffb694ff',\n 'b56d4aff',\n 'b5b6deff',\n '212494ff',\n '212494ff',\n '212494ff',\n '2149deff',\n 'b56d4aff',\n 'ffb694ff',\n 'ffb694ff',\n '2149deff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '6b6d94ff',\n 'dedbffff',\n '6b6d94ff',\n '6b6d94ff',\n 'b56d4aff',\n 'b5b6deff',\n 'ffffffff',\n '6b6d94ff',\n '212494ff',\n '212494ff',\n '212494ff',\n '2149deff',\n '2149deff',\n '2149deff',\n '2149deff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '6b6d94ff',\n 'b5b6deff',\n 'dedbffff',\n 'dedbffff',\n 'ffffffff',\n 'ffffffff',\n '6b6d94ff',\n '6b6d94ff',\n 't',\n '212494ff',\n '2149deff',\n '2149deff',\n 't',\n '212494ff',\n '2149deff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '6b6d94ff',\n '6b6d94ff',\n 'b5b6deff',\n 'dedbffff',\n '6b6d94ff',\n '940000ff',\n '940000ff',\n 't',\n '212494ff',\n '212494ff',\n '2149deff',\n 't',\n '212494ff',\n '2149deff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '6b6d94ff',\n '6b6d94ff',\n '940000ff',\n '940000ff',\n '940000ff',\n '940000ff',\n 'ffffffff',\n 'ffffffff',\n '212494ff',\n '212494ff',\n '2149deff',\n '2149deff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '212421ff',\n '212421ff',\n '940000ff',\n '940000ff',\n '940000ff',\n '940000ff',\n 'ffffffff',\n 'ffffffff',\n '212494ff',\n '2149deff',\n '2149deff',\n '2149deff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '212421ff',\n '940000ff',\n 'ff0000ff',\n 'ff0000ff',\n '940000ff',\n '940000ff',\n 'ffffffff',\n 'ffffffff',\n '212494ff',\n '2149deff',\n '6b6d94ff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '212421ff',\n '212421ff',\n 'ffffffff',\n 'ffffffff',\n 'ff0000ff',\n '940000ff',\n '6b6d94ff',\n 'b5b6deff',\n 'b5b6deff',\n 'ffffffff',\n 'ffffffff',\n 'b5b6deff',\n '6b6d94ff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '212421ff',\n '940000ff',\n 'ff0000ff',\n 'ff0000ff',\n 'b5b6deff',\n '940000ff',\n 't',\n '6b6d94ff',\n '6b6d94ff',\n '6b6d94ff',\n 'b5b6deff',\n 'b5b6deff',\n '6b6d94ff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '212421ff',\n '940000ff',\n 'ff0000ff',\n 'ff0000ff',\n 'ff0000ff',\n '940000ff',\n 'b5b6deff',\n 't',\n '212421ff',\n '940000ff',\n 'ff0000ff',\n 'ff0000ff',\n '940000ff',\n '212421ff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '212421ff',\n '940000ff',\n 'ff0000ff',\n 'ff0000ff',\n 'ff0000ff',\n 'ff0000ff',\n '940000ff',\n '212421ff',\n '940000ff',\n 'b5b6deff',\n 'ffffffff',\n 'ffffffff',\n 'ffffffff',\n 'ffffffff',\n '212421ff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '212421ff',\n '212421ff',\n '940000ff',\n 'ff0000ff',\n 'ffffffff',\n 'ff0000ff',\n '940000ff',\n '212421ff',\n 'b5b6deff',\n 'ff0000ff',\n 'ff0000ff',\n 'ff0000ff',\n 'ff0000ff',\n '940000ff',\n 'b5b6deff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '212421ff',\n '212421ff',\n '940000ff',\n '940000ff',\n 'ff0000ff',\n 'ff0000ff',\n '940000ff',\n '212421ff',\n '940000ff',\n '940000ff',\n 'ff0000ff',\n 'ff0000ff',\n 'ffffffff',\n 'ff0000ff',\n '940000ff',\n '212421ff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '212421ff',\n '212421ff',\n '940000ff',\n '940000ff',\n '940000ff',\n '940000ff',\n '212421ff',\n '940000ff',\n '940000ff',\n '940000ff',\n 'ff0000ff',\n 'ff0000ff',\n 'ff0000ff',\n '940000ff',\n '212421ff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '212421ff',\n '212421ff',\n '940000ff',\n '940000ff',\n 't',\n 't',\n '212421ff',\n '212421ff',\n '212421ff',\n '212421ff',\n '212421ff',\n '212421ff',\n '212421ff',\n '212421ff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n ],\n size: { height: 39, width: 31 },\n },\n // Blinky Pinky\n {\n colors: [\n 't',\n 't',\n 't',\n 't',\n 't',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 't',\n 't',\n 't',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ffffffff',\n 'ffffffff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ffffffff',\n 'ffffffff',\n 'ff0066ff',\n 't',\n 't',\n 'ff0066ff',\n 'ff0066ff',\n 'ffffffff',\n 'ffffffff',\n 'ffffffff',\n 'ffffffff',\n 'ff0066ff',\n 'ff0066ff',\n 'ffffffff',\n 'ffffffff',\n 'ffffffff',\n 'ffffffff',\n 't',\n 't',\n 'ff0066ff',\n 'ff0066ff',\n 'ffffffff',\n 'ffffffff',\n '0056d4ff',\n '0056d4ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ffffffff',\n 'ffffffff',\n '0056d4ff',\n '0056d4ff',\n 't',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ffffffff',\n 'ffffffff',\n '0056d4ff',\n '0056d4ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ffffffff',\n 'ffffffff',\n '0056d4ff',\n '0056d4ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ffffffff',\n 'ffffffff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ffffffff',\n 'ffffffff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 't',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 't',\n 't',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 't',\n 'ff0066ff',\n 'ff0066ff',\n 'ff0066ff',\n 't',\n 't',\n 't',\n 'ff0066ff',\n 'ff0066ff',\n 't',\n 't',\n 'ff0066ff',\n 'ff0066ff',\n 't',\n 't',\n 't',\n 'ff0066ff',\n ],\n size: { height: 14, width: 14 },\n },\n // Mario\n {\n colors: [\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'fec355ff',\n 'fec355ff',\n 'fec355ff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'e7222cff',\n 'e7222cff',\n 'e7222cff',\n 'e7222cff',\n 'e7222cff',\n 't',\n 't',\n 'fec355ff',\n 'fec355ff',\n 'fec355ff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'e7222cff',\n 'e7222cff',\n 'e7222cff',\n 'e7222cff',\n 'e7222cff',\n 'e7222cff',\n 'e7222cff',\n 'e7222cff',\n 'e7222cff',\n 'fec355ff',\n 'fec355ff',\n 't',\n 't',\n 't',\n 't',\n 't',\n '85561fff',\n '85561fff',\n '85561fff',\n 'fec355ff',\n 'fec355ff',\n '85561fff',\n 'fec355ff',\n 't',\n '85561fff',\n '85561fff',\n '85561fff',\n 't',\n 't',\n 't',\n 't',\n '85561fff',\n 'fec355ff',\n '85561fff',\n 'fec355ff',\n 'fec355ff',\n 'fec355ff',\n '85561fff',\n 'fec355ff',\n 'fec355ff',\n 'fec355ff',\n '85561fff',\n '85561fff',\n 't',\n 't',\n 't',\n 't',\n '85561fff',\n 'fec355ff',\n '85561fff',\n '85561fff',\n 'fec355ff',\n 'fec355ff',\n 'fec355ff',\n '85561fff',\n 'fec355ff',\n 'fec355ff',\n 'fec355ff',\n '85561fff',\n 't',\n 't',\n 't',\n 't',\n '85561fff',\n '85561fff',\n 'fec355ff',\n 'fec355ff',\n 'fec355ff',\n 'fec355ff',\n '85561fff',\n '85561fff',\n '85561fff',\n '85561fff',\n '85561fff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'fec355ff',\n 'fec355ff',\n 'fec355ff',\n 'fec355ff',\n 'fec355ff',\n 'fec355ff',\n 'fec355ff',\n '85561fff',\n 't',\n 't',\n 't',\n 't',\n '85561fff',\n '85561fff',\n '85561fff',\n '85561fff',\n '85561fff',\n 'e7222cff',\n '85561fff',\n '85561fff',\n '85561fff',\n 'e7222cff',\n '85561fff',\n 't',\n 't',\n 't',\n 't',\n '85561fff',\n '85561fff',\n '85561fff',\n '85561fff',\n '85561fff',\n '85561fff',\n '85561fff',\n 'e7222cff',\n '85561fff',\n '85561fff',\n '85561fff',\n 'e7222cff',\n 't',\n 't',\n '85561fff',\n 'fec355ff',\n 'fec355ff',\n '85561fff',\n '85561fff',\n '85561fff',\n '85561fff',\n '85561fff',\n '85561fff',\n 'e7222cff',\n 'e7222cff',\n 'e7222cff',\n 'e7222cff',\n 'e7222cff',\n 't',\n 't',\n '85561fff',\n 'fec355ff',\n 'fec355ff',\n 'fec355ff',\n 't',\n 't',\n 'e7222cff',\n '85561fff',\n 'e7222cff',\n 'e7222cff',\n 'e7222cff',\n 'fec355ff',\n 'e7222cff',\n 'fec355ff',\n 'e7222cff',\n '85561fff',\n '85561fff',\n 't',\n 'fec355ff',\n 't',\n '85561fff',\n 't',\n 'e7222cff',\n 'e7222cff',\n 'e7222cff',\n 'e7222cff',\n 'e7222cff',\n 'e7222cff',\n 'e7222cff',\n 'e7222cff',\n 'e7222cff',\n '85561fff',\n '85561fff',\n 't',\n 't',\n '85561fff',\n '85561fff',\n '85561fff',\n 'e7222cff',\n 'e7222cff',\n 'e7222cff',\n 'e7222cff',\n 'e7222cff',\n 'e7222cff',\n 'e7222cff',\n 'e7222cff',\n 'e7222cff',\n '85561fff',\n '85561fff',\n 't',\n '85561fff',\n '85561fff',\n '85561fff',\n 'e7222cff',\n 'e7222cff',\n 'e7222cff',\n 'e7222cff',\n 'e7222cff',\n 'e7222cff',\n 'e7222cff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '85561fff',\n 't',\n 't',\n 'e7222cff',\n 'e7222cff',\n 'e7222cff',\n 'e7222cff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n ],\n size: { height: 16, width: 16 },\n },\n // Baby Yoda, a.k.a. Grogu\n {\n colors: [\n 't',\n 't',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 't',\n 't',\n 'b',\n 'b',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n 'b',\n 'b',\n 'b',\n 't',\n 't',\n 't',\n 'b',\n 'b',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n 'b',\n 'b',\n 't',\n 't',\n 't',\n 'b',\n 'b',\n 'b',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n 'b',\n 'b',\n 'b',\n '2a871bff',\n '2a871bff',\n 'e7bd69ff',\n 'e7bd69ff',\n 'e7bd69ff',\n 'e7bd69ff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n 'b',\n 'b',\n 'b',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n 'b',\n 'b',\n 'b',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n 'e7bd69ff',\n 'e7bd69ff',\n 'e7bd69ff',\n 'e7bd69ff',\n '2a871bff',\n '2a871bff',\n 'b',\n 't',\n 'b',\n 'b',\n '2a871bff',\n 'e7bd69ff',\n 'e7bd69ff',\n 'e7bd69ff',\n 'e7bd69ff',\n 'e7bd69ff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n 'b',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n 'b',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n 'e7bd69ff',\n 'e7bd69ff',\n 'e7bd69ff',\n 'e7bd69ff',\n 'e7bd69ff',\n '2a871bff',\n 'b',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 'b',\n '2a871bff',\n 'e7bd69ff',\n 'e7bd69ff',\n 'e7bd69ff',\n 'e7bd69ff',\n 'e7bd69ff',\n 'e7bd69ff',\n 'e7bd69ff',\n 'b',\n '2a871bff',\n '2a871bff',\n 'b',\n 'b',\n 'b',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n 'b',\n 'b',\n 'b',\n '2a871bff',\n '2a871bff',\n 'b',\n 'e7bd69ff',\n 'e7bd69ff',\n 'e7bd69ff',\n 'e7bd69ff',\n 'e7bd69ff',\n 'e7bd69ff',\n 'e7bd69ff',\n '2a871bff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n '2a871bff',\n 'e7bd69ff',\n 'e7bd69ff',\n 'e7bd69ff',\n 'e7bd69ff',\n 'e7bd69ff',\n 'e7bd69ff',\n 'b',\n '2a871bff',\n 'b',\n 'b',\n 'b',\n 'ffffffff',\n 'b',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n 'b',\n 'b',\n 'b',\n 'ffffffff',\n 'b',\n '2a871bff',\n 'b',\n 'e7bd69ff',\n 'e7bd69ff',\n 'e7bd69ff',\n 'e7bd69ff',\n 'e7bd69ff',\n 'e7bd69ff',\n '2a871bff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n '2a871bff',\n '2a871bff',\n 'e7bd69ff',\n 'e7bd69ff',\n 'e7bd69ff',\n 'e7bd69ff',\n 'b',\n '2a871bff',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n '2a871bff',\n 'b',\n 'e7bd69ff',\n 'e7bd69ff',\n 'e7bd69ff',\n 'e7bd69ff',\n '2a871bff',\n '2a871bff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n 'b',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n 'b',\n '2a871bff',\n '2a871bff',\n 'b',\n 'b',\n 'b',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n 'b',\n 'b',\n 'b',\n '2a871bff',\n '2a871bff',\n 'b',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n 'b',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n 'b',\n 'b',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n 'b',\n 'b',\n 'b',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n 'b',\n 'b',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'b',\n 'b',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n 'b',\n 'b',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n 'd59c58ff',\n '764c25ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n 'd59c58ff',\n '764c25ff',\n '764c25ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'b',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n '764c25ff',\n 'd59c58ff',\n 'd59c58ff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n 'd59c58ff',\n 'd59c58ff',\n '764c25ff',\n '764c25ff',\n 'd59c58ff',\n 'd59c58ff',\n '764c25ff',\n 'd59c58ff',\n 'd59c58ff',\n 'b',\n 'd59c58ff',\n '764c25ff',\n '764c25ff',\n '764c25ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n '764c25ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n 'd59c58ff',\n 'b',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'b',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n '764c25ff',\n '764c25ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'b',\n 'd59c58ff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n 'd59c58ff',\n 'd59c58ff',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'b',\n 'b',\n 'd59c58ff',\n 'd59c58ff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'b',\n '522c0dff',\n '522c0dff',\n '522c0dff',\n '522c0dff',\n '522c0dff',\n '522c0dff',\n '522c0dff',\n 'b',\n 'b',\n 'b',\n 'b',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'b',\n 'b',\n '764c25ff',\n 'b',\n '522c0dff',\n '522c0dff',\n '522c0dff',\n '522c0dff',\n '522c0dff',\n '522c0dff',\n 'b',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n 'b',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n 'd59c58ff',\n '764c25ff',\n 'd59c58ff',\n 'd59c58ff',\n 'b',\n '2a871bff',\n '2a871bff',\n 'b',\n 'b',\n '522c0dff',\n '522c0dff',\n '522c0dff',\n '522c0dff',\n '522c0dff',\n '522c0dff',\n 'b',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n 'b',\n '764c25ff',\n 'd59c58ff',\n 'd59c58ff',\n '764c25ff',\n 'd59c58ff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n 'd59c58ff',\n 'd59c58ff',\n '764c25ff',\n '764c25ff',\n 'b',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n '2a871bff',\n '2a871bff',\n '2a871bff',\n 'b',\n '764c25ff',\n '764c25ff',\n 'd59c58ff',\n 'd59c58ff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'b',\n 'b',\n '2a871bff',\n '2a871bff',\n 'b',\n '764c25ff',\n '764c25ff',\n '764c25ff',\n '764c25ff',\n '764c25ff',\n '764c25ff',\n '764c25ff',\n 'b',\n 'b',\n 'b',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n '764c25ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n '764c25ff',\n 'd59c58ff',\n 'd59c58ff',\n '764c25ff',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n '764c25ff',\n '764c25ff',\n '764c25ff',\n '764c25ff',\n '764c25ff',\n '764c25ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n '764c25ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n '764c25ff',\n '764c25ff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n 'd59c58ff',\n '764c25ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n '764c25ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n '764c25ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n 'd59c58ff',\n '764c25ff',\n '764c25ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n '764c25ff',\n 'd59c58ff',\n 'd59c58ff',\n '764c25ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n '764c25ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n 'd59c58ff',\n '764c25ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n '764c25ff',\n 'd59c58ff',\n 'd59c58ff',\n '764c25ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n '764c25ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n '764c25ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n '522c0dff',\n '764c25ff',\n 'd59c58ff',\n '764c25ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n '522c0dff',\n '764c25ff',\n 'd59c58ff',\n 'd59c58ff',\n '764c25ff',\n '764c25ff',\n 'd59c58ff',\n 'd59c58ff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n 'd59c58ff',\n '764c25ff',\n 'd59c58ff',\n '764c25ff',\n '764c25ff',\n 'd59c58ff',\n '764c25ff',\n '764c25ff',\n '764c25ff',\n 'd59c58ff',\n '764c25ff',\n '764c25ff',\n 'd59c58ff',\n 'd59c58ff',\n '522c0dff',\n '764c25ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n '764c25ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n 'd59c58ff',\n 'd59c58ff',\n '764c25ff',\n '764c25ff',\n 'd59c58ff',\n '764c25ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n '764c25ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n '764c25ff',\n 'd59c58ff',\n '764c25ff',\n 'd59c58ff',\n '522c0dff',\n '522c0dff',\n '764c25ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'd59c58ff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n '764c25ff',\n '764c25ff',\n 'd59c58ff',\n 'd59c58ff',\n '764c25ff',\n '764c25ff',\n '764c25ff',\n '764c25ff',\n '764c25ff',\n '764c25ff',\n '764c25ff',\n '764c25ff',\n '764c25ff',\n '764c25ff',\n '764c25ff',\n '764c25ff',\n '764c25ff',\n '764c25ff',\n '764c25ff',\n '764c25ff',\n '764c25ff',\n '764c25ff',\n '764c25ff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n ],\n size: { height: 32, width: 43 },\n },\n // Super Saiyan Gohan\n {\n colors: [\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '933b00ff',\n '933b00ff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '933b00ff',\n 't',\n 't',\n '923b00ff',\n 'fcca00ff',\n '933b00ff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '933b00ff',\n 't',\n 't',\n 't',\n '933b00ff',\n '923b00ff',\n 't',\n '933b00ff',\n 'ffe800ff',\n 'fbc900ff',\n '923b00ff',\n 't',\n 't',\n 't',\n 't',\n '00ebfeff',\n '00ebfdff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '923b00ff',\n '933b00ff',\n 't',\n 't',\n '923b00ff',\n 'fcca00ff',\n '933b00ff',\n 'd3a400ff',\n 'ffffffff',\n 'ffffffff',\n 'fbc900ff',\n '923b00ff',\n 't',\n '933b00ff',\n 't',\n 't',\n '00ecfeff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '933b00ff',\n 'ffe800ff',\n '933b00ff',\n '923b00ff',\n 'ffe700ff',\n 'fbc900ff',\n '933b00ff',\n 'd2a300ff',\n 'ffffffff',\n 'ffffffff',\n 'ffe800ff',\n '923a00ff',\n 't',\n '923b00ff',\n 't',\n 't',\n '00ebfeff',\n '00ebfdff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '933b00ff',\n 't',\n '933b00ff',\n 'd2a300ff',\n 'ffe800ff',\n '933b00ff',\n 'ffe800ff',\n 'fcca00ff',\n 'd2a300ff',\n 'd2a300ff',\n 'd2a300ff',\n 'ffffffff',\n 'ffffffff',\n 'fbc900ff',\n '933b00ff',\n 'fbca00ff',\n '923b00ff',\n 't',\n 't',\n 't',\n 't',\n 't',\n '00ebfdff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '923a00ff',\n '933b00ff',\n '933b00ff',\n 'd2a300ff',\n 'ffe800ff',\n '933b00ff',\n 'ffe800ff',\n 'ffe700ff',\n 'd2a300ff',\n 'ffe700ff',\n 'd2a300ff',\n 'ffffffff',\n 'ffffffff',\n 'ffe700ff',\n '923b00ff',\n 'ffe800ff',\n '923b00ff',\n 't',\n '923b00ff',\n 't',\n 't',\n '00ebfdff',\n 't',\n '00ebfdff',\n 't',\n 't',\n 't',\n 't',\n 't',\n '923b00ff',\n 'fbc900ff',\n 'd2a300ff',\n '933b00ff',\n 'd2a300ff',\n '923b00ff',\n 'fcca00ff',\n 'ffe800ff',\n 'd2a300ff',\n 'ffe800ff',\n 'fbc900ff',\n 'd2a300ff',\n 'ffffffff',\n 'ffe800ff',\n 'd2a300ff',\n 'ffffffff',\n '933b00ff',\n '923b00ff',\n '933b00ff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '933b00ff',\n 'ffe800ff',\n 'ffffffff',\n 'd2a300ff',\n '923a00ff',\n 'fbc900ff',\n 'ffe800ff',\n 'd2a300ff',\n 'ffffffff',\n 'ffe800ff',\n 'd2a300ff',\n 'ffe700ff',\n 'd2a300ff',\n 'ffffffff',\n 'ffffffff',\n '933b00ff',\n 'fbc900ff',\n '923a00ff',\n '00ebfdff',\n '00ebfeff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '933b00ff',\n 't',\n 't',\n '923a00ff',\n 'ffe800ff',\n 'ffe800ff',\n 'ffffffff',\n '933b00ff',\n 'd2a300ff',\n 'fcca00ff',\n 'd3a300ff',\n 'ffffffff',\n 'ffffffff',\n 'd2a300ff',\n 'fcca00ff',\n 'd2a300ff',\n 'ffffffff',\n 'ffe800ff',\n 'd2a300ff',\n 'fbc900ff',\n '923b00ff',\n '00ebfeff',\n '933b00ff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '933b00ff',\n '923a00ff',\n '933b00ff',\n '933b00ff',\n 'fcca00ff',\n 'ffe800ff',\n 'ffffffff',\n 'ffffffff',\n 'd2a300ff',\n 'fbc900ff',\n 'd2a300ff',\n 'ffffffff',\n 'ffffffff',\n 'fcca00ff',\n 'd3a300ff',\n 'ffffffff',\n 'ffffffff',\n 'ffe800ff',\n 'd3a400ff',\n 'fbc900ff',\n '933b00ff',\n '933b00ff',\n 't',\n 't',\n 't',\n 't',\n 't',\n '00ebfeff',\n 't',\n '933b00ff',\n 'd2a300ff',\n 'fcca00ff',\n '923b00ff',\n '923b00ff',\n 'ffe800ff',\n 'ffe800ff',\n 'ffffffff',\n 'ffffffff',\n 'd2a300ff',\n 'd2a300ff',\n 'ffffffff',\n 'ffffffff',\n 'ffe800ff',\n 'd2a300ff',\n 'ffffffff',\n 'ffffffff',\n 'ffe800ff',\n 'd2a300ff',\n 'fcca00ff',\n '933b00ff',\n 'd2a300ff',\n '933b00ff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '923b00ff',\n 'fbc900ff',\n 'd2a300ff',\n '933b00ff',\n 'fbc900ff',\n 'ffe800ff',\n 'ffffffff',\n 'ffffffff',\n 'd2a300ff',\n 'd2a300ff',\n 'ffffffff',\n 'ffffffff',\n 'ffffffff',\n 'd3a300ff',\n 'ffffffff',\n 'ffe800ff',\n 'd2a300ff',\n 'fcca00ff',\n '933b00ff',\n 'd2a300ff',\n '933b00ff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '923b00ff',\n 'fbc900ff',\n 'd2a300ff',\n 'fcca00ff',\n 'd2a300ff',\n '933b00ff',\n 'fbc900ff',\n 'ffffffff',\n 'ffffffff',\n 'ffffffff',\n 'd2a300ff',\n 'ffe800ff',\n 'ffffffff',\n 'ffffffff',\n 'd2a300ff',\n '923a00ff',\n '933b00ff',\n '923a00ff',\n 'ffe800ff',\n 'd2a300ff',\n 'd2a300ff',\n '933b00ff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '00ebfeff',\n '00ebfeff',\n '933b00ff',\n 'fbc900ff',\n 'd2a300ff',\n 'fcca00ff',\n 'fbc900ff',\n 'd3a300ff',\n 'ffe800ff',\n 'ffffffff',\n 'ffe800ff',\n '933b00ff',\n '923a00ff',\n 'fbc900ff',\n 'fbc900ff',\n 'fbc900ff',\n 'ffffffff',\n 'ffffffff',\n 'ffe800ff',\n 'ffe800ff',\n '933b00ff',\n '933b00ff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '00ebfeff',\n 't',\n '923a00ff',\n '933b00ff',\n 'fbc900ff',\n '923b00ff',\n 'fbc900ff',\n 'd3a300ff',\n 'd2a300ff',\n 'ffe800ff',\n '933b00ff',\n 'ffd06cff',\n 'ffeaa0ff',\n '933b00ff',\n '933b00ff',\n '923b00ff',\n '923b00ff',\n 'd2a300ff',\n 'fcca00ff',\n 'ffe800ff',\n 'ffffffff',\n '923b00ff',\n 't',\n 't',\n 't',\n 't',\n 't',\n '00ebfeff',\n '00ebfeff',\n '00ebfeff',\n '00ebfeff',\n 't',\n '923a00ff',\n '923b00ff',\n 'd2a300ff',\n 'd2a300ff',\n 'fbc900ff',\n '933b00ff',\n 'fcca00ff',\n '933b00ff',\n 'ffeaa0ff',\n 'ffeaa0ff',\n 'ffeaa0ff',\n 'ffeaa0ff',\n 'ffd06bff',\n 'ffd06bff',\n '933b00ff',\n 'd2a300ff',\n 'fbc900ff',\n 'ffe800ff',\n 'ffffffff',\n '933b00ff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '00ebfeff',\n '00ebfeff',\n '00ebfeff',\n '933b00ff',\n '923b00ff',\n '923b00ff',\n 'd2a300ff',\n 'd3a300ff',\n '933b00ff',\n 'ffd06cff',\n 'ffeaa0ff',\n 'ffeaa0ff',\n 'ffeaa0ff',\n 'ffeaa0ff',\n 'ffeaa0ff',\n 'ffeaa0ff',\n 'ffd06bff',\n '933b00ff',\n '933b00ff',\n 'd3a400ff',\n 'ffe800ff',\n '933b00ff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '923b00ff',\n '923b00ff',\n '933b00ff',\n 'd2a300ff',\n 'd3a400ff',\n 'd3a300ff',\n 'd2a300ff',\n '933b00ff',\n 'ffd06cff',\n '956837ff',\n 'b',\n 'ffd06bff',\n 'ffeaa0ff',\n 'ffeaa0ff',\n 'ffd06bff',\n 'b',\n 'b',\n '933b00ff',\n '923b00ff',\n '923b00ff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '00ebfeff',\n '933b00ff',\n '923b00ff',\n '933b00ff',\n '923b00ff',\n '933b00ff',\n '923b00ff',\n 'ffd06cff',\n 'ffd06bff',\n 'ffffffff',\n 'b',\n '956837ff',\n 'ffd06cff',\n 'b',\n 'b',\n 'b',\n 't',\n 't',\n '933b00ff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '00ecfeff',\n '00ebfeff',\n '923b00ff',\n 'b',\n '956937ff',\n '923b00ff',\n 'ffd06cff',\n 'ffd06cff',\n 'ffffffff',\n '00c400ff',\n 'ffd06cff',\n 'ffd06bff',\n 'e8e8e8ff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n 'ffd06bff',\n 'ffd06cff',\n 'ffd06bff',\n 'ffeaa0ff',\n 'ffe99fff',\n 'ffea9fff',\n 'ffeaa0ff',\n 'ffeaa0ff',\n '956837ff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '00ebfeff',\n 't',\n 't',\n 't',\n 't',\n '00ebfdff',\n '00ebfeff',\n '00ebfdff',\n 't',\n 'b',\n 'b',\n '956836ff',\n 'ffea9fff',\n 'ffeaa0ff',\n 'ffeaa0ff',\n 'ffeaa0ff',\n '956837ff',\n 'ffd06cff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '00ebfeff',\n '00ebfeff',\n 't',\n 't',\n '00ebfeff',\n 't',\n 't',\n '00ebfeff',\n 'b',\n 'b',\n '956937ff',\n '956937ff',\n 'ffe99fff',\n 'ffd06bff',\n '956836ff',\n 'ffd06cff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '00ecfeff',\n '00ebfeff',\n '00ebfeff',\n '00ebfeff',\n 't',\n 'b',\n 'b',\n '890fd3ff',\n 'ffd06bff',\n '956937ff',\n 'b',\n 'b',\n 'ffe99fff',\n 'ffd06cff',\n 'b',\n 'b',\n '00ebfeff',\n '00ebfeff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '00ebfdff',\n 't',\n 't',\n 'b',\n 'ffd06bff',\n '890ed2ff',\n '890ed2ff',\n 'ffd06cff',\n 'ffd06cff',\n '956937ff',\n '956836ff',\n 'b',\n 'b',\n '956937ff',\n '890fd2ff',\n '590c89ff',\n 'b',\n '00ebfdff',\n '00ebfeff',\n 't',\n 't',\n '00ebfeff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '00ebfeff',\n 't',\n 'b',\n 'ffeaa0ff',\n 'ffea9fff',\n '5a0c89ff',\n '890ed2ff',\n '890fd2ff',\n 'ffea9fff',\n 'ffeaa0ff',\n 'ffd06bff',\n '956937ff',\n '956937ff',\n '956937ff',\n '890ed2ff',\n '590c89ff',\n 'b',\n 't',\n '00ebfeff',\n 't',\n '00ebfeff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '00ebfeff',\n '00ecfeff',\n '00ebfdff',\n '00ebfeff',\n '00ebfeff',\n '00ecfeff',\n '5a0d89ff',\n '5a0d8aff',\n '8a0fd3ff',\n '890fd3ff',\n '890fd3ff',\n 'ffeaa0ff',\n 'ffd06bff',\n 'ffd06cff',\n 'ffd06cff',\n '890ed2ff',\n '5a0d8aff',\n 'b',\n 't',\n '00ebfeff',\n '00ebfeff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n '956837ff',\n 'ffd06cff',\n '00ebfeff',\n '00ebfeff',\n '00ebfdff',\n '00ebfeff',\n '890ed2ff',\n '590c89ff',\n '5a0d89ff',\n '890fd2ff',\n 'ffd06bff',\n 'ffd06bff',\n '890fd3ff',\n '5a0c89ff',\n 'b',\n 't',\n 't',\n 't',\n '00ebfeff',\n '00ebfeff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n 'ffd06bff',\n 'ffd06cff',\n '956836ff',\n 'b',\n 'b',\n '00ebfdff',\n '00ebfeff',\n '5a0d89ff',\n '5a0c89ff',\n '590c89ff',\n '890ed2ff',\n '5a0d89ff',\n '890fd2ff',\n '590c89ff',\n 'b',\n 't',\n 't',\n 't',\n '00ebfdff',\n '00ebfeff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n 'ffd06bff',\n 'ffeaa0ff',\n 'b',\n 'b',\n 't',\n 't',\n 'b',\n '5a0d8aff',\n '5a0c89ff',\n '5a0d8aff',\n '5a0c89ff',\n '590c89ff',\n '5a0d89ff',\n '590c89ff',\n '590c89ff',\n 'b',\n 'b',\n '00ebfdff',\n '00ebfeff',\n '00ebfeff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n '000087ff',\n 'b',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'ffd06cff',\n 'ffd06bff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n 'b',\n 'ffeaa0ff',\n 'ffd06cff',\n 'b',\n 't',\n 't',\n 't',\n 'b',\n 'ff0000ff',\n 'e30000ff',\n 'e30000ff',\n 'ff0000ff',\n 'ff0000ff',\n 'e30000ff',\n 'b',\n '956836ff',\n 'ffd06bff',\n 'ffd06cff',\n 'b',\n 't',\n 'b',\n 'b',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n '956837ff',\n '956937ff',\n 'b',\n 'b',\n 't',\n 't',\n 't',\n 'b',\n 'ff0000ff',\n 'ff0000ff',\n 'e30000ff',\n 'e30000ff',\n 'e30000ff',\n 'ff0000ff',\n 'b',\n 'b',\n '956836ff',\n '80fbffff',\n '80fbffff',\n 'b',\n 'ffeaa0ff',\n '00ebfeff',\n '00ebfeff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 'b',\n 'ffeaa0ff',\n 'ffeaa0ff',\n '956836ff',\n '956837ff',\n 'b',\n 't',\n 'b',\n '5a0d8aff',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n '890ed2ff',\n 'b',\n 'b',\n '000088ff',\n '000088ff',\n 'b',\n 'ffd06cff',\n '00ebfeff',\n '956837ff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 'b',\n 'ffeaa0ff',\n '956937ff',\n 'ffeaa0ff',\n 'ffd06cff',\n 'b',\n 'b',\n 'b',\n '5a0d8aff',\n '890ed2ff',\n '890fd2ff',\n '890ed2ff',\n '5a0d89ff',\n '890fd3ff',\n '5a0d89ff',\n '890fd3ff',\n 'b',\n 't',\n 'b',\n '00ebfeff',\n '00ebfeff',\n '00ebfeff',\n '00ebfeff',\n 'ffeaa0ff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n 'ffd06bff',\n 'ffd06cff',\n '956837ff',\n 'ffd06cff',\n 'b',\n '590c89ff',\n '890fd3ff',\n '890fd2ff',\n '890ed2ff',\n '5a0c89ff',\n '5a0d8aff',\n '890fd3ff',\n '590c89ff',\n '890ed2ff',\n 'b',\n 't',\n 't',\n 'b',\n 'ffd06bff',\n '956836ff',\n '956937ff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n 'b',\n 'ffd06cff',\n 'b',\n 'b',\n '590c89ff',\n '890ed2ff',\n '8a0fd3ff',\n '890ed2ff',\n '5a0d8aff',\n 'b',\n '5a0d89ff',\n '890ed2ff',\n '890fd2ff',\n 'b',\n 't',\n 't',\n 't',\n 'b',\n 'ffeaa0ff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n 'b',\n '5a0d89ff',\n '5a0d89ff',\n '890fd3ff',\n '890fd3ff',\n '590c89ff',\n '5a0c89ff',\n 'b',\n 'b',\n '890ed2ff',\n '890ed2ff',\n '590c89ff',\n 'b',\n 't',\n 't',\n 't',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n '5a0d8aff',\n '890ed2ff',\n '890ed2ff',\n '890ed2ff',\n '5a0c89ff',\n '590c89ff',\n 'b',\n '590c89ff',\n '890fd3ff',\n '890fd2ff',\n '590c89ff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n '5a0d89ff',\n '5a0d89ff',\n '890ed2ff',\n '890ed2ff',\n '590c89ff',\n '590c89ff',\n 'b',\n 'b',\n '5a0d89ff',\n '890fd3ff',\n '890fd3ff',\n '00ebfeff',\n '00ebfdff',\n '00ebfeff',\n 't',\n 't',\n 't',\n '00ecfeff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '00ebfeff',\n 't',\n 't',\n 't',\n 'b',\n '5a0c89ff',\n '5a0d89ff',\n '890fd2ff',\n '890ed2ff',\n '5a0c89ff',\n 'b',\n 't',\n 'b',\n '5a0d89ff',\n '5a0d89ff',\n '00ebfeff',\n '5a0c89ff',\n 'b',\n '00ebfeff',\n '00ebfeff',\n 't',\n '00ebfeff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '00ebfeff',\n 't',\n 't',\n 'b',\n '5a0d8aff',\n '5a0c89ff',\n '5a0d89ff',\n '5a0d8aff',\n '890ed2ff',\n '5a0d89ff',\n 'b',\n 't',\n 'b',\n '5a0d89ff',\n '00ebfeff',\n '5a0d8aff',\n '5a0c89ff',\n 'b',\n 't',\n '00ebfdff',\n '00ebfeff',\n '00ebfdff',\n 't',\n 't',\n 't',\n '00ebfeff',\n 't',\n 't',\n '00ebfdff',\n '00ebfeff',\n '00ebfeff',\n '00ebfeff',\n 'b',\n '5a0d89ff',\n '5a0c89ff',\n '5a0d89ff',\n '5a0d89ff',\n '5a0c89ff',\n 'b',\n 't',\n 't',\n 'b',\n '5a0c89ff',\n '5a0d8aff',\n '5a0c89ff',\n '5a0d89ff',\n 'b',\n 't',\n 't',\n 't',\n '00ecfeff',\n 't',\n 't',\n 't',\n 't',\n '00ebfeff',\n '00ebfeff',\n '00ebfdff',\n 't',\n 't',\n '00ebfeff',\n '00ebfdff',\n '590c89ff',\n '5a0d89ff',\n '5a0d8aff',\n '5a0d89ff',\n '5a0d89ff',\n 'b',\n 't',\n 't',\n 'b',\n '5a0c89ff',\n '5a0d8aff',\n '5a0c89ff',\n '5a0d89ff',\n 'b',\n 't',\n 't',\n '00ebfeff',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '00ebfdff',\n 't',\n 't',\n 't',\n 'b',\n '00ebfeff',\n '00ebfdff',\n '00ebfdff',\n '00ebfdff',\n '00ebfeff',\n '5a0d89ff',\n 'b',\n 't',\n 't',\n 'b',\n '5a0d8aff',\n '5a0d89ff',\n '590c89ff',\n '5a0d89ff',\n 'b',\n 't',\n '00ebfdff',\n 't',\n '00ebfeff',\n 't',\n 't',\n 't',\n 't',\n 't',\n '00ecfeff',\n 't',\n 't',\n 't',\n 'b',\n '5a0d8aff',\n '00ebfdff',\n '00ebfeff',\n '590c89ff',\n '5a0d8aff',\n '00ebfeff',\n 't',\n 't',\n 'b',\n '5a0d89ff',\n '590c89ff',\n '5a0d89ff',\n '590c89ff',\n '5a0c89ff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '00ebfeff',\n 't',\n 't',\n 't',\n 'b',\n '5a0d89ff',\n '5a0d89ff',\n '5a0c89ff',\n '5a0d89ff',\n '590c89ff',\n 'b',\n '00ebfdff',\n 't',\n 'b',\n '890fd3ff',\n '5a0d8aff',\n '5a0d8aff',\n '5a0d89ff',\n '5a0d89ff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '00ebfeff',\n '00ebfeff',\n 't',\n 'b',\n '8a0fd3ff',\n '5a0c89ff',\n '5a0c89ff',\n '5a0d89ff',\n '5a0d89ff',\n '5a0d8aff',\n 'b',\n 't',\n 't',\n 'b',\n '890ed2ff',\n '890ed2ff',\n '590c89ff',\n '5a0d89ff',\n '5a0d89ff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n '00ebfeff',\n '00ebfdff',\n 'b',\n '890ed2ff',\n '890ed2ff',\n '5a0d89ff',\n '890fd3ff',\n '5a0d89ff',\n 'b',\n 't',\n 't',\n 't',\n 'b',\n '590c89ff',\n '890ed2ff',\n '890fd2ff',\n '890ed2ff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n '890ed2ff',\n '890ed2ff',\n '890ed2ff',\n '590c89ff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n '956837ff',\n '956937ff',\n '956836ff',\n '956837ff',\n 'b',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n '956836ff',\n '956837ff',\n '956937ff',\n '956937ff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n '956836ff',\n '956937ff',\n '956837ff',\n 'd1924cff',\n 'd0914cff',\n '956837ff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n 'd0914cff',\n 'd1924cff',\n '956937ff',\n '956937ff',\n '956937ff',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 'b',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n 't',\n ],\n size: { height: 55, width: 29 },\n },\n];\n\nconst drawings: Array<Array<string>> = [];\n\nconst getDrawing: (index: number) => Array<string> = (index) => {\n let generatedDrawing = drawings[index];\n\n if (generatedDrawing) {\n return generatedDrawing;\n }\n\n const {\n colors,\n size: { height, width },\n } = drawingsDescription[index];\n\n // Design\n const line = Array(width).fill('%c ').join(' ');\n const design = Array(height).fill(line).join('\\n');\n\n generatedDrawing = [\n design,\n ...colors.map((c) => {\n if (c === 't') {\n return 'background-color:#00000000';\n } else if (line === 'b') {\n return 'background-color:#000000ff';\n }\n return `background-color:#${c}`;\n }),\n ];\n\n drawings[index] = generatedDrawing;\n return generatedDrawing;\n};\n\nconst showEE: () => void = () => {\n const i = getRandomInteger(0, drawingsDescription.length - 1);\n logDebug(...getDrawing(i));\n};\n\nexport { showEE };\n","/* @flow */\n\nimport './MainLayout.css';\nimport '../../ku.js';\nimport '../../ku.css';\nimport * as React from 'react';\nimport { type AllSettledPromises, SettledPromiseFulfilled } from '../../helpers/jsHelpers/promise';\nimport { AvenueType, type FOCUSED_AVENUE_TYPE } from '../../helpers/ui/avenue/types';\nimport { type EXTENDED_ITEM, ExtendedItemType } from '../../helpers/ui/item/types';\nimport {\n ItemType,\n type NETGEM_API_V8_FEED_ITEM,\n type NETGEM_API_V8_ITEM_LOCATION_TYPE,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_CATCHUP,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_VOD,\n} from '../../libs/netgemLibrary/v8/types/FeedItem';\nimport { METADATA_KIND_PROGRAM, METADATA_KIND_SERIES, type MetadataKind } from '../../libs/netgemLibrary/v8/types/MetadataProgram';\nimport { Messenger, MessengerEvents } from '@ntg/utils/dist/messenger';\nimport {\n NETGEM_API_V8_WIDGET_ITEM_CLICK_ACTION_CARD,\n NETGEM_API_V8_WIDGET_ITEM_CLICK_ACTION_HUB,\n NETGEM_API_V8_WIDGET_ITEM_CLICK_ACTION_PLAYER,\n NETGEM_API_V8_WIDGET_ITEM_CLICK_ACTION_SWITCH,\n type NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE,\n type NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE1,\n type NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE2,\n} from '../../libs/netgemLibrary/v8/types/WidgetConfig';\nimport { RegistrationType, type UserInfo } from '../../redux/appRegistration/types/types';\nimport { enterTheaterMode, exitTheaterMode, resetGridSectionId, resetSectionPageIndices, updateDisplayPaywallSubscription, updateFocusedAvenue, updateSetting } from '../../redux/ui/actions';\nimport { getValidHub, sendV8HubRequest } from '../../redux/netgemApi/actions/v8/hub';\nimport { hideModal, reopenModalCard, showAvenueModal } from '../../redux/modal/actions';\nimport { logDebug, logError, logInfo, logWarning } from '../../helpers/debug/debug';\nimport { APPLICATION_ID } from '../../helpers/applicationCustomization/types';\nimport type { AVENUE_DATA_MODAL_TYPE } from '../modal/avenueModal/AvenueModal';\nimport AccurateTimestamp from '../../helpers/dateTime/AccurateTimestamp';\nimport AvenueView from '../avenue/Avenue';\nimport { type BasicFunction } from '@ntg/utils/dist/types';\nimport type { CARD_DATA_MODAL_TYPE } from '../modal/cardModal/CardModalConstsAndTypes';\nimport CircleLoader from '../loader/circleLoader';\nimport type { CombinedReducers } from '../../redux/reducers';\nimport type { Dispatch } from '../../redux/types/types';\nimport ErrorBoundary from '../errorBoundary/ErrorBoundary';\nimport { FEATURE_NPVR } from '../../redux/appConf/constants';\nimport type { FeedRequestFunction } from '../../libs/netgemLibrary/v8/types/Feed';\nimport Footer from '../footer/Footer';\nimport Header from '../header/Header';\nimport HotKeys from '../../helpers/hotKeys/hotKeys';\nimport ImageCarousel from '../carousel/ImageCarousel';\nimport LocalStorageManager from '../../helpers/localStorage/localStorageManager';\nimport { MILLISECONDS_PER_WEEK } from '../../helpers/dateTime/Format';\nimport type { ModalState } from '../../redux/modal/reducers';\nimport type { NETGEM_API_V8_HUB } from '../../libs/netgemLibrary/v8/types/Hub';\nimport type { NETGEM_API_V8_REQUEST_RESPONSE } from '../../libs/netgemLibrary/v8/types/RequestResponse';\nimport type { NETGEM_API_V8_URL_DEFINITION } from '../../libs/netgemLibrary/v8/types/NtgVideoFeed';\nimport { NO_AVENUE_INDEX } from '../navigationMenu/NavigationMenu';\nimport { ONE_THOUSAND } from '../player/constantsAndTypes';\nimport Player from '../player/Player';\nimport { Setting } from '../../helpers/settings/types';\nimport { type SettingValueType } from '../settings/SettingsConstsAndTypes';\nimport type { ShakaOfflineContent } from '../player/implementation/shakaTypes';\nimport { StorageKeys } from '../../helpers/localStorage/keys';\nimport VideoCarousel from '../carousel/VideoCarousel';\nimport { buildFeedItem } from '../../libs/netgemLibrary/v8/helpers/Item';\nimport clsx from 'clsx';\nimport { connect } from 'react-redux';\nimport { deleteWishlist } from '../../redux/netgemApi/actions/personalData/wishlist';\nimport { getAvenueFromId } from '../../helpers/ui/avenue/helpers';\nimport { getIntegerPercentage } from '../../helpers/maths/maths';\nimport { getMainAvenue } from '../../redux/ui/reducers/helpers';\nimport { hasPendingOperation } from '../../helpers/rights/pendingOperations';\nimport { hasPods } from '../../helpers/rights/userInfo';\nimport i18next from 'i18next';\nimport { ignoreIfAborted } from '../../libs/netgemLibrary/helpers/cancellablePromise/promiseHelper';\nimport { isTabHidden } from '../../helpers/ui/browser';\nimport log from 'loglevel';\nimport { openFooterPage } from '@ntg/utils/dist/footer';\nimport { saveSearchString } from '../../helpers/search/search';\nimport search from '../../redux/netgemApi/actions/v8/search';\nimport sendV8AssetIdForDeeplinkRequest from '../../redux/netgemApi/actions/v8/deeplink';\nimport sendV8CustomStrategyRequest from '../../redux/netgemApi/actions/v8/customStrategyRequest';\nimport sendV8LocationCatchupForAssetRequest from '../../redux/netgemApi/actions/v8/catchupForAsset';\nimport sendV8LocationEpgForAssetRequest from '../../redux/netgemApi/actions/v8/epgForAsset';\nimport sendV8LocationVodForAssetRequest from '../../redux/netgemApi/actions/v8/vodForAsset';\nimport sendV8MetadataRequest from '../../redux/netgemApi/actions/v8/metadata';\nimport { showDebug as showChargebeeDebug } from '../../helpers/applicationCustomization/externalPaymentSystem';\nimport { showEE } from '../../helpers/debug/ee';\nimport { togglePackPurchase } from '../../redux/appConf/actions';\n\n/* eslint-disable no-inline-comments, capitalized-comments */\nconst NpvrManagement = React.lazy(() => import(/* webpackPreload: true */ '../npvrManagement/NpvrManagement'));\nconst Settings = React.lazy(() => import(/* webpackPreload: true */ '../settings/Settings'));\n/* eslint-enable no-inline-comments, capitalized-comments */\n\n// Delay before actually restoring vertical scroll position (because we have to wait a little before everything is displayed)\nconst VERTICAL_POSITION_RESTORE_DELAY = 200;\n\n// Vertical scroll position from which the header becomes opaque\nconst SCROLL_THRESHOLD = 400;\n\n// Safari VOD error special workaround: initial backoff time (in s)\nconst SAFARI_VOD_WORKAROUND_MINIMUM_BACKOFF_TIME = 12;\n\n// Safari VOD error special workaround: backoff increment between retries (in s)\nconst SAFARI_VOD_WORKAROUND_BACKOFF_TIME_STEP = 3;\n\n// Safari VOD error special workaround: maximum backoff time before giving up (in s)\nconst SAFARI_VOD_WORKAROUND_MAXIMUM_BACKOFF_TIME = 32;\n\ntype ReduxMainLayoutDispatchToPropsType = {|\n +clearDisplayPaywallSubscription: BasicFunction,\n +localDeleteWishlist: () => Promise<any>,\n +localEnterTheaterMode: BasicFunction,\n +localExitTheaterMode: BasicFunction,\n +localHideModal: (shouldBeReopenedLater?: boolean) => void,\n +localReopenModalCard: BasicFunction,\n +localResetGridSectionId: BasicFunction,\n +localResetSectionPageIndices: () => void,\n +localSearch: (signal?: AbortSignal) => Promise<any>,\n +localSendV8AssetIdForDeeplinkRequest: (type: ItemType, deeplinkParameter: string, signal?: AbortSignal) => Promise<any>,\n +localSendV8CustomStrategyRequest: (urlDefinition: NETGEM_API_V8_URL_DEFINITION, item: NETGEM_API_V8_FEED_ITEM, signal?: AbortSignal) => Promise<any>,\n +localSendV8HubRequest: (hubKey: string, signal?: AbortSignal) => Promise<any>,\n +localSendV8LocationCatchupForAssetRequest: FeedRequestFunction,\n +localSendV8LocationEpgForAssetRequest: FeedRequestFunction,\n +localSendV8LocationVodForAssetRequest: FeedRequestFunction,\n +localSendV8MetadataRequest: (assetId: string, type: MetadataKind, signal?: AbortSignal) => Promise<any>,\n +localShowAvenueModal: (avenueData: AVENUE_DATA_MODAL_TYPE) => void,\n +localTogglePackPurchase: () => void,\n +localUpdateFocusedAvenue: (index: number, type: AvenueType, hubItem?: NETGEM_API_V8_FEED_ITEM, hub?: NETGEM_API_V8_HUB, searchString?: string) => void,\n +localUpdateSetting: (setting?: Setting, value: SettingValueType) => Promise<any>,\n|};\n\ntype ReduxMainLayoutReducerStateType = {|\n +avenueList: NETGEM_API_V8_HUB | null,\n +deeplink: ?string,\n +defaultOnItemClick: ?NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE,\n +displaySubscriptionPaywall: boolean,\n +focusedAvenue: FOCUSED_AVENUE_TYPE | null,\n +guruWebsiteUrl: string,\n +isDebugModeEnabled: boolean,\n +isInTheaterMode: boolean,\n +isNpvrFeatureEnabled: boolean,\n +isRegisteredAsGuest: boolean,\n +openModals: Array<ModalState>,\n +userInfo: ?UserInfo,\n|};\n\ntype MainLayoutPropType = {||};\n\ntype CompleteMainLayoutPropType = {|\n ...MainLayoutPropType,\n ...ReduxMainLayoutDispatchToPropsType,\n ...ReduxMainLayoutReducerStateType,\n|};\n\ntype MainLayoutStateType = {|\n child: Array<React.Node>,\n isHeaderLoaded: boolean,\n isScrolling: boolean,\n playerItem: EXTENDED_ITEM | null,\n playerOfflineContent: ShakaOfflineContent | null,\n previousVerticalPosition: {| key: string, scroll: number |} | null,\n safariWorkaroundBackoffTime: number,\n safariWorkaroundItem: EXTENDED_ITEM | null,\n safariWorkaroundProgress: number,\n|};\n\nconst InitialState: $ReadOnly<MainLayoutStateType> = Object.freeze({\n child: [],\n isHeaderLoaded: false,\n isScrolling: false,\n playerItem: null,\n playerOfflineContent: null,\n previousVerticalPosition: null,\n safariWorkaroundBackoffTime: SAFARI_VOD_WORKAROUND_MINIMUM_BACKOFF_TIME,\n safariWorkaroundItem: null,\n safariWorkaroundProgress: -1,\n});\n\nconst LoadedHeaderState: MainLayoutStateType = {\n ...InitialState,\n isHeaderLoaded: true,\n};\n\nclass MainLayoutView extends React.PureComponent<CompleteMainLayoutPropType, MainLayoutStateType> {\n abortController: AbortController;\n\n exploreAvenueIndex: number | null;\n\n isDeeplinkHandled: boolean;\n\n isSectionSliding: boolean;\n\n mainLayout: React.ElementRef<any>;\n\n safariWorkaroundTimer: TimeoutID | null;\n\n visibilityChangeEventName: ?string;\n\n constructor(props: CompleteMainLayoutPropType) {\n super(props);\n\n this.abortController = new AbortController();\n this.exploreAvenueIndex = null;\n this.isDeeplinkHandled = false;\n this.isSectionSliding = false;\n this.safariWorkaroundTimer = null;\n this.visibilityChangeEventName = null;\n\n this.state = { ...InitialState };\n }\n\n componentDidMount() {\n const { avenueList, focusedAvenue, localUpdateFocusedAvenue } = this.props;\n\n // Tell application container that app is loaded (used to prevent from showing loading animation again)\n Messenger.emit(MessengerEvents.APPLICATION_FULLY_LOADED);\n\n Messenger.on(MessengerEvents.AVENUE_RESET, this.moveToTop);\n Messenger.on(MessengerEvents.ITEM_CLICKED, this.executeItemClick);\n Messenger.on(MessengerEvents.MANAGE_SUPER_STREAM, this.manageSuperStream);\n Messenger.on(MessengerEvents.MOVE_TO_TOP, this.moveToTop);\n Messenger.on(MessengerEvents.OPEN_EXPLORE_MODAL, this.openExploreModal);\n Messenger.on(MessengerEvents.OPEN_GLOBAL_SETTINGS, this.openGlobalSettingsScreen);\n Messenger.on(MessengerEvents.OPEN_NPVR_MANAGEMENT_SCREEN, this.openNpvrManagementScreen);\n Messenger.on(MessengerEvents.OPEN_PLAYER, this.openPlayer);\n Messenger.on(MessengerEvents.OPEN_TILE_TYPES_AVENUE, this.openTileTypesAvenue);\n Messenger.on(MessengerEvents.OPEN_GRID_AVENUE, this.openGridAvenue);\n Messenger.on(MessengerEvents.RESTORE_POSITION, this.restorePosition);\n Messenger.on(MessengerEvents.SECTION_SLIDING_UPDATE, this.updateSectionSliding);\n\n if (document.hidden !== undefined) {\n this.visibilityChangeEventName = 'visibilitychange';\n // $FlowFixMe\n } else if (document.mozHidden !== undefined) {\n this.visibilityChangeEventName = 'mozvisibilitychange';\n // $FlowFixMe\n } else if (document.msHidden !== undefined) {\n this.visibilityChangeEventName = 'msvisibilitychange';\n // $FlowFixMe\n } else if (document.webkitHidden !== undefined) {\n this.visibilityChangeEventName = 'webkitvisibilitychange';\n }\n if (this.visibilityChangeEventName) {\n document.addEventListener(this.visibilityChangeEventName, this.checkVisibility, { passive: true });\n }\n\n this.setDebugFunctions();\n\n // Load focused avenue at startup (either main avenue if specified or first avenue otherwise)\n if (focusedAvenue) {\n const { index, searchString, type } = focusedAvenue;\n\n if (type === AvenueType.Search) {\n // Case when user signs in while search avenue is open\n if (searchString) {\n // Valid search string\n this.handleOnSearch(searchString);\n } else {\n // Display main avenue as a fallback\n const mainAvenue = getMainAvenue(avenueList);\n localUpdateFocusedAvenue(mainAvenue?.index ?? 0, mainAvenue?.type ?? AvenueType.Regular);\n }\n } else {\n // All other cases\n this.loadAvenue(index, type);\n }\n }\n }\n\n componentDidUpdate(prevProps: CompleteMainLayoutPropType) {\n const { focusedAvenue, isDebugModeEnabled, isInTheaterMode, localResetSectionPageIndices } = this.props;\n const { focusedAvenue: prevFocusedAvenue, isDebugModeEnabled: prevIsDebugModeEnabled, isInTheaterMode: prevIsInTheaterMode } = prevProps;\n\n if (isDebugModeEnabled !== prevIsDebugModeEnabled) {\n this.setDebugFunctions();\n }\n\n if (isInTheaterMode !== prevIsInTheaterMode) {\n if (!isInTheaterMode) {\n this.handleTheaterModeExited();\n }\n }\n\n if (focusedAvenue && prevFocusedAvenue) {\n const { hub, hubItem, index, searchString, type } = focusedAvenue;\n const { hub: prevHub, hubItem: prevHubItem, index: prevIndex, searchString: prevSearchString } = prevFocusedAvenue;\n\n if (focusedAvenue !== prevFocusedAvenue && ((index !== NO_AVENUE_INDEX && (index !== prevIndex || hubItem !== prevHubItem || hub !== prevHub)) || type === AvenueType.Search)) {\n // Avenue change: load new avenue\n\n // Reset saved positions for all sections, except when the same universe avenue is reloaded (after exiting the player or when coming back from a hidden avenue, for instance)\n if (searchString !== prevSearchString || ((index !== prevIndex || type === AvenueType.Explore) && (!hubItem || hubItem?.id !== prevHubItem?.id))) {\n localResetSectionPageIndices();\n }\n\n this.loadAvenue(index, type, hub !== undefined && type !== AvenueType.Explore && type !== AvenueType.Search, hubItem, hub);\n }\n }\n }\n\n componentWillUnmount() {\n const { abortController, visibilityChangeEventName } = this;\n\n this.resetSafariWorkaroundTimer();\n\n abortController.abort('Component MainLayout will unmount');\n\n Messenger.off(MessengerEvents.AVENUE_RESET, this.moveToTop);\n Messenger.off(MessengerEvents.ITEM_CLICKED, this.executeItemClick);\n Messenger.off(MessengerEvents.MANAGE_SUPER_STREAM, this.manageSuperStream);\n Messenger.off(MessengerEvents.MOVE_TO_TOP, this.moveToTop);\n Messenger.off(MessengerEvents.OPEN_EXPLORE_MODAL, this.openExploreModal);\n Messenger.off(MessengerEvents.OPEN_GLOBAL_SETTINGS, this.openGlobalSettingsScreen);\n Messenger.off(MessengerEvents.OPEN_NPVR_MANAGEMENT_SCREEN, this.openNpvrManagementScreen);\n Messenger.off(MessengerEvents.OPEN_PLAYER, this.openPlayer);\n Messenger.off(MessengerEvents.OPEN_TILE_TYPES_AVENUE, this.openTileTypesAvenue);\n Messenger.off(MessengerEvents.RESTORE_POSITION, this.restorePosition);\n Messenger.off(MessengerEvents.SECTION_SLIDING_UPDATE, this.updateSectionSliding);\n\n if (visibilityChangeEventName) {\n document.removeEventListener(visibilityChangeEventName, this.checkVisibility, { passive: true });\n }\n }\n\n // Debug functions only accessible through browser's console\n setDebugFunctions: () => void = () => {\n const { isDebugModeEnabled, localDeleteWishlist, localSendV8MetadataRequest, localTogglePackPurchase, localUpdateSetting } = this.props;\n\n if (isDebugModeEnabled) {\n showEE();\n logDebug('Debug mode ON');\n window.dbg = {\n changeLanguage: (l: string, callback?: BasicFunction) => i18next.changeLanguage(l, callback),\n checkVersion: () => Messenger.emit(MessengerEvents.CHECK_VERSION, true),\n deleteWhishlistFromCloud: localDeleteWishlist,\n emit: (eventName: string, ...args: Array<any>) => Messenger.emit(eventName, ...args),\n flushDataCollector: () => Messenger.emit(MessengerEvents.FLUSH_COLLECTOR),\n getAssetMetadata: (assetId: string) =>\n localSendV8MetadataRequest(assetId, assetId.startsWith('series://') ? METADATA_KIND_SERIES : METADATA_KIND_PROGRAM).then((response) => logInfo(response)),\n getLogLevel: () => log.getLevel(),\n notifyError: (msg, options) =>\n Messenger.emit(MessengerEvents.NOTIFY_ERROR, msg, {\n autoClose: false,\n ...options,\n }),\n notifyInfo: (msg, options) =>\n Messenger.emit(MessengerEvents.NOTIFY_INFO, msg, {\n autoClose: false,\n ...options,\n }),\n notifySuccess: (msg, options) =>\n Messenger.emit(MessengerEvents.NOTIFY_SUCCESS, msg, {\n autoClose: false,\n ...options,\n }),\n notifyWarning: (msg, options) =>\n Messenger.emit(MessengerEvents.NOTIFY_WARNING, msg, {\n autoClose: false,\n ...options,\n }),\n now: (inMs: boolean) => (inMs ? AccurateTimestamp.now() : AccurateTimestamp.nowAsIsoString()),\n openNpvr: this.openNpvrManagementScreen,\n refreshAuthToken: () => Messenger.emit(MessengerEvents.REFRESH_AUTHENTICATION_TOKEN),\n refreshHub: () => Messenger.emit(MessengerEvents.REFRESH_HUB),\n refreshNpvr: this.refreshNpvr,\n setSetting: (name: string, value: SettingValueType) => (Setting.isValid(name) ? localUpdateSetting(Setting.cast(name), value) : logError(`Unknown setting name \"${name}\"`)),\n showChargebeeInfo: showChargebeeDebug,\n showFinishingLivePrograms: (itemCountPerPage?: number, maxTime?: number, maxItems?: number) =>\n Messenger.emit(MessengerEvents.DEBUG_SHOW_FINISHING_LIVE_PROGRAMS, itemCountPerPage, maxTime, maxItems),\n showHotKeys: HotKeys.listHotKeys,\n togglePackPurchase: localTogglePackPurchase,\n };\n } else {\n logInfo('Debug mode OFF');\n window.dbg = null;\n }\n };\n\n resetSafariWorkaroundTimer: () => void = () => {\n const { safariWorkaroundTimer } = this;\n\n if (safariWorkaroundTimer) {\n clearTimeout(safariWorkaroundTimer);\n this.safariWorkaroundTimer = null;\n }\n };\n\n handleOnLogoLoaded: () => void = () => {\n this.setState({ isHeaderLoaded: true });\n };\n\n checkVisibility: () => void = () => {\n const isHidden = isTabHidden();\n\n if (isHidden === null) {\n return;\n }\n\n if (isHidden) {\n Messenger.emit(MessengerEvents.VIDEO_CAROUSEL_TRAILER_HIDDEN);\n } else {\n Messenger.emit(MessengerEvents.VIDEO_CAROUSEL_TRAILER_VISIBLE);\n }\n };\n\n handleOnScroll: () => void = () => {\n const { isInTheaterMode } = this.props;\n const { mainLayout } = this;\n\n if (isInTheaterMode) {\n return;\n }\n\n this.setState({ isScrolling: mainLayout.scrollTop >= SCROLL_THRESHOLD });\n };\n\n enterTheaterMode: (item: EXTENDED_ITEM | ShakaOfflineContent) => void = (item) => {\n const { localEnterTheaterMode } = this.props;\n\n Messenger.emit(MessengerEvents.VIDEO_CAROUSEL_TRAILER_HIDDEN);\n\n const extendedItem: EXTENDED_ITEM | null = item.type ? (item: EXTENDED_ITEM) : null;\n const offlineContent: ShakaOfflineContent | null = item.offlineUri ? (item: ShakaOfflineContent) : null;\n\n // Close any open modal but save it for reopening after player exited if it's a card\n this.closeModal(true);\n this.storePosition().then(() => {\n this.setState({ playerItem: extendedItem, playerOfflineContent: offlineContent });\n localEnterTheaterMode();\n });\n };\n\n exitTheaterMode: () => void = () => {\n const { localExitTheaterMode, localReopenModalCard } = this.props;\n const { playerItem } = this.state;\n\n this.setState({ playerItem: null, playerOfflineContent: null });\n localExitTheaterMode();\n\n // Check if player was opened from a card and if an expanded item index has been saved\n const data = LocalStorageManager.loadObject(StorageKeys.CardExpandedItemIndex, null);\n if (data && playerItem?.openFromCard) {\n data.playerExit = true;\n LocalStorageManager.save(StorageKeys.CardExpandedItemIndex, data);\n }\n\n // Reopen last modal card if any\n localReopenModalCard();\n };\n\n handleTheaterModeExited: () => void = () => {\n this.restorePosition();\n Messenger.emit(MessengerEvents.VIDEO_CAROUSEL_TRAILER_VISIBLE);\n };\n\n moveToTop: (savePosition?: boolean) => void = (savePosition = false) => {\n const { mainLayout } = this;\n\n const promise = savePosition ? this.storePosition() : Promise.resolve();\n promise.then(() => (mainLayout.scrollTop = 0));\n };\n\n buildPreviousPositionKey: () => string = () => {\n const { focusedAvenue } = this.props;\n\n if (!focusedAvenue) {\n return '';\n }\n\n return `${focusedAvenue.index}-${focusedAvenue.hubItem?.id ?? 'na'}-${focusedAvenue.searchString ?? 'na'}`;\n };\n\n storePosition: () => Promise<void> = () => {\n const { mainLayout } = this;\n\n return new Promise((resolve) => {\n this.setState({ previousVerticalPosition: { key: this.buildPreviousPositionKey(), scroll: mainLayout.scrollTop } }, resolve);\n });\n };\n\n restorePosition: () => void = () => {\n const { previousVerticalPosition } = this.state;\n const { mainLayout } = this;\n\n if (previousVerticalPosition) {\n const { key, scroll } = previousVerticalPosition;\n // Check if it's the same avenue before restoring position\n if (key === this.buildPreviousPositionKey()) {\n // Wait a little bit before actually restoring position while everything loads up (layout shift, etc.)\n setTimeout(() => {\n mainLayout.scrollTop = scroll;\n this.setState({ previousVerticalPosition: null });\n }, VERTICAL_POSITION_RESTORE_DELAY);\n return;\n }\n }\n\n // In all other cases, move to top\n mainLayout.scrollTop = 0;\n };\n\n openCard: (fullItem: EXTENDED_ITEM, urlDefinition: ?NETGEM_API_V8_URL_DEFINITION, previousCard: ?CARD_DATA_MODAL_TYPE) => void = (fullItem, urlDefinition, previousCard) => {\n const { item, programMetadata, seriesMetadata, tileType } = fullItem;\n\n Messenger.emit(MessengerEvents.OPEN_CARD, {\n item,\n previousCard,\n programMetadata,\n seriesMetadata,\n tileType,\n urlDefinition,\n });\n };\n\n loadHubFromUrlDefinition: (item: NETGEM_API_V8_FEED_ITEM, urlDefinition: NETGEM_API_V8_URL_DEFINITION) => void = (item, urlDefinition) => {\n const { focusedAvenue, localSendV8CustomStrategyRequest, localUpdateFocusedAvenue } = this.props;\n const { previousVerticalPosition } = this.state;\n const {\n abortController: { signal },\n exploreAvenueIndex,\n } = this;\n\n // Reset avenue, then retrieve hub from platform\n this.setState({ ...LoadedHeaderState, previousVerticalPosition }, () => {\n localSendV8CustomStrategyRequest(urlDefinition, item, signal)\n .then((response: NETGEM_API_V8_REQUEST_RESPONSE) => {\n const hub: NETGEM_API_V8_HUB = getValidHub(response.result);\n // If explore avenue index is set, use it, else use index of currently focused index (should always be defined)\n const avenueIndex = exploreAvenueIndex ?? focusedAvenue?.index ?? NO_AVENUE_INDEX;\n const avenueType = exploreAvenueIndex ? AvenueType.Explore : (focusedAvenue?.type ?? AvenueType.Regular);\n localUpdateFocusedAvenue(avenueIndex, avenueType, item, hub);\n })\n .catch((error) => ignoreIfAborted(signal, error));\n });\n };\n\n openPlayer: (item: EXTENDED_ITEM | ShakaOfflineContent) => void = (item) => {\n this.enterTheaterMode(item);\n };\n\n executeItemClick: (fullItem: EXTENDED_ITEM) => void = (fullItem) => {\n const { defaultOnItemClick } = this.props;\n const { cardData, item, onItemClick, seriesMetadata } = fullItem;\n const localOnItemClick = onItemClick || defaultOnItemClick;\n\n if (!item || !localOnItemClick) {\n // No item (only for trailers but this code is not used for trailers) or no action defined\n return;\n }\n\n const { action } = localOnItemClick;\n\n if (action !== NETGEM_API_V8_WIDGET_ITEM_CLICK_ACTION_SWITCH) {\n this.executeAction(fullItem, localOnItemClick, cardData);\n return;\n }\n\n // Action: switch\n const { params } = ((localOnItemClick: any): NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE2);\n\n if (!params) {\n return;\n }\n\n const {\n id,\n selectedLocation: { id: locationId },\n seriesId,\n } = item;\n\n const assetSeriesId = seriesMetadata?.id ?? seriesId;\n\n for (const switchItem of params) {\n const { action: onItemClickSwitch, prefix } = switchItem;\n if (!prefix || id.startsWith(prefix) || assetSeriesId?.startsWith(prefix) || locationId?.startsWith(prefix)) {\n const { action: switchAction } = onItemClickSwitch;\n if (switchAction === NETGEM_API_V8_WIDGET_ITEM_CLICK_ACTION_SWITCH) {\n fullItem.onItemClick = onItemClickSwitch;\n this.executeItemClick(fullItem);\n } else {\n this.executeAction(fullItem, onItemClickSwitch, cardData);\n }\n return;\n }\n }\n };\n\n executeAction: (fullItem: EXTENDED_ITEM, onItemClickSwitch: NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE, cardData: ?CARD_DATA_MODAL_TYPE) => void = (fullItem, onItemClickSwitch, cardData) => {\n const { action } = onItemClickSwitch;\n\n if (action === NETGEM_API_V8_WIDGET_ITEM_CLICK_ACTION_CARD) {\n // Open card\n const { params } = ((onItemClickSwitch: any): NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE1);\n this.openCard(fullItem, params, cardData);\n } else if (action === NETGEM_API_V8_WIDGET_ITEM_CLICK_ACTION_HUB) {\n // Open hub (channel, channel group, universe)\n const { params } = ((onItemClickSwitch: any): NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE1);\n const { item } = fullItem;\n this.storePosition().then(() => this.loadHubFromUrlDefinition(item, params));\n } else if (action === NETGEM_API_V8_WIDGET_ITEM_CLICK_ACTION_PLAYER) {\n // Open player\n this.openPlayer(fullItem);\n }\n };\n\n openExploreModal: (exploreAvenueIndex: number) => void = (exploreAvenueIndex) => {\n this.loadAvenue(exploreAvenueIndex, AvenueType.Explore);\n };\n\n closeModal: (shouldBeReopenedLater?: boolean) => void = (shouldBeReopenedLater) => {\n const { localHideModal, openModals } = this.props;\n\n if (openModals.length === 0) {\n // No card open\n return;\n }\n\n localHideModal(shouldBeReopenedLater);\n };\n\n playerCloseCallback: (retry: boolean) => void = (retry) => {\n if (retry) {\n // Player crashed due to a Safari EME issue: wait a bit then retry\n const { safariWorkaroundBackoffTime, playerItem } = this.state;\n\n if (safariWorkaroundBackoffTime <= SAFARI_VOD_WORKAROUND_MAXIMUM_BACKOFF_TIME) {\n // Reset player item to close player, then schedule a retry\n this.setState(\n {\n playerItem: null,\n safariWorkaroundItem: playerItem,\n safariWorkaroundProgress: 0,\n },\n this.scheduleSafariWorkaroundProgress,\n );\n return;\n }\n } else {\n // Reset Safari workaround\n this.setState({\n safariWorkaroundBackoffTime: SAFARI_VOD_WORKAROUND_MINIMUM_BACKOFF_TIME,\n safariWorkaroundProgress: -1,\n });\n }\n\n // Player regularly exited\n this.exitTheaterMode();\n this.refreshNpvr();\n };\n\n scheduleSafariWorkaroundProgress: () => void = () => {\n const { safariWorkaroundBackoffTime, safariWorkaroundProgress } = this.state;\n\n if (safariWorkaroundProgress >= safariWorkaroundBackoffTime) {\n // Delay reached\n return;\n }\n\n // Schedule next tick\n this.safariWorkaroundTimer = setTimeout(() => {\n const { safariWorkaroundProgress: progress } = this.state;\n\n if (progress > -1 && progress < safariWorkaroundBackoffTime) {\n // Schedule next tick\n this.setState({ safariWorkaroundProgress: progress + 1 }, this.scheduleSafariWorkaroundProgress);\n }\n }, ONE_THOUSAND);\n };\n\n handleOnSafariWorkaroundCompleted: () => void = () => {\n // Wait is over: winter is here\n const { safariWorkaroundBackoffTime, safariWorkaroundItem } = this.state;\n\n this.resetSafariWorkaroundTimer();\n\n // Set player item to open player again and increment backoff time for next retry (if needed)\n this.setState({\n playerItem: safariWorkaroundItem,\n safariWorkaroundBackoffTime: safariWorkaroundBackoffTime + SAFARI_VOD_WORKAROUND_BACKOFF_TIME_STEP,\n safariWorkaroundItem: null,\n safariWorkaroundProgress: -1,\n });\n };\n\n refreshNpvr: () => void = () => {\n Messenger.emit(MessengerEvents.REFRESH_NPVR);\n };\n\n loadAvenueFromId: (avenueId: string) => boolean = (avenueId) => {\n const { avenueList, localUpdateFocusedAvenue } = this.props;\n\n const avenue = getAvenueFromId(avenueList, avenueId);\n\n if (!avenue) {\n return false;\n }\n\n const { index, type } = avenue;\n localUpdateFocusedAvenue(index, type);\n this.loadAvenue(index, type);\n\n return true;\n };\n\n loadAvenue: (index: number, type: AvenueType, hasBackButton?: boolean, hubItem?: NETGEM_API_V8_FEED_ITEM, hub?: NETGEM_API_V8_HUB) => void = (index, type, hasBackButton, hubItem, hub) => {\n const { clearDisplayPaywallSubscription, focusedAvenue, displaySubscriptionPaywall, isRegisteredAsGuest, localResetGridSectionId, localShowAvenueModal } = this.props;\n const { isDeeplinkHandled } = this;\n\n // Handle deeplink\n if (!isDeeplinkHandled && this.checkDeeplink()) {\n return;\n }\n\n let localHub = hub;\n let localHubItem = hubItem;\n\n if (type === AvenueType.Explore && !hub && focusedAvenue && hasPendingOperation()) {\n // Coming back to a hidden avenue after having stored a pending operation: let's use previous hub and hubItem\n ({ hub: localHub, hubItem: localHubItem } = focusedAvenue);\n }\n\n if (type === AvenueType.Explore && !localHub) {\n // Display EXPLORE avenue in popup\n this.exploreAvenueIndex = index;\n Messenger.once(MessengerEvents.MODAL_CONFIRMATION_CLOSED, () => (this.exploreAvenueIndex = null));\n\n localShowAvenueModal({\n hasBackButton,\n hub: localHub,\n hubItem: localHubItem,\n index,\n isInExploreModal: type === AvenueType.Explore && !localHub,\n type,\n });\n } else {\n // Display selected avenue in regular avenue container\n localResetGridSectionId();\n this.closeModal();\n this.exploreAvenueIndex = null;\n\n if (hasBackButton) {\n // Going to hidden avenue\n this.moveToTop();\n } else {\n // Coming back from hidden avenue\n this.restorePosition();\n }\n\n const view = (\n <AvenueView hasBackButton={hasBackButton} hub={localHub} hubItem={localHubItem} index={index} isInExploreModal={type === AvenueType.Explore && !localHub} key='avenue' type={type} />\n );\n\n this.setState({ child: [view] }, () => {\n if (displaySubscriptionPaywall) {\n // Subscription paywall should be displayed (\"?subscribe\" in URL)\n clearDisplayPaywallSubscription();\n Messenger.emit(MessengerEvents.SHOW_SUBSCRIBE);\n } else if (!isRegisteredAsGuest) {\n Messenger.emit(MessengerEvents.CHECK_PENDING_OPERATION);\n }\n });\n }\n };\n\n checkDeeplink: () => boolean = () => {\n const { deeplink } = this.props;\n\n this.isDeeplinkHandled = true;\n\n if (!deeplink) {\n return false;\n }\n\n const { searchParams } = new URL(deeplink);\n\n for (const [parameter, value] of searchParams.entries()) {\n const decodedValue = value ? decodeURIComponent(value) : null;\n\n switch (parameter) {\n case 'npvr':\n this.openNpvrManagementScreen();\n return true;\n\n case 'settings':\n this.openGlobalSettingsScreen();\n return true;\n\n case 'avenue':\n if (decodedValue) {\n return this.loadAvenueFromId(decodedValue);\n }\n return false;\n\n case 'search':\n if (decodedValue) {\n this.handleOnSearch(decodedValue);\n return true;\n }\n return false;\n\n case 'program':\n // VOD or TV (scheduled event or catchup)\n if (decodedValue) {\n this.openDeeplinkCard(ItemType.Program, decodedValue);\n }\n return false;\n\n case 'series':\n // VOD or TV (scheduled event or catchup)\n if (decodedValue) {\n this.openDeeplinkCard(ItemType.Series, decodedValue);\n }\n return false;\n\n default:\n }\n }\n\n return false;\n };\n\n getMatchingRequest: (kind: NETGEM_API_V8_ITEM_LOCATION_TYPE) => FeedRequestFunction = (kind) => {\n const { localSendV8LocationCatchupForAssetRequest, localSendV8LocationEpgForAssetRequest, localSendV8LocationVodForAssetRequest } = this.props;\n\n switch (kind) {\n case NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT:\n return localSendV8LocationEpgForAssetRequest;\n case NETGEM_API_V8_ITEM_LOCATION_TYPE_CATCHUP:\n return localSendV8LocationCatchupForAssetRequest;\n default:\n return localSendV8LocationVodForAssetRequest;\n }\n };\n\n getItem: (results: AllSettledPromises) => NETGEM_API_V8_FEED_ITEM | null = (results) => {\n for (const { status, value } of results) {\n if (status === SettledPromiseFulfilled && value) {\n const {\n result: {\n feed: [rawItem],\n },\n } = value;\n\n if (rawItem) {\n const item = buildFeedItem({\n ...rawItem,\n score: [0],\n });\n\n if (item) {\n return item;\n }\n }\n }\n }\n\n return null;\n };\n\n openDeeplinkCard: (type: ItemType, deeplinkParameter: string) => void = (type, deeplinkParameter) => {\n const { localSendV8AssetIdForDeeplinkRequest } = this.props;\n const {\n abortController: { signal },\n } = this;\n\n const token = signal;\n\n localSendV8AssetIdForDeeplinkRequest(type, deeplinkParameter, token)\n .then(({ result: { id, kind } }) => {\n const localKinds = Array.isArray(kind) && kind.length > 0 ? kind : [NETGEM_API_V8_ITEM_LOCATION_TYPE_VOD];\n\n const promises = localKinds.map((k) => {\n const request = this.getMatchingRequest(k);\n return request(id, AccurateTimestamp.now(), MILLISECONDS_PER_WEEK, undefined, token);\n });\n\n return Promise.allSettled(promises).then((results: AllSettledPromises) => {\n const item = this.getItem(results);\n\n if (item) {\n // Prop \"type\" is mandatory, although it's not used when opening a card\n this.executeItemClick({ item, type: ExtendedItemType.VOD });\n }\n });\n })\n .catch((error) => ignoreIfAborted(signal, error));\n };\n\n openGlobalSettingsScreen: () => void = () => {\n const { localUpdateFocusedAvenue } = this.props;\n\n this.closeModal();\n localUpdateFocusedAvenue(NO_AVENUE_INDEX, AvenueType.Other);\n this.moveToTop();\n\n this.setState({\n child: [\n <ErrorBoundary componentName='Settings' isNotificationEnabled key='globalSettings'>\n <React.Suspense fallback={null}>\n <Settings key='globalSettings' />\n </React.Suspense>\n </ErrorBoundary>,\n ],\n });\n };\n\n openNpvrManagementScreen: (scheduledRecordingId: ?string, failedRecordingId: ?string, warningScheduledEventId: ?string) => void = (\n scheduledRecordingId,\n failedRecordingId,\n warningScheduledEventId,\n ) => {\n const { isNpvrFeatureEnabled, localUpdateFocusedAvenue } = this.props;\n\n if (!isNpvrFeatureEnabled) {\n return;\n }\n\n this.closeModal();\n localUpdateFocusedAvenue(NO_AVENUE_INDEX, AvenueType.Other);\n\n this.setState({\n child: [\n <ErrorBoundary componentName='Recordings' isNotificationEnabled key='npvrQuota'>\n <React.Suspense fallback={null}>\n <NpvrManagement focusedExistingRecordingId={failedRecordingId} focusedFutureRecordingId={warningScheduledEventId} focusedScheduledRecordingId={scheduledRecordingId} key='npvrQuota' />\n </React.Suspense>\n </ErrorBoundary>,\n ],\n });\n };\n\n openTileTypesAvenue: (avenueKey: string) => void = (avenueKey) => {\n const { localSendV8HubRequest } = this.props;\n const {\n abortController: { signal },\n } = this;\n\n localSendV8HubRequest(avenueKey, signal).then((hub) => {\n this.loadAvenue(NO_AVENUE_INDEX, AvenueType.Other, false, undefined, hub.slice(0));\n });\n };\n\n openGridAvenue: (avenueKey: string) => void = (avenueKey) => {\n const { localSendV8HubRequest } = this.props;\n const {\n abortController: { signal },\n } = this;\n\n localSendV8HubRequest(avenueKey, signal).then((hub) => {\n this.loadAvenue(NO_AVENUE_INDEX, AvenueType.Other, false, undefined, hub.slice(1));\n });\n };\n\n manageSuperStream: () => void = () => {\n const { guruWebsiteUrl, userInfo } = this.props;\n\n if (process.env.REACT_APP_ID === APPLICATION_ID.MyVideofutur || hasPods(userInfo)) {\n // Open Guru website\n if (guruWebsiteUrl) {\n openFooterPage(guruWebsiteUrl, 'wifiSuperStream');\n } else {\n logWarning('Missing Guru website URL');\n }\n } else {\n Messenger.emit(MessengerEvents.SHOW_PODS);\n }\n };\n\n handleOnSearch: (searchString: string) => void = (searchString) => {\n const { localSearch, localUpdateFocusedAvenue } = this.props;\n const { previousVerticalPosition } = this.state;\n const {\n abortController: { signal },\n } = this;\n\n // Reset avenue, then retrieve hub from platform\n this.setState({ ...LoadedHeaderState, previousVerticalPosition }, () => {\n localSearch(signal)\n .then((hub: NETGEM_API_V8_HUB) => {\n saveSearchString(searchString);\n localUpdateFocusedAvenue(NO_AVENUE_INDEX, AvenueType.Search, undefined, hub, searchString);\n })\n .catch((error) => ignoreIfAborted(signal, error));\n });\n };\n\n updateSectionSliding: (isSliding: boolean) => void = (isSliding) => {\n this.isSectionSliding = isSliding;\n };\n\n handleOnDoubleClick: (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => void = (event) => {\n const { isSectionSliding } = this;\n\n if (isSectionSliding) {\n return;\n }\n\n const { nativeEvent } = event;\n const [, elt] = nativeEvent.composedPath();\n\n if (!(elt instanceof HTMLElement)) {\n return;\n }\n\n const { classList, tagName } = elt;\n\n if (tagName.toUpperCase() === 'DIV' && classList.contains('sectionCarousel')) {\n // Notify video carousel to go fullscreen\n Messenger.emit(MessengerEvents.VIDEO_CAROUSEL_TOGGLE_FULLSCREEN);\n }\n };\n\n renderWorkingZoneContent: () => React.Node = () => {\n const { isInTheaterMode } = this.props;\n const { child } = this.state;\n\n if (isInTheaterMode) {\n return null;\n }\n\n return (\n <>\n <ImageCarousel />\n <VideoCarousel />\n {child.length > 0 ? child : null}\n </>\n );\n };\n\n renderSafariWorkaroundLoader: () => React.Node = () => {\n const { safariWorkaroundBackoffTime, safariWorkaroundProgress } = this.state;\n\n if (safariWorkaroundProgress === -1) {\n // Nothing in progress\n return null;\n }\n\n // Display loader\n return <CircleLoader hidePercentage onAnimationCompleted={this.handleOnSafariWorkaroundCompleted} progress={getIntegerPercentage(safariWorkaroundProgress, 0, safariWorkaroundBackoffTime)} />;\n };\n\n render(): React.Node {\n const { isInTheaterMode } = this.props;\n const { isHeaderLoaded, isScrolling, playerItem, playerOfflineContent } = this.state;\n\n return (\n <>\n <div\n className={clsx('mainLayout', isInTheaterMode && 'theaterMode')}\n onScroll={this.handleOnScroll}\n ref={(instance) => {\n this.mainLayout = instance;\n }}\n >\n <div className={clsx('workingZone', isInTheaterMode && 'theaterMode')} onDoubleClick={this.handleOnDoubleClick}>\n {this.renderWorkingZoneContent()}\n <Footer isVisible={isHeaderLoaded} />\n </div>\n <Header isScrolling={isScrolling} onLogoLoaded={this.handleOnLogoLoaded} onSearch={this.handleOnSearch} />\n {this.renderSafariWorkaroundLoader()}\n </div>\n {playerItem || playerOfflineContent ? <Player closeCallback={this.playerCloseCallback} playerItem={playerItem} playerOfflineContent={playerOfflineContent} /> : null}\n </>\n );\n }\n}\n\nconst mapStateToProps = (state: CombinedReducers): ReduxMainLayoutReducerStateType => {\n return {\n avenueList: state.ui.avenueList,\n deeplink: state.ui.deeplink,\n defaultOnItemClick: state.ui.defaultActions ? state.ui.defaultActions.onItemClick : null,\n displaySubscriptionPaywall: state.ui.displaySubscriptionPaywall,\n focusedAvenue: state.ui.focusedAvenue,\n guruWebsiteUrl: state.appConfiguration.configuration.guruWebsiteUrl ?? '',\n isDebugModeEnabled: state.appConfiguration.isDebugModeEnabled,\n isInTheaterMode: state.ui.isInTheaterMode,\n isNpvrFeatureEnabled: state.appConfiguration.features[FEATURE_NPVR],\n isRegisteredAsGuest: state.appRegistration.registration === RegistrationType.RegisteredAsGuest,\n openModals: state.modal.openModals,\n userInfo: state.appRegistration.userInfo,\n };\n};\n\nconst mapDispatchToProps = (dispatch: Dispatch): ReduxMainLayoutDispatchToPropsType => {\n return {\n clearDisplayPaywallSubscription: () => dispatch(updateDisplayPaywallSubscription(false)),\n\n localDeleteWishlist: (): Promise<any> => dispatch(deleteWishlist()),\n\n localEnterTheaterMode: () => dispatch(enterTheaterMode()),\n\n localExitTheaterMode: () => dispatch(exitTheaterMode()),\n\n localHideModal: (shouldBeReopenedLater?: boolean) => dispatch(hideModal(shouldBeReopenedLater)),\n\n localReopenModalCard: () => dispatch(reopenModalCard()),\n\n localResetGridSectionId: (): void => dispatch(resetGridSectionId()),\n\n localResetSectionPageIndices: (): void => dispatch(resetSectionPageIndices()),\n\n localSearch: (signal?: AbortSignal) => dispatch(search(signal)),\n\n localSendV8AssetIdForDeeplinkRequest: (type: ItemType, deeplinkParameter: string, signal?: AbortSignal): Promise<any> => dispatch(sendV8AssetIdForDeeplinkRequest(type, deeplinkParameter, signal)),\n\n localSendV8CustomStrategyRequest: (urlDefinition: NETGEM_API_V8_URL_DEFINITION, item: NETGEM_API_V8_FEED_ITEM, signal?: AbortSignal): Promise<any> =>\n dispatch(sendV8CustomStrategyRequest(urlDefinition, item, signal)),\n\n localSendV8HubRequest: (hubKey: string, signal?: AbortSignal): Promise<any> => dispatch(sendV8HubRequest(hubKey, signal)),\n\n localSendV8LocationCatchupForAssetRequest: (assetId: string, startDate: number, range: number, channelIds?: Array<string>, signal?: AbortSignal): Promise<any> =>\n dispatch(sendV8LocationCatchupForAssetRequest(assetId, startDate, range, channelIds, signal)),\n\n localSendV8LocationEpgForAssetRequest: (assetId: string, startDate: number, range: number, channelIds?: Array<string>, signal?: AbortSignal): Promise<any> =>\n dispatch(sendV8LocationEpgForAssetRequest(assetId, startDate, range, channelIds, signal)),\n\n localSendV8LocationVodForAssetRequest: (assetId: string, startDate: number, range: number, channelIds?: Array<string>, signal?: AbortSignal): Promise<any> =>\n dispatch(sendV8LocationVodForAssetRequest(assetId, startDate, range, channelIds, signal)),\n\n localSendV8MetadataRequest: (assetId: string, type: MetadataKind, signal?: AbortSignal): Promise<any> => dispatch(sendV8MetadataRequest(assetId, type, signal)),\n\n localShowAvenueModal: (avenueData: AVENUE_DATA_MODAL_TYPE) => dispatch(showAvenueModal(avenueData)),\n\n localTogglePackPurchase: () => dispatch(togglePackPurchase()),\n\n localUpdateFocusedAvenue: (index: number, type: AvenueType, hubItem?: NETGEM_API_V8_FEED_ITEM, hub?: NETGEM_API_V8_HUB, searchString?: string) =>\n dispatch(updateFocusedAvenue(index, type, hubItem, hub, searchString)),\n\n localUpdateSetting: (setting?: Setting, value: SettingValueType) => dispatch(updateSetting(setting, value)),\n };\n};\n\nconst MainLayout: React.ComponentType<MainLayoutPropType> = connect(mapStateToProps, mapDispatchToProps, null, { forwardRef: true })(MainLayoutView);\n\nexport default MainLayout;\n","/* @flow */\n\nimport { AvenueType, type NAVIGATION_AVENUE_TYPE } from './types';\nimport { AVENUE_ID_EXPLORE } from './constants';\nimport type { NETGEM_API_V8_HUB } from '../../../libs/netgemLibrary/v8/types/Hub';\n\nconst getAvenueFromId: (avenueList: ?NETGEM_API_V8_HUB, avenueId: string) => ?NAVIGATION_AVENUE_TYPE = (avenueList, avenueId) => {\n if (!avenueList) {\n return null;\n }\n\n for (let index = 0; index < avenueList.length; ++index) {\n const { [index]: avenue } = avenueList;\n const { id, title } = avenue;\n\n if (avenueId === id) {\n const type = avenue.id === AVENUE_ID_EXPLORE ? AvenueType.Explore : AvenueType.Regular;\n\n return {\n index,\n title,\n type,\n };\n }\n }\n\n return null;\n};\n\nexport { getAvenueFromId };\n","/* @flow */\n\nconst SMART_BANNER_TAG_NAME = 'apple-itunes-app';\n\nconst updateSmartBannerTag: (url: string) => void = (url) => {\n const currentTag = document.querySelector(`head > meta[name=${SMART_BANNER_TAG_NAME}]`);\n if (!currentTag) {\n return;\n }\n\n const content = currentTag.getAttribute('content');\n if (!content) {\n return;\n }\n\n const tag = document.createElement('meta');\n tag.name = SMART_BANNER_TAG_NAME;\n tag.content = `${content}, app-argument=${url}`;\n\n // Remove current meta tag\n currentTag.remove();\n\n // Create meta tag with deeplink as argument\n document.head?.appendChild(tag);\n};\n\nexport { updateSmartBannerTag };\n","/* @flow */\n\nimport './MainView.css';\nimport * as React from 'react';\nimport { FEATURE_NPVR, FEATURE_TV } from '../../redux/appConf/constants';\nimport { Messenger, MessengerEvents } from '@ntg/utils/dist/messenger';\nimport { clearBOFavoriteList, clearBOPurchaseList, setDeeplink, updateSetting, updateWholeViewingHistory, updateWishlist } from '../../redux/ui/actions';\nimport { showCardModal, showLegalNoticeModal } from '../../redux/modal/actions';\nimport { updateExistingRecordings, updateFutureRecordings, updateScheduledRecordings } from '../../redux/npvr/actions';\nimport type { BasicFunction } from '@ntg/utils/dist/types';\nimport type { CARD_DATA_MODAL_TYPE } from '../modal/cardModal/CardModalConstsAndTypes';\nimport type { CombinedReducers } from '../../redux/reducers';\nimport { DEFAULT_RECORDINGS_STATUS_ITEM } from '../../libs/netgemLibrary/v8/types/Npvr';\nimport { DidomiSDK } from '@didomi/react';\nimport DidomiWrapper from '../../helpers/consent/didomi';\nimport type { Dispatch } from '../../redux/types/types';\nimport EpgManager from '../../helpers/epg/epgManager';\nimport LocalStorageManager from '../../helpers/localStorage/localStorageManager';\nimport MainLayout from './MainLayout';\nimport type { NETGEM_API_V8_URL_DEFINITION } from '../../libs/netgemLibrary/v8/types/NtgVideoFeed';\nimport { RegistrationType } from '../../redux/appRegistration/types/types';\nimport { Setting } from '../../helpers/settings/types';\nimport { type SettingValueType } from '../settings/SettingsConstsAndTypes';\nimport { StorageKeys } from '../../helpers/localStorage/keys';\nimport { connect } from 'react-redux';\nimport { getAllRecordings } from '../../redux/netgemApi/actions/v8/recordings';\nimport { getAllScheduledRecordings } from '../../redux/netgemApi/actions/v8/scheduledRecordings';\nimport getFavoriteList from '../../redux/netgemApi/actions/videofutur/favoriteList';\nimport { getPurchaseList } from '../../redux/netgemApi/actions/videofutur/helpers/purchaseList';\nimport { getViewingHistory } from '../../redux/netgemApi/actions/personalData/viewingHistory';\nimport { getWishlist } from '../../redux/netgemApi/actions/personalData/wishlist';\nimport { ignoreIfAborted } from '../../libs/netgemLibrary/helpers/cancellablePromise/promiseHelper';\nimport { isGoogleBot } from '../../helpers/jsHelpers/robots';\nimport { sendV8HubRequest } from '../../redux/netgemApi/actions/v8/hub';\nimport { updateSmartBannerTag } from '../../helpers/jsHelpers/metaTag';\n\n// Wait 500 ms before actually refreshing personal data when switching avenue (in ms)\nconst REFRESH_TIMEOUT = 500;\n\ntype ReduxMainReducerStateType = {|\n +dataCollectionColdUrl: ?NETGEM_API_V8_URL_DEFINITION,\n +dataCollectionHotUrl: ?NETGEM_API_V8_URL_DEFINITION,\n +defaultSubtitles: string,\n +didomiApiKey: string,\n +didomiNoticeId: string,\n +focusedAvenueIndex: number,\n +hubMaxAge: ?number,\n +isBORunning: boolean,\n +isNpvrEnabled: boolean,\n +isRegisteredAsGuest: boolean,\n +isTVEnabled: boolean,\n|};\n\ntype ReduxMainDispatchToPropsType = {|\n +localClearExistingRecordings: BasicFunction,\n +localClearFavoriteList: BasicFunction,\n +localClearFutureRecordings: BasicFunction,\n +localClearPurchaseList: BasicFunction,\n +localClearScheduledRecordings: BasicFunction,\n +localClearViewingHistory: BasicFunction,\n +localClearWishList: BasicFunction,\n +localGetAllRecordings: (signal?: AbortSignal) => Promise<any>,\n +localGetAllScheduledRecordings: (signal?: AbortSignal) => Promise<any>,\n +localGetFavoriteList: (signal?: AbortSignal) => Promise<any>,\n +localGetPurchaseList: (signal?: AbortSignal) => Promise<any>,\n +localGetViewingHistory: (signal?: AbortSignal) => Promise<any>,\n +localGetWishlist: (signal?: AbortSignal) => Promise<any>,\n +localSendV8HubRequest: () => Promise<any>,\n +localUpdateDeeplink: (deeplink: string) => void,\n +localUpdateSetting: (setting?: Setting, value: SettingValueType) => Promise<any>,\n +showCard: (cardData: CARD_DATA_MODAL_TYPE) => void,\n +showLegalNotice: BasicFunction,\n|};\n\ntype MainPropType = {||};\n\ntype CompleteMainPropType = {|\n ...MainPropType,\n ...ReduxMainReducerStateType,\n ...ReduxMainDispatchToPropsType,\n|};\n\nclass MainView extends React.PureComponent<CompleteMainPropType> {\n abortController: AbortController;\n\n hubRefreshTimer: TimeoutID | null;\n\n refreshTimer: TimeoutID | null;\n\n constructor(props: CompleteMainPropType) {\n super(props);\n\n this.abortController = new AbortController();\n this.hubRefreshTimer = null;\n this.refreshTimer = null;\n\n const {\n location: { href, origin, search },\n } = window;\n\n if (search) {\n const { localUpdateDeeplink } = props;\n localUpdateDeeplink(href);\n updateSmartBannerTag(href);\n\n if (!isGoogleBot()) {\n // Don't clean up address bar for Google bots\n window.history.pushState({ path: origin }, '', origin);\n }\n }\n\n const { isTVEnabled } = props;\n if (isTVEnabled) {\n // Start EPG retrieval and refresh mechanism\n EpgManager.initializeCachedFeed();\n }\n }\n\n componentDidMount() {\n const { dataCollectionColdUrl, dataCollectionHotUrl } = this.props;\n\n Messenger.on(MessengerEvents.CONSENT_OPEN_SETTINGS, this.openConsentSettings);\n Messenger.on(MessengerEvents.CONSENT_RESET, this.resetConsent);\n Messenger.on(MessengerEvents.REFRESH_HUB, this.refreshHub);\n Messenger.on(MessengerEvents.REFRESH_NPVR, this.refreshNpvr);\n Messenger.on(MessengerEvents.REFRESH_PURCHASE_LIST, this.refreshPurchaseList);\n Messenger.on(MessengerEvents.REFRESH_VIEWING_HISTORY, this.refreshViewingHistory);\n Messenger.on(MessengerEvents.REFRESH_WISH_LIST, this.refreshWishList);\n Messenger.on(MessengerEvents.CLEAR_PURCHASE_LIST, this.clearPurchaseList);\n Messenger.on(MessengerEvents.CLEAR_VIEWING_HISTORY, this.clearViewingHistory);\n Messenger.on(MessengerEvents.CLEAR_WISH_LIST, this.clearWishList);\n Messenger.on(MessengerEvents.CLEAR_NPVR, this.clearNpvr);\n Messenger.on(MessengerEvents.OPEN_CARD, this.openCard);\n Messenger.on(MessengerEvents.SHOW_LEGAL_NOTICE, this.showLegalNotice);\n\n this.startHubRefreshTimer();\n\n this.refreshNpvr();\n this.refreshPersonalData();\n\n if (dataCollectionColdUrl && dataCollectionHotUrl) {\n // Retrieve from local storage and flush data collection messages at startup\n Messenger.emit(MessengerEvents.UNSTASH_COLLECTOR);\n }\n\n this.checkDefaultSubtitles();\n }\n\n componentDidUpdate(prevProps: CompleteMainPropType) {\n const { focusedAvenueIndex, hubMaxAge } = this.props;\n const { focusedAvenueIndex: prevFocusedAvenueIndex, hubMaxAge: prevHubMaxAge } = prevProps;\n\n if (hubMaxAge !== prevHubMaxAge) {\n // New hub expiration: setup a new refresh timer\n this.startHubRefreshTimer();\n }\n\n if (focusedAvenueIndex !== prevFocusedAvenueIndex) {\n // Avenue change: refresh stuff\n this.refreshPersonalData();\n }\n }\n\n componentWillUnmount() {\n const { abortController, refreshTimer } = this;\n\n abortController.abort('Component MainView will unmount');\n\n Messenger.off(MessengerEvents.CONSENT_OPEN_SETTINGS, this.openConsentSettings);\n Messenger.off(MessengerEvents.CONSENT_RESET, this.resetConsent);\n Messenger.off(MessengerEvents.REFRESH_HUB, this.refreshHub);\n Messenger.off(MessengerEvents.REFRESH_NPVR, this.refreshNpvr);\n Messenger.off(MessengerEvents.REFRESH_PURCHASE_LIST, this.refreshPurchaseList);\n Messenger.off(MessengerEvents.REFRESH_VIEWING_HISTORY, this.refreshViewingHistory);\n Messenger.off(MessengerEvents.REFRESH_WISH_LIST, this.refreshWishList);\n Messenger.off(MessengerEvents.CLEAR_PURCHASE_LIST, this.clearPurchaseList);\n Messenger.off(MessengerEvents.CLEAR_VIEWING_HISTORY, this.clearViewingHistory);\n Messenger.off(MessengerEvents.CLEAR_WISH_LIST, this.clearWishList);\n Messenger.off(MessengerEvents.CLEAR_NPVR, this.clearNpvr);\n Messenger.off(MessengerEvents.OPEN_CARD, this.openCard);\n Messenger.off(MessengerEvents.SHOW_LEGAL_NOTICE, this.showLegalNotice);\n\n this.resetHubRefreshTimer();\n\n if (refreshTimer) {\n clearTimeout(refreshTimer);\n this.refreshTimer = null;\n }\n }\n\n checkDefaultSubtitles = () => {\n const { defaultSubtitles, localUpdateSetting } = this.props;\n\n if (!defaultSubtitles) {\n // App does not have any default subtitles\n return;\n }\n\n const defaultSubtitlesApplied = LocalStorageManager.loadBoolean(StorageKeys.DefaultSubtitlesApplied, false);\n if (defaultSubtitlesApplied) {\n // Default subtitles are only applied (i.e. forced) once\n return;\n }\n\n localUpdateSetting(Setting.AutoSelectSubtitlesTrack, true);\n localUpdateSetting(Setting.LastSubtitlesTrack, defaultSubtitles);\n LocalStorageManager.save(StorageKeys.DefaultSubtitlesApplied, true);\n };\n\n startHubRefreshTimer = () => {\n const { hubMaxAge } = this.props;\n\n if (typeof hubMaxAge === 'number') {\n this.hubRefreshTimer = setTimeout(this.refreshHub, hubMaxAge);\n }\n };\n\n resetHubRefreshTimer = () => {\n const { hubRefreshTimer } = this;\n\n if (hubRefreshTimer) {\n clearTimeout(hubRefreshTimer);\n this.hubRefreshTimer = null;\n }\n };\n\n refreshHub = () => {\n const { localSendV8HubRequest } = this.props;\n\n this.resetHubRefreshTimer();\n localSendV8HubRequest().then(this.startHubRefreshTimer);\n };\n\n refreshNpvr = () => {\n const { isNpvrEnabled, isRegisteredAsGuest, localGetAllRecordings, localGetAllScheduledRecordings } = this.props;\n\n if (isNpvrEnabled && !isRegisteredAsGuest) {\n this.refreshPersonalDataInternal(localGetAllRecordings);\n this.refreshPersonalDataInternal(localGetAllScheduledRecordings);\n }\n };\n\n refreshPurchaseList = () => {\n const { isBORunning, localGetPurchaseList } = this.props;\n\n if (isBORunning) {\n this.refreshPersonalDataInternal(localGetPurchaseList);\n }\n };\n\n refreshViewingHistory = () => {\n const { localGetViewingHistory } = this.props;\n\n this.refreshPersonalDataInternal(localGetViewingHistory);\n };\n\n refreshWishList = () => {\n const { isBORunning, isTVEnabled, localGetWishlist, localGetFavoriteList } = this.props;\n const {\n abortController: { signal },\n } = this;\n\n // TV wishlist\n if (isTVEnabled) {\n this.refreshPersonalDataInternal(localGetWishlist);\n }\n\n // VOD wishlist\n if (isBORunning) {\n localGetFavoriteList(signal);\n }\n };\n\n refreshPersonalDataInternal = (localFunction: (signal?: AbortSignal) => Promise<any>): void => {\n const {\n abortController: { signal },\n } = this;\n\n localFunction(signal).catch((error) => ignoreIfAborted(signal, error));\n };\n\n clearPurchaseList = (): void => {\n const { localClearPurchaseList } = this.props;\n\n localClearPurchaseList();\n };\n\n clearViewingHistory = (): void => {\n const { localClearViewingHistory } = this.props;\n\n localClearViewingHistory();\n };\n\n clearWishList = (): void => {\n const { localClearFavoriteList, localClearWishList } = this.props;\n\n localClearWishList();\n localClearFavoriteList();\n };\n\n clearNpvr = (): void => {\n const { isNpvrEnabled, isRegisteredAsGuest, localClearExistingRecordings, localClearFutureRecordings, localClearScheduledRecordings } = this.props;\n\n if (isNpvrEnabled && !isRegisteredAsGuest) {\n localClearExistingRecordings();\n localClearFutureRecordings();\n localClearScheduledRecordings();\n }\n };\n\n showLegalNotice = (): void => {\n const { showLegalNotice } = this.props;\n\n showLegalNotice();\n };\n\n openCard = (cardData: CARD_DATA_MODAL_TYPE) => {\n const { showCard } = this.props;\n\n showCard(cardData);\n };\n\n refreshPersonalData = () => {\n const { isRegisteredAsGuest } = this.props;\n const { refreshTimer } = this;\n\n if (refreshTimer || isRegisteredAsGuest) {\n return;\n }\n\n // Debouncing\n this.refreshTimer = setTimeout(() => {\n this.refreshTimer = null;\n this.refreshPurchaseList();\n this.refreshViewingHistory();\n this.refreshWishList();\n }, REFRESH_TIMEOUT);\n };\n\n openConsentSettings: () => void = () => DidomiWrapper.manageConsent();\n\n resetConsent: () => void = () => DidomiWrapper.resetConsent();\n\n handleDidomiReady: (didomi: any) => void = (didomi) => {\n DidomiWrapper.initialize(didomi);\n };\n\n render(): React.Node {\n const { didomiApiKey, didomiNoticeId } = this.props;\n\n return (\n <>\n {didomiApiKey && didomiNoticeId ? <DidomiSDK apiKey={didomiApiKey} gdprAppliesGlobally iabVersion={2} noticeId={didomiNoticeId} onReady={this.handleDidomiReady} /> : null}\n <MainLayout />\n </>\n );\n }\n}\n\nconst mapStateToProps = (state: CombinedReducers): ReduxMainReducerStateType => {\n return {\n dataCollectionColdUrl: state.netgemApi.dataCollectionColdUrl,\n dataCollectionHotUrl: state.netgemApi.dataCollectionHotUrl,\n defaultSubtitles: state.appConfiguration.defaultSubtitles,\n didomiApiKey: state.appConfiguration.configuration.didomiApiKey ?? '',\n didomiNoticeId: state.appConfiguration.configuration.didomiNoticeId ?? '',\n focusedAvenueIndex: state.ui.focusedAvenue?.index ?? -1,\n hubMaxAge: state.ui.hubMaxAge,\n isBORunning: state.appConfiguration.isBORunning,\n isNpvrEnabled: state.appConfiguration.features[FEATURE_NPVR] && state.npvr.isEnabled,\n isRegisteredAsGuest: state.appRegistration.registration === RegistrationType.RegisteredAsGuest,\n isTVEnabled: state.appConfiguration.features[FEATURE_TV],\n };\n};\n\nconst mapDispatchToProps = (dispatch: Dispatch): ReduxMainDispatchToPropsType => {\n return {\n localClearExistingRecordings: () => dispatch(updateExistingRecordings({}, null, [])),\n localClearFavoriteList: () => dispatch(clearBOFavoriteList()),\n localClearFutureRecordings: () =>\n dispatch(\n updateFutureRecordings({}, null, [], {\n current: DEFAULT_RECORDINGS_STATUS_ITEM,\n expectedError: DEFAULT_RECORDINGS_STATUS_ITEM,\n expectedSuccess: DEFAULT_RECORDINGS_STATUS_ITEM,\n maxQuota: DEFAULT_RECORDINGS_STATUS_ITEM,\n }),\n ),\n localClearPurchaseList: () => dispatch(clearBOPurchaseList()),\n localClearScheduledRecordings: () => dispatch(updateScheduledRecordings({}, {}, null)),\n localClearViewingHistory: () => dispatch(updateWholeViewingHistory({}, null)),\n localClearWishList: () => dispatch(updateWishlist([], null)),\n localGetAllRecordings: (signal?: AbortSignal): Promise<any> => dispatch(getAllRecordings(signal)),\n localGetAllScheduledRecordings: (signal?: AbortSignal): Promise<any> => dispatch(getAllScheduledRecordings(signal)),\n localGetFavoriteList: (signal?: AbortSignal): Promise<any> => dispatch(getFavoriteList(signal)),\n localGetPurchaseList: (signal?: AbortSignal): Promise<any> => dispatch(getPurchaseList(signal)),\n localGetViewingHistory: (signal?: AbortSignal): Promise<any> => dispatch(getViewingHistory(signal)),\n localGetWishlist: (signal?: AbortSignal): Promise<any> => dispatch(getWishlist(signal)),\n localSendV8HubRequest: (): Promise<any> => dispatch(sendV8HubRequest()),\n localUpdateDeeplink: (deeplink: string) => dispatch(setDeeplink(deeplink)),\n localUpdateSetting: (setting?: Setting, value: SettingValueType) => dispatch(updateSetting(setting, value)),\n showCard: (cardData: CARD_DATA_MODAL_TYPE) => dispatch(showCardModal(cardData)),\n showLegalNotice: () => dispatch(showLegalNoticeModal()),\n };\n};\n\nconst Dark: React.ComponentType<MainPropType> = connect(mapStateToProps, mapDispatchToProps, null, { forwardRef: true })(MainView);\n\nexport default Dark;\n","/* @flow */\n\nconst isGoogleBot: () => boolean = () => {\n const {\n navigator: { userAgent },\n } = window;\n const lcUserAgent = userAgent.toLowerCase();\n\n return lcUserAgent.indexOf('googlebot') > -1;\n};\n\nconst isWhitelisted: () => boolean = () => {\n const {\n navigator: { userAgent },\n } = window;\n const lcUserAgent = userAgent.toLowerCase();\n\n return lcUserAgent.indexOf('googlebot') > -1 || lcUserAgent.indexOf('chrome-lighthouse') > -1;\n};\n\nexport { isGoogleBot, isWhitelisted };\n","/* @flow */\n\nimport './AuthenticationRequiredModal.css';\nimport * as React from 'react';\nimport ButtonFX from '../../buttons/ButtonFX';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport Modal from '../modal';\nimport { ModalIcon } from '../modalTypes';\nimport type { ModalState } from '../../../redux/modal/reducers';\nimport { WidthKind } from '../../buttons/types';\n\nclass AuthenticationRequiredModal extends React.PureComponent<ModalState> {\n modal: React.ElementRef<any> | null;\n\n constructor(...args: Array<any>) {\n super(...args);\n\n this.modal = null;\n }\n\n handleOnClick: () => void = () => {\n const { modal } = this;\n\n if (modal) {\n modal.close();\n }\n };\n\n render(): React.Node {\n const { index } = this.props;\n\n return (\n <Modal\n canCloseOnEnter={false}\n canCloseOnEscape={false}\n canCloseOnOverlayClick={false}\n className='authenticationRequired'\n header={Localizer.localize('modal.authentication_required.title')}\n icon={ModalIcon.Info}\n index={index}\n isCloseButtonDisplayed={false}\n ref={(instance) => {\n this.modal = instance;\n }}\n >\n <div className='authenticationRequiredContent'>\n <div>{Localizer.localize('modal.authentication_required.message')}</div>\n <ButtonFX onClick={this.handleOnClick} widthKind={WidthKind.Stretched}>\n {Localizer.localize('common.actions.ok')}\n </ButtonFX>\n </div>\n </Modal>\n );\n }\n}\n\nexport default (AuthenticationRequiredModal: React.ComponentType<ModalState>);\n","/* @flow */\n\nimport './AvenueModal.css';\nimport * as React from 'react';\nimport { AvenueType } from '../../../helpers/ui/avenue/types';\nimport AvenueView from '../../avenue/Avenue';\nimport Modal from '../modal';\nimport type { ModalState } from '../../../redux/modal/reducers';\nimport type { NETGEM_API_V8_FEED_ITEM } from '../../../libs/netgemLibrary/v8/types/FeedItem';\nimport type { NETGEM_API_V8_HUB } from '../../../libs/netgemLibrary/v8/types/Hub';\nimport clsx from 'clsx';\nimport { connect } from 'react-redux';\n\nexport type AVENUE_DATA_MODAL_TYPE = {|\n hasBackButton?: boolean,\n hub: ?NETGEM_API_V8_HUB,\n hubItem: ?NETGEM_API_V8_FEED_ITEM,\n index: number,\n isInExploreModal: boolean,\n type: AvenueType,\n|};\n\nclass AvenueModalView extends React.PureComponent<ModalState> {\n render(): React.Node {\n const { avenueData, index: modalIndex } = this.props;\n\n if (!avenueData) {\n return null;\n }\n\n const { hasBackButton, hub, hubItem, index, isInExploreModal, type } = avenueData;\n\n return (\n <Modal className={clsx('avenue', (type: string).toLowerCase())} index={modalIndex}>\n <AvenueView hasBackButton={hasBackButton} hub={hub} hubItem={hubItem} index={index} isInExploreModal={isInExploreModal} key='avenue' type={type} />\n </Modal>\n );\n }\n}\n\nconst AvenueModal: React.ComponentType<ModalState> = connect(null, null, null, { forwardRef: true })(AvenueModalView);\n\nexport default AvenueModal;\n","/* @flow */\n\nimport type { BasicFunction, KeyValuePair } from '@ntg/utils/dist/types';\nimport { ItemContent, type NETGEM_API_V8_FEED_ITEM, type NETGEM_API_V8_ITEM_LOCATION } from '../../../libs/netgemLibrary/v8/types/FeedItem';\nimport type { MetadataKind, NETGEM_API_V8_METADATA_PROGRAM, NETGEM_API_V8_METADATA_SERIES } from '../../../libs/netgemLibrary/v8/types/MetadataProgram';\nimport type { NETGEM_RECORDINGS_MAP, NETGEM_SCHEDULED_RECORDINGS_MAP, ScheduledRecordingsKindType } from '../../../libs/netgemLibrary/v8/types/Npvr';\nimport type { PENDING_OPERATION_DATA_TYPE, VOD_PURCHASE_DATA_TYPE } from '../../../helpers/rights/pendingOperations';\nimport type { STREAM_PRIORITIES_TYPE, VOD_STATUS_TYPE } from '../../../helpers/ui/metadata/Types';\nimport type { BO_FAVORITE_LIST_TYPE } from '../../../redux/netgemApi/actions/videofutur/types/favorite';\nimport type { BO_PURCHASE_LIST_TYPE } from '../../../redux/netgemApi/actions/videofutur/types/purchase';\nimport type { BroadcastStatus } from '../../../helpers/ui/location/Format';\nimport type { ChannelMap } from '../../../libs/netgemLibrary/v8/types/Channel';\nimport { LoadableStatus } from '../../../helpers/loadable/loadable';\nimport type { ModalState } from '../../../redux/modal/reducers';\nimport type { NETGEM_API_V8_AUTHENT_REALM } from '../../../libs/netgemLibrary/v8/types/Realm';\nimport type { NETGEM_API_V8_METADATA_SCHEDULE } from '../../../libs/netgemLibrary/v8/types/MetadataSchedule';\nimport type { NETGEM_API_V8_PURCHASE_INFO } from '../../../libs/netgemLibrary/v8/types/PurchaseInfo';\nimport type { NETGEM_API_V8_RIGHTS } from '../../../libs/netgemLibrary/v8/types/Rights';\nimport type { NETGEM_API_V8_URL_DEFINITION } from '../../../libs/netgemLibrary/v8/types/NtgVideoFeed';\nimport type { NETGEM_API_VIEWINGHISTORY } from '../../../libs/netgemLibrary/v8/types/ViewingHistory';\nimport type { ThemeType } from '@ntg/ui/dist/theme';\nimport { TileConfigTileType } from '../../../libs/netgemLibrary/v8/types/WidgetConfig';\n\n// Time display and broadcast status are refreshed every second\nexport const REFRESH_TIMEOUT = 1_000;\n\nexport enum ImageDisplayType {\n Landscape,\n Portrait,\n Unset,\n}\n\nexport type CARD_DATA_MODAL_TYPE = {|\n displayedSectionCount?: number | null,\n distributorId?: string | null,\n isOpenFromPlayer?: boolean,\n isTimeshifting?: boolean,\n item: NETGEM_API_V8_FEED_ITEM,\n pendingOperation?: PENDING_OPERATION_DATA_TYPE | null,\n previousCard?: CARD_DATA_MODAL_TYPE | null,\n programMetadata: NETGEM_API_V8_METADATA_PROGRAM | null,\n recordKind?: ScheduledRecordingsKindType | null,\n seriesMetadata: NETGEM_API_V8_METADATA_SERIES | null,\n tileType: TileConfigTileType,\n urlDefinition?: NETGEM_API_V8_URL_DEFINITION | null,\n viewingHistoryId?: string | null,\n vtiId?: number | null,\n|};\n\nexport type ReduxCardModalDispatchToPropsType = {|\n +localAddToFavoriteList: (titId: string, signal?: AbortSignal) => Promise<any>,\n +localAddToWishlist: (assetId: string, channelId: string, signal?: AbortSignal) => Promise<any>,\n +localGetImageSourceUrl: (assetId: string, width: number, height: number) => Promise<?string>,\n +localGetImageUrl: (assetId: string, width: number, height: number, theme?: ThemeType, signal?: AbortSignal) => Promise<any>,\n +localGetPurchaseInfoPerAsset: (id: string, channelId: string, signal?: AbortSignal) => Promise<any>,\n +localGetVodLocations: (locations: Array<NETGEM_API_V8_ITEM_LOCATION>, signal?: AbortSignal) => Promise<any>,\n +localHideModal: BasicFunction,\n +localRemoveFromFavoriteList: (titId: string, signal?: AbortSignal) => Promise<any>,\n +localRemoveFromWishlist: (assetId: string, channelId: string, signal?: AbortSignal) => Promise<any>,\n +localResetSectionPageIndices: (prefix?: string) => void,\n +localSendV8LocationCatchupForAssetRequest: (assetId: string, startDate: number, range: number, signal?: AbortSignal) => Promise<any>,\n +localSendV8MetadataLocationRequest: (assetId: string, signal?: AbortSignal) => Promise<any>,\n +localSendV8MetadataRequest: (assetId: string, type: MetadataKind, signal?: AbortSignal) => Promise<any>,\n +localSendV8RecordingsMetadataRequest: (recordId: string, signal?: AbortSignal) => Promise<any>,\n +showVodPurchaseDialog: (vodPurchaseData: VOD_PURCHASE_DATA_TYPE) => void,\n|};\n\nexport type ReduxCardModalReducerStateType = {|\n +applicationName: string,\n +channels: ChannelMap,\n +commercialOffers: KeyValuePair<Array<string>> | null,\n +deeplink: string | null,\n +defaultRights: NETGEM_API_V8_RIGHTS | null,\n +favoriteList: BO_FAVORITE_LIST_TYPE,\n +isDebugModeEnabled: boolean,\n +isNpvrEnabled: boolean,\n +isRegisteredAsGuest: boolean,\n +isSubscriptionFeatureEnabled: boolean,\n +npvrRecordingsFuture: NETGEM_RECORDINGS_MAP,\n +npvrRecordingsList: NETGEM_RECORDINGS_MAP,\n +npvrScheduledRecordingsList: NETGEM_SCHEDULED_RECORDINGS_MAP,\n +purchaseList: BO_PURCHASE_LIST_TYPE | null,\n +streamPriorities: STREAM_PRIORITIES_TYPE | null,\n +usePackPurchaseApi: boolean,\n +userRights: Array<string> | null,\n +viewingHistory: NETGEM_API_VIEWINGHISTORY,\n +viewingHistoryStatus: LoadableStatus,\n +wishlist: Set<string>,\n +wishlistStatus: LoadableStatus,\n|};\n\nexport type CompleteCardModalPropType = {|\n ...ModalState,\n ...ReduxCardModalDispatchToPropsType,\n ...ReduxCardModalReducerStateType,\n|};\n\nexport type CardModalStateType = {|\n authority?: NETGEM_API_V8_AUTHENT_REALM,\n backgroundImageUrl: string | null,\n broadcastStatus: BroadcastStatus,\n canBePlayed: boolean,\n channelImageUrl: string | null,\n contentType: ItemContent,\n followedPictoClassName: string,\n imageDisplayType: ImageDisplayType,\n isDeletable: boolean,\n isFollowed: ?boolean,\n isLiveRecording: boolean,\n isSeries: boolean,\n isWaitingForDeleteConfirmation: boolean,\n isWaitingForRecordConfirmation: boolean,\n portraitImageUrl: ?string,\n previewCatchupScheduledEventId: ?string,\n programMetadata: NETGEM_API_V8_METADATA_PROGRAM | null,\n purchaseInfo: NETGEM_API_V8_PURCHASE_INFO | null,\n seriesMetadata: NETGEM_API_V8_METADATA_SERIES | null,\n startoverItem: NETGEM_API_V8_FEED_ITEM | null,\n tvLocationMetadata: NETGEM_API_V8_METADATA_SCHEDULE | null,\n vodLocationsMetadata: Array<NETGEM_API_V8_METADATA_SCHEDULE> | null,\n vodStatus: VOD_STATUS_TYPE | null,\n|};\n","/* @flow */\n\nimport { BOVodAssetStatus, getTitIdFromProviderInfo } from '../../../helpers/videofutur/metadata';\nimport { type CARD_DATA_MODAL_TYPE, type CardModalStateType, type CompleteCardModalPropType, ImageDisplayType } from './CardModalConstsAndTypes';\nimport {\n ItemContent,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_CATCHUP,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT,\n} from '../../../libs/netgemLibrary/v8/types/FeedItem';\nimport type { NETGEM_API_V8_METADATA_PROGRAM, NETGEM_API_V8_METADATA_SERIES } from '../../../libs/netgemLibrary/v8/types/MetadataProgram';\nimport { BroadcastStatus } from '../../../helpers/ui/location/Format';\nimport { LoadableStatus } from '../../../helpers/loadable/loadable';\nimport { NETGEM_API_V8_AUTHENT_REALM_VIDEOFUTUR } from '../../../libs/netgemLibrary/v8/types/Realm';\nimport { RecordingOutcome } from '../../../libs/netgemLibrary/v8/types/Npvr';\nimport { TileConfigTileType } from '../../../libs/netgemLibrary/v8/types/WidgetConfig';\nimport { getDistributorId } from '../../../helpers/ui/item/distributor';\nimport { getItemLiveProgress } from '../../../helpers/ui/item/time';\nimport { getProgress } from '../../../helpers/viewingHistory/ViewingHistory';\n\nconst getDisplayType = (imageDisplayType: ImageDisplayType, tileType: TileConfigTileType): string => {\n if (imageDisplayType === ImageDisplayType.Unset) {\n return '';\n }\n\n if (tileType === TileConfigTileType.Deeplink) {\n return (TileConfigTileType.Deeplink: string);\n }\n\n if (imageDisplayType === ImageDisplayType.Portrait) {\n return (TileConfigTileType.Portrait: string);\n }\n\n return (TileConfigTileType.Landscape: string);\n};\n\nconst getLiveProgress = (cardData?: CARD_DATA_MODAL_TYPE): number | null => {\n if (!cardData) {\n return null;\n }\n\n const { item } = cardData;\n return getItemLiveProgress(item);\n};\n\nconst getProgramMetadata = (cardData: CARD_DATA_MODAL_TYPE, state: CardModalStateType): NETGEM_API_V8_METADATA_PROGRAM | null => cardData.programMetadata ?? state.programMetadata;\n\nconst getSeriesMetadata = (cardData: CARD_DATA_MODAL_TYPE, state: CardModalStateType): NETGEM_API_V8_METADATA_SERIES | null => cardData.seriesMetadata ?? state.seriesMetadata;\n\nconst getWatchingStatus = (props: CompleteCardModalPropType, state: CardModalStateType): number | null => {\n const { cardData, purchaseList, viewingHistory, viewingHistoryStatus } = props;\n const { contentType, isSeries, vodStatus } = state;\n\n if (!cardData || isSeries) {\n return null;\n }\n\n const {\n item,\n item: { locType },\n } = cardData;\n\n if (!vodStatus && locType !== NETGEM_API_V8_ITEM_LOCATION_TYPE_CATCHUP && locType !== NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING) {\n return null;\n }\n\n if (vodStatus && contentType === ItemContent.VODOrDeeplink) {\n if (!purchaseList) {\n return null;\n }\n\n const { status } = vodStatus;\n if (status === BOVodAssetStatus.Locked) {\n // Item has been watched (at least partially) but its rent has expired\n return null;\n }\n }\n\n if (viewingHistoryStatus !== LoadableStatus.Loaded || locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT) {\n return null;\n }\n\n const programMetadata = getProgramMetadata(cardData, state);\n const seriesMetadata = getSeriesMetadata(cardData, state);\n return getProgress(viewingHistory, item, programMetadata, seriesMetadata, false, vodStatus);\n};\n\nconst isFavorite = (props: CompleteCardModalPropType, state: CardModalStateType): boolean => {\n const { cardData, favoriteList, wishlist, wishlistStatus } = props;\n const { authority, purchaseInfo, vodLocationsMetadata } = state;\n\n if (!cardData) {\n return false;\n }\n\n const programMetadata = getProgramMetadata(cardData, state);\n\n if (!programMetadata) {\n return false;\n }\n\n const { id: programId, providerInfo } = programMetadata;\n const distributorId = getDistributorId(vodLocationsMetadata, purchaseInfo, programMetadata);\n\n if (authority === NETGEM_API_V8_AUTHENT_REALM_VIDEOFUTUR) {\n if (!providerInfo || !distributorId) {\n return false;\n }\n\n const titId = getTitIdFromProviderInfo(providerInfo, getSeriesMetadata(cardData, state));\n\n return favoriteList.includes(titId) ?? false;\n }\n\n if (wishlistStatus !== LoadableStatus.Loaded) {\n return false;\n }\n\n const seriesMetadata = getSeriesMetadata(cardData, state);\n const assetId = seriesMetadata?.id ?? programId;\n\n return wishlist.has(assetId);\n};\n\nconst isItemPlayable = (cardData: CARD_DATA_MODAL_TYPE, broadcastStatus: BroadcastStatus, contentType: ItemContent, isSeries: boolean, recordOutcome: ?RecordingOutcome): boolean => {\n const {\n isOpenFromPlayer,\n item: { locType },\n } = cardData;\n\n return (\n !isOpenFromPlayer &&\n !isSeries &&\n ((broadcastStatus === BroadcastStatus.Past && locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_CATCHUP) ||\n broadcastStatus === BroadcastStatus.Live ||\n broadcastStatus === BroadcastStatus.Preview ||\n (locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING && recordOutcome === RecordingOutcome.Recorded) ||\n contentType === ItemContent.NetgemSVOD)\n );\n};\n\nconst updateTitle = (applicationName: string, title: ?string) => {\n document.title = title ? `${title} | ${applicationName}` : applicationName;\n};\n\nexport { getDisplayType, getLiveProgress, getWatchingStatus, isFavorite, isItemPlayable, updateTitle };\n","/* @flow */\n\nimport './PlaceholderTVEpisode.css';\nimport * as React from 'react';\nimport { PictoArrowDown } from '@ntg/components/dist/pictos/Element';\n\ntype PlaceholderTVEpisodePropType = {||};\n\nclass PlaceholderTVEpisode extends React.PureComponent<PlaceholderTVEpisodePropType> {\n render(): React.Node {\n return (\n <div className='episode tv'>\n <div className='header'>\n <div className='dateAndTitle placeholder'>\n <div className='date' />\n <div className='title' />\n </div>\n <div className='actions'>\n <PictoArrowDown className='arrow' />\n </div>\n </div>\n </div>\n );\n }\n}\n\nexport default PlaceholderTVEpisode;\n","/* @flow */\n\nimport './PlaceholderVodEpisode.css';\nimport * as React from 'react';\nimport { PictoArrowDown } from '@ntg/components/dist/pictos/Element';\n\ntype PlaceholderVodEpisodePropType = {|\n +index: number,\n|};\n\nclass PlaceholderVodEpisode extends React.PureComponent<PlaceholderVodEpisodePropType> {\n render(): React.Node {\n const { index } = this.props;\n\n return (\n <div className='episode vod'>\n <div className='header'>\n <div className='title'>\n {index + 1} - <div className='empty' />\n </div>\n <div className='actions'>\n <div className='pricingLink' />\n <div className='pricingLink' />\n <PictoArrowDown className='arrow' />\n </div>\n </div>\n </div>\n );\n }\n}\n\nexport default PlaceholderVodEpisode;\n","/* @flow */\n\nimport './TVEpisode.css';\nimport * as React from 'react';\nimport type { BasicFunction, KeyValuePair, Undefined } from '@ntg/utils/dist/types';\nimport { BroadcastStatus, WebAppHelpersLocationStatus, getBroadcastStatus, getLocationStatus } from '../../../helpers/ui/location/Format';\nimport {\n ItemContent,\n type NETGEM_API_V8_FEED_ITEM,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_CATCHUP,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_SVOD,\n} from '../../../libs/netgemLibrary/v8/types/FeedItem';\nimport { Messenger, MessengerEvents } from '@ntg/utils/dist/messenger';\nimport type { NETGEM_API_V8_METADATA_PROGRAM, NETGEM_API_V8_METADATA_SERIES } from '../../../libs/netgemLibrary/v8/types/MetadataProgram';\nimport { type NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE, TileConfigTileType } from '../../../libs/netgemLibrary/v8/types/WidgetConfig';\nimport { type NETGEM_RECORDINGS_MAP, type NETGEM_SCHEDULED_RECORDINGS_MAP, RecordingOutcome, ScheduledRecordingsKind } from '../../../libs/netgemLibrary/v8/types/Npvr';\nimport { PictoArrowDown, PictoClockEmpty, PictoFailure, PictoRecord, PictoWarning } from '@ntg/components/dist/pictos/Element';\nimport RecordButton, { ContextKind, DisplayMode } from '../../recordButton/RecordButton';\nimport { formatDate, formatExpirationDate } from '../../../helpers/dateTime/Format';\nimport { formatSeasonEpisodeNbr, getStartAndEndTimes, getSynopsis, renderProgramDetails } from '../../../helpers/ui/metadata/Format';\nimport { getEpisodeAndSeriesRecordStatus, getScheduledRecordingIdFromRecordingId } from '../../../helpers/npvr/recording';\nimport AccurateTimestamp from '../../../helpers/dateTime/AccurateTimestamp';\nimport type { CARD_DATA_MODAL_TYPE } from '../../modal/cardModal/CardModalConstsAndTypes';\nimport type { ChannelMap } from '../../../libs/netgemLibrary/v8/types/Channel';\nimport type { CombinedReducers } from '../../../redux/reducers';\nimport type { Dispatch } from '../../../redux/types/types';\nimport { ExtendedItemType } from '../../../helpers/ui/item/types';\nimport { FEATURE_SUBSCRIPTION } from '../../../redux/appConf/constants';\nimport { LoadableStatus } from '../../../helpers/loadable/loadable';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport type { NETGEM_API_V8_AUTHENT_REALM } from '../../../libs/netgemLibrary/v8/types/Realm';\nimport type { NETGEM_API_V8_METADATA_SCHEDULE } from '../../../libs/netgemLibrary/v8/types/MetadataSchedule';\nimport type { NETGEM_API_V8_REQUEST_RESPONSE } from '../../../libs/netgemLibrary/v8/types/RequestResponse';\nimport type { NETGEM_API_V8_RIGHTS } from '../../../libs/netgemLibrary/v8/types/Rights';\nimport type { NETGEM_API_V8_URL_DEFINITION } from '../../../libs/netgemLibrary/v8/types/NtgVideoFeed';\nimport type { NETGEM_API_VIEWINGHISTORY } from '../../../libs/netgemLibrary/v8/types/ViewingHistory';\nimport { PROGRAM_INFO } from '../../../helpers/ui/metadata/Types';\nimport { RegistrationType } from '../../../redux/appRegistration/types/types';\nimport StatusPicto from '../../statusPicto/StatusPicto';\nimport WatchingStatus from '../../watchingStatus/WatchingStatus';\nimport clsx from 'clsx';\nimport { connect } from 'react-redux';\nimport { getImageUrl } from '../../../redux/netgemApi/actions/v8/metadataImage';\nimport { getItemLiveProgress } from '../../../helpers/ui/item/time';\nimport { getProgress } from '../../../helpers/viewingHistory/ViewingHistory';\nimport { getSeriesCardUrlDefinition } from '../../../helpers/ui/section/tile';\nimport getTranslatedText from '../../../libs/netgemLibrary/v8/helpers/Lang';\nimport { hideModal } from '../../../redux/modal/actions';\nimport { ignoreIfAborted } from '../../../libs/netgemLibrary/helpers/cancellablePromise/promiseHelper';\nimport { isPlaybackGranted } from '../../../helpers/rights/playback';\nimport sendV8MetadataLocationRequest from '../../../redux/netgemApi/actions/v8/metadataLocation';\nimport { sendV8RecordingsMetadataRequest } from '../../../redux/netgemApi/actions/v8/recordings';\nimport { showDebug } from '../../../helpers/debug/debug';\n\n// Time display and broadcast status are refreshed every second (in ms)\nconst REFRESH_TIMEOUT = 1_000;\n\nconst IMAGE_WIDTH = 284;\nconst IMAGE_HEIGHT = 160;\n\ntype ReduxTVEpisodeDispatchToPropsType = {|\n +localGetImageUrl: (assetId: string, width: number, height: number, signal?: AbortSignal) => Promise<any>,\n +localHideModal: BasicFunction,\n +localSendV8MetadataLocationRequest: (assetId: string, signal?: AbortSignal) => Promise<any>,\n +localSendV8RecordingsMetadataRequest: (recordId: string, signal?: AbortSignal) => Promise<any>,\n|};\n\ntype ReduxTVEpisodeReducerStateType = {|\n +channels: ChannelMap,\n +commercialOffers: ?KeyValuePair<Array<string>>,\n +defaultOnItemClick: ?NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE,\n +defaultRights: ?NETGEM_API_V8_RIGHTS,\n +isDebugModeEnabled: boolean,\n +isRegisteredAsGuest: boolean,\n +isSubscriptionFeatureEnabled: boolean,\n +npvrRecordingsFuture: NETGEM_RECORDINGS_MAP,\n +npvrRecordingsList: NETGEM_RECORDINGS_MAP,\n +npvrScheduledRecordingsList: NETGEM_SCHEDULED_RECORDINGS_MAP,\n +userRights: Array<string> | null,\n +viewingHistory: NETGEM_API_VIEWINGHISTORY,\n +viewingHistoryStatus: LoadableStatus,\n|};\n\ntype DefaultProps = {|\n +focusedLocationId?: string,\n +onItemClick?: NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE,\n|};\n\ntype TVEpisodePropType = {|\n ...DefaultProps,\n +cardData: CARD_DATA_MODAL_TYPE,\n +isExpanded: boolean,\n +index: number,\n +item: NETGEM_API_V8_FEED_ITEM,\n +onToggleExpandedState: (index: number) => void,\n +programMetadata: NETGEM_API_V8_METADATA_PROGRAM | null,\n +seriesMetadata: NETGEM_API_V8_METADATA_SERIES,\n +tileType: TileConfigTileType,\n|};\n\ntype CompleteTVEpisodePropType = {|\n ...TVEpisodePropType,\n ...ReduxTVEpisodeReducerStateType,\n ...ReduxTVEpisodeDispatchToPropsType,\n|};\n\ntype TVEpisodeStateType = {|\n authority?: NETGEM_API_V8_AUTHENT_REALM,\n broadcastStatus: BroadcastStatus,\n canBePlayed: boolean,\n imageUrl: ?string,\n isLiveRecording: boolean,\n now: number,\n previewCatchupScheduledEventId: string | null,\n tvLocationMetadata: ?NETGEM_API_V8_METADATA_SCHEDULE,\n|};\n\nconst InitialState = Object.freeze({\n authority: undefined,\n broadcastStatus: BroadcastStatus.Unknown,\n canBePlayed: false,\n imageUrl: null,\n isLiveRecording: false,\n previewCatchupScheduledEventId: null,\n tvLocationMetadata: null,\n});\n\nclass TVEpisode extends React.PureComponent<CompleteTVEpisodePropType, TVEpisodeStateType> {\n abortController: AbortController;\n\n broadcastStatusRefreshTimer: TimeoutID | null;\n\n failedRecordingId: ?string;\n\n isSvodDisplayedAsCatchup: boolean;\n\n recordOutcome: ?RecordingOutcome;\n\n synopsis: ?string;\n\n timeRefreshTimer: TimeoutID | null;\n\n warningScheduledEventId: ?string;\n\n warningScheduledRecordingId: ?string;\n\n static defaultProps: DefaultProps = {\n focusedLocationId: undefined,\n onItemClick: undefined,\n };\n\n constructor(props: CompleteTVEpisodePropType) {\n super(props);\n\n const {\n item: { locType },\n } = props;\n\n this.abortController = new AbortController();\n this.broadcastStatusRefreshTimer = null;\n this.failedRecordingId = null;\n this.isSvodDisplayedAsCatchup = locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_SVOD;\n this.recordOutcome = null;\n this.synopsis = null;\n this.timeRefreshTimer = null;\n this.warningScheduledEventId = null;\n this.warningScheduledRecordingId = null;\n\n this.state = {\n ...InitialState,\n now: AccurateTimestamp.nowInSeconds(),\n };\n }\n\n componentDidMount() {\n this.update();\n }\n\n componentDidUpdate(prevProps: CompleteTVEpisodePropType, prevState: TVEpisodeStateType) {\n const { npvrRecordingsList, npvrScheduledRecordingsList } = this.props;\n const { npvrRecordingsList: prevNpvrRecordingsList, npvrScheduledRecordingsList: prevNpvrScheduledRecordingsList } = prevProps;\n const { broadcastStatus, previewCatchupScheduledEventId } = this.state;\n const { broadcastStatus: prevBroadcastStatus, previewCatchupScheduledEventId: prevPreviewCatchupScheduledEventId } = prevState;\n\n if (broadcastStatus !== prevBroadcastStatus) {\n this.loadTVLocationMetadata();\n\n if (broadcastStatus === BroadcastStatus.Live) {\n // Item became live\n this.startTimeRefreshTimer();\n } else {\n // Item is not live anymore\n this.resetTimeRefreshTimer();\n }\n\n this.updateRecordStatus();\n }\n\n if (npvrRecordingsList !== prevNpvrRecordingsList || npvrScheduledRecordingsList !== prevNpvrScheduledRecordingsList || previewCatchupScheduledEventId !== prevPreviewCatchupScheduledEventId) {\n this.updateRecordStatus();\n }\n }\n\n componentWillUnmount() {\n const { abortController } = this;\n\n abortController.abort('Component TVEpisode will unmount');\n\n this.resetTimeRefreshTimer();\n this.resetBroadcastStatusRefreshTimer();\n }\n\n showDebugInfo: () => void = () => {\n const { props, state } = this;\n\n showDebug('SeriesSection TVEpisode', {\n instance: this,\n instanceFields: ['failedRecordingId', 'isSvodDisplayedAsCatchup', 'recordOutcome', 'synopsis', 'warningScheduledRecordingId', 'warningScheduledEventId'],\n misc: { watchingStatus: this.getWatchingStatus() },\n props,\n propsFields: ['focusedLocationId', 'index', 'isExpanded', 'item', 'onItemClick', 'programMetadata', 'seriesMetadata'],\n state,\n stateFields: ['authority', 'broadcastStatus', 'canBePlayed', 'imageUrl', 'isLiveRecording', 'now', 'previewCatchupScheduledEventId', 'tvLocationMetadata'],\n });\n };\n\n startTimeRefreshTimer: () => void = () => {\n this.resetTimeRefreshTimer();\n this.timeRefreshTimer = setTimeout(this.updateTime, REFRESH_TIMEOUT);\n };\n\n resetTimeRefreshTimer: () => void = () => {\n if (this.timeRefreshTimer) {\n clearTimeout(this.timeRefreshTimer);\n this.timeRefreshTimer = null;\n }\n };\n\n startBroadcastStatusRefreshTimer: () => void = () => {\n const { broadcastStatus } = this.state;\n\n this.resetBroadcastStatusRefreshTimer();\n\n if (broadcastStatus === BroadcastStatus.Past) {\n // A past item will never change, no need to check again\n return;\n }\n\n this.broadcastStatusRefreshTimer = setTimeout(this.updateBroadcastStatus, REFRESH_TIMEOUT);\n };\n\n resetBroadcastStatusRefreshTimer: () => void = () => {\n if (this.broadcastStatusRefreshTimer) {\n clearTimeout(this.broadcastStatusRefreshTimer);\n this.broadcastStatusRefreshTimer = null;\n }\n };\n\n updateTime: () => void = () => {\n this.setState({ now: AccurateTimestamp.nowInSeconds() }, this.startTimeRefreshTimer);\n };\n\n updateBroadcastStatus: () => void = () => {\n const { item } = this.props;\n const { isSvodDisplayedAsCatchup } = this;\n\n // Item is an SVOD but is displayed as a catchup (e.g. Okoo)\n this.setState({ broadcastStatus: isSvodDisplayedAsCatchup ? BroadcastStatus.Past : getBroadcastStatus(item) }, this.startBroadcastStatusRefreshTimer);\n };\n\n update: () => void = () => {\n const { programMetadata } = this.props;\n\n this.synopsis = getSynopsis(programMetadata, Localizer.language);\n\n this.setState({\n ...InitialState,\n authority: programMetadata?.authority,\n });\n\n this.loadImage();\n this.updateBroadcastStatus();\n };\n\n isPlayable = (): boolean => {\n const {\n item: { locType },\n } = this.props;\n const { broadcastStatus } = this.state;\n const { isSvodDisplayedAsCatchup, recordOutcome } = this;\n\n return (\n (broadcastStatus === BroadcastStatus.Past && locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_CATCHUP) ||\n broadcastStatus === BroadcastStatus.Live ||\n broadcastStatus === BroadcastStatus.Preview ||\n (locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING && recordOutcome === RecordingOutcome.Recorded) ||\n isSvodDisplayedAsCatchup\n );\n };\n\n updateRecordStatus: () => void = () => {\n const {\n item,\n item: { selectedProgramId },\n npvrRecordingsFuture,\n npvrRecordingsList,\n npvrScheduledRecordingsList,\n seriesMetadata,\n } = this.props;\n const { broadcastStatus, previewCatchupScheduledEventId } = this.state;\n\n const { failedRecordingId, hasRecording, recordOutcome, warningScheduledEventId, warningScheduledRecordingId } = getEpisodeAndSeriesRecordStatus(\n selectedProgramId,\n seriesMetadata?.id,\n item,\n npvrRecordingsList,\n npvrRecordingsFuture,\n npvrScheduledRecordingsList,\n previewCatchupScheduledEventId,\n );\n\n const scheduledRecordingId = warningScheduledRecordingId || (failedRecordingId ? getScheduledRecordingIdFromRecordingId(failedRecordingId, npvrScheduledRecordingsList) : null);\n\n this.recordOutcome = recordOutcome;\n this.failedRecordingId = failedRecordingId;\n this.warningScheduledRecordingId = scheduledRecordingId;\n this.warningScheduledEventId = warningScheduledEventId;\n\n this.setState({\n canBePlayed: this.isPlayable(),\n isLiveRecording: hasRecording && broadcastStatus === BroadcastStatus.Live,\n });\n };\n\n loadImage: () => void = () => {\n const {\n item: { selectedProgramId },\n localGetImageUrl,\n } = this.props;\n const {\n abortController: { signal },\n } = this;\n\n localGetImageUrl(selectedProgramId, IMAGE_WIDTH, IMAGE_HEIGHT, signal)\n .then((imageUrl: string) => {\n signal.throwIfAborted();\n\n this.setState({ imageUrl });\n })\n .catch((error) => ignoreIfAborted(signal, error));\n };\n\n loadTVLocationMetadata: () => void = () => {\n const {\n item,\n item: {\n locType,\n selectedLocation: { id },\n },\n localSendV8MetadataLocationRequest,\n localSendV8RecordingsMetadataRequest,\n } = this.props;\n const { authority, broadcastStatus } = this.state;\n const {\n abortController: { signal },\n } = this;\n\n if (!id) {\n return;\n }\n\n const locationStatus = getLocationStatus(item, authority);\n const request =\n locationStatus === WebAppHelpersLocationStatus.Recording || (locationStatus === WebAppHelpersLocationStatus.Live && locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING)\n ? localSendV8RecordingsMetadataRequest\n : localSendV8MetadataLocationRequest;\n\n request(id, signal)\n .then((requestResponse: NETGEM_API_V8_REQUEST_RESPONSE) => {\n signal.throwIfAborted();\n\n const {\n result,\n result: {\n location: { target },\n },\n } = requestResponse;\n this.setState({\n previewCatchupScheduledEventId: broadcastStatus === BroadcastStatus.Preview ? target : null,\n tvLocationMetadata: result,\n });\n\n const { focusedLocationId, index, isExpanded, onToggleExpandedState } = this.props;\n\n /*\n * In the case of a live episode being recorded, the focused location is a scheduled event, while the episode\n * location is a recording, so we have to look at the target (GM-2513)\n */\n if (!isExpanded && result.location.target === focusedLocationId) {\n onToggleExpandedState(index);\n }\n })\n .catch((error) => ignoreIfAborted(signal, error));\n };\n\n handlePlayButtonOnClick = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>): void => {\n const { cardData, channels, commercialOffers, defaultRights, isExpanded, isRegisteredAsGuest, isSubscriptionFeatureEnabled, item, localHideModal, programMetadata, seriesMetadata, userRights } =\n this.props;\n const { authority, previewCatchupScheduledEventId, tvLocationMetadata } = this.state;\n\n if (isExpanded) {\n /*\n * If item is expanded, it means this item will automatically reopen when player exits (so we stop the event propagation),\n * but in the other case, we want another item to be expanded when player exits, so we let the event propagate\n */\n event.preventDefault();\n event.stopPropagation();\n event.nativeEvent.stopImmediatePropagation();\n }\n\n if (!programMetadata) {\n return;\n }\n\n const localCardData: CARD_DATA_MODAL_TYPE = {\n ...cardData,\n item,\n programMetadata,\n seriesMetadata,\n };\n\n if (\n !isPlaybackGranted(\n isRegisteredAsGuest,\n isSubscriptionFeatureEnabled,\n localCardData,\n authority,\n ItemContent.TV,\n tvLocationMetadata?.location,\n channels,\n commercialOffers,\n defaultRights,\n userRights,\n )\n ) {\n // Playback denied: log-in or subscribe page has been requested\n localHideModal();\n return;\n }\n\n Messenger.emit(MessengerEvents.OPEN_PLAYER, {\n authority,\n item,\n openFromCard: true,\n previewCatchupScheduledEventId,\n programMetadata,\n seriesMetadata,\n type: ExtendedItemType.TV,\n });\n };\n\n handleOnClick = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>): void => {\n event.preventDefault();\n event.stopPropagation();\n\n const { index, isDebugModeEnabled, onToggleExpandedState } = this.props;\n const { altKey, ctrlKey } = event;\n\n if (isDebugModeEnabled && (ctrlKey || altKey)) {\n this.showDebugInfo();\n } else {\n onToggleExpandedState(index);\n }\n };\n\n getWatchingStatus = (): number | null => {\n const { item, programMetadata, seriesMetadata, viewingHistory, viewingHistoryStatus } = this.props;\n\n if (viewingHistoryStatus !== LoadableStatus.Loaded) {\n return null;\n }\n\n return getProgress(viewingHistory, item, programMetadata, seriesMetadata, false, null);\n };\n\n handleErrorPictoOnClick: () => void = () => {\n const { failedRecordingId, warningScheduledRecordingId, warningScheduledEventId } = this;\n\n Messenger.emit(MessengerEvents.OPEN_NPVR_MANAGEMENT_SCREEN, warningScheduledRecordingId, failedRecordingId, warningScheduledEventId);\n };\n\n renderRecordErrorPicto = (recordOutcome: ?RecordingOutcome): React.Node => {\n const { broadcastStatus } = this.state;\n\n if (!recordOutcome) {\n return null;\n }\n\n let description: ?string = null;\n if (recordOutcome === RecordingOutcome.OutOfQuota) {\n description = Localizer.localize('modal.card.status_picto.warning_out_of_quota');\n } else if (recordOutcome === RecordingOutcome.ExceededConcurrency) {\n description = Localizer.localize('modal.card.status_picto.warning_exceeded_concurrency');\n } else if (recordOutcome === RecordingOutcome.ServerError) {\n description = Localizer.localize('modal.card.status_picto.warning_server');\n } else {\n return null;\n }\n\n let pictoElement = null;\n if (broadcastStatus === BroadcastStatus.Past || broadcastStatus === BroadcastStatus.Live) {\n description = Localizer.localize('modal.card.status_picto.failure');\n pictoElement = <PictoFailure className='alertPicto failure' />;\n } else {\n pictoElement = <PictoWarning className='alertPicto warning' />;\n }\n\n return (\n <div className='recordError' onClick={this.handleErrorPictoOnClick}>\n {pictoElement}\n <div className='description'>{description}</div>\n </div>\n );\n };\n\n renderTitle = (): React.Node => {\n const { item, programMetadata } = this.props;\n const { now } = this.state;\n\n if (!programMetadata) {\n return null;\n }\n\n const { titles } = programMetadata;\n const { endTime, startTime } = getStartAndEndTimes(item);\n const date = formatDate(startTime, endTime, now);\n\n let title = getTranslatedText(titles, Localizer.language);\n const episodeIndex = formatSeasonEpisodeNbr(programMetadata);\n if (episodeIndex) {\n title = `${episodeIndex}${title ? ' : ' : ''}${title}`;\n }\n\n return (\n <div className='dateAndTitle'>\n <div className='date'>{date}</div>\n <div className='title'>{title}</div>\n </div>\n );\n };\n\n renderActions = (): React.Node => {\n const {\n defaultOnItemClick,\n item,\n item: { locType },\n onItemClick,\n programMetadata,\n seriesMetadata,\n tileType,\n } = this.props;\n const { broadcastStatus, canBePlayed, previewCatchupScheduledEventId, tvLocationMetadata } = this.state;\n\n let progress: number | null = null;\n if (broadcastStatus === BroadcastStatus.Live) {\n progress = getItemLiveProgress(item);\n } else if (broadcastStatus === BroadcastStatus.Past || broadcastStatus === BroadcastStatus.Preview) {\n progress = this.getWatchingStatus();\n }\n\n const watchingStatus = canBePlayed ? <WatchingStatus allowZeroProgress={false} onClick={this.handlePlayButtonOnClick} progress={progress} /> : null;\n\n let cardDataUrlDefinition: Undefined<NETGEM_API_V8_URL_DEFINITION> = undefined;\n if (seriesMetadata && tvLocationMetadata) {\n // In case of TV series item, add the series card URL definition (if found) so that the episodes will be displayed on the card\n const urlDefinition = getSeriesCardUrlDefinition(onItemClick, defaultOnItemClick);\n if (urlDefinition) {\n cardDataUrlDefinition = urlDefinition;\n }\n }\n\n return (\n <>\n <RecordButton\n broadcastStatus={broadcastStatus}\n cardDataUrlDefinition={cardDataUrlDefinition}\n context={ContextKind.TVEpisode}\n displayMode={DisplayMode.Picto}\n item={item}\n key='recordButton'\n kind={locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_CATCHUP ? ScheduledRecordingsKind.KeepFromReplay : ScheduledRecordingsKind.Single}\n location={tvLocationMetadata?.location ?? null}\n previewCatchupScheduledEventId={previewCatchupScheduledEventId}\n programMetadata={programMetadata}\n seriesMetadata={seriesMetadata}\n tileType={tileType}\n />\n {watchingStatus}\n </>\n );\n };\n\n renderTime = (): React.Node => {\n const {\n item,\n item: { locType, selectedLocation },\n } = this.props;\n const { availabilityEndDate } = selectedLocation || {};\n\n if ((locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_CATCHUP || locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING) && availabilityEndDate) {\n // Expiration date\n return (\n <div className='date expiration' key='expirationDate'>\n {formatExpirationDate(availabilityEndDate)}\n </div>\n );\n }\n\n // Broadcast date and time\n const { endTime, startTime } = getStartAndEndTimes(item);\n\n return (\n <div className='date broadcast' key='broadcastDate'>\n {formatDate(startTime, endTime, AccurateTimestamp.nowInSeconds())}\n </div>\n );\n };\n\n renderHeader = (): React.Node => {\n const { broadcastStatus } = this.state;\n\n const isFuture = broadcastStatus === BroadcastStatus.Future;\n\n return (\n <div className={clsx('header', isFuture && 'future')} onClick={this.handleOnClick}>\n {isFuture ? <PictoClockEmpty className='clock' /> : null}\n {this.renderTitle()}\n <div className='actions'>\n {this.renderActions()}\n <PictoArrowDown className='arrow' forceHoverEffect />\n </div>\n </div>\n );\n };\n\n renderContent = (): React.Node => {\n const { item, programMetadata } = this.props;\n const { imageUrl, isLiveRecording } = this.state;\n const { recordOutcome, synopsis } = this;\n\n const imageStyle = imageUrl ? { backgroundImage: `url(${imageUrl})` } : {};\n const recordErrorPicto = this.renderRecordErrorPicto(recordOutcome);\n\n const liveRecordingElement = isLiveRecording ? (\n <div className='liveRecording'>\n <PictoRecord className='recording live' />\n <div className='text'>{Localizer.localize('common.status.live_recording')}</div>\n </div>\n ) : null;\n\n return (\n <div className='content'>\n <div className='cover' style={imageStyle} />\n <div className='details'>\n <div className='programInfo'>\n <StatusPicto item={item} />\n {liveRecordingElement}\n {recordErrorPicto}\n {this.renderTime()}\n </div>\n <div className='programInfo'>\n {/* eslint-disable-next-line no-bitwise */}\n {renderProgramDetails(item, programMetadata, null, PROGRAM_INFO.Duration | PROGRAM_INFO.ReleaseDate | PROGRAM_INFO.Language | PROGRAM_INFO.ParentalGuidance)}\n </div>\n <div className='synopsis'>{synopsis}</div>\n </div>\n </div>\n );\n };\n\n render(): React.Node {\n const {\n isExpanded,\n item: {\n selectedLocation: { id },\n },\n } = this.props;\n\n return (\n <div className={clsx('episode', 'tv', isExpanded && 'expanded')} data-qa-location-id={id}>\n {this.renderHeader()}\n {this.renderContent()}\n </div>\n );\n }\n}\n\nconst mapStateToProps = (state: CombinedReducers): ReduxTVEpisodeReducerStateType => {\n return {\n channels: state.appConfiguration.deviceChannels,\n commercialOffers: state.appConfiguration.rightsCommercialOffers,\n defaultOnItemClick: state.ui.defaultActions ? state.ui.defaultActions.onItemClick : null,\n defaultRights: state.appConfiguration.rightsDefault,\n isDebugModeEnabled: state.appConfiguration.isDebugModeEnabled,\n isRegisteredAsGuest: state.appRegistration.registration === RegistrationType.RegisteredAsGuest,\n isSubscriptionFeatureEnabled: state.appConfiguration.features[FEATURE_SUBSCRIPTION],\n npvrRecordingsFuture: state.npvr.npvrRecordingsFuture,\n npvrRecordingsList: state.npvr.npvrRecordingsList,\n npvrScheduledRecordingsList: state.npvr.npvrScheduledRecordingsList,\n userRights: state.appConfiguration.rightsUser,\n viewingHistory: state.ui.viewingHistory,\n viewingHistoryStatus: state.ui.viewingHistoryStatus,\n };\n};\n\nconst mapDispatchToProps = (dispatch: Dispatch): ReduxTVEpisodeDispatchToPropsType => {\n return {\n localGetImageUrl: (assetId: string, width: number, height: number, signal?: AbortSignal): Promise<any> =>\n dispatch(\n getImageUrl(\n {\n assetId,\n height,\n width,\n },\n signal,\n ),\n ),\n\n localHideModal: () => dispatch(hideModal()),\n\n localSendV8MetadataLocationRequest: (assetId: string, signal?: AbortSignal): Promise<any> => dispatch(sendV8MetadataLocationRequest(assetId, signal)),\n\n localSendV8RecordingsMetadataRequest: (recordId: string, signal?: AbortSignal): Promise<any> => dispatch(sendV8RecordingsMetadataRequest(recordId, signal)),\n };\n};\n\nconst TVEpisodeView: React.ComponentType<TVEpisodePropType> = connect(mapStateToProps, mapDispatchToProps, null, { forwardRef: true })(TVEpisode);\n\nexport default TVEpisodeView;\n","/* @flow */\n\nimport './VodEpisode.css';\nimport * as React from 'react';\nimport { type BASE_VOD_PURCHASE_DATA_TYPE, PendingOperationKind, PendingOperationReason, type VOD_PURCHASE_DATA_TYPE, storePendingOperation } from '../../../helpers/rights/pendingOperations';\nimport { BOVodAssetStatus, getTimeLeftFromExpirationTime, getVodLocationFromVtiId, getVodStatusFromLocations } from '../../../helpers/videofutur/metadata';\nimport type { BasicFunction, KeyValuePair } from '@ntg/utils/dist/types';\nimport { ItemContent, type NETGEM_API_V8_FEED_ITEM, type NETGEM_API_V8_ITEM_LOCATION } from '../../../libs/netgemLibrary/v8/types/FeedItem';\nimport { Messenger, MessengerEvents } from '@ntg/utils/dist/messenger';\nimport type { NETGEM_API_V8_METADATA_PROGRAM, NETGEM_API_V8_METADATA_SERIES } from '../../../libs/netgemLibrary/v8/types/MetadataProgram';\nimport { PROGRAM_INFO, type VOD_STATUS_TYPE } from '../../../helpers/ui/metadata/Types';\nimport PricingVod, { ContextKind } from '../../pricingVod/PricingVod';\nimport { getSynopsis, renderProgramDetails } from '../../../helpers/ui/metadata/Format';\nimport { hideModal, showVodPurchaseModal } from '../../../redux/modal/actions';\nimport { logError, showDebug } from '../../../helpers/debug/debug';\nimport type { BO_PURCHASE_LIST_TYPE } from '../../../redux/netgemApi/actions/videofutur/types/purchase';\nimport type { CARD_DATA_MODAL_TYPE } from '../../modal/cardModal/CardModalConstsAndTypes';\nimport type { ChannelMap } from '../../../libs/netgemLibrary/v8/types/Channel';\nimport type { CombinedReducers } from '../../../redux/reducers';\nimport type { Dispatch } from '../../../redux/types/types';\nimport { ExtendedItemType } from '../../../helpers/ui/item/types';\nimport { FEATURE_SUBSCRIPTION } from '../../../redux/appConf/constants';\nimport { LoadableStatus } from '../../../helpers/loadable/loadable';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport type { NETGEM_API_V8_METADATA_SCHEDULE } from '../../../libs/netgemLibrary/v8/types/MetadataSchedule';\nimport type { NETGEM_API_V8_PURCHASE_INFO } from '../../../libs/netgemLibrary/v8/types/PurchaseInfo';\nimport type { NETGEM_API_V8_RIGHTS } from '../../../libs/netgemLibrary/v8/types/Rights';\nimport type { NETGEM_API_VIEWINGHISTORY } from '../../../libs/netgemLibrary/v8/types/ViewingHistory';\nimport { PictoArrowDown } from '@ntg/components/dist/pictos/Element';\nimport { RegistrationType } from '../../../redux/appRegistration/types/types';\nimport WatchingStatus from '../../watchingStatus/WatchingStatus';\nimport { arePurchaseListsDifferent } from '../../../helpers/ui/section/comparisons';\nimport clsx from 'clsx';\nimport { connect } from 'react-redux';\nimport { formatAvailabilityTimestamp } from '../../../helpers/dateTime/Format';\nimport { getDistributorId } from '../../../helpers/ui/item/distributor';\nimport { getImageUrl } from '../../../redux/netgemApi/actions/v8/metadataImage';\nimport { getProgress } from '../../../helpers/viewingHistory/ViewingHistory';\nimport { getPurchaseInfoPerAsset } from '../../../redux/netgemApi/actions/v8/purchaseInfo';\nimport getTranslatedText from '../../../libs/netgemLibrary/v8/helpers/Lang';\nimport { getVodLocations } from '../../../redux/netgemApi/actions/v8/metadataLocation';\nimport { ignoreIfAborted } from '../../../libs/netgemLibrary/helpers/cancellablePromise/promiseHelper';\nimport { isPlaybackGranted } from '../../../helpers/rights/playback';\n\nconst IMAGE_WIDTH = 108;\nconst IMAGE_HEIGHT = 160;\n\ntype ReduxVodEpisodeDispatchToPropsType = {|\n +localGetImageUrl: (assetId: string, width: number, height: number, signal?: AbortSignal) => Promise<any>,\n +localGetPurchaseInfoPerAsset: (id: string, channelId: string, signal?: AbortSignal) => Promise<any>,\n +localGetVodLocations: (locations: Array<NETGEM_API_V8_ITEM_LOCATION>, signal?: AbortSignal) => Promise<any>,\n +localHideModal: BasicFunction,\n +showVodPurchaseDialog: (vodPurchaseData: VOD_PURCHASE_DATA_TYPE) => void,\n|};\n\ntype ReduxVodEpisodeReducerStateType = {|\n +channels: ChannelMap,\n +commercialOffers: KeyValuePair<Array<string>> | null,\n +defaultRights: NETGEM_API_V8_RIGHTS | null,\n +isDebugModeEnabled: boolean,\n +isRegisteredAsGuest: boolean,\n +isSubscriptionFeatureEnabled: boolean,\n +purchaseList: BO_PURCHASE_LIST_TYPE | null,\n +usePackPurchaseApi: boolean,\n +userRights: Array<string> | null,\n +viewingHistory: NETGEM_API_VIEWINGHISTORY,\n +viewingHistoryStatus: LoadableStatus,\n|};\n\ntype VodEpisodePropType = {|\n +cardData: CARD_DATA_MODAL_TYPE,\n +isExpanded: boolean,\n +index: number,\n +item: NETGEM_API_V8_FEED_ITEM,\n +onToggleExpandedState: (index: number) => void,\n +programMetadata: NETGEM_API_V8_METADATA_PROGRAM | null,\n +seriesMetadata: NETGEM_API_V8_METADATA_SERIES,\n|};\n\ntype CompleteVodEpisodePropType = {|\n ...VodEpisodePropType,\n ...ReduxVodEpisodeReducerStateType,\n ...ReduxVodEpisodeDispatchToPropsType,\n|};\n\ntype VodEpisodeStateType = {|\n imageUrl: string | null,\n purchaseInfo: NETGEM_API_V8_PURCHASE_INFO | null,\n vodLocations: Array<NETGEM_API_V8_METADATA_SCHEDULE> | null,\n vodStatus: VOD_STATUS_TYPE | null,\n|};\n\nconst InitialState: $ReadOnly<VodEpisodeStateType> = Object.freeze({\n imageUrl: null,\n purchaseInfo: null,\n vodLocations: null,\n vodStatus: null,\n});\n\nclass VodEpisode extends React.PureComponent<CompleteVodEpisodePropType, VodEpisodeStateType> {\n abortController: AbortController;\n\n synopsis: ?string;\n\n // Location Id of purchased location\n viewingHistoryId: ?string;\n\n // VtiId of purchased location\n vtiId: ?number;\n\n constructor(props: CompleteVodEpisodePropType) {\n super(props);\n\n this.abortController = new AbortController();\n this.synopsis = null;\n this.viewingHistoryId = null;\n this.vtiId = null;\n\n this.state = { ...InitialState };\n }\n\n componentDidMount() {\n this.update();\n }\n\n componentDidUpdate(prevProps: CompleteVodEpisodePropType) {\n const { purchaseList } = this.props;\n const { purchaseList: prevPurchaseList } = prevProps;\n\n if (arePurchaseListsDifferent(purchaseList, prevPurchaseList)) {\n this.loadVodLocations();\n }\n }\n\n componentWillUnmount() {\n const { abortController } = this;\n\n abortController.abort('Component VodEpisode will unmount');\n }\n\n showDebugInfo = () => {\n const { props, state } = this;\n\n showDebug('SeriesSection VodEpisode', {\n instance: this,\n instanceFields: ['synopsis', 'viewingHistoryId', 'vtiId'],\n misc: { watchingStatus: this.getWatchingStatus() },\n props,\n propsFields: ['episodesMetadata', 'index', 'isExpanded', 'item', 'programMetadata', 'seriesMetadata'],\n state,\n stateFields: ['imageUrl', 'purchaseInfo', 'vodLocations', 'vodStatus'],\n });\n };\n\n update = () => {\n const { programMetadata, usePackPurchaseApi } = this.props;\n\n this.viewingHistoryId = null;\n this.vtiId = null;\n this.synopsis = getSynopsis(programMetadata, Localizer.language);\n\n this.setState({ ...InitialState });\n\n this.loadImage();\n this.loadVodLocations();\n\n // TODO: clean up code when BO API v2 is fully supported\n if (usePackPurchaseApi) {\n this.loadPurchaseInfo();\n }\n };\n\n loadImage = () => {\n const {\n item: { selectedProgramId },\n localGetImageUrl,\n } = this.props;\n const {\n abortController: { signal },\n } = this;\n\n localGetImageUrl(selectedProgramId, IMAGE_WIDTH, IMAGE_HEIGHT, signal)\n .then((imageUrl: string) => {\n signal.throwIfAborted();\n\n this.setState({ imageUrl });\n })\n .catch((error) => ignoreIfAborted(signal, error));\n };\n\n loadVodLocations = () => {\n const {\n item: { locations },\n localGetVodLocations,\n purchaseList,\n } = this.props;\n const {\n abortController: { signal },\n } = this;\n\n if (!locations) {\n return;\n }\n\n localGetVodLocations(locations, signal)\n .then((vodLocations) => {\n signal.throwIfAborted();\n\n const vodStatus = getVodStatusFromLocations(vodLocations, purchaseList);\n const { viewingHistoryId, vtiId } = vodStatus;\n this.viewingHistoryId = viewingHistoryId;\n this.vtiId = vtiId;\n\n this.setState({\n vodLocations,\n vodStatus,\n });\n })\n .catch((error) => ignoreIfAborted(signal, error));\n };\n\n loadPurchaseInfo = () => {\n const {\n item: {\n id,\n purchasable,\n selectedLocation: { channelId },\n },\n localGetPurchaseInfoPerAsset,\n } = this.props;\n const {\n abortController: { signal },\n } = this;\n\n if (!purchasable) {\n return;\n }\n\n if (channelId === undefined) {\n logError(`Channel Id is undefined for item ${id}`);\n return;\n }\n\n localGetPurchaseInfoPerAsset(id, channelId, signal)\n .then((purchaseInfo: NETGEM_API_V8_PURCHASE_INFO) => {\n signal.throwIfAborted();\n this.setState({ purchaseInfo });\n })\n .catch((error) => ignoreIfAborted(signal, error, () => this.setState({ purchaseInfo: null })));\n };\n\n handlePlayButtonOnClick = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => {\n const { cardData, channels, commercialOffers, defaultRights, isExpanded, isRegisteredAsGuest, isSubscriptionFeatureEnabled, item, localHideModal, programMetadata, seriesMetadata, userRights } =\n this.props;\n const { purchaseInfo, vodLocations, vodStatus } = this.state;\n const { viewingHistoryId, vtiId } = this;\n\n if (isExpanded) {\n /*\n * If item is expanded, it means this item will automatically reopen when player exits (so we stop the event propagation),\n * but in the other case, we want another item to be expanded when player exits, so we let the event propagate\n */\n event.preventDefault();\n event.stopPropagation();\n event.nativeEvent.stopImmediatePropagation();\n }\n\n if (!programMetadata) {\n return;\n }\n\n const { authority } = programMetadata;\n const locationMetadata = getVodLocationFromVtiId(vodLocations, vtiId);\n const distributorId = getDistributorId(vodLocations, purchaseInfo);\n\n const localCardData: CARD_DATA_MODAL_TYPE = {\n ...cardData,\n distributorId,\n programMetadata,\n seriesMetadata,\n viewingHistoryId,\n vtiId,\n };\n\n if (\n !isPlaybackGranted(\n isRegisteredAsGuest,\n isSubscriptionFeatureEnabled,\n localCardData,\n authority,\n vodStatus?.status === BOVodAssetStatus.Free ? ItemContent.NetgemSVOD : ItemContent.VODOrDeeplink,\n locationMetadata?.location,\n channels,\n commercialOffers,\n defaultRights,\n userRights,\n )\n ) {\n // Playback denied: log-in or subscribe page has been requested\n localHideModal();\n return;\n }\n\n Messenger.emit(MessengerEvents.OPEN_PLAYER, {\n authority,\n distributorId,\n item,\n locationId: locationMetadata?.location.id,\n openFromCard: true,\n programMetadata,\n seriesMetadata,\n type: ExtendedItemType.VOD,\n viewingHistoryId,\n vtiId,\n });\n };\n\n handleOnClick = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n const { index, isDebugModeEnabled, onToggleExpandedState } = this.props;\n const { altKey, ctrlKey } = event;\n\n if (isDebugModeEnabled && (ctrlKey || altKey)) {\n this.showDebugInfo();\n } else {\n onToggleExpandedState(index);\n }\n };\n\n vodPurchaseModalClosedCallback = (data: any): void => {\n const { item, programMetadata, seriesMetadata } = this.props;\n const { purchaseInfo, vodLocations } = this.state;\n\n if (!data) {\n // Purchase cancelled\n return;\n }\n\n const { locationId, playNow, viewingHistoryId, vtiId } = data;\n\n if (playNow && vtiId) {\n Messenger.emit(MessengerEvents.OPEN_PLAYER, {\n distributorId: getDistributorId(vodLocations, purchaseInfo),\n item,\n locationId,\n openFromCard: true,\n programMetadata,\n seriesMetadata,\n type: ExtendedItemType.VOD,\n viewingHistoryId,\n vtiId,\n });\n }\n };\n\n handlePurchaseButtonOnClick = (data: BASE_VOD_PURCHASE_DATA_TYPE): void => {\n const { cardData, isRegisteredAsGuest, item, localHideModal, programMetadata, seriesMetadata, showVodPurchaseDialog } = this.props;\n const { vodPurchaseModalClosedCallback: closedCallback } = this;\n\n const { definition, displayPrice, distributorId, itemCount, licenseDuration, locationId, otherVtiId, purchaseType, vodLocationMetadata, vtiId } = data;\n\n if (!programMetadata) {\n return;\n }\n\n const purchaseData: VOD_PURCHASE_DATA_TYPE = {\n definition,\n displayPrice,\n distributorId,\n item,\n itemCount,\n licenseDuration,\n locationId,\n otherVtiId,\n programMetadata,\n purchaseType,\n seriesMetadata,\n vodLocationMetadata,\n vtiId,\n };\n\n if (isRegisteredAsGuest) {\n // Guest mode: let's open the sign-in page\n storePendingOperation({\n ...cardData,\n pendingOperation: {\n operationType: PendingOperationKind.Purchase,\n purchaseData,\n reason: PendingOperationReason.RequireAccount,\n },\n });\n localHideModal();\n Messenger.emit(MessengerEvents.SHOW_SIGN_IN, PendingOperationKind.Purchase);\n } else {\n Messenger.once(MessengerEvents.MODAL_CONFIRMATION_CLOSED, closedCallback);\n showVodPurchaseDialog(purchaseData);\n }\n };\n\n getWatchingStatus = (): number | null => {\n const { item, programMetadata, seriesMetadata, viewingHistory, viewingHistoryStatus } = this.props;\n const { vodStatus } = this.state;\n\n const status = vodStatus?.status ?? BOVodAssetStatus.Unknown;\n if (status === BOVodAssetStatus.Locked) {\n // VodEpisode has been watched (at least partially) but its rent has expired\n return null;\n }\n\n if (viewingHistoryStatus !== LoadableStatus.Loaded) {\n return null;\n }\n\n return getProgress(viewingHistory, item, programMetadata, seriesMetadata, false, vodStatus);\n };\n\n renderWatchingStatus = (): React.Node => {\n const progress = this.getWatchingStatus();\n\n return (\n <>\n <div />\n <WatchingStatus allowZeroProgress={false} onClick={this.handlePlayButtonOnClick} progress={progress} />\n </>\n );\n };\n\n renderVodStatus = (): React.Node => {\n const { purchaseInfo, vodLocations, vodStatus } = this.state;\n\n if (!vodStatus) {\n return null;\n }\n\n const { expirationTime, status } = vodStatus;\n\n if (status === BOVodAssetStatus.Unknown || status === BOVodAssetStatus.FreeButAvailableInFuture) {\n // Purchase list not loaded yet or item will be available later (and free)\n return null;\n }\n\n if (status === BOVodAssetStatus.Bought || status === BOVodAssetStatus.Free || status === BOVodAssetStatus.Rented) {\n return this.renderWatchingStatus();\n }\n\n return (\n <PricingVod\n context={ContextKind.VodEpisode}\n expirationTime={expirationTime}\n locationsMetadata={vodLocations}\n onClick={this.handlePurchaseButtonOnClick}\n purchaseInfo={purchaseInfo}\n status={status}\n />\n );\n };\n\n getTitle = (): string => {\n const { programMetadata } = this.props;\n\n if (!programMetadata) {\n return '';\n }\n\n const { titles } = programMetadata;\n return getTranslatedText(titles, Localizer.language);\n };\n\n renderPurchaseStatus = (isHeader: boolean): React.Node => {\n const { vodStatus } = this.state;\n\n if (!vodStatus) {\n return null;\n }\n\n const { availabilityTime, expirationTime, status } = vodStatus;\n let text: ?string = null;\n\n if (status === BOVodAssetStatus.Free) {\n // SVOD: asset is part of the subscription > don't repeat the same message for each episode\n return null;\n }\n\n if (status === BOVodAssetStatus.FreeButAvailableInFuture && typeof availabilityTime === 'number') {\n // SVOD: not available yet\n text = Localizer.localize('vod.pricing.availability.svod', { date: formatAvailabilityTimestamp(availabilityTime) });\n }\n\n if (status === BOVodAssetStatus.Rented) {\n // TVOD: asset already rented\n text = Localizer.localize('vod.pricing.tvod.rented');\n if (typeof expirationTime === 'number' && expirationTime > 0) {\n text = `${text} - ${Localizer.localize('vod.pricing.tvod.expire', { expiration: getTimeLeftFromExpirationTime(expirationTime) })}`;\n }\n } else if (!isHeader && status === BOVodAssetStatus.Bought) {\n // EST: asset already bought\n text = Localizer.localize('vod.pricing.est.bought');\n }\n\n if (text === null) {\n return null;\n }\n\n return <div className='purchaseStatus'>{text}</div>;\n };\n\n renderHeader = (): React.Node => {\n const { programMetadata } = this.props;\n\n const episodeIndex = programMetadata?.episodeOf?.episodeNumber;\n const episodeIndexStr = episodeIndex !== undefined ? `${episodeIndex} - ` : null;\n\n return (\n <div className='header' onClick={this.handleOnClick}>\n <div className='title'>\n {episodeIndexStr}\n {this.getTitle()}\n </div>\n <div className='actions'>\n {this.renderPurchaseStatus(true)}\n {this.renderVodStatus()}\n <PictoArrowDown className='arrow' forceHoverEffect />\n </div>\n </div>\n );\n };\n\n renderContent = (): React.Node => {\n const { item, programMetadata } = this.props;\n const { imageUrl, vodLocations } = this.state;\n const { synopsis } = this;\n\n const imageStyle = imageUrl ? { backgroundImage: `url(${imageUrl})` } : {};\n\n return (\n <div className='content'>\n <div className='cover' style={imageStyle} />\n <div className='details'>\n <div className='programInfo'>\n {/* eslint-disable-next-line no-bitwise */}\n {renderProgramDetails(item, programMetadata, vodLocations, PROGRAM_INFO.Duration | PROGRAM_INFO.ParentalGuidance)}\n </div>\n <div className='synopsis'>{synopsis}</div>\n {this.renderPurchaseStatus(false)}\n </div>\n </div>\n );\n };\n\n render(): React.Node {\n const { isExpanded } = this.props;\n\n return (\n <div className={clsx('episode', 'vod', isExpanded && 'expanded')}>\n {this.renderHeader()}\n {this.renderContent()}\n </div>\n );\n }\n}\n\nconst mapStateToProps = (state: CombinedReducers): ReduxVodEpisodeReducerStateType => {\n return {\n channels: state.appConfiguration.deviceChannels,\n commercialOffers: state.appConfiguration.rightsCommercialOffers,\n defaultRights: state.appConfiguration.rightsDefault,\n isDebugModeEnabled: state.appConfiguration.isDebugModeEnabled,\n isRegisteredAsGuest: state.appRegistration.registration === RegistrationType.RegisteredAsGuest,\n isSubscriptionFeatureEnabled: state.appConfiguration.features[FEATURE_SUBSCRIPTION],\n purchaseList: state.appRegistration.registration === RegistrationType.RegisteredAsGuest ? {} : state.ui.purchaseList,\n usePackPurchaseApi: state.appConfiguration.usePackPurchaseApi,\n userRights: state.appConfiguration.rightsUser,\n viewingHistory: state.ui.viewingHistory,\n viewingHistoryStatus: state.ui.viewingHistoryStatus,\n };\n};\n\nconst mapDispatchToProps = (dispatch: Dispatch): ReduxVodEpisodeDispatchToPropsType => {\n return {\n localGetImageUrl: (assetId: string, width: number, height: number, signal?: AbortSignal): Promise<any> =>\n dispatch(\n getImageUrl(\n {\n assetId,\n height,\n width,\n },\n signal,\n ),\n ),\n\n localGetPurchaseInfoPerAsset: (id: string, channelId: string, signal?: AbortSignal): Promise<any> => dispatch(getPurchaseInfoPerAsset(id, channelId, signal)),\n\n localGetVodLocations: (locations: Array<NETGEM_API_V8_ITEM_LOCATION>, signal?: AbortSignal): Promise<any> => dispatch(getVodLocations(locations, signal)),\n\n localHideModal: () => dispatch(hideModal()),\n\n showVodPurchaseDialog: (vodPurchaseData: VOD_PURCHASE_DATA_TYPE) => dispatch(showVodPurchaseModal(vodPurchaseData)),\n };\n};\n\nconst VodEpisodeView: React.ComponentType<VodEpisodePropType> = connect(mapStateToProps, mapDispatchToProps, null, { forwardRef: true })(VodEpisode);\n\nexport default VodEpisodeView;\n","/* @flow */\n\nimport './Section.css';\nimport * as React from 'react';\nimport {\n METADATA_KIND_PROGRAM,\n METADATA_KIND_SERIES,\n type MetadataKind,\n type NETGEM_API_V8_METADATA,\n type NETGEM_API_V8_METADATA_PROGRAM,\n type NETGEM_API_V8_METADATA_SERIES,\n} from '../../../libs/netgemLibrary/v8/types/MetadataProgram';\nimport { Messenger, MessengerEvents } from '@ntg/utils/dist/messenger';\nimport type { NETGEM_API_V8_FEED, NETGEM_API_V8_FEED_ITEM } from '../../../libs/netgemLibrary/v8/types/FeedItem';\nimport type { NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE, TILE_CONFIG_TYPE } from '../../../libs/netgemLibrary/v8/types/WidgetConfig';\nimport type { CARD_DATA_MODAL_TYPE } from '../../modal/cardModal/CardModalConstsAndTypes';\nimport type { CombinedReducers } from '../../../redux/reducers';\nimport type { Dispatch } from '../../../redux/types/types';\nimport LocalStorageManager from '../../../helpers/localStorage/localStorageManager';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport { NETGEM_API_V8_AUTHENT_REALM_NETGEM } from '../../../libs/netgemLibrary/v8/types/Realm';\nimport type { NETGEM_API_V8_SECTION } from '../../../libs/netgemLibrary/v8/types/Section';\nimport PlaceholderTVEpisode from './PlaceholderTVEpisode';\nimport PlaceholderVodEpisode from './PlaceholderVodEpisode';\nimport { StorageKeys } from '../../../helpers/localStorage/keys';\nimport TVItem from './TVEpisode';\nimport { type Undefined } from '@ntg/utils/dist/types';\nimport VodItem from './VodEpisode';\nimport clsx from 'clsx';\nimport { connect } from 'react-redux';\nimport { filterCredits } from '../../../helpers/ui/metadata/Exclusion';\nimport { getTileConfig } from '../../../helpers/ui/section/tile';\nimport getTranslatedText from '../../../libs/netgemLibrary/v8/helpers/Lang';\nimport { ignoreIfAborted } from '../../../libs/netgemLibrary/helpers/cancellablePromise/promiseHelper';\n\nimport { produce } from 'immer';\nimport sendV8MetadataRequest from '../../../redux/netgemApi/actions/v8/metadata';\nimport sendV8SectionFeedRequest from '../../../redux/netgemApi/actions/v8/feed';\nimport { showDebug } from '../../../helpers/debug/debug';\n\ntype ReduxSectionDispatchToPropsType = {|\n +localSendV8MetadataRequest: (assetId: string, type: MetadataKind, signal?: AbortSignal) => Promise<any>,\n +localSendV8SectionFeedRequest: (section: NETGEM_API_V8_SECTION, signal?: AbortSignal) => Promise<any>,\n|};\n\ntype ReduxSectionReducerStateType = {|\n +isDebugModeEnabled: boolean,\n|};\n\ntype DefaultProps = {|\n +focusedLocationId?: string,\n +onItemClick?: NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE,\n|};\n\ntype SectionPropType = {|\n ...DefaultProps,\n +cardData: CARD_DATA_MODAL_TYPE,\n +isVod: boolean,\n +section: NETGEM_API_V8_SECTION,\n // Series Id is only given in case series metadata is not passed to component and has to be loaded from here\n +seriesId: string,\n +seriesMetadata: ?NETGEM_API_V8_METADATA_SERIES,\n|};\n\ntype CompleteSectionPropType = {|\n ...SectionPropType,\n ...ReduxSectionReducerStateType,\n ...ReduxSectionDispatchToPropsType,\n|};\n\ntype SectionStateType = {|\n episodesMetadata: Array<NETGEM_API_V8_METADATA_PROGRAM>,\n expandedItemIndex: number,\n feed: NETGEM_API_V8_FEED | null,\n isLoading: boolean,\n seriesMetadata: ?NETGEM_API_V8_METADATA_SERIES,\n tileRenderer: Undefined<(i: number, item: NETGEM_API_V8_FEED_ITEM, seriesMetadata: NETGEM_API_V8_METADATA_SERIES) => React.Node>,\n|};\n\nconst InitialState: $ReadOnly<SectionStateType> = Object.freeze({\n episodesMetadata: [],\n expandedItemIndex: -1,\n feed: null,\n isLoading: true,\n seriesMetadata: null,\n tileRenderer: undefined,\n});\n\nclass SectionView extends React.PureComponent<CompleteSectionPropType, SectionStateType> {\n abortController: AbortController;\n\n placeholderRenderer: (i: number) => React.Node;\n\n sectionName: string;\n\n tileConfig: TILE_CONFIG_TYPE;\n\n static defaultProps: DefaultProps = {\n focusedLocationId: undefined,\n onItemClick: undefined,\n };\n\n constructor(props: CompleteSectionPropType) {\n super(props);\n\n const {\n isVod,\n section,\n section: { id },\n } = props;\n\n this.abortController = new AbortController();\n this.placeholderRenderer = isVod ? this.getVodPlaceholderRenderer : this.getTVPlaceholderRenderer;\n this.sectionName = id;\n this.tileConfig = getTileConfig(section);\n\n this.state = { ...InitialState };\n }\n\n componentDidMount() {\n this.loadData();\n\n // Recordings or scheduled recordings section: ensure data freshness\n Messenger.on(MessengerEvents.REFRESH_RECORDINGS_SECTION, this.forceRefresh);\n }\n\n componentWillUnmount() {\n const { abortController } = this;\n\n abortController.abort('Component SectionSeries will unmount');\n Messenger.off(MessengerEvents.REFRESH_RECORDINGS_SECTION, this.forceRefresh);\n }\n\n showDebugInfo: () => void = () => {\n const { props, state } = this;\n\n showDebug('Section', {\n instance: this,\n instanceFields: ['sectionName'],\n props,\n propsFields: ['focusedLocationId', 'isVod', 'onItemClick', 'section', 'seriesId', 'seriesMetadata'],\n state,\n stateFields: ['episodesMetadata', 'expandedItemIndex', 'feed', 'isLoading', 'seriesMetadata'],\n });\n };\n\n setEmptySectionLoaded = () => {\n this.setState({\n episodesMetadata: [],\n expandedItemIndex: -1,\n feed: [],\n isLoading: false,\n });\n };\n\n // Only used for recordings and scheduled recordings sections\n forceRefresh: () => void = () => {\n this.loadData();\n };\n\n loadData = () => {\n const { localSendV8SectionFeedRequest, section } = this.props;\n const {\n abortController: { signal },\n } = this;\n\n const seriesMetadata = this.getSeriesMetadata();\n\n // Ensure series metadata is loaded before feed\n if (!seriesMetadata) {\n this.loadSeriesMetadata();\n return;\n }\n\n localSendV8SectionFeedRequest(section, signal)\n .then((response) => {\n signal.throwIfAborted();\n\n Messenger.emit(MessengerEvents.EPISODES_FEED_LOADED);\n const feed = ((response: any): NETGEM_API_V8_FEED);\n\n this.setState(\n {\n episodesMetadata: new Array(feed.length),\n feed,\n },\n this.loadEpisodesMetadata,\n );\n })\n .catch((error) => ignoreIfAborted(signal, error, this.setEmptySectionLoaded));\n };\n\n loadSeriesMetadata = () => {\n const { localSendV8MetadataRequest, seriesId } = this.props;\n const {\n abortController: { signal },\n } = this;\n\n localSendV8MetadataRequest(seriesId, METADATA_KIND_SERIES, signal)\n .then((metadata: NETGEM_API_V8_METADATA) => {\n signal.throwIfAborted();\n\n const seriesMetadata = ((metadata: any): NETGEM_API_V8_METADATA_SERIES);\n if (seriesMetadata) {\n this.setState({ seriesMetadata }, () => this.loadData());\n }\n })\n .catch((error) => ignoreIfAborted(signal, error, () => this.setState({ seriesMetadata: null }, this.setEmptySectionLoaded)));\n };\n\n loadEpisodeMetadata = (index: number, item: NETGEM_API_V8_FEED_ITEM, signal?: AbortSignal): Promise<any> => {\n const { focusedLocationId, isVod, localSendV8MetadataRequest } = this.props;\n\n const {\n selectedLocation: { id },\n selectedProgramId,\n } = item;\n\n return localSendV8MetadataRequest(selectedProgramId, METADATA_KIND_PROGRAM, signal).then((metadata) => {\n if (signal?.aborted) {\n return;\n }\n\n const filteredMetadata = ((filterCredits(metadata): any): NETGEM_API_V8_METADATA_PROGRAM);\n\n this.setState(\n produce((draft) => {\n draft.episodesMetadata[index] = filteredMetadata;\n\n // Select (i.e. expand) item that was clicked (TV only)\n if (!isVod && id === focusedLocationId) {\n draft.expandedItemIndex = index;\n }\n }),\n );\n });\n };\n\n loadEpisodesMetadata = () => {\n const { feed } = this.state;\n const {\n abortController: { signal },\n sectionName,\n } = this;\n\n if (!feed || feed.length === 0) {\n this.setState({ isLoading: false });\n return;\n }\n\n const promises = feed.map((item, index) => this.loadEpisodeMetadata(index, item, signal));\n\n Promise.all(promises)\n .then(() => {\n if (signal.aborted) {\n return;\n }\n\n if (sectionName !== 'next_section') {\n // Check if a specific episode has been expanded before opening the player\n const data = LocalStorageManager.loadObject(StorageKeys.CardExpandedItemIndex, null);\n if (data) {\n const { expandedItemIndex: savedIndex, itemId: savedItemId, playerExit } = data;\n const {\n cardData: {\n item: { id: itemId },\n },\n } = this.props;\n\n if (playerExit && savedItemId === itemId) {\n this.updateExpandedState(savedIndex);\n }\n\n LocalStorageManager.delete(StorageKeys.CardExpandedItemIndex);\n }\n }\n\n this.setState({ isLoading: false }, this.checkEpisodeType);\n })\n .catch((error) => ignoreIfAborted(signal, error, this.setEmptySectionLoaded));\n };\n\n checkEpisodeType = (): void => {\n const { isVod } = this.props;\n const { episodesMetadata } = this.state;\n\n const authority = episodesMetadata[0]?.authority;\n\n this.setState({ tileRenderer: isVod && authority !== NETGEM_API_V8_AUTHENT_REALM_NETGEM ? this.getVodTileRenderer : this.getTVTileRenderer });\n };\n\n getSeriesMetadata = (): ?NETGEM_API_V8_METADATA_SERIES => {\n const { seriesMetadata: propsMetadata } = this.props;\n const { seriesMetadata: stateMetadata } = this.state;\n\n return propsMetadata ?? stateMetadata;\n };\n\n handleSectionTitleOnClick = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n const { isDebugModeEnabled } = this.props;\n\n if (isDebugModeEnabled && event.ctrlKey) {\n this.showDebugInfo();\n }\n };\n\n getTVPlaceholderRenderer = (i: number): React.Node => <PlaceholderTVEpisode key={i} />;\n\n getVodPlaceholderRenderer = (i: number): React.Node => <PlaceholderVodEpisode index={i} key={i} />;\n\n handleOnToggleExpandedState = (index: number) => {\n const { expandedItemIndex } = this.state;\n\n this.updateExpandedState(index === expandedItemIndex ? -1 : index);\n };\n\n updateExpandedState = (expandedItemIndex: number) => {\n const {\n cardData: {\n item: { id: itemId },\n },\n } = this.props;\n const { sectionName } = this;\n\n if (sectionName !== 'next_section') {\n // Save expanded item index to expand it again after player exited (saved data will be updated when player exits to distinguish between manually reopening the card)\n LocalStorageManager.save(StorageKeys.CardExpandedItemIndex, {\n expandedItemIndex,\n itemId,\n });\n }\n\n this.setState({ expandedItemIndex });\n };\n\n getTVTileRenderer = (i: number, item: NETGEM_API_V8_FEED_ITEM, seriesMetadata: NETGEM_API_V8_METADATA_SERIES): React.Node => {\n const { cardData, focusedLocationId, onItemClick } = this.props;\n const { episodesMetadata, expandedItemIndex } = this.state;\n const {\n tileConfig: { type: tileType },\n } = this;\n\n /*\n * Focused location Id is passed to the episode because in the case of a live episode being recorded,\n * the focused location is a scheduled event, while the episode location is a recording (GM-2513)\n */\n return (\n <TVItem\n cardData={cardData}\n focusedLocationId={focusedLocationId}\n index={i}\n isExpanded={i === expandedItemIndex}\n item={item}\n key={item.id}\n onItemClick={onItemClick}\n onToggleExpandedState={this.handleOnToggleExpandedState}\n programMetadata={episodesMetadata[i]}\n seriesMetadata={seriesMetadata}\n tileType={tileType}\n />\n );\n };\n\n getVodTileRenderer = (i: number, item: NETGEM_API_V8_FEED_ITEM, seriesMetadata: NETGEM_API_V8_METADATA_SERIES): React.Node => {\n const { cardData } = this.props;\n const { episodesMetadata, expandedItemIndex } = this.state;\n\n return (\n <VodItem\n cardData={cardData}\n index={i}\n isExpanded={i === expandedItemIndex}\n item={item}\n key={item.id}\n onToggleExpandedState={this.handleOnToggleExpandedState}\n programMetadata={episodesMetadata[i]}\n seriesMetadata={seriesMetadata}\n />\n );\n };\n\n renderEpisodes = (feed: NETGEM_API_V8_FEED, seriesMetadata: NETGEM_API_V8_METADATA_SERIES): Array<React.Node> => {\n const { episodesMetadata, tileRenderer } = this.state;\n const { placeholderRenderer } = this;\n\n let lastLoadedIndex = -1;\n for (let i = 0; i < episodesMetadata.length; ++i) {\n if (episodesMetadata[i] === undefined) {\n break;\n }\n lastLoadedIndex += 1;\n }\n\n return feed.map((item, i) => {\n if (tileRenderer === undefined || i > lastLoadedIndex) {\n return placeholderRenderer(i);\n }\n\n return tileRenderer(i, item, seriesMetadata);\n });\n };\n\n render(): React.Node {\n const { section } = this.props;\n const { feed, isLoading } = this.state;\n const { sectionName } = this;\n\n const seriesMetadata = this.getSeriesMetadata();\n const sectionTitle = getTranslatedText(section.title, Localizer.language);\n\n if (!feed || !seriesMetadata) {\n return null;\n }\n\n const { length: itemCount } = feed;\n\n if (!isLoading && itemCount === 0) {\n // Empty sections are not displayed\n return null;\n }\n\n return (\n <div className={clsx('seriesSection', isLoading && 'placeholder')} id={`section_${sectionName}`}>\n <div className='header'>\n <div className={clsx('sectionTitleContainer', isLoading && sectionTitle === '' && 'noTitle')} onClick={this.handleSectionTitleOnClick}>\n <div className='sectionTitle'>\n <div className='title'>{sectionTitle}</div>\n <div className='episodeCount'>({itemCount})</div>\n </div>\n </div>\n </div>\n <div className='episodes'>{this.renderEpisodes(feed, seriesMetadata)}</div>\n </div>\n );\n }\n}\n\nconst mapStateToProps = (state: CombinedReducers): ReduxSectionReducerStateType => {\n return {\n isDebugModeEnabled: state.appConfiguration.isDebugModeEnabled,\n };\n};\n\nconst mapDispatchToProps = (dispatch: Dispatch): ReduxSectionDispatchToPropsType => {\n return {\n localSendV8MetadataRequest: (assetId: string, type: MetadataKind, signal?: AbortSignal): Promise<any> => dispatch(sendV8MetadataRequest(assetId, type, signal)),\n\n localSendV8SectionFeedRequest: (section: NETGEM_API_V8_SECTION, signal?: AbortSignal): Promise<any> => dispatch(sendV8SectionFeedRequest(section, null, signal)),\n };\n};\n\nconst Section: React.ComponentType<SectionPropType> = connect(mapStateToProps, mapDispatchToProps, null, { forwardRef: true })(SectionView);\n\nexport default Section;\n","/* @flow */\n\nimport './CardModalAvenue.css';\nimport * as React from 'react';\nimport { GroupItemsBy, type NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE } from '../../../libs/netgemLibrary/v8/types/WidgetConfig';\nimport { ItemType, type NETGEM_API_V8_FEED_ITEM } from '../../../libs/netgemLibrary/v8/types/FeedItem';\nimport type { CARD_DATA_MODAL_TYPE } from './CardModalConstsAndTypes';\nimport type { Dispatch } from '../../../redux/types/types';\nimport { type NETGEM_API_V8_AVENUE } from '../../../libs/netgemLibrary/v8/types/Avenue';\nimport type { NETGEM_API_V8_URL_DEFINITION } from '../../../libs/netgemLibrary/v8/types/NtgVideoFeed';\nimport RegularSection from '../../avenue/section/Section';\nimport SeriesSection from '../../avenue/sectionSeries/Section';\nimport type { Undefined } from '@ntg/utils/dist/types';\nimport { connect } from 'react-redux';\nimport { filterSections } from '../../../helpers/ui/metadata/Exclusion';\nimport { ignoreIfAborted } from '../../../libs/netgemLibrary/helpers/cancellablePromise/promiseHelper';\nimport { isVodItem } from '../../../helpers/ui/item/metadata';\nimport sendV8CustomStrategyRequest from '../../../redux/netgemApi/actions/v8/customStrategyRequest';\n\ntype ReduxAvenueDispatchToPropsType = {|\n +localSendV8CustomStrategyRequest: (urlDefinition: NETGEM_API_V8_URL_DEFINITION, item: NETGEM_API_V8_FEED_ITEM, signal?: AbortSignal) => Promise<any>,\n|};\n\ntype AvenuePropType = {|\n +cardData: CARD_DATA_MODAL_TYPE,\n +displayedSectionCount: ?number,\n|};\n\ntype CompleteAvenuePropType = {|\n ...AvenuePropType,\n ...ReduxAvenueDispatchToPropsType,\n|};\n\ntype AvenueStateType = {|\n avenue: NETGEM_API_V8_AVENUE | null,\n cardItem: NETGEM_API_V8_FEED_ITEM | null,\n|};\n\nconst InitialState = Object.freeze({\n avenue: null,\n cardItem: null,\n});\n\nclass CardModalAvenue extends React.PureComponent<CompleteAvenuePropType, AvenueStateType> {\n abortController: AbortController;\n\n constructor(props: CompleteAvenuePropType) {\n super(props);\n\n this.abortController = new AbortController();\n\n this.state = { ...InitialState };\n }\n\n componentDidMount() {\n this.loadAvenue();\n }\n\n componentDidUpdate(prevProps: CompleteAvenuePropType) {\n const {\n cardData: { item },\n } = this.props;\n const {\n cardData: { item: prevItem },\n } = prevProps;\n\n if (prevItem !== item) {\n this.loadAvenue();\n }\n }\n\n componentWillUnmount() {\n const { abortController } = this;\n\n abortController.abort('Component CardModalAvenue will unmount');\n }\n\n loadAvenueFromUrlDefinition = (urlDefinition: NETGEM_API_V8_URL_DEFINITION, cardItem: NETGEM_API_V8_FEED_ITEM) => {\n const { localSendV8CustomStrategyRequest } = this.props;\n const {\n abortController: { signal },\n } = this;\n\n localSendV8CustomStrategyRequest(urlDefinition, cardItem, signal)\n .then((response) => {\n signal.throwIfAborted();\n\n this.setState({ avenue: filterSections(response) });\n })\n .catch((error) => ignoreIfAborted(signal, error, this.destroyAvenue));\n };\n\n loadAvenue = () => {\n const {\n cardData: {\n item,\n item: { type },\n seriesMetadata,\n urlDefinition,\n },\n } = this.props;\n\n if (!urlDefinition) {\n return;\n }\n\n // Used to force treating episode of series with \"program\" type as a series\n const cardItem =\n type === ItemType.Program && seriesMetadata !== undefined && seriesMetadata !== null\n ? {\n ...item,\n id: seriesMetadata.id,\n seriesId: seriesMetadata.id,\n type: ItemType.Series,\n }\n : item;\n\n this.setState({ cardItem });\n this.loadAvenueFromUrlDefinition(urlDefinition, cardItem);\n };\n\n dataLoadedCallback = () => {\n // Nothing to do at the moment\n };\n\n createAvenue = (displayedSectionCount: ?number): Array<React.Node> | null => {\n const {\n cardData,\n cardData: { seriesMetadata },\n } = this.props;\n const { avenue, cardItem } = this.state;\n\n if (!avenue || !cardItem) {\n return null;\n }\n\n const {\n id: itemId,\n seriesId,\n selectedLocation: { id: selectedLocationId },\n } = cardItem;\n\n const {\n sections,\n sections: { length },\n } = avenue;\n const sectionCount = typeof displayedSectionCount === 'number' ? Math.min(displayedSectionCount, length) : length;\n const sectionContainer: Array<React.Node> = [];\n\n for (let i: number = 0; i < sectionCount; ++i) {\n const { [i]: section } = sections;\n const { id, widgetConfig } = section;\n let groupItemsBy: ?GroupItemsBy = null;\n let onItemClick: Undefined<NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE> = undefined;\n\n if (widgetConfig) {\n ({ groupItemsBy, onItemClick } = widgetConfig);\n }\n\n if (seriesId && groupItemsBy === GroupItemsBy.Program) {\n sectionContainer.push(\n <SeriesSection\n cardData={cardData}\n focusedLocationId={selectedLocationId}\n isVod={isVodItem(cardItem)}\n key={`section_${id}`}\n onItemClick={onItemClick}\n section={section}\n seriesId={seriesId}\n seriesMetadata={seriesMetadata}\n />,\n );\n } else {\n sectionContainer.push(\n <RegularSection\n avenueIndex={0}\n cardData={cardData}\n dataLoadedCallback={this.dataLoadedCallback}\n key={`section_${id}_${itemId}`}\n onItemClick={onItemClick}\n section={section}\n sectionIndex={i}\n />,\n );\n }\n }\n\n return sectionContainer;\n };\n\n destroyAvenue = () => {\n this.setState({ ...InitialState });\n };\n\n render(): React.Node {\n const { displayedSectionCount } = this.props;\n\n if (typeof displayedSectionCount === 'number' && displayedSectionCount === 0) {\n return null;\n }\n\n return <div className='cardAvenueView'>{this.createAvenue(displayedSectionCount)}</div>;\n }\n}\n\nconst mapDispatchToProps = (dispatch: Dispatch): ReduxAvenueDispatchToPropsType => {\n return {\n localSendV8CustomStrategyRequest: (urlDefinition: NETGEM_API_V8_URL_DEFINITION, item: NETGEM_API_V8_FEED_ITEM, signal?: AbortSignal): Promise<any> =>\n dispatch(sendV8CustomStrategyRequest(urlDefinition, item, signal)),\n };\n};\n\nconst CardAvenueView: React.ComponentType<AvenuePropType> = connect(null, mapDispatchToProps, null, { forwardRef: true })(CardModalAvenue);\n\nexport default CardAvenueView;\n","/* @flow */\n\nexport const NETGEM_API_V8_CREDIT_ROLE_ACTOR: 'Actor' = 'Actor';\nexport const NETGEM_API_V8_CREDIT_ROLE_DIRECTOR: 'Director' = 'Director';\nexport const NETGEM_API_V8_CREDIT_ROLE_GUEST: 'Guest' = 'Guest';\nexport const NETGEM_API_V8_CREDIT_ROLE_PRESENTER: 'Presenter' = 'Presenter';\n\n// Cannot convert to Flow enum because it's used as an object's key\nexport type NETGEM_API_V8_CREDIT_ROLE_TYPE =\n | typeof NETGEM_API_V8_CREDIT_ROLE_ACTOR\n | typeof NETGEM_API_V8_CREDIT_ROLE_DIRECTOR\n | typeof NETGEM_API_V8_CREDIT_ROLE_GUEST\n | typeof NETGEM_API_V8_CREDIT_ROLE_PRESENTER;\n\nexport type NETGEM_API_V8_CREDIT = {|\n id: string,\n name: string,\n role: NETGEM_API_V8_CREDIT_ROLE_TYPE,\n|};\n","/* @flow */\n\nexport const GOOGLE_SEARCH_URL = 'https://www.google.com/search?q={searchString}';\n\nexport const CAST_TOOLTIP = Object.freeze({\n Distance: 0,\n HideDelay: 150,\n ShowDelay: 300,\n});\n\nexport type CommonPropType = {|\n +onHidden: (tip: any) => void,\n +onTrigger: (tip: any) => void,\n|};\n","/* @flow */\n\nexport enum WikipediaResultStatusType {\n Disambiguation,\n Error,\n Notfound,\n Success,\n}\n\nexport type WikipediaSummary = {|\n authorsUrl: string,\n description: ?string,\n extract: ?string,\n extractHtml: ?string,\n imageHeight: ?number,\n imageUrl: ?string,\n imageWidth: ?number,\n pageUrl: string,\n timestamp: string,\n title: string,\n|};\n\nexport type WikipediaResultType = {|\n rawData: any,\n status: WikipediaResultStatusType,\n summary: WikipediaSummary | null,\n url: string,\n|};\n","/* @flow */\n\nimport * as React from 'react';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport { PictoExternal } from '@ntg/components/dist/pictos/Element';\nimport { useMemo } from 'react';\n\ntype ExternalLinkPropType = {|\n +textKey: string,\n +url: string,\n|};\n\nconst ExternalLink = ({ textKey, url }: ExternalLinkPropType): React.Node => {\n const text = useMemo(() => Localizer.localize(textKey), [textKey]);\n\n return (\n <a href={url} rel='noopener noreferrer' target='_blank'>\n {text}\n <PictoExternal />\n </a>\n );\n};\n\nexport default ExternalLink;\n","/* @flow */\n\nimport { WikipediaResultStatusType, type WikipediaResultType, type WikipediaSummary } from './Types';\nimport { logError, logInfo } from '../debug/debug';\nimport { HttpStatus } from '../../libs/netgemLibrary/v8/constants/NetworkCodesAndMessages';\nimport { fetchJsonWithErrorCheck } from '../jsHelpers/xhr';\n\nconst WIKI_PAGE_URL = `${process.env.REACT_APP_WIKIPEDIA_URL ?? 'https://en.wikipedia.org'}/api/rest_v1/page/summary/{title}`;\n\nclass Wikipedia {\n // $FlowFixMe: Flow does not support symbols yet\n get [Symbol.toStringTag]() {\n return 'Wikipedia';\n }\n\n static buildSummary: (rawData: any) => WikipediaSummary = (rawData) => {\n const {\n content_urls: {\n desktop: { page: pageUrl, revisions: authorsUrl },\n },\n description,\n extract,\n extract_html: extractHtml,\n originalimage,\n timestamp,\n title,\n } = rawData;\n\n let imageUrl: ?string = null;\n let imageHeight: ?number = null;\n let imageWidth: ?number = null;\n if (originalimage) {\n ({ height: imageHeight, source: imageUrl, width: imageWidth } = originalimage);\n }\n\n return {\n authorsUrl,\n description,\n extract,\n extractHtml,\n imageHeight,\n imageUrl,\n imageWidth,\n pageUrl,\n timestamp,\n title,\n };\n };\n\n static getData: (title: string, signal: AbortSignal) => Promise<WikipediaResultType> = async (title, signal) => {\n const url = WIKI_PAGE_URL.replace('{title}', title);\n\n if (signal.aborted) {\n // Component unmounted\n throw new Error('Signal aborted');\n }\n\n try {\n const rawData = await fetchJsonWithErrorCheck(url, { signal });\n const { type, title: resultTitle } = rawData;\n\n const out: WikipediaResultType = {\n rawData,\n status: WikipediaResultStatusType.Success,\n summary: null,\n url,\n };\n\n if (resultTitle.toLowerCase().indexOf('not found') > -1 || type.endsWith('/not_found')) {\n // Page not found\n out.status = WikipediaResultStatusType.Notfound;\n } else {\n // Page found or disambiguation needed\n out.summary = this.buildSummary(rawData);\n\n if (type === 'disambiguation') {\n // Title matches more than one page\n out.status = WikipediaResultStatusType.Disambiguation;\n }\n }\n\n return out;\n } catch (error) {\n const { message } = error;\n const [status] = message.split(':');\n\n const isNotFound = status === HttpStatus.NotFound.toString();\n\n // $FlowFixMe: flow doesn't know DOMException\n if (!signal.aborted && (!(error instanceof DOMException) || error.name !== 'AbortError')) {\n // Only report non-abort errors\n if (isNotFound) {\n logInfo('No Wikipedia entry for this person');\n } else {\n logError(error);\n }\n }\n\n return {\n rawData: null,\n status: isNotFound ? WikipediaResultStatusType.Notfound : WikipediaResultStatusType.Error,\n summary: null,\n url,\n };\n }\n };\n}\n\nexport default Wikipedia;\n","/* @flow */\n\nimport './Credits.css';\nimport * as React from 'react';\nimport { CAST_TOOLTIP, type CommonPropType, GOOGLE_SEARCH_URL } from './helper';\nimport { WikipediaResultStatusType, type WikipediaResultType, type WikipediaSummary } from '../../helpers/Wikipedia/Types';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport ExternalLink from '../link/ExternalLink';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport { TIPPY_DEFAULT_OPTIONS } from '@ntg/ui/dist/tooltip';\nimport Tippy from '@tippyjs/react';\nimport Wikipedia from '../../helpers/Wikipedia/Wikipedia';\nimport { ignoreIfAborted } from '../../libs/netgemLibrary/helpers/cancellablePromise/promiseHelper';\nimport { useSelector } from 'react-redux';\n\ntype CreditPropType = {|\n ...CommonPropType,\n +name: string,\n|};\n\nconst renderNotFoundContent = (name: string): React.Node => (\n <div className='tooltipContent castSummary'>\n <div className='summary' key='not-found'>\n {Localizer.localize('credits.wikipedia.not_found')}\n </div>\n <ExternalLink key='google-link' textKey='credits.google_search' url={GOOGLE_SEARCH_URL.replace('{searchString}', encodeURIComponent(name))} />\n </div>\n);\n\nconst renderCastContent = (status: WikipediaResultStatusType, summary: WikipediaSummary, wikipediaUrl: string): React.Node => {\n const { authorsUrl, extract, imageUrl, pageUrl, title } = summary;\n const text = status === WikipediaResultStatusType.Success ? extract || '' : Localizer.localize('credits.wikipedia.disambiguation');\n\n return (\n <div className='tooltipContent castSummary'>\n <div className='detailsAndImage' key='details'>\n <div className='details'>\n <div className='name'>{title}</div>\n <div className='summary'>{text}</div>\n <ExternalLink textKey='credits.wikipedia.more' url={pageUrl} />\n </div>\n {imageUrl ? <img src={imageUrl} /> : null}\n </div>\n <div className='citation' key='citation'>\n <div className='copyright'>{Localizer.localize('credits.wikipedia.copyright')}</div>\n <a href={authorsUrl} rel='noopener noreferrer' target='_blank'>\n {Localizer.localize('credits.wikipedia.copyright_name')}\n </a>\n <div className='license'>{Localizer.localize('credits.wikipedia.license')}</div>\n <a href={wikipediaUrl} rel='noopener noreferrer' target='_blank'>\n {Localizer.localize('credits.wikipedia.license_name')}\n </a>\n </div>\n </div>\n );\n};\n\nconst Credit = ({ name, onHidden, onTrigger }: CreditPropType): React.Node => {\n const wikipediaUrl = useSelector((state) => state.appConfiguration.wikipediaUrl);\n const abortController = useRef<AbortController>(new AbortController());\n const [wikipediaResult, setWikipediaResult] = useState<WikipediaResultType | null>(null);\n\n // eslint-disable-next-line arrow-body-style\n useEffect(() => {\n return () => {\n abortController.current.abort('Component Credit will unmount');\n };\n }, []);\n\n const handleCastSummaryOnShow = useCallback((): void => {\n if (wikipediaResult !== null) {\n // Tooltip content already retrieved\n return;\n }\n\n const { signal } = abortController.current;\n\n // Make request\n Wikipedia.getData(name, signal)\n .then((result) => {\n signal.throwIfAborted();\n setWikipediaResult(result);\n })\n .catch((error) => ignoreIfAborted(signal, error));\n }, [name, onTrigger, wikipediaUrl]);\n\n const renderContent = useCallback(() => {\n if (wikipediaResult === null) {\n return null;\n }\n\n const { status, summary } = wikipediaResult;\n\n if ((status === WikipediaResultStatusType.Success || status === WikipediaResultStatusType.Disambiguation) && summary) {\n return renderCastContent(status, summary, wikipediaUrl);\n }\n\n return renderNotFoundContent(name);\n }, [wikipediaResult]);\n\n /* eslint-disable react/jsx-props-no-spreading */\n return (\n <Tippy\n {...TIPPY_DEFAULT_OPTIONS}\n allowHTML\n appendTo={document.body}\n content={renderContent()}\n delay={[CAST_TOOLTIP.ShowDelay, CAST_TOOLTIP.HideDelay]}\n hideOnClick={false}\n interactive\n offset={[0, CAST_TOOLTIP.Distance]}\n onHidden={onHidden}\n onShow={handleCastSummaryOnShow}\n onTrigger={onTrigger}\n >\n <span className='cast'>{name}</span>\n </Tippy>\n );\n /* eslint-enable react/jsx-props-no-spreading */\n};\n\nexport default Credit;\n","/* @flow */\n\nimport './Credits.css';\nimport * as React from 'react';\nimport type { CommonPropType } from './helper';\nimport Credit from './Credit';\nimport { Localizer } from '@ntg/utils/dist/localization';\n\ntype CreditsByRolePropType = {|\n ...CommonPropType,\n +labelKey: string,\n +names: Array<string>,\n|};\n\nconst CreditsByRole = ({ labelKey, names, onHidden, onTrigger }: CreditsByRolePropType): React.Node => {\n if (names.length === 0) {\n return null;\n }\n\n /* eslint-disable react/no-array-index-key */\n return (\n <>\n <span className='label'>{Localizer.localize(labelKey)}</span>\n {names.map((name, index) => (\n <Credit key={`${index}-${name}`} name={name} onHidden={onHidden} onTrigger={onTrigger} />\n ))}\n </>\n );\n /* eslint-enable react/no-array-index-key */\n};\n\nexport default CreditsByRole;\n","/* @flow */\n\nimport './Credits.css';\nimport * as React from 'react';\nimport {\n NETGEM_API_V8_CREDIT_ROLE_ACTOR,\n NETGEM_API_V8_CREDIT_ROLE_DIRECTOR,\n NETGEM_API_V8_CREDIT_ROLE_GUEST,\n NETGEM_API_V8_CREDIT_ROLE_PRESENTER,\n type NETGEM_API_V8_CREDIT_ROLE_TYPE,\n} from '../../libs/netgemLibrary/v8/types/Credit';\nimport type { NETGEM_API_V8_METADATA_PROGRAM, NETGEM_API_V8_METADATA_SERIES } from '../../libs/netgemLibrary/v8/types/MetadataProgram';\nimport { useCallback, useMemo, useState } from 'react';\nimport CreditsByRole from './CreditsByRole';\nimport type { ReadOnlyKeyValuePair } from '@ntg/utils/dist/types';\n\nconst MAX_PEOPLE_BY_ROLE: ReadOnlyKeyValuePair<number> = Object.freeze({\n [NETGEM_API_V8_CREDIT_ROLE_ACTOR]: 10,\n [NETGEM_API_V8_CREDIT_ROLE_DIRECTOR]: 3,\n [NETGEM_API_V8_CREDIT_ROLE_GUEST]: 3,\n [NETGEM_API_V8_CREDIT_ROLE_PRESENTER]: 3,\n});\n\ntype CreditsPropType = {|\n +metadata: NETGEM_API_V8_METADATA_PROGRAM | NETGEM_API_V8_METADATA_SERIES | null,\n|};\n\nconst keyByRole: ReadOnlyKeyValuePair<string> = Object.freeze({\n [NETGEM_API_V8_CREDIT_ROLE_ACTOR]: 'credits.with',\n [NETGEM_API_V8_CREDIT_ROLE_DIRECTOR]: 'credits.by',\n [NETGEM_API_V8_CREDIT_ROLE_GUEST]: 'credits.with',\n [NETGEM_API_V8_CREDIT_ROLE_PRESENTER]: 'credits.presented',\n});\n\nconst orderedRoles: Array<NETGEM_API_V8_CREDIT_ROLE_TYPE> = Object.freeze([\n NETGEM_API_V8_CREDIT_ROLE_DIRECTOR,\n NETGEM_API_V8_CREDIT_ROLE_PRESENTER,\n NETGEM_API_V8_CREDIT_ROLE_GUEST,\n NETGEM_API_V8_CREDIT_ROLE_ACTOR,\n]);\n\nconst Credits = ({ metadata }: CreditsPropType): React.Node => {\n const [openTooltips, setOpenTooltips] = useState<any>(new Set());\n\n const handleOnHidden = useCallback(\n (tip: any): void => {\n const newOpenTooltips = new Set(openTooltips);\n newOpenTooltips.delete(tip);\n setOpenTooltips(newOpenTooltips);\n },\n [openTooltips, setOpenTooltips],\n );\n\n const handleOnTrigger = useCallback(\n (tip: any): void => {\n openTooltips.forEach((t) => t.hide());\n setOpenTooltips(new Set([tip]));\n },\n [openTooltips, setOpenTooltips],\n );\n\n const listByRole = useMemo(() => {\n const obj: {| [NETGEM_API_V8_CREDIT_ROLE_TYPE]: Array<string> |} = {};\n orderedRoles.forEach((role) => (obj[role] = []));\n\n if (!metadata) {\n return obj;\n }\n\n const { credits } = metadata;\n if (!credits) {\n // All lists are empty\n return obj;\n }\n\n for (let i: number = 0; i < credits.length; i++) {\n const { name, role } = credits[i];\n\n if (\n (role === NETGEM_API_V8_CREDIT_ROLE_ACTOR || role === NETGEM_API_V8_CREDIT_ROLE_DIRECTOR || role === NETGEM_API_V8_CREDIT_ROLE_GUEST || role === NETGEM_API_V8_CREDIT_ROLE_PRESENTER) &&\n obj[role].length < MAX_PEOPLE_BY_ROLE[role]\n ) {\n obj[role].push(name);\n }\n }\n\n return obj;\n }, [metadata]);\n\n if (!metadata) {\n return null;\n }\n\n return (\n <div className='credits'>\n {orderedRoles.map((role) => (\n <CreditsByRole key={role} labelKey={keyByRole[role]} names={listByRole[role]} onHidden={handleOnHidden} onTrigger={handleOnTrigger} />\n ))}\n </div>\n );\n};\n\nexport default Credits;\n","/* @flow */\n\nimport AccurateTimestamp from '../dateTime/AccurateTimestamp';\n\ntype VideoStructuredDataType = {|\n '@context': string,\n '@type': string,\n description: string,\n duration: string,\n name: string,\n regionsAllowed?: string,\n thumbnailUrl?: Array<string>,\n uploadDate: string,\n url: string,\n|};\n\nconst getOrCreateScript: () => HTMLElement = () => {\n let jsonLd = document.querySelector('script[type=\"application/ld+json\"]');\n if (!jsonLd) {\n jsonLd = document.createElement('script');\n jsonLd.type = 'application/ld+json';\n document.querySelector('head')?.appendChild(jsonLd);\n }\n\n return jsonLd;\n};\n\nconst addLinkedData: (url: string, name: string, description: string, duration: string, imageUrl: ?string, uploadDate: ?string) => void = (url, name, description, duration, imageUrl, uploadDate) => {\n const data: VideoStructuredDataType = {\n '@context': 'https://schema.org',\n '@type': 'VideoObject',\n description,\n duration,\n name,\n uploadDate: uploadDate ?? AccurateTimestamp.nowAsIsoString(),\n url,\n };\n\n if (imageUrl) {\n data.thumbnailUrl = [imageUrl];\n }\n\n const regionsAllowed = process.env.REACT_APP_REGIONS_ALLOWED;\n if (regionsAllowed) {\n data.regionsAllowed = regionsAllowed;\n }\n\n const jsonLd = getOrCreateScript();\n jsonLd.innerText = JSON.stringify(data);\n};\n\nexport { addLinkedData };\n","/* @flow */\n\nimport './CardModal.css';\nimport * as React from 'react';\nimport {\n type ADD_TO_FAVORITE_DATA_TYPE,\n type ADD_TO_WISHLIST_DATA_TYPE,\n type BASE_VOD_PURCHASE_DATA_TYPE,\n PendingOperationKind,\n PendingOperationReason,\n type VOD_PURCHASE_DATA_TYPE,\n clearPendingOperation,\n storePendingOperation,\n} from '../../../helpers/rights/pendingOperations';\nimport { BOVodAssetStatus, getTitIdFromProviderInfo, getVodLocationFromVtiId, getVodStatusFromLocations, hasBeenPurchased, hasTrailer } from '../../../helpers/videofutur/metadata';\nimport { BroadcastStatus, WebAppHelpersLocationStatus, getBroadcastStatus, getLocationStatus } from '../../../helpers/ui/location/Format';\nimport { CARD_BACKGROUND_IMAGE_HEIGHT, CARD_BACKGROUND_IMAGE_WIDTH, CHANNEL_IMAGE_HEIGHT, CHANNEL_IMAGE_WIDTH, VOD_TILE_HEIGHT, VOD_TILE_WIDTH } from '../../../helpers/ui/constants';\nimport {\n type CARD_DATA_MODAL_TYPE,\n type CardModalStateType,\n type CompleteCardModalPropType,\n ImageDisplayType,\n REFRESH_TIMEOUT,\n type ReduxCardModalDispatchToPropsType,\n type ReduxCardModalReducerStateType,\n} from './CardModalConstsAndTypes';\nimport { FEATURE_NPVR, FEATURE_SUBSCRIPTION } from '../../../redux/appConf/constants';\nimport { IMAGE_TAG_NO_TEXT, findLandscapeImageId } from '../../../helpers/ui/metadata/image';\nimport {\n ItemContent,\n ItemType,\n type NETGEM_API_V8_FEED_ITEM,\n type NETGEM_API_V8_ITEM_LOCATION,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_CATCHUP,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_SVOD,\n VodKind,\n} from '../../../libs/netgemLibrary/v8/types/FeedItem';\nimport {\n METADATA_KIND_PROGRAM,\n METADATA_KIND_SERIES,\n type MetadataKind,\n type NETGEM_API_V8_METADATA,\n type NETGEM_API_V8_METADATA_PROGRAM,\n type NETGEM_API_V8_METADATA_SERIES,\n} from '../../../libs/netgemLibrary/v8/types/MetadataProgram';\nimport { MILLISECONDS_PER_HOUR, formatDate, formatExpirationDate } from '../../../helpers/dateTime/Format';\nimport { Messenger, MessengerEvents } from '@ntg/utils/dist/messenger';\nimport { type NETGEM_API_V8_AUTHENT_REALM, NETGEM_API_V8_AUTHENT_REALM_VIDEOFUTUR } from '../../../libs/netgemLibrary/v8/types/Realm';\nimport { PictoClock, PictoFailure, PictoHeartFull, PictoRecord, PictoWarning } from '@ntg/components/dist/pictos/Element';\nimport PricingVod, { ContextKind as PricingContext } from '../../pricingVod/PricingVod';\nimport RecordButton, { DisplayMode, ContextKind as RecordContext } from '../../recordButton/RecordButton';\nimport { RecordingOutcome, ScheduledRecordingsKind, type ScheduledRecordingsKindType } from '../../../libs/netgemLibrary/v8/types/Npvr';\nimport { Theme, type ThemeType } from '@ntg/ui/dist/theme';\nimport { addToWishlist, removeFromWishlist } from '../../../redux/netgemApi/actions/personalData/wishlist';\nimport { channelHasStartover, getChannelImageId } from '../../../helpers/channel/helper';\nimport { getDisplayType, getLiveProgress, getWatchingStatus, isFavorite, isItemPlayable, updateTitle } from './helper';\nimport { getEpisodeAndSeriesRecordStatus, getScheduledRecordingIdFromRecordingId } from '../../../helpers/npvr/recording';\nimport { getEpisodeIndexAndTitle, getStartAndEndTimes, getSynopsis, getTagline, getTitle, renderProgramDetails } from '../../../helpers/ui/metadata/Format';\nimport { getImageSourceUrl, getImageUrl } from '../../../redux/netgemApi/actions/v8/metadataImage';\nimport { hideModal, showVodPurchaseModal } from '../../../redux/modal/actions';\nimport { isFavoriteGranted, isWishlistGranted } from '../../../helpers/rights/wishlist';\nimport { logError, showDebug } from '../../../helpers/debug/debug';\nimport sendV8MetadataLocationRequest, { getVodLocations } from '../../../redux/netgemApi/actions/v8/metadataLocation';\nimport AccurateTimestamp from '../../../helpers/dateTime/AccurateTimestamp';\nimport ButtonFX from '../../buttons/ButtonFX';\nimport CardAvenue from './CardModalAvenue';\nimport type { CombinedReducers } from '../../../redux/reducers';\nimport CreditsView from '../../credits/Credits';\nimport type { Dispatch } from '../../../redux/types/types';\nimport { ExtendedItemType } from '../../../helpers/ui/item/types';\nimport { LoadableStatus } from '../../../helpers/loadable/loadable';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport Modal from '../modal';\nimport type { ModalState } from '../../../redux/modal/reducers';\nimport type { NETGEM_API_V8_METADATA_SCHEDULE } from '../../../libs/netgemLibrary/v8/types/MetadataSchedule';\nimport type { NETGEM_API_V8_PURCHASE_INFO } from '../../../libs/netgemLibrary/v8/types/PurchaseInfo';\nimport type { NETGEM_API_V8_RAW_FEED } from '../../../libs/netgemLibrary/v8/types/FeedResult';\nimport type { NETGEM_API_V8_REQUEST_RESPONSE } from '../../../libs/netgemLibrary/v8/types/RequestResponse';\nimport type { NETGEM_API_V8_URL_DEFINITION } from '../../../libs/netgemLibrary/v8/types/NtgVideoFeed';\nimport { PROGRAM_INFO } from '../../../helpers/ui/metadata/Types';\nimport { RegistrationType } from '../../../redux/appRegistration/types/types';\nimport StatusPicto from '../../statusPicto/StatusPicto';\nimport { TileConfigTileType } from '../../../libs/netgemLibrary/v8/types/WidgetConfig';\nimport type { Undefined } from '@ntg/utils/dist/types';\nimport WishlistCache from '../../../helpers/wishlist/WishlistCache';\nimport { addLinkedData } from '../../../helpers/jsHelpers/linkedData';\nimport addToFavoriteList from '../../../redux/netgemApi/actions/videofutur/addFavorite';\nimport clsx from 'clsx';\nimport { connect } from 'react-redux';\nimport { filterCredits } from '../../../helpers/ui/metadata/Exclusion';\nimport { getDistributorId } from '../../../helpers/ui/item/distributor';\nimport { getItemContentType } from '../../../libs/netgemLibrary/v8/helpers/Item';\nimport { getPurchaseInfoPerAsset } from '../../../redux/netgemApi/actions/v8/purchaseInfo';\nimport { getStartOverItem } from '../../../libs/netgemLibrary/v8/helpers/CatchupForAsset';\nimport { ignoreIfAborted } from '../../../libs/netgemLibrary/helpers/cancellablePromise/promiseHelper';\nimport { isItemLiveOrAboutToStart } from '../../../libs/netgemLibrary/v8/helpers/Feed';\nimport { isPlaybackGranted } from '../../../helpers/rights/playback';\nimport { isVodItem } from '../../../helpers/ui/item/metadata';\nimport { parseBoolean } from '../../../helpers/jsHelpers/parser';\nimport removeFromFavoriteList from '../../../redux/netgemApi/actions/videofutur/deleteFavorite';\nimport { resetSectionPageIndices } from '../../../redux/ui/actions';\nimport sendV8LocationCatchupForAssetRequest from '../../../redux/netgemApi/actions/v8/catchupForAsset';\nimport sendV8MetadataRequest from '../../../redux/netgemApi/actions/v8/metadata';\nimport { sendV8RecordingsMetadataRequest } from '../../../redux/netgemApi/actions/v8/recordings';\n\nconst InitialState = Object.freeze({\n authority: undefined,\n backgroundImageUrl: null,\n broadcastStatus: BroadcastStatus.Unknown,\n canBePlayed: false,\n channelImageUrl: null,\n contentType: ItemContent.Unknown,\n followedPictoClassName: '',\n imageDisplayType: ImageDisplayType.Unset,\n isDeletable: false,\n isFollowed: null,\n isLiveRecording: false,\n isSeries: false,\n isWaitingForDeleteConfirmation: false,\n isWaitingForRecordConfirmation: false,\n portraitImageUrl: null,\n previewCatchupScheduledEventId: null,\n programMetadata: null,\n purchaseInfo: null,\n seriesMetadata: null,\n startoverItem: null,\n tvLocationMetadata: null,\n vodLocationsMetadata: null,\n vodStatus: null,\n});\n\nclass CardModalView extends React.PureComponent<CompleteCardModalPropType, CardModalStateType> {\n abortController: AbortController;\n\n broadcastStatusRefreshTimer: TimeoutID | null;\n\n failedRecordingId: ?string;\n\n recordOutcome: ?RecordingOutcome;\n\n slider: React.ElementRef<any> | null;\n\n warningScheduledEventId: ?string;\n\n warningScheduledRecordingId: ?string;\n\n constructor(props: CompleteCardModalPropType) {\n super(props);\n\n this.abortController = new AbortController();\n this.failedRecordingId = null;\n this.recordOutcome = null;\n this.broadcastStatusRefreshTimer = null;\n this.slider = null;\n this.warningScheduledEventId = null;\n this.warningScheduledRecordingId = null;\n\n const { cardData } = props;\n if (cardData) {\n const {\n item: { type },\n seriesMetadata,\n } = cardData;\n // When opened from player, only display episode card (not series card)\n this.state = {\n ...InitialState,\n isSeries: type === ItemType.Series || (seriesMetadata !== undefined && seriesMetadata !== null),\n };\n } else {\n this.state = { ...InitialState };\n }\n }\n\n componentDidMount() {\n Messenger.on(MessengerEvents.EPISODES_FEED_LOADED, this.loadVodData);\n this.initialize();\n }\n\n componentDidUpdate(prevProps: CompleteCardModalPropType, prevState: CardModalStateType) {\n const { cardData, favoriteList, localResetSectionPageIndices, npvrRecordingsList, npvrScheduledRecordingsList, purchaseList, wishlist, wishlistStatus } = this.props;\n const {\n cardData: prevCardData,\n favoriteList: prevFavoriteList,\n npvrRecordingsList: prevNpvrRecordingsList,\n npvrScheduledRecordingsList: prevNpvrScheduledRecordingsList,\n purchaseList: prevPurchaseList,\n wishlist: prevWishlist,\n wishlistStatus: prevWishlistStatus,\n } = prevProps;\n const { broadcastStatus, contentType, isFollowed, previewCatchupScheduledEventId, vodLocationsMetadata } = this.state;\n const {\n broadcastStatus: prevBroadcastStatus,\n contentType: prevContentType,\n isFollowed: prevIsFollowed,\n previewCatchupScheduledEventId: prevPreviewCatchupScheduledEventId,\n vodLocationsMetadata: prevVodLocationsMetadata,\n } = prevState;\n const { broadcastStatusRefreshTimer } = this;\n\n if (!cardData) {\n return;\n }\n\n if (vodLocationsMetadata !== prevVodLocationsMetadata || purchaseList !== prevPurchaseList) {\n this.updateVodStatus();\n }\n\n if ((!prevPurchaseList && purchaseList) || (!prevFavoriteList && favoriteList) || (wishlistStatus === LoadableStatus.Loaded && prevWishlistStatus !== LoadableStatus.Loaded)) {\n this.checkPendingOperation();\n }\n\n if (favoriteList !== prevFavoriteList) {\n // VOD/SVOD case\n this.updateIsFollowed();\n }\n\n if (isFollowed !== prevIsFollowed) {\n this.updateFollowedPictoClassName(prevIsFollowed, isFollowed);\n }\n\n if (contentType !== prevContentType) {\n if (!broadcastStatusRefreshTimer) {\n this.updateBroadcastStatus();\n }\n }\n\n const {\n item: { locType, selectedLocation, selectedProgramId, type },\n } = cardData;\n\n if (!prevCardData) {\n // No card was loaded before (not sure if this could happen...)\n this.updateContentType();\n } else {\n const {\n item: { locType: prevLocType, selectedLocation: prevSelectedLocation, selectedProgramId: prevSelectedProgramId, type: prevType },\n } = prevCardData;\n\n if (locType !== prevLocType) {\n this.updateBroadcastStatus();\n }\n\n if (locType !== prevLocType || type !== prevType || selectedProgramId !== prevSelectedProgramId || selectedLocation !== prevSelectedLocation) {\n // Reset saved positions for all sections in the card (using \"card_\" prefix)\n localResetSectionPageIndices('card_');\n\n const { slider } = this;\n if (slider) {\n // Scroll to top when card is updated\n slider.scrollTop = 0;\n }\n\n this.updateContentType();\n return;\n }\n\n if (\n npvrRecordingsList !== prevNpvrRecordingsList ||\n npvrScheduledRecordingsList !== prevNpvrScheduledRecordingsList ||\n wishlist !== prevWishlist ||\n broadcastStatus !== prevBroadcastStatus ||\n previewCatchupScheduledEventId !== prevPreviewCatchupScheduledEventId\n ) {\n this.updateCard();\n }\n }\n }\n\n componentWillUnmount() {\n const { applicationName } = this.props;\n const { abortController } = this;\n\n abortController.abort('Component CardModal will unmount');\n\n Messenger.off(MessengerEvents.EPISODES_FEED_LOADED, this.loadVodData);\n\n this.resetBroadcastStatusRefreshTimer();\n\n updateTitle(applicationName);\n }\n\n initialize = () => {\n const { cardData } = this.props;\n const { isSeries } = this.state;\n\n if (!cardData) {\n return;\n }\n\n const {\n item: { id, selectedProgramId, seriesId },\n programMetadata,\n seriesMetadata,\n } = cardData;\n\n if (programMetadata) {\n this.updateContentType();\n } else {\n this.loadProgramMetadata(selectedProgramId);\n }\n\n if (isSeries && !seriesMetadata) {\n this.loadSeriesMetadata(seriesId ?? id);\n }\n };\n\n getProgramMetadata = (): NETGEM_API_V8_METADATA_PROGRAM | null => {\n const { cardData } = this.props;\n const { programMetadata } = this.state;\n\n return cardData?.programMetadata ?? programMetadata;\n };\n\n getSeriesMetadata = (): NETGEM_API_V8_METADATA_SERIES | null => {\n const { cardData } = this.props;\n const { seriesMetadata } = this.state;\n\n return cardData?.seriesMetadata ?? seriesMetadata;\n };\n\n checkPendingOperation = () => {\n const { cardData, isRegisteredAsGuest } = this.props;\n\n if (isRegisteredAsGuest || !cardData?.pendingOperation) {\n // User not logged in or no pending operation\n return;\n }\n\n const {\n pendingOperation: { addToFavoriteData, addToWishlistData, operationType, purchaseData },\n } = cardData;\n\n /*\n * DEBUG: do not perform pending operation if a subscription was required but nothing has changed\n * // Operation was pending until user logs in\n * if (cardData.pendingOperation?.reason === PendingOperationReason.RequireAccount ||\n * (\n * // Operation was pending until user subscribes\n * cardData.pendingOperation?.reason === PendingOperationReason.RequireSubscription &&\n * Object.values(subscriptions).some((status) => status === SubscriptionStatus.Active || status === SubscriptionStatus.NonRenewing)\n * )) {\n * Messenger.emit(MessengerEvents.OPEN_CARD, cardData);\n * }\n */\n\n switch (operationType) {\n case PendingOperationKind.AddToFavorite:\n this.performPendingAddToFavorite(addToFavoriteData);\n break;\n\n case PendingOperationKind.AddToWishlist:\n this.performPendingAddToWishlist(addToWishlistData);\n break;\n\n case PendingOperationKind.Purchase:\n this.performPendingPurchase(purchaseData);\n break;\n\n case PendingOperationKind.Play:\n this.performPendingPlay(cardData);\n break;\n\n case PendingOperationKind.Record:\n // Pending operation is handled at RecordButton level\n break;\n\n case PendingOperationKind.OpenCard:\n clearPendingOperation();\n break;\n\n // No default\n }\n };\n\n performPendingAddToFavorite = (addToFavoriteData: ?ADD_TO_FAVORITE_DATA_TYPE) => {\n const { favoriteList, localAddToFavoriteList } = this.props;\n\n if (!favoriteList) {\n // Favorite list not retrieved yet\n return;\n }\n\n clearPendingOperation();\n\n if (!addToFavoriteData || !addToFavoriteData.titId) {\n // Corrupt data: clear pending operation\n return;\n }\n\n const { titId } = addToFavoriteData;\n\n if (favoriteList.includes(titId)) {\n // Item is already in favorite list\n return;\n }\n\n this.toggleFavoriteInternal(titId, localAddToFavoriteList);\n };\n\n performPendingAddToWishlist = (addToWishlistData: ?ADD_TO_WISHLIST_DATA_TYPE) => {\n const { localAddToWishlist, wishlist, wishlistStatus } = this.props;\n const {\n abortController: { signal },\n } = this;\n\n if (wishlistStatus !== LoadableStatus.Loaded) {\n // Wishlist not retrieved yet\n return;\n }\n\n clearPendingOperation();\n\n if (!addToWishlistData || !addToWishlistData.assetId || !addToWishlistData.channelId) {\n // Corrupt data: clear pending operation\n return;\n }\n\n const { assetId, channelId } = addToWishlistData;\n\n if (wishlist.has(assetId)) {\n // Item is already in Wishlist\n return;\n }\n\n localAddToWishlist(assetId, channelId, signal).catch((error) => ignoreIfAborted(signal, error));\n };\n\n performPendingPurchase = (purchaseData: ?VOD_PURCHASE_DATA_TYPE): void => {\n const { purchaseList, showVodPurchaseDialog } = this.props;\n\n if (!purchaseList) {\n // Purchase list not retrieved yet\n return;\n }\n\n if (!purchaseData?.vodLocationMetadata?.purchaseInfo || !purchaseData?.vodLocationMetadata?.providerInfo?.distributorId) {\n // Corrupt data: clear pending operation\n clearPendingOperation();\n return;\n }\n\n const {\n otherVtiId,\n vodLocationMetadata: {\n providerInfo: { distributorId },\n purchaseInfo,\n },\n } = purchaseData;\n\n // User tried to rent or buy while in guest mode: continue purchase\n const { vtiId } = purchaseInfo;\n if (hasBeenPurchased(purchaseList, distributorId, vtiId, otherVtiId)) {\n // Item already purchased\n clearPendingOperation();\n } else {\n Messenger.once(MessengerEvents.MODAL_CONFIRMATION_CLOSED, this.vodPurchaseModalClosedCallback);\n showVodPurchaseDialog(purchaseData);\n }\n };\n\n performPendingPlay = (cardData: CARD_DATA_MODAL_TYPE) => {\n const { distributorId, item, pendingOperation, programMetadata, seriesMetadata, tileType, urlDefinition, viewingHistoryId, vtiId } = cardData;\n\n clearPendingOperation();\n\n if (!pendingOperation) {\n // Corrupt data: clear pending operation\n return;\n }\n\n const { authority, contentType } = pendingOperation;\n\n if (!authority || !contentType) {\n // Corrupt data: clear pending operation\n return;\n }\n\n this.checkPlay(authority, contentType, item, programMetadata, seriesMetadata, tileType, distributorId ?? null, viewingHistoryId ?? null, vtiId ?? null, urlDefinition);\n };\n\n startBroadcastStatusRefreshTimer = () => {\n const { broadcastStatus } = this.state;\n\n this.resetBroadcastStatusRefreshTimer();\n\n if (broadcastStatus === BroadcastStatus.Past) {\n // A past item will never change, no need to check again\n return;\n }\n\n this.broadcastStatusRefreshTimer = setTimeout(this.updateBroadcastStatus, REFRESH_TIMEOUT);\n };\n\n resetBroadcastStatusRefreshTimer = () => {\n if (this.broadcastStatusRefreshTimer) {\n clearTimeout(this.broadcastStatusRefreshTimer);\n this.broadcastStatusRefreshTimer = null;\n }\n };\n\n checkDeeplink = () => {\n const { cardData, deeplink, localGetImageSourceUrl } = this.props;\n const { isSeries } = this.state;\n\n if (!deeplink || !cardData) {\n return;\n }\n\n const {\n item: {\n selectedLocation: { duration, previewAvailabilityStartDate },\n },\n } = cardData;\n const programMetadata = this.getProgramMetadata();\n const seriesMetadata = this.getSeriesMetadata();\n\n if (!programMetadata || !duration || (isSeries && !seriesMetadata)) {\n return;\n }\n\n const title = getTitle(seriesMetadata ?? programMetadata, Localizer.language);\n const synopsis = getSynopsis(isSeries ? seriesMetadata : programMetadata, Localizer.language);\n\n if (title && synopsis) {\n const {\n item: { selectedProgramId, seriesId },\n } = cardData;\n const assetId = seriesId ?? selectedProgramId;\n\n localGetImageSourceUrl(assetId, VOD_TILE_WIDTH, VOD_TILE_HEIGHT).then((imageUrl) => {\n addLinkedData(deeplink, title, synopsis, duration, imageUrl, previewAvailabilityStartDate);\n });\n }\n };\n\n updateContentType = () => {\n const { cardData } = this.props;\n\n if (!cardData) {\n return;\n }\n\n const { item } = cardData;\n const programMetadata = this.getProgramMetadata();\n const seriesMetadata = this.getSeriesMetadata();\n const { authority } = programMetadata || {};\n\n const isSeries = typeof item.seriesId === 'string' || seriesMetadata !== null;\n\n if (!programMetadata || (isSeries && !seriesMetadata)) {\n return;\n }\n\n this.checkDeeplink();\n\n this.setState(\n {\n authority,\n contentType: getItemContentType(item, authority),\n imageDisplayType: ImageDisplayType.Unset,\n isSeries,\n purchaseInfo: null,\n },\n () => {\n this.updateCard();\n this.loadItemRelatedData();\n },\n );\n };\n\n updateBroadcastStatus = () => {\n const { cardData } = this.props;\n const { contentType } = this.state;\n\n if (!cardData) {\n return;\n }\n\n const {\n item,\n item: { type },\n } = cardData;\n\n // Item is an SVOD but is displayed as a catchup (e.g. Okoo)\n this.setState({ broadcastStatus: contentType === ItemContent.NetgemSVOD && type !== ItemType.Series ? BroadcastStatus.Past : getBroadcastStatus(item) }, this.startBroadcastStatusRefreshTimer);\n };\n\n updateFollowedPictoClassName = (prevIsFollowed: ?boolean, isFollowed: ?boolean) => {\n let followedPictoClassName = '';\n\n if (prevIsFollowed === null) {\n // First load of card\n followedPictoClassName = isFollowed ? 'visible' : '';\n } else {\n // Card update\n followedPictoClassName = isFollowed ? 'appearing' : 'disappearing';\n }\n\n this.setState({ followedPictoClassName });\n };\n\n updateIsFollowed = () => {\n const { props, state } = this;\n this.setState({ isFollowed: isFavorite(props, state) });\n };\n\n updateCard = () => {\n const { applicationName, cardData, isNpvrEnabled, npvrRecordingsFuture, npvrRecordingsList, npvrScheduledRecordingsList } = this.props;\n const { broadcastStatus, contentType, isSeries, previewCatchupScheduledEventId } = this.state;\n\n if (!cardData) {\n return;\n }\n\n const programMetadata = this.getProgramMetadata();\n const seriesMetadata = this.getSeriesMetadata();\n const {\n item,\n item: {\n locType,\n selectedLocation: { channelId },\n },\n } = cardData;\n const programId = programMetadata?.id ?? '';\n\n updateTitle(applicationName, getTitle(seriesMetadata ?? programMetadata, Localizer.language));\n\n const { failedRecordingId, hasRecording, hasScheduledRecording, hasSeriesScheduledRecording, recordOutcome, warningScheduledEventId, warningScheduledRecordingId } =\n getEpisodeAndSeriesRecordStatus(programId, seriesMetadata?.id, item, npvrRecordingsList, npvrRecordingsFuture, npvrScheduledRecordingsList, previewCatchupScheduledEventId);\n\n const scheduledRecordingId = warningScheduledRecordingId || (failedRecordingId ? getScheduledRecordingIdFromRecordingId(failedRecordingId, npvrScheduledRecordingsList) : null);\n\n const isDeletable =\n isNpvrEnabled &&\n (locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT || locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING) &&\n (hasRecording || hasScheduledRecording || hasSeriesScheduledRecording);\n\n this.recordOutcome = recordOutcome;\n this.failedRecordingId = failedRecordingId;\n this.warningScheduledRecordingId = scheduledRecordingId;\n this.warningScheduledEventId = warningScheduledEventId;\n\n this.updateChannelImage(channelId);\n\n this.setState(\n {\n canBePlayed: isItemPlayable(cardData, broadcastStatus, contentType, isSeries, recordOutcome),\n isDeletable,\n isLiveRecording: hasRecording && broadcastStatus === BroadcastStatus.Live,\n },\n this.updateIsFollowed,\n );\n };\n\n updateChannelImage = (channelId?: string) => {\n const { channels, localGetImageUrl } = this.props;\n const {\n abortController: { signal },\n } = this;\n\n const channelImageId = getChannelImageId(channels, channelId);\n\n if (!channelImageId) {\n return;\n }\n\n localGetImageUrl(channelImageId, CHANNEL_IMAGE_WIDTH, CHANNEL_IMAGE_HEIGHT, Theme.Dark, signal)\n .then((channelImageUrl: string) => {\n signal.throwIfAborted();\n\n this.setState({ channelImageUrl });\n })\n .catch((error) => ignoreIfAborted(signal, error));\n };\n\n loadPurchaseInfo = () => {\n const { cardData, localGetPurchaseInfoPerAsset } = this.props;\n const { contentType } = this.state;\n const {\n abortController: { signal },\n } = this;\n\n if (!cardData) {\n return;\n }\n\n const {\n item: {\n id,\n purchasable,\n selectedLocation: { channelId },\n },\n } = cardData;\n\n if ((contentType !== ItemContent.VODOrDeeplink && contentType !== ItemContent.NetgemSVOD) || !purchasable) {\n return;\n }\n\n if (channelId === undefined) {\n logError(`Channel Id is undefined for item ${id}`);\n return;\n }\n\n localGetPurchaseInfoPerAsset(id, channelId, signal)\n .then((purchaseInfo: NETGEM_API_V8_PURCHASE_INFO) => {\n signal.throwIfAborted();\n this.setState({ purchaseInfo });\n })\n .catch((error) => ignoreIfAborted(signal, error, () => this.setState({ purchaseInfo: null })));\n };\n\n loadProgramMetadata = (programId: string) => {\n const { localSendV8MetadataRequest } = this.props;\n const {\n abortController: { signal },\n } = this;\n\n localSendV8MetadataRequest(programId, METADATA_KIND_PROGRAM, signal)\n .then((metadata: NETGEM_API_V8_METADATA) => {\n signal.throwIfAborted();\n\n const programMetadata = ((filterCredits(metadata): any): NETGEM_API_V8_METADATA_PROGRAM);\n this.setState({ programMetadata }, this.updateContentType);\n })\n .catch((error) => ignoreIfAborted(signal, error));\n };\n\n loadSeriesMetadata = (seriesId: string) => {\n const { localSendV8MetadataRequest } = this.props;\n const {\n abortController: { signal },\n } = this;\n\n localSendV8MetadataRequest(seriesId, METADATA_KIND_SERIES, signal)\n .then((metadata: NETGEM_API_V8_METADATA) => {\n signal.throwIfAborted();\n\n const seriesMetadata = ((filterCredits(metadata): any): NETGEM_API_V8_METADATA_SERIES);\n this.setState({ seriesMetadata }, this.updateContentType);\n })\n .catch((error) => ignoreIfAborted(signal, error, () => this.setState({ seriesMetadata: null })));\n };\n\n loadItemRelatedData = () => {\n const { cardData, usePackPurchaseApi } = this.props;\n const { isSeries } = this.state;\n\n if (!cardData) {\n return;\n }\n\n const { item } = cardData;\n const isVod = isVodItem(item);\n\n if (isVod) {\n // TODO: clean up code when BO API v2 is fully supported\n if (usePackPurchaseApi) {\n this.loadPurchaseInfo();\n }\n\n if (!isSeries) {\n this.loadVodData();\n }\n } else {\n this.loadTVLocationMetadata(item);\n }\n\n this.loadLandscapeImage(isVod);\n this.loadStartoverItem(cardData);\n };\n\n loadTVLocationMetadata = (item: NETGEM_API_V8_FEED_ITEM) => {\n const { cardData, localSendV8MetadataLocationRequest, localSendV8RecordingsMetadataRequest } = this.props;\n const { authority, broadcastStatus } = this.state;\n const {\n abortController: { signal },\n } = this;\n const {\n locType,\n selectedLocation: { id },\n } = item;\n\n if (!cardData || !id) {\n return;\n }\n\n const locationStatus = getLocationStatus(item, authority);\n const request =\n locationStatus === WebAppHelpersLocationStatus.Recording || (locationStatus === WebAppHelpersLocationStatus.Live && locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING)\n ? localSendV8RecordingsMetadataRequest\n : localSendV8MetadataLocationRequest;\n\n request(id, signal)\n .then((requestResponse: NETGEM_API_V8_REQUEST_RESPONSE) => {\n signal.throwIfAborted();\n\n const {\n result,\n result: {\n location: { target },\n },\n } = requestResponse;\n this.setState(\n {\n previewCatchupScheduledEventId: broadcastStatus === BroadcastStatus.Preview ? target : null,\n tvLocationMetadata: result,\n },\n this.checkPendingOperation,\n );\n })\n .catch((error) => ignoreIfAborted(signal, error));\n };\n\n handleInfoOnClick = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => {\n const { isDebugModeEnabled } = this.props;\n\n if (isDebugModeEnabled && event.ctrlKey) {\n event.preventDefault();\n event.stopPropagation();\n\n const { props, state } = this;\n showDebug('Card', {\n instance: this,\n instanceFields: ['failedRecordingId', 'recordOutcome', 'warningScheduledEventId', 'warningScheduledRecordingId'],\n props,\n propsFields: ['cardData'],\n state,\n stateFields: [\n 'authority',\n 'backgroundImageUrl',\n 'broadcastStatus',\n 'canBePlayed',\n 'channelImageUrl',\n 'contentType',\n 'followedPictoClassName',\n 'imageDisplayType',\n 'isDeletable',\n 'isFollowed',\n 'isLiveRecording',\n 'isSeries',\n 'isWaitingForDeleteConfirmation',\n 'isWaitingForRecordConfirmation',\n 'portraitImageUrl',\n 'previewCatchupScheduledEventId',\n 'programMetadata',\n 'purchaseInfo',\n 'seriesMetadata',\n 'startoverItem',\n 'tvLocationMetadata',\n 'vodLocationsMetadata',\n 'vodStatus',\n ],\n });\n }\n };\n\n loadLandscapeImage = (isVod: boolean) => {\n const { cardData } = this.props;\n const {\n abortController: { signal },\n } = this;\n\n if (!cardData) {\n return;\n }\n\n let imageId: string | null = null;\n\n if (isVod && !parseBoolean(process.env.REACT_APP_FORCE_LANDSCAPE_VOD_CARD)) {\n const {\n item: {\n locType,\n selectedLocation: { channelId },\n seriesId,\n },\n } = cardData;\n const programMetadata = this.getProgramMetadata();\n const seriesMetadata = this.getSeriesMetadata();\n const imagesMetadata = typeof seriesId === 'string' ? seriesMetadata?.images : programMetadata?.images;\n\n if (imagesMetadata) {\n imageId = findLandscapeImageId(imagesMetadata, IMAGE_TAG_NO_TEXT);\n }\n\n // Special OCS case: images are in landscape but program metadata does not contain their list\n const isPortraitAllowed = locType !== NETGEM_API_V8_ITEM_LOCATION_TYPE_SVOD || !channelId || !/canalplusocs/iu.test(channelId);\n\n if (!imageId && isPortraitAllowed) {\n // If landscape image without text is not found, let's load portrait image\n this.loadPortraitImage();\n return;\n }\n }\n\n this.loadImage(CARD_BACKGROUND_IMAGE_WIDTH, CARD_BACKGROUND_IMAGE_HEIGHT, signal, imageId)\n .then((imageUrl) => {\n // Image is set to background image whatever its orientation because if it's portrait, it will be blurred\n this.setState({\n backgroundImageUrl: imageUrl,\n imageDisplayType: ImageDisplayType.Landscape,\n });\n })\n .catch(() => {\n if (signal.aborted) {\n return;\n }\n this.setState({ backgroundImageUrl: null });\n });\n };\n\n loadPortraitImage = () => {\n const {\n abortController: { signal },\n } = this;\n\n this.loadImage(VOD_TILE_WIDTH, VOD_TILE_HEIGHT, signal)\n .then((portraitImageUrl) =>\n this.setState({\n backgroundImageUrl: portraitImageUrl,\n imageDisplayType: ImageDisplayType.Portrait,\n portraitImageUrl,\n }),\n )\n .catch(() => {\n if (signal.aborted) {\n return;\n }\n this.setState({ portraitImageUrl: null });\n });\n };\n\n loadImage = (width: number, height: number, signal: AbortSignal, imageId: ?string): Promise<?string> => {\n const { cardData, localGetImageUrl } = this.props;\n\n if (!cardData) {\n return Promise.reject(new Error('No cardData'));\n }\n\n const {\n item: { selectedProgramId, seriesId },\n } = cardData;\n const assetId = seriesId ?? selectedProgramId;\n\n return localGetImageUrl(imageId ?? assetId, width, height, undefined, signal).then((response) => {\n signal.throwIfAborted();\n\n return response;\n });\n };\n\n loadStartoverItem = (cardData: CARD_DATA_MODAL_TYPE) => {\n const { channels, localSendV8LocationCatchupForAssetRequest } = this.props;\n const {\n abortController: { signal },\n } = this;\n const {\n item,\n item: { locType, selectedLocation, selectedProgramId },\n } = cardData;\n\n if (!selectedLocation) {\n this.setState({ startoverItem: null });\n return;\n }\n\n const { channelId } = selectedLocation;\n\n if (!channelHasStartover(channels, channelId) || locType !== NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT || !isItemLiveOrAboutToStart(item)) {\n this.setState({ startoverItem: null });\n return;\n }\n\n localSendV8LocationCatchupForAssetRequest(selectedProgramId, AccurateTimestamp.now(), MILLISECONDS_PER_HOUR, signal)\n .then((requestResponse: NETGEM_API_V8_REQUEST_RESPONSE) => {\n signal.throwIfAborted();\n\n const startoverItem: NETGEM_API_V8_FEED_ITEM | null = getStartOverItem(item, requestResponse);\n this.setState({ startoverItem });\n })\n .catch((error) => ignoreIfAborted(signal, error, () => this.setState({ startoverItem: null })));\n };\n\n loadVodData = () => {\n const { cardData, localGetVodLocations } = this.props;\n const { isSeries } = this.state;\n const {\n abortController: { signal },\n } = this;\n\n if (!cardData) {\n return;\n }\n\n const {\n item,\n item: { elements, locations },\n } = cardData;\n\n if (!isVodItem(item)) {\n return;\n }\n\n if (!locations) {\n if (isSeries && elements) {\n this.loadEpisodesVodData(elements);\n }\n return;\n }\n\n // VOD program\n localGetVodLocations(locations, signal)\n .then((vodLocationsMetadata) => {\n signal.throwIfAborted();\n\n this.setState({ vodLocationsMetadata }, () => {\n this.updateIsFollowed();\n this.checkPendingOperation();\n });\n })\n .catch((error) => ignoreIfAborted(signal, error));\n };\n\n loadEpisodesVodData = (elements: NETGEM_API_V8_RAW_FEED) => {\n const { localGetVodLocations } = this.props;\n const {\n abortController: { signal },\n } = this;\n\n const promises = [];\n for (let i = 0; i < elements.length; ++i) {\n const { locations } = elements[i];\n if (locations) {\n promises.push(localGetVodLocations(locations, signal));\n }\n }\n\n Promise.all(promises)\n .then((results) => {\n if (signal.aborted) {\n return;\n }\n\n const locationsArray = ((results: any): Array<Array<NETGEM_API_V8_METADATA_SCHEDULE>>);\n const vodLocationsMetadata: Array<NETGEM_API_V8_METADATA_SCHEDULE> = [];\n locationsArray.forEach((loc) => vodLocationsMetadata.push(...loc));\n this.setState({ vodLocationsMetadata }, this.checkPendingOperation);\n })\n .catch((error) => ignoreIfAborted(signal, error));\n };\n\n updateVodStatus = () => {\n const { cardData, purchaseList } = this.props;\n const { isSeries, vodLocationsMetadata } = this.state;\n\n if (!cardData) {\n return;\n }\n\n const {\n item,\n item: { locType },\n } = cardData;\n if (!isVodItem(item)) {\n return;\n }\n\n if (!isSeries) {\n this.setState({ vodStatus: getVodStatusFromLocations(vodLocationsMetadata, purchaseList) });\n } else if (locType === (VodKind.SVOD: string)) {\n // SVOD series: display message at series level\n this.setState({ vodStatus: { status: BOVodAssetStatus.Free } });\n }\n };\n\n handlePlayButtonOnClick = () => {\n const { cardData } = this.props;\n const { authority, contentType, purchaseInfo, vodLocationsMetadata, vodStatus } = this.state;\n\n if (!cardData) {\n return;\n }\n\n const { item, tileType, urlDefinition } = cardData;\n const programMetadata = this.getProgramMetadata();\n const seriesMetadata = this.getSeriesMetadata();\n const distributorId = getDistributorId(vodLocationsMetadata, purchaseInfo, programMetadata);\n\n this.checkPlay(authority, contentType, item, programMetadata, seriesMetadata, tileType, distributorId, vodStatus?.viewingHistoryId ?? null, vodStatus?.vtiId ?? null, urlDefinition);\n };\n\n checkPlay = (\n authority?: NETGEM_API_V8_AUTHENT_REALM,\n contentType: ItemContent,\n item: NETGEM_API_V8_FEED_ITEM,\n programMetadata: NETGEM_API_V8_METADATA_PROGRAM | null,\n seriesMetadata: NETGEM_API_V8_METADATA_SERIES | null,\n tileType: TileConfigTileType,\n distributorId: string | null,\n viewingHistoryId: string | null,\n vtiId: number | null,\n urlDefinition?: NETGEM_API_V8_URL_DEFINITION | null,\n ) => {\n const { channels, commercialOffers, defaultRights, isRegisteredAsGuest, isSubscriptionFeatureEnabled, localHideModal, userRights } = this.props;\n const { previewCatchupScheduledEventId, tvLocationMetadata, vodLocationsMetadata } = this.state;\n\n const locationMetadata = tvLocationMetadata ?? getVodLocationFromVtiId(vodLocationsMetadata, vtiId);\n\n const cardDataLocal = {\n distributorId,\n item,\n programMetadata,\n seriesMetadata,\n tileType,\n urlDefinition,\n viewingHistoryId,\n vtiId,\n };\n\n if (\n !isPlaybackGranted(isRegisteredAsGuest, isSubscriptionFeatureEnabled, cardDataLocal, authority, contentType, locationMetadata?.location, channels, commercialOffers, defaultRights, userRights)\n ) {\n // Playback denied: log-in or subscribe page has been requested\n localHideModal();\n return;\n }\n\n if (contentType === ItemContent.VODOrDeeplink) {\n if (vtiId) {\n Messenger.emit(MessengerEvents.OPEN_PLAYER, {\n distributorId,\n item,\n locationId: locationMetadata?.location.id,\n programMetadata,\n seriesMetadata,\n tileType,\n type: ExtendedItemType.VOD,\n viewingHistoryId,\n vtiId,\n });\n }\n } else {\n Messenger.emit(MessengerEvents.OPEN_PLAYER, {\n authority,\n item,\n previewCatchupScheduledEventId,\n programMetadata,\n seriesMetadata,\n type: ExtendedItemType.TV,\n });\n }\n };\n\n handleTrailerButtonOnClick = () => {\n const { cardData } = this.props;\n\n if (!cardData) {\n return;\n }\n\n Messenger.emit(MessengerEvents.OPEN_PLAYER, {\n programMetadata: this.getProgramMetadata(),\n seriesMetadata: this.getSeriesMetadata(),\n type: ExtendedItemType.Trailer,\n });\n };\n\n handleReplayButtonOnClick = () => {\n const { cardData } = this.props;\n const { startoverItem } = this.state;\n\n if (cardData && startoverItem) {\n const programMetadata = this.getProgramMetadata();\n const seriesMetadata = this.getSeriesMetadata();\n\n Messenger.emit(MessengerEvents.OPEN_PLAYER, {\n item: startoverItem,\n programMetadata,\n seriesMetadata,\n type: ExtendedItemType.TV,\n });\n }\n };\n\n handleAddToWishlistButtonOnClick = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n const { cardData, localAddToWishlist, localAddToFavoriteList } = this.props;\n const { authority } = this.state;\n\n if (!cardData) {\n return;\n }\n\n if (authority === NETGEM_API_V8_AUTHENT_REALM_VIDEOFUTUR) {\n this.toggleFavorite(cardData, localAddToFavoriteList);\n } else {\n this.toggleWishlist(cardData, localAddToWishlist);\n }\n };\n\n handleRemoveFromWishlistButtonOnClick = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n const { cardData, localRemoveFromWishlist, localRemoveFromFavoriteList } = this.props;\n const { authority } = this.state;\n\n if (!cardData) {\n return;\n }\n\n if (authority === NETGEM_API_V8_AUTHENT_REALM_VIDEOFUTUR) {\n this.toggleFavorite(cardData, localRemoveFromFavoriteList);\n } else {\n this.toggleWishlist(cardData, localRemoveFromWishlist);\n }\n };\n\n toggleWishlist = (cardData: CARD_DATA_MODAL_TYPE, toggler: (assetId: string, channelId: string, signal?: AbortSignal) => Promise<any>) => {\n const { channels, commercialOffers, defaultRights, isRegisteredAsGuest, isSubscriptionFeatureEnabled, localHideModal, userRights } = this.props;\n const { tvLocationMetadata, vodLocationsMetadata, vodStatus } = this.state;\n const {\n abortController: { signal },\n } = this;\n\n const programMetadata = this.getProgramMetadata();\n const seriesMetadata = this.getSeriesMetadata();\n\n const {\n item: {\n selectedLocation: { channelId },\n selectedProgramId,\n },\n } = cardData;\n const assetId = seriesMetadata?.id ?? selectedProgramId;\n\n if (!channelId) {\n // Channel Id is null\n return;\n }\n\n const locationMetadata = tvLocationMetadata ?? getVodLocationFromVtiId(vodLocationsMetadata, vodStatus?.vtiId);\n\n const cardDataLocal = {\n ...cardData,\n programMetadata,\n seriesMetadata,\n };\n\n if (!isWishlistGranted(isRegisteredAsGuest, isSubscriptionFeatureEnabled, cardDataLocal, locationMetadata?.location, channels, commercialOffers, defaultRights, userRights)) {\n // Add to wishlist denied: log-in or subscribe page has been requested\n localHideModal();\n return;\n }\n\n toggler(assetId, channelId, signal).catch((error) => ignoreIfAborted(signal, error));\n };\n\n toggleFavoriteInternal = (titId: string, toggler: (titId: string, signal?: AbortSignal) => Promise<any>) => {\n const {\n abortController: { signal },\n } = this;\n\n toggler(titId, signal).catch((error) => ignoreIfAborted(signal, error));\n };\n\n toggleFavorite = (cardData: CARD_DATA_MODAL_TYPE, toggler: (titId: string, signal?: AbortSignal) => Promise<any>) => {\n const { channels, commercialOffers, defaultRights, isRegisteredAsGuest, isSubscriptionFeatureEnabled, localHideModal, userRights } = this.props;\n const { vodLocationsMetadata, vodStatus } = this.state;\n\n const programMetadata = this.getProgramMetadata();\n const seriesMetadata = this.getSeriesMetadata();\n\n if (!programMetadata) {\n return;\n }\n\n const { providerInfo } = programMetadata;\n\n if (!providerInfo) {\n return;\n }\n\n const locationMetadata = getVodLocationFromVtiId(vodLocationsMetadata, vodStatus?.vtiId);\n const cardDataLocal = {\n ...cardData,\n programMetadata,\n seriesMetadata,\n };\n\n const titId = getTitIdFromProviderInfo(providerInfo, seriesMetadata);\n\n if (!isFavoriteGranted(isRegisteredAsGuest, isSubscriptionFeatureEnabled, cardDataLocal, titId, locationMetadata?.location, channels, commercialOffers, defaultRights, userRights)) {\n // Add to favorite list denied: log-in or subscribe page has been requested\n localHideModal();\n return;\n }\n\n this.toggleFavoriteInternal(titId, toggler);\n };\n\n vodPurchaseModalClosedCallback = (data: any): void => {\n const { cardData } = this.props;\n const { purchaseInfo, vodLocationsMetadata } = this.state;\n\n if (!data) {\n // Purchase cancelled\n return;\n }\n\n const { locationId, playNow, viewingHistoryId, vtiId } = data;\n\n if (!cardData || !playNow || !vtiId) {\n return;\n }\n\n const programMetadata = this.getProgramMetadata();\n const seriesMetadata = this.getSeriesMetadata();\n\n const { item } = cardData;\n\n Messenger.emit(MessengerEvents.OPEN_PLAYER, {\n distributorId: getDistributorId(vodLocationsMetadata, purchaseInfo, programMetadata),\n item,\n locationId,\n programMetadata,\n seriesMetadata,\n type: ExtendedItemType.VOD,\n viewingHistoryId,\n vtiId,\n });\n };\n\n handlePurchaseButtonOnClick = (data: BASE_VOD_PURCHASE_DATA_TYPE): void => {\n const { cardData, isRegisteredAsGuest, localHideModal, showVodPurchaseDialog } = this.props;\n\n const { definition, displayPrice, distributorId, itemCount, licenseDuration, locationId, otherVtiId, purchaseType, vodLocationMetadata, vtiId } = data;\n\n if (!cardData) {\n return;\n }\n\n const programMetadata = this.getProgramMetadata();\n const seriesMetadata = this.getSeriesMetadata();\n\n if (!programMetadata) {\n return;\n }\n\n const providerInfo = vodLocationMetadata?.providerInfo ?? programMetadata.providerInfo;\n const { item } = cardData;\n\n const purchaseData: VOD_PURCHASE_DATA_TYPE = {\n definition,\n displayPrice,\n distributorId,\n item,\n itemCount,\n licenseDuration,\n locationId,\n otherVtiId,\n programMetadata,\n purchaseType,\n seriesMetadata,\n viewingHistoryId: providerInfo?.viewingHistoryId,\n vodLocationMetadata,\n vtiId,\n };\n\n if (isRegisteredAsGuest) {\n // Guest mode: let's open the sign-in page\n storePendingOperation({\n ...cardData,\n pendingOperation: {\n operationType: PendingOperationKind.Purchase,\n purchaseData,\n reason: PendingOperationReason.RequireAccount,\n },\n });\n localHideModal();\n Messenger.emit(MessengerEvents.SHOW_SIGN_IN, PendingOperationKind.Purchase);\n } else {\n Messenger.once(MessengerEvents.MODAL_CONFIRMATION_CLOSED, this.vodPurchaseModalClosedCallback);\n showVodPurchaseDialog(purchaseData);\n }\n };\n\n openPreviousCard = () => {\n const { cardData } = this.props;\n\n if (!cardData || !cardData.previousCard) {\n return;\n }\n\n const { previousCard } = cardData;\n Messenger.emit(MessengerEvents.OPEN_CARD, previousCard);\n };\n\n renderChannelImage = (): React.Node => {\n const { channelImageUrl } = this.state;\n\n if (!channelImageUrl) {\n return null;\n }\n\n return <div className='channelImage' style={{ backgroundImage: `url(${channelImageUrl})` }} />;\n };\n\n renderTitleAndSynopsis = (cardData: CARD_DATA_MODAL_TYPE, title: ?string): {| synopsisElement: React.Node, titleElement: React.Node |} => {\n const { followedPictoClassName, isSeries } = this.state;\n\n const { isOpenFromPlayer } = cardData;\n const programMetadata = this.getProgramMetadata();\n const seriesMetadata = this.getSeriesMetadata();\n\n const synopsisElement = <div className='synopsis'>{getSynopsis(isSeries ? seriesMetadata : programMetadata, Localizer.language)}</div>;\n\n const titleElement = (\n <div className='text'>\n <PictoHeartFull className={clsx('fullHeart', followedPictoClassName)} />\n <div className='title'>{seriesMetadata && (!isOpenFromPlayer || !title) ? getTitle(seriesMetadata, Localizer.language) : title}</div>\n </div>\n );\n\n return {\n synopsisElement,\n titleElement,\n };\n };\n\n renderBroadcastTime = (startTime: number, endTime: number): React.Node => {\n const { cardData } = this.props;\n const { contentType, isSeries } = this.state;\n\n if (!cardData) {\n return null;\n }\n\n const {\n item: { locType, selectedLocation },\n } = cardData;\n const { availabilityEndDate } = selectedLocation || {};\n const details = [];\n\n if ((locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_CATCHUP || locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING) && availabilityEndDate) {\n details.push(\n <div className='date expiration' key='expirationDate'>\n {formatExpirationDate(availabilityEndDate)}\n </div>,\n );\n }\n\n if (!isSeries && contentType === ItemContent.TV) {\n details.push(\n <div className='date broadcast' key='broadcastDate'>\n {formatDate(startTime, endTime, AccurateTimestamp.nowInSeconds())}\n </div>,\n );\n }\n\n return <>{details.map((d) => d)}</>;\n };\n\n renderProgramOrSeriesInfo = (isVodOrDeeplink: boolean): Array<React.Node> | null => {\n const { cardData } = this.props;\n const { isSeries, vodLocationsMetadata } = this.state;\n\n if (!cardData) {\n return null;\n }\n\n const { item } = cardData;\n const seriesMetadata = this.getSeriesMetadata();\n const metadata = isSeries && seriesMetadata ? seriesMetadata : this.getProgramMetadata();\n\n /* eslint-disable no-bitwise */\n let programInfo = PROGRAM_INFO.ParentalGuidance | PROGRAM_INFO.ReleaseDate | PROGRAM_INFO.Language | PROGRAM_INFO.Genre | PROGRAM_INFO.ProductionCountry;\n if (!isSeries && (!isVodOrDeeplink || !seriesMetadata)) {\n // Duration should also been displayed\n programInfo |= PROGRAM_INFO.Duration;\n }\n /* eslint-enable no-bitwise */\n\n return renderProgramDetails(item, metadata, vodLocationsMetadata, programInfo);\n };\n\n renderVodActionPanel = (): React.Node => {\n const { cardData, streamPriorities } = this.props;\n const { isSeries, purchaseInfo, vodLocationsMetadata, vodStatus } = this.state;\n\n if (!cardData) {\n return null;\n }\n\n const {\n isOpenFromPlayer,\n item: { locType },\n } = cardData;\n\n const programMetadata = this.getProgramMetadata();\n const seriesMetadata = this.getSeriesMetadata();\n\n const status = vodStatus?.status ?? BOVodAssetStatus.Unknown;\n const expirationTime = vodStatus?.expirationTime ?? 0;\n\n const isPlayButtonDisplayed =\n !isOpenFromPlayer && !isSeries && (status === BOVodAssetStatus.Free || status === BOVodAssetStatus.Rented || status === BOVodAssetStatus.Bought || locType === (VodKind.SVOD: string));\n\n const progress = getWatchingStatus(this.props, this.state);\n\n return (\n <>\n <PricingVod\n context={PricingContext.Card}\n expirationTime={expirationTime}\n isVodSeries={isSeries}\n locationsMetadata={vodLocationsMetadata}\n onClick={this.handlePurchaseButtonOnClick}\n purchaseInfo={purchaseInfo}\n status={status}\n />\n {isPlayButtonDisplayed ? (\n <ButtonFX allowZeroProgress={false} key='play' onClick={this.handlePlayButtonOnClick} progress={progress}>\n {Localizer.localize('common.actions.watch')}\n </ButtonFX>\n ) : null}\n {!isOpenFromPlayer && hasTrailer(streamPriorities, programMetadata, seriesMetadata) ? (\n <ButtonFX key='trailer' onClick={this.handleTrailerButtonOnClick}>\n {Localizer.localize('modal.card.actions.trailer')}\n </ButtonFX>\n ) : null}\n {this.renderWishlistButton()}\n </>\n );\n };\n\n renderWishlistButton = (): React.Node => {\n const { isFollowed } = this.state;\n\n if (isFollowed) {\n return (\n <ButtonFX key='follow' onClick={this.handleRemoveFromWishlistButtonOnClick}>\n {Localizer.localize('modal.card.actions.remove_from_favorites')}\n </ButtonFX>\n );\n }\n\n return (\n <ButtonFX key='follow' onClick={this.handleAddToWishlistButtonOnClick}>\n {Localizer.localize('modal.card.actions.add_to_favorites')}\n </ButtonFX>\n );\n };\n\n renderTVActionPanel = (): React.Node => {\n const { cardData, streamPriorities } = this.props;\n const { broadcastStatus, canBePlayed, isSeries, previewCatchupScheduledEventId, startoverItem, tvLocationMetadata } = this.state;\n\n if (!cardData) {\n return null;\n }\n\n const programMetadata = this.getProgramMetadata();\n const seriesMetadata = this.getSeriesMetadata();\n\n const {\n isOpenFromPlayer,\n isTimeshifting,\n item,\n item: { locType },\n tileType,\n urlDefinition,\n } = cardData;\n const progress = broadcastStatus === BroadcastStatus.Live ? getLiveProgress(cardData) : getWatchingStatus(this.props, this.state);\n\n // Recording a program is not allowed while timeshifting\n const isRecordingAllowed =\n (locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT || locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_CATCHUP || locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING) &&\n (isSeries || isTimeshifting !== true);\n\n // Deduce record king from location type, then from card type (series Vs. single)\n let recordKind: Undefined<ScheduledRecordingsKindType> = undefined;\n if (locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_CATCHUP) {\n recordKind = ScheduledRecordingsKind.KeepFromReplay;\n } else if (isSeries) {\n recordKind = ScheduledRecordingsKind.Series;\n }\n\n return (\n <>\n {canBePlayed ? (\n <ButtonFX allowZeroProgress={broadcastStatus === BroadcastStatus.Live} key='play' onClick={this.handlePlayButtonOnClick} progress={progress}>\n {Localizer.localize(broadcastStatus === BroadcastStatus.Live && locType !== NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING ? 'common.actions.watch_live' : 'common.actions.watch')}\n </ButtonFX>\n ) : null}\n {!isOpenFromPlayer && hasTrailer(streamPriorities, programMetadata, seriesMetadata) ? (\n <ButtonFX key='trailer' onClick={this.handleTrailerButtonOnClick}>\n {Localizer.localize('modal.card.actions.trailer')}\n </ButtonFX>\n ) : null}\n {canBePlayed && broadcastStatus === BroadcastStatus.Live && startoverItem ? (\n <ButtonFX key='start_over' onClick={this.handleReplayButtonOnClick}>\n {Localizer.localize('modal.card.actions.start_over')}\n </ButtonFX>\n ) : null}\n {isRecordingAllowed ? (\n <RecordButton\n broadcastStatus={broadcastStatus}\n cardDataUrlDefinition={urlDefinition ?? undefined}\n context={RecordContext.Card}\n displayMode={DisplayMode.Button}\n item={item}\n key='record'\n kind={recordKind}\n location={tvLocationMetadata?.location ?? null}\n previewCatchupScheduledEventId={previewCatchupScheduledEventId}\n programMetadata={programMetadata}\n seriesMetadata={seriesMetadata}\n tileType={tileType}\n />\n ) : null}\n {this.renderWishlistButton()}\n </>\n );\n };\n\n renderActionPanelAndPricing = (): React.Node => {\n const { cardData } = this.props;\n const { contentType } = this.state;\n\n if (!cardData) {\n return null;\n }\n\n return contentType === ItemContent.VODOrDeeplink ? this.renderVodActionPanel() : this.renderTVActionPanel();\n };\n\n getBackTitle = (previousCard: CARD_DATA_MODAL_TYPE): ?string => {\n const {\n item: { type },\n programMetadata,\n seriesMetadata,\n } = previousCard;\n\n const seriesTitle = getTitle(seriesMetadata, Localizer.language);\n const { episodeIndex, episodeTitle } = getEpisodeIndexAndTitle(programMetadata, seriesTitle, Localizer.language);\n\n const titleArray = [];\n if (seriesTitle) {\n titleArray.push(seriesTitle);\n }\n if (type !== ItemType.Series && episodeTitle) {\n titleArray.push(`${episodeIndex ? `${episodeIndex} : ` : ''}${episodeTitle}`);\n }\n\n return titleArray.length > 0 ? titleArray.join(' - ') : null;\n };\n\n renderTagline = (cardData: CARD_DATA_MODAL_TYPE, title: string | null): React.Node => {\n const { isSeries } = this.state;\n\n const metadata = isSeries ? this.getSeriesMetadata() : this.getProgramMetadata();\n const tagline = getTagline(metadata, Localizer.language);\n\n if (!tagline || tagline === title) {\n return null;\n }\n\n return <div className='tagline'>{tagline}</div>;\n };\n\n handleErrorPictoOnClick = () => {\n const { failedRecordingId, warningScheduledRecordingId, warningScheduledEventId } = this;\n\n Messenger.emit(MessengerEvents.OPEN_NPVR_MANAGEMENT_SCREEN, warningScheduledRecordingId, failedRecordingId, warningScheduledEventId);\n };\n\n renderRecordErrorPicto = (recordOutcome: ?RecordingOutcome, broadcastStatus: BroadcastStatus): React.Node => {\n const { cardData } = this.props;\n\n if (!cardData || !recordOutcome) {\n return null;\n }\n\n let description: string | null = null;\n if (recordOutcome === RecordingOutcome.OutOfQuota) {\n description = Localizer.localize('modal.card.status_picto.warning_out_of_quota');\n } else if (recordOutcome === RecordingOutcome.ExceededConcurrency) {\n description = Localizer.localize('modal.card.status_picto.warning_exceeded_concurrency');\n } else if (recordOutcome === RecordingOutcome.ServerError) {\n description = Localizer.localize('modal.card.status_picto.warning_server');\n } else {\n return null;\n }\n\n let pictoElement = null;\n if (broadcastStatus === BroadcastStatus.Past || broadcastStatus === BroadcastStatus.Live) {\n description = Localizer.localize('modal.card.status_picto.failure');\n pictoElement = <PictoFailure className='alertPicto failure' />;\n } else {\n pictoElement = <PictoWarning className='alertPicto warning' />;\n }\n\n return (\n <div className='recordError' onClick={this.handleErrorPictoOnClick}>\n {pictoElement}\n <div className='description'>{description}</div>\n </div>\n );\n };\n\n renderSingleTVProgramInfo = (item: NETGEM_API_V8_FEED_ITEM): React.Node => {\n const { broadcastStatus, contentType, isDeletable, isLiveRecording, isSeries } = this.state;\n const { recordOutcome } = this;\n\n if (isSeries || contentType !== ItemContent.TV) {\n return null;\n }\n\n const liveRecordingElement = isLiveRecording ? (\n <div className='liveRecording'>\n <PictoRecord className='recording live' />\n <div className='text'>{Localizer.localize('common.status.live_recording')}</div>\n </div>\n ) : null;\n\n const recordErrorPicto = this.renderRecordErrorPicto(recordOutcome, broadcastStatus);\n\n const scheduledRecordingElement =\n !recordErrorPicto && !isLiveRecording && isDeletable && broadcastStatus === BroadcastStatus.Future ? (\n <div className='scheduledRecording'>\n <PictoClock className='scheduledRecording' hasBackground />\n <div className='text'>{Localizer.localize('common.status.scheduled_recording')}</div>\n </div>\n ) : null;\n\n const { endTime, startTime } = getStartAndEndTimes(item);\n\n return (\n <div className='programInfo'>\n <StatusPicto item={item} />\n {liveRecordingElement}\n {scheduledRecordingElement}\n {recordErrorPicto}\n {this.renderBroadcastTime(startTime, endTime)}\n </div>\n );\n };\n\n renderChildren = (cardData: CARD_DATA_MODAL_TYPE): React.Node => {\n const { backgroundImageUrl, contentType, imageDisplayType, isSeries, portraitImageUrl } = this.state;\n\n const {\n displayedSectionCount,\n item,\n item: { id },\n } = cardData;\n const programMetadata = this.getProgramMetadata();\n const seriesMetadata = this.getSeriesMetadata();\n const channelImage = this.renderChannelImage();\n const title = getTitle(programMetadata, Localizer.language);\n const { synopsisElement, titleElement } = this.renderTitleAndSynopsis(cardData, title);\n const programInfoElement = this.renderProgramOrSeriesInfo(contentType === ItemContent.VODOrDeeplink);\n const singleTVProgramInfoElement = this.renderSingleTVProgramInfo(item);\n const actionPanel = this.renderActionPanelAndPricing();\n const tagLineElement = contentType === ItemContent.VODOrDeeplink ? this.renderTagline(cardData, title) : null;\n\n const backgroundElement =\n imageDisplayType !== ImageDisplayType.Unset && backgroundImageUrl ? (\n <>\n <div className={clsx('backgroundImage', 'image', imageDisplayType === ImageDisplayType.Portrait && 'blurred')} style={{ backgroundImage: `url(${backgroundImageUrl})` }} />\n <div className='backgroundImage mask' />\n </>\n ) : null;\n\n const coverElement =\n imageDisplayType !== ImageDisplayType.Unset && imageDisplayType === ImageDisplayType.Portrait && portraitImageUrl ? (\n <img alt='' className='cover' onClick={this.handleInfoOnClick} src={portraitImageUrl} />\n ) : null;\n\n return (\n <div\n className={clsx('slider', (typeof displayedSectionCount !== 'number' || displayedSectionCount > 1) && 'parallax')}\n ref={(instance) => {\n this.slider = instance;\n }}\n >\n {backgroundElement}\n {coverElement}\n <div className='infoAndActionsContainer' onClick={this.handleInfoOnClick}>\n <div className='infoContainer'>\n {channelImage}\n {titleElement}\n <div className='metadataContainer'>\n {singleTVProgramInfoElement}\n <div className='programInfo'>{programInfoElement}</div>\n <CreditsView metadata={isSeries && seriesMetadata ? seriesMetadata : programMetadata} />\n {tagLineElement}\n {synopsisElement}\n </div>\n </div>\n <div className='iconBar'>{actionPanel}</div>\n </div>\n <CardAvenue cardData={cardData} displayedSectionCount={displayedSectionCount} key={id} />\n </div>\n );\n };\n\n render(): React.Node {\n const { cardData, index } = this.props;\n const { imageDisplayType } = this.state;\n\n if (!cardData) {\n return null;\n }\n\n const { previousCard, tileType } = cardData;\n\n return (\n <Modal\n backCallback={previousCard ? this.openPreviousCard : undefined}\n className={clsx('card', getDisplayType(imageDisplayType, tileType))}\n index={index}\n title={previousCard ? this.getBackTitle(previousCard) : undefined}\n >\n {this.renderChildren(cardData)}\n </Modal>\n );\n }\n}\n\nconst mapStateToProps = (state: CombinedReducers): ReduxCardModalReducerStateType => {\n return {\n applicationName: state.appConfiguration.applicationName,\n channels: state.appConfiguration.deviceChannels,\n commercialOffers: state.appConfiguration.rightsCommercialOffers,\n deeplink: state.ui.deeplink,\n defaultRights: state.appConfiguration.rightsDefault,\n favoriteList: state.ui.favoriteList || [],\n isDebugModeEnabled: state.appConfiguration.isDebugModeEnabled,\n isNpvrEnabled: state.appConfiguration.features[FEATURE_NPVR] && state.npvr.isEnabled,\n isRegisteredAsGuest: state.appRegistration.registration === RegistrationType.RegisteredAsGuest,\n isSubscriptionFeatureEnabled: state.appConfiguration.features[FEATURE_SUBSCRIPTION],\n npvrRecordingsFuture: state.npvr.npvrRecordingsFuture,\n npvrRecordingsList: state.npvr.npvrRecordingsList,\n npvrScheduledRecordingsList: state.npvr.npvrScheduledRecordingsList,\n purchaseList: state.ui.purchaseList,\n streamPriorities: state.appConfiguration.playerStreamPriorities,\n usePackPurchaseApi: state.appConfiguration.usePackPurchaseApi,\n userRights: state.appConfiguration.rightsUser,\n viewingHistory: state.ui.viewingHistory,\n viewingHistoryStatus: state.ui.viewingHistoryStatus,\n wishlist: WishlistCache.checkGet(state.ui.wishlist, state.ui.wishlistStatus).ids,\n wishlistStatus: state.ui.wishlistStatus,\n };\n};\n\nconst mapDispatchToProps = (dispatch: Dispatch): ReduxCardModalDispatchToPropsType => {\n return {\n localAddToFavoriteList: (titId: string, signal?: AbortSignal): Promise<any> => dispatch(addToFavoriteList(titId, signal)),\n\n localAddToWishlist: (assetId: string, channelId: string, signal?: AbortSignal): Promise<any> => dispatch(addToWishlist(assetId, channelId, signal)),\n\n localGetImageSourceUrl: (assetId: string, width: number, height: number): Promise<?string> => dispatch(getImageSourceUrl(assetId, width, height)),\n\n localGetImageUrl: (assetId: string, width: number, height: number, theme?: ThemeType, signal?: AbortSignal): Promise<any> =>\n dispatch(\n getImageUrl(\n {\n assetId,\n height,\n theme,\n width,\n },\n signal,\n ),\n ),\n\n localGetPurchaseInfoPerAsset: (id: string, channelId: string, signal?: AbortSignal): Promise<any> => dispatch(getPurchaseInfoPerAsset(id, channelId, signal)),\n\n localGetVodLocations: (locations: Array<NETGEM_API_V8_ITEM_LOCATION>, signal?: AbortSignal): Promise<any> => dispatch(getVodLocations(locations, signal)),\n\n localHideModal: () => dispatch(hideModal()),\n\n localRemoveFromFavoriteList: (titId: string, signal?: AbortSignal): Promise<any> => dispatch(removeFromFavoriteList(titId, signal)),\n\n localRemoveFromWishlist: (assetId: string, channelId: string, signal?: AbortSignal): Promise<any> => dispatch(removeFromWishlist(assetId, channelId, signal)),\n\n localResetSectionPageIndices: (prefix?: string): void => dispatch(resetSectionPageIndices(prefix)),\n\n localSendV8LocationCatchupForAssetRequest: (assetId: string, startDate: number, range: number, signal?: AbortSignal): Promise<any> =>\n dispatch(sendV8LocationCatchupForAssetRequest(assetId, startDate, range, undefined, signal)),\n\n localSendV8MetadataLocationRequest: (assetId: string, signal?: AbortSignal): Promise<any> => dispatch(sendV8MetadataLocationRequest(assetId, signal)),\n\n localSendV8MetadataRequest: (assetId: string, type: MetadataKind, signal?: AbortSignal): Promise<any> => dispatch(sendV8MetadataRequest(assetId, type, signal)),\n\n localSendV8RecordingsMetadataRequest: (recordId: string, signal?: AbortSignal): Promise<any> => dispatch(sendV8RecordingsMetadataRequest(recordId, signal)),\n\n showVodPurchaseDialog: (vodPurchaseData: VOD_PURCHASE_DATA_TYPE) => dispatch(showVodPurchaseModal(vodPurchaseData)),\n };\n};\n\nconst CardModal: React.ComponentType<ModalState> = connect(mapStateToProps, mapDispatchToProps, null, { forwardRef: true })(CardModalView);\n\nexport default CardModal;\n","/* @flow */\n\nimport './ExternalContentModal.css';\nimport * as React from 'react';\nimport { Messenger, MessengerEvents } from '@ntg/utils/dist/messenger';\nimport InfiniteCircleLoaderArc from '../../loader/infiniteCircleLoaderArc';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport Modal from '../modal';\nimport type { ModalState } from '../../../redux/modal/reducers';\n\n// After 10 seconds, we declare the external content failed to load (in ms)\nconst LOAD_TIMEOUT = 10_000;\n\ntype ExternalContentModalStateType = {|\n isLoading: boolean,\n|};\n\nconst InitialState = Object.freeze({\n isLoading: true,\n});\n\nclass ExternalContentModal extends React.PureComponent<ModalState, ExternalContentModalStateType> {\n loadTimer: TimeoutID | null;\n\n modal: React.ElementRef<any> | null;\n\n constructor(props: ModalState) {\n super(props);\n\n this.loadTimer = null;\n this.modal = null;\n this.state = { ...InitialState };\n }\n\n componentDidMount() {\n window.addEventListener('message', this.handleMessagePosted, {\n capture: true,\n passive: true,\n });\n this.loadTimer = setTimeout(this.loadErrorCallback, LOAD_TIMEOUT);\n }\n\n componentWillUnmount() {\n window.removeEventListener('message', this.handleMessagePosted, {\n capture: true,\n passive: true,\n });\n this.resetLoadTimer();\n }\n\n resetLoadTimer = () => {\n const { loadTimer } = this;\n\n if (loadTimer) {\n clearTimeout(loadTimer);\n this.loadTimer = null;\n }\n };\n\n handleMessagePosted = (e: SyntheticInputEvent<HTMLElement>) => {\n const { data } = e;\n\n if (typeof data !== 'string') {\n return;\n }\n\n /*\n * Temporarily commented because of too many different domains for myVF\n *\n * if (!isSameDomain(process.env.REACT_APP_IFRAME_DOMAIN_ORIGIN, origin) && !(/^https?:\\/\\/localhost:3000$/ui).test(origin)) {\n * // Message does not come from a trusted source\n * return;\n * }\n */\n\n if (data === 'loaded') {\n // External content successfully loaded\n this.resetLoadTimer();\n this.setState({ isLoading: false });\n }\n };\n\n loadErrorCallback = () => {\n const { modal } = this;\n\n Messenger.emit(MessengerEvents.NOTIFY_ERROR, <div>{Localizer.localize('modal.external_content.load_error')}</div>);\n\n if (modal) {\n modal.close();\n }\n };\n\n render(): React.Node {\n const { externalContentUrl, index } = this.props;\n const { isLoading } = this.state;\n\n /* eslint-disable react/iframe-missing-sandbox */\n const children = (\n <>\n <iframe src={externalContentUrl} />\n {isLoading ? (\n <div className='loader'>\n <InfiniteCircleLoaderArc />\n </div>\n ) : null}\n </>\n );\n /* eslint-enable react/iframe-missing-sandbox */\n\n return (\n <Modal\n className='externalContent'\n index={index}\n ref={(instance) => {\n this.modal = instance;\n }}\n >\n {children}\n </Modal>\n );\n }\n}\n\nexport default (ExternalContentModal: React.ComponentType<ModalState>);\n","/* @flow */\n\nimport './KeyboardShortcutsModal.css';\nimport * as React from 'react';\nimport { FEATURE_TV, type FEATURE_TYPE } from '../../../redux/appConf/constants';\nimport type { AppConfigurationFeatures } from '../../../redux/appConf/types/types';\nimport { type CombinedReducers } from '../../../redux/reducers';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport Modal from '../modal';\nimport { ModalIcon } from '../modalTypes';\nimport { type ModalState } from '../../../redux/modal/reducers';\nimport { connect } from 'react-redux';\n\ntype ShortcutTrigger = {|\n altKey?: boolean,\n ctrlKey?: boolean,\n key: string,\n shiftKey?: boolean,\n|};\n\ntype Shortcut = {|\n action: string,\n feature?: FEATURE_TYPE,\n id: string,\n trigger: ShortcutTrigger,\n|};\n\nconst PLAYER_SHORTCUT_LIST: Array<Shortcut> = Object.freeze([\n {\n action: 'modal.keyboard_shortcuts.toggle_play',\n id: 'ptp',\n trigger: { key: 'key.space' },\n },\n {\n action: 'modal.keyboard_shortcuts.rewind_10seconds',\n id: 'prw10',\n trigger: { key: 'LEFT_ARROW' },\n },\n {\n action: 'modal.keyboard_shortcuts.rewind_30seconds',\n id: 'prw30',\n trigger: {\n ctrlKey: true,\n key: 'LEFT_ARROW',\n },\n },\n {\n action: 'modal.keyboard_shortcuts.rewind_60seconds',\n id: 'prw60',\n trigger: {\n key: 'LEFT_ARROW',\n shiftKey: true,\n },\n },\n {\n action: 'modal.keyboard_shortcuts.forward_10seconds',\n id: 'pfw10',\n trigger: { key: 'RIGHT_ARROW' },\n },\n {\n action: 'modal.keyboard_shortcuts.forward_30seconds',\n id: 'pfw30',\n trigger: {\n ctrlKey: true,\n key: 'RIGHT_ARROW',\n },\n },\n {\n action: 'modal.keyboard_shortcuts.forward_60seconds',\n id: 'pfw60',\n trigger: {\n key: 'RIGHT_ARROW',\n shiftKey: true,\n },\n },\n {\n action: 'modal.keyboard_shortcuts.toggle_sound',\n id: 'pts',\n trigger: { key: 'M' },\n },\n {\n action: 'modal.keyboard_shortcuts.decrease_volume',\n id: 'pdv',\n trigger: { key: '-' },\n },\n {\n action: 'modal.keyboard_shortcuts.increase_volume',\n id: 'piv',\n trigger: { key: '+' },\n },\n {\n action: 'modal.keyboard_shortcuts.toggle_fullscreen',\n id: 'ptf',\n trigger: { key: 'F' },\n },\n {\n action: 'modal.keyboard_shortcuts.show_info',\n id: 'psi',\n trigger: { key: 'I' },\n },\n {\n action: 'modal.keyboard_shortcuts.hide_controller',\n id: 'phc',\n trigger: { key: 'H' },\n },\n {\n action: 'modal.keyboard_shortcuts.close_player',\n id: 'pcp',\n trigger: { key: 'key.escape' },\n },\n {\n action: 'modal.keyboard_shortcuts.previous_channel',\n feature: FEATURE_TV,\n id: 'ppc',\n trigger: { key: 'DOWN_ARROW' },\n },\n {\n action: 'modal.keyboard_shortcuts.next_channel',\n feature: FEATURE_TV,\n id: 'pnc',\n trigger: { key: 'UP_ARROW' },\n },\n {\n action: 'modal.keyboard_shortcuts.back_to_live',\n feature: FEATURE_TV,\n id: 'pbl',\n trigger: { key: 'L' },\n },\n]);\n\nconst TRAILER_SHORTCUT_LIST: Array<Shortcut> = Object.freeze([\n {\n action: 'modal.keyboard_shortcuts.toggle_play',\n id: 'ttp',\n trigger: { key: 'key.space' },\n },\n {\n action: 'modal.keyboard_shortcuts.rewind_10seconds',\n id: 'trw',\n trigger: { key: 'LEFT_ARROW' },\n },\n {\n action: 'modal.keyboard_shortcuts.forward_10seconds',\n id: 'tfw',\n trigger: { key: 'RIGHT_ARROW' },\n },\n {\n action: 'modal.keyboard_shortcuts.toggle_sound',\n id: 'tts',\n trigger: { key: 'M' },\n },\n {\n action: 'modal.keyboard_shortcuts.toggle_fullscreen',\n id: 'ttf',\n trigger: { key: 'F' },\n },\n {\n action: 'modal.keyboard_shortcuts.exit_fullscreen',\n id: 'tcp',\n trigger: { key: 'key.escape' },\n },\n]);\n\ntype ReduxKeyboardShortcutsModalReducerStateType = {|\n +features: AppConfigurationFeatures,\n|};\n\ntype CompleteKeyboardShortcutsModalPropType = {|\n ...ReduxKeyboardShortcutsModalReducerStateType,\n ...ModalState,\n|};\n\nclass KeyboardShortcutsModalView extends React.PureComponent<CompleteKeyboardShortcutsModalPropType> {\n getKeyRepresentation = (key: string): string => {\n const localizedKey = Localizer.localize(key);\n\n switch (key) {\n case 'DOWN_ARROW':\n return '\\u2193';\n case 'LEFT_ARROW':\n return '\\u2190';\n case 'RIGHT_ARROW':\n return '\\u2192';\n case 'UP_ARROW':\n return '\\u2191';\n default:\n return localizedKey !== key ? localizedKey : key;\n }\n };\n\n renderShortcutTrigger = (trigger: ShortcutTrigger): React.Node => {\n const { altKey, ctrlKey, key, shiftKey } = trigger;\n\n const keys = [];\n if (altKey) {\n keys.push('Alt');\n }\n if (ctrlKey) {\n keys.push('Ctrl');\n }\n if (shiftKey) {\n keys.push('Shift');\n }\n\n keys.push(this.getKeyRepresentation(key));\n\n return (\n <>\n {keys.map((k) => (\n <span key={k}>{k}</span>\n ))}\n </>\n );\n };\n\n renderShortcut = (shortcut: Shortcut): React.Node => {\n const { features } = this.props;\n const { action, feature, id, trigger } = shortcut;\n\n if (feature && !features[feature]) {\n return null;\n }\n\n return (\n <li key={id}>\n <div className='shortcut'>{this.renderShortcutTrigger(trigger)}</div>\n <div className='action'>{Localizer.localize(action)}</div>\n </li>\n );\n };\n\n renderShortcutList = (titleKey: string, list: Array<Shortcut>): React.Node => (\n <div className='column'>\n <div className='sectionTitle'>{Localizer.localize(titleKey)}</div>\n <ul>{list.map((shortcut) => this.renderShortcut(shortcut))}</ul>\n </div>\n );\n\n render(): React.Node {\n const { index } = this.props;\n\n const children = (\n <>\n <div className='header'>{Localizer.localize('modal.keyboard_shortcuts.title')}</div>\n <div className='keyboardShortcutsContent'>\n {this.renderShortcutList('modal.keyboard_shortcuts.header.player', PLAYER_SHORTCUT_LIST)}\n {this.renderShortcutList('modal.keyboard_shortcuts.header.trailer', TRAILER_SHORTCUT_LIST)}\n </div>\n </>\n );\n\n return (\n <Modal className='keyboardShortcuts' icon={ModalIcon.Info} index={index}>\n {children}\n </Modal>\n );\n }\n}\n\nconst mapStateToProps = (state: CombinedReducers): ReduxKeyboardShortcutsModalReducerStateType => {\n return {\n features: state.appConfiguration.features,\n };\n};\n\nconst KeyboardShortcutsModal: React.ComponentType<ModalState> = connect(mapStateToProps, null, null, { forwardRef: true })(KeyboardShortcutsModalView);\n\nexport default KeyboardShortcutsModal;\n","/* @flow */\n\nimport './LegalNoticeModal.css';\nimport * as React from 'react';\nimport type { KeyValuePair, Undefined } from '@ntg/utils/dist/types';\nimport type { CombinedReducers } from '../../../redux/reducers';\nimport type { LocalesType } from '../../../redux/appConf/types/types';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport Modal from '../modal';\nimport { ModalIcon } from '../modalTypes';\nimport type { ModalState } from '../../../redux/modal/reducers';\nimport { connect } from 'react-redux';\n\ntype ReduxLegalNoticeModalStateType = {|\n +locales: LocalesType,\n +localesDefault: KeyValuePair<Undefined<string>>,\n|};\n\ntype CompleteLegalNoticeModalPropType = {|\n ...ModalState,\n ...ReduxLegalNoticeModalStateType,\n|};\n\nclass LegalNoticeModalView extends React.PureComponent<CompleteLegalNoticeModalPropType> {\n render(): React.Node {\n const {\n index,\n locales,\n localesDefault: { legalInformation: defaultLegalInformation },\n } = this.props;\n\n const localizedLegalInformation = Localizer.getLocalizedStringFromAppConf(locales, 'legalInformation', defaultLegalInformation);\n\n const children = (\n <>\n <div className='header'>{Localizer.localize('modal.legal_information.title')}</div>\n <div className='legalContent'>{localizedLegalInformation}</div>\n </>\n );\n\n return (\n <Modal className='legalNotice' icon={ModalIcon.Info} index={index}>\n {children}\n </Modal>\n );\n }\n}\n\nconst mapStateToProps = (state: CombinedReducers): ReduxLegalNoticeModalStateType => {\n return {\n locales: state.appConfiguration.locales,\n localesDefault: state.appConfiguration.localesDefault,\n };\n};\n\nconst LegalNoticeModal: React.ComponentType<ModalState> = connect(mapStateToProps, null, null, { forwardRef: true })(LegalNoticeModalView);\n\nexport default LegalNoticeModal;\n","/* @flow */\n\nimport './MessageModal.css';\nimport * as React from 'react';\nimport ButtonFX from '../../buttons/ButtonFX';\nimport Modal from '../modal';\nimport { ModalIcon } from '../modalTypes';\nimport type { ModalState } from '../../../redux/modal/reducers';\nimport { WidthKind } from '../../buttons/types';\n\nexport type MESSAGE_MODAL_TYPE = {|\n buttonText: string,\n icon: ModalIcon,\n title: string,\n message: string,\n|};\n\nclass MessageModal extends React.PureComponent<ModalState> {\n modal: React.ElementRef<any> | null;\n\n constructor(...args: Array<any>) {\n super(...args);\n\n this.modal = null;\n }\n\n handleOnClick: () => void = () => {\n const { modal } = this;\n\n if (modal) {\n modal.close();\n }\n };\n\n render(): React.Node {\n const { index, messageData } = this.props;\n\n if (!messageData) {\n return null;\n }\n\n const { buttonText, icon, message, title } = messageData;\n\n return (\n <Modal\n canCloseOnEnter={false}\n canCloseOnEscape={false}\n canCloseOnOverlayClick={false}\n className='message'\n header={title}\n icon={icon}\n index={index}\n isCloseButtonDisplayed={false}\n ref={(instance) => {\n this.modal = instance;\n }}\n >\n <div className='messageContainer'>\n <div className='messageContent'>\n {message.split('\\n').map((line, i) => (\n // eslint-disable-next-line react/no-array-index-key\n <div key={i}>{line}</div>\n ))}\n </div>\n <ButtonFX onClick={this.handleOnClick} widthKind={WidthKind.Stretched}>\n {buttonText}\n </ButtonFX>\n </div>\n </Modal>\n );\n }\n}\n\nexport default (MessageModal: React.ComponentType<ModalState>);\n","/* @flow */\n\nimport './NewVersionModal.css';\nimport * as React from 'react';\nimport ButtonFX from '../../buttons/ButtonFX';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport Modal from '../modal';\nimport { ModalIcon } from '../modalTypes';\nimport type { ModalState } from '../../../redux/modal/reducers';\nimport { WidthKind } from '../../buttons/types';\n\nexport type NEW_VERSION_DATA_MODAL_TYPE = {|\n currentVersion: string,\n newVersion: string,\n|};\n\nclass NewVersionModal extends React.PureComponent<ModalState> {\n handleOnClick: () => void = () => {\n window.location.reload();\n };\n\n render(): React.Node {\n const { index } = this.props;\n\n return (\n <Modal\n canCloseOnEnter={false}\n canCloseOnEscape={false}\n canCloseOnOverlayClick={false}\n className='newVersion'\n header={Localizer.localize('modal.new_version.title')}\n icon={ModalIcon.Info}\n index={index}\n isCloseButtonDisplayed={false}\n >\n <div className='newVersionContent'>\n <div>{Localizer.localize('modal.new_version.click_below')}</div>\n <ButtonFX onClick={this.handleOnClick} widthKind={WidthKind.Stretched}>\n {Localizer.localize('modal.new_version.refresh')}\n </ButtonFX>\n </div>\n </Modal>\n );\n }\n}\n\nexport default (NewVersionModal: React.ComponentType<ModalState>);\n","/* @flow */\n\nimport './NpvrHelpModal.css';\nimport * as React from 'react';\nimport { PictoFailure, PictoWarning } from '@ntg/components/dist/pictos/Element';\nimport ButtonFX from '../../buttons/ButtonFX';\nimport type { CombinedReducers } from '../../../redux/reducers';\nimport { HeightKind } from '../../buttons/types';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport Modal from '../modal';\nimport { ModalIcon } from '../modalTypes';\nimport type { ModalState } from '../../../redux/modal/reducers';\nimport type { NETGEM_FUTURE_RECORDINGS_STATUS } from '../../../libs/netgemLibrary/v8/types/Npvr';\nimport { connect } from 'react-redux';\nimport { formatDuration } from '../../../helpers/dateTime/Format';\n\n// 80 hours of recordings\nconst DEFAULT_QUOTA = 80;\n\ntype ReduxNpvrHelpModalReducerStateType = {|\n +npvrTotalQuota: string | null,\n|};\n\ntype CompleteNpvrHelpModalPropType = {|\n ...ReduxNpvrHelpModalReducerStateType,\n ...ModalState,\n|};\n\nclass NpvrHelpModalView extends React.PureComponent<CompleteNpvrHelpModalPropType> {\n render(): React.Node {\n const { index, npvrTotalQuota } = this.props;\n\n // Recordings are deleted after 3 months\n const recordingAvailability = 1;\n // Up to 2 recordings at the same time\n const maxConcurrency = 2;\n\n const children = (\n <>\n <div className='header'>{Localizer.localize('modal.npvr_help.title')}</div>\n <div className='helpContent'>\n <div className='sectionTitle'>{Localizer.localize('modal.npvr_help.principles.title')}</div>\n <ul>\n <li>{Localizer.localize('modal.npvr_help.principles.quota', { quota: npvrTotalQuota ?? DEFAULT_QUOTA })}</li>\n <li>{Localizer.localize('modal.npvr_help.principles.availability', { availability: recordingAvailability })}</li>\n <li>{Localizer.localize('modal.npvr_help.principles.concurrency', { concurrency: maxConcurrency })}</li>\n <li>{Localizer.localize('modal.npvr_help.principles.series_recording')}</li>\n <li>{Localizer.localize('modal.npvr_help.principles.series_episode_cancel')}</li>\n <li>{Localizer.localize('modal.npvr_help.principles.channels_without_npvr')}</li>\n </ul>\n <div className='sectionTitle'>{Localizer.localize('modal.npvr_help.visual_indicators.title')}</div>\n <ul className='noBullet'>\n <li>\n <div>\n <ButtonFX heightKind={HeightKind.Medium} isDisabled>\n {Localizer.localize('modal.npvr_help.visual_indicators.record_action')}\n </ButtonFX>\n <div className='hint'>{Localizer.localize('modal.npvr_help.visual_indicators.record')}</div>\n </div>\n </li>\n <li>\n <div>\n <ButtonFX heightKind={HeightKind.Medium} isDisabled>\n {Localizer.localize('modal.npvr_help.visual_indicators.delete_recording_action')}\n </ButtonFX>\n <div className='hint'>{Localizer.localize('modal.npvr_help.visual_indicators.delete_recording')}</div>\n </div>\n </li>\n <li>\n <div>\n <PictoFailure className='alertPicto failure' />\n <div className='hint'>{Localizer.localize('modal.npvr_help.visual_indicators.failure_exceeded_concurrency')}</div>\n </div>\n </li>\n <li>\n <div>\n <PictoFailure className='alertPicto failure' />\n <div className='hint'>{Localizer.localize('modal.npvr_help.visual_indicators.failure_out_of_quota')}</div>\n </div>\n </li>\n <li>\n <div>\n <PictoFailure className='alertPicto failure' />\n <div className='hint'>{Localizer.localize('modal.npvr_help.visual_indicators.failure_server')}</div>\n </div>\n </li>\n <li>\n <div>\n <PictoWarning className='alertPicto warning' />\n <div className='hint'>{Localizer.localize('modal.npvr_help.visual_indicators.warning_exceeded_concurrency')}</div>\n </div>\n </li>\n <li>\n <div>\n <PictoWarning className='alertPicto warning' />\n <div className='hint'>{Localizer.localize('modal.npvr_help.visual_indicators.warning_out_of_quota')}</div>\n </div>\n </li>\n </ul>\n </div>\n </>\n );\n\n return (\n <Modal className='npvrHelp' icon={ModalIcon.Info} index={index}>\n {children}\n </Modal>\n );\n }\n}\n\nconst getNpvrTotalQuota = (status: ?NETGEM_FUTURE_RECORDINGS_STATUS): string | null => {\n if (!status) {\n return null;\n }\n\n const {\n maxQuota: { duration },\n } = status;\n\n return formatDuration(duration);\n};\n\nconst mapStateToProps = (state: CombinedReducers): ReduxNpvrHelpModalReducerStateType => {\n return {\n npvrTotalQuota: getNpvrTotalQuota(state.npvr.npvrRecordingsFutureStatus),\n };\n};\n\nconst NpvrHelpModal: React.ComponentType<ModalState> = connect(mapStateToProps, null, null, { forwardRef: true })(NpvrHelpModalView);\n\nexport default NpvrHelpModal;\n","/* @flow */\n\nimport { type ShakaConfiguration, type ShakaError } from '../implementation/shakaTypes';\nimport { logError, logInfo, logWarning } from '../../../helpers/debug/debug';\nimport { DRM_KEY_SYSTEM } from '../../../helpers/jsHelpers/Drm';\nimport type { DmsSettingMap } from '../../../libs/netgemLibrary/dms/types/DeviceInfoSettings';\nimport EventEmitter from 'events';\nimport type { Undefined } from '@ntg/utils/dist/types';\nimport { canParseUrl } from '../../../helpers/jsHelpers/url';\nimport { getSettingValueByNameFromDeviceSettings } from '../../../redux/netgemApi/actions/helpers/settings';\nimport shaka from 'shaka-player';\nimport { wait } from '../../../helpers/jsHelpers/promise';\n\n// Playing duration for DRM diagnosis in debug mode (otherwise it stops as soon as success or failure is detected)\nconst DEBUG_VISIBILITY_DURATION = 5_000;\n\nclass DrmDiagnosis extends EventEmitter {\n isAvailable: boolean;\n\n drmDiagnosticLAUrl: string;\n\n drmDiagnosticStreamUrl: string;\n\n isCleaning: boolean;\n\n isDebugModeEnabled: boolean;\n\n // $FlowFixMe: not Flow-typed\n player: shaka.Player;\n\n promise: Promise<boolean>;\n\n returnResult: Function;\n\n videoElement: HTMLVideoElement;\n\n videoDiagContainer: HTMLElement;\n\n constructor(dmsSettings: DmsSettingMap, isDebugModeEnabled: boolean) {\n super();\n\n this.isCleaning = false;\n this.isDebugModeEnabled = isDebugModeEnabled;\n\n const streamUrl = getSettingValueByNameFromDeviceSettings(dmsSettings, 'video.drm.diagnostic', 'streamUrl');\n const laUrl = getSettingValueByNameFromDeviceSettings(dmsSettings, 'video.drm.diagnostic', 'laUrl');\n\n if (window.safari !== undefined) {\n // Diagnostic not available for Fairplay (Safari): no check will be performed\n this.isAvailable = false;\n logInfo('DRM check will not be performed because Fairplay diagnostic is not implemented');\n return;\n }\n\n // The null check is redundant but Flowjs needs it for the assignment to members drmDiagnosticStreamUrl and drmDiagnosticLAUrl\n if (streamUrl === null || laUrl === null || !canParseUrl(streamUrl)) {\n // Diagnostic URLs not defined: no check will be performed\n this.isAvailable = false;\n logWarning('DRM check will not be performed because at least one of the 2 URLs is invalid');\n return;\n }\n\n this.isAvailable = true;\n this.drmDiagnosticStreamUrl = streamUrl;\n this.drmDiagnosticLAUrl = laUrl;\n\n // Create promise that will be returned (with true/false value, depending on the result)\n this.promise = new Promise((resolve) => {\n this.returnResult = resolve;\n });\n\n this.initialize();\n }\n\n // $FlowFixMe: Flow does not support symbols yet\n get [Symbol.toStringTag]() {\n return 'DrmDiagnosis';\n }\n\n initialize: () => void = () => {\n this.videoDiagContainer = document.createElement('div');\n this.videoDiagContainer.classList.add('videoDiagContainer', this.isDebugModeEnabled ? 'visible' : 'hidden');\n const videoDiagContent = document.createElement('div');\n videoDiagContent.className = 'videoDiagContent';\n this.videoElement = document.createElement('video');\n const videoDiagLegend = document.createElement('div');\n videoDiagLegend.className = 'videoDiagLegend';\n videoDiagLegend.innerHTML = 'Diagnostic vidéo';\n videoDiagContent.append(this.videoElement);\n videoDiagContent.append(videoDiagLegend);\n this.videoDiagContainer.append(videoDiagContent);\n\n const body = document.querySelector('body');\n body?.append(this.videoDiagContainer);\n\n this.player = new shaka.Player();\n };\n\n cleanUpNotify: (errorMessage?: string) => Promise<void> = async (errorMessage) => {\n this.isCleaning = true;\n this.player.removeEventListener('error', this.errorEvent, { once: true, passive: true });\n this.videoElement.removeEventListener('playing', this.playingEvent, { once: true, passive: true });\n\n if (errorMessage) {\n logError(errorMessage);\n }\n\n if (this.isDebugModeEnabled) {\n logInfo(`DRM diagnosis result: ${errorMessage ? 'failure' : 'success'}`);\n await wait(DEBUG_VISIBILITY_DURATION);\n }\n\n try {\n await this.player.detach();\n await this.player.destroy();\n } catch (error) {\n if (!errorMessage) {\n logError('Error detaching videoElement or destroying player');\n }\n } finally {\n this.videoElement.remove();\n this.videoDiagContainer.remove();\n }\n };\n\n // Video not working: DRM not supported\n errorEvent: (event: ShakaError) => Promise<void> = async (event) => {\n logInfo('[diagnosis] errorEvent');\n logInfo(event);\n\n const {\n detail: {\n code,\n data: [untypedMediaErrorCode],\n },\n } = event;\n\n const mediaErrorCode = typeof untypedMediaErrorCode === 'number' ? untypedMediaErrorCode : 0;\n\n await this.cleanUpNotify(`Error playing (${code}.${mediaErrorCode})`);\n this.returnResult(false);\n };\n\n // Video working: DRM supported\n playingEvent: () => Promise<void> = async () => {\n logInfo('[diagnosis] playingEvent');\n\n await this.cleanUpNotify();\n this.returnResult(true);\n };\n\n runDiagnosis: () => Promise<boolean> = async () => {\n if (!this.isAvailable) {\n // Diagnostic URLs not defined: no check will be performed\n return true;\n }\n\n if (!this.player) {\n // Video not working: DRM not supported\n await this.cleanUpNotify('Cannot instantiate player');\n return false;\n }\n\n const configuration: ShakaConfiguration = {\n drm: {\n advanced: {\n [(DRM_KEY_SYSTEM.Widevine: string)]: {\n audioRobustness: ['SW_SECURE_CRYPTO'],\n videoRobustness: ['SW_SECURE_CRYPTO'],\n },\n },\n initDataTransform: (initData) => initData,\n servers: { [(DRM_KEY_SYSTEM.Widevine: string)]: this.drmDiagnosticLAUrl },\n },\n };\n\n try {\n await this.player.attach(this.videoElement);\n\n if (!this.player.configure(configuration)) {\n // Video not working: DRM not supported\n await this.cleanUpNotify('Error configuring player');\n return false;\n }\n } catch (error) {\n // Video not working: DRM not supported\n await this.cleanUpNotify('Error initializing player');\n return false;\n }\n\n this.player.addEventListener('error', this.errorEvent, { once: true, passive: true });\n this.videoElement.addEventListener('playing', this.playingEvent, { once: true, passive: true });\n\n try {\n logInfo('[diagnosis] loading...');\n await this.player.load(this.drmDiagnosticStreamUrl);\n logInfo('[diagnosis] playing...');\n await this.videoElement.play();\n } catch (error) {\n logInfo('[diagnosis] Error in main catch');\n logInfo(`[diagnosis] isCleaning: ${this.isCleaning.toString()}`);\n logError(error);\n\n if (!this.isCleaning) {\n /*\n * If error code is 6001, we're probably trying to play a Widevine-protected stream on an Apple device,\n * so no error is displayed and support is considered OK\n */\n let errorMsg: Undefined<string> = undefined;\n\n if (error instanceof Error) {\n errorMsg = `Error in play() promise (${error.message})`;\n } else {\n errorMsg = `Error in play() promise (code: ${error.message})`;\n }\n\n // Video not working: DRM not supported\n await this.cleanUpNotify(errorMsg);\n this.returnResult(false);\n }\n }\n\n return this.promise;\n };\n}\n\nexport default DrmDiagnosis;\n","/* @flow */\n\nconst getDomain: (url: string) => string = (url) => {\n const parts = url.split('.');\n parts.shift();\n return parts.join('.');\n};\n\nconst isSameDomain: (domain: string, url: string) => boolean = (domain, url) => getDomain(url) === domain;\n\nconst canParseUrl: (url: ?string) => boolean = (url) => {\n if (typeof url === 'undefined' || url === null) {\n return false;\n }\n\n try {\n // eslint-disable-next-line no-unused-vars\n const unusedUrl = new URL(url);\n return true;\n } catch {\n return false;\n }\n};\n\nexport { canParseUrl, isSameDomain };\n","/* @flow */\n\nimport { BO_API_PURCHASE_STATUS, type BO_RESPONSE_WITH_ETAG } from './types/common';\nimport type { NetgemApiEmitterType, RequestResponseMethodDefinitionType } from '../emitter';\nimport { type BO_API_PURCHASE_STATUS_RESPONSE_TYPE } from './types/purchase';\nimport { BO_PURCHASE_STATUS_OK } from '../../../../libs/netgemLibrary/videofutur/types/ErrorCodes';\nimport type { CombinedReducers } from '../../../reducers';\nimport type { Dispatch } from '../../../types/types';\nimport { REDUX_MSG_REQUEST_BO_PURCHASE_STATUS } from '../../constants';\nimport { buildErrorResponse } from '../helpers/bo';\nimport getRequestDetails from './helpers/requestCommon';\n\nconst mapResponse: (response: any) => BO_API_PURCHASE_STATUS_RESPONSE_TYPE = (response) => {\n const { body } = response;\n\n if (!body?.data) {\n return buildErrorResponse(null, {});\n }\n\n const {\n data: {\n drmLicense: { duration },\n // TODO: when BO API v2 is OK, use 'price' which is already a number\n displayPrice,\n },\n } = body;\n\n return {\n duration,\n price: displayPrice,\n status: BO_PURCHASE_STATUS_OK,\n };\n};\n\nconst sendPurchaseStatusRequest: (distributorId: string, vtiId: number, promocode: string, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (distributorId, vtiId, promocode, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> =>\n dispatch(getRequestDetails(distributorId, BO_API_PURCHASE_STATUS)).then((requestDetails) =>\n // Object 'requestDetails' contains 'headers', 'method' and 'uri' parameters\n NetgemApiEmitter.emit(REDUX_MSG_REQUEST_BO_PURCHASE_STATUS, {\n ...requestDetails,\n promocode,\n signal,\n vtiId,\n }).then(({ response }: BO_RESPONSE_WITH_ETAG) => mapResponse(response)),\n );\n\nexport default sendPurchaseStatusRequest;\n","/* @flow */\n\nimport './VodPurchaseModal.css';\nimport * as React from 'react';\nimport { type BO_API_PURCHASE_STATUS_SUCCESS_TYPE, Purchase, type PurchaseType } from '../../../redux/netgemApi/actions/videofutur/types/purchase';\nimport {\n BO_PURCHASE_ALREADY_PURCHASED,\n BO_PURCHASE_DEVICE_NOT_FOUND,\n BO_PURCHASE_INVALID_CONTENT,\n BO_PURCHASE_INVALID_PROMOCODE,\n BO_PURCHASE_INVALID_PROMOCODE_FOR_TITLE,\n BO_PURCHASE_INVALID_USER_IP,\n BO_PURCHASE_STATUS_OK,\n} from '../../../libs/netgemLibrary/videofutur/types/ErrorCodes';\nimport { Currency, getCurrencySymbol } from '../../../helpers/ui/metadata/Types';\nimport { Messenger, MessengerEvents } from '@ntg/utils/dist/messenger';\nimport { PictoCheck, PictoInfo } from '@ntg/components/dist/pictos/Element';\nimport { SECONDS_PER_DAY, SECONDS_PER_HOUR, getIso8601DurationInSeconds } from '../../../helpers/dateTime/Format';\nimport { SentryTagName, SentryTagValue } from '../../../helpers/debug/sentryTypes';\nimport { type VOD_PURCHASE_DATA_TYPE, clearPendingPurchase } from '../../../helpers/rights/pendingOperations';\nimport { getEpisodeIndexAndTitle, getTitle, renderProgramLanguage, renderProgramParentalGuidance } from '../../../helpers/ui/metadata/Format';\nimport { getPriceAsFloat, getPriceAsInteger } from '../../../helpers/maths/maths';\nimport { hideModal, showMessageModal } from '../../../redux/modal/actions';\nimport type { BO_API_ERROR_TYPE } from '../../../redux/netgemApi/actions/videofutur/types/common';\nimport type { BO_API_REQUEST_RESPONSE_BASE } from '../../../libs/netgemLibrary/videofutur/types/RequestResponseBase';\nimport type { BasicFunction } from '@ntg/utils/src/types';\nimport ButtonFX from '../../buttons/ButtonFX';\nimport type { CombinedReducers } from '../../../redux/reducers';\nimport type { CustomNetworkError } from '../../../libs/netgemLibrary/helpers/CustomNetworkError';\nimport type { Dispatch } from '../../../redux/types/types';\nimport type { DmsSettingMap } from '../../../libs/netgemLibrary/dms/types/DeviceInfoSettings';\nimport DrmDiagnosis from '../../player/diagnosis/diagnosis';\nimport HotKeys from '../../../helpers/hotKeys/hotKeys';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport type { MESSAGE_MODAL_TYPE } from '../messageModal/MessageModal';\nimport Modal from '../modal';\nimport { ModalIcon } from '../modalTypes';\nimport type { ModalState } from '../../../redux/modal/reducers';\nimport type { NETGEM_API_V8_METADATA_SCHEDULE } from '../../../libs/netgemLibrary/v8/types/MetadataSchedule';\nimport SentryWrapper from '../../../helpers/debug/sentry';\nimport { TIPPY_DEFAULT_OPTIONS } from '@ntg/ui/dist/tooltip';\nimport Tippy from '@tippyjs/react';\nimport { WidthKind } from '../../buttons/types';\nimport { buildErrorResponse } from '../../../redux/netgemApi/actions/helpers/bo';\nimport clsx from 'clsx';\nimport { connect } from 'react-redux';\nimport { getBOSetting } from '../../../redux/netgemApi/actions/helpers/boSettings';\nimport { ignoreIfAborted } from '../../../libs/netgemLibrary/helpers/cancellablePromise/promiseHelper';\nimport { logError } from '../../../helpers/debug/debug';\nimport { openCheckOut } from '../../../helpers/applicationCustomization/externalPaymentSystem';\nimport { purchase } from '../../../redux/netgemApi/actions/videofutur/helpers/purchase';\nimport { renderPurchaseSummary } from '../../../helpers/videofutur/metadata';\nimport sendBOPurchaseStatusRequest from '../../../redux/netgemApi/actions/videofutur/purchaseStatus';\nimport sendV8MetadataLocationRequest from '../../../redux/netgemApi/actions/v8/metadataLocation';\nimport { stopOpenStreams } from '../../../redux/netgemApi/actions/videofutur/helpers/stopOpenStreams';\n\n// If duration is greater than 48h, display it as days (in seconds)\nconst MAX_HOURS_DISPLAYED = 172_800;\n\n// Time before modal can be closed again by clicking on overlay after the information tooltip has been closed (in ms)\nconst OVERLAY_CLICK_REENABLING_DELAY = 300;\n\nconst DEFAULT_RENT_VALIDITY = '48h';\n\nconst STEP_1: number = 1;\nconst STEP_2: number = 2;\n\ntype ReduxVodPurchaseModalReducerStateType = {|\n +deviceSettings: DmsSettingMap,\n +identity: string,\n +isDebugModeEnabled: boolean,\n +isExternalCheckOutEnabled: boolean,\n|};\n\ntype ReduxVodPurchaseModalDispatchToPropsType = {|\n +localGetPurchaseStatus: (distributorId: string, vtiId: number, promocode: string, signal?: AbortSignal) => Promise<any>,\n +localHideModal: BasicFunction,\n +localPurchase: (distributorId: string, vtiId: number, promocode: string | null, signal?: AbortSignal) => Promise<any>,\n +localSendV8MetadataLocationRequest: (assetId: string, signal?: AbortSignal) => Promise<any>,\n +localShowMessage: (messageData: MESSAGE_MODAL_TYPE) => Promise<any>,\n +localStopOpenStreams: (distributorId: string, signal?: AbortSignal) => Promise<any>,\n|};\n\ntype CompleteVodPurchaseModalPropType = {|\n ...ReduxVodPurchaseModalReducerStateType,\n ...ReduxVodPurchaseModalDispatchToPropsType,\n ...ModalState,\n|};\n\ntype VodPurchaseModalStateType = {|\n appliedPromocode: string | null,\n discountPrice: string | null,\n errorMessageKey: string | null,\n isApplyingPromocode: boolean,\n isPaying: boolean,\n promocode: string,\n promocodeError: string | null,\n rentValidity: string,\n step: number,\n title: {| line1: string | null, line2: string | null |} | null,\n updatedPrice: string | null,\n vodLocationMetadata: NETGEM_API_V8_METADATA_SCHEDULE | null,\n|};\n\nconst InitialState = Object.freeze({\n appliedPromocode: null,\n discountPrice: null,\n errorMessageKey: null,\n isApplyingPromocode: false,\n isPaying: false,\n promocode: '',\n promocodeError: null,\n rentValidity: '48h',\n step: STEP_1,\n title: null,\n updatedPrice: null,\n vodLocationMetadata: null,\n});\n\nclass VodPurchaseModalView extends React.PureComponent<CompleteVodPurchaseModalPropType, VodPurchaseModalStateType> {\n abortController: AbortController;\n\n closingEnableTimer: TimeoutID | null;\n\n modal: React.ElementRef<any> | null;\n\n helpTooltip: any;\n\n constructor(props: CompleteVodPurchaseModalPropType) {\n super(props);\n\n this.abortController = new AbortController();\n this.closingEnableTimer = null;\n this.helpTooltip = null;\n this.modal = null;\n\n this.state = { ...InitialState };\n }\n\n componentDidMount() {\n this.initialize();\n\n // Clear any pending guest purchase since it's being displayed right now\n clearPendingPurchase();\n }\n\n componentDidUpdate(prevProps: CompleteVodPurchaseModalPropType) {\n const { vodPurchaseData } = this.props;\n const { vodPurchaseData: prevVodPurchaseData } = prevProps;\n\n if (vodPurchaseData !== prevVodPurchaseData) {\n this.initialize();\n }\n }\n\n componentWillUnmount() {\n const { abortController } = this;\n\n abortController.abort('Component VodPurchaseModal will unmount');\n\n if (this.closingEnableTimer) {\n clearTimeout(this.closingEnableTimer);\n }\n }\n\n initialize = () => {\n const { vodPurchaseData } = this.props;\n\n if (!vodPurchaseData) {\n return;\n }\n\n this.buildPurchaseTitle(vodPurchaseData);\n\n const { locationId, vodLocationMetadata } = vodPurchaseData;\n\n if (!vodLocationMetadata && locationId) {\n // Query VOD location metadata to get viewingHistoryId and available audio/subtitles (first episode is used for pack purchase)\n this.loadVodLocationMetadata(locationId);\n }\n\n // Check VIP account (and bad configuration)\n this.applyPromocode('');\n };\n\n buildPurchaseTitle = (vodPurchaseData: VOD_PURCHASE_DATA_TYPE) => {\n const { itemCount, programMetadata, purchaseType, seriesMetadata } = vodPurchaseData;\n\n const seriesTitles = getTitle(seriesMetadata, Localizer.language);\n\n let programTitle = null;\n let episodeCount = null;\n\n if (purchaseType === Purchase.BuyPack) {\n episodeCount = Localizer.localize('modal.vod_purchase.pack_item_count', { count: itemCount });\n } else if (programMetadata) {\n const { episodeIndex, episodeTitle } = getEpisodeIndexAndTitle(programMetadata, seriesTitles, Localizer.language);\n const fixedEpisodeTitle = episodeTitle ?? Localizer.localize('modal.vod_purchase.episode_index', { index: episodeIndex });\n programTitle = seriesTitles ? fixedEpisodeTitle : getTitle(programMetadata, Localizer.language);\n }\n\n this.setState({\n title: {\n line1: seriesTitles ?? programTitle,\n line2: seriesTitles ? (episodeCount ?? programTitle) : null,\n },\n });\n };\n\n getFullTitle = (): string => {\n const { title } = this.state;\n\n if (!title) {\n return Localizer.localize('vod.untitled');\n }\n\n const { line1, line2 } = title;\n\n if (line1 === null && line2 === null) {\n return Localizer.localize('vod.untitled');\n }\n\n // NOTE: Flow thinks line1 could be null here, which is obviously wrong\n\n if (line2 === null) {\n // Full title: <Program title>\n return line1 ?? '';\n }\n\n // Full title: <Series titles - episode title> or <Series title - episode count>\n return `${line1 ?? ''} - ${line2}`;\n };\n\n loadVodLocationMetadata = (locationId: string) => {\n const { localSendV8MetadataLocationRequest } = this.props;\n const {\n abortController: { signal },\n } = this;\n\n localSendV8MetadataLocationRequest(locationId, signal)\n .then(({ result: vodLocationMetadata }) => {\n signal.throwIfAborted();\n\n const rentValidity = this.formatLicenceDuration(vodLocationMetadata?.location.purchaseInfo?.licenseDuration) ?? DEFAULT_RENT_VALIDITY;\n this.setState({ rentValidity, vodLocationMetadata });\n })\n .catch((error) => ignoreIfAborted(signal, error));\n };\n\n handlePlayNowButtonOnClick = () => {\n const { vodPurchaseData } = this.props;\n const { vodLocationMetadata: vodLocationMetadataState } = this.state;\n const { modal } = this;\n\n if (!modal || !vodPurchaseData) {\n logError('Cannot play because of missing modal or purchase data');\n return;\n }\n\n const { locationId, viewingHistoryId, vodLocationMetadata, vtiId } = vodPurchaseData;\n const localVodLocation = vodLocationMetadata ?? vodLocationMetadataState?.location;\n\n // Play movie or first episode of season\n modal.close({\n locationId,\n playNow: true,\n viewingHistoryId: localVodLocation?.providerInfo?.viewingHistoryId ?? viewingHistoryId,\n // Use vtiId from vodLocationMetadata because in case of pack purchase, the one from vodPurchaseData is the pack's one\n vtiId: localVodLocation?.purchaseInfo?.vtiId ?? vtiId,\n });\n };\n\n handlePlayLaterButtonOnClick = () => {\n const { modal } = this;\n\n if (modal) {\n modal.close({ playNow: false });\n }\n };\n\n handlePromocodeOnChange = (event: SyntheticInputEvent<HTMLInputElement>) => {\n const {\n currentTarget: { validity, value },\n } = event;\n\n if (validity.valid || value === '') {\n this.setState({ promocode: value });\n }\n };\n\n handlePromocodeOK = (response: BO_API_PURCHASE_STATUS_SUCCESS_TYPE, vtiId: number, displayPrice: string, appliedPromocode: string) => {\n const { price } = response;\n\n const discountPrice = getPriceAsFloat(price);\n const originalPrice = getPriceAsFloat(displayPrice);\n\n if (typeof discountPrice === 'number' && typeof originalPrice === 'number' && discountPrice !== originalPrice) {\n if (discountPrice < originalPrice) {\n // Active discount or promocode applied\n this.setState({\n appliedPromocode,\n discountPrice: `${price.replace('.', ',')}${getCurrencySymbol(Currency.Euro)}`,\n promocode: '',\n promocodeError: null,\n });\n } else {\n /*\n * Current price is greater than original price (expired discount but cache issue)\n * See https://netgem.atlassian.net/browse/GM-251\n */\n const updatedPrice = `${price.replace('.', ',')}${getCurrencySymbol(Currency.Euro)}`;\n this.setState({ updatedPrice });\n\n SentryWrapper.warning({\n context: {\n appliedPromocode,\n discountPrice,\n originalPrice,\n updatedPrice,\n vtiId,\n },\n message: 'Real price higher than display price',\n tagName: SentryTagName.Component,\n tagValue: SentryTagValue.VodPurchase,\n });\n }\n }\n };\n\n getLocalizedErrorMessage = (status: string): string => {\n if (status === BO_PURCHASE_INVALID_CONTENT) {\n return 'modal.vod_purchase.invalid_content';\n }\n\n if (status === BO_PURCHASE_INVALID_USER_IP) {\n return 'modal.vod_purchase.geolocked_content';\n }\n\n // Generic error\n return 'modal.vod_purchase.promocode_error';\n };\n\n promocodeAppliedCallback = (appliedPromocode: string, vtiId: number, response: BO_API_REQUEST_RESPONSE_BASE = {}, displayPrice: string = '') => {\n const { modal } = this;\n const { status } = response;\n\n this.setState({ isApplyingPromocode: false });\n\n switch (status) {\n case BO_PURCHASE_STATUS_OK: {\n // Promocode applied\n this.handlePromocodeOK((response: BO_API_PURCHASE_STATUS_SUCCESS_TYPE), vtiId, displayPrice, appliedPromocode);\n break;\n }\n\n case BO_PURCHASE_INVALID_PROMOCODE:\n case BO_PURCHASE_INVALID_PROMOCODE_FOR_TITLE: {\n // Invalid promocode\n this.setState({ promocodeError: Localizer.localize('modal.vod_purchase.invalid_promocode') });\n break;\n }\n\n case BO_PURCHASE_ALREADY_PURCHASED: {\n // Item has already been purchased: refresh purchase list\n Messenger.emit(MessengerEvents.REFRESH_PURCHASE_LIST);\n if (modal) {\n modal.close();\n }\n break;\n }\n\n case BO_PURCHASE_DEVICE_NOT_FOUND: {\n // Token expired (device probably disconnected)\n Messenger.emit(MessengerEvents.AUTHENTICATION_REQUIRED);\n break;\n }\n\n case BO_PURCHASE_INVALID_CONTENT:\n case BO_PURCHASE_INVALID_USER_IP:\n default: {\n /*\n * Potential BO errors at this point:\n * - BO_PURCHASE_INVALID_CONTENT: content should have never been visible\n * - BO_PURCHASE_INVALID_USER_IP: content is geolocked\n * - unexpected error\n *\n * In any case, purchase is prevented\n */\n this.setState({ errorMessageKey: this.getLocalizedErrorMessage(status) });\n break;\n }\n }\n };\n\n applyPromocode = (promocode: string) => {\n const { localGetPurchaseStatus, vodPurchaseData } = this.props;\n const {\n abortController: { signal },\n } = this;\n\n if (!vodPurchaseData) {\n return;\n }\n\n const {\n displayPrice,\n distributorId,\n item: { id },\n vtiId,\n } = vodPurchaseData;\n\n if (!vtiId) {\n logError(`No VTI Id for ${id}`);\n return;\n }\n\n if (!distributorId) {\n logError(`No distributor Id for ${id}`);\n return;\n }\n\n this.setState({\n isApplyingPromocode: true,\n promocodeError: null,\n });\n\n localGetPurchaseStatus(distributorId, vtiId, promocode, signal)\n .then((response: BO_API_REQUEST_RESPONSE_BASE) => {\n signal.throwIfAborted();\n\n this.promocodeAppliedCallback(promocode, vtiId, response, displayPrice);\n })\n .catch((error: CustomNetworkError) => ignoreIfAborted(signal, error, () => this.promocodeAppliedCallback(promocode, vtiId, buildErrorResponse(null, error), displayPrice)));\n };\n\n handleApplyPromocodeButtonOnClick = () => {\n const { vodPurchaseData } = this.props;\n const { isApplyingPromocode, promocode } = this.state;\n\n if (isApplyingPromocode || !promocode || !vodPurchaseData || !vodPurchaseData.vtiId) {\n return;\n }\n\n this.applyPromocode(promocode);\n };\n\n paidCallback = (response: BO_API_REQUEST_RESPONSE_BASE = {}) => {\n const { modal } = this;\n const { status } = response;\n\n if (!status || status === BO_PURCHASE_STATUS_OK) {\n // Payment OK\n this.setState({\n isPaying: false,\n step: STEP_2,\n });\n return;\n }\n\n if (status === BO_PURCHASE_ALREADY_PURCHASED) {\n // Item has already been purchased: refresh purchase list\n Messenger.emit(MessengerEvents.REFRESH_PURCHASE_LIST);\n if (modal) {\n modal.close();\n }\n return;\n }\n\n if (status === BO_PURCHASE_DEVICE_NOT_FOUND) {\n // Token expired (device probably disconnected)\n Messenger.emit(MessengerEvents.AUTHENTICATION_REQUIRED);\n return;\n }\n\n // Error paying\n const { errorMsg } = (response: BO_API_ERROR_TYPE);\n\n Messenger.emit(MessengerEvents.NOTIFY_ERROR, <div>{errorMsg || Localizer.localize('common.messages.errors.retry')}</div>);\n\n this.setState({ isPaying: false });\n };\n\n isNotFree = (price: string): boolean => {\n const n = getPriceAsInteger(price);\n return n !== null ? n > 0 : true;\n };\n\n handlePayButtonOnClick = () => {\n const { deviceSettings, isDebugModeEnabled, localHideModal, localShowMessage, localStopOpenStreams, vodPurchaseData } = this.props;\n const { isApplyingPromocode, isPaying } = this.state;\n const {\n abortController: { signal },\n } = this;\n\n if (isApplyingPromocode || isPaying || !vodPurchaseData || !vodPurchaseData.vtiId) {\n return;\n }\n\n const {\n distributorId,\n item: { id },\n } = vodPurchaseData;\n\n if (!distributorId) {\n logError(`No distributor Id for ${id}`);\n return;\n }\n\n this.setState({ isPaying: true }, () => {\n localStopOpenStreams(distributorId, signal)\n .then(async () => {\n signal.throwIfAborted();\n\n const canPlay = await new DrmDiagnosis(deviceSettings, isDebugModeEnabled).runDiagnosis();\n\n if (canPlay) {\n this.purchaseInternal(vodPurchaseData, distributorId);\n } else {\n // Show message telling user to upgrade/change their browser\n Messenger.once(MessengerEvents.MODAL_CONFIRMATION_CLOSED, localHideModal);\n localShowMessage({\n buttonText: Localizer.localize('common.actions.ok'),\n icon: ModalIcon.Error,\n message: Localizer.localize('common.messages.errors.drm_not_supported.message'),\n title: Localizer.localize('common.messages.errors.drm_not_supported.title'),\n });\n }\n })\n .catch((error) => ignoreIfAborted(signal, error, () => this.paidCallback(buildErrorResponse(null, error))));\n });\n };\n\n purchaseInternal = (vodPurchaseData: VOD_PURCHASE_DATA_TYPE, distributorId: string) => {\n const { identity, isExternalCheckOutEnabled, localPurchase } = this.props;\n const { appliedPromocode, discountPrice, updatedPrice } = this.state;\n\n const {\n abortController: { signal },\n modal,\n } = this;\n\n const { displayPrice, vtiId } = vodPurchaseData;\n\n if (isExternalCheckOutEnabled && this.isNotFree(discountPrice || updatedPrice || displayPrice)) {\n // External payment system (e.g. Chargebee)\n\n if (modal) {\n // Prevent from closing modal by clicking outside when the user only wants to close the tooltip\n modal.disableClosing();\n }\n\n const title = this.getFullTitle();\n\n openCheckOut(identity, vtiId, title, updatedPrice || displayPrice, appliedPromocode, discountPrice)\n .then((response?: BO_API_REQUEST_RESPONSE_BASE) => {\n /*\n * Refresh purchase list to update purchased item\n * NOTE: It's even refreshed when user closed the popup because we're not sure (yet)\n * if the transaction could finish without the app being aware of it\n */\n Messenger.emit(MessengerEvents.REFRESH_PURCHASE_LIST);\n\n if (response === undefined) {\n // Checkout has been cancelled (probably by closing the popup)\n SentryWrapper.info({\n context: {\n appliedPromocode,\n discountPrice,\n displayPrice,\n identity,\n title,\n updatedPrice,\n vtiId,\n },\n message: 'User closed Chargebee popup',\n tagName: SentryTagName.Component,\n tagValue: SentryTagValue.VodPurchase,\n });\n if (modal) {\n modal.close({ playNow: false });\n }\n return;\n }\n\n this.paidCallback(response);\n })\n .catch((error: Error) => {\n this.paidCallback(buildErrorResponse(null, error));\n });\n } else {\n // Direct BO payment\n localPurchase(distributorId, vtiId, appliedPromocode, signal)\n .then((response: BO_API_REQUEST_RESPONSE_BASE) => {\n signal.throwIfAborted();\n\n this.paidCallback(response);\n })\n .catch((error) => ignoreIfAborted(signal, error, () => this.paidCallback(buildErrorResponse(null, error))));\n }\n };\n\n renderTitles = (): React.Node => {\n const { title } = this.state;\n\n if (!title) {\n return null;\n }\n\n const { line1, line2 } = title;\n\n return (\n <div className='titles'>\n <div>{line1}</div>\n {line2 ? <div className='subtitle'>{line2}</div> : null}\n </div>\n );\n };\n\n formatLicenceDuration = (licenseDuration?: string): string | null => {\n if (!licenseDuration) {\n // Buy case\n return null;\n }\n\n const duration = getIso8601DurationInSeconds(licenseDuration);\n\n if (duration <= MAX_HOURS_DISPLAYED) {\n return Localizer.localize('modal.vod_purchase.licence_duration_hour', { count: duration / SECONDS_PER_HOUR });\n }\n\n return Localizer.localize('modal.vod_purchase.licence_duration_hour', { count: Math.round(duration / SECONDS_PER_DAY) });\n };\n\n handleInformationTooltipOnShow = (tip: any) => {\n const { modal } = this;\n\n this.helpTooltip = tip;\n HotKeys.register('escape', this.handleHideHotKey, {\n disableOthers: true,\n name: 'VodPurchase.hideTooltip',\n });\n\n if (modal) {\n // Prevent from closing modal by clicking outside when the user only wants to close the tooltip\n modal.disableClosing();\n }\n };\n\n handleInformationTooltipOnHide = () => {\n const { modal } = this;\n\n HotKeys.unregister('escape', this.handleHideHotKey);\n\n if (modal) {\n this.closingEnableTimer = setTimeout(modal.enableClosing, OVERLAY_CLICK_REENABLING_DELAY);\n }\n };\n\n handleHideHotKey = (event: SyntheticKeyboardEvent<HTMLElement>) => {\n const { helpTooltip } = this;\n\n event.preventDefault();\n event.stopPropagation();\n\n if (helpTooltip) {\n helpTooltip.hide();\n this.helpTooltip = null;\n }\n };\n\n renderInformationTooltipContent = (validity: string): React.Node => (\n <div className='tooltipContent vodInformation'>\n <div className='title'>{Localizer.localize('modal.vod_purchase.help.title')}</div>\n <div className='subtitle'>{Localizer.localize('modal.vod_purchase.help.rent_title')}</div>\n <div className='bullet'>{Localizer.localize('modal.vod_purchase.help.rent_validity', { validity })}</div>\n <div className='bullet'>{Localizer.localize('modal.vod_purchase.help.rent_plays')}</div>\n <div className='subtitle'>{Localizer.localize('modal.vod_purchase.help.buy_title')}</div>\n <div className='bullet'>{Localizer.localize('modal.vod_purchase.help.buy_validity')}</div>\n <div className='bullet'>{Localizer.localize('modal.vod_purchase.help.buy_plays')}</div>\n <div className='subtitle'>{Localizer.localize('modal.vod_purchase.help.video_quality_title')}</div>\n <div className='bullet'>{Localizer.localize('modal.vod_purchase.help.video_quality_best')}</div>\n <div className='bullet'>{Localizer.localize('modal.vod_purchase.help.video_quality_4k_hd')}</div>\n <div className='bullet'>{Localizer.localize('modal.vod_purchase.help.video_quality_4k_compatibility')}</div>\n <div className='subtitle'>{Localizer.localize('modal.vod_purchase.help.promocode_title')}</div>\n <div className='bullet'>{Localizer.localize('modal.vod_purchase.help.promocode_type')}</div>\n <div className='bullet'>{Localizer.localize('modal.vod_purchase.help.promocode_format')}</div>\n <div className='customerService'>{Localizer.localize('modal.vod_purchase.help.customer_service')}</div>\n </div>\n );\n\n renderPurchaseValidity = (purchaseType: PurchaseType, validity: string): React.Node => {\n if (purchaseType === Purchase.Rent) {\n // Rent\n return (\n <>\n <div className='bullet'>{Localizer.localize('modal.vod_purchase.info.rent.validity', { validity })}</div>\n <div className='bullet'>{Localizer.localize('modal.vod_purchase.info.rent.concurrency')}</div>\n </>\n );\n }\n\n // Buy\n return (\n <>\n <div className='bullet'>{Localizer.localize('modal.vod_purchase.info.buy.validity')}</div>\n <div className='bullet'>{Localizer.localize('modal.vod_purchase.info.buy.concurrency')}</div>\n </>\n );\n };\n\n renderContent = (): React.Node => {\n const { vodPurchaseData } = this.props;\n const { appliedPromocode, discountPrice, errorMessageKey, isApplyingPromocode, isPaying, promocode, promocodeError, rentValidity, updatedPrice, vodLocationMetadata } = this.state;\n\n if (errorMessageKey || !vodPurchaseData) {\n return <div className='invalidContent'>{Localizer.localize(errorMessageKey ?? 'modal.vod_purchase.promocode_error')}</div>;\n }\n\n const { definition, displayPrice, item, programMetadata, purchaseType } = vodPurchaseData;\n\n /* eslint-disable react/jsx-props-no-spreading */\n return (\n <div className='validation'>\n <div className='summary'>{renderPurchaseSummary(purchaseType, definition, displayPrice, discountPrice, updatedPrice)}</div>\n <div className='details other'>\n {renderProgramLanguage(vodLocationMetadata?.location ?? null)}\n {renderProgramParentalGuidance(item, programMetadata)}\n </div>\n <div className='validity'>{this.renderPurchaseValidity(purchaseType, rentValidity)}</div>\n <div className='codeAndButton'>\n <input\n disabled={isApplyingPromocode || (appliedPromocode !== null && appliedPromocode !== '')}\n onChange={this.handlePromocodeOnChange}\n pattern='[a-zA-Z0-9]+'\n placeholder={Localizer.localize('modal.vod_purchase.promocode')}\n type='text'\n value={appliedPromocode ? appliedPromocode : promocode}\n />\n {appliedPromocode ? (\n <PictoCheck />\n ) : (\n <ButtonFX hasPadding isDisabled={promocode === ''} isLoading={isApplyingPromocode} onClick={this.handleApplyPromocodeButtonOnClick} widthKind={WidthKind.Small}>\n {Localizer.localize('modal.vod_purchase.apply_promocode')}\n </ButtonFX>\n )}\n </div>\n <div className={clsx('promocodeError', promocodeError !== null && 'visible')}>{promocodeError}</div>\n <ButtonFX isDisabled={isApplyingPromocode} isLoading={isPaying} onClick={this.handlePayButtonOnClick} widthKind={WidthKind.Stretched}>\n {Localizer.localize('modal.vod_purchase.pay')}\n </ButtonFX>\n <Tippy\n {...TIPPY_DEFAULT_OPTIONS}\n appendTo={document.body}\n content={this.renderInformationTooltipContent(rentValidity)}\n interactive\n onHide={this.handleInformationTooltipOnHide}\n onShow={this.handleInformationTooltipOnShow}\n placement='top'\n trigger='click'\n >\n <div className='information'>\n <PictoInfo />\n <div>{Localizer.localize('modal.vod_purchase.information')}</div>\n </div>\n </Tippy>\n </div>\n );\n /* eslint-enable react/jsx-props-no-spreading */\n };\n\n renderChildren = (): React.Node => {\n const { vodPurchaseData } = this.props;\n const { step } = this.state;\n\n if (step === STEP_2) {\n // Step 2: Purchase finished\n\n return (\n <div className='paid'>\n <div className='title'>{Localizer.localize('modal.vod_purchase.paid.title')}</div>\n <div className='message'>{Localizer.localize('modal.vod_purchase.paid.message')}</div>\n <div className='buttons'>\n <ButtonFX onClick={this.handlePlayNowButtonOnClick}>{Localizer.localize('modal.vod_purchase.paid.watch_now')}</ButtonFX>\n <ButtonFX onClick={this.handlePlayLaterButtonOnClick}>{Localizer.localize('modal.vod_purchase.paid.watch_later')}</ButtonFX>\n </div>\n </div>\n );\n }\n\n // Step 1: User optionally enters a code and pays\n\n if (!vodPurchaseData) {\n return null;\n }\n\n return (\n <>\n {this.renderTitles()}\n {this.renderContent()}\n </>\n );\n };\n\n render(): React.Node {\n const { index, vodPurchaseData } = this.props;\n\n if (!vodPurchaseData) {\n return null;\n }\n\n return (\n <Modal\n canCloseOnEnter={false}\n className='vodPurchase'\n icon={ModalIcon.Cart}\n index={index}\n ref={(instance) => {\n this.modal = instance;\n }}\n >\n {this.renderChildren()}\n </Modal>\n );\n }\n}\n\nconst getIdentity = (state: CombinedReducers): string => {\n const { appConfiguration } = state;\n return getBOSetting('identity', appConfiguration) ?? '';\n};\n\nconst mapStateToProps = (state: CombinedReducers) => {\n return {\n deviceSettings: state.appConfiguration.deviceSettings,\n identity: getIdentity(state),\n isDebugModeEnabled: state.appConfiguration.isDebugModeEnabled,\n isExternalCheckOutEnabled: state.appConfiguration.isExternalCheckOutEnabled,\n };\n};\n\nconst mapDispatchToProps = (dispatch: Dispatch): ReduxVodPurchaseModalDispatchToPropsType => {\n return {\n localGetPurchaseStatus: (distributorId: string, vtiId: number, promocode: string, signal?: AbortSignal): Promise<any> =>\n dispatch(sendBOPurchaseStatusRequest(distributorId, vtiId, promocode, signal)),\n\n localHideModal: (): void => dispatch(hideModal()),\n\n localPurchase: (distributorId: string, vtiId: number, promocode: string | null, signal?: AbortSignal): Promise<any> => dispatch(purchase(distributorId, vtiId, promocode ?? '', signal)),\n\n localSendV8MetadataLocationRequest: (assetId: string, signal?: AbortSignal): Promise<any> => dispatch(sendV8MetadataLocationRequest(assetId, signal)),\n\n localShowMessage: (messageData: MESSAGE_MODAL_TYPE): Promise<any> => dispatch(showMessageModal(messageData)),\n\n localStopOpenStreams: (distributorId: string, signal?: AbortSignal): Promise<any> => dispatch(stopOpenStreams(distributorId, signal)),\n };\n};\n\nconst VodPurchaseModal: React.ComponentType<ModalState> = connect(mapStateToProps, mapDispatchToProps, null, { forwardRef: true })(VodPurchaseModalView);\n\nexport default VodPurchaseModal;\n","/* @flow */\n\nimport * as React from 'react';\nimport {\n AUTHENTICATION_REQUIRED_MODAL,\n AVENUE_MODAL,\n CARD_MODAL,\n CONFIRMATION_MODAL,\n EXTERNAL_CONTENT_MODAL,\n KEYBOARD_SHORTCUTS_MODAL,\n LEGAL_NOTICE_MODAL,\n MESSAGE_MODAL,\n type MODAL_TYPE,\n NEW_VERSION_MODAL,\n NPVR_HELP_MODAL,\n NPVR_MODAL,\n VOD_PURCHASE_MODAL,\n} from './modalTypes';\nimport AuthenticationRequiredModal from './authenticationRequiredModal/AuthenticationRequiredModal';\nimport AvenueModal from './avenueModal/AvenueModal';\nimport CardModal from './cardModal/CardModal';\nimport type { CombinedReducers } from '../../redux/reducers';\nimport ConfirmationModal from './confirmationModal/ConfirmationModal';\nimport ErrorBoundary from '../errorBoundary/ErrorBoundary';\nimport ExternalContentModal from './externalContentModal/ExternalContentModal';\nimport KeyboardShortcutsModal from './keyboardShortcutsModal/KeyboardShortcutsModal';\nimport LegalNoticeModal from './legalNoticeModal/LegalNoticeModal';\nimport MessageModal from './messageModal/MessageModal';\nimport type { ModalState } from '../../redux/modal/reducers';\nimport NewVersionModal from './newVersionModal/NewVersionModal';\nimport NpvrHelpModal from './npvrHelpModal/NpvrHelpModal';\nimport NpvrModal from './npvrModal/NpvrModal';\nimport VodPurchaseModal from './vodPurchaseModal/VodPurchaseModal';\nimport { connect } from 'react-redux';\n\ntype ReduxModalContainerReducerStateType = {|\n +openModals: Array<ModalState>,\n|};\n\ntype ModalContainerPropType = {||};\n\ntype CompleteModalContainerPropType = {|\n ...ModalContainerPropType,\n ...ReduxModalContainerReducerStateType,\n|};\n\nconst MODAL_COMPONENTS: {| [MODAL_TYPE]: any |} = {\n [AUTHENTICATION_REQUIRED_MODAL]: AuthenticationRequiredModal,\n [AVENUE_MODAL]: AvenueModal,\n [CARD_MODAL]: CardModal,\n [CONFIRMATION_MODAL]: ConfirmationModal,\n [EXTERNAL_CONTENT_MODAL]: ExternalContentModal,\n [KEYBOARD_SHORTCUTS_MODAL]: KeyboardShortcutsModal,\n [LEGAL_NOTICE_MODAL]: LegalNoticeModal,\n [MESSAGE_MODAL]: MessageModal,\n [NEW_VERSION_MODAL]: NewVersionModal,\n [NPVR_HELP_MODAL]: NpvrHelpModal,\n [NPVR_MODAL]: NpvrModal,\n [VOD_PURCHASE_MODAL]: VodPurchaseModal,\n};\n\nconst ModalContainerView = (props: CompleteModalContainerPropType) => {\n const { openModals } = props;\n\n if (openModals.length === 0) {\n // No modal open\n return null;\n }\n\n return openModals.map((modalProps, index) => {\n const { modalType } = modalProps;\n if (!modalType) {\n return null;\n }\n\n const SpecificModal = MODAL_COMPONENTS[modalType];\n const fullProps = {\n ...modalProps,\n index,\n };\n\n /* eslint-disable react/jsx-props-no-spreading */\n return (\n <ErrorBoundary componentName='Modal' isNotificationEnabled key={modalType}>\n <React.Suspense fallback={null}>\n <SpecificModal {...fullProps} />\n </React.Suspense>\n </ErrorBoundary>\n );\n /* eslint-enable react/jsx-props-no-spreading */\n });\n};\n\nconst mapStateToProps = (state: CombinedReducers) => {\n return {\n openModals: state.modal.openModals,\n };\n};\n\nconst ModalContainer: React.ComponentType<ModalContainerPropType> = connect(mapStateToProps, null, null, { forwardRef: true })(ModalContainerView);\n\nexport default ModalContainer;\n","/* @flow */\n\nimport * as React from 'react';\nimport type { KeyValuePair } from '@ntg/utils/dist/types';\n\nexport type NOTIFICATION_MESSAGE = React.Node;\nexport type NOTIFICATION_SETTINGS = KeyValuePair<any>;\n\nexport type NOTIFICATION = {|\n message: NOTIFICATION_MESSAGE,\n settings?: NOTIFICATION_SETTINGS,\n|};\n\n// Cannot be converted to enum because strings come from Toastify\nexport const TOAST = Object.freeze({\n Error: 'error',\n Info: 'info',\n Success: 'success',\n Warning: 'warning',\n});\nexport type NOTIFICATION_TYPE = 'info' | 'success' | 'warning' | 'error';\n","\nfunction injectStyle(css) {\n if (!css || typeof document === 'undefined') return\n\n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if(head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n\n if(style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n}\ninjectStyle(\":root{--toastify-color-light: #fff;--toastify-color-dark: #121212;--toastify-color-info: #3498db;--toastify-color-success: #07bc0c;--toastify-color-warning: #f1c40f;--toastify-color-error: hsl(6, 78%, 57%);--toastify-color-transparent: rgba(255, 255, 255, .7);--toastify-icon-color-info: var(--toastify-color-info);--toastify-icon-color-success: var(--toastify-color-success);--toastify-icon-color-warning: var(--toastify-color-warning);--toastify-icon-color-error: var(--toastify-color-error);--toastify-container-width: fit-content;--toastify-toast-width: 320px;--toastify-toast-offset: 16px;--toastify-toast-top: max(var(--toastify-toast-offset), env(safe-area-inset-top));--toastify-toast-right: max(var(--toastify-toast-offset), env(safe-area-inset-right));--toastify-toast-left: max(var(--toastify-toast-offset), env(safe-area-inset-left));--toastify-toast-bottom: max(var(--toastify-toast-offset), env(safe-area-inset-bottom));--toastify-toast-background: #fff;--toastify-toast-padding: 14px;--toastify-toast-min-height: 64px;--toastify-toast-max-height: 800px;--toastify-toast-bd-radius: 6px;--toastify-toast-shadow: 0px 4px 12px rgba(0, 0, 0, .1);--toastify-font-family: sans-serif;--toastify-z-index: 9999;--toastify-text-color-light: #757575;--toastify-text-color-dark: #fff;--toastify-text-color-info: #fff;--toastify-text-color-success: #fff;--toastify-text-color-warning: #fff;--toastify-text-color-error: #fff;--toastify-spinner-color: #616161;--toastify-spinner-color-empty-area: #e0e0e0;--toastify-color-progress-light: linear-gradient(to right, #4cd964, #5ac8fa, #007aff, #34aadc, #5856d6, #ff2d55);--toastify-color-progress-dark: #bb86fc;--toastify-color-progress-info: var(--toastify-color-info);--toastify-color-progress-success: var(--toastify-color-success);--toastify-color-progress-warning: var(--toastify-color-warning);--toastify-color-progress-error: var(--toastify-color-error);--toastify-color-progress-bgo: .2}.Toastify__toast-container{z-index:var(--toastify-z-index);-webkit-transform:translate3d(0,0,var(--toastify-z-index));position:fixed;width:var(--toastify-container-width);box-sizing:border-box;color:#fff;display:flex;flex-direction:column}.Toastify__toast-container--top-left{top:var(--toastify-toast-top);left:var(--toastify-toast-left)}.Toastify__toast-container--top-center{top:var(--toastify-toast-top);left:50%;transform:translate(-50%);align-items:center}.Toastify__toast-container--top-right{top:var(--toastify-toast-top);right:var(--toastify-toast-right);align-items:end}.Toastify__toast-container--bottom-left{bottom:var(--toastify-toast-bottom);left:var(--toastify-toast-left)}.Toastify__toast-container--bottom-center{bottom:var(--toastify-toast-bottom);left:50%;transform:translate(-50%);align-items:center}.Toastify__toast-container--bottom-right{bottom:var(--toastify-toast-bottom);right:var(--toastify-toast-right);align-items:end}.Toastify__toast{--y: 0;position:relative;touch-action:none;width:var(--toastify-toast-width);min-height:var(--toastify-toast-min-height);box-sizing:border-box;margin-bottom:1rem;padding:var(--toastify-toast-padding);border-radius:var(--toastify-toast-bd-radius);box-shadow:var(--toastify-toast-shadow);max-height:var(--toastify-toast-max-height);font-family:var(--toastify-font-family);z-index:0;display:flex;flex:1 auto;align-items:center;word-break:break-word}@media only screen and (max-width: 480px){.Toastify__toast-container{width:100vw;left:env(safe-area-inset-left);margin:0}.Toastify__toast-container--top-left,.Toastify__toast-container--top-center,.Toastify__toast-container--top-right{top:env(safe-area-inset-top);transform:translate(0)}.Toastify__toast-container--bottom-left,.Toastify__toast-container--bottom-center,.Toastify__toast-container--bottom-right{bottom:env(safe-area-inset-bottom);transform:translate(0)}.Toastify__toast-container--rtl{right:env(safe-area-inset-right);left:initial}.Toastify__toast{--toastify-toast-width: 100%;margin-bottom:0;border-radius:0}}.Toastify__toast-container[data-stacked=true]{width:var(--toastify-toast-width)}.Toastify__toast--stacked{position:absolute;width:100%;transform:translate3d(0,var(--y),0) scale(var(--s));transition:transform .3s}.Toastify__toast--stacked[data-collapsed] .Toastify__toast-body,.Toastify__toast--stacked[data-collapsed] .Toastify__close-button{transition:opacity .1s}.Toastify__toast--stacked[data-collapsed=false]{overflow:visible}.Toastify__toast--stacked[data-collapsed=true]:not(:last-child)>*{opacity:0}.Toastify__toast--stacked:after{content:\\\"\\\";position:absolute;left:0;right:0;height:calc(var(--g) * 1px);bottom:100%}.Toastify__toast--stacked[data-pos=top]{top:0}.Toastify__toast--stacked[data-pos=bot]{bottom:0}.Toastify__toast--stacked[data-pos=bot].Toastify__toast--stacked:before{transform-origin:top}.Toastify__toast--stacked[data-pos=top].Toastify__toast--stacked:before{transform-origin:bottom}.Toastify__toast--stacked:before{content:\\\"\\\";position:absolute;left:0;right:0;bottom:0;height:100%;transform:scaleY(3);z-index:-1}.Toastify__toast--rtl{direction:rtl}.Toastify__toast--close-on-click{cursor:pointer}.Toastify__toast-icon{margin-inline-end:10px;width:22px;flex-shrink:0;display:flex}.Toastify--animate{animation-fill-mode:both;animation-duration:.5s}.Toastify--animate-icon{animation-fill-mode:both;animation-duration:.3s}.Toastify__toast-theme--dark{background:var(--toastify-color-dark);color:var(--toastify-text-color-dark)}.Toastify__toast-theme--light,.Toastify__toast-theme--colored.Toastify__toast--default{background:var(--toastify-color-light);color:var(--toastify-text-color-light)}.Toastify__toast-theme--colored.Toastify__toast--info{color:var(--toastify-text-color-info);background:var(--toastify-color-info)}.Toastify__toast-theme--colored.Toastify__toast--success{color:var(--toastify-text-color-success);background:var(--toastify-color-success)}.Toastify__toast-theme--colored.Toastify__toast--warning{color:var(--toastify-text-color-warning);background:var(--toastify-color-warning)}.Toastify__toast-theme--colored.Toastify__toast--error{color:var(--toastify-text-color-error);background:var(--toastify-color-error)}.Toastify__progress-bar-theme--light{background:var(--toastify-color-progress-light)}.Toastify__progress-bar-theme--dark{background:var(--toastify-color-progress-dark)}.Toastify__progress-bar--info{background:var(--toastify-color-progress-info)}.Toastify__progress-bar--success{background:var(--toastify-color-progress-success)}.Toastify__progress-bar--warning{background:var(--toastify-color-progress-warning)}.Toastify__progress-bar--error{background:var(--toastify-color-progress-error)}.Toastify__progress-bar-theme--colored.Toastify__progress-bar--info,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--success,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--warning,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--error{background:var(--toastify-color-transparent)}.Toastify__close-button{color:#fff;position:absolute;top:6px;right:6px;background:transparent;outline:none;border:none;padding:0;cursor:pointer;opacity:.7;transition:.3s ease;z-index:1}.Toastify__toast--rtl .Toastify__close-button{left:6px;right:unset}.Toastify__close-button--light{color:#000;opacity:.3}.Toastify__close-button>svg{fill:currentColor;height:16px;width:14px}.Toastify__close-button:hover,.Toastify__close-button:focus{opacity:1}@keyframes Toastify__trackProgress{0%{transform:scaleX(1)}to{transform:scaleX(0)}}.Toastify__progress-bar{position:absolute;bottom:0;left:0;width:100%;height:100%;z-index:1;opacity:.7;transform-origin:left}.Toastify__progress-bar--animated{animation:Toastify__trackProgress linear 1 forwards}.Toastify__progress-bar--controlled{transition:transform .2s}.Toastify__progress-bar--rtl{right:0;left:initial;transform-origin:right;border-bottom-left-radius:initial}.Toastify__progress-bar--wrp{position:absolute;overflow:hidden;bottom:0;left:0;width:100%;height:5px;border-bottom-left-radius:var(--toastify-toast-bd-radius);border-bottom-right-radius:var(--toastify-toast-bd-radius)}.Toastify__progress-bar--wrp[data-hidden=true]{opacity:0}.Toastify__progress-bar--bg{opacity:var(--toastify-color-progress-bgo);width:100%;height:100%}.Toastify__spinner{width:20px;height:20px;box-sizing:border-box;border:2px solid;border-radius:100%;border-color:var(--toastify-spinner-color-empty-area);border-right-color:var(--toastify-spinner-color);animation:Toastify__spin .65s linear infinite}@keyframes Toastify__bounceInRight{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(3000px,0,0)}60%{opacity:1;transform:translate3d(-25px,0,0)}75%{transform:translate3d(10px,0,0)}90%{transform:translate3d(-5px,0,0)}to{transform:none}}@keyframes Toastify__bounceOutRight{20%{opacity:1;transform:translate3d(-20px,var(--y),0)}to{opacity:0;transform:translate3d(2000px,var(--y),0)}}@keyframes Toastify__bounceInLeft{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(-3000px,0,0)}60%{opacity:1;transform:translate3d(25px,0,0)}75%{transform:translate3d(-10px,0,0)}90%{transform:translate3d(5px,0,0)}to{transform:none}}@keyframes Toastify__bounceOutLeft{20%{opacity:1;transform:translate3d(20px,var(--y),0)}to{opacity:0;transform:translate3d(-2000px,var(--y),0)}}@keyframes Toastify__bounceInUp{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(0,3000px,0)}60%{opacity:1;transform:translate3d(0,-20px,0)}75%{transform:translate3d(0,10px,0)}90%{transform:translate3d(0,-5px,0)}to{transform:translateZ(0)}}@keyframes Toastify__bounceOutUp{20%{transform:translate3d(0,calc(var(--y) - 10px),0)}40%,45%{opacity:1;transform:translate3d(0,calc(var(--y) + 20px),0)}to{opacity:0;transform:translate3d(0,-2000px,0)}}@keyframes Toastify__bounceInDown{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(0,-3000px,0)}60%{opacity:1;transform:translate3d(0,25px,0)}75%{transform:translate3d(0,-10px,0)}90%{transform:translate3d(0,5px,0)}to{transform:none}}@keyframes Toastify__bounceOutDown{20%{transform:translate3d(0,calc(var(--y) - 10px),0)}40%,45%{opacity:1;transform:translate3d(0,calc(var(--y) + 20px),0)}to{opacity:0;transform:translate3d(0,2000px,0)}}.Toastify__bounce-enter--top-left,.Toastify__bounce-enter--bottom-left{animation-name:Toastify__bounceInLeft}.Toastify__bounce-enter--top-right,.Toastify__bounce-enter--bottom-right{animation-name:Toastify__bounceInRight}.Toastify__bounce-enter--top-center{animation-name:Toastify__bounceInDown}.Toastify__bounce-enter--bottom-center{animation-name:Toastify__bounceInUp}.Toastify__bounce-exit--top-left,.Toastify__bounce-exit--bottom-left{animation-name:Toastify__bounceOutLeft}.Toastify__bounce-exit--top-right,.Toastify__bounce-exit--bottom-right{animation-name:Toastify__bounceOutRight}.Toastify__bounce-exit--top-center{animation-name:Toastify__bounceOutUp}.Toastify__bounce-exit--bottom-center{animation-name:Toastify__bounceOutDown}@keyframes Toastify__zoomIn{0%{opacity:0;transform:scale3d(.3,.3,.3)}50%{opacity:1}}@keyframes Toastify__zoomOut{0%{opacity:1}50%{opacity:0;transform:translate3d(0,var(--y),0) scale3d(.3,.3,.3)}to{opacity:0}}.Toastify__zoom-enter{animation-name:Toastify__zoomIn}.Toastify__zoom-exit{animation-name:Toastify__zoomOut}@keyframes Toastify__flipIn{0%{transform:perspective(400px) rotateX(90deg);animation-timing-function:ease-in;opacity:0}40%{transform:perspective(400px) rotateX(-20deg);animation-timing-function:ease-in}60%{transform:perspective(400px) rotateX(10deg);opacity:1}80%{transform:perspective(400px) rotateX(-5deg)}to{transform:perspective(400px)}}@keyframes Toastify__flipOut{0%{transform:translate3d(0,var(--y),0) perspective(400px)}30%{transform:translate3d(0,var(--y),0) perspective(400px) rotateX(-20deg);opacity:1}to{transform:translate3d(0,var(--y),0) perspective(400px) rotateX(90deg);opacity:0}}.Toastify__flip-enter{animation-name:Toastify__flipIn}.Toastify__flip-exit{animation-name:Toastify__flipOut}@keyframes Toastify__slideInRight{0%{transform:translate3d(110%,0,0);visibility:visible}to{transform:translate3d(0,var(--y),0)}}@keyframes Toastify__slideInLeft{0%{transform:translate3d(-110%,0,0);visibility:visible}to{transform:translate3d(0,var(--y),0)}}@keyframes Toastify__slideInUp{0%{transform:translate3d(0,110%,0);visibility:visible}to{transform:translate3d(0,var(--y),0)}}@keyframes Toastify__slideInDown{0%{transform:translate3d(0,-110%,0);visibility:visible}to{transform:translate3d(0,var(--y),0)}}@keyframes Toastify__slideOutRight{0%{transform:translate3d(0,var(--y),0)}to{visibility:hidden;transform:translate3d(110%,var(--y),0)}}@keyframes Toastify__slideOutLeft{0%{transform:translate3d(0,var(--y),0)}to{visibility:hidden;transform:translate3d(-110%,var(--y),0)}}@keyframes Toastify__slideOutDown{0%{transform:translate3d(0,var(--y),0)}to{visibility:hidden;transform:translate3d(0,500px,0)}}@keyframes Toastify__slideOutUp{0%{transform:translate3d(0,var(--y),0)}to{visibility:hidden;transform:translate3d(0,-500px,0)}}.Toastify__slide-enter--top-left,.Toastify__slide-enter--bottom-left{animation-name:Toastify__slideInLeft}.Toastify__slide-enter--top-right,.Toastify__slide-enter--bottom-right{animation-name:Toastify__slideInRight}.Toastify__slide-enter--top-center{animation-name:Toastify__slideInDown}.Toastify__slide-enter--bottom-center{animation-name:Toastify__slideInUp}.Toastify__slide-exit--top-left,.Toastify__slide-exit--bottom-left{animation-name:Toastify__slideOutLeft;animation-timing-function:ease-in;animation-duration:.3s}.Toastify__slide-exit--top-right,.Toastify__slide-exit--bottom-right{animation-name:Toastify__slideOutRight;animation-timing-function:ease-in;animation-duration:.3s}.Toastify__slide-exit--top-center{animation-name:Toastify__slideOutUp;animation-timing-function:ease-in;animation-duration:.3s}.Toastify__slide-exit--bottom-center{animation-name:Toastify__slideOutDown;animation-timing-function:ease-in;animation-duration:.3s}@keyframes Toastify__spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\\n\");","import { isValidElement } from 'react';\nimport { Id } from '../types';\n\nexport const isNum = (v: any): v is Number => typeof v === 'number' && !isNaN(v);\n\nexport const isStr = (v: any): v is String => typeof v === 'string';\n\nexport const isFn = (v: any): v is Function => typeof v === 'function';\n\nexport const isId = (v: unknown): v is Id => isStr(v) || isNum(v);\n\nexport const parseClassName = (v: any) => (isStr(v) || isFn(v) ? v : null);\n\nexport const getAutoCloseDelay = (toastAutoClose?: false | number, containerAutoClose?: false | number) =>\n toastAutoClose === false || (isNum(toastAutoClose) && toastAutoClose > 0) ? toastAutoClose : containerAutoClose;\n\nexport const canBeRendered = <T>(content: T): boolean =>\n isValidElement(content) || isStr(content) || isFn(content) || isNum(content);\n","import React, { useEffect, useLayoutEffect, useRef } from 'react';\nimport { collapseToast } from './collapseToast';\nimport { Default } from './constant';\n\nimport { ToastTransitionProps } from '../types';\n\nexport interface CSSTransitionProps {\n /**\n * Css class to apply when toast enter\n */\n enter: string;\n\n /**\n * Css class to apply when toast leave\n */\n exit: string;\n\n /**\n * Append current toast position to the classname.\n * If multiple classes are provided, only the last one will get the position\n * For instance `myclass--top-center`...\n * `Default: false`\n */\n appendPosition?: boolean;\n\n /**\n * Collapse toast smoothly when exit animation end\n * `Default: true`\n */\n collapse?: boolean;\n\n /**\n * Collapse transition duration\n * `Default: 300`\n */\n collapseDuration?: number;\n}\n\nconst enum AnimationStep {\n Enter,\n Exit\n}\n\n/**\n * Css animation that just work.\n * You could use animate.css for instance\n *\n *\n * ```\n * cssTransition({\n * enter: \"animate__animated animate__bounceIn\",\n * exit: \"animate__animated animate__bounceOut\"\n * })\n * ```\n *\n */\nexport function cssTransition({\n enter,\n exit,\n appendPosition = false,\n collapse = true,\n collapseDuration = Default.COLLAPSE_DURATION\n}: CSSTransitionProps) {\n return function ToastTransition({\n children,\n position,\n preventExitTransition,\n done,\n nodeRef,\n isIn,\n playToast\n }: ToastTransitionProps) {\n const enterClassName = appendPosition ? `${enter}--${position}` : enter;\n const exitClassName = appendPosition ? `${exit}--${position}` : exit;\n const animationStep = useRef(AnimationStep.Enter);\n\n useLayoutEffect(() => {\n const node = nodeRef.current!;\n const classToToken = enterClassName.split(' ');\n\n const onEntered = (e: AnimationEvent) => {\n if (e.target !== nodeRef.current) return;\n\n playToast();\n node.removeEventListener('animationend', onEntered);\n node.removeEventListener('animationcancel', onEntered);\n if (animationStep.current === AnimationStep.Enter && e.type !== 'animationcancel') {\n node.classList.remove(...classToToken);\n }\n };\n\n const onEnter = () => {\n node.classList.add(...classToToken);\n node.addEventListener('animationend', onEntered);\n node.addEventListener('animationcancel', onEntered);\n };\n\n onEnter();\n }, []);\n\n useEffect(() => {\n const node = nodeRef.current!;\n\n const onExited = () => {\n node.removeEventListener('animationend', onExited);\n collapse ? collapseToast(node, done, collapseDuration) : done();\n };\n\n const onExit = () => {\n animationStep.current = AnimationStep.Exit;\n node.className += ` ${exitClassName}`;\n node.addEventListener('animationend', onExited);\n };\n\n if (!isIn) preventExitTransition ? onExited() : onExit();\n }, [isIn]);\n\n return <>{children}</>;\n };\n}\n","import { Default } from './constant';\n\n/**\n * Used to collapse toast after exit animation\n */\nexport function collapseToast(node: HTMLElement, done: () => void, duration = Default.COLLAPSE_DURATION) {\n const { scrollHeight, style } = node;\n\n requestAnimationFrame(() => {\n style.minHeight = 'initial';\n style.height = scrollHeight + 'px';\n style.transition = `all ${duration}ms`;\n\n requestAnimationFrame(() => {\n style.height = '0';\n style.padding = '0';\n style.margin = '0';\n setTimeout(done, duration as number);\n });\n });\n}\n","import { Toast, ToastContentProps, ToastItem, ToastItemStatus, ToastProps } from '../types';\nimport { cloneElement, isValidElement, ReactElement } from 'react';\nimport { isFn, isStr } from './propValidator';\n\nexport function toToastItem(toast: Toast, status: ToastItemStatus): ToastItem {\n return {\n content: renderContent(toast.content, toast.props),\n containerId: toast.props.containerId,\n id: toast.props.toastId,\n theme: toast.props.theme,\n type: toast.props.type,\n data: toast.props.data || {},\n isLoading: toast.props.isLoading,\n icon: toast.props.icon,\n reason: toast.removalReason,\n status\n };\n}\n\nexport function renderContent(content: unknown, props: ToastProps, isPaused: boolean = false) {\n if (isValidElement(content) && !isStr(content.type)) {\n return cloneElement<ToastContentProps>(content as ReactElement<any>, {\n closeToast: props.closeToast,\n toastProps: props,\n data: props.data,\n isPaused\n });\n } else if (isFn(content)) {\n return content({\n closeToast: props.closeToast,\n toastProps: props,\n data: props.data,\n isPaused\n });\n }\n\n return content;\n}\n","import React from 'react';\nimport cx from 'clsx';\n\nimport { Default, isFn, Type } from '../utils';\nimport { Theme, ToastClassName, TypeOptions } from '../types';\n\nexport interface ProgressBarProps {\n /**\n * The animation delay which determine when to close the toast\n */\n delay: number;\n\n /**\n * The animation is running or paused\n */\n isRunning: boolean;\n\n /**\n * Func to close the current toast\n */\n closeToast: () => void;\n\n /**\n * Optional type : info, success ...\n */\n type?: TypeOptions;\n\n /**\n * The theme that is currently used\n */\n theme: Theme;\n\n /**\n * Hide or not the progress bar\n */\n hide?: boolean;\n\n /**\n * Optional className\n */\n className?: ToastClassName;\n\n /**\n * Tell whether a controlled progress bar is used\n */\n controlledProgress?: boolean;\n\n /**\n * Controlled progress value\n */\n progress?: number | string;\n\n /**\n * Support rtl content\n */\n rtl?: boolean;\n\n /**\n * Tell if the component is visible on screen or not\n */\n isIn?: boolean;\n}\n\nexport function ProgressBar({\n delay,\n isRunning,\n closeToast,\n type = Type.DEFAULT,\n hide,\n className,\n controlledProgress,\n progress,\n rtl,\n isIn,\n theme\n}: ProgressBarProps) {\n const isHidden = hide || (controlledProgress && progress === 0);\n const style: React.CSSProperties = {\n animationDuration: `${delay}ms`,\n animationPlayState: isRunning ? 'running' : 'paused'\n };\n\n if (controlledProgress) style.transform = `scaleX(${progress})`;\n const defaultClassName = cx(\n `${Default.CSS_NAMESPACE}__progress-bar`,\n controlledProgress\n ? `${Default.CSS_NAMESPACE}__progress-bar--controlled`\n : `${Default.CSS_NAMESPACE}__progress-bar--animated`,\n `${Default.CSS_NAMESPACE}__progress-bar-theme--${theme}`,\n `${Default.CSS_NAMESPACE}__progress-bar--${type}`,\n {\n [`${Default.CSS_NAMESPACE}__progress-bar--rtl`]: rtl\n }\n );\n const classNames = isFn(className)\n ? className({\n rtl,\n type,\n defaultClassName\n })\n : cx(defaultClassName, className);\n\n // 🧐 controlledProgress is derived from progress\n // so if controlledProgress is set\n // it means that this is also the case for progress\n const animationEvent = {\n [controlledProgress && (progress as number)! >= 1 ? 'onTransitionEnd' : 'onAnimationEnd']:\n controlledProgress && (progress as number)! < 1\n ? null\n : () => {\n isIn && closeToast();\n }\n };\n\n // TODO: add aria-valuenow, aria-valuemax, aria-valuemin\n\n return (\n <div className={`${Default.CSS_NAMESPACE}__progress-bar--wrp`} data-hidden={isHidden}>\n <div\n className={`${Default.CSS_NAMESPACE}__progress-bar--bg ${Default.CSS_NAMESPACE}__progress-bar-theme--${theme} ${Default.CSS_NAMESPACE}__progress-bar--${type}`}\n />\n <div\n role=\"progressbar\"\n aria-hidden={isHidden ? 'true' : 'false'}\n aria-label=\"notification timer\"\n className={classNames}\n style={style}\n {...animationEvent}\n />\n </div>\n );\n}\n","let TOAST_ID = 1;\n\nexport const genToastId = () => `${TOAST_ID++}`;\n","import {\n Id,\n NotValidatedToastProps,\n OnChangeCallback,\n Toast,\n ToastContainerProps,\n ToastContent,\n ToastProps\n} from '../types';\nimport { canBeRendered, getAutoCloseDelay, isNum, parseClassName, toToastItem } from '../utils';\n\ntype Notify = () => void;\n\nexport type ContainerObserver = ReturnType<typeof createContainerObserver>;\n\nexport function createContainerObserver(\n id: Id,\n containerProps: ToastContainerProps,\n dispatchChanges: OnChangeCallback\n) {\n let toastKey = 1;\n let toastCount = 0;\n let queue: Toast[] = [];\n let snapshot: Toast[] = [];\n let props = containerProps;\n const toasts = new Map<Id, Toast>();\n const listeners = new Set<Notify>();\n\n const observe = (notify: Notify) => {\n listeners.add(notify);\n return () => listeners.delete(notify);\n };\n\n const notify = () => {\n snapshot = Array.from(toasts.values());\n listeners.forEach(cb => cb());\n };\n\n const shouldIgnoreToast = ({ containerId, toastId, updateId }: NotValidatedToastProps) => {\n const containerMismatch = containerId ? containerId !== id : id !== 1;\n const isDuplicate = toasts.has(toastId) && updateId == null;\n\n return containerMismatch || isDuplicate;\n };\n\n const toggle = (v: boolean, id?: Id) => {\n toasts.forEach(t => {\n if (id == null || id === t.props.toastId) t.toggle?.(v);\n });\n };\n\n const markAsRemoved = (v: Toast) => {\n v.props?.onClose?.(v.removalReason);\n v.isActive = false;\n };\n\n const removeToast = (id?: Id) => {\n if (id == null) {\n toasts.forEach(markAsRemoved);\n } else {\n const t = toasts.get(id);\n if (t) markAsRemoved(t);\n }\n notify();\n };\n\n const clearQueue = () => {\n toastCount -= queue.length;\n queue = [];\n };\n\n const addActiveToast = (toast: Toast) => {\n const { toastId, updateId } = toast.props;\n const isNew = updateId == null;\n\n if (toast.staleId) toasts.delete(toast.staleId);\n toast.isActive = true;\n\n toasts.set(toastId, toast);\n notify();\n dispatchChanges(toToastItem(toast, isNew ? 'added' : 'updated'));\n\n if (isNew) toast.props.onOpen?.();\n };\n\n const buildToast = <TData = unknown>(content: ToastContent<TData>, options: NotValidatedToastProps) => {\n if (shouldIgnoreToast(options)) return;\n\n const { toastId, updateId, data, staleId, delay } = options;\n\n const isNotAnUpdate = updateId == null;\n\n if (isNotAnUpdate) toastCount++;\n\n const toastProps = {\n ...props,\n style: props.toastStyle,\n key: toastKey++,\n ...Object.fromEntries(Object.entries(options).filter(([_, v]) => v != null)),\n toastId,\n updateId,\n data,\n isIn: false,\n className: parseClassName(options.className || props.toastClassName),\n progressClassName: parseClassName(options.progressClassName || props.progressClassName),\n autoClose: options.isLoading ? false : getAutoCloseDelay(options.autoClose, props.autoClose),\n closeToast(reason?: true) {\n toasts.get(toastId)!.removalReason = reason;\n removeToast(toastId);\n },\n deleteToast() {\n const toastToRemove = toasts.get(toastId);\n\n if (toastToRemove == null) return;\n\n dispatchChanges(toToastItem(toastToRemove, 'removed'));\n toasts.delete(toastId);\n\n toastCount--;\n if (toastCount < 0) toastCount = 0;\n\n if (queue.length > 0) {\n addActiveToast(queue.shift());\n return;\n }\n\n notify();\n }\n } as ToastProps;\n\n toastProps.closeButton = props.closeButton;\n\n if (options.closeButton === false || canBeRendered(options.closeButton)) {\n toastProps.closeButton = options.closeButton;\n } else if (options.closeButton === true) {\n toastProps.closeButton = canBeRendered(props.closeButton) ? props.closeButton : true;\n }\n\n const activeToast = {\n content,\n props: toastProps,\n staleId\n } as Toast;\n\n // not handling limit + delay by design. Waiting for user feedback first\n if (props.limit && props.limit > 0 && toastCount > props.limit && isNotAnUpdate) {\n queue.push(activeToast);\n } else if (isNum(delay)) {\n setTimeout(() => {\n addActiveToast(activeToast);\n }, delay);\n } else {\n addActiveToast(activeToast);\n }\n };\n\n return {\n id,\n props,\n observe,\n toggle,\n removeToast,\n toasts,\n clearQueue,\n buildToast,\n setProps(p: ToastContainerProps) {\n props = p;\n },\n setToggle: (id: Id, fn: (v: boolean) => void) => {\n const t = toasts.get(id);\n if (t) t.toggle = fn;\n },\n isToastActive: (id: Id) => toasts.get(id)?.isActive,\n getSnapshot: () => snapshot\n };\n}\n","import {\n ClearWaitingQueueParams,\n Id,\n NotValidatedToastProps,\n OnChangeCallback,\n ToastContainerProps,\n ToastContent,\n ToastItem,\n ToastOptions\n} from '../types';\nimport { Default, canBeRendered, isId } from '../utils';\nimport { ContainerObserver, createContainerObserver } from './containerObserver';\n\ninterface EnqueuedToast {\n content: ToastContent<any>;\n options: NotValidatedToastProps;\n}\n\ninterface RemoveParams {\n id?: Id;\n containerId: Id;\n}\n\nconst containers = new Map<Id, ContainerObserver>();\nlet renderQueue: EnqueuedToast[] = [];\nconst listeners = new Set<OnChangeCallback>();\n\nconst dispatchChanges = (data: ToastItem) => listeners.forEach(cb => cb(data));\n\nconst hasContainers = () => containers.size > 0;\n\nfunction flushRenderQueue() {\n renderQueue.forEach(v => pushToast(v.content, v.options));\n renderQueue = [];\n}\n\nexport const getToast = (id: Id, { containerId }: ToastOptions) =>\n containers.get(containerId || Default.CONTAINER_ID)?.toasts.get(id);\n\nexport function isToastActive(id: Id, containerId?: Id) {\n if (containerId) return !!containers.get(containerId)?.isToastActive(id);\n\n let isActive = false;\n containers.forEach(c => {\n if (c.isToastActive(id)) isActive = true;\n });\n\n return isActive;\n}\n\nexport function removeToast(params?: Id | RemoveParams) {\n if (!hasContainers()) {\n renderQueue = renderQueue.filter(v => params != null && v.options.toastId !== params);\n return;\n }\n\n if (params == null || isId(params)) {\n containers.forEach(c => {\n c.removeToast(params as Id);\n });\n } else if (params && ('containerId' in params || 'id' in params)) {\n const container = containers.get(params.containerId);\n container\n ? container.removeToast(params.id)\n : containers.forEach(c => {\n c.removeToast(params.id);\n });\n }\n}\n\nexport const clearWaitingQueue = (p: ClearWaitingQueueParams = {}) => {\n containers.forEach(c => {\n if (c.props.limit && (!p.containerId || c.id === p.containerId)) {\n c.clearQueue();\n }\n });\n};\n\nexport function pushToast<TData>(content: ToastContent<TData>, options: NotValidatedToastProps) {\n if (!canBeRendered(content)) return;\n if (!hasContainers()) renderQueue.push({ content, options });\n\n containers.forEach(c => {\n c.buildToast(content, options);\n });\n}\n\ninterface ToggleToastParams {\n id?: Id;\n containerId?: Id;\n}\n\ntype RegisterToggleOpts = {\n id: Id;\n containerId?: Id;\n fn: (v: boolean) => void;\n};\n\nexport function registerToggle(opts: RegisterToggleOpts) {\n containers.get(opts.containerId || Default.CONTAINER_ID)?.setToggle(opts.id, opts.fn);\n}\n\nexport function toggleToast(v: boolean, opt?: ToggleToastParams) {\n containers.forEach(c => {\n if (opt == null || !opt?.containerId) {\n c.toggle(v, opt?.id);\n } else if (opt?.containerId === c.id) {\n c.toggle(v, opt?.id);\n }\n });\n}\n\nexport function registerContainer(props: ToastContainerProps) {\n const id = props.containerId || Default.CONTAINER_ID;\n return {\n subscribe(notify: () => void) {\n const container = createContainerObserver(id, props, dispatchChanges);\n\n containers.set(id, container);\n const unobserve = container.observe(notify);\n flushRenderQueue();\n\n return () => {\n unobserve();\n containers.delete(id);\n };\n },\n setProps(p: ToastContainerProps) {\n containers.get(id)?.setProps(p);\n },\n getSnapshot() {\n return containers.get(id)?.getSnapshot();\n }\n };\n}\n\nexport function onChange(cb: OnChangeCallback) {\n listeners.add(cb);\n\n return () => {\n listeners.delete(cb);\n };\n}\n","import {\n ClearWaitingQueueFunc,\n Id,\n IdOpts,\n NotValidatedToastProps,\n OnChangeCallback,\n ToastContent,\n ToastOptions,\n ToastProps,\n TypeOptions,\n UpdateOptions\n} from '../types';\nimport { isFn, isNum, isStr, Type } from '../utils';\nimport { genToastId } from './genToastId';\nimport { clearWaitingQueue, getToast, isToastActive, onChange, pushToast, removeToast, toggleToast } from './store';\n\n/**\n * Generate a toastId or use the one provided\n */\nfunction getToastId<TData>(options?: ToastOptions<TData>) {\n return options && (isStr(options.toastId) || isNum(options.toastId)) ? options.toastId : genToastId();\n}\n\n/**\n * If the container is not mounted, the toast is enqueued\n */\nfunction dispatchToast<TData>(content: ToastContent<TData>, options: NotValidatedToastProps): Id {\n pushToast(content, options);\n return options.toastId;\n}\n\n/**\n * Merge provided options with the defaults settings and generate the toastId\n */\nfunction mergeOptions<TData>(type: string, options?: ToastOptions<TData>) {\n return {\n ...options,\n type: (options && options.type) || type,\n toastId: getToastId(options)\n } as NotValidatedToastProps;\n}\n\nfunction createToastByType(type: string) {\n return <TData = unknown>(content: ToastContent<TData>, options?: ToastOptions<TData>) =>\n dispatchToast(content, mergeOptions(type, options));\n}\n\nfunction toast<TData = unknown>(content: ToastContent<TData>, options?: ToastOptions<TData>) {\n return dispatchToast(content, mergeOptions(Type.DEFAULT, options));\n}\n\ntoast.loading = <TData = unknown>(content: ToastContent<TData>, options?: ToastOptions<TData>) =>\n dispatchToast(\n content,\n mergeOptions(Type.DEFAULT, {\n isLoading: true,\n autoClose: false,\n closeOnClick: false,\n closeButton: false,\n draggable: false,\n ...options\n })\n );\n\nexport interface ToastPromiseParams<TData = unknown, TError = unknown, TPending = unknown> {\n pending?: string | UpdateOptions<TPending>;\n success?: string | UpdateOptions<TData>;\n error?: string | UpdateOptions<TError>;\n}\n\nfunction handlePromise<TData = unknown, TError = unknown, TPending = unknown>(\n promise: Promise<TData> | (() => Promise<TData>),\n { pending, error, success }: ToastPromiseParams<TData, TError, TPending>,\n options?: ToastOptions<TData>\n) {\n let id: Id;\n\n if (pending) {\n id = isStr(pending)\n ? toast.loading(pending, options)\n : toast.loading(pending.render, {\n ...options,\n ...(pending as ToastOptions)\n } as ToastOptions<TPending>);\n }\n\n const resetParams = {\n isLoading: null,\n autoClose: null,\n closeOnClick: null,\n closeButton: null,\n draggable: null\n };\n\n const resolver = <T>(type: TypeOptions, input: string | UpdateOptions<T> | undefined, result: T) => {\n // Remove the toast if the input has not been provided. This prevents the toast from hanging\n // in the pending state if a success/error toast has not been provided.\n if (input == null) {\n toast.dismiss(id);\n return;\n }\n\n const baseParams = {\n type,\n ...resetParams,\n ...options,\n data: result\n };\n const params = isStr(input) ? { render: input } : input;\n\n // if the id is set we know that it's an update\n if (id) {\n toast.update(id, {\n ...baseParams,\n ...params\n } as UpdateOptions);\n } else {\n // using toast.promise without loading\n toast(params!.render, {\n ...baseParams,\n ...params\n } as ToastOptions<T>);\n }\n\n return result;\n };\n\n const p = isFn(promise) ? promise() : promise;\n\n //call the resolvers only when needed\n p.then(result => resolver('success', success, result)).catch(err => resolver('error', error, err));\n\n return p;\n}\n\n/**\n * Supply a promise or a function that return a promise and the notification will be updated if it resolves or fails.\n * When the promise is pending a spinner is displayed by default.\n * `toast.promise` returns the provided promise so you can chain it.\n *\n * Simple example:\n *\n * ```\n * toast.promise(MyPromise,\n * {\n * pending: 'Promise is pending',\n * success: 'Promise resolved 👌',\n * error: 'Promise rejected 🤯'\n * }\n * )\n *\n * ```\n *\n * Advanced usage:\n * ```\n * toast.promise<{name: string}, {message: string}, undefined>(\n * resolveWithSomeData,\n * {\n * pending: {\n * render: () => \"I'm loading\",\n * icon: false,\n * },\n * success: {\n * render: ({data}) => `Hello ${data.name}`,\n * icon: \"🟢\",\n * },\n * error: {\n * render({data}){\n * // When the promise reject, data will contains the error\n * return <MyErrorComponent message={data.message} />\n * }\n * }\n * }\n * )\n * ```\n */\ntoast.promise = handlePromise;\ntoast.success = createToastByType(Type.SUCCESS);\ntoast.info = createToastByType(Type.INFO);\ntoast.error = createToastByType(Type.ERROR);\ntoast.warning = createToastByType(Type.WARNING);\ntoast.warn = toast.warning;\ntoast.dark = (content: ToastContent, options?: ToastOptions) =>\n dispatchToast(\n content,\n mergeOptions(Type.DEFAULT, {\n theme: 'dark',\n ...options\n })\n );\n\ninterface RemoveParams {\n id?: Id;\n containerId: Id;\n}\n\nfunction dismiss(params: RemoveParams): void;\nfunction dismiss(params?: Id): void;\nfunction dismiss(params?: Id | RemoveParams) {\n removeToast(params);\n}\n\n/**\n * Remove toast programmatically\n *\n * - Remove all toasts:\n * ```\n * toast.dismiss()\n * ```\n *\n * - Remove all toasts that belongs to a given container\n * ```\n * toast.dismiss({ container: \"123\" })\n * ```\n *\n * - Remove toast that has a given id regardless the container\n * ```\n * toast.dismiss({ id: \"123\" })\n * ```\n *\n * - Remove toast that has a given id for a specific container\n * ```\n * toast.dismiss({ id: \"123\", containerId: \"12\" })\n * ```\n */\ntoast.dismiss = dismiss;\n\n/**\n * Clear waiting queue when limit is used\n */\ntoast.clearWaitingQueue = clearWaitingQueue as ClearWaitingQueueFunc;\n\n/**\n * Check if a toast is active\n *\n * - Check regardless the container\n * ```\n * toast.isActive(\"123\")\n * ```\n *\n * - Check in a specific container\n * ```\n * toast.isActive(\"123\", \"containerId\")\n * ```\n */\ntoast.isActive = isToastActive;\n\n/**\n * Update a toast, see https://fkhadra.github.io/react-toastify/update-toast/ for more\n *\n * Example:\n * ```\n * // With a string\n * toast.update(toastId, {\n * render: \"New content\",\n * type: \"info\",\n * });\n *\n * // Or with a component\n * toast.update(toastId, {\n * render: MyComponent\n * });\n *\n * // Or a function\n * toast.update(toastId, {\n * render: () => <div>New content</div>\n * });\n *\n * // Apply a transition\n * toast.update(toastId, {\n * render: \"New Content\",\n * type: toast.TYPE.INFO,\n * transition: Rotate\n * })\n * ```\n */\ntoast.update = <TData = unknown>(toastId: Id, options: UpdateOptions<TData> = {}) => {\n const toast = getToast(toastId, options as ToastOptions);\n\n if (toast) {\n const { props: oldOptions, content: oldContent } = toast;\n\n const nextOptions = {\n delay: 100,\n ...oldOptions,\n ...options,\n toastId: options.toastId || toastId,\n updateId: genToastId()\n } as ToastProps & UpdateOptions;\n\n if (nextOptions.toastId !== toastId) nextOptions.staleId = toastId;\n\n const content = nextOptions.render || oldContent;\n delete nextOptions.render;\n\n dispatchToast(content, nextOptions);\n }\n};\n\n/**\n * Used for controlled progress bar. It will automatically close the notification.\n *\n * If you don't want your notification to be clsoed when the timer is done you should use `toast.update` instead as follow instead:\n *\n * ```\n * toast.update(id, {\n * progress: null, // remove controlled progress bar\n * render: \"ok\",\n * type: \"success\",\n * autoClose: 5000 // set autoClose to the desired value\n * });\n * ```\n */\ntoast.done = (id: Id) => {\n toast.update(id, {\n progress: 1\n });\n};\n\n/**\n * Subscribe to change when a toast is added, removed and updated\n *\n * Usage:\n * ```\n * const unsubscribe = toast.onChange((payload) => {\n * switch (payload.status) {\n * case \"added\":\n * // new toast added\n * break;\n * case \"updated\":\n * // toast updated\n * break;\n * case \"removed\":\n * // toast has been removed\n * break;\n * }\n * })\n * ```\n */\ntoast.onChange = onChange as (cb: OnChangeCallback) => () => void;\n\n/**\n * Play a toast(s) timer progammatically\n *\n * Usage:\n *\n * - Play all toasts\n * ```\n * toast.play()\n * ```\n *\n * - Play all toasts for a given container\n * ```\n * toast.play({ containerId: \"123\" })\n * ```\n *\n * - Play toast that has a given id regardless the container\n * ```\n * toast.play({ id: \"123\" })\n * ```\n *\n * - Play toast that has a given id for a specific container\n * ```\n * toast.play({ id: \"123\", containerId: \"12\" })\n * ```\n */\ntoast.play = (opts?: IdOpts) => toggleToast(true, opts);\n\n/**\n * Pause a toast(s) timer progammatically\n *\n * Usage:\n *\n * - Pause all toasts\n * ```\n * toast.pause()\n * ```\n *\n * - Pause all toasts for a given container\n * ```\n * toast.pause({ containerId: \"123\" })\n * ```\n *\n * - Pause toast that has a given id regardless the container\n * ```\n * toast.pause({ id: \"123\" })\n * ```\n *\n * - Pause toast that has a given id for a specific container\n * ```\n * toast.pause({ id: \"123\", containerId: \"12\" })\n * ```\n */\ntoast.pause = (opts?: IdOpts) => toggleToast(false, opts);\n\nexport { toast };\n","import { DOMAttributes, useEffect, useRef, useState } from 'react';\n\nimport { ToastProps } from '../types';\nimport { Default, Direction } from '../utils';\nimport { registerToggle } from '../core/store';\n\ninterface Draggable {\n start: number;\n delta: number;\n removalDistance: number;\n canCloseOnClick: boolean;\n canDrag: boolean;\n didMove: boolean;\n}\n\nexport function useToast(props: ToastProps) {\n const [isRunning, setIsRunning] = useState(false);\n const [preventExitTransition, setPreventExitTransition] = useState(false);\n const toastRef = useRef<HTMLDivElement>(null);\n const drag = useRef<Draggable>({\n start: 0,\n delta: 0,\n removalDistance: 0,\n canCloseOnClick: true,\n canDrag: false,\n didMove: false\n }).current;\n const { autoClose, pauseOnHover, closeToast, onClick, closeOnClick } = props;\n\n registerToggle({\n id: props.toastId,\n containerId: props.containerId,\n fn: setIsRunning\n });\n\n useEffect(() => {\n if (props.pauseOnFocusLoss) {\n bindFocusEvents();\n\n return () => {\n unbindFocusEvents();\n };\n }\n }, [props.pauseOnFocusLoss]);\n\n function bindFocusEvents() {\n if (!document.hasFocus()) pauseToast();\n\n window.addEventListener('focus', playToast);\n window.addEventListener('blur', pauseToast);\n }\n\n function unbindFocusEvents() {\n window.removeEventListener('focus', playToast);\n window.removeEventListener('blur', pauseToast);\n }\n\n function onDragStart(e: React.PointerEvent<HTMLElement>) {\n if (props.draggable === true || props.draggable === e.pointerType) {\n bindDragEvents();\n const toast = toastRef.current!;\n drag.canCloseOnClick = true;\n drag.canDrag = true;\n toast.style.transition = 'none';\n\n if (props.draggableDirection === Direction.X) {\n drag.start = e.clientX;\n drag.removalDistance = toast.offsetWidth * (props.draggablePercent / 100);\n } else {\n drag.start = e.clientY;\n drag.removalDistance =\n (toast.offsetHeight *\n (props.draggablePercent === Default.DRAGGABLE_PERCENT\n ? props.draggablePercent * 1.5\n : props.draggablePercent)) /\n 100;\n }\n }\n }\n\n function onDragTransitionEnd(e: React.PointerEvent<HTMLElement>) {\n const { top, bottom, left, right } = toastRef.current!.getBoundingClientRect();\n\n if (\n e.nativeEvent.type !== 'touchend' &&\n props.pauseOnHover &&\n e.clientX >= left &&\n e.clientX <= right &&\n e.clientY >= top &&\n e.clientY <= bottom\n ) {\n pauseToast();\n } else {\n playToast();\n }\n }\n\n function playToast() {\n setIsRunning(true);\n }\n\n function pauseToast() {\n setIsRunning(false);\n }\n\n function bindDragEvents() {\n drag.didMove = false;\n document.addEventListener('pointermove', onDragMove);\n document.addEventListener('pointerup', onDragEnd);\n }\n\n function unbindDragEvents() {\n document.removeEventListener('pointermove', onDragMove);\n document.removeEventListener('pointerup', onDragEnd);\n }\n\n function onDragMove(e: PointerEvent) {\n const toast = toastRef.current!;\n if (drag.canDrag && toast) {\n drag.didMove = true;\n if (isRunning) pauseToast();\n if (props.draggableDirection === Direction.X) {\n drag.delta = e.clientX - drag.start;\n } else {\n drag.delta = e.clientY - drag.start;\n }\n\n // prevent false positive during a toast click\n if (drag.start !== e.clientX) drag.canCloseOnClick = false;\n const translate =\n props.draggableDirection === 'x' ? `${drag.delta}px, var(--y)` : `0, calc(${drag.delta}px + var(--y))`;\n toast.style.transform = `translate3d(${translate},0)`;\n toast.style.opacity = `${1 - Math.abs(drag.delta / drag.removalDistance)}`;\n }\n }\n\n function onDragEnd() {\n unbindDragEvents();\n const toast = toastRef.current!;\n if (drag.canDrag && drag.didMove && toast) {\n drag.canDrag = false;\n if (Math.abs(drag.delta) > drag.removalDistance) {\n setPreventExitTransition(true);\n props.closeToast(true);\n props.collapseAll();\n return;\n }\n\n toast.style.transition = 'transform 0.2s, opacity 0.2s';\n toast.style.removeProperty('transform');\n toast.style.removeProperty('opacity');\n }\n }\n\n const eventHandlers: DOMAttributes<HTMLElement> = {\n onPointerDown: onDragStart,\n onPointerUp: onDragTransitionEnd\n };\n\n if (autoClose && pauseOnHover) {\n eventHandlers.onMouseEnter = pauseToast;\n\n // progress control is delegated to the container\n if (!props.stacked) eventHandlers.onMouseLeave = playToast;\n }\n\n // prevent toast from closing when user drags the toast\n if (closeOnClick) {\n eventHandlers.onClick = (e: React.MouseEvent) => {\n onClick && onClick(e);\n drag.canCloseOnClick && closeToast(true);\n };\n }\n\n return {\n playToast,\n pauseToast,\n isRunning,\n preventExitTransition,\n toastRef,\n eventHandlers\n };\n}\n","import { useEffect, useLayoutEffect } from 'react';\n\nexport const useIsomorphicLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;\n","import React, { cloneElement, isValidElement } from 'react';\n\nimport { Theme, ToastProps, TypeOptions } from '../types';\nimport { Default, isFn } from '../utils';\n\n/**\n * Used when providing custom icon\n */\nexport interface IconProps {\n theme: Theme;\n type: TypeOptions;\n isLoading?: boolean;\n}\n\nexport type BuiltInIconProps = React.SVGProps<SVGSVGElement> & IconProps;\n\nconst Svg: React.FC<BuiltInIconProps> = ({ theme, type, isLoading, ...rest }) => (\n <svg\n viewBox=\"0 0 24 24\"\n width=\"100%\"\n height=\"100%\"\n fill={theme === 'colored' ? 'currentColor' : `var(--toastify-icon-color-${type})`}\n {...rest}\n />\n);\n\nfunction Warning(props: BuiltInIconProps) {\n return (\n <Svg {...props}>\n <path d=\"M23.32 17.191L15.438 2.184C14.728.833 13.416 0 11.996 0c-1.42 0-2.733.833-3.443 2.184L.533 17.448a4.744 4.744 0 000 4.368C1.243 23.167 2.555 24 3.975 24h16.05C22.22 24 24 22.044 24 19.632c0-.904-.251-1.746-.68-2.44zm-9.622 1.46c0 1.033-.724 1.823-1.698 1.823s-1.698-.79-1.698-1.822v-.043c0-1.028.724-1.822 1.698-1.822s1.698.79 1.698 1.822v.043zm.039-12.285l-.84 8.06c-.057.581-.408.943-.897.943-.49 0-.84-.367-.896-.942l-.84-8.065c-.057-.624.25-1.095.779-1.095h1.91c.528.005.84.476.784 1.1z\" />\n </Svg>\n );\n}\n\nfunction Info(props: BuiltInIconProps) {\n return (\n <Svg {...props}>\n <path d=\"M12 0a12 12 0 1012 12A12.013 12.013 0 0012 0zm.25 5a1.5 1.5 0 11-1.5 1.5 1.5 1.5 0 011.5-1.5zm2.25 13.5h-4a1 1 0 010-2h.75a.25.25 0 00.25-.25v-4.5a.25.25 0 00-.25-.25h-.75a1 1 0 010-2h1a2 2 0 012 2v4.75a.25.25 0 00.25.25h.75a1 1 0 110 2z\" />\n </Svg>\n );\n}\n\nfunction Success(props: BuiltInIconProps) {\n return (\n <Svg {...props}>\n <path d=\"M12 0a12 12 0 1012 12A12.014 12.014 0 0012 0zm6.927 8.2l-6.845 9.289a1.011 1.011 0 01-1.43.188l-4.888-3.908a1 1 0 111.25-1.562l4.076 3.261 6.227-8.451a1 1 0 111.61 1.183z\" />\n </Svg>\n );\n}\n\nfunction Error(props: BuiltInIconProps) {\n return (\n <Svg {...props}>\n <path d=\"M11.983 0a12.206 12.206 0 00-8.51 3.653A11.8 11.8 0 000 12.207 11.779 11.779 0 0011.8 24h.214A12.111 12.111 0 0024 11.791 11.766 11.766 0 0011.983 0zM10.5 16.542a1.476 1.476 0 011.449-1.53h.027a1.527 1.527 0 011.523 1.47 1.475 1.475 0 01-1.449 1.53h-.027a1.529 1.529 0 01-1.523-1.47zM11 12.5v-6a1 1 0 012 0v6a1 1 0 11-2 0z\" />\n </Svg>\n );\n}\n\nfunction Spinner() {\n return <div className={`${Default.CSS_NAMESPACE}__spinner`} />;\n}\n\nexport const Icons = {\n info: Info,\n warning: Warning,\n success: Success,\n error: Error,\n spinner: Spinner\n};\n\nconst maybeIcon = (type: string): type is keyof typeof Icons => type in Icons;\n\nexport type IconParams = Pick<ToastProps, 'theme' | 'icon' | 'type' | 'isLoading'>;\n\nexport function getIcon({ theme, type, isLoading, icon }: IconParams) {\n let Icon: React.ReactNode = null;\n const iconProps = { theme, type };\n\n if (icon === false) {\n // hide\n } else if (isFn(icon)) {\n Icon = icon({ ...iconProps, isLoading });\n } else if (isValidElement(icon)) {\n Icon = cloneElement(icon, iconProps);\n } else if (isLoading) {\n Icon = Icons.spinner();\n } else if (maybeIcon(type)) {\n Icon = Icons[type](iconProps);\n }\n\n return Icon;\n}\n","import cx from 'clsx';\nimport React, { cloneElement, isValidElement } from 'react';\n\nimport { useToast } from '../hooks/useToast';\nimport { ToastProps } from '../types';\nimport { Default, isFn, renderContent } from '../utils';\nimport { CloseButton } from './CloseButton';\nimport { ProgressBar } from './ProgressBar';\nimport { getIcon } from './Icons';\n\nexport const Toast: React.FC<ToastProps> = props => {\n const { isRunning, preventExitTransition, toastRef, eventHandlers, playToast } = useToast(props);\n const {\n closeButton,\n children,\n autoClose,\n onClick,\n type,\n hideProgressBar,\n closeToast,\n transition: Transition,\n position,\n className,\n style,\n progressClassName,\n updateId,\n role,\n progress,\n rtl,\n toastId,\n deleteToast,\n isIn,\n isLoading,\n closeOnClick,\n theme,\n ariaLabel\n } = props;\n const defaultClassName = cx(\n `${Default.CSS_NAMESPACE}__toast`,\n `${Default.CSS_NAMESPACE}__toast-theme--${theme}`,\n `${Default.CSS_NAMESPACE}__toast--${type}`,\n {\n [`${Default.CSS_NAMESPACE}__toast--rtl`]: rtl\n },\n {\n [`${Default.CSS_NAMESPACE}__toast--close-on-click`]: closeOnClick\n }\n );\n const cssClasses = isFn(className)\n ? className({\n rtl,\n position,\n type,\n defaultClassName\n })\n : cx(defaultClassName, className);\n const icon = getIcon(props);\n const isProgressControlled = !!progress || !autoClose;\n\n const closeButtonProps = { closeToast, type, theme };\n let Close: React.ReactNode = null;\n\n if (closeButton === false) {\n // hide\n } else if (isFn(closeButton)) {\n Close = closeButton(closeButtonProps);\n } else if (isValidElement(closeButton)) {\n Close = cloneElement(closeButton, closeButtonProps);\n } else {\n Close = CloseButton(closeButtonProps);\n }\n\n return (\n <Transition\n isIn={isIn}\n done={deleteToast}\n position={position}\n preventExitTransition={preventExitTransition}\n nodeRef={toastRef}\n playToast={playToast}\n >\n <div\n id={toastId as string}\n tabIndex={0}\n onClick={onClick}\n data-in={isIn}\n className={cssClasses}\n {...eventHandlers}\n style={style}\n ref={toastRef}\n {...(isIn && { role: role, 'aria-label': ariaLabel })}\n >\n {icon != null && (\n <div\n className={cx(`${Default.CSS_NAMESPACE}__toast-icon`, {\n [`${Default.CSS_NAMESPACE}--animate-icon ${Default.CSS_NAMESPACE}__zoom-enter`]: !isLoading\n })}\n >\n {icon}\n </div>\n )}\n {renderContent(children, props, !isRunning)}\n {Close}\n {!props.customProgressBar && (\n <ProgressBar\n {...(updateId && !isProgressControlled ? { key: `p-${updateId}` } : {})}\n rtl={rtl}\n theme={theme}\n delay={autoClose as number}\n isRunning={isRunning}\n isIn={isIn}\n closeToast={closeToast}\n hide={hideProgressBar}\n type={type}\n className={progressClassName}\n controlledProgress={isProgressControlled}\n progress={progress || 0}\n />\n )}\n </div>\n </Transition>\n );\n};\n","import React from 'react';\nimport { Default } from '../utils';\nimport { CloseToastFunc, Theme, TypeOptions } from '../types';\n\nexport interface CloseButtonProps {\n closeToast: CloseToastFunc;\n type: TypeOptions;\n ariaLabel?: string;\n theme: Theme;\n}\n\nexport function CloseButton({ closeToast, theme, ariaLabel = 'close' }: CloseButtonProps) {\n return (\n <button\n className={`${Default.CSS_NAMESPACE}__close-button ${Default.CSS_NAMESPACE}__close-button--${theme}`}\n type=\"button\"\n onClick={e => {\n e.stopPropagation();\n closeToast(true);\n }}\n aria-label={ariaLabel}\n >\n <svg aria-hidden=\"true\" viewBox=\"0 0 14 16\">\n <path\n fillRule=\"evenodd\"\n d=\"M7.71 8.23l3.75 3.75-1.48 1.48-3.75-3.75-3.75 3.75L1 11.98l3.75-3.75L1 4.48 2.48 3l3.75 3.75L9.98 3l1.48 1.48-3.75 3.75z\"\n />\n </svg>\n </button>\n );\n}\n","import { cssTransition, Default } from '../utils';\n\nconst getConfig = (animationName: string, appendPosition = false) => ({\n enter: `${Default.CSS_NAMESPACE}--animate ${Default.CSS_NAMESPACE}__${animationName}-enter`,\n exit: `${Default.CSS_NAMESPACE}--animate ${Default.CSS_NAMESPACE}__${animationName}-exit`,\n appendPosition\n});\n\nconst Bounce = cssTransition(getConfig('bounce', true));\n\nconst Slide = cssTransition(getConfig('slide', true));\n\nconst Zoom = cssTransition(getConfig('zoom'));\n\nconst Flip = cssTransition(getConfig('flip'));\n\nexport { Bounce, Slide, Zoom, Flip };\n","import cx from 'clsx';\nimport React, { useEffect, useRef, useState } from 'react';\n\nimport { toast } from '../core';\nimport { useToastContainer } from '../hooks';\nimport { useIsomorphicLayoutEffect } from '../hooks/useIsomorphicLayoutEffect';\nimport { ToastContainerProps, ToastPosition } from '../types';\nimport { Default, Direction, isFn, parseClassName } from '../utils';\nimport { Toast } from './Toast';\nimport { Bounce } from './Transitions';\n\nexport const defaultProps: ToastContainerProps = {\n position: 'top-right',\n transition: Bounce,\n autoClose: 5000,\n closeButton: true,\n pauseOnHover: true,\n pauseOnFocusLoss: true,\n draggable: 'touch',\n draggablePercent: Default.DRAGGABLE_PERCENT as number,\n draggableDirection: Direction.X,\n role: 'alert',\n theme: 'light',\n 'aria-label': 'Notifications Alt+T',\n hotKeys: e => e.altKey && e.code === 'KeyT'\n};\n\nexport function ToastContainer(props: ToastContainerProps) {\n let containerProps: ToastContainerProps = {\n ...defaultProps,\n ...props\n };\n const stacked = props.stacked;\n const [collapsed, setIsCollapsed] = useState(true);\n const containerRef = useRef<HTMLDivElement>(null);\n const { getToastToRender, isToastActive, count } = useToastContainer(containerProps);\n const { className, style, rtl, containerId, hotKeys } = containerProps;\n\n function getClassName(position: ToastPosition) {\n const defaultClassName = cx(\n `${Default.CSS_NAMESPACE}__toast-container`,\n `${Default.CSS_NAMESPACE}__toast-container--${position}`,\n { [`${Default.CSS_NAMESPACE}__toast-container--rtl`]: rtl }\n );\n return isFn(className)\n ? className({\n position,\n rtl,\n defaultClassName\n })\n : cx(defaultClassName, parseClassName(className));\n }\n\n function collapseAll() {\n if (stacked) {\n setIsCollapsed(true);\n toast.play();\n }\n }\n\n useIsomorphicLayoutEffect(() => {\n if (stacked) {\n const nodes = containerRef.current!.querySelectorAll('[data-in=\"true\"]');\n const gap = 12;\n const isTop = containerProps.position?.includes('top');\n let usedHeight = 0;\n let prevS = 0;\n\n Array.from(nodes)\n .reverse()\n .forEach((n, i) => {\n const node = n as HTMLElement;\n node.classList.add(`${Default.CSS_NAMESPACE}__toast--stacked`);\n\n if (i > 0) node.dataset.collapsed = `${collapsed}`;\n\n if (!node.dataset.pos) node.dataset.pos = isTop ? 'top' : 'bot';\n\n const y = usedHeight * (collapsed ? 0.2 : 1) + (collapsed ? 0 : gap * i);\n\n node.style.setProperty('--y', `${isTop ? y : y * -1}px`);\n node.style.setProperty('--g', `${gap}`);\n node.style.setProperty('--s', `${1 - (collapsed ? prevS : 0)}`);\n\n usedHeight += node.offsetHeight;\n prevS += 0.025;\n });\n }\n }, [collapsed, count, stacked]);\n\n useEffect(() => {\n function focusFirst(e: KeyboardEvent) {\n const node = containerRef.current;\n if (hotKeys(e)) {\n (node.querySelector('[tabIndex=\"0\"]') as HTMLElement)?.focus();\n setIsCollapsed(false);\n toast.pause();\n }\n if (e.key === 'Escape' && (document.activeElement === node || node?.contains(document.activeElement))) {\n setIsCollapsed(true);\n toast.play();\n }\n }\n\n document.addEventListener('keydown', focusFirst);\n\n return () => {\n document.removeEventListener('keydown', focusFirst);\n };\n }, [hotKeys]);\n\n return (\n <section\n ref={containerRef}\n className={Default.CSS_NAMESPACE as string}\n id={containerId as string}\n onMouseEnter={() => {\n if (stacked) {\n setIsCollapsed(false);\n toast.pause();\n }\n }}\n onMouseLeave={collapseAll}\n aria-live=\"polite\"\n aria-atomic=\"false\"\n aria-relevant=\"additions text\"\n aria-label={containerProps['aria-label']}\n >\n {getToastToRender((position, toastList) => {\n const containerStyle: React.CSSProperties = !toastList.length\n ? { ...style, pointerEvents: 'none' }\n : { ...style };\n\n return (\n <div\n tabIndex={-1}\n className={getClassName(position)}\n data-stacked={stacked}\n style={containerStyle}\n key={`c-${position}`}\n >\n {toastList.map(({ content, props: toastProps }) => {\n return (\n <Toast\n {...toastProps}\n stacked={stacked}\n collapseAll={collapseAll}\n isIn={isToastActive(toastProps.toastId, toastProps.containerId)}\n key={`t-${toastProps.key}`}\n >\n {content}\n </Toast>\n );\n })}\n </div>\n );\n })}\n </section>\n );\n}\n","import { useRef, useSyncExternalStore } from 'react';\nimport { isToastActive, registerContainer } from '../core/store';\nimport { Toast, ToastContainerProps, ToastPosition } from '../types';\n\nexport function useToastContainer(props: ToastContainerProps) {\n const { subscribe, getSnapshot, setProps } = useRef(registerContainer(props)).current;\n setProps(props);\n const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)?.slice();\n\n function getToastToRender<T>(cb: (position: ToastPosition, toastList: Toast[]) => T) {\n if (!snapshot) return [];\n\n const toRender = new Map<ToastPosition, Toast[]>();\n\n if (props.newestOnTop) snapshot.reverse();\n\n snapshot.forEach(toast => {\n const { position } = toast.props;\n toRender.has(position) || toRender.set(position, []);\n toRender.get(position)!.push(toast);\n });\n\n return Array.from(toRender, p => cb(p[0], p[1]));\n }\n\n return {\n getToastToRender,\n isToastActive,\n count: snapshot?.length\n };\n}\n","/* @flow */\n\nimport { Messenger, MessengerEvents } from '@ntg/utils/dist/messenger';\nimport { type NOTIFICATION, type NOTIFICATION_MESSAGE, type NOTIFICATION_SETTINGS, type NOTIFICATION_TYPE, TOAST } from './types';\nimport { flattenNotificationMessage, logInfo } from '../debug/debug';\nimport { toast } from 'react-toastify';\n\nconst DEFAULT_CLOSE_DELAY = 5_000;\n\nexport default class Notifier {\n // eslint-disable-next-line no-use-before-define\n static instance: Notifier;\n\n static isDebugModeEnabled: boolean = false;\n\n constructor() {\n Messenger.on(MessengerEvents.NOTIFY_ERROR, this.notifyError);\n Messenger.on(MessengerEvents.NOTIFY_INFO, this.notifyInfo);\n Messenger.on(MessengerEvents.NOTIFY_SUCCESS, this.notifySuccess);\n Messenger.on(MessengerEvents.NOTIFY_WARNING, this.notifyWarning);\n Messenger.on(MessengerEvents.NOTIFY_CLOSE, this.notifyClose);\n }\n\n // $FlowFixMe: Flow does not support symbols yet\n get [Symbol.toStringTag]() {\n return 'Notifier';\n }\n\n static initialize: (isDebugModeEnabled: boolean) => void = (isDebugModeEnabled) => {\n if (Notifier.instance) {\n return;\n }\n\n Notifier.isDebugModeEnabled = isDebugModeEnabled;\n Notifier.instance = new Notifier();\n };\n\n notifyError: (message: NOTIFICATION_MESSAGE, settings?: NOTIFICATION_SETTINGS) => void = (message, settings) => {\n this.notify(\n {\n message,\n settings,\n },\n TOAST.Error,\n );\n };\n\n notifyInfo: (message: NOTIFICATION_MESSAGE, settings?: NOTIFICATION_SETTINGS) => void = (message, settings) => {\n this.notify(\n {\n message,\n settings,\n },\n TOAST.Info,\n );\n };\n\n notifySuccess: (message: NOTIFICATION_MESSAGE, settings?: NOTIFICATION_SETTINGS) => void = (message, settings) => {\n this.notify(\n {\n message,\n settings,\n },\n TOAST.Success,\n );\n };\n\n notifyWarning: (message: NOTIFICATION_MESSAGE, settings?: NOTIFICATION_SETTINGS) => void = (message, settings) => {\n this.notify(\n {\n message,\n settings,\n },\n TOAST.Warning,\n );\n };\n\n notify: (notification: NOTIFICATION, type: NOTIFICATION_TYPE) => void = (notification, type) => {\n const { message, settings = {} } = notification;\n\n // QA\n if (Notifier.isDebugModeEnabled && (type === 'warning' || type === 'error')) {\n logInfo(`Notification: ${type} | ${flattenNotificationMessage(notification.message)}`);\n }\n\n const { toastId } = settings;\n\n if (toast.isActive(toastId)) {\n // Update existing\n toast.update(toastId, {\n ...settings,\n render: message,\n type,\n });\n } else {\n // Create toast\n toast(message, {\n ...settings,\n type,\n });\n }\n };\n\n notifyClose: (toastId: string, delay?: number) => void = (toastId, delay) => {\n setTimeout(() => toast.dismiss(toastId), delay ?? DEFAULT_CLOSE_DELAY);\n };\n}\n","/* @flow */\n\nimport type { DmsSettingMap, NETGEM_API_DMS_DEVICE_INFO_SETTINGS } from '../../libs/netgemLibrary/dms/types/DeviceInfoSettings';\nimport { Drm, getFirstSupportedDrm } from '../jsHelpers/Drm';\nimport type { KeyValuePair } from '@ntg/utils/dist/types';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport { capitalizeFirstLetter } from '@ntg/utils/dist/string';\nimport { detect as detectBrowser } from 'detect-browser';\n\nconst getDeviceAndBrowser: () => {|\n browserVersion: string,\n deviceName: string,\n|} = () => {\n let deviceName = Localizer.localize('authentication.my_device');\n let browserVersion = '';\n\n const browser = detectBrowser();\n if (browser) {\n browserVersion = browser.version;\n\n if (browser.name && browser.os) {\n deviceName = Localizer.localize('authentication.browser_and_os', {\n browser: capitalizeFirstLetter(browser.name),\n os: capitalizeFirstLetter(browser.os),\n });\n } else if (browser.name) {\n deviceName = capitalizeFirstLetter(browser.name);\n }\n }\n\n return {\n browserVersion,\n deviceName,\n };\n};\n\nconst getDeviceOS: () => string =\n // eslint-disable-next-line consistent-return\n () => {\n const drm = getFirstSupportedDrm();\n\n if (drm === undefined) {\n // Default value needs to be set because of Google bots\n return process.env.REACT_APP_DRM_WIDEVINE_NAME ?? 'dsktp-widevine';\n }\n\n switch (drm) {\n case Drm.Fairplay:\n return process.env.REACT_APP_DRM_FAIRPLAY_NAME ?? 'dsktp-fairplay';\n case Drm.Playready:\n return process.env.REACT_APP_DRM_PLAYREADY_NAME ?? 'dsktp-playready';\n case Drm.Widevine:\n return process.env.REACT_APP_DRM_WIDEVINE_NAME ?? 'dsktp-widevine';\n\n // No default\n }\n };\n\nconst addGtmData: (params: KeyValuePair<string>) => void = (params) => {\n const urlParams = new URLSearchParams(location.search);\n const utmSource = urlParams.get('utm_source');\n const utmMedium = urlParams.get('utm_medium');\n const utmCampaign = urlParams.get('utm_campaign');\n\n if (utmSource) {\n params.utm_source = utmSource; // eslint-disable-line camelcase\n }\n\n if (utmMedium) {\n params.utm_medium = utmMedium; // eslint-disable-line camelcase\n }\n\n if (utmCampaign) {\n params.utm_campaign = utmCampaign; // eslint-disable-line camelcase\n }\n};\n\nconst buildDeviceUrl: (deviceId: string, url?: string) => ?string = (deviceId, url) => {\n if (!url || deviceId === '') {\n return null;\n }\n\n const { browserVersion, deviceName } = getDeviceAndBrowser();\n\n const params = {\n appversion: '',\n deviceid: deviceId,\n devicemodel: 'html5',\n devicename: deviceName,\n deviceos: getDeviceOS(),\n deviceosversion: browserVersion,\n webview: 'false',\n };\n\n addGtmData(params);\n\n const localUrl = new URL(url);\n Object.entries(params).forEach(([key, value]) => localUrl.searchParams.set(key, ((value: any): string)));\n\n return localUrl.toString();\n};\n\nconst areSectionSettingsEqual: (settings1: Array<NETGEM_API_DMS_DEVICE_INFO_SETTINGS>, settings2: Array<NETGEM_API_DMS_DEVICE_INFO_SETTINGS>) => boolean = (settings1, settings2) => {\n if (settings1.length !== settings2.length) {\n return false;\n }\n\n const map1 = new Map(settings1.map((s) => [s.name, s.value]));\n const map2 = new Map(settings2.map((s) => [s.name, s.value]));\n const keys1 = map1.keys();\n\n for (const key of keys1) {\n const val1 = map1.get(key);\n const val2 = map2.get(key);\n if (val2 !== val1) {\n return false;\n }\n }\n\n return true;\n};\n\nconst areSettingsEqual: (settings1: ?DmsSettingMap, settings2: ?DmsSettingMap) => boolean = (settings1, settings2) => {\n if (settings1 === settings2) {\n return true;\n }\n\n if (!settings1 || !settings2) {\n return false;\n }\n\n const keys1 = Object.keys(settings1);\n const keys2 = Object.keys(settings2);\n\n if (keys1.length !== keys2.length) {\n return false;\n }\n\n for (const key of keys1) {\n const val1 = settings1[key];\n const val2 = settings2[key];\n if (!Array.isArray(val1) || !Array.isArray(val2)) {\n return false;\n }\n\n if (!areSectionSettingsEqual(val1, val2)) {\n return false;\n }\n }\n\n return true;\n};\n\nexport { areSettingsEqual, buildDeviceUrl, getDeviceOS };\n","import checkPrivateRedeclaration from \"./checkPrivateRedeclaration.js\";\nfunction _classPrivateFieldInitSpec(e, t, a) {\n checkPrivateRedeclaration(e, t), t.set(e, a);\n}\nexport { _classPrivateFieldInitSpec as default };","function _checkPrivateRedeclaration(e, t) {\n if (t.has(e)) throw new TypeError(\"Cannot initialize the same private elements twice on an object\");\n}\nexport { _checkPrivateRedeclaration as default };","function _assertClassBrand(e, t, n) {\n if (\"function\" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n;\n throw new TypeError(\"Private element is not present on this object\");\n}\nexport { _assertClassBrand as default };","import assertClassBrand from \"./assertClassBrand.js\";\nfunction _classPrivateFieldGet2(s, a) {\n return s.get(assertClassBrand(s, a));\n}\nexport { _classPrivateFieldGet2 as default };","import assertClassBrand from \"./assertClassBrand.js\";\nfunction _classPrivateFieldSet2(s, a, r) {\n return s.set(assertClassBrand(s, a), r), r;\n}\nexport { _classPrivateFieldSet2 as default };","export const encoder = new TextEncoder();\nexport const decoder = new TextDecoder();\nconst MAX_INT32 = 2 ** 32;\nexport function concat(...buffers) {\n const size = buffers.reduce((acc, { length }) => acc + length, 0);\n const buf = new Uint8Array(size);\n let i = 0;\n for (const buffer of buffers) {\n buf.set(buffer, i);\n i += buffer.length;\n }\n return buf;\n}\nfunction writeUInt32BE(buf, value, offset) {\n if (value < 0 || value >= MAX_INT32) {\n throw new RangeError(`value must be >= 0 and <= ${MAX_INT32 - 1}. Received ${value}`);\n }\n buf.set([value >>> 24, value >>> 16, value >>> 8, value & 0xff], offset);\n}\nexport function uint64be(value) {\n const high = Math.floor(value / MAX_INT32);\n const low = value % MAX_INT32;\n const buf = new Uint8Array(8);\n writeUInt32BE(buf, high, 0);\n writeUInt32BE(buf, low, 4);\n return buf;\n}\nexport function uint32be(value) {\n const buf = new Uint8Array(4);\n writeUInt32BE(buf, value);\n return buf;\n}\n","import { encoder, decoder } from '../lib/buffer_utils.js';\nimport { encodeBase64, decodeBase64 } from '../lib/base64.js';\nexport function decode(input) {\n if (Uint8Array.fromBase64) {\n return Uint8Array.fromBase64(typeof input === 'string' ? input : decoder.decode(input), {\n alphabet: 'base64url',\n });\n }\n let encoded = input;\n if (encoded instanceof Uint8Array) {\n encoded = decoder.decode(encoded);\n }\n encoded = encoded.replace(/-/g, '+').replace(/_/g, '/').replace(/\\s/g, '');\n try {\n return decodeBase64(encoded);\n }\n catch {\n throw new TypeError('The input to be decoded is not correctly encoded.');\n }\n}\nexport function encode(input) {\n let unencoded = input;\n if (typeof unencoded === 'string') {\n unencoded = encoder.encode(unencoded);\n }\n if (Uint8Array.prototype.toBase64) {\n return unencoded.toBase64({ alphabet: 'base64url', omitPadding: true });\n }\n return encodeBase64(unencoded).replace(/=/g, '').replace(/\\+/g, '-').replace(/\\//g, '_');\n}\n","export function encodeBase64(input) {\n if (Uint8Array.prototype.toBase64) {\n return input.toBase64();\n }\n const CHUNK_SIZE = 0x8000;\n const arr = [];\n for (let i = 0; i < input.length; i += CHUNK_SIZE) {\n arr.push(String.fromCharCode.apply(null, input.subarray(i, i + CHUNK_SIZE)));\n }\n return btoa(arr.join(''));\n}\nexport function decodeBase64(encoded) {\n if (Uint8Array.fromBase64) {\n return Uint8Array.fromBase64(encoded);\n }\n const binary = atob(encoded);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n","export class JOSEError extends Error {\n static code = 'ERR_JOSE_GENERIC';\n code = 'ERR_JOSE_GENERIC';\n constructor(message, options) {\n super(message, options);\n this.name = this.constructor.name;\n Error.captureStackTrace?.(this, this.constructor);\n }\n}\nexport class JWTClaimValidationFailed extends JOSEError {\n static code = 'ERR_JWT_CLAIM_VALIDATION_FAILED';\n code = 'ERR_JWT_CLAIM_VALIDATION_FAILED';\n claim;\n reason;\n payload;\n constructor(message, payload, claim = 'unspecified', reason = 'unspecified') {\n super(message, { cause: { claim, reason, payload } });\n this.claim = claim;\n this.reason = reason;\n this.payload = payload;\n }\n}\nexport class JWTExpired extends JOSEError {\n static code = 'ERR_JWT_EXPIRED';\n code = 'ERR_JWT_EXPIRED';\n claim;\n reason;\n payload;\n constructor(message, payload, claim = 'unspecified', reason = 'unspecified') {\n super(message, { cause: { claim, reason, payload } });\n this.claim = claim;\n this.reason = reason;\n this.payload = payload;\n }\n}\nexport class JOSEAlgNotAllowed extends JOSEError {\n static code = 'ERR_JOSE_ALG_NOT_ALLOWED';\n code = 'ERR_JOSE_ALG_NOT_ALLOWED';\n}\nexport class JOSENotSupported extends JOSEError {\n static code = 'ERR_JOSE_NOT_SUPPORTED';\n code = 'ERR_JOSE_NOT_SUPPORTED';\n}\nexport class JWEDecryptionFailed extends JOSEError {\n static code = 'ERR_JWE_DECRYPTION_FAILED';\n code = 'ERR_JWE_DECRYPTION_FAILED';\n constructor(message = 'decryption operation failed', options) {\n super(message, options);\n }\n}\nexport class JWEInvalid extends JOSEError {\n static code = 'ERR_JWE_INVALID';\n code = 'ERR_JWE_INVALID';\n}\nexport class JWSInvalid extends JOSEError {\n static code = 'ERR_JWS_INVALID';\n code = 'ERR_JWS_INVALID';\n}\nexport class JWTInvalid extends JOSEError {\n static code = 'ERR_JWT_INVALID';\n code = 'ERR_JWT_INVALID';\n}\nexport class JWKInvalid extends JOSEError {\n static code = 'ERR_JWK_INVALID';\n code = 'ERR_JWK_INVALID';\n}\nexport class JWKSInvalid extends JOSEError {\n static code = 'ERR_JWKS_INVALID';\n code = 'ERR_JWKS_INVALID';\n}\nexport class JWKSNoMatchingKey extends JOSEError {\n static code = 'ERR_JWKS_NO_MATCHING_KEY';\n code = 'ERR_JWKS_NO_MATCHING_KEY';\n constructor(message = 'no applicable key found in the JSON Web Key Set', options) {\n super(message, options);\n }\n}\nexport class JWKSMultipleMatchingKeys extends JOSEError {\n [Symbol.asyncIterator];\n static code = 'ERR_JWKS_MULTIPLE_MATCHING_KEYS';\n code = 'ERR_JWKS_MULTIPLE_MATCHING_KEYS';\n constructor(message = 'multiple matching keys found in the JSON Web Key Set', options) {\n super(message, options);\n }\n}\nexport class JWKSTimeout extends JOSEError {\n static code = 'ERR_JWKS_TIMEOUT';\n code = 'ERR_JWKS_TIMEOUT';\n constructor(message = 'request timed out', options) {\n super(message, options);\n }\n}\nexport class JWSSignatureVerificationFailed extends JOSEError {\n static code = 'ERR_JWS_SIGNATURE_VERIFICATION_FAILED';\n code = 'ERR_JWS_SIGNATURE_VERIFICATION_FAILED';\n constructor(message = 'signature verification failed', options) {\n super(message, options);\n }\n}\n","import { JOSENotSupported } from '../util/errors.js';\nexport default (alg, algorithm) => {\n const hash = `SHA-${alg.slice(-3)}`;\n switch (alg) {\n case 'HS256':\n case 'HS384':\n case 'HS512':\n return { hash, name: 'HMAC' };\n case 'PS256':\n case 'PS384':\n case 'PS512':\n return { hash, name: 'RSA-PSS', saltLength: parseInt(alg.slice(-3), 10) >> 3 };\n case 'RS256':\n case 'RS384':\n case 'RS512':\n return { hash, name: 'RSASSA-PKCS1-v1_5' };\n case 'ES256':\n case 'ES384':\n case 'ES512':\n return { hash, name: 'ECDSA', namedCurve: algorithm.namedCurve };\n case 'Ed25519':\n case 'EdDSA':\n return { name: 'Ed25519' };\n default:\n throw new JOSENotSupported(`alg ${alg} is not supported either by JOSE or your javascript runtime`);\n }\n};\n","export default (alg, key) => {\n if (alg.startsWith('RS') || alg.startsWith('PS')) {\n const { modulusLength } = key.algorithm;\n if (typeof modulusLength !== 'number' || modulusLength < 2048) {\n throw new TypeError(`${alg} requires key modulusLength to be 2048 bits or larger`);\n }\n }\n};\n","function unusable(name, prop = 'algorithm.name') {\n return new TypeError(`CryptoKey does not support this operation, its ${prop} must be ${name}`);\n}\nfunction isAlgorithm(algorithm, name) {\n return algorithm.name === name;\n}\nfunction getHashLength(hash) {\n return parseInt(hash.name.slice(4), 10);\n}\nfunction getNamedCurve(alg) {\n switch (alg) {\n case 'ES256':\n return 'P-256';\n case 'ES384':\n return 'P-384';\n case 'ES512':\n return 'P-521';\n default:\n throw new Error('unreachable');\n }\n}\nfunction checkUsage(key, usage) {\n if (usage && !key.usages.includes(usage)) {\n throw new TypeError(`CryptoKey does not support this operation, its usages must include ${usage}.`);\n }\n}\nexport function checkSigCryptoKey(key, alg, usage) {\n switch (alg) {\n case 'HS256':\n case 'HS384':\n case 'HS512': {\n if (!isAlgorithm(key.algorithm, 'HMAC'))\n throw unusable('HMAC');\n const expected = parseInt(alg.slice(2), 10);\n const actual = getHashLength(key.algorithm.hash);\n if (actual !== expected)\n throw unusable(`SHA-${expected}`, 'algorithm.hash');\n break;\n }\n case 'RS256':\n case 'RS384':\n case 'RS512': {\n if (!isAlgorithm(key.algorithm, 'RSASSA-PKCS1-v1_5'))\n throw unusable('RSASSA-PKCS1-v1_5');\n const expected = parseInt(alg.slice(2), 10);\n const actual = getHashLength(key.algorithm.hash);\n if (actual !== expected)\n throw unusable(`SHA-${expected}`, 'algorithm.hash');\n break;\n }\n case 'PS256':\n case 'PS384':\n case 'PS512': {\n if (!isAlgorithm(key.algorithm, 'RSA-PSS'))\n throw unusable('RSA-PSS');\n const expected = parseInt(alg.slice(2), 10);\n const actual = getHashLength(key.algorithm.hash);\n if (actual !== expected)\n throw unusable(`SHA-${expected}`, 'algorithm.hash');\n break;\n }\n case 'Ed25519':\n case 'EdDSA': {\n if (!isAlgorithm(key.algorithm, 'Ed25519'))\n throw unusable('Ed25519');\n break;\n }\n case 'ES256':\n case 'ES384':\n case 'ES512': {\n if (!isAlgorithm(key.algorithm, 'ECDSA'))\n throw unusable('ECDSA');\n const expected = getNamedCurve(alg);\n const actual = key.algorithm.namedCurve;\n if (actual !== expected)\n throw unusable(expected, 'algorithm.namedCurve');\n break;\n }\n default:\n throw new TypeError('CryptoKey does not support this operation');\n }\n checkUsage(key, usage);\n}\nexport function checkEncCryptoKey(key, alg, usage) {\n switch (alg) {\n case 'A128GCM':\n case 'A192GCM':\n case 'A256GCM': {\n if (!isAlgorithm(key.algorithm, 'AES-GCM'))\n throw unusable('AES-GCM');\n const expected = parseInt(alg.slice(1, 4), 10);\n const actual = key.algorithm.length;\n if (actual !== expected)\n throw unusable(expected, 'algorithm.length');\n break;\n }\n case 'A128KW':\n case 'A192KW':\n case 'A256KW': {\n if (!isAlgorithm(key.algorithm, 'AES-KW'))\n throw unusable('AES-KW');\n const expected = parseInt(alg.slice(1, 4), 10);\n const actual = key.algorithm.length;\n if (actual !== expected)\n throw unusable(expected, 'algorithm.length');\n break;\n }\n case 'ECDH': {\n switch (key.algorithm.name) {\n case 'ECDH':\n case 'X25519':\n break;\n default:\n throw unusable('ECDH or X25519');\n }\n break;\n }\n case 'PBES2-HS256+A128KW':\n case 'PBES2-HS384+A192KW':\n case 'PBES2-HS512+A256KW':\n if (!isAlgorithm(key.algorithm, 'PBKDF2'))\n throw unusable('PBKDF2');\n break;\n case 'RSA-OAEP':\n case 'RSA-OAEP-256':\n case 'RSA-OAEP-384':\n case 'RSA-OAEP-512': {\n if (!isAlgorithm(key.algorithm, 'RSA-OAEP'))\n throw unusable('RSA-OAEP');\n const expected = parseInt(alg.slice(9), 10) || 1;\n const actual = getHashLength(key.algorithm.hash);\n if (actual !== expected)\n throw unusable(`SHA-${expected}`, 'algorithm.hash');\n break;\n }\n default:\n throw new TypeError('CryptoKey does not support this operation');\n }\n checkUsage(key, usage);\n}\n","function message(msg, actual, ...types) {\n types = types.filter(Boolean);\n if (types.length > 2) {\n const last = types.pop();\n msg += `one of type ${types.join(', ')}, or ${last}.`;\n }\n else if (types.length === 2) {\n msg += `one of type ${types[0]} or ${types[1]}.`;\n }\n else {\n msg += `of type ${types[0]}.`;\n }\n if (actual == null) {\n msg += ` Received ${actual}`;\n }\n else if (typeof actual === 'function' && actual.name) {\n msg += ` Received function ${actual.name}`;\n }\n else if (typeof actual === 'object' && actual != null) {\n if (actual.constructor?.name) {\n msg += ` Received an instance of ${actual.constructor.name}`;\n }\n }\n return msg;\n}\nexport default (actual, ...types) => {\n return message('Key must be ', actual, ...types);\n};\nexport function withAlg(alg, actual, ...types) {\n return message(`Key for the ${alg} algorithm must be `, actual, ...types);\n}\n","import { checkSigCryptoKey } from './crypto_key.js';\nimport invalidKeyInput from './invalid_key_input.js';\nexport default async (alg, key, usage) => {\n if (key instanceof Uint8Array) {\n if (!alg.startsWith('HS')) {\n throw new TypeError(invalidKeyInput(key, 'CryptoKey', 'KeyObject', 'JSON Web Key'));\n }\n return crypto.subtle.importKey('raw', key, { hash: `SHA-${alg.slice(-3)}`, name: 'HMAC' }, false, [usage]);\n }\n checkSigCryptoKey(key, alg, usage);\n return key;\n};\n","export default (...headers) => {\n const sources = headers.filter(Boolean);\n if (sources.length === 0 || sources.length === 1) {\n return true;\n }\n let acc;\n for (const header of sources) {\n const parameters = Object.keys(header);\n if (!acc || acc.size === 0) {\n acc = new Set(parameters);\n continue;\n }\n for (const parameter of parameters) {\n if (acc.has(parameter)) {\n return false;\n }\n acc.add(parameter);\n }\n }\n return true;\n};\n","export function assertCryptoKey(key) {\n if (!isCryptoKey(key)) {\n throw new Error('CryptoKey instance expected');\n }\n}\nexport function isCryptoKey(key) {\n return key?.[Symbol.toStringTag] === 'CryptoKey';\n}\nexport function isKeyObject(key) {\n return key?.[Symbol.toStringTag] === 'KeyObject';\n}\nexport default (key) => {\n return isCryptoKey(key) || isKeyObject(key);\n};\n","function isObjectLike(value) {\n return typeof value === 'object' && value !== null;\n}\nexport default (input) => {\n if (!isObjectLike(input) || Object.prototype.toString.call(input) !== '[object Object]') {\n return false;\n }\n if (Object.getPrototypeOf(input) === null) {\n return true;\n }\n let proto = input;\n while (Object.getPrototypeOf(proto) !== null) {\n proto = Object.getPrototypeOf(proto);\n }\n return Object.getPrototypeOf(input) === proto;\n};\n","import isObject from './is_object.js';\nexport function isJWK(key) {\n return isObject(key) && typeof key.kty === 'string';\n}\nexport function isPrivateJWK(key) {\n return key.kty !== 'oct' && typeof key.d === 'string';\n}\nexport function isPublicJWK(key) {\n return key.kty !== 'oct' && typeof key.d === 'undefined';\n}\nexport function isSecretJWK(key) {\n return key.kty === 'oct' && typeof key.k === 'string';\n}\n","import { withAlg as invalidKeyInput } from './invalid_key_input.js';\nimport isKeyLike from './is_key_like.js';\nimport * as jwk from './is_jwk.js';\nconst tag = (key) => key?.[Symbol.toStringTag];\nconst jwkMatchesOp = (alg, key, usage) => {\n if (key.use !== undefined) {\n let expected;\n switch (usage) {\n case 'sign':\n case 'verify':\n expected = 'sig';\n break;\n case 'encrypt':\n case 'decrypt':\n expected = 'enc';\n break;\n }\n if (key.use !== expected) {\n throw new TypeError(`Invalid key for this operation, its \"use\" must be \"${expected}\" when present`);\n }\n }\n if (key.alg !== undefined && key.alg !== alg) {\n throw new TypeError(`Invalid key for this operation, its \"alg\" must be \"${alg}\" when present`);\n }\n if (Array.isArray(key.key_ops)) {\n let expectedKeyOp;\n switch (true) {\n case usage === 'sign' || usage === 'verify':\n case alg === 'dir':\n case alg.includes('CBC-HS'):\n expectedKeyOp = usage;\n break;\n case alg.startsWith('PBES2'):\n expectedKeyOp = 'deriveBits';\n break;\n case /^A\\d{3}(?:GCM)?(?:KW)?$/.test(alg):\n if (!alg.includes('GCM') && alg.endsWith('KW')) {\n expectedKeyOp = usage === 'encrypt' ? 'wrapKey' : 'unwrapKey';\n }\n else {\n expectedKeyOp = usage;\n }\n break;\n case usage === 'encrypt' && alg.startsWith('RSA'):\n expectedKeyOp = 'wrapKey';\n break;\n case usage === 'decrypt':\n expectedKeyOp = alg.startsWith('RSA') ? 'unwrapKey' : 'deriveBits';\n break;\n }\n if (expectedKeyOp && key.key_ops?.includes?.(expectedKeyOp) === false) {\n throw new TypeError(`Invalid key for this operation, its \"key_ops\" must include \"${expectedKeyOp}\" when present`);\n }\n }\n return true;\n};\nconst symmetricTypeCheck = (alg, key, usage) => {\n if (key instanceof Uint8Array)\n return;\n if (jwk.isJWK(key)) {\n if (jwk.isSecretJWK(key) && jwkMatchesOp(alg, key, usage))\n return;\n throw new TypeError(`JSON Web Key for symmetric algorithms must have JWK \"kty\" (Key Type) equal to \"oct\" and the JWK \"k\" (Key Value) present`);\n }\n if (!isKeyLike(key)) {\n throw new TypeError(invalidKeyInput(alg, key, 'CryptoKey', 'KeyObject', 'JSON Web Key', 'Uint8Array'));\n }\n if (key.type !== 'secret') {\n throw new TypeError(`${tag(key)} instances for symmetric algorithms must be of type \"secret\"`);\n }\n};\nconst asymmetricTypeCheck = (alg, key, usage) => {\n if (jwk.isJWK(key)) {\n switch (usage) {\n case 'decrypt':\n case 'sign':\n if (jwk.isPrivateJWK(key) && jwkMatchesOp(alg, key, usage))\n return;\n throw new TypeError(`JSON Web Key for this operation be a private JWK`);\n case 'encrypt':\n case 'verify':\n if (jwk.isPublicJWK(key) && jwkMatchesOp(alg, key, usage))\n return;\n throw new TypeError(`JSON Web Key for this operation be a public JWK`);\n }\n }\n if (!isKeyLike(key)) {\n throw new TypeError(invalidKeyInput(alg, key, 'CryptoKey', 'KeyObject', 'JSON Web Key'));\n }\n if (key.type === 'secret') {\n throw new TypeError(`${tag(key)} instances for asymmetric algorithms must not be of type \"secret\"`);\n }\n if (key.type === 'public') {\n switch (usage) {\n case 'sign':\n throw new TypeError(`${tag(key)} instances for asymmetric algorithm signing must be of type \"private\"`);\n case 'decrypt':\n throw new TypeError(`${tag(key)} instances for asymmetric algorithm decryption must be of type \"private\"`);\n default:\n break;\n }\n }\n if (key.type === 'private') {\n switch (usage) {\n case 'verify':\n throw new TypeError(`${tag(key)} instances for asymmetric algorithm verifying must be of type \"public\"`);\n case 'encrypt':\n throw new TypeError(`${tag(key)} instances for asymmetric algorithm encryption must be of type \"public\"`);\n default:\n break;\n }\n }\n};\nexport default (alg, key, usage) => {\n const symmetric = alg.startsWith('HS') ||\n alg === 'dir' ||\n alg.startsWith('PBES2') ||\n /^A(?:128|192|256)(?:GCM)?(?:KW)?$/.test(alg) ||\n /^A(?:128|192|256)CBC-HS(?:256|384|512)$/.test(alg);\n if (symmetric) {\n symmetricTypeCheck(alg, key, usage);\n }\n else {\n asymmetricTypeCheck(alg, key, usage);\n }\n};\n","import { JOSENotSupported, JWEInvalid, JWSInvalid } from '../util/errors.js';\nexport default (Err, recognizedDefault, recognizedOption, protectedHeader, joseHeader) => {\n if (joseHeader.crit !== undefined && protectedHeader?.crit === undefined) {\n throw new Err('\"crit\" (Critical) Header Parameter MUST be integrity protected');\n }\n if (!protectedHeader || protectedHeader.crit === undefined) {\n return new Set();\n }\n if (!Array.isArray(protectedHeader.crit) ||\n protectedHeader.crit.length === 0 ||\n protectedHeader.crit.some((input) => typeof input !== 'string' || input.length === 0)) {\n throw new Err('\"crit\" (Critical) Header Parameter MUST be an array of non-empty strings when present');\n }\n let recognized;\n if (recognizedOption !== undefined) {\n recognized = new Map([...Object.entries(recognizedOption), ...recognizedDefault.entries()]);\n }\n else {\n recognized = recognizedDefault;\n }\n for (const parameter of protectedHeader.crit) {\n if (!recognized.has(parameter)) {\n throw new JOSENotSupported(`Extension Header Parameter \"${parameter}\" is not recognized`);\n }\n if (joseHeader[parameter] === undefined) {\n throw new Err(`Extension Header Parameter \"${parameter}\" is missing`);\n }\n if (recognized.get(parameter) && protectedHeader[parameter] === undefined) {\n throw new Err(`Extension Header Parameter \"${parameter}\" MUST be integrity protected`);\n }\n }\n return new Set(protectedHeader.crit);\n};\n","import { JOSENotSupported } from '../util/errors.js';\nfunction subtleMapping(jwk) {\n let algorithm;\n let keyUsages;\n switch (jwk.kty) {\n case 'RSA': {\n switch (jwk.alg) {\n case 'PS256':\n case 'PS384':\n case 'PS512':\n algorithm = { name: 'RSA-PSS', hash: `SHA-${jwk.alg.slice(-3)}` };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'RS256':\n case 'RS384':\n case 'RS512':\n algorithm = { name: 'RSASSA-PKCS1-v1_5', hash: `SHA-${jwk.alg.slice(-3)}` };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'RSA-OAEP':\n case 'RSA-OAEP-256':\n case 'RSA-OAEP-384':\n case 'RSA-OAEP-512':\n algorithm = {\n name: 'RSA-OAEP',\n hash: `SHA-${parseInt(jwk.alg.slice(-3), 10) || 1}`,\n };\n keyUsages = jwk.d ? ['decrypt', 'unwrapKey'] : ['encrypt', 'wrapKey'];\n break;\n default:\n throw new JOSENotSupported('Invalid or unsupported JWK \"alg\" (Algorithm) Parameter value');\n }\n break;\n }\n case 'EC': {\n switch (jwk.alg) {\n case 'ES256':\n algorithm = { name: 'ECDSA', namedCurve: 'P-256' };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'ES384':\n algorithm = { name: 'ECDSA', namedCurve: 'P-384' };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'ES512':\n algorithm = { name: 'ECDSA', namedCurve: 'P-521' };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'ECDH-ES':\n case 'ECDH-ES+A128KW':\n case 'ECDH-ES+A192KW':\n case 'ECDH-ES+A256KW':\n algorithm = { name: 'ECDH', namedCurve: jwk.crv };\n keyUsages = jwk.d ? ['deriveBits'] : [];\n break;\n default:\n throw new JOSENotSupported('Invalid or unsupported JWK \"alg\" (Algorithm) Parameter value');\n }\n break;\n }\n case 'OKP': {\n switch (jwk.alg) {\n case 'Ed25519':\n case 'EdDSA':\n algorithm = { name: 'Ed25519' };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'ECDH-ES':\n case 'ECDH-ES+A128KW':\n case 'ECDH-ES+A192KW':\n case 'ECDH-ES+A256KW':\n algorithm = { name: jwk.crv };\n keyUsages = jwk.d ? ['deriveBits'] : [];\n break;\n default:\n throw new JOSENotSupported('Invalid or unsupported JWK \"alg\" (Algorithm) Parameter value');\n }\n break;\n }\n default:\n throw new JOSENotSupported('Invalid or unsupported JWK \"kty\" (Key Type) Parameter value');\n }\n return { algorithm, keyUsages };\n}\nexport default async (jwk) => {\n if (!jwk.alg) {\n throw new TypeError('\"alg\" argument is required when \"jwk.alg\" is not present');\n }\n const { algorithm, keyUsages } = subtleMapping(jwk);\n const keyData = { ...jwk };\n delete keyData.alg;\n delete keyData.use;\n return crypto.subtle.importKey('jwk', keyData, algorithm, jwk.ext ?? (jwk.d ? false : true), jwk.key_ops ?? keyUsages);\n};\n","import { isJWK } from './is_jwk.js';\nimport { decode } from '../util/base64url.js';\nimport importJWK from './jwk_to_key.js';\nimport { isCryptoKey, isKeyObject } from './is_key_like.js';\nlet cache;\nconst handleJWK = async (key, jwk, alg, freeze = false) => {\n cache ||= new WeakMap();\n let cached = cache.get(key);\n if (cached?.[alg]) {\n return cached[alg];\n }\n const cryptoKey = await importJWK({ ...jwk, alg });\n if (freeze)\n Object.freeze(key);\n if (!cached) {\n cache.set(key, { [alg]: cryptoKey });\n }\n else {\n cached[alg] = cryptoKey;\n }\n return cryptoKey;\n};\nconst handleKeyObject = (keyObject, alg) => {\n cache ||= new WeakMap();\n let cached = cache.get(keyObject);\n if (cached?.[alg]) {\n return cached[alg];\n }\n const isPublic = keyObject.type === 'public';\n const extractable = isPublic ? true : false;\n let cryptoKey;\n if (keyObject.asymmetricKeyType === 'x25519') {\n switch (alg) {\n case 'ECDH-ES':\n case 'ECDH-ES+A128KW':\n case 'ECDH-ES+A192KW':\n case 'ECDH-ES+A256KW':\n break;\n default:\n throw new TypeError('given KeyObject instance cannot be used for this algorithm');\n }\n cryptoKey = keyObject.toCryptoKey(keyObject.asymmetricKeyType, extractable, isPublic ? [] : ['deriveBits']);\n }\n if (keyObject.asymmetricKeyType === 'ed25519') {\n if (alg !== 'EdDSA' && alg !== 'Ed25519') {\n throw new TypeError('given KeyObject instance cannot be used for this algorithm');\n }\n cryptoKey = keyObject.toCryptoKey(keyObject.asymmetricKeyType, extractable, [\n isPublic ? 'verify' : 'sign',\n ]);\n }\n if (keyObject.asymmetricKeyType === 'rsa') {\n let hash;\n switch (alg) {\n case 'RSA-OAEP':\n hash = 'SHA-1';\n break;\n case 'RS256':\n case 'PS256':\n case 'RSA-OAEP-256':\n hash = 'SHA-256';\n break;\n case 'RS384':\n case 'PS384':\n case 'RSA-OAEP-384':\n hash = 'SHA-384';\n break;\n case 'RS512':\n case 'PS512':\n case 'RSA-OAEP-512':\n hash = 'SHA-512';\n break;\n default:\n throw new TypeError('given KeyObject instance cannot be used for this algorithm');\n }\n if (alg.startsWith('RSA-OAEP')) {\n return keyObject.toCryptoKey({\n name: 'RSA-OAEP',\n hash,\n }, extractable, isPublic ? ['encrypt'] : ['decrypt']);\n }\n cryptoKey = keyObject.toCryptoKey({\n name: alg.startsWith('PS') ? 'RSA-PSS' : 'RSASSA-PKCS1-v1_5',\n hash,\n }, extractable, [isPublic ? 'verify' : 'sign']);\n }\n if (keyObject.asymmetricKeyType === 'ec') {\n const nist = new Map([\n ['prime256v1', 'P-256'],\n ['secp384r1', 'P-384'],\n ['secp521r1', 'P-521'],\n ]);\n const namedCurve = nist.get(keyObject.asymmetricKeyDetails?.namedCurve);\n if (!namedCurve) {\n throw new TypeError('given KeyObject instance cannot be used for this algorithm');\n }\n if (alg === 'ES256' && namedCurve === 'P-256') {\n cryptoKey = keyObject.toCryptoKey({\n name: 'ECDSA',\n namedCurve,\n }, extractable, [isPublic ? 'verify' : 'sign']);\n }\n if (alg === 'ES384' && namedCurve === 'P-384') {\n cryptoKey = keyObject.toCryptoKey({\n name: 'ECDSA',\n namedCurve,\n }, extractable, [isPublic ? 'verify' : 'sign']);\n }\n if (alg === 'ES512' && namedCurve === 'P-521') {\n cryptoKey = keyObject.toCryptoKey({\n name: 'ECDSA',\n namedCurve,\n }, extractable, [isPublic ? 'verify' : 'sign']);\n }\n if (alg.startsWith('ECDH-ES')) {\n cryptoKey = keyObject.toCryptoKey({\n name: 'ECDH',\n namedCurve,\n }, extractable, isPublic ? [] : ['deriveBits']);\n }\n }\n if (!cryptoKey) {\n throw new TypeError('given KeyObject instance cannot be used for this algorithm');\n }\n if (!cached) {\n cache.set(keyObject, { [alg]: cryptoKey });\n }\n else {\n cached[alg] = cryptoKey;\n }\n return cryptoKey;\n};\nexport default async (key, alg) => {\n if (key instanceof Uint8Array) {\n return key;\n }\n if (isCryptoKey(key)) {\n return key;\n }\n if (isKeyObject(key)) {\n if (key.type === 'secret') {\n return key.export();\n }\n if ('toCryptoKey' in key && typeof key.toCryptoKey === 'function') {\n try {\n return handleKeyObject(key, alg);\n }\n catch (err) {\n if (err instanceof TypeError) {\n throw err;\n }\n }\n }\n let jwk = key.export({ format: 'jwk' });\n return handleJWK(key, jwk, alg);\n }\n if (isJWK(key)) {\n if (key.k) {\n return decode(key.k);\n }\n return handleJWK(key, key, alg, true);\n }\n throw new Error('unreachable');\n};\n","import { encode as b64u } from '../../util/base64url.js';\nimport sign from '../../lib/sign.js';\nimport isDisjoint from '../../lib/is_disjoint.js';\nimport { JWSInvalid } from '../../util/errors.js';\nimport { encoder, decoder, concat } from '../../lib/buffer_utils.js';\nimport checkKeyType from '../../lib/check_key_type.js';\nimport validateCrit from '../../lib/validate_crit.js';\nimport normalizeKey from '../../lib/normalize_key.js';\nexport class FlattenedSign {\n #payload;\n #protectedHeader;\n #unprotectedHeader;\n constructor(payload) {\n if (!(payload instanceof Uint8Array)) {\n throw new TypeError('payload must be an instance of Uint8Array');\n }\n this.#payload = payload;\n }\n setProtectedHeader(protectedHeader) {\n if (this.#protectedHeader) {\n throw new TypeError('setProtectedHeader can only be called once');\n }\n this.#protectedHeader = protectedHeader;\n return this;\n }\n setUnprotectedHeader(unprotectedHeader) {\n if (this.#unprotectedHeader) {\n throw new TypeError('setUnprotectedHeader can only be called once');\n }\n this.#unprotectedHeader = unprotectedHeader;\n return this;\n }\n async sign(key, options) {\n if (!this.#protectedHeader && !this.#unprotectedHeader) {\n throw new JWSInvalid('either setProtectedHeader or setUnprotectedHeader must be called before #sign()');\n }\n if (!isDisjoint(this.#protectedHeader, this.#unprotectedHeader)) {\n throw new JWSInvalid('JWS Protected and JWS Unprotected Header Parameter names must be disjoint');\n }\n const joseHeader = {\n ...this.#protectedHeader,\n ...this.#unprotectedHeader,\n };\n const extensions = validateCrit(JWSInvalid, new Map([['b64', true]]), options?.crit, this.#protectedHeader, joseHeader);\n let b64 = true;\n if (extensions.has('b64')) {\n b64 = this.#protectedHeader.b64;\n if (typeof b64 !== 'boolean') {\n throw new JWSInvalid('The \"b64\" (base64url-encode payload) Header Parameter must be a boolean');\n }\n }\n const { alg } = joseHeader;\n if (typeof alg !== 'string' || !alg) {\n throw new JWSInvalid('JWS \"alg\" (Algorithm) Header Parameter missing or invalid');\n }\n checkKeyType(alg, key, 'sign');\n let payload = this.#payload;\n if (b64) {\n payload = encoder.encode(b64u(payload));\n }\n let protectedHeader;\n if (this.#protectedHeader) {\n protectedHeader = encoder.encode(b64u(JSON.stringify(this.#protectedHeader)));\n }\n else {\n protectedHeader = encoder.encode('');\n }\n const data = concat(protectedHeader, encoder.encode('.'), payload);\n const k = await normalizeKey(key, alg);\n const signature = await sign(alg, k, data);\n const jws = {\n signature: b64u(signature),\n payload: '',\n };\n if (b64) {\n jws.payload = decoder.decode(payload);\n }\n if (this.#unprotectedHeader) {\n jws.header = this.#unprotectedHeader;\n }\n if (this.#protectedHeader) {\n jws.protected = decoder.decode(protectedHeader);\n }\n return jws;\n }\n}\n","import subtleAlgorithm from './subtle_dsa.js';\nimport checkKeyLength from './check_key_length.js';\nimport getSignKey from './get_sign_verify_key.js';\nexport default async (alg, key, data) => {\n const cryptoKey = await getSignKey(alg, key, 'sign');\n checkKeyLength(alg, cryptoKey);\n const signature = await crypto.subtle.sign(subtleAlgorithm(alg, cryptoKey.algorithm), cryptoKey, data);\n return new Uint8Array(signature);\n};\n","import { FlattenedSign } from '../flattened/sign.js';\nexport class CompactSign {\n #flattened;\n constructor(payload) {\n this.#flattened = new FlattenedSign(payload);\n }\n setProtectedHeader(protectedHeader) {\n this.#flattened.setProtectedHeader(protectedHeader);\n return this;\n }\n async sign(key, options) {\n const jws = await this.#flattened.sign(key, options);\n if (jws.payload === undefined) {\n throw new TypeError('use the flattened module for creating JWS with b64: false');\n }\n return `${jws.protected}.${jws.payload}.${jws.signature}`;\n }\n}\n","export default (date) => Math.floor(date.getTime() / 1000);\n","const minute = 60;\nconst hour = minute * 60;\nconst day = hour * 24;\nconst week = day * 7;\nconst year = day * 365.25;\nconst REGEX = /^(\\+|\\-)? ?(\\d+|\\d+\\.\\d+) ?(seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)(?: (ago|from now))?$/i;\nexport default (str) => {\n const matched = REGEX.exec(str);\n if (!matched || (matched[4] && matched[1])) {\n throw new TypeError('Invalid time period format');\n }\n const value = parseFloat(matched[2]);\n const unit = matched[3].toLowerCase();\n let numericDate;\n switch (unit) {\n case 'sec':\n case 'secs':\n case 'second':\n case 'seconds':\n case 's':\n numericDate = Math.round(value);\n break;\n case 'minute':\n case 'minutes':\n case 'min':\n case 'mins':\n case 'm':\n numericDate = Math.round(value * minute);\n break;\n case 'hour':\n case 'hours':\n case 'hr':\n case 'hrs':\n case 'h':\n numericDate = Math.round(value * hour);\n break;\n case 'day':\n case 'days':\n case 'd':\n numericDate = Math.round(value * day);\n break;\n case 'week':\n case 'weeks':\n case 'w':\n numericDate = Math.round(value * week);\n break;\n default:\n numericDate = Math.round(value * year);\n break;\n }\n if (matched[1] === '-' || matched[4] === 'ago') {\n return -numericDate;\n }\n return numericDate;\n};\n","import { JWTClaimValidationFailed, JWTExpired, JWTInvalid } from '../util/errors.js';\nimport { decoder } from './buffer_utils.js';\nimport epoch from './epoch.js';\nimport secs from './secs.js';\nimport isObject from './is_object.js';\nimport { encoder } from './buffer_utils.js';\nfunction validateInput(label, input) {\n if (!Number.isFinite(input)) {\n throw new TypeError(`Invalid ${label} input`);\n }\n return input;\n}\nconst normalizeTyp = (value) => value.toLowerCase().replace(/^application\\//, '');\nconst checkAudiencePresence = (audPayload, audOption) => {\n if (typeof audPayload === 'string') {\n return audOption.includes(audPayload);\n }\n if (Array.isArray(audPayload)) {\n return audOption.some(Set.prototype.has.bind(new Set(audPayload)));\n }\n return false;\n};\nexport function validateClaimsSet(protectedHeader, encodedPayload, options = {}) {\n let payload;\n try {\n payload = JSON.parse(decoder.decode(encodedPayload));\n }\n catch {\n }\n if (!isObject(payload)) {\n throw new JWTInvalid('JWT Claims Set must be a top-level JSON object');\n }\n const { typ } = options;\n if (typ &&\n (typeof protectedHeader.typ !== 'string' ||\n normalizeTyp(protectedHeader.typ) !== normalizeTyp(typ))) {\n throw new JWTClaimValidationFailed('unexpected \"typ\" JWT header value', payload, 'typ', 'check_failed');\n }\n const { requiredClaims = [], issuer, subject, audience, maxTokenAge } = options;\n const presenceCheck = [...requiredClaims];\n if (maxTokenAge !== undefined)\n presenceCheck.push('iat');\n if (audience !== undefined)\n presenceCheck.push('aud');\n if (subject !== undefined)\n presenceCheck.push('sub');\n if (issuer !== undefined)\n presenceCheck.push('iss');\n for (const claim of new Set(presenceCheck.reverse())) {\n if (!(claim in payload)) {\n throw new JWTClaimValidationFailed(`missing required \"${claim}\" claim`, payload, claim, 'missing');\n }\n }\n if (issuer &&\n !(Array.isArray(issuer) ? issuer : [issuer]).includes(payload.iss)) {\n throw new JWTClaimValidationFailed('unexpected \"iss\" claim value', payload, 'iss', 'check_failed');\n }\n if (subject && payload.sub !== subject) {\n throw new JWTClaimValidationFailed('unexpected \"sub\" claim value', payload, 'sub', 'check_failed');\n }\n if (audience &&\n !checkAudiencePresence(payload.aud, typeof audience === 'string' ? [audience] : audience)) {\n throw new JWTClaimValidationFailed('unexpected \"aud\" claim value', payload, 'aud', 'check_failed');\n }\n let tolerance;\n switch (typeof options.clockTolerance) {\n case 'string':\n tolerance = secs(options.clockTolerance);\n break;\n case 'number':\n tolerance = options.clockTolerance;\n break;\n case 'undefined':\n tolerance = 0;\n break;\n default:\n throw new TypeError('Invalid clockTolerance option type');\n }\n const { currentDate } = options;\n const now = epoch(currentDate || new Date());\n if ((payload.iat !== undefined || maxTokenAge) && typeof payload.iat !== 'number') {\n throw new JWTClaimValidationFailed('\"iat\" claim must be a number', payload, 'iat', 'invalid');\n }\n if (payload.nbf !== undefined) {\n if (typeof payload.nbf !== 'number') {\n throw new JWTClaimValidationFailed('\"nbf\" claim must be a number', payload, 'nbf', 'invalid');\n }\n if (payload.nbf > now + tolerance) {\n throw new JWTClaimValidationFailed('\"nbf\" claim timestamp check failed', payload, 'nbf', 'check_failed');\n }\n }\n if (payload.exp !== undefined) {\n if (typeof payload.exp !== 'number') {\n throw new JWTClaimValidationFailed('\"exp\" claim must be a number', payload, 'exp', 'invalid');\n }\n if (payload.exp <= now - tolerance) {\n throw new JWTExpired('\"exp\" claim timestamp check failed', payload, 'exp', 'check_failed');\n }\n }\n if (maxTokenAge) {\n const age = now - payload.iat;\n const max = typeof maxTokenAge === 'number' ? maxTokenAge : secs(maxTokenAge);\n if (age - tolerance > max) {\n throw new JWTExpired('\"iat\" claim timestamp check failed (too far in the past)', payload, 'iat', 'check_failed');\n }\n if (age < 0 - tolerance) {\n throw new JWTClaimValidationFailed('\"iat\" claim timestamp check failed (it should be in the past)', payload, 'iat', 'check_failed');\n }\n }\n return payload;\n}\nexport class JWTClaimsBuilder {\n #payload;\n constructor(payload) {\n if (!isObject(payload)) {\n throw new TypeError('JWT Claims Set MUST be an object');\n }\n this.#payload = structuredClone(payload);\n }\n data() {\n return encoder.encode(JSON.stringify(this.#payload));\n }\n get iss() {\n return this.#payload.iss;\n }\n set iss(value) {\n this.#payload.iss = value;\n }\n get sub() {\n return this.#payload.sub;\n }\n set sub(value) {\n this.#payload.sub = value;\n }\n get aud() {\n return this.#payload.aud;\n }\n set aud(value) {\n this.#payload.aud = value;\n }\n set jti(value) {\n this.#payload.jti = value;\n }\n set nbf(value) {\n if (typeof value === 'number') {\n this.#payload.nbf = validateInput('setNotBefore', value);\n }\n else if (value instanceof Date) {\n this.#payload.nbf = validateInput('setNotBefore', epoch(value));\n }\n else {\n this.#payload.nbf = epoch(new Date()) + secs(value);\n }\n }\n set exp(value) {\n if (typeof value === 'number') {\n this.#payload.exp = validateInput('setExpirationTime', value);\n }\n else if (value instanceof Date) {\n this.#payload.exp = validateInput('setExpirationTime', epoch(value));\n }\n else {\n this.#payload.exp = epoch(new Date()) + secs(value);\n }\n }\n set iat(value) {\n if (typeof value === 'undefined') {\n this.#payload.iat = epoch(new Date());\n }\n else if (value instanceof Date) {\n this.#payload.iat = validateInput('setIssuedAt', epoch(value));\n }\n else if (typeof value === 'string') {\n this.#payload.iat = validateInput('setIssuedAt', epoch(new Date()) + secs(value));\n }\n else {\n this.#payload.iat = validateInput('setIssuedAt', value);\n }\n }\n}\n","import { CompactSign } from '../jws/compact/sign.js';\nimport { JWTInvalid } from '../util/errors.js';\nimport { JWTClaimsBuilder } from '../lib/jwt_claims_set.js';\nexport class SignJWT {\n #protectedHeader;\n #jwt;\n constructor(payload = {}) {\n this.#jwt = new JWTClaimsBuilder(payload);\n }\n setIssuer(issuer) {\n this.#jwt.iss = issuer;\n return this;\n }\n setSubject(subject) {\n this.#jwt.sub = subject;\n return this;\n }\n setAudience(audience) {\n this.#jwt.aud = audience;\n return this;\n }\n setJti(jwtId) {\n this.#jwt.jti = jwtId;\n return this;\n }\n setNotBefore(input) {\n this.#jwt.nbf = input;\n return this;\n }\n setExpirationTime(input) {\n this.#jwt.exp = input;\n return this;\n }\n setIssuedAt(input) {\n this.#jwt.iat = input;\n return this;\n }\n setProtectedHeader(protectedHeader) {\n this.#protectedHeader = protectedHeader;\n return this;\n }\n async sign(key, options) {\n const sig = new CompactSign(this.#jwt.data());\n sig.setProtectedHeader(this.#protectedHeader);\n if (Array.isArray(this.#protectedHeader?.crit) &&\n this.#protectedHeader.crit.includes('b64') &&\n this.#protectedHeader.b64 === false) {\n throw new JWTInvalid('JWTs MUST NOT use unencoded payload');\n }\n return sig.sign(key, options);\n }\n}\n","import { decode as b64u } from '../../util/base64url.js';\nimport verify from '../../lib/verify.js';\nimport { JOSEAlgNotAllowed, JWSInvalid, JWSSignatureVerificationFailed } from '../../util/errors.js';\nimport { concat, encoder, decoder } from '../../lib/buffer_utils.js';\nimport isDisjoint from '../../lib/is_disjoint.js';\nimport isObject from '../../lib/is_object.js';\nimport checkKeyType from '../../lib/check_key_type.js';\nimport validateCrit from '../../lib/validate_crit.js';\nimport validateAlgorithms from '../../lib/validate_algorithms.js';\nimport normalizeKey from '../../lib/normalize_key.js';\nexport async function flattenedVerify(jws, key, options) {\n if (!isObject(jws)) {\n throw new JWSInvalid('Flattened JWS must be an object');\n }\n if (jws.protected === undefined && jws.header === undefined) {\n throw new JWSInvalid('Flattened JWS must have either of the \"protected\" or \"header\" members');\n }\n if (jws.protected !== undefined && typeof jws.protected !== 'string') {\n throw new JWSInvalid('JWS Protected Header incorrect type');\n }\n if (jws.payload === undefined) {\n throw new JWSInvalid('JWS Payload missing');\n }\n if (typeof jws.signature !== 'string') {\n throw new JWSInvalid('JWS Signature missing or incorrect type');\n }\n if (jws.header !== undefined && !isObject(jws.header)) {\n throw new JWSInvalid('JWS Unprotected Header incorrect type');\n }\n let parsedProt = {};\n if (jws.protected) {\n try {\n const protectedHeader = b64u(jws.protected);\n parsedProt = JSON.parse(decoder.decode(protectedHeader));\n }\n catch {\n throw new JWSInvalid('JWS Protected Header is invalid');\n }\n }\n if (!isDisjoint(parsedProt, jws.header)) {\n throw new JWSInvalid('JWS Protected and JWS Unprotected Header Parameter names must be disjoint');\n }\n const joseHeader = {\n ...parsedProt,\n ...jws.header,\n };\n const extensions = validateCrit(JWSInvalid, new Map([['b64', true]]), options?.crit, parsedProt, joseHeader);\n let b64 = true;\n if (extensions.has('b64')) {\n b64 = parsedProt.b64;\n if (typeof b64 !== 'boolean') {\n throw new JWSInvalid('The \"b64\" (base64url-encode payload) Header Parameter must be a boolean');\n }\n }\n const { alg } = joseHeader;\n if (typeof alg !== 'string' || !alg) {\n throw new JWSInvalid('JWS \"alg\" (Algorithm) Header Parameter missing or invalid');\n }\n const algorithms = options && validateAlgorithms('algorithms', options.algorithms);\n if (algorithms && !algorithms.has(alg)) {\n throw new JOSEAlgNotAllowed('\"alg\" (Algorithm) Header Parameter value not allowed');\n }\n if (b64) {\n if (typeof jws.payload !== 'string') {\n throw new JWSInvalid('JWS Payload must be a string');\n }\n }\n else if (typeof jws.payload !== 'string' && !(jws.payload instanceof Uint8Array)) {\n throw new JWSInvalid('JWS Payload must be a string or an Uint8Array instance');\n }\n let resolvedKey = false;\n if (typeof key === 'function') {\n key = await key(parsedProt, jws);\n resolvedKey = true;\n }\n checkKeyType(alg, key, 'verify');\n const data = concat(encoder.encode(jws.protected ?? ''), encoder.encode('.'), typeof jws.payload === 'string' ? encoder.encode(jws.payload) : jws.payload);\n let signature;\n try {\n signature = b64u(jws.signature);\n }\n catch {\n throw new JWSInvalid('Failed to base64url decode the signature');\n }\n const k = await normalizeKey(key, alg);\n const verified = await verify(alg, k, signature, data);\n if (!verified) {\n throw new JWSSignatureVerificationFailed();\n }\n let payload;\n if (b64) {\n try {\n payload = b64u(jws.payload);\n }\n catch {\n throw new JWSInvalid('Failed to base64url decode the payload');\n }\n }\n else if (typeof jws.payload === 'string') {\n payload = encoder.encode(jws.payload);\n }\n else {\n payload = jws.payload;\n }\n const result = { payload };\n if (jws.protected !== undefined) {\n result.protectedHeader = parsedProt;\n }\n if (jws.header !== undefined) {\n result.unprotectedHeader = jws.header;\n }\n if (resolvedKey) {\n return { ...result, key: k };\n }\n return result;\n}\n","export default (option, algorithms) => {\n if (algorithms !== undefined &&\n (!Array.isArray(algorithms) || algorithms.some((s) => typeof s !== 'string'))) {\n throw new TypeError(`\"${option}\" option must be an array of strings`);\n }\n if (!algorithms) {\n return undefined;\n }\n return new Set(algorithms);\n};\n","import subtleAlgorithm from './subtle_dsa.js';\nimport checkKeyLength from './check_key_length.js';\nimport getVerifyKey from './get_sign_verify_key.js';\nexport default async (alg, key, signature, data) => {\n const cryptoKey = await getVerifyKey(alg, key, 'verify');\n checkKeyLength(alg, cryptoKey);\n const algorithm = subtleAlgorithm(alg, cryptoKey.algorithm);\n try {\n return await crypto.subtle.verify(algorithm, cryptoKey, signature, data);\n }\n catch {\n return false;\n }\n};\n","import { compactVerify } from '../jws/compact/verify.js';\nimport { validateClaimsSet } from '../lib/jwt_claims_set.js';\nimport { JWTInvalid } from '../util/errors.js';\nexport async function jwtVerify(jwt, key, options) {\n const verified = await compactVerify(jwt, key, options);\n if (verified.protectedHeader.crit?.includes('b64') && verified.protectedHeader.b64 === false) {\n throw new JWTInvalid('JWTs MUST NOT use unencoded payload');\n }\n const payload = validateClaimsSet(verified.protectedHeader, verified.payload, options);\n const result = { payload, protectedHeader: verified.protectedHeader };\n if (typeof key === 'function') {\n return { ...result, key: verified.key };\n }\n return result;\n}\n","import { flattenedVerify } from '../flattened/verify.js';\nimport { JWSInvalid } from '../../util/errors.js';\nimport { decoder } from '../../lib/buffer_utils.js';\nexport async function compactVerify(jws, key, options) {\n if (jws instanceof Uint8Array) {\n jws = decoder.decode(jws);\n }\n if (typeof jws !== 'string') {\n throw new JWSInvalid('Compact JWS must be a string or Uint8Array');\n }\n const { 0: protectedHeader, 1: payload, 2: signature, length } = jws.split('.');\n if (length !== 3) {\n throw new JWSInvalid('Invalid Compact JWS');\n }\n const verified = await flattenedVerify({ payload, protected: protectedHeader, signature }, key, options);\n const result = { payload: verified.payload, protectedHeader: verified.protectedHeader };\n if (typeof key === 'function') {\n return { ...result, key: verified.key };\n }\n return result;\n}\n","/* @flow */\n\nimport * as jose from 'jose';\nimport { type UserDeviceInfoType } from '../../redux/appRegistration/types/types';\nimport aes from 'crypto-js/aes';\nimport hex from 'crypto-js/enc-hex';\nimport sha256 from 'crypto-js/sha256';\nimport utf8 from 'crypto-js/enc-utf8';\n\nconst JwtKeyPrefix = `${process.env.REACT_APP_ID ?? 'noid'}-${process.env.NODE_ENV ?? 'noenv'}`;\n\nconst buildKey: (deviceId: string) => Uint8Array = (deviceId) => {\n const hash = sha256(JwtKeyPrefix).toString();\n return new TextEncoder().encode(`${hash}/${deviceId}`);\n};\n\nconst generateToken: (deviceId: string, userDeviceInfo: UserDeviceInfoType) => Promise<UserDeviceInfoType> = (deviceId, userDeviceInfo) =>\n new jose.SignJWT(userDeviceInfo).setProtectedHeader({ alg: 'HS256' }).sign(buildKey(deviceId));\n\nconst verifyAndDecryptToken: (deviceId: string, jwt: string) => Promise<UserDeviceInfoType> = async (deviceId, jwt) => {\n const { payload } = await jose.jwtVerify(jwt, buildKey(deviceId));\n return payload;\n};\n\nconst decryptDidomiKey: (cipherText: string) => string = (cipherText) => {\n const secret = hex.parse('ac5d6ef7b3d15a84d4446155d820ef165bb6b6b25e2056c1744590461e6b4291');\n const iv = hex.parse('8646413c1507ee2a61e528afddf6c35d');\n return aes.decrypt(cipherText, secret, { iv }).toString(utf8);\n};\n\nexport { decryptDidomiKey, generateToken, verifyAndDecryptToken };\n","/* @flow */\n\nimport './RegistrationView.css';\nimport * as React from 'react';\nimport type { BasicFunction, KeyValuePair } from '@ntg/utils/dist/types';\nimport { Messenger, MessengerEvents } from '@ntg/utils/dist/messenger';\nimport { PendingOperationKind, clearPendingOperation, updatePendingOperationType } from '../../helpers/rights/pendingOperations';\nimport { RegistrationType, type UserDeviceInfoType } from '../../redux/appRegistration/types/types';\nimport { ApplicationState } from './ApplicationContainer';\nimport ButtonFX from '../buttons/ButtonFX';\nimport type { CombinedReducers } from '../../redux/reducers';\nimport type { Dispatch } from '../../redux/types/types';\nimport LocalStorageManager from '../../helpers/localStorage/localStorageManager';\nimport { StorageKeys } from '../../helpers/localStorage/keys';\nimport { buildDeviceUrl } from '../../helpers/dms/helper';\nimport clsx from 'clsx';\nimport { connect } from 'react-redux';\nimport { generateToken } from '../../helpers/crypto/crypto';\nimport { isRunningOnLocalhost } from '../../helpers/jsHelpers/environment';\nimport { registerApplication } from '../../redux/appRegistration/actions';\n\n// Time allowed for login page to load (in milliseconds)\nconst LOAD_TIMEOUT = 60_000;\n\ntype ExtraCrmData = {|\n showPods?: boolean,\n showSignin?: boolean,\n showSignup?: boolean,\n showSubscribe?: boolean,\n|};\n\ntype ReduxRegistrationReducerStateType = {|\n +applicationId: string,\n +authDeviceUrl: string,\n +authenticationToken: string | null,\n +deviceId: string,\n +deviceKey: string,\n +isRegisteredAsGuest: boolean,\n +loginUrl: string,\n +logoutUrl: string,\n +podsWebUrl: string,\n +signupUrl: string,\n +subscribeWebUrl: string,\n +subscriberId: string,\n +upgradeDeviceUrl: string,\n +utmParameters: KeyValuePair<string>,\n|};\n\ntype ReduxRegistrationDispatchToPropsType = {|\n +localRegisterApplication: (userDeviceInfo: UserDeviceInfoType, asGuest: boolean) => Promise<any>,\n|};\n\ntype DefaultProps = {|\n +pendingOperationType?: PendingOperationKind,\n|};\n\ntype RegistrationPropType = {|\n ...DefaultProps,\n +applicationState: ApplicationState,\n +closeDebugPanelCallback: BasicFunction,\n +crmLoadTimeoutCallback: BasicFunction,\n +hideHeaderCallback: BasicFunction,\n +highlightedCommercialOffers: Array<string>,\n +isDebugPanelVisible: boolean,\n +registrationFailureCallback: BasicFunction,\n|};\n\ntype CompleteRegistrationPropType = {|\n ...RegistrationPropType,\n ...ReduxRegistrationReducerStateType,\n ...ReduxRegistrationDispatchToPropsType,\n|};\n\ntype RegistrationStateType = {|\n crmUrl: string | null,\n overriddenAppConf: string,\n selectedAppConf: string,\n|};\n\nconst InitialState = Object.freeze({\n crmUrl: null,\n overriddenAppConf: '',\n selectedAppConf: '',\n});\n\nclass RegistrationView extends React.PureComponent<CompleteRegistrationPropType, RegistrationStateType> {\n loadTimer: TimeoutID | null;\n\n static defaultProps: DefaultProps = {\n pendingOperationType: undefined,\n };\n\n constructor(props: CompleteRegistrationPropType) {\n super(props);\n\n this.loadTimer = null;\n this.state = { ...InitialState };\n }\n\n componentDidMount() {\n const { crmLoadTimeoutCallback } = this.props;\n\n window.addEventListener('message', this.handleMessagePosted, {\n capture: true,\n passive: true,\n });\n\n const overriddenAppConf = LocalStorageManager.loadString(StorageKeys.OverriddenAppConf, '');\n if (overriddenAppConf !== '') {\n this.setState({\n overriddenAppConf,\n selectedAppConf: overriddenAppConf,\n });\n }\n\n this.loadTimer = setTimeout(crmLoadTimeoutCallback, LOAD_TIMEOUT);\n this.buildCrmUrl();\n }\n\n componentWillUnmount() {\n window.removeEventListener('message', this.handleMessagePosted, {\n capture: true,\n passive: true,\n });\n\n this.resetLoadTimer();\n }\n\n resetLoadTimer = () => {\n const { loadTimer } = this;\n\n if (loadTimer) {\n clearTimeout(loadTimer);\n this.loadTimer = null;\n }\n };\n\n clearCrmData = () => {\n LocalStorageManager.delete(StorageKeys.CrmData);\n };\n\n // Store data in local storage for CRM pages\n storeCrmData = (extraData: ExtraCrmData) => {\n const {\n applicationId,\n authenticationToken: token,\n authDeviceUrl,\n deviceKey,\n highlightedCommercialOffers,\n isRegisteredAsGuest,\n logoutUrl,\n pendingOperationType,\n subscriberId,\n upgradeDeviceUrl,\n utmParameters,\n } = this.props;\n\n // $FlowFixMe: Flow does not want to spread utmParameters because it could overwrite properties but we know that's not possible\n LocalStorageManager.save(StorageKeys.CrmData, {\n ...extraData,\n ...utmParameters,\n anonymous: isRegisteredAsGuest,\n applicationId,\n authDeviceUrl,\n deviceKey,\n highlightedCommercialOffers,\n logoutUrl,\n pendingOperationType,\n subscriberId,\n token,\n upgradeDeviceUrl,\n });\n };\n\n buildCrmUrl = () => {\n const { applicationState, authenticationToken, deviceId, isRegisteredAsGuest, loginUrl, podsWebUrl, signupUrl, subscribeWebUrl } = this.props;\n\n // Display sign-in page (most used case)\n let crmUrl = loginUrl;\n\n this.clearCrmData();\n\n if (applicationState === ApplicationState.SignUpDisplayed && signupUrl) {\n // Display sign-up page\n this.storeCrmData({ showSignup: true });\n crmUrl = signupUrl;\n } else if (applicationState === ApplicationState.SubscribeDisplayed && subscribeWebUrl) {\n // Display subscribe page\n this.storeCrmData({ showSubscribe: true });\n\n // If not logged in, user will be prompted to sign in\n if (authenticationToken && !isRegisteredAsGuest) {\n crmUrl = subscribeWebUrl;\n } else {\n crmUrl = signupUrl;\n }\n } else if (applicationState === ApplicationState.PodsDisplayed && podsWebUrl) {\n // Display pods page\n this.storeCrmData({ showPods: true });\n crmUrl = podsWebUrl;\n } else {\n // Display sign-in page\n this.storeCrmData({ showSignin: true });\n }\n\n this.setState({ crmUrl: buildDeviceUrl(deviceId, crmUrl) });\n };\n\n getBooleanValue = (value: string): ?boolean => {\n if (value === 'true') {\n return true;\n } else if (value === 'false') {\n return false;\n }\n\n return null;\n };\n\n parseUrl = (url: string, defaultValues: UserDeviceInfoType): UserDeviceInfoType => {\n const parameters = new URLSearchParams(url.slice(url.indexOf('?') + 1));\n\n const userDeviceInfoKeys = ((Object.keys(defaultValues): any): Array<string>);\n const lcUserDeviceInfoKeys = userDeviceInfoKeys.map((value) => value.toLowerCase());\n const userDeviceInfo: UserDeviceInfoType = { ...defaultValues };\n\n for (const [key, value] of parameters.entries()) {\n const lcKey = key.toLowerCase();\n\n // For registration pages not providing the right case for keys\n const i = lcUserDeviceInfoKeys.indexOf(lcKey);\n const boolValue = this.getBooleanValue(value);\n\n if (i >= 0) {\n // $FlowFixMe: prop-missing error because userDeviceInfoKeys[i] is not guaranteed to be a correct key\n userDeviceInfo[userDeviceInfoKeys[i]] = boolValue !== null ? boolValue : value;\n } else if (lcKey === 'subscriptionskipped' && boolValue === true) {\n // User skipped subscription: no need to retry to play\n updatePendingOperationType(PendingOperationKind.OpenCard);\n }\n }\n\n // Remove data from local storage, so it's not reused later\n LocalStorageManager.delete(StorageKeys.CrmData);\n\n return userDeviceInfo;\n };\n\n handleMessagePosted = (e: SyntheticInputEvent<HTMLElement>) => {\n const { deviceId, hideHeaderCallback, localRegisterApplication, registrationFailureCallback } = this.props;\n const { crmUrl } = this.state;\n const { data } = e;\n\n if (typeof data !== 'string' || data === 'closed') {\n // Unwanted data or special mobile case\n return;\n }\n\n /*\n * Temporarily commented because of too many different domains for myVF\n *\n * if (!isSameDomain(process.env.REACT_APP_IFRAME_DOMAIN_ORIGIN, origin) && !(/^https?:\\/\\/localhost:3000$/ui).test(origin)) {\n * // Message does not come from a trusted source\n * return;\n * }\n */\n\n if (data === 'reloadtop') {\n this.resetLoadTimer();\n if (crmUrl && !isRunningOnLocalhost()) {\n window.location.replace(crmUrl);\n } else {\n hideHeaderCallback();\n }\n return;\n }\n\n if (data === 'cancel') {\n // Sign in was cancelled: go back to guest mode\n this.resetLoadTimer();\n\n // User closed sign-in page: no need to retry to play\n clearPendingOperation();\n\n Messenger.emit(MessengerEvents.SHOW_GUEST_MODE);\n return;\n }\n\n if (data === 'loaded') {\n this.resetLoadTimer();\n return;\n }\n\n if (data === 'accountcreated') {\n Messenger.emit(MessengerEvents.ACCOUNT_CREATED);\n return;\n }\n\n if (data === 'subscribed') {\n Messenger.emit(MessengerEvents.SUBSCRIBED);\n Messenger.emit(MessengerEvents.REFRESH_AUTHENTICATION_TOKEN);\n return;\n }\n\n const defaultUserDeviceInfo = {\n anonymous: false,\n applicationId: '',\n authDeviceUrl: '',\n deviceKey: '',\n error: null,\n logoutUrl: '',\n subscriberId: '',\n upgradeDeviceUrl: '',\n };\n\n const userDeviceInfo = this.parseUrl(data, defaultUserDeviceInfo);\n const { anonymous, applicationId, authDeviceUrl, deviceKey, error, subscriberId, upgradeDeviceUrl } = userDeviceInfo;\n\n if ((typeof error === 'string' && error !== '') || !applicationId || !authDeviceUrl || !deviceKey || !subscriberId || !upgradeDeviceUrl) {\n registrationFailureCallback();\n return;\n }\n\n // User successfully signed in\n generateToken(deviceId, userDeviceInfo).then((userDeviceInfoJwt) => {\n LocalStorageManager.save(StorageKeys.UserDeviceInfo, userDeviceInfoJwt);\n LocalStorageManager.save(StorageKeys.RegisteredAsGuest, anonymous);\n\n localRegisterApplication(userDeviceInfo, anonymous);\n });\n };\n\n handleCloseDebugPanelOnClick = () => {\n const { closeDebugPanelCallback } = this.props;\n\n closeDebugPanelCallback();\n };\n\n handleRevertAppConfOnClick = () => {\n // Remove overridden AppConf from local storage, then reload app\n LocalStorageManager.delete(StorageKeys.OverriddenAppConf);\n window.location.reload();\n };\n\n handleApplyAppConfOnClick = () => {\n const { selectedAppConf } = this.state;\n\n // Store overridden AppConf in local storage, then reload app\n LocalStorageManager.save(StorageKeys.OverriddenAppConf, selectedAppConf);\n window.location.reload();\n };\n\n handleAppConfUrlOnChange = (event: SyntheticInputEvent<HTMLInputElement>) => {\n const {\n currentTarget: { value },\n } = event;\n\n this.setState({ selectedAppConf: value });\n };\n\n renderOverriddenAppConf = (): React.Node => {\n const { isDebugPanelVisible } = this.props;\n const { overriddenAppConf } = this.state;\n\n if (!isDebugPanelVisible && overriddenAppConf === '') {\n return null;\n }\n\n return (\n <div className='overriddenAppConf'>\n <div className='label'>AppConf URL:</div>\n <div className='value'>{overriddenAppConf || 'unchanged'}</div>\n </div>\n );\n };\n\n renderAppConf = (): React.Node => {\n const { isDebugPanelVisible } = this.props;\n const { selectedAppConf } = this.state;\n\n if (!isDebugPanelVisible) {\n return null;\n }\n\n return (\n <>\n <div className='separator' />\n <div className='row'>\n <div className='label'>AppConf URL:</div>\n <input onChange={this.handleAppConfUrlOnChange} placeholder='Enter an AppConf URL' type='text' value={selectedAppConf} />\n </div>\n <div className='row buttons'>\n <ButtonFX onClick={this.handleCloseDebugPanelOnClick}>Close</ButtonFX>\n <ButtonFX onClick={this.handleRevertAppConfOnClick}>Revert AppConf</ButtonFX>\n <ButtonFX onClick={this.handleApplyAppConfOnClick}>Apply AppConf</ButtonFX>\n </div>\n </>\n );\n };\n\n renderDebugPanel = (): React.Node => {\n const overriddenAppConfElt = this.renderOverriddenAppConf();\n const appConfElt = this.renderAppConf();\n\n if (!overriddenAppConfElt && !appConfElt) {\n return null;\n }\n\n return (\n <div className={clsx('debugPanel', overriddenAppConfElt && !appConfElt && 'reduced')}>\n {overriddenAppConfElt}\n {appConfElt}\n </div>\n );\n };\n\n render(): React.Node {\n const { crmUrl } = this.state;\n\n if (!crmUrl) {\n return null;\n }\n\n /* eslint-disable react/iframe-missing-sandbox */\n return (\n <div className='registrationFrameContainer'>\n {this.renderDebugPanel()}\n <iframe className='registrationFrame' src={crmUrl} title='Registration' />\n </div>\n );\n /* eslint-enable react/iframe-missing-sandbox */\n }\n}\n\nconst mapStateToProps = (state: CombinedReducers): ReduxRegistrationReducerStateType => {\n return {\n applicationId: state.appRegistration.applicationId,\n authDeviceUrl: state.appRegistration.authDeviceUrl,\n authenticationToken: state.appRegistration.authenticationToken,\n deviceId: state.appRegistration.deviceId,\n deviceKey: state.appRegistration.deviceKey,\n isRegisteredAsGuest: state.appRegistration.registration === RegistrationType.RegisteredAsGuest,\n loginUrl: state.appConfiguration.configuration.loginUrl ?? '',\n logoutUrl: state.appRegistration.logoutUrl,\n podsWebUrl: state.appConfiguration.configuration.podsWebUrl ?? '',\n signupUrl: state.appConfiguration.configuration.signupUrl ?? '',\n subscribeWebUrl: state.appConfiguration.configuration.subscribeWebUrl ?? '',\n subscriberId: state.appRegistration.subscriberId,\n upgradeDeviceUrl: state.appRegistration.upgradeDeviceUrl,\n utmParameters: state.appConfiguration.utmParameters,\n };\n};\n\nconst mapDispatchToProps = (dispatch: Dispatch): ReduxRegistrationDispatchToPropsType => {\n return {\n localRegisterApplication: (userDeviceInfo: UserDeviceInfoType, asGuest: boolean) => dispatch(registerApplication(userDeviceInfo, asGuest)),\n };\n};\n\nconst Registration: React.ComponentType<RegistrationPropType> = connect(mapStateToProps, mapDispatchToProps)(RegistrationView);\n\nexport default Registration;\n","/* @flow */\n\nimport type { NetgemApiEmitterType, RequestResponseMethodDefinitionType } from '../emitter';\nimport { REDUX_MSG_REQUEST_LIST_ALIAS_MULTI, REDUX_MSG_REQUEST_LIST_ALIAS_POST } from '../../constants/';\nimport type { ChannelMap } from '../../../../libs/netgemLibrary/v8/types/Channel';\nimport type { CombinedReducers } from '../../../reducers';\nimport type { Dispatch } from '../../../types/types';\nimport { type NETGEM_API_V8_REQUEST_RESPONSE } from '../../../../libs/netgemLibrary/v8/types/RequestResponse';\nimport { createCustomNetworkErrorFromKey } from '../../../../libs/netgemLibrary/helpers/CreateCustomNetworkError';\nimport { generateApiUrl } from '../helpers/api';\nimport { getAllTags } from '../../../../helpers/channel/helper';\nimport { updateListAlias } from '../../../appConf/actions';\n\nconst getChannelsByTag: (deviceChannels: ChannelMap, tag: ?string) => Array<string> = (deviceChannels, tag) => {\n const list = [];\n\n for (const { epgid, info } of Object.keys(deviceChannels).map((key) => deviceChannels[key])) {\n if (!tag || (info && info.tags && info.tags.indexOf(tag) > -1)) {\n list.push(epgid);\n }\n }\n\n // Sort by number (LCN)\n list.sort((channel1, channel2) => deviceChannels[channel1].number - deviceChannels[channel2].number);\n\n return list;\n};\n\nconst sendV8ListAliasMultiRequest: (tags: Array<string>, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (tags, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const state = getState();\n const {\n appConfiguration: { deviceChannels },\n netgemApi: { listAliasMultiUrl },\n } = state;\n const list = [];\n\n tags.forEach((tag) => {\n const channels = getChannelsByTag(deviceChannels, tag);\n if (channels.length > 0) {\n list.push(channels);\n }\n });\n\n if (list.length === 0) {\n // No service\n return Promise.resolve();\n }\n\n if (!listAliasMultiUrl) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definition', { urlDef: 'listAliasMultiUrl' }));\n }\n\n const { authent, method } = listAliasMultiUrl;\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_LIST_ALIAS_MULTI, {\n authent,\n bodyParam: JSON.stringify({ list }),\n method,\n signal,\n uri: generateApiUrl(listAliasMultiUrl, {}, state),\n }).then((response: NETGEM_API_V8_REQUEST_RESPONSE) => {\n const { result } = response;\n result.forEach((alias, index) => dispatch(updateListAlias(list[index], alias, tags[index])));\n return Promise.resolve(response);\n });\n };\n\nconst sendV8ListAliasPostRequest: (tag: string | null, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (tag, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const state = getState();\n const {\n appConfiguration: { deviceChannels },\n netgemApi: { listAliasPostUrl },\n } = state;\n const list = getChannelsByTag(deviceChannels, tag);\n\n if (list.length === 0) {\n // No service\n return Promise.resolve();\n }\n\n if (!listAliasPostUrl) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definition', { urlDef: 'listAliasPostUrl' }));\n }\n\n const { authent, method } = listAliasPostUrl;\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_LIST_ALIAS_POST, {\n authent,\n bodyParam: JSON.stringify({ list }),\n method,\n signal,\n uri: generateApiUrl(listAliasPostUrl, {}, state),\n }).then((response: NETGEM_API_V8_REQUEST_RESPONSE) => {\n const { result } = response;\n dispatch(updateListAlias(list, result, tag));\n return Promise.resolve(response);\n });\n };\n\nconst createTagListAliases: (signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers): Promise<any> => {\n const state = getState();\n const {\n appConfiguration: { deviceChannels },\n } = state;\n\n return dispatch(sendV8ListAliasMultiRequest(getAllTags(deviceChannels), signal));\n };\n\nexport { createTagListAliases, sendV8ListAliasPostRequest };\n","/* @flow */\n\nimport type { NetgemApiEmitterType, RequestResponseMethodDefinitionType } from '../emitter';\nimport { updateCommercialOffers, updateDefaultRights, updateUserRights } from '../../../appConf/actions';\nimport type { CombinedReducers } from '../../../reducers';\nimport type { Dispatch } from '../../../types/types';\nimport type { NETGEM_API_V8_REQUEST_RESPONSE } from '../../../../libs/netgemLibrary/v8/types/RequestResponse';\nimport { REDUX_MSG_REQUEST_GENERIC } from '../../constants';\nimport { createCustomNetworkErrorFromKey } from '../../../../libs/netgemLibrary/helpers/CreateCustomNetworkError';\nimport { generateApiUrl } from '../helpers/api';\n\nconst sendCommercialOffersRequest: (signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const state = getState();\n const {\n netgemApi: { rightsCommercialOffersUrl },\n } = state;\n\n if (!rightsCommercialOffersUrl) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definition', { urlDef: 'rightsCommercialOffersUrl' }));\n }\n\n const { authent, method } = rightsCommercialOffersUrl;\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_GENERIC, {\n authent,\n method,\n signal,\n uri: generateApiUrl(rightsCommercialOffersUrl, {}, state),\n }).then((response: NETGEM_API_V8_REQUEST_RESPONSE) => {\n const { result } = response;\n\n dispatch(updateCommercialOffers(result));\n return Promise.resolve(response);\n });\n };\n\nconst sendDefaultRightsRequest: (signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const state = getState();\n const {\n netgemApi: { rightsDefaultUrl },\n } = state;\n\n if (!rightsDefaultUrl) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definition', { urlDef: 'rightsDefaultUrl' }));\n }\n\n const { authent, method } = rightsDefaultUrl;\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_GENERIC, {\n authent,\n method,\n signal,\n uri: generateApiUrl(rightsDefaultUrl, {}, state),\n }).then((response: NETGEM_API_V8_REQUEST_RESPONSE) => {\n const { result } = response;\n\n dispatch(updateDefaultRights(result));\n return Promise.resolve(response);\n });\n };\n\nconst sendUserRightsRequest: (signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const state = getState();\n const {\n netgemApi: { rightsUserUrl },\n } = state;\n\n if (!rightsUserUrl) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definition', { urlDef: 'rightsUserUrl' }));\n }\n\n const { authent, method } = rightsUserUrl;\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_GENERIC, {\n authent,\n method,\n signal,\n uri: generateApiUrl(rightsUserUrl, {}, state),\n }).then((response: NETGEM_API_V8_REQUEST_RESPONSE) => {\n const {\n result: { rights },\n } = response;\n\n dispatch(updateUserRights(rights));\n return Promise.resolve(response);\n });\n };\n\nexport { sendCommercialOffersRequest, sendDefaultRightsRequest, sendUserRightsRequest };\n","/* @flow */\n\n/* eslint-disable no-magic-numbers */\nexport enum DmsNetworkCode {\n // OK\n Created = 201,\n // Errors\n MissingOrInvalidParameters = 10010,\n MissingOrInvalidRequiredParameters = 10011,\n MissingOrInvalidAuthenticationToken = 10021,\n InvalidChallenge = 10031,\n UnknownDevice = 10504,\n InvalidExchange = 10505,\n InvalidDevice = 10509,\n MalformedJson = 20001,\n UnknownError = 0,\n}\n/* eslint-enable no-magic-numbers */\n\nconst getMessageFromErrorStatus = (status: number): string | null => {\n const code = DmsNetworkCode.cast(status);\n\n if (code === undefined) {\n return null;\n }\n\n return getMessageFromErrorCode(code);\n};\n\nconst getMessageFromErrorCode = (code: DmsNetworkCode): string | null => {\n switch (code) {\n case DmsNetworkCode.MissingOrInvalidParameters:\n return 'Missing or invalid parameter(s)';\n case DmsNetworkCode.MissingOrInvalidRequiredParameters:\n return 'Missing or invalid required parameter(s)';\n case DmsNetworkCode.MissingOrInvalidAuthenticationToken:\n return 'Missing or invalid authentication token';\n case DmsNetworkCode.InvalidChallenge:\n return 'Invalid challenge';\n case DmsNetworkCode.UnknownDevice:\n return 'Unknown device';\n case DmsNetworkCode.InvalidExchange:\n return 'Invalid exchange';\n case DmsNetworkCode.InvalidDevice:\n return 'Invalid device';\n case DmsNetworkCode.MalformedJson:\n return 'Malformed JSON';\n\n default:\n return null;\n }\n};\n\nexport { getMessageFromErrorCode, getMessageFromErrorStatus };\n","/* @flow */\n\nimport type { NetgemApiEmitterType, RequestResponseMethodDefinitionType } from '../emitter';\nimport type { CombinedReducers } from '../../../reducers';\nimport type { Dispatch } from '../../../types/types';\nimport { REDUX_MSG_REQUEST_GET_DEVICE_CHANNELS } from '../../constants/';\n\nconst sendGetDeviceChannelListRequest: (signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> =>\n NetgemApiEmitter.emit(REDUX_MSG_REQUEST_GET_DEVICE_CHANNELS, { signal });\n\nexport default sendGetDeviceChannelListRequest;\n","/* @flow */\n\nimport type { ApplicationInfo, NetgemApiEmitterType, RequestResponseMethodDefinitionType } from '../emitter';\nimport AccurateTimestamp from '../../../../helpers/dateTime/AccurateTimestamp';\nimport type { CombinedReducers } from '../../../reducers';\nimport type { Dispatch } from '../../../types/types';\nimport { REDUX_MSG_REQUEST_GET_DEVICE_SETTINGS } from '../../constants/';\nimport { getBrowserAndOS } from '../../../../helpers/jsHelpers/environment';\n\nconst UNKNOWN = 'unknown';\n\nconst sendGetDeviceSettingsRequest: (signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const { browserName, browserVersion, osName, osVersion } = getBrowserAndOS();\n const {\n appConfiguration: { versionApp },\n } = getState();\n\n const {\n devicePixelRatio,\n screen: { height, width },\n } = window;\n\n const appInfo: ApplicationInfo = {\n appVersion: versionApp,\n browserName: browserName ?? UNKNOWN,\n browserVersion: browserVersion ?? UNKNOWN,\n displayResolution: `${width}x${height}`,\n osName: osName ?? UNKNOWN,\n osVersion: osVersion ?? UNKNOWN,\n screenResolution: `${width * devicePixelRatio}x${height * devicePixelRatio}`,\n timestamp: AccurateTimestamp.nowAsIsoString(),\n };\n\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_GET_DEVICE_SETTINGS, { appInfo, signal });\n };\n\nexport default sendGetDeviceSettingsRequest;\n","/* @flow */\n\nimport type { NetgemApiEmitterType, RequestResponseMethodDefinitionType } from '../emitter';\nimport type { CombinedReducers } from '../../../reducers';\nimport type { Dispatch } from '../../../types/types';\nimport { REDUX_MSG_REQUEST_LOGIN } from '../../constants/';\n\nconst sendLoginRequest: (\n authDeviceUrl: string,\n upgradeDeviceUrl: string,\n applicationId: string,\n subscriberId: string,\n deviceKey: string,\n oem: ?string,\n version: ?string,\n isFirstToken: ?boolean,\n signal?: AbortSignal\n) => RequestResponseMethodDefinitionType =\n (authDeviceUrl, upgradeDeviceUrl, applicationId, subscriberId, deviceKey, oem, version, isFirstToken, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> =>\n NetgemApiEmitter.emit(REDUX_MSG_REQUEST_LOGIN, {\n applicationId,\n authDeviceUrl,\n deviceKey,\n isFirstToken,\n oem,\n signal,\n subscriberId,\n upgradeDeviceUrl,\n version,\n });\n\nexport default sendLoginRequest;\n","/* @flow */\n\nimport {\n REDUX_MSG_CNC_PROGRAM_GET_URL,\n REDUX_MSG_CNC_SERIES_GET_URL,\n REDUX_MSG_DATA_COLLECTION_COLD_POST_URL,\n REDUX_MSG_DATA_COLLECTION_HOT_POST_URL,\n REDUX_MSG_DEEPLINK_PROGRAM_GET_URL,\n REDUX_MSG_DEEPLINK_SERIES_GET_URL,\n REDUX_MSG_DEFAULT_HUB_URL,\n REDUX_MSG_DISTRIBUTOR_ADD,\n REDUX_MSG_GAMESTREAM_TOKEN_GET_URL,\n REDUX_MSG_HUB_URL,\n REDUX_MSG_LIST_ALIAS_MULTI_URL,\n REDUX_MSG_LIST_ALIAS_URL,\n REDUX_MSG_LOCATION_CATCHUP_FOR_ASSET_URL,\n REDUX_MSG_LOCATION_EPG_FOR_ASSET_URL,\n REDUX_MSG_LOCATION_EPG_URL,\n REDUX_MSG_LOCATION_VOD_FOR_ASSET_URL,\n REDUX_MSG_METADATA_CHANNELS_URL,\n REDUX_MSG_METADATA_IMAGE_WITH_VARIANT_URL,\n REDUX_MSG_METADATA_PROGRAM_URL,\n REDUX_MSG_METADATA_SCHEDULE_URL,\n REDUX_MSG_NPVR_RECORDINGS_DELETE_URL,\n REDUX_MSG_NPVR_RECORDINGS_FUTURE_URL,\n REDUX_MSG_NPVR_RECORDINGS_LIST_URL,\n REDUX_MSG_NPVR_RECORDINGS_METADATA_URL,\n REDUX_MSG_NPVR_RECORDINGS_QUOTA_URL,\n REDUX_MSG_NPVR_RECORDINGS_RETRY_URL,\n REDUX_MSG_NPVR_RECORDINGS_STOP_URL,\n REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_CREATE_URL,\n REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_DELETE_URL,\n REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_LIST_FULL_URL,\n REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_LIST_URL,\n REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_METADATA_URL,\n REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_UPDATE_URL,\n REDUX_MSG_PERSONAL_DATA_DELETE_URL,\n REDUX_MSG_PERSONAL_DATA_GET_URL,\n REDUX_MSG_PERSONAL_DATA_LIST_DELETE_URL,\n REDUX_MSG_PERSONAL_DATA_LIST_GET_URL,\n REDUX_MSG_PERSONAL_DATA_LIST_POST_URL,\n REDUX_MSG_PERSONAL_DATA_POST_URL,\n REDUX_MSG_PURCHASE_INFO_PER_ASSET_URL,\n REDUX_MSG_REQUEST_ENTITLEMENT_GET_URL,\n REDUX_MSG_REQUEST_ENTITLEMENT_RELEASE_URL,\n REDUX_MSG_RIGHT_COMMERCIAL_OFFERS_URL,\n REDUX_MSG_RIGHT_DEFAULT_RIGHTS_URL,\n REDUX_MSG_RIGHT_USER_RIGHTS_URL,\n} from '../constants';\nimport type { Distributor } from './videofutur/types/common';\nimport type { NETGEM_API_V8_URL_DEFINITION } from '../../../libs/netgemLibrary/v8/types/NtgVideoFeed';\n\ntype REDUX_MSG_NTG_URL_TYPES =\n | typeof REDUX_MSG_CNC_PROGRAM_GET_URL\n | typeof REDUX_MSG_CNC_SERIES_GET_URL\n | typeof REDUX_MSG_DATA_COLLECTION_COLD_POST_URL\n | typeof REDUX_MSG_DATA_COLLECTION_HOT_POST_URL\n | typeof REDUX_MSG_DEEPLINK_PROGRAM_GET_URL\n | typeof REDUX_MSG_DEEPLINK_SERIES_GET_URL\n | typeof REDUX_MSG_DEFAULT_HUB_URL\n | typeof REDUX_MSG_GAMESTREAM_TOKEN_GET_URL\n | typeof REDUX_MSG_HUB_URL\n | typeof REDUX_MSG_LIST_ALIAS_MULTI_URL\n | typeof REDUX_MSG_LIST_ALIAS_URL\n | typeof REDUX_MSG_LOCATION_CATCHUP_FOR_ASSET_URL\n | typeof REDUX_MSG_LOCATION_EPG_FOR_ASSET_URL\n | typeof REDUX_MSG_LOCATION_EPG_URL\n | typeof REDUX_MSG_LOCATION_VOD_FOR_ASSET_URL\n | typeof REDUX_MSG_METADATA_CHANNELS_URL\n | typeof REDUX_MSG_METADATA_IMAGE_WITH_VARIANT_URL\n | typeof REDUX_MSG_METADATA_PROGRAM_URL\n | typeof REDUX_MSG_METADATA_SCHEDULE_URL\n | typeof REDUX_MSG_NPVR_RECORDINGS_DELETE_URL\n | typeof REDUX_MSG_NPVR_RECORDINGS_FUTURE_URL\n | typeof REDUX_MSG_NPVR_RECORDINGS_LIST_URL\n | typeof REDUX_MSG_NPVR_RECORDINGS_METADATA_URL\n | typeof REDUX_MSG_NPVR_RECORDINGS_QUOTA_URL\n | typeof REDUX_MSG_NPVR_RECORDINGS_RETRY_URL\n | typeof REDUX_MSG_NPVR_RECORDINGS_STOP_URL\n | typeof REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_CREATE_URL\n | typeof REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_DELETE_URL\n | typeof REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_LIST_FULL_URL\n | typeof REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_LIST_URL\n | typeof REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_METADATA_URL\n | typeof REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_UPDATE_URL\n | typeof REDUX_MSG_PERSONAL_DATA_DELETE_URL\n | typeof REDUX_MSG_PERSONAL_DATA_GET_URL\n | typeof REDUX_MSG_PERSONAL_DATA_LIST_DELETE_URL\n | typeof REDUX_MSG_PERSONAL_DATA_LIST_GET_URL\n | typeof REDUX_MSG_PERSONAL_DATA_LIST_POST_URL\n | typeof REDUX_MSG_PERSONAL_DATA_POST_URL\n | typeof REDUX_MSG_PURCHASE_INFO_PER_ASSET_URL\n | typeof REDUX_MSG_REQUEST_ENTITLEMENT_GET_URL\n | typeof REDUX_MSG_REQUEST_ENTITLEMENT_RELEASE_URL\n | typeof REDUX_MSG_RIGHT_COMMERCIAL_OFFERS_URL\n | typeof REDUX_MSG_RIGHT_DEFAULT_RIGHTS_URL\n | typeof REDUX_MSG_RIGHT_USER_RIGHTS_URL;\n\nexport type NetgemApiAction =\n // Default action\n | {| type: null |}\n // Set URL definition for given type (Netgem)\n | {|\n type: REDUX_MSG_NTG_URL_TYPES,\n urlDefinition: ?NETGEM_API_V8_URL_DEFINITION,\n |}\n // Add a new distributor definition (customer Id, product Id and set of URLs)\n | {|\n distributorId: string,\n distributorDefinition: Distributor,\n type: typeof REDUX_MSG_DISTRIBUTOR_ADD,\n |};\n\nconst setNtgUrlDefinition: (type: REDUX_MSG_NTG_URL_TYPES, urlDefinition: ?NETGEM_API_V8_URL_DEFINITION) => NetgemApiAction = (type, urlDefinition) => {\n return {\n type: (type: REDUX_MSG_NTG_URL_TYPES),\n urlDefinition,\n };\n};\n\nconst addDistributor: (distributorId: string, distributorDefinition: Distributor) => NetgemApiAction = (distributorId, distributorDefinition) => {\n return {\n distributorDefinition,\n distributorId,\n type: REDUX_MSG_DISTRIBUTOR_ADD,\n };\n};\n\nexport { setNtgUrlDefinition, addDistributor };\n","/* @flow */\n\nimport type { InternalActionDefinitionType, NetgemApiEmitterType, RequestResponseMethodDefinitionType } from '../emitter';\nimport {\n REDUX_MSG_CNC_PROGRAM_GET_URL,\n REDUX_MSG_CNC_SERIES_GET_URL,\n REDUX_MSG_DATA_COLLECTION_COLD_POST_URL,\n REDUX_MSG_DATA_COLLECTION_HOT_POST_URL,\n REDUX_MSG_DEEPLINK_PROGRAM_GET_URL,\n REDUX_MSG_DEEPLINK_SERIES_GET_URL,\n REDUX_MSG_DEFAULT_HUB_URL,\n REDUX_MSG_GAMESTREAM_TOKEN_GET_URL,\n REDUX_MSG_HUB_URL,\n REDUX_MSG_LIST_ALIAS_MULTI_URL,\n REDUX_MSG_LIST_ALIAS_URL,\n REDUX_MSG_LOCATION_CATCHUP_FOR_ASSET_URL,\n REDUX_MSG_LOCATION_EPG_FOR_ASSET_URL,\n REDUX_MSG_LOCATION_EPG_URL,\n REDUX_MSG_LOCATION_VOD_FOR_ASSET_URL,\n REDUX_MSG_METADATA_CHANNELS_URL,\n REDUX_MSG_METADATA_IMAGE_WITH_VARIANT_URL,\n REDUX_MSG_METADATA_PROGRAM_URL,\n REDUX_MSG_METADATA_SCHEDULE_URL,\n REDUX_MSG_NPVR_RECORDINGS_DELETE_URL,\n REDUX_MSG_NPVR_RECORDINGS_FUTURE_URL,\n REDUX_MSG_NPVR_RECORDINGS_LIST_URL,\n REDUX_MSG_NPVR_RECORDINGS_METADATA_URL,\n REDUX_MSG_NPVR_RECORDINGS_QUOTA_URL,\n REDUX_MSG_NPVR_RECORDINGS_RETRY_URL,\n REDUX_MSG_NPVR_RECORDINGS_STOP_URL,\n REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_CREATE_URL,\n REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_DELETE_URL,\n REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_LIST_FULL_URL,\n REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_LIST_URL,\n REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_METADATA_URL,\n REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_UPDATE_URL,\n REDUX_MSG_PERSONAL_DATA_DELETE_URL,\n REDUX_MSG_PERSONAL_DATA_GET_URL,\n REDUX_MSG_PERSONAL_DATA_LIST_DELETE_URL,\n REDUX_MSG_PERSONAL_DATA_LIST_GET_URL,\n REDUX_MSG_PERSONAL_DATA_LIST_POST_URL,\n REDUX_MSG_PERSONAL_DATA_POST_URL,\n REDUX_MSG_PURCHASE_INFO_PER_ASSET_URL,\n REDUX_MSG_REQUEST_ENTITLEMENT_GET_URL,\n REDUX_MSG_REQUEST_ENTITLEMENT_RELEASE_URL,\n REDUX_MSG_REQUEST_GENERIC,\n REDUX_MSG_RIGHT_COMMERCIAL_OFFERS_URL,\n REDUX_MSG_RIGHT_DEFAULT_RIGHTS_URL,\n REDUX_MSG_RIGHT_USER_RIGHTS_URL,\n} from '../../constants/';\nimport type { CombinedReducers } from '../../../reducers';\nimport type { Dispatch } from '../../../types/types';\nimport { HttpMethod } from '../../../../libs/netgemLibrary/v8/types/HttpMethod';\nimport { type NETGEM_API_V8_DISCOVERY_RESULT } from '../../../../libs/netgemLibrary/v8/types/DiscoveryResult';\nimport { type NETGEM_API_V8_REQUEST_RESPONSE } from '../../../../libs/netgemLibrary/v8/types/RequestResponse';\nimport { type NETGEM_API_V8_URL_DEFINITION } from '../../../../libs/netgemLibrary/v8/types/NtgVideoFeed';\nimport { buildMissingParametersError } from '../../../../helpers/debug/debug';\nimport { enablePackPurchaseApi } from '../../../appConf/actions';\nimport { generateApiUrl } from '../helpers/api';\nimport { getSettingValueByName } from '../helpers/settings';\nimport { setNtgUrlDefinition } from '../index';\n\nconst parseDiscovery: (discoveryResult: NETGEM_API_V8_DISCOVERY_RESULT) => InternalActionDefinitionType = (discoveryResult) => (dispatch: Dispatch) => {\n const { dataCollection, game, personalData, rights, video } = discoveryResult;\n\n // Hub\n const { hub } = video;\n dispatch(setNtgUrlDefinition(REDUX_MSG_HUB_URL, hub));\n\n // Default onItemClick\n const { default: defaultHubUrl } = video;\n dispatch(setNtgUrlDefinition(REDUX_MSG_DEFAULT_HUB_URL, defaultHubUrl));\n\n // List alias\n const {\n listAlias: { multi: listAliasMulti, post: listAliasPost },\n } = video;\n dispatch(setNtgUrlDefinition(REDUX_MSG_LIST_ALIAS_MULTI_URL, listAliasMulti));\n dispatch(setNtgUrlDefinition(REDUX_MSG_LIST_ALIAS_URL, listAliasPost));\n\n // Program metadata\n const {\n metadata: { program: metadataProgram },\n } = video;\n dispatch(setNtgUrlDefinition(REDUX_MSG_METADATA_PROGRAM_URL, metadataProgram));\n\n // Image metadata\n const {\n metadata: { imageWithVariant: metadataImageWithVariant },\n } = video;\n dispatch(setNtgUrlDefinition(REDUX_MSG_METADATA_IMAGE_WITH_VARIANT_URL, metadataImageWithVariant));\n\n // Schedule metadata\n const {\n metadata: { schedule: metadataSchedule },\n } = video;\n dispatch(setNtgUrlDefinition(REDUX_MSG_METADATA_SCHEDULE_URL, metadataSchedule));\n\n // Channels metadata\n const {\n metadata: { channels: metadataChannels },\n } = video;\n dispatch(setNtgUrlDefinition(REDUX_MSG_METADATA_CHANNELS_URL, metadataChannels));\n\n // Locations\n const {\n locations: { catchupForAsset, epg, epgForAsset, vodForAsset },\n } = video;\n dispatch(setNtgUrlDefinition(REDUX_MSG_LOCATION_CATCHUP_FOR_ASSET_URL, catchupForAsset));\n dispatch(setNtgUrlDefinition(REDUX_MSG_LOCATION_EPG_URL, epg));\n dispatch(setNtgUrlDefinition(REDUX_MSG_LOCATION_EPG_FOR_ASSET_URL, epgForAsset));\n dispatch(setNtgUrlDefinition(REDUX_MSG_LOCATION_VOD_FOR_ASSET_URL, vodForAsset));\n\n // Entitlement get/release\n const {\n entitlement: { get: entitlementGet, release: entitlementRelease },\n } = video;\n dispatch(setNtgUrlDefinition(REDUX_MSG_REQUEST_ENTITLEMENT_GET_URL, entitlementGet));\n dispatch(setNtgUrlDefinition(REDUX_MSG_REQUEST_ENTITLEMENT_RELEASE_URL, entitlementRelease));\n\n // NPVR\n const {\n npvr: {\n recordings: { delete: recordingsDelete, future: recordingsFuture, list: recordingsList, metadata: recordingsMetadata, quota: recordingsQuota, retry: recordingsRetry, stop: recordingsStop },\n scheduledRecordings: {\n create: schRecordingsCreate,\n delete: schRecordingsDelete,\n list: schRecordingsList,\n listFull: schRecordingsListFull,\n metadata: schRecordingsMetadata,\n update: schRecordingsUpdate,\n },\n },\n } = video;\n dispatch(setNtgUrlDefinition(REDUX_MSG_NPVR_RECORDINGS_DELETE_URL, recordingsDelete));\n dispatch(setNtgUrlDefinition(REDUX_MSG_NPVR_RECORDINGS_FUTURE_URL, recordingsFuture));\n dispatch(setNtgUrlDefinition(REDUX_MSG_NPVR_RECORDINGS_LIST_URL, recordingsList));\n dispatch(setNtgUrlDefinition(REDUX_MSG_NPVR_RECORDINGS_METADATA_URL, recordingsMetadata));\n dispatch(setNtgUrlDefinition(REDUX_MSG_NPVR_RECORDINGS_QUOTA_URL, recordingsQuota));\n dispatch(setNtgUrlDefinition(REDUX_MSG_NPVR_RECORDINGS_RETRY_URL, recordingsRetry));\n dispatch(setNtgUrlDefinition(REDUX_MSG_NPVR_RECORDINGS_STOP_URL, recordingsStop));\n dispatch(setNtgUrlDefinition(REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_CREATE_URL, schRecordingsCreate));\n dispatch(setNtgUrlDefinition(REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_DELETE_URL, schRecordingsDelete));\n dispatch(setNtgUrlDefinition(REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_LIST_URL, schRecordingsList));\n dispatch(setNtgUrlDefinition(REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_METADATA_URL, schRecordingsMetadata));\n dispatch(setNtgUrlDefinition(REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_UPDATE_URL, schRecordingsUpdate));\n\n if (schRecordingsListFull) {\n dispatch(setNtgUrlDefinition(REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_LIST_FULL_URL, schRecordingsListFull));\n }\n\n // CNC deeplink\n const { cnc, deeplink } = video;\n if (cnc) {\n const { program, series } = cnc;\n dispatch(setNtgUrlDefinition(REDUX_MSG_CNC_PROGRAM_GET_URL, program));\n dispatch(setNtgUrlDefinition(REDUX_MSG_CNC_SERIES_GET_URL, series));\n }\n if (deeplink) {\n const { program, series } = deeplink;\n dispatch(setNtgUrlDefinition(REDUX_MSG_DEEPLINK_PROGRAM_GET_URL, program));\n dispatch(setNtgUrlDefinition(REDUX_MSG_DEEPLINK_SERIES_GET_URL, series));\n }\n\n // Personal data (GET/POST/DELETE)\n const {\n single: {\n perUser: { delete: personalDataDelete, get: personalDataGet, send: personalDataPost },\n },\n } = personalData;\n dispatch(setNtgUrlDefinition(REDUX_MSG_PERSONAL_DATA_POST_URL, personalDataPost));\n dispatch(setNtgUrlDefinition(REDUX_MSG_PERSONAL_DATA_GET_URL, personalDataGet));\n dispatch(setNtgUrlDefinition(REDUX_MSG_PERSONAL_DATA_DELETE_URL, personalDataDelete));\n\n // Personal data list (GET/POST/DELETE)\n const {\n list: {\n perUser: { delete: personalDataListDelete, get: personalDataListGet, send: personalDataListPost },\n },\n } = personalData;\n dispatch(setNtgUrlDefinition(REDUX_MSG_PERSONAL_DATA_LIST_POST_URL, personalDataListPost));\n dispatch(setNtgUrlDefinition(REDUX_MSG_PERSONAL_DATA_LIST_GET_URL, personalDataListGet));\n dispatch(setNtgUrlDefinition(REDUX_MSG_PERSONAL_DATA_LIST_DELETE_URL, personalDataListDelete));\n\n // Data collection\n const { coldStack, hotStack } = dataCollection;\n dispatch(setNtgUrlDefinition(REDUX_MSG_DATA_COLLECTION_COLD_POST_URL, coldStack));\n dispatch(setNtgUrlDefinition(REDUX_MSG_DATA_COLLECTION_HOT_POST_URL, hotStack));\n\n // Right management\n if (rights) {\n const { commercialOffers, default: defaultRights, user: userRights } = rights;\n dispatch(setNtgUrlDefinition(REDUX_MSG_RIGHT_COMMERCIAL_OFFERS_URL, commercialOffers));\n dispatch(setNtgUrlDefinition(REDUX_MSG_RIGHT_DEFAULT_RIGHTS_URL, defaultRights));\n dispatch(setNtgUrlDefinition(REDUX_MSG_RIGHT_USER_RIGHTS_URL, userRights));\n }\n\n // Purchase info\n if (video.purchase) {\n const {\n purchase: { perAsset },\n } = video;\n dispatch(setNtgUrlDefinition(REDUX_MSG_PURCHASE_INFO_PER_ASSET_URL, perAsset));\n dispatch(enablePackPurchaseApi());\n }\n\n // Gaming\n if (game?.getGamestreamToken) {\n dispatch(setNtgUrlDefinition(REDUX_MSG_GAMESTREAM_TOKEN_GET_URL, game.getGamestreamToken));\n }\n};\n\nconst buildUrlDefinition: (url: string, apiKeyId: string, timeRound: string) => NETGEM_API_V8_URL_DEFINITION = (url, apiKeyId, timeRound) => {\n return {\n authent: false,\n params: [\n {\n name: 'realm',\n value: {\n args: [],\n op: 'realm',\n },\n },\n {\n // For compatibility purpose:\n name: 'oem',\n value: {\n args: [],\n op: 'realm',\n },\n },\n {\n name: 'date',\n value: {\n args: [Number(timeRound)],\n op: 'now',\n },\n },\n {\n name: 'apiKeyId',\n value: {\n args: [],\n op: 'apiKeyId',\n },\n },\n ],\n sakName: apiKeyId || '',\n uri: url || '',\n };\n};\n\nconst sendV8DiscoveryRequest: (signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const state = getState();\n const { appConfiguration } = state;\n const url: ?string = getSettingValueByName('platform.discovery', 'url', appConfiguration);\n const apiKeyId: ?string = getSettingValueByName('platform.discovery', 'apikeyid', appConfiguration);\n const timeRound: ?string = getSettingValueByName('platform.discovery', 'time_round', appConfiguration);\n\n if (!apiKeyId || !timeRound || !url) {\n return Promise.reject(\n buildMissingParametersError(\n {\n apiKeyId,\n timeRound,\n url,\n },\n 'PTF discovery',\n ),\n );\n }\n\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_GENERIC, {\n authent: false,\n method: HttpMethod.GET,\n signal,\n uri: generateApiUrl(buildUrlDefinition(url, apiKeyId, timeRound), { apiKeyId }, state),\n }).then((response: NETGEM_API_V8_REQUEST_RESPONSE) => dispatch(parseDiscovery(response.result)));\n };\n\nexport default sendV8DiscoveryRequest;\n","/* @flow */\n\nimport {\n type ChannelMap,\n MetricsProperties,\n type NETGEM_API_CHANNEL,\n type NETGEM_API_CHANNEL_INFO,\n type NETGEM_API_CHANNEL_PLAYBACK_PARAMS_ARG_TYPE\n} from '../../../../libs/netgemLibrary/v8/types/Channel';\nimport type { NetgemApiEmitterType, RequestResponseMethodDefinitionType } from '../emitter';\nimport type { CombinedReducers } from '../../../reducers';\nimport type { Dispatch } from '../../../types/types';\nimport { type NETGEM_API_V8_REQUEST_RESPONSE } from '../../../../libs/netgemLibrary/v8/types/RequestResponse';\nimport { REDUX_MSG_REQUEST_GENERIC } from '../../constants/';\nimport { STREAM_TYPE_PRIORITIES } from '../../../../libs/netgemLibrary/v8/types/MetadataSchedule';\nimport { compareDrms } from '../../../../helpers/jsHelpers/Drm';\nimport { createCustomNetworkErrorFromKey } from '../../../../libs/netgemLibrary/helpers/CreateCustomNetworkError';\nimport { generateApiUrl } from '../helpers/api';\nimport { logWarning } from '../../../../helpers/debug/debug';\nimport { updateDeviceChannels } from '../../../appConf/actions';\n\nconst compareStreamTypes: (arg1: NETGEM_API_CHANNEL_PLAYBACK_PARAMS_ARG_TYPE, arg2: NETGEM_API_CHANNEL_PLAYBACK_PARAMS_ARG_TYPE) => number = (arg1, arg2) => {\n const index1 = STREAM_TYPE_PRIORITIES.indexOf(arg1.type);\n const index2 = STREAM_TYPE_PRIORITIES.indexOf(arg2.type);\n\n if (index1 === -1 && index2 > -1) {\n return 1;\n }\n\n if (index2 === -1 && index1 > -1) {\n return -1;\n }\n\n return index1 - index2;\n};\n\nconst sortStreams: (channel: NETGEM_API_CHANNEL_INFO) => void = (channel) => {\n const { channelId, name, urlContentType } = channel;\n\n if (!urlContentType) {\n logWarning(`No URL for ${name || channelId}. Check that this channel is indeed a FAST channel.`);\n return;\n }\n\n const { playback, playbacks } = urlContentType;\n let pbs = playbacks ?? [];\n\n if (playback) {\n if (!playbacks && playback) {\n pbs = [playback];\n urlContentType.playbacks = pbs;\n }\n urlContentType.playback = undefined;\n }\n\n pbs.forEach((pb) => {\n const {\n start: { params }\n } = pb;\n const videostreamParam = params.find((param) => param.name === 'videostreams');\n if (videostreamParam) {\n const {\n value: { args }\n } = videostreamParam;\n // Sort by stream type\n args.sort(compareStreamTypes);\n\n args.forEach((stream) => {\n // Sort by DRM\n const { drms } = stream;\n drms.sort((s1, s2) => compareDrms(s1.type, s2.type));\n });\n }\n });\n};\n\nconst toBoolean: (value: ?string) => boolean = (value) => {\n if (value) {\n return value === '1' || value.toLowerCase() === 'true';\n }\n return false;\n};\n\nconst consolidateChannel: (dmsChannel: NETGEM_API_CHANNEL, ptfChannel?: NETGEM_API_CHANNEL_INFO) => NETGEM_API_CHANNEL = (dmsChannel, ptfChannel) => {\n if (!ptfChannel || !dmsChannel.data?.npvr || !dmsChannel.data?.stream) {\n return dmsChannel;\n }\n\n const {\n data: {\n npvr: { hasCatchup, hasKeepFromReplay, hasStartover, isRecordable },\n stream: { isSeekable }\n },\n epgid\n } = dmsChannel;\n const { hasCatchup: channelHasCatchup, hasKeepFromReplay: channelHasKeepFromReplay, images, isRecordable: channelIsRecordable, metrics } = ptfChannel;\n\n // Removed useless metrics (stb, mobile and tablet)\n if (metrics) {\n const cleanedMetrics = [];\n metrics.forEach((metric) => {\n const { properties } = metric;\n metric.properties = properties.filter((p) => p.device === MetricsProperties.Desktop);\n if (metric.properties.length > 0) {\n cleanedMetrics.push(metric);\n }\n });\n\n ptfChannel.metrics = cleanedMetrics.length > 0 ? cleanedMetrics : undefined;\n }\n\n // Channel image: default value is epgid\n let imageId: string | null = epgid;\n if (Array.isArray(images)) {\n if (images.length > 0) {\n // If an id exists in images, use the first one\n imageId = images[0].id ?? null;\n } else {\n // If images is present but empty, no image should be displayed\n imageId = null;\n }\n }\n\n const consolidatedChannel = JSON.parse(JSON.stringify(dmsChannel));\n\n consolidatedChannel.info = ptfChannel;\n consolidatedChannel.consolidated = {\n hasCatchup: toBoolean(hasCatchup) && channelHasCatchup,\n hasKeepFromReplay: toBoolean(hasKeepFromReplay) && channelHasKeepFromReplay,\n hasStartover: toBoolean(hasStartover),\n hasTimeshift: toBoolean(isSeekable),\n imageId,\n isRecordable: toBoolean(isRecordable) && channelIsRecordable\n };\n\n return consolidatedChannel;\n};\n\n// Consolidate data received from DMS (deviceChannels) with data received from PTF (channelsInfo)\nconst consolidateChannels: (dmsChannels: ChannelMap, channelsInfo: Array<NETGEM_API_CHANNEL_INFO>) => ChannelMap = (dmsChannels, channelsInfo) => {\n const channels: ChannelMap = {};\n\n // Lookup table for channels coming from PTF\n const ptfChannels = new Map<string, NETGEM_API_CHANNEL_INFO>();\n channelsInfo.forEach((channel) => ptfChannels.set(channel.channelId, channel));\n\n Object.keys(dmsChannels).forEach((channelId) => {\n const { [channelId]: dmsChannel } = dmsChannels;\n const ptfChannel = ptfChannels.get(channelId);\n const { isHidden } = dmsChannel;\n\n if (ptfChannel && !isHidden) {\n sortStreams(ptfChannel);\n }\n\n channels[channelId] = consolidateChannel(dmsChannel, ptfChannel);\n\n if (!ptfChannel) {\n logWarning(`Channel \"${channelId}\" found in DMS but not in PTF`);\n }\n });\n\n return channels;\n};\n\nconst sendV8MetadataChannelsRequest: (signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const state = getState();\n const {\n appConfiguration: { deviceChannels, listAlias },\n netgemApi: { metadataChannelsUrl }\n } = state;\n\n if (!listAlias) {\n // No service\n return Promise.resolve();\n }\n\n if (!metadataChannelsUrl) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definition', { urlDef: 'metadataChannelsUrl' }));\n }\n\n const { authent, method } = metadataChannelsUrl;\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_GENERIC, {\n authent,\n method,\n signal,\n uri: generateApiUrl(metadataChannelsUrl, {}, state)\n }).then((response: NETGEM_API_V8_REQUEST_RESPONSE) => {\n const channelsInfo = ((response.result: any): Array<NETGEM_API_CHANNEL_INFO>);\n dispatch(updateDeviceChannels(consolidateChannels(deviceChannels, channelsInfo)));\n return Promise.resolve(response);\n });\n };\n\nexport default sendV8MetadataChannelsRequest;\n","/* @flow */\n\nimport type { BasicFunction } from '@ntg/utils/dist/types';\n\nexport default class CancellablePromise {\n abortHandler: BasicFunction | null;\n\n abortHandlerController: AbortController | null;\n\n promise: Promise<any>;\n\n constructor(promise: Promise<any>, signal: ?AbortSignal) {\n this.abortHandler = null;\n\n if (!signal) {\n // No signal\n this.promise = promise;\n return;\n }\n\n if (signal.aborted) {\n // Signal already aborted\n\n // $FlowFixMe: flow doesn't know DOMException\n this.promise = Promise.reject(new DOMException('Promise cancelled from CancellablePromise (early abort)', 'AbortError'));\n return;\n }\n\n // Signal passed and still alive\n\n this.abortHandlerController = new AbortController();\n\n const signalPromise = new Promise((_, reject) => {\n // $FlowFixMe: flow doesn't know DOMException\n this.abortHandler = () => reject(new DOMException('Promise cancelled from CancellablePromise', 'AbortError'));\n signal.addEventListener('abort', this.abortHandler);\n });\n\n this.promise = Promise.race([promise, signalPromise]).then((data) => {\n // Removes event listener\n this.abortHandlerController?.abort();\n return Promise.resolve(data);\n });\n }\n\n // $FlowFixMe: Flow does not support symbols yet\n get [Symbol.toStringTag]() {\n return 'CancellablePromise';\n }\n\n getPromise: () => Promise<any> = () => this.promise;\n}\n","/* @flow */\n\nimport {\n BO_INVALID_APPLICATION_V2,\n BO_INVALID_JWT_V2,\n BO_INVALID_SUBSCRIBER_V2,\n BO_PURCHASE_ALREADY_PURCHASED_V2,\n BO_PURCHASE_INVALID_PROMOCODE_FOR_TITLE_V2,\n BO_PURCHASE_INVALID_PROMOCODE_V2,\n BO_PURCHASE_INVALID_USER_IP_V2,\n BO_PURCHASE_SVOD_CONTENT_RIGHT_NOT_FOUND_V2,\n BO_STREAM_DEVICE_NOT_FOUND,\n BO_STREAM_INVALID_USER_IP,\n BO_STREAM_MAX_CONCURRENT_STREAMS_REACHED,\n BO_STREAM_NO_SVOD_CONTENT_RIGHT,\n} from '../videofutur/types/ErrorCodes';\nimport { type SentryDataType, SentryTagName, SentryTagValue } from '../../../helpers/debug/sentryTypes';\nimport { XhrResponseType, getXhrResponseTypeFromString } from '../../../helpers/jsHelpers/xhr';\nimport CancellablePromise from './cancellablePromise/CancellablePromise';\nimport { CustomNetworkError } from './CustomNetworkError';\nimport { HttpMethod } from '../v8/types/HttpMethod';\nimport { HttpStatus } from '../v8/constants/NetworkCodesAndMessages';\nimport type { NETGEM_API_V8_REQUEST_HEADERS } from '../v8/types/Headers';\nimport SentryWrapper from '../../../helpers/debug/sentry';\nimport { createCustomNetworkError } from './CreateCustomNetworkError';\nimport { logError } from '../../../helpers/debug/debug';\n\nexport type CommonPromisedXMLHttpRequestReturnType = {|\n promise: Promise<any>,\n xhr: XMLHttpRequest,\n|};\n\nconst getETagFromRequest: (req: XMLHttpRequest) => string | null = (req) => {\n const responseHeaders = req.getAllResponseHeaders();\n const result = /\\betag:\\s*(.+)/giu.exec(responseHeaders);\n if (result && result.length > 0) {\n return result[1] ?? null;\n }\n\n return null;\n};\n\nconst isErrorExcluded: (req: XMLHttpRequest, url: string) => boolean = (req, url) => {\n const { status } = req;\n\n if (status === HttpStatus.NotModified) {\n // Do not report 304 status because we heavily rely on them\n return true;\n }\n\n if (status === HttpStatus.NotFound && (url.endsWith('key=wishlist') || url.indexOf('key=viewinghistory') > -1)) {\n // Do not report 404 status for wishlist and viewing history since it's expected when these lists are empty\n return true;\n }\n\n return status === HttpStatus.Unauthorized && req.getResponseHeader('WWW-Authenticate') !== null;\n};\n\nconst notifySentry: (req: XMLHttpRequest, url: string, customNetworkError: CustomNetworkError, message: string, error?: Error) => void = (req, url, customNetworkError, message, error) => {\n if (isErrorExcluded(req, url)) {\n return;\n }\n\n let tagValue: SentryTagValue = SentryTagValue.Xhr;\n const breadcrumbs: Array<string> = [message];\n const customCode: number = customNetworkError.getCustomCode();\n\n if (url.indexOf('datacoll') > -1) {\n tagValue = SentryTagValue.DataCollect;\n breadcrumbs.push('data collect');\n } else if (url.endsWith('/purchase') || url.endsWith('/purchaseStatus')) {\n tagValue = SentryTagValue.VodPurchase;\n breadcrumbs.push('purchase or purchaseStatus');\n } else if (url.endsWith('/record') || url.endsWith('/record/future') || url.endsWith('/scheduledRecord/List') || url.endsWith('/scheduledRecord') || url.indexOf('/scheduledRecord?id=') > -1) {\n tagValue = SentryTagValue.Recorder;\n breadcrumbs.push('recorder');\n } else if (url.endsWith('/stream/create') || url.endsWith('/stream/start') || url.endsWith('/stream/stop')) {\n tagValue = SentryTagValue.Player;\n breadcrumbs.push('stream create/start/stop');\n }\n\n // Possible codes for stream and purchase endpoints\n if (customCode === BO_STREAM_MAX_CONCURRENT_STREAMS_REACHED) {\n breadcrumbs.push('max concurrent streams reached');\n } else if (customCode === BO_STREAM_NO_SVOD_CONTENT_RIGHT || customCode === BO_PURCHASE_SVOD_CONTENT_RIGHT_NOT_FOUND_V2) {\n breadcrumbs.push('no SVOD right');\n } else if (customCode === BO_STREAM_INVALID_USER_IP || customCode === BO_PURCHASE_INVALID_USER_IP_V2) {\n breadcrumbs.push('invalid user IP');\n } else if (customCode === BO_STREAM_DEVICE_NOT_FOUND || customCode === BO_INVALID_JWT_V2 || customCode === BO_INVALID_APPLICATION_V2 || customCode === BO_INVALID_SUBSCRIBER_V2) {\n breadcrumbs.push('device not found or invalid token');\n } else if (customCode === BO_PURCHASE_INVALID_PROMOCODE_V2 || customCode === BO_PURCHASE_INVALID_PROMOCODE_FOR_TITLE_V2) {\n breadcrumbs.push('invalid promocode');\n } else if (customCode === BO_PURCHASE_ALREADY_PURCHASED_V2) {\n breadcrumbs.push('already purchased');\n }\n\n const data: SentryDataType = {\n breadcrumbs,\n context: {\n customCode: customNetworkError.getCustomCode(),\n customMessage: customNetworkError.message,\n customStatus: customNetworkError.getCustomStatus(),\n status: customNetworkError.getStatus(),\n url,\n },\n message,\n tagName: SentryTagName.Component,\n tagValue,\n };\n\n if (error) {\n data.error = error;\n }\n\n SentryWrapper.error(data);\n};\n\nconst commonPromisedXMLHttpRequest: (\n url: string,\n method: HttpMethod,\n expectedResponseType: XhrResponseType,\n requestHeaderList: ?NETGEM_API_V8_REQUEST_HEADERS,\n bodyParam: ?string,\n requestParam: ?string,\n withCredentials: boolean,\n networkErrorCallBack: (request: XMLHttpRequest, message: ?string) => CustomNetworkError,\n signal: ?AbortSignal,\n keepAlive?: boolean,\n) => CommonPromisedXMLHttpRequestReturnType = (url, method, expectedResponseType, requestHeaderList, bodyParam, requestParam, withCredentials, networkErrorCallBack, signal, keepAlive) => {\n const headers = requestHeaderList ?? [];\n const req = new XMLHttpRequest();\n\n const initialPromise = new Promise((resolve, reject) => {\n const baseUrl = `${url}${requestParam ?? ''}`;\n\n req.open((method: string), baseUrl, true);\n\n req.onload = () => {\n try {\n const { status } = req;\n\n if (status >= HttpStatus.OK && status < HttpStatus.MultipleChoices) {\n // Response OK: let's process it\n const { response, responseType } = req;\n if (getXhrResponseTypeFromString(responseType) === XhrResponseType.Xml) {\n const { responseXML } = req;\n if (responseXML) {\n resolve(responseXML);\n return;\n }\n }\n resolve(response);\n return;\n }\n\n // Error\n const customNetworkError = networkErrorCallBack(req);\n notifySentry(req, url, customNetworkError, 'XHR onload bad status');\n reject(customNetworkError);\n } catch (err) {\n logError(`[OnLoad] XHR error for: ${url}`);\n const customNetworkError = networkErrorCallBack(req, err.message);\n notifySentry(req, url, customNetworkError, 'XHR onload catch', err);\n reject(customNetworkError);\n }\n };\n\n req.onerror = () => {\n const customNetworkError = networkErrorCallBack(req);\n logError(`[OnError] XHR error for: ${url}`);\n notifySentry(req, url, customNetworkError, 'XHR onerror');\n reject(customNetworkError);\n };\n\n req.responseType = (expectedResponseType: string);\n req.withCredentials = withCredentials;\n\n // Keep-alive if required\n if (keepAlive === true) {\n req.setRequestHeader('Connection', 'keep-alive');\n }\n\n // Set request header\n if (headers) {\n headers.forEach((header) => {\n const { name, value } = header;\n req.setRequestHeader(name, value);\n });\n }\n\n // Make the request\n req.send(bodyParam);\n });\n\n const cancellablePromise = new CancellablePromise(initialPromise, signal);\n\n return {\n promise: cancellablePromise.getPromise(),\n xhr: req,\n };\n};\n\nconst commonNetworkErrorCallBack: (request: XMLHttpRequest, message: ?string) => CustomNetworkError = (request, message) => {\n const { response, status, statusText } = request;\n\n // In BO v2 everything is wrapped in 'body'\n return createCustomNetworkError(status, message ?? statusText, request.getAllResponseHeaders(), response?.body ?? response);\n};\n\nexport { commonNetworkErrorCallBack, commonPromisedXMLHttpRequest, getETagFromRequest };\n","/* @flow */\n\nimport { BO_INVALID_APPLICATION_V2, BO_INVALID_JWT_V2, BO_INVALID_SUBSCRIBER_V2, BO_STREAM_DEVICE_NOT_FOUND } from '../types/ErrorCodes';\nimport { type CommonPromisedXMLHttpRequestReturnType, commonNetworkErrorCallBack, commonPromisedXMLHttpRequest, getETagFromRequest } from '../../helpers/CommonPromisedXMLHttpRequest';\nimport { Messenger, MessengerEvents } from '@ntg/utils/dist/messenger';\nimport type { BO_API_PARAMETERS_TYPE } from '../../../../helpers/videofutur/queryParameters';\nimport type { BO_RESPONSE_WITH_ETAG } from '../../../../redux/netgemApi/actions/videofutur/types/common';\nimport { CustomNetworkError } from '../../helpers/CustomNetworkError';\nimport { HeaderName } from '../../v8/constants/Headers';\nimport { HttpMethod } from '../../v8/types/HttpMethod';\nimport type { KeyValuePair } from '@ntg/utils/dist/types';\nimport type { NETGEM_API_V8_REQUEST_HEADERS } from '../../v8/types/Headers';\nimport { XhrResponseType } from '../../../../helpers/jsHelpers/xhr';\n\nconst buildUrl: (url: string, parameters: BO_API_PARAMETERS_TYPE) => string = (url, parameters) => {\n let urlWithParameters = url;\n\n Object.entries(parameters).forEach(([key, value]) => {\n urlWithParameters = urlWithParameters.replace(`{${key}}`, typeof value === 'string' ? value : '');\n });\n\n return urlWithParameters;\n};\n\nconst sendBORequest: (\n baseUrl: string,\n method: HttpMethod,\n authenticationToken: string | null,\n body: ?KeyValuePair<string | number | boolean>,\n headers: ?NETGEM_API_V8_REQUEST_HEADERS,\n signal?: AbortSignal,\n keepAlive?: boolean,\n eTag?: string,\n) => Promise<BO_RESPONSE_WITH_ETAG> = (baseUrl, method, authenticationToken, body, headers, signal, keepAlive, eTag) => {\n // Add authentication token\n const headerList = headers ?? [];\n\n if (authenticationToken) {\n // BO API v2: add authentication token if present\n headerList.push({\n name: HeaderName.Authorization,\n value: `Bearer ${authenticationToken ?? ''}`,\n });\n }\n\n if (eTag) {\n headerList.push({\n name: !method || method === HttpMethod.GET ? HeaderName.IfNoneMatch : HeaderName.IfMatch,\n value: eTag,\n });\n }\n\n const returnObject: CommonPromisedXMLHttpRequestReturnType = commonPromisedXMLHttpRequest(\n baseUrl,\n method,\n XhrResponseType.Json,\n headers,\n body ? JSON.stringify(body) : null,\n null,\n false,\n commonNetworkErrorCallBack,\n signal,\n keepAlive,\n );\n\n return returnObject.promise\n .then((response: any) => {\n const { xhr } = returnObject;\n const newETag = getETagFromRequest(xhr);\n\n return Promise.resolve({ eTag: newETag, response });\n })\n .catch((error: CustomNetworkError) => {\n const code = error.getCustomCode();\n if (code === BO_STREAM_DEVICE_NOT_FOUND || code === BO_INVALID_JWT_V2 || code === BO_INVALID_APPLICATION_V2 || code === BO_INVALID_SUBSCRIBER_V2) {\n // Token expired (device probably disconnected)\n Messenger.emit(MessengerEvents.AUTHENTICATION_REQUIRED);\n }\n\n throw error;\n });\n};\n\nexport { buildUrl, sendBORequest };\n","/* @flow */\n\nimport type { NetgemApiEmitterType, RequestResponseMethodDefinitionType } from '../emitter';\nimport type { CombinedReducers } from '../../../reducers';\nimport type { Dispatch } from '../../../types/types';\nimport { REDUX_MSG_REQUEST_BO_AUTHENTICATE } from '../../constants/';\nimport { buildMissingParametersError } from '../../../../helpers/debug/debug';\nimport { buildUrl } from '../../../../libs/netgemLibrary/videofutur/requests/bo';\nimport { createCustomNetworkErrorFromKey } from '../../../../libs/netgemLibrary/helpers/CreateCustomNetworkError';\nimport { getSettingValueByName } from '../helpers/settings';\nimport { updateBOState } from '../../../appConf/actions';\n\nconst sendAuthenticationRequest: (applicationId: string, deviceKey: string, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (applicationId, deviceKey, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const {\n appConfiguration,\n appConfiguration: { distributorAppKeys, mainDistributorId },\n } = getState();\n const baseurl = getSettingValueByName('platform.vf', 'baseurl', appConfiguration);\n const authenticationEndpoint = getSettingValueByName('platform.vf', 'authentication', appConfiguration);\n\n if (!mainDistributorId) {\n dispatch(updateBOState(false));\n return Promise.reject(\n createCustomNetworkErrorFromKey('common.messages.errors.missing_parameters_list', {\n list: 'mainDistributorId',\n name: 'BO authenticate',\n })\n );\n }\n\n const { [mainDistributorId]: appKey } = distributorAppKeys;\n\n if (!appKey || !authenticationEndpoint || !baseurl) {\n dispatch(updateBOState(false));\n return Promise.reject(\n buildMissingParametersError(\n {\n appKey,\n authenticationEndpoint,\n baseurl,\n },\n 'BO authenticate'\n )\n );\n }\n\n const authenticationUrl = buildUrl(authenticationEndpoint, { baseurl });\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_BO_AUTHENTICATE, {\n appKey,\n applicationId,\n authenticationUrl,\n deviceKey,\n signal,\n });\n };\n\nexport default sendAuthenticationRequest;\n","/* @flow */\n\nimport {\n type BOApiUrlDefinition,\n BO_API_ADD_FAVORITE,\n BO_API_CREATE_STREAM2,\n BO_API_DELETE_FAVORITE,\n BO_API_FAVORITE_LIST,\n BO_API_GET_STREAMS,\n BO_API_PERSONAL_DATA,\n BO_API_PURCHASE,\n BO_API_PURCHASE_LIST,\n BO_API_PURCHASE_STATUS,\n BO_API_START_STREAM,\n BO_API_STOP_STREAM,\n} from './types/common';\nimport type { NetgemApiEmitterType, RequestResponseMethodDefinitionType } from '../emitter';\nimport { buildMissingParametersError, logError } from '../../../../helpers/debug/debug';\nimport type { BO_API_SETTING } from '../../../../libs/netgemLibrary/videofutur/types/Discovery';\nimport type { CombinedReducers } from '../../../reducers';\nimport type { Dispatch } from '../../../types/types';\nimport { HttpMethod } from '../../../../libs/netgemLibrary/v8/types/HttpMethod';\nimport { REDUX_MSG_REQUEST_BO_DISCOVERY } from '../../constants';\nimport { addDistributor } from '../index';\nimport { createCustomNetworkErrorFromKey } from '../../../../libs/netgemLibrary/helpers/CreateCustomNetworkError';\nimport { getBOSetting } from '../helpers/boSettings';\nimport { getSettingValueByName } from '../helpers/settings';\n\nconst buildUrlDefinition: (identity: string | null, settings: Array<BO_API_SETTING>, apiName: string, method: HttpMethod, queryStringParameters?: Array<string>) => BOApiUrlDefinition | null = (\n identity,\n settings,\n apiName,\n method,\n queryStringParameters,\n) => {\n const setting = settings.find((s) => s.type === apiName);\n if (!setting) {\n return null;\n }\n\n const { url } = setting;\n\n return {\n authent: true,\n method,\n params: queryStringParameters ?? [],\n uri: url,\n };\n};\n\nconst sendDiscoveryRequestForDistributor: (distributor: string, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (distributor, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const {\n appConfiguration,\n appConfiguration: {\n configuration: { boV2ServiceInfoUrl: discoveryUrl },\n },\n } = getState();\n const baseurl = getSettingValueByName('platform.vf', 'baseurl', appConfiguration);\n const discoveryEndpoint = getSettingValueByName('platform.vf', 'discovery', appConfiguration);\n const device = getSettingValueByName('platform.vf', 'device', appConfiguration);\n const identity = getBOSetting('identity', appConfiguration);\n\n // Check parameters\n if (!baseurl || !device || !discoveryEndpoint) {\n return Promise.reject(\n buildMissingParametersError(\n {\n baseurl,\n device,\n discoveryEndpoint,\n identity,\n },\n 'BO discovery',\n ),\n );\n }\n\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_BO_DISCOVERY, {\n device,\n discoveryUrl,\n distributor,\n identity,\n signal,\n })\n .then((service) => {\n if (!service) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definitions_for_distributor', { distributorId: distributor }));\n }\n\n const { settings } = service;\n\n const distributorDef = {\n urls: {\n [BO_API_ADD_FAVORITE]: buildUrlDefinition(identity, settings, BO_API_ADD_FAVORITE, HttpMethod.POST),\n [BO_API_CREATE_STREAM2]: buildUrlDefinition(identity, settings, BO_API_CREATE_STREAM2, HttpMethod.POST, ['vtiId']),\n [BO_API_DELETE_FAVORITE]: buildUrlDefinition(identity, settings, BO_API_DELETE_FAVORITE, HttpMethod.DELETE),\n [BO_API_FAVORITE_LIST]: buildUrlDefinition(identity, settings, BO_API_FAVORITE_LIST, HttpMethod.GET),\n [BO_API_GET_STREAMS]: buildUrlDefinition(identity, settings, BO_API_GET_STREAMS, HttpMethod.GET),\n [BO_API_PERSONAL_DATA]: buildUrlDefinition(identity, settings, BO_API_PERSONAL_DATA, HttpMethod.GET, []),\n [BO_API_PURCHASE]: buildUrlDefinition(identity, settings, BO_API_PURCHASE, HttpMethod.POST, ['vtiId']),\n [BO_API_PURCHASE_LIST]: buildUrlDefinition(identity, settings, BO_API_PURCHASE_LIST, HttpMethod.GET),\n [BO_API_PURCHASE_STATUS]: buildUrlDefinition(identity, settings, BO_API_PURCHASE_STATUS, HttpMethod.POST, ['vtiId']),\n [BO_API_START_STREAM]: buildUrlDefinition(identity, settings, BO_API_START_STREAM, HttpMethod.POST, ['streamId']),\n [BO_API_STOP_STREAM]: buildUrlDefinition(identity, settings, BO_API_STOP_STREAM, HttpMethod.POST, ['streamId']),\n },\n };\n\n dispatch(addDistributor(distributor, distributorDef));\n return Promise.resolve(distributorDef);\n })\n .catch(() => logError(`Unknown distributor: ${distributor}`));\n };\n\nexport default sendDiscoveryRequestForDistributor;\n","/* @flow */\n\nimport { type AllSettledPromises, SettledPromiseFulfilled } from '../../../../../helpers/jsHelpers/promise';\nimport type { CombinedReducers } from '../../../../reducers';\nimport type { Dispatch } from '../../../../types/types';\nimport type { Distributor } from '../types/common';\nimport type { RequestResponseMethodDefinitionType } from '../../emitter';\nimport sendDiscoveryRequestForDistributor from '../discovery';\nimport { updateBOState } from '../../../../appConf/actions';\n\nconst sendDiscoveryRequest: (signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers): Promise<any> => {\n const {\n appConfiguration: { distributorAppKeys },\n } = getState();\n\n const promises = Array.from(Object.keys(distributorAppKeys)).map((distributorId) => dispatch(sendDiscoveryRequestForDistributor(distributorId, signal)));\n\n return Promise.allSettled(promises).then((results: AllSettledPromises) => {\n for (const result of results) {\n if (result.status === SettledPromiseFulfilled) {\n const { urls } = (result.value: Distributor);\n if (Object.keys(urls).length > 0) {\n dispatch(updateBOState(true));\n break;\n }\n }\n }\n });\n };\n\nexport default sendDiscoveryRequest;\n","/* @flow */\n\nimport { BO_API_PERSONAL_DATA, type BO_RESPONSE_WITH_ETAG } from './types/common';\nimport type { NetgemApiEmitterType, RequestResponseMethodDefinitionType } from '../emitter';\nimport type { CombinedReducers } from '../../../reducers';\nimport type { Dispatch } from '../../../types/types';\nimport { REDUX_MSG_REQUEST_BO_PERSONAL_DATA } from '../../constants';\nimport { createCustomNetworkErrorFromKey } from '../../../../libs/netgemLibrary/helpers/CreateCustomNetworkError';\nimport getRequestDetails from './helpers/requestCommon';\nimport { logError } from '../../../../helpers/debug/debug';\nimport { updateBOProductId } from '../../../appConf/actions';\n\nconst sendVideofuturPersonalDataRequest: (signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (distributorId, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const {\n appConfiguration: { mainDistributorId },\n } = getState();\n\n if (!mainDistributorId) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_distributor_id'));\n }\n\n return dispatch(getRequestDetails(mainDistributorId, BO_API_PERSONAL_DATA))\n .then((requestDetails) =>\n // Object 'requestDetails' contains 'headers', 'method' and 'uri' parameters\n NetgemApiEmitter.emit(REDUX_MSG_REQUEST_BO_PERSONAL_DATA, {\n ...requestDetails,\n signal,\n }),\n )\n .then(({ response }: BO_RESPONSE_WITH_ETAG) => {\n if (signal?.aborted) {\n return;\n }\n\n const {\n body: {\n data: { productId },\n },\n } = response;\n\n dispatch(updateBOProductId(productId));\n })\n .catch((error) => logError(`Error retrieving personal data for \"${mainDistributorId}\": ${error.message}`));\n };\n\nexport default sendVideofuturPersonalDataRequest;\n","/* @flow */\n\nimport './StartView.css';\nimport * as React from 'react';\nimport type { BasicFunction, KeyValuePair } from '@ntg/utils/dist/types';\nimport { FEATURE_SUBSCRIPTION, type FEATURE_TYPE, FEATURE_VOD } from '../../redux/appConf/constants';\nimport { createTagListAliases, sendV8ListAliasPostRequest } from '../../redux/netgemApi/actions/v8/listAlias';\nimport { logDebug, logError, logInfo, logWarning } from '../../helpers/debug/debug';\nimport { sendCommercialOffersRequest, sendDefaultRightsRequest, sendUserRightsRequest } from '../../redux/netgemApi/actions/v8/rights';\nimport { sendV8DefaultHubRequest, sendV8HubRequest } from '../../redux/netgemApi/actions/v8/hub';\nimport type { AppConfigurationFeatures } from '../../redux/appConf/types/types';\nimport type { CombinedReducers } from '../../redux/reducers';\nimport { CustomNetworkError } from '../../libs/netgemLibrary/helpers/CustomNetworkError';\nimport DebugPicto from '@ntg/components/dist/pictos/DebugPicto';\nimport type { Dispatch } from '../../redux/types/types';\nimport { DmsNetworkCode } from '../../libs/netgemLibrary/dms/constants/NetworkCodesAndMessages';\nimport HotKeys from '../../helpers/hotKeys/hotKeys';\nimport InfiniteCircleLoaderArc from '../loader/infiniteCircleLoaderArc';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport { MILLISECONDS_PER_SECOND } from '../../helpers/dateTime/Format';\nimport { RegistrationType } from '../../redux/appRegistration/types/types';\nimport clsx from 'clsx';\nimport { connect } from 'react-redux';\nimport { getAppLottieLoader } from '../../helpers/applicationCustomization/ui';\nimport { isTabHidden } from '../../helpers/ui/browser';\nimport lottie from 'lottie-web';\nimport { produce } from 'immer';\nimport sendGetDeviceChannelListRequest from '../../redux/netgemApi/actions/dms/channelList';\nimport sendGetDeviceSettingsRequest from '../../redux/netgemApi/actions/dms/deviceSettings';\nimport sendLoginRequest from '../../redux/netgemApi/actions/dms/login';\nimport sendV8DiscoveryRequest from '../../redux/netgemApi/actions/v8/discovery';\nimport sendV8MetadataChannelsRequest from '../../redux/netgemApi/actions/v8/metadataChannels';\nimport sendVideofuturAuthenticationRequest from '../../redux/netgemApi/actions/videofutur/authentication';\nimport sendVideofuturDiscoveryRequest from '../../redux/netgemApi/actions/videofutur/helpers/discovery';\nimport sendVideofuturPersonalDataRequest from '../../redux/netgemApi/actions/videofutur/personalData';\nimport { stopOpenStreams } from '../../redux/netgemApi/actions/videofutur/helpers/stopOpenStreams';\nimport { toggleDebugMode } from '../../redux/appConf/actions';\n\n// $FlowFixMe: Flow doesn't know 'unit' style\nconst formatMs = (time: number) => new Intl.NumberFormat('fr-FR', { maximumFractionDigits: 0, style: 'unit', unit: 'millisecond' }).format(time);\n\nconst Padding = Object.freeze({\n Duration: 10,\n InitSequence: 15,\n Name: 40,\n StepName: 23,\n Version: 31,\n VersionBO: 28,\n VersionCrmBack: 22,\n VersionCrmFront: 21,\n});\n\nconst Css = Object.freeze({\n Initial: 'background-color: unset; color: unset; font-weight: normal',\n StepError: 'background-color: #F00; color: #000; font-weight: bold',\n StepSuccess: 'background-color: #0F0; color: #000; font-weight: bold',\n});\n\n// Wait two minutes at startup before declaring failure (in milliseconds)\nconst STARTING_TIMEOUT = 120_000;\n\nenum QueryStatus {\n NotStarted = '',\n Disabled = 'disabled',\n Error = 'error',\n InProgress = 'inProgress',\n Success = 'success',\n}\n\ntype STEP_ITEM = {|\n name: string,\n parameters?: Array<'applicationId' | 'deviceKey'>,\n request: any,\n then?: Array<STEP_ITEM>,\n thenAfter?: Array<STEP_ITEM>,\n|};\n\ntype STEP_TYPE = {|\n displayIndex: number,\n displayName: string,\n feature?: FEATURE_TYPE,\n isOptional?: boolean,\n name: string,\n|};\n\nconst StepName = Object.freeze({\n ChannelList: 'channelList',\n ChannelsInfo: 'channelsInfo',\n CommercialOffers: 'commercialOffers',\n DefaultHub: 'defaultHub',\n DefaultRights: 'defaultRights',\n DeviceSettings: 'deviceSettings',\n Discovery: 'discovery',\n Hub: 'hub',\n ListAlias: 'listAlias',\n Login: 'login',\n TagListAliases: 'tagListAliases',\n UserRights: 'userRights',\n VideofuturAuthentication: 'boAuthentication',\n VideofuturDiscovery: 'boDiscovery',\n VideofuturPersonalData: 'boPersonalData',\n VideofuturStopOpenStreams: 'boStopOpenStreams',\n});\n\ntype STEP_SET = KeyValuePair<STEP_TYPE>;\n\n// Define all existing startup steps\nconst STEPS: $ReadOnly<STEP_SET> = Object.freeze({\n [StepName.ChannelList]: {\n displayIndex: 2,\n displayName: 'DMS Channel List',\n name: StepName.ChannelList,\n },\n [StepName.ChannelsInfo]: {\n displayIndex: 5,\n displayName: 'PTF Channels Info',\n name: StepName.ChannelsInfo,\n },\n [StepName.CommercialOffers]: {\n displayIndex: 9,\n displayName: 'PTF Commercial Offers',\n feature: FEATURE_SUBSCRIPTION,\n isOptional: true,\n name: StepName.CommercialOffers,\n },\n [StepName.DefaultHub]: {\n displayIndex: 8,\n displayName: 'PTF Default Hub',\n name: StepName.DefaultHub,\n },\n [StepName.DefaultRights]: {\n displayIndex: 10,\n displayName: 'PTF Default Rights',\n feature: FEATURE_SUBSCRIPTION,\n isOptional: true,\n name: StepName.DefaultRights,\n },\n [StepName.DeviceSettings]: {\n displayIndex: 1,\n displayName: 'DMS Device Settings',\n name: StepName.DeviceSettings,\n },\n [StepName.Discovery]: {\n displayIndex: 3,\n displayName: 'PTF Discovery',\n name: StepName.Discovery,\n },\n [StepName.Hub]: {\n displayIndex: 7,\n displayName: 'PTF Hub',\n name: StepName.Hub,\n },\n [StepName.ListAlias]: {\n displayIndex: 4,\n displayName: 'PTF Channel List Alias',\n name: StepName.ListAlias,\n },\n [StepName.Login]: {\n displayIndex: 0,\n displayName: 'DMS Login',\n name: StepName.Login,\n },\n [StepName.TagListAliases]: {\n displayIndex: 6,\n displayName: 'PTF Tag List Aliases',\n name: StepName.TagListAliases,\n },\n [StepName.UserRights]: {\n displayIndex: 11,\n displayName: 'PTF User Rights',\n feature: FEATURE_SUBSCRIPTION,\n isOptional: true,\n name: StepName.UserRights,\n },\n [StepName.VideofuturAuthentication]: {\n displayIndex: 12,\n displayName: 'BO Login',\n feature: FEATURE_VOD,\n name: StepName.VideofuturAuthentication,\n },\n [StepName.VideofuturDiscovery]: {\n displayIndex: 12,\n displayName: 'BO Discovery',\n feature: FEATURE_VOD,\n name: StepName.VideofuturDiscovery,\n },\n [StepName.VideofuturPersonalData]: {\n displayIndex: 14,\n displayName: 'BO Personal Data',\n feature: FEATURE_VOD,\n name: StepName.VideofuturPersonalData,\n },\n [StepName.VideofuturStopOpenStreams]: {\n displayIndex: 15,\n displayName: 'BO Kill Streams (<count>)',\n feature: FEATURE_VOD,\n name: StepName.VideofuturStopOpenStreams,\n },\n});\n\ntype ReduxStartReducerStateType = {|\n +applicationId: string,\n +applicationName: string,\n +authDeviceUrl: string,\n +authenticationToken: string | null,\n +deviceKey: string,\n +features: AppConfigurationFeatures,\n +isDebugModeEnabled: boolean,\n +isRegisteredAsGuest: boolean,\n +subscriberId: string,\n +upgradeDeviceUrl: string,\n +versionBO: string,\n +versionCrmBack: string,\n +versionCrmFront: string,\n +versionShort: string,\n|};\n\ntype ReduxStartDispatchToPropsType = {|\n +localCreateTagListAliases: (signal: AbortSignal) => Promise<any>,\n +localSendCommercialOfferRequest: (signal: AbortSignal) => Promise<any>,\n +localSendDefaultHubRequest: (signal: AbortSignal) => Promise<any>,\n +localSendDefaultRightsRequest: (signal: AbortSignal) => Promise<any>,\n +localSendDiscoveryRequest: (signal: AbortSignal) => Promise<any>,\n +localSendGetDeviceChannelListRequest: (signal: AbortSignal) => Promise<any>,\n +localSendGetDeviceSettingRequest: (signal: AbortSignal) => Promise<any>,\n +localSendHubRequest: (signal: AbortSignal) => Promise<any>,\n +localSendListAliasPostRequest: (signal: AbortSignal) => Promise<any>,\n +localSendLoginRequest: (authDeviceUrl: string, upgradeDeviceUrl: string, applicationId: string, subscriberId: string, deviceKey: string, signal?: AbortSignal) => Promise<any>,\n +localSendMetadataChannelsRequest: (signal: AbortSignal) => Promise<any>,\n +localSendUserRightsRequest: (signal: AbortSignal) => Promise<any>,\n +localSendVideofuturAuthenticationRequest: (applicationId: string, deviceKey: string, signal: AbortSignal) => Promise<any>,\n +localSendVideofuturDiscoveryRequest: (signal: AbortSignal) => Promise<any>,\n +localSendVideofuturPersonalDataRequest: (signal: AbortSignal) => Promise<any>,\n +localStopVideofuturOpenStreams: (signal: AbortSignal) => Promise<any>,\n +localToggleDebugMode: BasicFunction,\n|};\n\ntype StartPropType = {|\n +isLoadingAnimationVisible: boolean,\n +failureCallback: BasicFunction,\n +successCallback: BasicFunction,\n +timeoutCallback: BasicFunction,\n +unrecoverableFailureCallback: BasicFunction,\n|};\n\ntype CompleteStartPropType = {|\n ...StartPropType,\n ...ReduxStartReducerStateType,\n ...ReduxStartDispatchToPropsType,\n|};\n\ntype StartStateType = {|\n currentSteps: Array<STEP_ITEM>,\n durations: KeyValuePair<string>,\n isDebugPanelVisible: ?boolean,\n killedStreamCount: string,\n nextSteps: Array<STEP_ITEM>,\n queryStatuses: KeyValuePair<QueryStatus>,\n stepProgress: number,\n|};\n\nconst InitialState: $ReadOnly<StartStateType> = Object.freeze({\n currentSteps: [],\n durations: {},\n isDebugPanelVisible: null,\n killedStreamCount: '0',\n nextSteps: [],\n queryStatuses: {\n [StepName.ChannelList]: QueryStatus.NotStarted,\n [StepName.ChannelsInfo]: QueryStatus.NotStarted,\n [StepName.CommercialOffers]: QueryStatus.NotStarted,\n [StepName.DefaultHub]: QueryStatus.NotStarted,\n [StepName.DefaultRights]: QueryStatus.NotStarted,\n [StepName.DeviceSettings]: QueryStatus.NotStarted,\n [StepName.Discovery]: QueryStatus.NotStarted,\n [StepName.Hub]: QueryStatus.NotStarted,\n [StepName.ListAlias]: QueryStatus.NotStarted,\n [StepName.Login]: QueryStatus.NotStarted,\n [StepName.TagListAliases]: QueryStatus.NotStarted,\n [StepName.UserRights]: QueryStatus.NotStarted,\n [StepName.VideofuturAuthentication]: QueryStatus.NotStarted,\n [StepName.VideofuturDiscovery]: QueryStatus.NotStarted,\n [StepName.VideofuturPersonalData]: QueryStatus.NotStarted,\n [StepName.VideofuturStopOpenStreams]: QueryStatus.NotStarted,\n },\n stepProgress: 1,\n});\n\nclass StartView extends React.PureComponent<CompleteStartPropType, StartStateType> {\n abortController: AbortController;\n\n animation: any;\n\n areQueriesFinished: boolean;\n\n enabledSteps: Set<string>;\n\n initializationSequenceEnd: number;\n\n initializationSequenceStart: number;\n\n isAnimationFinished: boolean;\n\n mainLayout: HTMLElement | null;\n\n orderedSteps: Array<STEP_TYPE>;\n\n rootStep: STEP_ITEM;\n\n startedSteps: Set<string>;\n\n startingTimer: TimeoutID | null;\n\n stepCount: number;\n\n constructor(props: CompleteStartPropType) {\n super(props);\n\n const {\n isDebugModeEnabled,\n localCreateTagListAliases,\n localSendCommercialOfferRequest,\n localSendDefaultHubRequest,\n localSendDefaultRightsRequest,\n localSendDiscoveryRequest,\n localSendGetDeviceChannelListRequest,\n localSendGetDeviceSettingRequest,\n localSendHubRequest,\n localSendListAliasPostRequest,\n localSendMetadataChannelsRequest,\n localSendUserRightsRequest,\n localSendVideofuturAuthenticationRequest,\n localSendVideofuturDiscoveryRequest,\n localSendVideofuturPersonalDataRequest,\n localStopVideofuturOpenStreams,\n } = props;\n\n this.abortController = new AbortController();\n this.areQueriesFinished = false;\n this.initializationSequenceEnd = 0;\n this.initializationSequenceStart = performance.now();\n this.isAnimationFinished = true;\n this.mainLayout = null;\n this.startedSteps = new Set<string>();\n this.startingTimer = null;\n\n const { enabled, ordered } = this.prepareSteps(STEPS);\n this.enabledSteps = enabled;\n this.orderedSteps = ordered;\n this.stepCount = this.orderedSteps.length;\n\n this.rootStep = {\n // DMS Login\n name: StepName.Login,\n request: null,\n then: [\n {\n // DMS Device Settings\n name: StepName.DeviceSettings,\n request: localSendGetDeviceSettingRequest,\n then: [\n {\n // DMS Channel List\n name: StepName.ChannelList,\n request: localSendGetDeviceChannelListRequest,\n },\n {\n // Platform Discovery\n name: StepName.Discovery,\n request: localSendDiscoveryRequest,\n },\n {\n // BO Login\n name: StepName.VideofuturAuthentication,\n parameters: ['applicationId', 'deviceKey'],\n request: localSendVideofuturAuthenticationRequest,\n },\n ],\n },\n ],\n thenAfter: [\n {\n // Platform Channel List Alias: needs channelList & discovery\n name: StepName.ListAlias,\n request: localSendListAliasPostRequest,\n then: [\n {\n // Platform Channels Info: needs List Alias\n name: StepName.ChannelsInfo,\n request: localSendMetadataChannelsRequest,\n then: [\n {\n // Platform Tag List Aliases: creates one list alias per tag (needs Channels Info)\n name: StepName.TagListAliases,\n request: localCreateTagListAliases,\n },\n ],\n },\n ],\n },\n {\n // Platform Default Hub: needs discovery\n name: StepName.DefaultHub,\n request: localSendDefaultHubRequest,\n },\n {\n // BO Discovery: needs BO Auth (only)\n name: StepName.VideofuturDiscovery,\n request: localSendVideofuturDiscoveryRequest,\n then: [\n {\n // BO Personal Data\n name: StepName.VideofuturPersonalData,\n request: localSendVideofuturPersonalDataRequest,\n then: [\n {\n // Platform Hub: needs discovery & BO Auth\n name: StepName.Hub,\n request: localSendHubRequest,\n },\n ],\n },\n {\n // BO Kill Streams\n name: StepName.VideofuturStopOpenStreams,\n request: localStopVideofuturOpenStreams,\n },\n ],\n },\n {\n // Platform Commercial Offers\n name: StepName.CommercialOffers,\n request: localSendCommercialOfferRequest,\n },\n {\n // Platform Default Rights\n name: StepName.DefaultRights,\n request: localSendDefaultRightsRequest,\n },\n {\n // Platform User Rights\n name: StepName.UserRights,\n request: localSendUserRightsRequest,\n },\n ],\n };\n\n this.state = {\n ...InitialState,\n currentSteps: [this.rootStep],\n isDebugPanelVisible: isDebugModeEnabled ? true : null,\n };\n }\n\n componentDidMount() {\n const { applicationId, authDeviceUrl, deviceKey, isLoadingAnimationVisible, timeoutCallback, subscriberId, upgradeDeviceUrl } = this.props;\n\n HotKeys.register(['alt+d', 'ctrl+d', 'shift+d'], this.handleToggleDebugPanelHotKey, { name: 'Start.debug' });\n\n // Initialize starting sequence by logging into the DMS\n this.sendLoginRequest(authDeviceUrl, upgradeDeviceUrl, applicationId, subscriberId, deviceKey);\n this.startingTimer = setTimeout(timeoutCallback, STARTING_TIMEOUT);\n\n if (!isLoadingAnimationVisible) {\n // Hide loading animation is this screen is shown more than once\n return;\n }\n\n const animationData = getAppLottieLoader();\n\n if (animationData) {\n this.isAnimationFinished = false;\n\n // $FlowFixMe\n this.animation = lottie.loadAnimation({\n animationData,\n autoplay: true,\n container: document.getElementsByClassName('loaderAnimation')[0],\n loop: false,\n renderer: 'svg',\n rendererSettings: {\n progressiveLoad: true,\n },\n });\n\n this.animation.addEventListener('complete', this.onAnimationComplete, { passive: true });\n }\n }\n\n componentDidUpdate(prevProps: CompleteStartPropType) {\n const { authenticationToken } = this.props;\n const { authenticationToken: prevAuthenticationToken } = prevProps;\n\n if (authenticationToken !== prevAuthenticationToken) {\n this.handleTokenUpdate(authenticationToken);\n }\n }\n\n componentWillUnmount() {\n const { successCallback } = this.props;\n const { abortController, animation, mainLayout } = this;\n\n this.resetStartingTimer();\n\n abortController.abort('Component StartView will unmount');\n\n HotKeys.unregister(['alt+d', 'ctrl+d', 'shift+d'], this.handleToggleDebugPanelHotKey);\n\n if (mainLayout) {\n mainLayout.removeEventListener('animationend', successCallback, { passive: true });\n }\n\n if (animation) {\n animation.removeEventListener('complete', this.onAnimationComplete, { passive: true });\n animation.destroy();\n }\n }\n\n isBOStepEnabled = (name: string): boolean => name !== StepName.VideofuturAuthentication;\n\n prepareSteps = (steps: $ReadOnly<STEP_SET>): {| enabled: Set<string>, ordered: Array<STEP_TYPE> |} => {\n const { features } = this.props;\n\n // Filter out steps linked to disable features\n const enabled = new Set<string>();\n const ordered: Array<STEP_TYPE> = [];\n ((Object.values(steps): any): Array<STEP_TYPE>).forEach((value) => {\n const { feature, name } = value;\n\n if ((!feature || features[feature]) && this.isBOStepEnabled(name)) {\n enabled.add(name);\n ordered.push(value);\n }\n });\n\n // Sort steps for display\n ordered.sort((a, b) => a.displayIndex - b.displayIndex);\n\n return {\n enabled,\n ordered,\n };\n };\n\n handleTokenUpdate = (token: string | null) => {\n if (token) {\n // Logging OK\n this.proceedToSecondStep();\n }\n };\n\n resetStartingTimer = () => {\n if (this.startingTimer) {\n clearTimeout(this.startingTimer);\n this.startingTimer = null;\n }\n };\n\n handleToggleDebugPanelHotKey = (event: SyntheticKeyboardEvent<HTMLElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n this.setState(\n produce((draft) => {\n draft.isDebugPanelVisible = !draft.isDebugPanelVisible;\n }),\n );\n };\n\n onAnimationComplete = () => {\n this.isAnimationFinished = true;\n this.checkInitializationSequenceEnd();\n };\n\n checkInitializationSequenceEnd = () => {\n const { applicationName, successCallback, versionBO, versionCrmBack, versionCrmFront, versionShort } = this.props;\n const { durations, killedStreamCount, queryStatuses } = this.state;\n const { animation, areQueriesFinished, initializationSequenceEnd, initializationSequenceStart, isAnimationFinished, mainLayout, orderedSteps } = this;\n\n const isAppHidden = isTabHidden() === true;\n\n if (areQueriesFinished && (isAnimationFinished || isAppHidden)) {\n const duration = new Intl.NumberFormat('fr-FR', {\n maximumFractionDigits: 3,\n minimumFractionDigits: 3,\n // $FlowFixMe: Flow doesn't know 'unit' style\n style: 'unit',\n unit: 'second',\n }).format((initializationSequenceEnd - initializationSequenceStart) / MILLISECONDS_PER_SECOND);\n logInfo('#==========================================#');\n logInfo(`║ ${applicationName.padEnd(Padding.Name)} ║`);\n logInfo('║ ║');\n logInfo(`║ Version: ${versionShort.padEnd(Padding.Version)} ║`);\n\n if (versionBO !== '') {\n logInfo(`║ Version BO: ${versionBO.padEnd(Padding.VersionBO)} ║`);\n }\n\n if (versionCrmBack !== '') {\n logInfo(`║ Version CRM Back: ${versionCrmBack.padEnd(Padding.VersionCrmBack)} ║`);\n }\n\n if (versionCrmFront !== '') {\n logInfo(`║ Version CRM Front: ${versionCrmFront.padEnd(Padding.VersionCrmFront)} ║`);\n }\n\n logInfo(`║ Initialization sequence: ${duration.padStart(Padding.InitSequence)} ║`);\n logInfo('#==========================================#');\n\n orderedSteps.forEach((step) => {\n const { displayName, name } = step;\n const { [name]: stepStatus } = queryStatuses;\n const { [name]: stepDuration } = durations;\n const statusStr = stepStatus === QueryStatus.Success ? 'OK' : 'KO';\n const css = stepStatus === QueryStatus.Success ? Css.StepSuccess : Css.StepError;\n const localDisplayName = StepName.VideofuturStopOpenStreams ? displayName.replace('<count>', killedStreamCount) : displayName;\n logDebug(`${localDisplayName.padEnd(Padding.StepName)} %c ${statusStr} %c ${stepDuration?.padStart(Padding.Duration) ?? ''}`, css, Css.Initial);\n });\n\n if (mainLayout) {\n mainLayout.classList.add('hidden');\n mainLayout.classList.remove('visible');\n\n if (isAppHidden) {\n // Hard transition since animation is not visible anyway\n animation?.destroy();\n this.animation = null;\n successCallback();\n } else {\n // Smooth transition\n mainLayout.addEventListener('animationend', successCallback, { passive: true });\n }\n } else {\n // Not suppose to happen\n successCallback();\n }\n }\n };\n\n sendLoginRequest = (authDeviceUrl: string, upgradeDeviceUrl: string, applicationId: string, subscriberId: string, deviceKey: string) => {\n const { localSendLoginRequest, unrecoverableFailureCallback } = this.props;\n\n this.setState(\n produce((draft) => {\n draft.queryStatuses[StepName.Login] = QueryStatus.InProgress;\n }),\n );\n\n const requestStart = performance.now();\n\n localSendLoginRequest(authDeviceUrl, upgradeDeviceUrl, applicationId, subscriberId, deviceKey)\n .then((result) => {\n if (result === undefined || result.status !== DmsNetworkCode.Created) {\n throw new Error('DMS authentication error');\n }\n\n const requestEnd = performance.now();\n this.setState(\n produce((draft) => {\n draft.durations[StepName.Login] = formatMs(requestEnd - requestStart);\n }),\n );\n })\n .catch((error: CustomNetworkError | Error) => {\n this.setState(\n produce((draft) => {\n draft.queryStatuses[StepName.Login] = QueryStatus.Error;\n }),\n );\n\n logError(`Login error: ${error.message}`);\n\n if (error instanceof CustomNetworkError) {\n logError(error.networkError);\n const customStatus = error.getCustomStatus();\n if (\n customStatus !== (DmsNetworkCode.MissingOrInvalidAuthenticationToken: number) &&\n // Unknown device\n customStatus !== (DmsNetworkCode.UnknownDevice: number) &&\n // Invalid device\n customStatus !== (DmsNetworkCode.InvalidDevice: number) &&\n // DMS did not provide correct error code\n customStatus !== (DmsNetworkCode.UnknownError: number)\n ) {\n // The reasons above cause the display of the login page\n unrecoverableFailureCallback();\n }\n }\n });\n };\n\n proceedToSecondStep = () => {\n this.setState(\n produce((draft) => {\n draft.currentSteps = this.rootStep.then ?? [];\n draft.queryStatuses[StepName.Login] = QueryStatus.Success;\n draft.nextSteps = this.rootStep.thenAfter ?? [];\n }),\n this.processCurrentSteps,\n );\n };\n\n filterCurrentSteps = (currentSteps: Array<STEP_ITEM>, disabledSteps: Array<STEP_ITEM> | STEP_ITEM): Array<STEP_ITEM> => {\n const localDisabledSteps = Array.isArray(disabledSteps) ? disabledSteps : [disabledSteps];\n\n // Remove disabled steps from current steps\n const newSteps = currentSteps.filter(({ name }) => localDisabledSteps.every((s) => s.name !== name));\n\n // Add children processes of disabled steps to current steps\n localDisabledSteps.forEach((step) => {\n if (step.then) {\n newSteps.push(...step.then);\n }\n });\n\n return newSteps;\n };\n\n processCurrentSteps = () => {\n const { enabledSteps } = this;\n const {\n currentSteps,\n currentSteps: { length: stepCount },\n nextSteps,\n nextSteps: { length: nextStepCount },\n } = this.state;\n\n if (stepCount === 0) {\n if (nextStepCount > 0) {\n // Proceed to second pass steps\n this.setState(\n produce((draft) => {\n draft.currentSteps = nextSteps;\n draft.nextSteps = [];\n }),\n this.processCurrentSteps,\n );\n } else {\n // All done\n this.resetStartingTimer();\n this.initializationSequenceEnd = performance.now();\n this.areQueriesFinished = true;\n this.checkInitializationSequenceEnd();\n }\n return;\n }\n\n const disabledSteps = [];\n let hasStartedProcess = false;\n\n // Process current steps not started yet\n for (let i = 0; i < stepCount; i++) {\n const { [i]: step } = currentSteps;\n const { name } = step;\n const {\n queryStatuses: { [name]: stepStatus },\n } = this.state;\n\n if (stepStatus === QueryStatus.NotStarted && stepStatus !== QueryStatus.Disabled && !this.startedSteps.has(name)) {\n if (enabledSteps.has(name)) {\n // Step is enabled\n hasStartedProcess = true;\n this.startedSteps.add(name);\n this.setState(\n produce((draft) => {\n draft.queryStatuses[name] = QueryStatus.InProgress;\n }),\n () => this.processStep(step),\n );\n } else {\n // Step is disabled\n disabledSteps.push(step);\n }\n }\n }\n\n if (disabledSteps.length > 0) {\n this.setState(\n produce((draft) => {\n draft.currentSteps = this.filterCurrentSteps(draft.currentSteps, disabledSteps);\n disabledSteps.forEach(({ name }) => (draft.queryStatuses[name] = QueryStatus.Disabled));\n }),\n () => {\n if (!hasStartedProcess) {\n // All current processes have been disabled, process next ones\n this.processCurrentSteps();\n }\n },\n );\n }\n };\n\n processStep = (step: STEP_ITEM) => {\n const {\n abortController: { signal },\n props,\n } = this;\n const { name, parameters, request } = step;\n\n if (!request) {\n return;\n }\n\n const args = parameters?.map((p) => props[p]) ?? [];\n const requestStart = performance.now();\n\n request(...args, signal)\n .then((response) => {\n const requestEnd = performance.now();\n\n if (name === StepName.VideofuturStopOpenStreams) {\n this.setState({ killedStreamCount: response.toString() });\n }\n\n this.setState(\n produce((draft) => {\n draft.currentSteps = this.filterCurrentSteps(draft.currentSteps, step);\n draft.durations[name] = formatMs(requestEnd - requestStart);\n draft.queryStatuses[name] = QueryStatus.Success;\n draft.stepProgress += 1;\n }),\n this.processCurrentSteps,\n );\n })\n .catch((error) => this.handleStepError(error, step));\n };\n\n handleStepError = (error: Error, step: STEP_ITEM) => {\n const { isRegisteredAsGuest, failureCallback } = this.props;\n const { abortController } = this;\n const { name } = step;\n\n // $FlowFixMe: flow doesn't know DOMException\n if (error instanceof DOMException && error.name === 'AbortError') {\n // Error should be ignored since everything has already been taken care of\n return;\n }\n\n let message: ?string = null;\n\n if (error instanceof CustomNetworkError) {\n const { networkError } = error;\n if (networkError) {\n ({ message } = networkError);\n }\n }\n\n this.setState(\n produce((draft) => {\n draft.queryStatuses[name] = QueryStatus.Error;\n }),\n );\n\n const {\n [name]: { isOptional },\n } = STEPS;\n const logger = isOptional ? logWarning : logError;\n\n logger(`Error in step \"${name}\": ${message ?? 'no message'}`);\n logger(error);\n\n if (isOptional) {\n // Step failed but is optional: process remaining steps\n this.setState(\n produce((draft) => {\n draft.currentSteps = this.filterCurrentSteps(draft.currentSteps, step);\n draft.stepProgress += 1;\n }),\n this.processCurrentSteps,\n );\n } else {\n // Step failed and is not optional: stop everything\n abortController.abort('Unrecoverable error in StartView');\n }\n\n if (isRegisteredAsGuest || name === StepName.DeviceSettings || name === StepName.VideofuturAuthentication) {\n // Error in a mandatory step while in guest mode means something very bad: bail out and display login page to avoid infinite reload\n failureCallback();\n }\n };\n\n handleVersionOnClick = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => {\n const { localToggleDebugMode } = this.props;\n\n if ((event.ctrlKey || event.altKey) && event.shiftKey) {\n localToggleDebugMode();\n }\n };\n\n renderDebugPanel = (): React.Node => {\n const { isDebugModeEnabled, versionShort: version } = this.props;\n const { durations, isDebugPanelVisible, killedStreamCount, queryStatuses } = this.state;\n const { orderedSteps } = this;\n\n if (!orderedSteps) {\n // Startup tree not built yet\n return null;\n }\n\n return (\n <div className={clsx('debugContainer', isDebugPanelVisible !== null && (isDebugPanelVisible ? 'slideIn' : 'slideOut'))}>\n <div className='version' onClick={this.handleVersionOnClick}>\n <div>Version {version}</div>\n <DebugPicto isEnabled={isDebugModeEnabled} />\n </div>\n {orderedSteps.map((step) => {\n const { displayName, name } = step;\n const { [name]: stepStatus } = queryStatuses;\n const { [name]: duration } = durations;\n\n return (\n <div className={clsx('line', stepStatus)} key={name}>\n <div className='label'>{name === StepName.VideofuturStopOpenStreams ? displayName.replace('<count>', killedStreamCount) : displayName}</div>\n <div className='duration'>{duration}</div>\n <div className='status'>{stepStatus === QueryStatus.InProgress ? <InfiniteCircleLoaderArc className='queryLoader' /> : null}</div>\n </div>\n );\n })}\n </div>\n );\n };\n\n render(): React.Node {\n const { state, stepCount } = this;\n const { isDebugModeEnabled, isLoadingAnimationVisible, versionShort: version } = this.props;\n const { stepProgress } = state;\n\n const progress = stepProgress / stepCount;\n\n return (\n <div className='start'>\n <div\n className='mainLayout visible'\n ref={(instance) => {\n this.mainLayout = instance;\n }}\n >\n <div className='loaderAnimation' />\n <div className='progressBar' style={{ transform: `scaleX(${progress})` }} />\n {this.renderDebugPanel()}\n </div>\n <div className='footerVersion' onClick={this.handleVersionOnClick}>\n <div>{Localizer.localize('authentication.version', { version })}</div>\n <DebugPicto isEnabled={isDebugModeEnabled} />\n </div>\n {!isLoadingAnimationVisible ? <InfiniteCircleLoaderArc className='startLoader' /> : null}\n </div>\n );\n }\n}\n\nconst mapStateToProps = (state: CombinedReducers): ReduxStartReducerStateType => {\n return {\n applicationId: state.appRegistration.applicationId,\n applicationName: state.appConfiguration.applicationName,\n authDeviceUrl: state.appRegistration.authDeviceUrl,\n authenticationToken: state.appRegistration.authenticationToken,\n deviceKey: state.appRegistration.deviceKey,\n features: state.appConfiguration.features,\n isDebugModeEnabled: state.appConfiguration.isDebugModeEnabled,\n isRegisteredAsGuest: state.appRegistration.registration === RegistrationType.RegisteredAsGuest,\n subscriberId: state.appRegistration.subscriberId,\n upgradeDeviceUrl: state.appRegistration.upgradeDeviceUrl,\n versionBO: state.appConfiguration.versionBO,\n versionCrmBack: state.appConfiguration.versionCrmBack,\n versionCrmFront: state.appConfiguration.versionCrmFront,\n versionShort: state.appConfiguration.versionAppShort,\n };\n};\n\nconst mapDispatchToProps = (dispatch: Dispatch): ReduxStartDispatchToPropsType => {\n return {\n localCreateTagListAliases: (signal: AbortSignal): Promise<any> => dispatch(createTagListAliases(signal)),\n localSendCommercialOfferRequest: (signal: AbortSignal) => dispatch(sendCommercialOffersRequest(signal)),\n localSendDefaultHubRequest: (signal: AbortSignal): Promise<any> => dispatch(sendV8DefaultHubRequest(signal)),\n localSendDefaultRightsRequest: (signal: AbortSignal) => dispatch(sendDefaultRightsRequest(signal)),\n localSendDiscoveryRequest: (signal: AbortSignal): Promise<any> => dispatch(sendV8DiscoveryRequest(signal)),\n localSendGetDeviceChannelListRequest: (signal: AbortSignal): Promise<any> => dispatch(sendGetDeviceChannelListRequest(signal)),\n localSendGetDeviceSettingRequest: (signal: AbortSignal): Promise<any> => dispatch(sendGetDeviceSettingsRequest(signal)),\n localSendHubRequest: (signal: AbortSignal): Promise<any> => dispatch(sendV8HubRequest(null, signal)),\n localSendListAliasPostRequest: (signal: AbortSignal): Promise<any> => dispatch(sendV8ListAliasPostRequest(null, signal)),\n localSendLoginRequest: (authDeviceUrl: string, upgradeDeviceUrl: string, applicationId: string, subscriberId: string, deviceKey: string, signal?: AbortSignal): Promise<any> =>\n dispatch(sendLoginRequest(authDeviceUrl, upgradeDeviceUrl, applicationId, subscriberId, deviceKey, null, null, true, signal)),\n localSendMetadataChannelsRequest: (signal: AbortSignal): Promise<any> => dispatch(sendV8MetadataChannelsRequest(signal)),\n localSendUserRightsRequest: (signal: AbortSignal) => dispatch(sendUserRightsRequest(signal)),\n localSendVideofuturAuthenticationRequest: (applicationId: string, deviceKey: string, signal: AbortSignal): Promise<any> =>\n dispatch(sendVideofuturAuthenticationRequest(applicationId, deviceKey, signal)),\n localSendVideofuturDiscoveryRequest: (signal: AbortSignal): Promise<any> => dispatch(sendVideofuturDiscoveryRequest(signal)),\n localSendVideofuturPersonalDataRequest: (signal: AbortSignal): Promise<any> => dispatch(sendVideofuturPersonalDataRequest(signal)),\n localStopVideofuturOpenStreams: (signal: AbortSignal): Promise<any> => dispatch(stopOpenStreams(null, signal)),\n localToggleDebugMode: () => dispatch(toggleDebugMode()),\n };\n};\n\nconst Start: React.ComponentType<StartPropType> = connect(mapStateToProps, mapDispatchToProps)(StartView);\n\nexport default Start;\n","/* @flow */\n\nimport LocalStorageManager from './localStorageManager';\nimport { StorageKeys } from './keys';\n\nconst deleteOptimisticData = (): void => {\n LocalStorageManager.delete(StorageKeys.OptimisticDmsSettingsUsed, StorageKeys.OptimisticDmsSettings, StorageKeys.OptimisticHub, StorageKeys.OptimisticDefaultActions);\n};\n\nexport { deleteOptimisticData };\n","/* @flow */\n\nimport { HeaderName } from '../netgemLibrary/v8/constants/Headers';\nimport type { UserInfo } from '../../redux/appRegistration/types/types';\nimport { fetchJsonWithErrorCheck } from '../../helpers/jsHelpers/xhr';\nimport { logError } from '../../helpers/debug/debug';\n\nconst getUserInfo: (url: string, token: string) => Promise<UserInfo> = async (url, token) => {\n const options = {\n headers: new Headers({ [HeaderName.Authorization]: `Bearer ${token}` }),\n };\n\n try {\n return await fetchJsonWithErrorCheck(url, options);\n } catch (error) {\n logError(error);\n throw error;\n }\n};\n\nexport default getUserInfo;\n","/* @flow */\n\nimport { type PaymentInfo, type RawUserInfo, type SubscriptionList, SubscriptionStatus, type UserInfo } from '../../../appRegistration/types/types';\nimport { createCustomNetworkError, createCustomNetworkErrorFromKey } from '../../../../libs/netgemLibrary/helpers/CreateCustomNetworkError';\nimport { resetUserInfo, updateUserInfo } from '../../../appRegistration/actions';\nimport type { CombinedReducers } from '../../../reducers';\nimport type { RequestResponseMethodDefinitionType } from '../emitter';\nimport { type Undefined } from '@ntg/utils/dist/types';\nimport getUserInfoFromCrm from '../../../../libs/crm/userInfo';\nimport { logError } from '../../../../helpers/debug/debug';\n\nconst TWO = 2;\n\nconst getSubscriptionStatusPriority: (status: SubscriptionStatus) => number =\n // eslint-disable-next-line consistent-return\n (status) => {\n switch (status) {\n case SubscriptionStatus.Active:\n return TWO;\n\n case SubscriptionStatus.InTrial:\n case SubscriptionStatus.NonRenewing:\n return 1;\n\n case SubscriptionStatus.Cancelled:\n case SubscriptionStatus.Future:\n case SubscriptionStatus.Paused:\n return 0;\n\n // No default\n }\n };\n\nconst sendUserInfoRequest: () => RequestResponseMethodDefinitionType =\n () =>\n (dispatch, getState: () => CombinedReducers): Promise<any> => {\n const state = getState();\n const {\n appConfiguration: {\n configuration: { getUserInfoUrl },\n },\n appRegistration: { authenticationToken },\n } = state;\n\n if (!getUserInfoUrl) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definition', { urlDef: 'getUserInfoUrl' }));\n }\n\n if (!authenticationToken) {\n return Promise.reject(createCustomNetworkError(-1, 'Missing authentication token'));\n }\n\n return getUserInfoFromCrm(getUserInfoUrl, authenticationToken);\n };\n\nconst parseUserInfo: (data: RawUserInfo) => ?UserInfo = (data) => {\n const { email, id, newsletter, paymentInfo: rawPaymentInfo, subscriptions: rawSubscriptions } = data;\n\n const subscriptions: SubscriptionList = {};\n rawSubscriptions?.forEach((sub) => {\n const { planId, status } = sub;\n\n // Check if same plan Id has already been found\n const { [planId]: currentStatus } = subscriptions;\n\n /*\n * Following test ensures that if the same plan is encountered more than once, the most relevant status is used\n */\n if (!currentStatus || getSubscriptionStatusPriority(status) > getSubscriptionStatusPriority(currentStatus)) {\n subscriptions[planId] = status;\n }\n });\n\n let paymentInfo: PaymentInfo | null = null;\n if (rawPaymentInfo) {\n const { expiry, status, dunningStatus } = rawPaymentInfo;\n\n let expirationTime: Undefined<number> = undefined;\n\n if (expiry) {\n // Expiry is a string like \"12/2030\", which means the card will expire at the end of the month (so we set the date to the first day of the following month)\n const monthLength = 2;\n const expirationDate = new Date(`${expiry.substring(0, monthLength)}/01/${expiry.substring(monthLength + 1)}`);\n if (!isNaN(expirationDate)) {\n expirationDate.setMonth(expirationDate.getMonth() + 1);\n expirationTime = expirationDate.getTime();\n }\n }\n\n paymentInfo = {\n dunningStatus,\n expirationTime,\n status,\n };\n }\n\n return {\n email,\n id,\n newsletter,\n paymentInfo,\n subscriptions,\n };\n};\n\nconst getUserInfo: () => RequestResponseMethodDefinitionType =\n () =>\n (dispatch): Promise<any> =>\n dispatch(sendUserInfoRequest())\n .then((data) => {\n const userInfo = parseUserInfo(data);\n\n if (!userInfo) {\n // Something went wrong\n dispatch(resetUserInfo());\n } else {\n // OK\n dispatch(updateUserInfo(userInfo));\n }\n\n return Promise.resolve(userInfo);\n })\n .catch((error) => {\n logError(error);\n });\n\nexport { getUserInfo, sendUserInfoRequest };\n","/* @flow */\n\nimport './ApplicationContainer.css';\nimport * as React from 'react';\nimport { AppAppleStoreLogo, AppBackgroundImage, AppGoogleStoreLogo, AppHasHeaderCloseButton, AppHeaderLogo, AppMobileAppLogo } from '../../helpers/applicationCustomization/ui';\nimport { AvenueType, type FOCUSED_AVENUE_TYPE } from '../../helpers/ui/avenue/types';\nimport type { BasicFunction, KeyValuePair } from '@ntg/utils/dist/types';\nimport { Messenger, MessengerEvents } from '@ntg/utils/dist/messenger';\nimport { PendingOperationKind, checkPendingOperation, updatePendingOperationType } from '../../helpers/rights/pendingOperations';\nimport { RegistrationType, type UserDeviceInfoType } from '../../redux/appRegistration/types/types';\nimport { fetchJsonWithErrorCheck, fetchTextWithErrorCheck } from '../../helpers/jsHelpers/xhr';\nimport { logError, logInfo } from '../../helpers/debug/debug';\nimport { registerApplication, resetUserInfo, unregisterApplication } from '../../redux/appRegistration/actions';\nimport { showAuthenticationRequiredModal, showExternalContentModal, showNewVersionModal } from '../../redux/modal/actions';\nimport { toggleDebugMode, updateBOVersion, updateCrmBackVersion, updateCrmFrontVersion } from '../../redux/appConf/actions';\nimport { APPLICATION_ID } from '../../helpers/applicationCustomization/types';\nimport AccurateTimestamp from '../../helpers/dateTime/AccurateTimestamp';\nimport ButtonFX from '../buttons/ButtonFX';\nimport type { CombinedReducers } from '../../redux/reducers';\nimport type { Dispatch } from '../../redux/types/types';\nimport { ExternalContentDisplayType } from '../../redux/appConf/types/types';\nimport { FEATURE_SUBSCRIPTION } from '../../redux/appConf/constants';\nimport InfiniteCircleLoaderArc from '../loader/infiniteCircleLoaderArc';\nimport LocalStorageManager from '../../helpers/localStorage/localStorageManager';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport MainView from './MainView';\nimport ModalContainer from '../modal/modalContainer';\nimport type { NEW_VERSION_DATA_MODAL_TYPE } from '../modal/newVersionModal/NewVersionModal';\nimport Notifier from '../../helpers/notification/notifier';\nimport { PictoX } from '@ntg/components/dist/pictos/Element';\nimport RegistrationView from './RegistrationView';\nimport StartView from './StartView';\nimport { StorageKeys } from '../../helpers/localStorage/keys';\nimport { areRightsDifferent } from '../../helpers/rights/rights';\nimport { buildDeviceUrl } from '../../helpers/dms/helper';\nimport { connect } from 'react-redux';\nimport { deleteOptimisticData } from '../../helpers/localStorage/optimisticData';\nimport { fireAndForget } from '../../helpers/jsHelpers/promise';\nimport { generateToken } from '../../helpers/crypto/crypto';\nimport { getUserInfo } from '../../redux/netgemApi/actions/crm/userInfo';\nimport { getUserInfoStatuses } from '../../helpers/rights/userInfo';\nimport { getVersion } from '../../helpers/version/version';\nimport { isRunningOnLocalhost } from '../../helpers/jsHelpers/environment';\nimport { openSelfCare } from '../../helpers/applicationCustomization/externalPaymentSystem';\nimport { parseBoolean } from '../../helpers/jsHelpers/parser';\nimport { produce } from 'immer';\nimport { sendUserRightsRequest } from '../../redux/netgemApi/actions/v8/rights';\nimport { updateFocusedAvenue } from '../../redux/ui/actions';\n\nconst VERSION_CHECK = Object.freeze({\n // Version is checked every 6h but not more than once in a 6h-window (in ms)\n Interval: 21_600_000,\n // Every 5 minutes, next version check date is checked against current date (in ms)\n Timeout: 300_000,\n});\n\nexport enum ErrorType {\n None,\n // Application configuration couldn't be loaded [form App]\n AppConfFailure,\n // Authentication page took too long to load [from RegistrationView]\n LoadTimeout,\n // At least one of the startup queries failed (HTTP error or invalid response) [from StartView]\n StartupFailure,\n // Startup queries took too long [from StartView]\n StartupTimeout,\n // Guest sign-in failed [from ApplicationContainer]\n GuestAuthent,\n}\n\n/*\n * Following states only exist when guest mode is allowed (VIVA):\n * - DummyRestart\n * - RegisteringAsGuest\n * - SignInDisplayed\n * - SignUpDisplayed\n * - SubscribeDisplayed\n */\nexport enum ApplicationState {\n BrowserNotCompatible,\n DummyRestart,\n Error,\n Initializing,\n Logged,\n NotRegistered,\n PodsDisplayed,\n Registered,\n RegisterAsGuest,\n RegisteringAsGuest,\n RunningOnMobile,\n SignInDisplayed,\n SignUpDisplayed,\n SubscribeDisplayed,\n}\n\n// Array of application states that require a loader\nconst LoadingStates = Object.freeze([ApplicationState.DummyRestart, ApplicationState.Initializing, ApplicationState.RegisteringAsGuest]);\n\ntype ReduxApplicationContainerDispatchToPropsType = {|\n +localGetUserInfo: () => Promise<any>,\n +localRegisterApplication: (userDeviceInfo: UserDeviceInfoType, asGuest: boolean) => Promise<any>,\n +localResetUserInfo: () => Promise<any>,\n +localSendUserRightsRequest: () => Promise<any>,\n +localShowAuthenticationRequiredModal: () => void,\n +localShowExternalContentModal: (url: string) => void,\n +localToggleDebugMode: BasicFunction,\n +localUnregisterApplication: BasicFunction,\n +localUpdateBOVersion: (version: string) => void,\n +localUpdateCrmBackVersion: (version: string) => void,\n +localUpdateCrmFrontVersion: (version: string) => void,\n +localUpdateFocusedAvenue: (index: number, type: AvenueType) => void,\n +showNewVersion: (newVersionData: NEW_VERSION_DATA_MODAL_TYPE) => void,\n|};\n\ntype ReduxApplicationContainerReducerStateType = {|\n +applicationName: string,\n +authenticationToken: string | null,\n +chromeUrl: string,\n +configuration: KeyValuePair<string>,\n +deviceId: string,\n +edgeUrl: string,\n +firefoxUrl: string,\n +focusedAvenue: FOCUSED_AVENUE_TYPE | null,\n +isAuthentInFullscreen: boolean,\n +isDebugModeEnabled: boolean,\n +isGuestModeAllowed: boolean,\n +isInTheaterMode: boolean,\n +isRegisteredAsGuest: boolean,\n +isSubscriptionFeatureEnabled: boolean,\n +registration: RegistrationType,\n +userAccountDisplay: ExternalContentDisplayType,\n +userAccountUrl: string,\n +userRights: Array<string> | null,\n +version: string,\n|};\n\ntype DefaultProps = {|\n +initialAppError?: ErrorType,\n +initialAppState?: ApplicationState,\n|};\n\ntype ApplicationContainerPropType = {|\n ...DefaultProps,\n|};\n\ntype CompleteApplicationContainerPropType = {|\n ...ApplicationContainerPropType,\n ...ReduxApplicationContainerDispatchToPropsType,\n ...ReduxApplicationContainerReducerStateType,\n|};\n\ntype ApplicationContainerStateType = {|\n applicationState: ApplicationState,\n error: ErrorType,\n forceSignInDisplay: boolean,\n hasSkippedGuestRegistration: boolean,\n highlightedCommercialOffers: Array<string>,\n isCloseButtonHidden: boolean,\n isDebugPanelVisible: boolean,\n isHeaderDisplayed: boolean,\n pendingOperationType?: PendingOperationKind,\n registrationCounter: number,\n requiredRightsChangeWatched: ?Array<string>,\n|};\n\nconst InitialState: $ReadOnly<ApplicationContainerStateType> = Object.freeze({\n applicationState: ApplicationState.Initializing,\n error: ErrorType.None,\n forceSignInDisplay: false,\n hasSkippedGuestRegistration: false,\n highlightedCommercialOffers: [],\n isCloseButtonHidden: false,\n isDebugPanelVisible: false,\n isHeaderDisplayed: false,\n pendingOperationType: undefined,\n registrationCounter: 0,\n requiredRightsChangeWatched: null,\n});\n\nclass ApplicationContainerView extends React.PureComponent<CompleteApplicationContainerPropType, ApplicationContainerStateType> {\n isFirstStartupSequence: boolean;\n\n newVersionData: ?NEW_VERSION_DATA_MODAL_TYPE;\n\n statesWithHeader: Set<ApplicationState>;\n\n versionCheckTimer: TimeoutID | null;\n\n static defaultProps: DefaultProps = {\n initialAppError: undefined,\n initialAppState: undefined,\n };\n\n constructor(props: CompleteApplicationContainerPropType) {\n super(props);\n\n const { isDebugModeEnabled } = props;\n\n Notifier.initialize(isDebugModeEnabled);\n\n this.isFirstStartupSequence = true;\n this.newVersionData = null;\n this.versionCheckTimer = null;\n\n this.statesWithHeader = new Set([ApplicationState.DummyRestart, ApplicationState.Error, ApplicationState.RegisteringAsGuest]);\n\n const { isAuthentInFullscreen } = props;\n if (!isAuthentInFullscreen) {\n this.statesWithHeader.add(ApplicationState.NotRegistered);\n this.statesWithHeader.add(ApplicationState.SignInDisplayed);\n this.statesWithHeader.add(ApplicationState.SignUpDisplayed);\n this.statesWithHeader.add(ApplicationState.SubscribeDisplayed);\n this.statesWithHeader.add(ApplicationState.PodsDisplayed);\n }\n\n this.state = { ...InitialState };\n }\n\n componentDidMount() {\n const { initialAppError, initialAppState } = this.props;\n\n Messenger.on(MessengerEvents.CHECK_VERSION, this.checkVersion);\n Messenger.on(MessengerEvents.CHECK_PENDING_OPERATION, this.checkPendingOperationIfAllowed);\n Messenger.on(MessengerEvents.TOGGLE_DEBUG_MODE, this.toggleDebugMode);\n Messenger.on(MessengerEvents.RESTART_APP, this.restartApp);\n Messenger.on(MessengerEvents.SHOW_SIGN_IN, this.showSignIn);\n Messenger.on(MessengerEvents.SHOW_SUBSCRIBE, this.showSubscribe);\n Messenger.on(MessengerEvents.SHOW_GUEST_MODE, this.showGuestMode);\n Messenger.on(MessengerEvents.SHOW_PODS, this.showPods);\n Messenger.on(MessengerEvents.APPLICATION_FULLY_LOADED, this.applicationLoaded);\n Messenger.on(MessengerEvents.AUTHENTICATION_REQUIRED, this.handleAuthenticationRequired);\n Messenger.on(MessengerEvents.REGISTER_AS_GUEST, this.registerAsGuest);\n Messenger.on(MessengerEvents.ACCOUNT_CREATED, this.hideCloseButton);\n Messenger.on(MessengerEvents.SUBSCRIBED, this.showApp);\n Messenger.on(MessengerEvents.WATCH_RIGHTS_CHANGE, this.watchRightsChange);\n Messenger.on(MessengerEvents.OPEN_USER_ACCOUNT, this.handleOpenUserAccountOnClick);\n\n if (initialAppState !== undefined) {\n this.initialize(initialAppState, initialAppError);\n }\n }\n\n componentDidUpdate(prevProps: CompleteApplicationContainerPropType, prevState: ApplicationContainerStateType) {\n const { authenticationToken, initialAppError, initialAppState, isInTheaterMode, registration, showNewVersion, userRights } = this.props;\n const {\n authenticationToken: prevAuthenticationToken,\n initialAppState: prevInitialAppState,\n isInTheaterMode: prevIsInTheaterMode,\n registration: prevRegistration,\n userRights: prevUserRights,\n } = prevProps;\n const { applicationState } = this.state;\n const { applicationState: prevApplicationState } = prevState;\n const { newVersionData } = this;\n\n if (initialAppState === undefined) {\n return;\n }\n\n if (initialAppState !== prevInitialAppState) {\n // App became ready\n this.initialize(initialAppState, initialAppError);\n }\n\n if (authenticationToken !== prevAuthenticationToken) {\n this.handleTokenUpdate(authenticationToken);\n Messenger.emit(MessengerEvents.AUTHENTICATION_TOKEN_CHANGED);\n }\n\n if (userRights && areRightsDifferent(userRights, prevUserRights)) {\n this.checkRightsChange(userRights);\n }\n\n if (applicationState !== prevApplicationState) {\n if (applicationState === ApplicationState.Registered) {\n this.showCloseButton();\n }\n\n if (applicationState === ApplicationState.NotRegistered || applicationState === ApplicationState.SignInDisplayed || applicationState === ApplicationState.SignUpDisplayed) {\n // If user signs out or switches from guest mode to signed in, optimistic data are deleted\n deleteOptimisticData();\n }\n\n if (applicationState === ApplicationState.DummyRestart) {\n // Only used for applications with guest mode (DMS settings changed)\n this.updateState(ApplicationState.Registered);\n return;\n }\n\n if (applicationState === ApplicationState.NotRegistered && process.env.REACT_APP_ID === APPLICATION_ID.MyVideofutur) {\n // Enable debug panel (to override authent settings and much more) through console in case authent iframe is in fullscreen (no header to click on)\n window.dbg = { toggleDebugPanel: this.toggleDebugPanel };\n }\n\n if (applicationState === ApplicationState.RegisteringAsGuest) {\n // Try registering as guest (returned promise is ignored since there's nothing to do with it)\n fireAndForget(this.finalizeGuestRegistration());\n }\n }\n\n if (registration !== prevRegistration) {\n this.updateApplicationStateIfNotRegistering(prevRegistration);\n }\n\n if (!isInTheaterMode && prevIsInTheaterMode && newVersionData) {\n // Show pending new version popup when player exits\n showNewVersion(newVersionData);\n this.newVersionData = null;\n }\n }\n\n componentWillUnmount() {\n Messenger.off(MessengerEvents.CHECK_VERSION, this.checkVersion);\n Messenger.off(MessengerEvents.TOGGLE_DEBUG_MODE, this.toggleDebugMode);\n Messenger.off(MessengerEvents.RESTART_APP, this.restartApp);\n Messenger.off(MessengerEvents.SHOW_SIGN_IN, this.showSignIn);\n Messenger.off(MessengerEvents.SHOW_SUBSCRIBE, this.showSubscribe);\n Messenger.off(MessengerEvents.SHOW_GUEST_MODE, this.showGuestMode);\n Messenger.off(MessengerEvents.APPLICATION_FULLY_LOADED, this.applicationLoaded);\n Messenger.off(MessengerEvents.AUTHENTICATION_REQUIRED, this.handleAuthenticationRequired);\n Messenger.off(MessengerEvents.REGISTER_AS_GUEST, this.registerAsGuest);\n Messenger.off(MessengerEvents.ACCOUNT_CREATED, this.hideCloseButton);\n Messenger.off(MessengerEvents.SUBSCRIBED, this.showApp);\n Messenger.off(MessengerEvents.WATCH_RIGHTS_CHANGE, this.watchRightsChange);\n Messenger.off(MessengerEvents.OPEN_USER_ACCOUNT, this.handleOpenUserAccountOnClick);\n\n this.resetVersionCheckTimer();\n }\n\n initialize = (initialAppState: ApplicationState, initialAppError?: ErrorType): void => {\n const { isGuestModeAllowed } = this.props;\n\n if (initialAppState === ApplicationState.RegisterAsGuest) {\n this.registerAsGuest();\n } else {\n this.updateState(initialAppState);\n\n if (isGuestModeAllowed && (initialAppState === ApplicationState.SignInDisplayed || initialAppState === ApplicationState.SignUpDisplayed)) {\n // Startup sequence has been interrupted\n this.setState({ hasSkippedGuestRegistration: true });\n }\n\n if (initialAppError) {\n this.setState({ error: initialAppError });\n return;\n }\n }\n\n if (initialAppState !== ApplicationState.RunningOnMobile && initialAppState !== ApplicationState.BrowserNotCompatible) {\n this.startVersionCheckTimer();\n }\n\n fireAndForget(this.getBOVersion());\n fireAndForget(this.getCrmBackVersion());\n fireAndForget(this.getCrmFrontVersion());\n };\n\n getBOVersion = async (): Promise<void> => {\n const { localUpdateBOVersion } = this.props;\n\n const url = process.env.REACT_APP_BO_VERSION_URL_V2;\n if (typeof url !== 'string' || url === '') {\n return;\n }\n\n try {\n const data = await fetchTextWithErrorCheck(url, { mode: 'cors' });\n\n const { version } = JSON.parse(data);\n localUpdateBOVersion(version);\n } catch (error) {\n logError(`Error retrieving BO version: ${error.message}`);\n }\n };\n\n getCrmBackVersion = (): Promise<void> => {\n const { localUpdateCrmBackVersion } = this.props;\n\n return this.getCrmVersion(process.env.REACT_APP_CRM_BACK_VERSION_URL, localUpdateCrmBackVersion, 'Back');\n };\n\n getCrmFrontVersion = (): Promise<void> => {\n const { localUpdateCrmFrontVersion } = this.props;\n\n return this.getCrmVersion(process.env.REACT_APP_CRM_FRONT_VERSION_URL, localUpdateCrmFrontVersion, 'Front');\n };\n\n getCrmVersion = async (urlStr: ?string, updater: (version: string) => void, kind: string): Promise<void> => {\n if (!urlStr) {\n return;\n }\n\n const url = new URL(urlStr);\n\n // Ensure latest version is retrieved\n url.searchParams.set('v', AccurateTimestamp.now().toString());\n\n try {\n const { version } = await fetchJsonWithErrorCheck(url, { mode: 'cors' });\n if (version) {\n updater(version);\n }\n } catch (error) {\n logError(`Error retrieving CRM ${kind} version: ${error.message}`);\n }\n };\n\n handleAuthenticationRequired = (): void => {\n const { focusedAvenue, localShowAuthenticationRequiredModal, localUpdateFocusedAvenue } = this.props;\n\n if (focusedAvenue?.type === AvenueType.Myvideos) {\n // Can't stay on this avenue when switching to guest mode\n localUpdateFocusedAvenue(0, AvenueType.Regular);\n }\n\n Messenger.once(MessengerEvents.MODAL_CONFIRMATION_CLOSED, this.authenticationRequiredModalCloseCallback);\n localShowAuthenticationRequiredModal();\n };\n\n authenticationRequiredModalCloseCallback = () => {\n const { isGuestModeAllowed, localUnregisterApplication } = this.props;\n\n if (isGuestModeAllowed) {\n this.setState({ forceSignInDisplay: true });\n }\n localUnregisterApplication();\n };\n\n updateApplicationStateIfNotRegistering = (prevRegistration: RegistrationType): void => {\n const { applicationState } = this.state;\n const { registration } = this.props;\n\n if (applicationState === ApplicationState.RegisteringAsGuest) {\n return;\n }\n\n if (registration === RegistrationType.NotRegistered) {\n // Will show login page\n this.updateState(ApplicationState.NotRegistered, () => this.handleNotRegisteredState(prevRegistration));\n } else {\n // Registered (user or guest)\n this.updateState(ApplicationState.Registered);\n }\n };\n\n handleNotRegisteredState = (prevRegistration?: RegistrationType): void => {\n const { isGuestModeAllowed } = this.props;\n\n if (isGuestModeAllowed && prevRegistration === RegistrationType.Registered) {\n // User just disconnected and guest mode is enabled\n this.registerAsGuest();\n } else {\n //\n this.updateState(ApplicationState.NotRegistered);\n }\n };\n\n handleOpenUserAccountOnClick = (): void => {\n const { localShowExternalContentModal, userAccountDisplay, userAccountUrl } = this.props;\n\n if (!userAccountUrl) {\n logError('Missing user account URL');\n return;\n }\n\n if (userAccountDisplay === ExternalContentDisplayType.ExternalPopup) {\n // An external library is used to inject JS and open a popup\n openSelfCare();\n } else {\n // Regular case (ExternalContentDisplayType.EmbeddedPopup): directly open user account via given URL\n localShowExternalContentModal(userAccountUrl);\n }\n };\n\n refreshUserInfo = async (): Promise<void> => {\n const { localGetUserInfo } = this.props;\n\n const userInfo = await localGetUserInfo();\n const statuses = getUserInfoStatuses(userInfo);\n if (!statuses) {\n return;\n }\n\n statuses.forEach(({ key, notificationType }) =>\n Messenger.emit(\n notificationType,\n <>\n <div>{Localizer.localize(key)}</div>\n <ButtonFX onClick={this.handleOpenUserAccountOnClick}>{Localizer.localize('settings.general.user_account')}</ButtonFX>\n </>,\n { className: 'large' },\n ),\n );\n };\n\n refreshUserRights = (): void => {\n const { localSendUserRightsRequest } = this.props;\n\n localSendUserRightsRequest();\n };\n\n handleTokenUpdate = (token: string | null): void => {\n const { isSubscriptionFeatureEnabled, localResetUserInfo, registration } = this.props;\n const { applicationState, forceSignInDisplay } = this.state;\n\n if (token === null) {\n // User disconnected\n this.handleNotRegisteredState();\n localResetUserInfo();\n return;\n }\n\n // Registered (user or guest)\n if (registration === RegistrationType.Registered) {\n if (isSubscriptionFeatureEnabled) {\n // Only for apps with subscription feature\n if (applicationState === ApplicationState.Logged) {\n // Refresh user rights\n this.refreshUserRights();\n }\n\n // Refresh user info\n fireAndForget(this.refreshUserInfo());\n return;\n }\n } else if (forceSignInDisplay) {\n // Registered as guest\n this.setState({ forceSignInDisplay: false });\n this.showSignIn();\n }\n\n localResetUserInfo();\n };\n\n watchRightsChange = (requiredRights: Array<string>): void => {\n this.setState({ requiredRightsChangeWatched: requiredRights });\n };\n\n checkRightsChange = (userRights: Array<string>) => {\n const { requiredRightsChangeWatched } = this.state;\n\n if (!requiredRightsChangeWatched) {\n // User did not click a \"play\" button to trigger the subscription journey\n return;\n }\n\n this.setState({ requiredRightsChangeWatched: null }, () => {\n const userRightsSet = new Set(userRights);\n\n if (requiredRightsChangeWatched.every((right) => userRightsSet.has(right))) {\n // User new rights satisfied all required rights\n Messenger.emit(MessengerEvents.NOTIFY_SUCCESS, <div>{Localizer.localize('subscription.congrats_new_subscription')}</div>);\n } else {\n // Even if rights have changed, the new ones are not enough\n updatePendingOperationType(PendingOperationKind.OpenCard);\n }\n\n checkPendingOperation();\n });\n };\n\n checkPendingOperationIfAllowed: () => void = () => {\n const { requiredRightsChangeWatched } = this.state;\n\n if (requiredRightsChangeWatched) {\n return;\n }\n\n checkPendingOperation();\n };\n\n startVersionCheckTimer: () => void = () => {\n this.resetVersionCheckTimer();\n this.versionCheckTimer = setTimeout(this.checkVersion, VERSION_CHECK.Timeout);\n };\n\n resetVersionCheckTimer = () => {\n const { versionCheckTimer } = this;\n\n if (versionCheckTimer) {\n clearTimeout(versionCheckTimer);\n this.versionCheckTimer = null;\n }\n };\n\n getNextVersionCheckDate = (): number => LocalStorageManager.loadNumber(StorageKeys.NextVersionCheckDate, 0);\n\n checkVersion = async (isForced?: boolean) => {\n const { isInTheaterMode, showNewVersion, version: currentVersion } = this.props;\n\n if (isRunningOnLocalhost()) {\n // Dev mode\n return;\n }\n\n // Version check\n const nextCheckDate = this.getNextVersionCheckDate();\n if (!isForced && nextCheckDate > 0 && AccurateTimestamp.now() < nextCheckDate) {\n // Version was checked less than 6h ago\n this.startVersionCheckTimer();\n return;\n }\n\n try {\n const latestVersion = await getVersion(true);\n\n LocalStorageManager.save(StorageKeys.NextVersionCheckDate, (AccurateTimestamp.now() + VERSION_CHECK.Interval).toString());\n this.startVersionCheckTimer();\n\n logInfo(`current version: ${currentVersion} | server version: ${latestVersion}`);\n\n if (latestVersion === currentVersion) {\n // Current version is up-to-date: let's check again later\n return;\n }\n\n // New version is available\n this.newVersionData = {\n currentVersion,\n newVersion: latestVersion,\n };\n\n // Do not disturb while playing!\n if (!isInTheaterMode) {\n showNewVersion(this.newVersionData);\n }\n } catch {\n // Error could be safely ignored since version is checked on a regular basis (plus it's not critical to the app)\n this.startVersionCheckTimer();\n }\n };\n\n toggleDebugMode = (): void => {\n const { localToggleDebugMode } = this.props;\n\n localToggleDebugMode();\n };\n\n updateState = (applicationState: ApplicationState, callback?: BasicFunction) => {\n const { statesWithHeader } = this;\n\n this.setState(\n {\n applicationState,\n isHeaderDisplayed: statesWithHeader.has(applicationState),\n },\n callback,\n );\n };\n\n updateErrorState = (error: ErrorType) => {\n this.updateState(ApplicationState.Error);\n this.setState({ error });\n };\n\n showCloseButton = () => {\n this.setState({ isCloseButtonHidden: false });\n };\n\n hideCloseButton = () => {\n this.setState({ isCloseButtonHidden: true });\n };\n\n applicationLoaded = () => {\n this.isFirstStartupSequence = false;\n };\n\n restartApp = () => {\n const { isGuestModeAllowed } = this.props;\n const { applicationState } = this.state;\n\n if (isGuestModeAllowed) {\n // Guest mode enabled: restart means signing back as guest\n this.isFirstStartupSequence = false;\n this.updateState(ApplicationState.DummyRestart);\n } else if (applicationState !== ApplicationState.NotRegistered) {\n // Guest mode disabled: restart means refresh page (only if sign-in page is not already displayed)\n window.location.reload();\n }\n };\n\n registerAsGuest = () => {\n const { applicationState } = this.state;\n\n if (applicationState === ApplicationState.RegisteringAsGuest || applicationState === ApplicationState.Registered) {\n return;\n }\n\n // Actual guest registration will be triggered through componentDidUpdate()\n this.updateState(ApplicationState.RegisteringAsGuest);\n };\n\n finalizeGuestRegistration = async (): Promise<void> => {\n const {\n configuration: { guestRegistrationServiceUrl },\n deviceId,\n localRegisterApplication,\n } = this.props;\n\n const url = buildDeviceUrl(deviceId, guestRegistrationServiceUrl);\n\n if (!url) {\n logError('Guest sign in error: URL is null');\n this.updateErrorState(ErrorType.GuestAuthent);\n return;\n }\n\n const options = process.env.REACT_APP_ID === APPLICATION_ID.FranceChannel ? { credentials: 'include' } : undefined;\n\n try {\n const userDeviceInfo = await fetchJsonWithErrorCheck(url, options);\n const { anonymous, applicationId, authDeviceUrl, deviceKey, error, subscriberId, upgradeDeviceUrl } = userDeviceInfo;\n\n if ((typeof error === 'string' && error !== '') || !applicationId || !authDeviceUrl || !deviceKey || !subscriberId || !upgradeDeviceUrl) {\n // Registration failed\n throw new Error('Guest registration error');\n }\n\n generateToken(deviceId, userDeviceInfo).then((userDeviceInfoJwt) => {\n LocalStorageManager.save(StorageKeys.UserDeviceInfo, userDeviceInfoJwt);\n LocalStorageManager.save(StorageKeys.RegisteredAsGuest, anonymous);\n\n /*\n * Apps like VIVA and PREMIERE MAX have a regular registerAsGuest endpoint but FranceChannel, having an external landing page, has a registerUserOrAnonymous endpoint\n * Hence, coming from this landing page, we force registering so that the app retrieves the correct data (user or anonymous)\n */\n localRegisterApplication(userDeviceInfo, anonymous);\n\n this.setState({ hasSkippedGuestRegistration: false });\n this.updateState(ApplicationState.Registered);\n });\n } catch (error) {\n logError(`Guest sign in error: ${error}`);\n this.updateErrorState(ErrorType.GuestAuthent);\n }\n };\n\n startupSuccessCallback = () => {\n this.updateState(ApplicationState.Logged);\n };\n\n showSignIn = (pendingOperationType?: PendingOperationKind) => {\n this.setState({ pendingOperationType });\n this.updateState(ApplicationState.SignInDisplayed);\n };\n\n showSubscribe = (highlightedCommercialOffers?: Array<string>) => {\n if (highlightedCommercialOffers !== undefined) {\n this.setState({ highlightedCommercialOffers });\n }\n\n this.updateState(ApplicationState.SubscribeDisplayed);\n };\n\n showPods = () => {\n this.updateState(ApplicationState.PodsDisplayed);\n };\n\n showGuestMode = () => {\n const { authenticationToken } = this.props;\n const { hasSkippedGuestRegistration } = this.state;\n\n if (authenticationToken && !hasSkippedGuestRegistration) {\n // Already registered as guest\n this.updateState(ApplicationState.Logged);\n } else {\n // Register as guest\n this.registerAsGuest();\n }\n };\n\n showApp = () => {\n this.updateState(ApplicationState.Logged);\n };\n\n handleCloseButtonOnClick = () => {\n const { deviceId, localRegisterApplication, registration } = this.props;\n const { applicationState } = this.state;\n\n updatePendingOperationType(PendingOperationKind.OpenCard);\n\n if ([ApplicationState.SubscribeDisplayed, ApplicationState.PodsDisplayed].includes(applicationState)) {\n // User closes the CRM front\n if (registration === RegistrationType.Registered) {\n // User already logged in: refresh token (and user info if needed) and show app\n Messenger.emit(MessengerEvents.REFRESH_AUTHENTICATION_TOKEN);\n this.setState({ requiredRightsChangeWatched: null });\n this.updateState(ApplicationState.Logged, () => {\n if (applicationState === ApplicationState.PodsDisplayed) {\n Messenger.emit(MessengerEvents.OPEN_GLOBAL_SETTINGS);\n }\n });\n return;\n }\n\n // App is currently not in logged in mode\n const userDeviceInfo = LocalStorageManager.loadObject(StorageKeys.CrmData, {});\n const { anonymous } = userDeviceInfo;\n\n if (!anonymous) {\n // User signed up or in\n generateToken(deviceId, userDeviceInfo).then((userDeviceInfoJwt) => {\n LocalStorageManager.save(StorageKeys.UserDeviceInfo, userDeviceInfoJwt);\n LocalStorageManager.save(StorageKeys.RegisteredAsGuest, false);\n\n localRegisterApplication(userDeviceInfo, false);\n });\n return;\n }\n }\n\n // Use did not sign in\n this.showGuestMode();\n };\n\n registrationFailureCallback = () => {\n this.setState(\n produce((draft) => {\n draft.registrationCounter += 1;\n }),\n this.handleNotRegisteredState,\n );\n };\n\n crmLoadTimeoutCallback = () => {\n this.updateErrorState(ErrorType.LoadTimeout);\n };\n\n unrecoverableStartupFailureCallback = () => {\n this.updateErrorState(ErrorType.StartupFailure);\n deleteOptimisticData();\n };\n\n startupTimeoutCallback = () => {\n this.updateErrorState(ErrorType.StartupTimeout);\n };\n\n startupFailureCallback = () => {\n const { isGuestModeAllowed, isRegisteredAsGuest } = this.props;\n\n deleteOptimisticData();\n\n if (!isRegisteredAsGuest && isGuestModeAllowed) {\n this.registerAsGuest();\n } else {\n this.showSignIn();\n }\n };\n\n handleHeaderImageOnClick = (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => {\n const { altKey, ctrlKey, shiftKey } = event;\n\n if ((ctrlKey || altKey) && shiftKey) {\n this.toggleDebugPanel();\n }\n };\n\n toggleDebugPanel = () => {\n this.setState(\n produce((draft) => {\n draft.isDebugPanelVisible = !draft.isDebugPanelVisible;\n }),\n );\n };\n\n hideHeaderCallback = () => {\n this.setState({ isHeaderDisplayed: false });\n };\n\n closeDebugPanelCallback = () => {\n this.setState({ isDebugPanelVisible: false });\n };\n\n renderTextLink = (text: string, url: string): React.Node => (\n <a href={url} rel='noopener noreferrer' target='_blank'>\n {text}\n </a>\n );\n\n renderImageLink = (image: string | null, url: string): React.Node => (\n <a href={url} rel='noopener noreferrer' target='_blank'>\n <img alt='' src={image} />\n </a>\n );\n\n renderUserAccountButton = (): React.Node => {\n const { userAccountUrl } = this.props;\n\n if (parseBoolean(process.env.REACT_APP_USER_ACCOUNT_ON_STORES_PAGE)) {\n return (\n <a className='text' href={userAccountUrl} rel='noopener noreferrer' target='_blank'>\n {Localizer.localize('settings.general.user_account')}\n </a>\n );\n }\n\n return null;\n };\n\n renderBrowserNotCompatibleState = (): React.Node => {\n const {\n applicationName,\n chromeUrl,\n configuration: { appStoreAppUrl, googlePlayAppUrl },\n edgeUrl,\n firefoxUrl,\n } = this.props;\n\n return (\n <div className='browserNotCompatible'>\n <img alt={applicationName} src={AppMobileAppLogo} />\n <div>{Localizer.localize('login.browser_not_compatible.service_not_available')}</div>\n <div>{Localizer.localize('login.browser_not_compatible.available_browsers')}</div>\n <div className='browsers'>\n {this.renderTextLink('Chrome', chromeUrl)}\n {this.renderTextLink('Edge', edgeUrl)}\n {this.renderTextLink('Firefox', firefoxUrl)}\n <span>Safari</span>\n </div>\n <div>{Localizer.localize('login.browser_not_compatible.download_mobile_apps')}</div>\n {this.renderImageLink(AppAppleStoreLogo, appStoreAppUrl)}\n {this.renderImageLink(AppGoogleStoreLogo, googlePlayAppUrl)}\n </div>\n );\n };\n\n renderRunningOnMobileState = (): React.Node => {\n const {\n applicationName,\n configuration: { appStoreAppUrl, googlePlayAppUrl },\n } = this.props;\n\n const style = {};\n if (AppBackgroundImage) {\n // $FlowFixMe: prop-missing\n style.backgroundImage = `url(${AppBackgroundImage})`;\n }\n\n return (\n <div className='runningOnMobile' style={style}>\n <img alt={applicationName} src={AppMobileAppLogo} />\n <div>{Localizer.localize('login.mobile_browser.download_mobile_apps')}</div>\n {this.renderImageLink(AppAppleStoreLogo, appStoreAppUrl)}\n {this.renderImageLink(AppGoogleStoreLogo, googlePlayAppUrl)}\n {this.renderUserAccountButton()}\n </div>\n );\n };\n\n renderNotRegisteredState = (): React.Node => {\n const { applicationState, isDebugPanelVisible, highlightedCommercialOffers, pendingOperationType } = this.state;\n\n return (\n <RegistrationView\n applicationState={applicationState}\n closeDebugPanelCallback={this.closeDebugPanelCallback}\n crmLoadTimeoutCallback={this.crmLoadTimeoutCallback}\n hideHeaderCallback={this.hideHeaderCallback}\n highlightedCommercialOffers={highlightedCommercialOffers}\n isDebugPanelVisible={isDebugPanelVisible}\n pendingOperationType={pendingOperationType}\n registrationFailureCallback={this.registrationFailureCallback}\n />\n );\n };\n\n renderRegisteredState = (): React.Node => {\n const { isFirstStartupSequence } = this;\n\n return (\n <StartView\n failureCallback={this.startupFailureCallback}\n isLoadingAnimationVisible={isFirstStartupSequence}\n successCallback={this.startupSuccessCallback}\n timeoutCallback={this.startupTimeoutCallback}\n unrecoverableFailureCallback={this.unrecoverableStartupFailureCallback}\n />\n );\n };\n\n renderLoggedState = (): React.Node => <MainView />;\n\n renderLoader = (): React.Node => {\n const { applicationState } = this.state;\n\n if (LoadingStates.includes(applicationState)) {\n return (\n <div className='appLoader'>\n <InfiniteCircleLoaderArc />\n </div>\n );\n }\n\n return null;\n };\n\n renderErrorState = (): React.Node => {\n const { error } = this.state;\n\n return (\n <div className='startupError'>\n <div className='errorTitle'>{Localizer.localize('login.error.message')}</div>\n <div className='errorName'>{Localizer.localize('login.error.name', { error: (error: string) })}</div>\n <div className='errorHint'>{Localizer.localize('login.error.hint')}</div>\n </div>\n );\n };\n\n render(): React.Node {\n const { applicationName } = this.props;\n const { applicationState, isCloseButtonHidden, isHeaderDisplayed } = this.state;\n\n // Close button is visible on a per-app basis, plus it could be hidden for apps having more steps after account is actually created\n const closeButton = !isCloseButtonHidden && AppHasHeaderCloseButton && applicationState !== ApplicationState.RegisteringAsGuest ? <PictoX onClick={this.handleCloseButtonOnClick} /> : null;\n\n const headerElement = isHeaderDisplayed ? (\n <div className='loginHeader'>\n <img alt={applicationName} draggable={false} onClick={this.handleHeaderImageOnClick} src={AppHeaderLogo} />\n {closeButton}\n </div>\n ) : null;\n\n let contentElement = null;\n switch (applicationState) {\n case ApplicationState.RunningOnMobile:\n contentElement = this.renderRunningOnMobileState();\n break;\n\n case ApplicationState.BrowserNotCompatible:\n contentElement = this.renderBrowserNotCompatibleState();\n break;\n\n case ApplicationState.Registered:\n contentElement = this.renderRegisteredState();\n break;\n\n case ApplicationState.Logged:\n contentElement = this.renderLoggedState();\n break;\n\n case ApplicationState.SignInDisplayed:\n case ApplicationState.SignUpDisplayed:\n case ApplicationState.SubscribeDisplayed:\n case ApplicationState.PodsDisplayed:\n case ApplicationState.NotRegistered:\n contentElement = this.renderNotRegisteredState();\n break;\n\n case ApplicationState.Error:\n contentElement = this.renderErrorState();\n break;\n\n case ApplicationState.Initializing:\n default:\n // Application is loading app configuration or still determining if running on mobile browser or on non-compatible browser\n contentElement = null;\n }\n\n return (\n <>\n {headerElement}\n {contentElement}\n <ModalContainer />\n {this.renderLoader()}\n </>\n );\n }\n}\n\nconst mapStateToProps = (state: CombinedReducers): ReduxApplicationContainerReducerStateType => {\n return {\n applicationName: state.appConfiguration.applicationName,\n authenticationToken: state.appRegistration.authenticationToken,\n chromeUrl: state.appConfiguration.devicesUrl.chrome,\n configuration: state.appConfiguration.configuration,\n deviceId: state.appRegistration.deviceId,\n edgeUrl: state.appConfiguration.devicesUrl.edge,\n firefoxUrl: state.appConfiguration.devicesUrl.firefox,\n focusedAvenue: state.ui.focusedAvenue,\n isAuthentInFullscreen: state.appConfiguration.isAuthentInFullscreen,\n isDebugModeEnabled: state.appConfiguration.isDebugModeEnabled,\n isGuestModeAllowed: state.appConfiguration.isGuestModeAllowed,\n isInTheaterMode: state.ui.isInTheaterMode,\n isRegisteredAsGuest: state.appRegistration.registration === RegistrationType.RegisteredAsGuest,\n isSubscriptionFeatureEnabled: state.appConfiguration.features[FEATURE_SUBSCRIPTION],\n registration: state.appRegistration.registration,\n userAccountDisplay: state.appConfiguration.userAccountDisplay,\n userAccountUrl: state.appConfiguration.configuration.customerAccountUrl ?? '',\n userRights: state.appConfiguration.rightsUser,\n version: state.appConfiguration.versionApp,\n };\n};\n\nconst mapDispatchToProps = (dispatch: Dispatch): ReduxApplicationContainerDispatchToPropsType => {\n return {\n localGetUserInfo: () => dispatch(getUserInfo()),\n localRegisterApplication: (userDeviceInfo: UserDeviceInfoType, asGuest: boolean) => dispatch(registerApplication(userDeviceInfo, asGuest)),\n localResetUserInfo: () => dispatch(resetUserInfo()),\n localSendUserRightsRequest: () => dispatch(sendUserRightsRequest()),\n localShowAuthenticationRequiredModal: () => dispatch(showAuthenticationRequiredModal()),\n localShowExternalContentModal: (url: string) => dispatch(showExternalContentModal(url)),\n localToggleDebugMode: () => dispatch(toggleDebugMode()),\n localUnregisterApplication: () => dispatch(unregisterApplication()),\n localUpdateBOVersion: (version: string) => dispatch(updateBOVersion(version)),\n localUpdateCrmBackVersion: (version: string) => dispatch(updateCrmBackVersion(version)),\n localUpdateCrmFrontVersion: (version: string) => dispatch(updateCrmFrontVersion(version)),\n localUpdateFocusedAvenue: (index: number, type: AvenueType) => dispatch(updateFocusedAvenue(index, type)),\n showNewVersion: (newVersionData: NEW_VERSION_DATA_MODAL_TYPE) => dispatch(showNewVersionModal(newVersionData)),\n };\n};\n\nconst ApplicationContainer: React.ComponentType<ApplicationContainerPropType> = connect(mapStateToProps, mapDispatchToProps)(ApplicationContainerView);\n\nexport default ApplicationContainer;\n","/* @flow */\n\nimport AccurateTimestamp from '../dateTime/AccurateTimestamp';\nimport { createCustomNetworkErrorFromKey } from '../../libs/netgemLibrary/helpers/CreateCustomNetworkError';\nimport { fetchJsonWithErrorCheck } from '../jsHelpers/xhr';\n\nconst getVersion: (isCheck?: boolean) => Promise<any> = async (isCheck) => {\n const filename = `/version.json${isCheck ? `?${AccurateTimestamp.now()}` : ''}`;\n\n try {\n const { version } = await fetchJsonWithErrorCheck(filename);\n\n if (version === 'local') {\n // Local development case\n const now = AccurateTimestamp.nowAsDate();\n now.setMinutes(now.getMinutes() - now.getTimezoneOffset());\n const dateLengthWithoutSeconds = 16;\n return now.toISOString().substring(0, dateLengthWithoutSeconds).replace('T', ' ').replace(':', 'h');\n }\n\n // Regular case\n return version;\n } catch {\n // Fetch error\n throw createCustomNetworkErrorFromKey('common.messages.errors.version_error');\n }\n};\n\nexport { getVersion };\n","/* @flow */\n\nimport AccurateTimestamp from '../dateTime/AccurateTimestamp';\nimport type { KeyValuePair } from '@ntg/utils/dist/types';\n\nconst E_TAGS: KeyValuePair<{| eTag: string | null, timestamp: number |}> = {};\n\nconst getETag: (url: string) => string | null = (url) => E_TAGS[url]?.eTag ?? null;\n\nconst setETag: (url: string, eTag: string | null) => void = (url, eTag) => {\n E_TAGS[url] = {\n eTag,\n timestamp: AccurateTimestamp.now(),\n };\n};\n\nexport { getETag, setETag };\n","/* @flow */\n\nimport { type CommonPromisedXMLHttpRequestReturnType, commonPromisedXMLHttpRequest } from '../../helpers/CommonPromisedXMLHttpRequest';\nimport { HTTP_READY_STATE_DONE, HttpStatus, NetgemNetworkCode, NetgemNetworkErrorMessage } from '../constants/NetworkCodesAndMessages';\nimport { CustomNetworkError } from '../../helpers/CustomNetworkError';\nimport { HttpMethod } from '../types/HttpMethod';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport type { NETGEM_API_V8_REQUEST_HEADERS } from '../types/Headers';\nimport { XhrResponseType } from '../../../../helpers/jsHelpers/xhr';\nimport { createCustomNetworkError } from '../../helpers/CreateCustomNetworkError';\nimport { logInfo } from '../../../../helpers/debug/debug';\n\nconst sendV8PromisedXMLHttpRequest: (\n url: string,\n responseType: XhrResponseType,\n requestHeaderList: ?NETGEM_API_V8_REQUEST_HEADERS,\n bodyParam: ?string,\n requestParam: ?string,\n isAuthenticated: boolean,\n signal: ?AbortSignal,\n method?: HttpMethod,\n) => CommonPromisedXMLHttpRequestReturnType = (url, responseType, requestHeaderList, bodyParam, requestParam, isAuthenticated, signal, method) => {\n const v8NetworkErrorCallBack = (request: XMLHttpRequest, message: ?string): CustomNetworkError => {\n const { readyState, response, status, statusText } = request;\n const responseHeaders = request.getAllResponseHeaders();\n\n // QA\n if (status !== HttpStatus.NotModified) {\n logInfo(`Error HTTP status: ${status}`);\n }\n\n if (status === 0 && readyState === HTTP_READY_STATE_DONE) {\n // Request miserably failed\n return createCustomNetworkError(HttpStatus.Error, message ?? Localizer.localize('common.messages.errors.request_failed'), responseHeaders, response);\n }\n\n // Request failed in a more appropriate way\n let msg = '';\n switch (status) {\n case NetgemNetworkCode.ClientError:\n msg = NetgemNetworkErrorMessage.ClientError;\n break;\n case NetgemNetworkCode.InvalidModalState:\n msg = NetgemNetworkErrorMessage.InvalidModalState;\n break;\n case NetgemNetworkCode.InvalidDimensions:\n msg = NetgemNetworkErrorMessage.InvalidDimensions;\n break;\n case NetgemNetworkCode.AuthenticationFailed:\n msg = NetgemNetworkErrorMessage.AuthenticationFailed;\n break;\n case NetgemNetworkCode.NotFound:\n msg = NetgemNetworkErrorMessage.NotFound;\n break;\n case NetgemNetworkCode.HubNotFound:\n msg = NetgemNetworkErrorMessage.HubNotFound;\n break;\n case NetgemNetworkCode.RealmNotFound:\n msg = NetgemNetworkErrorMessage.RealmNotFound;\n break;\n default:\n msg = statusText ?? (responseType === XhrResponseType.Text ? request.responseText : '');\n break;\n }\n\n return createCustomNetworkError(status, message ?? msg, responseHeaders, response);\n };\n\n return commonPromisedXMLHttpRequest(url, method || HttpMethod.GET, responseType, requestHeaderList, bodyParam, requestParam, isAuthenticated, v8NetworkErrorCallBack, signal);\n};\n\nexport default sendV8PromisedXMLHttpRequest;\n","/* @flow */\n\nimport { HeaderName, HeaderValue } from '../constants/Headers';\nimport { HttpStatus, NetgemNetworkCode } from '../constants/NetworkCodesAndMessages';\nimport { Messenger, MessengerEvents } from '@ntg/utils/dist/messenger';\nimport { addAuthenticationHeader, addETagHeader, getResponseHeader } from '../helpers/RequestHeaders';\nimport { getETag, setETag } from '../../../../helpers/request/eTag';\nimport AccurateTimestamp from '../../../../helpers/dateTime/AccurateTimestamp';\nimport type { CombinedReducers } from '../../../../redux/reducers';\nimport { CustomNetworkError } from '../../helpers/CustomNetworkError';\nimport { HttpMethod } from '../types/HttpMethod';\nimport { NETGEM_API_V8_AUTHENT_REALM_VIDEOFUTUR } from '../types/Realm';\nimport type { NETGEM_API_V8_REQUEST_HEADERS } from '../types/Headers';\nimport { type NETGEM_API_V8_REQUEST_RESPONSE } from '../types/RequestResponse';\nimport { type NETGEM_API_V8_REQUEST_RESPONSE_BASE } from '../types/RequestResponseBase';\nimport { XhrResponseType } from '../../../../helpers/jsHelpers/xhr';\nimport { getBOSetting } from '../../../../redux/netgemApi/actions/helpers/boSettings';\nimport { getCacheExpirationTime } from '../../../../helpers/request/cache';\nimport { getETagFromRequest } from '../../helpers/CommonPromisedXMLHttpRequest';\nimport { logError } from '../../../../helpers/debug/debug';\nimport sendV8PromisedXMLHttpRequest from '../helpers/PromisedXMLHttpRequest';\n\ntype CACHE_VALUE = {|\n expiration: number,\n requestResponse: string,\n|};\n\n// Key is request's URL\ntype RESPONSE_CACHE = {|\n [string]: CACHE_VALUE,\n|};\n\nconst cache: RESPONSE_CACHE = {};\n\n// Expired cached requests are removed every 20 minutes (in ms)\nconst CACHE_GARBAGE_COLLECTION_TIMEOUT = 1_200_000;\n\n// Delay before actually executing GC (in ms)\nconst GARBAGE_COLLECTION_TIMEOUT = 100;\n\nlet nextGarbageCollectionDate = AccurateTimestamp.now() + CACHE_GARBAGE_COLLECTION_TIMEOUT;\nlet gcTimer: TimeoutID | null = null;\n\nconst garbageCollectCache: () => void = () => {\n const now = AccurateTimestamp.now();\n\n Object.entries(cache).forEach(([key, value]) => {\n const { expiration } = ((value: any): CACHE_VALUE);\n if (now >= expiration) {\n // Response expired\n delete cache[key];\n }\n });\n\n nextGarbageCollectionDate = now + CACHE_GARBAGE_COLLECTION_TIMEOUT;\n\n gcTimer = null;\n};\n\nconst getCacheMaxAge: (req: XMLHttpRequest) => number | null = (req) => {\n const responseHeaders = req.getAllResponseHeaders();\n const result = /\\bcache-control:\\s*(.+)\\s*,\\s*max-age=(\\d+)/giu.exec(responseHeaders);\n const requiredLength = 2;\n\n if (result && result.length > requiredLength) {\n const [, directive, maxAge] = result;\n if (directive !== 'no-cache' && !isNaN(maxAge)) {\n return Number(maxAge);\n }\n }\n\n return null;\n};\n\nconst retryIfUnauthorized: (\n url: string,\n method: HttpMethod,\n authenticationToken: string | null,\n bodyParam: ?string,\n requestParam: ?string,\n requestHeaderList: NETGEM_API_V8_REQUEST_HEADERS,\n state: ?CombinedReducers,\n signal: ?AbortSignal,\n error: Error,\n status: number,\n) => Promise<any> = (url, method, authenticationToken, bodyParam, requestParam, requestHeaderList, state, signal, error, status) => {\n if (status !== HttpStatus.Unauthorized || !state) {\n return Promise.reject(error);\n }\n\n const {\n appConfiguration,\n appConfiguration: { distributorAppKeys, mainDistributorId },\n } = state;\n\n try {\n if (!(error instanceof CustomNetworkError)) {\n return Promise.reject(error);\n }\n\n const {\n networkError: { responseHeaders },\n } = error;\n const authent = getResponseHeader(responseHeaders, HeaderName.WwwAuthenticate);\n\n if (!authent) {\n // Authentication token probably expired: let's renew it\n Messenger.emit(MessengerEvents.REFRESH_AUTHENTICATION_TOKEN);\n return Promise.reject(error);\n }\n\n /*\n * Examples of authent headers:\n * www-authenticate: Bearer realm=\"videofutur\"\n * www-authenticate: Bearer realm=\"videofutur\", scope=\"distributor=vitis-vno-fibre-v8\"\n * www-authenticate: Bearer realm=\"videofutur\", scope=\"distributor=vitis-vno-fibre-v8&foo=bar\"\n *\n * NOTE: Additional parameters are not currently used\n */\n const m = authent.match(/^Bearer\\s+realm=\"(.+?)\"(?:\\s*,\\s*scope=\"distributor=(.+?)(&.+?=.+)?\")?$/iu);\n\n if (!m || m.length <= 1) {\n return Promise.reject(error);\n }\n\n // Retry request with right token and app key, as specified in the www-authenticate header\n\n const [, realm, distributorId] = m;\n const distributor = distributorId ?? mainDistributorId;\n\n if (!distributor) {\n return Promise.reject(error);\n }\n\n const { [distributor]: appKey } = distributorAppKeys;\n\n if (!appKey) {\n return Promise.reject(error);\n }\n\n requestHeaderList.push({\n name: HeaderName.AppKey,\n value: appKey,\n });\n\n const token = realm.toLowerCase() === NETGEM_API_V8_AUTHENT_REALM_VIDEOFUTUR ? getBOSetting('identity', appConfiguration) : authenticationToken;\n\n return sendV8Request(url, token, bodyParam, requestHeaderList, null, signal, requestParam, method);\n } catch {\n return Promise.reject(error);\n }\n};\n\nconst getResponseSettings: (requestHeaderList: NETGEM_API_V8_REQUEST_HEADERS) => { mustBeTransformedToImage: boolean, mustBeTransformedToJson: boolean, responseType: XhrResponseType } = (\n requestHeaderList,\n) => {\n let mustBeTransformedToImage = false;\n let mustBeTransformedToJson = false;\n let responseType = XhrResponseType.Text;\n\n for (let i: number = 0; i < requestHeaderList.length; i++) {\n const {\n [i]: { name, value },\n } = requestHeaderList;\n if (name === HeaderName.Accept && value.startsWith(HeaderValue.ApplicationJson)) {\n mustBeTransformedToJson = true;\n responseType = XhrResponseType.Text;\n break;\n } else if (name === HeaderName.Accept && value === HeaderValue.Image) {\n mustBeTransformedToImage = true;\n responseType = XhrResponseType.Blob;\n break;\n }\n }\n\n return {\n mustBeTransformedToImage,\n mustBeTransformedToJson,\n responseType,\n };\n};\n\nconst parseJsonResponse: (url: string, responseText: string) => Promise<any> = (url, responseText) => {\n try {\n return Promise.resolve(JSON.parse(responseText));\n } catch (error) {\n logError(`Error parsing JSON response from ${url}`);\n logError(responseText);\n return Promise.reject(error);\n }\n};\n\nconst sendV8Request: (\n url: string,\n authenticationToken: string | null,\n bodyParam: ?string,\n requestHeaderList: NETGEM_API_V8_REQUEST_HEADERS,\n state: ?CombinedReducers,\n signal: ?AbortSignal,\n requestParam: ?string,\n method?: HttpMethod,\n isPersonalData?: boolean,\n) => Promise<any> = (url, authenticationToken, bodyParam, requestHeaderList, state, signal, requestParam, method, isPersonalData) => {\n const { mustBeTransformedToImage, mustBeTransformedToJson, responseType } = getResponseSettings(requestHeaderList);\n const localMethod = method || HttpMethod.GET;\n const now = AccurateTimestamp.now();\n\n // Cache garbage collection\n if (now >= nextGarbageCollectionDate && !gcTimer) {\n gcTimer = setTimeout(garbageCollectCache, GARBAGE_COLLECTION_TIMEOUT);\n }\n\n let isCachedItemOnProbation = false;\n const { [url]: cachedItem } = cache;\n if (localMethod === HttpMethod.GET && cachedItem) {\n const { expiration } = cachedItem;\n if (now < expiration) {\n // Use response from cache\n const { requestResponse } = cachedItem;\n return Promise.resolve(JSON.parse(requestResponse));\n }\n\n // Cached item has expired but if PTF returns 304, it means it's still valid\n isCachedItemOnProbation = true;\n }\n\n addAuthenticationHeader(requestHeaderList, authenticationToken);\n\n const forceETagUsage = url.indexOf('GetHistory') > -1 || url.indexOf('GetFavorite') > -1;\n\n // Add e-tag for specific GET requests\n if (forceETagUsage && cachedItem) {\n const previousETag = getETag(url);\n addETagHeader(requestHeaderList, previousETag);\n }\n\n const returnObject = sendV8PromisedXMLHttpRequest(url, responseType, requestHeaderList, bodyParam, requestParam, Boolean(authenticationToken), signal, localMethod);\n\n return returnObject.promise\n .then((responseText: string) => {\n if (mustBeTransformedToJson) {\n return parseJsonResponse(url, responseText);\n }\n return responseText;\n })\n .then((response: NETGEM_API_V8_REQUEST_RESPONSE_BASE | string) => {\n const { xhr } = returnObject;\n\n const eTag = getETagFromRequest(xhr);\n const cacheMaxAge = getCacheMaxAge(xhr);\n let result: any = null;\n\n if (forceETagUsage) {\n // Store e-tag for next call\n setETag(url, eTag);\n }\n\n if (mustBeTransformedToJson && typeof response !== 'string') {\n ({ result } = response);\n } else if (mustBeTransformedToImage) {\n result = (window.URL || window.webkitURL).createObjectURL(response);\n } else {\n result = response;\n }\n\n const requestResponse: NETGEM_API_V8_REQUEST_RESPONSE = {\n cacheMaxAge,\n eTag,\n message: 'The HTTP request was successful',\n result,\n status: NetgemNetworkCode.OK,\n };\n\n if (localMethod === HttpMethod.GET) {\n // Store response in cache along with its expiration date (this will overwrite any existing cached response)\n cache[url] = {\n expiration: getCacheExpirationTime(cacheMaxAge),\n requestResponse: JSON.stringify(requestResponse),\n };\n }\n\n return Promise.resolve(requestResponse);\n })\n .catch((error: Error) => {\n const {\n xhr,\n xhr: { responseURL, status },\n } = returnObject;\n\n // $FlowFixMe: flow doesn't know DOMException\n if (error instanceof DOMException && error.name === 'AbortError') {\n xhr.abort();\n return Promise.reject(error);\n }\n\n if (status === HttpStatus.NotModified && !isPersonalData && cachedItem) {\n /*\n * Use response from cache for not modified response, except for personal data requests (wishlist & viewing history)\n * since content could have been modified by a POST request, thus invalidating the cached response\n */\n const { requestResponse } = cachedItem;\n return Promise.resolve(JSON.parse(requestResponse));\n }\n\n // Cached response has expired and an error occurred: better remove it from cache\n if (isCachedItemOnProbation) {\n delete cache[url];\n }\n\n return retryIfUnauthorized(responseURL, localMethod, authenticationToken, bodyParam, requestParam, requestHeaderList, state, signal, error, status);\n });\n};\n\nexport default sendV8Request;\n","/* @flow */\n\nimport { type CommonPromisedXMLHttpRequestReturnType, commonNetworkErrorCallBack, commonPromisedXMLHttpRequest } from '../../helpers/CommonPromisedXMLHttpRequest';\nimport { HeaderName, HeaderValue } from '../../v8/constants/Headers';\nimport { type BO_API_AUTHENTICATION_RESPONSE_CHALLENGE } from '../types/RequestResponseAuthenticate';\nimport { HttpMethod } from '../../v8/types/HttpMethod';\nimport { XhrResponseType } from '../../../../helpers/jsHelpers/xhr';\nimport { buildHeaderList } from '../../v8/helpers/RequestHeaders';\nimport hmacSHA1 from 'crypto-js/hmac-sha1';\n\nconst authenticationRequest: (authenticationUrl: string, applicationId: string, deviceKey: string, appKey: string, signal?: AbortSignal) => Promise<any> = (\n authenticationUrl,\n applicationId,\n deviceKey,\n appKey,\n signal,\n) => {\n const returnChallengeObject: CommonPromisedXMLHttpRequestReturnType = commonPromisedXMLHttpRequest(\n authenticationUrl,\n HttpMethod.POST,\n XhrResponseType.Json,\n buildHeaderList(HeaderName.ContentType, HeaderValue.ApplicationFormUrlencoded, HeaderName.AppKey, appKey),\n `app_id=${applicationId}`,\n null,\n false,\n commonNetworkErrorCallBack,\n signal,\n );\n\n return returnChallengeObject.promise.then((jsonChallengeResponse: BO_API_AUTHENTICATION_RESPONSE_CHALLENGE) => {\n const hmac = hmacSHA1(jsonChallengeResponse.challenge, deviceKey).toString();\n const returnAuthenticationObject: CommonPromisedXMLHttpRequestReturnType = commonPromisedXMLHttpRequest(\n authenticationUrl,\n HttpMethod.POST,\n XhrResponseType.Json,\n buildHeaderList(HeaderName.ContentType, HeaderValue.ApplicationFormUrlencoded, HeaderName.AppKey, appKey),\n `app_id=${applicationId}&hmac=${hmac}`,\n null,\n false,\n commonNetworkErrorCallBack,\n signal,\n );\n\n return returnAuthenticationObject.promise;\n });\n};\n\nexport default authenticationRequest;\n","/* @flow */\n\nimport {\n BO_API_ADD_FAVORITE,\n BO_API_CREATE_STREAM2,\n BO_API_DELETE_FAVORITE,\n BO_API_FAVORITE_LIST,\n BO_API_GET_STREAMS,\n BO_API_PERSONAL_DATA,\n BO_API_PURCHASE,\n BO_API_PURCHASE_LIST,\n BO_API_PURCHASE_STATUS,\n BO_API_START_STREAM,\n BO_API_STOP_STREAM,\n} from '../../../../redux/netgemApi/actions/videofutur/types/common';\nimport { type CommonPromisedXMLHttpRequestReturnType, commonNetworkErrorCallBack, commonPromisedXMLHttpRequest } from '../../helpers/CommonPromisedXMLHttpRequest';\nimport { HttpMethod } from '../../v8/types/HttpMethod';\nimport { XhrResponseType } from '../../../../helpers/jsHelpers/xhr';\nimport { buildUrl } from './bo';\n\n// BO API v2\nconst convertJson: (jsonResponse: any) => any = (jsonResponse) => {\n const {\n body: { createStream, favorites, getStreams, personalData, purchase, purchases, purchaseStatus, startStream, stopStream },\n } = jsonResponse;\n\n /* eslint-disable dot-notation */\n return {\n settings: [\n {\n type: BO_API_PERSONAL_DATA,\n url: personalData['_links'].personalData.href,\n },\n {\n type: BO_API_PURCHASE,\n url: purchase['_links'].purchase.href,\n },\n {\n type: BO_API_PURCHASE_STATUS,\n url: purchaseStatus['_links'].purchaseStatus.href,\n },\n {\n type: BO_API_PURCHASE_LIST,\n url: purchases['_links'].purchases.href,\n },\n {\n type: BO_API_ADD_FAVORITE,\n url: favorites['_links'].addFavorites.href,\n },\n {\n type: BO_API_DELETE_FAVORITE,\n url: favorites['_links'].deleteFavorites.href,\n },\n {\n type: BO_API_FAVORITE_LIST,\n url: favorites['_links'].favorites.href,\n },\n {\n type: BO_API_CREATE_STREAM2,\n url: createStream['_links'].createStream.href,\n },\n {\n type: BO_API_START_STREAM,\n url: startStream['_links'].startStream.href,\n },\n {\n type: BO_API_STOP_STREAM,\n url: stopStream['_links'].stopStream.href,\n },\n {\n type: BO_API_GET_STREAMS,\n url: getStreams['_links'].getStreams.href,\n },\n ],\n };\n /* eslint-enable dot-notation */\n};\n\nconst discoveryRequest: (discoveryUrl: string, device: string, distributor: string, identity: string, signal?: AbortSignal) => Promise<any> = (discoveryUrl, device, distributor, identity, signal) => {\n const returnDiscoveryObject: CommonPromisedXMLHttpRequestReturnType = commonPromisedXMLHttpRequest(\n buildUrl(discoveryUrl, {\n device,\n distributor,\n identity,\n }),\n HttpMethod.GET,\n XhrResponseType.Json,\n null,\n null,\n null,\n false,\n commonNetworkErrorCallBack,\n signal,\n );\n\n return returnDiscoveryObject.promise.then((response: any) => convertJson(response));\n};\n\nexport default discoveryRequest;\n","/* @flow */\n\nimport { HeaderName } from '../../v8/constants/Headers';\nimport type { NETGEM_API_V8_REQUEST_HEADERS } from '../../v8/types/Headers';\n\nconst createDmsCommonRequestHeader: (authenticationToken: string | null) => NETGEM_API_V8_REQUEST_HEADERS = (authenticationToken) => {\n const requestHeader = [];\n\n if (authenticationToken) {\n requestHeader.push({\n name: HeaderName.Authorization,\n value: `Bearer ${authenticationToken}`,\n });\n }\n\n return requestHeader;\n};\n\nexport default createDmsCommonRequestHeader;\n","/* @flow */\n\nimport { type CommonPromisedXMLHttpRequestReturnType, commonPromisedXMLHttpRequest } from '../../helpers/CommonPromisedXMLHttpRequest';\nimport { HTTP_READY_STATE_DONE, HttpStatus } from '../../v8/constants/NetworkCodesAndMessages';\nimport { XhrResponseType, getXhrResponseTypeFromString } from '../../../../helpers/jsHelpers/xhr';\nimport { CustomNetworkError } from '../../helpers/CustomNetworkError';\nimport { HttpMethod } from '../../v8/types/HttpMethod';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport type { NETGEM_API_V8_REQUEST_HEADERS } from '../../v8/types/Headers';\nimport { createCustomNetworkError } from '../../helpers/CreateCustomNetworkError';\nimport { getMessageFromErrorStatus } from '../constants/NetworkCodesAndMessages';\nimport { logInfo } from '../../../../helpers/debug/debug';\n\nconst sendDmsPromisedXMLHttpRequest: (\n url: string,\n method: HttpMethod,\n requestHeaderList: ?NETGEM_API_V8_REQUEST_HEADERS,\n bodyParam: ?string,\n requestParam: ?string,\n withCredentials: boolean,\n signal?: AbortSignal,\n) => CommonPromisedXMLHttpRequestReturnType = (url, method, requestHeaderList, bodyParam, requestParam, withCredentials, signal) => {\n const dmsNetworkErrorCallBack = (request: XMLHttpRequest, message: ?string): CustomNetworkError => {\n const { readyState, response, responseType, status, statusText } = request;\n const responseHeaders = request.getAllResponseHeaders();\n\n // QA\n if (status !== HttpStatus.NotModified) {\n logInfo(`Error HTTP status: ${status}`);\n }\n\n if (status === 0 && readyState === HTTP_READY_STATE_DONE) {\n // Request miserably failed\n return createCustomNetworkError(HttpStatus.Error, message ?? Localizer.localize('common.messages.errors.request_failed'), responseHeaders, response);\n }\n\n // Request failed in a more appropriate way\n let msg: string | null = getMessageFromErrorStatus(status);\n\n if (!msg) {\n msg = statusText ?? (getXhrResponseTypeFromString(responseType) === XhrResponseType.Text ? request.responseText : '');\n }\n\n return createCustomNetworkError(status, message ?? msg, responseHeaders, response);\n };\n\n return commonPromisedXMLHttpRequest(url, method, XhrResponseType.Json, requestHeaderList, bodyParam, requestParam, withCredentials, dmsNetworkErrorCallBack, signal);\n};\n\nexport default sendDmsPromisedXMLHttpRequest;\n","/* @flow */\n\nimport { HttpMethod } from '../../v8/types/HttpMethod';\nimport createDmsCommonRequestHeader from '../helpers/CreateCommonRequestHeader';\nimport sendDmsPromisedXMLHttpRequest from '../helpers/PromisedXMLHttpRequest';\n\nconst dmsAssociatedDeviceRequest: (baseAuthDeviceUrl: string, authenticationToken: string | null, signal?: AbortSignal) => Promise<any> = (baseAuthDeviceUrl, authenticationToken, signal) =>\n sendDmsPromisedXMLHttpRequest(`${baseAuthDeviceUrl}list`, HttpMethod.GET, createDmsCommonRequestHeader(authenticationToken), null, null, false, signal).promise;\n\nexport default dmsAssociatedDeviceRequest;\n","/* @flow */\n\nimport type { DMS_DEVICE_CHANNELS, NETGEM_API_DMS_CHANNEL_LIST } from '../types/ChannelList';\nimport { type NETGEM_API_DMS_PRIVATE_CHANNEL, type NETGEM_API_DMS_PRIVATE_CHANNEL_STREAM } from '../types/Channel';\nimport type { ChannelMap } from '../../v8/types/Channel';\nimport { Drm } from '../../../../helpers/jsHelpers/Drm';\nimport { HttpMethod } from '../../v8/types/HttpMethod';\nimport { StreamType } from '../../v8/types/MetadataSchedule';\nimport createDmsCommonRequestHeader from '../helpers/CreateCommonRequestHeader';\nimport sendDmsPromisedXMLHttpRequest from '../helpers/PromisedXMLHttpRequest';\n\nconst getValueFromNode: (value: any) => string = (value) => {\n if (value) {\n if (typeof value === 'string') {\n return value;\n }\n\n let v = value['#cdata-section'];\n if (typeof v === 'string') {\n return v;\n }\n\n v = value['#text'];\n if (typeof v === 'string') {\n return v;\n }\n }\n\n // No value or wrong format\n return '';\n};\n\nconst parseResolver: (stream: ?NETGEM_API_DMS_PRIVATE_CHANNEL_STREAM) => {| cmp: boolean, customData: string | null, service: string | null |} | null = (stream) => {\n if (!stream) {\n return null;\n }\n\n const { '@resolver': resolver } = stream;\n if (!resolver) {\n return null;\n }\n\n if (resolver === 'cmp') {\n // FAST channel case\n return {\n cmp: true,\n customData: null,\n service: null,\n };\n }\n\n // Search service and custom data in resolver URL\n const argsPos = resolver.indexOf('?');\n if (argsPos === -1) {\n return null;\n }\n\n let customData: string | null = null;\n let service: string | null = null;\n const args = resolver.substring(argsPos + 1).split('&');\n\n for (const arg of args) {\n const [key, value] = arg.split('=');\n if (key === 'customData') {\n customData = decodeURIComponent(value);\n } else if (key === 'service') {\n service = decodeURIComponent(value);\n }\n }\n\n return {\n cmp: false,\n customData,\n service,\n };\n};\n\nconst createChannelMap: (channels: Array<NETGEM_API_DMS_PRIVATE_CHANNEL>) => ChannelMap = (channels) => {\n const channelsMap: ChannelMap = {};\n\n // Sort channels by number\n channels.sort((a, b) => Number(a['@number']) - Number(b['@number']));\n\n for (let i: number = 0; i < channels.length; i++) {\n const channelId = channels[i]['@epgid'];\n if (channelId) {\n const channel = channels[i];\n const { data } = channel;\n const npvr = data?.npvr;\n const stream = data?.stream;\n const urlLifecycle = data?.urlLifecycle;\n const resolver = parseResolver(stream);\n\n channelsMap[channelId] = {\n altimg: getValueFromNode(channel.altimg),\n amsnumber: channel['@amsnumber'] ?? '',\n data: {\n npvr: {\n hasCatchup: npvr?.['@catchup'] ?? '0',\n hasKeepFromReplay: npvr?.['@keep'] ?? '0',\n hasStartover: npvr?.['@startover'] ?? '0',\n isRecordable: npvr?.['@record'] ?? '0',\n },\n stream: {\n debug: stream?.['@debug'] ?? '0',\n drmType: Drm.cast(stream?.['@drmType']),\n isSeekable: stream?.['@seekable'] ?? '0',\n laUrl: stream?.['@laUrl'] ?? '',\n msdrmCustomData: resolver?.customData ?? stream?.['@msdrmCustomData'] ?? '',\n notrickmode: stream?.['@notrickmode'] ?? '0',\n service: resolver?.service ?? '',\n type: StreamType.cast(getValueFromNode(stream)),\n },\n },\n epgid: channelId,\n id: channel['@id'],\n img: getValueFromNode(channel.img),\n isFastChannel: resolver?.cmp === true,\n isHidden: channel['@hidden'] === '1',\n name: getValueFromNode(channel.name),\n number: Number(channel['@number']),\n template: getValueFromNode(channel.template),\n url: getValueFromNode(channel.url),\n };\n\n if (urlLifecycle && typeof urlLifecycle['@heartbeat'] === 'string' && typeof urlLifecycle['@type'] === 'string') {\n channelsMap[channelId].data.urlLifecycle = {\n heartbeat: urlLifecycle['@heartbeat'],\n type: urlLifecycle['@type'],\n };\n }\n }\n }\n\n return channelsMap;\n};\n\nconst dmsDeviceChannelsRequest: (baseAuthDeviceUrl: string, authenticationToken: string | null, signal?: AbortSignal) => Promise<DMS_DEVICE_CHANNELS> = (\n baseAuthDeviceUrl,\n authenticationToken,\n signal,\n) =>\n sendDmsPromisedXMLHttpRequest(`${baseAuthDeviceUrl}channel-list`, HttpMethod.GET, createDmsCommonRequestHeader(authenticationToken), null, null, false, signal).promise.then(\n (channels: NETGEM_API_DMS_CHANNEL_LIST) => {\n let channelArray: Array<NETGEM_API_DMS_PRIVATE_CHANNEL> = [];\n const channel = channels.setup['channel-list']?.channel;\n if (channel) {\n if (Array.isArray(channel)) {\n channelArray = channel;\n } else {\n channelArray = [channel];\n }\n }\n\n return Promise.resolve({\n deviceChannelNetworkResponse: channels,\n deviceChannels: createChannelMap(channelArray),\n });\n },\n );\n\nexport default dmsDeviceChannelsRequest;\n","/* @flow */\n\nimport { DmsNetworkCode, getMessageFromErrorCode } from '../constants/NetworkCodesAndMessages';\nimport { type DmsSettingMap, type NETGEM_API_DMS_DEVICE_INFO_SETTINGS, type NETGEM_API_DMS_PRIVATE_DEVICE_INFO_SETTINGS } from '../types/DeviceInfoSettings';\nimport type { ApplicationInfo } from '../../../../redux/netgemApi/actions/emitter';\nimport { HttpMethod } from '../../v8/types/HttpMethod';\nimport { type NETGEM_API_DMS_DEVICE_INFO } from '../types/DeviceInfo';\nimport { type NETGEM_API_DMS_REQUEST_RESPONSE_DEVICE_SETTINGS } from '../types/RequestResponseDeviceSettings';\nimport type { ReadOnlyKeyValuePair } from '@ntg/utils/dist/types';\nimport { createCustomNetworkError } from '../../helpers/CreateCustomNetworkError';\nimport createDmsCommonRequestHeader from '../helpers/CreateCommonRequestHeader';\nimport sendDmsPromisedXMLHttpRequest from '../helpers/PromisedXMLHttpRequest';\n\nconst DmsFlags: ReadOnlyKeyValuePair<string> = Object.freeze({\n FLAG00_RESTART_STB_BROWSER: '0',\n FLAG01_STB_SETTING_TO_ADD: '1',\n FLAG02_STB_SETTING_TO_SET: '2',\n FLAG03_STB_SETTING_TO_DEL: '3',\n FLAG04_DISTRIBUTOR_SETTING_TO_ADD: '4',\n FLAG05_DISTRIBUTOR_SETTING_TO_SET: '5',\n FLAG06_DISTRIBUTOR_SETTING_TO_DEL: '6',\n FLAG07_SERVICE_SETTING_TO_ADD: '7',\n FLAG08_SERVICE_SETTING_TO_SET: '8',\n FLAG09_SERVICE_SETTING_TO_DEL: '9',\n FLAG10_SETTING_UPDATED: '10',\n FLAG11_SETTING_NOT_UPDATED: '11',\n});\n\nconst settingCmp: (a: NETGEM_API_DMS_DEVICE_INFO_SETTINGS, b: NETGEM_API_DMS_DEVICE_INFO_SETTINGS) => number = (a, b) => {\n const nameA = a.name.toUpperCase();\n const nameB = b.name.toUpperCase();\n\n if (nameA < nameB) {\n return -1;\n } else if (nameA > nameB) {\n return 1;\n }\n\n return 0;\n};\n\nconst createSettingsMap: (settings: Array<NETGEM_API_DMS_PRIVATE_DEVICE_INFO_SETTINGS>) => DmsSettingMap = (settings) => {\n const settingsMap: DmsSettingMap = {};\n\n for (let i: number = 0; i < settings.length; i++) {\n const flag = settings[i]['@flag'];\n\n if (\n flag !== DmsFlags.FLAG00_RESTART_STB_BROWSER &&\n flag !== DmsFlags.FLAG03_STB_SETTING_TO_DEL &&\n flag !== DmsFlags.FLAG06_DISTRIBUTOR_SETTING_TO_DEL &&\n flag !== DmsFlags.FLAG09_SERVICE_SETTING_TO_DEL\n ) {\n const sectionName: string = settings[i]['@section'];\n const setting: NETGEM_API_DMS_DEVICE_INFO_SETTINGS = {\n name: settings[i]['@name'],\n value: settings[i]['@value'],\n };\n\n const { [sectionName]: currentArray } = settingsMap;\n\n if (currentArray) {\n currentArray.push(setting);\n settingsMap[sectionName] = currentArray.sort(settingCmp);\n } else {\n settingsMap[sectionName] = [setting];\n }\n }\n }\n\n return settingsMap;\n};\n\nconst dmsDeviceSettingsRequest: (baseAuthDeviceUrl: string, authenticationToken: string | null, appInfo: ApplicationInfo, signal?: AbortSignal) => Promise<DmsSettingMap> = (\n baseAuthDeviceUrl,\n authenticationToken,\n appInfo,\n signal,\n) =>\n sendDmsPromisedXMLHttpRequest(`${baseAuthDeviceUrl}info`, HttpMethod.POST, createDmsCommonRequestHeader(authenticationToken), JSON.stringify(appInfo), null, false, signal).promise.then(\n (settings: NETGEM_API_DMS_REQUEST_RESPONSE_DEVICE_SETTINGS) => {\n const { exchange } = settings;\n const deviceInfo: ?NETGEM_API_DMS_DEVICE_INFO = JSON.parse(exchange);\n\n if (deviceInfo) {\n const settingsArray = deviceInfo.upgradecheck.script.setting || [];\n return Promise.resolve(createSettingsMap(settingsArray));\n }\n\n return Promise.reject(createCustomNetworkError((DmsNetworkCode.MalformedJson: number), getMessageFromErrorCode(DmsNetworkCode.MalformedJson)));\n },\n );\n\nexport default dmsDeviceSettingsRequest;\n","/* @flow */\n\nimport { HeaderName, HeaderValue } from '../../v8/constants/Headers';\nimport { type CommonPromisedXMLHttpRequestReturnType } from '../../helpers/CommonPromisedXMLHttpRequest';\nimport { HttpMethod } from '../../v8/types/HttpMethod';\nimport { type NETGEM_API_DMS_REQUEST_RESPONSE_AUTHENTICATE } from '../types/RequestResponseAuthenticate';\nimport { buildHeaderList } from '../../v8/helpers/RequestHeaders';\nimport hmacSHA1 from 'crypto-js/hmac-sha1';\nimport sendDmsPromisedXMLHttpRequest from '../helpers/PromisedXMLHttpRequest';\n\nconst dmsLoginRequest: (baseAuthDeviceUrl: string, applicationId: string, subscriberId: string, deviceKey: string, oem: ?string, version: ?string, signal?: AbortSignal) => Promise<any> = (\n baseAuthDeviceUrl,\n applicationId,\n subscriberId,\n deviceKey,\n oem,\n version,\n signal,\n) => {\n const requestParamArray = [];\n\n if (oem) {\n requestParamArray.push(`oem=${oem}`);\n }\n\n if (version) {\n requestParamArray.push(`version=${version}`);\n }\n\n const requestParam = requestParamArray.length > 0 ? `?${requestParamArray.join('&')}` : '';\n\n const authenticateBody = {\n applicationId,\n subscriberId,\n };\n\n const returnAuthenticateObject: CommonPromisedXMLHttpRequestReturnType = sendDmsPromisedXMLHttpRequest(\n `${baseAuthDeviceUrl}authenticate`,\n HttpMethod.POST,\n buildHeaderList(HeaderName.ContentType, HeaderValue.ApplicationJson),\n JSON.stringify(authenticateBody),\n requestParam,\n false,\n signal,\n );\n\n return returnAuthenticateObject.promise.then((authenticateJSONResponse: NETGEM_API_DMS_REQUEST_RESPONSE_AUTHENTICATE) => {\n const { challenge, opaque } = authenticateJSONResponse;\n const hmac = hmacSHA1(challenge, deviceKey).toString();\n\n const challengeBody = {\n applicationId,\n hmac,\n opaque,\n subscriberId,\n };\n\n // Running with HTTP method POST\n const returnChallengeObject: CommonPromisedXMLHttpRequestReturnType = sendDmsPromisedXMLHttpRequest(\n `${baseAuthDeviceUrl}challenge`,\n HttpMethod.POST,\n buildHeaderList(HeaderName.ContentType, HeaderValue.ApplicationJson),\n JSON.stringify(challengeBody),\n null,\n false,\n signal,\n );\n\n return returnChallengeObject.promise;\n });\n};\n\nexport default dmsLoginRequest;\n","/* @flow */\n\nimport { CustomNetworkError } from '../../helpers/CustomNetworkError';\nimport { HttpMethod } from '../../v8/types/HttpMethod';\nimport { HttpStatus } from '../../v8/constants/NetworkCodesAndMessages';\nimport { XhrResponseType } from '../../../../helpers/jsHelpers/xhr';\nimport { commonPromisedXMLHttpRequest } from '../../helpers/CommonPromisedXMLHttpRequest';\nimport { createCustomNetworkError } from '../../helpers/CreateCustomNetworkError';\n\nconst errorCallBack = (): CustomNetworkError => createCustomNetworkError(HttpStatus.Error);\n\nconst dmsLogoutRequest: (logoutUrl?: string) => Promise<void> = (logoutUrl) => {\n if (!logoutUrl) {\n return Promise.resolve();\n }\n\n // We don't care about the response\n return commonPromisedXMLHttpRequest(logoutUrl, HttpMethod.GET, XhrResponseType.Json, null, null, null, true, errorCallBack).promise.catch(() => Promise.resolve());\n};\n\nexport default dmsLogoutRequest;\n","/* @flow */\n\nimport { type CommonPromisedXMLHttpRequestReturnType } from '../../helpers/CommonPromisedXMLHttpRequest';\nimport { HttpMethod } from '../../v8/types/HttpMethod';\nimport createDmsCommonRequestHeader from '../helpers/CreateCommonRequestHeader';\nimport sendDmsPromisedXMLHttpRequest from '../helpers/PromisedXMLHttpRequest';\n\nconst dmsQuotaPvrRequest: (baseAuthDeviceUrl: string, authenticationToken: string | null) => Promise<any> = (baseAuthDeviceUrl, authenticationToken) => {\n const returnObject: CommonPromisedXMLHttpRequestReturnType = sendDmsPromisedXMLHttpRequest(\n `${baseAuthDeviceUrl}quotaPvr`,\n HttpMethod.GET,\n createDmsCommonRequestHeader(authenticationToken),\n null,\n null,\n false,\n );\n\n return returnObject.promise;\n};\n\nexport default dmsQuotaPvrRequest;\n","/* @flow */\n\nimport { HeaderName, HeaderValue } from '../../v8/constants/Headers';\nimport { addAuthenticationHeader, buildHeaderList } from '../../v8/helpers/RequestHeaders';\nimport { commonNetworkErrorCallBack, commonPromisedXMLHttpRequest } from '../../helpers/CommonPromisedXMLHttpRequest';\nimport { HttpMethod } from '../../v8/types/HttpMethod';\nimport { XhrResponseType } from '../../../../helpers/jsHelpers/xhr';\n\nconst request: (\n uri: string,\n applicationId: string,\n channelName: string,\n customData: string,\n service: string,\n url: string,\n method: HttpMethod,\n authenticationToken: string | null,\n signal?: AbortSignal,\n) => Promise<any> = (uri, applicationId, channelName, customData, service, url, method, authenticationToken, signal) => {\n const headerList = buildHeaderList(HeaderName.ContentType, HeaderValue.ApplicationJsonUtf8, HeaderName.Accept, HeaderValue.ApplicationJson);\n addAuthenticationHeader(headerList, authenticationToken);\n\n // NetgemTV hack\n const withCredentials = service !== 'anonymous';\n\n return commonPromisedXMLHttpRequest(\n uri,\n method,\n XhrResponseType.Text,\n headerList,\n JSON.stringify({\n applicationId,\n channelName,\n customData,\n service,\n url,\n }),\n null,\n withCredentials,\n commonNetworkErrorCallBack,\n signal,\n ).promise.then((response: string) => (response ? JSON.parse(response) : {}));\n};\n\nexport default request;\n","/* @flow */\n\nimport { HeaderName } from '../../v8/constants/Headers';\nimport { HttpMethod } from '../../v8/types/HttpMethod';\nimport { buildHeaderList } from '../../v8/helpers/RequestHeaders';\nimport sendV8Request from '../../v8/requests/v8';\n\nconst sendPersonalDataGetRequest: (url: string, eTag: ?string, method: HttpMethod, authenticationToken: string | null, signal: ?AbortSignal) => Promise<any> = (\n url,\n eTag,\n method,\n authenticationToken,\n signal,\n) => {\n const headerList = buildHeaderList(HeaderName.IfNoneMatch, eTag);\n return sendV8Request(url, authenticationToken, null, headerList, null, signal, null, method, true);\n};\n\nexport default sendPersonalDataGetRequest;\n","/* @flow */\n\nimport { HeaderName, HeaderValue } from '../../v8/constants/Headers';\nimport { HttpMethod } from '../../v8/types/HttpMethod';\nimport { buildHeaderList } from '../../v8/helpers/RequestHeaders';\nimport sendV8Request from '../../v8/requests/v8';\n\nconst sendPersonalDataPostRequest: (url: string, data: any, eTag: ?string, method: HttpMethod, authenticationToken: string | null, signal: ?AbortSignal) => Promise<any> = (\n url,\n data,\n eTag,\n method,\n authenticationToken,\n signal,\n) => {\n const headerList = buildHeaderList(HeaderName.ContentType, HeaderValue.ApplicationJsonUtf8, HeaderName.IfMatch, eTag);\n\n const body = JSON.stringify(data);\n return sendV8Request(url, authenticationToken, body, headerList, null, signal, null, method);\n};\n\nexport default sendPersonalDataPostRequest;\n","/* @flow */\n\nimport { HeaderName, HeaderValue } from '../constants/Headers';\nimport type { CombinedReducers } from '../../../../redux/reducers';\nimport { HttpMethod } from '../types/HttpMethod';\nimport { buildHeaderList } from '../helpers/RequestHeaders';\nimport sendV8Request from './v8';\n\nconst sendV8GenericRequest: (\n url: string,\n method: HttpMethod,\n authenticationToken: string | null,\n state: ?CombinedReducers,\n signal: ?AbortSignal,\n responseType: ?string,\n eTag: ?string,\n) => Promise<any> = (url, method, authenticationToken, state, signal, responseType, eTag) => {\n const headers = [];\n\n // Empty string means no response expected\n if (responseType !== '') {\n headers.push(HeaderName.Accept);\n if (responseType === undefined || responseType === null) {\n // Default is 'application/json'\n headers.push(HeaderValue.ApplicationJson);\n } else {\n // Add provided accepted type\n headers.push(responseType);\n }\n }\n\n if (eTag) {\n headers.push(!method || method === HttpMethod.GET ? HeaderName.IfNoneMatch : HeaderName.IfMatch);\n headers.push(eTag);\n }\n\n const headerList = buildHeaderList(...headers);\n return sendV8Request(url, authenticationToken, null, headerList, state, signal, null, method);\n};\n\nexport { sendV8GenericRequest };\n","/* @flow */\n\nimport { HeaderName, HeaderValue } from '../constants/Headers';\nimport { HttpMethod } from '../types/HttpMethod';\nimport { buildHeaderList } from '../helpers/RequestHeaders';\nimport sendV8Request from './v8';\n\nconst sendV8ListAliasPostRequest: (url: string, bodyParam: string, method: HttpMethod, authenticationToken: string | null, signal: ?AbortSignal) => Promise<any> = (\n url,\n bodyParam,\n method,\n authenticationToken,\n signal,\n) => {\n const headerList = buildHeaderList(HeaderName.ContentType, HeaderValue.ApplicationJsonUtf8, HeaderName.Accept, HeaderValue.ApplicationJson);\n return sendV8Request(url, authenticationToken, bodyParam, headerList, null, signal, null, method);\n};\n\nexport default sendV8ListAliasPostRequest;\n","/* @flow */\n\nimport { type AllSettledPromises, SettledPromiseFulfilled } from '../../../../helpers/jsHelpers/promise';\nimport { HeaderName, HeaderValue } from '../constants/Headers';\nimport { NETGEM_API_V8_AUTHENT_REALM_NETGEM, NETGEM_API_V8_AUTHENT_REALM_VIDEOFUTUR } from '../types/Realm';\nimport type { NETGEM_API_V8_FEED_RESULT, NETGEM_API_V8_RAW_FEED } from '../types/FeedResult';\nimport type { NETGEM_API_V8_NTG_VIDEO_FEED, NETGEM_API_V8_URL_DEFINITION } from '../types/NtgVideoFeed';\nimport { filterFeed, flattenFeedIfRequested, mergeFeeds } from '../helpers/Feed';\nimport type { ChannelMap } from '../types/Channel';\nimport type { CombinedReducers } from '../../../../redux/reducers';\nimport { FeedProviderKind } from '../types/Feed';\nimport { HttpMethod } from '../types/HttpMethod';\nimport { type NETGEM_API_V8_AGGREGATION_FEED } from '../types/AggregationFeed';\nimport { type NETGEM_API_V8_FEED } from '../types/FeedItem';\nimport { type NETGEM_API_V8_REQUEST_RESPONSE } from '../types/RequestResponse';\nimport { type NETGEM_API_V8_SECTION } from '../types/Section';\nimport { type NETGEM_API_V8_WIDGET_CONFIG_TYPE } from '../types/WidgetConfig';\nimport { buildHeaderList } from '../helpers/RequestHeaders';\nimport { generateApiUrl } from '../../../../redux/netgemApi/actions/helpers/api';\nimport { getBOSetting } from '../../../../redux/netgemApi/actions/helpers/boSettings';\nimport sendV8Request from './v8';\n\ntype SourceConfigType = {|\n ...NETGEM_API_V8_NTG_VIDEO_FEED,\n feedIndex: number,\n|};\n\nexport type FeedRequestResponseType = {|\n feedIndex: number,\n result: NETGEM_API_V8_FEED_RESULT,\n|};\n\ntype NetworkFeedsArrayType = Array<NETGEM_API_V8_RAW_FEED>;\n\nconst sendFeedRequestInternal: (\n url: string,\n method: HttpMethod,\n authenticationToken: string | null,\n extraHeaders: ?Array<any>,\n feedIndex: number,\n state: CombinedReducers,\n signal: ?AbortSignal,\n) => Promise<any> = (url, method, authenticationToken, extraHeaders, feedIndex, state, signal) => {\n const extraHeaderList = extraHeaders ? extraHeaders : [null];\n const headerList = buildHeaderList(HeaderName.Accept, HeaderValue.ApplicationJson, ...extraHeaderList);\n\n return sendV8Request(url, authenticationToken, null, headerList, state, signal).then((data: NETGEM_API_V8_REQUEST_RESPONSE) => {\n const { result } = data;\n\n return Promise.resolve({\n feedIndex,\n result,\n });\n });\n};\n\nconst filterMergeSourcesFeed: (section: NETGEM_API_V8_SECTION, networkFeedsArray: NetworkFeedsArrayType, channels: ChannelMap, sessionId: string) => NETGEM_API_V8_FEED = (\n section,\n networkFeedsArray,\n channels,\n sessionId,\n) => {\n const { length: feedCount } = networkFeedsArray;\n\n if (feedCount === 0) {\n return [];\n }\n\n // Filter feed sources\n const filteredFeedsArray: Array<NETGEM_API_V8_FEED> = [];\n const {\n model: sectionModel,\n model: { scoring },\n widgetConfig,\n }: { model: NETGEM_API_V8_AGGREGATION_FEED | NETGEM_API_V8_NTG_VIDEO_FEED, widgetConfig?: NETGEM_API_V8_WIDGET_CONFIG_TYPE } = section;\n const { filter: sectionFilter, provider: sectionProvider, slice: sectionSlice } = sectionModel;\n const groupItemsBy = widgetConfig?.groupItemsBy;\n\n if (sectionProvider === FeedProviderKind.Aggregation) {\n const aggregationSectionModel: NETGEM_API_V8_AGGREGATION_FEED = ((sectionModel: any): NETGEM_API_V8_AGGREGATION_FEED);\n const { sources: aggregationSources } = aggregationSectionModel;\n\n if (!aggregationSources) {\n return [];\n }\n\n for (let i = 0; i < feedCount; i++) {\n const {\n [i]: { filter, slice },\n } = aggregationSources;\n\n let filteredFeed = filterFeed(networkFeedsArray[i], channels, filter, slice);\n if (filteredFeed.length > 0) {\n if (sectionFilter) {\n filteredFeed = filterFeed(((filteredFeed: any): NETGEM_API_V8_RAW_FEED), channels, sectionFilter, slice);\n }\n filteredFeedsArray.push(flattenFeedIfRequested(filteredFeed, groupItemsBy));\n }\n }\n } else if (sectionProvider === FeedProviderKind.NtgVideo) {\n filteredFeedsArray.push(flattenFeedIfRequested(filterFeed(networkFeedsArray[0], channels, sectionFilter), groupItemsBy));\n }\n\n // Merge and sort feed sources\n return mergeFeeds(filteredFeedsArray, scoring, { sessionId }, sectionSlice);\n};\n\nconst sendFeedRequest: (section: NETGEM_API_V8_SECTION, searchString: ?string, state: CombinedReducers, sourceList: Array<SourceConfigType>, signal?: AbortSignal) => Promise<any> = (\n section,\n searchString,\n state,\n sourceList,\n signal,\n) => {\n const { length: sourceCount } = sourceList;\n const {\n appConfiguration,\n appConfiguration: { deviceChannels, distributorAppKeys, mainDistributorId, sessionId },\n appRegistration,\n } = state;\n\n if (sourceCount === 0) {\n return Promise.resolve();\n }\n\n const promises = [];\n const additionalParameters = searchString ? { searchString } : {};\n\n for (let i: number = 0; i < sourceCount; i++) {\n const source = sourceList[i];\n const url = generateApiUrl(((source: any): NETGEM_API_V8_URL_DEFINITION), additionalParameters, state);\n const { authentRealm, feedIndex } = source;\n\n let authenticationToken: string | null = null;\n let extraHeaders: ?Array<any> = null;\n\n if (authentRealm === NETGEM_API_V8_AUTHENT_REALM_NETGEM) {\n // Use PTF authentication token\n ({ authenticationToken } = appRegistration);\n } else if (authentRealm) {\n /*\n * Examples of authentRealm:\n * authentRealm: \"videofutur\"\n * authentRealm: \"videofutur?distributor=vitis-vno-fibre-v8\"\n * authentRealm: \"videofutur?distributor=vitis-vno-fibre-v8&foo=bar\"\n *\n * NOTE: Additional parameters are not currently used\n */\n const m = authentRealm.match(/^(.+?)(?:\\?distributor=(.+?)(&.+?=.+)?)?$/iu);\n\n if (m) {\n const [, realm, distributorId] = m;\n\n if (realm === NETGEM_API_V8_AUTHENT_REALM_VIDEOFUTUR) {\n // Use BO authentication token\n const distributor = distributorId ?? mainDistributorId;\n\n if (distributor) {\n const { [distributor]: appKey } = distributorAppKeys;\n extraHeaders = [HeaderName.AppKey, appKey];\n authenticationToken = getBOSetting('identity', appConfiguration);\n }\n }\n }\n }\n\n promises.push(sendFeedRequestInternal(url, HttpMethod.GET, authenticationToken, extraHeaders, feedIndex, state, signal));\n }\n\n return Promise.allSettled(promises).then((results: AllSettledPromises) => {\n const networkFeedsArray: NetworkFeedsArrayType = [];\n for (let i = 0; i < sourceCount; ++i) {\n networkFeedsArray.push([]);\n }\n\n results.forEach(({ status, value }) => {\n if (status === SettledPromiseFulfilled) {\n const {\n feedIndex,\n result: { feed },\n } = ((value: any): FeedRequestResponseType);\n networkFeedsArray[feedIndex] = feed;\n }\n });\n\n return Promise.resolve(filterMergeSourcesFeed(section, networkFeedsArray, deviceChannels, sessionId));\n });\n};\n\nconst sendV8SectionFeedRequest: (section: NETGEM_API_V8_SECTION, searchString: ?string, state: CombinedReducers, signal?: AbortSignal) => Promise<any> = (section, searchString, state, signal) => {\n const sourceList: Array<SourceConfigType> = [];\n const sectionModel: NETGEM_API_V8_NTG_VIDEO_FEED | NETGEM_API_V8_AGGREGATION_FEED = section.model;\n\n if (sectionModel.provider === FeedProviderKind.Aggregation) {\n const { sources } = ((sectionModel: any): NETGEM_API_V8_AGGREGATION_FEED);\n\n if (!sources) {\n return Promise.reject(new Error('Missing sources in feed'));\n }\n\n for (let i: number = 0; i < sources.length; i++) {\n sourceList.push({\n ...sources[i],\n feedIndex: i,\n });\n }\n } else if (sectionModel.provider === FeedProviderKind.NtgVideo) {\n const ntgVideoFeed: NETGEM_API_V8_NTG_VIDEO_FEED = ((sectionModel: any): NETGEM_API_V8_NTG_VIDEO_FEED);\n sourceList.push({\n ...ntgVideoFeed,\n feedIndex: 0,\n });\n }\n\n return sendFeedRequest(section, searchString, state, sourceList, signal);\n};\n\nexport { sendV8SectionFeedRequest };\n","/* @flow */\n\nimport { DmsNetworkCode, getMessageFromErrorCode } from './dms/constants/NetworkCodesAndMessages';\nimport { Messenger, MessengerEvents } from '@ntg/utils/dist/messenger';\nimport { logDebug, logError, logInfo, logWarning } from '../../helpers/debug/debug';\nimport { sendV8DataCollectionCollectorIdRequest, sendV8DataCollectionRequest } from './dataCollection/requests';\nimport { sendV8ScheduledRecordingCreateRequest, sendV8ScheduledRecordingUpdateRequest } from './v8/requests/scheduledRecordings';\nimport AccurateTimestamp from '../../helpers/dateTime/AccurateTimestamp';\nimport type { ApplicationInfo } from '../../redux/netgemApi/actions/emitter';\nimport { type BO_API_AUTHENTICATION_SETTINGS } from './videofutur/types/AuthenticationSettings';\nimport type { BO_RESPONSE_WITH_ETAG } from '../../redux/netgemApi/actions/videofutur/types/common';\nimport type { ChannelMap } from './v8/types/Channel';\nimport type { CombinedReducers } from '../../redux/reducers';\nimport { CustomNetworkError } from './helpers/CustomNetworkError';\nimport type { DmsSettingMap } from './dms/types/DeviceInfoSettings';\nimport { HttpMethod } from './v8/types/HttpMethod';\nimport type { KeyValuePair } from '@ntg/utils/dist/types';\nimport LocalStorageManager from '../../helpers/localStorage/localStorageManager';\nimport { type NETGEM_API_DMS_ASSOCIATED_DEVICE } from './dms/types/AssociatedDevice';\nimport { type NETGEM_API_DMS_CHANNEL_LIST } from './dms/types/ChannelList';\nimport { type NETGEM_API_DMS_QUOTA_PVR } from './dms/types/QuotaPvr';\nimport { type NETGEM_API_DMS_REQUEST_RESPONSE_ASSOCIATED_DEVICE } from './dms/types/RequestResponseAssociatedDevice';\nimport { type NETGEM_API_DMS_REQUEST_RESPONSE_CHALLENGE } from './dms/types/RequestResponseChallenge';\nimport { type NETGEM_API_DMS_REQUEST_RESPONSE_QUOTA_PVR } from './dms/types/RequestResponseQuotaPvr';\nimport type { NETGEM_API_V8_DATA_COLLECTION_BATCH_PAYLOAD } from './v8/types/DataCollection';\nimport { type NETGEM_API_V8_REQUEST_HEADERS } from './v8/types/Headers';\nimport { type NETGEM_API_V8_SECTION } from './v8/types/Section';\nimport type { ScheduledRecordingsKindType } from './v8/types/Npvr';\nimport { StorageKeys } from '../../helpers/localStorage/keys';\nimport { areSettingsEqual } from '../../helpers/dms/helper';\nimport boAuthenticationRequest from './videofutur/requests/authentication';\nimport boDiscoveryRequest from './videofutur/requests/discovery';\nimport { createCustomNetworkError } from './helpers/CreateCustomNetworkError';\nimport { deleteOptimisticData } from '../../helpers/localStorage/optimisticData';\nimport dmsAssociatedDeviceRequest from './dms/requests/associatedDevices';\nimport dmsDeviceChannelsRequest from './dms/requests/deviceChannels';\nimport dmsDeviceSettingsRequest from './dms/requests/deviceSettings';\nimport dmsLoginRequest from './dms/requests/login';\nimport dmsLogoutRequest from './dms/requests/logout';\nimport dmsQuotaPvrRequest from './dms/requests/quotaPvr';\nimport { getVfAuthenticationSettings } from '../../helpers/videofutur/authenticationSettings';\nimport { sendBORequest } from './videofutur/requests/bo';\nimport sendNtgEntitlementRequest from './ntgEntitlement/requests';\nimport sendPersonalDataGetRequest from './personalData/requests/get';\nimport sendPersonalDataPostRequest from './personalData/requests/post';\nimport { sendV8GenericRequest } from './v8/requests/generic';\nimport sendV8ListAliasPostRequest from './v8/requests/listAlias';\nimport { sendV8SectionFeedRequest } from './v8/requests/feed';\n\n// Every 5 seconds, next renewal date is checked against current date (setTimeout is not used because it does not work properly when computer goes to sleep)\nconst TOKEN_RENEWAL_CHECK_INTERVAL = 5_000;\n\n/*\n * In case of error, token renewal is retried multiple times, with increasing waiting time, up to a maximum of retries\n * backoff time is initialized at 5 s\n * then on each error, new backoff time is incremented by TOKEN_RENEWAL_CHECK_INTERVAL * retry number\n *\n * Example: 5s 10s 20s 35s ...\n */\n\n// Maximum number of retries\nconst TOKEN_RENEWAL_MAX_RETRIES = 6;\n\n// Token is renewed 5 minutes before its expiration date (in ms)\nconst TOKEN_RENEWAL_EXPIRATION_MARGIN = 300_000;\n\n// Minimum number of DMS settings for a response to be considered valid\nconst DMS_SETTINGS_MIN_SIZE = 15;\n\n// Delay before actually doing DMS settings query when a previous one has been found in the local storage (in ms)\nconst OPTIMISTIC_DMS_SETTINGS_REFRESH_DELAY = 10;\n\ntype AuthenticationTokenDataType = {|\n applicationId: string,\n authDeviceUrl: string,\n deviceKey: string,\n oem: ?string,\n subscriberId: string,\n version: ?string,\n|};\n\ntype ConnectedCallbackType = (authenticationToken: string | null) => void;\ntype DisconnectedCallbackType = () => void;\ntype DeviceSettingsCallbackType = (deviceSettings: DmsSettingMap) => void;\ntype DeviceChannelsCallbackType = (deviceChannels: ChannelMap) => void;\ntype AssociatedDevicesCallbackType = (associatedDevices: Array<NETGEM_API_DMS_ASSOCIATED_DEVICE>) => void;\ntype QuotaPvrCallbackType = (quotaPvr: ?NETGEM_API_DMS_QUOTA_PVR) => void;\ntype BOAuthenticationCallbackType = (settings?: KeyValuePair<string>) => void;\n\nclass NetgemApi {\n associatedDevicesCallback: AssociatedDevicesCallbackType;\n\n authenticationToken: string | null;\n\n authenticationTokenData: ?AuthenticationTokenDataType;\n\n baseUpgradeDeviceUrl: string;\n\n boAuthenticationCallback: ?BOAuthenticationCallbackType;\n\n boTokenRenewalTimer: ?IntervalID;\n\n connectedCallback: ConnectedCallbackType;\n\n deviceChannelsCallback: DeviceChannelsCallbackType;\n\n deviceSettingsCallback: DeviceSettingsCallbackType;\n\n disconnectedCallback: DisconnectedCallbackType;\n\n isAuthenticationTokenRenewing: boolean;\n\n nextBOTokenRenewalDate: number;\n\n nextTokenRenewalDate: number;\n\n quotaPvrCallback: ?QuotaPvrCallbackType;\n\n retryCount: number;\n\n tokenRenewalTimer: ?IntervalID;\n\n constructor(\n connectedCallback: ConnectedCallbackType,\n disconnectedCallback: DisconnectedCallbackType,\n deviceSettingsCallback: DeviceSettingsCallbackType,\n deviceChannelsCallback: DeviceChannelsCallbackType,\n associatedDevicesCallback: AssociatedDevicesCallbackType,\n quotaPvrCallback: ?QuotaPvrCallbackType,\n boAuthenticationCallback: ?BOAuthenticationCallbackType,\n ) {\n this.associatedDevicesCallback = associatedDevicesCallback;\n this.authenticationToken = null;\n this.authenticationTokenData = null;\n this.baseUpgradeDeviceUrl = '';\n this.boTokenRenewalTimer = null;\n this.boAuthenticationCallback = boAuthenticationCallback;\n this.connectedCallback = connectedCallback;\n this.deviceChannelsCallback = deviceChannelsCallback;\n this.deviceSettingsCallback = deviceSettingsCallback;\n this.disconnectedCallback = disconnectedCallback;\n this.isAuthenticationTokenRenewing = false;\n this.nextBOTokenRenewalDate = 0;\n this.nextTokenRenewalDate = 0;\n this.quotaPvrCallback = quotaPvrCallback;\n this.retryCount = 0;\n this.tokenRenewalTimer = null;\n\n Messenger.on(MessengerEvents.REFRESH_AUTHENTICATION_TOKEN, this.refreshToken);\n }\n\n // $FlowFixMe: Flow does not support symbols yet\n get [Symbol.toStringTag]() {\n return 'NetgemApi';\n }\n\n reset: () => void = () => {\n this.resetTokenRenewalTimer();\n this.resetBOTokenRenewalTimer();\n this.authenticationToken = null;\n this.disconnectedCallback();\n };\n\n checkErrorMessage: (error: CustomNetworkError) => void = (error) => {\n try {\n const customStatus = error.getCustomStatus();\n // Missing or invalid authentication token\n if (\n customStatus === (DmsNetworkCode.MissingOrInvalidAuthenticationToken: number) ||\n // Unknown device\n customStatus === (DmsNetworkCode.UnknownDevice: number) ||\n // Invalid device\n customStatus === (DmsNetworkCode.InvalidDevice: number) ||\n // DMS did not provide correct error code\n customStatus === (DmsNetworkCode.UnknownError: number)\n ) {\n // The reasons above trigger a reset\n this.reset();\n }\n // For all other statuses, execution proceeds\n } catch {\n // Not being able to get status also triggers a reset\n this.reset();\n }\n };\n\n refreshToken: () => void = () => {\n if (!this.authenticationTokenData) {\n logError('Cannot refresh authentication token because of missing data');\n return;\n }\n\n const {\n authenticationTokenData: { applicationId, authDeviceUrl, deviceKey, oem, subscriberId, version },\n isAuthenticationTokenRenewing,\n } = this;\n\n if (isAuthenticationTokenRenewing) {\n return;\n }\n\n this.resetTokenRenewalTimer();\n this.sendLoginRequest(authDeviceUrl, null, applicationId, subscriberId, deviceKey, oem, version).catch((error) => {\n logError(`Error refreshing authentication token (forced): ${error.message}`);\n logError(error instanceof CustomNetworkError ? error.networkError : error);\n });\n };\n\n startTokenRenewalTimer: (authDeviceUrl: string, applicationId: string, subscriberId: string, deviceKey: string, oem: ?string, version: ?string) => void = (\n authDeviceUrl,\n applicationId,\n subscriberId,\n deviceKey,\n oem,\n version,\n ) => {\n const { tokenRenewalTimer } = this;\n\n if (tokenRenewalTimer) {\n clearInterval(tokenRenewalTimer);\n }\n\n this.tokenRenewalTimer = setInterval(() => {\n const { nextTokenRenewalDate } = this;\n\n if (nextTokenRenewalDate > 0 && AccurateTimestamp.now() >= nextTokenRenewalDate) {\n this.sendLoginRequest(authDeviceUrl, null, applicationId, subscriberId, deviceKey, oem, version).catch((error) => {\n logError(`Error refreshing authentication token (timer): ${error.message}`);\n logError(error instanceof CustomNetworkError ? error.networkError : error);\n\n if (this.retryCount >= TOKEN_RENEWAL_MAX_RETRIES) {\n // Max number of retries has been reached: reset app\n logWarning('Max retries reached. Giving up.');\n this.reset();\n return;\n }\n\n this.nextTokenRenewalDate = AccurateTimestamp.now() + TOKEN_RENEWAL_CHECK_INTERVAL * this.retryCount;\n const retriesLeft = TOKEN_RENEWAL_MAX_RETRIES - this.retryCount;\n logInfo(`Will retry ${retriesLeft} time${retriesLeft > 1 ? 's' : ''}...`);\n this.retryCount += 1;\n });\n }\n }, TOKEN_RENEWAL_CHECK_INTERVAL);\n };\n\n startBOTokenRenewalTimer: (authenticationUrl: string, applicationId: string, deviceKey: string, appKey: string) => void = (authenticationUrl, applicationId, deviceKey, appKey) => {\n const { boTokenRenewalTimer } = this;\n\n if (boTokenRenewalTimer) {\n // Do not start timer more than once\n return;\n }\n\n this.boTokenRenewalTimer = setInterval(() => {\n const { nextBOTokenRenewalDate } = this;\n\n if (nextBOTokenRenewalDate > 0 && AccurateTimestamp.now() >= nextBOTokenRenewalDate) {\n this.sendBOAuthenticationRequest(authenticationUrl, applicationId, deviceKey, appKey).catch((error) => logError(error.message));\n }\n }, TOKEN_RENEWAL_CHECK_INTERVAL);\n };\n\n resetTokenRenewalTimer: () => void = () => {\n if (this.tokenRenewalTimer) {\n clearInterval(this.tokenRenewalTimer);\n this.tokenRenewalTimer = null;\n }\n this.nextTokenRenewalDate = 0;\n };\n\n resetBOTokenRenewalTimer: () => void = () => {\n if (this.boTokenRenewalTimer) {\n clearInterval(this.boTokenRenewalTimer);\n this.boTokenRenewalTimer = null;\n }\n this.nextBOTokenRenewalDate = 0;\n };\n\n dmsSettingsSuccessCallback: (settings: DmsSettingMap, isChecking?: boolean, optimisticDmsSettings: ?DmsSettingMap) => Promise<void> = (settings, isChecking, optimisticDmsSettings) => {\n LocalStorageManager.save(StorageKeys.OptimisticDmsSettingsUsed, false);\n\n const optimisticDmsSettingsFound = optimisticDmsSettings !== null;\n\n if (isChecking && optimisticDmsSettingsFound && areSettingsEqual(settings, optimisticDmsSettings)) {\n // Stored settings are still up-to-date\n return Promise.resolve();\n }\n\n const settingsCount = Object.keys(settings).length;\n\n if (settingsCount === 0) {\n // DMS settings empty\n deleteOptimisticData();\n if (isChecking) {\n // When checking DMS in background, promise would remain uncaught\n return Promise.resolve();\n }\n return Promise.reject(\n new CustomNetworkError({\n message: 'Empty DMS settings',\n status: -1,\n }),\n );\n }\n\n if (settingsCount <= DMS_SETTINGS_MIN_SIZE) {\n // DMS settings seem incomplete\n deleteOptimisticData();\n if (isChecking) {\n // When checking DMS in background, promise would remain uncaught\n return Promise.resolve();\n }\n return Promise.reject(\n new CustomNetworkError({\n message: 'Incomplete DMS settings',\n status: -1,\n }),\n );\n }\n\n // Store settings in Redux store\n this.deviceSettingsCallback(settings);\n\n // Store settings in local storage for future optimistic use\n LocalStorageManager.save(StorageKeys.OptimisticDmsSettings, settings);\n\n if (!isChecking) {\n // Settings found, used and stored, and no optimistic settings were found\n return Promise.resolve();\n }\n\n // Since settings have changed, reload app\n Messenger.emit(MessengerEvents.RESTART_APP);\n\n // When checking DMS in background, promise would remain uncaught\n return Promise.resolve();\n };\n\n getDeviceSettings: (appInfo: ApplicationInfo, signal?: AbortSignal, isChecking?: boolean) => Promise<void> = (appInfo, signal, isChecking) => {\n const optimisticDmsSettings = LocalStorageManager.loadObject(StorageKeys.OptimisticDmsSettings);\n\n if (!isChecking && optimisticDmsSettings && Object.keys(optimisticDmsSettings).length > DMS_SETTINGS_MIN_SIZE && !LocalStorageManager.loadBoolean(StorageKeys.OptimisticDmsSettingsUsed, true)) {\n // Startup optimization: get last DMS settings from local storage and do the actual query in background after a short delay\n this.deviceSettingsCallback(optimisticDmsSettings);\n LocalStorageManager.save(StorageKeys.OptimisticDmsSettingsUsed, true);\n // No cancel token because checking DMS settings should not be cancelled\n setTimeout(this.getDeviceSettings, OPTIMISTIC_DMS_SETTINGS_REFRESH_DELAY, appInfo, undefined, true);\n return Promise.resolve();\n }\n\n return dmsDeviceSettingsRequest(this.baseUpgradeDeviceUrl, this.authenticationToken, appInfo, signal)\n .then((settings) => {\n signal?.throwIfAborted();\n\n return this.dmsSettingsSuccessCallback(settings, isChecking, optimisticDmsSettings);\n })\n .catch((error: CustomNetworkError) => {\n this.checkErrorMessage(error);\n if (isChecking) {\n // Settings have been retrieved in background and promise rejection would not be caught\n return Promise.resolve();\n }\n\n return Promise.reject(error);\n });\n };\n\n getDeviceChannelList: (signal?: AbortSignal) => Promise<NETGEM_API_DMS_CHANNEL_LIST> = (signal) =>\n dmsDeviceChannelsRequest(this.baseUpgradeDeviceUrl, this.authenticationToken, signal)\n .then((param: { deviceChannelNetworkResponse: NETGEM_API_DMS_CHANNEL_LIST, deviceChannels: ChannelMap }) => {\n signal?.throwIfAborted();\n\n this.deviceChannelsCallback(param.deviceChannels);\n return Promise.resolve(param.deviceChannelNetworkResponse);\n })\n .catch((error: CustomNetworkError) => {\n this.checkErrorMessage(error);\n return Promise.reject(error);\n });\n\n getAssociatedDeviceList: (signal?: AbortSignal) => Promise<NETGEM_API_DMS_REQUEST_RESPONSE_ASSOCIATED_DEVICE> = (signal) => {\n this.associatedDevicesCallback([]);\n\n return dmsAssociatedDeviceRequest(this.baseUpgradeDeviceUrl, this.authenticationToken, signal)\n .then((associatedDeviceNetworkResponse: NETGEM_API_DMS_REQUEST_RESPONSE_ASSOCIATED_DEVICE) => {\n signal?.throwIfAborted();\n\n this.associatedDevicesCallback(associatedDeviceNetworkResponse.list);\n return Promise.resolve(associatedDeviceNetworkResponse);\n })\n .catch((error: CustomNetworkError) => {\n this.checkErrorMessage(error);\n return Promise.reject(error);\n });\n };\n\n getQuotaPvr: () => Promise<NETGEM_API_DMS_REQUEST_RESPONSE_QUOTA_PVR> = () => {\n if (this.quotaPvrCallback) {\n this.quotaPvrCallback(null);\n }\n\n return dmsQuotaPvrRequest(this.baseUpgradeDeviceUrl, this.authenticationToken)\n .then((quotaPvrNetworkResponse: NETGEM_API_DMS_REQUEST_RESPONSE_QUOTA_PVR) => {\n if (this.quotaPvrCallback) {\n const { quotaPVR, quotaPVRUsed } = quotaPvrNetworkResponse;\n this.quotaPvrCallback({\n quotaPVR,\n quotaPVRUsed,\n });\n }\n return Promise.resolve(quotaPvrNetworkResponse);\n })\n .catch((error: CustomNetworkError) => {\n this.checkErrorMessage(error);\n return Promise.reject(error);\n });\n };\n\n sendLogoutRequest: (logoutUrl?: string) => Promise<void> = (logoutUrl) =>\n dmsLogoutRequest(logoutUrl)\n .then(() => {\n this.reset();\n return Promise.resolve();\n })\n .catch((error: CustomNetworkError) => {\n this.checkErrorMessage(error);\n return Promise.reject(error);\n });\n\n sendLoginRequest: (\n authDeviceUrl: string,\n upgradeDeviceUrl: ?string,\n applicationId: string,\n subscriberId: string,\n deviceKey: string,\n oem: ?string,\n version: ?string,\n isFirstToken: ?boolean,\n signal?: AbortSignal,\n ) => Promise<NETGEM_API_DMS_REQUEST_RESPONSE_CHALLENGE> = (authDeviceUrl, upgradeDeviceUrl, applicationId, subscriberId, deviceKey, oem, version, isFirstToken, signal) => {\n if (typeof upgradeDeviceUrl === 'string') {\n this.baseUpgradeDeviceUrl = upgradeDeviceUrl;\n }\n\n if (typeof applicationId !== 'string' || typeof subscriberId !== 'string' || typeof deviceKey !== 'string' || typeof authDeviceUrl !== 'string') {\n return Promise.reject(createCustomNetworkError((DmsNetworkCode.MissingOrInvalidRequiredParameters: number), getMessageFromErrorCode(DmsNetworkCode.MissingOrInvalidRequiredParameters)));\n }\n\n this.isAuthenticationTokenRenewing = true;\n\n logDebug(`${typeof upgradeDeviceUrl === 'string' ? 'Requesting' : 'Renewing'} authentication token...`);\n\n return dmsLoginRequest(authDeviceUrl, applicationId, subscriberId, deviceKey, oem, version, signal)\n .then((jsonChallengeResponse: NETGEM_API_DMS_REQUEST_RESPONSE_CHALLENGE) => {\n const { expirationDate, token } = jsonChallengeResponse;\n\n this.isAuthenticationTokenRenewing = false;\n\n logDebug(`Authentication token ${typeof upgradeDeviceUrl === 'string' ? 'received' : 'renewed'}`);\n\n // Reset retry count since the call succeeded\n this.retryCount = 0;\n\n // Store token locally\n this.authenticationToken = token;\n\n // Store required data for future refresh\n this.authenticationTokenData = {\n applicationId,\n authDeviceUrl,\n deviceKey,\n oem,\n subscriberId,\n version,\n };\n\n // Store token in Redux store\n this.connectedCallback(token);\n\n this.nextTokenRenewalDate = expirationDate - TOKEN_RENEWAL_EXPIRATION_MARGIN;\n\n // These 2 dates only exists for debug purpose and should be removed in a near future\n LocalStorageManager.save(StorageKeys.LastTokenRenewal, AccurateTimestamp.nowAsDate());\n LocalStorageManager.save(StorageKeys.NextTokenRenewal, new Date(this.nextTokenRenewalDate));\n\n if (!this.tokenRenewalTimer || isFirstToken) {\n // Do not start timer more than once but reset it if going from guest to authenticated (or the opposite)\n this.startTokenRenewalTimer(authDeviceUrl, applicationId, subscriberId, deviceKey, oem, version);\n }\n\n return Promise.resolve(jsonChallengeResponse);\n })\n .catch((error: CustomNetworkError) => {\n this.isAuthenticationTokenRenewing = false;\n this.checkErrorMessage(error);\n return Promise.reject(error);\n });\n };\n\n sendBOAuthenticationRequest: (authenticationUrl: string, applicationId: string, deviceKey: string, appKey: string, signal?: AbortSignal) => Promise<KeyValuePair<string>> = (\n authenticationUrl,\n applicationId,\n deviceKey,\n appKey,\n signal,\n ) =>\n boAuthenticationRequest(authenticationUrl, applicationId, deviceKey, appKey, signal).then((authenticationSettings: BO_API_AUTHENTICATION_SETTINGS) => {\n const { authentication } = authenticationSettings;\n\n if (authentication) {\n const { identityExpiration } = authentication;\n\n if (identityExpiration) {\n this.nextBOTokenRenewalDate = identityExpiration - TOKEN_RENEWAL_EXPIRATION_MARGIN;\n\n // These 2 dates only exists for debug purpose and should be removed in a near future\n LocalStorageManager.save(StorageKeys.LastBOTokenRenewal, AccurateTimestamp.nowAsDate());\n LocalStorageManager.save(StorageKeys.NextBOTokenRenewal, new Date(this.nextBOTokenRenewalDate));\n\n this.startBOTokenRenewalTimer(authenticationUrl, applicationId, deviceKey, appKey);\n }\n }\n\n const { error, settings } = getVfAuthenticationSettings(authenticationSettings);\n\n if (this.boAuthenticationCallback) {\n this.boAuthenticationCallback(settings);\n }\n\n if (settings && !error) {\n return Promise.resolve(settings);\n }\n\n return Promise.reject(error);\n });\n\n sendNtgEntitlementRequest: (\n url: string,\n applicationId: string,\n channelName: string,\n entId: string,\n entService: string,\n entUrl: string,\n method: HttpMethod,\n authenticationToken: string | null,\n signal?: AbortSignal,\n ) => Promise<any> = (url, applicationId, channelName, entId, entService, entUrl, method, authenticationToken, signal) =>\n sendNtgEntitlementRequest(url, applicationId, channelName, entId, entService, entUrl, method, authenticationToken, signal);\n\n sendV8ListAliasPostRequest: (url: string, bodyParam: string, method: HttpMethod, authenticationToken: string | null, signal?: AbortSignal) => Promise<any> = (\n url,\n bodyParam,\n method,\n authenticationToken,\n signal,\n ) => sendV8ListAliasPostRequest(url, bodyParam, method, authenticationToken, signal);\n\n sendV8GenericRequest: (url: string, method: HttpMethod, authenticationToken: string | null, responseType?: string, state?: CombinedReducers, signal?: AbortSignal) => Promise<any> = (\n url,\n method,\n authenticationToken,\n responseType,\n state,\n signal,\n ) => sendV8GenericRequest(url, method, authenticationToken, state, signal, responseType);\n\n sendV8RecordingsDeleteRequest: (url: string, eTag: string, method: HttpMethod, authenticationToken: string | null, signal?: AbortSignal) => Promise<any> = (\n url,\n eTag,\n method,\n authenticationToken,\n signal,\n ) => sendV8GenericRequest(url, method, authenticationToken, null, signal, '', eTag);\n\n sendV8RecordingsFutureRequest: (url: string, eTag: ?string, method: HttpMethod, authenticationToken: string | null, signal?: AbortSignal) => Promise<any> = (\n url,\n eTag,\n method,\n authenticationToken,\n signal,\n ) => sendV8GenericRequest(url, method, authenticationToken, null, signal, undefined, eTag);\n\n sendV8RecordingsListRequest: (url: string, eTag: ?string, method: HttpMethod, authenticationToken: string | null, signal?: AbortSignal) => Promise<any> = (\n url,\n eTag,\n method,\n authenticationToken,\n signal,\n ) => sendV8GenericRequest(url, method, authenticationToken, null, signal, undefined, eTag);\n\n sendV8RecordingsMetadataRequest: (url: string, eTag: ?string, method: HttpMethod, authenticationToken: string | null, signal?: AbortSignal) => Promise<any> = (\n url,\n eTag,\n method,\n authenticationToken,\n signal,\n ) => sendV8GenericRequest(url, method, authenticationToken, null, signal, undefined, eTag);\n\n sendV8RecordingsQuotaRequest: (url: string, eTag: ?string, method: HttpMethod, authenticationToken: string | null, signal?: AbortSignal) => Promise<any> = (\n url,\n eTag,\n method,\n authenticationToken,\n signal,\n ) => sendV8GenericRequest(url, method, authenticationToken, null, signal, undefined, eTag);\n\n sendV8RecordingsRetryRequest: (url: string, eTag: ?string, method: HttpMethod, authenticationToken: string | null, signal?: AbortSignal) => Promise<any> = (\n url,\n eTag,\n method,\n authenticationToken,\n signal,\n ) => sendV8GenericRequest(url, method, authenticationToken, null, signal, '', eTag);\n\n sendV8ScheduledRecordingCreateRequest: (\n url: string,\n scheduledRecordKind: ScheduledRecordingsKindType,\n target: string,\n fromBeginning: boolean,\n startMargin: number,\n endMargin: number,\n channelId: ?string,\n fromUtc: ?string,\n toUtc: ?string,\n increasingEpisodes: ?boolean,\n recordsToKeep: ?number,\n method: HttpMethod,\n authenticationToken: string | null,\n signal?: AbortSignal,\n ) => Promise<any> = (url, scheduledRecordKind, target, fromBeginning, startMargin, endMargin, channelId, fromUtc, toUtc, increasingEpisodes, recordsToKeep, method, authenticationToken, signal) =>\n sendV8ScheduledRecordingCreateRequest(\n url,\n scheduledRecordKind,\n target,\n fromBeginning,\n startMargin,\n endMargin,\n channelId,\n fromUtc,\n toUtc,\n increasingEpisodes,\n recordsToKeep,\n method,\n authenticationToken,\n signal,\n );\n\n sendV8ScheduledRecordingDeleteRequest: (url: string, eTag: string, method: HttpMethod, authenticationToken: string | null, signal?: AbortSignal) => Promise<any> = (\n url,\n eTag,\n method,\n authenticationToken,\n signal,\n ) => sendV8GenericRequest(url, method, authenticationToken, null, signal, '', eTag);\n\n sendV8ScheduledRecordingListRequest: (url: string, eTag: ?string, method: HttpMethod, authenticationToken: string | null, signal?: AbortSignal) => Promise<any> = (\n url,\n eTag,\n method,\n authenticationToken,\n signal,\n ) => sendV8GenericRequest(url, method, authenticationToken, null, signal, undefined, eTag);\n\n sendV8ScheduledRecordingMetadataRequest: (url: string, eTag: ?string, method: HttpMethod, authenticationToken: string | null, signal?: AbortSignal) => Promise<any> = (\n url,\n eTag,\n method,\n authenticationToken,\n signal,\n ) => sendV8GenericRequest(url, method, authenticationToken, null, signal, undefined, eTag);\n\n sendV8ScheduledRecordingUpdateRequest: (\n url: string,\n scheduledRecordId: string,\n fromUtc: ?string,\n toUtc: ?string,\n eTag: string,\n increasingEpisodes: ?boolean,\n recordsToKeep: ?number,\n method: HttpMethod,\n authenticationToken: string | null,\n signal?: AbortSignal,\n ) => Promise<any> = (url, scheduledRecordId, fromUtc, toUtc, eTag, increasingEpisodes, recordsToKeep, method, authenticationToken, signal) =>\n sendV8ScheduledRecordingUpdateRequest(url, scheduledRecordId, fromUtc, toUtc, increasingEpisodes, recordsToKeep, method, eTag, authenticationToken, signal);\n\n sendV8SectionFeedRequest: (section: NETGEM_API_V8_SECTION, searchString: ?string, state: CombinedReducers, signal?: AbortSignal) => Promise<any> = (section, searchString, state, signal) =>\n sendV8SectionFeedRequest(section, searchString, state, signal);\n\n sendPersonalDataDeleteRequest: (url: string, eTag: ?string, method: HttpMethod, authenticationToken: string | null, signal?: AbortSignal) => Promise<any> = (\n url,\n eTag,\n method,\n authenticationToken,\n signal,\n ) => sendV8GenericRequest(url, method, authenticationToken, null, signal, '', eTag);\n\n sendPersonalDataGetRequest: (url: string, eTag: ?string, method: HttpMethod, authenticationToken: string | null, signal?: AbortSignal) => Promise<any> = (\n url,\n eTag,\n method,\n authenticationToken,\n signal,\n ) => sendPersonalDataGetRequest(url, eTag, method, authenticationToken, signal);\n\n sendPersonalDataPostRequest: (url: string, data: any, eTag: ?string, method: HttpMethod, authenticationToken: string | null, signal?: AbortSignal) => Promise<any> = (\n url,\n data,\n eTag,\n method,\n authenticationToken,\n signal,\n ) => sendPersonalDataPostRequest(url, data, eTag, method, authenticationToken, signal);\n\n sendV8DataCollectionCollectorIdRequest: (url: string, authenticationToken: string | null, signal?: AbortSignal) => Promise<any> = (url, authenticationToken, signal) =>\n sendV8DataCollectionCollectorIdRequest(url, authenticationToken, signal);\n\n sendV8DataCollectionRequest: (url: string, content: NETGEM_API_V8_DATA_COLLECTION_BATCH_PAYLOAD, method: HttpMethod, headers: NETGEM_API_V8_REQUEST_HEADERS, signal?: AbortSignal) => Promise<any> = (\n url,\n content,\n method,\n headers,\n signal,\n ) => sendV8DataCollectionRequest(url, content, method, headers, signal);\n\n sendV8CustomStrategyRequest: (url: string, signal?: AbortSignal) => Promise<any> = (url, signal) => sendV8GenericRequest(url, HttpMethod.GET, null, null, signal);\n\n sendVideofuturDiscoveryRequest: (discoveryUrl: string, device: string, distributor: string, identity: string, signal?: AbortSignal) => Promise<any> = (\n discoveryUrl,\n device,\n distributor,\n identity,\n signal,\n ) => boDiscoveryRequest(discoveryUrl, device, distributor, identity, signal);\n\n sendVideofuturRequest: (\n baseUrl: string,\n method: HttpMethod,\n authenticationToken: string | null,\n body: ?KeyValuePair<?(string | number | boolean)>,\n headers: ?NETGEM_API_V8_REQUEST_HEADERS,\n signal?: AbortSignal,\n keepAlive?: boolean,\n eTag?: string,\n ) => Promise<BO_RESPONSE_WITH_ETAG> = (baseUrl, method, authenticationToken, body, headers, signal, keepAlive, eTag) =>\n sendBORequest(baseUrl, method, authenticationToken, body, headers, signal, keepAlive, eTag);\n}\n\nexport default NetgemApi;\n","/* @flow */\n\nimport type { KeyValuePair, Undefined } from '@ntg/utils/dist/types';\nimport type { BO_API_AUTHENTICATION_SETTINGS } from '../../libs/netgemLibrary/videofutur/types/AuthenticationSettings';\nimport { CustomNetworkError } from '../../libs/netgemLibrary/helpers/CustomNetworkError';\nimport { buildMissingParametersMessage } from '../debug/debug';\nimport { createCustomNetworkError } from '../../libs/netgemLibrary/helpers/CreateCustomNetworkError';\n\nconst getVfAuthenticationSettings: (authenticationSettings: BO_API_AUTHENTICATION_SETTINGS) => { error?: CustomNetworkError, settings?: KeyValuePair<string> } = (authenticationSettings) => {\n const { authentication, product } = authenticationSettings;\n\n let errorMsg: Undefined<string> = undefined;\n let settings: Undefined<KeyValuePair<string>> = undefined;\n\n if (authentication) {\n const { customerId, firstName, identity, name } = authentication;\n\n if (customerId && identity) {\n settings = {\n customerId,\n firstName: firstName ?? '',\n identity,\n name: name ?? '',\n productId: product?.toString() ?? '',\n };\n } else {\n errorMsg = buildMissingParametersMessage(\n {\n customerId,\n identity,\n },\n 'BO authentication settings'\n );\n }\n } else {\n errorMsg = buildMissingParametersMessage({ authentication }, 'BO authentication settings');\n }\n\n return {\n error: errorMsg ? createCustomNetworkError(-1, errorMsg) : undefined,\n settings,\n };\n};\n\nexport { getVfAuthenticationSettings };\n","/* @flow */\n\nimport { HeaderName, HeaderValue } from '../constants/Headers';\nimport { HttpMethod } from '../types/HttpMethod';\nimport type { ScheduledRecordingsKindType } from '../types/Npvr';\nimport { buildHeaderList } from '../helpers/RequestHeaders';\nimport sendV8Request from './v8';\n\nconst sendV8ScheduledRecordingCreateRequest: (\n url: string,\n scheduledRecordKind: ScheduledRecordingsKindType,\n target: string,\n fromBeginning: boolean,\n startMargin: number,\n endMargin: number,\n channelId: ?string,\n fromUtc: ?string,\n toUtc: ?string,\n increasingEpisodes: ?boolean,\n recordsToKeep: ?number,\n method: HttpMethod,\n authenticationToken: string | null,\n signal: ?AbortSignal,\n) => Promise<any> = (url, scheduledRecordKind, target, fromBeginning, startMargin, endMargin, channelId, fromUtc, toUtc, increasingEpisodes, recordsToKeep, method, authenticationToken, signal) => {\n const headerList = buildHeaderList(HeaderName.ContentType, HeaderValue.ApplicationJsonUtf8, HeaderName.Accept, HeaderValue.ApplicationJson);\n\n const body = JSON.stringify({\n channelId,\n endMargin,\n fromBeginning,\n fromUtc,\n increasingEpisodes,\n recordsToKeep,\n scheduledRecordKind,\n startMargin,\n target,\n toUtc,\n });\n\n return sendV8Request(url, authenticationToken, body, headerList, null, signal, null, method);\n};\n\nconst sendV8ScheduledRecordingUpdateRequest: (\n url: string,\n scheduledRecordId: string,\n fromUtc: ?string,\n toUtc: ?string,\n increasingEpisodes: ?boolean,\n recordsToKeep: ?number,\n method: HttpMethod,\n eTag: string,\n authenticationToken: string | null,\n signal: ?AbortSignal,\n) => Promise<any> = (url, scheduledRecordId, fromUtc, toUtc, increasingEpisodes, recordsToKeep, method, eTag, authenticationToken, signal) => {\n const headerList = buildHeaderList(HeaderName.ContentType, HeaderValue.ApplicationJsonUtf8, HeaderName.IfMatch, eTag);\n\n const body = JSON.stringify({\n fromUtc,\n increasingEpisodes,\n recordsToKeep,\n scheduledRecordId,\n toUtc,\n });\n\n return sendV8Request(url, authenticationToken, body, headerList, null, signal, null, method);\n};\n\nexport { sendV8ScheduledRecordingCreateRequest, sendV8ScheduledRecordingUpdateRequest };\n","/* @flow */\n\nimport { HttpMethod } from '../../v8/types/HttpMethod';\nimport type { NETGEM_API_V8_DATA_COLLECTION_BATCH_PAYLOAD } from '../../v8/types/DataCollection';\nimport type { NETGEM_API_V8_REQUEST_HEADERS } from '../../v8/types/Headers';\nimport sendV8Request from '../../v8/requests/v8';\n\nconst sendV8DataCollectionRequest: (\n url: string,\n content: NETGEM_API_V8_DATA_COLLECTION_BATCH_PAYLOAD,\n method: HttpMethod,\n headers: NETGEM_API_V8_REQUEST_HEADERS,\n signal?: AbortSignal,\n) => Promise<any> = (url, content, method, headers, signal) => sendV8Request(url, null, JSON.stringify(content), headers, null, signal, null, method);\n\nconst sendV8DataCollectionCollectorIdRequest: (url: string, authenticationToken: string | null, signal?: AbortSignal) => Promise<any> = (url, authenticationToken, signal) =>\n sendV8Request(url, authenticationToken, null, [], null, signal);\n\nexport { sendV8DataCollectionCollectorIdRequest, sendV8DataCollectionRequest };\n","/* @flow */\n\nimport { parseBoolean, parseInteger, parseIntegerArray, parseStringArray } from '../jsHelpers/parser';\nimport type { DATA_COLLECTION_SETTINGS } from './types';\nimport type { DmsSettingMap } from '../../libs/netgemLibrary/dms/types/DeviceInfoSettings';\nimport { MILLISECONDS_PER_SECOND } from '../dateTime/Format';\nimport { getSettingValueByNameFromDeviceSettings } from '../../redux/netgemApi/actions/helpers/settings';\n\nconst convertToMilliseconds: (seconds: number) => number = (seconds) => {\n if (seconds === -1) {\n return seconds;\n }\n\n return seconds * MILLISECONDS_PER_SECOND;\n};\n\nconst getDataCollectionSettings: (deviceSettings: DmsSettingMap) => DATA_COLLECTION_SETTINGS = (deviceSettings) => {\n const isEnabled = parseBoolean(getSettingValueByNameFromDeviceSettings(deviceSettings, 'datacollection', 'enabled'));\n const coldMaxFlushDelay = parseInteger(getSettingValueByNameFromDeviceSettings(deviceSettings, 'datacollection.batch', 'maxflushdelay'));\n const coldMaxFlushSize = parseInteger(getSettingValueByNameFromDeviceSettings(deviceSettings, 'datacollection.batch', 'maxflushsize'));\n const coldSasDelay = parseInteger(getSettingValueByNameFromDeviceSettings(deviceSettings, 'datacollection.batch', 'sasdelay'));\n const hotMaxFlushDelay = parseInteger(getSettingValueByNameFromDeviceSettings(deviceSettings, 'datacollection.speed', 'maxflushdelay'));\n const hotMaxFlushSize = parseInteger(getSettingValueByNameFromDeviceSettings(deviceSettings, 'datacollection.speed', 'maxflushsize'));\n const hotSasDelay = parseInteger(getSettingValueByNameFromDeviceSettings(deviceSettings, 'datacollection.speed', 'sasdelay'));\n const sampling = parseInteger(getSettingValueByNameFromDeviceSettings(deviceSettings, 'datacollection', 'sampling'));\n const samplingDelay = parseInteger(getSettingValueByNameFromDeviceSettings(deviceSettings, 'datacollection.heartbeat', 'samplingdelay'));\n const startDelay = parseInteger(getSettingValueByNameFromDeviceSettings(deviceSettings, 'datacollection.heartbeat', 'startdelay'));\n\n // Message: Current state\n const currentStateEnabled = parseBoolean(getSettingValueByNameFromDeviceSettings(deviceSettings, 'datacollection.v1_currentState', 'enabled'));\n const currentStateFrequency = parseInteger(getSettingValueByNameFromDeviceSettings(deviceSettings, 'datacollection.v1_currentState', 'frequency'));\n const currentStateRampUp = parseIntegerArray(getSettingValueByNameFromDeviceSettings(deviceSettings, 'datacollection.v1_currentState', 'rampup'));\n\n // Message: Navigation\n const navigationEnabled = parseBoolean(getSettingValueByNameFromDeviceSettings(deviceSettings, 'datacollection.v1_navigation', 'enabled'));\n\n // Message: Player state\n const playerStateEnabled = parseBoolean(getSettingValueByNameFromDeviceSettings(deviceSettings, 'datacollection.v1_playerState', 'enabled'));\n const playerStateFrequency = parseInteger(getSettingValueByNameFromDeviceSettings(deviceSettings, 'datacollection.v1_playerState', 'frequency'));\n const playerStateRampUp = parseIntegerArray(getSettingValueByNameFromDeviceSettings(deviceSettings, 'datacollection.v1_playerState', 'rampup'));\n const playerStateStreamTypes = parseStringArray(getSettingValueByNameFromDeviceSettings(deviceSettings, 'datacollection.v1_playerState', 'streamTypes'));\n\n // Message: Turn off\n const turnOffEnabled = parseBoolean(getSettingValueByNameFromDeviceSettings(deviceSettings, 'datacollection.v1_turnOff', 'enabled'));\n\n // Message: Turn on\n const turnOnEnabled = parseBoolean(getSettingValueByNameFromDeviceSettings(deviceSettings, 'datacollection.v1_turnOn', 'enabled'));\n\n return {\n coldHub: {\n maxFlushDelay: convertToMilliseconds(coldMaxFlushDelay),\n maxFlushSize: coldMaxFlushSize,\n sasDelay: convertToMilliseconds(coldSasDelay),\n },\n hotHub: {\n maxFlushDelay: convertToMilliseconds(hotMaxFlushDelay),\n maxFlushSize: hotMaxFlushSize,\n sasDelay: convertToMilliseconds(hotSasDelay),\n },\n isEnabled,\n msgCurrentState: {\n frequency: convertToMilliseconds(currentStateFrequency),\n isEnabled: currentStateEnabled && (currentStateRampUp.length > 0 || currentStateFrequency > -1),\n rampUp: currentStateRampUp.map((t) => t * MILLISECONDS_PER_SECOND),\n },\n msgNavigation: { isEnabled: navigationEnabled },\n msgPlayerState: {\n frequency: convertToMilliseconds(playerStateFrequency),\n isEnabled: playerStateEnabled && playerStateStreamTypes.length > 0 && (playerStateRampUp.length > 0 || playerStateFrequency > -1),\n rampUp: playerStateRampUp.map((t) => t * MILLISECONDS_PER_SECOND),\n streamTypes: playerStateStreamTypes,\n },\n msgTurnOff: { isEnabled: turnOffEnabled },\n msgTurnOn: { isEnabled: turnOnEnabled },\n sampling,\n samplingDelay: convertToMilliseconds(samplingDelay),\n startDelay: convertToMilliseconds(startDelay),\n };\n};\n\nexport { getDataCollectionSettings };\n","/* @flow */\n\nimport type { Dispatch, Store } from '../../types/types';\nimport { type KeyValuePair, isUndefinedOrNull } from '@ntg/utils/dist/types';\nimport {\n REDUX_MSG_REQUEST_BO_AUTHENTICATE,\n REDUX_MSG_REQUEST_BO_DISCOVERY,\n REDUX_MSG_REQUEST_BO_FAVORITE_ADD,\n REDUX_MSG_REQUEST_BO_FAVORITE_DELETE,\n REDUX_MSG_REQUEST_BO_FAVORITE_LIST,\n REDUX_MSG_REQUEST_BO_PERSONAL_DATA,\n REDUX_MSG_REQUEST_BO_PURCHASE,\n REDUX_MSG_REQUEST_BO_PURCHASE_LIST,\n REDUX_MSG_REQUEST_BO_PURCHASE_STATUS,\n REDUX_MSG_REQUEST_BO_STREAMS_GET,\n REDUX_MSG_REQUEST_BO_STREAM_CREATE,\n REDUX_MSG_REQUEST_BO_STREAM_START,\n REDUX_MSG_REQUEST_BO_STREAM_STOP,\n REDUX_MSG_REQUEST_CUSTOM_STRATEGY,\n REDUX_MSG_REQUEST_DATA_COLLECTION,\n REDUX_MSG_REQUEST_DATA_COLLECTION_COLLECTOR_ID,\n REDUX_MSG_REQUEST_ENTITLEMENT_GET,\n REDUX_MSG_REQUEST_ENTITLEMENT_RELEASE,\n REDUX_MSG_REQUEST_GENERIC,\n REDUX_MSG_REQUEST_GET_ASSOCIATED_DEVICES,\n REDUX_MSG_REQUEST_GET_DEVICE_CHANNELS,\n REDUX_MSG_REQUEST_GET_DEVICE_QUOTA_PVR,\n REDUX_MSG_REQUEST_GET_DEVICE_SETTINGS,\n REDUX_MSG_REQUEST_LIST_ALIAS_MULTI,\n REDUX_MSG_REQUEST_LIST_ALIAS_POST,\n REDUX_MSG_REQUEST_LOGIN,\n REDUX_MSG_REQUEST_LOGOUT,\n REDUX_MSG_REQUEST_NPVR_RECORDINGS_DELETE,\n REDUX_MSG_REQUEST_NPVR_RECORDINGS_FUTURE,\n REDUX_MSG_REQUEST_NPVR_RECORDINGS_LIST,\n REDUX_MSG_REQUEST_NPVR_RECORDINGS_METADATA,\n REDUX_MSG_REQUEST_NPVR_RECORDINGS_QUOTA,\n REDUX_MSG_REQUEST_NPVR_RECORDINGS_RETRY,\n REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_CREATE,\n REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_DELETE,\n REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_LIST,\n REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_LIST_FULL,\n REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_METADATA,\n REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_UPDATE,\n REDUX_MSG_REQUEST_PERSONAL_DATA_DELETE,\n REDUX_MSG_REQUEST_PERSONAL_DATA_GET,\n REDUX_MSG_REQUEST_PERSONAL_DATA_POST,\n REDUX_MSG_REQUEST_SECTION_FEED,\n} from '../constants/';\nimport type { STREAM_PRIORITIES_BY_TYPE_TYPE, STREAM_PRIORITIES_TYPE } from '../../../helpers/ui/metadata/Types';\nimport { parseBoolean, parseInteger } from '../../../helpers/jsHelpers/parser';\nimport { unregisterApplication, updateAssociatedDevices, updateAuthenticationToken } from '../../appRegistration/actions';\nimport {\n updateBOSettings,\n updateBOState,\n updateDeviceChannels,\n updateDeviceSettings,\n updateDistributorAppKeys,\n updateMainDistributor,\n updateMeshState,\n updatePlayerStreamPriorities,\n} from '../../appConf/actions';\nimport { updateNpvrState, updateQuotaPvr } from '../../npvr/actions';\nimport type { BO_API_PARAMETERS_TYPE } from '../../../helpers/videofutur/queryParameters';\nimport type { ChannelMap } from '../../../libs/netgemLibrary/v8/types/Channel';\nimport Collector from '../../../helpers/dataCollection/collector';\nimport type { CombinedReducers } from '../../reducers';\nimport { CustomNetworkError } from '../../../libs/netgemLibrary/helpers/CustomNetworkError';\nimport { type DmsSettingMap } from '../../../libs/netgemLibrary/dms/types/DeviceInfoSettings';\nimport { HttpMethod } from '../../../libs/netgemLibrary/v8/types/HttpMethod';\nimport { type NETGEM_API_DMS_ASSOCIATED_DEVICE } from '../../../libs/netgemLibrary/dms/types/AssociatedDevice';\nimport { type NETGEM_API_DMS_QUOTA_PVR } from '../../../libs/netgemLibrary/dms/types/QuotaPvr';\nimport type { NETGEM_API_V8_DATA_COLLECTION_BATCH_PAYLOAD } from '../../../libs/netgemLibrary/v8/types/DataCollection';\nimport type { NETGEM_API_V8_REQUEST_HEADERS } from '../../../libs/netgemLibrary/v8/types/Headers';\nimport { type NETGEM_API_V8_SECTION } from '../../../libs/netgemLibrary/v8/types/Section';\nimport NetgemApi from '../../../libs/netgemLibrary';\nimport type { ScheduledRecordingsKindType } from '../../../libs/netgemLibrary/v8/types/Npvr';\nimport { createCustomNetworkErrorFromKey } from '../../../libs/netgemLibrary/helpers/CreateCustomNetworkError';\nimport { getDataCollectionSettings } from '../../../helpers/dataCollection/settings';\nimport { getSettingValueByNameFromDeviceSettings } from './helpers/settings';\nimport { logError } from '../../../helpers/debug/debug';\n\nlet ntgApiInstance: NetgemApi | null = null;\n\nconst buildPriorities: (streamPriorities: ?string) => STREAM_PRIORITIES_TYPE | null = (streamPriorities) => {\n if (!streamPriorities) {\n return null;\n }\n\n const priorities: STREAM_PRIORITIES_TYPE = { default: {} };\n\n const prioritiesRaw = streamPriorities.split(',') ?? [];\n prioritiesRaw.forEach((p) => {\n const [name, ...value] = p.split('.');\n\n if (value.length === 0) {\n priorities.default[name] = Object.keys(priorities.default).length;\n } else {\n let pList: STREAM_PRIORITIES_BY_TYPE_TYPE = priorities[name];\n if (!pList) {\n pList = {};\n priorities[name] = pList;\n }\n\n // $FlowFixMe: weird prop-missing error since keys can be any string, and we're assigning here\n pList[value.join('.')] = Object.keys(pList).length;\n }\n });\n\n return priorities;\n};\n\nconst extractDistributorAppKeys: (settings: DmsSettingMap) => KeyValuePair<string> = (settings) => {\n const appKeys: KeyValuePair<string> = {};\n\n const { 'platform.vf.appkey': list } = settings;\n\n if (list) {\n list.forEach(({ name, value }) => {\n appKeys[name] = value;\n });\n }\n\n return appKeys;\n};\n\nconst createNetgemApiLibraryInstance: (dispatch: Dispatch, getState: () => CombinedReducers) => void = (dispatch, getState) => {\n const connectedCallback = (authenticationToken: string | null) => {\n const {\n appConfiguration: { configuration },\n } = getState();\n\n dispatch(updateAuthenticationToken(authenticationToken, configuration));\n };\n\n const disconnectedCallback = () => {\n dispatch(unregisterApplication());\n dispatch(updateAuthenticationToken(null, {}));\n };\n\n const deviceChannelsCallback: (deviceChannels: ChannelMap) => void = (deviceChannels) => dispatch(updateDeviceChannels(deviceChannels));\n\n const associatedDevicesCallback = (associatedDevices: Array<NETGEM_API_DMS_ASSOCIATED_DEVICE>) => dispatch(updateAssociatedDevices(associatedDevices));\n\n const quotaPvrCallback = (quotaPvr: ?NETGEM_API_DMS_QUOTA_PVR) => dispatch(updateQuotaPvr(quotaPvr));\n\n const boAuthenticationCallback = (settings?: KeyValuePair<string>) => {\n dispatch(updateBOState(!isUndefinedOrNull(settings)));\n dispatch(updateBOSettings(settings ?? {}));\n };\n\n const deviceSettingsCallback: (deviceSettings: DmsSettingMap) => void = (deviceSettings) => {\n dispatch(updateDeviceSettings(deviceSettings));\n dispatch(updateDistributorAppKeys(extractDistributorAppKeys(deviceSettings)));\n\n const distributorId = getSettingValueByNameFromDeviceSettings(deviceSettings, 'platform.vf', 'distributor');\n if (distributorId) {\n dispatch(updateMainDistributor(distributorId));\n }\n\n const streamPriorities = getSettingValueByNameFromDeviceSettings(deviceSettings, 'videoplayer', 'streampriorities');\n dispatch(updatePlayerStreamPriorities(buildPriorities(streamPriorities)));\n\n const isEnabled = parseBoolean(getSettingValueByNameFromDeviceSettings(deviceSettings, 'npvr', 'enabled'));\n const recFromBeginning = parseBoolean(getSettingValueByNameFromDeviceSettings(deviceSettings, 'npvr', 'rec_from_beginning'));\n const keepFromReplay = parseBoolean(getSettingValueByNameFromDeviceSettings(deviceSettings, 'npvr.keep_from_replay', 'enabled'));\n const startMargin = parseInteger(getSettingValueByNameFromDeviceSettings(deviceSettings, 'npvr.margin', 'start'));\n const endMargin = parseInteger(getSettingValueByNameFromDeviceSettings(deviceSettings, 'npvr.margin', 'end'));\n dispatch(updateNpvrState(isEnabled, recFromBeginning, keepFromReplay, startMargin, endMargin));\n\n const meshSetting = getSettingValueByNameFromDeviceSettings(deviceSettings, 'mesh', 'enabled');\n const isMeshEnabled = meshSetting !== null ? parseBoolean(meshSetting) : null;\n dispatch(updateMeshState(isMeshEnabled));\n\n const {\n appConfiguration: { versionApp },\n } = getState();\n const realm = getSettingValueByNameFromDeviceSettings(deviceSettings, 'platform', 'realm') || 'unknown realm';\n const dataCollectionSettings = getDataCollectionSettings(deviceSettings);\n Collector.initialize(dispatch, versionApp, realm, dataCollectionSettings);\n };\n\n ntgApiInstance = new NetgemApi(connectedCallback, disconnectedCallback, deviceSettingsCallback, deviceChannelsCallback, associatedDevicesCallback, quotaPvrCallback, boAuthenticationCallback);\n};\n\nexport const initialize: (store: Store) => void = (store) => {\n const { dispatch, getState } = store;\n createNetgemApiLibraryInstance(dispatch, getState);\n};\n\ntype PossibleEmitterType =\n | typeof REDUX_MSG_REQUEST_CUSTOM_STRATEGY\n | typeof REDUX_MSG_REQUEST_DATA_COLLECTION\n | typeof REDUX_MSG_REQUEST_DATA_COLLECTION_COLLECTOR_ID\n | typeof REDUX_MSG_REQUEST_ENTITLEMENT_GET\n | typeof REDUX_MSG_REQUEST_ENTITLEMENT_RELEASE\n | typeof REDUX_MSG_REQUEST_GENERIC\n | typeof REDUX_MSG_REQUEST_GET_ASSOCIATED_DEVICES\n | typeof REDUX_MSG_REQUEST_GET_DEVICE_CHANNELS\n | typeof REDUX_MSG_REQUEST_GET_DEVICE_QUOTA_PVR\n | typeof REDUX_MSG_REQUEST_GET_DEVICE_SETTINGS\n | typeof REDUX_MSG_REQUEST_LIST_ALIAS_MULTI\n | typeof REDUX_MSG_REQUEST_LIST_ALIAS_POST\n | typeof REDUX_MSG_REQUEST_LOGIN\n | typeof REDUX_MSG_REQUEST_LOGOUT\n | typeof REDUX_MSG_REQUEST_NPVR_RECORDINGS_DELETE\n | typeof REDUX_MSG_REQUEST_NPVR_RECORDINGS_FUTURE\n | typeof REDUX_MSG_REQUEST_NPVR_RECORDINGS_LIST\n | typeof REDUX_MSG_REQUEST_NPVR_RECORDINGS_METADATA\n | typeof REDUX_MSG_REQUEST_NPVR_RECORDINGS_QUOTA\n | typeof REDUX_MSG_REQUEST_NPVR_RECORDINGS_RETRY\n | typeof REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_CREATE\n | typeof REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_DELETE\n | typeof REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_LIST\n | typeof REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_LIST_FULL\n | typeof REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_METADATA\n | typeof REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_UPDATE\n | typeof REDUX_MSG_REQUEST_PERSONAL_DATA_DELETE\n | typeof REDUX_MSG_REQUEST_PERSONAL_DATA_GET\n | typeof REDUX_MSG_REQUEST_PERSONAL_DATA_POST\n | typeof REDUX_MSG_REQUEST_SECTION_FEED\n | typeof REDUX_MSG_REQUEST_BO_AUTHENTICATE\n | typeof REDUX_MSG_REQUEST_BO_DISCOVERY\n | typeof REDUX_MSG_REQUEST_BO_FAVORITE_ADD\n | typeof REDUX_MSG_REQUEST_BO_FAVORITE_DELETE\n | typeof REDUX_MSG_REQUEST_BO_FAVORITE_LIST\n | typeof REDUX_MSG_REQUEST_BO_PERSONAL_DATA\n | typeof REDUX_MSG_REQUEST_BO_PURCHASE\n | typeof REDUX_MSG_REQUEST_BO_PURCHASE_LIST\n | typeof REDUX_MSG_REQUEST_BO_PURCHASE_STATUS\n | typeof REDUX_MSG_REQUEST_BO_STREAM_CREATE\n | typeof REDUX_MSG_REQUEST_BO_STREAM_START\n | typeof REDUX_MSG_REQUEST_BO_STREAM_STOP\n | typeof REDUX_MSG_REQUEST_BO_STREAMS_GET;\n\nexport type NetgemApiEmitterType = {|\n emit: (type: PossibleEmitterType, payload: any) => Promise<any>,\n|};\n\ntype NtgApiActionPayloadType = {|\n signal?: AbortSignal,\n uri: string,\n|};\n\nexport type ApplicationInfo = {|\n appVersion: string,\n browserName: string,\n browserVersion: string,\n displayResolution: string,\n osVersion: string,\n osName: string,\n screenResolution: string,\n timestamp: string,\n|};\n\ntype NtgApiActionDmsSettingsPayloadType = {|\n ...NtgApiActionPayloadType,\n appInfo: ApplicationInfo,\n|};\n\ntype NtgApiPayloadBaseType = {|\n ...NtgApiActionPayloadType,\n authent: boolean,\n method: HttpMethod,\n|};\n\ntype NtgApiReducerPayloadType = {|\n ...NtgApiPayloadBaseType,\n responseType?: string,\n state?: CombinedReducers,\n|};\n\ntype NtgApiPayloadWithETagType = {|\n ...NtgApiPayloadBaseType,\n eTag: string,\n|};\n\ntype NtgLogoutRequestPayloadType = {|\n logoutUrl?: string,\n|};\n\ntype NtgLoginRequestPayloadType = {|\n applicationId: string,\n authDeviceUrl: string,\n deviceKey: string,\n isFirstToken: ?boolean,\n oem: ?string,\n signal?: AbortSignal,\n subscriberId: string,\n upgradeDeviceUrl: string,\n version: ?string,\n|};\n\ntype NtgEntitlementRequestPayloadType = {|\n ...NtgApiPayloadBaseType,\n applicationId: string,\n channelName: string,\n customData: string,\n service: string,\n url: string,\n|};\n\ntype NtgListAliasPostRequestPayloadType = {|\n ...NtgApiPayloadBaseType,\n bodyParam: string,\n|};\n\ntype NtgScheduledRecordingsCreatePayloadType = {|\n ...NtgApiPayloadBaseType,\n channelId: ?string,\n endMargin: number,\n fromBeginning: boolean,\n fromUtc: ?string,\n increasingEpisodes: ?boolean,\n recordsToKeep: ?number,\n scheduledRecordKind: ScheduledRecordingsKindType,\n startMargin: number,\n target: string,\n toUtc: ?string,\n|};\n\ntype NtgScheduledRecordingsUpdatePayloadType = {|\n ...NtgApiPayloadWithETagType,\n assetId: string,\n fromUtc: ?string,\n increasingEpisodes: ?boolean,\n recordsToKeep: ?number,\n toUtc: ?string,\n|};\n\ntype NtgPersonalDataPostRequestPayloadType = {|\n ...NtgApiPayloadWithETagType,\n data: any,\n|};\n\ntype NtgSectionFeedRequestPayloadType = {|\n searchString: ?string,\n section: NETGEM_API_V8_SECTION,\n signal?: AbortSignal,\n state: CombinedReducers,\n|};\n\ntype NtgDataCollectionPayloadType = {|\n ...NtgApiPayloadBaseType,\n content: NETGEM_API_V8_DATA_COLLECTION_BATCH_PAYLOAD,\n headers: NETGEM_API_V8_REQUEST_HEADERS,\n|};\n\ntype BOApiPayloadBaseType = {|\n authent: boolean,\n eTag?: string,\n headers: NETGEM_API_V8_REQUEST_HEADERS,\n method: HttpMethod,\n signal?: AbortSignal,\n uri: string,\n|};\n\ntype BOFavoritesApiPayloadType = {|\n ...BOApiPayloadBaseType,\n titId?: string,\n|};\n\ntype BOWithVtiIdApiPayloadType = {|\n ...BOApiPayloadBaseType,\n vtiId: number,\n|};\n\ntype BOPurchaseApiPayloadType = {|\n ...BOWithVtiIdApiPayloadType,\n promocode: string,\n|};\n\ntype BOCreateStreamApiPayloadType = {|\n ...BOApiPayloadBaseType,\n drm?: string,\n format?: string,\n license?: boolean,\n params?: BO_API_PARAMETERS_TYPE | null,\n|};\n\ntype BOStreamApiPayloadType = {|\n ...BOApiPayloadBaseType,\n bookmark?: string,\n keepAlive?: boolean,\n streamId: number,\n|};\n\ntype BOAuthenticationSettingsRequestPayloadType = {|\n appKey: string,\n applicationId: string,\n authenticationUrl: string,\n deviceKey: string,\n signal?: AbortSignal,\n|};\n\ntype BODiscoveryRequestPayloadType = {|\n device: string,\n discoveryUrl: string,\n distributor: string,\n identity: string,\n signal?: AbortSignal,\n|};\n\n/* eslint-disable complexity, max-lines-per-function */\nexport const emit: (type: PossibleEmitterType, payload: any) => Promise<any> = (type, payload) => {\n if (!ntgApiInstance) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.ntg_api_not_initialized'));\n }\n\n switch (type) {\n case REDUX_MSG_REQUEST_LOGIN: {\n const { applicationId, authDeviceUrl, deviceKey, isFirstToken, oem, signal, subscriberId, upgradeDeviceUrl, version } = (payload: NtgLoginRequestPayloadType);\n return ntgApiInstance.sendLoginRequest(authDeviceUrl, upgradeDeviceUrl, applicationId, subscriberId, deviceKey, oem, version, isFirstToken, signal);\n }\n\n case REDUX_MSG_REQUEST_LOGOUT: {\n const { logoutUrl } = (payload: NtgLogoutRequestPayloadType);\n return ntgApiInstance.sendLogoutRequest(logoutUrl);\n }\n\n case REDUX_MSG_REQUEST_GET_DEVICE_SETTINGS: {\n const { appInfo, signal } = (payload: NtgApiActionDmsSettingsPayloadType);\n return ntgApiInstance.getDeviceSettings(appInfo, signal);\n }\n\n case REDUX_MSG_REQUEST_GET_DEVICE_CHANNELS: {\n const { signal } = (payload: NtgApiActionPayloadType);\n return ntgApiInstance.getDeviceChannelList(signal);\n }\n\n case REDUX_MSG_REQUEST_GET_ASSOCIATED_DEVICES: {\n const { signal } = (payload: NtgApiActionPayloadType);\n return ntgApiInstance.getAssociatedDeviceList(signal);\n }\n\n case REDUX_MSG_REQUEST_GET_DEVICE_QUOTA_PVR:\n return ntgApiInstance.getQuotaPvr();\n\n case REDUX_MSG_REQUEST_ENTITLEMENT_GET:\n case REDUX_MSG_REQUEST_ENTITLEMENT_RELEASE: {\n const { applicationId, authent, channelName, customData, method, service, signal, uri, url } = (payload: NtgEntitlementRequestPayloadType);\n const authenticationToken = authent ? ntgApiInstance.authenticationToken : null;\n return ntgApiInstance.sendNtgEntitlementRequest(uri, applicationId, channelName, customData, service, url, method, authenticationToken, signal);\n }\n\n case REDUX_MSG_REQUEST_LIST_ALIAS_MULTI:\n case REDUX_MSG_REQUEST_LIST_ALIAS_POST: {\n const { authent, bodyParam, method, signal, uri } = (payload: NtgListAliasPostRequestPayloadType);\n const authenticationToken = authent ? ntgApiInstance.authenticationToken : null;\n return ntgApiInstance.sendV8ListAliasPostRequest(uri, bodyParam, method, authenticationToken, signal);\n }\n\n case REDUX_MSG_REQUEST_SECTION_FEED: {\n const { searchString, section, signal, state } = (payload: NtgSectionFeedRequestPayloadType);\n return ntgApiInstance.sendV8SectionFeedRequest(section, searchString, state, signal);\n }\n\n case REDUX_MSG_REQUEST_GENERIC: {\n const { authent, method, responseType, signal, state, uri } = (payload: NtgApiReducerPayloadType);\n const authenticationToken = authent ? ntgApiInstance.authenticationToken : null;\n return ntgApiInstance.sendV8GenericRequest(uri, method, authenticationToken, responseType, state, signal);\n }\n\n case REDUX_MSG_REQUEST_CUSTOM_STRATEGY: {\n const { signal, uri } = (payload: NtgApiActionPayloadType);\n return ntgApiInstance.sendV8CustomStrategyRequest(uri, signal);\n }\n\n case REDUX_MSG_REQUEST_PERSONAL_DATA_DELETE: {\n const { authent, eTag, method, signal, uri } = (payload: NtgApiPayloadWithETagType);\n const authenticationToken = authent ? ntgApiInstance.authenticationToken : null;\n return ntgApiInstance.sendPersonalDataDeleteRequest(uri, eTag, method, authenticationToken, signal);\n }\n\n case REDUX_MSG_REQUEST_PERSONAL_DATA_GET: {\n const { authent, eTag, method, signal, uri } = (payload: NtgApiPayloadWithETagType);\n const authenticationToken = authent ? ntgApiInstance.authenticationToken : null;\n return ntgApiInstance.sendPersonalDataGetRequest(uri, eTag, method, authenticationToken, signal);\n }\n\n case REDUX_MSG_REQUEST_PERSONAL_DATA_POST: {\n const { authent, data, eTag, method, signal, uri } = (payload: NtgPersonalDataPostRequestPayloadType);\n const authenticationToken = authent ? ntgApiInstance.authenticationToken : null;\n return ntgApiInstance.sendPersonalDataPostRequest(uri, data, eTag, method, authenticationToken, signal);\n }\n\n case REDUX_MSG_REQUEST_NPVR_RECORDINGS_DELETE: {\n const { authent, eTag, method, signal, uri } = (payload: NtgApiPayloadWithETagType);\n const authenticationToken = authent ? ntgApiInstance.authenticationToken : null;\n return ntgApiInstance.sendV8RecordingsDeleteRequest(uri, eTag, method, authenticationToken, signal);\n }\n\n case REDUX_MSG_REQUEST_NPVR_RECORDINGS_FUTURE: {\n const { authent, eTag, method, signal, uri } = (payload: NtgApiPayloadWithETagType);\n const authenticationToken = authent ? ntgApiInstance.authenticationToken : null;\n return ntgApiInstance.sendV8RecordingsFutureRequest(uri, eTag, method, authenticationToken, signal);\n }\n\n case REDUX_MSG_REQUEST_NPVR_RECORDINGS_LIST: {\n const { authent, eTag, method, signal, uri } = (payload: NtgApiPayloadWithETagType);\n const authenticationToken = authent ? ntgApiInstance.authenticationToken : null;\n return ntgApiInstance.sendV8RecordingsListRequest(uri, eTag, method, authenticationToken, signal);\n }\n\n case REDUX_MSG_REQUEST_NPVR_RECORDINGS_METADATA: {\n const { authent, eTag, method, signal, uri } = (payload: NtgApiPayloadWithETagType);\n const authenticationToken = authent ? ntgApiInstance.authenticationToken : null;\n return ntgApiInstance.sendV8RecordingsMetadataRequest(uri, eTag, method, authenticationToken, signal);\n }\n\n case REDUX_MSG_REQUEST_NPVR_RECORDINGS_QUOTA: {\n const { authent, eTag, method, signal, uri } = (payload: NtgApiPayloadWithETagType);\n const authenticationToken = authent ? ntgApiInstance.authenticationToken : null;\n return ntgApiInstance.sendV8RecordingsQuotaRequest(uri, eTag, method, authenticationToken, signal);\n }\n\n case REDUX_MSG_REQUEST_NPVR_RECORDINGS_RETRY: {\n const { authent, eTag, method, signal, uri } = (payload: NtgApiPayloadWithETagType);\n const authenticationToken = authent ? ntgApiInstance.authenticationToken : null;\n return ntgApiInstance.sendV8RecordingsRetryRequest(uri, eTag, method, authenticationToken, signal);\n }\n\n case REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_CREATE: {\n const { authent, channelId, endMargin, fromBeginning, fromUtc, increasingEpisodes, method, recordsToKeep, scheduledRecordKind, signal, startMargin, target, toUtc, uri } =\n (payload: NtgScheduledRecordingsCreatePayloadType);\n const authenticationToken = authent ? ntgApiInstance.authenticationToken : null;\n return ntgApiInstance.sendV8ScheduledRecordingCreateRequest(\n uri,\n scheduledRecordKind,\n target,\n fromBeginning,\n startMargin,\n endMargin,\n channelId,\n fromUtc,\n toUtc,\n increasingEpisodes,\n recordsToKeep,\n method,\n authenticationToken,\n signal,\n );\n }\n\n case REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_DELETE: {\n const { authent, eTag, method, signal, uri } = (payload: NtgApiPayloadWithETagType);\n const authenticationToken = authent ? ntgApiInstance.authenticationToken : null;\n return ntgApiInstance.sendV8ScheduledRecordingDeleteRequest(uri, eTag, method, authenticationToken, signal);\n }\n\n case REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_LIST: {\n const { authent, eTag, method, signal, uri } = (payload: NtgApiPayloadWithETagType);\n const authenticationToken = authent ? ntgApiInstance.authenticationToken : null;\n return ntgApiInstance.sendV8ScheduledRecordingListRequest(uri, eTag, method, authenticationToken, signal);\n }\n\n case REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_LIST_FULL: {\n const { authent, eTag, method, signal, uri } = (payload: NtgApiPayloadWithETagType);\n const authenticationToken = authent ? ntgApiInstance.authenticationToken : null;\n return ntgApiInstance.sendV8ScheduledRecordingListRequest(uri, eTag, method, authenticationToken, signal);\n }\n\n case REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_METADATA: {\n const { authent, eTag, method, signal, uri } = (payload: NtgApiPayloadWithETagType);\n const authenticationToken = authent ? ntgApiInstance.authenticationToken : null;\n return ntgApiInstance.sendV8ScheduledRecordingMetadataRequest(uri, eTag, method, authenticationToken, signal);\n }\n\n case REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_UPDATE: {\n const { assetId, authent, eTag, fromUtc, increasingEpisodes, method, recordsToKeep, signal, toUtc, uri } = (payload: NtgScheduledRecordingsUpdatePayloadType);\n const authenticationToken = authent ? ntgApiInstance.authenticationToken : null;\n return ntgApiInstance.sendV8ScheduledRecordingUpdateRequest(uri, assetId, fromUtc, toUtc, eTag, increasingEpisodes, recordsToKeep, method, authenticationToken, signal);\n }\n\n case REDUX_MSG_REQUEST_DATA_COLLECTION_COLLECTOR_ID: {\n const { signal, uri } = (payload: NtgApiActionPayloadType);\n const { authenticationToken } = ntgApiInstance;\n return ntgApiInstance.sendV8DataCollectionCollectorIdRequest(uri, authenticationToken, signal);\n }\n\n case REDUX_MSG_REQUEST_DATA_COLLECTION: {\n const { content, headers, method, signal, uri } = (payload: NtgDataCollectionPayloadType);\n return ntgApiInstance.sendV8DataCollectionRequest(uri, content, method, headers, signal);\n }\n\n case REDUX_MSG_REQUEST_BO_AUTHENTICATE: {\n const { appKey, applicationId, authenticationUrl, deviceKey, signal } = (payload: BOAuthenticationSettingsRequestPayloadType);\n return ntgApiInstance.sendBOAuthenticationRequest(authenticationUrl, applicationId, deviceKey, appKey, signal);\n }\n\n case REDUX_MSG_REQUEST_BO_DISCOVERY: {\n const { device, discoveryUrl, distributor, identity, signal } = (payload: BODiscoveryRequestPayloadType);\n return ntgApiInstance.sendVideofuturDiscoveryRequest(discoveryUrl, device, distributor, identity, signal);\n }\n\n case REDUX_MSG_REQUEST_BO_PERSONAL_DATA: {\n const { authent, headers, method, signal, uri } = (payload: BOApiPayloadBaseType);\n const authenticationToken = authent ? ntgApiInstance.authenticationToken : null;\n return ntgApiInstance.sendVideofuturRequest(uri, method, authenticationToken, null, headers, signal);\n }\n\n case REDUX_MSG_REQUEST_BO_STREAM_CREATE: {\n const { authent, headers, method, params, signal, uri } = (payload: BOCreateStreamApiPayloadType);\n const authenticationToken = authent ? ntgApiInstance.authenticationToken : null;\n return ntgApiInstance.sendVideofuturRequest(uri, method, authenticationToken, params, headers, signal);\n }\n\n case REDUX_MSG_REQUEST_BO_STREAMS_GET: {\n const { authent, headers, method, signal, uri } = (payload: BOApiPayloadBaseType);\n const authenticationToken = authent ? ntgApiInstance.authenticationToken : null;\n return ntgApiInstance.sendVideofuturRequest(uri, method, authenticationToken, null, headers, signal);\n }\n\n case REDUX_MSG_REQUEST_BO_STREAM_START:\n case REDUX_MSG_REQUEST_BO_STREAM_STOP: {\n const { authent, bookmark, headers, keepAlive, method, signal, streamId, uri } = (payload: BOStreamApiPayloadType);\n const authenticationToken = authent ? ntgApiInstance.authenticationToken : null;\n return ntgApiInstance.sendVideofuturRequest(\n uri,\n method,\n authenticationToken,\n // TODO: BO API v2 > pass correct bookmark from player or undefined at app start\n { bookmark: bookmark ?? 'PT0S', vstId: streamId },\n headers,\n signal,\n keepAlive,\n );\n }\n\n case REDUX_MSG_REQUEST_BO_FAVORITE_LIST:\n case REDUX_MSG_REQUEST_BO_FAVORITE_ADD:\n case REDUX_MSG_REQUEST_BO_FAVORITE_DELETE: {\n const { authent, eTag, headers, method, signal, titId, uri } = (payload: BOFavoritesApiPayloadType);\n const authenticationToken = authent ? ntgApiInstance.authenticationToken : null;\n return ntgApiInstance.sendVideofuturRequest(uri, method, authenticationToken, titId ? { titId } : null, headers, signal, false, eTag);\n }\n\n case REDUX_MSG_REQUEST_BO_PURCHASE_STATUS:\n case REDUX_MSG_REQUEST_BO_PURCHASE: {\n const { authent, headers, method, promocode, signal, uri, vtiId } = (payload: BOPurchaseApiPayloadType);\n const parameters: BO_API_PARAMETERS_TYPE = {\n promocode,\n vtiId,\n };\n const authenticationToken = authent ? ntgApiInstance.authenticationToken : null;\n return ntgApiInstance.sendVideofuturRequest(uri, method, authenticationToken, parameters, headers, signal);\n }\n\n case REDUX_MSG_REQUEST_BO_PURCHASE_LIST: {\n const { authent, eTag, headers, method, signal, uri } = (payload: BOApiPayloadBaseType);\n const authenticationToken = authent ? ntgApiInstance.authenticationToken : null;\n return ntgApiInstance.sendVideofuturRequest(uri, method, authenticationToken, null, headers, signal, false, eTag);\n }\n\n default:\n logError('No default case for emitter');\n return Promise.reject(\n new CustomNetworkError({\n message: 'No default case for emitter',\n status: -1,\n }),\n );\n }\n};\n/* eslint-enable complexity, max-lines-per-function */\n\nexport type RequestResponseMethodDefinitionType = (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType) => Promise<any>;\n\nexport type InternalActionDefinitionType = (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType) => void;\n","import parseTag from './parse-tag'\n\nconst tagRE = /<[a-zA-Z0-9\\-\\!\\/](?:\"[^\"]*\"|'[^']*'|[^'\">])*>/g\nconst whitespaceRE = /^\\s*$/\n\n// re-used obj for quick lookups of components\nconst empty = Object.create(null)\n\nexport default function parse(html, options) {\n options || (options = {})\n options.components || (options.components = empty)\n const result = []\n const arr = []\n let current\n let level = -1\n let inComponent = false\n\n // handle text at top level\n if (html.indexOf('<') !== 0) {\n var end = html.indexOf('<')\n result.push({\n type: 'text',\n content: end === -1 ? html : html.substring(0, end),\n })\n }\n\n html.replace(tagRE, function (tag, index) {\n if (inComponent) {\n if (tag !== '</' + current.name + '>') {\n return\n } else {\n inComponent = false\n }\n }\n const isOpen = tag.charAt(1) !== '/'\n const isComment = tag.startsWith('<!--')\n const start = index + tag.length\n const nextChar = html.charAt(start)\n let parent\n\n if (isComment) {\n const comment = parseTag(tag)\n\n // if we're at root, push new base node\n if (level < 0) {\n result.push(comment)\n return result\n }\n parent = arr[level]\n parent.children.push(comment)\n return result\n }\n\n if (isOpen) {\n level++\n\n current = parseTag(tag)\n if (current.type === 'tag' && options.components[current.name]) {\n current.type = 'component'\n inComponent = true\n }\n\n if (\n !current.voidElement &&\n !inComponent &&\n nextChar &&\n nextChar !== '<'\n ) {\n current.children.push({\n type: 'text',\n content: html.slice(start, html.indexOf('<', start)),\n })\n }\n\n // if we're at root, push new base node\n if (level === 0) {\n result.push(current)\n }\n\n parent = arr[level - 1]\n\n if (parent) {\n parent.children.push(current)\n }\n\n arr[level] = current\n }\n\n if (!isOpen || current.voidElement) {\n if (\n level > -1 &&\n (current.voidElement || current.name === tag.slice(2, -1))\n ) {\n level--\n // move current up a level to match the end tag\n current = level === -1 ? result : arr[level]\n }\n if (!inComponent && nextChar !== '<' && nextChar) {\n // trailing text node\n // if we're at the root, push a base text node. otherwise add as\n // a child to the current node.\n parent = level === -1 ? result : arr[level].children\n\n // calculate correct end of the content slice in case there's\n // no tag after the text node.\n const end = html.indexOf('<', start)\n let content = html.slice(start, end === -1 ? undefined : end)\n // if a node is nothing but whitespace, collapse it as the spec states:\n // https://www.w3.org/TR/html4/struct/text.html#h-9.1\n if (whitespaceRE.test(content)) {\n content = ' '\n }\n // don't add whitespace-only text nodes if they would be trailing text nodes\n // or if they would be leading whitespace-only text nodes:\n // * end > -1 indicates this is not a trailing text node\n // * leading node is when level is -1 and parent has length 0\n if ((end > -1 && level + parent.length >= 0) || content !== ' ') {\n parent.push({\n type: 'text',\n content: content,\n })\n }\n }\n }\n })\n\n return result\n}\n","let i18nInstance;\nexport const setI18n = instance => {\n i18nInstance = instance;\n};\nexport const getI18n = () => i18nInstance;","import { createContext } from 'react';\nimport { getDefaults, setDefaults } from './defaults.js';\nimport { getI18n, setI18n } from './i18nInstance.js';\nimport { initReactI18next } from './initReactI18next.js';\nexport { getDefaults, setDefaults, getI18n, setI18n, initReactI18next };\nexport const I18nContext = createContext();\nexport class ReportNamespaces {\n constructor() {\n this.usedNamespaces = {};\n }\n addUsedNamespaces(namespaces) {\n namespaces.forEach(ns => {\n if (!this.usedNamespaces[ns]) this.usedNamespaces[ns] = true;\n });\n }\n getUsedNamespaces() {\n return Object.keys(this.usedNamespaces);\n }\n}\nexport const composeInitialProps = ForComponent => async ctx => {\n const componentsInitialProps = (await ForComponent.getInitialProps?.(ctx)) ?? {};\n const i18nInitialProps = getInitialProps();\n return {\n ...componentsInitialProps,\n ...i18nInitialProps\n };\n};\nexport const getInitialProps = () => {\n const i18n = getI18n();\n const namespaces = i18n.reportNamespaces?.getUsedNamespaces() ?? [];\n const ret = {};\n const initialI18nStore = {};\n i18n.languages.forEach(l => {\n initialI18nStore[l] = {};\n namespaces.forEach(ns => {\n initialI18nStore[l][ns] = i18n.getResourceBundle(l, ns) || {};\n });\n });\n ret.initialI18nStore = initialI18nStore;\n ret.initialLanguage = i18n.language;\n return ret;\n};","import { createElement, useMemo } from 'react';\nimport { I18nContext } from './context.js';\nexport function I18nextProvider({\n i18n,\n defaultNS,\n children\n}) {\n const value = useMemo(() => ({\n i18n,\n defaultNS\n }), [i18n, defaultNS]);\n return createElement(I18nContext.Provider, {\n value\n }, children);\n}","import { useContext } from 'react';\nimport { getI18n, I18nContext } from './context.js';\nexport const useSSR = (initialI18nStore, initialLanguage, props = {}) => {\n const {\n i18n: i18nFromProps\n } = props;\n const {\n i18n: i18nFromContext\n } = useContext(I18nContext) || {};\n const i18n = i18nFromProps || i18nFromContext || getI18n();\n if (i18n.options?.isClone) return;\n if (initialI18nStore && !i18n.initializedStoreOnce) {\n i18n.services.resourceStore.data = initialI18nStore;\n i18n.options.ns = Object.values(initialI18nStore).reduce((mem, lngResources) => {\n Object.keys(lngResources).forEach(ns => {\n if (mem.indexOf(ns) < 0) mem.push(ns);\n });\n return mem;\n }, i18n.options.ns);\n i18n.initializedStoreOnce = true;\n i18n.isInitialized = true;\n }\n if (initialLanguage && !i18n.initializedLanguageOnce) {\n i18n.changeLanguage(initialLanguage);\n i18n.initializedLanguageOnce = true;\n }\n};","/* @flow */\n\nimport {\n REDUX_MSG_CNC_PROGRAM_GET_URL,\n REDUX_MSG_CNC_SERIES_GET_URL,\n REDUX_MSG_DATA_COLLECTION_COLD_POST_URL,\n REDUX_MSG_DATA_COLLECTION_HOT_POST_URL,\n REDUX_MSG_DEEPLINK_PROGRAM_GET_URL,\n REDUX_MSG_DEEPLINK_SERIES_GET_URL,\n REDUX_MSG_DEFAULT_HUB_URL,\n REDUX_MSG_DISTRIBUTOR_ADD,\n REDUX_MSG_GAMESTREAM_TOKEN_GET_URL,\n REDUX_MSG_HUB_URL,\n REDUX_MSG_LIST_ALIAS_MULTI_URL,\n REDUX_MSG_LIST_ALIAS_URL,\n REDUX_MSG_LOCATION_CATCHUP_FOR_ASSET_URL,\n REDUX_MSG_LOCATION_EPG_FOR_ASSET_URL,\n REDUX_MSG_LOCATION_EPG_URL,\n REDUX_MSG_LOCATION_VOD_FOR_ASSET_URL,\n REDUX_MSG_METADATA_CHANNELS_URL,\n REDUX_MSG_METADATA_IMAGE_WITH_VARIANT_URL,\n REDUX_MSG_METADATA_PROGRAM_URL,\n REDUX_MSG_METADATA_SCHEDULE_URL,\n REDUX_MSG_NPVR_RECORDINGS_DELETE_URL,\n REDUX_MSG_NPVR_RECORDINGS_FUTURE_URL,\n REDUX_MSG_NPVR_RECORDINGS_LIST_URL,\n REDUX_MSG_NPVR_RECORDINGS_METADATA_URL,\n REDUX_MSG_NPVR_RECORDINGS_QUOTA_URL,\n REDUX_MSG_NPVR_RECORDINGS_RETRY_URL,\n REDUX_MSG_NPVR_RECORDINGS_STOP_URL,\n REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_CREATE_URL,\n REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_DELETE_URL,\n REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_LIST_FULL_URL,\n REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_LIST_URL,\n REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_METADATA_URL,\n REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_UPDATE_URL,\n REDUX_MSG_PERSONAL_DATA_DELETE_URL,\n REDUX_MSG_PERSONAL_DATA_GET_URL,\n REDUX_MSG_PERSONAL_DATA_LIST_DELETE_URL,\n REDUX_MSG_PERSONAL_DATA_LIST_GET_URL,\n REDUX_MSG_PERSONAL_DATA_LIST_POST_URL,\n REDUX_MSG_PERSONAL_DATA_POST_URL,\n REDUX_MSG_PURCHASE_INFO_PER_ASSET_URL,\n REDUX_MSG_REQUEST_ENTITLEMENT_GET_URL,\n REDUX_MSG_REQUEST_ENTITLEMENT_RELEASE_URL,\n REDUX_MSG_RIGHT_COMMERCIAL_OFFERS_URL,\n REDUX_MSG_RIGHT_DEFAULT_RIGHTS_URL,\n REDUX_MSG_RIGHT_USER_RIGHTS_URL,\n} from '../constants/';\nimport type { Distributor } from '../actions/videofutur/types/common';\nimport type { KeyValuePair } from '@ntg/utils/dist/types';\nimport { type NETGEM_API_V8_URL_DEFINITION } from '../../../libs/netgemLibrary/v8/types/NtgVideoFeed';\nimport type { NetgemApiAction } from '../actions';\nimport { produce } from 'immer';\n\nexport type NetgemApiState = {|\n cncProgramGetUrl: ?NETGEM_API_V8_URL_DEFINITION,\n cncSeriesGetUrl: ?NETGEM_API_V8_URL_DEFINITION,\n dataCollectionColdUrl: ?NETGEM_API_V8_URL_DEFINITION,\n dataCollectionHotUrl: ?NETGEM_API_V8_URL_DEFINITION,\n deeplinkProgramGetUrl: ?NETGEM_API_V8_URL_DEFINITION,\n deeplinkSeriesGetUrl: ?NETGEM_API_V8_URL_DEFINITION,\n defaultHubUrl: ?NETGEM_API_V8_URL_DEFINITION,\n // Keys are distributor Ids\n distributors: KeyValuePair<Distributor>,\n entitlementGetUrl: ?NETGEM_API_V8_URL_DEFINITION,\n entitlementReleaseUrl: ?NETGEM_API_V8_URL_DEFINITION,\n getGamestreamTokenUrl: ?NETGEM_API_V8_URL_DEFINITION,\n hubUrl: ?NETGEM_API_V8_URL_DEFINITION,\n listAliasMultiUrl: ?NETGEM_API_V8_URL_DEFINITION,\n listAliasPostUrl: ?NETGEM_API_V8_URL_DEFINITION,\n locationCatchupForAssetUrl: ?NETGEM_API_V8_URL_DEFINITION,\n locationEpgForAssetUrl: ?NETGEM_API_V8_URL_DEFINITION,\n locationEpgUrl: ?NETGEM_API_V8_URL_DEFINITION,\n locationVodForAssetUrl: ?NETGEM_API_V8_URL_DEFINITION,\n metadataChannelsUrl: ?NETGEM_API_V8_URL_DEFINITION,\n metadataImageWithVariantUrl: ?NETGEM_API_V8_URL_DEFINITION,\n metadataProgramUrl: ?NETGEM_API_V8_URL_DEFINITION,\n metadataScheduleUrl: ?NETGEM_API_V8_URL_DEFINITION,\n npvrRecordingsDeleteUrl: ?NETGEM_API_V8_URL_DEFINITION,\n npvrRecordingsFutureUrl: ?NETGEM_API_V8_URL_DEFINITION,\n npvrRecordingsListUrl: ?NETGEM_API_V8_URL_DEFINITION,\n npvrRecordingsMetadataUrl: ?NETGEM_API_V8_URL_DEFINITION,\n npvrRecordingsQuotaUrl: ?NETGEM_API_V8_URL_DEFINITION,\n npvrRecordingsRetryUrl: ?NETGEM_API_V8_URL_DEFINITION,\n npvrRecordingsStopUrl: ?NETGEM_API_V8_URL_DEFINITION,\n npvrScheduledRecordingsCreateUrl: ?NETGEM_API_V8_URL_DEFINITION,\n npvrScheduledRecordingsDeleteUrl: ?NETGEM_API_V8_URL_DEFINITION,\n npvrScheduledRecordingsListFullUrl: ?NETGEM_API_V8_URL_DEFINITION,\n npvrScheduledRecordingsListUrl: ?NETGEM_API_V8_URL_DEFINITION,\n npvrScheduledRecordingsMetadataUrl: ?NETGEM_API_V8_URL_DEFINITION,\n npvrScheduledRecordingsUpdateUrl: ?NETGEM_API_V8_URL_DEFINITION,\n personalDataDeleteUrl: ?NETGEM_API_V8_URL_DEFINITION,\n personalDataGetUrl: ?NETGEM_API_V8_URL_DEFINITION,\n personalDataListDeleteUrl: ?NETGEM_API_V8_URL_DEFINITION,\n personalDataListGetUrl: ?NETGEM_API_V8_URL_DEFINITION,\n personalDataListPostUrl: ?NETGEM_API_V8_URL_DEFINITION,\n personalDataPostUrl: ?NETGEM_API_V8_URL_DEFINITION,\n purchaseInfoPerAssetUrl: ?NETGEM_API_V8_URL_DEFINITION,\n rightsCommercialOffersUrl: ?NETGEM_API_V8_URL_DEFINITION,\n rightsDefaultUrl: ?NETGEM_API_V8_URL_DEFINITION,\n rightsUserUrl: ?NETGEM_API_V8_URL_DEFINITION,\n|};\n\nexport const InitialState: NetgemApiState = {\n cncProgramGetUrl: null,\n cncSeriesGetUrl: null,\n dataCollectionColdUrl: null,\n dataCollectionHotUrl: null,\n deeplinkProgramGetUrl: null,\n deeplinkSeriesGetUrl: null,\n defaultHubUrl: null,\n distributors: {},\n entitlementGetUrl: null,\n entitlementReleaseUrl: null,\n getGamestreamTokenUrl: null,\n hubUrl: null,\n listAliasMultiUrl: null,\n listAliasPostUrl: null,\n locationCatchupForAssetUrl: null,\n locationEpgForAssetUrl: null,\n locationEpgUrl: null,\n locationVodForAssetUrl: null,\n metadataChannelsUrl: null,\n metadataImageWithVariantUrl: null,\n metadataProgramUrl: null,\n metadataScheduleUrl: null,\n npvrRecordingsDeleteUrl: null,\n npvrRecordingsFutureUrl: null,\n npvrRecordingsListUrl: null,\n npvrRecordingsMetadataUrl: null,\n npvrRecordingsQuotaUrl: null,\n npvrRecordingsRetryUrl: null,\n npvrRecordingsStopUrl: null,\n npvrScheduledRecordingsCreateUrl: null,\n npvrScheduledRecordingsDeleteUrl: null,\n npvrScheduledRecordingsListFullUrl: null,\n npvrScheduledRecordingsListUrl: null,\n npvrScheduledRecordingsMetadataUrl: null,\n npvrScheduledRecordingsUpdateUrl: null,\n personalDataDeleteUrl: null,\n personalDataGetUrl: null,\n personalDataListDeleteUrl: null,\n personalDataListGetUrl: null,\n personalDataListPostUrl: null,\n personalDataPostUrl: null,\n purchaseInfoPerAssetUrl: null,\n rightsCommercialOffersUrl: null,\n rightsDefaultUrl: null,\n rightsUserUrl: null,\n};\n\nconst DefaultAction: NetgemApiAction = { type: null };\n\n/* eslint-disable complexity, max-lines-per-function */\nconst netgemApiReducer: (state: NetgemApiState, action: NetgemApiAction) => NetgemApiState = produce((draft = InitialState, action = DefaultAction) => {\n switch (action.type) {\n case REDUX_MSG_LIST_ALIAS_MULTI_URL: {\n draft.listAliasMultiUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_LIST_ALIAS_URL: {\n draft.listAliasPostUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_METADATA_CHANNELS_URL: {\n draft.metadataChannelsUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_METADATA_IMAGE_WITH_VARIANT_URL: {\n draft.metadataImageWithVariantUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_METADATA_PROGRAM_URL: {\n draft.metadataProgramUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_METADATA_SCHEDULE_URL: {\n draft.metadataScheduleUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_NPVR_RECORDINGS_DELETE_URL: {\n draft.npvrRecordingsDeleteUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_NPVR_RECORDINGS_FUTURE_URL: {\n draft.npvrRecordingsFutureUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_NPVR_RECORDINGS_LIST_URL: {\n draft.npvrRecordingsListUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_LIST_FULL_URL: {\n draft.npvrScheduledRecordingsListFullUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_NPVR_RECORDINGS_METADATA_URL: {\n draft.npvrRecordingsMetadataUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_NPVR_RECORDINGS_QUOTA_URL: {\n draft.npvrRecordingsQuotaUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_NPVR_RECORDINGS_RETRY_URL: {\n draft.npvrRecordingsRetryUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_NPVR_RECORDINGS_STOP_URL: {\n draft.npvrRecordingsStopUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_CREATE_URL: {\n draft.npvrScheduledRecordingsCreateUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_DELETE_URL: {\n draft.npvrScheduledRecordingsDeleteUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_LIST_URL: {\n draft.npvrScheduledRecordingsListUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_METADATA_URL: {\n draft.npvrScheduledRecordingsMetadataUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_UPDATE_URL: {\n draft.npvrScheduledRecordingsUpdateUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_GAMESTREAM_TOKEN_GET_URL: {\n draft.getGamestreamTokenUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_HUB_URL: {\n draft.hubUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_DEFAULT_HUB_URL: {\n draft.defaultHubUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_LOCATION_CATCHUP_FOR_ASSET_URL: {\n draft.locationCatchupForAssetUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_LOCATION_EPG_URL: {\n draft.locationEpgUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_LOCATION_VOD_FOR_ASSET_URL: {\n draft.locationVodForAssetUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_LOCATION_EPG_FOR_ASSET_URL: {\n draft.locationEpgForAssetUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_CNC_PROGRAM_GET_URL: {\n draft.cncProgramGetUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_CNC_SERIES_GET_URL: {\n draft.cncSeriesGetUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_DEEPLINK_PROGRAM_GET_URL: {\n draft.deeplinkProgramGetUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_DEEPLINK_SERIES_GET_URL: {\n draft.deeplinkSeriesGetUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_PERSONAL_DATA_DELETE_URL: {\n draft.personalDataDeleteUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_PERSONAL_DATA_GET_URL: {\n draft.personalDataGetUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_PERSONAL_DATA_POST_URL: {\n draft.personalDataPostUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_PERSONAL_DATA_LIST_DELETE_URL: {\n draft.personalDataListDeleteUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_PERSONAL_DATA_LIST_GET_URL: {\n draft.personalDataListGetUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_PERSONAL_DATA_LIST_POST_URL: {\n draft.personalDataListPostUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_PURCHASE_INFO_PER_ASSET_URL: {\n draft.purchaseInfoPerAssetUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_REQUEST_ENTITLEMENT_GET_URL: {\n draft.entitlementGetUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_REQUEST_ENTITLEMENT_RELEASE_URL: {\n draft.entitlementReleaseUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_DATA_COLLECTION_COLD_POST_URL: {\n draft.dataCollectionColdUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_DATA_COLLECTION_HOT_POST_URL: {\n draft.dataCollectionHotUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_RIGHT_COMMERCIAL_OFFERS_URL: {\n draft.rightsCommercialOffersUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_RIGHT_DEFAULT_RIGHTS_URL: {\n draft.rightsDefaultUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_RIGHT_USER_RIGHTS_URL: {\n draft.rightsUserUrl = action.urlDefinition;\n break;\n }\n\n case REDUX_MSG_DISTRIBUTOR_ADD: {\n draft.distributors[action.distributorId] = action.distributorDefinition;\n break;\n }\n\n default:\n }\n}, InitialState);\n/* eslint-enable complexity, max-lines-per-function */\n\nexport default netgemApiReducer;\n","/* @flow */\n\nimport { type AppConfigurationFeatures, ExternalContentDisplayType, type LocalesType, stringToExternalContentDisplayType } from '../types/types';\nimport {\n FEATURE_NPVR,\n FEATURE_SUBSCRIPTION,\n FEATURE_TV,\n FEATURE_VOD,\n REDUX_MSG_APP_CONFIGURATION_UPDATE,\n REDUX_MSG_BO_PRODUCT_ID_UPDATE,\n REDUX_MSG_BO_SETTINGS_UPDATE,\n REDUX_MSG_CHANNELS_UPDATE,\n REDUX_MSG_COMMERCIAL_OFFERS_UPDATE,\n REDUX_MSG_DEBUG_MODE_TOGGLE,\n REDUX_MSG_DEBUG_MODE_UPDATE,\n REDUX_MSG_DEFAULT_RIGHTS_UPDATE,\n REDUX_MSG_DEVICE_OS_UPDATE,\n REDUX_MSG_DEVICE_SETTINGS_UPDATE,\n REDUX_MSG_DISTRIBUTOR_APPKEYS_UPDATE,\n REDUX_MSG_ENABLE_PACK_PURCHASE_API,\n REDUX_MSG_LIST_ALIAS_UPDATE,\n REDUX_MSG_MAIN_DISTRIBUTOR_UPDATE,\n REDUX_MSG_MESH_STATE_UPDATE,\n REDUX_MSG_PACK_PURCHASE_TOGGLE,\n REDUX_MSG_PLAYER_STREAM_PRIORITIES_UPDATE,\n REDUX_MSG_USER_RIGHTS_UPDATE,\n REDUX_MSG_UTM_PARAMETERS_UPDATE,\n REDUX_MSG_VERSION_BO_UPDATE,\n REDUX_MSG_VERSION_CRM_BACK_UPDATE,\n REDUX_MSG_VERSION_CRM_FRONT_UPDATE,\n REDUX_MSG_VOD_STATE_UPDATE,\n} from '../constants';\nimport { type KeyValuePair, type Undefined } from '@ntg/utils/dist/types';\nimport { parseBoolean, parseFloat } from '../../../helpers/jsHelpers/parser';\nimport { type AppConfigurationAction } from '../actions';\nimport type { ChannelMap } from '../../../libs/netgemLibrary/v8/types/Channel';\nimport { DEFAULT_MAX_BITRATE } from '../../../helpers/ui/constants';\nimport type { DmsSettingMap } from '../../../libs/netgemLibrary/dms/types/DeviceInfoSettings';\nimport type { NETGEM_API_V8_RIGHTS } from '../../../libs/netgemLibrary/v8/types/Rights';\nimport Notifier from '../../../helpers/notification/notifier';\nimport type { STREAM_PRIORITIES_TYPE } from '../../../helpers/ui/metadata/Types';\nimport SentryWrapper from '../../../helpers/debug/sentry';\nimport { decryptDidomiKey } from '../../../helpers/crypto/crypto';\nimport { isRunningOnLocalhost } from '../../../helpers/jsHelpers/environment';\nimport log from 'loglevel';\nimport { logDebug } from '../../../helpers/debug/debug';\nimport { produce } from 'immer';\n\nexport type AppConfigurationState = {|\n applicationName: string,\n boSettings: KeyValuePair<string>,\n configuration: KeyValuePair<string>,\n defaultSubtitles: string,\n deviceChannels: ChannelMap,\n deviceOS: string,\n deviceSettings: DmsSettingMap,\n devicesUrl: {|\n chrome: string,\n edge: string,\n firefox: string,\n |},\n distributorAppKeys: KeyValuePair<string>,\n features: AppConfigurationFeatures,\n hasFreeTrialButton: boolean,\n isAuthentInFullscreen: boolean,\n isBORunning: boolean,\n isDebugModeEnabled: boolean,\n isDmsMeshEnabled: boolean | null,\n isExternalCheckOutEnabled: boolean,\n isGuestModeAllowed: boolean,\n isMaxBitrateAllowed: boolean,\n isSubscriberIdShown: boolean,\n listAlias: string | null,\n listAliasChannelLists: KeyValuePair<Array<string>>,\n locales: LocalesType,\n localesDefault: KeyValuePair<Undefined<string>>,\n mainDistributorId: string | null,\n maxBitrate: number,\n playerStreamPriorities: STREAM_PRIORITIES_TYPE | null,\n realm: string,\n sessionId: string,\n subscriptionPresentationDisplay: ExternalContentDisplayType,\n rightsCommercialOffers: KeyValuePair<Array<string>> | null,\n rightsDefault: NETGEM_API_V8_RIGHTS | null,\n rightsUser: Array<string> | null,\n tagListAliases: KeyValuePair<string>,\n usePackPurchaseApi: boolean,\n useScheduledRecordingsFullList: boolean,\n userAccountDisplay: ExternalContentDisplayType,\n utmParameters: KeyValuePair<string>,\n versionApp: string,\n versionAppShort: string,\n versionBO: string,\n versionCrmBack: string,\n versionCrmFront: string,\n wikipediaUrl: string,\n|};\n\nconst InitialState: AppConfigurationState = {\n applicationName: process.env.REACT_APP_NAME || '',\n boSettings: {},\n configuration: {},\n defaultSubtitles: process.env.REACT_APP_DEFAULT_SUBTITLES || '',\n deviceChannels: {},\n deviceOS: '',\n deviceSettings: {},\n devicesUrl: {\n chrome: process.env.REACT_APP_CHROME_URL || '',\n edge: process.env.REACT_APP_EDGE_URL || '',\n firefox: process.env.REACT_APP_FIREFOX_URL || '',\n },\n distributorAppKeys: {},\n features: {\n [FEATURE_NPVR]: parseBoolean(process.env.REACT_APP_FEATURE_NPVR),\n [FEATURE_SUBSCRIPTION]: parseBoolean(process.env.REACT_APP_FEATURE_SUBSCRIPTION),\n [FEATURE_TV]: parseBoolean(process.env.REACT_APP_FEATURE_TV),\n [FEATURE_VOD]: parseBoolean(process.env.REACT_APP_FEATURE_VOD),\n },\n hasFreeTrialButton: parseBoolean(process.env.REACT_APP_HAS_FREE_TRIAL_BUTTON),\n isAuthentInFullscreen: parseBoolean(process.env.REACT_APP_FULLSCREEN_CRM),\n isBORunning: false,\n isDebugModeEnabled: parseBoolean(process.env.REACT_APP_DEBUG_MODE),\n isDmsMeshEnabled: null,\n isExternalCheckOutEnabled: parseBoolean(process.env.REACT_APP_EXTERNAL_CHECKOUT),\n isGuestModeAllowed: parseBoolean(process.env.REACT_APP_GUEST_MODE),\n isMaxBitrateAllowed: true,\n isSubscriberIdShown: parseBoolean(process.env.REACT_APP_SHOW_SUBSCRIBER_ID),\n listAlias: null,\n listAliasChannelLists: {},\n locales: {},\n localesDefault: { legalInformation: process.env.REACT_APP_LEGAL_INFORMATION },\n mainDistributorId: null,\n maxBitrate: DEFAULT_MAX_BITRATE,\n playerStreamPriorities: null,\n realm: process.env.REACT_APP_REALM || '',\n rightsCommercialOffers: null,\n rightsDefault: null,\n rightsUser: null,\n sessionId: crypto.randomUUID(),\n subscriptionPresentationDisplay: stringToExternalContentDisplayType(process.env.REACT_APP_SUBSCRIPTION_PRESENTATION_DISPLAY),\n tagListAliases: {},\n usePackPurchaseApi: false,\n useScheduledRecordingsFullList: false,\n userAccountDisplay: stringToExternalContentDisplayType(process.env.REACT_APP_USER_ACCOUNT_DISPLAY),\n utmParameters: {},\n versionApp: process.env.REACT_APP_VERSION || 'local',\n versionAppShort: process.env.REACT_APP_VERSION || 'local',\n versionBO: '',\n versionCrmBack: '',\n versionCrmFront: '',\n wikipediaUrl: process.env.REACT_APP_WIKIPEDIA_LICENSE_URL || '',\n};\n\nif (!isRunningOnLocalhost()) {\n SentryWrapper.initialize(InitialState.sessionId);\n}\n\nconst DefaultAction: AppConfigurationAction = { type: null };\n\nconst appConfigurationReducer: (state: AppConfigurationState, action: AppConfigurationAction) => AppConfigurationState =\n // eslint-disable-next-line max-lines-per-function, complexity\n produce((draft = InitialState, action = DefaultAction) => {\n switch (action.type) {\n case REDUX_MSG_CHANNELS_UPDATE: {\n draft.deviceChannels = action.channels;\n break;\n }\n\n case REDUX_MSG_DEBUG_MODE_TOGGLE: {\n const newIsDebugModeEnabled = !draft.isDebugModeEnabled;\n draft.isDebugModeEnabled = newIsDebugModeEnabled;\n Notifier.isDebugModeEnabled = newIsDebugModeEnabled;\n if (newIsDebugModeEnabled) {\n // Enabling debug mode automatically switches log level to TRACE\n log.setLevel(log.levels.TRACE, true);\n } else if (process.env.REACT_APP_ENV_NAME === '') {\n // In production or staging, disabling debug mode automatically switches log level to WARN\n log.setLevel(log.levels.WARN, true);\n }\n break;\n }\n\n case REDUX_MSG_DEBUG_MODE_UPDATE: {\n draft.isDebugModeEnabled = action.isDebugModeEnabled;\n Notifier.isDebugModeEnabled = action.isDebugModeEnabled;\n if (action.isDebugModeEnabled) {\n // Enabling debug mode automatically switches log level to TRACE\n log.setLevel(log.levels.TRACE, true);\n } else if (process.env.REACT_APP_ENV_NAME === '') {\n // In production or staging, disabling debug mode automatically switches log level to WARN\n log.setLevel(log.levels.WARN, true);\n }\n break;\n }\n\n case REDUX_MSG_DEVICE_OS_UPDATE: {\n draft.deviceOS = action.deviceOS;\n break;\n }\n\n case REDUX_MSG_DEVICE_SETTINGS_UPDATE: {\n draft.deviceSettings = action.settings;\n break;\n }\n\n case REDUX_MSG_BO_SETTINGS_UPDATE: {\n draft.boSettings = action.settings;\n break;\n }\n\n case REDUX_MSG_BO_PRODUCT_ID_UPDATE: {\n draft.boSettings.productId = action.productId.toString();\n break;\n }\n\n case REDUX_MSG_DISTRIBUTOR_APPKEYS_UPDATE: {\n draft.distributorAppKeys = action.distributorAppKeys;\n break;\n }\n\n case REDUX_MSG_LIST_ALIAS_UPDATE: {\n if (action.tag !== null) {\n // Channel list with specific tag\n draft.tagListAliases[(action.tag: string)] = action.listAlias;\n draft.listAliasChannelLists[action.listAlias] = action.channelList;\n break;\n }\n\n // Entire channel list\n draft.listAlias = action.listAlias;\n break;\n }\n\n case REDUX_MSG_MAIN_DISTRIBUTOR_UPDATE: {\n draft.mainDistributorId = action.distributorId;\n break;\n }\n\n case REDUX_MSG_MESH_STATE_UPDATE: {\n draft.isDmsMeshEnabled = action.isMeshEnabled;\n break;\n }\n\n case REDUX_MSG_PLAYER_STREAM_PRIORITIES_UPDATE: {\n draft.playerStreamPriorities = action.priorities;\n break;\n }\n\n case REDUX_MSG_APP_CONFIGURATION_UPDATE: {\n const { configuration, didomi, locales } = action;\n\n draft.configuration = configuration;\n\n if (didomi !== undefined) {\n const { apiKey, webNoticeId } = didomi;\n draft.configuration.didomiApiKey = decryptDidomiKey(apiKey);\n draft.configuration.didomiNoticeId = webNoticeId;\n }\n\n if (locales !== undefined) {\n draft.locales = locales;\n }\n\n const {\n configuration: { greenStreamingMaxMpbs },\n } = draft;\n\n const maxBitrate = parseFloat(greenStreamingMaxMpbs, DEFAULT_MAX_BITRATE);\n draft.isMaxBitrateAllowed = maxBitrate !== 0;\n draft.maxBitrate = maxBitrate;\n\n break;\n }\n\n case REDUX_MSG_ENABLE_PACK_PURCHASE_API: {\n // Pack purchase is enabled if BO V2 API is enabled and purchase API has been found\n draft.usePackPurchaseApi = true;\n logDebug(`Pack purchase: ${draft.usePackPurchaseApi ? 'enabled' : 'disabled'}`);\n break;\n }\n\n case REDUX_MSG_PACK_PURCHASE_TOGGLE: {\n draft.usePackPurchaseApi = !draft.usePackPurchaseApi;\n logDebug(`Pack purchase: ${draft.usePackPurchaseApi ? 'enabled' : 'disabled'}`);\n break;\n }\n\n case REDUX_MSG_VOD_STATE_UPDATE: {\n draft.isBORunning = draft.features[FEATURE_VOD] && action.isBoRunning;\n break;\n }\n\n case REDUX_MSG_VERSION_BO_UPDATE: {\n draft.versionBO = action.version;\n break;\n }\n\n case REDUX_MSG_VERSION_CRM_BACK_UPDATE: {\n draft.versionCrmBack = action.version;\n break;\n }\n\n case REDUX_MSG_VERSION_CRM_FRONT_UPDATE: {\n draft.versionCrmFront = action.version;\n break;\n }\n\n case REDUX_MSG_COMMERCIAL_OFFERS_UPDATE: {\n draft.rightsCommercialOffers = action.commercialOffers;\n break;\n }\n\n case REDUX_MSG_DEFAULT_RIGHTS_UPDATE: {\n draft.rightsDefault = action.rights;\n break;\n }\n\n case REDUX_MSG_USER_RIGHTS_UPDATE: {\n draft.rightsUser = action.rights;\n break;\n }\n\n case REDUX_MSG_UTM_PARAMETERS_UPDATE: {\n draft.utmParameters = action.utmParameters;\n break;\n }\n\n default:\n }\n }, InitialState);\n\nexport default appConfigurationReducer;\n","/* @flow */\n\nimport {\n REDUX_MSG_APPLICATION_REGISTER,\n REDUX_MSG_APPLICATION_UNREGISTER,\n REDUX_MSG_ASSOCIATED_DEVICES_UPDATE,\n REDUX_MSG_SET_DEVICE_ID,\n REDUX_MSG_UPDATE_AUTHENTICATION_TOKEN,\n REDUX_MSG_USER_INFO_RESET,\n REDUX_MSG_USER_INFO_UPDATE,\n} from '../constants/';\nimport { RegistrationType, type UserInfo } from '../types/types';\nimport { destroy as destroyPaymentSystem, initialize as initializePaymentSystem } from '../../../helpers/applicationCustomization/externalPaymentSystem';\nimport type { AppRegistrationAction } from '../actions';\nimport LocalStorageManager from '../../../helpers/localStorage/localStorageManager';\nimport type { NETGEM_API_DMS_ASSOCIATED_DEVICE } from '../../../libs/netgemLibrary/dms/types/AssociatedDevice';\nimport SentryWrapper from '../../../helpers/debug/sentry';\nimport { StorageKeys } from '../../../helpers/localStorage/keys';\nimport { produce } from 'immer';\n\nexport type AppRegistrationState = {|\n anonymous: boolean,\n applicationId: string,\n associatedDevices: Array<NETGEM_API_DMS_ASSOCIATED_DEVICE>,\n authDeviceUrl: string,\n authenticationToken: string | null,\n deviceId: string,\n deviceKey: string,\n error: ?string,\n logoutUrl: string,\n registration: RegistrationType,\n subscriberId: string,\n upgradeDeviceUrl: string,\n userInfo: UserInfo | null,\n|};\n\nconst InitialState: AppRegistrationState = {\n anonymous: false,\n applicationId: '',\n associatedDevices: [],\n authDeviceUrl: '',\n authenticationToken: null,\n deviceId: '',\n deviceKey: '',\n error: null,\n logoutUrl: '',\n registration: RegistrationType.NotRegistered,\n subscriberId: '',\n upgradeDeviceUrl: '',\n userInfo: null,\n};\n\nconst DefaultAction: AppRegistrationAction = { type: null };\n\n// eslint-disable-next-line consistent-return\nconst appRegistrationReducer: (state: AppRegistrationState, action: AppRegistrationAction) => AppRegistrationState = produce((draft = InitialState, action = DefaultAction) => {\n switch (action.type) {\n case REDUX_MSG_UPDATE_AUTHENTICATION_TOKEN: {\n if (action.authenticationToken && draft.registration === RegistrationType.Registered) {\n // Initialize external payment system if needed\n initializePaymentSystem(action.authenticationToken, action.paymentSystemUrls);\n }\n\n draft.authenticationToken = action.authenticationToken;\n\n break;\n }\n\n case REDUX_MSG_APPLICATION_REGISTER: {\n const {\n asGuest,\n userInfo,\n userInfo: { subscriberId },\n } = action;\n SentryWrapper.updateSubscriberId(subscriberId);\n\n // Return entirely new draft\n return {\n ...draft,\n ...userInfo,\n deviceId: draft.deviceId,\n registration: asGuest ? RegistrationType.RegisteredAsGuest : RegistrationType.Registered,\n };\n }\n\n case REDUX_MSG_APPLICATION_UNREGISTER: {\n LocalStorageManager.delete(StorageKeys.UserDeviceInfo);\n\n // Destroy external payment system if needed\n destroyPaymentSystem();\n\n SentryWrapper.updateSubscriberId('');\n\n // Return entirely new draft\n return {\n ...InitialState,\n deviceId: draft.deviceId,\n };\n }\n\n case REDUX_MSG_USER_INFO_RESET: {\n draft.userInfo = null;\n break;\n }\n\n case REDUX_MSG_USER_INFO_UPDATE: {\n draft.userInfo = action.userInfo;\n break;\n }\n\n case REDUX_MSG_SET_DEVICE_ID: {\n draft.deviceId = action.deviceId;\n break;\n }\n\n case REDUX_MSG_ASSOCIATED_DEVICES_UPDATE: {\n draft.associatedDevices = action.associatedDevices;\n break;\n }\n\n default:\n }\n}, InitialState);\n\nexport default appRegistrationReducer;\n","/* @flow */\n\nimport {\n AUTHENTICATION_REQUIRED_MODAL,\n AVENUE_MODAL,\n CARD_MODAL,\n CONFIRMATION_MODAL,\n EXTERNAL_CONTENT_MODAL,\n KEYBOARD_SHORTCUTS_MODAL,\n LEGAL_NOTICE_MODAL,\n MESSAGE_MODAL,\n type MODAL_TYPE,\n NEW_VERSION_MODAL,\n NPVR_HELP_MODAL,\n NPVR_MODAL,\n VOD_PURCHASE_MODAL,\n} from '../../../components/modal/modalTypes';\nimport { type VOD_PURCHASE_DATA_TYPE, clearPendingOperationFromCard } from '../../../helpers/rights/pendingOperations';\nimport type { AVENUE_DATA_MODAL_TYPE } from '../../../components/modal/avenueModal/AvenueModal';\nimport type { CARD_DATA_MODAL_TYPE } from '../../../components/modal/cardModal/CardModalConstsAndTypes';\nimport type { CONFIRMATION_DATA_MODAL_TYPE } from '../../../components/modal/confirmationModal/ConfirmationModal';\nimport type { MESSAGE_MODAL_TYPE } from '../../../components/modal/messageModal/MessageModal';\nimport type { ModalAction } from '../actions';\nimport { ModalActionType } from '../constants';\nimport type { NEW_VERSION_DATA_MODAL_TYPE } from '../../../components/modal/newVersionModal/NewVersionModal';\nimport type { NPVR_DATA_MODAL_TYPE } from '../../../components/modal/npvrModal/NpvrModal';\nimport { produce } from 'immer';\n\nexport type ModalState = {|\n avenueData?: AVENUE_DATA_MODAL_TYPE,\n cardData?: CARD_DATA_MODAL_TYPE,\n confirmationData?: CONFIRMATION_DATA_MODAL_TYPE,\n externalContentUrl?: string,\n index?: number,\n messageData?: MESSAGE_MODAL_TYPE,\n modalType?: MODAL_TYPE,\n newVersionData?: NEW_VERSION_DATA_MODAL_TYPE,\n npvrData?: NPVR_DATA_MODAL_TYPE,\n vodPurchaseData?: VOD_PURCHASE_DATA_TYPE,\n|};\n\nexport type AllModalsState = {|\n openModals: Array<ModalState>,\n savedModalCard: ?ModalState,\n|};\n\nconst InitialState: AllModalsState = {\n openModals: [],\n savedModalCard: null,\n};\n\nconst DefaultAction: ModalAction = { type: null };\n\n/* eslint-disable max-lines-per-function */\nconst modalReducer: (state: AllModalsState, action: ModalAction) => AllModalsState = produce((draft = InitialState, action = DefaultAction) => {\n const { length: openModalCount } = draft.openModals;\n\n if (action.type === null) {\n return;\n }\n\n switch (action.type) {\n case ModalActionType.Show: {\n let newModal: ModalState = {};\n\n switch (action.modalType) {\n case AVENUE_MODAL:\n newModal = {\n avenueData: action.avenueData,\n modalType: action.modalType,\n };\n break;\n\n case CARD_MODAL:\n newModal = {\n cardData: action.cardData,\n modalType: action.modalType,\n };\n break;\n\n case CONFIRMATION_MODAL:\n newModal = {\n confirmationData: action.confirmationData,\n modalType: action.modalType,\n };\n break;\n\n case EXTERNAL_CONTENT_MODAL:\n newModal = {\n externalContentUrl: action.externalContentUrl,\n modalType: action.modalType,\n };\n break;\n\n case KEYBOARD_SHORTCUTS_MODAL:\n case LEGAL_NOTICE_MODAL:\n case NPVR_HELP_MODAL:\n newModal = {\n modalType: action.modalType,\n };\n break;\n\n case NEW_VERSION_MODAL:\n newModal = {\n modalType: action.modalType,\n newVersionData: action.newVersionData,\n };\n break;\n\n case NPVR_MODAL:\n newModal = {\n modalType: action.modalType,\n npvrData: action.npvrData,\n };\n break;\n\n case AUTHENTICATION_REQUIRED_MODAL:\n // Hide all modals since user will be sent to the login screen\n draft.openModals.length = 0;\n\n newModal = {\n modalType: action.modalType,\n };\n break;\n\n case VOD_PURCHASE_MODAL:\n newModal = {\n modalType: action.modalType,\n vodPurchaseData: action.vodPurchaseData,\n };\n break;\n\n case MESSAGE_MODAL:\n newModal = {\n messageData: action.messageData,\n modalType: action.modalType,\n };\n break;\n\n default:\n return;\n }\n\n const sameModalIndex = draft.openModals.findIndex((m) => m.modalType === action.modalType);\n if (sameModalIndex > -1) {\n // Replace existing modal of same type\n draft.openModals[sameModalIndex] = newModal;\n } else {\n // Add new modal\n draft.openModals.push(newModal);\n }\n break;\n }\n\n case ModalActionType.Reopen: {\n if (draft.savedModalCard) {\n draft.openModals.push(draft.savedModalCard);\n draft.savedModalCard = null;\n }\n break;\n }\n\n case ModalActionType.SaveAndHide:\n case ModalActionType.Hide: {\n if (openModalCount === 0) {\n // Return entirely new draft\n // eslint-disable-next-line consistent-return\n return {\n ...InitialState,\n savedModalCard: draft.savedModalCard,\n };\n }\n\n if (action.force !== true && draft.openModals[openModalCount - 1].modalType === AUTHENTICATION_REQUIRED_MODAL) {\n // Do not close this kind of modal\n break;\n }\n\n // Remove top modal and store modal card if required\n const topModal = draft.openModals.pop();\n\n // Since flowjs v0.239.0, \"topModal\" is said to be potentially undefined (which is impossible, here)\n draft.savedModalCard ||= action.type === ModalActionType.SaveAndHide && topModal?.modalType === CARD_MODAL ? clearPendingOperationFromCard(topModal) : null;\n break;\n }\n\n // No default\n }\n}, InitialState);\n/* eslint-enable max-lines-per-function */\n\nexport default modalReducer;\n","/* @flow */\n\nimport type { NETGEM_FUTURE_RECORDINGS_STATUS, NETGEM_RECORDINGS_MAP, NETGEM_SCHEDULED_RECORDINGS_MAP } from '../../../libs/netgemLibrary/v8/types/Npvr';\nimport {\n REDUX_MSG_NPVR_RECORDINGS_FUTURE_UPDATE,\n REDUX_MSG_NPVR_RECORDINGS_LIST_UPDATE,\n REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_LIST_FULL_UPDATE,\n REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_LIST_UPDATE,\n REDUX_MSG_NPVR_STATE_UPDATE,\n REDUX_MSG_QUOTA_PVR_UPDATE,\n} from '../constants';\nimport type { ETAG_MAP } from '../../../libs/netgemLibrary/v8/types/ETag';\nimport type { NETGEM_API_DMS_QUOTA_PVR } from '../../../libs/netgemLibrary/dms/types/QuotaPvr';\nimport type { NETGEM_API_V8_RAW_FEED } from '../../../libs/netgemLibrary/v8/types/FeedResult';\nimport type { NpvrAction } from '../actions';\nimport { produce } from 'immer';\n\nexport type NpvrState = {|\n eTagsCache: ETAG_MAP,\n endMargin: number,\n isEnabled: boolean,\n keepFromReplay: boolean,\n npvrRecordingsFuture: NETGEM_RECORDINGS_MAP,\n npvrRecordingsFutureFeed: NETGEM_API_V8_RAW_FEED,\n npvrRecordingsFutureStatus: ?NETGEM_FUTURE_RECORDINGS_STATUS,\n npvrRecordingsList: NETGEM_RECORDINGS_MAP,\n npvrRecordingsListFeed: NETGEM_API_V8_RAW_FEED,\n npvrScheduledRecordingsList: NETGEM_SCHEDULED_RECORDINGS_MAP,\n quotaPvr: ?NETGEM_API_DMS_QUOTA_PVR,\n recFromBeginning: boolean,\n startMargin: number,\n|};\n\nconst InitialState: NpvrState = {\n eTagsCache: {},\n endMargin: 0,\n isEnabled: false,\n keepFromReplay: false,\n npvrRecordingsFuture: {},\n npvrRecordingsFutureFeed: [],\n npvrRecordingsFutureStatus: null,\n npvrRecordingsList: {},\n npvrRecordingsListFeed: [],\n npvrScheduledRecordingsList: {},\n quotaPvr: null,\n recFromBeginning: false,\n startMargin: 0,\n};\n\nconst DefaultAction: NpvrAction = { type: null };\n\nconst NpvrReducer: (state: NpvrState, action: NpvrAction) => NpvrState = produce((draft = InitialState, action = DefaultAction) => {\n switch (action.type) {\n case REDUX_MSG_NPVR_RECORDINGS_LIST_UPDATE: {\n draft.eTagsCache.npvrRecordingsList = action.npvrRecordingsListETag;\n draft.npvrRecordingsList = action.npvrRecordingsList;\n draft.npvrRecordingsListFeed = action.npvrRecordingsListFeed;\n break;\n }\n\n case REDUX_MSG_NPVR_RECORDINGS_FUTURE_UPDATE: {\n draft.eTagsCache.npvrRecordingsFuture = action.npvrRecordingsFutureETag;\n draft.npvrRecordingsFuture = action.npvrRecordingsFuture;\n draft.npvrRecordingsFutureFeed = action.npvrRecordingsFutureFeed;\n draft.npvrRecordingsFutureStatus = action.npvrRecordingsFutureStatus;\n break;\n }\n\n case REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_LIST_UPDATE: {\n draft.npvrScheduledRecordingsList = action.scheduledRecordingList;\n draft.eTagsCache.npvrScheduledRecordingsList = action.scheduledRecordingListETag;\n Object.entries(action.scheduledRecordingETagList).forEach(([key, value]) => (draft.eTagsCache[key] = value));\n break;\n }\n\n case REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_LIST_FULL_UPDATE: {\n draft.npvrScheduledRecordingsList = action.scheduledRecordingList;\n draft.eTagsCache.npvrScheduledRecordingsListFull = action.scheduledRecordingListFullETag;\n break;\n }\n\n case REDUX_MSG_NPVR_STATE_UPDATE: {\n draft.endMargin = action.endMargin;\n draft.isEnabled = action.isEnabled;\n draft.keepFromReplay = action.keepFromReplay;\n draft.recFromBeginning = action.recFromBeginning;\n draft.startMargin = action.startMargin;\n break;\n }\n\n case REDUX_MSG_QUOTA_PVR_UPDATE: {\n draft.quotaPvr = action.quotaPvr;\n break;\n }\n\n default:\n }\n}, InitialState);\n\nexport default NpvrReducer;\n","/* @flow */\n\nimport { SubtitlesBGColor, SubtitlesSize } from './subtitles';\nimport { Setting } from './types';\n\n/*\n * See Shaka Player doc for information about the 3 following values:\n * https://shaka-player-demo.appspot.com/docs/api/tutorial-network-and-buffering-config.html\n */\n\n// The amount of content attempted to be buffered (in s)\nconst DefaultBufferingGoal = 60;\n\n// The minimum amount of content required to start playing (in s)\nconst DefaultRebufferingGoal = 2;\n\n// The amount of content kept in buffer behind the playhead (in s)\nconst DefaultBufferBehind = 30;\n\n// eslint-disable-next-line consistent-return\nexport const getDefaultValueFromSetting = (name: Setting): any => {\n switch (name) {\n case Setting.AutoOpenPlayerDebugPanel:\n // By default, player debug panel is not automatically reopened if it was open the last time the player exited\n return false;\n case Setting.AutoResume:\n // By default, if a viewing history exists, the player resumes to the last position without prompting the user\n return true;\n case Setting.AutoSelectAudioTrack:\n // By default, the player automatically tries to select the last audio track selected by the user\n return true;\n case Setting.AutoSelectSubtitlesTrack:\n // By default, the player automatically tries to select the last subtitles track selected by the user\n return true;\n case Setting.BufferingGoal:\n // By default, the buffering goal is set to 60s (see at the top of this file)\n return DefaultBufferingGoal;\n case Setting.RebufferingGoal:\n // By default, the rebuffering goal is set to 2s (see at the top of this file)\n return DefaultRebufferingGoal;\n case Setting.GreenStreaming:\n // By default, green streaming is disabled\n return false;\n case Setting.LastAudioTrack:\n // By default, there is no last audio track\n return '';\n case Setting.LastSubtitlesTrack:\n // By default, there is no last subtitles track\n return '';\n case Setting.BufferBehind:\n // By default, the buffer behind is set to 30s (see at the top of this file)\n return DefaultBufferBehind;\n case Setting.SubtitlesBGColor:\n // By default, the background color of subtitles is white (not implemented yet)\n return SubtitlesBGColor.White;\n case Setting.SubtitlesSize:\n // By default, the size of subtitles is Medium (not implemented yet)\n return SubtitlesSize.Medium;\n case Setting.Volume:\n // By default, the volume is 100%\n return 1;\n\n // No default\n }\n};\n","/* @flow */\n\nimport { Setting, type Settings } from './types';\nimport LocalStorageManager from '../localStorage/localStorageManager';\nimport { StorageKeys } from '../localStorage/keys';\nimport { getDefaultValueFromSetting } from './defaultValues';\nimport { isUndefinedOrNull } from '@ntg/utils/dist/types';\n\n// Restore all settings to their default values and store them into local storage\nconst resetSettings: () => Settings = () => {\n const settings = initializeUndefinedSettings({});\n saveSettings(settings);\n return settings;\n};\n\nconst initializeUndefinedSettings: (settings: Settings) => Settings = (settings) => {\n Array.from(Setting.members()).forEach((setting) => {\n const { [setting]: settingValue } = settings;\n if (isUndefinedOrNull(settingValue)) {\n settings[setting] = getDefaultValueFromSetting(setting);\n }\n });\n\n return settings;\n};\n\n// Load settings from local storage\nconst loadSettings: () => Settings = () => {\n const settings = LocalStorageManager.loadObject(StorageKeys.Settings);\n if (!settings) {\n // No settings stored yet\n return resetSettings();\n }\n\n return initializeUndefinedSettings(settings);\n};\n\n// Save settings into local storage\nconst saveSettings: (settings: Settings) => void = (settings) => LocalStorageManager.save(StorageKeys.Settings, settings);\n\nexport { resetSettings, loadSettings, saveSettings };\n","/* @flow */\n\nimport { AVENUE_ID_EXPLORE, AVENUE_ID_MYVIDEOS } from '../../../helpers/ui/avenue/constants';\nimport type { FOCUSED_AVENUE_TYPE, NAVIGATION_AVENUE_TYPE } from '../../../helpers/ui/avenue/types';\nimport {\n REDUX_MSG_AVENUE_LIST_UPDATE,\n REDUX_MSG_BACK_TO_FOCUSED_AVENUE,\n REDUX_MSG_BO_FAVORITE_LIST_CLEAR,\n REDUX_MSG_BO_FAVORITE_LIST_UPDATE,\n REDUX_MSG_BO_PURCHASE_LISTS_FOR_ALL_DISTRIBUTORS_UPDATE,\n REDUX_MSG_BO_PURCHASE_LIST_CLEAR,\n REDUX_MSG_BO_PURCHASE_LIST_FOR_DISTRIBUTOR_UPDATE,\n REDUX_MSG_DEFAULT_ACTIONS_UPDATE,\n REDUX_MSG_DELETE_SEARCH_HISTORY,\n REDUX_MSG_DELETE_SEARCH_HISTORY_TERM,\n REDUX_MSG_FOCUSED_AVENUE_UPDATE,\n REDUX_MSG_RESET_SECTION_PAGE_INDICES,\n REDUX_MSG_SETTING_RESET,\n REDUX_MSG_SETTING_UPDATE,\n REDUX_MSG_SET_DEEPLINK,\n REDUX_MSG_THEATER_MODE_UPDATE,\n REDUX_MSG_UPDATE_DISPLAY_PAYWALL_SUBSCRIPTION,\n REDUX_MSG_UPDATE_GRID_SECTION_ID,\n REDUX_MSG_UPDATE_SEARCH_STRING,\n REDUX_MSG_UPDATE_SECTION_PAGE_INDEX,\n REDUX_MSG_VIDEO_CAROUSEL_PLAY_UPDATE,\n REDUX_MSG_VIDEO_CAROUSEL_SOUND_UPDATE,\n REDUX_MSG_VIEWING_HISTORY_ITEM_DELETE,\n REDUX_MSG_VIEWING_HISTORY_ITEM_ETAG_DELETE,\n REDUX_MSG_VIEWING_HISTORY_ITEM_UPDATE,\n REDUX_MSG_VIEWING_HISTORY_RESET,\n REDUX_MSG_VIEWING_HISTORY_SET_ERROR,\n REDUX_MSG_VIEWING_HISTORY_UPDATE,\n REDUX_MSG_WISHLIST_ETAG_DELETE,\n REDUX_MSG_WISHLIST_RESET,\n REDUX_MSG_WISHLIST_SET_ERROR,\n REDUX_MSG_WISHLIST_UPDATE,\n} from '../constants';\nimport { deleteSearchHistory, deleteSearchString, getSearchHistory, saveSearchString } from '../../../helpers/search/search';\nimport { getAvenueIndexFromId, getMainAvenue, removeKeysWithPrefix } from './helpers';\nimport { loadSettings, resetSettings, saveSettings } from '../../../helpers/settings/settings';\nimport type { BO_FAVORITE_LIST_TYPE } from '../../netgemApi/actions/videofutur/types/favorite';\nimport type { BO_PURCHASE_LIST_TYPE } from '../../netgemApi/actions/videofutur/types/purchase';\nimport type { ETAG_MAP } from '../../../libs/netgemLibrary/v8/types/ETag';\nimport type { KeyValuePair } from '@ntg/utils/dist/types';\nimport { LoadableStatus } from '../../../helpers/loadable/loadable';\nimport type { NETGEM_API_V8_HUB } from '../../../libs/netgemLibrary/v8/types/Hub';\nimport type { NETGEM_API_V8_WIDGET_ACTIONS_TYPE } from '../../../libs/netgemLibrary/v8/types/WidgetConfig';\nimport type { NETGEM_API_VIEWINGHISTORY_ITEM } from '../../../libs/netgemLibrary/v8/types/ViewingHistory';\nimport type { NETGEM_API_WISHLIST } from '../../../libs/netgemLibrary/v8/types/Wishlist';\nimport type { Settings } from '../../../helpers/settings/types';\nimport type { UIAction } from '../actions';\nimport type { VideoCarouselStateType } from '../types/types';\nimport { produce } from 'immer';\n\nconst KEYS = Object.freeze({\n ViewingHistory: 'viewingHistory',\n Wishlist: 'wishlist',\n});\n\nexport type UIState = {|\n avenueList: NETGEM_API_V8_HUB | null,\n deeplink: string | null,\n defaultActions: NETGEM_API_V8_WIDGET_ACTIONS_TYPE | null,\n displaySubscriptionPaywall: boolean,\n exploreAvenueIndex: number,\n favoriteList: BO_FAVORITE_LIST_TYPE | null,\n favoriteListETag: string | null,\n focusedAvenue: FOCUSED_AVENUE_TYPE | null,\n gridSectionId: string | null,\n hubETag: string | null,\n // In milliseconds\n hubMaxAge: number | null,\n isInTheaterMode: boolean,\n mainAvenue: NAVIGATION_AVENUE_TYPE | null,\n myListsAvenueIndex: number,\n purchaseList: BO_PURCHASE_LIST_TYPE | null,\n purchaseListETagCache: ETAG_MAP,\n searchHistory: Array<string>,\n sectionPageIndices: KeyValuePair<number>,\n settings: Settings,\n videoCarousel: VideoCarouselStateType,\n // Type on next line was KeyValuePair<NETGEM_API_VIEWINGHISTORY_ITEM> but it has stopped working since flow-bin v0.235.1 (see https://github.com/facebook/flow/issues/9141)\n viewingHistory: {| [string]: NETGEM_API_VIEWINGHISTORY_ITEM |},\n viewingHistoryETagCache: ETAG_MAP,\n viewingHistoryStatus: LoadableStatus,\n wishlist: NETGEM_API_WISHLIST,\n wishlistETagCache: ETAG_MAP,\n wishlistStatus: LoadableStatus,\n|};\n\nconst InitialState: UIState = {\n avenueList: null,\n deeplink: null,\n defaultActions: null,\n displaySubscriptionPaywall: false,\n exploreAvenueIndex: -1,\n favoriteList: null,\n favoriteListETag: null,\n focusedAvenue: null,\n gridSectionId: null,\n hubETag: null,\n hubMaxAge: null,\n isInTheaterMode: false,\n mainAvenue: null,\n myListsAvenueIndex: -1,\n purchaseList: null,\n purchaseListETagCache: {},\n searchHistory: getSearchHistory(),\n sectionPageIndices: {},\n settings: loadSettings(),\n videoCarousel: {\n isMuted: true,\n isPlaying: false,\n },\n viewingHistory: {},\n viewingHistoryETagCache: {},\n viewingHistoryStatus: LoadableStatus.NotInitialized,\n wishlist: [],\n wishlistETagCache: {},\n wishlistStatus: LoadableStatus.NotInitialized,\n};\n\nconst DefaultAction: UIAction = { type: null };\n\n/* eslint-disable max-lines-per-function, complexity */\nconst uiReducer: (state: UIState, action: UIAction) => UIState = produce((draft = InitialState, action = DefaultAction) => {\n switch (action.type) {\n case REDUX_MSG_AVENUE_LIST_UPDATE: {\n const mainAvenue = getMainAvenue(action.hub);\n\n // Automatically focus on main avenue when avenue list is updated for the first time\n const focusedAvenue =\n draft.focusedAvenue ??\n (mainAvenue\n ? {\n index: mainAvenue.index,\n type: mainAvenue.type,\n }\n : null);\n\n draft.avenueList = action.hub;\n draft.exploreAvenueIndex = getAvenueIndexFromId(action.hub, AVENUE_ID_EXPLORE);\n draft.focusedAvenue = focusedAvenue;\n draft.hubETag = action.hubETag;\n draft.hubMaxAge = action.hubMaxAge;\n draft.mainAvenue = mainAvenue;\n draft.myListsAvenueIndex = getAvenueIndexFromId(action.hub, AVENUE_ID_MYVIDEOS);\n break;\n }\n\n case REDUX_MSG_FOCUSED_AVENUE_UPDATE: {\n draft.focusedAvenue = {\n hub: action.hub,\n hubItem: action.hubItem,\n index: action.index,\n searchString: action.searchString,\n type: action.avenueType,\n };\n // Save to local storage\n draft.searchHistory = saveSearchString(action.searchString);\n break;\n }\n\n case REDUX_MSG_UPDATE_SEARCH_STRING: {\n if (!draft.focusedAvenue) {\n draft.focusedAvenue = null;\n } else {\n draft.focusedAvenue.searchString = action.searchString;\n // Save to local storage\n draft.searchHistory = saveSearchString(action.searchString);\n }\n break;\n }\n\n case REDUX_MSG_DELETE_SEARCH_HISTORY_TERM: {\n // Update local storage\n draft.searchHistory = deleteSearchString(action.searchString);\n break;\n }\n\n case REDUX_MSG_DELETE_SEARCH_HISTORY: {\n // Delete from local storage\n draft.searchHistory = deleteSearchHistory();\n break;\n }\n\n case REDUX_MSG_BACK_TO_FOCUSED_AVENUE: {\n if (!draft.focusedAvenue) {\n draft.focusedAvenue = null;\n } else {\n // Clearing these 3 values triggers the exit of the hidden avenue (and the return to the \"parent\" avenue)\n draft.focusedAvenue.hub = undefined;\n draft.focusedAvenue.hubItem = undefined;\n draft.focusedAvenue.searchString = undefined;\n }\n break;\n }\n\n case REDUX_MSG_DEFAULT_ACTIONS_UPDATE: {\n draft.defaultActions = action.actions;\n break;\n }\n\n case REDUX_MSG_SETTING_RESET: {\n draft.settings = resetSettings();\n break;\n }\n\n case REDUX_MSG_SETTING_UPDATE: {\n draft.settings[action.setting] = action.value;\n saveSettings(draft.settings);\n break;\n }\n\n case REDUX_MSG_UPDATE_SECTION_PAGE_INDEX: {\n draft.sectionPageIndices[action.sectionId] = action.pageIndex;\n break;\n }\n\n case REDUX_MSG_RESET_SECTION_PAGE_INDICES: {\n draft.sectionPageIndices = removeKeysWithPrefix(draft.sectionPageIndices, action.prefix);\n break;\n }\n\n case REDUX_MSG_VIDEO_CAROUSEL_SOUND_UPDATE: {\n draft.videoCarousel.isMuted = action.isMuted;\n break;\n }\n\n case REDUX_MSG_VIDEO_CAROUSEL_PLAY_UPDATE: {\n draft.videoCarousel.isPlaying = action.isPlaying;\n break;\n }\n\n case REDUX_MSG_THEATER_MODE_UPDATE: {\n draft.isInTheaterMode = action.isInTheaterMode;\n break;\n }\n\n case REDUX_MSG_BO_FAVORITE_LIST_CLEAR: {\n draft.favoriteList = null;\n draft.favoriteListETag = null;\n break;\n }\n\n case REDUX_MSG_BO_FAVORITE_LIST_UPDATE: {\n draft.favoriteList = action.favoriteList;\n draft.favoriteListETag = action.eTag;\n break;\n }\n\n case REDUX_MSG_BO_PURCHASE_LIST_CLEAR: {\n draft.purchaseList = null;\n draft.purchaseListETagCache = {};\n break;\n }\n\n case REDUX_MSG_BO_PURCHASE_LIST_FOR_DISTRIBUTOR_UPDATE: {\n if (draft.purchaseList === null) {\n draft.purchaseList = ({}: BO_PURCHASE_LIST_TYPE);\n }\n\n draft.purchaseList[action.distributorId] = action.purchaseList;\n draft.purchaseListETagCache[action.distributorId] = action.eTag;\n break;\n }\n\n case REDUX_MSG_BO_PURCHASE_LISTS_FOR_ALL_DISTRIBUTORS_UPDATE: {\n action.purchaseLists?.forEach(({ distributorId, eTag, purchaseList }) => {\n if (draft.purchaseList === null) {\n draft.purchaseList = ({}: BO_PURCHASE_LIST_TYPE);\n }\n draft.purchaseList[distributorId] = purchaseList;\n draft.purchaseListETagCache[distributorId] = eTag;\n });\n break;\n }\n\n case REDUX_MSG_VIEWING_HISTORY_RESET:\n case REDUX_MSG_VIEWING_HISTORY_SET_ERROR: {\n draft.viewingHistory = {};\n draft.viewingHistoryETagCache = {};\n draft.viewingHistoryStatus = action.type === REDUX_MSG_VIEWING_HISTORY_RESET ? LoadableStatus.Loaded : LoadableStatus.Error;\n break;\n }\n\n case REDUX_MSG_VIEWING_HISTORY_ITEM_ETAG_DELETE: {\n delete draft.viewingHistoryETagCache[action.itemId];\n delete draft.viewingHistoryETagCache[KEYS.ViewingHistory];\n break;\n }\n\n case REDUX_MSG_VIEWING_HISTORY_ITEM_DELETE: {\n delete draft.viewingHistory[action.itemId];\n delete draft.viewingHistoryETagCache[action.itemId];\n delete draft.viewingHistoryETagCache[KEYS.ViewingHistory];\n break;\n }\n\n case REDUX_MSG_VIEWING_HISTORY_ITEM_UPDATE: {\n draft.viewingHistory[action.item.id] = action.item;\n draft.viewingHistoryETagCache[action.item.id] = action.itemETag;\n delete draft.viewingHistoryETagCache[KEYS.ViewingHistory];\n break;\n }\n\n case REDUX_MSG_VIEWING_HISTORY_UPDATE: {\n draft.viewingHistory = action.viewingHistory;\n draft.viewingHistoryETagCache = { viewingHistory: action.viewingHistoryETag };\n draft.viewingHistoryStatus = action.viewingHistoryETag !== null ? LoadableStatus.Loaded : LoadableStatus.NotInitialized;\n break;\n }\n\n case REDUX_MSG_WISHLIST_ETAG_DELETE: {\n delete draft.wishlistETagCache[KEYS.Wishlist];\n break;\n }\n\n case REDUX_MSG_WISHLIST_RESET:\n case REDUX_MSG_WISHLIST_SET_ERROR: {\n draft.wishlist = [];\n draft.wishlistETagCache = {};\n draft.wishlistStatus = action.type === REDUX_MSG_WISHLIST_RESET ? LoadableStatus.Loaded : LoadableStatus.Error;\n break;\n }\n\n case REDUX_MSG_WISHLIST_UPDATE: {\n draft.wishlist = action.wishlist;\n draft.wishlistETagCache = { wishlist: action.wishlistETag };\n draft.wishlistStatus = action.wishlistETag !== null ? LoadableStatus.Loaded : LoadableStatus.NotInitialized;\n break;\n }\n\n case REDUX_MSG_UPDATE_GRID_SECTION_ID: {\n draft.gridSectionId = action.gridSectionId;\n break;\n }\n\n case REDUX_MSG_SET_DEEPLINK: {\n draft.deeplink = action.deeplink;\n break;\n }\n\n case REDUX_MSG_UPDATE_DISPLAY_PAYWALL_SUBSCRIPTION: {\n draft.displaySubscriptionPaywall = action.isDisplayed;\n break;\n }\n\n default:\n }\n}, InitialState);\n/* eslint-enable max-lines-per-function, complexity */\n\nexport default uiReducer;\n","/**\n * Adapted from React: https://github.com/facebook/react/blob/master/packages/shared/formatProdErrorMessage.js\n *\n * Do not require this module directly! Use normal throw error calls. These messages will be replaced with error codes\n * during build.\n * @param {number} code\n */\nexport function formatProdErrorMessage(code: number) {\n return `Minified Redux error #${code}; visit https://redux.js.org/Errors?code=${code} for the full message or ` + 'use the non-minified dev environment for full errors. ';\n}","declare global {\n interface SymbolConstructor {\n readonly observable: symbol;\n }\n}\nconst $$observable = /* #__PURE__ */(() => typeof Symbol === 'function' && Symbol.observable || '@@observable')();\nexport default $$observable;","/**\n * These are private action types reserved by Redux.\n * For any unknown actions, you must return the current state.\n * If the current state is undefined, you must return the initial state.\n * Do not reference these action types directly in your code.\n */\n\nconst randomString = () => Math.random().toString(36).substring(7).split('').join('.');\nconst ActionTypes = {\n INIT: `@@redux/INIT${/* #__PURE__ */randomString()}`,\n REPLACE: `@@redux/REPLACE${/* #__PURE__ */randomString()}`,\n PROBE_UNKNOWN_ACTION: () => `@@redux/PROBE_UNKNOWN_ACTION${randomString()}`\n};\nexport default ActionTypes;","/**\n * @param obj The object to inspect.\n * @returns True if the argument appears to be a plain object.\n */\nexport default function isPlainObject(obj: any): obj is object {\n if (typeof obj !== 'object' || obj === null) return false;\n let proto = obj;\n while (Object.getPrototypeOf(proto) !== null) {\n proto = Object.getPrototypeOf(proto);\n }\n return Object.getPrototypeOf(obj) === proto || Object.getPrototypeOf(obj) === null;\n}","import { formatProdErrorMessage as _formatProdErrorMessage13 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage12 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage11 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage10 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage9 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage8 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage7 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage6 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage5 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage4 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage3 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage2 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage } from \"src/utils/formatProdErrorMessage\";\nimport $$observable from './utils/symbol-observable';\nimport { Store, StoreEnhancer, Dispatch, Observer, ListenerCallback, UnknownIfNonSpecific } from './types/store';\nimport { Action } from './types/actions';\nimport { Reducer } from './types/reducers';\nimport ActionTypes from './utils/actionTypes';\nimport isPlainObject from './utils/isPlainObject';\nimport { kindOf } from './utils/kindOf';\n\n/**\n * @deprecated\n *\n * **We recommend using the `configureStore` method\n * of the `@reduxjs/toolkit` package**, which replaces `createStore`.\n *\n * Redux Toolkit is our recommended approach for writing Redux logic today,\n * including store setup, reducers, data fetching, and more.\n *\n * **For more details, please read this Redux docs page:**\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * `configureStore` from Redux Toolkit is an improved version of `createStore` that\n * simplifies setup and helps avoid common bugs.\n *\n * You should not be using the `redux` core package by itself today, except for learning purposes.\n * The `createStore` method from the core `redux` package will not be removed, but we encourage\n * all users to migrate to using Redux Toolkit for all Redux code.\n *\n * If you want to use `createStore` without this visual deprecation warning, use\n * the `legacy_createStore` import instead:\n *\n * `import { legacy_createStore as createStore} from 'redux'`\n *\n */\nexport function createStore<S, A extends Action, Ext extends {} = {}, StateExt extends {} = {}>(reducer: Reducer<S, A>, enhancer?: StoreEnhancer<Ext, StateExt>): Store<S, A, UnknownIfNonSpecific<StateExt>> & Ext;\n/**\n * @deprecated\n *\n * **We recommend using the `configureStore` method\n * of the `@reduxjs/toolkit` package**, which replaces `createStore`.\n *\n * Redux Toolkit is our recommended approach for writing Redux logic today,\n * including store setup, reducers, data fetching, and more.\n *\n * **For more details, please read this Redux docs page:**\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * `configureStore` from Redux Toolkit is an improved version of `createStore` that\n * simplifies setup and helps avoid common bugs.\n *\n * You should not be using the `redux` core package by itself today, except for learning purposes.\n * The `createStore` method from the core `redux` package will not be removed, but we encourage\n * all users to migrate to using Redux Toolkit for all Redux code.\n *\n * If you want to use `createStore` without this visual deprecation warning, use\n * the `legacy_createStore` import instead:\n *\n * `import { legacy_createStore as createStore} from 'redux'`\n *\n */\nexport function createStore<S, A extends Action, Ext extends {} = {}, StateExt extends {} = {}, PreloadedState = S>(reducer: Reducer<S, A, PreloadedState>, preloadedState?: PreloadedState | undefined, enhancer?: StoreEnhancer<Ext, StateExt>): Store<S, A, UnknownIfNonSpecific<StateExt>> & Ext;\nexport function createStore<S, A extends Action, Ext extends {} = {}, StateExt extends {} = {}, PreloadedState = S>(reducer: Reducer<S, A, PreloadedState>, preloadedState?: PreloadedState | StoreEnhancer<Ext, StateExt> | undefined, enhancer?: StoreEnhancer<Ext, StateExt>): Store<S, A, UnknownIfNonSpecific<StateExt>> & Ext {\n if (typeof reducer !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage(2) : `Expected the root reducer to be a function. Instead, received: '${kindOf(reducer)}'`);\n }\n if (typeof preloadedState === 'function' && typeof enhancer === 'function' || typeof enhancer === 'function' && typeof arguments[3] === 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage2(0) : 'It looks like you are passing several store enhancers to ' + 'createStore(). This is not supported. Instead, compose them ' + 'together to a single function. See https://redux.js.org/tutorials/fundamentals/part-4-store#creating-a-store-with-enhancers for an example.');\n }\n if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') {\n enhancer = (preloadedState as StoreEnhancer<Ext, StateExt>);\n preloadedState = undefined;\n }\n if (typeof enhancer !== 'undefined') {\n if (typeof enhancer !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage3(1) : `Expected the enhancer to be a function. Instead, received: '${kindOf(enhancer)}'`);\n }\n return enhancer(createStore)(reducer, (preloadedState as PreloadedState | undefined));\n }\n let currentReducer = reducer;\n let currentState: S | PreloadedState | undefined = (preloadedState as PreloadedState | undefined);\n let currentListeners: Map<number, ListenerCallback> | null = new Map();\n let nextListeners = currentListeners;\n let listenerIdCounter = 0;\n let isDispatching = false;\n\n /**\n * This makes a shallow copy of currentListeners so we can use\n * nextListeners as a temporary list while dispatching.\n *\n * This prevents any bugs around consumers calling\n * subscribe/unsubscribe in the middle of a dispatch.\n */\n function ensureCanMutateNextListeners() {\n if (nextListeners === currentListeners) {\n nextListeners = new Map();\n currentListeners.forEach((listener, key) => {\n nextListeners.set(key, listener);\n });\n }\n }\n\n /**\n * Reads the state tree managed by the store.\n *\n * @returns The current state tree of your application.\n */\n function getState(): S {\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage4(3) : 'You may not call store.getState() while the reducer is executing. ' + 'The reducer has already received the state as an argument. ' + 'Pass it down from the top reducer instead of reading it from the store.');\n }\n return (currentState as S);\n }\n\n /**\n * Adds a change listener. It will be called any time an action is dispatched,\n * and some part of the state tree may potentially have changed. You may then\n * call `getState()` to read the current state tree inside the callback.\n *\n * You may call `dispatch()` from a change listener, with the following\n * caveats:\n *\n * 1. The subscriptions are snapshotted just before every `dispatch()` call.\n * If you subscribe or unsubscribe while the listeners are being invoked, this\n * will not have any effect on the `dispatch()` that is currently in progress.\n * However, the next `dispatch()` call, whether nested or not, will use a more\n * recent snapshot of the subscription list.\n *\n * 2. The listener should not expect to see all state changes, as the state\n * might have been updated multiple times during a nested `dispatch()` before\n * the listener is called. It is, however, guaranteed that all subscribers\n * registered before the `dispatch()` started will be called with the latest\n * state by the time it exits.\n *\n * @param listener A callback to be invoked on every dispatch.\n * @returns A function to remove this change listener.\n */\n function subscribe(listener: () => void) {\n if (typeof listener !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage5(4) : `Expected the listener to be a function. Instead, received: '${kindOf(listener)}'`);\n }\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage6(5) : 'You may not call store.subscribe() while the reducer is executing. ' + 'If you would like to be notified after the store has been updated, subscribe from a ' + 'component and invoke store.getState() in the callback to access the latest state. ' + 'See https://redux.js.org/api/store#subscribelistener for more details.');\n }\n let isSubscribed = true;\n ensureCanMutateNextListeners();\n const listenerId = listenerIdCounter++;\n nextListeners.set(listenerId, listener);\n return function unsubscribe() {\n if (!isSubscribed) {\n return;\n }\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage7(6) : 'You may not unsubscribe from a store listener while the reducer is executing. ' + 'See https://redux.js.org/api/store#subscribelistener for more details.');\n }\n isSubscribed = false;\n ensureCanMutateNextListeners();\n nextListeners.delete(listenerId);\n currentListeners = null;\n };\n }\n\n /**\n * Dispatches an action. It is the only way to trigger a state change.\n *\n * The `reducer` function, used to create the store, will be called with the\n * current state tree and the given `action`. Its return value will\n * be considered the **next** state of the tree, and the change listeners\n * will be notified.\n *\n * The base implementation only supports plain object actions. If you want to\n * dispatch a Promise, an Observable, a thunk, or something else, you need to\n * wrap your store creating function into the corresponding middleware. For\n * example, see the documentation for the `redux-thunk` package. Even the\n * middleware will eventually dispatch plain object actions using this method.\n *\n * @param action A plain object representing “what changed”. It is\n * a good idea to keep actions serializable so you can record and replay user\n * sessions, or use the time travelling `redux-devtools`. An action must have\n * a `type` property which may not be `undefined`. It is a good idea to use\n * string constants for action types.\n *\n * @returns For convenience, the same action object you dispatched.\n *\n * Note that, if you use a custom middleware, it may wrap `dispatch()` to\n * return something else (for example, a Promise you can await).\n */\n function dispatch(action: A) {\n if (!isPlainObject(action)) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage8(7) : `Actions must be plain objects. Instead, the actual type was: '${kindOf(action)}'. You may need to add middleware to your store setup to handle dispatching other values, such as 'redux-thunk' to handle dispatching functions. See https://redux.js.org/tutorials/fundamentals/part-4-store#middleware and https://redux.js.org/tutorials/fundamentals/part-6-async-logic#using-the-redux-thunk-middleware for examples.`);\n }\n if (typeof action.type === 'undefined') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage9(8) : 'Actions may not have an undefined \"type\" property. You may have misspelled an action type string constant.');\n }\n if (typeof action.type !== 'string') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage10(17) : `Action \"type\" property must be a string. Instead, the actual type was: '${kindOf(action.type)}'. Value was: '${action.type}' (stringified)`);\n }\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage11(9) : 'Reducers may not dispatch actions.');\n }\n try {\n isDispatching = true;\n currentState = currentReducer(currentState, action);\n } finally {\n isDispatching = false;\n }\n const listeners = currentListeners = nextListeners;\n listeners.forEach(listener => {\n listener();\n });\n return action;\n }\n\n /**\n * Replaces the reducer currently used by the store to calculate the state.\n *\n * You might need this if your app implements code splitting and you want to\n * load some of the reducers dynamically. You might also need this if you\n * implement a hot reloading mechanism for Redux.\n *\n * @param nextReducer The reducer for the store to use instead.\n */\n function replaceReducer(nextReducer: Reducer<S, A>): void {\n if (typeof nextReducer !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage12(10) : `Expected the nextReducer to be a function. Instead, received: '${kindOf(nextReducer)}`);\n }\n currentReducer = ((nextReducer as unknown) as Reducer<S, A, PreloadedState>);\n\n // This action has a similar effect to ActionTypes.INIT.\n // Any reducers that existed in both the new and old rootReducer\n // will receive the previous state. This effectively populates\n // the new state tree with any relevant data from the old one.\n dispatch(({\n type: ActionTypes.REPLACE\n } as A));\n }\n\n /**\n * Interoperability point for observable/reactive libraries.\n * @returns A minimal observable of state changes.\n * For more information, see the observable proposal:\n * https://github.com/tc39/proposal-observable\n */\n function observable() {\n const outerSubscribe = subscribe;\n return {\n /**\n * The minimal observable subscription method.\n * @param observer Any object that can be used as an observer.\n * The observer object should have a `next` method.\n * @returns An object with an `unsubscribe` method that can\n * be used to unsubscribe the observable from the store, and prevent further\n * emission of values from the observable.\n */\n subscribe(observer: unknown) {\n if (typeof observer !== 'object' || observer === null) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage13(11) : `Expected the observer to be an object. Instead, received: '${kindOf(observer)}'`);\n }\n function observeState() {\n const observerAsObserver = (observer as Observer<S>);\n if (observerAsObserver.next) {\n observerAsObserver.next(getState());\n }\n }\n observeState();\n const unsubscribe = outerSubscribe(observeState);\n return {\n unsubscribe\n };\n },\n [$$observable]() {\n return this;\n }\n };\n }\n\n // When a store is created, an \"INIT\" action is dispatched so that every\n // reducer returns their initial state. This effectively populates\n // the initial state tree.\n dispatch(({\n type: ActionTypes.INIT\n } as A));\n const store = (({\n dispatch: (dispatch as Dispatch<A>),\n subscribe,\n getState,\n replaceReducer,\n [$$observable]: observable\n } as unknown) as Store<S, A, StateExt> & Ext);\n return store;\n}\n\n/**\n * Creates a Redux store that holds the state tree.\n *\n * **We recommend using `configureStore` from the\n * `@reduxjs/toolkit` package**, which replaces `createStore`:\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * The only way to change the data in the store is to call `dispatch()` on it.\n *\n * There should only be a single store in your app. To specify how different\n * parts of the state tree respond to actions, you may combine several reducers\n * into a single reducer function by using `combineReducers`.\n *\n * @param {Function} reducer A function that returns the next state tree, given\n * the current state tree and the action to handle.\n *\n * @param {any} [preloadedState] The initial state. You may optionally specify it\n * to hydrate the state from the server in universal apps, or to restore a\n * previously serialized user session.\n * If you use `combineReducers` to produce the root reducer function, this must be\n * an object with the same shape as `combineReducers` keys.\n *\n * @param {Function} [enhancer] The store enhancer. You may optionally specify it\n * to enhance the store with third-party capabilities such as middleware,\n * time travel, persistence, etc. The only store enhancer that ships with Redux\n * is `applyMiddleware()`.\n *\n * @returns {Store} A Redux store that lets you read the state, dispatch actions\n * and subscribe to changes.\n */\nexport function legacy_createStore<S, A extends Action, Ext extends {} = {}, StateExt extends {} = {}>(reducer: Reducer<S, A>, enhancer?: StoreEnhancer<Ext, StateExt>): Store<S, A, UnknownIfNonSpecific<StateExt>> & Ext;\n/**\n * Creates a Redux store that holds the state tree.\n *\n * **We recommend using `configureStore` from the\n * `@reduxjs/toolkit` package**, which replaces `createStore`:\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * The only way to change the data in the store is to call `dispatch()` on it.\n *\n * There should only be a single store in your app. To specify how different\n * parts of the state tree respond to actions, you may combine several reducers\n * into a single reducer function by using `combineReducers`.\n *\n * @param {Function} reducer A function that returns the next state tree, given\n * the current state tree and the action to handle.\n *\n * @param {any} [preloadedState] The initial state. You may optionally specify it\n * to hydrate the state from the server in universal apps, or to restore a\n * previously serialized user session.\n * If you use `combineReducers` to produce the root reducer function, this must be\n * an object with the same shape as `combineReducers` keys.\n *\n * @param {Function} [enhancer] The store enhancer. You may optionally specify it\n * to enhance the store with third-party capabilities such as middleware,\n * time travel, persistence, etc. The only store enhancer that ships with Redux\n * is `applyMiddleware()`.\n *\n * @returns {Store} A Redux store that lets you read the state, dispatch actions\n * and subscribe to changes.\n */\nexport function legacy_createStore<S, A extends Action, Ext extends {} = {}, StateExt extends {} = {}, PreloadedState = S>(reducer: Reducer<S, A, PreloadedState>, preloadedState?: PreloadedState | undefined, enhancer?: StoreEnhancer<Ext, StateExt>): Store<S, A, UnknownIfNonSpecific<StateExt>> & Ext;\nexport function legacy_createStore<S, A extends Action, Ext extends {} = {}, StateExt extends {} = {}, PreloadedState = S>(reducer: Reducer<S, A>, preloadedState?: PreloadedState | StoreEnhancer<Ext, StateExt> | undefined, enhancer?: StoreEnhancer<Ext, StateExt>): Store<S, A, UnknownIfNonSpecific<StateExt>> & Ext {\n return createStore(reducer, (preloadedState as any), enhancer);\n}","import { formatProdErrorMessage as _formatProdErrorMessage3 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage2 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage } from \"src/utils/formatProdErrorMessage\";\nimport { Action } from './types/actions';\nimport { ActionFromReducersMapObject, PreloadedStateShapeFromReducersMapObject, Reducer, StateFromReducersMapObject } from './types/reducers';\nimport ActionTypes from './utils/actionTypes';\nimport isPlainObject from './utils/isPlainObject';\nimport warning from './utils/warning';\nimport { kindOf } from './utils/kindOf';\nfunction getUnexpectedStateShapeWarningMessage(inputState: object, reducers: {\n [key: string]: Reducer<any, any, any>;\n}, action: Action, unexpectedKeyCache: {\n [key: string]: true;\n}) {\n const reducerKeys = Object.keys(reducers);\n const argumentName = action && action.type === ActionTypes.INIT ? 'preloadedState argument passed to createStore' : 'previous state received by the reducer';\n if (reducerKeys.length === 0) {\n return 'Store does not have a valid reducer. Make sure the argument passed ' + 'to combineReducers is an object whose values are reducers.';\n }\n if (!isPlainObject(inputState)) {\n return `The ${argumentName} has unexpected type of \"${kindOf(inputState)}\". Expected argument to be an object with the following ` + `keys: \"${reducerKeys.join('\", \"')}\"`;\n }\n const unexpectedKeys = Object.keys(inputState).filter(key => !reducers.hasOwnProperty(key) && !unexpectedKeyCache[key]);\n unexpectedKeys.forEach(key => {\n unexpectedKeyCache[key] = true;\n });\n if (action && action.type === ActionTypes.REPLACE) return;\n if (unexpectedKeys.length > 0) {\n return `Unexpected ${unexpectedKeys.length > 1 ? 'keys' : 'key'} ` + `\"${unexpectedKeys.join('\", \"')}\" found in ${argumentName}. ` + `Expected to find one of the known reducer keys instead: ` + `\"${reducerKeys.join('\", \"')}\". Unexpected keys will be ignored.`;\n }\n}\nfunction assertReducerShape(reducers: {\n [key: string]: Reducer<any, any, any>;\n}) {\n Object.keys(reducers).forEach(key => {\n const reducer = reducers[key];\n const initialState = reducer(undefined, {\n type: ActionTypes.INIT\n });\n if (typeof initialState === 'undefined') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage(12) : `The slice reducer for key \"${key}\" returned undefined during initialization. ` + `If the state passed to the reducer is undefined, you must ` + `explicitly return the initial state. The initial state may ` + `not be undefined. If you don't want to set a value for this reducer, ` + `you can use null instead of undefined.`);\n }\n if (typeof reducer(undefined, {\n type: ActionTypes.PROBE_UNKNOWN_ACTION()\n }) === 'undefined') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage2(13) : `The slice reducer for key \"${key}\" returned undefined when probed with a random type. ` + `Don't try to handle '${ActionTypes.INIT}' or other actions in \"redux/*\" ` + `namespace. They are considered private. Instead, you must return the ` + `current state for any unknown actions, unless it is undefined, ` + `in which case you must return the initial state, regardless of the ` + `action type. The initial state may not be undefined, but can be null.`);\n }\n });\n}\n\n/**\n * Turns an object whose values are different reducer functions, into a single\n * reducer function. It will call every child reducer, and gather their results\n * into a single state object, whose keys correspond to the keys of the passed\n * reducer functions.\n *\n * @template S Combined state object type.\n *\n * @param reducers An object whose values correspond to different reducer\n * functions that need to be combined into one. One handy way to obtain it\n * is to use `import * as reducers` syntax. The reducers may never\n * return undefined for any action. Instead, they should return their\n * initial state if the state passed to them was undefined, and the current\n * state for any unrecognized action.\n *\n * @returns A reducer function that invokes every reducer inside the passed\n * object, and builds a state object with the same shape.\n */\nexport default function combineReducers<M>(reducers: M): M[keyof M] extends Reducer<any, any, any> | undefined ? Reducer<StateFromReducersMapObject<M>, ActionFromReducersMapObject<M>, Partial<PreloadedStateShapeFromReducersMapObject<M>>> : never;\nexport default function combineReducers(reducers: {\n [key: string]: Reducer<any, any, any>;\n}) {\n const reducerKeys = Object.keys(reducers);\n const finalReducers: {\n [key: string]: Reducer<any, any, any>;\n } = {};\n for (let i = 0; i < reducerKeys.length; i++) {\n const key = reducerKeys[i];\n if (process.env.NODE_ENV !== 'production') {\n if (typeof reducers[key] === 'undefined') {\n warning(`No reducer provided for key \"${key}\"`);\n }\n }\n if (typeof reducers[key] === 'function') {\n finalReducers[key] = reducers[key];\n }\n }\n const finalReducerKeys = Object.keys(finalReducers);\n\n // This is used to make sure we don't warn about the same\n // keys multiple times.\n let unexpectedKeyCache: {\n [key: string]: true;\n };\n if (process.env.NODE_ENV !== 'production') {\n unexpectedKeyCache = {};\n }\n let shapeAssertionError: unknown;\n try {\n assertReducerShape(finalReducers);\n } catch (e) {\n shapeAssertionError = e;\n }\n return function combination(state: StateFromReducersMapObject<typeof reducers> = {}, action: Action) {\n if (shapeAssertionError) {\n throw shapeAssertionError;\n }\n if (process.env.NODE_ENV !== 'production') {\n const warningMessage = getUnexpectedStateShapeWarningMessage(state, finalReducers, action, unexpectedKeyCache);\n if (warningMessage) {\n warning(warningMessage);\n }\n }\n let hasChanged = false;\n const nextState: StateFromReducersMapObject<typeof reducers> = {};\n for (let i = 0; i < finalReducerKeys.length; i++) {\n const key = finalReducerKeys[i];\n const reducer = finalReducers[key];\n const previousStateForKey = state[key];\n const nextStateForKey = reducer(previousStateForKey, action);\n if (typeof nextStateForKey === 'undefined') {\n const actionType = action && action.type;\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage3(14) : `When called with an action of type ${actionType ? `\"${String(actionType)}\"` : '(unknown type)'}, the slice reducer for key \"${key}\" returned undefined. ` + `To ignore an action, you must explicitly return the previous state. ` + `If you want this reducer to hold no value, you can return null instead of undefined.`);\n }\n nextState[key] = nextStateForKey;\n hasChanged = hasChanged || nextStateForKey !== previousStateForKey;\n }\n hasChanged = hasChanged || finalReducerKeys.length !== Object.keys(state).length;\n return hasChanged ? nextState : state;\n };\n}","type Func<T extends any[], R> = (...a: T) => R;\n\n/**\n * Composes single-argument functions from right to left. The rightmost\n * function can take multiple arguments as it provides the signature for the\n * resulting composite function.\n *\n * @param funcs The functions to compose.\n * @returns A function obtained by composing the argument functions from right\n * to left. For example, `compose(f, g, h)` is identical to doing\n * `(...args) => f(g(h(...args)))`.\n */\nexport default function compose(): <R>(a: R) => R;\nexport default function compose<F extends Function>(f: F): F;\n\n/* two functions */\nexport default function compose<A, T extends any[], R>(f1: (a: A) => R, f2: Func<T, A>): Func<T, R>;\n\n/* three functions */\nexport default function compose<A, B, T extends any[], R>(f1: (b: B) => R, f2: (a: A) => B, f3: Func<T, A>): Func<T, R>;\n\n/* four functions */\nexport default function compose<A, B, C, T extends any[], R>(f1: (c: C) => R, f2: (b: B) => C, f3: (a: A) => B, f4: Func<T, A>): Func<T, R>;\n\n/* rest */\nexport default function compose<R>(f1: (a: any) => R, ...funcs: Function[]): (...args: any[]) => R;\nexport default function compose<R>(...funcs: Function[]): (...args: any[]) => R;\nexport default function compose(...funcs: Function[]) {\n if (funcs.length === 0) {\n // infer the argument type so it is usable in inference down the line\n return <T,>(arg: T) => arg;\n }\n if (funcs.length === 1) {\n return funcs[0];\n }\n return funcs.reduce((a, b) => (...args: any) => a(b(...args)));\n}","/* @flow */\n\nimport appConfigurationReducer, { type AppConfigurationState } from '../appConf/reducers';\nimport appRegistrationReducer, { type AppRegistrationState } from '../appRegistration/reducers';\nimport modalReducer, { type AllModalsState } from '../modal/reducers';\nimport netgemApiReducer, { type NetgemApiState } from '../netgemApi/reducers';\nimport npvrReducer, { type NpvrState } from '../npvr/reducers';\nimport uiReducer, { type UIState } from '../ui/reducers';\nimport { combineReducers } from '@reduxjs/toolkit';\n\nexport type CombinedReducers = {|\n appConfiguration: AppConfigurationState,\n appRegistration: AppRegistrationState,\n modal: AllModalsState,\n netgemApi: NetgemApiState,\n npvr: NpvrState,\n ui: UIState,\n|};\n\nconst allReducers: CombinedReducers = combineReducers({\n appConfiguration: appConfigurationReducer,\n appRegistration: appRegistrationReducer,\n modal: modalReducer,\n netgemApi: netgemApiReducer,\n npvr: npvrReducer,\n ui: uiReducer,\n});\n\nexport default allReducers;\n","// src/index.ts\nfunction createThunkMiddleware(extraArgument) {\n const middleware = ({ dispatch, getState }) => (next) => (action) => {\n if (typeof action === \"function\") {\n return action(dispatch, getState, extraArgument);\n }\n return next(action);\n };\n return middleware;\n}\nvar thunk = createThunkMiddleware();\nvar withExtraArgument = createThunkMiddleware;\nexport {\n thunk,\n withExtraArgument\n};\n","import type { Action, ActionCreator, StoreEnhancer } from 'redux';\nimport { compose } from 'redux';\n\n/**\n * @public\n */\nexport interface DevToolsEnhancerOptions {\n /**\n * the instance name to be showed on the monitor page. Default value is `document.title`.\n * If not specified and there's no document title, it will consist of `tabId` and `instanceId`.\n */\n name?: string;\n /**\n * action creators functions to be available in the Dispatcher.\n */\n actionCreators?: ActionCreator<any>[] | {\n [key: string]: ActionCreator<any>;\n };\n /**\n * if more than one action is dispatched in the indicated interval, all new actions will be collected and sent at once.\n * It is the joint between performance and speed. When set to `0`, all actions will be sent instantly.\n * Set it to a higher value when experiencing perf issues (also `maxAge` to a lower value).\n *\n * @default 500 ms.\n */\n latency?: number;\n /**\n * (> 1) - maximum allowed actions to be stored in the history tree. The oldest actions are removed once maxAge is reached. It's critical for performance.\n *\n * @default 50\n */\n maxAge?: number;\n /**\n * Customizes how actions and state are serialized and deserialized. Can be a boolean or object. If given a boolean, the behavior is the same as if you\n * were to pass an object and specify `options` as a boolean. Giving an object allows fine-grained customization using the `replacer` and `reviver`\n * functions.\n */\n serialize?: boolean | {\n /**\n * - `undefined` - will use regular `JSON.stringify` to send data (it's the fast mode).\n * - `false` - will handle also circular references.\n * - `true` - will handle also date, regex, undefined, error objects, symbols, maps, sets and functions.\n * - object, which contains `date`, `regex`, `undefined`, `error`, `symbol`, `map`, `set` and `function` keys.\n * For each of them you can indicate if to include (by setting as `true`).\n * For `function` key you can also specify a custom function which handles serialization.\n * See [`jsan`](https://github.com/kolodny/jsan) for more details.\n */\n options?: undefined | boolean | {\n date?: true;\n regex?: true;\n undefined?: true;\n error?: true;\n symbol?: true;\n map?: true;\n set?: true;\n function?: true | ((fn: (...args: any[]) => any) => string);\n };\n /**\n * [JSON replacer function](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#The_replacer_parameter) used for both actions and states stringify.\n * In addition, you can specify a data type by adding a [`__serializedType__`](https://github.com/zalmoxisus/remotedev-serialize/blob/master/helpers/index.js#L4)\n * key. So you can deserialize it back while importing or persisting data.\n * Moreover, it will also [show a nice preview showing the provided custom type](https://cloud.githubusercontent.com/assets/7957859/21814330/a17d556a-d761-11e6-85ef-159dd12f36c5.png):\n */\n replacer?: (key: string, value: unknown) => any;\n /**\n * [JSON `reviver` function](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse#Using_the_reviver_parameter)\n * used for parsing the imported actions and states. See [`remotedev-serialize`](https://github.com/zalmoxisus/remotedev-serialize/blob/master/immutable/serialize.js#L8-L41)\n * as an example on how to serialize special data types and get them back.\n */\n reviver?: (key: string, value: unknown) => any;\n /**\n * Automatically serialize/deserialize immutablejs via [remotedev-serialize](https://github.com/zalmoxisus/remotedev-serialize).\n * Just pass the Immutable library. It will support all ImmutableJS structures. You can even export them into a file and get them back.\n * The only exception is `Record` class, for which you should pass this in addition the references to your classes in `refs`.\n */\n immutable?: any;\n /**\n * ImmutableJS `Record` classes used to make possible restore its instances back when importing, persisting...\n */\n refs?: any;\n };\n /**\n * function which takes `action` object and id number as arguments, and should return `action` object back.\n */\n actionSanitizer?: <A extends Action>(action: A, id: number) => A;\n /**\n * function which takes `state` object and index as arguments, and should return `state` object back.\n */\n stateSanitizer?: <S>(state: S, index: number) => S;\n /**\n * *string or array of strings as regex* - actions types to be hidden / shown in the monitors (while passed to the reducers).\n * If `actionsAllowlist` specified, `actionsDenylist` is ignored.\n */\n actionsDenylist?: string | string[];\n /**\n * *string or array of strings as regex* - actions types to be hidden / shown in the monitors (while passed to the reducers).\n * If `actionsAllowlist` specified, `actionsDenylist` is ignored.\n */\n actionsAllowlist?: string | string[];\n /**\n * called for every action before sending, takes `state` and `action` object, and returns `true` in case it allows sending the current data to the monitor.\n * Use it as a more advanced version of `actionsDenylist`/`actionsAllowlist` parameters.\n */\n predicate?: <S, A extends Action>(state: S, action: A) => boolean;\n /**\n * if specified as `false`, it will not record the changes till clicking on `Start recording` button.\n * Available only for Redux enhancer, for others use `autoPause`.\n *\n * @default true\n */\n shouldRecordChanges?: boolean;\n /**\n * if specified, whenever clicking on `Pause recording` button and there are actions in the history log, will add this action type.\n * If not specified, will commit when paused. Available only for Redux enhancer.\n *\n * @default \"@@PAUSED\"\"\n */\n pauseActionType?: string;\n /**\n * auto pauses when the extension’s window is not opened, and so has zero impact on your app when not in use.\n * Not available for Redux enhancer (as it already does it but storing the data to be sent).\n *\n * @default false\n */\n autoPause?: boolean;\n /**\n * if specified as `true`, it will not allow any non-monitor actions to be dispatched till clicking on `Unlock changes` button.\n * Available only for Redux enhancer.\n *\n * @default false\n */\n shouldStartLocked?: boolean;\n /**\n * if set to `false`, will not recompute the states on hot reloading (or on replacing the reducers). Available only for Redux enhancer.\n *\n * @default true\n */\n shouldHotReload?: boolean;\n /**\n * if specified as `true`, whenever there's an exception in reducers, the monitors will show the error message, and next actions will not be dispatched.\n *\n * @default false\n */\n shouldCatchErrors?: boolean;\n /**\n * If you want to restrict the extension, specify the features you allow.\n * If not specified, all of the features are enabled. When set as an object, only those included as `true` will be allowed.\n * Note that except `true`/`false`, `import` and `export` can be set as `custom` (which is by default for Redux enhancer), meaning that the importing/exporting occurs on the client side.\n * Otherwise, you'll get/set the data right from the monitor part.\n */\n features?: {\n /**\n * start/pause recording of dispatched actions\n */\n pause?: boolean;\n /**\n * lock/unlock dispatching actions and side effects\n */\n lock?: boolean;\n /**\n * persist states on page reloading\n */\n persist?: boolean;\n /**\n * export history of actions in a file\n */\n export?: boolean | 'custom';\n /**\n * import history of actions from a file\n */\n import?: boolean | 'custom';\n /**\n * jump back and forth (time travelling)\n */\n jump?: boolean;\n /**\n * skip (cancel) actions\n */\n skip?: boolean;\n /**\n * drag and drop actions in the history list\n */\n reorder?: boolean;\n /**\n * dispatch custom actions or action creators\n */\n dispatch?: boolean;\n /**\n * generate tests for the selected actions\n */\n test?: boolean;\n };\n /**\n * Set to true or a stacktrace-returning function to record call stack traces for dispatched actions.\n * Defaults to false.\n */\n trace?: boolean | (<A extends Action>(action: A) => string);\n /**\n * The maximum number of stack trace entries to record per action. Defaults to 10.\n */\n traceLimit?: number;\n}\ntype Compose = typeof compose;\ninterface ComposeWithDevTools {\n (options: DevToolsEnhancerOptions): Compose;\n <StoreExt extends {}>(...funcs: StoreEnhancer<StoreExt>[]): StoreEnhancer<StoreExt>;\n}\n\n/**\n * @public\n */\nexport const composeWithDevTools: ComposeWithDevTools = typeof window !== 'undefined' && (window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ? (window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ : function () {\n if (arguments.length === 0) return undefined;\n if (typeof arguments[0] === 'object') return compose;\n return compose.apply(null, arguments as any as Function[]);\n};\n\n/**\n * @public\n */\nexport const devToolsEnhancer: {\n (options: DevToolsEnhancerOptions): StoreEnhancer<any>;\n} = typeof window !== 'undefined' && (window as any).__REDUX_DEVTOOLS_EXTENSION__ ? (window as any).__REDUX_DEVTOOLS_EXTENSION__ : function () {\n return function (noop) {\n return noop;\n };\n};","import { produce as createNextState, isDraftable } from 'immer';\nexport function getTimeMeasureUtils(maxDelay: number, fnName: string) {\n let elapsed = 0;\n return {\n measureTime<T>(fn: () => T): T {\n const started = Date.now();\n try {\n return fn();\n } finally {\n const finished = Date.now();\n elapsed += finished - started;\n }\n },\n warnIfExceeded() {\n if (elapsed > maxDelay) {\n console.warn(`${fnName} took ${elapsed}ms, which is more than the warning threshold of ${maxDelay}ms. \nIf your state or actions are very large, you may want to disable the middleware as it might cause too much of a slowdown in development mode. See https://redux-toolkit.js.org/api/getDefaultMiddleware for instructions.\nIt is disabled in production builds, so you don't need to worry about that.`);\n }\n }\n };\n}\nexport function delay(ms: number) {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\nexport class Tuple<Items extends ReadonlyArray<unknown> = []> extends Array<Items[number]> {\n constructor(length: number);\n constructor(...items: Items);\n constructor(...items: any[]) {\n super(...items);\n Object.setPrototypeOf(this, Tuple.prototype);\n }\n static override get [Symbol.species]() {\n return Tuple as any;\n }\n override concat<AdditionalItems extends ReadonlyArray<unknown>>(items: Tuple<AdditionalItems>): Tuple<[...Items, ...AdditionalItems]>;\n override concat<AdditionalItems extends ReadonlyArray<unknown>>(items: AdditionalItems): Tuple<[...Items, ...AdditionalItems]>;\n override concat<AdditionalItems extends ReadonlyArray<unknown>>(...items: AdditionalItems): Tuple<[...Items, ...AdditionalItems]>;\n override concat(...arr: any[]) {\n return super.concat.apply(this, arr);\n }\n prepend<AdditionalItems extends ReadonlyArray<unknown>>(items: Tuple<AdditionalItems>): Tuple<[...AdditionalItems, ...Items]>;\n prepend<AdditionalItems extends ReadonlyArray<unknown>>(items: AdditionalItems): Tuple<[...AdditionalItems, ...Items]>;\n prepend<AdditionalItems extends ReadonlyArray<unknown>>(...items: AdditionalItems): Tuple<[...AdditionalItems, ...Items]>;\n prepend(...arr: any[]) {\n if (arr.length === 1 && Array.isArray(arr[0])) {\n return new Tuple(...arr[0].concat(this));\n }\n return new Tuple(...arr.concat(this));\n }\n}\nexport function freezeDraftable<T>(val: T) {\n return isDraftable(val) ? createNextState(val, () => {}) : val;\n}\nexport function getOrInsert<K extends object, V>(map: WeakMap<K, V>, key: K, value: V): V;\nexport function getOrInsert<K, V>(map: Map<K, V>, key: K, value: V): V;\nexport function getOrInsert<K extends object, V>(map: Map<K, V> | WeakMap<K, V>, key: K, value: V): V {\n if (map.has(key)) return map.get(key) as V;\n return map.set(key, value).get(key) as V;\n}\nexport function getOrInsertComputed<K extends object, V>(map: WeakMap<K, V>, key: K, compute: (key: K) => V): V;\nexport function getOrInsertComputed<K, V>(map: Map<K, V>, key: K, compute: (key: K) => V): V;\nexport function getOrInsertComputed<K extends object, V>(map: Map<K, V> | WeakMap<K, V>, key: K, compute: (key: K) => V): V {\n if (map.has(key)) return map.get(key) as V;\n return map.set(key, compute(key)).get(key) as V;\n}\nexport function promiseWithResolvers<T>(): {\n promise: Promise<T>;\n resolve: (value: T | PromiseLike<T>) => void;\n reject: (reason?: any) => void;\n} {\n let resolve: any;\n let reject: any;\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return {\n promise,\n resolve,\n reject\n };\n}","import type { Middleware, UnknownAction } from 'redux';\nimport type { ThunkMiddleware } from 'redux-thunk';\nimport { thunk as thunkMiddleware, withExtraArgument } from 'redux-thunk';\nimport type { ActionCreatorInvariantMiddlewareOptions } from './actionCreatorInvariantMiddleware';\nimport { createActionCreatorInvariantMiddleware } from './actionCreatorInvariantMiddleware';\nimport type { ImmutableStateInvariantMiddlewareOptions } from './immutableStateInvariantMiddleware';\n/* PROD_START_REMOVE_UMD */\nimport { createImmutableStateInvariantMiddleware } from './immutableStateInvariantMiddleware';\n/* PROD_STOP_REMOVE_UMD */\n\nimport type { SerializableStateInvariantMiddlewareOptions } from './serializableStateInvariantMiddleware';\nimport { createSerializableStateInvariantMiddleware } from './serializableStateInvariantMiddleware';\nimport type { ExcludeFromTuple } from './tsHelpers';\nimport { Tuple } from './utils';\nfunction isBoolean(x: any): x is boolean {\n return typeof x === 'boolean';\n}\ninterface ThunkOptions<E = any> {\n extraArgument: E;\n}\ninterface GetDefaultMiddlewareOptions {\n thunk?: boolean | ThunkOptions;\n immutableCheck?: boolean | ImmutableStateInvariantMiddlewareOptions;\n serializableCheck?: boolean | SerializableStateInvariantMiddlewareOptions;\n actionCreatorCheck?: boolean | ActionCreatorInvariantMiddlewareOptions;\n}\nexport type ThunkMiddlewareFor<S, O extends GetDefaultMiddlewareOptions = {}> = O extends {\n thunk: false;\n} ? never : O extends {\n thunk: {\n extraArgument: infer E;\n };\n} ? ThunkMiddleware<S, UnknownAction, E> : ThunkMiddleware<S, UnknownAction>;\nexport type GetDefaultMiddleware<S = any> = <O extends GetDefaultMiddlewareOptions = {\n thunk: true;\n immutableCheck: true;\n serializableCheck: true;\n actionCreatorCheck: true;\n}>(options?: O) => Tuple<ExcludeFromTuple<[ThunkMiddlewareFor<S, O>], never>>;\nexport const buildGetDefaultMiddleware = <S = any,>(): GetDefaultMiddleware<S> => function getDefaultMiddleware(options) {\n const {\n thunk = true,\n immutableCheck = true,\n serializableCheck = true,\n actionCreatorCheck = true\n } = options ?? {};\n let middlewareArray = new Tuple<Middleware[]>();\n if (thunk) {\n if (isBoolean(thunk)) {\n middlewareArray.push(thunkMiddleware);\n } else {\n middlewareArray.push(withExtraArgument(thunk.extraArgument));\n }\n }\n if (process.env.NODE_ENV !== 'production') {\n if (immutableCheck) {\n /* PROD_START_REMOVE_UMD */\n let immutableOptions: ImmutableStateInvariantMiddlewareOptions = {};\n if (!isBoolean(immutableCheck)) {\n immutableOptions = immutableCheck;\n }\n middlewareArray.unshift(createImmutableStateInvariantMiddleware(immutableOptions));\n /* PROD_STOP_REMOVE_UMD */\n }\n if (serializableCheck) {\n let serializableOptions: SerializableStateInvariantMiddlewareOptions = {};\n if (!isBoolean(serializableCheck)) {\n serializableOptions = serializableCheck;\n }\n middlewareArray.push(createSerializableStateInvariantMiddleware(serializableOptions));\n }\n if (actionCreatorCheck) {\n let actionCreatorOptions: ActionCreatorInvariantMiddlewareOptions = {};\n if (!isBoolean(actionCreatorCheck)) {\n actionCreatorOptions = actionCreatorCheck;\n }\n middlewareArray.unshift(createActionCreatorInvariantMiddleware(actionCreatorOptions));\n }\n }\n return middlewareArray as any;\n};","import type { StoreEnhancer } from 'redux';\nexport const SHOULD_AUTOBATCH = 'RTK_autoBatch';\nexport const prepareAutoBatched = <T,>() => (payload: T): {\n payload: T;\n meta: unknown;\n} => ({\n payload,\n meta: {\n [SHOULD_AUTOBATCH]: true\n }\n});\nconst createQueueWithTimer = (timeout: number) => {\n return (notify: () => void) => {\n setTimeout(notify, timeout);\n };\n};\nexport type AutoBatchOptions = {\n type: 'tick';\n} | {\n type: 'timer';\n timeout: number;\n} | {\n type: 'raf';\n} | {\n type: 'callback';\n queueNotification: (notify: () => void) => void;\n};\n\n/**\n * A Redux store enhancer that watches for \"low-priority\" actions, and delays\n * notifying subscribers until either the queued callback executes or the\n * next \"standard-priority\" action is dispatched.\n *\n * This allows dispatching multiple \"low-priority\" actions in a row with only\n * a single subscriber notification to the UI after the sequence of actions\n * is finished, thus improving UI re-render performance.\n *\n * Watches for actions with the `action.meta[SHOULD_AUTOBATCH]` attribute.\n * This can be added to `action.meta` manually, or by using the\n * `prepareAutoBatched` helper.\n *\n * By default, it will queue a notification for the end of the event loop tick.\n * However, you can pass several other options to configure the behavior:\n * - `{type: 'tick'}`: queues using `queueMicrotask`\n * - `{type: 'timer', timeout: number}`: queues using `setTimeout`\n * - `{type: 'raf'}`: queues using `requestAnimationFrame` (default)\n * - `{type: 'callback', queueNotification: (notify: () => void) => void}`: lets you provide your own callback\n *\n *\n */\nexport const autoBatchEnhancer = (options: AutoBatchOptions = {\n type: 'raf'\n}): StoreEnhancer => next => (...args) => {\n const store = next(...args);\n let notifying = true;\n let shouldNotifyAtEndOfTick = false;\n let notificationQueued = false;\n const listeners = new Set<() => void>();\n const queueCallback = options.type === 'tick' ? queueMicrotask : options.type === 'raf' ?\n // requestAnimationFrame won't exist in SSR environments. Fall back to a vague approximation just to keep from erroring.\n typeof window !== 'undefined' && window.requestAnimationFrame ? window.requestAnimationFrame : createQueueWithTimer(10) : options.type === 'callback' ? options.queueNotification : createQueueWithTimer(options.timeout);\n const notifyListeners = () => {\n // We're running at the end of the event loop tick.\n // Run the real listener callbacks to actually update the UI.\n notificationQueued = false;\n if (shouldNotifyAtEndOfTick) {\n shouldNotifyAtEndOfTick = false;\n listeners.forEach(l => l());\n }\n };\n return Object.assign({}, store, {\n // Override the base `store.subscribe` method to keep original listeners\n // from running if we're delaying notifications\n subscribe(listener: () => void) {\n // Each wrapped listener will only call the real listener if\n // the `notifying` flag is currently active when it's called.\n // This lets the base store work as normal, while the actual UI\n // update becomes controlled by this enhancer.\n const wrappedListener: typeof listener = () => notifying && listener();\n const unsubscribe = store.subscribe(wrappedListener);\n listeners.add(listener);\n return () => {\n unsubscribe();\n listeners.delete(listener);\n };\n },\n // Override the base `store.dispatch` method so that we can check actions\n // for the `shouldAutoBatch` flag and determine if batching is active\n dispatch(action: any) {\n try {\n // If the action does _not_ have the `shouldAutoBatch` flag,\n // we resume/continue normal notify-after-each-dispatch behavior\n notifying = !action?.meta?.[SHOULD_AUTOBATCH];\n // If a `notifyListeners` microtask was queued, you can't cancel it.\n // Instead, we set a flag so that it's a no-op when it does run\n shouldNotifyAtEndOfTick = !notifying;\n if (shouldNotifyAtEndOfTick) {\n // We've seen at least 1 action with `SHOULD_AUTOBATCH`. Try to queue\n // a microtask to notify listeners at the end of the event loop tick.\n // Make sure we only enqueue this _once_ per tick.\n if (!notificationQueued) {\n notificationQueued = true;\n queueCallback(notifyListeners);\n }\n }\n // Go ahead and process the action as usual, including reducers.\n // If normal notification behavior is enabled, the store will notify\n // all of its own listeners, and the wrapper callbacks above will\n // see `notifying` is true and pass on to the real listener callbacks.\n // If we're \"batching\" behavior, then the wrapped callbacks will\n // bail out, causing the base store notification behavior to be no-ops.\n return store.dispatch(action);\n } finally {\n // Assume we're back to normal behavior after each action\n notifying = true;\n }\n }\n });\n};","import type { StoreEnhancer } from 'redux';\nimport type { AutoBatchOptions } from './autoBatchEnhancer';\nimport { autoBatchEnhancer } from './autoBatchEnhancer';\nimport { Tuple } from './utils';\nimport type { Middlewares } from './configureStore';\nimport type { ExtractDispatchExtensions } from './tsHelpers';\ntype GetDefaultEnhancersOptions = {\n autoBatch?: boolean | AutoBatchOptions;\n};\nexport type GetDefaultEnhancers<M extends Middlewares<any>> = (options?: GetDefaultEnhancersOptions) => Tuple<[StoreEnhancer<{\n dispatch: ExtractDispatchExtensions<M>;\n}>]>;\nexport const buildGetDefaultEnhancers = <M extends Middlewares<any>,>(middlewareEnhancer: StoreEnhancer<{\n dispatch: ExtractDispatchExtensions<M>;\n}>): GetDefaultEnhancers<M> => function getDefaultEnhancers(options) {\n const {\n autoBatch = true\n } = options ?? {};\n let enhancerArray = new Tuple<StoreEnhancer[]>(middlewareEnhancer);\n if (autoBatch) {\n enhancerArray.push(autoBatchEnhancer(typeof autoBatch === 'object' ? autoBatch : undefined));\n }\n return enhancerArray as any;\n};","import { TaskAbortError } from './exceptions';\nimport type { AbortSignalWithReason, TaskResult } from './types';\nimport { addAbortSignalListener, catchRejection, noop } from './utils';\n\n/**\n * Synchronously raises {@link TaskAbortError} if the task tied to the input `signal` has been cancelled.\n * @param signal\n * @param reason\n * @see {TaskAbortError}\n */\nexport const validateActive = (signal: AbortSignal): void => {\n if (signal.aborted) {\n const {\n reason\n } = signal as AbortSignalWithReason<string>;\n throw new TaskAbortError(reason);\n }\n};\n\n/**\n * Generates a race between the promise(s) and the AbortSignal\n * This avoids `Promise.race()`-related memory leaks:\n * https://github.com/nodejs/node/issues/17469#issuecomment-349794909\n */\nexport function raceWithSignal<T>(signal: AbortSignalWithReason<string>, promise: Promise<T>): Promise<T> {\n let cleanup = noop;\n return new Promise<T>((resolve, reject) => {\n const notifyRejection = () => reject(new TaskAbortError(signal.reason));\n if (signal.aborted) {\n notifyRejection();\n return;\n }\n cleanup = addAbortSignalListener(signal, notifyRejection);\n promise.finally(() => cleanup()).then(resolve, reject);\n }).finally(() => {\n // after this point, replace `cleanup` with a noop, so there is no reference to `signal` any more\n cleanup = noop;\n });\n}\n\n/**\n * Runs a task and returns promise that resolves to {@link TaskResult}.\n * Second argument is an optional `cleanUp` function that always runs after task.\n *\n * **Note:** `runTask` runs the executor in the next microtask.\n * @returns\n */\nexport const runTask = async <T,>(task: () => Promise<T>, cleanUp?: () => void): Promise<TaskResult<T>> => {\n try {\n await Promise.resolve();\n const value = await task();\n return {\n status: 'ok',\n value\n };\n } catch (error: any) {\n return {\n status: error instanceof TaskAbortError ? 'cancelled' : 'rejected',\n error\n };\n } finally {\n cleanUp?.();\n }\n};\n\n/**\n * Given an input `AbortSignal` and a promise returns another promise that resolves\n * as soon the input promise is provided or rejects as soon as\n * `AbortSignal.abort` is `true`.\n * @param signal\n * @returns\n */\nexport const createPause = <T,>(signal: AbortSignal) => {\n return (promise: Promise<T>): Promise<T> => {\n return catchRejection(raceWithSignal(signal, promise).then(output => {\n validateActive(signal);\n return output;\n }));\n };\n};\n\n/**\n * Given an input `AbortSignal` and `timeoutMs` returns a promise that resolves\n * after `timeoutMs` or rejects as soon as `AbortSignal.abort` is `true`.\n * @param signal\n * @returns\n */\nexport const createDelay = (signal: AbortSignal) => {\n const pause = createPause<void>(signal);\n return (timeoutMs: number): Promise<void> => {\n return pause(new Promise<void>(resolve => setTimeout(resolve, timeoutMs)));\n };\n};","import { formatProdErrorMessage as _formatProdErrorMessage, formatProdErrorMessage as _formatProdErrorMessage2, formatProdErrorMessage as _formatProdErrorMessage3 } from \"@reduxjs/toolkit\";\nimport type { Action, Dispatch, MiddlewareAPI, UnknownAction } from 'redux';\nimport { isAction } from 'redux';\nimport type { ThunkDispatch } from 'redux-thunk';\nimport { createAction } from '../createAction';\nimport { nanoid } from '../nanoid';\nimport { TaskAbortError, listenerCancelled, listenerCompleted, taskCancelled, taskCompleted } from './exceptions';\nimport { createDelay, createPause, raceWithSignal, runTask, validateActive } from './task';\nimport type { AbortSignalWithReason, AddListenerOverloads, AnyListenerPredicate, CreateListenerMiddlewareOptions, FallbackAddListenerOptions, ForkOptions, ForkedTask, ForkedTaskExecutor, ListenerEntry, ListenerErrorHandler, ListenerErrorInfo, ListenerMiddleware, ListenerMiddlewareInstance, TakePattern, TaskResult, TypedAddListener, TypedCreateListenerEntry, TypedRemoveListener, UnsubscribeListener, UnsubscribeListenerOptions } from './types';\nimport { abortControllerWithReason, addAbortSignalListener, assertFunction, catchRejection, noop } from './utils';\nexport { TaskAbortError } from './exceptions';\nexport type { AsyncTaskExecutor, CreateListenerMiddlewareOptions, ForkedTask, ForkedTaskAPI, ForkedTaskExecutor, ListenerEffect, ListenerEffectAPI, ListenerErrorHandler, ListenerMiddleware, ListenerMiddlewareInstance, SyncTaskExecutor, TaskCancelled, TaskRejected, TaskResolved, TaskResult, TypedAddListener, TypedRemoveListener, TypedStartListening, TypedStopListening, UnsubscribeListener, UnsubscribeListenerOptions } from './types';\n\n//Overly-aggressive byte-shaving\nconst {\n assign\n} = Object;\n/**\n * @internal\n */\nconst INTERNAL_NIL_TOKEN = {} as const;\nconst alm = 'listenerMiddleware' as const;\nconst createFork = (parentAbortSignal: AbortSignalWithReason<unknown>, parentBlockingPromises: Promise<any>[]) => {\n const linkControllers = (controller: AbortController) => addAbortSignalListener(parentAbortSignal, () => abortControllerWithReason(controller, parentAbortSignal.reason));\n return <T,>(taskExecutor: ForkedTaskExecutor<T>, opts?: ForkOptions): ForkedTask<T> => {\n assertFunction(taskExecutor, 'taskExecutor');\n const childAbortController = new AbortController();\n linkControllers(childAbortController);\n const result = runTask<T>(async (): Promise<T> => {\n validateActive(parentAbortSignal);\n validateActive(childAbortController.signal);\n const result = (await taskExecutor({\n pause: createPause(childAbortController.signal),\n delay: createDelay(childAbortController.signal),\n signal: childAbortController.signal\n })) as T;\n validateActive(childAbortController.signal);\n return result;\n }, () => abortControllerWithReason(childAbortController, taskCompleted));\n if (opts?.autoJoin) {\n parentBlockingPromises.push(result.catch(noop));\n }\n return {\n result: createPause<TaskResult<T>>(parentAbortSignal)(result),\n cancel() {\n abortControllerWithReason(childAbortController, taskCancelled);\n }\n };\n };\n};\nconst createTakePattern = <S,>(startListening: AddListenerOverloads<UnsubscribeListener, S, Dispatch>, signal: AbortSignal): TakePattern<S> => {\n /**\n * A function that takes a ListenerPredicate and an optional timeout,\n * and resolves when either the predicate returns `true` based on an action\n * state combination or when the timeout expires.\n * If the parent listener is canceled while waiting, this will throw a\n * TaskAbortError.\n */\n const take = async <P extends AnyListenerPredicate<S>,>(predicate: P, timeout: number | undefined) => {\n validateActive(signal);\n\n // Placeholder unsubscribe function until the listener is added\n let unsubscribe: UnsubscribeListener = () => {};\n const tuplePromise = new Promise<[Action, S, S]>((resolve, reject) => {\n // Inside the Promise, we synchronously add the listener.\n let stopListening = startListening({\n predicate: predicate as any,\n effect: (action, listenerApi): void => {\n // One-shot listener that cleans up as soon as the predicate passes\n listenerApi.unsubscribe();\n // Resolve the promise with the same arguments the predicate saw\n resolve([action, listenerApi.getState(), listenerApi.getOriginalState()]);\n }\n });\n unsubscribe = () => {\n stopListening();\n reject();\n };\n });\n const promises: (Promise<null> | Promise<[Action, S, S]>)[] = [tuplePromise];\n if (timeout != null) {\n promises.push(new Promise<null>(resolve => setTimeout(resolve, timeout, null)));\n }\n try {\n const output = await raceWithSignal(signal, Promise.race(promises));\n validateActive(signal);\n return output;\n } finally {\n // Always clean up the listener\n unsubscribe();\n }\n };\n return ((predicate: AnyListenerPredicate<S>, timeout: number | undefined) => catchRejection(take(predicate, timeout))) as TakePattern<S>;\n};\nconst getListenerEntryPropsFrom = (options: FallbackAddListenerOptions) => {\n let {\n type,\n actionCreator,\n matcher,\n predicate,\n effect\n } = options;\n if (type) {\n predicate = createAction(type).match;\n } else if (actionCreator) {\n type = actionCreator!.type;\n predicate = actionCreator.match;\n } else if (matcher) {\n predicate = matcher;\n } else if (predicate) {\n // pass\n } else {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage(21) : 'Creating or removing a listener requires one of the known fields for matching an action');\n }\n assertFunction(effect, 'options.listener');\n return {\n predicate,\n type,\n effect\n };\n};\n\n/** Accepts the possible options for creating a listener, and returns a formatted listener entry */\nexport const createListenerEntry: TypedCreateListenerEntry<unknown> = /* @__PURE__ */assign((options: FallbackAddListenerOptions) => {\n const {\n type,\n predicate,\n effect\n } = getListenerEntryPropsFrom(options);\n const entry: ListenerEntry<unknown> = {\n id: nanoid(),\n effect,\n type,\n predicate,\n pending: new Set<AbortController>(),\n unsubscribe: () => {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage2(22) : 'Unsubscribe not initialized');\n }\n };\n return entry;\n}, {\n withTypes: () => createListenerEntry\n}) as unknown as TypedCreateListenerEntry<unknown>;\nconst findListenerEntry = (listenerMap: Map<string, ListenerEntry>, options: FallbackAddListenerOptions) => {\n const {\n type,\n effect,\n predicate\n } = getListenerEntryPropsFrom(options);\n return Array.from(listenerMap.values()).find(entry => {\n const matchPredicateOrType = typeof type === 'string' ? entry.type === type : entry.predicate === predicate;\n return matchPredicateOrType && entry.effect === effect;\n });\n};\nconst cancelActiveListeners = (entry: ListenerEntry<unknown, Dispatch<UnknownAction>>) => {\n entry.pending.forEach(controller => {\n abortControllerWithReason(controller, listenerCancelled);\n });\n};\nconst createClearListenerMiddleware = (listenerMap: Map<string, ListenerEntry>) => {\n return () => {\n listenerMap.forEach(cancelActiveListeners);\n listenerMap.clear();\n };\n};\n\n/**\n * Safely reports errors to the `errorHandler` provided.\n * Errors that occur inside `errorHandler` are notified in a new task.\n * Inspired by [rxjs reportUnhandledError](https://github.com/ReactiveX/rxjs/blob/6fafcf53dc9e557439b25debaeadfd224b245a66/src/internal/util/reportUnhandledError.ts)\n * @param errorHandler\n * @param errorToNotify\n */\nconst safelyNotifyError = (errorHandler: ListenerErrorHandler, errorToNotify: unknown, errorInfo: ListenerErrorInfo): void => {\n try {\n errorHandler(errorToNotify, errorInfo);\n } catch (errorHandlerError) {\n // We cannot let an error raised here block the listener queue.\n // The error raised here will be picked up by `window.onerror`, `process.on('error')` etc...\n setTimeout(() => {\n throw errorHandlerError;\n }, 0);\n }\n};\n\n/**\n * @public\n */\nexport const addListener = /* @__PURE__ */assign(/* @__PURE__ */createAction(`${alm}/add`), {\n withTypes: () => addListener\n}) as unknown as TypedAddListener<unknown>;\n\n/**\n * @public\n */\nexport const clearAllListeners = /* @__PURE__ */createAction(`${alm}/removeAll`);\n\n/**\n * @public\n */\nexport const removeListener = /* @__PURE__ */assign(/* @__PURE__ */createAction(`${alm}/remove`), {\n withTypes: () => removeListener\n}) as unknown as TypedRemoveListener<unknown>;\nconst defaultErrorHandler: ListenerErrorHandler = (...args: unknown[]) => {\n console.error(`${alm}/error`, ...args);\n};\n\n/**\n * @public\n */\nexport const createListenerMiddleware = <StateType = unknown, DispatchType extends Dispatch<Action> = ThunkDispatch<StateType, unknown, UnknownAction>, ExtraArgument = unknown>(middlewareOptions: CreateListenerMiddlewareOptions<ExtraArgument> = {}) => {\n const listenerMap = new Map<string, ListenerEntry>();\n const {\n extra,\n onError = defaultErrorHandler\n } = middlewareOptions;\n assertFunction(onError, 'onError');\n const insertEntry = (entry: ListenerEntry) => {\n entry.unsubscribe = () => listenerMap.delete(entry.id);\n listenerMap.set(entry.id, entry);\n return (cancelOptions?: UnsubscribeListenerOptions) => {\n entry.unsubscribe();\n if (cancelOptions?.cancelActive) {\n cancelActiveListeners(entry);\n }\n };\n };\n const startListening = ((options: FallbackAddListenerOptions) => {\n const entry = findListenerEntry(listenerMap, options) ?? createListenerEntry(options as any);\n return insertEntry(entry);\n }) as AddListenerOverloads<any>;\n assign(startListening, {\n withTypes: () => startListening\n });\n const stopListening = (options: FallbackAddListenerOptions & UnsubscribeListenerOptions): boolean => {\n const entry = findListenerEntry(listenerMap, options);\n if (entry) {\n entry.unsubscribe();\n if (options.cancelActive) {\n cancelActiveListeners(entry);\n }\n }\n return !!entry;\n };\n assign(stopListening, {\n withTypes: () => stopListening\n });\n const notifyListener = async (entry: ListenerEntry<unknown, Dispatch<UnknownAction>>, action: unknown, api: MiddlewareAPI, getOriginalState: () => StateType) => {\n const internalTaskController = new AbortController();\n const take = createTakePattern(startListening as AddListenerOverloads<any>, internalTaskController.signal);\n const autoJoinPromises: Promise<any>[] = [];\n try {\n entry.pending.add(internalTaskController);\n await Promise.resolve(entry.effect(action,\n // Use assign() rather than ... to avoid extra helper functions added to bundle\n assign({}, api, {\n getOriginalState,\n condition: (predicate: AnyListenerPredicate<any>, timeout?: number) => take(predicate, timeout).then(Boolean),\n take,\n delay: createDelay(internalTaskController.signal),\n pause: createPause<any>(internalTaskController.signal),\n extra,\n signal: internalTaskController.signal,\n fork: createFork(internalTaskController.signal, autoJoinPromises),\n unsubscribe: entry.unsubscribe,\n subscribe: () => {\n listenerMap.set(entry.id, entry);\n },\n cancelActiveListeners: () => {\n entry.pending.forEach((controller, _, set) => {\n if (controller !== internalTaskController) {\n abortControllerWithReason(controller, listenerCancelled);\n set.delete(controller);\n }\n });\n },\n cancel: () => {\n abortControllerWithReason(internalTaskController, listenerCancelled);\n entry.pending.delete(internalTaskController);\n },\n throwIfCancelled: () => {\n validateActive(internalTaskController.signal);\n }\n })));\n } catch (listenerError) {\n if (!(listenerError instanceof TaskAbortError)) {\n safelyNotifyError(onError, listenerError, {\n raisedBy: 'effect'\n });\n }\n } finally {\n await Promise.all(autoJoinPromises);\n abortControllerWithReason(internalTaskController, listenerCompleted); // Notify that the task has completed\n entry.pending.delete(internalTaskController);\n }\n };\n const clearListenerMiddleware = createClearListenerMiddleware(listenerMap);\n const middleware: ListenerMiddleware<StateType, DispatchType, ExtraArgument> = api => next => action => {\n if (!isAction(action)) {\n // we only want to notify listeners for action objects\n return next(action);\n }\n if (addListener.match(action)) {\n return startListening(action.payload as any);\n }\n if (clearAllListeners.match(action)) {\n clearListenerMiddleware();\n return;\n }\n if (removeListener.match(action)) {\n return stopListening(action.payload);\n }\n\n // Need to get this state _before_ the reducer processes the action\n let originalState: StateType | typeof INTERNAL_NIL_TOKEN = api.getState();\n\n // `getOriginalState` can only be called synchronously.\n // @see https://github.com/reduxjs/redux-toolkit/discussions/1648#discussioncomment-1932820\n const getOriginalState = (): StateType => {\n if (originalState === INTERNAL_NIL_TOKEN) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage3(23) : `${alm}: getOriginalState can only be called synchronously`);\n }\n return originalState as StateType;\n };\n let result: unknown;\n try {\n // Actually forward the action to the reducer before we handle listeners\n result = next(action);\n if (listenerMap.size > 0) {\n const currentState = api.getState();\n // Work around ESBuild+TS transpilation issue\n const listenerEntries = Array.from(listenerMap.values());\n for (const entry of listenerEntries) {\n let runListener = false;\n try {\n runListener = entry.predicate(action, currentState, originalState);\n } catch (predicateError) {\n runListener = false;\n safelyNotifyError(onError, predicateError, {\n raisedBy: 'predicate'\n });\n }\n if (!runListener) {\n continue;\n }\n notifyListener(entry, action, api, getOriginalState);\n }\n }\n } finally {\n // Remove `originalState` store from this scope.\n originalState = INTERNAL_NIL_TOKEN;\n }\n return result;\n };\n return {\n middleware,\n startListening,\n stopListening,\n clearListeners: clearListenerMiddleware\n } as ListenerMiddlewareInstance<StateType, DispatchType, ExtraArgument>;\n};","import { formatProdErrorMessage as _formatProdErrorMessage, formatProdErrorMessage as _formatProdErrorMessage2 } from \"@reduxjs/toolkit\";\nimport type { Reducer, StateFromReducersMapObject, UnknownAction } from 'redux';\nimport { combineReducers } from 'redux';\nimport { nanoid } from './nanoid';\nimport type { Id, NonUndefined, Tail, UnionToIntersection, WithOptionalProp } from './tsHelpers';\nimport { getOrInsertComputed } from './utils';\ntype SliceLike<ReducerPath extends string, State> = {\n reducerPath: ReducerPath;\n reducer: Reducer<State>;\n};\ntype AnySliceLike = SliceLike<string, any>;\ntype SliceLikeReducerPath<A extends AnySliceLike> = A extends SliceLike<infer ReducerPath, any> ? ReducerPath : never;\ntype SliceLikeState<A extends AnySliceLike> = A extends SliceLike<any, infer State> ? State : never;\nexport type WithSlice<A extends AnySliceLike> = { [Path in SliceLikeReducerPath<A>]: SliceLikeState<A> };\ntype ReducerMap = Record<string, Reducer>;\ntype ExistingSliceLike<DeclaredState> = { [ReducerPath in keyof DeclaredState]: SliceLike<ReducerPath & string, NonUndefined<DeclaredState[ReducerPath]>> }[keyof DeclaredState];\nexport type InjectConfig = {\n /**\n * Allow replacing reducer with a different reference. Normally, an error will be thrown if a different reducer instance to the one already injected is used.\n */\n overrideExisting?: boolean;\n};\n\n/**\n * A reducer that allows for slices/reducers to be injected after initialisation.\n */\nexport interface CombinedSliceReducer<InitialState, DeclaredState = InitialState> extends Reducer<DeclaredState, UnknownAction, Partial<DeclaredState>> {\n /**\n * Provide a type for slices that will be injected lazily.\n *\n * One way to do this would be with interface merging:\n * ```ts\n *\n * export interface LazyLoadedSlices {}\n *\n * export const rootReducer = combineSlices(stringSlice).withLazyLoadedSlices<LazyLoadedSlices>();\n *\n * // elsewhere\n *\n * declare module './reducer' {\n * export interface LazyLoadedSlices extends WithSlice<typeof booleanSlice> {}\n * }\n *\n * const withBoolean = rootReducer.inject(booleanSlice);\n *\n * // elsewhere again\n *\n * declare module './reducer' {\n * export interface LazyLoadedSlices {\n * customName: CustomState\n * }\n * }\n *\n * const withCustom = rootReducer.inject({ reducerPath: \"customName\", reducer: customSlice.reducer })\n * ```\n */\n withLazyLoadedSlices<Lazy = {}>(): CombinedSliceReducer<InitialState, Id<DeclaredState & Partial<Lazy>>>;\n\n /**\n * Inject a slice.\n *\n * Accepts an individual slice, RTKQ API instance, or a \"slice-like\" { reducerPath, reducer } object.\n *\n * ```ts\n * rootReducer.inject(booleanSlice)\n * rootReducer.inject(baseApi)\n * rootReducer.inject({ reducerPath: 'boolean' as const, reducer: newReducer }, { overrideExisting: true })\n * ```\n *\n */\n inject<Sl extends Id<ExistingSliceLike<DeclaredState>>>(slice: Sl, config?: InjectConfig): CombinedSliceReducer<InitialState, Id<DeclaredState & WithSlice<Sl>>>;\n\n /**\n * Inject a slice.\n *\n * Accepts an individual slice, RTKQ API instance, or a \"slice-like\" { reducerPath, reducer } object.\n *\n * ```ts\n * rootReducer.inject(booleanSlice)\n * rootReducer.inject(baseApi)\n * rootReducer.inject({ reducerPath: 'boolean' as const, reducer: newReducer }, { overrideExisting: true })\n * ```\n *\n */\n inject<ReducerPath extends string, State>(slice: SliceLike<ReducerPath, State & (ReducerPath extends keyof DeclaredState ? never : State)>, config?: InjectConfig): CombinedSliceReducer<InitialState, Id<DeclaredState & WithSlice<SliceLike<ReducerPath, State>>>>;\n\n /**\n * Create a selector that guarantees that the slices injected will have a defined value when selector is run.\n *\n * ```ts\n * const selectBooleanWithoutInjection = (state: RootState) => state.boolean;\n * // ^? boolean | undefined\n *\n * const selectBoolean = rootReducer.inject(booleanSlice).selector((state) => {\n * // if action hasn't been dispatched since slice was injected, this would usually be undefined\n * // however selector() uses a Proxy around the first parameter to ensure that it evaluates to the initial state instead, if undefined\n * return state.boolean;\n * // ^? boolean\n * })\n * ```\n *\n * If the reducer is nested inside the root state, a selectState callback can be passed to retrieve the reducer's state.\n *\n * ```ts\n *\n * export interface LazyLoadedSlices {};\n *\n * export const innerReducer = combineSlices(stringSlice).withLazyLoadedSlices<LazyLoadedSlices>();\n *\n * export const rootReducer = combineSlices({ inner: innerReducer });\n *\n * export type RootState = ReturnType<typeof rootReducer>;\n *\n * // elsewhere\n *\n * declare module \"./reducer.ts\" {\n * export interface LazyLoadedSlices extends WithSlice<typeof booleanSlice> {}\n * }\n *\n * const withBool = innerReducer.inject(booleanSlice);\n *\n * const selectBoolean = withBool.selector(\n * (state) => state.boolean,\n * (rootState: RootState) => state.inner\n * );\n * // now expects to be passed RootState instead of innerReducer state\n *\n * ```\n *\n * Value passed to selectorFn will be a Proxy - use selector.original(proxy) to get original state value (useful for debugging)\n *\n * ```ts\n * const injectedReducer = rootReducer.inject(booleanSlice);\n * const selectBoolean = injectedReducer.selector((state) => {\n * console.log(injectedReducer.selector.original(state).boolean) // possibly undefined\n * return state.boolean\n * })\n * ```\n */\n selector: {\n /**\n * Create a selector that guarantees that the slices injected will have a defined value when selector is run.\n *\n * ```ts\n * const selectBooleanWithoutInjection = (state: RootState) => state.boolean;\n * // ^? boolean | undefined\n *\n * const selectBoolean = rootReducer.inject(booleanSlice).selector((state) => {\n * // if action hasn't been dispatched since slice was injected, this would usually be undefined\n * // however selector() uses a Proxy around the first parameter to ensure that it evaluates to the initial state instead, if undefined\n * return state.boolean;\n * // ^? boolean\n * })\n * ```\n *\n * Value passed to selectorFn will be a Proxy - use selector.original(proxy) to get original state value (useful for debugging)\n *\n * ```ts\n * const injectedReducer = rootReducer.inject(booleanSlice);\n * const selectBoolean = injectedReducer.selector((state) => {\n * console.log(injectedReducer.selector.original(state).boolean) // undefined\n * return state.boolean\n * })\n * ```\n */\n <Selector extends (state: DeclaredState, ...args: any[]) => unknown>(selectorFn: Selector): (state: WithOptionalProp<Parameters<Selector>[0], Exclude<keyof DeclaredState, keyof InitialState>>, ...args: Tail<Parameters<Selector>>) => ReturnType<Selector>;\n\n /**\n * Create a selector that guarantees that the slices injected will have a defined value when selector is run.\n *\n * ```ts\n * const selectBooleanWithoutInjection = (state: RootState) => state.boolean;\n * // ^? boolean | undefined\n *\n * const selectBoolean = rootReducer.inject(booleanSlice).selector((state) => {\n * // if action hasn't been dispatched since slice was injected, this would usually be undefined\n * // however selector() uses a Proxy around the first parameter to ensure that it evaluates to the initial state instead, if undefined\n * return state.boolean;\n * // ^? boolean\n * })\n * ```\n *\n * If the reducer is nested inside the root state, a selectState callback can be passed to retrieve the reducer's state.\n *\n * ```ts\n *\n * interface LazyLoadedSlices {};\n *\n * const innerReducer = combineSlices(stringSlice).withLazyLoadedSlices<LazyLoadedSlices>();\n *\n * const rootReducer = combineSlices({ inner: innerReducer });\n *\n * type RootState = ReturnType<typeof rootReducer>;\n *\n * // elsewhere\n *\n * declare module \"./reducer.ts\" {\n * interface LazyLoadedSlices extends WithSlice<typeof booleanSlice> {}\n * }\n *\n * const withBool = innerReducer.inject(booleanSlice);\n *\n * const selectBoolean = withBool.selector(\n * (state) => state.boolean,\n * (rootState: RootState) => state.inner\n * );\n * // now expects to be passed RootState instead of innerReducer state\n *\n * ```\n *\n * Value passed to selectorFn will be a Proxy - use selector.original(proxy) to get original state value (useful for debugging)\n *\n * ```ts\n * const injectedReducer = rootReducer.inject(booleanSlice);\n * const selectBoolean = injectedReducer.selector((state) => {\n * console.log(injectedReducer.selector.original(state).boolean) // possibly undefined\n * return state.boolean\n * })\n * ```\n */\n <Selector extends (state: DeclaredState, ...args: any[]) => unknown, RootState>(selectorFn: Selector, selectState: (rootState: RootState, ...args: Tail<Parameters<Selector>>) => WithOptionalProp<Parameters<Selector>[0], Exclude<keyof DeclaredState, keyof InitialState>>): (state: RootState, ...args: Tail<Parameters<Selector>>) => ReturnType<Selector>;\n /**\n * Returns the unproxied state. Useful for debugging.\n * @param state state Proxy, that ensures injected reducers have value\n * @returns original, unproxied state\n * @throws if value passed is not a state Proxy\n */\n original: (state: DeclaredState) => InitialState & Partial<DeclaredState>;\n };\n}\ntype InitialState<Slices extends Array<AnySliceLike | ReducerMap>> = UnionToIntersection<Slices[number] extends infer Slice ? Slice extends AnySliceLike ? WithSlice<Slice> : StateFromReducersMapObject<Slice> : never>;\nconst isSliceLike = (maybeSliceLike: AnySliceLike | ReducerMap): maybeSliceLike is AnySliceLike => 'reducerPath' in maybeSliceLike && typeof maybeSliceLike.reducerPath === 'string';\nconst getReducers = (slices: Array<AnySliceLike | ReducerMap>) => slices.flatMap(sliceOrMap => isSliceLike(sliceOrMap) ? [[sliceOrMap.reducerPath, sliceOrMap.reducer] as const] : Object.entries(sliceOrMap));\nconst ORIGINAL_STATE = Symbol.for('rtk-state-proxy-original');\nconst isStateProxy = (value: any) => !!value && !!value[ORIGINAL_STATE];\nconst stateProxyMap = new WeakMap<object, object>();\nconst createStateProxy = <State extends object,>(state: State, reducerMap: Partial<Record<string, Reducer>>) => getOrInsertComputed(stateProxyMap, state, () => new Proxy(state, {\n get: (target, prop, receiver) => {\n if (prop === ORIGINAL_STATE) return target;\n const result = Reflect.get(target, prop, receiver);\n if (typeof result === 'undefined') {\n const reducer = reducerMap[prop.toString()];\n if (reducer) {\n // ensure action type is random, to prevent reducer treating it differently\n const reducerResult = reducer(undefined, {\n type: nanoid()\n });\n if (typeof reducerResult === 'undefined') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage(24) : `The slice reducer for key \"${prop.toString()}\" returned undefined when called for selector(). ` + `If the state passed to the reducer is undefined, you must ` + `explicitly return the initial state. The initial state may ` + `not be undefined. If you don't want to set a value for this reducer, ` + `you can use null instead of undefined.`);\n }\n return reducerResult;\n }\n }\n return result;\n }\n})) as State;\nconst original = (state: any) => {\n if (!isStateProxy(state)) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage2(25) : 'original must be used on state Proxy');\n }\n return state[ORIGINAL_STATE];\n};\nconst noopReducer: Reducer<Record<string, any>> = (state = {}) => state;\nexport function combineSlices<Slices extends Array<AnySliceLike | ReducerMap>>(...slices: Slices): CombinedSliceReducer<Id<InitialState<Slices>>> {\n const reducerMap = Object.fromEntries<Reducer>(getReducers(slices));\n const getReducer = () => Object.keys(reducerMap).length ? combineReducers(reducerMap) : noopReducer;\n let reducer = getReducer();\n function combinedReducer(state: Record<string, unknown>, action: UnknownAction) {\n return reducer(state, action);\n }\n combinedReducer.withLazyLoadedSlices = () => combinedReducer;\n const inject = (slice: AnySliceLike, config: InjectConfig = {}): typeof combinedReducer => {\n const {\n reducerPath,\n reducer: reducerToInject\n } = slice;\n const currentReducer = reducerMap[reducerPath];\n if (!config.overrideExisting && currentReducer && currentReducer !== reducerToInject) {\n if (typeof process !== 'undefined' && process.env.NODE_ENV === 'development') {\n console.error(`called \\`inject\\` to override already-existing reducer ${reducerPath} without specifying \\`overrideExisting: true\\``);\n }\n return combinedReducer;\n }\n reducerMap[reducerPath] = reducerToInject;\n reducer = getReducer();\n return combinedReducer;\n };\n const selector = Object.assign(function makeSelector<State extends object, RootState, Args extends any[]>(selectorFn: (state: State, ...args: Args) => any, selectState?: (rootState: RootState, ...args: Args) => State) {\n return function selector(state: State, ...args: Args) {\n return selectorFn(createStateProxy(selectState ? selectState(state as any, ...args) : state, reducerMap), ...args);\n };\n }, {\n original\n });\n return Object.assign(combinedReducer, {\n inject,\n selector\n }) as any;\n}","/**\n * Adapted from React: https://github.com/facebook/react/blob/master/packages/shared/formatProdErrorMessage.js\n *\n * Do not require this module directly! Use normal throw error calls. These messages will be replaced with error codes\n * during build.\n * @param {number} code\n */\nexport function formatProdErrorMessage(code: number) {\n return `Minified Redux Toolkit error #${code}; visit https://redux-toolkit.js.org/Errors?code=${code} for the full message or ` + 'use the non-minified dev environment for full errors. ';\n}","/* @flow */\n\nimport type { CombinedReducers } from '../../../reducers';\nimport type { Dispatch } from '../../../types/types';\nimport type { NETGEM_API_V8_URL_DEFINITION } from '../../../../libs/netgemLibrary/v8/types/NtgVideoFeed';\nimport type { RequestResponseMethodDefinitionType } from '../emitter';\nimport { SECONDS_PER_DAY } from '../../../../helpers/dateTime/Format';\nimport { createCustomNetworkErrorFromKey } from '../../../../libs/netgemLibrary/helpers/CreateCustomNetworkError';\nimport { fetchJsonWithErrorCheck } from '../../../../helpers/jsHelpers/xhr';\nimport { generateApiUrl } from '../helpers/api';\nimport { logError } from '../../../../helpers/debug/debug';\nimport { updateConfiguration } from '../../../appConf/actions';\n\nconst sendV8AppConfigurationRequest: (overriddenUrl: string) => RequestResponseMethodDefinitionType =\n (overriddenUrl) =>\n async (dispatch: Dispatch, getState: () => CombinedReducers): Promise<any> => {\n const state = getState();\n const uri = overriddenUrl || (process.env.REACT_APP_CONFIGURATION_URL ?? '');\n\n if (uri === '') {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definition', { urlDef: 'appConfigurationUrl' }));\n }\n\n const appConfigurationUrl: NETGEM_API_V8_URL_DEFINITION = {\n authent: false,\n params: [\n {\n name: 'date',\n value: {\n args: [SECONDS_PER_DAY],\n op: 'now',\n },\n },\n {\n name: 'lang',\n value: {\n args: [],\n op: 'lang',\n },\n },\n ],\n uri,\n };\n\n const builtUri = generateApiUrl(appConfigurationUrl, {}, state);\n\n try {\n const { didomi, locales, ...configuration } = await fetchJsonWithErrorCheck(builtUri);\n\n // Special HTML app case\n const { htmlLoginUrl } = configuration;\n if (htmlLoginUrl) {\n configuration.loginUrl = htmlLoginUrl;\n }\n\n dispatch(updateConfiguration(configuration, didomi, locales));\n return true;\n } catch (error) {\n if (error instanceof SyntaxError) {\n logError('Error parsing AppConf');\n }\n logError(error);\n return false;\n }\n };\n\nexport default sendV8AppConfigurationRequest;\n","/* @flow */\n\nimport * as React from 'react';\nimport ApplicationContainer, { ApplicationState, ErrorType } from './components/mainView/ApplicationContainer';\nimport { Messenger, MessengerEvents } from '@ntg/utils/dist/messenger';\nimport { RegistrationType, type UserDeviceInfoType } from './redux/appRegistration/types/types';\nimport { emit, initialize as ntgApiInitialize } from './redux/netgemApi/actions/emitter';\nimport { registerApplication, setDeviceId } from './redux/appRegistration/actions';\nimport { updateDebugMode, updateDeviceOS, updateUtmParameters } from './redux/appConf/actions';\nimport AccurateTimestamp from './helpers/dateTime/AccurateTimestamp';\nimport EpgManager from './helpers/epg/epgManager';\nimport { I18nextProvider } from 'react-i18next';\nimport type { KeyValuePair } from '@ntg/utils/dist/types';\nimport LocalStorageManager from './helpers/localStorage/localStorageManager';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport { InitialState as NetgemApiDefaultState } from './redux/netgemApi/reducers';\nimport { Provider } from 'react-redux';\nimport { StorageKeys } from './helpers/localStorage/keys';\nimport { ToastContainer } from 'react-toastify';\nimport allReducers from './redux/reducers';\nimport { configureStore } from '@reduxjs/toolkit';\nimport { deleteOptimisticData } from './helpers/localStorage/optimisticData';\nimport { detect as detectBrowser } from 'detect-browser';\nimport { detectDrm } from './helpers/jsHelpers/Drm';\nimport { enableMapSet } from 'immer';\nimport { getDeviceOS } from './helpers/dms/helper';\nimport { isRunningOnMobileBrowser } from './helpers/jsHelpers/environment';\nimport { isWhitelisted } from './helpers/jsHelpers/robots';\nimport sendV8AppConfigurationRequest from './redux/netgemApi/actions/v8/appConfiguration';\nimport { updateDisplayPaywallSubscription } from './redux/ui/actions';\nimport { verifyAndDecryptToken } from './helpers/crypto/crypto';\n\n// Using Map and Set with immer require initialization\nenableMapSet();\n\n// How long data cached in local storage can be considered as valid (30 days in milliseconds)\nconst CACHED_DATA_TTL = 2_592_000_000;\n\n// Max number of notifications displayed at the same time\nconst MAX_DISPLAYED_NOTIFICATION_COUNT = 5;\n\nconst initialState = Object.freeze({\n netgemApi: NetgemApiDefaultState,\n});\n\n// Create Redux store\nconst store = configureStore({\n middleware: (getDefaultMiddleware) =>\n getDefaultMiddleware({\n thunk: { extraArgument: { emit } },\n }),\n preloadedState: initialState,\n reducer: allReducers,\n});\n\nntgApiInitialize(store);\n\nEpgManager.initialize(store);\n\ntype AppPropType = {||};\n\ntype AppStateType = {|\n +initialAppError?: ErrorType,\n +initialAppState?: ApplicationState,\n|};\n\nconst InitialState = Object.freeze({\n initialAppError: undefined,\n initialAppState: undefined,\n});\n\nclass App extends React.PureComponent<AppPropType, AppStateType> {\n constructor(props: AppPropType) {\n super(props);\n\n this.state = { ...InitialState };\n\n // Clean up temporary data in local storage\n LocalStorageManager.delete(\n // Any pending operation (play, add to wishlist, etc.)\n StorageKeys.PendingOperation,\n // Saved expanded item index from series card\n StorageKeys.CardExpandedItemIndex,\n // CRM data (mainly used on paywalls)\n StorageKeys.CrmData,\n );\n }\n\n componentDidMount() {\n if (isWhitelisted()) {\n // Google or PageSpeed bot detected: allow it to render app without checking DRM or anything else\n this.initialize(ApplicationState.Initializing);\n return;\n }\n\n this.checkCompatibleDevice().then(this.initialize);\n }\n\n checkCompatibleDevice: () => Promise<ApplicationState> = () => {\n if (isRunningOnMobileBrowser()) {\n // Mobile/tablet detected\n return Promise.resolve(ApplicationState.RunningOnMobile);\n }\n\n // Check is browser supports our DRMs\n return detectDrm().catch(() => Promise.resolve(ApplicationState.BrowserNotCompatible));\n };\n\n initialize: (appState?: ApplicationState) => void = (appState) => {\n if (appState === ApplicationState.RunningOnMobile || appState === ApplicationState.BrowserNotCompatible) {\n // App will not work here\n this.getAppConfiguration().then(() => this.setState({ initialAppState: appState }));\n return;\n }\n\n // Check for cached data reset\n if (this.isResetRequested()) {\n this.cleanUpQueryString();\n LocalStorageManager.clear();\n }\n\n // Store device OS\n store.dispatch(updateDeviceOS(getDeviceOS()));\n\n // Check for debug mode setting\n this.checkDebugMode();\n\n // Clean up if stored data is too old\n const now = AccurateTimestamp.now();\n const lastStartup = LocalStorageManager.loadNumber(StorageKeys.LastStartup, now);\n if (lastStartup + CACHED_DATA_TTL < now) {\n // Too old\n deleteOptimisticData();\n }\n\n LocalStorageManager.save(StorageKeys.LastStartup, now);\n\n // Store in local storage data collection messages before exiting\n window.addEventListener('beforeunload', () => Messenger.emit(MessengerEvents.STASH_COLLECTOR), { passive: true });\n\n Promise.all([this.checkDeviceIdAndUserInfo(), this.getAppConfiguration()]).then((results) => {\n const [deviceAndUser, isAppConfigurationLoaded] = results;\n\n if (!isAppConfigurationLoaded) {\n // Major problem\n this.setState({\n initialAppError: ErrorType.AppConfFailure,\n initialAppState: ApplicationState.Error,\n });\n return;\n }\n\n const {\n appConfiguration: { isGuestModeAllowed },\n appRegistration: { registration },\n } = store.getState();\n\n // Store UTM parameters for later use in CRM front\n store.dispatch(updateUtmParameters(this.getUtmParameters()));\n\n // Check if subscription paywall should be displayed\n if (this.isSubscribeRequested()) {\n this.cleanUpQueryString();\n store.dispatch(updateDisplayPaywallSubscription(true));\n }\n\n if (registration !== RegistrationType.Registered && this.isSigninRequested()) {\n // User not registered or registered as guest and display of sign-in page has been requested through URL\n this.cleanUpQueryString();\n this.setState({ initialAppState: ApplicationState.SignInDisplayed });\n } else if (registration !== RegistrationType.Registered && this.isSignupRequested()) {\n // User not registered or registered as guest and display of sign-up page has been requested through URL\n this.cleanUpQueryString();\n this.setState({ initialAppState: ApplicationState.SignUpDisplayed });\n } else if (isGuestModeAllowed && (this.isRegistrationRequested() || !deviceAndUser)) {\n // Force guest registration (for FrCh, it's \"user or anonymous\" and it will retrieve user's data if they logged in from landing page)\n this.cleanUpStorageAndRegisterAsGuest();\n } else {\n // User is either registered, registered as guest or not registered (for apps without guest mode)\n this.setState({ initialAppState: registration === RegistrationType.NotRegistered ? ApplicationState.NotRegistered : ApplicationState.Registered });\n\n // Remove data from local storage, so it's not reused later\n LocalStorageManager.delete(StorageKeys.CrmData);\n }\n });\n };\n\n checkDebugMode: () => void = () => {\n const debug = this.getQueryStringParameter('debug');\n if (debug === undefined || debug === null) {\n return;\n }\n\n store.dispatch(updateDebugMode(!['false', 'off', 'disabled', '0'].includes(debug.toLowerCase())));\n };\n\n isResetRequested: () => boolean = () => this.getQueryStringParameter('reset') !== null;\n\n isRegistrationRequested: () => boolean = () => this.getQueryStringParameter('id') === 'app';\n\n isSigninRequested: () => boolean = () => this.getQueryStringParameter('signin') !== null;\n\n isSignupRequested: () => boolean = () => this.getQueryStringParameter('signup') !== null;\n\n isSubscribeRequested: () => boolean = () => this.getQueryStringParameter('subscribe') !== null;\n\n getQueryStringParameter: (name: string) => ?string = (name) => {\n const url = new URL(location.href);\n return url.searchParams.get(name);\n };\n\n cleanUpQueryString: () => void = () => {\n const {\n location: { origin },\n } = window;\n window.history.pushState({ path: origin }, '', origin);\n };\n\n getUtmParameters: () => KeyValuePair<string> = () => {\n const utmParameters: KeyValuePair<string> = {};\n\n const url = new URL(location.href);\n\n for (const [parameter, value] of url.searchParams.entries()) {\n if (parameter.toLowerCase().startsWith('utm_')) {\n utmParameters[parameter] = value;\n }\n }\n\n return utmParameters;\n };\n\n cleanUpStorageAndRegisterAsGuest: () => void = () => {\n // Not registered or invalid information\n LocalStorageManager.delete(StorageKeys.UserDeviceInfo);\n LocalStorageManager.delete(StorageKeys.RegisteredAsGuest);\n\n // Delete optimistic data when switching to or from (France Channel case, here) guest mode\n deleteOptimisticData();\n\n // Register as guest\n this.setState({ initialAppState: ApplicationState.RegisterAsGuest });\n };\n\n getAppConfiguration: () => Promise<boolean> = () => {\n const overriddenAppConf = LocalStorageManager.loadString(StorageKeys.OverriddenAppConf, '');\n return store.dispatch(sendV8AppConfigurationRequest(overriddenAppConf));\n };\n\n checkDeviceIdAndUserInfo: () => Promise<boolean> = () =>\n // Fetch cached device Id or create a new one\n this.fetchDeviceId().then((deviceId) => {\n const registeredAsGuest = LocalStorageManager.loadBoolean(StorageKeys.RegisteredAsGuest, false);\n\n store.dispatch(setDeviceId(deviceId));\n\n // Fetch user and device info stored in local storage\n return this.fetchStoredUserDeviceInfo(deviceId)\n .then((userDeviceInfo) => {\n const { applicationId, authDeviceUrl, deviceKey, subscriberId, upgradeDeviceUrl } = userDeviceInfo;\n\n if (!applicationId || !authDeviceUrl || !deviceKey || !subscriberId || !upgradeDeviceUrl) {\n return Promise.resolve(false);\n }\n\n store.dispatch(registerApplication(userDeviceInfo, registeredAsGuest));\n return Promise.resolve(true);\n })\n .catch(() => Promise.resolve(false));\n });\n\n // If device Id is missing, create a new one\n fetchDeviceId: () => Promise<string> = () => {\n // Retrieve device Id from local storage\n const storedDeviceId = LocalStorageManager.loadString(StorageKeys.DeviceIdentifier, '');\n\n if (storedDeviceId) {\n return Promise.resolve(storedDeviceId);\n }\n\n const browser = detectBrowser();\n const newDeviceId = `${crypto.randomUUID()}-${browser?.name ?? 'unknown-browser'}`;\n\n LocalStorageManager.save(StorageKeys.DeviceIdentifier, newDeviceId);\n return Promise.resolve(newDeviceId);\n };\n\n fetchStoredUserDeviceInfo: (deviceId: string) => Promise<UserDeviceInfoType> = (deviceId) => {\n // Fetch data from previous session (from local storage)\n const token = LocalStorageManager.loadString(StorageKeys.UserDeviceInfo, '');\n\n if (token === '') {\n return Promise.reject(new Error('No cached user info'));\n }\n\n // Verify data and set default state\n return verifyAndDecryptToken(deviceId, token);\n };\n\n render(): React.Node {\n const { initialAppError, initialAppState } = this.state;\n\n return (\n <I18nextProvider i18n={Localizer.getInstance()}>\n <Provider store={store}>\n <ApplicationContainer initialAppError={initialAppError} initialAppState={initialAppState} />\n <ToastContainer autoClose={8_000} closeOnClick draggablePercent={40} icon={false} limit={MAX_DISPLAYED_NOTIFICATION_COUNT} newestOnTop />\n </Provider>\n </I18nextProvider>\n );\n }\n}\n\nexport default App;\n","import { formatProdErrorMessage as _formatProdErrorMessage, formatProdErrorMessage as _formatProdErrorMessage2, formatProdErrorMessage as _formatProdErrorMessage3, formatProdErrorMessage as _formatProdErrorMessage4, formatProdErrorMessage as _formatProdErrorMessage5, formatProdErrorMessage as _formatProdErrorMessage6, formatProdErrorMessage as _formatProdErrorMessage7 } from \"@reduxjs/toolkit\";\nimport type { Reducer, ReducersMapObject, Middleware, Action, StoreEnhancer, Store, UnknownAction } from 'redux';\nimport { applyMiddleware, createStore, compose, combineReducers, isPlainObject } from 'redux';\nimport type { DevToolsEnhancerOptions as DevToolsOptions } from './devtoolsExtension';\nimport { composeWithDevTools } from './devtoolsExtension';\nimport type { ThunkMiddlewareFor, GetDefaultMiddleware } from './getDefaultMiddleware';\nimport { buildGetDefaultMiddleware } from './getDefaultMiddleware';\nimport type { ExtractDispatchExtensions, ExtractStoreExtensions, ExtractStateExtensions, UnknownIfNonSpecific } from './tsHelpers';\nimport type { Tuple } from './utils';\nimport type { GetDefaultEnhancers } from './getDefaultEnhancers';\nimport { buildGetDefaultEnhancers } from './getDefaultEnhancers';\n\n/**\n * Options for `configureStore()`.\n *\n * @public\n */\nexport interface ConfigureStoreOptions<S = any, A extends Action = UnknownAction, M extends Tuple<Middlewares<S>> = Tuple<Middlewares<S>>, E extends Tuple<Enhancers> = Tuple<Enhancers>, P = S> {\n /**\n * A single reducer function that will be used as the root reducer, or an\n * object of slice reducers that will be passed to `combineReducers()`.\n */\n reducer: Reducer<S, A, P> | ReducersMapObject<S, A, P>;\n\n /**\n * An array of Redux middleware to install, or a callback receiving `getDefaultMiddleware` and returning a Tuple of middleware.\n * If not supplied, defaults to the set of middleware returned by `getDefaultMiddleware()`.\n *\n * @example `middleware: (gDM) => gDM().concat(logger, apiMiddleware, yourCustomMiddleware)`\n * @see https://redux-toolkit.js.org/api/getDefaultMiddleware#intended-usage\n */\n middleware?: (getDefaultMiddleware: GetDefaultMiddleware<S>) => M;\n\n /**\n * Whether to enable Redux DevTools integration. Defaults to `true`.\n *\n * Additional configuration can be done by passing Redux DevTools options\n */\n devTools?: boolean | DevToolsOptions;\n\n /**\n * The initial state, same as Redux's createStore.\n * You may optionally specify it to hydrate the state\n * from the server in universal apps, or to restore a previously serialized\n * user session. If you use `combineReducers()` to produce the root reducer\n * function (either directly or indirectly by passing an object as `reducer`),\n * this must be an object with the same shape as the reducer map keys.\n */\n // we infer here, and instead complain if the reducer doesn't match\n preloadedState?: P;\n\n /**\n * The store enhancers to apply. See Redux's `createStore()`.\n * All enhancers will be included before the DevTools Extension enhancer.\n * If you need to customize the order of enhancers, supply a callback\n * function that will receive a `getDefaultEnhancers` function that returns a Tuple,\n * and should return a Tuple of enhancers (such as `getDefaultEnhancers().concat(offline)`).\n * If you only need to add middleware, you can use the `middleware` parameter instead.\n */\n enhancers?: (getDefaultEnhancers: GetDefaultEnhancers<M>) => E;\n}\nexport type Middlewares<S> = ReadonlyArray<Middleware<{}, S>>;\ntype Enhancers = ReadonlyArray<StoreEnhancer>;\n\n/**\n * A Redux store returned by `configureStore()`. Supports dispatching\n * side-effectful _thunks_ in addition to plain actions.\n *\n * @public\n */\nexport type EnhancedStore<S = any, A extends Action = UnknownAction, E extends Enhancers = Enhancers> = ExtractStoreExtensions<E> & Store<S, A, UnknownIfNonSpecific<ExtractStateExtensions<E>>>;\n\n/**\n * A friendly abstraction over the standard Redux `createStore()` function.\n *\n * @param options The store configuration.\n * @returns A configured Redux store.\n *\n * @public\n */\nexport function configureStore<S = any, A extends Action = UnknownAction, M extends Tuple<Middlewares<S>> = Tuple<[ThunkMiddlewareFor<S>]>, E extends Tuple<Enhancers> = Tuple<[StoreEnhancer<{\n dispatch: ExtractDispatchExtensions<M>;\n}>, StoreEnhancer]>, P = S>(options: ConfigureStoreOptions<S, A, M, E, P>): EnhancedStore<S, A, E> {\n const getDefaultMiddleware = buildGetDefaultMiddleware<S>();\n const {\n reducer = undefined,\n middleware,\n devTools = true,\n preloadedState = undefined,\n enhancers = undefined\n } = options || {};\n let rootReducer: Reducer<S, A, P>;\n if (typeof reducer === 'function') {\n rootReducer = reducer;\n } else if (isPlainObject(reducer)) {\n rootReducer = combineReducers(reducer) as unknown as Reducer<S, A, P>;\n } else {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage(1) : '`reducer` is a required argument, and must be a function or an object of functions that can be passed to combineReducers');\n }\n if (process.env.NODE_ENV !== 'production' && middleware && typeof middleware !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage2(2) : '`middleware` field must be a callback');\n }\n let finalMiddleware: Tuple<Middlewares<S>>;\n if (typeof middleware === 'function') {\n finalMiddleware = middleware(getDefaultMiddleware);\n if (process.env.NODE_ENV !== 'production' && !Array.isArray(finalMiddleware)) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage3(3) : 'when using a middleware builder function, an array of middleware must be returned');\n }\n } else {\n finalMiddleware = getDefaultMiddleware();\n }\n if (process.env.NODE_ENV !== 'production' && finalMiddleware.some((item: any) => typeof item !== 'function')) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage4(4) : 'each middleware provided to configureStore must be a function');\n }\n let finalCompose = compose;\n if (devTools) {\n finalCompose = composeWithDevTools({\n // Enable capture of stack traces for dispatched Redux actions\n trace: process.env.NODE_ENV !== 'production',\n ...(typeof devTools === 'object' && devTools)\n });\n }\n const middlewareEnhancer = applyMiddleware(...finalMiddleware);\n const getDefaultEnhancers = buildGetDefaultEnhancers<M>(middlewareEnhancer);\n if (process.env.NODE_ENV !== 'production' && enhancers && typeof enhancers !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage5(5) : '`enhancers` field must be a callback');\n }\n let storeEnhancers = typeof enhancers === 'function' ? enhancers(getDefaultEnhancers) : getDefaultEnhancers();\n if (process.env.NODE_ENV !== 'production' && !Array.isArray(storeEnhancers)) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage6(6) : '`enhancers` callback must return an array');\n }\n if (process.env.NODE_ENV !== 'production' && storeEnhancers.some((item: any) => typeof item !== 'function')) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage7(7) : 'each enhancer provided to configureStore must be a function');\n }\n if (process.env.NODE_ENV !== 'production' && finalMiddleware.length && !storeEnhancers.includes(middlewareEnhancer)) {\n console.error('middlewares were provided, but middleware enhancer was not included in final enhancers - make sure to call `getDefaultEnhancers`');\n }\n const composedEnhancer: StoreEnhancer<any> = finalCompose(...storeEnhancers);\n return createStore(rootReducer, preloadedState as P, composedEnhancer);\n}","import { formatProdErrorMessage as _formatProdErrorMessage } from \"src/utils/formatProdErrorMessage\";\nimport compose from './compose';\nimport { Middleware, MiddlewareAPI } from './types/middleware';\nimport { StoreEnhancer, Dispatch } from './types/store';\n\n/**\n * Creates a store enhancer that applies middleware to the dispatch method\n * of the Redux store. This is handy for a variety of tasks, such as expressing\n * asynchronous actions in a concise manner, or logging every action payload.\n *\n * See `redux-thunk` package as an example of the Redux middleware.\n *\n * Because middleware is potentially asynchronous, this should be the first\n * store enhancer in the composition chain.\n *\n * Note that each middleware will be given the `dispatch` and `getState` functions\n * as named arguments.\n *\n * @param middlewares The middleware chain to be applied.\n * @returns A store enhancer applying the middleware.\n *\n * @template Ext Dispatch signature added by a middleware.\n * @template S The type of the state supported by a middleware.\n */\nexport default function applyMiddleware(): StoreEnhancer;\nexport default function applyMiddleware<Ext1, S>(middleware1: Middleware<Ext1, S, any>): StoreEnhancer<{\n dispatch: Ext1;\n}>;\nexport default function applyMiddleware<Ext1, Ext2, S>(middleware1: Middleware<Ext1, S, any>, middleware2: Middleware<Ext2, S, any>): StoreEnhancer<{\n dispatch: Ext1 & Ext2;\n}>;\nexport default function applyMiddleware<Ext1, Ext2, Ext3, S>(middleware1: Middleware<Ext1, S, any>, middleware2: Middleware<Ext2, S, any>, middleware3: Middleware<Ext3, S, any>): StoreEnhancer<{\n dispatch: Ext1 & Ext2 & Ext3;\n}>;\nexport default function applyMiddleware<Ext1, Ext2, Ext3, Ext4, S>(middleware1: Middleware<Ext1, S, any>, middleware2: Middleware<Ext2, S, any>, middleware3: Middleware<Ext3, S, any>, middleware4: Middleware<Ext4, S, any>): StoreEnhancer<{\n dispatch: Ext1 & Ext2 & Ext3 & Ext4;\n}>;\nexport default function applyMiddleware<Ext1, Ext2, Ext3, Ext4, Ext5, S>(middleware1: Middleware<Ext1, S, any>, middleware2: Middleware<Ext2, S, any>, middleware3: Middleware<Ext3, S, any>, middleware4: Middleware<Ext4, S, any>, middleware5: Middleware<Ext5, S, any>): StoreEnhancer<{\n dispatch: Ext1 & Ext2 & Ext3 & Ext4 & Ext5;\n}>;\nexport default function applyMiddleware<Ext, S = any>(...middlewares: Middleware<any, S, any>[]): StoreEnhancer<{\n dispatch: Ext;\n}>;\nexport default function applyMiddleware(...middlewares: Middleware[]): StoreEnhancer<any> {\n return createStore => (reducer, preloadedState) => {\n const store = createStore(reducer, preloadedState);\n let dispatch: Dispatch = () => {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage(15) : 'Dispatching while constructing your middleware is not allowed. ' + 'Other middleware would not be applied to this dispatch.');\n };\n const middlewareAPI: MiddlewareAPI = {\n getState: store.getState,\n dispatch: (action, ...args) => dispatch(action, ...args)\n };\n const chain = middlewares.map(middleware => middleware(middlewareAPI));\n dispatch = compose<typeof dispatch>(...chain)(store.dispatch);\n return {\n ...store,\n dispatch\n };\n };\n}","/* @flow */\n\nimport 'core-js';\nimport '@tippyjs/react/node_modules/tippy.js/dist/tippy.css';\nimport '@tippyjs/react/node_modules/tippy.js/animations/scale.css';\nimport './themes/tippy-core.css';\nimport './themes/toastify-core.css';\nimport './themes/measurements-core.css';\nimport './index.css';\nimport * as React from 'react';\nimport { parseBoolean, parseStringArray } from './helpers/jsHelpers/parser';\nimport App from './App';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport { createRoot } from 'react-dom/client';\nimport { isRunningOnLocalhost } from './helpers/jsHelpers/environment';\nimport log from 'loglevel';\nimport { logError } from './helpers/debug/debug';\nimport translationDe from './locales/de/translation.json';\nimport translationEn from './locales/en/translation.json';\nimport translationFr from './locales/fr/translation.json';\n\n// Redirect HTTP to HTTPS and remove '/index.html' if no query string is present\nconst {\n location: { hostname, pathname, protocol, search },\n} = window;\nif (!isRunningOnLocalhost() && (protocol !== 'https:' || pathname === '/index.html')) {\n window.location.replace(`https://${hostname}${search}`);\n}\n\n// eslint-disable-next-line no-use-before-define\ntype TranslationItem = Translation | string;\ntype Translation = {| [string]: TranslationItem |};\n\nconst translations: Translation = {\n de: translationDe,\n en: translationEn,\n fr: translationFr,\n};\n\n// Languages supported by application\nexport const APP_SUPPORTED_LANGUAGES: Array<string> = parseStringArray(process.env.REACT_APP_LANGUAGES, ',', ['fr', 'en']);\n\n// Get the best from supported languages and browser's languages\nexport const APP_LANGUAGES: Array<string> = Localizer.getAppLanguages(APP_SUPPORTED_LANGUAGES);\nexport const APP_LANGUAGES_AS_STRING: string = JSON.stringify(APP_LANGUAGES);\n\n// First app language wins jackpot and is promoted official language for this session\nexport const [APP_LANGUAGE] = APP_LANGUAGES;\n\n// Setting default log level to TRACE in debug mode, otherwise to WARN (production/staging) or TRACE (test)\nlog.setDefaultLevel(parseBoolean(process.env.REACT_APP_DEBUG_MODE) || process.env.REACT_APP_ENV_NAME !== '' ? log.levels.TRACE : log.levels.WARN);\n\nconst rootElement: HTMLElement | null = document.getElementById('root');\nif (rootElement) {\n // Initialize the localization module\n Localizer.initialize(APP_LANGUAGE, { [APP_LANGUAGE]: translations[APP_LANGUAGE] }).then(() => {\n createRoot(rootElement).render(<App />);\n });\n} else {\n logError('No \"root\" element to render application');\n}\n","/* eslint-disable no-return-assign, no-magic-numbers */\nconst titles = [\n 'Licorne, une légende vivante',\n 'Licornes et chatons',\n 'Licorne vs dauphin : le grand combat',\n \"La licorne de l'amour\",\n 'Pégase, ce mytho',\n 'La licorne écarlate',\n 'Licornofulgure',\n 'Des licornes et des hommes',\n 'En couple avec une licorne',\n 'Licorne : un job à plein temps',\n 'Fashion licorne',\n 'Plus belle la licorne',\n 'Double licorne',\n 'Total unicorn',\n 'The dark unicorn',\n 'Super licorne',\n 'Licorne des temps modernes',\n 'La planète des licornes',\n 'Harry Potter et la licorne dorée',\n 'Le meilleur de la licorne',\n 'Humour de licorne',\n 'Licorne+Centaure, amour impossible',\n 'La licorne dépasse les bornes',\n 'Une licorne peut en cacher une autre',\n \"La licorne de l'impossible\",\n 'Bien entretenir la corne de sa licorne',\n 'Crinière arc-en-ciel : fashion faux pas ?',\n 'La licorne en folie',\n 'La licorne se rebiffe',\n 'La neuvième licorne',\n 'Oui-Oui et la licorne magique',\n 'Indiana Jones et la licorne maudite',\n 'Les Castors Juniors et la licorne oubliée',\n 'Game of Unicorns',\n 'Une licorne pour la vie',\n 'Jamais sans ma licorne',\n 'La licorne démystifiée',\n 'Licorne, entre mythe et réalité',\n \"Les licornes de l'extrême\",\n \"L'invasion des licornes nazies\",\n 'Coupe du monde de licorne',\n 'Histoire de licornes',\n 'La licorne à travers les âges',\n 'La licorne verte',\n 'La licorne de Schindler',\n '12 licornes en colère',\n 'Le seigneur des licornes',\n 'Le silence des licornes',\n 'The princess unicorn',\n 'Shaun of the unicorns',\n 'Reservoir unicorns',\n 'Inglourious unikorns',\n 'Unicorn park',\n 'American Unicorn',\n 'The unicorn strikes back',\n 'The return of the unicorn',\n 'No country for old unicorns',\n 'Unicorn fiction',\n 'Unicorn Club',\n 'Le bon, la brute et la licorne',\n 'Raging unicorn',\n 'Les 7 licornes',\n 'The Unicorn',\n 'La unicorno',\n 'La unicórnio',\n 'Das Einhorn',\n 'Enhjørning',\n 'Yksisarvinen',\n 'Yedinorog',\n 'Yunikōn',\n 'Dú jiǎo shòu',\n 'Jednorožec',\n 'Einhyrningsins',\n 'Ilgagsu',\n 'Unikanga',\n];\n\n// ⬆️⬆️⬇️⬇️⬅️➡️➡️➡️️ba\nconst konamiCode = [38, 38, 40, 40, 37, 39, 37, 39, 66, 65];\n\nconst htmlUnicorn =\n '<div class=\"container bg{i}\"><div class=\"unicorn\"><div class=\"face\">' +\n '<div class=\"cheek\"></div><div class=\"snoot\"><div class=\"nose\"><div class=\"nostril\"></div></div></div><div class=\"eye\"><div class=\"eyelashes\"></div></div>' +\n '<div class=\"ear\"></div><div class=\"horn\"></div><div class=\"mane top\"></div><div class=\"mane mid\"></div></div><div class=\"neck\"><div class=\"mane end\"></div>' +\n '</div></div></div>';\n\nlet rootElement = null;\nlet unicornIndex = 0;\nlet isAnimating = false;\nlet isUnicornized = false;\n\nconst getRootElement = () => {\n if (!rootElement) {\n rootElement = document.querySelector('body > div#root');\n }\n return rootElement;\n};\n\nconst deunicornize = () => {\n const root = getRootElement();\n root.removeChild(root.querySelector('div.unicornized'));\n isAnimating = false;\n};\n\nconst animate = () => {\n const u = document.createElement('div');\n u.classList.add('unicornized');\n [3, 2, 1, 'Licornisation !'].forEach((v, i) => {\n const c = document.createElement('div');\n c.classList.add('countDown', `number${i}`);\n c.innerHTML = v.toString();\n u.append(c);\n });\n getRootElement().append(u);\n};\n\nconst unicornize = () => {\n if (isUnicornized) {\n return;\n }\n\n isUnicornized = true;\n isAnimating = true;\n\n animate();\n\n setTimeout(() => {\n document.querySelectorAll('.sectionItem .tileContainer').forEach((e) => {\n e.insertAdjacentHTML('beforeend', htmlUnicorn.replace('{i}', 1 + Math.floor(Math.random() * 4)));\n });\n\n [...document.getElementsByClassName('backgroundImage visible')].forEach((e) => (e.className = 'backgroundImage hidden'));\n\n document.querySelectorAll('.sectionItem .textContainer .text:not(.secondLineInfo)').forEach((e) => (e.innerHTML = titles[Math.floor(Math.random() * titles.length)]));\n\n document.querySelectorAll('.sectionItem .textContainer .text.secondLineInfo').forEach((e) => (e.innerHTML = e.innerHTML.replace(/^.+ - (.+)$/u, '$1')));\n }, 1_000);\n setTimeout(deunicornize, 7_000);\n};\n\nwindow.addEventListener(\n 'keydown',\n (e) => {\n if (!isAnimating && e.keyCode === konamiCode[unicornIndex]) {\n unicornIndex += 1;\n if (unicornIndex === konamiCode.length) {\n unicornIndex = 0;\n unicornize();\n }\n } else {\n unicornIndex = 0;\n }\n },\n {\n capture: true,\n passive: true,\n }\n);\n/* eslint-enable no-return-assign, no-magic-numbers */\n","/* @flow */\n\nimport { CustomNetworkError } from './CustomNetworkError';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport { parseResponseHeaders } from '../v8/helpers/RequestHeaders';\n\nconst tryParseResult: (result: any) => any = (result) => {\n if (!result) {\n return null;\n }\n\n try {\n return JSON.parse(result);\n } catch {\n return result;\n }\n};\n\nconst createCustomNetworkError: (status: number, message: ?string, responseHeaders: ?string, result?: any) => CustomNetworkError = (status, message, responseHeaders, result) =>\n new CustomNetworkError(\n {\n message,\n responseHeaders: parseResponseHeaders(responseHeaders),\n result: tryParseResult(result),\n status,\n },\n message\n );\n\nconst createCustomNetworkErrorFromKey: (key: string, options: any) => CustomNetworkError = (key, options) => {\n const message = Localizer.localize(key, options);\n\n return new CustomNetworkError(\n {\n message,\n status: -1,\n },\n message\n );\n};\n\nexport { createCustomNetworkError, createCustomNetworkErrorFromKey };\n","/* @flow */\n\nimport type { NetworkError } from './types/NetworkError';\n\nexport class CustomNetworkError extends Error {\n networkError: NetworkError;\n\n constructor(networkError: NetworkError, ...args: Array<any>) {\n super(...args);\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, CustomNetworkError);\n }\n\n this.name = 'CustomNetworkError';\n this.networkError = networkError;\n }\n\n // $FlowFixMe: Flow does not support symbols yet\n get [Symbol.toStringTag]() {\n return 'CustomNetworkError';\n }\n\n getStatus: () => number = () => {\n const { status } = this.networkError;\n return status;\n };\n\n getCustomStatus: () => number = () => {\n const { result } = this.networkError;\n return result?.status ?? result?.body?.message ?? -1;\n };\n\n getCustomCode: () => number = () => {\n const { result } = this.networkError;\n return result?.code ?? result?.body?.code ?? -1;\n };\n}\n","/* @flow */\n\nimport type { BasicFunction, BasicPromiseFunction } from '@ntg/utils/dist/types';\nimport type { BO_API_ERROR_TYPE } from '../../../../redux/netgemApi/actions/videofutur/types/common';\nimport { CustomNetworkError } from '../CustomNetworkError';\nimport { PlayerError } from '../../../../helpers/playerError/PlayerError';\nimport { logError } from '../../../../helpers/debug/debug';\n\n/*\n * Called from a catch() block to filter out cancelled promises (i.e. aborted signals)\n * If promise was cancelled, nothing is done\n * Otherwise, error is logged and given callback is called\n */\nconst ignoreIfAborted: (signal: AbortSignal, error: Error | PlayerError | CustomNetworkError | BO_API_ERROR_TYPE, callback?: BasicFunction | BasicPromiseFunction) => Promise<void> = (\n signal,\n error,\n callback,\n) => {\n // $FlowFixMe: flow doesn't know DOMException\n if (signal.aborted || (error instanceof DOMException && error.name === 'AbortError')) {\n return Promise.resolve();\n }\n\n logError('Rejected promise:');\n logError(error instanceof CustomNetworkError ? error.networkError : error);\n\n if (!callback) {\n return Promise.resolve();\n }\n\n // Callback is only executed if promise has been rejected, but not cancelled\n const result = callback();\n\n if (result instanceof Promise) {\n // BasicPromiseFunction\n return result;\n }\n\n return Promise.resolve();\n};\n\nexport { ignoreIfAborted };\n","/* @flow */\n\nimport type { ReadOnlyKeyValuePair } from '@ntg/utils/dist/types';\n\nexport const PersonalDataKey: ReadOnlyKeyValuePair<string> = Object.freeze({\n ViewingHistory: 'viewinghistory',\n Wishlist: 'wishlist',\n});\n","/* @flow */\n\nimport type { ReadOnlyKeyValuePair } from '@ntg/utils/dist/types';\n\n// Names\nexport const HeaderName: ReadOnlyKeyValuePair<string> = Object.freeze({\n Accept: 'Accept',\n AppKey: 'APP_KEY',\n Authorization: 'Authorization',\n ContentType: 'Content-Type',\n IfMatch: 'If-Match',\n IfNoneMatch: 'If-None-Match',\n VuDrmToken: 'x-vudrm-token',\n WwwAuthenticate: 'WWW-Authenticate',\n});\n\n// Values\nexport const HeaderValue: ReadOnlyKeyValuePair<string> = Object.freeze({\n ApplicationFormUrlencoded: 'application/x-www-form-urlencoded',\n ApplicationJson: 'application/json',\n ApplicationJsonUtf8: 'application/json; charset=utf-8',\n ApplicationMicrosoftServiceBus: 'application/vnd.microsoft.servicebus.json',\n Image: 'image/*',\n});\n","/* @flow */\n\nimport type { ReadOnlyKeyValuePair } from '@ntg/utils/dist/types';\n\nexport const HttpStatus: ReadOnlyKeyValuePair<number> = Object.freeze({\n BadRequest: 400,\n Conflict: 409,\n Error: 0, // Not an existing HTTP status code but used when XHR fails\n Forbidden: 403,\n MultipleChoices: 300,\n NoContent: 204,\n NotFound: 404,\n NotModified: 304,\n OK: 200,\n PreconditionFailed: 412,\n Unauthorized: 401,\n});\n\n// XML HTTP request status\nexport const HTTP_READY_STATE_DONE = 4;\n\nexport const NetgemNetworkCode: ReadOnlyKeyValuePair<number> = Object.freeze({\n AuthenticationFailed: 401000,\n ClientError: 400000,\n ConcurrencyLimit: 10207,\n Geolock: 10208,\n HubNotFound: 404005,\n InvalidDimensions: 400008,\n InvalidModalState: 400001,\n MissingDmsChannel: 10206,\n MissingRight: 10220,\n NotFound: 404000,\n OK: 200000,\n RealmNotFound: 404006,\n});\n\nexport const NetgemNetworkErrorMessage: ReadOnlyKeyValuePair<string> = Object.freeze({\n AuthenticationFailed: 'The authentication has failed or has not been provided',\n ClientError: 'The server cannot or will not process the request due to an apparent client error',\n HubNotFound: 'The hub was not found',\n InvalidDimensions: 'The requested dimensions are invalid',\n InvalidModalState: 'The model state could not be correctly read',\n NotFound: 'The requested resource could not be found but may be available in the future',\n RealmNotFound: 'The realm (OEM) was not found',\n});\n","/* @flow */\n\nimport { DAYS_PER_MONTH, HOURS_PER_DAY, MILLISECONDS_PER_SECOND, MINUTES_PER_HOUR, MONTHS_PER_YEAR, SECONDS_PER_MINUTE } from '../../../../helpers/dateTime/Format';\nimport { roundDownTo, roundUpTo } from '../../../../helpers/maths/maths';\nimport AccurateTimestamp from '../../../../helpers/dateTime/AccurateTimestamp';\n\n/*\n * Return rounded date ISO8601 string\n * @param timeRoundValue (in seconds)\n * @param [optionalDate] (in milliseconds)\n * @return string\n */\nconst getRoundedDateToISOString: (rounding?: number, date?: number, offset?: number) => string = (rounding, date, offset) => {\n let time = date ?? AccurateTimestamp.now();\n\n if (rounding && rounding > 0) {\n time = roundDownTo(time, rounding * MILLISECONDS_PER_SECOND);\n }\n\n if (offset && offset > 0) {\n time += offset * MILLISECONDS_PER_SECOND;\n }\n\n const nbCharToSlice = 5;\n return `${new Date(time).toISOString().slice(0, -nbCharToSlice)}Z`;\n};\n\nconst getRoundedNowToISOString: (rounding?: number, offset?: number) => string = (rounding, offset) => getRoundedDateToISOString(rounding, undefined, offset);\n\nconst stringToInt = (s: string) => parseInt(s, 10) || 0;\n\nconst addISO8601Duration: (date: string, iso8601Duration: string) => Date = (date, iso8601Duration) => {\n const regExpResult: Array<string> | null = /^P([0-9]+Y)?([0-9]+M)?([0-9]+D)?T?([0-9]+H)?([0-9]+M)?([0-9]+(?:\\.[0-9]+)?S)?$/u.exec(iso8601Duration);\n\n const d = new Date(date);\n\n if (regExpResult) {\n const [, years, months, days, hours, minutes, seconds] = regExpResult;\n\n d.setSeconds(d.getSeconds() + stringToInt(seconds));\n d.setMinutes(d.getMinutes() + stringToInt(minutes));\n d.setHours(d.getHours() + stringToInt(hours));\n d.setFullYear(d.getFullYear() + stringToInt(years), d.getMonth() + stringToInt(months), d.getDate() + stringToInt(days));\n }\n\n return d;\n};\n\n/*\n * Return rounded duration ISO8601 string\n * @param duration (in milliseconds)\n * @param timeRoundValue (in seconds)\n * @return string\n */\nconst getRoundedDurationToISOString: (duration: number, timeRoundValue: number) => string = (duration, timeRoundValue) => {\n let d = Math.floor(duration / MILLISECONDS_PER_SECOND);\n let sign = '';\n\n if (d < 0) {\n sign = '-';\n d = -d;\n }\n\n if (timeRoundValue > 0) {\n d = roundUpTo(d, timeRoundValue);\n }\n\n const seconds = d % SECONDS_PER_MINUTE;\n const S = `${seconds}S`;\n d = (d - seconds) / SECONDS_PER_MINUTE;\n\n const minutes = d % MINUTES_PER_HOUR;\n const MI = minutes ? `${minutes}M` : '';\n d = (d - minutes) / MINUTES_PER_HOUR;\n\n const hours = d % HOURS_PER_DAY;\n const H = hours ? `${hours}H` : '';\n d = (d - hours) / HOURS_PER_DAY;\n\n const days = d % DAYS_PER_MONTH;\n const D = days ? `${days}D` : '';\n d = (d - days) / DAYS_PER_MONTH;\n\n const months = d % MONTHS_PER_YEAR;\n const MO = months ? `${months}M` : '';\n\n const years = (d - months) / MONTHS_PER_YEAR;\n const Y = years ? `${years}Y` : '';\n\n let HMS = `${H}${MI}${S}`;\n if (HMS !== '') HMS = `T${HMS}`;\n return `${sign}P${Y}${MO}${D}${HMS}`;\n};\n\nexport { addISO8601Duration, getRoundedDateToISOString, getRoundedDurationToISOString, getRoundedNowToISOString };\n","/* @flow */\n\nimport { ItemType, type NETGEM_API_V8_FEED, type NETGEM_API_V8_FEED_ITEM, type NETGEM_API_V8_FEED_RAW_ITEM, type NETGEM_API_V8_MIXED_FEED } from '../types/FeedItem';\nimport { LIVE_START_THRESHOLD, getIso8601DateInSeconds, getIso8601DurationInSeconds } from '../../../../helpers/dateTime/Format';\nimport { type NETGEM_API_V8_FEED_OP_FILTER, type NETGEM_API_V8_FEED_OP_SLICE, type NETGEM_API_V8_FEED_SCORING, type ScoreContextType } from '../types/Feed';\nimport { buildFeedItem, deepCopyItem, deepCopyRawItem, getLocationType, splitFeedItemByChannels } from './Item';\nimport { calculateLocationScore, getBestLocationForItem, setLocationsScore, updateSelectedLocation } from './Score';\nimport { compareElementScore, createFilterOperator, filterItem } from './Filter';\nimport AccurateTimestamp from '../../../../helpers/dateTime/AccurateTimestamp';\nimport { type ChannelMap } from '../types/Channel';\nimport { GroupItemsBy } from '../types/WidgetConfig';\nimport { type NETGEM_API_V8_RAW_FEED } from '../types/FeedResult';\nimport { type NETGEM_API_VIEWINGHISTORY_PLAYED_ITEMS } from '../types/ViewingHistory';\n\n// Max items per section, after merge, in case no slice directive was given by PTF\nconst MAX_MERGED_FEED_ITEM = 500;\n\nconst deepCopyRawFeed: (feed: NETGEM_API_V8_RAW_FEED) => NETGEM_API_V8_RAW_FEED = (feed) => feed.map((item) => deepCopyRawItem(item));\n\nconst deepCopyFeed: (feed: $ReadOnlyArray<NETGEM_API_V8_FEED_ITEM>) => NETGEM_API_V8_FEED = (feed) => feed.map((item) => deepCopyItem(item));\n\nconst splitFeedByChannels: (feedIn: NETGEM_API_V8_RAW_FEED) => Map<string, NETGEM_API_V8_RAW_FEED> = (feedIn) => {\n const feedByChannel: Map<string, NETGEM_API_V8_RAW_FEED> = new Map();\n\n feedIn.forEach((item) => {\n splitFeedItemByChannels(item).forEach(({ channelId, rawItem }) => {\n let f = feedByChannel.get(channelId);\n\n if (!f) {\n f = [];\n feedByChannel.set(channelId, f);\n }\n\n f.push(rawItem);\n });\n });\n\n return feedByChannel;\n};\n\nconst filterChannels: (feed: NETGEM_API_V8_FEED, allChannels: ChannelMap, sectionChannels: Set<string>) => void = (feed, allChannels, sectionChannels) => {\n for (let i = feed.length - 1; i >= 0; --i) {\n const {\n [i]: {\n selectedLocation: { channelId },\n },\n } = feed;\n\n if (!channelId || !sectionChannels.has(channelId)) {\n feed.splice(i, 1);\n }\n }\n};\n\nconst filterLiveFeed: (feedIn: NETGEM_API_V8_RAW_FEED, channels: ChannelMap, sliceParams?: NETGEM_API_V8_FEED_OP_SLICE) => NETGEM_API_V8_FEED = (feedIn, channels, sliceParams) => {\n const feedOut = deepCopyRawFeed(feedIn);\n return filterFeed(feedOut, channels, { op: 'live' }, sliceParams);\n};\n\nconst filterFeed: (feedIn: NETGEM_API_V8_RAW_FEED, channels: ChannelMap, filterParams: ?NETGEM_API_V8_FEED_OP_FILTER, sliceParams?: NETGEM_API_V8_FEED_OP_SLICE) => NETGEM_API_V8_FEED = (\n feedIn,\n channels,\n filterParams,\n sliceParams,\n) => {\n const { length: feedCount = 0 } = feedIn;\n if (feedCount === 0) {\n return [];\n }\n\n // Prepare filtering\n const filterOperator = filterParams ? createFilterOperator(filterParams, channels) : null;\n const processItem = filterOperator ? (item: NETGEM_API_V8_FEED_RAW_ITEM) => filterItem(item, filterOperator) : (item) => item;\n\n const feedOut: NETGEM_API_V8_FEED = [];\n\n for (let i = 0; i < feedCount; i++) {\n const { [i]: item } = feedIn;\n const { elements, locations } = item;\n\n if (elements || locations) {\n const filteredItem = processItem(item);\n\n if (filteredItem) {\n const feedItem = buildFeedItem(filteredItem);\n\n if (feedItem) {\n feedOut.push(feedItem);\n }\n }\n }\n }\n\n sortFeed(feedOut);\n\n if (Array.isArray(sliceParams)) {\n const [min, max] = sliceParams;\n if (typeof min === 'number' && typeof max === 'number') {\n return feedOut.slice(min, max);\n }\n }\n\n return feedOut;\n};\n\nconst filterViewingHistoryFeed: (feed: NETGEM_API_V8_FEED, playedItemsMap: NETGEM_API_VIEWINGHISTORY_PLAYED_ITEMS, playedSeries: Set<string>) => NETGEM_API_V8_FEED = (\n feed,\n playedItemsMap,\n playedSeries,\n) => {\n const validFeed = [];\n\n feed.forEach((item) => {\n const {\n selectedLocation: { id = '' },\n seriesId,\n } = item;\n\n if ((id && seriesId && playedSeries.has(seriesId)) || playedItemsMap[id]) {\n // Item found\n validFeed.push(item);\n }\n });\n\n return validFeed;\n};\n\nconst sliceFeed: (feed: NETGEM_API_V8_FEED, sliceOp: ?NETGEM_API_V8_FEED_OP_SLICE) => NETGEM_API_V8_FEED = (feed, sliceOp) => {\n const slicedFeed = sliceOp ? feed.slice(...sliceOp) : feed;\n return slicedFeed.length > MAX_MERGED_FEED_ITEM ? slicedFeed.slice(0, MAX_MERGED_FEED_ITEM) : slicedFeed;\n};\n\n/*\n * Merge items of various feeds, per score. And keep only N items if limit is given.\n * /!\\ This function assumes items are already sorted per score inside feeds and locations.\n */\nconst mergeFeeds: (feeds: Array<NETGEM_API_V8_FEED>, scoring?: NETGEM_API_V8_FEED_SCORING, context?: ScoreContextType, sliceOp: ?NETGEM_API_V8_FEED_OP_SLICE) => NETGEM_API_V8_FEED = (\n feeds,\n scoring,\n context,\n sliceOp,\n) => {\n const { length: feedsCount } = feeds;\n\n if (feedsCount === 0) {\n // No feed\n return [];\n }\n\n // Only one feed\n if (feedsCount === 1) {\n return sliceFeed(feeds[0], sliceOp);\n }\n\n // More than one feed: let's merge them\n\n // Aggregate all feeds\n const aggregatedFeed: NETGEM_API_V8_FEED = [].concat(...feeds);\n\n // Sort items since several feeds have been merged\n sortFeed(aggregatedFeed, scoring, context);\n\n // Remove duplicates (keep only first occurrences)\n const map: Map<string, NETGEM_API_V8_FEED_ITEM> = aggregatedFeed.reduce((m, item) => {\n const key = item.id;\n return m.has(key) ? m : m.set(key, item);\n }, new Map());\n\n return sliceFeed([...map.values()], sliceOp);\n};\n\nconst setFeedScore: (feed: NETGEM_API_V8_FEED, scoring: NETGEM_API_V8_FEED_SCORING, context?: ScoreContextType) => NETGEM_API_V8_FEED = (feed, scoring, context) => {\n const clonedFeed: NETGEM_API_V8_FEED = deepCopyFeed(feed);\n const stack: NETGEM_API_V8_MIXED_FEED = [...clonedFeed];\n\n while (stack.length > 0) {\n const rawItem = stack.pop();\n\n // Since flowjs v0.239.0, \"rawItem\" is said to be potentially undefined (which is impossible, here)\n if (!rawItem) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const { elements } = rawItem;\n\n if (elements) {\n elements.forEach((e) => stack.unshift(e));\n } else {\n const { locations } = rawItem;\n if (locations) {\n setLocationsScore(locations, scoring, context);\n }\n }\n }\n\n updateSelectedLocation(clonedFeed);\n sortFeed(clonedFeed);\n\n return clonedFeed;\n};\n\nconst sortFeed: (feed: NETGEM_API_V8_FEED, scoring?: NETGEM_API_V8_FEED_SCORING, context?: ScoreContextType) => void = (feed, scoring, context) => {\n for (let i = 0; i < feed.length; i++) {\n const item = feed[i];\n const { selectedLocation } = item;\n if (selectedLocation.id !== '') {\n if (scoring) {\n selectedLocation.score = calculateLocationScore(selectedLocation, scoring, context);\n }\n item.score = selectedLocation.score;\n }\n }\n feed.sort(compareElementScore);\n};\n\nconst isItemLiveOrAboutToStart: (item: NETGEM_API_V8_FEED_ITEM) => boolean = (item) => {\n const now = AccurateTimestamp.nowInSeconds();\n return item.startTime <= now + LIVE_START_THRESHOLD && now < item.endTime;\n};\n\nconst flattenFeedIfRequested: (inFeed: NETGEM_API_V8_FEED, groupItemsBy: ?GroupItemsBy) => NETGEM_API_V8_FEED = (inFeed, groupItemsBy) => {\n if (!groupItemsBy || groupItemsBy !== GroupItemsBy.Program || inFeed.length === 0) {\n // Series or season\n return inFeed;\n }\n\n // Program: let's flatten the list\n const outFeed: NETGEM_API_V8_FEED = [];\n let queue: NETGEM_API_V8_MIXED_FEED = [...inFeed];\n\n while (queue.length > 0) {\n const item = queue.shift();\n\n // Since flowjs v0.239.0, \"item\" is said to be potentially undefined (which is impossible, here)\n if (!item) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const { elements, seriesId } = item;\n\n if (elements) {\n // Enqueue elements' items in order to treat them later\n queue = [...elements, ...queue];\n } else {\n // No more elements: treat locations\n const { location, programId } = getBestLocationForItem(item);\n\n if (location) {\n const { duration, id, score, startDate } = location;\n const startTime = getIso8601DateInSeconds(startDate);\n const endTime = startTime + getIso8601DurationInSeconds(duration);\n\n const newItem: NETGEM_API_V8_FEED_ITEM = {\n endTime,\n id: item.id,\n locType: getLocationType(id),\n selectedLocation: location,\n selectedProgramId: programId,\n seriesId,\n startTime,\n type: ItemType.Program,\n };\n\n const { locations, purchasable, score: itemScore } = item;\n\n if (locations) {\n newItem.locations = locations;\n }\n\n if (purchasable) {\n newItem.purchasable = purchasable;\n }\n\n if (itemScore) {\n newItem.score = score;\n }\n\n outFeed.push(newItem);\n }\n }\n }\n\n // Each season is made of a sorted feed but flattening all episodes does not keep order\n sortFeed(outFeed);\n\n return outFeed;\n};\n\nconst getAllLocationIds: (feed: NETGEM_API_V8_FEED) => Set<string> = (feed) => {\n const locationIds = new Set<string>();\n const stack: NETGEM_API_V8_MIXED_FEED = [...feed];\n\n while (stack.length > 0) {\n const rawItem = stack.pop();\n\n // Since flowjs v0.239.0, \"rawItem\" is said to be potentially undefined (which is impossible, here)\n if (!rawItem) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const { elements, locations } = rawItem;\n\n if (elements) {\n elements.forEach((element) => stack.unshift(element));\n } else if (locations) {\n locations.forEach((location) => {\n if (location.id) {\n locationIds.add(location.id);\n }\n });\n }\n }\n\n return locationIds;\n};\n\nexport {\n filterChannels,\n filterFeed,\n filterLiveFeed,\n filterViewingHistoryFeed,\n flattenFeedIfRequested,\n getAllLocationIds,\n isItemLiveOrAboutToStart,\n mergeFeeds,\n setFeedScore,\n sortFeed,\n splitFeedByChannels,\n};\n","/* @flow */\n\nimport {\n type NETGEM_API_V8_FEED_RAW_ITEM,\n type NETGEM_API_V8_ITEM_LOCATION,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_CATCHUP,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_EST,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_SVOD,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_TVOD,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_VOD,\n type NETGEM_API_V8_ITEM_SCORE,\n} from '../types/FeedItem';\nimport { getAvailabilityEndTimeOrDefault, getAvailabilityStartTimeOrDefault } from '../../../../helpers/videofutur/metadata';\nimport AccurateTimestamp from '../../../../helpers/dateTime/AccurateTimestamp';\nimport type { ChannelMap } from '../types/Channel';\nimport type { KeyValuePair } from '@ntg/utils/dist/types';\nimport { type NETGEM_API_V8_FEED_OP_FILTER } from '../types/Feed';\nimport { RecordingOutcome } from '../types/Npvr';\nimport { addISO8601Duration } from './Date';\nimport { getLocationType } from './Item';\n\ntype FilterContextType = {|\n channels: ChannelMap,\n now: number,\n|};\n\n// eslint-disable-next-line no-use-before-define\ntype ArgsType = Array<FilterStructureType | number | string>;\n\ntype FilterStructureType = {|\n op: (location: NETGEM_API_V8_ITEM_LOCATION, item: NETGEM_API_V8_FEED_RAW_ITEM, args: ArgsType, ctx: FilterContextType) => boolean,\n args: ArgsType,\n|};\n\ntype FilterOperatorFunctionType = (location: NETGEM_API_V8_ITEM_LOCATION, item: NETGEM_API_V8_FEED_RAW_ITEM, args: Array<FilterStructureType | number | string>, ctx: FilterContextType) => boolean;\n\ntype ItemFilterType = (location: NETGEM_API_V8_ITEM_LOCATION, item: NETGEM_API_V8_FEED_RAW_ITEM) => boolean;\n\nconst compareScore: (score1?: NETGEM_API_V8_ITEM_SCORE, score2?: NETGEM_API_V8_ITEM_SCORE) => number = (score1, score2) => {\n if (score1 === undefined && score2 === undefined) {\n return 0;\n }\n\n if (score1 === undefined) {\n return 1;\n }\n\n if (score2 === undefined) {\n return -1;\n }\n\n const len = Math.min(score1.length, score2.length);\n for (let i = 0; i < len; ++i) {\n const s1: number | string = score1[i];\n const s2: number | string = score2[i];\n\n if (typeof s1 === 'number' && typeof s2 === 'number') {\n if (s1 < s2) {\n return -1;\n }\n if (s1 > s2) {\n return 1;\n }\n } else {\n const str1 = s1.toString();\n const str2 = s2.toString();\n if (str1 < str2) {\n return -1;\n }\n if (str1 > str2) {\n return 1;\n }\n }\n }\n\n if (score1.length !== score2.length) {\n // Same score for starting elements but one item as a longer score array (better score)\n return score1.length > score2.length ? -1 : 1;\n }\n\n // Same scores\n return 0;\n};\n\nconst compareElementScore: (elt1: { score?: NETGEM_API_V8_ITEM_SCORE, ... }, elt2: { score?: NETGEM_API_V8_ITEM_SCORE, ... }) => number = (elt1, elt2) => compareScore(elt1.score, elt2.score);\n\nconst compareLocationScore: (loc1: NETGEM_API_V8_ITEM_LOCATION, loc2: NETGEM_API_V8_ITEM_LOCATION) => number = (loc1, loc2) => compareScore(loc1.score, loc2.score);\n\nconst filterOps: KeyValuePair<FilterOperatorFunctionType> = {\n all: (location, item, args, ctx) => Boolean(location) || Boolean(args) || Boolean(ctx),\n\n and: (location, item, args, ctx) => {\n const len = args.length;\n for (let i = 0; i < len; i++) {\n const arg = args[i];\n if (typeof arg === 'object') {\n if (!arg.op(location, item, arg.args, ctx)) {\n return false;\n }\n }\n }\n return true;\n },\n\n assetId: (location, item, args) => {\n const { id } = item;\n if (id && args.length === 1) {\n const [assetId] = args;\n return assetId === id;\n }\n return false;\n },\n\n // True if considered scheduled event is broadcasted on a channel that is part of channel list\n channelList: (location, item, args, ctx) => {\n const { channelId } = location;\n const { channels } = ctx;\n\n const channelListInternal = (ids: any) => (Array.isArray(ids) ? ids.includes(channelId) : false);\n\n if (!Array.isArray(args) || args.length === 0) {\n return channelListInternal(Object.keys(channels));\n }\n\n const [channelIds] = args;\n return channelListInternal(channelIds);\n },\n\n // Return true if scheduled event is not started yet (i.e. now < startDate)\n future: (location, item, args, ctx) => {\n const { now } = ctx;\n const { startDate } = location;\n\n if (!startDate) {\n return false;\n }\n\n const startTime = new Date(startDate).getTime();\n\n return now < startTime;\n },\n\n // Return true is currently live (i.e. startDate <= now < startDate + duration)\n live: (location, item, args, ctx) => {\n const { now } = ctx;\n const { duration, startDate } = location;\n\n if (!startDate || !duration) {\n return false;\n }\n\n const startTime = new Date(startDate).getTime();\n const endTime = addISO8601Duration(startDate, duration).getTime();\n\n return startTime <= now && now < endTime;\n },\n\n locationType: (location, item, args) => {\n const { id } = location;\n const locType = getLocationType(id);\n return args.indexOf(locType) > -1;\n },\n\n not: (location, item, args, ctx) => {\n const [arg] = args;\n if (typeof arg === 'object') {\n return !arg.op(location, item, arg.args, ctx);\n }\n return true;\n },\n\n or: (location, item, args, ctx) => {\n const len = args.length;\n for (let i = 0; i < len; i++) {\n const arg = args[i];\n if (typeof arg === 'object') {\n if (arg.op(location, item, arg.args, ctx)) {\n return true;\n }\n }\n }\n return false;\n },\n\n parentalRating: (location, item, args) => {\n /*\n * Minimum age none 6 12 16 18\n * args: [-16] v v v x x\n * args: [ 16] x x x v v\n * args: [ 7] x x v v v\n */\n\n if (args.length === 0) {\n return true;\n }\n\n const [threshold] = args;\n if (typeof threshold !== 'number') {\n return true;\n }\n\n const { parentalGuidance } = item;\n\n if (!parentalGuidance) {\n // No minimum age for this program, i.e. 0\n return threshold < 0;\n }\n\n const { minimumAge } = parentalGuidance;\n\n if (threshold < 0) {\n // Filter out programs for people older than -threshold\n return minimumAge < -threshold;\n }\n\n // Filter out programs for people younger than threshold\n return minimumAge >= threshold;\n },\n\n playable: (location, item, args, ctx) => {\n const { now } = ctx;\n const { availabilityStartDate, availabilityEndDate, id, scheduledEventDuration, scheduledEventStartDate, recordOutcome } = location;\n const delay = args.length > 0 && typeof args[0] === 'number' ? args[0] : 0;\n const startTime = getAvailabilityStartTimeOrDefault(availabilityStartDate);\n const endTime = getAvailabilityEndTimeOrDefault(availabilityEndDate);\n const locType = getLocationType(id);\n const isVod =\n locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_VOD ||\n locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_TVOD ||\n locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_SVOD ||\n locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_EST;\n\n // Recording, catchup and VOD\n if ((locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING && recordOutcome) || locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_CATCHUP || isVod) {\n return (!recordOutcome || recordOutcome === RecordingOutcome.Recorded) && (isVod || startTime - delay <= now) && now < endTime;\n }\n\n // Scheduled event\n if (locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT && scheduledEventDuration && scheduledEventStartDate) {\n const scheduledEventStartTime = new Date(scheduledEventStartDate).getTime() - delay;\n const scheduledEventEndTime = addISO8601Duration(scheduledEventStartDate, scheduledEventDuration).getTime();\n return scheduledEventStartTime < now && now < scheduledEventEndTime;\n }\n\n return false;\n },\n\n previewAvailability: (location, item, args, ctx) => {\n const { now } = ctx;\n const { previewAvailabilityStartDate } = location;\n\n return getAvailabilityStartTimeOrDefault(previewAvailabilityStartDate) < now;\n },\n};\n\nconst filterItem: (item: NETGEM_API_V8_FEED_RAW_ITEM, filter: ItemFilterType, rootItem?: NETGEM_API_V8_FEED_RAW_ITEM) => ?NETGEM_API_V8_FEED_RAW_ITEM = (item, filter, rootItem) => {\n const { elements, locations } = item;\n const eltsOut = [];\n const locsOut = [];\n let eltsOutScore: ?NETGEM_API_V8_ITEM_SCORE = null;\n let locsOutScore: ?NETGEM_API_V8_ITEM_SCORE = null;\n const root = rootItem || item;\n\n if (elements) {\n for (let i = 0; i < elements.length; i++) {\n const el = filterItem(elements[i], filter, root);\n if (el) {\n eltsOut.push(el);\n }\n }\n if (eltsOut.length > 0) {\n eltsOut.sort(compareElementScore);\n eltsOutScore = eltsOut[0].score;\n }\n }\n\n if (locations) {\n for (let k = 0; k < locations.length; k++) {\n const { [k]: loc } = locations;\n\n if (filter(loc, root)) {\n locsOut.push(loc);\n }\n }\n if (locsOut.length > 0) {\n locsOut.sort(compareLocationScore);\n locsOutScore = locsOut[0].score;\n }\n }\n\n if (eltsOut.length + locsOut.length === 0) {\n return null;\n }\n\n let score = eltsOutScore || locsOutScore || [0];\n if (eltsOutScore && locsOutScore) {\n score = compareScore(eltsOutScore, locsOutScore) <= 0 ? eltsOutScore : locsOutScore;\n }\n\n const filteredItem: NETGEM_API_V8_FEED_RAW_ITEM = { id: item.id };\n\n if (item.parentalGuidance) {\n filteredItem.parentalGuidance = item.parentalGuidance;\n }\n\n if (item.purchasable) {\n filteredItem.purchasable = item.purchasable;\n }\n\n if (score) {\n filteredItem.score = score;\n }\n\n if (eltsOut.length > 0) {\n filteredItem.elements = eltsOut;\n }\n\n if (locsOut.length > 0) {\n filteredItem.locations = locsOut;\n }\n\n return filteredItem;\n};\n\n/*\n * Format filter function according to filter object provided by section feed\n *\n * @private\n * @param {Object} filterObj [description]\n * @param {Object} ops [description]\n * @return {[type]} [description]\n */\nconst formatFilterOperator: (filterObj: NETGEM_API_V8_FEED_OP_FILTER) => FilterStructureType = (filterObj) => {\n const op = filterOps[filterObj.op];\n const out: FilterStructureType = {\n args: [],\n op: op || filterOps.all,\n };\n\n if (op) {\n const { args = [] } = filterObj;\n const { length = 0 } = args;\n\n if (length > 0) {\n for (let i = 0; i < length; i++) {\n const arg = args[i];\n out.args = [...out.args, typeof arg === 'object' && !Array.isArray(arg) ? formatFilterOperator(arg) : arg];\n }\n } else if (op === filterOps.or || op === filterOps.and || op === filterOps.not) {\n // Error of filter operator formatting (or/and/not should have non-null args) > assign 'all' to accept all items\n out.op = filterOps.all;\n }\n }\n\n return out;\n};\n\nconst createFilterOperator: (filterObj: NETGEM_API_V8_FEED_OP_FILTER, channels: ChannelMap) => ItemFilterType = (filterObj, channels) => {\n const ctx = {\n channels,\n now: AccurateTimestamp.now(),\n };\n const filter = formatFilterOperator(filterObj);\n\n return (location, item) => filter.op(location, item, filter.args, ctx);\n};\n\nexport { compareElementScore, compareLocationScore, compareScore, createFilterOperator, filterItem };\n","/* @flow */\n\nimport { ISO8601_DURATION_ZERO, MILLISECONDS_PER_SECOND, MIN_DATE_ISO } from '../../../../helpers/dateTime/Format';\nimport {\n ItemContent,\n ItemType,\n type NETGEM_API_V8_FEED_ITEM,\n type NETGEM_API_V8_FEED_RAW_ITEM,\n type NETGEM_API_V8_ITEM_LOCATION,\n type NETGEM_API_V8_ITEM_LOCATION_TYPE,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_APP,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_EST,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_SVOD,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_TVOD,\n NETGEM_API_V8_ITEM_LOCATION_TYPE_VOD,\n type NETGEM_API_V8_MINIMAL_FEED_ITEM,\n} from '../types/FeedItem';\nimport { type NETGEM_API_V8_AUTHENT_REALM, NETGEM_API_V8_AUTHENT_REALM_NETGEM } from '../types/Realm';\nimport type { NETGEM_API_V8_PARENTAL_GUIDANCE } from '../types/ParentalGuidance';\nimport type { NETGEM_API_V8_RAW_FEED } from '../types/FeedResult';\nimport type { Undefined } from '@ntg/utils/dist/types';\nimport { addISO8601Duration } from './Date';\nimport { getBestLocationForItem } from './Score';\n\nexport enum SelectionStrategy {\n BestLocation,\n FirstLocation,\n}\n\nconst getIdType: (id: string) => string | null = (id) => {\n const result: Array<string> | null = /^([a-zA-Z]+)(:\\/\\/)/u.exec(id);\n return result && result.length > 1 ? result[1] : null;\n};\n\nconst getLocationType: (id?: string) => NETGEM_API_V8_ITEM_LOCATION_TYPE | null = (id) => {\n if (!id) {\n return null;\n }\n\n const type = getIdType(id);\n if (type) {\n return ((type: any): NETGEM_API_V8_ITEM_LOCATION_TYPE);\n }\n return null;\n};\n\nconst getItemType: (id: string) => ItemType | null = (id) => {\n const type = getIdType(id);\n if (type) {\n return ((type: any): ItemType);\n }\n return null;\n};\n\nconst getFirstLocation: (item: NETGEM_API_V8_MINIMAL_FEED_ITEM) => NETGEM_API_V8_ITEM_LOCATION | null = (item) => {\n const { locations } = getFirstElement(item);\n return locations && locations.length > 0 ? locations[0] : null;\n};\n\nconst getFirstElement: (item: NETGEM_API_V8_MINIMAL_FEED_ITEM) => NETGEM_API_V8_MINIMAL_FEED_ITEM = (item) => {\n const stack: Array<NETGEM_API_V8_MINIMAL_FEED_ITEM> = [item];\n\n while (stack.length > 0) {\n const rawItem = stack.pop();\n\n // Since flowjs v0.239.0, \"rawItem\" is said to be potentially undefined (which is impossible, here)\n if (!rawItem) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const { elements, locations } = rawItem;\n\n if (elements) {\n for (let i = 0; i < elements.length; i++) {\n stack.unshift(elements[i]);\n }\n } else if (locations) {\n return rawItem;\n }\n }\n\n return item;\n};\n\n// Return start and end times in seconds\nconst getLocationStartAndEndTime: (location: NETGEM_API_V8_ITEM_LOCATION) => { endTime: number, startTime: number } = (location) => {\n let { scheduledEventStartDate: startDate, scheduledEventDuration: duration } = location;\n\n if (!startDate) {\n ({ startDate } = location);\n if (!startDate) {\n startDate = MIN_DATE_ISO;\n }\n }\n\n if (!duration) {\n ({ duration } = location);\n if (!duration) {\n duration = ISO8601_DURATION_ZERO;\n }\n }\n\n const startTime = new Date(startDate).getTime() / MILLISECONDS_PER_SECOND;\n const endTime = addISO8601Duration(startDate, duration).getTime() / MILLISECONDS_PER_SECOND;\n\n return {\n endTime,\n startTime,\n };\n};\n\nconst getFirstLocationForItem: (item: NETGEM_API_V8_FEED_RAW_ITEM) => { location: NETGEM_API_V8_ITEM_LOCATION | null, programId: string | null } = (item) => {\n const stack = [item];\n\n while (stack.length > 0) {\n const rawItem = stack.pop();\n\n // Since flowjs v0.239.0, \"item\" is said to be potentially undefined (which is impossible, here)\n if (!rawItem) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const { elements, id, locations } = rawItem;\n\n if (elements) {\n for (let i = 0; i < elements.length; i++) {\n stack.unshift(elements[i]);\n }\n } else if (locations && locations.length > 0) {\n return {\n location: locations[0],\n programId: id,\n };\n }\n }\n\n return {\n location: null,\n programId: null,\n };\n};\n\n// Default value for selectionStrategy is SelectionStrategy.BestLocation\nconst buildFeedItem: (item: NETGEM_API_V8_FEED_RAW_ITEM, selectionStrategy?: SelectionStrategy) => NETGEM_API_V8_FEED_ITEM | null = (item, selectionStrategy) => {\n // Best location will be used to set selectedLocation property\n const { location: selectedLocation, programId: selectedProgramId } = selectionStrategy === SelectionStrategy.FirstLocation ? getFirstLocationForItem(item) : getBestLocationForItem(item);\n\n if (!selectedLocation || !selectedProgramId) {\n return null;\n }\n\n const { elements, id, locations, parentalGuidance, purchasable } = item;\n\n const { id: selectedLocationId, score: selectedLocationScore } = selectedLocation;\n const locType = getLocationType(selectedLocationId);\n const { endTime, startTime } = getLocationStartAndEndTime(selectedLocation);\n const type = getItemType(id);\n const seriesId = type === ItemType.Series ? id : null;\n\n const feedItem: NETGEM_API_V8_FEED_ITEM = {\n endTime,\n id,\n locType,\n selectedLocation,\n selectedProgramId,\n seriesId,\n startTime,\n type,\n };\n\n if (elements) {\n feedItem.elements = deepCopyElements(elements);\n }\n\n if (locations) {\n feedItem.locations = deepCopyLocations(locations);\n }\n\n if (parentalGuidance) {\n feedItem.parentalGuidance = deepCopyParentalGuidance(parentalGuidance);\n }\n\n if (purchasable !== undefined) {\n feedItem.purchasable = purchasable;\n }\n\n if (selectedLocationScore) {\n feedItem.score = [...selectedLocationScore];\n }\n\n return feedItem;\n};\n\nconst getFeedItemChannelIds: (item: NETGEM_API_V8_FEED_RAW_ITEM) => Set<string> = (item) => {\n const channelIds = new Set<string>();\n const stack = [item];\n\n while (stack.length > 0) {\n const rawItem = stack.pop();\n\n // Since flowjs v0.239.0, \"rawItem\" is said to be potentially undefined (which is impossible, here)\n if (!rawItem) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const { elements, locations } = rawItem;\n\n if (elements) {\n for (let i = 0; i < elements.length; ++i) {\n stack.unshift(elements[i]);\n }\n } else if (locations) {\n for (let j = 0; j < locations.length; ++j) {\n const { [j]: location } = locations;\n const { channelId } = location;\n if (channelId) {\n channelIds.add(channelId);\n }\n }\n }\n }\n\n return channelIds;\n};\n\nconst deepCopyLocationsForChannel: (locations: Array<NETGEM_API_V8_ITEM_LOCATION>, selectedChannelId: string) => Array<NETGEM_API_V8_ITEM_LOCATION> = (locations, selectedChannelId) => {\n const filteredLocations = locations.filter((loc) => loc.channelId === selectedChannelId);\n return deepCopyLocations(filteredLocations);\n};\n\nconst deepCopyElementsForChannel: (elements: NETGEM_API_V8_RAW_FEED, selectedChannelId: string) => NETGEM_API_V8_RAW_FEED = (elements, selectedChannelId) =>\n elements.map((el) => deepCopyFeedItemForChannel(el, selectedChannelId));\n\nconst deepCopyFeedItemForChannel: (item: NETGEM_API_V8_FEED_RAW_ITEM, selectedChannelId: string) => NETGEM_API_V8_FEED_RAW_ITEM = (item, selectedChannelId) => {\n const { elements, id, locations, parentalGuidance, score } = item;\n\n const clonedItem: NETGEM_API_V8_FEED_RAW_ITEM = { id };\n\n if (elements) {\n clonedItem.elements = deepCopyElementsForChannel(elements, selectedChannelId);\n }\n\n if (locations) {\n const clonedLocations = deepCopyLocationsForChannel(locations, selectedChannelId);\n if (clonedLocations.length > 0) {\n // Due to the channel filtering, locations can be reduced to an empty array, and in this case, we let it undefined\n clonedItem.locations = clonedLocations;\n }\n }\n\n if (parentalGuidance) {\n clonedItem.parentalGuidance = deepCopyParentalGuidance(parentalGuidance);\n }\n\n if (score) {\n clonedItem.score = [...score];\n }\n\n return clonedItem;\n};\n\nconst splitFeedItemByChannels: (item: NETGEM_API_V8_FEED_RAW_ITEM) => Array<{| channelId: string, rawItem: NETGEM_API_V8_FEED_RAW_ITEM |}> = (item) => {\n const channelIds = getFeedItemChannelIds(item);\n\n if (channelIds.size === 1) {\n // Only one channel in this item\n return [{ channelId: [...channelIds.keys()][0], rawItem: item }];\n }\n\n // More than one channel in this item: let's create copies\n return [...channelIds].map((channelId) => {\n return { channelId, rawItem: deepCopyFeedItemForChannel(item, channelId) };\n });\n};\n\nconst deepCopyParentalGuidance: (parentalGuidance: NETGEM_API_V8_PARENTAL_GUIDANCE) => NETGEM_API_V8_PARENTAL_GUIDANCE = (parentalGuidance) => {\n const { explanatoryText, minimumAge } = parentalGuidance;\n\n const clonedParentalGuidance: NETGEM_API_V8_PARENTAL_GUIDANCE = { minimumAge };\n\n if (explanatoryText) {\n clonedParentalGuidance.explanatoryText = [...explanatoryText];\n }\n\n return clonedParentalGuidance;\n};\n\nconst deepCopyElements: (elements: NETGEM_API_V8_RAW_FEED) => NETGEM_API_V8_RAW_FEED = (elements) =>\n elements.map(({ elements: itemElements, id, locations, parentalGuidance, purchasable, score }) => {\n const clonedItem: NETGEM_API_V8_FEED_RAW_ITEM = { id };\n\n if (itemElements) {\n clonedItem.elements = deepCopyElements(itemElements);\n }\n\n if (locations) {\n clonedItem.locations = deepCopyLocations(locations);\n }\n\n if (parentalGuidance) {\n clonedItem.parentalGuidance = deepCopyParentalGuidance(parentalGuidance);\n }\n\n if (purchasable !== undefined) {\n clonedItem.purchasable = purchasable;\n }\n\n if (score) {\n clonedItem.score = [...score];\n }\n\n return clonedItem;\n });\nconst deepCopyLocations: (locations: Array<NETGEM_API_V8_ITEM_LOCATION>) => Array<NETGEM_API_V8_ITEM_LOCATION> = (locations) =>\n locations.map(\n ({ availabilityEndDate, availabilityStartDate, channelId, duration, id, parentalGuidance, previewAvailabilityStartDate, scheduledEventDuration, scheduledEventStartDate, score, startDate }) => {\n const clonedLocation: NETGEM_API_V8_ITEM_LOCATION = { id, score: [...score] };\n\n if (availabilityEndDate) {\n clonedLocation.availabilityEndDate = availabilityEndDate;\n }\n\n if (availabilityStartDate) {\n clonedLocation.availabilityStartDate = availabilityStartDate;\n }\n\n if (channelId) {\n clonedLocation.channelId = channelId;\n }\n\n if (duration) {\n clonedLocation.duration = duration;\n }\n\n if (parentalGuidance) {\n clonedLocation.parentalGuidance = deepCopyParentalGuidance(parentalGuidance);\n }\n\n if (previewAvailabilityStartDate) {\n clonedLocation.previewAvailabilityStartDate = previewAvailabilityStartDate;\n }\n\n if (scheduledEventDuration) {\n clonedLocation.scheduledEventDuration = scheduledEventDuration;\n }\n\n if (scheduledEventStartDate) {\n clonedLocation.scheduledEventStartDate = scheduledEventStartDate;\n }\n\n if (startDate) {\n clonedLocation.startDate = startDate;\n }\n\n return clonedLocation;\n },\n );\n\nconst deepCopyRawItem: (item: NETGEM_API_V8_FEED_RAW_ITEM) => NETGEM_API_V8_FEED_RAW_ITEM = (item) => {\n const { elements, id, locations, parentalGuidance, purchasable, score } = item;\n\n const clonedItem: NETGEM_API_V8_FEED_RAW_ITEM = { id };\n\n if (elements) {\n clonedItem.elements = deepCopyElements(elements);\n }\n\n if (locations) {\n clonedItem.locations = deepCopyLocations(locations);\n }\n\n if (parentalGuidance) {\n clonedItem.parentalGuidance = deepCopyParentalGuidance(parentalGuidance);\n }\n\n if (purchasable !== undefined) {\n clonedItem.purchasable = purchasable;\n }\n\n if (score) {\n clonedItem.score = [...score];\n }\n\n return clonedItem;\n};\n\nconst findLocationInLocations: (locationId: string, locations?: Array<NETGEM_API_V8_ITEM_LOCATION>) => Undefined<NETGEM_API_V8_ITEM_LOCATION> = (locationId, locations) => {\n if (!locations) {\n return undefined;\n }\n\n for (const loc of locations) {\n if (loc.id === locationId) {\n return loc;\n }\n }\n\n return undefined;\n};\n\nconst findLocationOrDefault: (locationId: string, itemLocations?: Array<NETGEM_API_V8_ITEM_LOCATION>, itemElements?: NETGEM_API_V8_RAW_FEED) => Undefined<NETGEM_API_V8_ITEM_LOCATION> = (\n locationId,\n itemLocations,\n itemElements,\n) => {\n const location = findLocationInLocations(locationId, itemLocations);\n\n if (location !== undefined) {\n return location;\n }\n\n let defaultLocation = itemLocations?.[0];\n\n if (itemElements === undefined) {\n return defaultLocation;\n }\n\n const stack = [...itemElements];\n\n while (stack.length > 0) {\n const item = stack.pop();\n\n // Since flowjs v0.239.0, \"item\" is said to be potentially undefined (which is impossible, here)\n if (!item) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const { elements, locations } = item;\n\n if (elements) {\n for (let i = 0; i < elements.length; i++) {\n stack.unshift(elements[i]);\n }\n } else if (locations) {\n if (locations.length > 0 && defaultLocation === null) {\n [defaultLocation] = locations;\n }\n\n const loc = findLocationInLocations(locationId, locations);\n if (loc !== undefined) {\n return loc;\n }\n }\n }\n\n return defaultLocation;\n};\n\nconst deepCopyItem: (item: NETGEM_API_V8_FEED_ITEM) => NETGEM_API_V8_FEED_ITEM = (item) => {\n const { elements, endTime, id, locType, locations, parentalGuidance, purchasable, score, selectedLocation, selectedProgramId, seriesId, startTime, type } = item;\n\n const clonedElements = elements ? deepCopyElements(elements) : undefined;\n const clonedLocations = locations ? deepCopyLocations(locations) : undefined;\n const clonedSelectedLocation = findLocationOrDefault(selectedLocation.id, clonedLocations, clonedElements);\n\n const clonedItem: NETGEM_API_V8_FEED_ITEM = {\n endTime,\n id,\n locType,\n // Following nullish coalescing is only there to calm down Flow, but clonedSelectedLocation cannot theoretically be undefined since the cloned item necessarily has at least one location\n selectedLocation: clonedSelectedLocation ?? selectedLocation,\n selectedProgramId,\n seriesId,\n startTime,\n type,\n };\n\n if (clonedElements) {\n clonedItem.elements = clonedElements;\n }\n\n if (clonedLocations) {\n clonedItem.locations = clonedLocations;\n }\n\n if (parentalGuidance) {\n clonedItem.parentalGuidance = deepCopyParentalGuidance(parentalGuidance);\n }\n\n if (purchasable !== undefined) {\n clonedItem.purchasable = purchasable;\n }\n\n if (score) {\n clonedItem.score = [...score];\n }\n\n return clonedItem;\n};\n\nconst getItemContentType: (item: NETGEM_API_V8_FEED_ITEM, authority?: NETGEM_API_V8_AUTHENT_REALM) => ItemContent = (item, authority) => {\n const { locType } = item;\n\n if (locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_SVOD) {\n if (authority === NETGEM_API_V8_AUTHENT_REALM_NETGEM) {\n return ItemContent.NetgemSVOD;\n }\n\n return ItemContent.VODOrDeeplink;\n }\n\n if (\n locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_APP ||\n locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_EST ||\n locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_TVOD ||\n locType === NETGEM_API_V8_ITEM_LOCATION_TYPE_VOD\n ) {\n return ItemContent.VODOrDeeplink;\n }\n\n return ItemContent.TV;\n};\n\nexport { buildFeedItem, deepCopyItem, deepCopyRawItem, getFirstLocation, getItemContentType, getItemType, getLocationStartAndEndTime, getLocationType, splitFeedItemByChannels };\n","/* @flow */\n\nimport { type NETGEM_API_V8_LANG } from '../types/Lang';\n\nconst getTranslatedText: (langArray: ?Array<NETGEM_API_V8_LANG>, language: ?string) => string = (langArray, language) => {\n if (!langArray || !language) {\n return '';\n }\n\n let translatedText = '';\n const baseLang = (language.includes('-') ? language.substring(0, language.indexOf('-')) : language).toUpperCase();\n\n for (let i: number = 0; i < langArray.length; i++) {\n const {\n [i]: { lang, value },\n } = langArray;\n\n if (lang.toUpperCase() === baseLang) {\n translatedText = value;\n break;\n } else if (translatedText === '') {\n translatedText = value;\n }\n }\n\n return translatedText;\n};\n\nexport default getTranslatedText;\n","/* @flow */\n\nimport {\n type NETGEM_API_V8_RECORDINGS_FUTURE,\n type NETGEM_API_V8_RECORDINGS_STATUS,\n type NETGEM_API_V8_SCHEDULED_RECORDING,\n type NETGEM_FUTURE_RECORDINGS_STATUS,\n type NETGEM_RECORDINGS_MAP,\n type NETGEM_RECORDINGS_STATUS_ITEM,\n type NETGEM_SCHEDULED_RECORDINGS_MAP,\n type NETGEM_SCHEDULED_RECORDINGS_MAP_AND_ETAGS,\n} from '../types/Npvr';\nimport type { ETAG_MAP } from '../types/ETag';\nimport type { NETGEM_API_V8_RAW_FEED } from '../types/FeedResult';\nimport { getIso8601DurationInSeconds } from '../../../../helpers/dateTime/Format';\n\nconst getRecordingsMap: (feed: NETGEM_API_V8_RAW_FEED) => NETGEM_RECORDINGS_MAP = (feed) => {\n const m: NETGEM_RECORDINGS_MAP = {};\n const q: NETGEM_API_V8_RAW_FEED = [...feed];\n\n while (q.length > 0) {\n const item = q.pop();\n\n // Since flowjs v0.239.0, \"item\" is said to be potentially undefined (which is impossible, here)\n if (!item) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const { elements } = item;\n\n if (elements) {\n elements.forEach((elt) => q.unshift(elt));\n } else {\n const { id, locations } = item;\n if (locations && locations.length > 0) {\n m[id] = locations;\n }\n }\n }\n\n return m;\n};\n\nconst getScheduledRecordingsMap: (scheduledRecordingList: Array<{| eTag: string, scheduledRecording: NETGEM_API_V8_SCHEDULED_RECORDING |}>) => NETGEM_SCHEDULED_RECORDINGS_MAP_AND_ETAGS = (\n scheduledRecordingList,\n) => {\n const eTags: ETAG_MAP = {};\n const scheduledRecordings: NETGEM_SCHEDULED_RECORDINGS_MAP = {};\n\n scheduledRecordingList.forEach((obj) => {\n const { eTag, scheduledRecording } = obj;\n const { description } = scheduledRecording;\n const { requestedScheduledEventId, seriesId } = (description: any);\n\n const targetAssetId = seriesId || requestedScheduledEventId;\n if (targetAssetId) {\n const { id: scheduledRecordingId } = scheduledRecording;\n eTags[scheduledRecordingId] = eTag;\n scheduledRecordings[targetAssetId] = scheduledRecording;\n }\n });\n\n return {\n eTags,\n scheduledRecordings,\n };\n};\n\nconst getScheduledRecordingsMapV2: (scheduledRecordingListFull: Array<NETGEM_API_V8_SCHEDULED_RECORDING>) => NETGEM_SCHEDULED_RECORDINGS_MAP = (scheduledRecordingListFull) => {\n const scheduledRecordings: NETGEM_SCHEDULED_RECORDINGS_MAP = {};\n\n scheduledRecordingListFull.forEach((scheduledRecording) => {\n const {\n description: { requestedScheduledEventId, seriesId },\n } = scheduledRecording;\n const targetAssetId = seriesId ?? requestedScheduledEventId;\n\n if (targetAssetId) {\n scheduledRecordings[targetAssetId] = scheduledRecording;\n }\n });\n\n return scheduledRecordings;\n};\n\nconst getCountAndDuration: (statusItem: NETGEM_API_V8_RECORDINGS_STATUS) => NETGEM_RECORDINGS_STATUS_ITEM = (statusItem) => {\n const { count, duration } = statusItem;\n\n return {\n count,\n duration: getIso8601DurationInSeconds(duration),\n };\n};\n\nconst getRecordingsStatus: (future: NETGEM_API_V8_RECORDINGS_FUTURE) => NETGEM_FUTURE_RECORDINGS_STATUS = (future) => {\n const { current, expectedError, expectedSuccess, maxQuota } = future;\n\n return {\n current: getCountAndDuration(current),\n expectedError: getCountAndDuration(expectedError),\n expectedSuccess: getCountAndDuration(expectedSuccess),\n maxQuota: getCountAndDuration(maxQuota),\n };\n};\n\nexport { getRecordingsMap, getRecordingsStatus, getScheduledRecordingsMap, getScheduledRecordingsMapV2 };\n","/* @flow */\n\nimport type { NETGEM_API_V8_HEADERS, NETGEM_API_V8_REQUEST_HEADERS } from '../types/Headers';\nimport { HeaderName } from '../constants/Headers';\nimport type { KeyValuePair } from '@ntg/utils/dist/types';\n\nconst addAuthenticationHeader: (headerList: NETGEM_API_V8_REQUEST_HEADERS, authenticationToken: string | null) => void = (headerList, authenticationToken) => {\n if (!authenticationToken) {\n return;\n }\n\n headerList.push({\n name: HeaderName.Authorization,\n value: `Bearer ${authenticationToken}`,\n });\n};\n\nconst addETagHeader: (headerList: NETGEM_API_V8_REQUEST_HEADERS, eTag: string | null) => void = (headerList, eTag) => {\n if (!eTag) {\n return;\n }\n\n const existingETag = headerList.find((h) => h.name === HeaderName.IfNoneMatch);\n if (existingETag) {\n return;\n }\n\n headerList.push({\n name: HeaderName.IfNoneMatch,\n value: eTag,\n });\n};\n\nconst buildHeaderList: (...args: Array<any>) => NETGEM_API_V8_REQUEST_HEADERS = (...args) => {\n const headerList: NETGEM_API_V8_REQUEST_HEADERS = [];\n const ARGUMENT_STEP = 2;\n\n const { length } = args;\n if (length > 1) {\n for (let i = 0; i < length - 1; i += ARGUMENT_STEP) {\n const { [i]: name, [i + 1]: value } = args;\n\n if (name && value !== undefined && value !== null) {\n headerList.push({\n name,\n value,\n });\n }\n }\n }\n\n return headerList;\n};\n\nconst parseResponseHeaders: (responseHeaders: ?string) => NETGEM_API_V8_HEADERS = (responseHeaders) => {\n const headers: KeyValuePair<string> = {};\n\n if (responseHeaders) {\n responseHeaders.split('\\r\\n').forEach((header) => {\n const [key, ...value] = header.trim().split(':');\n if (key) {\n headers[key.trim().toLowerCase()] = value.join(':').trim();\n }\n });\n }\n\n return headers;\n};\n\nconst getResponseHeader: (headers?: NETGEM_API_V8_HEADERS | null, header: string) => string | null = (headers, header) => {\n if (!headers) {\n return null;\n }\n\n let key: string = '';\n switch (header) {\n case HeaderName.Accept:\n key = 'accept';\n break;\n case HeaderName.AppKey:\n key = 'app_key';\n break;\n case HeaderName.Authorization:\n key = 'authorization';\n break;\n case HeaderName.ContentType:\n key = 'content-type';\n break;\n case HeaderName.IfMatch:\n key = 'if-match';\n break;\n case HeaderName.IfNoneMatch:\n key = 'if-none-match';\n break;\n case HeaderName.VuDrmToken:\n key = 'x-vudrm-token';\n break;\n case HeaderName.WwwAuthenticate:\n key = 'www-authenticate';\n break;\n\n // No default\n }\n\n return headers[key] ?? null;\n};\n\nexport { addAuthenticationHeader, addETagHeader, buildHeaderList, getResponseHeader, parseResponseHeaders };\n","/* @flow */\n\nimport type { NETGEM_API_V8_FEED, NETGEM_API_V8_ITEM_LOCATION, NETGEM_API_V8_ITEM_SCORE, NETGEM_API_V8_MINIMAL_FEED_ITEM } from '../types/FeedItem';\nimport type { NETGEM_API_V8_FEED_SCORING, ScoreContextType } from '../types/Feed';\nimport { getLocationStartAndEndTime, getLocationType } from './Item';\nimport type { NETGEM_API_VIEWINGHISTORY_PLAYED_ITEMS } from '../types/ViewingHistory';\nimport { compareLocationScore } from './Filter';\nimport { getIso8601DateInSeconds } from '../../../../helpers/dateTime/Format';\nimport { getRandomInteger } from '../../../../helpers/maths/maths';\nimport { getRoundedNowToISOString } from './Date';\nimport sha256 from 'crypto-js/sha256';\n\nconst getLastPlayedTime: (loc: NETGEM_API_V8_ITEM_LOCATION, playedItemsMap: ?NETGEM_API_VIEWINGHISTORY_PLAYED_ITEMS) => number = (loc, playedItemsMap) => {\n if (!playedItemsMap) {\n return 0;\n }\n\n const { id } = loc;\n if (!id) {\n return 0;\n }\n\n const { [id]: item } = playedItemsMap;\n if (!item) {\n return 0;\n }\n\n return new Date(item.date).getTime();\n};\n\nconst calculateLocationScore: (loc: NETGEM_API_V8_ITEM_LOCATION, scoring: NETGEM_API_V8_FEED_SCORING, context?: ScoreContextType) => NETGEM_API_V8_ITEM_SCORE = (loc, scoring, context) => {\n const score: NETGEM_API_V8_ITEM_SCORE = [];\n const { channelId, id: assetId = '', startDate } = loc;\n const playedItemsMap = context?.playedItemsMap;\n const sessionId = context?.sessionId;\n\n const channel = channelId && context?.channels ? context?.channels[channelId] : null;\n\n for (let i = 0; i < scoring.length; i++) {\n const { args = [], op, order = 'asc' } = scoring[i];\n let value = 0;\n\n switch (op) {\n case 'broadcastTime':\n value = getIso8601DateInSeconds(startDate);\n break;\n\n case 'const':\n value = args.length > 0 ? Number(args[0]) : 0;\n break;\n\n case 'favouriteChannel':\n // Use \"channel.isFavourite ? 1 : 0;\" to enable favourite channel feature\n value = 0;\n break;\n\n case 'lastPlayedTime':\n value = getLastPlayedTime(loc, playedItemsMap);\n break;\n\n case 'lcn':\n value = channel ? (order === 'asc' ? 1 : -1) * channel.number : 0;\n break;\n\n case 'random':\n if (args.length > 0) {\n if (args[0] === 'session' && sessionId) {\n value = sha256(`${sessionId}-${assetId}`).toString();\n } else if (args[0] === 'now') {\n const [, rounding, offset] = args;\n if (typeof rounding === 'number' && (offset === undefined || typeof offset === 'number')) {\n const now = getRoundedNowToISOString(rounding, offset);\n value = sha256(`${now}-${assetId}`).toString();\n }\n }\n } else {\n value = getRandomInteger(0, Number.MAX_SAFE_INTEGER);\n }\n break;\n\n default:\n value = 0;\n }\n\n if (order === 'desc') {\n value = -value;\n }\n\n score.push(value);\n }\n\n return score;\n};\n\nconst setLocationsScore: (locations: Array<NETGEM_API_V8_ITEM_LOCATION>, scoring: NETGEM_API_V8_FEED_SCORING, context?: ScoreContextType) => void = (locations, scoring, context) => {\n locations.forEach((loc) => {\n loc.score = calculateLocationScore(loc, scoring, context);\n });\n};\n\nconst getBestLocation: (locations: ?Array<NETGEM_API_V8_ITEM_LOCATION>) => NETGEM_API_V8_ITEM_LOCATION | null = (locations) => {\n if (!locations) {\n return null;\n }\n\n let bestLocation: NETGEM_API_V8_ITEM_LOCATION | null = null;\n\n locations.forEach((loc) => {\n if (!bestLocation || compareLocationScore(loc, bestLocation) < 0) {\n bestLocation = loc;\n }\n });\n\n return bestLocation;\n};\n\nconst getBestLocationForItem: (item: NETGEM_API_V8_MINIMAL_FEED_ITEM) => { location: NETGEM_API_V8_ITEM_LOCATION | null, programId: string } = (item) => {\n const { elements, id, locations } = item;\n\n let bestLocation = getBestLocation(locations);\n let bestProgramId = id;\n\n if (elements) {\n elements.forEach((e) => {\n const { location, programId } = getBestLocationForItem(e);\n if (!bestLocation || (location && compareLocationScore(location, bestLocation) < 0)) {\n bestLocation = location;\n bestProgramId = programId;\n }\n });\n }\n\n return {\n location: bestLocation,\n programId: bestProgramId,\n };\n};\n\nconst updateSelectedLocation: (feed: NETGEM_API_V8_FEED) => void = (feed) => {\n feed.forEach((item) => {\n const { location, programId } = getBestLocationForItem(item);\n\n if (location && programId) {\n const { id, score } = location;\n const { endTime, startTime } = getLocationStartAndEndTime(location);\n\n item.selectedLocation = location;\n item.selectedProgramId = programId;\n item.locType = getLocationType(id);\n item.score = score;\n item.startTime = startTime;\n item.endTime = endTime;\n }\n });\n};\n\nexport { calculateLocationScore, getBestLocationForItem, setLocationsScore, updateSelectedLocation };\n","/* @flow */\n\nimport type { NETGEM_API_V8_MATCHING_SCHEDULED_RECORDING, RecordingOutcome } from './Npvr';\nimport type { NETGEM_API_V8_PARENTAL_GUIDANCE } from './ParentalGuidance';\nimport type { NETGEM_API_V8_RAW_FEED } from './FeedResult';\n\n// Raw item description (as received from platform)\n\nexport type NETGEM_API_V8_ITEM_SCORE = Array<number | string>;\n\nexport type NETGEM_API_V8_ITEM_LOCATION = {|\n availabilityEndDate?: string,\n availabilityStartDate?: string,\n channelId?: string,\n duration?: string,\n id: string,\n matchingScheduledRecordings?: Array<NETGEM_API_V8_MATCHING_SCHEDULED_RECORDING>,\n parentalGuidance?: NETGEM_API_V8_PARENTAL_GUIDANCE,\n previewAvailabilityStartDate?: string,\n quotaUsed?: string,\n recordOutcome?: RecordingOutcome,\n scheduledEventDuration?: string,\n scheduledEventStartDate?: string,\n score: NETGEM_API_V8_ITEM_SCORE,\n startDate?: string,\n|};\n\nexport type NETGEM_API_V8_FEED_RAW_ITEM = {|\n elements?: NETGEM_API_V8_RAW_FEED,\n id: string,\n locations?: Array<NETGEM_API_V8_ITEM_LOCATION>,\n parentalGuidance?: NETGEM_API_V8_PARENTAL_GUIDANCE,\n purchasable?: boolean,\n score?: NETGEM_API_V8_ITEM_SCORE,\n|};\n\n// Filtered item description (usable by UI)\nexport enum ItemLocationType {}\n\nexport const NETGEM_API_V8_ITEM_LOCATION_TYPE_APP: 'app' = 'app';\nexport const NETGEM_API_V8_ITEM_LOCATION_TYPE_CATCHUP: 'catchup' = 'catchup';\nexport const NETGEM_API_V8_ITEM_LOCATION_TYPE_EST: 'est' = 'est';\nexport const NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING: 'recording' = 'recording';\nexport const NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT: 'scheduledevent' = 'scheduledevent';\nexport const NETGEM_API_V8_ITEM_LOCATION_TYPE_SVOD: 'svod' = 'svod';\nexport const NETGEM_API_V8_ITEM_LOCATION_TYPE_TVOD: 'tvod' = 'tvod';\nexport const NETGEM_API_V8_ITEM_LOCATION_TYPE_VOD: 'vod' = 'vod';\n\n// Cannot convert to Flow enum because it's used as an object's key\nexport type NETGEM_API_V8_ITEM_LOCATION_TYPE =\n | typeof NETGEM_API_V8_ITEM_LOCATION_TYPE_APP\n | typeof NETGEM_API_V8_ITEM_LOCATION_TYPE_CATCHUP\n | typeof NETGEM_API_V8_ITEM_LOCATION_TYPE_EST\n | typeof NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING\n | typeof NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT\n | typeof NETGEM_API_V8_ITEM_LOCATION_TYPE_SVOD\n | typeof NETGEM_API_V8_ITEM_LOCATION_TYPE_TVOD\n | typeof NETGEM_API_V8_ITEM_LOCATION_TYPE_VOD;\n\nexport enum ItemContent {\n VODOrDeeplink = 'vod_or_deeplink',\n NetgemSVOD = 'netgem_svod',\n TV = 'tv',\n Unknown = 'unknown',\n}\n\nexport enum VodKind {\n EST = 'est',\n SVOD = 'svod',\n TVOD = 'tvod',\n VOD = 'vod',\n}\n\n// Specify if item is related to a 'grouped' content (ex: series, season, ...) or not (ex: single program)\nexport enum ItemType {\n Channel = 'channel',\n ChannelGroup = 'channelgr',\n FakeItem = 'fakeitem',\n Program = 'program',\n Series = 'series',\n Universe = 'univers',\n}\n\nexport type NETGEM_API_V8_FEED_ITEM = {|\n ...NETGEM_API_V8_FEED_RAW_ITEM,\n endTime: number,\n locType: ?NETGEM_API_V8_ITEM_LOCATION_TYPE,\n selectedLocation: NETGEM_API_V8_ITEM_LOCATION,\n selectedProgramId: string,\n seriesId: ?string,\n startTime: number,\n type: ?ItemType,\n|};\n\nexport type NETGEM_API_V8_FEED = Array<NETGEM_API_V8_FEED_ITEM>;\n\nexport type NETGEM_API_V8_MIXED_FEED = Array<NETGEM_API_V8_FEED_ITEM | NETGEM_API_V8_FEED_RAW_ITEM>;\n\nexport type NETGEM_API_V8_MINIMAL_FEED_ITEM = { ...NETGEM_API_V8_FEED_RAW_ITEM };\n","/* @flow */\n\nexport enum HttpMethod {\n DELETE,\n GET,\n PATCH,\n POST,\n PUT,\n}\n","/* @flow */\n\nimport type { NETGEM_API_V8_AUTHENT_REALM } from './Realm';\nimport type { NETGEM_API_V8_CREDIT } from './Credit';\nimport type { NETGEM_API_V8_EPISODE_OF } from './EpisodeOf';\nimport type { NETGEM_API_V8_LANG } from './Lang';\nimport type { NETGEM_API_V8_PARENTAL_GUIDANCE } from './ParentalGuidance';\nimport type { NETGEM_API_V8_PLAYBACK_URL } from './MetadataSchedule';\n\nexport const METADATA_KIND_PROGRAM: 'program' = 'program';\nexport const METADATA_KIND_SERIES: 'series' = 'series';\n\n// Cannot convert to Flow enum because it's used to refine types\nexport type MetadataKind = typeof METADATA_KIND_PROGRAM | typeof METADATA_KIND_SERIES;\n\nexport type NETGEM_API_V8_METADATA_PROVIDER_INFO = {|\n distributorId?: string,\n // TIT Id or VTI Id\n id: string,\n viewingHistoryId: string,\n|};\n\nexport type NETGEM_API_V8_METADATA_IMAGE = {|\n id: string,\n size: {|\n height: number,\n width: number,\n |},\n tags?: Array<string>,\n|};\n\ntype NETGEM_API_V8_METADATA_BASE = {|\n category: {|\n lang: string,\n value: string,\n |},\n credits?: Array<NETGEM_API_V8_CREDIT>,\n genres: {|\n lang: string,\n values: Array<string>,\n |},\n id: string,\n images: Array<NETGEM_API_V8_METADATA_IMAGE>,\n productionCountry: string,\n providerInfo: NETGEM_API_V8_METADATA_PROVIDER_INFO,\n releaseDate: string,\n synopses: Array<NETGEM_API_V8_LANG>,\n titles: Array<NETGEM_API_V8_LANG>,\n trailerUrl?: NETGEM_API_V8_PLAYBACK_URL,\n|};\n\nexport type NETGEM_API_V8_METADATA_PROGRAM = {|\n ...NETGEM_API_V8_METADATA_BASE,\n authority?: NETGEM_API_V8_AUTHENT_REALM,\n duration: string,\n episodeOf?: NETGEM_API_V8_EPISODE_OF,\n memberOf: Array<any>,\n parentalGuidance?: NETGEM_API_V8_PARENTAL_GUIDANCE,\n type: typeof METADATA_KIND_PROGRAM,\n|};\n\nexport type NETGEM_API_V8_METADATA_SERIES = {|\n ...NETGEM_API_V8_METADATA_BASE,\n relatedMaterial: Array<{|\n howRelated: string,\n url: string,\n |}>,\n type: typeof METADATA_KIND_SERIES,\n|};\n\nexport type NETGEM_API_V8_METADATA = NETGEM_API_V8_METADATA_PROGRAM | NETGEM_API_V8_METADATA_SERIES;\n","/* @flow */\n\nimport type { METRICS_PARAMS, METRICS_TYPE } from './Channel';\nimport { Definition } from '../../../../helpers/ui/metadata/Types';\nimport { Drm } from '../../../../helpers/jsHelpers/Drm';\nimport type { KeyValuePair } from '@ntg/utils/dist/types';\nimport type { NETGEM_API_V8_AUTHENT_REALM } from './Realm';\nimport type { NETGEM_API_V8_LOCATION_RIGHTS } from './Rights';\nimport type { NETGEM_API_V8_METADATA_PROVIDER_INFO } from './MetadataProgram';\nimport { type NETGEM_API_V8_URL_DEFINITION } from './NtgVideoFeed';\nimport type { RecordingOutcome } from './Npvr';\n\nexport enum StreamType {\n DASH = 'dash',\n HLS = 'hls',\n MP4 = 'mp4',\n MSS = 'mss',\n Smooth = 'smooth',\n}\n\nexport const STREAM_TYPE_PRIORITIES: Array<StreamType> = Object.freeze([StreamType.DASH, StreamType.HLS, StreamType.MSS, StreamType.MP4, StreamType.Smooth]);\n\nexport type NETGEM_API_V8_METADATA_SCHEDULE_VIDEO_STREAM_DRM_LAURL_PARAM = {|\n url: string,\n|};\n\nexport type NETGEM_API_V8_METADATA_SCHEDULE_VIDEO_STREAM_DRM_CUSTOMDATA_PARAM = {|\n customData: string,\n|};\n\nexport type NETGEM_API_V8_METADATA_SCHEDULE_VIDEO_STREAM_ENTITLEMENT_PARAM = {|\n customData: string,\n service: string,\n url: string,\n|};\n\nexport type NETGEM_API_V8_METADATA_SCHEDULE_VIDEO_STREAM_DRM_PARAM = {|\n customData?: NETGEM_API_V8_METADATA_SCHEDULE_VIDEO_STREAM_DRM_CUSTOMDATA_PARAM,\n laUrl?: NETGEM_API_V8_METADATA_SCHEDULE_VIDEO_STREAM_DRM_LAURL_PARAM,\n ntgEntitlement?: NETGEM_API_V8_METADATA_SCHEDULE_VIDEO_STREAM_ENTITLEMENT_PARAM,\n type?: Drm,\n|};\n\nexport type NETGEM_API_V8_METADATA_SCHEDULE_VIDEO_STREAM_VIDEO_RES_PARAM = {|\n h: number,\n w: number,\n|};\n\nexport type NETGEM_API_V8_METADATA_SCHEDULE_VIDEO_STREAM_VIDEO_PARAM = {|\n bitrate?: number,\n res?: NETGEM_API_V8_METADATA_SCHEDULE_VIDEO_STREAM_VIDEO_RES_PARAM,\n|};\n\nexport type NETGEM_API_V8_METADATA_SCHEDULE_VIDEO_STREAM_PROPERTY_PARAM = {|\n hint?: string,\n videos?: Array<NETGEM_API_V8_METADATA_SCHEDULE_VIDEO_STREAM_VIDEO_PARAM>,\n|};\n\nexport type NETGEM_API_V8_METADATA_SCHEDULE_VIDEO_STREAM_PARAM = {|\n drms: Array<NETGEM_API_V8_METADATA_SCHEDULE_VIDEO_STREAM_DRM_PARAM>,\n path: string,\n properties?: Array<NETGEM_API_V8_METADATA_SCHEDULE_VIDEO_STREAM_PROPERTY_PARAM>,\n type: StreamType,\n|};\n\nexport type NETGEM_API_V8_METADATA_LOCATION_VIDEO_STREAM_PARAM = {|\n drms: Array<NETGEM_API_V8_METADATA_SCHEDULE_VIDEO_STREAM_DRM_PARAM>,\n path: string,\n properties?: KeyValuePair<Array<any>>,\n type: StreamType,\n|};\n\nexport type NETGEM_API_V8_PRICE = {|\n amount: number,\n currency: string,\n display: string,\n|};\n\nexport type NETGEM_API_V8_VOD_PURCHASEINFO = {|\n vtiId: number,\n definition: Definition,\n licenseDuration: string,\n priceOptions?: Array<NETGEM_API_V8_PRICE>,\n|};\n\nexport type NETGEM_API_V8_PLAYBACK_URL = {|\n player: string,\n start: NETGEM_API_V8_URL_DEFINITION,\n|};\n\nexport type LOCATION_METADATA_METRICS = {|\n type: METRICS_TYPE,\n properties: METRICS_PARAMS,\n|};\n\nexport type NETGEM_API_V8_METADATA_SCHEDULE_LOCATION = {|\n authority?: NETGEM_API_V8_AUTHENT_REALM,\n availabilityEndDate?: string,\n availabilityStartDate?: string,\n channelId: string,\n duration: string,\n endMargin?: string,\n id: string,\n isLivePlaybackEnabled?: boolean,\n metrics?: Array<LOCATION_METADATA_METRICS>,\n playbackUrls?: Array<NETGEM_API_V8_PLAYBACK_URL>,\n programId?: string,\n providerInfo?: NETGEM_API_V8_METADATA_PROVIDER_INFO,\n purchaseInfo?: NETGEM_API_V8_VOD_PURCHASEINFO,\n recordOutcome: RecordingOutcome,\n rights?: NETGEM_API_V8_LOCATION_RIGHTS,\n scheduledRecordId?: string,\n startDate?: string,\n startMargin?: string,\n target: string,\n targetProgram: {|\n id: string,\n episodeOf?: {|\n id: string,\n |},\n |},\n tracking?: {|\n start: NETGEM_API_V8_URL_DEFINITION,\n |},\n userViewEndOffset?: string,\n userViewStartOffset?: string,\n|};\n\nexport type NETGEM_API_V8_METADATA_SCHEDULE = {|\n location: NETGEM_API_V8_METADATA_SCHEDULE_LOCATION,\n|};\n","/* @flow */\n\nimport type { ETAG_MAP } from './ETag';\nimport type { KeyValuePair } from '@ntg/utils/dist/types';\nimport type { NETGEM_API_V8_FEED_RESULT } from './FeedResult';\nimport type { NETGEM_API_V8_ITEM_LOCATION } from './FeedItem';\n\nexport const ScheduledRecordingsKind = Object.freeze({\n KeepFromReplay: 'KeepFromReplay',\n Series: 'Series',\n Single: 'Single',\n});\n\n// Cannot convert to Flow enum because it's used to refine types\nexport type ScheduledRecordingsKindType = typeof ScheduledRecordingsKind.KeepFromReplay | typeof ScheduledRecordingsKind.Series | typeof ScheduledRecordingsKind.Single;\n\nexport type NETGEM_API_V8_RECORDINGS_STATUS = {|\n count: number,\n duration: string,\n|};\n\nexport type NETGEM_API_V8_RECORDINGS_FUTURE = {|\n ...NETGEM_API_V8_FEED_RESULT,\n current: NETGEM_API_V8_RECORDINGS_STATUS,\n expectedError: NETGEM_API_V8_RECORDINGS_STATUS,\n expectedSuccess: NETGEM_API_V8_RECORDINGS_STATUS,\n maxQuota: NETGEM_API_V8_RECORDINGS_STATUS,\n|};\n\nexport enum RecordingOutcome {\n ExceededConcurrency = 'ExceededConcurrency',\n HistoryOverflow = 'HistoryOverflow',\n OutdatedEpisode = 'OutdatedEpisode',\n OutOfQuota = 'OutOfQuota',\n Rebroadcast = 'Rebroadcast',\n Recorded = 'Recorded',\n ServerError = 'ServerError',\n Unknown = 'Unknown',\n WillBeRecorded = 'WillBeRecorded',\n}\n\nexport type NETGEM_API_V8_MATCHING_SCHEDULED_RECORDING = {|\n conflict: Array<string>,\n id: string,\n quotaUsed: string,\n recordOutcome: RecordingOutcome,\n|};\n\n// Keys are program Ids\nexport type NETGEM_RECORDINGS_MAP = KeyValuePair<Array<NETGEM_API_V8_ITEM_LOCATION>>;\n\nexport type NETGEM_API_V8_SCHEDULED_RECORDING_DESCRIPTION_SINGLE = {|\n kind: typeof ScheduledRecordingsKind.Single,\n requestedScheduledEventId: string,\n targetScheduledEventId: string,\n|};\n\nexport type NETGEM_API_V8_SCHEDULED_RECORDING_DESCRIPTION_SERIES = {|\n fromUtc: string,\n increasingEpisodes?: boolean,\n kind: typeof ScheduledRecordingsKind.Series,\n recordsToKeep: ?number,\n seriesId: string,\n toUtc?: string,\n|};\n\nexport type NETGEM_API_V8_SCHEDULED_RECORDING_DESCRIPTION_KEEP_FROM_REPLAY = {|\n catchupId: string,\n kind: typeof ScheduledRecordingsKind.KeepFromReplay,\n|};\n\ntype NETGEM_API_V8_SCHEDULED_RECORDING_DESCRIPTION_ANY =\n | NETGEM_API_V8_SCHEDULED_RECORDING_DESCRIPTION_SINGLE\n | NETGEM_API_V8_SCHEDULED_RECORDING_DESCRIPTION_SERIES\n | NETGEM_API_V8_SCHEDULED_RECORDING_DESCRIPTION_KEEP_FROM_REPLAY;\n\ntype NETGEM_API_V8_SCHEDULED_RECORDING_DESCRIPTION_COMMON = {|\n startMargin: string,\n endMargin: string,\n channelId: string,\n|};\n\nexport type NETGEM_API_V8_SCHEDULED_RECORDING_DESCRIPTION = {|\n ...NETGEM_API_V8_SCHEDULED_RECORDING_DESCRIPTION_COMMON,\n ...NETGEM_API_V8_SCHEDULED_RECORDING_DESCRIPTION_ANY,\n|};\n\nexport type ID_TYPE = {|\n id: string,\n|};\n\nexport type NETGEM_API_V8_SCHEDULED_RECORDING = {|\n description: NETGEM_API_V8_SCHEDULED_RECORDING_DESCRIPTION,\n id: string,\n records: Array<ID_TYPE>,\n|};\n\n// Keys are series or scheduled event Ids\nexport type NETGEM_SCHEDULED_RECORDINGS_MAP = KeyValuePair<NETGEM_API_V8_SCHEDULED_RECORDING>;\n\nexport type NETGEM_SCHEDULED_RECORDINGS_MAP_AND_ETAGS = {|\n eTags: ETAG_MAP,\n scheduledRecordings: NETGEM_SCHEDULED_RECORDINGS_MAP,\n|};\n\nexport type NETGEM_API_V8_SCHEDULED_RECORDINGS_LIST_RESULT = Array<ID_TYPE>;\n\nexport type NETGEM_API_V8_SCHEDULED_RECORDINGS_LIST_FULL_RESULT = Array<NETGEM_API_V8_SCHEDULED_RECORDING>;\n\n// Duration in seconds\nexport type NETGEM_RECORDINGS_STATUS_ITEM = {|\n count: number,\n duration: number,\n|};\n\nexport type NETGEM_FUTURE_RECORDINGS_STATUS = {|\n current: NETGEM_RECORDINGS_STATUS_ITEM,\n expectedError: NETGEM_RECORDINGS_STATUS_ITEM,\n expectedSuccess: NETGEM_RECORDINGS_STATUS_ITEM,\n maxQuota: NETGEM_RECORDINGS_STATUS_ITEM,\n|};\n\nexport const DEFAULT_RECORDINGS_STATUS_ITEM: NETGEM_RECORDINGS_STATUS_ITEM = { count: 0, duration: 0 };\n","/* @flow */\n\nexport const NETGEM_API_V8_AUTHENT_REALM_NETGEM: 'netgem' = 'netgem';\nexport const NETGEM_API_V8_AUTHENT_REALM_VIDEOFUTUR: 'videofutur' = 'videofutur';\nexport type NETGEM_API_V8_AUTHENT_REALM = typeof NETGEM_API_V8_AUTHENT_REALM_NETGEM | typeof NETGEM_API_V8_AUTHENT_REALM_VIDEOFUTUR;\n","/* @flow */\n\nimport type { NETGEM_API_V8_LANG } from './Lang';\nimport type { NETGEM_API_V8_PARAM } from './Param';\nimport type { NETGEM_API_V8_URL_DEFINITION } from './NtgVideoFeed';\n\nexport enum TileConfigTileType {\n Channel = 'channel',\n ChannelGroup = 'channelgroup',\n ChannelGroupBig = 'channelgroup.big',\n ChannelGroupBigFill = 'channelgroup.big.fill',\n ChannelGroupFill = 'channelgroup.fill',\n Deeplink = 'deeplink',\n Deeplink3x1 = 'deeplink.3x1',\n Deeplink5x1 = 'deeplink.5x1',\n Gemtv = 'gemtv',\n GemtvBig = 'gemtv.big',\n GemtvMedium = 'gemtv.medium',\n Landscape = 'landscape',\n LandscapeBig = 'landscape.big',\n LandscapeVod = 'landscape.vod',\n Portrait = 'portrait',\n}\n\nexport enum TileConfig {\n ProgramTitle = 'programTitle',\n SeriesTitle = 'seriesTitle',\n ProgramSynopsis = 'programSynopsis',\n SeriesSynopsis = 'seriesSynopsis',\n Date = 'date',\n Duration = 'duration',\n Year = 'year',\n Genre = 'genre',\n Language = 'language',\n ParentalGuidance = 'parentalGuidance',\n}\n\nexport type TILE_CONFIG_DESCRIPTION = {\n program?: Array<TileConfig>,\n series?: Array<TileConfig>,\n};\n\nexport enum TileContentImageKind {\n Channel = 'channel',\n Other = 'other',\n Program = 'program',\n Series = 'series',\n}\n\nexport enum TileImageLayout {\n Stretched = 'stretched',\n Cover = 'cover',\n Contain = 'contain',\n}\n\nexport enum TileOnFocus {\n Details = 'details',\n Selection = 'selection',\n}\n\ntype NETGEM_API_V8_WIDGET_TILE_CONFIG_BASE_TYPE = {|\n caption: ?TILE_CONFIG_DESCRIPTION,\n channelLogo: boolean,\n contentImage: TileContentImageKind,\n contentImageVariant?: string,\n hoverContent: ?TILE_CONFIG_DESCRIPTION,\n imageLayout: TileImageLayout,\n onFocus: TileOnFocus,\n|};\n\nexport type NETGEM_API_V8_WIDGET_TILE_CONFIG_TYPE = {|\n ...NETGEM_API_V8_WIDGET_TILE_CONFIG_BASE_TYPE,\n type?: TileConfigTileType,\n|};\n\nexport type TILE_CONFIG_TYPE = {|\n ...NETGEM_API_V8_WIDGET_TILE_CONFIG_BASE_TYPE,\n type: TileConfigTileType,\n|};\n\nexport enum WidgetLayoutType {\n Grid = 'grid',\n List = 'list',\n}\n\nexport const NETGEM_API_V8_WIDGET_TILE_VOD: 'vod' = 'vod';\n\n/*\n * Available actions:\n * card1: open associated card\n * hub1: open associated hub\n * none: no action is performed\n * player: open player and play the stream associated with the item\n * switch: action depends on item\n */\nexport const NETGEM_API_V8_WIDGET_ITEM_CLICK_ACTION_CARD: 'card1' = 'card1';\nexport const NETGEM_API_V8_WIDGET_ITEM_CLICK_ACTION_HUB: 'hub1' = 'hub1';\nexport const NETGEM_API_V8_WIDGET_ITEM_CLICK_ACTION_NONE: 'none' = 'none';\nexport const NETGEM_API_V8_WIDGET_ITEM_CLICK_ACTION_PLAYER: 'player' = 'player';\nexport const NETGEM_API_V8_WIDGET_ITEM_CLICK_ACTION_SWITCH: 'switch' = 'switch';\n\nexport type NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE0 = {|\n action: typeof NETGEM_API_V8_WIDGET_ITEM_CLICK_ACTION_NONE,\n|};\n\nexport type NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE1 = {|\n action: typeof NETGEM_API_V8_WIDGET_ITEM_CLICK_ACTION_CARD | typeof NETGEM_API_V8_WIDGET_ITEM_CLICK_ACTION_HUB,\n params: NETGEM_API_V8_URL_DEFINITION,\n type?: typeof NETGEM_API_V8_WIDGET_TILE_VOD,\n|};\n\nexport type NETGEM_API_V8_WIDGET_ITEM_CLICK_PARAMS_TYPE = Array<{|\n // eslint-disable-next-line no-use-before-define\n action: NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE0 | NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE1 | NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE2,\n prefix?: string,\n|}>;\n\nexport type NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE2 = {|\n action: typeof NETGEM_API_V8_WIDGET_ITEM_CLICK_ACTION_SWITCH,\n params?: NETGEM_API_V8_WIDGET_ITEM_CLICK_PARAMS_TYPE,\n|};\n\nexport type NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE = NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE0 | NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE1 | NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE2;\n\nexport enum GroupItemsBy {\n Program = 'program',\n Season = 'season',\n Series = 'series',\n}\n\nexport type NETGEM_API_V8_WIDGET_PANEL_IMAGE_URL_TYPE = {|\n params?: Array<NETGEM_API_V8_PARAM>,\n uri: string,\n|};\n\ntype NETGEM_API_V8_WIDGET_PANEL_TYPE = {|\n kind: 'customLockPanel',\n widgetConfig: {|\n title?: Array<NETGEM_API_V8_LANG>,\n info?: Array<NETGEM_API_V8_LANG>,\n imageUri?: string,\n imageUrl?: NETGEM_API_V8_WIDGET_PANEL_IMAGE_URL_TYPE,\n instructions?: Array<NETGEM_API_V8_LANG>,\n |},\n|};\n\nexport type NETGEM_API_V8_WIDGET_CONFIG_TYPE = {|\n groupItemsBy?: GroupItemsBy,\n headerUri?: string,\n imageUri?: string,\n layout?: WidgetLayoutType,\n tileConfig?: NETGEM_API_V8_WIDGET_TILE_CONFIG_TYPE,\n tileType?: TileConfigTileType,\n onEmptyAvenue?: NETGEM_API_V8_WIDGET_PANEL_TYPE,\n onItemClick?: NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE,\n|};\n\nexport type NETGEM_API_V8_WIDGET_ACTIONS_TYPE = {|\n onItemClick: NETGEM_API_V8_WIDGET_ITEM_CLICK_TYPE,\n|};\n\nexport type NETGEM_API_V8_DEFAULT_ACTIONS = {|\n actions: NETGEM_API_V8_WIDGET_ACTIONS_TYPE,\n|};\n","/* @flow */\n\n// Purchase\nimport { CustomNetworkError } from '../../helpers/CustomNetworkError';\n\nexport const BO_PURCHASE_ALREADY_PURCHASED: 'ALREADY_PURCHASED_VOD_CONTENT_EXCEPTION' = 'ALREADY_PURCHASED_VOD_CONTENT_EXCEPTION';\nexport const BO_PURCHASE_DEVICE_NOT_FOUND: 'DEVICE_NOT_FOUND' = 'DEVICE_NOT_FOUND';\nexport const BO_PURCHASE_INVALID_CONTENT: 'INVALID_CONTENT' = 'INVALID_CONTENT';\nexport const BO_PURCHASE_INVALID_PROMOCODE: 'INVALID_PROMOCODE' = 'INVALID_PROMOCODE';\nexport const BO_PURCHASE_INVALID_PROMOCODE_FOR_TITLE: 'INVALID_PROMOCODE_FOR_TITLE' = 'INVALID_PROMOCODE_FOR_TITLE';\nexport const BO_PURCHASE_INVALID_USER_IP: 'INVALID_USER_IP' = 'INVALID_USER_IP';\nexport const BO_PURCHASE_STATUS_OK: 'OK' = 'OK';\nexport const BO_PURCHASE_SVOD_CONTENT_RIGHT_NOT_FOUND: 'SVOD_CONTENT_RIGHT_NOT_FOUND' = 'SVOD_CONTENT_RIGHT_NOT_FOUND';\nexport const BO_PURCHASE_UNKNOWN_ERROR: 'UNKNOWN_ERROR' = 'UNKNOWN_ERROR';\n\n// Create stream\nexport const BO_STREAM_MAX_CONCURRENT_STREAMS_REACHED = 10002;\nexport const BO_STREAM_DEVICE_NOT_FOUND = 99999;\nexport const BO_STREAM_NO_SVOD_CONTENT_RIGHT = 500010;\nexport const BO_STREAM_INVALID_USER_IP = 500080;\n\n// BO API V2\nexport const BO_PURCHASE_SVOD_CONTENT_RIGHT_NOT_FOUND_V2 = 11015;\nexport const BO_PURCHASE_INVALID_USER_IP_V2 = 11080;\nexport const BO_PURCHASE_INVALID_PROMOCODE_V2 = 30011;\nexport const BO_PURCHASE_INVALID_PROMOCODE_FOR_TITLE_V2 = 30012;\nexport const BO_PURCHASE_ALREADY_PURCHASED_V2 = 30020;\nexport const BO_INVALID_JWT_V2 = 99900;\nexport const BO_INVALID_APPLICATION_V2 = 99901;\nexport const BO_INVALID_SUBSCRIBER_V2 = 99902;\nexport const BO_PURCHASE_UNKNOWN_ERROR_V2 = -1;\n\nexport const mapV2ErrorToV1Error = (error: CustomNetworkError): string | null => {\n switch (error.getCustomCode()) {\n case BO_PURCHASE_SVOD_CONTENT_RIGHT_NOT_FOUND_V2:\n return BO_PURCHASE_SVOD_CONTENT_RIGHT_NOT_FOUND;\n case BO_PURCHASE_INVALID_USER_IP_V2:\n return BO_PURCHASE_INVALID_USER_IP;\n case BO_PURCHASE_INVALID_PROMOCODE_V2:\n return BO_PURCHASE_INVALID_PROMOCODE;\n case BO_PURCHASE_INVALID_PROMOCODE_FOR_TITLE_V2:\n return BO_PURCHASE_INVALID_PROMOCODE_FOR_TITLE;\n case BO_PURCHASE_ALREADY_PURCHASED_V2:\n return BO_PURCHASE_ALREADY_PURCHASED;\n case BO_INVALID_JWT_V2:\n case BO_INVALID_APPLICATION_V2:\n case BO_INVALID_SUBSCRIBER_V2:\n return BO_PURCHASE_DEVICE_NOT_FOUND;\n default:\n return null;\n }\n};\n","/* @flow */\n\nimport type { DidomiSettings, LocalesType } from '../types/types';\nimport {\n REDUX_MSG_APP_CONFIGURATION_UPDATE,\n REDUX_MSG_BO_PRODUCT_ID_UPDATE,\n REDUX_MSG_BO_SETTINGS_UPDATE,\n REDUX_MSG_CHANNELS_UPDATE,\n REDUX_MSG_COMMERCIAL_OFFERS_UPDATE,\n REDUX_MSG_DEBUG_MODE_TOGGLE,\n REDUX_MSG_DEBUG_MODE_UPDATE,\n REDUX_MSG_DEFAULT_RIGHTS_UPDATE,\n REDUX_MSG_DEVICE_OS_UPDATE,\n REDUX_MSG_DEVICE_SETTINGS_UPDATE,\n REDUX_MSG_DISTRIBUTOR_APPKEYS_UPDATE,\n REDUX_MSG_ENABLE_PACK_PURCHASE_API,\n REDUX_MSG_LIST_ALIAS_UPDATE,\n REDUX_MSG_MAIN_DISTRIBUTOR_UPDATE,\n REDUX_MSG_MESH_STATE_UPDATE,\n REDUX_MSG_PACK_PURCHASE_TOGGLE,\n REDUX_MSG_PLAYER_STREAM_PRIORITIES_UPDATE,\n REDUX_MSG_USER_RIGHTS_UPDATE,\n REDUX_MSG_UTM_PARAMETERS_UPDATE,\n REDUX_MSG_VERSION_BO_UPDATE,\n REDUX_MSG_VERSION_CRM_BACK_UPDATE,\n REDUX_MSG_VERSION_CRM_FRONT_UPDATE,\n REDUX_MSG_VOD_STATE_UPDATE,\n} from '../constants/';\nimport type { ChannelMap } from '../../../libs/netgemLibrary/v8/types/Channel';\nimport type { DmsSettingMap } from '../../../libs/netgemLibrary/dms/types/DeviceInfoSettings';\nimport type { KeyValuePair } from '@ntg/utils/dist/types';\nimport type { NETGEM_API_V8_RIGHTS } from '../../../libs/netgemLibrary/v8/types/Rights';\nimport type { STREAM_PRIORITIES_TYPE } from '../../../helpers/ui/metadata/Types';\n\nexport type AppConfigurationAction =\n // Default action\n | {| type: null |}\n // Update channel list\n | {|\n channels: ChannelMap,\n type: typeof REDUX_MSG_CHANNELS_UPDATE,\n |}\n // Update device OS\n | {|\n deviceOS: string,\n type: typeof REDUX_MSG_DEVICE_OS_UPDATE,\n |}\n // Toggle debug mode\n | {| type: typeof REDUX_MSG_DEBUG_MODE_TOGGLE |}\n // Update debug mode\n | {|\n isDebugModeEnabled: boolean,\n type: typeof REDUX_MSG_DEBUG_MODE_UPDATE,\n |}\n // Settings\n | {|\n settings: DmsSettingMap,\n type: typeof REDUX_MSG_DEVICE_SETTINGS_UPDATE,\n |}\n // BO settings\n | {|\n settings: KeyValuePair<string>,\n type: typeof REDUX_MSG_BO_SETTINGS_UPDATE,\n |}\n // BO product Id\n | {|\n productId: number,\n type: typeof REDUX_MSG_BO_PRODUCT_ID_UPDATE,\n |}\n // Distributor app keys\n | {|\n distributorAppKeys: KeyValuePair<string>,\n type: typeof REDUX_MSG_DISTRIBUTOR_APPKEYS_UPDATE,\n |}\n // Update a list alias\n | {|\n channelList: Array<string>,\n listAlias: string,\n tag: string | null,\n type: typeof REDUX_MSG_LIST_ALIAS_UPDATE,\n |}\n // Update main distributor Id\n | {|\n distributorId: string,\n type: typeof REDUX_MSG_MAIN_DISTRIBUTOR_UPDATE,\n |}\n // Update mesh state\n | {|\n isMeshEnabled: boolean | null,\n type: typeof REDUX_MSG_MESH_STATE_UPDATE,\n |}\n // Update player stream priorities\n | {|\n priorities: STREAM_PRIORITIES_TYPE | null,\n type: typeof REDUX_MSG_PLAYER_STREAM_PRIORITIES_UPDATE,\n |}\n // Update app configuration\n | {|\n configuration: KeyValuePair<string>,\n didomi?: DidomiSettings,\n locales?: LocalesType,\n type: typeof REDUX_MSG_APP_CONFIGURATION_UPDATE,\n |}\n // Update VOD state\n | {|\n isBoRunning: boolean,\n type: typeof REDUX_MSG_VOD_STATE_UPDATE,\n |}\n // Update BO version\n | {|\n type: typeof REDUX_MSG_VERSION_BO_UPDATE,\n version: string,\n |}\n // Update CRM Back version\n | {|\n type: typeof REDUX_MSG_VERSION_CRM_BACK_UPDATE,\n version: string,\n |}\n // Update CRM Front version\n | {|\n type: typeof REDUX_MSG_VERSION_CRM_FRONT_UPDATE,\n version: string,\n |}\n // Update commercial offers\n | {|\n commercialOffers: KeyValuePair<Array<string>>,\n type: typeof REDUX_MSG_COMMERCIAL_OFFERS_UPDATE,\n |}\n // Update default rights\n | {|\n rights: NETGEM_API_V8_RIGHTS,\n type: typeof REDUX_MSG_DEFAULT_RIGHTS_UPDATE,\n |}\n // Update user rights\n | {|\n rights: Array<string>,\n type: typeof REDUX_MSG_USER_RIGHTS_UPDATE,\n |}\n // Update UTM parameters\n | {|\n type: typeof REDUX_MSG_UTM_PARAMETERS_UPDATE,\n utmParameters: KeyValuePair<string>,\n |}\n // Enable pack purchase API (will be removed later)\n | {| type: typeof REDUX_MSG_ENABLE_PACK_PURCHASE_API |}\n // Toggle pack purchase feature\n | {| type: typeof REDUX_MSG_PACK_PURCHASE_TOGGLE |};\n\nconst toggleDebugMode: () => AppConfigurationAction = () => {\n return { type: REDUX_MSG_DEBUG_MODE_TOGGLE };\n};\n\nconst togglePackPurchase: () => AppConfigurationAction = () => {\n return { type: REDUX_MSG_PACK_PURCHASE_TOGGLE };\n};\n\nconst updateDebugMode: (isDebugModeEnabled: boolean) => AppConfigurationAction = (isDebugModeEnabled) => {\n return {\n isDebugModeEnabled,\n type: REDUX_MSG_DEBUG_MODE_UPDATE,\n };\n};\n\nconst updateDeviceChannels: (channels: ChannelMap) => AppConfigurationAction = (channels) => {\n return {\n channels,\n type: REDUX_MSG_CHANNELS_UPDATE,\n };\n};\n\nconst updateDeviceOS: (deviceOS: string) => AppConfigurationAction = (deviceOS) => {\n return {\n deviceOS,\n type: REDUX_MSG_DEVICE_OS_UPDATE,\n };\n};\n\nconst updateDeviceSettings: (settings: DmsSettingMap) => AppConfigurationAction = (settings) => {\n return {\n settings,\n type: REDUX_MSG_DEVICE_SETTINGS_UPDATE,\n };\n};\n\nconst updateDistributorAppKeys: (distributorAppKeys: KeyValuePair<string>) => AppConfigurationAction = (distributorAppKeys) => {\n return {\n distributorAppKeys,\n type: REDUX_MSG_DISTRIBUTOR_APPKEYS_UPDATE,\n };\n};\n\nconst updateListAlias: (channelList: Array<string>, listAlias: string, tag: string | null) => AppConfigurationAction = (channelList, listAlias, tag) => {\n return {\n channelList,\n listAlias,\n tag,\n type: REDUX_MSG_LIST_ALIAS_UPDATE,\n };\n};\n\nconst updateMainDistributor: (distributorId: string) => AppConfigurationAction = (distributorId) => {\n return {\n distributorId,\n type: REDUX_MSG_MAIN_DISTRIBUTOR_UPDATE,\n };\n};\n\nconst updateMeshState: (isMeshEnabled: boolean | null) => AppConfigurationAction = (isMeshEnabled) => {\n return {\n isMeshEnabled,\n type: REDUX_MSG_MESH_STATE_UPDATE,\n };\n};\n\nconst updatePlayerStreamPriorities: (priorities: STREAM_PRIORITIES_TYPE | null) => AppConfigurationAction = (priorities) => {\n return {\n priorities,\n type: REDUX_MSG_PLAYER_STREAM_PRIORITIES_UPDATE,\n };\n};\n\nconst updateConfiguration: (configuration: KeyValuePair<string>, didomi?: DidomiSettings, locales?: LocalesType) => AppConfigurationAction = (configuration, didomi, locales) => {\n return {\n configuration,\n didomi,\n locales,\n type: REDUX_MSG_APP_CONFIGURATION_UPDATE,\n };\n};\n\nconst updateBOSettings: (settings: KeyValuePair<string>) => AppConfigurationAction = (settings) => {\n return {\n settings,\n type: REDUX_MSG_BO_SETTINGS_UPDATE,\n };\n};\n\nconst updateBOProductId: (productId: number) => AppConfigurationAction = (productId) => {\n return {\n productId,\n type: REDUX_MSG_BO_PRODUCT_ID_UPDATE,\n };\n};\n\nconst updateBOState: (isBoRunning: boolean) => AppConfigurationAction = (isBoRunning) => {\n return {\n isBoRunning,\n type: REDUX_MSG_VOD_STATE_UPDATE,\n };\n};\n\nconst updateBOVersion: (version: string) => AppConfigurationAction = (version) => {\n return {\n type: REDUX_MSG_VERSION_BO_UPDATE,\n version,\n };\n};\n\nconst updateCrmBackVersion: (version: string) => AppConfigurationAction = (version) => {\n return {\n type: REDUX_MSG_VERSION_CRM_BACK_UPDATE,\n version,\n };\n};\n\nconst updateCrmFrontVersion: (version: string) => AppConfigurationAction = (version) => {\n return {\n type: REDUX_MSG_VERSION_CRM_FRONT_UPDATE,\n version,\n };\n};\n\nconst updateCommercialOffers: (commercialOffers: KeyValuePair<Array<string>>) => AppConfigurationAction = (commercialOffers) => {\n return {\n commercialOffers,\n type: REDUX_MSG_COMMERCIAL_OFFERS_UPDATE,\n };\n};\n\nconst updateDefaultRights: (rights: NETGEM_API_V8_RIGHTS) => AppConfigurationAction = (rights) => {\n return {\n rights,\n type: REDUX_MSG_DEFAULT_RIGHTS_UPDATE,\n };\n};\n\nconst updateUserRights: (rights: Array<string>) => AppConfigurationAction = (rights) => {\n return {\n rights,\n type: REDUX_MSG_USER_RIGHTS_UPDATE,\n };\n};\n\nconst updateUtmParameters: (utmParameters: KeyValuePair<string>) => AppConfigurationAction = (utmParameters) => {\n return {\n type: REDUX_MSG_UTM_PARAMETERS_UPDATE,\n utmParameters,\n };\n};\n\nconst enablePackPurchaseApi: () => AppConfigurationAction = () => {\n return {\n type: REDUX_MSG_ENABLE_PACK_PURCHASE_API,\n };\n};\n\nexport {\n enablePackPurchaseApi,\n toggleDebugMode,\n togglePackPurchase,\n updateBOProductId,\n updateBOSettings,\n updateBOState,\n updateBOVersion,\n updateConfiguration,\n updateCommercialOffers,\n updateCrmBackVersion,\n updateCrmFrontVersion,\n updateDebugMode,\n updateDefaultRights,\n updateDeviceChannels,\n updateDeviceOS,\n updateDeviceSettings,\n updateDistributorAppKeys,\n updateListAlias,\n updateMainDistributor,\n updateMeshState,\n updatePlayerStreamPriorities,\n updateUserRights,\n updateUtmParameters,\n};\n","/* @flow */\n\nexport const REDUX_MSG_CHANNELS_UPDATE: 'NTG_RDX_MSG_DEVICE_CHANNEL_MAP' = 'NTG_RDX_MSG_DEVICE_CHANNEL_MAP';\nexport const REDUX_MSG_COMMERCIAL_OFFERS_UPDATE: 'NTG_REDUX_MSG_UPDATE_COMMERCIAL_OFFERS' = 'NTG_REDUX_MSG_UPDATE_COMMERCIAL_OFFERS';\nexport const REDUX_MSG_DEBUG_MODE_TOGGLE: 'NTG_RDX_MSG_TOGGLE_DEBUG_MODE' = 'NTG_RDX_MSG_TOGGLE_DEBUG_MODE';\nexport const REDUX_MSG_DEBUG_MODE_UPDATE: 'NTG_RDX_MSG_UPDATE_DEBUG_MODE' = 'NTG_RDX_MSG_UPDATE_DEBUG_MODE';\nexport const REDUX_MSG_DEFAULT_RIGHTS_UPDATE: 'NTG_REDUX_MSG_UPDATE_DEFAULT_RIGHTS' = 'NTG_REDUX_MSG_UPDATE_DEFAULT_RIGHTS';\nexport const REDUX_MSG_DEVICE_OS_UPDATE: 'NTG_RDX_MSG_DEVICE_OS_UPDATE' = 'NTG_RDX_MSG_DEVICE_OS_UPDATE';\nexport const REDUX_MSG_DEVICE_SETTINGS_UPDATE: 'NTG_RDX_MSG_DEVICE_SETTINGS_UPDATE' = 'NTG_RDX_MSG_DEVICE_SETTINGS_UPDATE';\nexport const REDUX_MSG_DISTRIBUTOR_APPKEYS_UPDATE: 'NTG_RDX_MSG_DISTRIBUTOR_APPKEYS' = 'NTG_RDX_MSG_DISTRIBUTOR_APPKEYS';\nexport const REDUX_MSG_ENABLE_PACK_PURCHASE_API: 'NTG_RDX_MSG_ENABLE_PACK_PURCHASE_API' = 'NTG_RDX_MSG_ENABLE_PACK_PURCHASE_API';\nexport const REDUX_MSG_LIST_ALIAS_UPDATE: 'NTG_RDX_MSG_LIST_ALIAS' = 'NTG_RDX_MSG_LIST_ALIAS';\nexport const REDUX_MSG_MAIN_DISTRIBUTOR_UPDATE: 'NTG_RDX_MSG_MAIN_DISTRIBUTOR' = 'NTG_RDX_MSG_MAIN_DISTRIBUTOR';\nexport const REDUX_MSG_MESH_STATE_UPDATE: 'NTG_RDX_MSG_MESH_STATE' = 'NTG_RDX_MSG_MESH_STATE';\nexport const REDUX_MSG_PLAYER_STREAM_PRIORITIES_UPDATE: 'NTG_RDX_MSG_UPDATE_PLAYER_STREAM_PRIORITIES' = 'NTG_RDX_MSG_UPDATE_PLAYER_STREAM_PRIORITIES';\nexport const REDUX_MSG_APP_CONFIGURATION_UPDATE: 'NTG_RDX_MSG_UPDATE_APP_CONFIGURATION' = 'NTG_RDX_MSG_UPDATE_APP_CONFIGURATION';\nexport const REDUX_MSG_USER_RIGHTS_UPDATE: 'NTG_REDUX_MSG_UPDATE_USER_RIGHTS' = 'NTG_REDUX_MSG_UPDATE_USER_RIGHTS';\nexport const REDUX_MSG_UTM_PARAMETERS_UPDATE: 'NTG_REDUX_MSG_UPDATE_UTM_PARAMETERS' = 'NTG_REDUX_MSG_UPDATE_UTM_PARAMETERS';\nexport const REDUX_MSG_VOD_STATE_UPDATE: 'NTG_RDX_MSG_UPDATE_VOD_STATE' = 'NTG_RDX_MSG_UPDATE_VOD_STATE';\nexport const REDUX_MSG_BO_PRODUCT_ID_UPDATE: 'NTG_RDX_MSG_BO_UPDATE_PRODUCT_ID' = 'NTG_RDX_MSG_BO_UPDATE_PRODUCT_ID';\nexport const REDUX_MSG_BO_SETTINGS_UPDATE: 'NTG_RDX_MSG_BO_SETTINGS_MAP' = 'NTG_RDX_MSG_BO_SETTINGS_MAP';\nexport const REDUX_MSG_VERSION_BO_UPDATE: 'NTG_RDX_MSG_UPDATE_BO_VERSION' = 'NTG_RDX_MSG_UPDATE_BO_VERSION';\nexport const REDUX_MSG_VERSION_CRM_BACK_UPDATE: 'NTG_RDX_MSG_UPDATE_CRM_BACK_VERSION' = 'NTG_RDX_MSG_UPDATE_CRM_BACK_VERSION';\nexport const REDUX_MSG_VERSION_CRM_FRONT_UPDATE: 'NTG_RDX_MSG_UPDATE_CRM_FRONT_VERSION' = 'NTG_RDX_MSG_UPDATE_CRM_FRONT_VERSION';\nexport const REDUX_MSG_PACK_PURCHASE_TOGGLE: 'NTG_RDX_MSG_TOGGLE_PACK_PURCHASE' = 'NTG_RDX_MSG_TOGGLE_PACK_PURCHASE';\n\nexport const FEATURE_NPVR: 'FEATURE_NPVR' = 'FEATURE_NPVR';\nexport const FEATURE_SUBSCRIPTION: 'FEATURE_SUBSCRIPTION' = 'FEATURE_SUBSCRIPTION';\nexport const FEATURE_TV: 'FEATURE_TV' = 'FEATURE_TV';\nexport const FEATURE_VOD: 'FEATURE_VOD' = 'FEATURE_VOD';\nexport type FEATURE_TYPE = typeof FEATURE_NPVR | typeof FEATURE_SUBSCRIPTION | typeof FEATURE_TV | typeof FEATURE_VOD;\n","/* @flow */\nimport type { FEATURE_TYPE } from '../constants';\nimport type { KeyValuePair } from '@ntg/utils/dist/types';\n\nexport type AppConfigurationFeatures = {| [FEATURE_TYPE]: boolean |};\n\nexport type LocalesType = KeyValuePair<Array<{| lang: string, value: string |}>>;\n\nexport type DidomiSettings = {| apiKey: string, webNoticeId: string |};\n\nexport enum ExternalContentDisplayType {\n EmbeddedPopup,\n NewTab,\n ExternalPopup,\n}\n\nconst stringToExternalContentDisplayType = (displayType: ?string): ExternalContentDisplayType => {\n switch (displayType) {\n case 'embedded-popup':\n return ExternalContentDisplayType.EmbeddedPopup;\n\n case 'external-popup':\n return ExternalContentDisplayType.ExternalPopup;\n\n case 'new-tab':\n default:\n return ExternalContentDisplayType.NewTab;\n }\n};\n\nexport { stringToExternalContentDisplayType };\n","/* @flow */\n\nimport type { KeyValuePair } from '@ntg/utils/dist/types';\n\nexport type UserDeviceInfoType = {|\n anonymous: boolean,\n applicationId: string,\n authDeviceUrl: string,\n deviceKey: string,\n error: ?string,\n logoutUrl: string,\n subscriberId: string,\n upgradeDeviceUrl: string,\n|};\n\nexport enum RegistrationType {\n NotRegistered,\n Registered,\n RegisteredAsGuest,\n}\n\nexport enum SubscriptionStatus {\n Active = 'active',\n Cancelled = 'cancelled',\n Future = 'future',\n InTrial = 'intrial',\n NonRenewing = 'nonrenewing',\n Paused = 'paused',\n}\n\nexport type SubscriptionList = KeyValuePair<SubscriptionStatus>;\n\nexport enum InvoiceStatus {\n NotPaid = 'not_paid',\n Paid = 'paid',\n PaymentDue = 'payment_due',\n Pending = 'pending',\n Posted = 'posted',\n Voided = 'voided',\n}\n\nexport enum PaymentStatus {\n Expired = 'expired',\n Expiring = 'expiring',\n Valid = 'valid',\n}\n\nexport enum DunningStatus {\n Exhausted = 'exhausted',\n InProgress = 'inprogress',\n Stopped = 'stopped',\n Success = 'success',\n Unknown = 'unknown',\n}\n\nexport type PaymentInfo = {|\n dunningStatus?: DunningStatus,\n expirationTime?: number,\n invoiceStatus?: InvoiceStatus,\n status?: PaymentStatus,\n|};\n\nexport type UserInfo = {|\n id: string,\n email: string,\n newsletter?: boolean,\n paymentInfo: PaymentInfo | null,\n subscriptions: SubscriptionList,\n|};\n\nexport type RawUserInfo = {|\n id: string,\n email: string,\n newsletter?: boolean,\n paymentInfo?: {\n dunningStatus?: DunningStatus,\n expiry?: string,\n status?: PaymentStatus,\n },\n subscriptions?: Array<{|\n planId: string,\n status: SubscriptionStatus,\n |}>,\n|};\n","/* @flow */\n\nimport {\n AUTHENTICATION_REQUIRED_MODAL,\n AVENUE_MODAL,\n CARD_MODAL,\n CONFIRMATION_MODAL,\n EXTERNAL_CONTENT_MODAL,\n KEYBOARD_SHORTCUTS_MODAL,\n LEGAL_NOTICE_MODAL,\n MESSAGE_MODAL,\n NEW_VERSION_MODAL,\n NPVR_HELP_MODAL,\n NPVR_MODAL,\n VOD_PURCHASE_MODAL,\n} from '../../../components/modal/modalTypes';\nimport type { AVENUE_DATA_MODAL_TYPE } from '../../../components/modal/avenueModal/AvenueModal';\nimport type { CARD_DATA_MODAL_TYPE } from '../../../components/modal/cardModal/CardModalConstsAndTypes';\nimport { type CONFIRMATION_DATA_MODAL_TYPE } from '../../../components/modal/confirmationModal/ConfirmationModal';\nimport type { MESSAGE_MODAL_TYPE } from '../../../components/modal/messageModal/MessageModal';\nimport { ModalActionType } from '../constants';\nimport type { NEW_VERSION_DATA_MODAL_TYPE } from '../../../components/modal/newVersionModal/NewVersionModal';\nimport type { NPVR_DATA_MODAL_TYPE } from '../../../components/modal/npvrModal/NpvrModal';\nimport type { VOD_PURCHASE_DATA_TYPE } from '../../../helpers/rights/pendingOperations';\n\nexport type ModalAction =\n // Default action\n | {| type: null |}\n // Hide top most modal\n | {|\n force?: boolean,\n type: typeof ModalActionType.Hide,\n |}\n // Reopen last closed modal\n | {| type: typeof ModalActionType.Reopen |}\n // Save modal for a later reopening then hide it\n | {|\n force?: boolean,\n type: typeof ModalActionType.SaveAndHide,\n |}\n // Show authentication required modal\n | {|\n modalType: typeof AUTHENTICATION_REQUIRED_MODAL,\n type: typeof ModalActionType.Show,\n |}\n // Show avenue modal\n | {|\n avenueData?: AVENUE_DATA_MODAL_TYPE,\n modalType: typeof AVENUE_MODAL,\n type: typeof ModalActionType.Show,\n |}\n // Show card modal\n | {|\n cardData?: CARD_DATA_MODAL_TYPE,\n modalType: typeof CARD_MODAL,\n type: typeof ModalActionType.Show,\n |}\n // Show confirmation modal\n | {|\n confirmationData: CONFIRMATION_DATA_MODAL_TYPE,\n modalType: typeof CONFIRMATION_MODAL,\n type: typeof ModalActionType.Show,\n |}\n // Show external content modal\n | {|\n externalContentUrl: string,\n modalType: typeof EXTERNAL_CONTENT_MODAL,\n type: typeof ModalActionType.Show,\n |}\n // Show message modal\n | {|\n messageData: MESSAGE_MODAL_TYPE,\n modalType: typeof MESSAGE_MODAL,\n type: typeof ModalActionType.Show,\n |}\n // Show keyboard shortcuts modal\n | {|\n modalType: typeof KEYBOARD_SHORTCUTS_MODAL,\n type: typeof ModalActionType.Show,\n |}\n // Show legal notice modal\n | {|\n modalType: typeof LEGAL_NOTICE_MODAL,\n type: typeof ModalActionType.Show,\n |}\n // Show new version modal\n | {|\n newVersionData: NEW_VERSION_DATA_MODAL_TYPE,\n modalType: typeof NEW_VERSION_MODAL,\n type: typeof ModalActionType.Show,\n |}\n // Show nPVR confirmation modal\n | {|\n npvrData: NPVR_DATA_MODAL_TYPE,\n modalType: typeof NPVR_MODAL,\n type: typeof ModalActionType.Show,\n |}\n // Show nPVR help modal\n | {|\n modalType: typeof NPVR_HELP_MODAL,\n type: typeof ModalActionType.Show,\n |}\n // Show VOD purchase modal\n | {|\n modalType: typeof VOD_PURCHASE_MODAL,\n type: typeof ModalActionType.Show,\n vodPurchaseData: VOD_PURCHASE_DATA_TYPE,\n |};\n\nconst hideModal: (shouldBeReopenedLater?: boolean, force?: boolean) => ModalAction = (shouldBeReopenedLater, force) =>\n shouldBeReopenedLater\n ? {\n force,\n type: ModalActionType.SaveAndHide,\n }\n : {\n force,\n type: ModalActionType.Hide,\n };\n\nconst reopenModalCard: () => ModalAction = () => {\n return { type: ModalActionType.Reopen };\n};\n\nconst showAuthenticationRequiredModal: () => ModalAction = () => {\n return {\n modalType: AUTHENTICATION_REQUIRED_MODAL,\n type: ModalActionType.Show,\n };\n};\n\nconst showAvenueModal: (avenueData: AVENUE_DATA_MODAL_TYPE) => ModalAction = (avenueData) => {\n return {\n avenueData,\n modalType: AVENUE_MODAL,\n type: ModalActionType.Show,\n };\n};\n\nconst showCardModal: (cardData: CARD_DATA_MODAL_TYPE) => ModalAction = (cardData) => {\n return {\n cardData,\n modalType: CARD_MODAL,\n type: ModalActionType.Show,\n };\n};\n\nconst showConfirmationModal: (confirmationData: CONFIRMATION_DATA_MODAL_TYPE) => ModalAction = (confirmationData) => {\n return {\n confirmationData,\n modalType: CONFIRMATION_MODAL,\n type: ModalActionType.Show,\n };\n};\n\nconst showExternalContentModal: (externalContentUrl: string) => ModalAction = (externalContentUrl) => {\n return {\n externalContentUrl,\n modalType: EXTERNAL_CONTENT_MODAL,\n type: ModalActionType.Show,\n };\n};\n\nconst showKeyboardShortcutsModal: () => ModalAction = () => {\n return {\n modalType: KEYBOARD_SHORTCUTS_MODAL,\n type: ModalActionType.Show,\n };\n};\n\nconst showLegalNoticeModal: () => ModalAction = () => {\n return {\n modalType: LEGAL_NOTICE_MODAL,\n type: ModalActionType.Show,\n };\n};\n\nconst showMessageModal: (messageData: MESSAGE_MODAL_TYPE) => ModalAction = (messageData) => {\n return {\n messageData,\n modalType: MESSAGE_MODAL,\n type: ModalActionType.Show,\n };\n};\n\nconst showNewVersionModal: (newVersionData: NEW_VERSION_DATA_MODAL_TYPE) => ModalAction = (newVersionData) => {\n return {\n modalType: NEW_VERSION_MODAL,\n newVersionData,\n type: ModalActionType.Show,\n };\n};\n\nconst showNpvrModal: (npvrData: NPVR_DATA_MODAL_TYPE) => ModalAction = (npvrData) => {\n return {\n modalType: NPVR_MODAL,\n npvrData,\n type: ModalActionType.Show,\n };\n};\n\nconst showNpvrHelpModal: () => ModalAction = () => {\n return {\n modalType: NPVR_HELP_MODAL,\n type: ModalActionType.Show,\n };\n};\n\nconst showVodPurchaseModal: (vodPurchaseData: VOD_PURCHASE_DATA_TYPE) => ModalAction = (vodPurchaseData) => {\n return {\n modalType: VOD_PURCHASE_MODAL,\n type: ModalActionType.Show,\n vodPurchaseData,\n };\n};\n\nexport {\n hideModal,\n reopenModalCard,\n showAuthenticationRequiredModal,\n showAvenueModal,\n showCardModal,\n showConfirmationModal,\n showExternalContentModal,\n showKeyboardShortcutsModal,\n showLegalNoticeModal,\n showMessageModal,\n showNewVersionModal,\n showNpvrModal,\n showNpvrHelpModal,\n showVodPurchaseModal,\n};\n","/* @flow */\n\nexport enum ModalActionType {\n Hide,\n Reopen,\n SaveAndHide,\n Show,\n}\n","/* @flow */\n\nimport type { NETGEM_API_V8_FEED_PARAM, NETGEM_API_V8_FEED_PARAM_ARGS } from '../../../../libs/netgemLibrary/v8/types/Param';\nimport { getChannelGroupId, getChannelListFromGroupId, getChannelListFromTag } from '../../../../helpers/channel/helper';\nimport { getRoundedDateToISOString, getRoundedDurationToISOString, getRoundedNowToISOString } from '../../../../libs/netgemLibrary/v8/helpers/Date';\nimport { getSettingSection, getSettingValueByName } from './settings';\nimport { APP_LANGUAGES_AS_STRING } from '../../../../index';\nimport AccurateTimestamp from '../../../../helpers/dateTime/AccurateTimestamp';\nimport Base64 from 'crypto-js/enc-base64';\nimport type { CombinedReducers } from '../../../reducers';\nimport { HttpMethod } from '../../../../libs/netgemLibrary/v8/types/HttpMethod';\nimport type { NETGEM_API_V8_REQUEST_RESPONSE } from '../../../../libs/netgemLibrary/v8/types/RequestResponse';\nimport { type NETGEM_API_V8_URL_DEFINITION } from '../../../../libs/netgemLibrary/v8/types/NtgVideoFeed';\nimport type { STREAM_PRIORITIES_TYPE } from '../../../../helpers/ui/metadata/Types';\nimport { getBOSetting } from './boSettings';\nimport { getValueFromPrefix } from '../../../../helpers/ui/item/traverser';\nimport hmacSHA256 from 'crypto-js/hmac-sha256';\nimport { logWarning } from '../../../../helpers/debug/debug';\n\ntype GetterType = (op: string, args: NETGEM_API_V8_FEED_PARAM_ARGS, additionalParameters: any, state: CombinedReducers) => string | null;\n\nconst generateApiUrl: (urlDef: NETGEM_API_V8_URL_DEFINITION, additionalParameters: any, state: CombinedReducers) => string = (urlDef, additionalParameters, state) => {\n const { appConfiguration } = state;\n const { method, params, provider, sakName } = urlDef;\n let { uri: url } = urlDef;\n\n const cncParameter = additionalParameters?.cncParameter;\n if (provider?.toLowerCase() === 'cncresolver' && cncParameter) {\n // First replace '{cncparameter}' by actual parameter, then apply parameters replacement as usual\n url = url.replace('{cncparameter}', `&${cncParameter}`);\n }\n\n // Replace parameters\n if (params) {\n for (let i = 0; i < params.length; i++) {\n const { name, value } = params[i];\n const v = getValueForParameter(value, additionalParameters, state) || '';\n url = url.replace(new RegExp(`\\\\{${name}\\\\}`, 'gu'), name !== 'options' && name !== 'videostreams' && name !== 'deeplinkParameter' ? encodeURIComponent(v) : v);\n }\n }\n\n // Sign\n const apiKeyValue = sakName ? getSettingValueByName('platform.sas', sakName, appConfiguration) : null;\n\n return sakName ? createSignedApiUrl(url, sakName, apiKeyValue, method || HttpMethod.GET) : url;\n};\n\nconst apiKeyIdValueGetter: GetterType = (op, args, additionalParameters, state) => getSettingValueByName('platform.discovery', 'apikeyid', state.appConfiguration);\n\nconst channelGr2ChannelListValueGetter: GetterType = (op, args, additionalParameters, state) => {\n let channelGroupId: string | null = null;\n const [arg] = args;\n\n if (typeof arg === 'string') {\n channelGroupId = arg;\n } else if (typeof arg !== 'number' && !Array.isArray(arg)) {\n channelGroupId = getValueForParameter(arg, additionalParameters, state);\n }\n\n return JSON.stringify(getChannelListFromGroupId(state.appConfiguration.deviceChannels, channelGroupId));\n};\n\nconst tag2ChannelListValueGetter: GetterType = (op, args, additionalParameters, state) => {\n const [tag] = args;\n\n if (typeof tag !== 'string') {\n return null;\n }\n\n return JSON.stringify(getChannelListFromTag(state.appConfiguration.deviceChannels, tag).sort());\n};\n\nconst tag2ListAliasValueGetter: GetterType = (op, args, additionalParameters, state) => {\n const [tag] = args;\n\n if (typeof tag !== 'string') {\n return null;\n }\n\n const {\n tagListAliases: { [tag]: listAlias },\n } = state.appConfiguration;\n\n if (!listAlias && state.appConfiguration.isDebugModeEnabled) {\n logWarning(`Missing tag: ${tag}`);\n }\n\n return listAlias ?? null;\n};\n\nconst channel2ChannelGrValueGetter: GetterType = (op, args, additionalParameters, state) => {\n let channelId: string | null = null;\n const [arg] = args;\n\n if (typeof arg === 'string') {\n channelId = arg;\n } else if (typeof arg !== 'number' && !Array.isArray(arg)) {\n channelId = getValueForParameter(arg, additionalParameters, state);\n }\n\n return getChannelGroupId(state.appConfiguration.deviceChannels, channelId);\n};\n\nconst channelListValueGetter: GetterType = (op, args, additionalParameters, state) => {\n if (additionalParameters) {\n const { [op]: p } = additionalParameters;\n if (typeof p === 'string') {\n // Given parameter is a list alias\n return p;\n }\n if (Array.isArray(p)) {\n // Given parameter is an array of channel Ids\n return JSON.stringify(p);\n }\n }\n\n // No given parameter: use global list alias (i.e. all channels)\n return state.appConfiguration.listAlias;\n};\n\nconst selectedValueGetter: GetterType = (op, args, additionalParameters) => {\n if (!additionalParameters) {\n return null;\n }\n\n const { assetId, item } = additionalParameters;\n const [paramPrefix] = args;\n\n if (typeof paramPrefix !== 'string') {\n return null;\n }\n\n if (assetId?.startsWith(paramPrefix)) {\n return assetId;\n }\n\n return item ? getValueFromPrefix(item, paramPrefix) : null;\n};\n\nconst settingsValueGetter: GetterType = (op, args, additionalParameters, state) => {\n const [section, name, defaultValue] = args;\n\n if (typeof section !== 'string' || typeof name !== 'string') {\n return '';\n }\n\n // DMS setting > default value > empty string\n return getSettingValueByName(section, name, state.appConfiguration) ?? defaultValue?.toString() ?? '';\n};\n\nconst orValueGetter: GetterType = (op, args, additionalParameters, state) => {\n for (const arg of args) {\n if (typeof arg !== 'number' && typeof arg !== 'string' && !Array.isArray(arg)) {\n const argValue = getValueForParameter(arg, additionalParameters, state);\n if (argValue && argValue !== '[]') {\n return argValue;\n }\n } else if (arg !== null && arg !== undefined && !Array.isArray(arg)) {\n return `${arg}`;\n }\n }\n\n return null;\n};\n\nconst unionValueGetter: GetterType = (op, args, additionalParameters, state) => {\n const union = [];\n\n const pushIfMissing = (item: string) => {\n if (union.indexOf(item) === -1) {\n union.push(item);\n }\n };\n\n args.forEach((arg) => {\n if (Array.isArray(arg)) {\n arg.forEach((i) => pushIfMissing(i));\n } else if (typeof arg === 'number' || typeof arg === 'string') {\n pushIfMissing(`${arg}`);\n } else {\n const argValue = getValueForParameter(arg, additionalParameters, state);\n if (argValue) {\n if (Array.isArray(argValue)) {\n argValue.forEach((v: string) => {\n pushIfMissing(v);\n });\n } else {\n pushIfMissing(argValue);\n }\n }\n }\n });\n\n return JSON.stringify(union);\n};\n\nconst valueListGetter: GetterType = (op, args) => {\n if (args.every((item) => typeof item === 'string')) {\n return JSON.stringify(args);\n }\n\n return null;\n};\n\nconst dateValueGetter: GetterType = (op, args, additionalParameters) => {\n const [paramName, paramRound] = args;\n const round = Number(paramRound) || 0;\n const paramValue = (additionalParameters && Number(additionalParameters[paramName])) || 0;\n return getRoundedDateToISOString(round, paramValue);\n};\n\nconst deeplinkParameterValueGetter: GetterType = (op, args, additionalParameters) => {\n const { deeplinkParameter } = additionalParameters;\n return deeplinkParameter ?? null;\n};\n\nconst defaultKeyValueGetter: GetterType = (op, args, additionalParameters, state) => getSettingValueByName('platform', 'defaultkey', state.appConfiguration);\n\nconst langValueGetter: () => string = () => APP_LANGUAGES_AS_STRING;\n\nconst nowValueGetter: GetterType = (op, args) => {\n const round = Number(args[0]) || 0;\n const offset = Number(args[1]) || 0;\n return getRoundedNowToISOString(round, offset);\n};\n\nconst optionsValueGetter: GetterType = (op, args, additionalParameters, state) => {\n const [paramName] = args;\n let result: string | null = null;\n\n if (paramName && typeof paramName === 'string') {\n const section = getSettingSection(`platform.${paramName}.options`, state.appConfiguration);\n if (section) {\n const options: { [string]: string } = {};\n for (let i = 0; i < section.length; i++) {\n const { name, value } = section[i];\n options[name] = value;\n }\n\n result = Object.entries(options)\n .map(([key, value]) => `&${key}=${((value: any): string)}`)\n .join('');\n }\n }\n\n return result;\n};\n\nconst rangeValueGetter: GetterType = (op, args, additionalParameters) => {\n const round = (Array.isArray(args) && args.length > 0 && Number(args[0])) || 0;\n const paramValue = (additionalParameters && Number(additionalParameters[op])) || 0;\n return getRoundedDurationToISOString(paramValue, round);\n};\n\nconst realmValueGetter: GetterType = (op, args, additionalParameters, state) => getSettingValueByName('platform', 'realm', state.appConfiguration);\n\nconst boDeviceValueGetter: GetterType = (op, args, additionalParameters, state) => getSettingValueByName('platform.vf', 'device', state.appConfiguration);\n\nconst boDistributorValueGetter: GetterType = (op, args, additionalParameters, state) => getSettingValueByName('platform.vf', 'distributor', state.appConfiguration);\n\nconst boProductIdValueGetter: GetterType = (op, args, additionalParameters, state) => getBOSetting('productId', state.appConfiguration);\n\nconst videostreamsValueGetter: GetterType = (op, args, additionalParameters) => {\n if (additionalParameters) {\n const { [op]: p } = additionalParameters;\n if (typeof p === 'string') {\n return p;\n }\n }\n\n return null;\n};\n\nconst defaultValueGetter: GetterType = (op, args, additionalParameters) => {\n if (additionalParameters) {\n const { [op]: p } = additionalParameters;\n if (typeof p === 'string' || typeof p === 'number' || typeof p === 'boolean') {\n return p.toString();\n }\n }\n\n return null;\n};\n\nconst getValueForParameter: (value: NETGEM_API_V8_FEED_PARAM, additionalParameters: any, state: CombinedReducers) => string | null = (value, additionalParameters, state) => {\n const { op, args } = value;\n\n if (!op) {\n return null;\n }\n\n const valueGetterMap: {| [string]: GetterType |} = {\n apiKeyId: apiKeyIdValueGetter,\n channel2ChannelGr: channel2ChannelGrValueGetter,\n channelGr2ChannelList: channelGr2ChannelListValueGetter,\n channelList: channelListValueGetter,\n date: dateValueGetter,\n deeplinkParameter: deeplinkParameterValueGetter,\n defaultKey: defaultKeyValueGetter,\n lang: langValueGetter,\n now: nowValueGetter,\n options: optionsValueGetter,\n or: orValueGetter,\n range: rangeValueGetter,\n realm: realmValueGetter,\n selected: selectedValueGetter,\n settings: settingsValueGetter,\n tag2ChannelList: tag2ChannelListValueGetter,\n tag2ListAlias: tag2ListAliasValueGetter,\n union: unionValueGetter,\n valueList: valueListGetter,\n vfDevice: boDeviceValueGetter,\n vfDistributor: boDistributorValueGetter,\n vfProductId: boProductIdValueGetter,\n videostreams: videostreamsValueGetter,\n };\n\n const getter = valueGetterMap[op] ? valueGetterMap[op] : defaultValueGetter;\n return getter(op, args, additionalParameters, state);\n};\n\nconst createSignedApiUrl: (unsignedUrl: string, apiKeyId: ?string, apiKeyValue: ?string, httpMethod: HttpMethod) => string = (unsignedUrl, apiKeyId, apiKeyValue, httpMethod) => {\n const url = new URL(unsignedUrl);\n const { hash, pathname, search } = url;\n const pathQuerySegment = `${pathname || ''}${search || ''}${hash || ''}`;\n const decodedPathQuerySegment = decodeURIComponent(pathQuerySegment);\n const request = `${(httpMethod: string)} ${decodedPathQuerySegment}`;\n const h = hmacSHA256(request, Base64.parse(apiKeyValue));\n\n url.searchParams.set('sas', Base64.stringify(h));\n return url.toString();\n};\n\n// From Microsoft: https://docs.microsoft.com/en-us/rest/api/eventhub/generate-sas-token\nconst computeSas: (unsignedUrl: string, apiKeyId: string, apiKeyValue: string, sasDelay: number) => string = (unsignedUrl, apiKeyId, apiKeyValue, sasDelay) => {\n const encoded = encodeURIComponent(unsignedUrl);\n const ttl = AccurateTimestamp.nowInSeconds() + sasDelay;\n const fullUrl = `${encoded}\\n${ttl}`;\n const hash = hmacSHA256(fullUrl, apiKeyValue);\n const encodedHash = encodeURIComponent(Base64.stringify(hash));\n return `SharedAccessSignature sr=${encoded}&sig=${encodedHash}&se=${ttl}&skn=${apiKeyId}`;\n};\n\nconst filterAndSortPlaybackUrls: (response: NETGEM_API_V8_REQUEST_RESPONSE, playerStreamPriorities: STREAM_PRIORITIES_TYPE | null) => NETGEM_API_V8_REQUEST_RESPONSE = (\n response,\n playerStreamPriorities,\n) => {\n const {\n result: {\n location: { playbackUrls },\n },\n } = response;\n\n if (!playerStreamPriorities || !playbackUrls || playbackUrls.length === 0) {\n return response;\n }\n\n const urls = [];\n\n // Filter\n playbackUrls.forEach((u) => {\n const {\n player,\n start: { params },\n } = u;\n const priorities = playerStreamPriorities[player] || playerStreamPriorities.default;\n\n let found = false;\n if (priorities) {\n for (let i = 0; i < params.length && !found; ++i) {\n const { [i]: param } = params;\n const {\n value: { args },\n } = param;\n const newArgs = [];\n\n for (let j = 0; j < args.length; ++j) {\n const { [j]: arg } = args;\n const { type } = arg;\n const index = priorities[type];\n\n if (index !== undefined && index > -1) {\n found = true;\n newArgs.push(arg);\n }\n }\n\n // Sort\n newArgs.sort((a, b) => {\n const index1 = priorities[a.type];\n const index2 = priorities[b.type];\n if (index1 === index2) {\n return 0;\n }\n return index1 < index2 ? -1 : 1;\n });\n\n param.value.args = newArgs;\n }\n }\n\n if (found) {\n urls.push(u);\n }\n });\n\n response.result.location.playbackUrls = urls;\n\n return response;\n};\n\nexport { computeSas, filterAndSortPlaybackUrls, generateApiUrl, getValueForParameter };\n","/* @flow */\n\nconst getValueFromPrefix: (item: any, prefix: string) => any = (item, prefix) => {\n const q = [item];\n\n while (q.length > 0) {\n const o = q.pop();\n if (o) {\n if (typeof o === 'object') {\n Object.entries(o).forEach(([k, v]) => {\n if (k !== 'elements' && (typeof v === 'string' || typeof v === 'object')) {\n q.push(v);\n }\n });\n } else if (o.startsWith(prefix)) {\n // Value found\n return o;\n }\n }\n }\n\n // Not found\n return null;\n};\n\nexport { getValueFromPrefix };\n","/* @flow */\n\nimport type { AppConfigurationState } from '../../../appConf/reducers';\n\nconst getBOSetting: (settingName: string, appConfiguration: AppConfigurationState) => string | null = (settingName, appConfiguration) => {\n const {\n boSettings: { [settingName]: settingValue },\n } = appConfiguration;\n return settingValue ?? null;\n};\n\nexport { getBOSetting };\n","/* @flow */\n\nimport type { DmsSettingMap, NETGEM_API_DMS_DEVICE_INFO_SETTINGS } from '../../../../libs/netgemLibrary/dms/types/DeviceInfoSettings';\nimport type { AppConfigurationState } from '../../../appConf/reducers';\n\nconst getSettingValueByName: (settingId: string, settingName: string, appConfiguration: AppConfigurationState) => string | null = (settingId, settingName, appConfiguration) => {\n const { deviceSettings } = appConfiguration;\n return getSettingValueByNameFromDeviceSettings(deviceSettings, settingId, settingName);\n};\n\nconst getSettingValueByNameFromDeviceSettings: (deviceSettings: DmsSettingMap, settingId: string, settingName: string) => string | null = (deviceSettings, settingId, settingName) => {\n const { [settingId]: settings } = deviceSettings;\n\n if (settings) {\n const setting = settings.find((s) => s.name === settingName);\n if (setting) {\n return setting.value;\n }\n }\n\n return null;\n};\n\nconst getSettingSection: (settingId: string, appConfiguration: AppConfigurationState) => ?Array<NETGEM_API_DMS_DEVICE_INFO_SETTINGS> = (settingId, appConfiguration) => {\n const { deviceSettings } = appConfiguration;\n\n return deviceSettings[settingId];\n};\n\nexport { getSettingSection, getSettingValueByName, getSettingValueByNameFromDeviceSettings };\n","/* @flow */\n\nimport type { NetgemApiEmitterType, RequestResponseMethodDefinitionType } from '../emitter';\nimport type { CombinedReducers } from '../../../reducers';\nimport type { Dispatch } from '../../../types/types';\nimport { REDUX_MSG_REQUEST_PERSONAL_DATA_GET } from '../../constants/';\nimport { createCustomNetworkErrorFromKey } from '../../../../libs/netgemLibrary/helpers/CreateCustomNetworkError';\nimport { generateApiUrl } from '../helpers/api';\n\nconst sendPersonalDataGetRequest: (key: string, eTag: ?string, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (key, eTag, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const state = getState();\n const {\n netgemApi: { personalDataGetUrl },\n } = state;\n\n if (!personalDataGetUrl) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definition', { urlDef: 'personalDataGetUrl' }));\n }\n\n const { authent, method } = personalDataGetUrl;\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_PERSONAL_DATA_GET, {\n authent,\n eTag,\n method,\n signal,\n uri: generateApiUrl(personalDataGetUrl, { key }, state),\n });\n };\n\nconst sendPersonalDataListGetRequest: (listId: string, itemId: ?string, eTag: ?string, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (listId, itemId, eTag, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const state = getState();\n const {\n netgemApi: { personalDataListGetUrl },\n } = state;\n\n if (!personalDataListGetUrl) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definition', { urlDef: 'personalDataListGetUrl' }));\n }\n\n const { authent, method } = personalDataListGetUrl;\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_PERSONAL_DATA_GET, {\n authent,\n eTag,\n method,\n signal,\n uri: generateApiUrl(\n personalDataListGetUrl,\n {\n itemId,\n listId,\n },\n state\n ),\n });\n };\n\nexport { sendPersonalDataGetRequest, sendPersonalDataListGetRequest };\n","/* @flow */\n\nimport type { NetgemApiEmitterType, RequestResponseMethodDefinitionType } from '../emitter';\nimport type { CombinedReducers } from '../../../reducers';\nimport type { Dispatch } from '../../../types/types';\nimport { REDUX_MSG_REQUEST_PERSONAL_DATA_POST } from '../../constants/';\nimport { createCustomNetworkErrorFromKey } from '../../../../libs/netgemLibrary/helpers/CreateCustomNetworkError';\nimport { generateApiUrl } from '../helpers/api';\n\nconst sendPersonalDataPostRequest: (key: string, data: any, eTag: ?string, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (key, data, eTag, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const state = getState();\n const {\n netgemApi: { personalDataPostUrl },\n } = state;\n\n if (!personalDataPostUrl) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definition', { urlDef: 'personalDataPostUrl' }));\n }\n\n const { authent, method } = personalDataPostUrl;\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_PERSONAL_DATA_POST, {\n authent,\n data,\n eTag,\n method,\n signal,\n uri: generateApiUrl(personalDataPostUrl, { key }, state),\n });\n };\n\nconst sendPersonalDataListPostRequest: (listId: string, itemId: string, data: any, eTag: ?string, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (listId, itemId, data, eTag, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const state = getState();\n const {\n netgemApi: { personalDataListPostUrl },\n } = state;\n\n if (!personalDataListPostUrl) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definition', { urlDef: 'personalDataListPostUrl' }));\n }\n\n const { authent, method } = personalDataListPostUrl;\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_PERSONAL_DATA_POST, {\n authent,\n data,\n eTag,\n method,\n signal,\n uri: generateApiUrl(\n personalDataListPostUrl,\n {\n itemId,\n listId,\n },\n state\n ),\n });\n };\n\nexport { sendPersonalDataListPostRequest, sendPersonalDataPostRequest };\n","/* @flow */\n\nimport { type AllSettledPromises, SettledPromiseRejected } from '../../../../helpers/jsHelpers/promise';\nimport { MILLISECONDS_PER_WEEK, MIN_DATE } from '../../../../helpers/dateTime/Format';\nimport type { NETGEM_API_V8_FEED, NETGEM_API_V8_ITEM_LOCATION_TYPE } from '../../../../libs/netgemLibrary/v8/types/FeedItem';\nimport type { NETGEM_API_VIEWINGHISTORY, NETGEM_API_VIEWINGHISTORY_ITEM, NETGEM_API_VIEWINGHISTORY_PLAYED_ITEMS, VIEWING_HISTORY_TYPE } from '../../../../libs/netgemLibrary/v8/types/ViewingHistory';\nimport { arePlayedItemsDifferent, areViewingHistoriesDifferent } from '../../../../helpers/ui/section/comparisons';\nimport { deleteViewingHistoryItem, deleteViewingHistoryItemETag, resetViewingHistory, setViewingHistoryError, updateViewingHistoryItem, updateWholeViewingHistory } from '../../../ui/actions';\nimport { logInfo, logWarning } from '../../../../helpers/debug/debug';\nimport AccurateTimestamp from '../../../../helpers/dateTime/AccurateTimestamp';\nimport type { CombinedReducers } from '../../../reducers';\nimport { CustomNetworkError } from '../../../../libs/netgemLibrary/helpers/CustomNetworkError';\nimport type { Dispatch } from '../../../types/types';\nimport { HttpStatus } from '../../../../libs/netgemLibrary/v8/constants/NetworkCodesAndMessages';\nimport LocalStorageManager from '../../../../helpers/localStorage/localStorageManager';\nimport { Localizer } from '@ntg/utils/dist/localization';\nimport { type NETGEM_API_V8_REQUEST_RESPONSE } from '../../../../libs/netgemLibrary/v8/types/RequestResponse';\nimport { PersonalDataKey } from '../../../../libs/netgemLibrary/personalData/constants/keys';\nimport type { RequestResponseMethodDefinitionType } from '../emitter';\nimport { StorageKeys } from '../../../../helpers/localStorage/keys';\nimport { getAllLocationIds } from '../../../../libs/netgemLibrary/v8/helpers/Feed';\nimport { getLocationType } from '../../../../libs/netgemLibrary/v8/helpers/Item';\nimport { isUndefinedOrNull } from '@ntg/utils/dist/types';\nimport { sendPersonalDataListDeleteRequest } from './delete';\nimport { sendPersonalDataListGetRequest } from './get';\nimport { sendPersonalDataListPostRequest } from './post';\n\n// Clean up viewing history once a week (in ms)\nconst VIEWING_HISTORY_CLEAN_UP_INTERVAL = MILLISECONDS_PER_WEEK;\nconst ONE_HUNDRED = 100;\n\nconst getViewingHistory: (signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers): Promise<any> => {\n const {\n ui: {\n viewingHistoryETagCache: { viewingHistory: initialETag },\n },\n } = getState();\n\n return dispatch(sendPersonalDataListGetRequest(PersonalDataKey.ViewingHistory, undefined, initialETag, signal))\n .then((data: NETGEM_API_V8_REQUEST_RESPONSE) => {\n const { eTag: viewingHistoryETag } = data;\n const result = JSON.parse((data.result: string));\n\n // Filter out malformed items\n const viewingHistory: NETGEM_API_VIEWINGHISTORY = validateViewingHistory((result: NETGEM_API_VIEWINGHISTORY));\n\n dispatch(updateWholeViewingHistory(viewingHistory, viewingHistoryETag));\n return Promise.resolve();\n })\n .catch((error: CustomNetworkError) => {\n const status = error.getStatus();\n if (status === HttpStatus.NotFound) {\n // Not found means viewing history does not exist yet\n dispatch(resetViewingHistory());\n return Promise.resolve();\n } else if (status === HttpStatus.NotModified) {\n return Promise.resolve();\n }\n\n dispatch(setViewingHistoryError());\n return Promise.reject(error);\n });\n };\n\nconst validateViewingHistory: (viewingHistory: NETGEM_API_VIEWINGHISTORY) => NETGEM_API_VIEWINGHISTORY = (viewingHistory) => {\n if (isUndefinedOrNull(viewingHistory)) {\n return {};\n }\n\n const validatedViewingHistory: NETGEM_API_VIEWINGHISTORY = {};\n\n Object.entries(viewingHistory).forEach(([key, value]) => {\n if (typeof key === 'string' && key !== '') {\n const viewingHistoryItem = ((value: any): NETGEM_API_VIEWINGHISTORY_ITEM);\n const { date, id, watchingstatus } = viewingHistoryItem;\n\n if (typeof date === 'string' && typeof id === 'string') {\n if (typeof watchingstatus !== 'number' || watchingstatus < 0 || watchingstatus > ONE_HUNDRED) {\n viewingHistoryItem.watchingstatus = 0;\n }\n validatedViewingHistory[key] = viewingHistoryItem;\n }\n }\n });\n\n return validatedViewingHistory;\n};\n\nconst updateViewingHistory: (item: NETGEM_API_VIEWINGHISTORY_ITEM, signal?: AbortSignal, isSecondAttempt?: boolean) => RequestResponseMethodDefinitionType =\n (item, signal, isSecondAttempt) =>\n (dispatch: Dispatch, getState: () => CombinedReducers): Promise<any> => {\n const {\n ui: { viewingHistoryETagCache, viewingHistory },\n } = getState();\n const { id: itemId } = item;\n const { [itemId]: existingItem } = viewingHistory || {};\n const { [itemId]: existingItemETag } = viewingHistoryETagCache;\n\n if (isSecondAttempt || (existingItem && !existingItemETag)) {\n // Item is already in viewing history but ETag is missing (i.e. item was saved during a previous session): a GET is required to retrieve the associated ETag\n return dispatch(sendPersonalDataListGetRequest(PersonalDataKey.ViewingHistory, itemId, existingItemETag, signal)).then((data: NETGEM_API_V8_REQUEST_RESPONSE) => {\n const { eTag } = data;\n return dispatch(updateViewingHistoryWithETag(item, eTag, signal, isSecondAttempt));\n });\n }\n\n // Item and associated ETag exist (i.e. item saved during current session) or none of them exists (i.e. item never saved)\n return dispatch(updateViewingHistoryWithETag(item, existingItemETag, signal, isSecondAttempt));\n };\n\nconst updateViewingHistoryWithETag: (item: NETGEM_API_VIEWINGHISTORY_ITEM, eTag: ?string, signal?: AbortSignal, isSecondAttempt?: boolean) => RequestResponseMethodDefinitionType =\n (item, eTag, signal, isSecondAttempt) =>\n (dispatch: Dispatch): Promise<any> => {\n const { id: itemId } = item;\n\n return dispatch(sendPersonalDataListPostRequest(PersonalDataKey.ViewingHistory, itemId, item, eTag, signal))\n .then((data: NETGEM_API_V8_REQUEST_RESPONSE) => {\n const { eTag: itemETag } = data;\n\n if (itemETag) {\n dispatch(updateViewingHistoryItem(item, itemETag));\n }\n\n return Promise.resolve();\n })\n .catch((error: CustomNetworkError) => {\n const status = error.getStatus();\n if (!isSecondAttempt && (status === HttpStatus.Conflict || status === HttpStatus.PreconditionFailed)) {\n /*\n * Most probable cause: another device paired with the same account already updated the viewing history\n * So we send a GET request to retrieve the latest ETag, but we only try once to avoid infinite loop between multiple devices\n */\n dispatch(deleteViewingHistoryItemETag(itemId));\n return dispatch(updateViewingHistory(item, signal, true));\n }\n\n return Promise.reject(error);\n });\n };\n\nconst deleteWholeViewingHistory: (signal?: AbortSignal) => RequestResponseMethodDefinitionType = (signal) => deleteViewingHistory(null, signal);\n\nconst deleteViewingHistory: (itemId: ?string, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (itemId, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers): Promise<any> => {\n const {\n ui: {\n viewingHistoryETagCache,\n viewingHistoryETagCache: { viewingHistory: initialListETag },\n },\n } = getState();\n const initialItemETag = itemId ? viewingHistoryETagCache[itemId] : null;\n const initialETag = itemId ? initialItemETag : initialListETag;\n\n // Get ETag\n return dispatch(sendPersonalDataListGetRequest(PersonalDataKey.ViewingHistory, itemId, initialETag, signal))\n .then((data: NETGEM_API_V8_REQUEST_RESPONSE) => {\n // Delete\n const { eTag } = data;\n if (eTag) {\n return dispatch(deleteViewingHistoryWithETag(itemId, eTag, signal));\n }\n return Promise.resolve();\n })\n .catch((eTagError: CustomNetworkError) => {\n const status = eTagError.getStatus();\n if (status === HttpStatus.NotFound) {\n // Viewing history not found for this user: nothing to delete\n return Promise.resolve();\n } else if (status === HttpStatus.NotModified) {\n // Viewing history has not recently changed: current ETag should be used\n return dispatch(deleteViewingHistoryWithETag(itemId, initialETag, signal));\n }\n\n return Promise.reject(eTagError);\n });\n };\n\nconst deleteViewingHistoryWithETag: (itemId: ?string, eTag: ?string, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (itemId, eTag, signal) =>\n (dispatch: Dispatch): Promise<any> =>\n dispatch(sendPersonalDataListDeleteRequest(PersonalDataKey.ViewingHistory, itemId, eTag, signal)).then(() => {\n if (itemId) {\n // Delete item from list\n dispatch(deleteViewingHistoryItem(itemId));\n return Promise.resolve();\n }\n\n // Clear whole list\n dispatch(resetViewingHistory());\n return Promise.resolve();\n });\n\nconst checkPlayedItems: (item: NETGEM_API_VIEWINGHISTORY_ITEM, allLocationIds: Set<string>, allowedTypes: Set<NETGEM_API_V8_ITEM_LOCATION_TYPE>) => NETGEM_API_VIEWINGHISTORY_PLAYED_ITEMS | null = (\n item,\n allLocationIds,\n allowedTypes,\n) => {\n const { playeditems } = item;\n\n if (!playeditems) {\n return null;\n }\n\n const updatedPlayedItems: NETGEM_API_VIEWINGHISTORY_PLAYED_ITEMS = {};\n let hasBeenUpdated = false;\n Object.keys(playeditems).forEach((locationId) => {\n const value = playeditems[locationId];\n const locationType = getLocationType(locationId);\n\n if (allLocationIds.has(locationId) || !locationType || !allowedTypes.has(locationType)) {\n updatedPlayedItems[locationId] = { ...value };\n } else {\n hasBeenUpdated = true;\n }\n });\n\n return hasBeenUpdated ? updatedPlayedItems : playeditems;\n};\n\nconst cleanUpViewingHistory: (viewingHistory: VIEWING_HISTORY_TYPE, feed: NETGEM_API_V8_FEED, locationTypes: Set<NETGEM_API_V8_ITEM_LOCATION_TYPE>) => RequestResponseMethodDefinitionType =\n (viewingHistory, feed, locationTypes) =>\n (dispatch: Dispatch): Promise<any> => {\n const now = AccurateTimestamp.now();\n const lastViewingHistoryCleanUpTimestamp = LocalStorageManager.loadIsoDate(StorageKeys.LastViewingHistoryCleanUp, MIN_DATE).getTime();\n\n if (now < lastViewingHistoryCleanUpTimestamp + VIEWING_HISTORY_CLEAN_UP_INTERVAL) {\n // Last clean up is too recent\n return Promise.resolve();\n }\n\n LocalStorageManager.save(StorageKeys.LastViewingHistoryCleanUp, AccurateTimestamp.nowAsDate());\n\n const promises = [];\n\n const allLocationIds = getAllLocationIds(feed);\n const updatedViewingHistory: VIEWING_HISTORY_TYPE = [];\n const obsoleteItemIds = new Set<string>();\n\n // Check items\n viewingHistory.forEach((item) => {\n const { episodes, id: itemId, playeditems } = item;\n\n if (episodes) {\n // Series\n const updatedEpisodes: VIEWING_HISTORY_TYPE = [];\n episodes.forEach((episode) => {\n const updatedPlayedItems = checkPlayedItems(episode, allLocationIds, locationTypes);\n if (updatedPlayedItems && Object.keys(updatedPlayedItems).length > 0) {\n updatedEpisodes.push({\n ...episode,\n playeditems: updatedPlayedItems,\n });\n }\n });\n\n if (updatedEpisodes.length === 0) {\n obsoleteItemIds.add(itemId);\n } else if (areViewingHistoriesDifferent(updatedEpisodes, episodes)) {\n updatedViewingHistory.push({\n ...item,\n episodes: updatedEpisodes,\n });\n }\n } else {\n // Program\n const updatedPlayedItems = checkPlayedItems(item, allLocationIds, locationTypes);\n if (updatedPlayedItems === null || Object.keys(updatedPlayedItems).length === 0) {\n obsoleteItemIds.add(itemId);\n } else if (arePlayedItemsDifferent(updatedPlayedItems, playeditems)) {\n updatedViewingHistory.push({\n ...item,\n playeditems: updatedPlayedItems,\n });\n }\n }\n });\n\n obsoleteItemIds.forEach((id) => promises.push(dispatch(deleteViewingHistory(id))));\n updatedViewingHistory.forEach((item: NETGEM_API_VIEWINGHISTORY_ITEM) => promises.push(dispatch(updateViewingHistory(item))));\n\n if (promises.length === 0) {\n logInfo(Localizer.localize('viewing_history.cleanup.nothing_to_do'));\n return Promise.resolve();\n }\n\n logInfo(Localizer.localize('viewing_history.cleanup.issues', { deleteCount: obsoleteItemIds.size, updateCount: updatedViewingHistory.length }));\n\n return Promise.allSettled(promises).then((results: AllSettledPromises) => {\n const count = results.filter(({ status }) => status === SettledPromiseRejected).length;\n\n if (count > 0) {\n logWarning(Localizer.localize('viewing_history.cleanup.failure', { count }));\n } else {\n logInfo(Localizer.localize('viewing_history.cleanup.success', { count: obsoleteItemIds.size }));\n }\n });\n };\n\nexport { cleanUpViewingHistory, deleteViewingHistory, deleteWholeViewingHistory, getViewingHistory, updateViewingHistory };\n","/* @flow */\n\nimport type { NetgemApiEmitterType, RequestResponseMethodDefinitionType } from '../emitter';\nimport type { CombinedReducers } from '../../../reducers';\nimport type { Dispatch } from '../../../types/types';\nimport { REDUX_MSG_REQUEST_PERSONAL_DATA_DELETE } from '../../constants';\nimport { createCustomNetworkErrorFromKey } from '../../../../libs/netgemLibrary/helpers/CreateCustomNetworkError';\nimport { generateApiUrl } from '../helpers/api';\n\nexport const sendPersonalDataListDeleteRequest: (listId: string, itemId: ?string, eTag: ?string, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (listId, itemId, eTag, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const state = getState();\n const {\n netgemApi: { personalDataListDeleteUrl },\n } = state;\n\n if (!personalDataListDeleteUrl) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definition', { urlDef: 'personalDataListDeleteUrl' }));\n }\n\n const { authent, method } = personalDataListDeleteUrl;\n const uri = generateApiUrl(\n personalDataListDeleteUrl,\n {\n itemId,\n listId,\n },\n state\n );\n\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_PERSONAL_DATA_DELETE, {\n authent,\n eTag,\n method,\n signal,\n uri,\n });\n };\n","/* @flow */\n\nexport enum WishlistItemKind {\n Program = 'program',\n Season = 'season',\n Series = 'series',\n}\n\nexport type NETGEM_API_WISHLIST_ITEM = {|\n channelId?: string,\n date: string,\n id: string,\n type: WishlistItemKind,\n|};\n\nexport type NETGEM_API_WISHLIST = Array<NETGEM_API_WISHLIST_ITEM>;\n","/* @flow */\n\nimport { WishlistItemKind } from '../types/Wishlist';\n\nexport const getWishlistTypeFromId: (assetId: string) => WishlistItemKind = (assetId) => {\n const [type] = assetId.split(':');\n switch (type) {\n case 'season':\n return WishlistItemKind.Season;\n\n case 'series':\n return WishlistItemKind.Series;\n\n case 'program':\n default:\n return WishlistItemKind.Program;\n }\n};\n","/* @flow */\n\nimport { type NETGEM_API_WISHLIST, WishlistItemKind } from '../../../../libs/netgemLibrary/v8/types/Wishlist';\nimport { deleteWishlistETag, resetWishlist, setWishlistError, updateWishlist } from '../../../ui/actions';\nimport AccurateTimestamp from '../../../../helpers/dateTime/AccurateTimestamp';\nimport type { CombinedReducers } from '../../../reducers';\nimport { CustomNetworkError } from '../../../../libs/netgemLibrary/helpers/CustomNetworkError';\nimport type { Dispatch } from '../../../types/types';\nimport { HttpStatus } from '../../../../libs/netgemLibrary/v8/constants/NetworkCodesAndMessages';\nimport { type NETGEM_API_V8_REQUEST_RESPONSE } from '../../../../libs/netgemLibrary/v8/types/RequestResponse';\nimport { PersonalDataKey } from '../../../../libs/netgemLibrary/personalData/constants/keys';\nimport type { RequestResponseMethodDefinitionType } from '../emitter';\nimport { getWishlistTypeFromId } from '../../../../libs/netgemLibrary/v8/helpers/Wishlist';\nimport { isUndefinedOrNull } from '@ntg/utils/dist/types';\nimport { sendPersonalDataGetRequest } from './get';\nimport { sendPersonalDataPostRequest } from './post';\n\nconst getWishlist: (signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers): Promise<any> => {\n const {\n ui: {\n wishlistETagCache: { wishlist: initialETag },\n },\n } = getState();\n\n return dispatch(sendPersonalDataGetRequest(PersonalDataKey.Wishlist, initialETag, signal))\n .then((data: NETGEM_API_V8_REQUEST_RESPONSE) => {\n const { eTag: wishlistETag } = data;\n const result = JSON.parse((data.result: string));\n let wishlist: NETGEM_API_WISHLIST = (result.wishlist: NETGEM_API_WISHLIST) || [];\n\n if (!Array.isArray(wishlist)) {\n wishlist = [];\n }\n\n // Filter out malformed items\n wishlist = validateWishlist(wishlist);\n\n dispatch(updateWishlist(wishlist, wishlistETag));\n return Promise.resolve(wishlistETag);\n })\n .catch((error: CustomNetworkError) => {\n const status = error.getStatus();\n if (status === HttpStatus.NotFound) {\n // Not found means wishlist does not exist yet\n dispatch(resetWishlist());\n return Promise.resolve(null);\n } else if (status === HttpStatus.NotModified) {\n return Promise.resolve(initialETag);\n }\n\n dispatch(setWishlistError());\n return Promise.reject(error);\n });\n };\n\nconst validateWishlist: (wishlist: NETGEM_API_WISHLIST) => NETGEM_API_WISHLIST = (wishlist) => {\n const validatedWishlist = [];\n\n for (let i = 0; i < wishlist.length; ++i) {\n const { [i]: item } = wishlist;\n const { channelId, date, id, type } = item;\n\n if (\n (channelId === undefined || typeof channelId === 'string') &&\n typeof date === 'string' &&\n typeof id === 'string' &&\n (type === WishlistItemKind.Program || type === WishlistItemKind.Season || type === WishlistItemKind.Series)\n ) {\n validatedWishlist.push(item);\n }\n }\n\n return validatedWishlist;\n};\n\nconst findAssetId: (wishlist: NETGEM_API_WISHLIST, assetId: string, channelId: string, acceptNotMatchingChannelId?: boolean) => number = (wishlist, assetId, channelId, acceptNotMatchingChannelId) => {\n for (let i = 0; i < wishlist.length; i++) {\n const {\n [i]: { id, channelId: chId },\n } = wishlist;\n\n // Channel Id is null for items added in first version of wishlist (backward compatibility)\n if (id === assetId && (chId === channelId || (acceptNotMatchingChannelId && chId && chId !== channelId) || isUndefinedOrNull(chId))) {\n return i;\n }\n }\n\n return -1;\n};\n\nconst deleteWishlist: (isSecondAttempt?: boolean, eTag?: string) => RequestResponseMethodDefinitionType =\n (isSecondAttempt, eTag) =>\n (dispatch: Dispatch, getState: () => CombinedReducers): Promise<any> => {\n const {\n ui: {\n wishlistETagCache: { wishlist: initialETag },\n },\n } = getState();\n const wishlist: NETGEM_API_WISHLIST = [];\n\n return dispatch(sendPersonalDataPostRequest(PersonalDataKey.Wishlist, { wishlist }, eTag ?? initialETag))\n .then((data: NETGEM_API_V8_REQUEST_RESPONSE) => {\n const { eTag: wishlistETag } = data;\n dispatch(updateWishlist(wishlist, wishlistETag));\n return Promise.resolve();\n })\n .catch((error: CustomNetworkError) => {\n const status = error.getStatus();\n if (!isSecondAttempt && (status === HttpStatus.Conflict || status === HttpStatus.PreconditionFailed)) {\n /*\n * Most probable cause: another device paired with the same account already updated the wishlist\n * So we send a GET request to retrieve the latest ETag, but we only try once to avoid infinite loop between multiple devices\n */\n dispatch(deleteWishlistETag());\n return dispatch(getWishlist()).then((newETag) => dispatch(deleteWishlist(true, newETag)));\n }\n\n return Promise.reject(error);\n });\n };\n\nconst sendWishlistUpdateRequest: (wishlist: NETGEM_API_WISHLIST, initialETag: ?string, signal?: AbortSignal, isSecondAttempt?: boolean) => RequestResponseMethodDefinitionType =\n (wishlist, initialETag, signal, isSecondAttempt) =>\n (dispatch: Dispatch): Promise<any> =>\n dispatch(sendPersonalDataPostRequest(PersonalDataKey.Wishlist, { wishlist }, initialETag, signal))\n .then((data: NETGEM_API_V8_REQUEST_RESPONSE) => {\n const { eTag: wishlistETag } = data;\n dispatch(updateWishlist(wishlist, wishlistETag));\n return Promise.resolve();\n })\n .catch((error: CustomNetworkError) => {\n const status = error.getStatus();\n if (!isSecondAttempt && (status === HttpStatus.Conflict || status === HttpStatus.PreconditionFailed)) {\n /*\n * Most probable cause: another device paired with the same account already updated the wishlist\n * So we send a GET request to retrieve the latest ETag, but we only try once to avoid infinite loop between multiple devices\n */\n dispatch(deleteWishlistETag());\n\n return dispatch(getWishlist(signal)).then((newETag) => dispatch(sendWishlistUpdateRequest(wishlist, newETag, signal, true)));\n }\n\n return Promise.reject(error);\n });\n\nconst addToWishlist: (assetId: string, channelId: string, signal?: AbortSignal, isSecondAttempt?: boolean) => RequestResponseMethodDefinitionType =\n (assetId, channelId, signal, isSecondAttempt) =>\n (dispatch: Dispatch, getState: () => CombinedReducers): Promise<any> => {\n const {\n ui: {\n wishlistETagCache: { wishlist: initialETag },\n wishlist,\n },\n } = getState();\n\n if (!wishlist) {\n // Wishlist not retrieved yet\n return Promise.resolve();\n }\n\n const assetIdIndex = findAssetId(wishlist, assetId, channelId);\n\n if (assetIdIndex > -1) {\n // Item already in wishlist (should not happen but could be a sync issue)\n return Promise.resolve();\n }\n\n // Add item\n const newWishlist = [\n ...wishlist,\n {\n channelId,\n date: AccurateTimestamp.nowAsIsoString(),\n id: assetId,\n type: getWishlistTypeFromId(assetId),\n },\n ];\n\n return dispatch(sendWishlistUpdateRequest(newWishlist, initialETag, signal, isSecondAttempt));\n };\n\nconst removeFromWishlist: (assetId: string, channelId: string, signal?: AbortSignal, isSecondAttempt?: boolean) => RequestResponseMethodDefinitionType =\n (assetId, channelId, signal, isSecondAttempt) =>\n (dispatch: Dispatch, getState: () => CombinedReducers): Promise<any> => {\n const {\n ui: {\n wishlistETagCache: { wishlist: initialETag },\n wishlist,\n },\n } = getState();\n\n if (!wishlist) {\n // Wishlist not retrieved yet\n return Promise.resolve();\n }\n\n let assetIdIndex = findAssetId(wishlist, assetId, channelId);\n\n if (assetIdIndex === -1) {\n // Item not found: let's search again while ignoring the channel Id in case the item was added in the first version (backward compatibility)\n assetIdIndex = findAssetId(wishlist, assetId, channelId, true);\n\n if (assetIdIndex === -1) {\n // Item not found in wishlist (not supposed to happen but could be a sync issue)\n return Promise.resolve();\n }\n }\n\n // Remove item\n const newWishlist = wishlist.filter((item, index) => index !== assetIdIndex);\n\n return dispatch(sendWishlistUpdateRequest(newWishlist, initialETag, signal, isSecondAttempt));\n };\n\nexport { addToWishlist, deleteWishlist, getWishlist, removeFromWishlist };\n","/* @flow */\n\nimport type { MetadataKind, NETGEM_API_V8_METADATA } from '../../../../libs/netgemLibrary/v8/types/MetadataProgram';\nimport type { NetgemApiEmitterType, RequestResponseMethodDefinitionType } from '../emitter';\nimport type { CombinedReducers } from '../../../reducers';\nimport type { Dispatch } from '../../../types/types';\nimport { type NETGEM_API_V8_REQUEST_RESPONSE } from '../../../../libs/netgemLibrary/v8/types/RequestResponse';\nimport { REDUX_MSG_REQUEST_GENERIC } from '../../constants/';\nimport { createCustomNetworkErrorFromKey } from '../../../../libs/netgemLibrary/helpers/CreateCustomNetworkError';\nimport { generateApiUrl } from '../helpers/api';\n\nconst sendV8MetadataRequest: (assetId: string, type: MetadataKind, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (assetId, type, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const state = getState();\n const {\n netgemApi: { metadataProgramUrl },\n } = state;\n\n if (!metadataProgramUrl) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definition', { urlDef: 'metadataUrl' }));\n }\n\n const { authent, method } = metadataProgramUrl;\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_GENERIC, {\n authent,\n method,\n signal,\n state,\n uri: generateApiUrl(metadataProgramUrl, { assetId }, state),\n }).then(({ result }: NETGEM_API_V8_REQUEST_RESPONSE) => {\n const metadata = {\n ...result.metadata,\n type,\n };\n return Promise.resolve((metadata: NETGEM_API_V8_METADATA));\n });\n };\n\nexport default sendV8MetadataRequest;\n","/* @flow */\n\nimport { type LuminosityType, type ThemeType, Variant, getVariant } from '@ntg/ui/dist/theme';\nimport type { NetgemApiEmitterType, RequestResponseMethodDefinitionType } from '../emitter';\nimport AccurateTimestamp from '../../../../helpers/dateTime/AccurateTimestamp';\nimport type { CombinedReducers } from '../../../reducers';\nimport type { Dispatch } from '../../../types/types';\nimport { HeaderValue } from '../../../../libs/netgemLibrary/v8/constants/Headers';\nimport { MILLISECONDS_PER_HOUR } from '../../../../helpers/dateTime/Format';\nimport { type NETGEM_API_V8_REQUEST_RESPONSE } from '../../../../libs/netgemLibrary/v8/types/RequestResponse';\nimport type { NETGEM_API_V8_URL_DEFINITION } from '../../../../libs/netgemLibrary/v8/types/NtgVideoFeed';\nimport { REDUX_MSG_REQUEST_GENERIC } from '../../constants';\nimport { createCustomNetworkErrorFromKey } from '../../../../libs/netgemLibrary/helpers/CreateCustomNetworkError';\nimport { generateApiUrl } from '../helpers/api';\nimport { getCacheExpirationTime } from '../../../../helpers/request/cache';\n\nexport type ImageUrlType = {|\n assetId: string,\n forcedVariant?: string,\n height: number,\n luminosity?: LuminosityType,\n theme?: ThemeType,\n width: number,\n|};\n\n// Key is formed with Id (program, series, etc.), width and height\ntype IMAGE_CACHE = {|\n [string]: {|\n expiration: number,\n imageUrl: string,\n |},\n|};\n\ntype IMAGE_REQUEST = {|\n [string]: Promise<any>,\n|};\n\nconst cache: IMAGE_CACHE = {};\nconst pendingRequests: IMAGE_REQUEST = {};\n\n// Not found images are cached for 1 hour (in ms)\nconst NOT_FOUND_MAX_AGE = MILLISECONDS_PER_HOUR;\n\nconst IMAGE_MODULO: number = 8;\nconst getSize: (s: number) => number = (s) => {\n // Adjust width and height to the greatest and nearest power of 8\n const m: number = s % IMAGE_MODULO;\n return m === 0 ? s : s - m + IMAGE_MODULO;\n};\n\nconst getImageUrlFromDefinition: (urlDefinition: NETGEM_API_V8_URL_DEFINITION) => RequestResponseMethodDefinitionType =\n (urlDefinition) =>\n (dispatch: Dispatch, getState: () => CombinedReducers): Promise<any> =>\n Promise.resolve(generateApiUrl(urlDefinition, null, getState()));\n\nconst sendV8MetadataImageRequest: (urlDefinition: NETGEM_API_V8_URL_DEFINITION, uri: string, signal?: AbortSignal, key: string) => RequestResponseMethodDefinitionType =\n (urlDefinition, uri, signal, key) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const state = getState();\n const { authent, method } = urlDefinition;\n\n const promise = NetgemApiEmitter.emit(REDUX_MSG_REQUEST_GENERIC, {\n authent,\n method,\n responseType: HeaderValue.Image,\n signal,\n state,\n uri,\n })\n .then((response: NETGEM_API_V8_REQUEST_RESPONSE) => {\n const { cacheMaxAge, result: imageUrl } = response;\n\n if (cacheMaxAge) {\n cache[key] = {\n expiration: getCacheExpirationTime(cacheMaxAge),\n imageUrl,\n };\n }\n\n return Promise.resolve(imageUrl);\n })\n .catch((error) => {\n // $FlowFixMe: flow doesn't know DOMException\n if (!(error instanceof DOMException) || error.name !== 'AbortError') {\n // Don't cache cancelled requests' results but cache 404's ones\n cache[key] = {\n expiration: getCacheExpirationTime(NOT_FOUND_MAX_AGE),\n imageUrl: '',\n };\n }\n\n return Promise.resolve('');\n })\n .finally(() => delete pendingRequests[key]);\n\n pendingRequests[key] = promise;\n return promise;\n };\n\nconst getUri: (metadataImageUrl: NETGEM_API_V8_URL_DEFINITION, assetId: string, width: number, height: number, imageVariant: string, state: CombinedReducers) => string = (\n metadataImageUrl,\n assetId,\n width,\n height,\n imageVariant,\n state,\n) => {\n const imageWidth = getSize(width);\n const imageHeight = getSize(height);\n\n return generateApiUrl(\n metadataImageUrl,\n {\n assetId,\n imageHeight,\n imageVariant,\n imageWidth,\n },\n state,\n );\n};\n\nconst getImageUrl: (data: ImageUrlType, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (data, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers): Promise<any> => {\n const state = getState();\n const {\n netgemApi: { metadataImageWithVariantUrl },\n } = state;\n\n if (!metadataImageWithVariantUrl) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definition', { urlDef: 'metadataImageWithVariantUrl' }));\n }\n\n const { assetId, forcedVariant, height, luminosity, theme, width } = data;\n\n // Get correct image variant ('dk', 'lt' or 'default')\n const variant = forcedVariant ?? getVariant(luminosity, theme);\n\n const imageWidth = getSize(width);\n const imageHeight = getSize(height);\n\n const key = `${assetId}#${imageWidth}x${imageHeight}x${variant}`;\n const { [key]: cachedImage } = cache;\n const { [key]: pendingRequest } = pendingRequests;\n\n if (cachedImage) {\n const { expiration, imageUrl } = cachedImage;\n // Keep using cached images until max-age\n if (AccurateTimestamp.now() <= expiration) {\n return Promise.resolve(imageUrl);\n }\n\n // Image in cache has expired\n delete cache[key];\n }\n\n if (pendingRequest) {\n return pendingRequest;\n }\n\n const uri = getUri(metadataImageWithVariantUrl, assetId, width, height, variant, state);\n return dispatch(sendV8MetadataImageRequest(metadataImageWithVariantUrl, uri, signal, key));\n };\n\nconst getImageSourceUrl: (assetId: string, width: number, height: number) => RequestResponseMethodDefinitionType =\n (assetId, width, height) =>\n (dispatch: Dispatch, getState: () => CombinedReducers): Promise<?string> => {\n const state = getState();\n const {\n netgemApi: { metadataImageWithVariantUrl },\n } = state;\n\n if (!metadataImageWithVariantUrl) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definition', { urlDef: 'metadataImageWithVariantUrl' }));\n }\n\n return Promise.resolve(getUri(metadataImageWithVariantUrl, assetId, width, height, Variant.Default, state));\n };\n\nexport { getImageSourceUrl, getImageUrl, getImageUrlFromDefinition };\n","/* @flow */\n\nimport { type AllSettledPromises, type SettledPromise, SettledPromiseRejected } from '../../../../helpers/jsHelpers/promise';\nimport type { NetgemApiEmitterType, RequestResponseMethodDefinitionType } from '../emitter';\nimport { filterAndSortPlaybackUrls, generateApiUrl } from '../helpers/api';\nimport type { CombinedReducers } from '../../../reducers';\nimport type { Dispatch } from '../../../types/types';\nimport { type NETGEM_API_V8_ITEM_LOCATION } from '../../../../libs/netgemLibrary/v8/types/FeedItem';\nimport { type NETGEM_API_V8_METADATA_SCHEDULE } from '../../../../libs/netgemLibrary/v8/types/MetadataSchedule';\nimport { type NETGEM_API_V8_REQUEST_RESPONSE } from '../../../../libs/netgemLibrary/v8/types/RequestResponse';\nimport { REDUX_MSG_REQUEST_GENERIC } from '../../constants/';\nimport { createCustomNetworkErrorFromKey } from '../../../../libs/netgemLibrary/helpers/CreateCustomNetworkError';\nimport { extractDistributorId } from '../../../../helpers/videofutur/metadata';\n\nconst fixVtiIdType: (response: NETGEM_API_V8_REQUEST_RESPONSE) => NETGEM_API_V8_REQUEST_RESPONSE = (response) => {\n const vtiId = response.result?.location?.purchaseInfo?.vtiId;\n if (typeof vtiId === 'string' && vtiId !== '' && !isNaN(vtiId)) {\n response.result.location.purchaseInfo.vtiId = Number(vtiId);\n }\n\n return response;\n};\n\nconst sendV8MetadataLocationRequest: (assetId: string, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (assetId, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const state = getState();\n const {\n appConfiguration: { playerStreamPriorities },\n netgemApi: { metadataScheduleUrl },\n } = state;\n\n if (!metadataScheduleUrl) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definition', { urlDef: 'metadataScheduleUrl' }));\n }\n\n const { authent, method } = metadataScheduleUrl;\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_GENERIC, {\n authent,\n method,\n signal,\n state,\n uri: generateApiUrl(\n metadataScheduleUrl,\n {\n assetId,\n },\n state\n ),\n })\n .then((response: NETGEM_API_V8_REQUEST_RESPONSE) => fixVtiIdType(response))\n .then((response: NETGEM_API_V8_REQUEST_RESPONSE) => filterAndSortPlaybackUrls(response, playerStreamPriorities));\n };\n\nconst addDistributorId: (metadata: NETGEM_API_V8_METADATA_SCHEDULE, deviceOS: string) => NETGEM_API_V8_METADATA_SCHEDULE = (metadata, deviceOS) => {\n const {\n location: { id, providerInfo },\n } = metadata;\n\n if (!providerInfo) {\n return metadata;\n }\n\n if (providerInfo.distributorId) {\n // Distributor Id is present in providerInfo\n return metadata;\n }\n\n // Distributor Id is not present in providerInfo: try to extract it from location Id\n const distributorId = extractDistributorId(id, deviceOS);\n if (distributorId) {\n providerInfo.distributorId = distributorId;\n }\n\n return metadata;\n};\n\nconst addAvailabilityStartDate: (metadata: NETGEM_API_V8_METADATA_SCHEDULE, locations: Array<NETGEM_API_V8_ITEM_LOCATION>) => NETGEM_API_V8_METADATA_SCHEDULE = (metadata, locations) => {\n const {\n location,\n location: { id },\n } = metadata;\n\n const matchingLocation = locations.find((loc) => loc.id === id);\n if (matchingLocation) {\n const { availabilityStartDate } = matchingLocation;\n if (availabilityStartDate) {\n location.availabilityStartDate = availabilityStartDate;\n }\n }\n\n return metadata;\n};\n\n/*\n * Used to retrieve the purchase info for VOD locations\n * Creates, for each of the given locations, a promise to retrieve that location's metadata, then builds a promise waiting all of these promises and returns it\n */\nconst getVodLocations: (locations: Array<NETGEM_API_V8_ITEM_LOCATION>, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (locations, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers): Promise<any> => {\n // $FlowFixMe: Ids can't be undefined here but flow couldn't see it\n const promises = locations.map((loc) => dispatch(sendV8MetadataLocationRequest(loc.id, signal)));\n\n return Promise.allSettled(promises).then((results: AllSettledPromises) =>\n results\n .map((result: SettledPromise) => {\n const { status, value } = result;\n\n if (status === SettledPromiseRejected || !value) {\n return null;\n }\n\n const {\n appConfiguration: { deviceOS },\n } = getState();\n const { result: metadata } = value;\n return addAvailabilityStartDate(addDistributorId(metadata, deviceOS), locations);\n })\n .filter((m) => m !== null)\n );\n };\n\nexport default sendV8MetadataLocationRequest;\n\nexport { getVodLocations };\n","/* @flow */\n\nimport type { NetgemApiEmitterType, RequestResponseMethodDefinitionType } from '../emitter';\nimport {\n REDUX_MSG_REQUEST_NPVR_RECORDINGS_DELETE,\n REDUX_MSG_REQUEST_NPVR_RECORDINGS_FUTURE,\n REDUX_MSG_REQUEST_NPVR_RECORDINGS_LIST,\n REDUX_MSG_REQUEST_NPVR_RECORDINGS_METADATA,\n REDUX_MSG_REQUEST_NPVR_RECORDINGS_QUOTA,\n REDUX_MSG_REQUEST_NPVR_RECORDINGS_RETRY,\n} from '../../constants';\nimport { filterAndSortPlaybackUrls, generateApiUrl } from '../helpers/api';\nimport { getRecordingsMap, getRecordingsStatus } from '../../../../libs/netgemLibrary/v8/helpers/Npvr';\nimport { updateExistingRecordings, updateFutureRecordings } from '../../../npvr/actions';\nimport type { CombinedReducers } from '../../../reducers';\nimport { CustomNetworkError } from '../../../../libs/netgemLibrary/helpers/CustomNetworkError';\nimport type { Dispatch } from '../../../types/types';\nimport { HttpStatus } from '../../../../libs/netgemLibrary/v8/constants/NetworkCodesAndMessages';\nimport type { NETGEM_API_V8_FEED_RESULT } from '../../../../libs/netgemLibrary/v8/types/FeedResult';\nimport type { NETGEM_API_V8_RECORDINGS_FUTURE } from '../../../../libs/netgemLibrary/v8/types/Npvr';\nimport { type NETGEM_API_V8_REQUEST_RESPONSE } from '../../../../libs/netgemLibrary/v8/types/RequestResponse';\nimport { createCustomNetworkErrorFromKey } from '../../../../libs/netgemLibrary/helpers/CreateCustomNetworkError';\n\nconst deleteRecording: (recordId: string, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (recordId, signal) =>\n (dispatch: Dispatch): Promise<any> =>\n // Get recording's ETag first\n dispatch(sendV8RecordingsMetadataRequest(recordId, signal)).then((getResponse: NETGEM_API_V8_REQUEST_RESPONSE) => {\n const { eTag } = getResponse;\n if (eTag) {\n // Then delete recording\n return dispatch(sendV8RecordingsDeleteRequest(recordId, eTag, signal));\n }\n\n return Promise.resolve();\n });\n\nconst deleteRecordings: (recordingIds: Array<string>, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (recordingIds, signal) =>\n (dispatch: Dispatch): Promise<any> => {\n const promises = recordingIds.map((recordingId) => dispatch(deleteRecording(recordingId, signal)));\n return Promise.all(promises);\n };\n\nconst getAllRecordings: (signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (signal) =>\n (dispatch: Dispatch): Promise<any> => {\n const promises = [dispatch(getExistingRecordings(signal)), dispatch(getFutureRecordings(signal))];\n return Promise.all(promises);\n };\n\nconst getExistingRecordings: (signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers): Promise<any> => {\n const state = getState();\n const {\n npvr: {\n eTagsCache: { npvrRecordingsList: initialETag },\n },\n } = state;\n\n return dispatch(sendV8RecordingsListRequest(initialETag, signal))\n .then((data: NETGEM_API_V8_REQUEST_RESPONSE) => {\n const { eTag: npvrRecordingsListETag, result } = data;\n const { feed: npvrRecordingsListFeed } = (result: NETGEM_API_V8_FEED_RESULT);\n const npvrRecordingsList = getRecordingsMap(npvrRecordingsListFeed);\n\n dispatch(updateExistingRecordings(npvrRecordingsList, npvrRecordingsListETag, npvrRecordingsListFeed));\n return npvrRecordingsList;\n })\n .catch((error: CustomNetworkError) => {\n if (error.getStatus() === HttpStatus.NotModified) {\n return Promise.resolve(null);\n }\n\n // Error other than 304 (NOT MODIFIED)\n return Promise.reject(error);\n });\n };\n\nconst getFutureRecordings: (signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers): Promise<any> => {\n const state = getState();\n const {\n npvr: {\n eTagsCache: { npvrRecordingsFuture: initialETag },\n },\n } = state;\n\n return dispatch(sendV8RecordingsFutureRequest(initialETag, signal))\n .then((data: NETGEM_API_V8_REQUEST_RESPONSE) => {\n const { eTag: npvrRecordingsFutureETag, result } = data;\n const { feed: npvrRecordingsFutureFeed } = (result: NETGEM_API_V8_RECORDINGS_FUTURE);\n const npvrRecordingsFuture = getRecordingsMap(npvrRecordingsFutureFeed);\n const npvrRecordingsFutureStatus = getRecordingsStatus(result);\n\n dispatch(updateFutureRecordings(npvrRecordingsFuture, npvrRecordingsFutureETag, npvrRecordingsFutureFeed, npvrRecordingsFutureStatus));\n return npvrRecordingsFuture;\n })\n .catch((error: CustomNetworkError) => {\n if (error.getStatus() === HttpStatus.NotModified) {\n return Promise.resolve(null);\n }\n\n // Error other than 304 (NOT MODIFIED)\n return Promise.reject(error);\n });\n };\n\nconst sendV8RecordingsFutureRequest: (eTag: ?string, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (eTag, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const state = getState();\n const {\n netgemApi: { npvrRecordingsFutureUrl },\n } = state;\n\n if (!npvrRecordingsFutureUrl) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definition', { urlDef: 'npvrRecordingsFutureUrl' }));\n }\n\n const { authent, method } = npvrRecordingsFutureUrl;\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_NPVR_RECORDINGS_FUTURE, {\n authent,\n eTag,\n method,\n signal,\n uri: generateApiUrl(npvrRecordingsFutureUrl, {}, state),\n });\n };\n\nconst sendV8RecordingsListRequest: (eTag: ?string, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (eTag, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const state = getState();\n const {\n netgemApi: { npvrRecordingsListUrl },\n } = state;\n\n if (!npvrRecordingsListUrl) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definition', { urlDef: 'npvrRecordingsListUrl' }));\n }\n\n const { authent, method } = npvrRecordingsListUrl;\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_NPVR_RECORDINGS_LIST, {\n authent,\n eTag,\n method,\n signal,\n uri: generateApiUrl(npvrRecordingsListUrl, {}, state),\n });\n };\n\nconst sendV8RecordingsDeleteRequest: (assetId: string, eTag: string, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (assetId, eTag, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const state = getState();\n const {\n netgemApi: { npvrRecordingsDeleteUrl },\n } = state;\n\n if (!npvrRecordingsDeleteUrl) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definition', { urlDef: 'npvrRecordingsDeleteUrl' }));\n }\n\n const { authent, method } = npvrRecordingsDeleteUrl;\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_NPVR_RECORDINGS_DELETE, {\n authent,\n eTag,\n method,\n signal,\n uri: generateApiUrl(npvrRecordingsDeleteUrl, { assetId }, state),\n });\n };\n\nconst sendV8RecordingsMetadataRequest: (assetId: string, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (assetId, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const state = getState();\n const {\n appConfiguration: { playerStreamPriorities },\n netgemApi: { npvrRecordingsMetadataUrl },\n npvr,\n npvr: { eTagsCache },\n } = state;\n\n if (!npvrRecordingsMetadataUrl) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definition', { urlDef: 'npvrRecordingsMetadataUrl' }));\n }\n\n const { authent, method } = npvrRecordingsMetadataUrl;\n const { [assetId]: eTag } = eTagsCache;\n\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_NPVR_RECORDINGS_METADATA, {\n authent,\n eTag,\n method,\n signal,\n uri: generateApiUrl(npvrRecordingsMetadataUrl, { assetId }, state),\n })\n .then((response: NETGEM_API_V8_REQUEST_RESPONSE) => filterAndSortPlaybackUrls(response, playerStreamPriorities))\n .catch((error: CustomNetworkError) => {\n if (error.getStatus() === HttpStatus.NotModified) {\n // Get existing recording since it has not changed\n const {\n npvrRecordingsList: { [assetId]: result },\n } = npvr;\n const response: NETGEM_API_V8_REQUEST_RESPONSE = {\n cacheMaxAge: null,\n eTag: eTag ?? null,\n result,\n status: HttpStatus.NotModified,\n };\n return Promise.resolve(response);\n }\n\n // Error other than 304 (NOT MODIFIED)\n return Promise.reject(error);\n });\n };\n\nconst sendV8RecordingsQuotaRequest: (signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const state = getState();\n const {\n netgemApi: { npvrRecordingsQuotaUrl },\n npvr: {\n eTagsCache: { npvrRecordingsQuota: eTag },\n },\n } = state;\n\n if (!npvrRecordingsQuotaUrl) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definition', { urlDef: 'npvrRecordingsQuotaUrl' }));\n }\n\n const { authent, method } = npvrRecordingsQuotaUrl;\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_NPVR_RECORDINGS_QUOTA, {\n authent,\n eTag,\n method,\n signal,\n uri: generateApiUrl(npvrRecordingsQuotaUrl, {}, state),\n });\n };\n\nconst sendV8RecordingsRetryRequest: (assetId: string, eTag: string, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (assetId, eTag, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const state = getState();\n const {\n netgemApi: { npvrRecordingsRetryUrl },\n } = state;\n\n if (!npvrRecordingsRetryUrl) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definition', { urlDef: 'npvrRecordingsRetryUrl' }));\n }\n\n const { authent, method } = npvrRecordingsRetryUrl;\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_NPVR_RECORDINGS_RETRY, {\n authent,\n eTag,\n method,\n signal,\n uri: generateApiUrl(npvrRecordingsRetryUrl, { assetId }, state),\n });\n };\n\nexport { deleteRecording, deleteRecordings, getAllRecordings, getExistingRecordings, getFutureRecordings, sendV8RecordingsMetadataRequest, sendV8RecordingsQuotaRequest, sendV8RecordingsRetryRequest };\n","/* @flow */\n\nimport { type AllSettledPromises, SettledPromiseFulfilled } from '../../../../helpers/jsHelpers/promise';\nimport {\n type NETGEM_API_V8_SCHEDULED_RECORDING,\n type NETGEM_API_V8_SCHEDULED_RECORDINGS_LIST_FULL_RESULT,\n type NETGEM_API_V8_SCHEDULED_RECORDINGS_LIST_RESULT,\n RecordingOutcome,\n} from '../../../../libs/netgemLibrary/v8/types/Npvr';\nimport type { NetgemApiEmitterType, RequestResponseMethodDefinitionType } from '../emitter';\nimport {\n REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_CREATE,\n REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_DELETE,\n REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_LIST,\n REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_LIST_FULL,\n REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_METADATA,\n REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_UPDATE,\n} from '../../constants';\nimport type { SCHEDULED_RECORDING_CREATION_SETTINGS, SCHEDULED_RECORDING_UPDATE_SETTINGS } from '../../../../helpers/npvr/Types';\nimport { getScheduledRecordingsMap, getScheduledRecordingsMapV2 } from '../../../../libs/netgemLibrary/v8/helpers/Npvr';\nimport { sendV8RecordingsMetadataRequest, sendV8RecordingsRetryRequest } from './recordings';\nimport { updateScheduledRecordings, updateScheduledRecordingsFull } from '../../../npvr/actions';\nimport AccurateTimestamp from '../../../../helpers/dateTime/AccurateTimestamp';\nimport type { CombinedReducers } from '../../../reducers';\nimport { CustomNetworkError } from '../../../../libs/netgemLibrary/helpers/CustomNetworkError';\nimport type { Dispatch } from '../../../types/types';\nimport { HttpStatus } from '../../../../libs/netgemLibrary/v8/constants/NetworkCodesAndMessages';\nimport type { NETGEM_API_V8_METADATA_SCHEDULE } from '../../../../libs/netgemLibrary/v8/types/MetadataSchedule';\nimport { type NETGEM_API_V8_REQUEST_RESPONSE } from '../../../../libs/netgemLibrary/v8/types/RequestResponse';\nimport { createCustomNetworkErrorFromKey } from '../../../../libs/netgemLibrary/helpers/CreateCustomNetworkError';\nimport { generateApiUrl } from '../helpers/api';\n\nconst getAllScheduledRecordingsV1: (signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers): Promise<any> => {\n const {\n npvr: {\n eTagsCache: { npvrScheduledRecordingsList: initialETag },\n npvrScheduledRecordingsList: initialNpvrScheduledRecordingsList,\n },\n } = getState();\n\n // Get all scheduled recordings\n return dispatch(sendV8ScheduledRecordingListRequest(initialETag, signal))\n .then((data: NETGEM_API_V8_REQUEST_RESPONSE) => {\n const { eTag, result } = data;\n const scheduledRecordings = (result.scheduledRecordings: NETGEM_API_V8_SCHEDULED_RECORDINGS_LIST_RESULT);\n\n // Get metadata for all returned scheduled recordings\n return dispatch(getMetadataForAllScheduledRecordings(scheduledRecordings, eTag, signal));\n })\n .catch((error: CustomNetworkError) => {\n if (error.getStatus() === HttpStatus.NotModified) {\n // Get metadata for all current scheduled recordings since the list has not changed\n const unchangedScheduledRecordings = Object.values(initialNpvrScheduledRecordingsList).map((sr) => {\n const { id } = ((sr: any): NETGEM_API_V8_SCHEDULED_RECORDING);\n return { id };\n });\n return dispatch(getMetadataForAllScheduledRecordings(unchangedScheduledRecordings, initialETag, signal));\n }\n\n // Error other than 304 (NOT MODIFIED)\n return Promise.reject(error);\n });\n };\n\nconst getAllScheduledRecordingsV2: (signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers): Promise<any> => {\n const {\n npvr: {\n eTagsCache: { npvrScheduledRecordingsListFull: initialETag },\n },\n } = getState();\n\n // Get all scheduled recordings along with their metadata\n return dispatch(sendV8ScheduledRecordingListFullRequest(initialETag, signal))\n .then((data: NETGEM_API_V8_REQUEST_RESPONSE) => {\n const { eTag, result } = data;\n const scheduledRecordings = getScheduledRecordingsMapV2((result.scheduledRecordings: NETGEM_API_V8_SCHEDULED_RECORDINGS_LIST_FULL_RESULT));\n dispatch(updateScheduledRecordingsFull(scheduledRecordings, eTag));\n\n return Promise.resolve();\n })\n .catch((error: CustomNetworkError) => {\n if (error.getStatus() === HttpStatus.NotModified) {\n // Nothing has changed (neither the scheduled recording list, nor their metadata\n return Promise.resolve();\n }\n\n // Error other than 304 (NOT MODIFIED)\n return Promise.reject(error);\n });\n };\n\nconst getAllScheduledRecordings: (signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers): Promise<any> => {\n const {\n netgemApi: { npvrScheduledRecordingsListFullUrl },\n } = getState();\n\n if (npvrScheduledRecordingsListFullUrl) {\n // New endpoint: return list as well as all metadata\n return dispatch(getAllScheduledRecordingsV2(signal));\n }\n\n // Old endpoint: return list, then we need to get metadata for all scheduled recordings returned\n return dispatch(getAllScheduledRecordingsV1(signal));\n };\n\nconst getMetadataForAllScheduledRecordings: (\n scheduledRecordingList: NETGEM_API_V8_SCHEDULED_RECORDINGS_LIST_RESULT,\n npvrScheduledRecordingListETag: ?string,\n signal?: AbortSignal,\n) => RequestResponseMethodDefinitionType =\n (scheduledRecordingList, npvrScheduledRecordingListETag, signal) =>\n (dispatch: Dispatch): Promise<any> => {\n const promises = scheduledRecordingList.map((sr) => dispatch(sendV8ScheduledRecordingMetadataRequest(sr.id, signal)));\n\n return Promise.allSettled(promises).then((results: AllSettledPromises) => {\n const filteredResults = results\n .filter((res) => res.status === SettledPromiseFulfilled)\n .map((res) => {\n const {\n // $FlowFixMe: value is never undefined since results have just been filtered\n value: { eTag, result },\n } = res;\n return {\n eTag,\n scheduledRecording: ((result: any): NETGEM_API_V8_SCHEDULED_RECORDING),\n };\n });\n const { eTags, scheduledRecordings } = getScheduledRecordingsMap(filteredResults);\n dispatch(\n updateScheduledRecordings(\n // Following are ETags for all scheduled recordings\n eTags,\n scheduledRecordings,\n // Following is ETag for the list of scheduled recordings\n npvrScheduledRecordingListETag,\n ),\n );\n return Promise.resolve();\n });\n };\n\nconst deleteScheduledRecording: (scheduledRecordingId: string, deleteChildren?: boolean, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (scheduledRecordingId, deleteChildren, signal) =>\n (dispatch: Dispatch): Promise<any> =>\n // Get ETag first\n dispatch(sendV8ScheduledRecordingMetadataRequest(scheduledRecordingId, signal)).then((response: NETGEM_API_V8_REQUEST_RESPONSE) => {\n // Delete\n const { eTag } = response;\n if (eTag) {\n return dispatch(sendV8ScheduledRecordingDeleteRequest(scheduledRecordingId, deleteChildren === true, eTag, signal));\n }\n return Promise.resolve();\n });\n\nconst deleteScheduledRecordings: (scheduledRecordingIds: Array<string>, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (scheduledRecordingIds, signal) =>\n (dispatch: Dispatch): Promise<any> => {\n const promises = scheduledRecordingIds.map((scheduledRecordingId) => dispatch(deleteScheduledRecording(scheduledRecordingId, false, signal)));\n return Promise.all(promises);\n };\n\nconst stopSeriesScheduledRecording: (settings: SCHEDULED_RECORDING_UPDATE_SETTINGS, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (settings, signal) =>\n (dispatch: Dispatch): Promise<any> => {\n const { assetId, toUtc } = settings;\n\n // Get ETag first\n return dispatch(sendV8ScheduledRecordingMetadataRequest(assetId, signal)).then((matadataResponse: NETGEM_API_V8_REQUEST_RESPONSE) => {\n const { eTag } = matadataResponse;\n if (eTag) {\n // Stop series recording\n settings.fromUtc = null;\n settings.toUtc = toUtc || AccurateTimestamp.nowAsIsoString();\n\n return dispatch(sendV8ScheduledRecordingUpdateRequest(settings, eTag, signal));\n }\n return Promise.resolve();\n });\n };\n\nconst startSeriesScheduledRecording: (settings: SCHEDULED_RECORDING_UPDATE_SETTINGS, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (settings, signal) =>\n (dispatch: Dispatch): Promise<any> => {\n const { assetId } = settings;\n\n // Get ETag first\n return dispatch(sendV8ScheduledRecordingMetadataRequest(assetId, signal)).then((matadataResponse: NETGEM_API_V8_REQUEST_RESPONSE) => {\n const { eTag } = matadataResponse;\n if (eTag) {\n // Start series recording\n return dispatch(sendV8ScheduledRecordingUpdateRequest(settings, eTag, signal));\n }\n return Promise.resolve();\n });\n };\n\nconst deleteOrStopFutureScheduledRecordings: (singleScheduledRecordingIds: Array<string>, seriesScheduledRecordingIds: Array<string>, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (singleScheduledRecordingIds, seriesScheduledRecordingIds, signal) =>\n (dispatch: Dispatch): Promise<any> => {\n // Delete future single scheduled recordings\n const singlePromises = singleScheduledRecordingIds.map((id) => dispatch(deleteScheduledRecording(id, true, signal)));\n\n // Stop series scheduled recordings\n const now = AccurateTimestamp.nowAsIsoString();\n const seriesPromises = seriesScheduledRecordingIds.map((id) =>\n dispatch(\n stopSeriesScheduledRecording(\n {\n assetId: id,\n toUtc: now,\n },\n signal,\n ),\n ),\n );\n\n const promises = [...singlePromises, ...seriesPromises];\n\n return Promise.all(promises);\n };\n\nconst retryIfNeeded: (assetId: string, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (assetId, signal) =>\n (dispatch: Dispatch): Promise<any> =>\n dispatch(sendV8RecordingsMetadataRequest(assetId, signal)).then((response: NETGEM_API_V8_REQUEST_RESPONSE) => {\n const { eTag, result } = response;\n const {\n location: { recordOutcome },\n } = (result: NETGEM_API_V8_METADATA_SCHEDULE);\n if (recordOutcome === RecordingOutcome.Recorded || recordOutcome === RecordingOutcome.Rebroadcast || recordOutcome === RecordingOutcome.WillBeRecorded) {\n // Everything is fine: conflict should simply be ignored\n return Promise.resolve(assetId);\n } else if (eTag) {\n return dispatch(sendV8RecordingsRetryRequest(assetId, eTag, signal)).then(() => Promise.resolve(assetId));\n }\n\n // Conflict should be addressed but for some reason, no ETag was returned with the metadata\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_recording_etag', { assetId }));\n });\n\nconst getRecordId: (result: NETGEM_API_V8_SCHEDULED_RECORDING) => string | null = (result) => {\n const { records } = result;\n return records && records.length > 0 ? records[records.length - 1].id : null;\n};\n\nconst sendV8ScheduledRecordingCreateRequest: (settings: SCHEDULED_RECORDING_CREATION_SETTINGS, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (settings, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const state = getState();\n const {\n netgemApi: { npvrScheduledRecordingsCreateUrl },\n npvr: { endMargin, recFromBeginning, startMargin },\n } = state;\n\n if (!npvrScheduledRecordingsCreateUrl) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definition', { urlDef: 'npvrScheduledRecordingsCreateUrl' }));\n }\n\n const { authent, method } = npvrScheduledRecordingsCreateUrl;\n const { channelId, fromUtc, increasingEpisodes, recordsToKeep, scheduledRecordKind, target } = settings;\n\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_CREATE, {\n authent,\n channelId,\n endMargin,\n fromBeginning: recFromBeginning ?? false,\n fromUtc,\n increasingEpisodes,\n method,\n recordsToKeep,\n scheduledRecordKind,\n signal,\n startMargin,\n target,\n uri: generateApiUrl(npvrScheduledRecordingsCreateUrl, {}, state),\n })\n .then((response: NETGEM_API_V8_REQUEST_RESPONSE) => (response.result: NETGEM_API_V8_SCHEDULED_RECORDING))\n .catch((error: CustomNetworkError) => {\n const {\n networkError: { result, status },\n } = error;\n if (result) {\n const { result: innerResult } = result;\n if (status === HttpStatus.Conflict) {\n // Error 409 (CONFLICT)\n const id = getRecordId(innerResult);\n if (id) {\n return dispatch(retryIfNeeded(id, signal)).then(() => innerResult);\n }\n\n // No recording Id: conflict with an existing scheduled recording that is not associated with any recording (rejected below)\n }\n }\n\n // Error other than 409 (CONFLICT)\n return Promise.reject(error);\n });\n };\n\nconst sendV8ScheduledRecordingDeleteRequest: (assetId: string, deleteChildren: boolean, eTag: string, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (assetId, deleteChildren, eTag, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const state = getState();\n const {\n netgemApi: { npvrScheduledRecordingsDeleteUrl },\n } = state;\n\n if (!npvrScheduledRecordingsDeleteUrl) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definition', { urlDef: 'npvrScheduledRecordingsDeleteUrl' }));\n }\n\n const { authent, method } = npvrScheduledRecordingsDeleteUrl;\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_DELETE, {\n authent,\n eTag,\n method,\n signal,\n uri: generateApiUrl(\n npvrScheduledRecordingsDeleteUrl,\n {\n assetId,\n deleteChildren,\n },\n state,\n ),\n });\n };\n\nconst sendV8ScheduledRecordingListRequest: (eTag: ?string, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (eTag, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const state = getState();\n const {\n netgemApi: { npvrScheduledRecordingsListUrl },\n } = state;\n\n if (!npvrScheduledRecordingsListUrl) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definition', { urlDef: 'npvrScheduledRecordingsListUrl' }));\n }\n\n const { authent, method } = npvrScheduledRecordingsListUrl;\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_LIST, {\n authent,\n eTag,\n method,\n signal,\n uri: generateApiUrl(npvrScheduledRecordingsListUrl, {}, state),\n });\n };\n\nconst sendV8ScheduledRecordingListFullRequest: (eTag: ?string, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (eTag, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const state = getState();\n const {\n netgemApi: { npvrScheduledRecordingsListFullUrl },\n } = state;\n\n if (!npvrScheduledRecordingsListFullUrl) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definition', { urlDef: 'npvrScheduledRecordingsListFullUrl' }));\n }\n\n const { authent, method } = npvrScheduledRecordingsListFullUrl;\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_LIST_FULL, {\n authent,\n eTag,\n method,\n signal,\n uri: generateApiUrl(npvrScheduledRecordingsListFullUrl, {}, state),\n });\n };\n\nconst sendV8ScheduledRecordingMetadataRequest: (assetId: string, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (assetId, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const state = getState();\n const {\n netgemApi: { npvrScheduledRecordingsMetadataUrl },\n npvr,\n npvr: { eTagsCache },\n } = state;\n\n if (!npvrScheduledRecordingsMetadataUrl) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definition', { urlDef: 'npvrScheduledRecordingsMetadataUrl' }));\n }\n\n const { authent, method } = npvrScheduledRecordingsMetadataUrl;\n const { [assetId]: eTag } = eTagsCache;\n\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_METADATA, {\n authent,\n eTag,\n method,\n signal,\n uri: generateApiUrl(npvrScheduledRecordingsMetadataUrl, { assetId }, state),\n }).catch((error: CustomNetworkError) => {\n const {\n networkError: { status },\n } = error;\n if (status === HttpStatus.NotModified) {\n // Get existing scheduled recording since it has not changed\n const { npvrScheduledRecordingsList } = npvr;\n const result = Array.from(Object.values(npvrScheduledRecordingsList)).find((sr) => ((sr: any): NETGEM_API_V8_SCHEDULED_RECORDING).id === assetId);\n if (result) {\n const response: NETGEM_API_V8_REQUEST_RESPONSE = {\n cacheMaxAge: null,\n eTag: eTag ?? null,\n result,\n status,\n };\n return Promise.resolve(response);\n }\n\n // No recording Id: conflict with an existing scheduled recording that is not associated with any recording (rejected below)\n }\n\n // Error other than 304 (NOT MODIFIED)\n return Promise.reject(error);\n });\n };\n\nconst sendV8ScheduledRecordingUpdateRequest: (settings: SCHEDULED_RECORDING_UPDATE_SETTINGS, eTag: string, signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (settings, eTag, signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const state = getState();\n const {\n netgemApi: { npvrScheduledRecordingsUpdateUrl },\n } = state;\n\n if (!npvrScheduledRecordingsUpdateUrl) {\n return Promise.reject(createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definition', { urlDef: 'npvrScheduledRecordingsUpdateUrl' }));\n }\n\n const { authent, method } = npvrScheduledRecordingsUpdateUrl;\n const { assetId, fromUtc, increasingEpisodes, recordsToKeep, toUtc } = settings;\n\n return NetgemApiEmitter.emit(REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_UPDATE, {\n assetId,\n authent,\n eTag,\n fromUtc,\n increasingEpisodes,\n method,\n recordsToKeep,\n signal,\n toUtc,\n uri: generateApiUrl(npvrScheduledRecordingsUpdateUrl, {}, state),\n });\n };\n\nexport {\n deleteOrStopFutureScheduledRecordings,\n deleteScheduledRecording,\n deleteScheduledRecordings,\n getAllScheduledRecordings,\n getRecordId,\n sendV8ScheduledRecordingCreateRequest,\n startSeriesScheduledRecording,\n stopSeriesScheduledRecording,\n};\n","/* @flow */\n\nimport type { NetgemApiEmitterType, RequestResponseMethodDefinitionType } from '../emitter';\nimport { BO_API_DELETE_FAVORITE } from './types/common';\nimport type { CombinedReducers } from '../../../reducers';\nimport type { Dispatch } from '../../../types/types';\nimport { REDUX_MSG_REQUEST_BO_FAVORITE_DELETE } from '../../constants';\nimport { createCustomNetworkErrorFromKey } from '../../../../libs/netgemLibrary/helpers/CreateCustomNetworkError';\nimport getFavoriteList from './favoriteList';\nimport getRequestDetails from './helpers/requestCommon';\n\nconst removeFromFavoriteList: (titId: string, signal?: AbortSignal, skipRefresh?: boolean) => RequestResponseMethodDefinitionType =\n (titId, signal, skipRefresh) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const {\n appConfiguration: { mainDistributorId },\n } = getState();\n\n if (!mainDistributorId) {\n return Promise.reject(\n createCustomNetworkErrorFromKey('common.messages.errors.missing_parameters_list', {\n list: 'mainDistributorId',\n name: 'Remove from favorite list',\n }),\n );\n }\n\n // BO API v2\n return dispatch(getRequestDetails(mainDistributorId, BO_API_DELETE_FAVORITE))\n .then((requestDetails) =>\n // Object 'requestDetails' contains 'headers', 'method' and 'uri' parameters\n NetgemApiEmitter.emit(REDUX_MSG_REQUEST_BO_FAVORITE_DELETE, {\n ...requestDetails,\n signal,\n titId,\n }),\n )\n .then(() => {\n if (!skipRefresh) {\n dispatch(getFavoriteList(signal));\n }\n });\n };\n\nexport default removeFromFavoriteList;\n","/* @flow */\n\nimport { BO_API_FAVORITE_LIST, type BO_RESPONSE_WITH_ETAG } from './types/common';\nimport { HeaderName, HeaderValue } from '../../../../libs/netgemLibrary/v8/constants/Headers';\nimport type { NetgemApiEmitterType, RequestResponseMethodDefinitionType } from '../emitter';\nimport type { CombinedReducers } from '../../../reducers';\nimport type { Dispatch } from '../../../types/types';\nimport { HttpStatus } from '../../../../libs/netgemLibrary/v8/constants/NetworkCodesAndMessages';\nimport { REDUX_MSG_REQUEST_BO_FAVORITE_LIST } from '../../constants';\nimport { createCustomNetworkErrorFromKey } from '../../../../libs/netgemLibrary/helpers/CreateCustomNetworkError';\nimport getRequestDetails from './helpers/requestCommon';\nimport { logError } from '../../../../helpers/debug/debug';\nimport { updateBOFavoriteList } from '../../../ui/actions';\n\nconst getFavoriteList: (signal?: AbortSignal) => RequestResponseMethodDefinitionType =\n (signal) =>\n (dispatch: Dispatch, getState: () => CombinedReducers, NetgemApiEmitter: NetgemApiEmitterType): Promise<any> => {\n const {\n appConfiguration: { mainDistributorId },\n ui: { favoriteListETag },\n } = getState();\n\n if (!mainDistributorId) {\n return Promise.reject(\n createCustomNetworkErrorFromKey('common.messages.errors.missing_parameters_list', {\n list: 'mainDistributorId',\n name: 'Get favorite list',\n }),\n );\n }\n\n return dispatch(getRequestDetails(mainDistributorId, BO_API_FAVORITE_LIST, [HeaderName.Accept, HeaderValue.ApplicationJson]))\n .then((requestDetails) =>\n // Object 'requestDetails' contains 'headers', 'method' and 'uri' parameters\n NetgemApiEmitter.emit(REDUX_MSG_REQUEST_BO_FAVORITE_LIST, {\n ...requestDetails,\n eTag: favoriteListETag,\n signal,\n }),\n )\n .then(({ eTag, response }: BO_RESPONSE_WITH_ETAG) => {\n if (signal?.aborted) {\n return;\n }\n\n // BO returns HTTP 204 when list is empty (hence result is null)\n\n let favorites: Array<string> = [];\n\n if (response?.favorites) {\n // Old API\n favorites = response.favorites.map((f) => f.titId);\n } else if (response?.body) {\n // BO API v2\n favorites = response.body.map((f) => f.data.itemId.toString());\n }\n\n dispatch(updateBOFavoriteList(favorites, eTag));\n })\n .catch((error) => {\n if (error.getStatus() !== HttpStatus.NotModified) {\n logError(`Error retrieving favorite list for \"${mainDistributorId}\": ${error.message}`);\n }\n });\n };\n\nexport default getFavoriteList;\n","/* @flow */\n\nimport type { BOApi } from '../types/common';\nimport type { CombinedReducers } from '../../../../reducers';\nimport type { Dispatch } from '../../../../types/types';\nimport type { RequestResponseMethodDefinitionType } from '../../emitter';\nimport { buildBOHeaders } from './headers';\nimport { createCustomNetworkErrorFromKey } from '../../../../../libs/netgemLibrary/helpers/CreateCustomNetworkError';\n\nconst getRequestDetails: (distributorId: string, apiMethodName: BOApi, extraHeaders?: Array<any>) => RequestResponseMethodDefinitionType =\n (distributorId, apiMethodName, extraHeaders) =>\n (dispatch: Dispatch, getState: () => CombinedReducers): Promise<any> => {\n const {\n appConfiguration,\n netgemApi: {\n distributors: {\n [distributorId]: {\n urls: { [apiMethodName]: urlDefinition },\n },\n },\n },\n } = getState();\n\n if (!urlDefinition) {\n return Promise.reject(\n createCustomNetworkErrorFromKey('common.messages.errors.missing_url_definition_for_distributor', {\n distributorId,\n methodName: apiMethodName,\n }),\n );\n }\n\n const { authent, uri, method } = urlDefinition;\n const headers = buildBOHeaders(distributorId, appConfiguration, extraHeaders);\n\n return Promise.resolve({\n authent,\n headers,\n method,\n uri,\n });\n };\n\nexport default getRequestDetails;\n","/* @flow */\n\nimport { HeaderName, HeaderValue } from '../../../../../libs/netgemLibrary/v8/constants/Headers';\nimport type { AppConfigurationState } from '../../../../appConf/reducers';\nimport type { NETGEM_API_V8_REQUEST_HEADERS } from '../../../../../libs/netgemLibrary/v8/types/Headers';\nimport { buildHeaderList } from '../../../../../libs/netgemLibrary/v8/helpers/RequestHeaders';\nimport { logError } from '../../../../../helpers/debug/debug';\n\nconst buildBOHeaders: (distributorId: string, appConfiguration: AppConfigurationState, extraHeaders?: Array<string>) => NETGEM_API_V8_REQUEST_HEADERS = (\n distributorId,\n appConfiguration,\n extraHeaders,\n) => {\n const {\n distributorAppKeys: { [distributorId]: appKey },\n } = appConfiguration;\n\n if (!appKey) {\n logError(`Missing app key for distributor ${distributorId}`);\n }\n\n let headersConf = [HeaderName.ContentType, HeaderValue.ApplicationJson, HeaderName.AppKey, appKey];\n if (extraHeaders) {\n headersConf = headersConf.concat(extraHeaders);\n }\n\n return buildHeaderList(...headersConf);\n};\n\nexport { buildBOHeaders };\n","/* @flow */\n\nimport { HttpMethod } from '../../../../../libs/netgemLibrary/v8/types/HttpMethod';\nimport type { KeyValuePair } from '@ntg/utils/dist/types';\n\nexport type BO_API_BASE_TYPE = {|\n status: string,\n|};\n\nexport type BO_API_ERROR_TYPE = {|\n ...BO_API_BASE_TYPE,\n errorMsg: string,\n|};\n\nexport type BO_API_ERROR_TYPE_NEW = {|\n body: {|\n code: number,\n message: string,\n variables: KeyValuePair<string>,\n |},\n|};\n\nexport type BO_RESPONSE_WITH_ETAG = {|\n eTag: string | null,\n response: any,\n|};\n\nexport const BO_API_ADD_FAVORITE: 'addFavorite' = 'addFavorite';\nexport const BO_API_CREATE_STREAM2: 'createStreamV2' = 'createStreamV2';\nexport const BO_API_DELETE_FAVORITE: 'deleteFavorite' = 'deleteFavorite';\nexport const BO_API_FAVORITE_LIST: 'favoriteListJson' = 'favoriteListJson';\nexport const BO_API_GET_STREAMS: 'getStreams' = 'getStreams';\nexport const BO_API_PERSONAL_DATA: 'personalData' = 'personalData';\nexport const BO_API_PURCHASE: 'purchase' = 'purchase';\nexport const BO_API_PURCHASE_LIST: 'purchaseList' = 'purchaseList';\nexport const BO_API_PURCHASE_STATUS: 'purchaseStatus' = 'purchaseStatus';\nexport const BO_API_START_STREAM: 'streamStart' = 'streamStart';\nexport const BO_API_STOP_STREAM: 'streamStop' = 'streamStop';\n\n// Cannot convert to Flow enum because it's used as an object's key\nexport type BOApi =\n | typeof BO_API_ADD_FAVORITE\n | typeof BO_API_CREATE_STREAM2\n | typeof BO_API_DELETE_FAVORITE\n | typeof BO_API_FAVORITE_LIST\n | typeof BO_API_GET_STREAMS\n | typeof BO_API_PERSONAL_DATA\n | typeof BO_API_PURCHASE\n | typeof BO_API_PURCHASE_LIST\n | typeof BO_API_PURCHASE_STATUS\n | typeof BO_API_START_STREAM\n | typeof BO_API_STOP_STREAM;\n\nexport type BOApiUrlDefinition = {|\n authent: boolean,\n method?: HttpMethod,\n params: Array<string>,\n uri: string,\n|};\n\nexport type Distributor = {|\n urls: {| [BOApi]: BOApiUrlDefinition | null |},\n|};\n","/* @flow */\n\nimport type { BO_API_BASE_TYPE, BO_API_ERROR_TYPE } from './common';\nimport type { KeyValuePair } from '@ntg/utils/dist/types';\n\nexport type BO_API_PURCHASE_STATUS_SUCCESS_TYPE = {|\n ...BO_API_BASE_TYPE,\n duration: string,\n price: string,\n url?: string,\n vhiId?: number,\n|};\n\nexport type BO_API_PURCHASE_SUCCESS_TYPE = {|\n ...BO_API_BASE_TYPE,\n keyId: string,\n licenceIssuer: string,\n price: string,\n url: string,\n vhiId: number,\n|};\n\nexport type BO_API_PURCHASE_SUCCESS_NEW_TYPE = {|\n price: string,\n status: string,\n|};\n\nexport type BO_API_PURCHASE_STATUS_RESPONSE_TYPE = BO_API_PURCHASE_STATUS_SUCCESS_TYPE | BO_API_ERROR_TYPE;\nexport type BO_API_PURCHASE_RESPONSE_TYPE = BO_API_PURCHASE_SUCCESS_TYPE | BO_API_PURCHASE_SUCCESS_NEW_TYPE | BO_API_ERROR_TYPE;\n\nexport const Purchase = Object.freeze({\n Buy: 'buy',\n BuyPack: 'buy_pack',\n Rent: 'rent',\n});\n\nexport type PurchaseType = 'buy' | 'buy_pack' | 'rent';\n\nexport enum PurchaseSubType {\n Movie = 'movie',\n Season = 'season',\n}\n\n// The expiration date is a timestamp in seconds (or 0 for bought items)\nexport type BO_PURCHASE_LIST_ITEM_TYPE = {|\n expirationTime?: number,\n lastBookmark: number,\n packVtiId?: number,\n purchaseDate: ?string,\n subType: PurchaseSubType,\n type: PurchaseType,\n|};\n\n// Keys are VTI Ids\nexport type BO_PURCHASE_LIST_BY_DISTRIBUTOR_TYPE = KeyValuePair<BO_PURCHASE_LIST_ITEM_TYPE>;\n\n// Keys are distributor Ids\nexport type BO_PURCHASE_LIST_TYPE = KeyValuePair<BO_PURCHASE_LIST_BY_DISTRIBUTOR_TYPE>;\n\nexport type BO_API_PURCHASE_TYPE = {|\n canal: number,\n currentTime: number,\n licenseStatus: number,\n licenseTimeLeft: string,\n titId: number,\n token: string,\n vhiDate: string,\n vhiId: number,\n vtiId: number,\n|};\n\nexport type BO_API_PURCHASE_LIST_TYPE = {|\n purchases: Array<BO_API_PURCHASE_TYPE>,\n|};\n\nexport type BO_API_PURCHASE_LIST_NEW_TYPE = {|\n body: Array<{|\n data: {|\n itemId: number,\n purchaseTitleData: {|\n expirationDate: string,\n licenseStatus: number,\n licenseTimeLeft: string,\n packVtiId?: number,\n referer: string,\n titId: number,\n vhiDate: string,\n videoPosition: number,\n vtiId: number,\n |},\n subType: PurchaseSubType,\n |},\n |}>,\n|};\n\nexport type BO_PURCHASE_LISTS = Array<{| distributorId: string, eTag: string | null, purchaseList: BO_PURCHASE_LIST_BY_DISTRIBUTOR_TYPE |}>;\n","/* @flow */\n\n// DMS\n\nexport const REDUX_MSG_REQUEST_GET_ASSOCIATED_DEVICES: 'NTG_RDX_METH_GET_ASSOCIATED_DEVICE_LIST_REQUEST' = 'NTG_RDX_METH_GET_ASSOCIATED_DEVICE_LIST_REQUEST';\nexport const REDUX_MSG_REQUEST_GET_DEVICE_CHANNELS: 'NTG_RDX_METH_GET_DEVICE_CHANNEL_LIST_REQUEST' = 'NTG_RDX_METH_GET_DEVICE_CHANNEL_LIST_REQUEST';\nexport const REDUX_MSG_REQUEST_GET_DEVICE_QUOTA_PVR: 'NTG_RDX_METH_GET_DEVICE_QUOTA_PVR_REQUEST' = 'NTG_RDX_METH_GET_DEVICE_QUOTA_PVR_REQUEST';\nexport const REDUX_MSG_REQUEST_GET_DEVICE_SETTINGS: 'NTG_RDX_METH_GET_DEVICE_SETTINGS_REQUEST' = 'NTG_RDX_METH_GET_DEVICE_SETTINGS_REQUEST';\nexport const REDUX_MSG_REQUEST_LOGIN: 'NTG_RDX_METH_SEND_LOGIN_REQUEST' = 'NTG_RDX_METH_SEND_LOGIN_REQUEST';\nexport const REDUX_MSG_REQUEST_LOGOUT: 'NTG_RDX_METH_SEND_LOGOUT_REQUEST' = 'NTG_RDX_METH_SEND_LOGOUT_REQUEST';\n\n// ENTITLEMENT\n\nexport const REDUX_MSG_REQUEST_ENTITLEMENT_GET_URL: 'NTG_RDX_MSG_ENTITLEMENT_GET_URL' = 'NTG_RDX_MSG_ENTITLEMENT_GET_URL';\nexport const REDUX_MSG_REQUEST_ENTITLEMENT_RELEASE_URL: 'NTG_RDX_MSG_ENTITLEMENT_RELEASE_URL' = 'NTG_RDX_MSG_ENTITLEMENT_RELEASE_URL';\n\nexport const REDUX_MSG_REQUEST_ENTITLEMENT_GET: 'NTG_RDX_METH_SEND_ENTITLEMENT_GET_REQUEST' = 'NTG_RDX_METH_SEND_ENTITLEMENT_GET_REQUEST';\nexport const REDUX_MSG_REQUEST_ENTITLEMENT_RELEASE: 'NTG_RDX_METH_SEND_ENTITLEMENT_RELEASE_REQUEST' = 'NTG_RDX_METH_SEND_ENTITLEMENT_RELEASE_REQUEST';\n\n// V8\n\nexport const REDUX_MSG_CNC_PROGRAM_GET_URL: 'NTG_RDX_MSG_CNC_PROGRAM_GET' = 'NTG_RDX_MSG_CNC_PROGRAM_GET';\nexport const REDUX_MSG_CNC_SERIES_GET_URL: 'NTG_RDX_MSG_CNC_SERIES_GET' = 'NTG_RDX_MSG_CNC_SERIES_GET';\nexport const REDUX_MSG_DATA_COLLECTION_COLD_POST_URL: 'NTG_RDX_MSG_DATA_COLLECTION_COLD_POST_URL' = 'NTG_RDX_MSG_DATA_COLLECTION_COLD_POST_URL';\nexport const REDUX_MSG_DATA_COLLECTION_HOT_POST_URL: 'NTG_RDX_MSG_DATA_COLLECTION_HOT_POST_URL' = 'NTG_RDX_MSG_DATA_COLLECTION_HOT_POST_URL';\nexport const REDUX_MSG_DEEPLINK_PROGRAM_GET_URL: 'NTG_RDX_MSG_DEEPLINK_PROGRAM_GET' = 'NTG_RDX_MSG_DEEPLINK_PROGRAM_GET';\nexport const REDUX_MSG_DEEPLINK_SERIES_GET_URL: 'NTG_RDX_MSG_DEEPLINK_SERIES_GET' = 'NTG_RDX_MSG_DEEPLINK_SERIES_GET';\nexport const REDUX_MSG_DEFAULT_HUB_URL: 'NTG_RDX_MSG_DEFAULT_HUB_URL' = 'NTG_RDX_MSG_DEFAULT_HUB_URL';\nexport const REDUX_MSG_DISTRIBUTOR_ADD: 'NTG_RDX_MSG_DISTRIBUTOR_ADD' = 'NTG_RDX_MSG_DISTRIBUTOR_ADD';\nexport const REDUX_MSG_GAMESTREAM_TOKEN_GET_URL: 'NTG_RDX_MSG_GAMESTREAM_TOKEN_GET' = 'NTG_RDX_MSG_GAMESTREAM_TOKEN_GET';\nexport const REDUX_MSG_HUB_URL: 'NTG_RDX_MSG_HUB_URL' = 'NTG_RDX_MSG_HUB_URL';\nexport const REDUX_MSG_LIST_ALIAS_MULTI_URL: 'NTG_RDX_MSG_LIST_ALIAS_MULTI_URL' = 'NTG_RDX_MSG_LIST_ALIAS_MULTI_URL';\nexport const REDUX_MSG_LIST_ALIAS_URL: 'NTG_RDX_MSG_LIST_ALIAS_URL' = 'NTG_RDX_MSG_LIST_ALIAS_URL';\nexport const REDUX_MSG_LOCATION_CATCHUP_FOR_ASSET_URL: 'NTG_RDX_MSG_LOCATION_CATCHUP_FOR_ASSET_URL' = 'NTG_RDX_MSG_LOCATION_CATCHUP_FOR_ASSET_URL';\nexport const REDUX_MSG_LOCATION_EPG_FOR_ASSET_URL: 'NTG_RDX_MSG_LOCATION_EPG_FOR_ASSET_URL' = 'NTG_RDX_MSG_LOCATION_EPG_FOR_ASSET_URL';\nexport const REDUX_MSG_LOCATION_EPG_URL: 'NTG_RDX_MSG_LOCATION_EPG_URL' = 'NTG_RDX_MSG_LOCATION_EPG_URL';\nexport const REDUX_MSG_LOCATION_VOD_FOR_ASSET_URL: 'NTG_RDX_MSG_LOCATION_VOD_FOR_ASSET_URL' = 'NTG_RDX_MSG_LOCATION_VOD_FOR_ASSET_URL';\nexport const REDUX_MSG_METADATA_CHANNELS_URL: 'NTG_RDX_MSG_METADATA_CHANNELS_URL' = 'NTG_RDX_MSG_METADATA_CHANNELS_URL';\nexport const REDUX_MSG_METADATA_IMAGE_WITH_VARIANT_URL: 'NTG_RDX_MSG_METADATA_IMAGE_WITH_VARIANT_URL' = 'NTG_RDX_MSG_METADATA_IMAGE_WITH_VARIANT_URL';\nexport const REDUX_MSG_METADATA_PROGRAM_URL: 'NTG_RDX_MSG_METADATA_PROGRAM_URL' = 'NTG_RDX_MSG_METADATA_PROGRAM_URL';\nexport const REDUX_MSG_METADATA_SCHEDULE_URL: 'NTG_RDX_MSG_METADATA_SCHEDULE_URL' = 'NTG_RDX_MSG_METADATA_SCHEDULE_URL';\nexport const REDUX_MSG_NPVR_RECORDINGS_DELETE_URL: 'NTG_RDX_MSG_RECORDINGS_DELETE_URL' = 'NTG_RDX_MSG_RECORDINGS_DELETE_URL';\nexport const REDUX_MSG_NPVR_RECORDINGS_FUTURE_URL: 'NTG_RDX_MSG_RECORDINGS_FUTURE_URL' = 'NTG_RDX_MSG_RECORDINGS_FUTURE_URL';\nexport const REDUX_MSG_NPVR_RECORDINGS_LIST_URL: 'NTG_RDX_MSG_RECORDINGS_LIST_URL' = 'NTG_RDX_MSG_RECORDINGS_LIST_URL';\nexport const REDUX_MSG_NPVR_RECORDINGS_METADATA_URL: 'NTG_RDX_MSG_RECORDINGS_METADATA_URL' = 'NTG_RDX_MSG_RECORDINGS_METADATA_URL';\nexport const REDUX_MSG_NPVR_RECORDINGS_QUOTA_URL: 'NTG_RDX_MSG_RECORDINGS_QUOTA_URL' = 'NTG_RDX_MSG_RECORDINGS_QUOTA_URL';\nexport const REDUX_MSG_NPVR_RECORDINGS_RETRY_URL: 'NTG_RDX_MSG_RECORDINGS_RETRY_URL' = 'NTG_RDX_MSG_RECORDINGS_RETRY_URL';\nexport const REDUX_MSG_NPVR_RECORDINGS_STOP_URL: 'NTG_RDX_MSG_RECORDINGS_STOP_URL' = 'NTG_RDX_MSG_RECORDINGS_STOP_URL';\nexport const REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_CREATE_URL: 'NTG_RDX_MSG_SCHEDULED_RECORDINGS_CREATE_URL' = 'NTG_RDX_MSG_SCHEDULED_RECORDINGS_CREATE_URL';\nexport const REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_DELETE_URL: 'NTG_RDX_MSG_SCHEDULED_RECORDINGS_DELETE_URL' = 'NTG_RDX_MSG_SCHEDULED_RECORDINGS_DELETE_URL';\nexport const REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_LIST_FULL_URL: 'NTG_RDX_MSG_SCHEDULED_RECORDINGS_LIST_FULL_URL' = 'NTG_RDX_MSG_SCHEDULED_RECORDINGS_LIST_FULL_URL';\nexport const REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_LIST_URL: 'NTG_RDX_MSG_SCHEDULED_RECORDINGS_LIST_URL' = 'NTG_RDX_MSG_SCHEDULED_RECORDINGS_LIST_URL';\nexport const REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_METADATA_URL: 'NTG_RDX_MSG_SCHEDULED_RECORDINGS_METADATA_URL' = 'NTG_RDX_MSG_SCHEDULED_RECORDINGS_METADATA_URL';\nexport const REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_UPDATE_URL: 'NTG_RDX_MSG_SCHEDULED_RECORDINGS_UPDATE_URL' = 'NTG_RDX_MSG_SCHEDULED_RECORDINGS_UPDATE_URL';\nexport const REDUX_MSG_PERSONAL_DATA_DELETE_URL: 'NTG_RDX_MSG_PERSONAL_DATA_DELETE_URL' = 'NTG_RDX_MSG_PERSONAL_DATA_DELETE_URL';\nexport const REDUX_MSG_PERSONAL_DATA_GET_URL: 'NTG_RDX_MSG_PERSONAL_DATA_GET_URL' = 'NTG_RDX_MSG_PERSONAL_DATA_GET_URL';\nexport const REDUX_MSG_PERSONAL_DATA_LIST_DELETE_URL: 'NTG_RDX_MSG_PERSONAL_DATA_LIST_DELETE_URL' = 'NTG_RDX_MSG_PERSONAL_DATA_LIST_DELETE_URL';\nexport const REDUX_MSG_PERSONAL_DATA_LIST_GET_URL: 'NTG_RDX_MSG_PERSONAL_DATA_LIST_GET_URL' = 'NTG_RDX_MSG_PERSONAL_DATA_LIST_GET_URL';\nexport const REDUX_MSG_PERSONAL_DATA_LIST_POST_URL: 'NTG_RDX_MSG_PERSONAL_DATA_LIST_POST_URL' = 'NTG_RDX_MSG_PERSONAL_DATA_LIST_POST_URL';\nexport const REDUX_MSG_PERSONAL_DATA_POST_URL: 'NTG_RDX_MSG_PERSONAL_DATA_POST_URL' = 'NTG_RDX_MSG_PERSONAL_DATA_POST_URL';\nexport const REDUX_MSG_PURCHASE_INFO_PER_ASSET_URL: 'NTG_RDX_MSG_PURCHASE_PER_ASSET_URL' = 'NTG_RDX_MSG_PURCHASE_PER_ASSET_URL';\nexport const REDUX_MSG_RIGHT_COMMERCIAL_OFFERS_URL: 'NTG_RDX_MSG_RIGHT_COMMERCIAL_OFFERS_URL' = 'NTG_RDX_MSG_RIGHT_COMMERCIAL_OFFERS_URL';\nexport const REDUX_MSG_RIGHT_DEFAULT_RIGHTS_URL: 'NTG_RDX_MSG_RIGHT_DEFAULT_RIGHTS_URL' = 'NTG_RDX_MSG_RIGHT_DEFAULT_RIGHTS_URL';\nexport const REDUX_MSG_RIGHT_USER_RIGHTS_URL: 'NTG_RDX_MSG_RIGHT_USER_RIGHTS_URL' = 'NTG_RDX_MSG_RIGHT_USER_RIGHTS_URL';\n\nexport const REDUX_MSG_REQUEST_CUSTOM_STRATEGY: 'NTG_RDX_METH_SEND_V8_CUSTOM_STRATEGY_REQUEST' = 'NTG_RDX_METH_SEND_V8_CUSTOM_STRATEGY_REQUEST';\nexport const REDUX_MSG_REQUEST_DATA_COLLECTION: 'NTG_RDX_METH_SEND_V8_DATA_COLLECTION_REQUEST' = 'NTG_RDX_METH_SEND_V8_DATA_COLLECTION_REQUEST';\nexport const REDUX_MSG_REQUEST_DATA_COLLECTION_COLLECTOR_ID: 'NTG_RDX_METH_SEND_V8_DATA_COLLECTION_ID_REQUEST' = 'NTG_RDX_METH_SEND_V8_DATA_COLLECTION_ID_REQUEST';\nexport const REDUX_MSG_REQUEST_LIST_ALIAS_MULTI: 'NTG_RDX_METH_SEND_V8_LIST_ALIAS_MULTI_REQUEST' = 'NTG_RDX_METH_SEND_V8_LIST_ALIAS_MULTI_REQUEST';\nexport const REDUX_MSG_REQUEST_LIST_ALIAS_POST: 'NTG_RDX_METH_SEND_V8_LIST_ALIAS_POST_REQUEST' = 'NTG_RDX_METH_SEND_V8_LIST_ALIAS_POST_REQUEST';\nexport const REDUX_MSG_REQUEST_GENERIC: 'NTG_RDX_METH_SEND_V8_METADATA_CHANNELS_REQUEST' = 'NTG_RDX_METH_SEND_V8_METADATA_CHANNELS_REQUEST';\nexport const REDUX_MSG_REQUEST_NPVR_RECORDINGS_DELETE: 'NTG_RDX_METH_SEND_V8_RECORDINGS_DELETE_REQUEST' = 'NTG_RDX_METH_SEND_V8_RECORDINGS_DELETE_REQUEST';\nexport const REDUX_MSG_REQUEST_NPVR_RECORDINGS_FUTURE: 'NTG_RDX_METH_SEND_V8_RECORDINGS_FUTURE_REQUEST' = 'NTG_RDX_METH_SEND_V8_RECORDINGS_FUTURE_REQUEST';\nexport const REDUX_MSG_REQUEST_NPVR_RECORDINGS_LIST: 'NTG_RDX_METH_SEND_V8_RECORDINGS_LIST_REQUEST' = 'NTG_RDX_METH_SEND_V8_RECORDINGS_LIST_REQUEST';\nexport const REDUX_MSG_REQUEST_NPVR_RECORDINGS_METADATA: 'NTG_RDX_METH_SEND_V8_NPVR_RECORDINGS_METADATA_REQUEST' = 'NTG_RDX_METH_SEND_V8_NPVR_RECORDINGS_METADATA_REQUEST';\nexport const REDUX_MSG_REQUEST_NPVR_RECORDINGS_QUOTA: 'NTG_RDX_METH_SEND_V8_NPVR_RECORDINGS_QUOTA_REQUEST' = 'NTG_RDX_METH_SEND_V8_NPVR_RECORDINGS_QUOTA_REQUEST';\nexport const REDUX_MSG_REQUEST_NPVR_RECORDINGS_RETRY: 'NTG_RDX_METH_SEND_V8_NPVR_RECORDINGS_RETRY_REQUEST' = 'NTG_RDX_METH_SEND_V8_NPVR_RECORDINGS_RETRY_REQUEST';\nexport const REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_CREATE: 'NTG_RDX_METH_SEND_V8_SCH_RECORDINGS_CREATE_REQUEST' = 'NTG_RDX_METH_SEND_V8_SCH_RECORDINGS_CREATE_REQUEST';\nexport const REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_DELETE: 'NTG_RDX_METH_SEND_V8_SCH_RECORDINGS_DELETE_REQUEST' = 'NTG_RDX_METH_SEND_V8_SCH_RECORDINGS_DELETE_REQUEST';\nexport const REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_LIST: 'NTG_RDX_METH_SEND_V8_SCH_RECORDINGS_LIST_REQUEST' = 'NTG_RDX_METH_SEND_V8_SCH_RECORDINGS_LIST_REQUEST';\nexport const REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_LIST_FULL: 'NTG_RDX_METH_SEND_V8_SCH_RECORDINGS_LIST_FULL_REQUEST' = 'NTG_RDX_METH_SEND_V8_SCH_RECORDINGS_LIST_FULL_REQUEST';\nexport const REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_METADATA: 'NTG_RDX_METH_SEND_V8_SCH_RECORDINGS_METADATA_REQUEST' = 'NTG_RDX_METH_SEND_V8_SCH_RECORDINGS_METADATA_REQUEST';\nexport const REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_UPDATE: 'NTG_RDX_METH_SEND_V8_SCH_RECORDINGS_UPDATE_REQUEST' = 'NTG_RDX_METH_SEND_V8_SCH_RECORDINGS_UPDATE_REQUEST';\nexport const REDUX_MSG_REQUEST_PERSONAL_DATA_DELETE: 'NTG_RDX_METH_SEND_PERSONAL_DATA_DELETE_REQUEST' = 'NTG_RDX_METH_SEND_PERSONAL_DATA_DELETE_REQUEST';\nexport const REDUX_MSG_REQUEST_PERSONAL_DATA_GET: 'NTG_RDX_METH_SEND_PERSONAL_DATA_GET_REQUEST' = 'NTG_RDX_METH_SEND_PERSONAL_DATA_GET_REQUEST';\nexport const REDUX_MSG_REQUEST_PERSONAL_DATA_POST: 'NTG_RDX_METH_SEND_PERSONAL_DATA_POST_REQUEST' = 'NTG_RDX_METH_SEND_PERSONAL_DATA_POST_REQUEST';\nexport const REDUX_MSG_REQUEST_RIGHT_COMMERCIAL_OFFER: 'NTG_RDX_METH_SEND_COMMERCIAL_OFFER_REQUEST' = 'NTG_RDX_METH_SEND_COMMERCIAL_OFFER_REQUEST';\nexport const REDUX_MSG_REQUEST_RIGHT_USER_RIGHTS: 'NTG_RDX_METH_SEND_USER_RIGHTS_REQUEST' = 'NTG_RDX_METH_SEND_USER_RIGHTS_REQUEST';\nexport const REDUX_MSG_REQUEST_SECTION_FEED: 'NTG_RDX_METH_SEND_V8_SECTION_FEED_REQUEST' = 'NTG_RDX_METH_SEND_V8_SECTION_FEED_REQUEST';\n\n// VIDEOFUTUR\n\nexport const REDUX_MSG_REQUEST_BO_AUTHENTICATE: 'BO_RDX_METH_AUTHENTICATE' = 'BO_RDX_METH_AUTHENTICATE';\nexport const REDUX_MSG_REQUEST_BO_DISCOVERY: 'BO_RDX_METH_SEND_DISCOVERY_REQUEST' = 'BO_RDX_METH_SEND_DISCOVERY_REQUEST';\nexport const REDUX_MSG_REQUEST_BO_FAVORITE_ADD: 'BO_RDX_METH_SEND_ADD_FAVORITE_REQUEST' = 'BO_RDX_METH_SEND_ADD_FAVORITE_REQUEST';\nexport const REDUX_MSG_REQUEST_BO_FAVORITE_DELETE: 'BO_RDX_METH_SEND_DELETE_FAVORITE_REQUEST' = 'BO_RDX_METH_SEND_DELETE_FAVORITE_REQUEST';\nexport const REDUX_MSG_REQUEST_BO_FAVORITE_LIST: 'BO_RDX_METH_SEND_FAVORITE_LIST_REQUEST' = 'BO_RDX_METH_SEND_FAVORITE_LIST_REQUEST';\nexport const REDUX_MSG_REQUEST_BO_PERSONAL_DATA: 'BO_RDX_METH_SEND_PERSONAL_DATA_REQUEST' = 'BO_RDX_METH_SEND_PERSONAL_DATA_REQUEST';\nexport const REDUX_MSG_REQUEST_BO_PURCHASE: 'BO_RDX_METH_SEND_PURCHASE_REQUEST' = 'BO_RDX_METH_SEND_PURCHASE_REQUEST';\nexport const REDUX_MSG_REQUEST_BO_PURCHASE_LIST: 'BO_RDX_METH_SEND_PURCHASE_LIST_REQUEST' = 'BO_RDX_METH_SEND_PURCHASE_LIST_REQUEST';\nexport const REDUX_MSG_REQUEST_BO_PURCHASE_STATUS: 'BO_RDX_METH_SEND_PURCHASE_STATUS_REQUEST' = 'BO_RDX_METH_SEND_PURCHASE_STATUS_REQUEST';\nexport const REDUX_MSG_REQUEST_BO_STREAM_CREATE: 'BO_RDX_METH_SEND_CREATE_STREAM_REQUEST' = 'BO_RDX_METH_SEND_CREATE_STREAM_REQUEST';\nexport const REDUX_MSG_REQUEST_BO_STREAMS_GET: 'BO_RDX_METH_SEND_GET_STREAMS_REQUEST' = 'BO_RDX_METH_SEND_GET_STREAMS_REQUEST';\nexport const REDUX_MSG_REQUEST_BO_STREAM_START: 'BO_RDX_METH_SEND_STREAM_START_REQUEST' = 'BO_RDX_METH_SEND_STREAM_START_REQUEST';\nexport const REDUX_MSG_REQUEST_BO_STREAM_STOP: 'BO_RDX_METH_SEND_STREAM_STOP_REQUEST' = 'BO_RDX_METH_SEND_STREAM_STOP_REQUEST';\n","/* @flow */\n\nimport type { NETGEM_FUTURE_RECORDINGS_STATUS, NETGEM_RECORDINGS_MAP, NETGEM_SCHEDULED_RECORDINGS_MAP } from '../../../libs/netgemLibrary/v8/types/Npvr';\nimport {\n REDUX_MSG_NPVR_RECORDINGS_FUTURE_UPDATE,\n REDUX_MSG_NPVR_RECORDINGS_LIST_UPDATE,\n REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_LIST_FULL_UPDATE,\n REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_LIST_UPDATE,\n REDUX_MSG_NPVR_STATE_UPDATE,\n REDUX_MSG_QUOTA_PVR_UPDATE,\n} from '../constants';\nimport type { ETAG_MAP } from '../../../libs/netgemLibrary/v8/types/ETag';\nimport type { NETGEM_API_DMS_QUOTA_PVR } from '../../../libs/netgemLibrary/dms/types/QuotaPvr';\nimport type { NETGEM_API_V8_RAW_FEED } from '../../../libs/netgemLibrary/v8/types/FeedResult';\n\nexport type NpvrAction =\n // Default action\n | {| type: null |}\n // Update list of existing recordings\n | {|\n npvrRecordingsList: NETGEM_RECORDINGS_MAP,\n npvrRecordingsListETag: ?string,\n npvrRecordingsListFeed: NETGEM_API_V8_RAW_FEED,\n type: typeof REDUX_MSG_NPVR_RECORDINGS_LIST_UPDATE,\n |}\n // Update list of future recordings\n | {|\n npvrRecordingsFuture: NETGEM_RECORDINGS_MAP,\n npvrRecordingsFutureETag: ?string,\n npvrRecordingsFutureFeed: NETGEM_API_V8_RAW_FEED,\n npvrRecordingsFutureStatus: NETGEM_FUTURE_RECORDINGS_STATUS,\n type: typeof REDUX_MSG_NPVR_RECORDINGS_FUTURE_UPDATE,\n |}\n // Update nPVR state\n | {|\n endMargin: number,\n isEnabled: boolean,\n keepFromReplay: boolean,\n recFromBeginning: boolean,\n startMargin: number,\n type: typeof REDUX_MSG_NPVR_STATE_UPDATE,\n |}\n // Update quota\n | {|\n quotaPvr: ?NETGEM_API_DMS_QUOTA_PVR,\n type: typeof REDUX_MSG_QUOTA_PVR_UPDATE,\n |}\n // Update list of scheduled recordings (obtained through v1)\n | {|\n scheduledRecordingETagList: ETAG_MAP,\n scheduledRecordingList: NETGEM_SCHEDULED_RECORDINGS_MAP,\n scheduledRecordingListETag: ?string,\n type: typeof REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_LIST_UPDATE,\n |}\n // Update list of scheduled recordings (obtained through v2, \"list full\" with metadata)\n | {|\n scheduledRecordingList: NETGEM_SCHEDULED_RECORDINGS_MAP,\n scheduledRecordingListFullETag: ?string,\n type: typeof REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_LIST_FULL_UPDATE,\n |};\n\nconst updateExistingRecordings: (npvrRecordingsList: NETGEM_RECORDINGS_MAP, npvrRecordingsListETag: ?string, npvrRecordingsListFeed: NETGEM_API_V8_RAW_FEED) => NpvrAction = (\n npvrRecordingsList,\n npvrRecordingsListETag,\n npvrRecordingsListFeed,\n) => {\n return {\n npvrRecordingsList,\n npvrRecordingsListETag,\n npvrRecordingsListFeed,\n type: REDUX_MSG_NPVR_RECORDINGS_LIST_UPDATE,\n };\n};\n\nconst updateFutureRecordings: (\n npvrRecordingsFuture: NETGEM_RECORDINGS_MAP,\n npvrRecordingsFutureETag: ?string,\n npvrRecordingsFutureFeed: NETGEM_API_V8_RAW_FEED,\n npvrRecordingsFutureStatus: NETGEM_FUTURE_RECORDINGS_STATUS,\n) => NpvrAction = (npvrRecordingsFuture, npvrRecordingsFutureETag, npvrRecordingsFutureFeed, npvrRecordingsFutureStatus) => {\n return {\n npvrRecordingsFuture,\n npvrRecordingsFutureETag,\n npvrRecordingsFutureFeed,\n npvrRecordingsFutureStatus,\n type: REDUX_MSG_NPVR_RECORDINGS_FUTURE_UPDATE,\n };\n};\n\nconst updateNpvrState: (isEnabled: boolean, recFromBeginning: boolean, keepFromReplay: boolean, startMargin: number, endMargin: number) => NpvrAction = (\n isEnabled,\n recFromBeginning,\n keepFromReplay,\n startMargin,\n endMargin,\n) => {\n return {\n endMargin,\n isEnabled,\n keepFromReplay,\n recFromBeginning,\n startMargin,\n type: REDUX_MSG_NPVR_STATE_UPDATE,\n };\n};\n\nconst updateQuotaPvr: (quotaPvr: ?NETGEM_API_DMS_QUOTA_PVR) => NpvrAction = (quotaPvr) => {\n return {\n quotaPvr,\n type: REDUX_MSG_QUOTA_PVR_UPDATE,\n };\n};\n\nconst updateScheduledRecordings: (scheduledRecordingETagList: ETAG_MAP, scheduledRecordingList: NETGEM_SCHEDULED_RECORDINGS_MAP, scheduledRecordingListETag: ?string) => NpvrAction = (\n scheduledRecordingETagList,\n scheduledRecordingList,\n scheduledRecordingListETag,\n) => {\n return {\n scheduledRecordingETagList,\n scheduledRecordingList,\n scheduledRecordingListETag,\n type: REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_LIST_UPDATE,\n };\n};\n\nconst updateScheduledRecordingsFull: (scheduledRecordingList: NETGEM_SCHEDULED_RECORDINGS_MAP, scheduledRecordingListFullETag: ?string) => NpvrAction = (\n scheduledRecordingList,\n scheduledRecordingListFullETag,\n) => {\n return {\n scheduledRecordingList,\n scheduledRecordingListFullETag,\n type: REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_LIST_FULL_UPDATE,\n };\n};\n\nexport { updateExistingRecordings, updateFutureRecordings, updateNpvrState, updateQuotaPvr, updateScheduledRecordings, updateScheduledRecordingsFull };\n","/* @flow */\n\nexport const REDUX_MSG_NPVR_RECORDINGS_FUTURE_UPDATE: 'NTG_RDX_MSG_RECORDINGS_FUTURE_UPDATE' = 'NTG_RDX_MSG_RECORDINGS_FUTURE_UPDATE';\nexport const REDUX_MSG_NPVR_RECORDINGS_LIST_UPDATE: 'NTG_RDX_MSG_RECORDINGS_LIST_UPDATE' = 'NTG_RDX_MSG_RECORDINGS_LIST_UPDATE';\nexport const REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_LIST_UPDATE: 'NTG_RDX_MSG_SCHEDULED_RECORDINGS_LIST_UPDATE' = 'NTG_RDX_MSG_SCHEDULED_RECORDINGS_LIST_UPDATE';\nexport const REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_LIST_FULL_UPDATE: 'NTG_RDX_MSG_SCHEDULED_RECORDINGS_LIST_FULL_UPDATE' = 'NTG_RDX_MSG_SCHEDULED_RECORDINGS_LIST_FULL_UPDATE';\nexport const REDUX_MSG_NPVR_STATE_UPDATE: 'NTG_RDX_MSG_NPVR_STATE_UPDATE' = 'NTG_RDX_MSG_NPVR_STATE_UPDATE';\nexport const REDUX_MSG_QUOTA_PVR_UPDATE: 'NTG_RDX_MSG_QUOTA_PVR' = 'NTG_RDX_MSG_QUOTA_PVR';\n","/* @flow */\n\nimport type { BO_PURCHASE_LISTS, BO_PURCHASE_LIST_BY_DISTRIBUTOR_TYPE } from '../../netgemApi/actions/videofutur/types/purchase';\nimport type { NETGEM_API_VIEWINGHISTORY, NETGEM_API_VIEWINGHISTORY_ITEM } from '../../../libs/netgemLibrary/v8/types/ViewingHistory';\nimport {\n REDUX_MSG_AVENUE_LIST_UPDATE,\n REDUX_MSG_BACK_TO_FOCUSED_AVENUE,\n REDUX_MSG_BO_FAVORITE_LIST_CLEAR,\n REDUX_MSG_BO_FAVORITE_LIST_UPDATE,\n REDUX_MSG_BO_PURCHASE_LISTS_FOR_ALL_DISTRIBUTORS_UPDATE,\n REDUX_MSG_BO_PURCHASE_LIST_CLEAR,\n REDUX_MSG_BO_PURCHASE_LIST_FOR_DISTRIBUTOR_UPDATE,\n REDUX_MSG_DEFAULT_ACTIONS_UPDATE,\n REDUX_MSG_DELETE_SEARCH_HISTORY,\n REDUX_MSG_DELETE_SEARCH_HISTORY_TERM,\n REDUX_MSG_FOCUSED_AVENUE_UPDATE,\n REDUX_MSG_RESET_SECTION_PAGE_INDICES,\n REDUX_MSG_SETTING_RESET,\n REDUX_MSG_SETTING_UPDATE,\n REDUX_MSG_SET_DEEPLINK,\n REDUX_MSG_THEATER_MODE_UPDATE,\n REDUX_MSG_UPDATE_DISPLAY_PAYWALL_SUBSCRIPTION,\n REDUX_MSG_UPDATE_GRID_SECTION_ID,\n REDUX_MSG_UPDATE_SEARCH_STRING,\n REDUX_MSG_UPDATE_SECTION_PAGE_INDEX,\n REDUX_MSG_VIDEO_CAROUSEL_PLAY_UPDATE,\n REDUX_MSG_VIDEO_CAROUSEL_SOUND_UPDATE,\n REDUX_MSG_VIEWING_HISTORY_ITEM_DELETE,\n REDUX_MSG_VIEWING_HISTORY_ITEM_ETAG_DELETE,\n REDUX_MSG_VIEWING_HISTORY_ITEM_UPDATE,\n REDUX_MSG_VIEWING_HISTORY_RESET,\n REDUX_MSG_VIEWING_HISTORY_SET_ERROR,\n REDUX_MSG_VIEWING_HISTORY_UPDATE,\n REDUX_MSG_WISHLIST_ETAG_DELETE,\n REDUX_MSG_WISHLIST_RESET,\n REDUX_MSG_WISHLIST_SET_ERROR,\n REDUX_MSG_WISHLIST_UPDATE,\n} from '../constants';\nimport { AvenueType } from '../../../helpers/ui/avenue/types';\nimport type { NETGEM_API_V8_FEED_ITEM } from '../../../libs/netgemLibrary/v8/types/FeedItem';\nimport type { NETGEM_API_V8_HUB } from '../../../libs/netgemLibrary/v8/types/Hub';\nimport type { NETGEM_API_V8_WIDGET_ACTIONS_TYPE } from '../../../libs/netgemLibrary/v8/types/WidgetConfig';\nimport type { NETGEM_API_WISHLIST } from '../../../libs/netgemLibrary/v8/types/Wishlist';\nimport { Setting } from '../../../helpers/settings/types';\n\nexport type UIAction =\n // Default action\n | {| type: null |}\n // Update avenue hub\n | {|\n hub: NETGEM_API_V8_HUB,\n hubETag: string | null,\n hubMaxAge: number | null,\n type: typeof REDUX_MSG_AVENUE_LIST_UPDATE,\n |}\n // Update focused avenue\n | {|\n avenueType: AvenueType,\n hub?: NETGEM_API_V8_HUB,\n hubItem?: NETGEM_API_V8_FEED_ITEM,\n index: number,\n searchString?: string,\n type: typeof REDUX_MSG_FOCUSED_AVENUE_UPDATE,\n |}\n // Update search string\n | {|\n searchString: string,\n type: typeof REDUX_MSG_UPDATE_SEARCH_STRING,\n |}\n // Clear search history\n | {| type: typeof REDUX_MSG_DELETE_SEARCH_HISTORY |}\n // Delete search string in search history\n | {|\n searchString: string,\n type: typeof REDUX_MSG_DELETE_SEARCH_HISTORY_TERM,\n |}\n // Go back to focused avenue\n | {| type: typeof REDUX_MSG_BACK_TO_FOCUSED_AVENUE |}\n // Update default item actions\n | {|\n actions: NETGEM_API_V8_WIDGET_ACTIONS_TYPE,\n type: typeof REDUX_MSG_DEFAULT_ACTIONS_UPDATE,\n |}\n // Reset section page indices\n | {|\n prefix?: string,\n type: typeof REDUX_MSG_RESET_SECTION_PAGE_INDICES,\n |}\n // Update section page index\n | {|\n pageIndex: number,\n sectionId: string,\n type: typeof REDUX_MSG_UPDATE_SECTION_PAGE_INDEX,\n |}\n // Reset settings\n | {| type: typeof REDUX_MSG_SETTING_RESET |}\n // Update settings\n | {|\n setting: Setting,\n type: typeof REDUX_MSG_SETTING_UPDATE,\n value: any,\n |}\n // Toggle video carousel play/pause\n | {|\n isPlaying: boolean,\n type: typeof REDUX_MSG_VIDEO_CAROUSEL_PLAY_UPDATE,\n |}\n // Toggle video carousel sound\n | {|\n isMuted: boolean,\n type: typeof REDUX_MSG_VIDEO_CAROUSEL_SOUND_UPDATE,\n |}\n // Toggle theater mode\n | {|\n isInTheaterMode: boolean,\n type: typeof REDUX_MSG_THEATER_MODE_UPDATE,\n |}\n // Update VOD favorite list\n | {|\n eTag: string | null,\n favoriteList: Array<string>,\n type: typeof REDUX_MSG_BO_FAVORITE_LIST_UPDATE,\n |}\n // Clear VOD favorite list for all distributors\n | {| type: typeof REDUX_MSG_BO_FAVORITE_LIST_CLEAR |}\n // Update VOD purchase list for given distributor\n | {|\n distributorId: string,\n eTag: string | null,\n purchaseList: BO_PURCHASE_LIST_BY_DISTRIBUTOR_TYPE,\n type: typeof REDUX_MSG_BO_PURCHASE_LIST_FOR_DISTRIBUTOR_UPDATE,\n |}\n // Update VOD purchase lists for all distributors\n | {|\n purchaseLists: BO_PURCHASE_LISTS,\n type: typeof REDUX_MSG_BO_PURCHASE_LISTS_FOR_ALL_DISTRIBUTORS_UPDATE,\n |}\n // Clear VOD purchase list for all distributors\n | {| type: typeof REDUX_MSG_BO_PURCHASE_LIST_CLEAR |}\n // Set deeplink URL\n | {|\n deeplink: string,\n type: typeof REDUX_MSG_SET_DEEPLINK,\n |}\n // Set deeplink URL\n | {|\n isDisplayed: boolean,\n type: typeof REDUX_MSG_UPDATE_DISPLAY_PAYWALL_SUBSCRIPTION,\n |}\n // Viewing history load error\n | {| type: typeof REDUX_MSG_VIEWING_HISTORY_SET_ERROR |}\n // Reset viewing history\n | {| type: typeof REDUX_MSG_VIEWING_HISTORY_RESET |}\n // Delete viewing history item ETag\n | {|\n itemId: string,\n type: typeof REDUX_MSG_VIEWING_HISTORY_ITEM_ETAG_DELETE,\n |}\n // Delete viewing history item\n | {|\n itemId: string,\n type: typeof REDUX_MSG_VIEWING_HISTORY_ITEM_DELETE,\n |}\n // Update viewing history item\n | {|\n item: NETGEM_API_VIEWINGHISTORY_ITEM,\n itemETag: ?string,\n type: typeof REDUX_MSG_VIEWING_HISTORY_ITEM_UPDATE,\n |}\n // Update whole viewing history\n | {|\n viewingHistory: NETGEM_API_VIEWINGHISTORY,\n viewingHistoryETag: ?string,\n type: typeof REDUX_MSG_VIEWING_HISTORY_UPDATE,\n |}\n // Delete wishlist ETag\n | {| type: typeof REDUX_MSG_WISHLIST_ETAG_DELETE |}\n // Wishlist load error\n | {| type: typeof REDUX_MSG_WISHLIST_SET_ERROR |}\n // Reset whole wishlist\n | {| type: typeof REDUX_MSG_WISHLIST_RESET |}\n // Update whole wishlist\n | {|\n type: typeof REDUX_MSG_WISHLIST_UPDATE,\n wishlist: NETGEM_API_WISHLIST,\n wishlistETag: ?string,\n |}\n // Update grid section Id\n | {|\n type: typeof REDUX_MSG_UPDATE_GRID_SECTION_ID,\n gridSectionId: string | null,\n |};\n\nconst updateVideoCarouselPlaying: () => UIAction = () => {\n return {\n isPlaying: true,\n type: REDUX_MSG_VIDEO_CAROUSEL_PLAY_UPDATE,\n };\n};\n\nconst updateVideoCarouselPaused: () => UIAction = () => {\n return {\n isPlaying: false,\n type: REDUX_MSG_VIDEO_CAROUSEL_PLAY_UPDATE,\n };\n};\n\nconst updateVideoCarouselMuted: () => UIAction = () => {\n return {\n isMuted: true,\n type: REDUX_MSG_VIDEO_CAROUSEL_SOUND_UPDATE,\n };\n};\n\nconst updateVideoCarouselUnmuted: () => UIAction = () => {\n return {\n isMuted: false,\n type: REDUX_MSG_VIDEO_CAROUSEL_SOUND_UPDATE,\n };\n};\n\nconst enterTheaterMode: () => UIAction = () => {\n return {\n isInTheaterMode: true,\n type: REDUX_MSG_THEATER_MODE_UPDATE,\n };\n};\n\nconst exitTheaterMode: () => UIAction = () => {\n return {\n isInTheaterMode: false,\n type: REDUX_MSG_THEATER_MODE_UPDATE,\n };\n};\n\nconst updateAvenueList: (hub: NETGEM_API_V8_HUB, hubMaxAge: number | null, hubETag: string | null) => UIAction = (hub, hubMaxAge, hubETag) => {\n return {\n hub,\n hubETag,\n hubMaxAge,\n type: REDUX_MSG_AVENUE_LIST_UPDATE,\n };\n};\n\nconst updateFocusedAvenue: (index: number, avenueType: AvenueType, hubItem?: NETGEM_API_V8_FEED_ITEM, hub?: NETGEM_API_V8_HUB, searchString?: string) => UIAction = (\n index,\n avenueType,\n hubItem,\n hub,\n searchString,\n) => {\n return {\n avenueType,\n hub,\n hubItem,\n index,\n searchString,\n type: REDUX_MSG_FOCUSED_AVENUE_UPDATE,\n };\n};\n\nconst updateSearchString: (searchString: string) => UIAction = (searchString) => {\n return {\n searchString,\n type: REDUX_MSG_UPDATE_SEARCH_STRING,\n };\n};\n\nconst deleteSearchHistory: () => UIAction = () => {\n return { type: REDUX_MSG_DELETE_SEARCH_HISTORY };\n};\n\nconst deleteSearchHistoryTerm: (searchString: string) => UIAction = (searchString) => {\n return {\n searchString,\n type: REDUX_MSG_DELETE_SEARCH_HISTORY_TERM,\n };\n};\n\nconst goBackToFocusedAvenue: () => UIAction = () => {\n return { type: REDUX_MSG_BACK_TO_FOCUSED_AVENUE };\n};\n\nconst updateDefaultActions: (actions: NETGEM_API_V8_WIDGET_ACTIONS_TYPE) => UIAction = (actions) => {\n return {\n actions,\n type: REDUX_MSG_DEFAULT_ACTIONS_UPDATE,\n };\n};\n\nconst resetSectionPageIndices: (prefix?: string) => UIAction = (prefix) => {\n return {\n prefix,\n type: REDUX_MSG_RESET_SECTION_PAGE_INDICES,\n };\n};\n\nconst updateSectionPageIndex: (sectionId: string, pageIndex: number) => UIAction = (sectionId, pageIndex) => {\n return {\n pageIndex,\n sectionId,\n type: REDUX_MSG_UPDATE_SECTION_PAGE_INDEX,\n };\n};\n\nconst updateSetting: (setting?: Setting, value: any) => UIAction = (setting, value) => {\n if (setting !== undefined) {\n return {\n setting,\n type: REDUX_MSG_SETTING_UPDATE,\n value,\n };\n }\n\n return {\n type: null,\n };\n};\n\nconst resetSettings: () => UIAction = () => {\n return { type: REDUX_MSG_SETTING_RESET };\n};\n\nconst deleteViewingHistoryItem: (itemId: string) => UIAction = (itemId) => {\n return {\n itemId,\n type: REDUX_MSG_VIEWING_HISTORY_ITEM_DELETE,\n };\n};\n\nconst deleteViewingHistoryItemETag: (itemId: string) => UIAction = (itemId) => {\n return {\n itemId,\n type: REDUX_MSG_VIEWING_HISTORY_ITEM_ETAG_DELETE,\n };\n};\n\nconst deleteWishlistETag: () => UIAction = () => {\n return { type: REDUX_MSG_WISHLIST_ETAG_DELETE };\n};\n\nconst clearBOFavoriteList: () => UIAction = () => {\n return { type: REDUX_MSG_BO_FAVORITE_LIST_CLEAR };\n};\n\nconst updateBOFavoriteList: (favoriteList: Array<string>, eTag: string | null) => UIAction = (favoriteList, eTag) => {\n return {\n eTag,\n favoriteList,\n type: REDUX_MSG_BO_FAVORITE_LIST_UPDATE,\n };\n};\n\nconst clearBOPurchaseList: () => UIAction = () => {\n return { type: REDUX_MSG_BO_PURCHASE_LIST_CLEAR };\n};\n\nconst updateBOPurchaseListForDistributor: (distributorId: string, purchaseList: BO_PURCHASE_LIST_BY_DISTRIBUTOR_TYPE, eTag: string | null) => UIAction = (distributorId, purchaseList, eTag) => {\n return {\n distributorId,\n eTag,\n purchaseList,\n type: REDUX_MSG_BO_PURCHASE_LIST_FOR_DISTRIBUTOR_UPDATE,\n };\n};\n\nconst updateBOPurchaseListsForAllDistributors: (purchaseLists: BO_PURCHASE_LISTS) => UIAction = (purchaseLists) => {\n return {\n purchaseLists,\n type: REDUX_MSG_BO_PURCHASE_LISTS_FOR_ALL_DISTRIBUTORS_UPDATE,\n };\n};\n\nconst updateViewingHistoryItem: (item: NETGEM_API_VIEWINGHISTORY_ITEM, itemETag: ?string) => UIAction = (item, itemETag) => {\n return {\n item,\n itemETag,\n type: REDUX_MSG_VIEWING_HISTORY_ITEM_UPDATE,\n };\n};\n\nconst setDeeplink: (deeplink: string) => UIAction = (deeplink) => {\n return {\n deeplink,\n type: REDUX_MSG_SET_DEEPLINK,\n };\n};\n\nconst updateDisplayPaywallSubscription: (isDisplayed: boolean) => UIAction = (isDisplayed) => {\n return {\n isDisplayed,\n type: REDUX_MSG_UPDATE_DISPLAY_PAYWALL_SUBSCRIPTION,\n };\n};\n\nconst setViewingHistoryError: () => UIAction = () => {\n return { type: REDUX_MSG_VIEWING_HISTORY_SET_ERROR };\n};\n\nconst resetViewingHistory: () => UIAction = () => {\n return { type: REDUX_MSG_VIEWING_HISTORY_RESET };\n};\n\nconst updateWholeViewingHistory: (viewingHistory: NETGEM_API_VIEWINGHISTORY, viewingHistoryETag: ?string) => UIAction = (viewingHistory, viewingHistoryETag) => {\n return {\n type: REDUX_MSG_VIEWING_HISTORY_UPDATE,\n viewingHistory,\n viewingHistoryETag,\n };\n};\n\nconst setWishlistError: () => UIAction = () => {\n return { type: REDUX_MSG_WISHLIST_SET_ERROR };\n};\n\nconst resetWishlist: () => UIAction = () => {\n return { type: REDUX_MSG_WISHLIST_RESET };\n};\n\nconst updateWishlist: (wishlist: NETGEM_API_WISHLIST, wishlistETag: ?string) => UIAction = (wishlist, wishlistETag) => {\n return {\n type: REDUX_MSG_WISHLIST_UPDATE,\n wishlist,\n wishlistETag,\n };\n};\n\nconst updateGridSectionId: (gridSectionId: string | null) => UIAction = (gridSectionId) => {\n return {\n gridSectionId,\n type: REDUX_MSG_UPDATE_GRID_SECTION_ID,\n };\n};\n\nconst resetGridSectionId: () => UIAction = () => {\n return {\n gridSectionId: null,\n type: REDUX_MSG_UPDATE_GRID_SECTION_ID,\n };\n};\n\nexport {\n clearBOFavoriteList,\n clearBOPurchaseList,\n deleteSearchHistory,\n deleteSearchHistoryTerm,\n deleteViewingHistoryItemETag,\n deleteViewingHistoryItem,\n deleteWishlistETag,\n enterTheaterMode,\n exitTheaterMode,\n goBackToFocusedAvenue,\n resetGridSectionId,\n resetSectionPageIndices,\n resetSettings,\n resetViewingHistory,\n resetWishlist,\n setDeeplink,\n setViewingHistoryError,\n setWishlistError,\n updateAvenueList,\n updateBOFavoriteList,\n updateBOPurchaseListForDistributor,\n updateBOPurchaseListsForAllDistributors,\n updateDefaultActions,\n updateDisplayPaywallSubscription,\n updateFocusedAvenue,\n updateGridSectionId,\n updateSearchString,\n updateSectionPageIndex,\n updateSetting,\n updateVideoCarouselMuted,\n updateVideoCarouselPaused,\n updateVideoCarouselPlaying,\n updateVideoCarouselUnmuted,\n updateViewingHistoryItem,\n updateWholeViewingHistory,\n updateWishlist,\n};\n","/* @flow */\n\nexport const REDUX_MSG_AVENUE_LIST_UPDATE: 'NTG_RDX_MSG_AVENUE_LIST' = 'NTG_RDX_MSG_AVENUE_LIST';\nexport const REDUX_MSG_BACK_TO_FOCUSED_AVENUE: 'NTG_RDX_MSG_BACK_TO_FOCUSED_AVENUE' = 'NTG_RDX_MSG_BACK_TO_FOCUSED_AVENUE';\nexport const REDUX_MSG_BO_FAVORITE_LIST_CLEAR: 'BO_RDX_MSG_FAVORITE_LIST_CLEAR' = 'BO_RDX_MSG_FAVORITE_LIST_CLEAR';\nexport const REDUX_MSG_BO_PURCHASE_LIST_CLEAR: 'BO_RDX_MSG_PURCHASE_LIST_CLEAR' = 'BO_RDX_MSG_PURCHASE_LIST_CLEAR';\nexport const REDUX_MSG_DEFAULT_ACTIONS_UPDATE: 'NTG_RDX_MSG_UPDATE_DEFAULT_ACTIONS' = 'NTG_RDX_MSG_UPDATE_DEFAULT_ACTIONS';\nexport const REDUX_MSG_DELETE_SEARCH_HISTORY: 'NTG_RDX_MSG_DELETE_SEARCH_HISTORY' = 'NTG_RDX_MSG_DELETE_SEARCH_HISTORY';\nexport const REDUX_MSG_DELETE_SEARCH_HISTORY_TERM: 'NTG_RDX_MSG_DELETE_SEARCH_HISTORY_TERM' = 'NTG_RDX_MSG_DELETE_SEARCH_HISTORY_TERM';\nexport const REDUX_MSG_FOCUSED_AVENUE_UPDATE: 'NTG_RDX_MSG_FOCUSED_AVENUE_UPDATE' = 'NTG_RDX_MSG_FOCUSED_AVENUE_UPDATE';\nexport const REDUX_MSG_UPDATE_SECTION_PAGE_INDEX: 'NTG_RDX_MSG_SECTION_PAGE_INDEX_UPDATE' = 'NTG_RDX_MSG_SECTION_PAGE_INDEX_UPDATE';\nexport const REDUX_MSG_RESET_SECTION_PAGE_INDICES: 'NTG_RDX_MSG_SECTION_PAGE_INDICES_RESET' = 'NTG_RDX_MSG_SECTION_PAGE_INDICES_RESET';\nexport const REDUX_MSG_SET_DEEPLINK: 'NTG_RDX_MSG_SET_DEEPLINK' = 'NTG_RDX_MSG_SET_DEEPLINK';\nexport const REDUX_MSG_SETTING_RESET: 'NTG_RDX_MSG_RESET_SETTING' = 'NTG_RDX_MSG_RESET_SETTING';\nexport const REDUX_MSG_SETTING_UPDATE: 'NTG_RDX_MSG_UPDATE_SETTING' = 'NTG_RDX_MSG_UPDATE_SETTING';\nexport const REDUX_MSG_THEATER_MODE_UPDATE: 'NTG_RDX_MSG_THEATER_MODE_UPDATE' = 'NTG_RDX_MSG_THEATER_MODE_UPDATE';\nexport const REDUX_MSG_UPDATE_DISPLAY_PAYWALL_SUBSCRIPTION: 'NTG_RDX_DISPLAY_PAYWALL_SUBSCRIPTION_UPDATE' = 'NTG_RDX_DISPLAY_PAYWALL_SUBSCRIPTION_UPDATE';\nexport const REDUX_MSG_UPDATE_GRID_SECTION_ID: 'NTG_RDX_MSG_UPDATE_GRIDSECTIONID' = 'NTG_RDX_MSG_UPDATE_GRIDSECTIONID';\nexport const REDUX_MSG_UPDATE_SEARCH_STRING: 'NTG_RDX_MSG_UPDATE_SEARCH_STRING' = 'NTG_RDX_MSG_UPDATE_SEARCH_STRING';\nexport const REDUX_MSG_BO_FAVORITE_LIST_UPDATE: 'BO_RDX_MSG_FAVORITE_LIST_UPDATE' = 'BO_RDX_MSG_FAVORITE_LIST_UPDATE';\nexport const REDUX_MSG_BO_PURCHASE_LIST_FOR_DISTRIBUTOR_UPDATE: 'BO_RDX_MSG_PURCHASE_LIST_FOR_DISTRIBUTOR_UPDATE' = 'BO_RDX_MSG_PURCHASE_LIST_FOR_DISTRIBUTOR_UPDATE';\nexport const REDUX_MSG_BO_PURCHASE_LISTS_FOR_ALL_DISTRIBUTORS_UPDATE: 'BO_RDX_MSG_PURCHASE_LISTS_FOR_ALL_DISTRIBUTORS_UPDATE' = 'BO_RDX_MSG_PURCHASE_LISTS_FOR_ALL_DISTRIBUTORS_UPDATE';\nexport const REDUX_MSG_VIDEO_CAROUSEL_PLAY_UPDATE: 'NTG_RDX_MSG_VIDEO_CAROUSEL_SOUND_UPDATE' = 'NTG_RDX_MSG_VIDEO_CAROUSEL_SOUND_UPDATE';\nexport const REDUX_MSG_VIDEO_CAROUSEL_SOUND_UPDATE: 'NTG_RDX_MSG_VIDEO_CAROUSEL_PLAY_UPDATE' = 'NTG_RDX_MSG_VIDEO_CAROUSEL_PLAY_UPDATE';\nexport const REDUX_MSG_VIEWING_HISTORY_ITEM_DELETE: 'NTG_RDX_MSG_VIEWING_HISTORY_ITEM_DELETE' = 'NTG_RDX_MSG_VIEWING_HISTORY_ITEM_DELETE';\nexport const REDUX_MSG_VIEWING_HISTORY_ITEM_ETAG_DELETE: 'REDUX_MSG_VIEWING_HISTORY_ITEM_ETAG_DELETE' = 'REDUX_MSG_VIEWING_HISTORY_ITEM_ETAG_DELETE';\nexport const REDUX_MSG_VIEWING_HISTORY_ITEM_UPDATE: 'NTG_RDX_MSG_VIEWING_HISTORY_ITEM_UPDATE' = 'NTG_RDX_MSG_VIEWING_HISTORY_ITEM_UPDATE';\nexport const REDUX_MSG_VIEWING_HISTORY_RESET: 'NTG_RDX_MSG_VIEWING_HISTORY_RESET' = 'NTG_RDX_MSG_VIEWING_HISTORY_RESET';\nexport const REDUX_MSG_VIEWING_HISTORY_SET_ERROR: 'NTG_RDX_MSG_VIEWING_HISTORY_SET_ERROR' = 'NTG_RDX_MSG_VIEWING_HISTORY_SET_ERROR';\nexport const REDUX_MSG_VIEWING_HISTORY_UPDATE: 'NTG_RDX_MSG_VIEWING_HISTORY_UPDATE' = 'NTG_RDX_MSG_VIEWING_HISTORY_UPDATE';\nexport const REDUX_MSG_WISHLIST_ETAG_DELETE: 'NTG_RDX_MSG_WISHLIST_ETAG_DELETE' = 'NTG_RDX_MSG_WISHLIST_ETAG_DELETE';\nexport const REDUX_MSG_WISHLIST_RESET: 'NTG_RDX_MSG_WISHLIST_RESET' = 'NTG_RDX_MSG_WISHLIST_RESET';\nexport const REDUX_MSG_WISHLIST_SET_ERROR: 'NTG_RDX_MSG_WISHLIST_SET_ERROR' = 'NTG_RDX_MSG_WISHLIST_SET_ERROR';\nexport const REDUX_MSG_WISHLIST_UPDATE: 'NTG_RDX_MSG_WISHLIST_UPDATE' = 'NTG_RDX_MSG_WISHLIST_UPDATE';\n","function r(e){var o,t,f=\"\";if(\"string\"==typeof e||\"number\"==typeof e)f+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var n=e.length;for(o=0;o<n;o++)e[o]&&(t=r(e[o]))&&(f&&(f+=\" \"),f+=t)}else for(t in e)e[t]&&(f&&(f+=\" \"),f+=t);return f}function e(){for(var e,o,t=0,f=\"\",n=arguments.length;t<n;t++)(e=arguments[t])&&(o=r(e))&&(f&&(f+=\" \"),f+=o);return f}module.exports=e,module.exports.clsx=e;","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n ? R.apply\n : function ReflectApply(target, receiver, args) {\n return Function.prototype.apply.call(target, receiver, args);\n }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target)\n .concat(Object.getOwnPropertySymbols(target));\n };\n} else {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target);\n };\n}\n\nfunction ProcessEmitWarning(warning) {\n if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n return value !== value;\n}\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\nmodule.exports.once = once;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n enumerable: true,\n get: function() {\n return defaultMaxListeners;\n },\n set: function(arg) {\n if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n }\n defaultMaxListeners = arg;\n }\n});\n\nEventEmitter.init = function() {\n\n if (this._events === undefined ||\n this._events === Object.getPrototypeOf(this)._events) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n }\n this._maxListeners = n;\n return this;\n};\n\nfunction _getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n var args = [];\n for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n var doError = (type === 'error');\n\n var events = this._events;\n if (events !== undefined)\n doError = (doError && events.error === undefined);\n else if (!doError)\n return false;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n var er;\n if (args.length > 0)\n er = args[0];\n if (er instanceof Error) {\n // Note: The comments on the `throw` lines are intentional, they show\n // up in Node's output if this results in an unhandled exception.\n throw er; // Unhandled 'error' event\n }\n // At least give some kind of context to the user\n var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n err.context = er;\n throw err; // Unhandled 'error' event\n }\n\n var handler = events[type];\n\n if (handler === undefined)\n return false;\n\n if (typeof handler === 'function') {\n ReflectApply(handler, this, args);\n } else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n ReflectApply(listeners[i], this, args);\n }\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n checkListener(listener);\n\n events = target._events;\n if (events === undefined) {\n events = target._events = Object.create(null);\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener !== undefined) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (existing === undefined) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] =\n prepend ? [listener, existing] : [existing, listener];\n // If we've already got an array, just append.\n } else if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n\n // Check for listener leak\n m = _getMaxListeners(target);\n if (m > 0 && existing.length > m && !existing.warned) {\n existing.warned = true;\n // No error code for this since it is a Warning\n // eslint-disable-next-line no-restricted-syntax\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + String(type) + ' listeners ' +\n 'added. Use emitter.setMaxListeners() to ' +\n 'increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n ProcessEmitWarning(w);\n }\n }\n\n return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction onceWrapper() {\n if (!this.fired) {\n this.target.removeListener(this.type, this.wrapFn);\n this.fired = true;\n if (arguments.length === 0)\n return this.listener.call(this.target);\n return this.listener.apply(this.target, arguments);\n }\n}\n\nfunction _onceWrap(target, type, listener) {\n var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n var wrapped = onceWrapper.bind(state);\n wrapped.listener = listener;\n state.wrapFn = wrapped;\n return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n checkListener(listener);\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n checkListener(listener);\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n checkListener(listener);\n\n events = this._events;\n if (events === undefined)\n return this;\n\n list = events[type];\n if (list === undefined)\n return this;\n\n if (list === listener || list.listener === listener) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length - 1; i >= 0; i--) {\n if (list[i] === listener || list[i].listener === listener) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (position === 0)\n list.shift();\n else {\n spliceOne(list, position);\n }\n\n if (list.length === 1)\n events[type] = list[0];\n\n if (events.removeListener !== undefined)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events, i;\n\n events = this._events;\n if (events === undefined)\n return this;\n\n // not listening for removeListener, no need to emit\n if (events.removeListener === undefined) {\n if (arguments.length === 0) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n } else if (events[type] !== undefined) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n var key;\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = Object.create(null);\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners !== undefined) {\n // LIFO order\n for (i = listeners.length - 1; i >= 0; i--) {\n this.removeListener(type, listeners[i]);\n }\n }\n\n return this;\n };\n\nfunction _listeners(target, type, unwrap) {\n var events = target._events;\n\n if (events === undefined)\n return [];\n\n var evlistener = events[type];\n if (evlistener === undefined)\n return [];\n\n if (typeof evlistener === 'function')\n return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n return unwrap ?\n unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events !== undefined) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener !== undefined) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n var copy = new Array(n);\n for (var i = 0; i < n; ++i)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction spliceOne(list, index) {\n for (; index + 1 < list.length; index++)\n list[index] = list[index + 1];\n list.pop();\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n\nfunction once(emitter, name) {\n return new Promise(function (resolve, reject) {\n function errorListener(err) {\n emitter.removeListener(name, resolver);\n reject(err);\n }\n\n function resolver() {\n if (typeof emitter.removeListener === 'function') {\n emitter.removeListener('error', errorListener);\n }\n resolve([].slice.call(arguments));\n };\n\n eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });\n if (name !== 'error') {\n addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });\n }\n });\n}\n\nfunction addErrorHandlerIfEventEmitter(emitter, handler, flags) {\n if (typeof emitter.on === 'function') {\n eventTargetAgnosticAddListener(emitter, 'error', handler, flags);\n }\n}\n\nfunction eventTargetAgnosticAddListener(emitter, name, listener, flags) {\n if (typeof emitter.on === 'function') {\n if (flags.once) {\n emitter.once(name, listener);\n } else {\n emitter.on(name, listener);\n }\n } else if (typeof emitter.addEventListener === 'function') {\n // EventTarget does not have `error` event semantics like Node\n // EventEmitters, we do not listen for `error` events here.\n emitter.addEventListener(name, function wrapListener(arg) {\n // IE does not have builtin `{ once: true }` support so we\n // have to do it manually.\n if (flags.once) {\n emitter.removeEventListener(name, wrapListener);\n }\n listener(arg);\n });\n } else {\n throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type ' + typeof emitter);\n }\n}\n","/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\n// Below we want to use `hasOwnProperty` on an object that doesn't have\n// `Object.prototype` in its proto chain, so we must extract it here.\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\n// Map from an enum object to a reverse map of its values to names\nvar reverseMapCache = typeof WeakMap === 'function' ? new WeakMap() : new Map();\n\n// Computes the reverse mapping of the enum object: from value to name.\n// Flow Enum values are unique (enforced by the parser), so this is a\n// one to one mapping.\nfunction getReverseMap(enumObject) {\n var reverseMap = reverseMapCache.get(enumObject);\n if (reverseMap !== undefined) {\n return reverseMap;\n }\n // We aren't using `Object.values` because that gets enumerable\n // properties, and our properties aren't enumerable.\n var newReverseMap = new Map();\n Object.getOwnPropertyNames(enumObject).forEach(function (name) {\n newReverseMap.set(enumObject[name], name);\n });\n reverseMapCache.set(enumObject, newReverseMap);\n return newReverseMap;\n}\n\nvar EnumPrototype = Object.freeze(\n Object.defineProperties(Object.create(null), {\n isValid: {\n value: function (x) {\n return getReverseMap(this).has(x);\n },\n },\n cast: {\n value: function (x) {\n return this.isValid(x) ? x : undefined;\n },\n },\n members: {\n value: function () {\n return getReverseMap(this).keys();\n },\n },\n getName: {\n value: function (value) {\n return getReverseMap(this).get(value);\n }\n }\n })\n);\n\n// `members` is an object mapping name to value.\nfunction Enum(members) {\n var o = Object.create(EnumPrototype);\n for (var k in members) {\n if (hasOwnProperty.call(members, k)) {\n // Create non-enumerable properties.\n Object.defineProperty(o, k, {value: members[k]});\n }\n }\n return Object.freeze(o);\n}\n\n// Mirrored enum (string enum with no member initializers).\n// Optimized implementation, taking advantage of the fact that\n// keys and values are identical.\nvar EnumMirroredPrototype = Object.freeze(\n Object.defineProperties(Object.create(null), {\n isValid: {\n value: function (x) {\n if (typeof x === 'string') {\n return hasOwnProperty.call(this, x);\n }\n return false;\n },\n },\n cast: {\n value: EnumPrototype.cast,\n },\n members: {\n value: function () {\n // We aren't using `Object.values` because that gets enumerable\n // properties, and our properties aren't enumerable.\n return Object.getOwnPropertyNames(this).values();\n },\n },\n getName: {\n value: function (value) {\n return value;\n }\n }\n })\n);\n\n// `members` is an array of names (which, are also the values).\nEnum.Mirrored = function EnumMirrored(members) {\n var o = Object.create(EnumMirroredPrototype);\n for (var i = 0, len = members.length; i < len; ++i) {\n // Value is same as key. Also, non-enumerable.\n Object.defineProperty(o, members[i], {value: members[i]});\n }\n return Object.freeze(o);\n};\n\nObject.freeze(Enum.Mirrored);\n\nmodule.exports = Object.freeze(Enum);\n","/**\n * @license React\n * react.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var l=Symbol.for(\"react.element\"),n=Symbol.for(\"react.portal\"),p=Symbol.for(\"react.fragment\"),q=Symbol.for(\"react.strict_mode\"),r=Symbol.for(\"react.profiler\"),t=Symbol.for(\"react.provider\"),u=Symbol.for(\"react.context\"),v=Symbol.for(\"react.forward_ref\"),w=Symbol.for(\"react.suspense\"),x=Symbol.for(\"react.memo\"),y=Symbol.for(\"react.lazy\"),z=Symbol.iterator;function A(a){if(null===a||\"object\"!==typeof a)return null;a=z&&a[z]||a[\"@@iterator\"];return\"function\"===typeof a?a:null}\nvar B={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},C=Object.assign,D={};function E(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B}E.prototype.isReactComponent={};\nE.prototype.setState=function(a,b){if(\"object\"!==typeof a&&\"function\"!==typeof a&&null!=a)throw Error(\"setState(...): takes an object of state variables to update or a function which returns an object of state variables.\");this.updater.enqueueSetState(this,a,b,\"setState\")};E.prototype.forceUpdate=function(a){this.updater.enqueueForceUpdate(this,a,\"forceUpdate\")};function F(){}F.prototype=E.prototype;function G(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B}var H=G.prototype=new F;\nH.constructor=G;C(H,E.prototype);H.isPureReactComponent=!0;var I=Array.isArray,J=Object.prototype.hasOwnProperty,K={current:null},L={key:!0,ref:!0,__self:!0,__source:!0};\nfunction M(a,b,e){var d,c={},k=null,h=null;if(null!=b)for(d in void 0!==b.ref&&(h=b.ref),void 0!==b.key&&(k=\"\"+b.key),b)J.call(b,d)&&!L.hasOwnProperty(d)&&(c[d]=b[d]);var g=arguments.length-2;if(1===g)c.children=e;else if(1<g){for(var f=Array(g),m=0;m<g;m++)f[m]=arguments[m+2];c.children=f}if(a&&a.defaultProps)for(d in g=a.defaultProps,g)void 0===c[d]&&(c[d]=g[d]);return{$$typeof:l,type:a,key:k,ref:h,props:c,_owner:K.current}}\nfunction N(a,b){return{$$typeof:l,type:a.type,key:b,ref:a.ref,props:a.props,_owner:a._owner}}function O(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===l}function escape(a){var b={\"=\":\"=0\",\":\":\"=2\"};return\"$\"+a.replace(/[=:]/g,function(a){return b[a]})}var P=/\\/+/g;function Q(a,b){return\"object\"===typeof a&&null!==a&&null!=a.key?escape(\"\"+a.key):b.toString(36)}\nfunction R(a,b,e,d,c){var k=typeof a;if(\"undefined\"===k||\"boolean\"===k)a=null;var h=!1;if(null===a)h=!0;else switch(k){case \"string\":case \"number\":h=!0;break;case \"object\":switch(a.$$typeof){case l:case n:h=!0}}if(h)return h=a,c=c(h),a=\"\"===d?\".\"+Q(h,0):d,I(c)?(e=\"\",null!=a&&(e=a.replace(P,\"$&/\")+\"/\"),R(c,b,e,\"\",function(a){return a})):null!=c&&(O(c)&&(c=N(c,e+(!c.key||h&&h.key===c.key?\"\":(\"\"+c.key).replace(P,\"$&/\")+\"/\")+a)),b.push(c)),1;h=0;d=\"\"===d?\".\":d+\":\";if(I(a))for(var g=0;g<a.length;g++){k=\na[g];var f=d+Q(k,g);h+=R(k,b,e,f,c)}else if(f=A(a),\"function\"===typeof f)for(a=f.call(a),g=0;!(k=a.next()).done;)k=k.value,f=d+Q(k,g++),h+=R(k,b,e,f,c);else if(\"object\"===k)throw b=String(a),Error(\"Objects are not valid as a React child (found: \"+(\"[object Object]\"===b?\"object with keys {\"+Object.keys(a).join(\", \")+\"}\":b)+\"). If you meant to render a collection of children, use an array instead.\");return h}\nfunction S(a,b,e){if(null==a)return a;var d=[],c=0;R(a,d,\"\",\"\",function(a){return b.call(e,a,c++)});return d}function T(a){if(-1===a._status){var b=a._result;b=b();b.then(function(b){if(0===a._status||-1===a._status)a._status=1,a._result=b},function(b){if(0===a._status||-1===a._status)a._status=2,a._result=b});-1===a._status&&(a._status=0,a._result=b)}if(1===a._status)return a._result.default;throw a._result;}\nvar U={current:null},V={transition:null},W={ReactCurrentDispatcher:U,ReactCurrentBatchConfig:V,ReactCurrentOwner:K};function X(){throw Error(\"act(...) is not supported in production builds of React.\");}\nexports.Children={map:S,forEach:function(a,b,e){S(a,function(){b.apply(this,arguments)},e)},count:function(a){var b=0;S(a,function(){b++});return b},toArray:function(a){return S(a,function(a){return a})||[]},only:function(a){if(!O(a))throw Error(\"React.Children.only expected to receive a single React element child.\");return a}};exports.Component=E;exports.Fragment=p;exports.Profiler=r;exports.PureComponent=G;exports.StrictMode=q;exports.Suspense=w;\nexports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=W;exports.act=X;\nexports.cloneElement=function(a,b,e){if(null===a||void 0===a)throw Error(\"React.cloneElement(...): The argument must be a React element, but you passed \"+a+\".\");var d=C({},a.props),c=a.key,k=a.ref,h=a._owner;if(null!=b){void 0!==b.ref&&(k=b.ref,h=K.current);void 0!==b.key&&(c=\"\"+b.key);if(a.type&&a.type.defaultProps)var g=a.type.defaultProps;for(f in b)J.call(b,f)&&!L.hasOwnProperty(f)&&(d[f]=void 0===b[f]&&void 0!==g?g[f]:b[f])}var f=arguments.length-2;if(1===f)d.children=e;else if(1<f){g=Array(f);\nfor(var m=0;m<f;m++)g[m]=arguments[m+2];d.children=g}return{$$typeof:l,type:a.type,key:c,ref:k,props:d,_owner:h}};exports.createContext=function(a){a={$$typeof:u,_currentValue:a,_currentValue2:a,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null};a.Provider={$$typeof:t,_context:a};return a.Consumer=a};exports.createElement=M;exports.createFactory=function(a){var b=M.bind(null,a);b.type=a;return b};exports.createRef=function(){return{current:null}};\nexports.forwardRef=function(a){return{$$typeof:v,render:a}};exports.isValidElement=O;exports.lazy=function(a){return{$$typeof:y,_payload:{_status:-1,_result:a},_init:T}};exports.memo=function(a,b){return{$$typeof:x,type:a,compare:void 0===b?null:b}};exports.startTransition=function(a){var b=V.transition;V.transition={};try{a()}finally{V.transition=b}};exports.unstable_act=X;exports.useCallback=function(a,b){return U.current.useCallback(a,b)};exports.useContext=function(a){return U.current.useContext(a)};\nexports.useDebugValue=function(){};exports.useDeferredValue=function(a){return U.current.useDeferredValue(a)};exports.useEffect=function(a,b){return U.current.useEffect(a,b)};exports.useId=function(){return U.current.useId()};exports.useImperativeHandle=function(a,b,e){return U.current.useImperativeHandle(a,b,e)};exports.useInsertionEffect=function(a,b){return U.current.useInsertionEffect(a,b)};exports.useLayoutEffect=function(a,b){return U.current.useLayoutEffect(a,b)};\nexports.useMemo=function(a,b){return U.current.useMemo(a,b)};exports.useReducer=function(a,b,e){return U.current.useReducer(a,b,e)};exports.useRef=function(a){return U.current.useRef(a)};exports.useState=function(a){return U.current.useState(a)};exports.useSyncExternalStore=function(a,b,e){return U.current.useSyncExternalStore(a,b,e)};exports.useTransition=function(){return U.current.useTransition()};exports.version=\"18.3.1\";\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react.production.min.js');\n} else {\n module.exports = require('./cjs/react.development.js');\n}\n","/* @flow */\n\n// $FlowFixMe[cannot-resolve-module] CSS file only exists in dist folder\nimport './DebugPicto.css';\nimport * as React from 'react';\nimport { Theme, type ThemeType } from '@ntg/ui/dist/theme';\nimport clsx from 'clsx';\n\ntype DefaultProps = {|\n +theme?: ThemeType,\n|};\n\nexport type DebugPictoPropType = {|\n ...DefaultProps,\n +isEnabled: boolean,\n|};\n\ntype DebugPictoStateType = {|\n +className: string,\n|};\n\nconst InitialState: $ReadOnly<DebugPictoStateType> = Object.freeze({\n className: 'hidden',\n});\n\nclass DebugPicto extends React.PureComponent<DebugPictoPropType, DebugPictoStateType> {\n static defaultProps: DefaultProps = {\n theme: Theme.Dark,\n };\n\n constructor(props: DebugPictoPropType) {\n super(props);\n\n this.state = { ...InitialState };\n }\n\n componentDidMount() {\n const { isEnabled } = this.props;\n\n this.updateClassName(null, isEnabled);\n }\n\n componentDidUpdate(prevProps: DebugPictoPropType) {\n const { isEnabled } = this.props;\n const { isEnabled: prevIsEnabled } = prevProps;\n\n if (isEnabled !== prevIsEnabled) {\n this.updateClassName(prevIsEnabled, isEnabled);\n }\n }\n\n updateClassName = (prevIsEnabled: ?boolean, isEnabled: boolean): void => {\n let className = '';\n\n if (prevIsEnabled === null) {\n className = isEnabled ? 'visible' : 'hidden';\n } else {\n className = isEnabled ? 'appearing' : 'disappearing';\n }\n\n this.setState({ className });\n };\n\n render(): React.Node {\n const { theme = Theme.Dark } = this.props;\n const { className } = this.state;\n\n return (\n <svg className={clsx('debugPicto', theme, className)} viewBox='0 0 16 16' xmlns='http://www.w3.org/2000/svg'>\n <path d='M8,2.5C6.6,2.5,5.5,3.6,5.5,5h5C10.5,3.6,9.4,2.5,8,2.5z M13,8.5h-1V7.4l0.7-0.7c0.4-0.4,0.4-1,0-1.4 s-1-0.4-1.4,0L10.6,6H5.4L4.7,5.3c-0.4-0.4-1-0.4-1.4,0s-0.4,1,0,1.4L4,7.4v1.1H3c-0.6,0-1,0.4-1,1c0,0.6,0.4,1,1,1h1.1 c0,0.3,0.1,0.6,0.2,0.8l-1,1c-0.4,0.4-0.4,1,0,1.4s1,0.4,1.4,0L5.4,13C6.1,13.6,7,14,8,14s1.9-0.4,2.6-1l0.7,0.7 c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3c0.4-0.4,0.4-1,0-1.4l-1-1c0.1-0.3,0.2-0.5,0.2-0.8H13c0.6,0,1-0.4,1-1 C14,8.9,13.6,8.5,13,8.5z' />\n </svg>\n );\n }\n}\n\nexport default (DebugPicto: React.ComponentType<DebugPictoPropType>);\n","/* @flow */\n\nimport * as React from 'react';\nimport Picto, { type PictoPropType } from './Picto';\n\n/* eslint-disable react/jsx-props-no-spreading, react/no-multi-comp */\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoAndroid = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M147.79,36.85a52.68,52.68,0,0,0-20.54-18.54l8.48-15.63c.6-1.19.38-2-.67-2.46s-1.71-.22-2,.67l-8.93,15.64a58.59,58.59,0,0,0-23.9-4.92,61.78,61.78,0,0,0-24.34,4.92L67,.89c-.3-.89-1-1.11-2-.67s-1.27,1.27-.67,2.46l8.48,15.63A54.41,54.41,0,0,0,52,36.85a45.7,45.7,0,0,0-7.81,25.69H155.39A46.6,46.6,0,0,0,147.79,36.85ZM78.11,41.09a4.86,4.86,0,0,1-6.7,0A4.28,4.28,0,0,1,70.07,38a5.08,5.08,0,0,1,1.34-3.35,4.36,4.36,0,0,1,6.7,0A5,5,0,0,1,79.45,38,4.24,4.24,0,0,1,78.11,41.09Zm50.48,0a4.28,4.28,0,0,1-3.13,1.34,5,5,0,0,1-3.35-1.34A4,4,0,0,1,120.55,38a5.42,5.42,0,0,1,4.91-4.92,4,4,0,0,1,3.13,1.57A5.08,5.08,0,0,1,129.93,38,4.28,4.28,0,0,1,128.59,41.09Z' />\n <path d='M36.35,68.34a12.62,12.62,0,0,0-8.94-3.57,13.4,13.4,0,0,0-9.15,3.57,11,11,0,0,0-4,8.49v51.81a11.47,11.47,0,0,0,4,8.94,13.67,13.67,0,0,0,9.38,3.57,12.22,12.22,0,0,0,12.51-12.51V76.83A11.27,11.27,0,0,0,36.35,68.34Z' />\n <path d='M44.61,67v80a12.64,12.64,0,0,0,4,9.6,13.25,13.25,0,0,0,9.38,3.8H67V187.6q0,8,6.25,11a13.28,13.28,0,0,0,12.28-.22q6-3.14,6-10.73V160.36h17V187.6q0,8,6,11a13.75,13.75,0,0,0,12.28,0q6.26-2.91,6.25-11V160.36H142a13.25,13.25,0,0,0,9.38-3.8,12.64,12.64,0,0,0,4-9.6V67Z' />\n <path d='M181.74,68.34a13.67,13.67,0,0,0-9.38-3.57,12.36,12.36,0,0,0-8.71,3.57,11.77,11.77,0,0,0-3.8,8.94v51.36a11.78,11.78,0,0,0,3.8,8.94,12.62,12.62,0,0,0,8.94,3.57,13.4,13.4,0,0,0,9.15-3.57,11.47,11.47,0,0,0,4-8.94V76.83A11,11,0,0,0,181.74,68.34Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoApple = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M137.05,0q-19.19,4.47-29,17.19T97.77,49.11a56.81,56.81,0,0,0,12.5-1.79q7.59-2.67,14.73-10.49A52,52,0,0,0,135.71,19Q139.28,8.93,137.05,0Z' />\n <path d='M165.4,131.7a47.55,47.55,0,0,1-8.7-24.56,42.07,42.07,0,0,1,8-27.68q4-6.24,13.4-13.84-8-9.81-16.52-14.73a42.45,42.45,0,0,0-21.43-5.35q-8.93,0-24.11,4.91c-6.84,2.08-11.61,3.12-14.28,3.12s-7.45-.89-14.29-2.68q-15.63-4.45-24.11-4.46-21.87,0-35.26,19.19Q16.07,83.49,16.07,108.48q0,17.86,8,39.51t19.64,35.94Q57.15,200,69.64,200q5.35,0,15.18-3.57Q96,192,102.68,192t18.08,3.8q11.38,3.8,17.63,3.79,13.85,0,28.13-19.64A114.71,114.71,0,0,0,183.93,146Q173.22,142.86,165.4,131.7Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoArrowDown = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M92.23,158.47l-89-89a11,11,0,0,1,0-15.54L13.6,43.53a11,11,0,0,1,15.53,0L100,114.06l70.87-70.55a11,11,0,0,1,15.53,0l10.38,10.38a11,11,0,0,1,0,15.55l-89,89a11,11,0,0,1-15.54,0Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoArrowLeft = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M42.53,92.23l89-89a11,11,0,0,1,15.55,0L157.47,13.6a11,11,0,0,1,0,15.53L87,100l70.54,70.87a11,11,0,0,1,0,15.53l-10.38,10.38a11,11,0,0,1-15.55,0l-89-89a11,11,0,0,1,0-15.54Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoArrowLeftWithShaft = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M4.18550142,89.6627044 C-1.39516714,95.243373 -1.39516714,104.306379 4.18550142,109.887047 L75.618059,181.319605 C81.1987276,186.900273 90.2617334,186.900273 95.8424019,181.319605 C101.42307,175.738936 101.42307,166.675931 95.8424019,161.095262 L48.7415592,114.039065 L185.713488,114.039065 C193.615715,114.039065 200,107.65478 200,99.7525532 C200,91.8503265 193.615715,85.4660416 185.713488,85.4660416 L48.7862046,85.4660416 L95.7977566,38.4098443 C101.378425,32.8291757 101.378425,23.76617 95.7977566,18.1855014 C90.217088,12.6048329 81.1540823,12.6048329 75.5734137,18.1855014 L4.14085607,89.618059 L4.18550142,89.6627044 Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoArrowRight = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M157.47,107.77l-89,89a11,11,0,0,1-15.54,0L42.53,186.4a11,11,0,0,1,0-15.53L113.06,100,42.51,29.13a11,11,0,0,1,0-15.53L52.91,3.22a11,11,0,0,1,15.55,0l89,89a11,11,0,0,1,0,15.54Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoArrowUp = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M107.77,43.53l89,89a11,11,0,0,1,0,15.55L186.4,158.47a11,11,0,0,1-15.53,0L100,88,29.13,158.49a11,11,0,0,1-15.53,0L3.22,148.09a11,11,0,0,1,0-15.55l89-89a11,11,0,0,1,15.54,0Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoBack = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M198.74,104.47c-4.55-26.55-29.33-48.29-55.61-48.4C106.92,55.91,85.72,56,49.51,56H40A142,142,0,0,1,53.87,44.64c5.28-4,6.49-9.55,3.12-14.27S47.59,25,42.22,29Q23.49,43,4.81,57c-6.9,5.21-6.88,12.16.05,17.39q18.53,14,37.13,27.86c5.45,4.08,11.27,3.67,14.84-1s2.36-10.41-3.06-14.52c-4.61-3.5-9.23-7-14.69-11.08,2.17-.13,3.29-.26,4.42-.26q14.28,0,28.58,0c27.51,0,40-.13,67.53,0,26.74.17,45.53,23.78,39.44,49.23a39.44,39.44,0,0,1-37.89,30.11c-19.17.2-23.34,0-42.52.1a19.32,19.32,0,0,0-6.3.87,9.47,9.47,0,0,0-5.91,10.31,9.68,9.68,0,0,0,10,8.37c20.49,0,26,0,46.45,0a46.77,46.77,0,0,0,8.49-1C183.64,167.09,204.32,137,198.74,104.47Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoBackToLive = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M48.68,95.75a3.09,3.09,0,0,1,3.12-3.29A3.17,3.17,0,0,1,55,95.86v.23c-.16,3.57-.33,15.35-.33,23.11,0,3.18.06,5.69.11,6.64.22,2.68,1.45,2.68,9,2.68,3.24,0,6.82-.05,7.87-.11H72a2.92,2.92,0,0,1,3,3c0,1.51-1.11,3.07-3.52,3.18-.72.06-4,.11-7.31.11s-6.53,0-7.26-.11c-5.14-.39-8.2-2.23-8.37-7.14,0-1.17,0-3,0-5,0-7.65.22-19.87.22-25.4V95.75Z' />\n <path d='M85.44,131.76a3.38,3.38,0,0,1-6.7,0v-.06c.11-6.69.28-14.18.28-21.37,0-5.31-.11-10.39-.28-14.91-.12-2.34,2.4-3,3.41-3,1.62,0,3.29.89,3.29,2.74v.11c-.11,4.63-.17,9.88-.17,15.29,0,7,.06,14.24.17,21.1Z' />\n <path d='M106.3,134.83c-2.07,0-4.18-1.45-5.25-4.07-2.79-7.1-11.66-32.55-11.66-35.11a3.26,3.26,0,0,1,3.35-3.36A3.33,3.33,0,0,1,96,94.92c1,4,6.81,23.39,9.16,30.31.22.67.44,1.06.72,1.06s.51-.33.78-1.23c1.56-4.69,7.26-23.22,9.72-30.53a3.09,3.09,0,0,1,3.07-2.24,3.42,3.42,0,0,1,3.57,3.18,3.89,3.89,0,0,1-.17,1.07c-3.29,9.71-9.71,27.46-11.83,34.27C110.15,133.55,108.25,134.83,106.3,134.83Z' />\n <path d='M140,98.05c-5.59,0-6.76.11-6.92,2.51-.11,1.34-.06,4.07-.11,7.31,0,1.11.05,1.11,6.92,1.11,2.56,0,5.25,0,6.25,0a2.81,2.81,0,0,1,3.13,3,3,3,0,0,1-3,3.18H146c-1.39-.11-3.52-.17-5.64-.17-6.92,0-7.48.06-7.48,1.23,0,8.32.06,9.6.17,10.55.28,2.57,1.17,2.68,9,2.68,3.3,0,6.87-.06,7.93-.11h.27a2.82,2.82,0,0,1,3,2.85c0,1.5-1.11,3-3.51,3.12-.73.06-4,.11-7.2.11s-6.43-.05-7.15-.11c-5.13-.39-8.32-2.23-8.54-7.14-.11-2.35-.11-6.48-.11-11,0-6.81,0-14.4.16-17.92.12-4.47,3-6.81,7.54-7,1-.06,4.19-.11,7.31-.11s6.25,0,7.09.11a3,3,0,0,1,3.13,3,3.08,3.08,0,0,1-3.3,3S143.78,98.05,140,98.05Z' />\n <path d='M186.64,90.14c-.55-2.37-3-4.15-4.1-4.81-1.24-.76-3.28-1-6.18-.35a9.06,9.06,0,0,0-4.21,3.59,8.94,8.94,0,0,0-.68,6.24c.52,2.26.93,4.42,1.32,7a93.47,93.47,0,0,1-.1,18.83,93.8,93.8,0,0,1-4.86,18.21,93.62,93.62,0,0,1-9.68,16.75c-2,2.41-4.11,4.78-6.38,7a89.22,89.22,0,0,1-7.62,6.81,93,93,0,0,1-16.84,9.5,93.23,93.23,0,0,1-18.23,4.69,92.73,92.73,0,0,1-18.83-.08,93.85,93.85,0,0,1-18.2-4.87,92.62,92.62,0,0,1-16.75-9.66,95.58,95.58,0,0,1-13.9-14,93.9,93.9,0,0,1-9.49-16.84A94.07,94.07,0,0,1,27.22,120a93.44,93.44,0,0,1,.09-18.83A92.62,92.62,0,0,1,32.17,83a93.19,93.19,0,0,1,9.67-16.75c2-2.44,4.14-4.82,6.38-7.07a90.74,90.74,0,0,1,7.62-6.8,92.87,92.87,0,0,1,16.85-9.51,91.46,91.46,0,0,1,11.45-3.42,11.06,11.06,0,0,1,9.17,2.09A10.7,10.7,0,0,1,97.37,50c0,3.57,0,7.13,0,10.7a2.72,2.72,0,0,0,4.27,2.23q14.16-9.72,28.27-19.51l7-4.86c1.42-1,2.82-2,4.24-3l2.26-1.62a2.74,2.74,0,0,0,0-4.48q-4.86-3.33-9.68-6.73L118.48,12.08Q110.1,6.26,101.7.48a2.73,2.73,0,0,0-4.28,2.24l0,9.31A10.83,10.83,0,0,1,88,22.73c-2.16.29-4.35.63-6.49,1.06C66.33,26.8,51.23,34.68,39,46c-.65.62-1.32,1.26-2,1.92a97.07,97.07,0,0,0-12,15,91.06,91.06,0,0,0-9,18.68A72,72,0,0,0,12.1,97.2,88.94,88.94,0,0,0,15,137.52a91.69,91.69,0,0,0,8.42,18.91,92.41,92.41,0,0,0,29.83,30.32A88.57,88.57,0,0,0,92,199.55a70.72,70.72,0,0,0,15.93,0A88.42,88.42,0,0,0,162.91,174l.86-.88a89.59,89.59,0,0,0,22.32-39.24A91.29,91.29,0,0,0,186.64,90.14Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoBigPlay = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M22.21,99c0-25.56-.26-51.13.12-76.69C22.5,10.5,25.76,3.45,37.6,0,44.75-2,50.61,1.16,56,4.85Q100.1,35,143.94,65.5c8.7,6,17.17,12.41,26,18.22,10.6,7,10.59,24.37-.18,31.59-17.11,11.47-33.87,23.46-50.8,35.18-21.21,14.69-42.37,29.46-63.7,44-11.83,8-23.94,6.16-29.94-4.84-2.1-3.86-2.92-8.85-3-13.34-.27-25.75-.13-51.51-.13-77.27Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoBurger = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M16.5,54.45C9.87,54.45.36,48.11.36,38.6c0-8.36,9.51-15.27,16.14-15.27H184.22c7.21,0,16.14,6.91,16.14,15.27,0,9.51-8.93,15.85-16.14,15.85ZM184.22,84.14c7.21,0,16.14,6.91,16.14,15.27,0,9.51-8.93,15.85-16.14,15.85H16.5C9.87,115.26.36,108.92.36,99.41c0-8.36,9.51-15.27,16.14-15.27Zm0,60.8c7.21,0,16.14,6.92,16.14,15.28,0,9.51-8.93,15.85-16.14,15.85H16.5c-6.63,0-16.14-6.34-16.14-15.85,0-8.36,9.51-15.28,16.14-15.28Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoBuy = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M73.62,111.13l2.09,11.11h93.42a7.59,7.59,0,0,1,6.25,3.13,8.37,8.37,0,0,1,1.73,6.94L175,141a19.36,19.36,0,0,1-8.33,36.81,18.43,18.43,0,0,1-13.55-5.56,19.89,19.89,0,0,1-5.9-13.72,17.58,17.58,0,0,1,5.9-14.06H80.22a18.26,18.26,0,0,1,5.91,13.89,18.59,18.59,0,0,1-6.08,14.07,19.07,19.07,0,0,1-14.41,5.38A19.7,19.7,0,0,1,47.23,159.4,18.33,18.33,0,0,1,49.66,149,21.08,21.08,0,0,1,57,141.34L32.64,22.23H8.33a8,8,0,0,1-5.9-2.43A8.06,8.06,0,0,1,0,13.89V8.33a8,8,0,0,1,2.43-5.9A8,8,0,0,1,8.33,0H44.1a7.61,7.61,0,0,1,5,1.91,8.77,8.77,0,0,1,3,4.69l3.13,15.63H191.7a7.92,7.92,0,0,1,6.6,3.12,7.55,7.55,0,0,1,1.39,6.95l-16.32,72.23a8.13,8.13,0,0,1-8,6.6Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoCart = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M73.62,111.13l2.09,11.11h93.42a7.59,7.59,0,0,1,6.25,3.13,8.37,8.37,0,0,1,1.73,6.94L175,141a19.36,19.36,0,0,1-8.33,36.81,18.43,18.43,0,0,1-13.55-5.56,19.89,19.89,0,0,1-5.9-13.72,17.58,17.58,0,0,1,5.9-14.06H80.22a18.26,18.26,0,0,1,5.91,13.89,18.59,18.59,0,0,1-6.08,14.07,19.07,19.07,0,0,1-14.41,5.38A19.7,19.7,0,0,1,47.23,159.4,18.33,18.33,0,0,1,49.66,149,21.08,21.08,0,0,1,57,141.34L32.64,22.23H8.33a8,8,0,0,1-5.9-2.43A8.06,8.06,0,0,1,0,13.89V8.33a8,8,0,0,1,2.43-5.9A8,8,0,0,1,8.33,0H44.1a7.61,7.61,0,0,1,5,1.91,8.77,8.77,0,0,1,3,4.69l3.13,15.63H191.7a7.92,7.92,0,0,1,6.6,3.12,7.55,7.55,0,0,1,1.39,6.95l-16.32,72.23a8.13,8.13,0,0,1-8,6.6Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoCheck = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M67.93,171.64l-65-65a10,10,0,0,1,0-14.14L17.07,78.36a10,10,0,0,1,14.14,0L75,122.14l93.79-93.78a10,10,0,0,1,14.14,0L197.07,42.5a10,10,0,0,1,0,14.14l-115,115a10,10,0,0,1-14.14,0Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoClock = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M102.3,1.26a98.87,98.87,0,0,0-101,98.79c-.25,54.68,44.26,99.1,98.88,99.1,54.11.62,99.14-44.27,99.12-98.56A99,99,0,0,0,102.3,1.26ZM111.78,109a7.56,7.56,0,0,1-7.57,7.56H72.94a7.57,7.57,0,0,1,0-15.13H96.65v-52a7.57,7.57,0,1,1,15.13,0Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoClockEmpty = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M102.07.06A99.87,99.87,0,0,0,0,99.85C-.25,155.08,44.71,200,99.88,200,154.54,200.57,200,155.23,200,100.4A100,100,0,0,0,102.07.06Zm-2,182.33c-45.66,0-82.84-36.9-82.45-82.57s36.7-82.79,84-82.17c44.67.59,81,36.9,80.86,83.18C182.28,145.86,145.47,182.39,100,182.39Z' />\n <path d='M104,116.51H72.42a7.65,7.65,0,0,1,0-15.29H96.36V48.71a7.65,7.65,0,0,1,15.29,0v60.15A7.65,7.65,0,0,1,104,116.51Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoCog = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M197.82,80.32a9.79,9.79,0,0,0-5.94-3.59l-.13,0-19.21-2.94c-.79-2.13-1.71-4.32-2.75-6.54,1.35-1.76,2.94-3.76,4.52-5.74l.05-.07c3-3.92,5.12-6.62,6.4-8.41a10.38,10.38,0,0,0,2-6,9.17,9.17,0,0,0-2.07-6.16C177.38,36.2,170.36,29,159.83,19.29l-.1-.09a9.93,9.93,0,0,0-6.7-2.59,9.48,9.48,0,0,0-6.51,2.4L132,30c-1.7-.77-3.53-1.51-5.49-2.24L123.56,8.57A9.75,9.75,0,0,0,113.66,0H86.34a9.64,9.64,0,0,0-9.75,7.53c-1,3.65-2,9.63-3.3,20.24-1.84.69-3.67,1.45-5.47,2.29L53.55,19A10.41,10.41,0,0,0,47,16.61c-3.66,0-7.58,2.63-15.54,10.43C25.19,33.16,21,37.71,18.73,41l-.09.12a10.56,10.56,0,0,0-2,5.89,10,10,0,0,0,2.54,6.53c4,4.82,7.68,9.48,10.91,13.88a63.67,63.67,0,0,0-2.52,5.9L8,76.22l-.25,0A9.49,9.49,0,0,0,2,80,10.36,10.36,0,0,0,0,86.1v27.31a10.2,10.2,0,0,0,2.18,6.27,9.74,9.74,0,0,0,5.94,3.59l.15,0,19.1,2.82a62.64,62.64,0,0,0,2.8,6.71c-1,1.28-2.11,2.76-3.41,4.43l-1.09,1.42c-3.05,3.81-5.15,6.53-6.44,8.33a10.36,10.36,0,0,0-2,6,10,10,0,0,0,1.89,6l0,0c3.45,4.77,10.32,11.79,21,21.45A9.8,9.8,0,0,0,47,183.39a10,10,0,0,0,6.52-2.31L68,170c1.7.77,3.52,1.51,5.48,2.23l2.92,19.16a9.75,9.75,0,0,0,9.9,8.57h27.32a9.63,9.63,0,0,0,9.75-7.53c1-3.66,2-9.64,3.3-20.24,1.84-.68,3.66-1.45,5.46-2.28l14.26,11.16.34.25a11.34,11.34,0,0,0,6.26,2c3.66,0,7.55-2.6,15.42-10.31,6-5.91,10.18-10.42,12.63-13.77a9.86,9.86,0,0,0-.15-12.83c-4.91-6-8.49-10.59-11-14q1.23-2.66,2.42-5.69l19.56-3,.19,0a9.62,9.62,0,0,0,5.85-3.71A10.27,10.27,0,0,0,200,113.9V86.59A10.14,10.14,0,0,0,197.82,80.32Zm-98,63.61a43.66,43.66,0,1,1,43.66-43.66A43.66,43.66,0,0,1,99.81,143.93Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoCompress = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M194.64,71.43H139.29a10.7,10.7,0,0,1-10.72-10.72V5.36A5.37,5.37,0,0,1,133.93,0h17.86a5.37,5.37,0,0,1,5.35,5.36v37.5h37.5A5.37,5.37,0,0,1,200,48.21V66.07A5.37,5.37,0,0,1,194.64,71.43ZM71.43,60.71V5.36A5.37,5.37,0,0,0,66.07,0H48.21a5.37,5.37,0,0,0-5.35,5.36v37.5H5.36A5.37,5.37,0,0,0,0,48.21V66.07a5.37,5.37,0,0,0,5.36,5.36H60.71A10.7,10.7,0,0,0,71.43,60.71Zm0,133.93V139.29a10.7,10.7,0,0,0-10.72-10.72H5.36A5.37,5.37,0,0,0,0,133.93v17.86a5.37,5.37,0,0,0,5.36,5.35h37.5v37.5A5.37,5.37,0,0,0,48.21,200H66.07A5.37,5.37,0,0,0,71.43,194.64Zm85.71,0v-37.5h37.5a5.37,5.37,0,0,0,5.36-5.35V133.93a5.37,5.37,0,0,0-5.36-5.36H139.29a10.7,10.7,0,0,0-10.72,10.72v55.35a5.37,5.37,0,0,0,5.36,5.36h17.86A5.37,5.37,0,0,0,157.14,194.64Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoDot = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <circle cx='100' cy='100' r='70' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoDownload = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path\n d='M 5.256094 15.999844 C 3.889687 15.029063 3 13.442344 3 11.649375 C 3 9.200156 4.8 6.9375 7.5 6.500156 C 8.347031 4.486406 10.351406 3 12.689531 3 C 15.683906 3 18.131719 5.322656 18.3 8.25 C 19.889531 8.944687 21 10.650469 21 12.496875 C 21 14.058281 20.205938 15.434062 18.999844 16.241719 M 12 21 L 12 11.000156 M 12 21 L 9 18 M 12 21 L 15 18 '\n style={{ fill: 'none', stroke: '#fff', strokeLinecap: 'round', strokeLinejoin: 'round', strokeMiterlimit: '4', strokeWidth: '2' }}\n transform='matrix(8.4,0,0,8.4,0,0)'\n />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoExpand = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M0,66.07V10.71A10.69,10.69,0,0,1,10.71,0H66.07a5.37,5.37,0,0,1,5.36,5.36V23.21a5.37,5.37,0,0,1-5.36,5.36H28.57v37.5a5.37,5.37,0,0,1-5.36,5.36H5.36A5.37,5.37,0,0,1,0,66.07ZM128.57,5.36V23.21a5.37,5.37,0,0,0,5.36,5.36h37.5v37.5a5.37,5.37,0,0,0,5.36,5.36h17.85A5.37,5.37,0,0,0,200,66.07V10.71A10.69,10.69,0,0,0,189.29,0H133.93A5.37,5.37,0,0,0,128.57,5.36Zm66.07,123.21H176.79a5.37,5.37,0,0,0-5.36,5.36v37.5h-37.5a5.37,5.37,0,0,0-5.36,5.36v17.85a5.37,5.37,0,0,0,5.36,5.36h55.36A10.69,10.69,0,0,0,200,189.29V133.93A5.37,5.37,0,0,0,194.64,128.57ZM71.43,194.64V176.79a5.37,5.37,0,0,0-5.36-5.36H28.57v-37.5a5.37,5.37,0,0,0-5.36-5.36H5.36A5.37,5.37,0,0,0,0,133.93v55.36A10.69,10.69,0,0,0,10.71,200H66.07A5.37,5.37,0,0,0,71.43,194.64Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoExternal = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M249.23-200.56a83.34,83.34,0,0,0,83.34-83.34,83.33,83.33,0,0,0-83.34-83.33A83.33,83.33,0,0,0,165.9-283.9,83.33,83.33,0,0,0,249.23-200.56Zm0,16.66a100,100,0,0,1-100-100,100,100,0,0,1,100-100,100,100,0,0,1,100,100A100,100,0,0,1,249.23-183.9Z' />\n <path d='M1101.48,93.67c-35.36-1-62.91-14.61-83.59-41.41a3.23,3.23,0,0,1-.48-3.76c14-31.1,38.09-49.65,72.62-54.12,39.68-5.13,78.73,18,93.36,54.47A2.85,2.85,0,0,1,1183,52c-17,22.32-39.37,36-67.59,40.34-4.93.76-10,1-13.9,1.32' />\n <path d='M1142-64.6a41.72,41.72,0,0,1-41.9,41.6,41.77,41.77,0,0,1-41.44-42.07c.11-22.72,19-41.34,41.91-41.26A41.8,41.8,0,0,1,1142-64.6' />\n <path d='M1101.48,93.67c-35.36-1-62.91-14.61-83.59-41.41a3.23,3.23,0,0,1-.48-3.76c14-31.1,38.09-49.65,72.62-54.12,39.68-5.13,78.73,18,93.36,54.47A2.85,2.85,0,0,1,1183,52c-17,22.32-39.37,36-67.59,40.34-4.93.76-10,1-13.9,1.32' />\n <path d='M1142-64.6a41.72,41.72,0,0,1-41.9,41.6,41.77,41.77,0,0,1-41.44-42.07c.11-22.72,19-41.34,41.91-41.26A41.8,41.8,0,0,1,1142-64.6' />\n <path d='M178.84,200H21.16A21.18,21.18,0,0,1,0,178.84V21.15A21.18,21.18,0,0,1,21.16,0h56.1V20.81H21.16l-.35,158,158,.35.35-56.44H200v56.09A21.18,21.18,0,0,1,178.84,200Z' />\n <path d='M70,145.75,53.28,129.08a7.08,7.08,0,0,1,0-10L127,45.42,99,17.5a7.08,7.08,0,0,1,5-12.08h82.49a7.07,7.07,0,0,1,7.07,7.09V95a7.07,7.07,0,0,1-12.08,5L153.62,72.08,79.94,145.75a7.06,7.06,0,0,1-10,0' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoEye = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M99.23,36.37c20.63,0,37.86,6.11,54.08,15.51A175.85,175.85,0,0,1,198.6,90c2.8,3.26,3.06,6.39.35,9.53-21,24.34-45.51,43.66-77.37,51.69-17.91,4.52-35.61,3-52.89-3.45-26.34-9.87-47.36-27.06-65.64-48-3-3.44-3-6.59.52-10.21C11.11,81.87,18.59,74,26.76,67A132,132,0,0,1,72.13,41.15C81.46,38.13,91,36.22,99.23,36.37ZM57.29,95a43.65,43.65,0,1,0,43.77-43.7A43.78,43.78,0,0,0,57.29,95Z' />\n <path d='M101,71.29A23.74,23.74,0,1,1,77.23,94.72,23.85,23.85,0,0,1,101,71.29Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoFacebook = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M78.52,110.55H48.44V75H78.52V46.88q0-22.27,12.5-34.58T124.22,0a193.69,193.69,0,0,1,27.34,1.56V33.2H132.81q-10.55,0-14.45,4.69-3.12,3.9-3.13,12.5V75h33.21l-4.69,35.55H115.23V200H78.52Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoFailure = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M99,13.15.42,186.79a.5.5,0,0,0,.43.75l198.29.84a.51.51,0,0,0,.44-.75L100.76,13.15A1,1,0,0,0,99,13.15Z' />\n <path d='M91.39,141a5.37,5.37,0,0,1,3.15-2.73,22,22,0,0,1,6.59-.72c3,0,5.16.66,6.5,2s2,3.37,2,6.18v1.65a31.58,31.58,0,0,1-.16,3.66,9.23,9.23,0,0,1-1,2.84q-1.65,3-7.88,3t-8.25-2q-2-2-2-7.78A13.79,13.79,0,0,1,91.39,141Zm13.81-12a21.55,21.55,0,0,1-5.25.51,21.7,21.7,0,0,1-5.26-.51A4.18,4.18,0,0,1,92,127.1a7.21,7.21,0,0,1-.93-2.37,24.31,24.31,0,0,1-.15-3.19V88.87A25.93,25.93,0,0,1,91,85.62a6.68,6.68,0,0,1,1-2.42,4.57,4.57,0,0,1,2.79-1.9,19.38,19.38,0,0,1,5.25-.57,19.51,19.51,0,0,1,5.26.57,4.31,4.31,0,0,1,2.73,2,7.76,7.76,0,0,1,.93,2.48,25.64,25.64,0,0,1,.15,3.24v32.67a24.6,24.6,0,0,1-.15,3.2,6.2,6.2,0,0,1-1,2.31A4.43,4.43,0,0,1,105.2,129Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoForward10 = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M187.61,88.87c-.21-1-1.39-2.23-3-3.26a3.69,3.69,0,0,0-1.73-.31,11.5,11.5,0,0,0-2.54.32,1,1,0,0,0-.57.39l0,0a12.6,12.6,0,0,0-1.11,1,5.15,5.15,0,0,0-.86,1.09,6.43,6.43,0,0,0-.4,4.43c.58,2.54,1,4.88,1.41,7.53a102.56,102.56,0,0,1-.06,20.35,102,102,0,0,1-5.24,19.7A102.44,102.44,0,0,1,163,158.2a99.63,99.63,0,0,1-15.13,15,101.34,101.34,0,0,1-18.19,10.31A101.23,101.23,0,0,1,110,188.65a98.56,98.56,0,0,1-20.39-.05,102,102,0,0,1-19.7-5.23,100.36,100.36,0,0,1-18.14-10.43,102,102,0,0,1-15.06-15.12A100.88,100.88,0,0,1,26.38,139.6a101.37,101.37,0,0,1-5.12-19.72,102.74,102.74,0,0,1,0-20.37,101.43,101.43,0,0,1,5.23-19.72A102.17,102.17,0,0,1,37,61.65a97.14,97.14,0,0,1,7-7.78A98.18,98.18,0,0,1,52.1,46.6,101.9,101.9,0,0,1,70.3,36.28a122.9,122.9,0,0,1,12.52-3.75A86.24,86.24,0,0,1,94.67,31V51.47a3.45,3.45,0,0,0,5.89,2.31l24-24a3.36,3.36,0,0,0,0-4.84l-24-24c-1.89-2.21-5.89-.42-5.89,2.42V20.17c-3.43.22-6.82.56-6.82.56-2.34.31-4.55.67-6.58,1.07-15.34,3-30.61,11-43,22.5-.64.6-1.32,1.25-2,1.93A99.05,99.05,0,0,0,24.08,61.41,92.87,92.87,0,0,0,15,80.32,73.38,73.38,0,0,0,11.11,96c-.81,6.16-1.55,13.41-.89,20.51a89.18,89.18,0,0,0,12.3,39.43,93.65,93.65,0,0,0,30.22,30.69,92.34,92.34,0,0,0,19,8.83A93.49,93.49,0,0,0,92,199.55a71.07,71.07,0,0,0,16,0,89.4,89.4,0,0,0,55.62-25.85l.88-.89a90.67,90.67,0,0,0,22.58-39.68A92.43,92.43,0,0,0,187.61,88.87Z' />\n <path d='M73.83,147c4,0,6.6-2.47,6.6-6.13V80.79c0-6.76-1.66-11-9.94-11l-12.79.28A6.45,6.45,0,0,0,58,83l9-.28h.25c0,.15,0,.36,0,.65v57.55C67.33,144.61,69.88,147,73.83,147Z' />\n <path d='M96.93,107.9c0,33,15.59,39.91,28.68,39.91,18.45,0,28.6-14.11,28.6-39.73,0-32.68-15.5-39.54-28.5-39.54C107.14,68.54,96.93,82.51,96.93,107.9Zm28.78-27.1c3.78,0,15.3,0,15.3,27.19,0,27.56-11.58,27.56-15.4,27.56s-15.49,0-15.49-27.56C110.12,90,115.37,80.8,125.71,80.8Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoForward30 = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M96.93,107.9c0,33,15.59,39.91,28.68,39.91,18.45,0,28.6-14.11,28.6-39.73,0-32.68-15.5-39.54-28.5-39.54C107.14,68.54,96.93,82.51,96.93,107.9Zm28.78-27.1c3.78,0,15.3,0,15.3,27.19,0,27.56-11.58,27.56-15.4,27.56s-15.49,0-15.49-27.56C110.12,90,115.37,80.8,125.71,80.8Z' />\n <path d='M-359,859.53c-35.37-1-62.91-14.6-83.59-41.4a3.22,3.22,0,0,1-.48-3.76c14-31.1,38.09-49.66,72.61-54.13,39.68-5.13,78.74,18,93.36,54.47a2.83,2.83,0,0,1-.41,3.16c-17,22.32-39.38,36-67.59,40.34-4.94.76-10,1-13.9,1.32' />\n <path d='M187.61,88.87c-.21-1-1.39-2.23-3-3.26a3.69,3.69,0,0,0-1.73-.31,11.5,11.5,0,0,0-2.54.32,1,1,0,0,0-.57.39l0,0a12.6,12.6,0,0,0-1.11,1,5.15,5.15,0,0,0-.86,1.09,6.43,6.43,0,0,0-.4,4.43c.58,2.54,1,4.88,1.41,7.53a102.56,102.56,0,0,1-.06,20.35,102,102,0,0,1-5.24,19.7A102.44,102.44,0,0,1,163,158.2a99.63,99.63,0,0,1-15.13,15,101.34,101.34,0,0,1-18.19,10.31A101.23,101.23,0,0,1,110,188.65a98.56,98.56,0,0,1-20.39-.05,102,102,0,0,1-19.7-5.23,100.36,100.36,0,0,1-18.14-10.43,102,102,0,0,1-15.06-15.12A100.88,100.88,0,0,1,26.38,139.6a101.37,101.37,0,0,1-5.12-19.72,102.74,102.74,0,0,1,0-20.37,101.43,101.43,0,0,1,5.23-19.72A102.17,102.17,0,0,1,37,61.65a97.14,97.14,0,0,1,7-7.78A98.18,98.18,0,0,1,52.1,46.6,101.9,101.9,0,0,1,70.3,36.28a122.9,122.9,0,0,1,12.52-3.75A86.24,86.24,0,0,1,94.67,31V51.47a3.45,3.45,0,0,0,5.89,2.31l24-24a3.36,3.36,0,0,0,0-4.84l-24-24c-1.89-2.21-5.89-.42-5.89,2.42V20.17c-3.43.22-6.82.56-6.82.56-2.34.31-4.55.67-6.58,1.07-15.34,3-30.61,11-43,22.5-.64.6-1.32,1.25-2,1.93A99.05,99.05,0,0,0,24.08,61.41,92.87,92.87,0,0,0,15,80.32,73.38,73.38,0,0,0,11.11,96c-.81,6.16-1.55,13.41-.89,20.51a89.18,89.18,0,0,0,12.3,39.43,93.65,93.65,0,0,0,30.22,30.69,92.34,92.34,0,0,0,19,8.83A93.49,93.49,0,0,0,92,199.55a71.07,71.07,0,0,0,16,0,89.4,89.4,0,0,0,55.62-25.85l.88-.89a90.67,90.67,0,0,0,22.58-39.68A92.43,92.43,0,0,0,187.61,88.87Z' />\n <path d='M63.45,100.12a12.58,12.58,0,0,0,8.17-2.78,9.71,9.71,0,0,0,3.42-8,9.51,9.51,0,0,0-2.73-6.82A9.68,9.68,0,0,0,65,79.68a13.3,13.3,0,0,0-5.18.87,8.25,8.25,0,0,0-3.21,2.32,17.3,17.3,0,0,0-2.24,3.71c-.71,1.51-1.35,2.93-1.94,4.27a3.61,3.61,0,0,1-1.85,1.7,7.38,7.38,0,0,1-3.09.62,5.37,5.37,0,0,1-3.79-1.67A5.94,5.94,0,0,1,41.93,87a11.79,11.79,0,0,1,1.62-5.64,20.82,20.82,0,0,1,4.74-5.64A24,24,0,0,1,56,71.46a31.28,31.28,0,0,1,10.36-1.62,28.9,28.9,0,0,1,9.12,1.37,21.28,21.28,0,0,1,7.15,3.93,17,17,0,0,1,4.59,6,17.42,17.42,0,0,1,1.53,7.31,16.69,16.69,0,0,1-2.23,8.83,29.78,29.78,0,0,1-6.42,7.18,28.54,28.54,0,0,1,6.78,5,18.48,18.48,0,0,1,5.53,13.44,22.79,22.79,0,0,1-1.87,9.06,23.14,23.14,0,0,1-5.54,7.8,26.51,26.51,0,0,1-8.68,5.36A30.85,30.85,0,0,1,65.26,147a26.54,26.54,0,0,1-11.08-2.22,25.71,25.71,0,0,1-8.06-5.54,25.28,25.28,0,0,1-4.78-6.87,14.74,14.74,0,0,1-1.62-5.87,6.31,6.31,0,0,1,1.93-4.81,6.71,6.71,0,0,1,4.82-1.83,5.08,5.08,0,0,1,2.77.85,4.12,4.12,0,0,1,1.76,2q2.67,7.17,5.73,10.63c2.05,2.33,4.92,3.48,8.63,3.48a12.9,12.9,0,0,0,6.15-1.57,12.75,12.75,0,0,0,4.89-4.66,13.19,13.19,0,0,0,1.93-7.16q0-6-3.29-9.45t-9.17-3.42c-.69,0-1.75.07-3.19.21s-2.37.2-2.78.2a6.26,6.26,0,0,1-4.37-1.41A5.09,5.09,0,0,1,54,105.63a4.89,4.89,0,0,1,1.85-4,8.54,8.54,0,0,1,5.51-1.52Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoForward60 = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M187.61,88.87c-.22-.96-1.4-2.23-3.04-3.25-.17-.09-.68-.32-1.73-.32-.73,0-1.58,.11-2.54,.32-.24,.06-.45,.2-.58,.39h-.01c-.26,.19-.69,.51-1.11,.93-.56,.57-.83,1.02-.87,1.09-.62,1.09-.77,2.8-.39,4.43,.58,2.54,1.02,4.88,1.41,7.53,.66,6.7,.63,13.37-.07,20.35-1.07,6.68-2.78,13.14-5.23,19.7-2.81,6.34-6.24,12.3-10.43,18.16-2.26,2.78-4.55,5.32-6.99,7.75-2.54,2.54-5.14,4.86-8.14,7.28-5.65,4.03-11.61,7.41-18.19,10.31-6.34,2.35-12.82,4.03-19.73,5.11-7.16,.7-13.18,.66-20.39-.05-6.71-1.08-13.17-2.8-19.7-5.23-6.38-2.82-12.33-6.24-18.14-10.43-5.52-4.49-10.46-9.45-15.06-15.13-4.07-5.72-7.44-11.69-10.31-18.21-2.35-6.32-4.02-12.78-5.12-19.72-.66-6.75-.64-13.43,.05-20.37,1.06-6.66,2.78-13.13,5.23-19.71,2.83-6.38,6.26-12.33,10.43-18.15,2.26-2.78,4.55-5.33,7.01-7.77,2.49-2.5,5.08-4.82,8.13-7.27,5.67-4.04,11.64-7.42,18.2-10.32,4.16-1.55,8.28-2.66,12.52-3.76,2.56-.66,7.53-1.16,11.85-1.49v20.43c0,2.95,3.89,4.52,5.89,2.31l23.98-23.98c1.37-1.37,1.37-3.47,0-4.84L100.56,.99c-1.89-2.21-5.89-.42-5.89,2.42V20.17c-3.44,.23-6.83,.56-6.83,.56-2.34,.31-4.55,.67-6.58,1.08-15.34,3.04-30.61,11.02-43,22.5-.64,.6-1.31,1.25-2.01,1.93-4.22,4.24-8.31,9.34-12.17,15.18-3.29,4.99-6.18,11-9.12,18.91-1.82,4.89-3.11,10.16-3.85,15.66-.81,6.16-1.55,13.41-.89,20.51,.76,8.26,1.97,14.71,3.79,20.29,2.37,7.26,5.22,13.7,8.5,19.14,7.38,12.26,17.83,22.88,30.22,30.7,5.21,3.29,11.44,6.18,19.03,8.82,6.87,2.39,14.09,3.42,20.24,4.11,2.67,.3,5.37,.45,7.99,.45s5.31-.15,7.98-.45c6.23-.7,13.53-1.75,20.39-4.17,13.86-4.87,25.71-12.16,35.23-21.68l.88-.89c10.81-11.13,18.62-24.85,22.58-39.68,3.76-14.09,3.94-29.39,.54-44.27Z' />\n <path d='M187.61,88.87c-.22-.96-1.4-2.23-3.04-3.25-.17-.09-.68-.32-1.73-.32-.73,0-1.58,.11-2.54,.32-.24,.06-.45,.2-.58,.39h-.01c-.26,.19-.69,.51-1.11,.93-.56,.57-.83,1.02-.87,1.09-.62,1.09-.77,2.8-.39,4.43,.58,2.54,1.02,4.88,1.41,7.53,.66,6.7,.63,13.37-.07,20.35-1.07,6.68-2.78,13.14-5.23,19.7-2.81,6.34-6.24,12.3-10.43,18.16-2.26,2.78-4.55,5.32-6.99,7.75-2.54,2.54-5.14,4.86-8.14,7.28-5.65,4.03-11.61,7.41-18.19,10.31-6.34,2.35-12.82,4.03-19.73,5.11-7.16,.7-13.18,.66-20.39-.05-6.71-1.08-13.17-2.8-19.7-5.23-6.38-2.82-12.33-6.24-18.14-10.43-5.52-4.49-10.46-9.45-15.06-15.13-4.07-5.72-7.44-11.69-10.31-18.21-2.35-6.32-4.02-12.78-5.12-19.72-.66-6.75-.64-13.43,.05-20.37,1.06-6.66,2.78-13.13,5.23-19.71,2.83-6.38,6.26-12.33,10.43-18.15,2.26-2.78,4.55-5.33,7.01-7.77,2.49-2.5,5.08-4.82,8.13-7.27,5.67-4.04,11.64-7.42,18.2-10.32,4.16-1.55,8.28-2.66,12.52-3.76,2.56-.66,7.53-1.16,11.85-1.49v20.43c0,2.95,3.89,4.52,5.89,2.31l23.98-23.98c1.37-1.37,1.37-3.47,0-4.84L100.56,.99c-1.89-2.21-5.89-.42-5.89,2.42V20.17c-3.44,.23-6.83,.56-6.83,.56-2.34,.31-4.55,.67-6.58,1.08-15.34,3.04-30.61,11.02-43,22.5-.64,.6-1.31,1.25-2.01,1.93-4.22,4.24-8.31,9.34-12.17,15.18-3.29,4.99-6.18,11-9.12,18.91-1.82,4.89-3.11,10.16-3.85,15.66-.81,6.16-1.55,13.41-.89,20.51,.76,8.26,1.97,14.71,3.79,20.29,2.37,7.26,5.22,13.7,8.5,19.14,7.38,12.26,17.83,22.88,30.22,30.7,5.21,3.29,11.44,6.18,19.03,8.82,6.87,2.39,14.09,3.42,20.24,4.11,2.67,.3,5.37,.45,7.99,.45s5.31-.15,7.98-.45c6.23-.7,13.53-1.75,20.39-4.17,13.86-4.87,25.71-12.16,35.23-21.68l.88-.89c10.81-11.13,18.62-24.85,22.58-39.68,3.76-14.09,3.94-29.39,.54-44.27Z' />\n <path d='M101.34,107.9c0,32.99,15.6,39.92,28.69,39.92,18.44,0,28.59-14.11,28.59-39.73,0-32.68-15.5-39.54-28.5-39.54-18.56,0-28.78,13.98-28.78,39.36Zm28.78-27.1c3.78,0,15.31,0,15.31,27.19s-11.59,27.56-15.4,27.56-15.5,0-15.5-27.56c0-18.04,5.25-27.19,15.59-27.19Z' />\n <path d='M71.05,95.55c-7.96,0-14.55,3.2-18.94,9.1,.57-8.06,1.6-11.7,3.44-15.99,2.94-6.89,8.08-10.53,14.82-10.53s10.53,2.49,13,8.35c.86,1.83,2.47,2.83,4.53,2.83,.91,0,1.78-.22,2.59-.45,2.18-.82,3.58-2.65,3.58-4.66,0-.86-.2-1.61-.58-2.29-4.42-9.29-11.86-13.81-22.74-13.81-18.95,0-29.39,14.65-29.39,41.23,0,24.62,10.54,38.74,28.91,38.74,15.73,0,26.3-10.8,26.3-26.89s-10.02-25.63-25.52-25.63Zm14.54,25.63c0,10.18-6.12,16.76-15.6,16.76s-15.98-6.93-15.98-16.47,6.84-16.08,16.28-16.08,15.31,6.2,15.31,15.79Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoFullscreen = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='m68.27,0H13.73C6.2,0,.09,6.11.09,13.64v54.55c0,7.53,6.1,13.64,13.64,13.64s13.64-6.11,13.64-13.64V27.27h40.91c7.53,0,13.64-6.11,13.64-13.64S75.81,0,68.27,0Z' />\n <path d='m199.96,68.18V13.64c0-7.53-6.11-13.64-13.64-13.64h-54.55c-7.53,0-13.64,6.1-13.64,13.64s6.11,13.64,13.64,13.64h40.91v40.91c0,7.53,6.11,13.64,13.64,13.64s13.64-6.1,13.64-13.64Z' />\n <path d='m131.78,200h54.55c7.53,0,13.64-6.11,13.64-13.64v-54.55c0-7.53-6.1-13.64-13.64-13.64s-13.64,6.11-13.64,13.64v40.91h-40.91c-7.53,0-13.64,6.11-13.64,13.64s6.1,13.64,13.64,13.64Z' />\n <path d='m.04,131.82v54.55c0,7.53,6.11,13.64,13.64,13.64h54.55c7.53,0,13.64-6.1,13.64-13.64s-6.11-13.64-13.64-13.64H27.31v-40.91c0-7.53-6.11-13.64-13.64-13.64S.04,124.28.04,131.82Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoGem = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <polygon points='126.42 70.71 73.03 70.56 99.92 -0.23 126.42 70.71' />\n <polygon points='36.21 103.31 67.21 75.38 91.61 193.08 36.21 103.31' />\n <polygon points='132.11 75.71 163.29 103.27 107.66 192.83 132.11 75.71' />\n <polygon points='126.41 76.12 73.01 75.97 99.37 199.77 126.41 76.12' />\n <polygon points='67.8 69.97 34.51 96.83 93.14 3.2 67.8 69.97' />\n <polygon points='164.79 97.18 131.65 70.14 106.7 3.24 164.79 97.18' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoHearingImpaired = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='m148.74955,88.58571c0.01768,-36.15255 -30.94144,-61.43388 -66.34449,-54.15458c-19.9889,4.11162 -36.23386,20.31415 -40.23942,40.0874c-0.74596,3.67677 -1.85959,7.58687 -6.61465,6.98586c-4.80808,-0.60808 -8.06414,-6.12324 -6.89748,-10.74395c10.81466,-42.78841 61.25358,-68.29953 102.81169,-39.9778c19.9288,13.5793 30.30153,32.86467 30.99799,56.57983c0.55506,18.88941 -6.0101,35.90508 -19.65304,49.49852c-10.74394,10.70859 -21.45254,21.35001 -28.28284,35.20154c-2.81415,5.70253 -5.35253,11.75152 -9.2591,16.65859c-9.33688,11.73385 -24.56719,14.76365 -37.25558,8.18789c-1.87374,-0.97223 -3.65556,-2.24495 -5.20404,-3.68031c-2.2591,-2.08939 -4.07273,-4.52172 -1.76415,-7.72122c2.3192,-3.20656 5.17576,-3.77222 8.54142,-1.60858c11.1894,7.19445 24.50002,3.29848 29.9975,-9.67274c7.59394,-17.91718 18.90001,-33.24295 33.26062,-46.58891c11.07981,-10.2985 15.8985,-23.88487 15.90557,-39.05154' />\n <path d='m95.71957,40.08593c35.4384,0.95101 57.9869,39.98841 41.04548,71.09247c-0.85556,1.57323 -1.90202,3.07222 -3.06162,4.43687c-1.98687,2.34394 -4.29192,3.59192 -7.26162,1.43182c-2.96617,-2.1601 -3.22778,-4.83283 -1.40707,-7.7495c4.40151,-7.05657 6.24343,-14.65759 5.85808,-22.99042c-0.66818,-14.45253 -11.61718,-28.24396 -26.1086,-32.41214c-14.54799,-4.18233 -30.17073,1.5096 -38.49296,14.03183c-0.72828,1.08888 -1.34697,2.25555 -2.1106,3.31969c-1.98334,2.77172 -4.40859,4.71263 -7.8697,2.56314c-3.34445,-2.08233 -4.54294,-4.86465 -2.549,-8.7889c7.52324,-14.82021 25.17174,-25.38739 41.95761,-24.93486' />\n <path d='m28.41629,171.67788c-3.53889,0 -7.08132,-1.35051 -9.77879,-4.05152c-5.40203,-5.40202 -5.40203,-14.1591 0,-19.56112l30.31214,-30.31214c5.40202,-5.40202 14.1591,-5.40202 19.56112,0c5.40202,5.40202 5.40202,14.1591 0,19.56112l-30.31567,30.31214c-2.69748,2.70101 -6.23991,4.05152 -9.7788,4.05152' />\n <path d='m164.96234,35.13183c-3.53889,0 -7.08132,-1.3505 -9.7788,-4.05151c-5.40202,-5.40203 -5.40202,-14.1591 0,-19.56113l7.14849,-7.14849c5.40203,-5.39848 14.1591,-5.39848 19.55759,0.00354c5.40202,5.39849 5.40202,14.1591 0,19.55759l-7.14849,7.14849c-2.69748,2.70101 -6.2399,4.05151 -9.77879,4.05151' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoHeartEmpty = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M191.48,46.41c-7.88-15-21.84-28.31-38.86-31.88a43.41,43.41,0,0,0-8.93-.94,40.08,40.08,0,0,0-15.08,2.89C119.38,20.23,112,26.89,106,34.79a80.32,80.32,0,0,0-6.26,9.85C91.07,28.88,77.41,15,58.56,13.69c-.94-.07-1.89-.1-2.83-.1-15.86,0-30.6,9.42-40.25,21.59A72.74,72.74,0,0,0,.28,88.82c2.4,19.67,12.31,37,25.91,51.18C44,158.53,66.85,171.87,89.93,182.69q2.47,1.16,5,2.28c1.56.7,3.35,1.87,5.09,1.87h.14c1.68-.06,3.49-1.22,5-1.9q2.67-1.2,5.31-2.45c6.66-3.13,13.23-6.47,19.65-10.08a211.16,211.16,0,0,0,31.56-21.35c15.6-12.93,29-29.29,34.94-48.95A74.39,74.39,0,0,0,191.48,46.41ZM180,97.12a70.86,70.86,0,0,1-11.15,21.66,110,110,0,0,1-18.23,18.91,192.69,192.69,0,0,1-29,19.58c-5.74,3.22-12,6.42-18.55,9.51L100,168.21,97.3,167c-26.23-12.3-44.85-24.69-58.59-39a85.81,85.81,0,0,1-14.28-19.53,63.56,63.56,0,0,1-6.92-21.72A55.26,55.26,0,0,1,29.09,46,44.14,44.14,0,0,1,41.81,35a28.35,28.35,0,0,1,13.92-4c.54,0,1.07,0,1.6.06A25.6,25.6,0,0,1,72,37.21,54.3,54.3,0,0,1,84.57,53a17.36,17.36,0,0,0,15.2,9h.06A17.36,17.36,0,0,0,115,52.93a63.48,63.48,0,0,1,4.9-7.72c4.63-6.17,9.75-10.42,15.22-12.64A22.62,22.62,0,0,1,143.69,31a26.38,26.38,0,0,1,5.36.56,34.26,34.26,0,0,1,15.15,7.84,51,51,0,0,1,11.89,15.1,55.14,55.14,0,0,1,6.08,20.84A57.77,57.77,0,0,1,180,97.12Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoHeartFull = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M191.48,46.41c-7.88-15-21.84-28.31-38.86-31.88a43.41,43.41,0,0,0-8.93-.94,40.08,40.08,0,0,0-15.08,2.89C119.38,20.23,112,26.89,106,34.79a80.32,80.32,0,0,0-6.26,9.85C91.07,28.88,77.41,15,58.56,13.69c-.94-.07-1.89-.1-2.83-.1-15.86,0-30.6,9.42-40.25,21.59A72.74,72.74,0,0,0,.28,88.82c2.4,19.67,12.31,37,25.91,51.18C44,158.53,66.85,171.87,89.93,182.69q2.47,1.16,5,2.28c1.56.7,3.35,1.87,5.09,1.87h.14c1.68-.06,3.49-1.22,5-1.9q2.67-1.2,5.31-2.45c6.66-3.13,13.23-6.47,19.65-10.08a211.16,211.16,0,0,0,31.56-21.35c15.6-12.93,29-29.29,34.94-48.95A74.39,74.39,0,0,0,191.48,46.41Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoInfo = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M1156.28-278.29c-35.37-1-62.91-14.61-83.59-41.41a3.24,3.24,0,0,1-.48-3.76c14-31.1,38.09-49.66,72.62-54.12,39.67-5.14,78.73,18,93.36,54.47a2.83,2.83,0,0,1-.42,3.15c-17,22.32-39.37,36-67.59,40.35-4.93.75-10,.95-13.9,1.32' />\n <path d='M1196.82-436.56a41.72,41.72,0,0,1-41.9,41.6A41.78,41.78,0,0,1,1113.48-437c.11-22.73,19-41.35,41.91-41.26a41.8,41.8,0,0,1,41.43,41.73' />\n <path d='M1156.28-278.29c-35.37-1-62.91-14.61-83.59-41.41a3.24,3.24,0,0,1-.48-3.76c14-31.1,38.09-49.66,72.62-54.12,39.67-5.14,78.73,18,93.36,54.47a2.83,2.83,0,0,1-.42,3.15c-17,22.32-39.37,36-67.59,40.35-4.93.75-10,.95-13.9,1.32' />\n <path d='M1196.82-436.56a41.72,41.72,0,0,1-41.9,41.6A41.78,41.78,0,0,1,1113.48-437c.11-22.73,19-41.35,41.91-41.26a41.8,41.8,0,0,1,41.43,41.73' />\n <path d='M102.07.06A99.87,99.87,0,0,0,0,99.85C-.25,155.08,44.71,200,99.88,200,154.54,200.57,200,155.23,200,100.4A100,100,0,0,0,102.07.06Zm-2,182.33c-45.66,0-82.84-36.9-82.45-82.57s36.7-82.79,84-82.17c44.67.59,81,36.9,80.86,83.18C182.28,145.86,145.47,182.39,100,182.39Z' />\n <path d='M90.47,62.72a3.45,3.45,0,0,1-1-2.54v-11a3.62,3.62,0,0,1,1-2.69A3.47,3.47,0,0,1,93,45.48h13.8a3.6,3.6,0,0,1,3.76,3.74v11a3.32,3.32,0,0,1-1.14,2.54,3.7,3.7,0,0,1-2.62,1.05H93A3.47,3.47,0,0,1,90.47,62.72Zm.61,90.75a3.42,3.42,0,0,1-1-2.55V80.12a3.36,3.36,0,0,1,1-2.62,3.57,3.57,0,0,1,2.54-1h12.76A3.58,3.58,0,0,1,110,80.12v70.8a3.58,3.58,0,0,1-3.59,3.6H93.62A3.43,3.43,0,0,1,91.08,153.47Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoInstagram = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M199.55,58.93Q200,71,200,100t-.45,41.07q-1.34,27.24-16.29,42.19t-42.19,15.85Q129,200,100,200t-41.07-.89Q31.69,197.76,17,183a43.17,43.17,0,0,1-9.37-12.5A62.15,62.15,0,0,1,2.46,156.7,68.84,68.84,0,0,1,.89,141.07Q0,129,0,100T.89,58.48Q2.24,31.69,17,17,31.71,1.79,58.93.45,71,0,100,0t41.07.45q27.23,1.34,42.19,16.29T199.55,58.93Zm-21.43,100a48.14,48.14,0,0,0,2.24-9.15q.88-5.58,1.34-13.4t.44-12.72V76.34q0-4.91-.44-12.72t-1.34-13.4a48.53,48.53,0,0,0-2.24-9.15,32.22,32.22,0,0,0-19.19-19.19,48.53,48.53,0,0,0-9.15-2.24q-5.59-.88-13.4-1.34t-12.5-.44H76.34q-4.92,0-12.72.44t-13.4,1.34a48.14,48.14,0,0,0-9.15,2.24A32.2,32.2,0,0,0,21.88,41.07a48.53,48.53,0,0,0-2.24,9.15q-.9,5.6-1.34,13.4t-.44,12.5V119c0,2.84.07,6.48.22,10.94s.37,8.26.67,11.38.74,6.33,1.34,9.6a79.82,79.82,0,0,0,1.79,8q5.79,13.84,19.19,19.19a48.14,48.14,0,0,0,9.15,2.24,134.51,134.51,0,0,0,13.4,1.34q7.8.45,12.5.44h47.54q4.91,0,12.72-.44t13.4-1.34a48.53,48.53,0,0,0,9.15-2.24Q172.76,172.33,178.12,158.93ZM63.62,63.62q14.94-15,36.38-15A51.08,51.08,0,0,1,151.34,100q0,21.44-15,36.38t-36.38,15q-21.43,0-36.38-15T48.66,100Q48.66,78.57,63.62,63.62Zm12.72,60a33.41,33.41,0,0,0,47.32,0,33.41,33.41,0,0,0,0-47.32,33.41,33.41,0,0,0-47.32,0,33.41,33.41,0,0,0,0,47.32Zm85.49-85.49a11.24,11.24,0,0,1,3.35,8.26,12,12,0,0,1-3.35,8.48,10.84,10.84,0,0,1-8.26,3.57,12.19,12.19,0,0,1-12-12,10.84,10.84,0,0,1,3.57-8.26,12,12,0,0,1,8.48-3.35A11.24,11.24,0,0,1,161.83,38.17Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoLeaf = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M42.73,102.52c-2.14-1.54-5.16-1.1-6.74,.97L.95,130.31c-1.58,2.07-1.14,5,1,6.54,2.14,1.54,5.16,1.1,6.74-.97l35.04-26.82c1.58-2.08,1.14-5-1-6.54Z' />\n <path d='M198.08,84c-47.22-35.54-67.67-40.26-90.9-36.75-20.52,3.1-38.02,9.36-76.45,62.02-1.56,2.14-1.12,5.16,.99,6.74,47.22,35.54,67.66,40.27,90.9,36.76,20.52-3.1,38.02-9.36,76.45-62.02,1.56-2.14,1.12-5.16-.99-6.75Zm-76.86,59.22c-17.18,2.59-34.1,1.83-80.01-32.1,36.99-49.76,52.42-52.09,67.36-54.34,17.18-2.59,34.1-1.83,80.01,32.1-36.99,49.76-52.42,52.09-67.36,54.34Z' />\n <path d='M139.3,88.88l-98.06,13.59c-2.56,.36-4.33,2.58-3.95,4.97,.19,1.2,.88,2.21,1.85,2.87,.97,.67,2.2,.99,3.49,.81l98.06-13.59c2.56-.35,4.33-2.58,3.95-4.97-.38-2.39-2.77-4.04-5.33-3.68Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoMinus = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M186.53,112.06H13.47a11.55,11.55,0,0,1,0-23.1H186.53a11.55,11.55,0,1,1,0,23.1Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoMoreInfo = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M100.21,0a100,100,0,1,0,100,100A100.12,100.12,0,0,0,100.21,0Zm0,183.19A83.18,83.18,0,1,1,183.38,100,83.27,83.27,0,0,1,100.21,183.18Z' />\n <path d='M134.39,90.52H107.53l3.62-30.17A6.93,6.93,0,0,0,109,53.92a9.44,9.44,0,0,0-6.43-2.31,10.74,10.74,0,0,0-6.77,2.31,9.24,9.24,0,0,0-3.46,6.43L88.74,90.52H61.87a9,9,0,0,0-7.33,3.3,11.37,11.37,0,0,0-2.72,7.41,8.67,8.67,0,0,0,2,5.7,7,7,0,0,0,5.77,2.39H86.26l-3.62,30.16c-.32,2.87.3,5.07,1.9,6.6a8.51,8.51,0,0,0,6.18,2.31,11.31,11.31,0,0,0,7-2.31,9.71,9.71,0,0,0,3.7-6.6l3.62-30.16h27a8.88,8.88,0,0,0,7.33-3.39,11.62,11.62,0,0,0,2.72-7.49,8.37,8.37,0,0,0-2-5.61A7.22,7.22,0,0,0,134.39,90.52Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoNext = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M.31,99.41h0v1h0Q.33,118.7.3,137c0,13.45,0,26.9.17,40.34.05,4.47.86,9.43,3,13.27,6,10.93,18,12.8,29.78,4.81C54.42,181,75.46,166.26,96.55,151.65c14.74-10.21,29.39-20.57,44.22-30.66v56.9a21.44,21.44,0,0,0,21.37,21.37h16.32a21.44,21.44,0,0,0,21.38-21.37V21.66A21.44,21.44,0,0,0,178.46.28H162.14a21.44,21.44,0,0,0-21.37,21.38V80.75c-6.49-4.5-12.89-9.13-19.39-13.63Q77.72,36.89,33.93,6.8C28.56,3.13,22.74,0,15.63,2,3.84,5.4.61,12.42.44,24.17c-.2,13-.22,25.93-.2,38.9C.25,75.18.31,87.3.31,99.41Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoNoContent = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M2189.45-756.94c-35.37-1-62.91-14.61-83.59-41.41a3.24,3.24,0,0,1-.48-3.76c14-31.1,38.09-49.66,72.61-54.12,39.68-5.14,78.74,18,93.37,54.47a2.83,2.83,0,0,1-.42,3.15c-17,22.32-39.38,36-67.59,40.35-4.94.75-10,1-13.9,1.32' />\n <path d='M2230-915.21a41.7,41.7,0,0,1-41.89,41.6,41.78,41.78,0,0,1-41.44-42.07c.11-22.73,19-41.35,41.9-41.26A41.79,41.79,0,0,1,2230-915.21' />\n <path d='M53.41,109.57a8.22,8.22,0,1,1-8.22-8.21A8.22,8.22,0,0,1,53.41,109.57Zm63.14,0a8.21,8.21,0,1,1-8.21-8.21A8.21,8.21,0,0,1,116.55,109.57ZM76.77,39.09a67.86,67.86,0,1,0,67.85,67.85A67.93,67.93,0,0,0,76.77,39.09m0,144.62a76.77,76.77,0,1,1,76.76-76.77,76.85,76.85,0,0,1-76.76,76.77' />\n <path d='M72.44,150.81a2.81,2.81,0,0,1-.59-1.45,1.76,1.76,0,0,1,.61-1.39,2.26,2.26,0,0,1,1.52-.52,2.39,2.39,0,0,1,1.29.37,11.49,11.49,0,0,1,1.25.88h0c.48.34,1,.66,1.45,1a2.72,2.72,0,0,0,1.54.48,3.92,3.92,0,0,0,2-.5,4.46,4.46,0,0,0,1.45-1.32,6.33,6.33,0,0,0,.91-1.84,7.1,7.1,0,0,0,.32-2.11,2.44,2.44,0,0,0-.75-1.82,5.6,5.6,0,0,0-1.81-1.15,10,10,0,0,0-2.25-.62,13.61,13.61,0,0,0-2-.18,2.75,2.75,0,0,1-1.5-.82,1.8,1.8,0,0,1-.45-1.18,1.77,1.77,0,0,1,.5-1.2,2.73,2.73,0,0,1,1.54-.8c.48-.06,1-.15,1.58-.27a10.5,10.5,0,0,0,1.68-.5,5.68,5.68,0,0,0,1.47-.82,3.57,3.57,0,0,0,1-1.18c.25-1.33,0-2.25-.61-2.75a4.24,4.24,0,0,0-2.65-.75,12.61,12.61,0,0,0-2.13.2,5.61,5.61,0,0,0-1.77.55,7,7,0,0,1-.88.55,2.28,2.28,0,0,1-1,.2,2.09,2.09,0,0,1-1.5-.62,2.36,2.36,0,0,1-.63-1.79,2.91,2.91,0,0,1,1.31-1.65,8.15,8.15,0,0,1,2.18-.93,12.8,12.8,0,0,1,2.33-.41c.77-.06,1.37-.09,1.79-.09a12.25,12.25,0,0,1,3.15.39,7.68,7.68,0,0,1,2.57,1.18A5.79,5.79,0,0,1,87,130a6.42,6.42,0,0,1,.63,2.93c0,.24,0,.56,0,1a4.14,4.14,0,0,1-.3,1.31,6,6,0,0,1-.9,1.55,7.92,7.92,0,0,1-1.86,1.63,9.77,9.77,0,0,1,3,2.63,6.27,6.27,0,0,1,1.26,3.86,7.71,7.71,0,0,1-.81,3.43,11.37,11.37,0,0,1-2.11,3,10.66,10.66,0,0,1-2.9,2.12,7.36,7.36,0,0,1-3.24.79,8,8,0,0,1-4-1A19.26,19.26,0,0,1,72.44,150.81Z' />\n <path d='M195.89,32.6C192,25.12,185,18.53,176.58,16.76a20.58,20.58,0,0,0-11.92,1,26.8,26.8,0,0,0-11.21,9.09,39.8,39.8,0,0,0-3.12,4.9C146,23.89,139.23,17,129.87,16.34c-8.41-.6-16.33,4.28-21.4,10.68a36.1,36.1,0,0,0-7.55,26.64c1.19,9.77,6.12,18.39,12.87,25.42,8.84,9.2,20.19,15.83,31.66,21.2l2.46,1.14a6.45,6.45,0,0,0,2.6.92,7.43,7.43,0,0,0,2.48-.94l2.64-1.21c3.31-1.56,6.57-3.22,9.76-5a104.52,104.52,0,0,0,15.68-10.61c7.74-6.42,14.42-14.54,17.35-24.31A37,37,0,0,0,195.89,32.6Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoPause = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M83.53,86.52V21.42A21.62,21.62,0,0,0,62.07-.22H45.69A21.62,21.62,0,0,0,24.23,21.42V178.15a21.61,21.61,0,0,0,21.46,21.63H62.07a21.61,21.61,0,0,0,21.46-21.63V86.52Z' />\n <path d='M175.19,86.52V21.42A21.61,21.61,0,0,0,153.74-.22H137.36A21.61,21.61,0,0,0,115.9,21.42V178.15a21.6,21.6,0,0,0,21.46,21.63h16.38a21.6,21.6,0,0,0,21.45-21.63V86.52Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoPlay = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M22.21,99c0-25.56-.26-51.13.12-76.69C22.5,10.5,25.76,3.45,37.6,0,44.75-2,50.61,1.16,56,4.85Q100.1,35,143.94,65.5c8.7,6,17.17,12.41,26,18.22,10.6,7,10.59,24.37-.18,31.59-17.11,11.47-33.87,23.46-50.8,35.18-21.21,14.69-42.37,29.46-63.7,44-11.83,8-23.94,6.16-29.94-4.84-2.1-3.86-2.92-8.85-3-13.34-.27-25.75-.13-51.51-.13-77.27Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoQuestionMark = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M99.73,0C68.55,0,48.36,12.77,32.5,35.56a9.39,9.39,0,0,0,2,12.84L51.38,61.18a9.38,9.38,0,0,0,13-1.62c9.78-12.26,17-19.32,32.32-19.32,12,0,26.89,7.73,26.89,19.39,0,8.81-7.28,13.33-19.14,20C90.6,87.37,72.29,97,72.29,121.18V125a9.37,9.37,0,0,0,9.37,9.37H110a9.37,9.37,0,0,0,9.38-9.37v-2.26c0-16.74,48.93-17.43,48.93-62.74C168.28,25.88,132.89,0,99.73,0ZM95.82,145.88a27.06,27.06,0,1,0,27.06,27.06A27.09,27.09,0,0,0,95.82,145.88Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoPrevious = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M199.75,100.15h0v-1h0c0-12.17,0-24.34,0-36.51,0-13.45,0-26.89-.16-40.34,0-4.46-.86-9.43-3-13.27-6-10.93-18-12.8-29.77-4.8-21.22,14.41-42.26,29.1-63.35,43.71C88.77,58.12,74.13,68.48,59.3,78.57V21.67A21.44,21.44,0,0,0,37.93.3H21.61A21.44,21.44,0,0,0,.23,21.67V177.91a21.44,21.44,0,0,0,21.38,21.37H37.93A21.44,21.44,0,0,0,59.3,177.91v-59.1c6.49,4.5,12.89,9.14,19.38,13.63,29.12,20.15,58.22,40.34,87.45,60.32,5.38,3.67,11.2,6.84,18.31,4.79,11.78-3.39,15-10.41,15.19-22.16.2-13,.22-25.93.2-38.9C199.82,124.38,199.75,112.26,199.75,100.15Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoReplay = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M50.51,186.6A100.54,100.54,0,0,0,99.31,200h1.37a102.13,102.13,0,0,0,44.41-10.55c7.44-3.57,13.9-8.4,19.25-12.65A80.81,80.81,0,0,0,177.11,164,103.3,103.3,0,0,0,189.68,145a102.37,102.37,0,0,0,8-21.79,103.6,103.6,0,0,0-.39-47.58,98.93,98.93,0,0,0-21.16-40.47c-5.16-6.22-11.35-11.26-16.72-15.37a82.09,82.09,0,0,0-15.57-9.42,100.94,100.94,0,0,0-21.94-7.61A107,107,0,0,0,100.53.41c-1.06,0-2.1,0-3.15.06-18.64.72-36.85,6.44-51.29,16.11-2,1.36-4,2.79-6,4.27a6.66,6.66,0,0,1-8.77-.57c-4-4-8-8-12.08-12a8.13,8.13,0,0,0-2.93-2,3.45,3.45,0,0,0-1-.17c-1.84,0-2.53,2.91-2.7,3.8-1.83,9.6-3.57,19.21-5.31,28.82L5.73,47.55c-.6,3.3-1.18,6.6-1.76,9.91C2.77,64.22,1.58,71,.25,77.73a2.76,2.76,0,0,0,.68,2.15A3,3,0,0,0,3,81.06c3.54-.7,6.81-1.25,10.07-1.79q2.94-.48,5.87-1L26,77q22.47-4.08,44.92-8.26c2.82-.53,3.29-1,3.53-1.43,1.08-2,1.34-2.43-1.4-5.26C68.73,57.6,64.37,53.22,60,48.85a6.69,6.69,0,0,1-1.91-5.47,6.6,6.6,0,0,1,3.09-4.9,95.24,95.24,0,0,1,10.66-5.77,95.3,95.3,0,0,1,18.63-5.15,94.7,94.7,0,0,1,19.72,0,94.61,94.61,0,0,1,18.65,5A94.49,94.49,0,0,1,145.11,42a95.21,95.21,0,0,1,13.35,13.27A95.48,95.48,0,0,1,168,71.51a94.71,94.71,0,0,1,5.15,18.62,95.73,95.73,0,0,1,.06,19.73,94.53,94.53,0,0,1-5.05,18.66,94.67,94.67,0,0,1-9.45,16.29,95.8,95.8,0,0,1-13.28,13.35,95.45,95.45,0,0,1-16.22,9.55,95.09,95.09,0,0,1-18.62,5.15,95.29,95.29,0,0,1-10.09.54c-3.2,0-6.44-.16-9.62-.48a94.43,94.43,0,0,1-18.67-5,95.88,95.88,0,0,1-16.29-9.45,95.75,95.75,0,0,1-13.35-13.27c-1.55-2.11-2.78-3.93-3.95-5.8a14.3,14.3,0,0,0-8.05-6.29,13.46,13.46,0,0,0-3.47-.43,12.61,12.61,0,0,0-6.54,1.62c-3.35,2.16-5.64,5-6.28,7.8-.53,2.33-1.09,6.78,1.16,10.37A102.15,102.15,0,0,0,50.51,186.6Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoLogOut = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M157.14,21.47A98.41,98.41,0,0,1,100.2,200C46,200.12,1.67,156,1.59,101.75A98.41,98.41,0,0,1,42.78,21.51a9.55,9.55,0,0,1,13.89,3l6.27,11.15A9.53,9.53,0,0,1,60.32,48a66.66,66.66,0,1,0,79.32,0,9.48,9.48,0,0,1-2.58-12.27l6.27-11.15a9.51,9.51,0,0,1,13.81-3.09Zm-41.27,83.29V9.52A9.5,9.5,0,0,0,106.35,0H93.65a9.5,9.5,0,0,0-9.52,9.52v95.24a9.5,9.5,0,0,0,9.52,9.53h12.7A9.5,9.5,0,0,0,115.87,104.76Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoMagnifier = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M123,122.67a52.07,52.07,0,0,0,15.84-38.1,51.58,51.58,0,0,0-15.84-38A51.47,51.47,0,0,0,85.1,30.72a51.91,51.91,0,0,0-38,15.87,51.93,51.93,0,0,0-15.72,38,52.43,52.43,0,0,0,15.72,38.1A52.26,52.26,0,0,0,85.1,138.41,51.81,51.81,0,0,0,123,122.67Zm77.29,61.9A15.59,15.59,0,0,1,185,200a14.38,14.38,0,0,1-10.8-4.57L133,154.28a81.64,81.64,0,0,1-47.89,14.9,83.27,83.27,0,0,1-32.89-6.61A84.44,84.44,0,0,1,.6,84.57,83,83,0,0,1,7.2,51.76a82.85,82.85,0,0,1,45-45.08,83.42,83.42,0,0,1,65.65,0,82.76,82.76,0,0,1,45,45.08,83.13,83.13,0,0,1,6.72,32.81,81.93,81.93,0,0,1-14.88,48l41.17,41.23A14.72,14.72,0,0,1,200.32,184.57Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoRecord = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M102.3,1.26a98.87,98.87,0,0,0-101,98.79c-.25,54.68,44.26,99.1,98.88,99.1,54.11.62,99.14-44.28,99.12-98.56A99,99,0,0,0,102.3,1.26Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoRecordingStart = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <circle cx='100' cy='100' r='44' />\n <path d='M100,16a84,84,0,1,1-84,84,84.09,84.09,0,0,1,84-84m0-16A100,100,0,1,0,200,100,100,100,0,0,0,100,0Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoRecordingStop = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M100,56a44,44,0,0,0-36.3,68.87L125.24,64A43.77,43.77,0,0,0,100,56Z' />\n <path d='M136.47,75.37,75,136.2a44,44,0,0,0,61.47-60.83Z' />\n <path d='M100,16a84,84,0,1,1-84,84,84.09,84.09,0,0,1,84-84m0-16A100,100,0,1,0,200,100,100,100,0,0,0,100,0Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoRewind10 = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M12.39,88.87c.21-1,1.39-2.23,3-3.26a3.69,3.69,0,0,1,1.73-.31,11.5,11.5,0,0,1,2.54.32,1,1,0,0,1,.57.39l0,0a12.6,12.6,0,0,1,1.11,1A5.15,5.15,0,0,1,22.26,88a6.43,6.43,0,0,1,.4,4.43c-.58,2.54-1,4.88-1.41,7.53a102.56,102.56,0,0,0,.06,20.35A102,102,0,0,0,26.55,140,102.44,102.44,0,0,0,37,158.2a99.63,99.63,0,0,0,15.13,15A101.34,101.34,0,0,0,70.3,183.54,101.23,101.23,0,0,0,90,188.65a98.56,98.56,0,0,0,20.39-.05,102,102,0,0,0,19.7-5.23,100.36,100.36,0,0,0,18.14-10.43,102,102,0,0,0,15.06-15.12,100.88,100.88,0,0,0,10.31-18.22,101.37,101.37,0,0,0,5.12-19.72,102.74,102.74,0,0,0-.05-20.37,101.43,101.43,0,0,0-5.23-19.72A102.17,102.17,0,0,0,163,61.65a97.14,97.14,0,0,0-7-7.78,98.18,98.18,0,0,0-8.13-7.27,101.9,101.9,0,0,0-18.2-10.32,122.9,122.9,0,0,0-12.52-3.75A86.24,86.24,0,0,0,105.33,31V51.47a3.45,3.45,0,0,1-5.89,2.31l-24-24a3.36,3.36,0,0,1,0-4.84l24-24c1.89-2.21,5.89-.42,5.89,2.42V20.17c3.43.22,6.82.56,6.82.56,2.34.31,4.55.67,6.58,1.07,15.34,3,30.61,11,43,22.5.64.6,1.32,1.25,2,1.93a99.05,99.05,0,0,1,12.18,15.18A92.87,92.87,0,0,1,185,80.32,73.38,73.38,0,0,1,188.89,96c.81,6.16,1.55,13.41.89,20.51a89.18,89.18,0,0,1-12.3,39.43,93.65,93.65,0,0,1-30.22,30.69,92.34,92.34,0,0,1-19,8.83A93.49,93.49,0,0,1,108,199.55a71.07,71.07,0,0,1-16,0A89.4,89.4,0,0,1,36.39,173.7l-.88-.89a90.67,90.67,0,0,1-22.58-39.68A92.43,92.43,0,0,1,12.39,88.87Z' />\n <path d='M73.83,147c4,0,6.6-2.47,6.6-6.13V80.79c0-6.76-1.66-11-9.94-11l-12.79.28A6.45,6.45,0,0,0,58,83l9-.28h.25c0,.15,0,.36,0,.65v57.55C67.33,144.61,69.88,147,73.83,147Z' />\n <path d='M96.93,107.9c0,33,15.59,39.91,28.68,39.91,18.45,0,28.6-14.11,28.6-39.73,0-32.68-15.5-39.54-28.5-39.54C107.14,68.54,96.93,82.51,96.93,107.9Zm28.78-27.1c3.78,0,15.3,0,15.3,27.19,0,27.56-11.58,27.56-15.4,27.56s-15.49,0-15.49-27.56C110.12,90,115.37,80.8,125.71,80.8Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoRewind30 = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M-572,859.53c-35.37-1-62.91-14.6-83.59-41.4a3.22,3.22,0,0,1-.48-3.76c14-31.1,38.09-49.66,72.61-54.13,39.68-5.13,78.74,18,93.36,54.47a2.83,2.83,0,0,1-.41,3.16c-17,22.32-39.38,36-67.59,40.34-4.94.76-10,1-13.9,1.32' />\n <path d='M31.5,701.26a41.72,41.72,0,0,1-41.9,41.61,41.77,41.77,0,0,1-41.43-42.08c.1-22.72,19-41.34,41.9-41.26a41.8,41.8,0,0,1,41.43,41.73' />\n <path d='M96.93,107.9c0,33,15.59,39.91,28.68,39.91,18.45,0,28.6-14.11,28.6-39.73,0-32.68-15.5-39.54-28.5-39.54C107.14,68.54,96.93,82.51,96.93,107.9Zm28.78-27.1c3.78,0,15.3,0,15.3,27.19,0,27.56-11.58,27.56-15.4,27.56s-15.49,0-15.49-27.56C110.12,90,115.37,80.8,125.71,80.8Z' />\n <path d='M63.45,100.12a12.58,12.58,0,0,0,8.17-2.78,9.71,9.71,0,0,0,3.42-8,9.51,9.51,0,0,0-2.73-6.82A9.68,9.68,0,0,0,65,79.68a13.3,13.3,0,0,0-5.18.87,8.25,8.25,0,0,0-3.21,2.32,17.3,17.3,0,0,0-2.24,3.71c-.71,1.51-1.35,2.93-1.94,4.27a3.61,3.61,0,0,1-1.85,1.7,7.38,7.38,0,0,1-3.09.62,5.37,5.37,0,0,1-3.79-1.67A5.94,5.94,0,0,1,41.93,87a11.79,11.79,0,0,1,1.62-5.64,20.82,20.82,0,0,1,4.74-5.64A24,24,0,0,1,56,71.46a31.28,31.28,0,0,1,10.36-1.62,28.9,28.9,0,0,1,9.12,1.37,21.28,21.28,0,0,1,7.15,3.93,17,17,0,0,1,4.59,6,17.42,17.42,0,0,1,1.53,7.31,16.69,16.69,0,0,1-2.23,8.83,29.78,29.78,0,0,1-6.42,7.18,28.54,28.54,0,0,1,6.78,5,18.48,18.48,0,0,1,5.53,13.44,22.79,22.79,0,0,1-1.87,9.06,23.14,23.14,0,0,1-5.54,7.8,26.51,26.51,0,0,1-8.68,5.36A30.85,30.85,0,0,1,65.26,147a26.54,26.54,0,0,1-11.08-2.22,25.71,25.71,0,0,1-8.06-5.54,25.28,25.28,0,0,1-4.78-6.87,14.74,14.74,0,0,1-1.62-5.87,6.31,6.31,0,0,1,1.93-4.81,6.71,6.71,0,0,1,4.82-1.83,5.08,5.08,0,0,1,2.77.85,4.12,4.12,0,0,1,1.76,2q2.67,7.17,5.73,10.63c2.05,2.33,4.92,3.48,8.63,3.48a12.9,12.9,0,0,0,6.15-1.57,12.75,12.75,0,0,0,4.89-4.66,13.19,13.19,0,0,0,1.93-7.16q0-6-3.29-9.45t-9.17-3.42c-.69,0-1.75.07-3.19.21s-2.37.2-2.78.2a6.26,6.26,0,0,1-4.37-1.41A5.09,5.09,0,0,1,54,105.63a4.89,4.89,0,0,1,1.85-4,8.54,8.54,0,0,1,5.51-1.52Z' />\n <path d='M12.39,88.87c.21-1,1.39-2.23,3-3.26a3.69,3.69,0,0,1,1.73-.31,11.5,11.5,0,0,1,2.54.32,1,1,0,0,1,.57.39l0,0a12.6,12.6,0,0,1,1.11,1A5.15,5.15,0,0,1,22.26,88a6.43,6.43,0,0,1,.4,4.43c-.58,2.54-1,4.88-1.41,7.53a102.56,102.56,0,0,0,.06,20.35A102,102,0,0,0,26.55,140,102.44,102.44,0,0,0,37,158.2a99.63,99.63,0,0,0,15.13,15A101.34,101.34,0,0,0,70.3,183.54,101.23,101.23,0,0,0,90,188.65a98.56,98.56,0,0,0,20.39-.05,102,102,0,0,0,19.7-5.23,100.36,100.36,0,0,0,18.14-10.43,102,102,0,0,0,15.06-15.12,100.88,100.88,0,0,0,10.31-18.22,101.37,101.37,0,0,0,5.12-19.72,102.74,102.74,0,0,0-.05-20.37,101.43,101.43,0,0,0-5.23-19.72A102.17,102.17,0,0,0,163,61.65a97.14,97.14,0,0,0-7-7.78,98.18,98.18,0,0,0-8.13-7.27,101.9,101.9,0,0,0-18.2-10.32,122.9,122.9,0,0,0-12.52-3.75A86.24,86.24,0,0,0,105.33,31V51.47a3.45,3.45,0,0,1-5.89,2.31l-24-24a3.36,3.36,0,0,1,0-4.84l24-24c1.89-2.21,5.89-.42,5.89,2.42V20.17c3.43.22,6.82.56,6.82.56,2.34.31,4.55.67,6.58,1.07,15.34,3,30.61,11,43,22.5.64.6,1.32,1.25,2,1.93a99.05,99.05,0,0,1,12.18,15.18A92.87,92.87,0,0,1,185,80.32,73.38,73.38,0,0,1,188.89,96c.81,6.16,1.55,13.41.89,20.51a89.18,89.18,0,0,1-12.3,39.43,93.65,93.65,0,0,1-30.22,30.69,92.34,92.34,0,0,1-19,8.83A93.49,93.49,0,0,1,108,199.55a71.07,71.07,0,0,1-16,0A89.4,89.4,0,0,1,36.39,173.7l-.88-.89a90.67,90.67,0,0,1-22.58-39.68A92.43,92.43,0,0,1,12.39,88.87Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoRewind60 = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M101.34,107.9c0,32.99,15.6,39.92,28.69,39.92,18.44,0,28.59-14.11,28.59-39.73,0-32.68-15.5-39.54-28.5-39.54-18.56,0-28.78,13.98-28.78,39.36Zm28.78-27.1c3.78,0,15.31,0,15.31,27.19s-11.59,27.56-15.4,27.56-15.5,0-15.5-27.56c0-18.04,5.25-27.19,15.59-27.19Z' />\n <path d='M12.39,88.87c.22-.96,1.4-2.23,3.04-3.25,.17-.09,.68-.32,1.73-.32,.73,0,1.58,.11,2.54,.32,.24,.06,.45,.2,.58,.39h.01c.26,.19,.69,.51,1.11,.93,.56,.57,.83,1.02,.87,1.09,.62,1.09,.77,2.8,.39,4.43-.58,2.54-1.02,4.88-1.41,7.53-.66,6.7-.63,13.37,.07,20.35,1.07,6.68,2.78,13.14,5.23,19.7,2.81,6.34,6.24,12.3,10.43,18.16,2.26,2.78,4.55,5.32,6.99,7.75,2.54,2.54,5.14,4.86,8.14,7.28,5.65,4.03,11.61,7.41,18.19,10.31,6.34,2.35,12.82,4.03,19.73,5.11,7.16,.7,13.18,.66,20.39-.05,6.71-1.08,13.17-2.8,19.7-5.23,6.38-2.82,12.33-6.24,18.14-10.43,5.52-4.49,10.46-9.45,15.06-15.13,4.07-5.72,7.44-11.69,10.31-18.21,2.35-6.32,4.02-12.78,5.12-19.72,.66-6.75,.64-13.43-.05-20.37-1.06-6.66-2.78-13.13-5.23-19.71-2.83-6.38-6.26-12.33-10.43-18.15-2.26-2.78-4.55-5.33-7.01-7.77-2.49-2.5-5.08-4.82-8.13-7.27-5.67-4.04-11.64-7.42-18.2-10.32-4.16-1.55-8.28-2.66-12.52-3.76-2.56-.66-7.53-1.16-11.85-1.49v20.43c0,2.95-3.89,4.52-5.89,2.31l-23.98-23.98c-1.37-1.37-1.37-3.47,0-4.84L99.44,.99c1.89-2.21,5.89-.42,5.89,2.42V20.17c3.44,.23,6.83,.56,6.83,.56,2.34,.31,4.55,.67,6.58,1.08,15.34,3.04,30.61,11.02,43,22.5,.64,.6,1.31,1.25,2.01,1.93,4.22,4.24,8.31,9.34,12.17,15.18,3.29,4.99,6.18,11,9.12,18.91,1.82,4.89,3.11,10.16,3.85,15.66,.81,6.16,1.55,13.41,.89,20.51-.76,8.26-1.97,14.71-3.79,20.29-2.37,7.26-5.22,13.7-8.5,19.14-7.38,12.26-17.83,22.88-30.22,30.7-5.21,3.29-11.44,6.18-19.03,8.82-6.87,2.39-14.09,3.42-20.24,4.11-2.67,.3-5.37,.45-7.99,.45-2.62,0-5.31-.15-7.98-.45-6.23-.7-13.53-1.75-20.39-4.17-13.86-4.87-25.71-12.16-35.23-21.68l-.88-.89c-10.81-11.13-18.62-24.85-22.58-39.68-3.76-14.09-3.94-29.39-.54-44.27Z' />\n <path d='M71.05,95.55c-7.96,0-14.55,3.2-18.94,9.1,.57-8.06,1.6-11.7,3.44-15.99,2.94-6.89,8.08-10.53,14.82-10.53s10.53,2.49,13,8.35c.86,1.83,2.47,2.83,4.53,2.83,.91,0,1.78-.22,2.59-.45,2.18-.82,3.58-2.65,3.58-4.66,0-.86-.2-1.61-.58-2.29-4.42-9.29-11.86-13.81-22.74-13.81-18.95,0-29.39,14.65-29.39,41.23,0,24.62,10.54,38.74,28.91,38.74,15.73,0,26.3-10.8,26.3-26.89s-10.02-25.63-25.52-25.63Zm14.54,25.63c0,10.18-6.12,16.76-15.6,16.76s-15.98-6.93-15.98-16.47,6.84-16.08,16.28-16.08,15.31,6.2,15.31,15.79Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoSadFace = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M100,133.499167 C108.641667,133.499167 115.683333,140.5325 115.683333,149.1825 C115.683333,151.465833 113.825,153.324167 111.533333,153.324167 L88.4666667,153.324167 C86.175,153.324167 84.3166667,151.465833 84.3166667,149.1825 C84.3166667,140.5325 91.3583333,133.499167 100,133.499167 Z M69.5716667,103.429167 C69.5716667,109.3375 64.78,114.129167 58.8716667,114.129167 C52.9633333,114.129167 48.1716667,109.3375 48.1716667,103.429167 C48.1716667,97.5125 52.9633333,92.7291667 58.8716667,92.7291667 C64.78,92.7291667 69.5716667,97.5125 69.5716667,103.429167 Z M151.830833,103.429167 C151.830833,109.3375 147.039167,114.129167 141.130833,114.129167 C135.2225,114.129167 130.430833,109.3375 130.430833,103.429167 C130.430833,97.5125 135.2225,92.7291667 141.130833,92.7291667 C147.039167,92.7291667 151.830833,97.5125 151.830833,103.429167 Z M100,11.6083333 C51.2583333,11.6083333 11.6083333,51.2666667 11.6083333,100 C11.6083333,148.741667 51.2583333,188.4 100,188.4 C148.741667,188.4 188.391667,148.741667 188.391667,100 C188.391667,51.2666667 148.741667,11.6083333 100,11.6083333 M100,200 C44.8583333,200 0,155.15 0,100 C0,44.8583333 44.8583333,0 100,0 C155.141667,0 200,44.8583333 200,100 C200,155.15 155.141667,200 100,200' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoSeries = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M2.77,60.26,98.5,96.76a4.16,4.16,0,0,0,3,0l95.73-36.5a4.21,4.21,0,0,0,0-7.87L101.5,15.89a4.16,4.16,0,0,0-3,0L2.77,52.39a4.21,4.21,0,0,0,0,7.87Z' />\n <path d='M197.23,100.51l-23.4-8.93a4.3,4.3,0,0,0-3,0L104,117.05a11.26,11.26,0,0,1-8.08,0L29.17,91.58a4.3,4.3,0,0,0-3,0l-23.4,8.93a4.2,4.2,0,0,0,0,7.86L98.5,144.88a4.16,4.16,0,0,0,3,0l95.73-36.51a4.2,4.2,0,0,0,0-7.86Z' />\n <path d='M197.23,144.74l-23.4-8.92a4.16,4.16,0,0,0-3,0l-66.2,25.25a13.07,13.07,0,0,1-9.26,0l-66.2-25.25a4.16,4.16,0,0,0-3,0l-23.4,8.92a4.21,4.21,0,0,0,0,7.87l95.73,36.5a4.16,4.16,0,0,0,3,0l95.73-36.5a4.21,4.21,0,0,0,0-7.87Z' />\n <path d='M2.77,55.26,98.5,91.76a4.16,4.16,0,0,0,3,0l95.73-36.5a4.21,4.21,0,0,0,0-7.87L101.5,10.89a4.16,4.16,0,0,0-3,0L2.77,47.39a4.21,4.21,0,0,0,0,7.87Z' />\n <path d='M197.23,95.51l-23.4-8.93a4.3,4.3,0,0,0-3,0L104,112.05a11.26,11.26,0,0,1-8.08,0L29.17,86.58a4.3,4.3,0,0,0-3,0L2.77,95.51a4.2,4.2,0,0,0,0,7.86L98.5,139.88a4.16,4.16,0,0,0,3,0l95.73-36.51a4.2,4.2,0,0,0,0-7.86Z' />\n <path d='M197.23,139.74l-23.4-8.92a4.16,4.16,0,0,0-3,0l-66.2,25.25a13.07,13.07,0,0,1-9.26,0l-66.2-25.25a4.16,4.16,0,0,0-3,0l-23.4,8.92a4.21,4.21,0,0,0,0,7.87l95.73,36.5a4.16,4.16,0,0,0,3,0l95.73-36.5a4.21,4.21,0,0,0,0-7.87Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoShare = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M196.25,88.35,127.5,147.72a9.38,9.38,0,0,1-15.5-7.09V106.28c-60.58.88-86.69,15.91-69,72.56,2,6.29-5.63,11.16-11,7.28C15,173.69-.5,149.91-.5,125.91c0-59.46,49.75-72,112.5-72.76V21.88a9.38,9.38,0,0,1,15.5-7.09l68.75,59.36A9.39,9.39,0,0,1,196.25,88.35Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoTrailer = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M87.09,99.92c0-5.4,0-10.8,0-16.19,0-2.5.72-4,3.22-4.71a4.5,4.5,0,0,1,3.89,1c6.21,4.24,12.38,8.53,18.56,12.81,1.84,1.27,3.63,2.61,5.5,3.84a4.14,4.14,0,0,1,0,6.67c-3.61,2.42-7.15,5-10.73,7.43-4.48,3.1-8.94,6.22-13.45,9.28-2.49,1.7-5,1.3-6.32-1a6.29,6.29,0,0,1-.62-2.82c-.06-5.43,0-10.87,0-16.31Z' />\n <path d='M200,41.09V12.48a6.19,6.19,0,0,0-6.19-6.18H6.19A6.19,6.19,0,0,0,0,12.48V41.09H17.23V158.91H0v28.61a6.19,6.19,0,0,0,6.19,6.18H193.81a6.19,6.19,0,0,0,6.19-6.18V158.91H182.77V41.09ZM135.46,17h13.4v13.4h-13.4Zm-28.11,0h13.41v13.4H107.35ZM79.24,17H92.65v13.4H79.24Zm-28.1,0h13.4v13.4H51.14ZM36.43,183H23v-13.4h13.4Zm0-152.62H23V17h13.4ZM64.54,183H51.14v-13.4h13.4Zm28.11,0H79.24v-13.4H92.65Zm28.11,0H107.35v-13.4h13.41Zm28.1,0h-13.4v-13.4h13.4Zm8.91-24.1H42.23V41.09H157.77ZM177,183h-13.4v-13.4H177Zm0-152.62h-13.4V17H177Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoTwitter = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='m116.47,84.69L189.32,0h-17.26l-63.26,73.53L58.27,0H0l76.4,111.19L0,200h17.26l66.8-77.65,53.36,77.65h58.27l-79.24-115.31h0Zm-23.65,27.49l-7.74-11.07L23.49,13h26.52l49.71,71.1,7.74,11.07,64.61,92.42h-26.52l-52.73-75.42h0Z' />{' '}\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoUser = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='m100,86.7c23.9,0 43.3,-19.4 43.3,-43.3c0,-23.9 -19.4,-43.3 -43.3,-43.3c-23.9,0 -43.3,19.4 -43.3,43.3c0,23.9 19.4,43.3 43.3,43.3' />\n <path d='m100,100c-57,0 -90,44.7 -90,100l180,0c0,-55.2 -32.9,-100 -90,-100' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoVisuallyImpaired = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <g transform='translate(-0.006559, 50.493200)'>\n <path d='M67.2962591,66.0884591 L52.5036578,29.5515527 L37.7083694,66.0884591 L67.2962591,66.0884591 Z M74.6939033,84.2854406 L30.3134124,84.2854406 L23.9314999,100.006532 L0,100.006532 L40.6104602,0 L64.5392729,0 L105.149733,100.006532 L81.0731287,100.006532 L74.6939033,84.2854406 Z' />\n <path d='M145.467566,80.4998643 C164.468199,80.4998643 177.954859,67.8345279 177.954859,49.9315246 C177.954859,32.1714649 164.468199,19.5061285 145.467566,19.5061285 L128.353292,19.5061285 L128.353292,80.4998643 L145.467566,80.4998643 Z M107.033674,0.00107881912 L142.713267,0.00107881912 C176.213605,0.00107881912 200,20.6712531 200,49.9315246 C200,79.1890991 176.213605,100.004914 142.713267,100.004914 L107.033674,100.004914 L107.033674,0.00107881912 Z' />\n </g>\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoVolume = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M106.16,29.91V169.23a10,10,0,0,1-17,7l-36.9-36.89H10A10,10,0,0,1,0,129.43V69.71a10,10,0,0,1,10-9.95H52.27l36.9-36.89A10,10,0,0,1,106.16,29.91Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoVolumeDown = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M164,96.68a40.75,40.75,0,0,0-19.63-35A13.67,13.67,0,0,0,130.13,85a13.57,13.57,0,0,1,6.56,11.67,13.72,13.72,0,0,1-5.9,11.25,13.67,13.67,0,1,0,15.58,22.47A41.06,41.06,0,0,0,164,96.68Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoVolumeUp = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M199.05,96.68a79.59,79.59,0,0,0-38.14-68,13.27,13.27,0,1,0-13.84,22.64,53.1,53.1,0,0,1,2.57,89,13.27,13.27,0,0,0,15.12,21.81A79.73,79.73,0,0,0,199.05,96.68Zm-39.81,0a39.56,39.56,0,0,0-19.07-34,13.27,13.27,0,0,0-13.84,22.65A13.27,13.27,0,0,1,127,107.6a13.27,13.27,0,1,0,15.12,21.81A39.84,39.84,0,0,0,159.24,96.68Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoVolumeMute = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M173,94.22l24.08-24.08a8.7,8.7,0,0,0,0-12.26l-1-1a8.7,8.7,0,0,0-12.26,0L159.71,80.94,135.63,56.85a8.7,8.7,0,0,0-12.26,0l-1,1a8.7,8.7,0,0,0,0,12.26l24.09,24.08L122.34,118.3a8.7,8.7,0,0,0,0,12.26l1,1a8.7,8.7,0,0,0,12.26,0l24.08-24.08,24.08,24.08a8.7,8.7,0,0,0,12.26,0l1-1a8.7,8.7,0,0,0,0-12.26Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoX = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M28.89,47.86c-6.14-6.13-5.39-13.24,1-19.61,6.13-6.13,13.47-7.11,19.61-1L101,78.74l49.27-49.26c6.37-6.38,13.48-5.64,19.6.48,6.38,6.38,7.36,13.73,1,20.1L121.54,99.33l50.74,50.74c6.36,6.37,5.14,13.47-1,19.6-6.37,6.37-13.24,7.35-19.6,1L101,119.92,49.72,171.15c-6.37,6.37-13.72,5.4-20.1-1-6.12-6.12-6.86-13.23-.49-19.6L80.36,99.33Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoYouTube = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M196,51.65q2.57,9.89,3.66,30L200,100l-.37,18.32q-1.09,20.51-3.66,30.4A26,26,0,0,1,178,166.3q-9.53,2.56-44.69,3.66l-33.33.37L66.67,170Q31.49,168.86,22,166.3A26,26,0,0,1,4,148.72q-2.57-9.9-3.66-30.4L0,100q0-8.06.37-18.32,1.1-20.15,3.66-30A25.57,25.57,0,0,1,22,33.7Q31.5,31.14,66.67,30L100,29.67l33.33.37Q168.51,31.14,178,33.7A25.57,25.57,0,0,1,196,51.65ZM79.49,130l52.38-30L79.49,70.33Z' />\n </Picto>\n));\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nconst PictoWarning = React.forwardRef(({ ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => (\n <Picto {...delegated} ref={ref}>\n <path d='M99,13.15.84,186.05a1,1,0,0,0,.87,1.49l196.57.83a1,1,0,0,0,.87-1.49L100.76,13.15A1,1,0,0,0,99,13.15Z' />\n <path d='M91.39,141a5.37,5.37,0,0,1,3.15-2.73,22,22,0,0,1,6.59-.72c3,0,5.16.66,6.5,2s2,3.37,2,6.18v1.65a31.58,31.58,0,0,1-.16,3.66,9.23,9.23,0,0,1-1,2.84q-1.65,3-7.88,3t-8.25-2q-2-2-2-7.78A13.79,13.79,0,0,1,91.39,141Zm13.81-12a21.55,21.55,0,0,1-5.25.51,21.7,21.7,0,0,1-5.26-.51A4.18,4.18,0,0,1,92,127.1a7.21,7.21,0,0,1-.93-2.37,24.31,24.31,0,0,1-.15-3.19V88.87A25.93,25.93,0,0,1,91,85.62a6.68,6.68,0,0,1,1-2.42,4.57,4.57,0,0,1,2.79-1.9,19.38,19.38,0,0,1,5.25-.57,19.51,19.51,0,0,1,5.26.57,4.31,4.31,0,0,1,2.73,2,7.76,7.76,0,0,1,.93,2.48,25.64,25.64,0,0,1,.15,3.24v32.67a24.6,24.6,0,0,1-.15,3.2,6.2,6.2,0,0,1-1,2.31A4.43,4.43,0,0,1,105.2,129Z' />\n </Picto>\n));\n\n/* eslint-enable react/jsx-props-no-spreading */\n\nPictoAndroid.displayName = 'PictoAndroid';\nPictoApple.displayName = 'PictoApple';\nPictoArrowDown.displayName = 'PictoArrowDown';\nPictoArrowLeft.displayName = 'PictoArrowLeft';\nPictoArrowLeftWithShaft.displayName = 'PictoArrowLeftWithShaft';\nPictoArrowRight.displayName = 'PictoArrowRight';\nPictoArrowUp.displayName = 'PictoArrowUp';\nPictoBack.displayName = 'PictoBack';\nPictoBackToLive.displayName = 'PictoBackToLive';\nPictoBigPlay.displayName = 'PictoBigPlay';\nPictoBurger.displayName = 'PictoBurger';\nPictoBuy.displayName = 'PictoBuy';\nPictoCart.displayName = 'PictoCart';\nPictoCheck.displayName = 'PictoCheck';\nPictoClock.displayName = 'PictoClock';\nPictoClockEmpty.displayName = 'PictoClockEmpty';\nPictoCog.displayName = 'PictoCog';\nPictoCompress.displayName = 'PictoCompress';\nPictoDot.displayName = 'PictoDot';\nPictoDownload.displayName = 'PictoDownload';\nPictoExpand.displayName = 'PictoExpand';\nPictoExternal.displayName = 'PictoExternal';\nPictoEye.displayName = 'PictoEye';\nPictoFacebook.displayName = 'PictoFacebook';\nPictoFailure.displayName = 'PictoFailure';\nPictoForward10.displayName = 'PictoForward10';\nPictoForward30.displayName = 'PictoForward30';\nPictoForward60.displayName = 'PictoForward60';\nPictoFullscreen.displayName = 'PictoFullscreen';\nPictoGem.displayName = 'PictoGem';\nPictoHearingImpaired.displayName = 'PictoHearingImpaired';\nPictoHeartEmpty.displayName = 'PictoHeartEmpty';\nPictoHeartFull.displayName = 'PictoHeartFull';\nPictoInfo.displayName = 'PictoInfo';\nPictoInstagram.displayName = 'PictoInstagram';\nPictoLeaf.displayName = 'PictoLeaf';\nPictoLogOut.displayName = 'PictoLogOut';\nPictoMagnifier.displayName = 'PictoMagnifier';\nPictoMinus.displayName = 'PictoMinus';\nPictoMoreInfo.displayName = 'PictoMoreInfo';\nPictoNext.displayName = 'PictoNext';\nPictoNoContent.displayName = 'PictoNoContent';\nPictoPause.displayName = 'PictoPause';\nPictoPlay.displayName = 'PictoPlay';\nPictoPrevious.displayName = 'PictoPrevious';\nPictoQuestionMark.displayName = 'PictoQuestionMark';\nPictoReplay.displayName = 'PictoReplay';\nPictoRecord.displayName = 'PictoRecord';\nPictoRecordingStart.displayName = 'PictoRecordingStart';\nPictoRecordingStop.displayName = 'PictoRecordingStop';\nPictoRewind10.displayName = 'PictoRewind10';\nPictoRewind30.displayName = 'PictoRewind30';\nPictoRewind60.displayName = 'PictoRewind60';\nPictoSadFace.displayName = 'PictoSadFace';\nPictoSeries.displayName = 'PictoSeries';\nPictoShare.displayName = 'PictoShare';\nPictoTrailer.displayName = 'PictoTrailer';\nPictoTwitter.displayName = 'PictoTwitter';\nPictoUser.displayName = 'PictoUser';\nPictoVisuallyImpaired.displayName = 'PictoVisuallyImpaired';\nPictoVolume.displayName = 'PictoVolume';\nPictoVolumeDown.displayName = 'PictoVolumeDown';\nPictoVolumeMute.displayName = 'PictoVolumeMute';\nPictoVolumeUp.displayName = 'PictoVolumeUp';\nPictoX.displayName = 'PictoX';\nPictoYouTube.displayName = 'PictoYouTube';\nPictoWarning.displayName = 'PictoWarning';\n\nexport {\n PictoAndroid,\n PictoApple,\n PictoArrowDown,\n PictoArrowLeft,\n PictoArrowLeftWithShaft,\n PictoArrowRight,\n PictoArrowUp,\n PictoBack,\n PictoBackToLive,\n PictoBigPlay,\n PictoBurger,\n PictoBuy,\n PictoCart,\n PictoCheck,\n PictoClock,\n PictoClockEmpty,\n PictoCog,\n PictoCompress,\n PictoDot,\n PictoDownload,\n PictoExpand,\n PictoExternal,\n PictoEye,\n PictoFacebook,\n PictoFailure,\n PictoForward10,\n PictoForward30,\n PictoForward60,\n PictoFullscreen,\n PictoGem,\n PictoHearingImpaired,\n PictoHeartEmpty,\n PictoHeartFull,\n PictoInfo,\n PictoInstagram,\n PictoLeaf,\n PictoLogOut,\n PictoMagnifier,\n PictoMinus,\n PictoMoreInfo,\n PictoNext,\n PictoNoContent,\n PictoPause,\n PictoPlay,\n PictoPrevious,\n PictoQuestionMark,\n PictoReplay,\n PictoRecord,\n PictoRecordingStart,\n PictoRecordingStop,\n PictoRewind10,\n PictoRewind30,\n PictoRewind60,\n PictoSadFace,\n PictoSeries,\n PictoShare,\n PictoTrailer,\n PictoTwitter,\n PictoUser,\n PictoVisuallyImpaired,\n PictoVolume,\n PictoVolumeDown,\n PictoVolumeMute,\n PictoVolumeUp,\n PictoX,\n PictoYouTube,\n PictoWarning,\n};\n","/* @flow */\n\n// $FlowFixMe[cannot-resolve-module] CSS file only exists in dist folder\nimport './Picto.css';\nimport * as React from 'react';\nimport clsx from 'clsx';\n\n/* eslint-disable react/require-default-props */\nexport type PictoPropType = {|\n +children: React.Node,\n +className?: string,\n +dataCustom?: string,\n +draggable?: boolean,\n +forceHoverEffect?: boolean,\n +hasBackground?: boolean,\n +isDisabled?: boolean,\n +key?: string,\n +onClick?: (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => void,\n +onMouseDown?: (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => void,\n +onMouseEnter?: (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => void,\n +onMouseLeave?: (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => void,\n +onMouseMove?: (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => void,\n +onMouseUp?: (event: SyntheticMouseEvent<HTMLElement> | SyntheticTouchEvent<HTMLElement>) => void,\n|};\n/* eslint-enable react/require-default-props */\n\nconst Picto = ({ children, ...delegated }: PictoPropType, ref: React.ElementRef<any>): React.Node => {\n const { className = '', dataCustom, draggable, forceHoverEffect, hasBackground, key, isDisabled, onClick, onMouseDown, onMouseEnter, onMouseLeave, onMouseMove, onMouseUp } = delegated;\n\n const content = (\n <>\n {hasBackground ? <div className='background' /> : null}\n <svg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'>\n {children}\n </svg>\n </>\n );\n\n if (onClick !== undefined) {\n // Clickable\n return (\n <button\n className={clsx('pictoElement', 'hoverEffect', className)}\n data-custom={dataCustom}\n disabled={isDisabled}\n key={key}\n onClick={onClick}\n onMouseDown={onMouseDown}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n onMouseMove={onMouseMove}\n onMouseUp={onMouseUp}\n ref={ref}\n type='button'\n >\n {content}\n </button>\n );\n }\n\n // Not clickable\n return (\n <div\n className={clsx('pictoElement', className, forceHoverEffect && 'hoverEffect')}\n data-custom={dataCustom}\n data-disabled={isDisabled}\n draggable={draggable}\n key={key}\n onMouseDown={onMouseDown}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n onMouseMove={onMouseMove}\n onMouseUp={onMouseUp}\n ref={ref}\n >\n {content}\n </div>\n );\n};\n\n// $FlowFixMe[signature-verification-failure] don't know how to annotate this export\nexport default React.forwardRef(Picto);\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n var ReactPropTypes = {\n array: shim,\n bigint: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n elementType: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim,\n\n checkPropTypes: emptyFunctionWithReset,\n resetWarningCache: emptyFunction\n };\n\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactIs = require('react-is');\n\n // By explicitly using `prop-types` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\n}\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n","export default function getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}","import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n // IE 11 has no ShadowRoot\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n\n var OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;","export default function getUAString() {\n var uaData = navigator.userAgentData;\n\n if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {\n return uaData.brands.map(function (item) {\n return item.brand + \"/\" + item.version;\n }).join(' ');\n }\n\n return navigator.userAgent;\n}","import getUAString from \"../utils/userAgent.js\";\nexport default function isLayoutViewport() {\n return !/^((?!chrome|android).)*safari/i.test(getUAString());\n}","import { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport { round } from \"../utils/math.js\";\nimport getWindow from \"./getWindow.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getBoundingClientRect(element, includeScale, isFixedStrategy) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n\n var clientRect = element.getBoundingClientRect();\n var scaleX = 1;\n var scaleY = 1;\n\n if (includeScale && isHTMLElement(element)) {\n scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n }\n\n var _ref = isElement(element) ? getWindow(element) : window,\n visualViewport = _ref.visualViewport;\n\n var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;\n var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;\n var width = clientRect.width / scaleX;\n var height = clientRect.height / scaleY;\n return {\n width: width,\n height: height,\n top: y,\n right: x + width,\n bottom: y + height,\n left: x,\n x: x,\n y: y\n };\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}","export default function getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n element.document) || window.document).documentElement;\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n // If <html> has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on <html>\n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport { round } from \"../utils/math.js\";\n\nfunction isElementScaled(element) {\n var rect = element.getBoundingClientRect();\n var scaleX = round(rect.width) / element.offsetWidth || 1;\n var scaleY = round(rect.height) / element.offsetHeight || 1;\n return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent, true);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}","export default function getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n var width = element.offsetWidth;\n var height = element.offsetHeight;\n\n if (Math.abs(clientRect.width - width) <= 1) {\n width = clientRect.width;\n }\n\n if (Math.abs(clientRect.height - height) <= 1) {\n height = clientRect.height;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: width,\n height: height\n };\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || ( // DOM Element detected\n isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n var _element$ownerDocumen;\n\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement, isShadowRoot } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getUAString from \"../utils/userAgent.js\";\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var isFirefox = /firefox/i.test(getUAString());\n var isIE = /Trident/i.test(getUAString());\n\n if (isIE && isHTMLElement(element)) {\n // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n var elementCss = getComputedStyle(element);\n\n if (elementCss.position === 'fixed') {\n return null;\n }\n }\n\n var currentNode = getParentNode(element);\n\n if (isShadowRoot(currentNode)) {\n currentNode = currentNode.host;\n }\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nexport default function orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}","export default function debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nexport function popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(setOptionsAction) {\n var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n cleanupModifierEffects();\n state.options = Object.assign({}, defaultOptions, state.options, options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n });\n runModifierEffects();\n return instance.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref) {\n var name = _ref.name,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? {} : _ref$options,\n effect = _ref.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","export default function mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign({}, existing, current, {\n options: Object.assign({}, existing.options, current.options),\n data: Object.assign({}, existing.data, current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n return placement.split('-')[0];\n}","export default function getVariation(placement) {\n return placement.split('-')[1];\n}","export default function getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n\n default:\n }\n }\n\n return offsets;\n}","import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref, win) {\n var x = _ref.x,\n y = _ref.y;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: round(x * dpr) / dpr || 0,\n y: round(y * dpr) / dpr || 0\n };\n}\n\nexport function mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n variation = _ref2.variation,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive,\n roundOffsets = _ref2.roundOffsets,\n isFixed = _ref2.isFixed;\n var _offsets$x = offsets.x,\n x = _offsets$x === void 0 ? 0 : _offsets$x,\n _offsets$y = offsets.y,\n y = _offsets$y === void 0 ? 0 : _offsets$y;\n\n var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({\n x: x,\n y: y\n }) : {\n x: x,\n y: y\n };\n\n x = _ref3.x;\n y = _ref3.y;\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n var heightProp = 'clientHeight';\n var widthProp = 'clientWidth';\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n\n if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n heightProp = 'scrollHeight';\n widthProp = 'scrollWidth';\n }\n } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n offsetParent = offsetParent;\n\n if (placement === top || (placement === left || placement === right) && variation === end) {\n sideY = bottom;\n var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]\n offsetParent[heightProp];\n y -= offsetY - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left || (placement === top || placement === bottom) && variation === end) {\n sideX = right;\n var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]\n offsetParent[widthProp];\n x -= offsetX - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n var _ref4 = roundOffsets === true ? roundOffsetsByDPR({\n x: x,\n y: y\n }, getWindow(popper)) : {\n x: x,\n y: y\n };\n\n x = _ref4.x;\n y = _ref4.y;\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n }\n\n return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref5) {\n var state = _ref5.state,\n options = _ref5.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n _options$roundOffsets = options.roundOffsets,\n roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n variation: getVariation(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration,\n isFixed: state.options.strategy === 'fixed'\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive,\n roundOffsets: roundOffsets\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false,\n roundOffsets: roundOffsets\n })));\n }\n\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe[cannot-write]\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect,\n requires: ['computeStyles']\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};","var hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}","var hash = {\n start: 'end',\n end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash[matched];\n });\n}","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}","export default function rectToClientRect(rect) {\n return Object.assign({}, rect, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element, strategy) {\n var rect = getBoundingClientRect(element, false, strategy === 'fixed');\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent, strategy) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary, strategy) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent, strategy));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getViewportRect(element, strategy) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0;\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n var layoutViewport = isLayoutViewport();\n\n if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n var _element$ownerDocumen;\n\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n return Object.assign({}, getFreshSideObject(), paddingObject);\n}","export default function getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}","export default function expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}","import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$strategy = _options.strategy,\n strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);\n var referenceClientRect = getBoundingClientRect(state.elements.reference);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}","import { max as mathMax, min as mathMin } from \"./math.js\";\nexport function within(min, value, max) {\n return mathMax(min, mathMin(value, max));\n}\nexport function withinMaxClamp(min, value, max) {\n var v = within(min, value, max);\n return v > max ? max : v;\n}","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport { within, withinMaxClamp } from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { min as mathMin, max as mathMax } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n placement: state.placement\n })) : tetherOffset;\n var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {\n mainAxis: tetherOffsetValue,\n altAxis: tetherOffsetValue\n } : Object.assign({\n mainAxis: 0,\n altAxis: 0\n }, tetherOffsetValue);\n var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis) {\n var _offsetModifierState$;\n\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = offset + overflow[mainSide];\n var max = offset - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;\n var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = offset + maxOffset - offsetModifierValue;\n var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _offsetModifierState$2;\n\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _len = altAxis === 'y' ? 'height' : 'width';\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var isOriginSide = [top, left].indexOf(basePlacement) !== -1;\n\n var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;\n\n var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;\n\n var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;\n\n var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};","export default function getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport { within } from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n placement: state.placement\n })) : padding;\n return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name,\n options = _ref.options;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = toPaddingObject(options.padding, state);\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state,\n options = _ref2.options;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n return;\n }\n\n state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements;\n var allowedPlacements = placements.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}","export const ROUND_ARROW =\n '<svg width=\"16\" height=\"6\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M0 6s1.796-.013 4.67-3.615C5.851.9 6.93.006 8 0c1.07-.006 2.148.887 3.343 2.385C14.233 6.005 16 6 16 6H0z\"></svg>';\n\nexport const BOX_CLASS = `__NAMESPACE_PREFIX__-box`;\nexport const CONTENT_CLASS = `__NAMESPACE_PREFIX__-content`;\nexport const BACKDROP_CLASS = `__NAMESPACE_PREFIX__-backdrop`;\nexport const ARROW_CLASS = `__NAMESPACE_PREFIX__-arrow`;\nexport const SVG_ARROW_CLASS = `__NAMESPACE_PREFIX__-svg-arrow`;\n\nexport const TOUCH_OPTIONS = {passive: true, capture: true};\n\nexport const TIPPY_DEFAULT_APPEND_TO = () => document.body;\n","import {BasePlacement, Placement} from './types';\n\nexport function hasOwnProperty(\n obj: Record<string, unknown>,\n key: string\n): boolean {\n return {}.hasOwnProperty.call(obj, key);\n}\n\nexport function getValueAtIndexOrReturn<T>(\n value: T | [T | null, T | null],\n index: number,\n defaultValue: T | [T, T]\n): T {\n if (Array.isArray(value)) {\n const v = value[index];\n return v == null\n ? Array.isArray(defaultValue)\n ? defaultValue[index]\n : defaultValue\n : v;\n }\n\n return value;\n}\n\nexport function isType(value: any, type: string): boolean {\n const str = {}.toString.call(value);\n return str.indexOf('[object') === 0 && str.indexOf(`${type}]`) > -1;\n}\n\nexport function invokeWithArgsOrReturn(value: any, args: any[]): any {\n return typeof value === 'function' ? value(...args) : value;\n}\n\nexport function debounce<T>(\n fn: (arg: T) => void,\n ms: number\n): (arg: T) => void {\n // Avoid wrapping in `setTimeout` if ms is 0 anyway\n if (ms === 0) {\n return fn;\n }\n\n let timeout: any;\n\n return (arg): void => {\n clearTimeout(timeout);\n timeout = setTimeout(() => {\n fn(arg);\n }, ms);\n };\n}\n\nexport function removeProperties<T>(obj: T, keys: string[]): Partial<T> {\n const clone = {...obj};\n keys.forEach((key) => {\n delete (clone as any)[key];\n });\n return clone;\n}\n\nexport function splitBySpaces(value: string): string[] {\n return value.split(/\\s+/).filter(Boolean);\n}\n\nexport function normalizeToArray<T>(value: T | T[]): T[] {\n return ([] as T[]).concat(value);\n}\n\nexport function pushIfUnique<T>(arr: T[], value: T): void {\n if (arr.indexOf(value) === -1) {\n arr.push(value);\n }\n}\n\nexport function appendPxIfNumber(value: string | number): string {\n return typeof value === 'number' ? `${value}px` : value;\n}\n\nexport function unique<T>(arr: T[]): T[] {\n return arr.filter((item, index) => arr.indexOf(item) === index);\n}\n\nexport function getNumber(value: string | number): number {\n return typeof value === 'number' ? value : parseFloat(value);\n}\n\nexport function getBasePlacement(placement: Placement): BasePlacement {\n return placement.split('-')[0] as BasePlacement;\n}\n\nexport function arrayFrom(value: ArrayLike<any>): any[] {\n return [].slice.call(value);\n}\n\nexport function removeUndefinedProps(\n obj: Record<string, unknown>\n): Partial<Record<string, unknown>> {\n return Object.keys(obj).reduce((acc, key) => {\n if (obj[key] !== undefined) {\n (acc as any)[key] = obj[key];\n }\n\n return acc;\n }, {});\n}\n","import {ReferenceElement, Targets} from './types';\nimport {PopperTreeData} from './types-internal';\nimport {arrayFrom, isType, normalizeToArray, getBasePlacement} from './utils';\n\nexport function div(): HTMLDivElement {\n return document.createElement('div');\n}\n\nexport function isElement(value: unknown): value is Element | DocumentFragment {\n return ['Element', 'Fragment'].some((type) => isType(value, type));\n}\n\nexport function isNodeList(value: unknown): value is NodeList {\n return isType(value, 'NodeList');\n}\n\nexport function isMouseEvent(value: unknown): value is MouseEvent {\n return isType(value, 'MouseEvent');\n}\n\nexport function isReferenceElement(value: any): value is ReferenceElement {\n return !!(value && value._tippy && value._tippy.reference === value);\n}\n\nexport function getArrayOfElements(value: Targets): Element[] {\n if (isElement(value)) {\n return [value];\n }\n\n if (isNodeList(value)) {\n return arrayFrom(value);\n }\n\n if (Array.isArray(value)) {\n return value;\n }\n\n return arrayFrom(document.querySelectorAll(value));\n}\n\nexport function setTransitionDuration(\n els: (HTMLDivElement | null)[],\n value: number\n): void {\n els.forEach((el) => {\n if (el) {\n el.style.transitionDuration = `${value}ms`;\n }\n });\n}\n\nexport function setVisibilityState(\n els: (HTMLDivElement | null)[],\n state: 'visible' | 'hidden'\n): void {\n els.forEach((el) => {\n if (el) {\n el.setAttribute('data-state', state);\n }\n });\n}\n\nexport function getOwnerDocument(\n elementOrElements: Element | Element[]\n): Document {\n const [element] = normalizeToArray(elementOrElements);\n\n // Elements created via a <template> have an ownerDocument with no reference to the body\n return element?.ownerDocument?.body ? element.ownerDocument : document;\n}\n\nexport function isCursorOutsideInteractiveBorder(\n popperTreeData: PopperTreeData[],\n event: MouseEvent\n): boolean {\n const {clientX, clientY} = event;\n\n return popperTreeData.every(({popperRect, popperState, props}) => {\n const {interactiveBorder} = props;\n const basePlacement = getBasePlacement(popperState.placement);\n const offsetData = popperState.modifiersData.offset;\n\n if (!offsetData) {\n return true;\n }\n\n const topDistance = basePlacement === 'bottom' ? offsetData.top!.y : 0;\n const bottomDistance = basePlacement === 'top' ? offsetData.bottom!.y : 0;\n const leftDistance = basePlacement === 'right' ? offsetData.left!.x : 0;\n const rightDistance = basePlacement === 'left' ? offsetData.right!.x : 0;\n\n const exceedsTop =\n popperRect.top - clientY + topDistance > interactiveBorder;\n const exceedsBottom =\n clientY - popperRect.bottom - bottomDistance > interactiveBorder;\n const exceedsLeft =\n popperRect.left - clientX + leftDistance > interactiveBorder;\n const exceedsRight =\n clientX - popperRect.right - rightDistance > interactiveBorder;\n\n return exceedsTop || exceedsBottom || exceedsLeft || exceedsRight;\n });\n}\n\nexport function updateTransitionEndListener(\n box: HTMLDivElement,\n action: 'add' | 'remove',\n listener: (event: TransitionEvent) => void\n): void {\n const method = `${action}EventListener` as\n | 'addEventListener'\n | 'removeEventListener';\n\n // some browsers apparently support `transition` (unprefixed) but only fire\n // `webkitTransitionEnd`...\n ['transitionend', 'webkitTransitionEnd'].forEach((event) => {\n box[method](event, listener as EventListener);\n });\n}\n\n/**\n * Compared to xxx.contains, this function works for dom structures with shadow\n * dom\n */\nexport function actualContains(parent: Element, child: Element): boolean {\n let target = child;\n while (target) {\n if (parent.contains(target)) {\n return true;\n }\n target = (target.getRootNode?.() as any)?.host;\n }\n return false;\n}\n","import {TOUCH_OPTIONS} from './constants';\nimport {isReferenceElement} from './dom-utils';\n\nexport const currentInput = {isTouch: false};\nlet lastMouseMoveTime = 0;\n\n/**\n * When a `touchstart` event is fired, it's assumed the user is using touch\n * input. We'll bind a `mousemove` event listener to listen for mouse input in\n * the future. This way, the `isTouch` property is fully dynamic and will handle\n * hybrid devices that use a mix of touch + mouse input.\n */\nexport function onDocumentTouchStart(): void {\n if (currentInput.isTouch) {\n return;\n }\n\n currentInput.isTouch = true;\n\n if (window.performance) {\n document.addEventListener('mousemove', onDocumentMouseMove);\n }\n}\n\n/**\n * When two `mousemove` event are fired consecutively within 20ms, it's assumed\n * the user is using mouse input again. `mousemove` can fire on touch devices as\n * well, but very rarely that quickly.\n */\nexport function onDocumentMouseMove(): void {\n const now = performance.now();\n\n if (now - lastMouseMoveTime < 20) {\n currentInput.isTouch = false;\n\n document.removeEventListener('mousemove', onDocumentMouseMove);\n }\n\n lastMouseMoveTime = now;\n}\n\n/**\n * When an element is in focus and has a tippy, leaving the tab/window and\n * returning causes it to show again. For mouse users this is unexpected, but\n * for keyboard use it makes sense.\n * TODO: find a better technique to solve this problem\n */\nexport function onWindowBlur(): void {\n const activeElement = document.activeElement as HTMLElement | null;\n\n if (isReferenceElement(activeElement)) {\n const instance = activeElement._tippy!;\n\n if (activeElement.blur && !instance.state.isVisible) {\n activeElement.blur();\n }\n }\n}\n\nexport default function bindGlobalEventListeners(): void {\n document.addEventListener('touchstart', onDocumentTouchStart, TOUCH_OPTIONS);\n window.addEventListener('blur', onWindowBlur);\n}\n","export const isBrowser =\n typeof window !== 'undefined' && typeof document !== 'undefined';\n\nexport const isIE11 = isBrowser\n ? // @ts-ignore\n !!window.msCrypto\n : false;\n","import {DefaultProps, Plugin, Props, ReferenceElement, Tippy} from './types';\nimport {\n hasOwnProperty,\n removeProperties,\n invokeWithArgsOrReturn,\n} from './utils';\nimport {warnWhen} from './validation';\nimport {TIPPY_DEFAULT_APPEND_TO} from './constants';\n\nconst pluginProps = {\n animateFill: false,\n followCursor: false,\n inlinePositioning: false,\n sticky: false,\n};\n\nconst renderProps = {\n allowHTML: false,\n animation: 'fade',\n arrow: true,\n content: '',\n inertia: false,\n maxWidth: 350,\n role: 'tooltip',\n theme: '',\n zIndex: 9999,\n};\n\nexport const defaultProps: DefaultProps = {\n appendTo: TIPPY_DEFAULT_APPEND_TO,\n aria: {\n content: 'auto',\n expanded: 'auto',\n },\n delay: 0,\n duration: [300, 250],\n getReferenceClientRect: null,\n hideOnClick: true,\n ignoreAttributes: false,\n interactive: false,\n interactiveBorder: 2,\n interactiveDebounce: 0,\n moveTransition: '',\n offset: [0, 10],\n onAfterUpdate() {},\n onBeforeUpdate() {},\n onCreate() {},\n onDestroy() {},\n onHidden() {},\n onHide() {},\n onMount() {},\n onShow() {},\n onShown() {},\n onTrigger() {},\n onUntrigger() {},\n onClickOutside() {},\n placement: 'top',\n plugins: [],\n popperOptions: {},\n render: null,\n showOnCreate: false,\n touch: true,\n trigger: 'mouseenter focus',\n triggerTarget: null,\n ...pluginProps,\n ...renderProps,\n};\n\nconst defaultKeys = Object.keys(defaultProps);\n\nexport const setDefaultProps: Tippy['setDefaultProps'] = (partialProps) => {\n /* istanbul ignore else */\n if (__DEV__) {\n validateProps(partialProps, []);\n }\n\n const keys = Object.keys(partialProps) as Array<keyof DefaultProps>;\n keys.forEach((key) => {\n (defaultProps as any)[key] = partialProps[key];\n });\n};\n\nexport function getExtendedPassedProps(\n passedProps: Partial<Props> & Record<string, unknown>\n): Partial<Props> {\n const plugins = passedProps.plugins || [];\n const pluginProps = plugins.reduce<Record<string, unknown>>((acc, plugin) => {\n const {name, defaultValue} = plugin;\n\n if (name) {\n acc[name] =\n passedProps[name] !== undefined\n ? passedProps[name]\n : (defaultProps as any)[name] ?? defaultValue;\n }\n\n return acc;\n }, {});\n\n return {\n ...passedProps,\n ...pluginProps,\n };\n}\n\nexport function getDataAttributeProps(\n reference: ReferenceElement,\n plugins: Plugin[]\n): Record<string, unknown> {\n const propKeys = plugins\n ? Object.keys(getExtendedPassedProps({...defaultProps, plugins}))\n : defaultKeys;\n\n const props = propKeys.reduce(\n (acc: Partial<Props> & Record<string, unknown>, key) => {\n const valueAsString = (\n reference.getAttribute(`data-tippy-${key}`) || ''\n ).trim();\n\n if (!valueAsString) {\n return acc;\n }\n\n if (key === 'content') {\n acc[key] = valueAsString;\n } else {\n try {\n acc[key] = JSON.parse(valueAsString);\n } catch (e) {\n acc[key] = valueAsString;\n }\n }\n\n return acc;\n },\n {}\n );\n\n return props;\n}\n\nexport function evaluateProps(\n reference: ReferenceElement,\n props: Props\n): Props {\n const out = {\n ...props,\n content: invokeWithArgsOrReturn(props.content, [reference]),\n ...(props.ignoreAttributes\n ? {}\n : getDataAttributeProps(reference, props.plugins)),\n };\n\n out.aria = {\n ...defaultProps.aria,\n ...out.aria,\n };\n\n out.aria = {\n expanded:\n out.aria.expanded === 'auto' ? props.interactive : out.aria.expanded,\n content:\n out.aria.content === 'auto'\n ? props.interactive\n ? null\n : 'describedby'\n : out.aria.content,\n };\n\n return out;\n}\n\nexport function validateProps(\n partialProps: Partial<Props> = {},\n plugins: Plugin[] = []\n): void {\n const keys = Object.keys(partialProps) as Array<keyof Props>;\n keys.forEach((prop) => {\n const nonPluginProps = removeProperties(\n defaultProps,\n Object.keys(pluginProps)\n );\n\n let didPassUnknownProp = !hasOwnProperty(nonPluginProps, prop);\n\n // Check if the prop exists in `plugins`\n if (didPassUnknownProp) {\n didPassUnknownProp =\n plugins.filter((plugin) => plugin.name === prop).length === 0;\n }\n\n warnWhen(\n didPassUnknownProp,\n [\n `\\`${prop}\\``,\n \"is not a valid prop. You may have spelled it incorrectly, or if it's\",\n 'a plugin, forgot to pass it in an array as props.plugins.',\n '\\n\\n',\n 'All props: https://atomiks.github.io/tippyjs/v6/all-props/\\n',\n 'Plugins: https://atomiks.github.io/tippyjs/v6/plugins/',\n ].join(' ')\n );\n });\n}\n","import {\n ARROW_CLASS,\n BACKDROP_CLASS,\n BOX_CLASS,\n CONTENT_CLASS,\n SVG_ARROW_CLASS,\n} from './constants';\nimport {div, isElement} from './dom-utils';\nimport {Instance, PopperElement, Props} from './types';\nimport {PopperChildren} from './types-internal';\nimport {arrayFrom} from './utils';\n\n// Firefox extensions don't allow .innerHTML = \"...\" property. This tricks it.\nconst innerHTML = (): 'innerHTML' => 'innerHTML';\n\nfunction dangerouslySetInnerHTML(element: Element, html: string): void {\n element[innerHTML()] = html;\n}\n\nfunction createArrowElement(value: Props['arrow']): HTMLDivElement {\n const arrow = div();\n\n if (value === true) {\n arrow.className = ARROW_CLASS;\n } else {\n arrow.className = SVG_ARROW_CLASS;\n\n if (isElement(value)) {\n arrow.appendChild(value);\n } else {\n dangerouslySetInnerHTML(arrow, value as string);\n }\n }\n\n return arrow;\n}\n\nexport function setContent(content: HTMLDivElement, props: Props): void {\n if (isElement(props.content)) {\n dangerouslySetInnerHTML(content, '');\n content.appendChild(props.content);\n } else if (typeof props.content !== 'function') {\n if (props.allowHTML) {\n dangerouslySetInnerHTML(content, props.content);\n } else {\n content.textContent = props.content;\n }\n }\n}\n\nexport function getChildren(popper: PopperElement): PopperChildren {\n const box = popper.firstElementChild as HTMLDivElement;\n const boxChildren = arrayFrom(box.children);\n\n return {\n box,\n content: boxChildren.find((node) => node.classList.contains(CONTENT_CLASS)),\n arrow: boxChildren.find(\n (node) =>\n node.classList.contains(ARROW_CLASS) ||\n node.classList.contains(SVG_ARROW_CLASS)\n ),\n backdrop: boxChildren.find((node) =>\n node.classList.contains(BACKDROP_CLASS)\n ),\n };\n}\n\nexport function render(\n instance: Instance\n): {\n popper: PopperElement;\n onUpdate?: (prevProps: Props, nextProps: Props) => void;\n} {\n const popper = div();\n\n const box = div();\n box.className = BOX_CLASS;\n box.setAttribute('data-state', 'hidden');\n box.setAttribute('tabindex', '-1');\n\n const content = div();\n content.className = CONTENT_CLASS;\n content.setAttribute('data-state', 'hidden');\n\n setContent(content, instance.props);\n\n popper.appendChild(box);\n box.appendChild(content);\n\n onUpdate(instance.props, instance.props);\n\n function onUpdate(prevProps: Props, nextProps: Props): void {\n const {box, content, arrow} = getChildren(popper);\n\n if (nextProps.theme) {\n box.setAttribute('data-theme', nextProps.theme);\n } else {\n box.removeAttribute('data-theme');\n }\n\n if (typeof nextProps.animation === 'string') {\n box.setAttribute('data-animation', nextProps.animation);\n } else {\n box.removeAttribute('data-animation');\n }\n\n if (nextProps.inertia) {\n box.setAttribute('data-inertia', '');\n } else {\n box.removeAttribute('data-inertia');\n }\n\n box.style.maxWidth =\n typeof nextProps.maxWidth === 'number'\n ? `${nextProps.maxWidth}px`\n : nextProps.maxWidth;\n\n if (nextProps.role) {\n box.setAttribute('role', nextProps.role);\n } else {\n box.removeAttribute('role');\n }\n\n if (\n prevProps.content !== nextProps.content ||\n prevProps.allowHTML !== nextProps.allowHTML\n ) {\n setContent(content, instance.props);\n }\n\n if (nextProps.arrow) {\n if (!arrow) {\n box.appendChild(createArrowElement(nextProps.arrow));\n } else if (prevProps.arrow !== nextProps.arrow) {\n box.removeChild(arrow);\n box.appendChild(createArrowElement(nextProps.arrow));\n }\n } else if (arrow) {\n box.removeChild(arrow!);\n }\n }\n\n return {\n popper,\n onUpdate,\n };\n}\n\n// Runtime check to identify if the render function is the default one; this\n// way we can apply default CSS transitions logic and it can be tree-shaken away\nrender.$$tippy = true;\n","import {createPopper, StrictModifiers, Modifier} from '@popperjs/core';\nimport {currentInput} from './bindGlobalEventListeners';\nimport {isIE11} from './browser';\nimport {TIPPY_DEFAULT_APPEND_TO, TOUCH_OPTIONS} from './constants';\nimport {\n actualContains,\n div,\n getOwnerDocument,\n isCursorOutsideInteractiveBorder,\n isMouseEvent,\n setTransitionDuration,\n setVisibilityState,\n updateTransitionEndListener,\n} from './dom-utils';\nimport {defaultProps, evaluateProps, getExtendedPassedProps} from './props';\nimport {getChildren} from './template';\nimport {\n Content,\n Instance,\n LifecycleHooks,\n PopperElement,\n Props,\n ReferenceElement,\n} from './types';\nimport {ListenerObject, PopperTreeData, PopperChildren} from './types-internal';\nimport {\n arrayFrom,\n debounce,\n getValueAtIndexOrReturn,\n invokeWithArgsOrReturn,\n normalizeToArray,\n pushIfUnique,\n splitBySpaces,\n unique,\n removeUndefinedProps,\n} from './utils';\nimport {createMemoryLeakWarning, errorWhen, warnWhen} from './validation';\n\nlet idCounter = 1;\nlet mouseMoveListeners: ((event: MouseEvent) => void)[] = [];\n\n// Used by `hideAll()`\nexport let mountedInstances: Instance[] = [];\n\nexport default function createTippy(\n reference: ReferenceElement,\n passedProps: Partial<Props>\n): Instance {\n const props = evaluateProps(reference, {\n ...defaultProps,\n ...getExtendedPassedProps(removeUndefinedProps(passedProps)),\n });\n\n // ===========================================================================\n // 🔒 Private members\n // ===========================================================================\n let showTimeout: any;\n let hideTimeout: any;\n let scheduleHideAnimationFrame: number;\n let isVisibleFromClick = false;\n let didHideDueToDocumentMouseDown = false;\n let didTouchMove = false;\n let ignoreOnFirstUpdate = false;\n let lastTriggerEvent: Event | undefined;\n let currentTransitionEndListener: (event: TransitionEvent) => void;\n let onFirstUpdate: () => void;\n let listeners: ListenerObject[] = [];\n let debouncedOnMouseMove = debounce(onMouseMove, props.interactiveDebounce);\n let currentTarget: Element;\n\n // ===========================================================================\n // 🔑 Public members\n // ===========================================================================\n const id = idCounter++;\n const popperInstance = null;\n const plugins = unique(props.plugins);\n\n const state = {\n // Is the instance currently enabled?\n isEnabled: true,\n // Is the tippy currently showing and not transitioning out?\n isVisible: false,\n // Has the instance been destroyed?\n isDestroyed: false,\n // Is the tippy currently mounted to the DOM?\n isMounted: false,\n // Has the tippy finished transitioning in?\n isShown: false,\n };\n\n const instance: Instance = {\n // properties\n id,\n reference,\n popper: div(),\n popperInstance,\n props,\n state,\n plugins,\n // methods\n clearDelayTimeouts,\n setProps,\n setContent,\n show,\n hide,\n hideWithInteractivity,\n enable,\n disable,\n unmount,\n destroy,\n };\n\n // TODO: Investigate why this early return causes a TDZ error in the tests —\n // it doesn't seem to happen in the browser\n /* istanbul ignore if */\n if (!props.render) {\n if (__DEV__) {\n errorWhen(true, 'render() function has not been supplied.');\n }\n\n return instance;\n }\n\n // ===========================================================================\n // Initial mutations\n // ===========================================================================\n const {popper, onUpdate} = props.render(instance);\n\n popper.setAttribute('data-__NAMESPACE_PREFIX__-root', '');\n popper.id = `__NAMESPACE_PREFIX__-${instance.id}`;\n\n instance.popper = popper;\n reference._tippy = instance;\n popper._tippy = instance;\n\n const pluginsHooks = plugins.map((plugin) => plugin.fn(instance));\n const hasAriaExpanded = reference.hasAttribute('aria-expanded');\n\n addListeners();\n handleAriaExpandedAttribute();\n handleStyles();\n\n invokeHook('onCreate', [instance]);\n\n if (props.showOnCreate) {\n scheduleShow();\n }\n\n // Prevent a tippy with a delay from hiding if the cursor left then returned\n // before it started hiding\n popper.addEventListener('mouseenter', () => {\n if (instance.props.interactive && instance.state.isVisible) {\n instance.clearDelayTimeouts();\n }\n });\n\n popper.addEventListener('mouseleave', () => {\n if (\n instance.props.interactive &&\n instance.props.trigger.indexOf('mouseenter') >= 0\n ) {\n getDocument().addEventListener('mousemove', debouncedOnMouseMove);\n }\n });\n\n return instance;\n\n // ===========================================================================\n // 🔒 Private methods\n // ===========================================================================\n function getNormalizedTouchSettings(): [string | boolean, number] {\n const {touch} = instance.props;\n return Array.isArray(touch) ? touch : [touch, 0];\n }\n\n function getIsCustomTouchBehavior(): boolean {\n return getNormalizedTouchSettings()[0] === 'hold';\n }\n\n function getIsDefaultRenderFn(): boolean {\n // @ts-ignore\n return !!instance.props.render?.$$tippy;\n }\n\n function getCurrentTarget(): Element {\n return currentTarget || reference;\n }\n\n function getDocument(): Document {\n const parent = getCurrentTarget().parentNode as Element;\n return parent ? getOwnerDocument(parent) : document;\n }\n\n function getDefaultTemplateChildren(): PopperChildren {\n return getChildren(popper);\n }\n\n function getDelay(isShow: boolean): number {\n // For touch or keyboard input, force `0` delay for UX reasons\n // Also if the instance is mounted but not visible (transitioning out),\n // ignore delay\n if (\n (instance.state.isMounted && !instance.state.isVisible) ||\n currentInput.isTouch ||\n (lastTriggerEvent && lastTriggerEvent.type === 'focus')\n ) {\n return 0;\n }\n\n return getValueAtIndexOrReturn(\n instance.props.delay,\n isShow ? 0 : 1,\n defaultProps.delay\n );\n }\n\n function handleStyles(fromHide = false): void {\n popper.style.pointerEvents =\n instance.props.interactive && !fromHide ? '' : 'none';\n popper.style.zIndex = `${instance.props.zIndex}`;\n }\n\n function invokeHook(\n hook: keyof LifecycleHooks,\n args: [Instance, any?],\n shouldInvokePropsHook = true\n ): void {\n pluginsHooks.forEach((pluginHooks) => {\n if (pluginHooks[hook]) {\n pluginHooks[hook]!(...args);\n }\n });\n\n if (shouldInvokePropsHook) {\n instance.props[hook](...args);\n }\n }\n\n function handleAriaContentAttribute(): void {\n const {aria} = instance.props;\n\n if (!aria.content) {\n return;\n }\n\n const attr = `aria-${aria.content}`;\n const id = popper.id;\n const nodes = normalizeToArray(instance.props.triggerTarget || reference);\n\n nodes.forEach((node) => {\n const currentValue = node.getAttribute(attr);\n\n if (instance.state.isVisible) {\n node.setAttribute(attr, currentValue ? `${currentValue} ${id}` : id);\n } else {\n const nextValue = currentValue && currentValue.replace(id, '').trim();\n\n if (nextValue) {\n node.setAttribute(attr, nextValue);\n } else {\n node.removeAttribute(attr);\n }\n }\n });\n }\n\n function handleAriaExpandedAttribute(): void {\n if (hasAriaExpanded || !instance.props.aria.expanded) {\n return;\n }\n\n const nodes = normalizeToArray(instance.props.triggerTarget || reference);\n\n nodes.forEach((node) => {\n if (instance.props.interactive) {\n node.setAttribute(\n 'aria-expanded',\n instance.state.isVisible && node === getCurrentTarget()\n ? 'true'\n : 'false'\n );\n } else {\n node.removeAttribute('aria-expanded');\n }\n });\n }\n\n function cleanupInteractiveMouseListeners(): void {\n getDocument().removeEventListener('mousemove', debouncedOnMouseMove);\n mouseMoveListeners = mouseMoveListeners.filter(\n (listener) => listener !== debouncedOnMouseMove\n );\n }\n\n function onDocumentPress(event: MouseEvent | TouchEvent): void {\n // Moved finger to scroll instead of an intentional tap outside\n if (currentInput.isTouch) {\n if (didTouchMove || event.type === 'mousedown') {\n return;\n }\n }\n\n const actualTarget =\n (event.composedPath && event.composedPath()[0]) || event.target;\n\n // Clicked on interactive popper\n if (\n instance.props.interactive &&\n actualContains(popper, actualTarget as Element)\n ) {\n return;\n }\n\n // Clicked on the event listeners target\n if (\n normalizeToArray(instance.props.triggerTarget || reference).some((el) =>\n actualContains(el, actualTarget as Element)\n )\n ) {\n if (currentInput.isTouch) {\n return;\n }\n\n if (\n instance.state.isVisible &&\n instance.props.trigger.indexOf('click') >= 0\n ) {\n return;\n }\n } else {\n invokeHook('onClickOutside', [instance, event]);\n }\n\n if (instance.props.hideOnClick === true) {\n instance.clearDelayTimeouts();\n instance.hide();\n\n // `mousedown` event is fired right before `focus` if pressing the\n // currentTarget. This lets a tippy with `focus` trigger know that it\n // should not show\n didHideDueToDocumentMouseDown = true;\n setTimeout(() => {\n didHideDueToDocumentMouseDown = false;\n });\n\n // The listener gets added in `scheduleShow()`, but this may be hiding it\n // before it shows, and hide()'s early bail-out behavior can prevent it\n // from being cleaned up\n if (!instance.state.isMounted) {\n removeDocumentPress();\n }\n }\n }\n\n function onTouchMove(): void {\n didTouchMove = true;\n }\n\n function onTouchStart(): void {\n didTouchMove = false;\n }\n\n function addDocumentPress(): void {\n const doc = getDocument();\n doc.addEventListener('mousedown', onDocumentPress, true);\n doc.addEventListener('touchend', onDocumentPress, TOUCH_OPTIONS);\n doc.addEventListener('touchstart', onTouchStart, TOUCH_OPTIONS);\n doc.addEventListener('touchmove', onTouchMove, TOUCH_OPTIONS);\n }\n\n function removeDocumentPress(): void {\n const doc = getDocument();\n doc.removeEventListener('mousedown', onDocumentPress, true);\n doc.removeEventListener('touchend', onDocumentPress, TOUCH_OPTIONS);\n doc.removeEventListener('touchstart', onTouchStart, TOUCH_OPTIONS);\n doc.removeEventListener('touchmove', onTouchMove, TOUCH_OPTIONS);\n }\n\n function onTransitionedOut(duration: number, callback: () => void): void {\n onTransitionEnd(duration, () => {\n if (\n !instance.state.isVisible &&\n popper.parentNode &&\n popper.parentNode.contains(popper)\n ) {\n callback();\n }\n });\n }\n\n function onTransitionedIn(duration: number, callback: () => void): void {\n onTransitionEnd(duration, callback);\n }\n\n function onTransitionEnd(duration: number, callback: () => void): void {\n const box = getDefaultTemplateChildren().box;\n\n function listener(event: TransitionEvent): void {\n if (event.target === box) {\n updateTransitionEndListener(box, 'remove', listener);\n callback();\n }\n }\n\n // Make callback synchronous if duration is 0\n // `transitionend` won't fire otherwise\n if (duration === 0) {\n return callback();\n }\n\n updateTransitionEndListener(box, 'remove', currentTransitionEndListener);\n updateTransitionEndListener(box, 'add', listener);\n\n currentTransitionEndListener = listener;\n }\n\n function on(\n eventType: string,\n handler: EventListener,\n options: boolean | Record<string, unknown> = false\n ): void {\n const nodes = normalizeToArray(instance.props.triggerTarget || reference);\n nodes.forEach((node) => {\n node.addEventListener(eventType, handler, options);\n listeners.push({node, eventType, handler, options});\n });\n }\n\n function addListeners(): void {\n if (getIsCustomTouchBehavior()) {\n on('touchstart', onTrigger, {passive: true});\n on('touchend', onMouseLeave as EventListener, {passive: true});\n }\n\n splitBySpaces(instance.props.trigger).forEach((eventType) => {\n if (eventType === 'manual') {\n return;\n }\n\n on(eventType, onTrigger);\n\n switch (eventType) {\n case 'mouseenter':\n on('mouseleave', onMouseLeave as EventListener);\n break;\n case 'focus':\n on(isIE11 ? 'focusout' : 'blur', onBlurOrFocusOut as EventListener);\n break;\n case 'focusin':\n on('focusout', onBlurOrFocusOut as EventListener);\n break;\n }\n });\n }\n\n function removeListeners(): void {\n listeners.forEach(({node, eventType, handler, options}: ListenerObject) => {\n node.removeEventListener(eventType, handler, options);\n });\n listeners = [];\n }\n\n function onTrigger(event: Event): void {\n let shouldScheduleClickHide = false;\n\n if (\n !instance.state.isEnabled ||\n isEventListenerStopped(event) ||\n didHideDueToDocumentMouseDown\n ) {\n return;\n }\n\n const wasFocused = lastTriggerEvent?.type === 'focus';\n\n lastTriggerEvent = event;\n currentTarget = event.currentTarget as Element;\n\n handleAriaExpandedAttribute();\n\n if (!instance.state.isVisible && isMouseEvent(event)) {\n // If scrolling, `mouseenter` events can be fired if the cursor lands\n // over a new target, but `mousemove` events don't get fired. This\n // causes interactive tooltips to get stuck open until the cursor is\n // moved\n mouseMoveListeners.forEach((listener) => listener(event));\n }\n\n // Toggle show/hide when clicking click-triggered tooltips\n if (\n event.type === 'click' &&\n (instance.props.trigger.indexOf('mouseenter') < 0 ||\n isVisibleFromClick) &&\n instance.props.hideOnClick !== false &&\n instance.state.isVisible\n ) {\n shouldScheduleClickHide = true;\n } else {\n scheduleShow(event);\n }\n\n if (event.type === 'click') {\n isVisibleFromClick = !shouldScheduleClickHide;\n }\n\n if (shouldScheduleClickHide && !wasFocused) {\n scheduleHide(event);\n }\n }\n\n function onMouseMove(event: MouseEvent): void {\n const target = event.target as Node;\n const isCursorOverReferenceOrPopper =\n getCurrentTarget().contains(target) || popper.contains(target);\n\n if (event.type === 'mousemove' && isCursorOverReferenceOrPopper) {\n return;\n }\n\n const popperTreeData = getNestedPopperTree()\n .concat(popper)\n .map((popper) => {\n const instance = popper._tippy!;\n const state = instance.popperInstance?.state;\n\n if (state) {\n return {\n popperRect: popper.getBoundingClientRect(),\n popperState: state,\n props,\n };\n }\n\n return null;\n })\n .filter(Boolean) as PopperTreeData[];\n\n if (isCursorOutsideInteractiveBorder(popperTreeData, event)) {\n cleanupInteractiveMouseListeners();\n scheduleHide(event);\n }\n }\n\n function onMouseLeave(event: MouseEvent): void {\n const shouldBail =\n isEventListenerStopped(event) ||\n (instance.props.trigger.indexOf('click') >= 0 && isVisibleFromClick);\n\n if (shouldBail) {\n return;\n }\n\n if (instance.props.interactive) {\n instance.hideWithInteractivity(event);\n return;\n }\n\n scheduleHide(event);\n }\n\n function onBlurOrFocusOut(event: FocusEvent): void {\n if (\n instance.props.trigger.indexOf('focusin') < 0 &&\n event.target !== getCurrentTarget()\n ) {\n return;\n }\n\n // If focus was moved to within the popper\n if (\n instance.props.interactive &&\n event.relatedTarget &&\n popper.contains(event.relatedTarget as Element)\n ) {\n return;\n }\n\n scheduleHide(event);\n }\n\n function isEventListenerStopped(event: Event): boolean {\n return currentInput.isTouch\n ? getIsCustomTouchBehavior() !== event.type.indexOf('touch') >= 0\n : false;\n }\n\n function createPopperInstance(): void {\n destroyPopperInstance();\n\n const {\n popperOptions,\n placement,\n offset,\n getReferenceClientRect,\n moveTransition,\n } = instance.props;\n\n const arrow = getIsDefaultRenderFn() ? getChildren(popper).arrow : null;\n\n const computedReference = getReferenceClientRect\n ? {\n getBoundingClientRect: getReferenceClientRect,\n contextElement:\n getReferenceClientRect.contextElement || getCurrentTarget(),\n }\n : reference;\n\n const tippyModifier: Modifier<'$$tippy', Record<string, unknown>> = {\n name: '$$tippy',\n enabled: true,\n phase: 'beforeWrite',\n requires: ['computeStyles'],\n fn({state}) {\n if (getIsDefaultRenderFn()) {\n const {box} = getDefaultTemplateChildren();\n\n ['placement', 'reference-hidden', 'escaped'].forEach((attr) => {\n if (attr === 'placement') {\n box.setAttribute('data-placement', state.placement);\n } else {\n if (state.attributes.popper[`data-popper-${attr}`]) {\n box.setAttribute(`data-${attr}`, '');\n } else {\n box.removeAttribute(`data-${attr}`);\n }\n }\n });\n\n state.attributes.popper = {};\n }\n },\n };\n\n type TippyModifier = Modifier<'$$tippy', Record<string, unknown>>;\n type ExtendedModifiers = StrictModifiers | Partial<TippyModifier>;\n\n const modifiers: Array<ExtendedModifiers> = [\n {\n name: 'offset',\n options: {\n offset,\n },\n },\n {\n name: 'preventOverflow',\n options: {\n padding: {\n top: 2,\n bottom: 2,\n left: 5,\n right: 5,\n },\n },\n },\n {\n name: 'flip',\n options: {\n padding: 5,\n },\n },\n {\n name: 'computeStyles',\n options: {\n adaptive: !moveTransition,\n },\n },\n tippyModifier,\n ];\n\n if (getIsDefaultRenderFn() && arrow) {\n modifiers.push({\n name: 'arrow',\n options: {\n element: arrow,\n padding: 3,\n },\n });\n }\n\n modifiers.push(...(popperOptions?.modifiers || []));\n\n instance.popperInstance = createPopper<ExtendedModifiers>(\n computedReference,\n popper,\n {\n ...popperOptions,\n placement,\n onFirstUpdate,\n modifiers,\n }\n );\n }\n\n function destroyPopperInstance(): void {\n if (instance.popperInstance) {\n instance.popperInstance.destroy();\n instance.popperInstance = null;\n }\n }\n\n function mount(): void {\n const {appendTo} = instance.props;\n\n let parentNode: any;\n\n // By default, we'll append the popper to the triggerTargets's parentNode so\n // it's directly after the reference element so the elements inside the\n // tippy can be tabbed to\n // If there are clipping issues, the user can specify a different appendTo\n // and ensure focus management is handled correctly manually\n const node = getCurrentTarget();\n\n if (\n (instance.props.interactive && appendTo === TIPPY_DEFAULT_APPEND_TO) ||\n appendTo === 'parent'\n ) {\n parentNode = node.parentNode;\n } else {\n parentNode = invokeWithArgsOrReturn(appendTo, [node]);\n }\n\n // The popper element needs to exist on the DOM before its position can be\n // updated as Popper needs to read its dimensions\n if (!parentNode.contains(popper)) {\n parentNode.appendChild(popper);\n }\n\n instance.state.isMounted = true;\n\n createPopperInstance();\n\n /* istanbul ignore else */\n if (__DEV__) {\n // Accessibility check\n warnWhen(\n instance.props.interactive &&\n appendTo === defaultProps.appendTo &&\n node.nextElementSibling !== popper,\n [\n 'Interactive tippy element may not be accessible via keyboard',\n 'navigation because it is not directly after the reference element',\n 'in the DOM source order.',\n '\\n\\n',\n 'Using a wrapper <div> or <span> tag around the reference element',\n 'solves this by creating a new parentNode context.',\n '\\n\\n',\n 'Specifying `appendTo: document.body` silences this warning, but it',\n 'assumes you are using a focus management solution to handle',\n 'keyboard navigation.',\n '\\n\\n',\n 'See: https://atomiks.github.io/tippyjs/v6/accessibility/#interactivity',\n ].join(' ')\n );\n }\n }\n\n function getNestedPopperTree(): PopperElement[] {\n return arrayFrom(\n popper.querySelectorAll('[data-__NAMESPACE_PREFIX__-root]')\n );\n }\n\n function scheduleShow(event?: Event): void {\n instance.clearDelayTimeouts();\n\n if (event) {\n invokeHook('onTrigger', [instance, event]);\n }\n\n addDocumentPress();\n\n let delay = getDelay(true);\n const [touchValue, touchDelay] = getNormalizedTouchSettings();\n\n if (currentInput.isTouch && touchValue === 'hold' && touchDelay) {\n delay = touchDelay;\n }\n\n if (delay) {\n showTimeout = setTimeout(() => {\n instance.show();\n }, delay);\n } else {\n instance.show();\n }\n }\n\n function scheduleHide(event: Event): void {\n instance.clearDelayTimeouts();\n\n invokeHook('onUntrigger', [instance, event]);\n\n if (!instance.state.isVisible) {\n removeDocumentPress();\n\n return;\n }\n\n // For interactive tippies, scheduleHide is added to a document.body handler\n // from onMouseLeave so must intercept scheduled hides from mousemove/leave\n // events when trigger contains mouseenter and click, and the tip is\n // currently shown as a result of a click.\n if (\n instance.props.trigger.indexOf('mouseenter') >= 0 &&\n instance.props.trigger.indexOf('click') >= 0 &&\n ['mouseleave', 'mousemove'].indexOf(event.type) >= 0 &&\n isVisibleFromClick\n ) {\n return;\n }\n\n const delay = getDelay(false);\n\n if (delay) {\n hideTimeout = setTimeout(() => {\n if (instance.state.isVisible) {\n instance.hide();\n }\n }, delay);\n } else {\n // Fixes a `transitionend` problem when it fires 1 frame too\n // late sometimes, we don't want hide() to be called.\n scheduleHideAnimationFrame = requestAnimationFrame(() => {\n instance.hide();\n });\n }\n }\n\n // ===========================================================================\n // 🔑 Public methods\n // ===========================================================================\n function enable(): void {\n instance.state.isEnabled = true;\n }\n\n function disable(): void {\n // Disabling the instance should also hide it\n // https://github.com/atomiks/tippy.js-react/issues/106\n instance.hide();\n instance.state.isEnabled = false;\n }\n\n function clearDelayTimeouts(): void {\n clearTimeout(showTimeout);\n clearTimeout(hideTimeout);\n cancelAnimationFrame(scheduleHideAnimationFrame);\n }\n\n function setProps(partialProps: Partial<Props>): void {\n /* istanbul ignore else */\n if (__DEV__) {\n warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('setProps'));\n }\n\n if (instance.state.isDestroyed) {\n return;\n }\n\n invokeHook('onBeforeUpdate', [instance, partialProps]);\n\n removeListeners();\n\n const prevProps = instance.props;\n const nextProps = evaluateProps(reference, {\n ...prevProps,\n ...removeUndefinedProps(partialProps),\n ignoreAttributes: true,\n });\n\n instance.props = nextProps;\n\n addListeners();\n\n if (prevProps.interactiveDebounce !== nextProps.interactiveDebounce) {\n cleanupInteractiveMouseListeners();\n debouncedOnMouseMove = debounce(\n onMouseMove,\n nextProps.interactiveDebounce\n );\n }\n\n // Ensure stale aria-expanded attributes are removed\n if (prevProps.triggerTarget && !nextProps.triggerTarget) {\n normalizeToArray(prevProps.triggerTarget).forEach((node) => {\n node.removeAttribute('aria-expanded');\n });\n } else if (nextProps.triggerTarget) {\n reference.removeAttribute('aria-expanded');\n }\n\n handleAriaExpandedAttribute();\n handleStyles();\n\n if (onUpdate) {\n onUpdate(prevProps, nextProps);\n }\n\n if (instance.popperInstance) {\n createPopperInstance();\n\n // Fixes an issue with nested tippies if they are all getting re-rendered,\n // and the nested ones get re-rendered first.\n // https://github.com/atomiks/tippyjs-react/issues/177\n // TODO: find a cleaner / more efficient solution(!)\n getNestedPopperTree().forEach((nestedPopper) => {\n // React (and other UI libs likely) requires a rAF wrapper as it flushes\n // its work in one\n requestAnimationFrame(nestedPopper._tippy!.popperInstance!.forceUpdate);\n });\n }\n\n invokeHook('onAfterUpdate', [instance, partialProps]);\n }\n\n function setContent(content: Content): void {\n instance.setProps({content});\n }\n\n function show(): void {\n /* istanbul ignore else */\n if (__DEV__) {\n warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('show'));\n }\n\n // Early bail-out\n const isAlreadyVisible = instance.state.isVisible;\n const isDestroyed = instance.state.isDestroyed;\n const isDisabled = !instance.state.isEnabled;\n const isTouchAndTouchDisabled =\n currentInput.isTouch && !instance.props.touch;\n const duration = getValueAtIndexOrReturn(\n instance.props.duration,\n 0,\n defaultProps.duration\n );\n\n if (\n isAlreadyVisible ||\n isDestroyed ||\n isDisabled ||\n isTouchAndTouchDisabled\n ) {\n return;\n }\n\n // Normalize `disabled` behavior across browsers.\n // Firefox allows events on disabled elements, but Chrome doesn't.\n // Using a wrapper element (i.e. <span>) is recommended.\n if (getCurrentTarget().hasAttribute('disabled')) {\n return;\n }\n\n invokeHook('onShow', [instance], false);\n if (instance.props.onShow(instance) === false) {\n return;\n }\n\n instance.state.isVisible = true;\n\n if (getIsDefaultRenderFn()) {\n popper.style.visibility = 'visible';\n }\n\n handleStyles();\n addDocumentPress();\n\n if (!instance.state.isMounted) {\n popper.style.transition = 'none';\n }\n\n // If flipping to the opposite side after hiding at least once, the\n // animation will use the wrong placement without resetting the duration\n if (getIsDefaultRenderFn()) {\n const {box, content} = getDefaultTemplateChildren();\n setTransitionDuration([box, content], 0);\n }\n\n onFirstUpdate = (): void => {\n if (!instance.state.isVisible || ignoreOnFirstUpdate) {\n return;\n }\n\n ignoreOnFirstUpdate = true;\n\n // reflow\n void popper.offsetHeight;\n\n popper.style.transition = instance.props.moveTransition;\n\n if (getIsDefaultRenderFn() && instance.props.animation) {\n const {box, content} = getDefaultTemplateChildren();\n setTransitionDuration([box, content], duration);\n setVisibilityState([box, content], 'visible');\n }\n\n handleAriaContentAttribute();\n handleAriaExpandedAttribute();\n\n pushIfUnique(mountedInstances, instance);\n\n // certain modifiers (e.g. `maxSize`) require a second update after the\n // popper has been positioned for the first time\n instance.popperInstance?.forceUpdate();\n\n invokeHook('onMount', [instance]);\n\n if (instance.props.animation && getIsDefaultRenderFn()) {\n onTransitionedIn(duration, () => {\n instance.state.isShown = true;\n invokeHook('onShown', [instance]);\n });\n }\n };\n\n mount();\n }\n\n function hide(): void {\n /* istanbul ignore else */\n if (__DEV__) {\n warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('hide'));\n }\n\n // Early bail-out\n const isAlreadyHidden = !instance.state.isVisible;\n const isDestroyed = instance.state.isDestroyed;\n const isDisabled = !instance.state.isEnabled;\n const duration = getValueAtIndexOrReturn(\n instance.props.duration,\n 1,\n defaultProps.duration\n );\n\n if (isAlreadyHidden || isDestroyed || isDisabled) {\n return;\n }\n\n invokeHook('onHide', [instance], false);\n if (instance.props.onHide(instance) === false) {\n return;\n }\n\n instance.state.isVisible = false;\n instance.state.isShown = false;\n ignoreOnFirstUpdate = false;\n isVisibleFromClick = false;\n\n if (getIsDefaultRenderFn()) {\n popper.style.visibility = 'hidden';\n }\n\n cleanupInteractiveMouseListeners();\n removeDocumentPress();\n handleStyles(true);\n\n if (getIsDefaultRenderFn()) {\n const {box, content} = getDefaultTemplateChildren();\n\n if (instance.props.animation) {\n setTransitionDuration([box, content], duration);\n setVisibilityState([box, content], 'hidden');\n }\n }\n\n handleAriaContentAttribute();\n handleAriaExpandedAttribute();\n\n if (instance.props.animation) {\n if (getIsDefaultRenderFn()) {\n onTransitionedOut(duration, instance.unmount);\n }\n } else {\n instance.unmount();\n }\n }\n\n function hideWithInteractivity(event: MouseEvent): void {\n /* istanbul ignore else */\n if (__DEV__) {\n warnWhen(\n instance.state.isDestroyed,\n createMemoryLeakWarning('hideWithInteractivity')\n );\n }\n\n getDocument().addEventListener('mousemove', debouncedOnMouseMove);\n pushIfUnique(mouseMoveListeners, debouncedOnMouseMove);\n debouncedOnMouseMove(event);\n }\n\n function unmount(): void {\n /* istanbul ignore else */\n if (__DEV__) {\n warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('unmount'));\n }\n\n if (instance.state.isVisible) {\n instance.hide();\n }\n\n if (!instance.state.isMounted) {\n return;\n }\n\n destroyPopperInstance();\n\n // If a popper is not interactive, it will be appended outside the popper\n // tree by default. This seems mainly for interactive tippies, but we should\n // find a workaround if possible\n getNestedPopperTree().forEach((nestedPopper) => {\n nestedPopper._tippy!.unmount();\n });\n\n if (popper.parentNode) {\n popper.parentNode.removeChild(popper);\n }\n\n mountedInstances = mountedInstances.filter((i) => i !== instance);\n\n instance.state.isMounted = false;\n invokeHook('onHidden', [instance]);\n }\n\n function destroy(): void {\n /* istanbul ignore else */\n if (__DEV__) {\n warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('destroy'));\n }\n\n if (instance.state.isDestroyed) {\n return;\n }\n\n instance.clearDelayTimeouts();\n instance.unmount();\n\n removeListeners();\n\n delete reference._tippy;\n\n instance.state.isDestroyed = true;\n\n invokeHook('onDestroy', [instance]);\n }\n}\n","import bindGlobalEventListeners, {\n currentInput,\n} from './bindGlobalEventListeners';\nimport createTippy, {mountedInstances} from './createTippy';\nimport {getArrayOfElements, isElement, isReferenceElement} from './dom-utils';\nimport {defaultProps, setDefaultProps, validateProps} from './props';\nimport {HideAll, HideAllOptions, Instance, Props, Targets} from './types';\nimport {validateTargets, warnWhen} from './validation';\n\nfunction tippy(\n targets: Targets,\n optionalProps: Partial<Props> = {}\n): Instance | Instance[] {\n const plugins = defaultProps.plugins.concat(optionalProps.plugins || []);\n\n /* istanbul ignore else */\n if (__DEV__) {\n validateTargets(targets);\n validateProps(optionalProps, plugins);\n }\n\n bindGlobalEventListeners();\n\n const passedProps: Partial<Props> = {...optionalProps, plugins};\n\n const elements = getArrayOfElements(targets);\n\n /* istanbul ignore else */\n if (__DEV__) {\n const isSingleContentElement = isElement(passedProps.content);\n const isMoreThanOneReferenceElement = elements.length > 1;\n warnWhen(\n isSingleContentElement && isMoreThanOneReferenceElement,\n [\n 'tippy() was passed an Element as the `content` prop, but more than',\n 'one tippy instance was created by this invocation. This means the',\n 'content element will only be appended to the last tippy instance.',\n '\\n\\n',\n 'Instead, pass the .innerHTML of the element, or use a function that',\n 'returns a cloned version of the element instead.',\n '\\n\\n',\n '1) content: element.innerHTML\\n',\n '2) content: () => element.cloneNode(true)',\n ].join(' ')\n );\n }\n\n const instances = elements.reduce<Instance[]>(\n (acc, reference): Instance[] => {\n const instance = reference && createTippy(reference, passedProps);\n\n if (instance) {\n acc.push(instance);\n }\n\n return acc;\n },\n []\n );\n\n return isElement(targets) ? instances[0] : instances;\n}\n\ntippy.defaultProps = defaultProps;\ntippy.setDefaultProps = setDefaultProps;\ntippy.currentInput = currentInput;\n\nexport default tippy;\n\nexport const hideAll: HideAll = ({\n exclude: excludedReferenceOrInstance,\n duration,\n}: HideAllOptions = {}) => {\n mountedInstances.forEach((instance) => {\n let isExcluded = false;\n\n if (excludedReferenceOrInstance) {\n isExcluded = isReferenceElement(excludedReferenceOrInstance)\n ? instance.reference === excludedReferenceOrInstance\n : instance.popper === (excludedReferenceOrInstance as Instance).popper;\n }\n\n if (!isExcluded) {\n const originalDuration = instance.props.duration;\n\n instance.setProps({duration});\n instance.hide();\n\n if (!instance.state.isDestroyed) {\n instance.setProps({duration: originalDuration});\n }\n }\n });\n};\n","import tippy from '..';\nimport {div} from '../dom-utils';\nimport {\n CreateSingleton,\n Plugin,\n CreateSingletonProps,\n ReferenceElement,\n CreateSingletonInstance,\n Instance,\n Props,\n} from '../types';\nimport {normalizeToArray, removeProperties} from '../utils';\nimport {errorWhen} from '../validation';\nimport {applyStyles, Modifier} from '@popperjs/core';\n\n// The default `applyStyles` modifier has a cleanup function that gets called\n// every time the popper is destroyed (i.e. a new target), removing the styles\n// and causing transitions to break for singletons when the console is open, but\n// most notably for non-transform styles being used, `gpuAcceleration: false`.\nconst applyStylesModifier: Modifier<'applyStyles', Record<string, unknown>> = {\n ...applyStyles,\n effect({state}) {\n const initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0',\n },\n arrow: {\n position: 'absolute',\n },\n reference: {},\n };\n\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n // intentionally return no cleanup function\n // return () => { ... }\n },\n};\n\nconst createSingleton: CreateSingleton = (\n tippyInstances,\n optionalProps = {}\n) => {\n /* istanbul ignore else */\n if (__DEV__) {\n errorWhen(\n !Array.isArray(tippyInstances),\n [\n 'The first argument passed to createSingleton() must be an array of',\n 'tippy instances. The passed value was',\n String(tippyInstances),\n ].join(' ')\n );\n }\n\n let individualInstances = tippyInstances;\n let references: Array<ReferenceElement> = [];\n let triggerTargets: Array<Element> = [];\n let currentTarget: Element | null;\n let overrides = optionalProps.overrides;\n let interceptSetPropsCleanups: Array<() => void> = [];\n let shownOnCreate = false;\n\n function setTriggerTargets(): void {\n triggerTargets = individualInstances\n .map((instance) =>\n normalizeToArray(instance.props.triggerTarget || instance.reference)\n )\n .reduce((acc, item) => acc.concat(item), []);\n }\n\n function setReferences(): void {\n references = individualInstances.map((instance) => instance.reference);\n }\n\n function enableInstances(isEnabled: boolean): void {\n individualInstances.forEach((instance) => {\n if (isEnabled) {\n instance.enable();\n } else {\n instance.disable();\n }\n });\n }\n\n function interceptSetProps(singleton: Instance): Array<() => void> {\n return individualInstances.map((instance) => {\n const originalSetProps = instance.setProps;\n\n instance.setProps = (props): void => {\n originalSetProps(props);\n\n if (instance.reference === currentTarget) {\n singleton.setProps(props);\n }\n };\n\n return (): void => {\n instance.setProps = originalSetProps;\n };\n });\n }\n\n // have to pass singleton, as it maybe undefined on first call\n function prepareInstance(\n singleton: Instance,\n target: ReferenceElement\n ): void {\n const index = triggerTargets.indexOf(target);\n\n // bail-out\n if (target === currentTarget) {\n return;\n }\n\n currentTarget = target;\n\n const overrideProps: Partial<Props> = (overrides || [])\n .concat('content')\n .reduce((acc, prop) => {\n (acc as any)[prop] = individualInstances[index].props[prop];\n return acc;\n }, {});\n\n singleton.setProps({\n ...overrideProps,\n getReferenceClientRect:\n typeof overrideProps.getReferenceClientRect === 'function'\n ? overrideProps.getReferenceClientRect\n : (): ClientRect => references[index]?.getBoundingClientRect(),\n });\n }\n\n enableInstances(false);\n setReferences();\n setTriggerTargets();\n\n const plugin: Plugin = {\n fn() {\n return {\n onDestroy(): void {\n enableInstances(true);\n },\n onHidden(): void {\n currentTarget = null;\n },\n onClickOutside(instance): void {\n if (instance.props.showOnCreate && !shownOnCreate) {\n shownOnCreate = true;\n currentTarget = null;\n }\n },\n onShow(instance): void {\n if (instance.props.showOnCreate && !shownOnCreate) {\n shownOnCreate = true;\n prepareInstance(instance, references[0]);\n }\n },\n onTrigger(instance, event): void {\n prepareInstance(instance, event.currentTarget as Element);\n },\n };\n },\n };\n\n const singleton = tippy(div(), {\n ...removeProperties(optionalProps, ['overrides']),\n plugins: [plugin, ...(optionalProps.plugins || [])],\n triggerTarget: triggerTargets,\n popperOptions: {\n ...optionalProps.popperOptions,\n modifiers: [\n ...(optionalProps.popperOptions?.modifiers || []),\n applyStylesModifier,\n ],\n },\n }) as CreateSingletonInstance<CreateSingletonProps>;\n\n const originalShow = singleton.show;\n\n singleton.show = (target?: ReferenceElement | Instance | number): void => {\n originalShow();\n\n // first time, showOnCreate or programmatic call with no params\n // default to showing first instance\n if (!currentTarget && target == null) {\n return prepareInstance(singleton, references[0]);\n }\n\n // triggered from event (do nothing as prepareInstance already called by onTrigger)\n // programmatic call with no params when already visible (do nothing again)\n if (currentTarget && target == null) {\n return;\n }\n\n // target is index of instance\n if (typeof target === 'number') {\n return (\n references[target] && prepareInstance(singleton, references[target])\n );\n }\n\n // target is a child tippy instance\n if (individualInstances.indexOf(target as Instance) >= 0) {\n const ref = (target as Instance).reference;\n return prepareInstance(singleton, ref);\n }\n\n // target is a ReferenceElement\n if (references.indexOf(target as ReferenceElement) >= 0) {\n return prepareInstance(singleton, target as ReferenceElement);\n }\n };\n\n singleton.showNext = (): void => {\n const first = references[0];\n if (!currentTarget) {\n return singleton.show(0);\n }\n const index = references.indexOf(currentTarget);\n singleton.show(references[index + 1] || first);\n };\n\n singleton.showPrevious = (): void => {\n const last = references[references.length - 1];\n if (!currentTarget) {\n return singleton.show(last);\n }\n const index = references.indexOf(currentTarget);\n const target = references[index - 1] || last;\n singleton.show(target);\n };\n\n const originalSetProps = singleton.setProps;\n\n singleton.setProps = (props): void => {\n overrides = props.overrides || overrides;\n originalSetProps(props);\n };\n\n singleton.setInstances = (nextInstances): void => {\n enableInstances(true);\n interceptSetPropsCleanups.forEach((fn) => fn());\n\n individualInstances = nextInstances;\n\n enableInstances(false);\n setReferences();\n setTriggerTargets();\n interceptSetPropsCleanups = interceptSetProps(singleton);\n\n singleton.setProps({triggerTarget: triggerTargets});\n };\n\n interceptSetPropsCleanups = interceptSetProps(singleton);\n\n return singleton;\n};\n\nexport default createSingleton;\n","import tippy from '../src';\nimport {render} from '../src/template';\n\ntippy.setDefaultProps({render});\n\nexport {default, hideAll} from '../src';\nexport {default as createSingleton} from '../src/addons/createSingleton';\nexport {default as delegate} from '../src/addons/delegate';\nexport {default as animateFill} from '../src/plugins/animateFill';\nexport {default as followCursor} from '../src/plugins/followCursor';\nexport {default as inlinePositioning} from '../src/plugins/inlinePositioning';\nexport {default as sticky} from '../src/plugins/sticky';\nexport {ROUND_ARROW as roundArrow} from '../src/constants';\n","export const isBrowser =\n typeof window !== 'undefined' && typeof document !== 'undefined';\n\nexport function preserveRef(ref, node) {\n if (ref) {\n if (typeof ref === 'function') {\n ref(node);\n }\n if ({}.hasOwnProperty.call(ref, 'current')) {\n ref.current = node;\n }\n }\n}\n\nexport function ssrSafeCreateDiv() {\n return isBrowser && document.createElement('div');\n}\n\nexport function toDataAttributes(attrs) {\n const dataAttrs = {\n 'data-placement': attrs.placement,\n };\n\n if (attrs.referenceHidden) {\n dataAttrs['data-reference-hidden'] = '';\n }\n\n if (attrs.escaped) {\n dataAttrs['data-escaped'] = '';\n }\n\n return dataAttrs;\n}\n\nfunction deepEqual(x, y) {\n if (x === y) {\n return true;\n } else if (\n typeof x === 'object' &&\n x != null &&\n typeof y === 'object' &&\n y != null\n ) {\n if (Object.keys(x).length !== Object.keys(y).length) {\n return false;\n }\n\n for (const prop in x) {\n if (y.hasOwnProperty(prop)) {\n if (!deepEqual(x[prop], y[prop])) {\n return false;\n }\n } else {\n return false;\n }\n }\n\n return true;\n } else {\n return false;\n }\n}\n\nexport function uniqueByShape(arr) {\n const output = [];\n\n arr.forEach(item => {\n if (!output.find(outputItem => deepEqual(item, outputItem))) {\n output.push(item);\n }\n });\n\n return output;\n}\n\nexport function deepPreserveProps(instanceProps, componentProps) {\n return {\n ...componentProps,\n popperOptions: {\n ...instanceProps.popperOptions,\n ...componentProps.popperOptions,\n modifiers: uniqueByShape([\n ...(instanceProps.popperOptions?.modifiers || []),\n ...(componentProps.popperOptions?.modifiers || []),\n ]),\n },\n };\n}\n","import {isBrowser} from './utils';\nimport {useLayoutEffect, useEffect, useRef} from 'react';\n\nexport const useIsomorphicLayoutEffect = isBrowser\n ? useLayoutEffect\n : useEffect;\n\nexport function useMutableBox(initialValue) {\n // Using refs instead of state as it's recommended to not store imperative\n // values in state due to memory problems in React(?)\n const ref = useRef();\n\n if (!ref.current) {\n ref.current =\n typeof initialValue === 'function' ? initialValue() : initialValue;\n }\n\n return ref.current;\n}\n","function updateClassName(box, action, classNames) {\n classNames.split(/\\s+/).forEach(name => {\n if (name) {\n box.classList[action](name);\n }\n });\n}\n\nexport const classNamePlugin = {\n name: 'className',\n defaultValue: '',\n fn(instance) {\n const box = instance.popper.firstElementChild;\n const isDefaultRenderFn = () => !!instance.props.render?.$$tippy;\n\n function add() {\n if (instance.props.className && !isDefaultRenderFn()) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n [\n '@tippyjs/react: Cannot use `className` prop in conjunction with',\n '`render` prop. Place the className on the element you are',\n 'rendering.',\n ].join(' '),\n );\n }\n\n return;\n }\n\n updateClassName(box, 'add', instance.props.className);\n }\n\n function remove() {\n if (isDefaultRenderFn()) {\n updateClassName(box, 'remove', instance.props.className);\n }\n }\n\n return {\n onCreate: add,\n onBeforeUpdate: remove,\n onAfterUpdate: add,\n };\n },\n};\n","import React, {cloneElement, useState} from 'react';\nimport {createPortal} from 'react-dom';\nimport {\n preserveRef,\n ssrSafeCreateDiv,\n toDataAttributes,\n deepPreserveProps,\n} from './utils';\nimport {useMutableBox, useIsomorphicLayoutEffect} from './util-hooks';\nimport {classNamePlugin} from './className-plugin';\n\nexport default function TippyGenerator(tippy) {\n function Tippy({\n children,\n content,\n visible,\n singleton,\n render,\n reference,\n disabled = false,\n ignoreAttributes = true,\n // Filter React development reserved props\n // added by babel-preset-react dev plugins:\n // transform-react-jsx-self and transform-react-jsx-source\n __source,\n __self,\n ...restOfNativeProps\n }) {\n const isControlledMode = visible !== undefined;\n const isSingletonMode = singleton !== undefined;\n\n const [mounted, setMounted] = useState(false);\n const [attrs, setAttrs] = useState({});\n const [singletonContent, setSingletonContent] = useState();\n const mutableBox = useMutableBox(() => ({\n container: ssrSafeCreateDiv(),\n renders: 1,\n }));\n\n const props = {\n ignoreAttributes,\n ...restOfNativeProps,\n content: mutableBox.container,\n };\n\n if (isControlledMode) {\n if (process.env.NODE_ENV !== 'production') {\n ['trigger', 'hideOnClick', 'showOnCreate'].forEach(nativeStateProp => {\n if (props[nativeStateProp] !== undefined) {\n console.warn(\n [\n `@tippyjs/react: Cannot specify \\`${nativeStateProp}\\` prop in`,\n `controlled mode (\\`visible\\` prop)`,\n ].join(' '),\n );\n }\n });\n }\n\n props.trigger = 'manual';\n props.hideOnClick = false;\n }\n\n if (isSingletonMode) {\n disabled = true;\n }\n\n let computedProps = props;\n const plugins = props.plugins || [];\n\n if (render) {\n computedProps = {\n ...props,\n plugins:\n isSingletonMode && singleton.data != null\n ? [\n ...plugins,\n {\n fn() {\n return {\n onTrigger(instance, event) {\n const node = singleton.data.children.find(\n ({instance}) =>\n instance.reference === event.currentTarget,\n );\n instance.state.$$activeSingletonInstance =\n node.instance;\n setSingletonContent(node.content);\n },\n };\n },\n },\n ]\n : plugins,\n render: () => ({popper: mutableBox.container}),\n };\n }\n\n const deps = [reference].concat(children ? [children.type] : []);\n\n // CREATE\n useIsomorphicLayoutEffect(() => {\n let element = reference;\n if (reference && reference.hasOwnProperty('current')) {\n element = reference.current;\n }\n\n const instance = tippy(element || mutableBox.ref || ssrSafeCreateDiv(), {\n ...computedProps,\n plugins: [classNamePlugin, ...(props.plugins || [])],\n });\n\n mutableBox.instance = instance;\n\n if (disabled) {\n instance.disable();\n }\n\n if (visible) {\n instance.show();\n }\n\n if (isSingletonMode) {\n singleton.hook({\n instance,\n content,\n props: computedProps,\n setSingletonContent,\n });\n }\n\n setMounted(true);\n\n return () => {\n instance.destroy();\n singleton?.cleanup(instance);\n };\n }, deps);\n\n // UPDATE\n useIsomorphicLayoutEffect(() => {\n // Prevent this effect from running on 1st render\n if (mutableBox.renders === 1) {\n mutableBox.renders++;\n return;\n }\n\n const {instance} = mutableBox;\n\n instance.setProps(deepPreserveProps(instance.props, computedProps));\n\n // Fixes #264\n instance.popperInstance?.forceUpdate();\n\n if (disabled) {\n instance.disable();\n } else {\n instance.enable();\n }\n\n if (isControlledMode) {\n if (visible) {\n instance.show();\n } else {\n instance.hide();\n }\n }\n\n if (isSingletonMode) {\n singleton.hook({\n instance,\n content,\n props: computedProps,\n setSingletonContent,\n });\n }\n });\n\n useIsomorphicLayoutEffect(() => {\n if (!render) {\n return;\n }\n\n const {instance} = mutableBox;\n\n instance.setProps({\n popperOptions: {\n ...instance.props.popperOptions,\n modifiers: [\n ...(instance.props.popperOptions?.modifiers || []).filter(\n ({name}) => name !== '$$tippyReact',\n ),\n {\n name: '$$tippyReact',\n enabled: true,\n phase: 'beforeWrite',\n requires: ['computeStyles'],\n fn({state}) {\n const hideData = state.modifiersData?.hide;\n\n // WARNING: this is a high-risk path that can cause an infinite\n // loop. This expression _must_ evaluate to false when required\n if (\n attrs.placement !== state.placement ||\n attrs.referenceHidden !== hideData?.isReferenceHidden ||\n attrs.escaped !== hideData?.hasPopperEscaped\n ) {\n setAttrs({\n placement: state.placement,\n referenceHidden: hideData?.isReferenceHidden,\n escaped: hideData?.hasPopperEscaped,\n });\n }\n\n state.attributes.popper = {};\n },\n },\n ],\n },\n });\n }, [attrs.placement, attrs.referenceHidden, attrs.escaped, ...deps]);\n\n return (\n <>\n {children\n ? cloneElement(children, {\n ref(node) {\n mutableBox.ref = node;\n preserveRef(children.ref, node);\n },\n })\n : null}\n {mounted &&\n createPortal(\n render\n ? render(\n toDataAttributes(attrs),\n singletonContent,\n mutableBox.instance,\n )\n : content,\n mutableBox.container,\n )}\n </>\n );\n }\n\n return Tippy;\n}\n","import React, {cloneElement, forwardRef} from 'react';\nimport {preserveRef} from './utils';\n\nexport default (Tippy, defaultProps) =>\n forwardRef(function TippyWrapper({children, ...props}, ref) {\n return (\n // If I spread them separately here, Babel adds the _extends ponyfill for\n // some reason\n <Tippy {...{...defaultProps, ...props}}>\n {children\n ? cloneElement(children, {\n ref(node) {\n preserveRef(ref, node);\n preserveRef(children.ref, node);\n },\n })\n : null}\n </Tippy>\n );\n });\n","import tippy, {createSingleton} from 'tippy.js';\nimport TippyGenerator from './Tippy';\nimport useSingletonGenerator from './useSingleton';\nimport forwardRef from './forwardRef';\n\nconst useSingleton = useSingletonGenerator(createSingleton);\n\nexport default forwardRef(TippyGenerator(tippy));\nexport {useSingleton, tippy};\n",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./enc-base64\"), require(\"./md5\"), require(\"./evpkdf\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./enc-base64\", \"./md5\", \"./evpkdf\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var BlockCipher = C_lib.BlockCipher;\n\t var C_algo = C.algo;\n\n\t // Lookup tables\n\t var SBOX = [];\n\t var INV_SBOX = [];\n\t var SUB_MIX_0 = [];\n\t var SUB_MIX_1 = [];\n\t var SUB_MIX_2 = [];\n\t var SUB_MIX_3 = [];\n\t var INV_SUB_MIX_0 = [];\n\t var INV_SUB_MIX_1 = [];\n\t var INV_SUB_MIX_2 = [];\n\t var INV_SUB_MIX_3 = [];\n\n\t // Compute lookup tables\n\t (function () {\n\t // Compute double table\n\t var d = [];\n\t for (var i = 0; i < 256; i++) {\n\t if (i < 128) {\n\t d[i] = i << 1;\n\t } else {\n\t d[i] = (i << 1) ^ 0x11b;\n\t }\n\t }\n\n\t // Walk GF(2^8)\n\t var x = 0;\n\t var xi = 0;\n\t for (var i = 0; i < 256; i++) {\n\t // Compute sbox\n\t var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4);\n\t sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63;\n\t SBOX[x] = sx;\n\t INV_SBOX[sx] = x;\n\n\t // Compute multiplication\n\t var x2 = d[x];\n\t var x4 = d[x2];\n\t var x8 = d[x4];\n\n\t // Compute sub bytes, mix columns tables\n\t var t = (d[sx] * 0x101) ^ (sx * 0x1010100);\n\t SUB_MIX_0[x] = (t << 24) | (t >>> 8);\n\t SUB_MIX_1[x] = (t << 16) | (t >>> 16);\n\t SUB_MIX_2[x] = (t << 8) | (t >>> 24);\n\t SUB_MIX_3[x] = t;\n\n\t // Compute inv sub bytes, inv mix columns tables\n\t var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100);\n\t INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8);\n\t INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16);\n\t INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24);\n\t INV_SUB_MIX_3[sx] = t;\n\n\t // Compute next counter\n\t if (!x) {\n\t x = xi = 1;\n\t } else {\n\t x = x2 ^ d[d[d[x8 ^ x2]]];\n\t xi ^= d[d[xi]];\n\t }\n\t }\n\t }());\n\n\t // Precomputed Rcon lookup\n\t var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];\n\n\t /**\n\t * AES block cipher algorithm.\n\t */\n\t var AES = C_algo.AES = BlockCipher.extend({\n\t _doReset: function () {\n\t var t;\n\n\t // Skip reset of nRounds has been set before and key did not change\n\t if (this._nRounds && this._keyPriorReset === this._key) {\n\t return;\n\t }\n\n\t // Shortcuts\n\t var key = this._keyPriorReset = this._key;\n\t var keyWords = key.words;\n\t var keySize = key.sigBytes / 4;\n\n\t // Compute number of rounds\n\t var nRounds = this._nRounds = keySize + 6;\n\n\t // Compute number of key schedule rows\n\t var ksRows = (nRounds + 1) * 4;\n\n\t // Compute key schedule\n\t var keySchedule = this._keySchedule = [];\n\t for (var ksRow = 0; ksRow < ksRows; ksRow++) {\n\t if (ksRow < keySize) {\n\t keySchedule[ksRow] = keyWords[ksRow];\n\t } else {\n\t t = keySchedule[ksRow - 1];\n\n\t if (!(ksRow % keySize)) {\n\t // Rot word\n\t t = (t << 8) | (t >>> 24);\n\n\t // Sub word\n\t t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];\n\n\t // Mix Rcon\n\t t ^= RCON[(ksRow / keySize) | 0] << 24;\n\t } else if (keySize > 6 && ksRow % keySize == 4) {\n\t // Sub word\n\t t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];\n\t }\n\n\t keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;\n\t }\n\t }\n\n\t // Compute inv key schedule\n\t var invKeySchedule = this._invKeySchedule = [];\n\t for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) {\n\t var ksRow = ksRows - invKsRow;\n\n\t if (invKsRow % 4) {\n\t var t = keySchedule[ksRow];\n\t } else {\n\t var t = keySchedule[ksRow - 4];\n\t }\n\n\t if (invKsRow < 4 || ksRow <= 4) {\n\t invKeySchedule[invKsRow] = t;\n\t } else {\n\t invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^\n\t INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]];\n\t }\n\t }\n\t },\n\n\t encryptBlock: function (M, offset) {\n\t this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX);\n\t },\n\n\t decryptBlock: function (M, offset) {\n\t // Swap 2nd and 4th rows\n\t var t = M[offset + 1];\n\t M[offset + 1] = M[offset + 3];\n\t M[offset + 3] = t;\n\n\t this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX);\n\n\t // Inv swap 2nd and 4th rows\n\t var t = M[offset + 1];\n\t M[offset + 1] = M[offset + 3];\n\t M[offset + 3] = t;\n\t },\n\n\t _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) {\n\t // Shortcut\n\t var nRounds = this._nRounds;\n\n\t // Get input, add round key\n\t var s0 = M[offset] ^ keySchedule[0];\n\t var s1 = M[offset + 1] ^ keySchedule[1];\n\t var s2 = M[offset + 2] ^ keySchedule[2];\n\t var s3 = M[offset + 3] ^ keySchedule[3];\n\n\t // Key schedule row counter\n\t var ksRow = 4;\n\n\t // Rounds\n\t for (var round = 1; round < nRounds; round++) {\n\t // Shift rows, sub bytes, mix columns, add round key\n\t var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++];\n\t var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++];\n\t var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++];\n\t var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++];\n\n\t // Update state\n\t s0 = t0;\n\t s1 = t1;\n\t s2 = t2;\n\t s3 = t3;\n\t }\n\n\t // Shift rows, sub bytes, add round key\n\t var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++];\n\t var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++];\n\t var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++];\n\t var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++];\n\n\t // Set output\n\t M[offset] = t0;\n\t M[offset + 1] = t1;\n\t M[offset + 2] = t2;\n\t M[offset + 3] = t3;\n\t },\n\n\t keySize: 256/32\n\t });\n\n\t /**\n\t * Shortcut functions to the cipher's object interface.\n\t *\n\t * @example\n\t *\n\t * var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);\n\t * var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg);\n\t */\n\t C.AES = BlockCipher._createHelper(AES);\n\t}());\n\n\n\treturn CryptoJS.AES;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./evpkdf\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./evpkdf\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * Cipher core components.\n\t */\n\tCryptoJS.lib.Cipher || (function (undefined) {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Base = C_lib.Base;\n\t var WordArray = C_lib.WordArray;\n\t var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm;\n\t var C_enc = C.enc;\n\t var Utf8 = C_enc.Utf8;\n\t var Base64 = C_enc.Base64;\n\t var C_algo = C.algo;\n\t var EvpKDF = C_algo.EvpKDF;\n\n\t /**\n\t * Abstract base cipher template.\n\t *\n\t * @property {number} keySize This cipher's key size. Default: 4 (128 bits)\n\t * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits)\n\t * @property {number} _ENC_XFORM_MODE A constant representing encryption mode.\n\t * @property {number} _DEC_XFORM_MODE A constant representing decryption mode.\n\t */\n\t var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({\n\t /**\n\t * Configuration options.\n\t *\n\t * @property {WordArray} iv The IV to use for this operation.\n\t */\n\t cfg: Base.extend(),\n\n\t /**\n\t * Creates this cipher in encryption mode.\n\t *\n\t * @param {WordArray} key The key.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @return {Cipher} A cipher instance.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray });\n\t */\n\t createEncryptor: function (key, cfg) {\n\t return this.create(this._ENC_XFORM_MODE, key, cfg);\n\t },\n\n\t /**\n\t * Creates this cipher in decryption mode.\n\t *\n\t * @param {WordArray} key The key.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @return {Cipher} A cipher instance.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray });\n\t */\n\t createDecryptor: function (key, cfg) {\n\t return this.create(this._DEC_XFORM_MODE, key, cfg);\n\t },\n\n\t /**\n\t * Initializes a newly created cipher.\n\t *\n\t * @param {number} xformMode Either the encryption or decryption transormation mode constant.\n\t * @param {WordArray} key The key.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @example\n\t *\n\t * var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray });\n\t */\n\t init: function (xformMode, key, cfg) {\n\t // Apply config defaults\n\t this.cfg = this.cfg.extend(cfg);\n\n\t // Store transform mode and key\n\t this._xformMode = xformMode;\n\t this._key = key;\n\n\t // Set initial values\n\t this.reset();\n\t },\n\n\t /**\n\t * Resets this cipher to its initial state.\n\t *\n\t * @example\n\t *\n\t * cipher.reset();\n\t */\n\t reset: function () {\n\t // Reset data buffer\n\t BufferedBlockAlgorithm.reset.call(this);\n\n\t // Perform concrete-cipher logic\n\t this._doReset();\n\t },\n\n\t /**\n\t * Adds data to be encrypted or decrypted.\n\t *\n\t * @param {WordArray|string} dataUpdate The data to encrypt or decrypt.\n\t *\n\t * @return {WordArray} The data after processing.\n\t *\n\t * @example\n\t *\n\t * var encrypted = cipher.process('data');\n\t * var encrypted = cipher.process(wordArray);\n\t */\n\t process: function (dataUpdate) {\n\t // Append\n\t this._append(dataUpdate);\n\n\t // Process available blocks\n\t return this._process();\n\t },\n\n\t /**\n\t * Finalizes the encryption or decryption process.\n\t * Note that the finalize operation is effectively a destructive, read-once operation.\n\t *\n\t * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt.\n\t *\n\t * @return {WordArray} The data after final processing.\n\t *\n\t * @example\n\t *\n\t * var encrypted = cipher.finalize();\n\t * var encrypted = cipher.finalize('data');\n\t * var encrypted = cipher.finalize(wordArray);\n\t */\n\t finalize: function (dataUpdate) {\n\t // Final data update\n\t if (dataUpdate) {\n\t this._append(dataUpdate);\n\t }\n\n\t // Perform concrete-cipher logic\n\t var finalProcessedData = this._doFinalize();\n\n\t return finalProcessedData;\n\t },\n\n\t keySize: 128/32,\n\n\t ivSize: 128/32,\n\n\t _ENC_XFORM_MODE: 1,\n\n\t _DEC_XFORM_MODE: 2,\n\n\t /**\n\t * Creates shortcut functions to a cipher's object interface.\n\t *\n\t * @param {Cipher} cipher The cipher to create a helper for.\n\t *\n\t * @return {Object} An object with encrypt and decrypt shortcut functions.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES);\n\t */\n\t _createHelper: (function () {\n\t function selectCipherStrategy(key) {\n\t if (typeof key == 'string') {\n\t return PasswordBasedCipher;\n\t } else {\n\t return SerializableCipher;\n\t }\n\t }\n\n\t return function (cipher) {\n\t return {\n\t encrypt: function (message, key, cfg) {\n\t return selectCipherStrategy(key).encrypt(cipher, message, key, cfg);\n\t },\n\n\t decrypt: function (ciphertext, key, cfg) {\n\t return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg);\n\t }\n\t };\n\t };\n\t }())\n\t });\n\n\t /**\n\t * Abstract base stream cipher template.\n\t *\n\t * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits)\n\t */\n\t var StreamCipher = C_lib.StreamCipher = Cipher.extend({\n\t _doFinalize: function () {\n\t // Process partial blocks\n\t var finalProcessedBlocks = this._process(!!'flush');\n\n\t return finalProcessedBlocks;\n\t },\n\n\t blockSize: 1\n\t });\n\n\t /**\n\t * Mode namespace.\n\t */\n\t var C_mode = C.mode = {};\n\n\t /**\n\t * Abstract base block cipher mode template.\n\t */\n\t var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({\n\t /**\n\t * Creates this mode for encryption.\n\t *\n\t * @param {Cipher} cipher A block cipher instance.\n\t * @param {Array} iv The IV words.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words);\n\t */\n\t createEncryptor: function (cipher, iv) {\n\t return this.Encryptor.create(cipher, iv);\n\t },\n\n\t /**\n\t * Creates this mode for decryption.\n\t *\n\t * @param {Cipher} cipher A block cipher instance.\n\t * @param {Array} iv The IV words.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words);\n\t */\n\t createDecryptor: function (cipher, iv) {\n\t return this.Decryptor.create(cipher, iv);\n\t },\n\n\t /**\n\t * Initializes a newly created mode.\n\t *\n\t * @param {Cipher} cipher A block cipher instance.\n\t * @param {Array} iv The IV words.\n\t *\n\t * @example\n\t *\n\t * var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words);\n\t */\n\t init: function (cipher, iv) {\n\t this._cipher = cipher;\n\t this._iv = iv;\n\t }\n\t });\n\n\t /**\n\t * Cipher Block Chaining mode.\n\t */\n\t var CBC = C_mode.CBC = (function () {\n\t /**\n\t * Abstract base CBC mode.\n\t */\n\t var CBC = BlockCipherMode.extend();\n\n\t /**\n\t * CBC encryptor.\n\t */\n\t CBC.Encryptor = CBC.extend({\n\t /**\n\t * Processes the data block at offset.\n\t *\n\t * @param {Array} words The data words to operate on.\n\t * @param {number} offset The offset where the block starts.\n\t *\n\t * @example\n\t *\n\t * mode.processBlock(data.words, offset);\n\t */\n\t processBlock: function (words, offset) {\n\t // Shortcuts\n\t var cipher = this._cipher;\n\t var blockSize = cipher.blockSize;\n\n\t // XOR and encrypt\n\t xorBlock.call(this, words, offset, blockSize);\n\t cipher.encryptBlock(words, offset);\n\n\t // Remember this block to use with next block\n\t this._prevBlock = words.slice(offset, offset + blockSize);\n\t }\n\t });\n\n\t /**\n\t * CBC decryptor.\n\t */\n\t CBC.Decryptor = CBC.extend({\n\t /**\n\t * Processes the data block at offset.\n\t *\n\t * @param {Array} words The data words to operate on.\n\t * @param {number} offset The offset where the block starts.\n\t *\n\t * @example\n\t *\n\t * mode.processBlock(data.words, offset);\n\t */\n\t processBlock: function (words, offset) {\n\t // Shortcuts\n\t var cipher = this._cipher;\n\t var blockSize = cipher.blockSize;\n\n\t // Remember this block to use with next block\n\t var thisBlock = words.slice(offset, offset + blockSize);\n\n\t // Decrypt and XOR\n\t cipher.decryptBlock(words, offset);\n\t xorBlock.call(this, words, offset, blockSize);\n\n\t // This block becomes the previous block\n\t this._prevBlock = thisBlock;\n\t }\n\t });\n\n\t function xorBlock(words, offset, blockSize) {\n\t var block;\n\n\t // Shortcut\n\t var iv = this._iv;\n\n\t // Choose mixing block\n\t if (iv) {\n\t block = iv;\n\n\t // Remove IV for subsequent blocks\n\t this._iv = undefined;\n\t } else {\n\t block = this._prevBlock;\n\t }\n\n\t // XOR blocks\n\t for (var i = 0; i < blockSize; i++) {\n\t words[offset + i] ^= block[i];\n\t }\n\t }\n\n\t return CBC;\n\t }());\n\n\t /**\n\t * Padding namespace.\n\t */\n\t var C_pad = C.pad = {};\n\n\t /**\n\t * PKCS #5/7 padding strategy.\n\t */\n\t var Pkcs7 = C_pad.Pkcs7 = {\n\t /**\n\t * Pads data using the algorithm defined in PKCS #5/7.\n\t *\n\t * @param {WordArray} data The data to pad.\n\t * @param {number} blockSize The multiple that the data should be padded to.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * CryptoJS.pad.Pkcs7.pad(wordArray, 4);\n\t */\n\t pad: function (data, blockSize) {\n\t // Shortcut\n\t var blockSizeBytes = blockSize * 4;\n\n\t // Count padding bytes\n\t var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;\n\n\t // Create padding word\n\t var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes;\n\n\t // Create padding\n\t var paddingWords = [];\n\t for (var i = 0; i < nPaddingBytes; i += 4) {\n\t paddingWords.push(paddingWord);\n\t }\n\t var padding = WordArray.create(paddingWords, nPaddingBytes);\n\n\t // Add padding\n\t data.concat(padding);\n\t },\n\n\t /**\n\t * Unpads data that had been padded using the algorithm defined in PKCS #5/7.\n\t *\n\t * @param {WordArray} data The data to unpad.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * CryptoJS.pad.Pkcs7.unpad(wordArray);\n\t */\n\t unpad: function (data) {\n\t // Get number of padding bytes from last byte\n\t var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\n\n\t // Remove padding\n\t data.sigBytes -= nPaddingBytes;\n\t }\n\t };\n\n\t /**\n\t * Abstract base block cipher template.\n\t *\n\t * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits)\n\t */\n\t var BlockCipher = C_lib.BlockCipher = Cipher.extend({\n\t /**\n\t * Configuration options.\n\t *\n\t * @property {Mode} mode The block mode to use. Default: CBC\n\t * @property {Padding} padding The padding strategy to use. Default: Pkcs7\n\t */\n\t cfg: Cipher.cfg.extend({\n\t mode: CBC,\n\t padding: Pkcs7\n\t }),\n\n\t reset: function () {\n\t var modeCreator;\n\n\t // Reset cipher\n\t Cipher.reset.call(this);\n\n\t // Shortcuts\n\t var cfg = this.cfg;\n\t var iv = cfg.iv;\n\t var mode = cfg.mode;\n\n\t // Reset block mode\n\t if (this._xformMode == this._ENC_XFORM_MODE) {\n\t modeCreator = mode.createEncryptor;\n\t } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\n\t modeCreator = mode.createDecryptor;\n\t // Keep at least one block in the buffer for unpadding\n\t this._minBufferSize = 1;\n\t }\n\n\t if (this._mode && this._mode.__creator == modeCreator) {\n\t this._mode.init(this, iv && iv.words);\n\t } else {\n\t this._mode = modeCreator.call(mode, this, iv && iv.words);\n\t this._mode.__creator = modeCreator;\n\t }\n\t },\n\n\t _doProcessBlock: function (words, offset) {\n\t this._mode.processBlock(words, offset);\n\t },\n\n\t _doFinalize: function () {\n\t var finalProcessedBlocks;\n\n\t // Shortcut\n\t var padding = this.cfg.padding;\n\n\t // Finalize\n\t if (this._xformMode == this._ENC_XFORM_MODE) {\n\t // Pad data\n\t padding.pad(this._data, this.blockSize);\n\n\t // Process final blocks\n\t finalProcessedBlocks = this._process(!!'flush');\n\t } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\n\t // Process final blocks\n\t finalProcessedBlocks = this._process(!!'flush');\n\n\t // Unpad data\n\t padding.unpad(finalProcessedBlocks);\n\t }\n\n\t return finalProcessedBlocks;\n\t },\n\n\t blockSize: 128/32\n\t });\n\n\t /**\n\t * A collection of cipher parameters.\n\t *\n\t * @property {WordArray} ciphertext The raw ciphertext.\n\t * @property {WordArray} key The key to this ciphertext.\n\t * @property {WordArray} iv The IV used in the ciphering operation.\n\t * @property {WordArray} salt The salt used with a key derivation function.\n\t * @property {Cipher} algorithm The cipher algorithm.\n\t * @property {Mode} mode The block mode used in the ciphering operation.\n\t * @property {Padding} padding The padding scheme used in the ciphering operation.\n\t * @property {number} blockSize The block size of the cipher.\n\t * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string.\n\t */\n\t var CipherParams = C_lib.CipherParams = Base.extend({\n\t /**\n\t * Initializes a newly created cipher params object.\n\t *\n\t * @param {Object} cipherParams An object with any of the possible cipher parameters.\n\t *\n\t * @example\n\t *\n\t * var cipherParams = CryptoJS.lib.CipherParams.create({\n\t * ciphertext: ciphertextWordArray,\n\t * key: keyWordArray,\n\t * iv: ivWordArray,\n\t * salt: saltWordArray,\n\t * algorithm: CryptoJS.algo.AES,\n\t * mode: CryptoJS.mode.CBC,\n\t * padding: CryptoJS.pad.PKCS7,\n\t * blockSize: 4,\n\t * formatter: CryptoJS.format.OpenSSL\n\t * });\n\t */\n\t init: function (cipherParams) {\n\t this.mixIn(cipherParams);\n\t },\n\n\t /**\n\t * Converts this cipher params object to a string.\n\t *\n\t * @param {Format} formatter (Optional) The formatting strategy to use.\n\t *\n\t * @return {string} The stringified cipher params.\n\t *\n\t * @throws Error If neither the formatter nor the default formatter is set.\n\t *\n\t * @example\n\t *\n\t * var string = cipherParams + '';\n\t * var string = cipherParams.toString();\n\t * var string = cipherParams.toString(CryptoJS.format.OpenSSL);\n\t */\n\t toString: function (formatter) {\n\t return (formatter || this.formatter).stringify(this);\n\t }\n\t });\n\n\t /**\n\t * Format namespace.\n\t */\n\t var C_format = C.format = {};\n\n\t /**\n\t * OpenSSL formatting strategy.\n\t */\n\t var OpenSSLFormatter = C_format.OpenSSL = {\n\t /**\n\t * Converts a cipher params object to an OpenSSL-compatible string.\n\t *\n\t * @param {CipherParams} cipherParams The cipher params object.\n\t *\n\t * @return {string} The OpenSSL-compatible string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams);\n\t */\n\t stringify: function (cipherParams) {\n\t var wordArray;\n\n\t // Shortcuts\n\t var ciphertext = cipherParams.ciphertext;\n\t var salt = cipherParams.salt;\n\n\t // Format\n\t if (salt) {\n\t wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext);\n\t } else {\n\t wordArray = ciphertext;\n\t }\n\n\t return wordArray.toString(Base64);\n\t },\n\n\t /**\n\t * Converts an OpenSSL-compatible string to a cipher params object.\n\t *\n\t * @param {string} openSSLStr The OpenSSL-compatible string.\n\t *\n\t * @return {CipherParams} The cipher params object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString);\n\t */\n\t parse: function (openSSLStr) {\n\t var salt;\n\n\t // Parse base64\n\t var ciphertext = Base64.parse(openSSLStr);\n\n\t // Shortcut\n\t var ciphertextWords = ciphertext.words;\n\n\t // Test for salt\n\t if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) {\n\t // Extract salt\n\t salt = WordArray.create(ciphertextWords.slice(2, 4));\n\n\t // Remove salt from ciphertext\n\t ciphertextWords.splice(0, 4);\n\t ciphertext.sigBytes -= 16;\n\t }\n\n\t return CipherParams.create({ ciphertext: ciphertext, salt: salt });\n\t }\n\t };\n\n\t /**\n\t * A cipher wrapper that returns ciphertext as a serializable cipher params object.\n\t */\n\t var SerializableCipher = C_lib.SerializableCipher = Base.extend({\n\t /**\n\t * Configuration options.\n\t *\n\t * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL\n\t */\n\t cfg: Base.extend({\n\t format: OpenSSLFormatter\n\t }),\n\n\t /**\n\t * Encrypts a message.\n\t *\n\t * @param {Cipher} cipher The cipher algorithm to use.\n\t * @param {WordArray|string} message The message to encrypt.\n\t * @param {WordArray} key The key.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @return {CipherParams} A cipher params object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key);\n\t * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv });\n\t * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n\t */\n\t encrypt: function (cipher, message, key, cfg) {\n\t // Apply config defaults\n\t cfg = this.cfg.extend(cfg);\n\n\t // Encrypt\n\t var encryptor = cipher.createEncryptor(key, cfg);\n\t var ciphertext = encryptor.finalize(message);\n\n\t // Shortcut\n\t var cipherCfg = encryptor.cfg;\n\n\t // Create and return serializable cipher params\n\t return CipherParams.create({\n\t ciphertext: ciphertext,\n\t key: key,\n\t iv: cipherCfg.iv,\n\t algorithm: cipher,\n\t mode: cipherCfg.mode,\n\t padding: cipherCfg.padding,\n\t blockSize: cipher.blockSize,\n\t formatter: cfg.format\n\t });\n\t },\n\n\t /**\n\t * Decrypts serialized ciphertext.\n\t *\n\t * @param {Cipher} cipher The cipher algorithm to use.\n\t * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\n\t * @param {WordArray} key The key.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @return {WordArray} The plaintext.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n\t * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n\t */\n\t decrypt: function (cipher, ciphertext, key, cfg) {\n\t // Apply config defaults\n\t cfg = this.cfg.extend(cfg);\n\n\t // Convert string to CipherParams\n\t ciphertext = this._parse(ciphertext, cfg.format);\n\n\t // Decrypt\n\t var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext);\n\n\t return plaintext;\n\t },\n\n\t /**\n\t * Converts serialized ciphertext to CipherParams,\n\t * else assumed CipherParams already and returns ciphertext unchanged.\n\t *\n\t * @param {CipherParams|string} ciphertext The ciphertext.\n\t * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext.\n\t *\n\t * @return {CipherParams} The unserialized ciphertext.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format);\n\t */\n\t _parse: function (ciphertext, format) {\n\t if (typeof ciphertext == 'string') {\n\t return format.parse(ciphertext, this);\n\t } else {\n\t return ciphertext;\n\t }\n\t }\n\t });\n\n\t /**\n\t * Key derivation function namespace.\n\t */\n\t var C_kdf = C.kdf = {};\n\n\t /**\n\t * OpenSSL key derivation function.\n\t */\n\t var OpenSSLKdf = C_kdf.OpenSSL = {\n\t /**\n\t * Derives a key and IV from a password.\n\t *\n\t * @param {string} password The password to derive from.\n\t * @param {number} keySize The size in words of the key to generate.\n\t * @param {number} ivSize The size in words of the IV to generate.\n\t * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly.\n\t *\n\t * @return {CipherParams} A cipher params object with the key, IV, and salt.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32);\n\t * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt');\n\t */\n\t execute: function (password, keySize, ivSize, salt, hasher) {\n\t // Generate random salt\n\t if (!salt) {\n\t salt = WordArray.random(64/8);\n\t }\n\n\t // Derive key and IV\n\t if (!hasher) {\n\t var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt);\n\t } else {\n\t var key = EvpKDF.create({ keySize: keySize + ivSize, hasher: hasher }).compute(password, salt);\n\t }\n\n\n\t // Separate key and IV\n\t var iv = WordArray.create(key.words.slice(keySize), ivSize * 4);\n\t key.sigBytes = keySize * 4;\n\n\t // Return params\n\t return CipherParams.create({ key: key, iv: iv, salt: salt });\n\t }\n\t };\n\n\t /**\n\t * A serializable cipher wrapper that derives the key from a password,\n\t * and returns ciphertext as a serializable cipher params object.\n\t */\n\t var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({\n\t /**\n\t * Configuration options.\n\t *\n\t * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL\n\t */\n\t cfg: SerializableCipher.cfg.extend({\n\t kdf: OpenSSLKdf\n\t }),\n\n\t /**\n\t * Encrypts a message using a password.\n\t *\n\t * @param {Cipher} cipher The cipher algorithm to use.\n\t * @param {WordArray|string} message The message to encrypt.\n\t * @param {string} password The password.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @return {CipherParams} A cipher params object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password');\n\t * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL });\n\t */\n\t encrypt: function (cipher, message, password, cfg) {\n\t // Apply config defaults\n\t cfg = this.cfg.extend(cfg);\n\n\t // Derive key and other params\n\t var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, cfg.salt, cfg.hasher);\n\n\t // Add IV to config\n\t cfg.iv = derivedParams.iv;\n\n\t // Encrypt\n\t var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg);\n\n\t // Mix in derived params\n\t ciphertext.mixIn(derivedParams);\n\n\t return ciphertext;\n\t },\n\n\t /**\n\t * Decrypts serialized ciphertext using a password.\n\t *\n\t * @param {Cipher} cipher The cipher algorithm to use.\n\t * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\n\t * @param {string} password The password.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @return {WordArray} The plaintext.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL });\n\t * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL });\n\t */\n\t decrypt: function (cipher, ciphertext, password, cfg) {\n\t // Apply config defaults\n\t cfg = this.cfg.extend(cfg);\n\n\t // Convert string to CipherParams\n\t ciphertext = this._parse(ciphertext, cfg.format);\n\n\t // Derive key and other params\n\t var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt, cfg.hasher);\n\n\t // Add IV to config\n\t cfg.iv = derivedParams.iv;\n\n\t // Decrypt\n\t var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg);\n\n\t return plaintext;\n\t }\n\t });\n\t}());\n\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory();\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\troot.CryptoJS = factory();\n\t}\n}(this, function () {\n\n\t/*globals window, global, require*/\n\n\t/**\n\t * CryptoJS core components.\n\t */\n\tvar CryptoJS = CryptoJS || (function (Math, undefined) {\n\n\t var crypto;\n\n\t // Native crypto from window (Browser)\n\t if (typeof window !== 'undefined' && window.crypto) {\n\t crypto = window.crypto;\n\t }\n\n\t // Native crypto in web worker (Browser)\n\t if (typeof self !== 'undefined' && self.crypto) {\n\t crypto = self.crypto;\n\t }\n\n\t // Native crypto from worker\n\t if (typeof globalThis !== 'undefined' && globalThis.crypto) {\n\t crypto = globalThis.crypto;\n\t }\n\n\t // Native (experimental IE 11) crypto from window (Browser)\n\t if (!crypto && typeof window !== 'undefined' && window.msCrypto) {\n\t crypto = window.msCrypto;\n\t }\n\n\t // Native crypto from global (NodeJS)\n\t if (!crypto && typeof global !== 'undefined' && global.crypto) {\n\t crypto = global.crypto;\n\t }\n\n\t // Native crypto import via require (NodeJS)\n\t if (!crypto && typeof require === 'function') {\n\t try {\n\t crypto = require('crypto');\n\t } catch (err) {}\n\t }\n\n\t /*\n\t * Cryptographically secure pseudorandom number generator\n\t *\n\t * As Math.random() is cryptographically not safe to use\n\t */\n\t var cryptoSecureRandomInt = function () {\n\t if (crypto) {\n\t // Use getRandomValues method (Browser)\n\t if (typeof crypto.getRandomValues === 'function') {\n\t try {\n\t return crypto.getRandomValues(new Uint32Array(1))[0];\n\t } catch (err) {}\n\t }\n\n\t // Use randomBytes method (NodeJS)\n\t if (typeof crypto.randomBytes === 'function') {\n\t try {\n\t return crypto.randomBytes(4).readInt32LE();\n\t } catch (err) {}\n\t }\n\t }\n\n\t throw new Error('Native crypto module could not be used to get secure random number.');\n\t };\n\n\t /*\n\t * Local polyfill of Object.create\n\n\t */\n\t var create = Object.create || (function () {\n\t function F() {}\n\n\t return function (obj) {\n\t var subtype;\n\n\t F.prototype = obj;\n\n\t subtype = new F();\n\n\t F.prototype = null;\n\n\t return subtype;\n\t };\n\t }());\n\n\t /**\n\t * CryptoJS namespace.\n\t */\n\t var C = {};\n\n\t /**\n\t * Library namespace.\n\t */\n\t var C_lib = C.lib = {};\n\n\t /**\n\t * Base object for prototypal inheritance.\n\t */\n\t var Base = C_lib.Base = (function () {\n\n\n\t return {\n\t /**\n\t * Creates a new object that inherits from this object.\n\t *\n\t * @param {Object} overrides Properties to copy into the new object.\n\t *\n\t * @return {Object} The new object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var MyType = CryptoJS.lib.Base.extend({\n\t * field: 'value',\n\t *\n\t * method: function () {\n\t * }\n\t * });\n\t */\n\t extend: function (overrides) {\n\t // Spawn\n\t var subtype = create(this);\n\n\t // Augment\n\t if (overrides) {\n\t subtype.mixIn(overrides);\n\t }\n\n\t // Create default initializer\n\t if (!subtype.hasOwnProperty('init') || this.init === subtype.init) {\n\t subtype.init = function () {\n\t subtype.$super.init.apply(this, arguments);\n\t };\n\t }\n\n\t // Initializer's prototype is the subtype object\n\t subtype.init.prototype = subtype;\n\n\t // Reference supertype\n\t subtype.$super = this;\n\n\t return subtype;\n\t },\n\n\t /**\n\t * Extends this object and runs the init method.\n\t * Arguments to create() will be passed to init().\n\t *\n\t * @return {Object} The new object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var instance = MyType.create();\n\t */\n\t create: function () {\n\t var instance = this.extend();\n\t instance.init.apply(instance, arguments);\n\n\t return instance;\n\t },\n\n\t /**\n\t * Initializes a newly created object.\n\t * Override this method to add some logic when your objects are created.\n\t *\n\t * @example\n\t *\n\t * var MyType = CryptoJS.lib.Base.extend({\n\t * init: function () {\n\t * // ...\n\t * }\n\t * });\n\t */\n\t init: function () {\n\t },\n\n\t /**\n\t * Copies properties into this object.\n\t *\n\t * @param {Object} properties The properties to mix in.\n\t *\n\t * @example\n\t *\n\t * MyType.mixIn({\n\t * field: 'value'\n\t * });\n\t */\n\t mixIn: function (properties) {\n\t for (var propertyName in properties) {\n\t if (properties.hasOwnProperty(propertyName)) {\n\t this[propertyName] = properties[propertyName];\n\t }\n\t }\n\n\t // IE won't copy toString using the loop above\n\t if (properties.hasOwnProperty('toString')) {\n\t this.toString = properties.toString;\n\t }\n\t },\n\n\t /**\n\t * Creates a copy of this object.\n\t *\n\t * @return {Object} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = instance.clone();\n\t */\n\t clone: function () {\n\t return this.init.prototype.extend(this);\n\t }\n\t };\n\t }());\n\n\t /**\n\t * An array of 32-bit words.\n\t *\n\t * @property {Array} words The array of 32-bit words.\n\t * @property {number} sigBytes The number of significant bytes in this word array.\n\t */\n\t var WordArray = C_lib.WordArray = Base.extend({\n\t /**\n\t * Initializes a newly created word array.\n\t *\n\t * @param {Array} words (Optional) An array of 32-bit words.\n\t * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.lib.WordArray.create();\n\t * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);\n\t * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);\n\t */\n\t init: function (words, sigBytes) {\n\t words = this.words = words || [];\n\n\t if (sigBytes != undefined) {\n\t this.sigBytes = sigBytes;\n\t } else {\n\t this.sigBytes = words.length * 4;\n\t }\n\t },\n\n\t /**\n\t * Converts this word array to a string.\n\t *\n\t * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex\n\t *\n\t * @return {string} The stringified word array.\n\t *\n\t * @example\n\t *\n\t * var string = wordArray + '';\n\t * var string = wordArray.toString();\n\t * var string = wordArray.toString(CryptoJS.enc.Utf8);\n\t */\n\t toString: function (encoder) {\n\t return (encoder || Hex).stringify(this);\n\t },\n\n\t /**\n\t * Concatenates a word array to this word array.\n\t *\n\t * @param {WordArray} wordArray The word array to append.\n\t *\n\t * @return {WordArray} This word array.\n\t *\n\t * @example\n\t *\n\t * wordArray1.concat(wordArray2);\n\t */\n\t concat: function (wordArray) {\n\t // Shortcuts\n\t var thisWords = this.words;\n\t var thatWords = wordArray.words;\n\t var thisSigBytes = this.sigBytes;\n\t var thatSigBytes = wordArray.sigBytes;\n\n\t // Clamp excess bits\n\t this.clamp();\n\n\t // Concat\n\t if (thisSigBytes % 4) {\n\t // Copy one byte at a time\n\t for (var i = 0; i < thatSigBytes; i++) {\n\t var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);\n\t }\n\t } else {\n\t // Copy one word at a time\n\t for (var j = 0; j < thatSigBytes; j += 4) {\n\t thisWords[(thisSigBytes + j) >>> 2] = thatWords[j >>> 2];\n\t }\n\t }\n\t this.sigBytes += thatSigBytes;\n\n\t // Chainable\n\t return this;\n\t },\n\n\t /**\n\t * Removes insignificant bits.\n\t *\n\t * @example\n\t *\n\t * wordArray.clamp();\n\t */\n\t clamp: function () {\n\t // Shortcuts\n\t var words = this.words;\n\t var sigBytes = this.sigBytes;\n\n\t // Clamp\n\t words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);\n\t words.length = Math.ceil(sigBytes / 4);\n\t },\n\n\t /**\n\t * Creates a copy of this word array.\n\t *\n\t * @return {WordArray} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = wordArray.clone();\n\t */\n\t clone: function () {\n\t var clone = Base.clone.call(this);\n\t clone.words = this.words.slice(0);\n\n\t return clone;\n\t },\n\n\t /**\n\t * Creates a word array filled with random bytes.\n\t *\n\t * @param {number} nBytes The number of random bytes to generate.\n\t *\n\t * @return {WordArray} The random word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.lib.WordArray.random(16);\n\t */\n\t random: function (nBytes) {\n\t var words = [];\n\n\t for (var i = 0; i < nBytes; i += 4) {\n\t words.push(cryptoSecureRandomInt());\n\t }\n\n\t return new WordArray.init(words, nBytes);\n\t }\n\t });\n\n\t /**\n\t * Encoder namespace.\n\t */\n\t var C_enc = C.enc = {};\n\n\t /**\n\t * Hex encoding strategy.\n\t */\n\t var Hex = C_enc.Hex = {\n\t /**\n\t * Converts a word array to a hex string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The hex string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hexString = CryptoJS.enc.Hex.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t // Shortcuts\n\t var words = wordArray.words;\n\t var sigBytes = wordArray.sigBytes;\n\n\t // Convert\n\t var hexChars = [];\n\t for (var i = 0; i < sigBytes; i++) {\n\t var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t hexChars.push((bite >>> 4).toString(16));\n\t hexChars.push((bite & 0x0f).toString(16));\n\t }\n\n\t return hexChars.join('');\n\t },\n\n\t /**\n\t * Converts a hex string to a word array.\n\t *\n\t * @param {string} hexStr The hex string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Hex.parse(hexString);\n\t */\n\t parse: function (hexStr) {\n\t // Shortcut\n\t var hexStrLength = hexStr.length;\n\n\t // Convert\n\t var words = [];\n\t for (var i = 0; i < hexStrLength; i += 2) {\n\t words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);\n\t }\n\n\t return new WordArray.init(words, hexStrLength / 2);\n\t }\n\t };\n\n\t /**\n\t * Latin1 encoding strategy.\n\t */\n\t var Latin1 = C_enc.Latin1 = {\n\t /**\n\t * Converts a word array to a Latin1 string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The Latin1 string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t // Shortcuts\n\t var words = wordArray.words;\n\t var sigBytes = wordArray.sigBytes;\n\n\t // Convert\n\t var latin1Chars = [];\n\t for (var i = 0; i < sigBytes; i++) {\n\t var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t latin1Chars.push(String.fromCharCode(bite));\n\t }\n\n\t return latin1Chars.join('');\n\t },\n\n\t /**\n\t * Converts a Latin1 string to a word array.\n\t *\n\t * @param {string} latin1Str The Latin1 string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Latin1.parse(latin1String);\n\t */\n\t parse: function (latin1Str) {\n\t // Shortcut\n\t var latin1StrLength = latin1Str.length;\n\n\t // Convert\n\t var words = [];\n\t for (var i = 0; i < latin1StrLength; i++) {\n\t words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);\n\t }\n\n\t return new WordArray.init(words, latin1StrLength);\n\t }\n\t };\n\n\t /**\n\t * UTF-8 encoding strategy.\n\t */\n\t var Utf8 = C_enc.Utf8 = {\n\t /**\n\t * Converts a word array to a UTF-8 string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The UTF-8 string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t try {\n\t return decodeURIComponent(escape(Latin1.stringify(wordArray)));\n\t } catch (e) {\n\t throw new Error('Malformed UTF-8 data');\n\t }\n\t },\n\n\t /**\n\t * Converts a UTF-8 string to a word array.\n\t *\n\t * @param {string} utf8Str The UTF-8 string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Utf8.parse(utf8String);\n\t */\n\t parse: function (utf8Str) {\n\t return Latin1.parse(unescape(encodeURIComponent(utf8Str)));\n\t }\n\t };\n\n\t /**\n\t * Abstract buffered block algorithm template.\n\t *\n\t * The property blockSize must be implemented in a concrete subtype.\n\t *\n\t * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0\n\t */\n\t var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({\n\t /**\n\t * Resets this block algorithm's data buffer to its initial state.\n\t *\n\t * @example\n\t *\n\t * bufferedBlockAlgorithm.reset();\n\t */\n\t reset: function () {\n\t // Initial values\n\t this._data = new WordArray.init();\n\t this._nDataBytes = 0;\n\t },\n\n\t /**\n\t * Adds new data to this block algorithm's buffer.\n\t *\n\t * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.\n\t *\n\t * @example\n\t *\n\t * bufferedBlockAlgorithm._append('data');\n\t * bufferedBlockAlgorithm._append(wordArray);\n\t */\n\t _append: function (data) {\n\t // Convert string to WordArray, else assume WordArray already\n\t if (typeof data == 'string') {\n\t data = Utf8.parse(data);\n\t }\n\n\t // Append\n\t this._data.concat(data);\n\t this._nDataBytes += data.sigBytes;\n\t },\n\n\t /**\n\t * Processes available data blocks.\n\t *\n\t * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.\n\t *\n\t * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.\n\t *\n\t * @return {WordArray} The processed data.\n\t *\n\t * @example\n\t *\n\t * var processedData = bufferedBlockAlgorithm._process();\n\t * var processedData = bufferedBlockAlgorithm._process(!!'flush');\n\t */\n\t _process: function (doFlush) {\n\t var processedWords;\n\n\t // Shortcuts\n\t var data = this._data;\n\t var dataWords = data.words;\n\t var dataSigBytes = data.sigBytes;\n\t var blockSize = this.blockSize;\n\t var blockSizeBytes = blockSize * 4;\n\n\t // Count blocks ready\n\t var nBlocksReady = dataSigBytes / blockSizeBytes;\n\t if (doFlush) {\n\t // Round up to include partial blocks\n\t nBlocksReady = Math.ceil(nBlocksReady);\n\t } else {\n\t // Round down to include only full blocks,\n\t // less the number of blocks that must remain in the buffer\n\t nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);\n\t }\n\n\t // Count words ready\n\t var nWordsReady = nBlocksReady * blockSize;\n\n\t // Count bytes ready\n\t var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);\n\n\t // Process blocks\n\t if (nWordsReady) {\n\t for (var offset = 0; offset < nWordsReady; offset += blockSize) {\n\t // Perform concrete-algorithm logic\n\t this._doProcessBlock(dataWords, offset);\n\t }\n\n\t // Remove processed words\n\t processedWords = dataWords.splice(0, nWordsReady);\n\t data.sigBytes -= nBytesReady;\n\t }\n\n\t // Return processed words\n\t return new WordArray.init(processedWords, nBytesReady);\n\t },\n\n\t /**\n\t * Creates a copy of this object.\n\t *\n\t * @return {Object} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = bufferedBlockAlgorithm.clone();\n\t */\n\t clone: function () {\n\t var clone = Base.clone.call(this);\n\t clone._data = this._data.clone();\n\n\t return clone;\n\t },\n\n\t _minBufferSize: 0\n\t });\n\n\t /**\n\t * Abstract hasher template.\n\t *\n\t * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)\n\t */\n\t var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({\n\t /**\n\t * Configuration options.\n\t */\n\t cfg: Base.extend(),\n\n\t /**\n\t * Initializes a newly created hasher.\n\t *\n\t * @param {Object} cfg (Optional) The configuration options to use for this hash computation.\n\t *\n\t * @example\n\t *\n\t * var hasher = CryptoJS.algo.SHA256.create();\n\t */\n\t init: function (cfg) {\n\t // Apply config defaults\n\t this.cfg = this.cfg.extend(cfg);\n\n\t // Set initial values\n\t this.reset();\n\t },\n\n\t /**\n\t * Resets this hasher to its initial state.\n\t *\n\t * @example\n\t *\n\t * hasher.reset();\n\t */\n\t reset: function () {\n\t // Reset data buffer\n\t BufferedBlockAlgorithm.reset.call(this);\n\n\t // Perform concrete-hasher logic\n\t this._doReset();\n\t },\n\n\t /**\n\t * Updates this hasher with a message.\n\t *\n\t * @param {WordArray|string} messageUpdate The message to append.\n\t *\n\t * @return {Hasher} This hasher.\n\t *\n\t * @example\n\t *\n\t * hasher.update('message');\n\t * hasher.update(wordArray);\n\t */\n\t update: function (messageUpdate) {\n\t // Append\n\t this._append(messageUpdate);\n\n\t // Update the hash\n\t this._process();\n\n\t // Chainable\n\t return this;\n\t },\n\n\t /**\n\t * Finalizes the hash computation.\n\t * Note that the finalize operation is effectively a destructive, read-once operation.\n\t *\n\t * @param {WordArray|string} messageUpdate (Optional) A final message update.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @example\n\t *\n\t * var hash = hasher.finalize();\n\t * var hash = hasher.finalize('message');\n\t * var hash = hasher.finalize(wordArray);\n\t */\n\t finalize: function (messageUpdate) {\n\t // Final message update\n\t if (messageUpdate) {\n\t this._append(messageUpdate);\n\t }\n\n\t // Perform concrete-hasher logic\n\t var hash = this._doFinalize();\n\n\t return hash;\n\t },\n\n\t blockSize: 512/32,\n\n\t /**\n\t * Creates a shortcut function to a hasher's object interface.\n\t *\n\t * @param {Hasher} hasher The hasher to create a helper for.\n\t *\n\t * @return {Function} The shortcut function.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);\n\t */\n\t _createHelper: function (hasher) {\n\t return function (message, cfg) {\n\t return new hasher.init(cfg).finalize(message);\n\t };\n\t },\n\n\t /**\n\t * Creates a shortcut function to the HMAC's object interface.\n\t *\n\t * @param {Hasher} hasher The hasher to use in this HMAC helper.\n\t *\n\t * @return {Function} The shortcut function.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);\n\t */\n\t _createHmacHelper: function (hasher) {\n\t return function (message, key) {\n\t return new C_algo.HMAC.init(hasher, key).finalize(message);\n\t };\n\t }\n\t });\n\n\t /**\n\t * Algorithm namespace.\n\t */\n\t var C_algo = C.algo = {};\n\n\t return C;\n\t}(Math));\n\n\n\treturn CryptoJS;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var WordArray = C_lib.WordArray;\n\t var C_enc = C.enc;\n\n\t /**\n\t * Base64 encoding strategy.\n\t */\n\t var Base64 = C_enc.Base64 = {\n\t /**\n\t * Converts a word array to a Base64 string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The Base64 string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var base64String = CryptoJS.enc.Base64.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t // Shortcuts\n\t var words = wordArray.words;\n\t var sigBytes = wordArray.sigBytes;\n\t var map = this._map;\n\n\t // Clamp excess bits\n\t wordArray.clamp();\n\n\t // Convert\n\t var base64Chars = [];\n\t for (var i = 0; i < sigBytes; i += 3) {\n\t var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;\n\t var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;\n\n\t var triplet = (byte1 << 16) | (byte2 << 8) | byte3;\n\n\t for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) {\n\t base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));\n\t }\n\t }\n\n\t // Add padding\n\t var paddingChar = map.charAt(64);\n\t if (paddingChar) {\n\t while (base64Chars.length % 4) {\n\t base64Chars.push(paddingChar);\n\t }\n\t }\n\n\t return base64Chars.join('');\n\t },\n\n\t /**\n\t * Converts a Base64 string to a word array.\n\t *\n\t * @param {string} base64Str The Base64 string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Base64.parse(base64String);\n\t */\n\t parse: function (base64Str) {\n\t // Shortcuts\n\t var base64StrLength = base64Str.length;\n\t var map = this._map;\n\t var reverseMap = this._reverseMap;\n\n\t if (!reverseMap) {\n\t reverseMap = this._reverseMap = [];\n\t for (var j = 0; j < map.length; j++) {\n\t reverseMap[map.charCodeAt(j)] = j;\n\t }\n\t }\n\n\t // Ignore padding\n\t var paddingChar = map.charAt(64);\n\t if (paddingChar) {\n\t var paddingIndex = base64Str.indexOf(paddingChar);\n\t if (paddingIndex !== -1) {\n\t base64StrLength = paddingIndex;\n\t }\n\t }\n\n\t // Convert\n\t return parseLoop(base64Str, base64StrLength, reverseMap);\n\n\t },\n\n\t _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='\n\t };\n\n\t function parseLoop(base64Str, base64StrLength, reverseMap) {\n\t var words = [];\n\t var nBytes = 0;\n\t for (var i = 0; i < base64StrLength; i++) {\n\t if (i % 4) {\n\t var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);\n\t var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);\n\t var bitsCombined = bits1 | bits2;\n\t words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8);\n\t nBytes++;\n\t }\n\t }\n\t return WordArray.create(words, nBytes);\n\t }\n\t}());\n\n\n\treturn CryptoJS.enc.Base64;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\treturn CryptoJS.enc.Hex;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\treturn CryptoJS.enc.Utf8;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./sha1\"), require(\"./hmac\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./sha1\", \"./hmac\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Base = C_lib.Base;\n\t var WordArray = C_lib.WordArray;\n\t var C_algo = C.algo;\n\t var MD5 = C_algo.MD5;\n\n\t /**\n\t * This key derivation function is meant to conform with EVP_BytesToKey.\n\t * www.openssl.org/docs/crypto/EVP_BytesToKey.html\n\t */\n\t var EvpKDF = C_algo.EvpKDF = Base.extend({\n\t /**\n\t * Configuration options.\n\t *\n\t * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)\n\t * @property {Hasher} hasher The hash algorithm to use. Default: MD5\n\t * @property {number} iterations The number of iterations to perform. Default: 1\n\t */\n\t cfg: Base.extend({\n\t keySize: 128/32,\n\t hasher: MD5,\n\t iterations: 1\n\t }),\n\n\t /**\n\t * Initializes a newly created key derivation function.\n\t *\n\t * @param {Object} cfg (Optional) The configuration options to use for the derivation.\n\t *\n\t * @example\n\t *\n\t * var kdf = CryptoJS.algo.EvpKDF.create();\n\t * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 });\n\t * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 });\n\t */\n\t init: function (cfg) {\n\t this.cfg = this.cfg.extend(cfg);\n\t },\n\n\t /**\n\t * Derives a key from a password.\n\t *\n\t * @param {WordArray|string} password The password.\n\t * @param {WordArray|string} salt A salt.\n\t *\n\t * @return {WordArray} The derived key.\n\t *\n\t * @example\n\t *\n\t * var key = kdf.compute(password, salt);\n\t */\n\t compute: function (password, salt) {\n\t var block;\n\n\t // Shortcut\n\t var cfg = this.cfg;\n\n\t // Init hasher\n\t var hasher = cfg.hasher.create();\n\n\t // Initial values\n\t var derivedKey = WordArray.create();\n\n\t // Shortcuts\n\t var derivedKeyWords = derivedKey.words;\n\t var keySize = cfg.keySize;\n\t var iterations = cfg.iterations;\n\n\t // Generate key\n\t while (derivedKeyWords.length < keySize) {\n\t if (block) {\n\t hasher.update(block);\n\t }\n\t block = hasher.update(password).finalize(salt);\n\t hasher.reset();\n\n\t // Iterations\n\t for (var i = 1; i < iterations; i++) {\n\t block = hasher.finalize(block);\n\t hasher.reset();\n\t }\n\n\t derivedKey.concat(block);\n\t }\n\t derivedKey.sigBytes = keySize * 4;\n\n\t return derivedKey;\n\t }\n\t });\n\n\t /**\n\t * Derives a key from a password.\n\t *\n\t * @param {WordArray|string} password The password.\n\t * @param {WordArray|string} salt A salt.\n\t * @param {Object} cfg (Optional) The configuration options to use for this computation.\n\t *\n\t * @return {WordArray} The derived key.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var key = CryptoJS.EvpKDF(password, salt);\n\t * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 });\n\t * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 });\n\t */\n\t C.EvpKDF = function (password, salt, cfg) {\n\t return EvpKDF.create(cfg).compute(password, salt);\n\t };\n\t}());\n\n\n\treturn CryptoJS.EvpKDF;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./sha1\"), require(\"./hmac\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./sha1\", \"./hmac\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\treturn CryptoJS.HmacSHA1;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./sha256\"), require(\"./hmac\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./sha256\", \"./hmac\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\treturn CryptoJS.HmacSHA256;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Base = C_lib.Base;\n\t var C_enc = C.enc;\n\t var Utf8 = C_enc.Utf8;\n\t var C_algo = C.algo;\n\n\t /**\n\t * HMAC algorithm.\n\t */\n\t var HMAC = C_algo.HMAC = Base.extend({\n\t /**\n\t * Initializes a newly created HMAC.\n\t *\n\t * @param {Hasher} hasher The hash algorithm to use.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @example\n\t *\n\t * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);\n\t */\n\t init: function (hasher, key) {\n\t // Init hasher\n\t hasher = this._hasher = new hasher.init();\n\n\t // Convert string to WordArray, else assume WordArray already\n\t if (typeof key == 'string') {\n\t key = Utf8.parse(key);\n\t }\n\n\t // Shortcuts\n\t var hasherBlockSize = hasher.blockSize;\n\t var hasherBlockSizeBytes = hasherBlockSize * 4;\n\n\t // Allow arbitrary length keys\n\t if (key.sigBytes > hasherBlockSizeBytes) {\n\t key = hasher.finalize(key);\n\t }\n\n\t // Clamp excess bits\n\t key.clamp();\n\n\t // Clone key for inner and outer pads\n\t var oKey = this._oKey = key.clone();\n\t var iKey = this._iKey = key.clone();\n\n\t // Shortcuts\n\t var oKeyWords = oKey.words;\n\t var iKeyWords = iKey.words;\n\n\t // XOR keys with pad constants\n\t for (var i = 0; i < hasherBlockSize; i++) {\n\t oKeyWords[i] ^= 0x5c5c5c5c;\n\t iKeyWords[i] ^= 0x36363636;\n\t }\n\t oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes;\n\n\t // Set initial values\n\t this.reset();\n\t },\n\n\t /**\n\t * Resets this HMAC to its initial state.\n\t *\n\t * @example\n\t *\n\t * hmacHasher.reset();\n\t */\n\t reset: function () {\n\t // Shortcut\n\t var hasher = this._hasher;\n\n\t // Reset\n\t hasher.reset();\n\t hasher.update(this._iKey);\n\t },\n\n\t /**\n\t * Updates this HMAC with a message.\n\t *\n\t * @param {WordArray|string} messageUpdate The message to append.\n\t *\n\t * @return {HMAC} This HMAC instance.\n\t *\n\t * @example\n\t *\n\t * hmacHasher.update('message');\n\t * hmacHasher.update(wordArray);\n\t */\n\t update: function (messageUpdate) {\n\t this._hasher.update(messageUpdate);\n\n\t // Chainable\n\t return this;\n\t },\n\n\t /**\n\t * Finalizes the HMAC computation.\n\t * Note that the finalize operation is effectively a destructive, read-once operation.\n\t *\n\t * @param {WordArray|string} messageUpdate (Optional) A final message update.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @example\n\t *\n\t * var hmac = hmacHasher.finalize();\n\t * var hmac = hmacHasher.finalize('message');\n\t * var hmac = hmacHasher.finalize(wordArray);\n\t */\n\t finalize: function (messageUpdate) {\n\t // Shortcut\n\t var hasher = this._hasher;\n\n\t // Compute HMAC\n\t var innerHash = hasher.finalize(messageUpdate);\n\t hasher.reset();\n\t var hmac = hasher.finalize(this._oKey.clone().concat(innerHash));\n\n\t return hmac;\n\t }\n\t });\n\t}());\n\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function (Math) {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var WordArray = C_lib.WordArray;\n\t var Hasher = C_lib.Hasher;\n\t var C_algo = C.algo;\n\n\t // Constants table\n\t var T = [];\n\n\t // Compute constants\n\t (function () {\n\t for (var i = 0; i < 64; i++) {\n\t T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0;\n\t }\n\t }());\n\n\t /**\n\t * MD5 hash algorithm.\n\t */\n\t var MD5 = C_algo.MD5 = Hasher.extend({\n\t _doReset: function () {\n\t this._hash = new WordArray.init([\n\t 0x67452301, 0xefcdab89,\n\t 0x98badcfe, 0x10325476\n\t ]);\n\t },\n\n\t _doProcessBlock: function (M, offset) {\n\t // Swap endian\n\t for (var i = 0; i < 16; i++) {\n\t // Shortcuts\n\t var offset_i = offset + i;\n\t var M_offset_i = M[offset_i];\n\n\t M[offset_i] = (\n\t (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) |\n\t (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00)\n\t );\n\t }\n\n\t // Shortcuts\n\t var H = this._hash.words;\n\n\t var M_offset_0 = M[offset + 0];\n\t var M_offset_1 = M[offset + 1];\n\t var M_offset_2 = M[offset + 2];\n\t var M_offset_3 = M[offset + 3];\n\t var M_offset_4 = M[offset + 4];\n\t var M_offset_5 = M[offset + 5];\n\t var M_offset_6 = M[offset + 6];\n\t var M_offset_7 = M[offset + 7];\n\t var M_offset_8 = M[offset + 8];\n\t var M_offset_9 = M[offset + 9];\n\t var M_offset_10 = M[offset + 10];\n\t var M_offset_11 = M[offset + 11];\n\t var M_offset_12 = M[offset + 12];\n\t var M_offset_13 = M[offset + 13];\n\t var M_offset_14 = M[offset + 14];\n\t var M_offset_15 = M[offset + 15];\n\n\t // Working variables\n\t var a = H[0];\n\t var b = H[1];\n\t var c = H[2];\n\t var d = H[3];\n\n\t // Computation\n\t a = FF(a, b, c, d, M_offset_0, 7, T[0]);\n\t d = FF(d, a, b, c, M_offset_1, 12, T[1]);\n\t c = FF(c, d, a, b, M_offset_2, 17, T[2]);\n\t b = FF(b, c, d, a, M_offset_3, 22, T[3]);\n\t a = FF(a, b, c, d, M_offset_4, 7, T[4]);\n\t d = FF(d, a, b, c, M_offset_5, 12, T[5]);\n\t c = FF(c, d, a, b, M_offset_6, 17, T[6]);\n\t b = FF(b, c, d, a, M_offset_7, 22, T[7]);\n\t a = FF(a, b, c, d, M_offset_8, 7, T[8]);\n\t d = FF(d, a, b, c, M_offset_9, 12, T[9]);\n\t c = FF(c, d, a, b, M_offset_10, 17, T[10]);\n\t b = FF(b, c, d, a, M_offset_11, 22, T[11]);\n\t a = FF(a, b, c, d, M_offset_12, 7, T[12]);\n\t d = FF(d, a, b, c, M_offset_13, 12, T[13]);\n\t c = FF(c, d, a, b, M_offset_14, 17, T[14]);\n\t b = FF(b, c, d, a, M_offset_15, 22, T[15]);\n\n\t a = GG(a, b, c, d, M_offset_1, 5, T[16]);\n\t d = GG(d, a, b, c, M_offset_6, 9, T[17]);\n\t c = GG(c, d, a, b, M_offset_11, 14, T[18]);\n\t b = GG(b, c, d, a, M_offset_0, 20, T[19]);\n\t a = GG(a, b, c, d, M_offset_5, 5, T[20]);\n\t d = GG(d, a, b, c, M_offset_10, 9, T[21]);\n\t c = GG(c, d, a, b, M_offset_15, 14, T[22]);\n\t b = GG(b, c, d, a, M_offset_4, 20, T[23]);\n\t a = GG(a, b, c, d, M_offset_9, 5, T[24]);\n\t d = GG(d, a, b, c, M_offset_14, 9, T[25]);\n\t c = GG(c, d, a, b, M_offset_3, 14, T[26]);\n\t b = GG(b, c, d, a, M_offset_8, 20, T[27]);\n\t a = GG(a, b, c, d, M_offset_13, 5, T[28]);\n\t d = GG(d, a, b, c, M_offset_2, 9, T[29]);\n\t c = GG(c, d, a, b, M_offset_7, 14, T[30]);\n\t b = GG(b, c, d, a, M_offset_12, 20, T[31]);\n\n\t a = HH(a, b, c, d, M_offset_5, 4, T[32]);\n\t d = HH(d, a, b, c, M_offset_8, 11, T[33]);\n\t c = HH(c, d, a, b, M_offset_11, 16, T[34]);\n\t b = HH(b, c, d, a, M_offset_14, 23, T[35]);\n\t a = HH(a, b, c, d, M_offset_1, 4, T[36]);\n\t d = HH(d, a, b, c, M_offset_4, 11, T[37]);\n\t c = HH(c, d, a, b, M_offset_7, 16, T[38]);\n\t b = HH(b, c, d, a, M_offset_10, 23, T[39]);\n\t a = HH(a, b, c, d, M_offset_13, 4, T[40]);\n\t d = HH(d, a, b, c, M_offset_0, 11, T[41]);\n\t c = HH(c, d, a, b, M_offset_3, 16, T[42]);\n\t b = HH(b, c, d, a, M_offset_6, 23, T[43]);\n\t a = HH(a, b, c, d, M_offset_9, 4, T[44]);\n\t d = HH(d, a, b, c, M_offset_12, 11, T[45]);\n\t c = HH(c, d, a, b, M_offset_15, 16, T[46]);\n\t b = HH(b, c, d, a, M_offset_2, 23, T[47]);\n\n\t a = II(a, b, c, d, M_offset_0, 6, T[48]);\n\t d = II(d, a, b, c, M_offset_7, 10, T[49]);\n\t c = II(c, d, a, b, M_offset_14, 15, T[50]);\n\t b = II(b, c, d, a, M_offset_5, 21, T[51]);\n\t a = II(a, b, c, d, M_offset_12, 6, T[52]);\n\t d = II(d, a, b, c, M_offset_3, 10, T[53]);\n\t c = II(c, d, a, b, M_offset_10, 15, T[54]);\n\t b = II(b, c, d, a, M_offset_1, 21, T[55]);\n\t a = II(a, b, c, d, M_offset_8, 6, T[56]);\n\t d = II(d, a, b, c, M_offset_15, 10, T[57]);\n\t c = II(c, d, a, b, M_offset_6, 15, T[58]);\n\t b = II(b, c, d, a, M_offset_13, 21, T[59]);\n\t a = II(a, b, c, d, M_offset_4, 6, T[60]);\n\t d = II(d, a, b, c, M_offset_11, 10, T[61]);\n\t c = II(c, d, a, b, M_offset_2, 15, T[62]);\n\t b = II(b, c, d, a, M_offset_9, 21, T[63]);\n\n\t // Intermediate hash value\n\t H[0] = (H[0] + a) | 0;\n\t H[1] = (H[1] + b) | 0;\n\t H[2] = (H[2] + c) | 0;\n\t H[3] = (H[3] + d) | 0;\n\t },\n\n\t _doFinalize: function () {\n\t // Shortcuts\n\t var data = this._data;\n\t var dataWords = data.words;\n\n\t var nBitsTotal = this._nDataBytes * 8;\n\t var nBitsLeft = data.sigBytes * 8;\n\n\t // Add padding\n\t dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\n\t var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000);\n\t var nBitsTotalL = nBitsTotal;\n\t dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = (\n\t (((nBitsTotalH << 8) | (nBitsTotalH >>> 24)) & 0x00ff00ff) |\n\t (((nBitsTotalH << 24) | (nBitsTotalH >>> 8)) & 0xff00ff00)\n\t );\n\t dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (\n\t (((nBitsTotalL << 8) | (nBitsTotalL >>> 24)) & 0x00ff00ff) |\n\t (((nBitsTotalL << 24) | (nBitsTotalL >>> 8)) & 0xff00ff00)\n\t );\n\n\t data.sigBytes = (dataWords.length + 1) * 4;\n\n\t // Hash final blocks\n\t this._process();\n\n\t // Shortcuts\n\t var hash = this._hash;\n\t var H = hash.words;\n\n\t // Swap endian\n\t for (var i = 0; i < 4; i++) {\n\t // Shortcut\n\t var H_i = H[i];\n\n\t H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) |\n\t (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00);\n\t }\n\n\t // Return final computed hash\n\t return hash;\n\t },\n\n\t clone: function () {\n\t var clone = Hasher.clone.call(this);\n\t clone._hash = this._hash.clone();\n\n\t return clone;\n\t }\n\t });\n\n\t function FF(a, b, c, d, x, s, t) {\n\t var n = a + ((b & c) | (~b & d)) + x + t;\n\t return ((n << s) | (n >>> (32 - s))) + b;\n\t }\n\n\t function GG(a, b, c, d, x, s, t) {\n\t var n = a + ((b & d) | (c & ~d)) + x + t;\n\t return ((n << s) | (n >>> (32 - s))) + b;\n\t }\n\n\t function HH(a, b, c, d, x, s, t) {\n\t var n = a + (b ^ c ^ d) + x + t;\n\t return ((n << s) | (n >>> (32 - s))) + b;\n\t }\n\n\t function II(a, b, c, d, x, s, t) {\n\t var n = a + (c ^ (b | ~d)) + x + t;\n\t return ((n << s) | (n >>> (32 - s))) + b;\n\t }\n\n\t /**\n\t * Shortcut function to the hasher's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hash = CryptoJS.MD5('message');\n\t * var hash = CryptoJS.MD5(wordArray);\n\t */\n\t C.MD5 = Hasher._createHelper(MD5);\n\n\t /**\n\t * Shortcut function to the HMAC's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hmac = CryptoJS.HmacMD5(message, key);\n\t */\n\t C.HmacMD5 = Hasher._createHmacHelper(MD5);\n\t}(Math));\n\n\n\treturn CryptoJS.MD5;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var WordArray = C_lib.WordArray;\n\t var Hasher = C_lib.Hasher;\n\t var C_algo = C.algo;\n\n\t // Reusable object\n\t var W = [];\n\n\t /**\n\t * SHA-1 hash algorithm.\n\t */\n\t var SHA1 = C_algo.SHA1 = Hasher.extend({\n\t _doReset: function () {\n\t this._hash = new WordArray.init([\n\t 0x67452301, 0xefcdab89,\n\t 0x98badcfe, 0x10325476,\n\t 0xc3d2e1f0\n\t ]);\n\t },\n\n\t _doProcessBlock: function (M, offset) {\n\t // Shortcut\n\t var H = this._hash.words;\n\n\t // Working variables\n\t var a = H[0];\n\t var b = H[1];\n\t var c = H[2];\n\t var d = H[3];\n\t var e = H[4];\n\n\t // Computation\n\t for (var i = 0; i < 80; i++) {\n\t if (i < 16) {\n\t W[i] = M[offset + i] | 0;\n\t } else {\n\t var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];\n\t W[i] = (n << 1) | (n >>> 31);\n\t }\n\n\t var t = ((a << 5) | (a >>> 27)) + e + W[i];\n\t if (i < 20) {\n\t t += ((b & c) | (~b & d)) + 0x5a827999;\n\t } else if (i < 40) {\n\t t += (b ^ c ^ d) + 0x6ed9eba1;\n\t } else if (i < 60) {\n\t t += ((b & c) | (b & d) | (c & d)) - 0x70e44324;\n\t } else /* if (i < 80) */ {\n\t t += (b ^ c ^ d) - 0x359d3e2a;\n\t }\n\n\t e = d;\n\t d = c;\n\t c = (b << 30) | (b >>> 2);\n\t b = a;\n\t a = t;\n\t }\n\n\t // Intermediate hash value\n\t H[0] = (H[0] + a) | 0;\n\t H[1] = (H[1] + b) | 0;\n\t H[2] = (H[2] + c) | 0;\n\t H[3] = (H[3] + d) | 0;\n\t H[4] = (H[4] + e) | 0;\n\t },\n\n\t _doFinalize: function () {\n\t // Shortcuts\n\t var data = this._data;\n\t var dataWords = data.words;\n\n\t var nBitsTotal = this._nDataBytes * 8;\n\t var nBitsLeft = data.sigBytes * 8;\n\n\t // Add padding\n\t dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\t dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);\n\t dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;\n\t data.sigBytes = dataWords.length * 4;\n\n\t // Hash final blocks\n\t this._process();\n\n\t // Return final computed hash\n\t return this._hash;\n\t },\n\n\t clone: function () {\n\t var clone = Hasher.clone.call(this);\n\t clone._hash = this._hash.clone();\n\n\t return clone;\n\t }\n\t });\n\n\t /**\n\t * Shortcut function to the hasher's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hash = CryptoJS.SHA1('message');\n\t * var hash = CryptoJS.SHA1(wordArray);\n\t */\n\t C.SHA1 = Hasher._createHelper(SHA1);\n\n\t /**\n\t * Shortcut function to the HMAC's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hmac = CryptoJS.HmacSHA1(message, key);\n\t */\n\t C.HmacSHA1 = Hasher._createHmacHelper(SHA1);\n\t}());\n\n\n\treturn CryptoJS.SHA1;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function (Math) {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var WordArray = C_lib.WordArray;\n\t var Hasher = C_lib.Hasher;\n\t var C_algo = C.algo;\n\n\t // Initialization and round constants tables\n\t var H = [];\n\t var K = [];\n\n\t // Compute constants\n\t (function () {\n\t function isPrime(n) {\n\t var sqrtN = Math.sqrt(n);\n\t for (var factor = 2; factor <= sqrtN; factor++) {\n\t if (!(n % factor)) {\n\t return false;\n\t }\n\t }\n\n\t return true;\n\t }\n\n\t function getFractionalBits(n) {\n\t return ((n - (n | 0)) * 0x100000000) | 0;\n\t }\n\n\t var n = 2;\n\t var nPrime = 0;\n\t while (nPrime < 64) {\n\t if (isPrime(n)) {\n\t if (nPrime < 8) {\n\t H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2));\n\t }\n\t K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3));\n\n\t nPrime++;\n\t }\n\n\t n++;\n\t }\n\t }());\n\n\t // Reusable object\n\t var W = [];\n\n\t /**\n\t * SHA-256 hash algorithm.\n\t */\n\t var SHA256 = C_algo.SHA256 = Hasher.extend({\n\t _doReset: function () {\n\t this._hash = new WordArray.init(H.slice(0));\n\t },\n\n\t _doProcessBlock: function (M, offset) {\n\t // Shortcut\n\t var H = this._hash.words;\n\n\t // Working variables\n\t var a = H[0];\n\t var b = H[1];\n\t var c = H[2];\n\t var d = H[3];\n\t var e = H[4];\n\t var f = H[5];\n\t var g = H[6];\n\t var h = H[7];\n\n\t // Computation\n\t for (var i = 0; i < 64; i++) {\n\t if (i < 16) {\n\t W[i] = M[offset + i] | 0;\n\t } else {\n\t var gamma0x = W[i - 15];\n\t var gamma0 = ((gamma0x << 25) | (gamma0x >>> 7)) ^\n\t ((gamma0x << 14) | (gamma0x >>> 18)) ^\n\t (gamma0x >>> 3);\n\n\t var gamma1x = W[i - 2];\n\t var gamma1 = ((gamma1x << 15) | (gamma1x >>> 17)) ^\n\t ((gamma1x << 13) | (gamma1x >>> 19)) ^\n\t (gamma1x >>> 10);\n\n\t W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16];\n\t }\n\n\t var ch = (e & f) ^ (~e & g);\n\t var maj = (a & b) ^ (a & c) ^ (b & c);\n\n\t var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22));\n\t var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7) | (e >>> 25));\n\n\t var t1 = h + sigma1 + ch + K[i] + W[i];\n\t var t2 = sigma0 + maj;\n\n\t h = g;\n\t g = f;\n\t f = e;\n\t e = (d + t1) | 0;\n\t d = c;\n\t c = b;\n\t b = a;\n\t a = (t1 + t2) | 0;\n\t }\n\n\t // Intermediate hash value\n\t H[0] = (H[0] + a) | 0;\n\t H[1] = (H[1] + b) | 0;\n\t H[2] = (H[2] + c) | 0;\n\t H[3] = (H[3] + d) | 0;\n\t H[4] = (H[4] + e) | 0;\n\t H[5] = (H[5] + f) | 0;\n\t H[6] = (H[6] + g) | 0;\n\t H[7] = (H[7] + h) | 0;\n\t },\n\n\t _doFinalize: function () {\n\t // Shortcuts\n\t var data = this._data;\n\t var dataWords = data.words;\n\n\t var nBitsTotal = this._nDataBytes * 8;\n\t var nBitsLeft = data.sigBytes * 8;\n\n\t // Add padding\n\t dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\t dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);\n\t dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;\n\t data.sigBytes = dataWords.length * 4;\n\n\t // Hash final blocks\n\t this._process();\n\n\t // Return final computed hash\n\t return this._hash;\n\t },\n\n\t clone: function () {\n\t var clone = Hasher.clone.call(this);\n\t clone._hash = this._hash.clone();\n\n\t return clone;\n\t }\n\t });\n\n\t /**\n\t * Shortcut function to the hasher's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hash = CryptoJS.SHA256('message');\n\t * var hash = CryptoJS.SHA256(wordArray);\n\t */\n\t C.SHA256 = Hasher._createHelper(SHA256);\n\n\t /**\n\t * Shortcut function to the HMAC's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hmac = CryptoJS.HmacSHA256(message, key);\n\t */\n\t C.HmacSHA256 = Hasher._createHmacHelper(SHA256);\n\t}(Math));\n\n\n\treturn CryptoJS.SHA256;\n\n}));","!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs=e()}(this,(function(){\"use strict\";var t=1e3,e=6e4,n=36e5,r=\"millisecond\",i=\"second\",s=\"minute\",u=\"hour\",a=\"day\",o=\"week\",c=\"month\",f=\"quarter\",h=\"year\",d=\"date\",l=\"Invalid Date\",$=/^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[Tt\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/,y=/\\[([^\\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,M={name:\"en\",weekdays:\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),months:\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\"),ordinal:function(t){var e=[\"th\",\"st\",\"nd\",\"rd\"],n=t%100;return\"[\"+t+(e[(n-20)%10]||e[n]||e[0])+\"]\"}},m=function(t,e,n){var r=String(t);return!r||r.length>=e?t:\"\"+Array(e+1-r.length).join(n)+t},v={s:m,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60;return(e<=0?\"+\":\"-\")+m(r,2,\"0\")+\":\"+m(i,2,\"0\")},m:function t(e,n){if(e.date()<n.date())return-t(n,e);var r=12*(n.year()-e.year())+(n.month()-e.month()),i=e.clone().add(r,c),s=n-i<0,u=e.clone().add(r+(s?-1:1),c);return+(-(r+(n-i)/(s?i-u:u-i))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(t){return{M:c,y:h,w:o,d:a,D:d,h:u,m:s,s:i,ms:r,Q:f}[t]||String(t||\"\").toLowerCase().replace(/s$/,\"\")},u:function(t){return void 0===t}},g=\"en\",D={};D[g]=M;var p=\"$isDayjsObject\",S=function(t){return t instanceof _||!(!t||!t[p])},w=function t(e,n,r){var i;if(!e)return g;if(\"string\"==typeof e){var s=e.toLowerCase();D[s]&&(i=s),n&&(D[s]=n,i=s);var u=e.split(\"-\");if(!i&&u.length>1)return t(u[0])}else{var a=e.name;D[a]=e,i=a}return!r&&i&&(g=i),i||!r&&g},O=function(t,e){if(S(t))return t.clone();var n=\"object\"==typeof e?e:{};return n.date=t,n.args=arguments,new _(n)},b=v;b.l=w,b.i=S,b.w=function(t,e){return O(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var _=function(){function M(t){this.$L=w(t.locale,null,!0),this.parse(t),this.$x=this.$x||t.x||{},this[p]=!0}var m=M.prototype;return m.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(b.u(e))return new Date;if(e instanceof Date)return new Date(e);if(\"string\"==typeof e&&!/Z$/i.test(e)){var r=e.match($);if(r){var i=r[2]-1||0,s=(r[7]||\"0\").substring(0,3);return n?new Date(Date.UTC(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)):new Date(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)}}return new Date(e)}(t),this.init()},m.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},m.$utils=function(){return b},m.isValid=function(){return!(this.$d.toString()===l)},m.isSame=function(t,e){var n=O(t);return this.startOf(e)<=n&&n<=this.endOf(e)},m.isAfter=function(t,e){return O(t)<this.startOf(e)},m.isBefore=function(t,e){return this.endOf(e)<O(t)},m.$g=function(t,e,n){return b.u(t)?this[e]:this.set(n,t)},m.unix=function(){return Math.floor(this.valueOf()/1e3)},m.valueOf=function(){return this.$d.getTime()},m.startOf=function(t,e){var n=this,r=!!b.u(e)||e,f=b.p(t),l=function(t,e){var i=b.w(n.$u?Date.UTC(n.$y,e,t):new Date(n.$y,e,t),n);return r?i:i.endOf(a)},$=function(t,e){return b.w(n.toDate()[t].apply(n.toDate(\"s\"),(r?[0,0,0,0]:[23,59,59,999]).slice(e)),n)},y=this.$W,M=this.$M,m=this.$D,v=\"set\"+(this.$u?\"UTC\":\"\");switch(f){case h:return r?l(1,0):l(31,11);case c:return r?l(1,M):l(0,M+1);case o:var g=this.$locale().weekStart||0,D=(y<g?y+7:y)-g;return l(r?m-D:m+(6-D),M);case a:case d:return $(v+\"Hours\",0);case u:return $(v+\"Minutes\",1);case s:return $(v+\"Seconds\",2);case i:return $(v+\"Milliseconds\",3);default:return this.clone()}},m.endOf=function(t){return this.startOf(t,!1)},m.$set=function(t,e){var n,o=b.p(t),f=\"set\"+(this.$u?\"UTC\":\"\"),l=(n={},n[a]=f+\"Date\",n[d]=f+\"Date\",n[c]=f+\"Month\",n[h]=f+\"FullYear\",n[u]=f+\"Hours\",n[s]=f+\"Minutes\",n[i]=f+\"Seconds\",n[r]=f+\"Milliseconds\",n)[o],$=o===a?this.$D+(e-this.$W):e;if(o===c||o===h){var y=this.clone().set(d,1);y.$d[l]($),y.init(),this.$d=y.set(d,Math.min(this.$D,y.daysInMonth())).$d}else l&&this.$d[l]($);return this.init(),this},m.set=function(t,e){return this.clone().$set(t,e)},m.get=function(t){return this[b.p(t)]()},m.add=function(r,f){var d,l=this;r=Number(r);var $=b.p(f),y=function(t){var e=O(l);return b.w(e.date(e.date()+Math.round(t*r)),l)};if($===c)return this.set(c,this.$M+r);if($===h)return this.set(h,this.$y+r);if($===a)return y(1);if($===o)return y(7);var M=(d={},d[s]=e,d[u]=n,d[i]=t,d)[$]||1,m=this.$d.getTime()+r*M;return b.w(m,this)},m.subtract=function(t,e){return this.add(-1*t,e)},m.format=function(t){var e=this,n=this.$locale();if(!this.isValid())return n.invalidDate||l;var r=t||\"YYYY-MM-DDTHH:mm:ssZ\",i=b.z(this),s=this.$H,u=this.$m,a=this.$M,o=n.weekdays,c=n.months,f=n.meridiem,h=function(t,n,i,s){return t&&(t[n]||t(e,r))||i[n].slice(0,s)},d=function(t){return b.s(s%12||12,t,\"0\")},$=f||function(t,e,n){var r=t<12?\"AM\":\"PM\";return n?r.toLowerCase():r};return r.replace(y,(function(t,r){return r||function(t){switch(t){case\"YY\":return String(e.$y).slice(-2);case\"YYYY\":return b.s(e.$y,4,\"0\");case\"M\":return a+1;case\"MM\":return b.s(a+1,2,\"0\");case\"MMM\":return h(n.monthsShort,a,c,3);case\"MMMM\":return h(c,a);case\"D\":return e.$D;case\"DD\":return b.s(e.$D,2,\"0\");case\"d\":return String(e.$W);case\"dd\":return h(n.weekdaysMin,e.$W,o,2);case\"ddd\":return h(n.weekdaysShort,e.$W,o,3);case\"dddd\":return o[e.$W];case\"H\":return String(s);case\"HH\":return b.s(s,2,\"0\");case\"h\":return d(1);case\"hh\":return d(2);case\"a\":return $(s,u,!0);case\"A\":return $(s,u,!1);case\"m\":return String(u);case\"mm\":return b.s(u,2,\"0\");case\"s\":return String(e.$s);case\"ss\":return b.s(e.$s,2,\"0\");case\"SSS\":return b.s(e.$ms,3,\"0\");case\"Z\":return i}return null}(t)||i.replace(\":\",\"\")}))},m.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},m.diff=function(r,d,l){var $,y=this,M=b.p(d),m=O(r),v=(m.utcOffset()-this.utcOffset())*e,g=this-m,D=function(){return b.m(y,m)};switch(M){case h:$=D()/12;break;case c:$=D();break;case f:$=D()/3;break;case o:$=(g-v)/6048e5;break;case a:$=(g-v)/864e5;break;case u:$=g/n;break;case s:$=g/e;break;case i:$=g/t;break;default:$=g}return l?$:b.a($)},m.daysInMonth=function(){return this.endOf(c).$D},m.$locale=function(){return D[this.$L]},m.locale=function(t,e){if(!t)return this.$L;var n=this.clone(),r=w(t,e,!0);return r&&(n.$L=r),n},m.clone=function(){return b.w(this.$d,this)},m.toDate=function(){return new Date(this.valueOf())},m.toJSON=function(){return this.isValid()?this.toISOString():null},m.toISOString=function(){return this.$d.toISOString()},m.toString=function(){return this.$d.toUTCString()},M}(),k=_.prototype;return O.prototype=k,[[\"$ms\",r],[\"$s\",i],[\"$m\",s],[\"$H\",u],[\"$W\",a],[\"$M\",c],[\"$y\",h],[\"$D\",d]].forEach((function(t){k[t[1]]=function(e){return this.$g(e,t[0],t[1])}})),O.extend=function(t,e){return t.$i||(t(e,_,O),t.$i=!0),O},O.locale=w,O.isDayjs=S,O.unix=function(t){return O(1e3*t)},O.en=D[g],O.Ls=D,O.p={},O}));","!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs_plugin_advancedFormat=t()}(this,(function(){\"use strict\";return function(e,t){var r=t.prototype,n=r.format;r.format=function(e){var t=this,r=this.$locale();if(!this.isValid())return n.bind(this)(e);var s=this.$utils(),a=(e||\"YYYY-MM-DDTHH:mm:ssZ\").replace(/\\[([^\\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g,(function(e){switch(e){case\"Q\":return Math.ceil((t.$M+1)/3);case\"Do\":return r.ordinal(t.$D);case\"gggg\":return t.weekYear();case\"GGGG\":return t.isoWeekYear();case\"wo\":return r.ordinal(t.week(),\"W\");case\"w\":case\"ww\":return s.s(t.week(),\"w\"===e?1:2,\"0\");case\"W\":case\"WW\":return s.s(t.isoWeek(),\"W\"===e?1:2,\"0\");case\"k\":case\"kk\":return s.s(String(0===t.$H?24:t.$H),\"k\"===e?1:2,\"0\");case\"X\":return Math.floor(t.$d.getTime()/1e3);case\"x\":return t.$d.getTime();case\"z\":return\"[\"+t.offsetName()+\"]\";case\"zzz\":return\"[\"+t.offsetName(\"long\")+\"]\";default:return e}}));return n.bind(this)(a)}}}));","!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs_plugin_customParseFormat=t()}(this,(function(){\"use strict\";var e={LTS:\"h:mm:ss A\",LT:\"h:mm A\",L:\"MM/DD/YYYY\",LL:\"MMMM D, YYYY\",LLL:\"MMMM D, YYYY h:mm A\",LLLL:\"dddd, MMMM D, YYYY h:mm A\"},t=/(\\[[^[]*\\])|([-_:/.,()\\s]+)|(A|a|Q|YYYY|YY?|ww?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g,n=/\\d/,r=/\\d\\d/,i=/\\d\\d?/,o=/\\d*[^-_:/,()\\s\\d]+/,s={},a=function(e){return(e=+e)+(e>68?1900:2e3)};var f=function(e){return function(t){this[e]=+t}},h=[/[+-]\\d\\d:?(\\d\\d)?|Z/,function(e){(this.zone||(this.zone={})).offset=function(e){if(!e)return 0;if(\"Z\"===e)return 0;var t=e.match(/([+-]|\\d\\d)/g),n=60*t[1]+(+t[2]||0);return 0===n?0:\"+\"===t[0]?-n:n}(e)}],u=function(e){var t=s[e];return t&&(t.indexOf?t:t.s.concat(t.f))},d=function(e,t){var n,r=s.meridiem;if(r){for(var i=1;i<=24;i+=1)if(e.indexOf(r(i,0,t))>-1){n=i>12;break}}else n=e===(t?\"pm\":\"PM\");return n},c={A:[o,function(e){this.afternoon=d(e,!1)}],a:[o,function(e){this.afternoon=d(e,!0)}],Q:[n,function(e){this.month=3*(e-1)+1}],S:[n,function(e){this.milliseconds=100*+e}],SS:[r,function(e){this.milliseconds=10*+e}],SSS:[/\\d{3}/,function(e){this.milliseconds=+e}],s:[i,f(\"seconds\")],ss:[i,f(\"seconds\")],m:[i,f(\"minutes\")],mm:[i,f(\"minutes\")],H:[i,f(\"hours\")],h:[i,f(\"hours\")],HH:[i,f(\"hours\")],hh:[i,f(\"hours\")],D:[i,f(\"day\")],DD:[r,f(\"day\")],Do:[o,function(e){var t=s.ordinal,n=e.match(/\\d+/);if(this.day=n[0],t)for(var r=1;r<=31;r+=1)t(r).replace(/\\[|\\]/g,\"\")===e&&(this.day=r)}],w:[i,f(\"week\")],ww:[r,f(\"week\")],M:[i,f(\"month\")],MM:[r,f(\"month\")],MMM:[o,function(e){var t=u(\"months\"),n=(u(\"monthsShort\")||t.map((function(e){return e.slice(0,3)}))).indexOf(e)+1;if(n<1)throw new Error;this.month=n%12||n}],MMMM:[o,function(e){var t=u(\"months\").indexOf(e)+1;if(t<1)throw new Error;this.month=t%12||t}],Y:[/[+-]?\\d+/,f(\"year\")],YY:[r,function(e){this.year=a(e)}],YYYY:[/\\d{4}/,f(\"year\")],Z:h,ZZ:h};function l(n){var r,i;r=n,i=s&&s.formats;for(var o=(n=r.replace(/(\\[[^\\]]+])|(LTS?|l{1,4}|L{1,4})/g,(function(t,n,r){var o=r&&r.toUpperCase();return n||i[r]||e[r]||i[o].replace(/(\\[[^\\]]+])|(MMMM|MM|DD|dddd)/g,(function(e,t,n){return t||n.slice(1)}))}))).match(t),a=o.length,f=0;f<a;f+=1){var h=o[f],u=c[h],d=u&&u[0],l=u&&u[1];o[f]=l?{regex:d,parser:l}:h.replace(/^\\[|\\]$/g,\"\")}return function(e){for(var t={},n=0,r=0;n<a;n+=1){var i=o[n];if(\"string\"==typeof i)r+=i.length;else{var s=i.regex,f=i.parser,h=e.slice(r),u=s.exec(h)[0];f.call(t,u),e=e.replace(u,\"\")}}return function(e){var t=e.afternoon;if(void 0!==t){var n=e.hours;t?n<12&&(e.hours+=12):12===n&&(e.hours=0),delete e.afternoon}}(t),t}}return function(e,t,n){n.p.customParseFormat=!0,e&&e.parseTwoDigitYear&&(a=e.parseTwoDigitYear);var r=t.prototype,i=r.parse;r.parse=function(e){var t=e.date,r=e.utc,o=e.args;this.$u=r;var a=o[1];if(\"string\"==typeof a){var f=!0===o[2],h=!0===o[3],u=f||h,d=o[2];h&&(d=o[2]),s=this.$locale(),!f&&d&&(s=n.Ls[d]),this.$d=function(e,t,n,r){try{if([\"x\",\"X\"].indexOf(t)>-1)return new Date((\"X\"===t?1e3:1)*e);var i=l(t)(e),o=i.year,s=i.month,a=i.day,f=i.hours,h=i.minutes,u=i.seconds,d=i.milliseconds,c=i.zone,m=i.week,M=new Date,Y=a||(o||s?1:M.getDate()),p=o||M.getFullYear(),v=0;o&&!s||(v=s>0?s-1:M.getMonth());var D,w=f||0,g=h||0,y=u||0,L=d||0;return c?new Date(Date.UTC(p,v,Y,w,g,y,L+60*c.offset*1e3)):n?new Date(Date.UTC(p,v,Y,w,g,y,L)):(D=new Date(p,v,Y,w,g,y,L),m&&(D=r(D).week(m).toDate()),D)}catch(e){return new Date(\"\")}}(t,a,r,n),this.init(),d&&!0!==d&&(this.$L=this.locale(d).$L),u&&t!=this.format(a)&&(this.$d=new Date(\"\")),s={}}else if(a instanceof Array)for(var c=a.length,m=1;m<=c;m+=1){o[1]=a[m-1];var M=n.apply(this,o);if(M.isValid()){this.$d=M.$d,this.$L=M.$L,this.init();break}m===c&&(this.$d=new Date(\"\"))}else i.call(this,e)}}}));","!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs_plugin_isoWeek=t()}(this,(function(){\"use strict\";var e=\"day\";return function(t,i,s){var a=function(t){return t.add(4-t.isoWeekday(),e)},d=i.prototype;d.isoWeekYear=function(){return a(this).year()},d.isoWeek=function(t){if(!this.$utils().u(t))return this.add(7*(t-this.isoWeek()),e);var i,d,n,o,r=a(this),u=(i=this.isoWeekYear(),d=this.$u,n=(d?s.utc:s)().year(i).startOf(\"year\"),o=4-n.isoWeekday(),n.isoWeekday()>4&&(o+=7),n.add(o,e));return r.diff(u,\"week\")+1},d.isoWeekday=function(e){return this.$utils().u(e)?this.day()||7:this.day(this.day()%7?e:e-7)};var n=d.startOf;d.startOf=function(e,t){var i=this.$utils(),s=!!i.u(t)||t;return\"isoweek\"===i.p(e)?s?this.date(this.date()-(this.isoWeekday()-1)).startOf(\"day\"):this.date(this.date()-1-(this.isoWeekday()-1)+7).endOf(\"day\"):n.bind(this)(e,t)}}}));","!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs_plugin_localizedFormat=t()}(this,(function(){\"use strict\";var e={LTS:\"h:mm:ss A\",LT:\"h:mm A\",L:\"MM/DD/YYYY\",LL:\"MMMM D, YYYY\",LLL:\"MMMM D, YYYY h:mm A\",LLLL:\"dddd, MMMM D, YYYY h:mm A\"};return function(t,o,n){var r=o.prototype,i=r.format;n.en.formats=e,r.format=function(t){void 0===t&&(t=\"YYYY-MM-DDTHH:mm:ssZ\");var o=this.$locale().formats,n=function(t,o){return t.replace(/(\\[[^\\]]+])|(LTS?|l{1,4}|L{1,4})/g,(function(t,n,r){var i=r&&r.toUpperCase();return n||o[r]||e[r]||o[i].replace(/(\\[[^\\]]+])|(MMMM|MM|DD|dddd)/g,(function(e,t,o){return t||o.slice(1)}))}))}(t,void 0===o?{}:o);return i.call(this,n)}}}));","!function(t,n){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=n():\"function\"==typeof define&&define.amd?define(n):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs_plugin_quarterOfYear=n()}(this,(function(){\"use strict\";var t=\"month\",n=\"quarter\";return function(e,i){var r=i.prototype;r.quarter=function(t){return this.$utils().u(t)?Math.ceil((this.month()+1)/3):this.month(this.month()%3+3*(t-1))};var s=r.add;r.add=function(e,i){return e=Number(e),this.$utils().p(i)===n?this.add(3*e,t):s.bind(this)(e,i)};var u=r.startOf;r.startOf=function(e,i){var r=this.$utils(),s=!!r.u(i)||i;if(r.p(e)===n){var o=this.quarter()-1;return s?this.month(3*o).startOf(t).startOf(\"day\"):this.month(3*o+2).endOf(t).endOf(\"day\")}return u.bind(this)(e,i)}}}));","/*\n* loglevel - https://github.com/pimterry/loglevel\n*\n* Copyright (c) 2013 Tim Perry\n* Licensed under the MIT license.\n*/\n(function (root, definition) {\n \"use strict\";\n if (typeof define === 'function' && define.amd) {\n define(definition);\n } else if (typeof module === 'object' && module.exports) {\n module.exports = definition();\n } else {\n root.log = definition();\n }\n}(this, function () {\n \"use strict\";\n\n // Slightly dubious tricks to cut down minimized file size\n var noop = function() {};\n var undefinedType = \"undefined\";\n var isIE = (typeof window !== undefinedType) && (typeof window.navigator !== undefinedType) && (\n /Trident\\/|MSIE /.test(window.navigator.userAgent)\n );\n\n var logMethods = [\n \"trace\",\n \"debug\",\n \"info\",\n \"warn\",\n \"error\"\n ];\n\n var _loggersByName = {};\n var defaultLogger = null;\n\n // Cross-browser bind equivalent that works at least back to IE6\n function bindMethod(obj, methodName) {\n var method = obj[methodName];\n if (typeof method.bind === 'function') {\n return method.bind(obj);\n } else {\n try {\n return Function.prototype.bind.call(method, obj);\n } catch (e) {\n // Missing bind shim or IE8 + Modernizr, fallback to wrapping\n return function() {\n return Function.prototype.apply.apply(method, [obj, arguments]);\n };\n }\n }\n }\n\n // Trace() doesn't print the message in IE, so for that case we need to wrap it\n function traceForIE() {\n if (console.log) {\n if (console.log.apply) {\n console.log.apply(console, arguments);\n } else {\n // In old IE, native console methods themselves don't have apply().\n Function.prototype.apply.apply(console.log, [console, arguments]);\n }\n }\n if (console.trace) console.trace();\n }\n\n // Build the best logging method possible for this env\n // Wherever possible we want to bind, not wrap, to preserve stack traces\n function realMethod(methodName) {\n if (methodName === 'debug') {\n methodName = 'log';\n }\n\n if (typeof console === undefinedType) {\n return false; // No method possible, for now - fixed later by enableLoggingWhenConsoleArrives\n } else if (methodName === 'trace' && isIE) {\n return traceForIE;\n } else if (console[methodName] !== undefined) {\n return bindMethod(console, methodName);\n } else if (console.log !== undefined) {\n return bindMethod(console, 'log');\n } else {\n return noop;\n }\n }\n\n // These private functions always need `this` to be set properly\n\n function replaceLoggingMethods() {\n /*jshint validthis:true */\n var level = this.getLevel();\n\n // Replace the actual methods.\n for (var i = 0; i < logMethods.length; i++) {\n var methodName = logMethods[i];\n this[methodName] = (i < level) ?\n noop :\n this.methodFactory(methodName, level, this.name);\n }\n\n // Define log.log as an alias for log.debug\n this.log = this.debug;\n\n // Return any important warnings.\n if (typeof console === undefinedType && level < this.levels.SILENT) {\n return \"No console available for logging\";\n }\n }\n\n // In old IE versions, the console isn't present until you first open it.\n // We build realMethod() replacements here that regenerate logging methods\n function enableLoggingWhenConsoleArrives(methodName) {\n return function () {\n if (typeof console !== undefinedType) {\n replaceLoggingMethods.call(this);\n this[methodName].apply(this, arguments);\n }\n };\n }\n\n // By default, we use closely bound real methods wherever possible, and\n // otherwise we wait for a console to appear, and then try again.\n function defaultMethodFactory(methodName, _level, _loggerName) {\n /*jshint validthis:true */\n return realMethod(methodName) ||\n enableLoggingWhenConsoleArrives.apply(this, arguments);\n }\n\n function Logger(name, factory) {\n // Private instance variables.\n var self = this;\n /**\n * The level inherited from a parent logger (or a global default). We\n * cache this here rather than delegating to the parent so that it stays\n * in sync with the actual logging methods that we have installed (the\n * parent could change levels but we might not have rebuilt the loggers\n * in this child yet).\n * @type {number}\n */\n var inheritedLevel;\n /**\n * The default level for this logger, if any. If set, this overrides\n * `inheritedLevel`.\n * @type {number|null}\n */\n var defaultLevel;\n /**\n * A user-specific level for this logger. If set, this overrides\n * `defaultLevel`.\n * @type {number|null}\n */\n var userLevel;\n\n var storageKey = \"loglevel\";\n if (typeof name === \"string\") {\n storageKey += \":\" + name;\n } else if (typeof name === \"symbol\") {\n storageKey = undefined;\n }\n\n function persistLevelIfPossible(levelNum) {\n var levelName = (logMethods[levelNum] || 'silent').toUpperCase();\n\n if (typeof window === undefinedType || !storageKey) return;\n\n // Use localStorage if available\n try {\n window.localStorage[storageKey] = levelName;\n return;\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + \"=\" + levelName + \";\";\n } catch (ignore) {}\n }\n\n function getPersistedLevel() {\n var storedLevel;\n\n if (typeof window === undefinedType || !storageKey) return;\n\n try {\n storedLevel = window.localStorage[storageKey];\n } catch (ignore) {}\n\n // Fallback to cookies if local storage gives us nothing\n if (typeof storedLevel === undefinedType) {\n try {\n var cookie = window.document.cookie;\n var cookieName = encodeURIComponent(storageKey);\n var location = cookie.indexOf(cookieName + \"=\");\n if (location !== -1) {\n storedLevel = /^([^;]+)/.exec(\n cookie.slice(location + cookieName.length + 1)\n )[1];\n }\n } catch (ignore) {}\n }\n\n // If the stored level is not valid, treat it as if nothing was stored.\n if (self.levels[storedLevel] === undefined) {\n storedLevel = undefined;\n }\n\n return storedLevel;\n }\n\n function clearPersistedLevel() {\n if (typeof window === undefinedType || !storageKey) return;\n\n // Use localStorage if available\n try {\n window.localStorage.removeItem(storageKey);\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + \"=; expires=Thu, 01 Jan 1970 00:00:00 UTC\";\n } catch (ignore) {}\n }\n\n function normalizeLevel(input) {\n var level = input;\n if (typeof level === \"string\" && self.levels[level.toUpperCase()] !== undefined) {\n level = self.levels[level.toUpperCase()];\n }\n if (typeof level === \"number\" && level >= 0 && level <= self.levels.SILENT) {\n return level;\n } else {\n throw new TypeError(\"log.setLevel() called with invalid level: \" + input);\n }\n }\n\n /*\n *\n * Public logger API - see https://github.com/pimterry/loglevel for details\n *\n */\n\n self.name = name;\n\n self.levels = { \"TRACE\": 0, \"DEBUG\": 1, \"INFO\": 2, \"WARN\": 3,\n \"ERROR\": 4, \"SILENT\": 5};\n\n self.methodFactory = factory || defaultMethodFactory;\n\n self.getLevel = function () {\n if (userLevel != null) {\n return userLevel;\n } else if (defaultLevel != null) {\n return defaultLevel;\n } else {\n return inheritedLevel;\n }\n };\n\n self.setLevel = function (level, persist) {\n userLevel = normalizeLevel(level);\n if (persist !== false) { // defaults to true\n persistLevelIfPossible(userLevel);\n }\n\n // NOTE: in v2, this should call rebuild(), which updates children.\n return replaceLoggingMethods.call(self);\n };\n\n self.setDefaultLevel = function (level) {\n defaultLevel = normalizeLevel(level);\n if (!getPersistedLevel()) {\n self.setLevel(level, false);\n }\n };\n\n self.resetLevel = function () {\n userLevel = null;\n clearPersistedLevel();\n replaceLoggingMethods.call(self);\n };\n\n self.enableAll = function(persist) {\n self.setLevel(self.levels.TRACE, persist);\n };\n\n self.disableAll = function(persist) {\n self.setLevel(self.levels.SILENT, persist);\n };\n\n self.rebuild = function () {\n if (defaultLogger !== self) {\n inheritedLevel = normalizeLevel(defaultLogger.getLevel());\n }\n replaceLoggingMethods.call(self);\n\n if (defaultLogger === self) {\n for (var childName in _loggersByName) {\n _loggersByName[childName].rebuild();\n }\n }\n };\n\n // Initialize all the internal levels.\n inheritedLevel = normalizeLevel(\n defaultLogger ? defaultLogger.getLevel() : \"WARN\"\n );\n var initialLevel = getPersistedLevel();\n if (initialLevel != null) {\n userLevel = normalizeLevel(initialLevel);\n }\n replaceLoggingMethods.call(self);\n }\n\n /*\n *\n * Top-level API\n *\n */\n\n defaultLogger = new Logger();\n\n defaultLogger.getLogger = function getLogger(name) {\n if ((typeof name !== \"symbol\" && typeof name !== \"string\") || name === \"\") {\n throw new TypeError(\"You must supply a name when creating a logger.\");\n }\n\n var logger = _loggersByName[name];\n if (!logger) {\n logger = _loggersByName[name] = new Logger(\n name,\n defaultLogger.methodFactory\n );\n }\n return logger;\n };\n\n // Grab the current global log variable in case of overwrite\n var _log = (typeof window !== undefinedType) ? window.log : undefined;\n defaultLogger.noConflict = function() {\n if (typeof window !== undefinedType &&\n window.log === defaultLogger) {\n window.log = _log;\n }\n\n return defaultLogger;\n };\n\n defaultLogger.getLoggers = function getLoggers() {\n return _loggersByName;\n };\n\n // ES6 default export, for compatibility\n defaultLogger['default'] = defaultLogger;\n\n return defaultLogger;\n}));\n","(typeof navigator !== \"undefined\") && (function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.lottie = factory());\n})(this, (function () { 'use strict';\n\n var svgNS = 'http://www.w3.org/2000/svg';\n var locationHref = '';\n var _useWebWorker = false;\n var initialDefaultFrame = -999999;\n\n var setWebWorker = function setWebWorker(flag) {\n _useWebWorker = !!flag;\n };\n\n var getWebWorker = function getWebWorker() {\n return _useWebWorker;\n };\n\n var setLocationHref = function setLocationHref(value) {\n locationHref = value;\n };\n\n var getLocationHref = function getLocationHref() {\n return locationHref;\n };\n\n function createTag(type) {\n // return {appendChild:function(){},setAttribute:function(){},style:{}}\n return document.createElement(type);\n }\n\n function extendPrototype(sources, destination) {\n var i;\n var len = sources.length;\n var sourcePrototype;\n\n for (i = 0; i < len; i += 1) {\n sourcePrototype = sources[i].prototype;\n\n for (var attr in sourcePrototype) {\n if (Object.prototype.hasOwnProperty.call(sourcePrototype, attr)) destination.prototype[attr] = sourcePrototype[attr];\n }\n }\n }\n\n function getDescriptor(object, prop) {\n return Object.getOwnPropertyDescriptor(object, prop);\n }\n\n function createProxyFunction(prototype) {\n function ProxyFunction() {}\n\n ProxyFunction.prototype = prototype;\n return ProxyFunction;\n }\n\n // import Howl from '../../3rd_party/howler';\n var audioControllerFactory = function () {\n function AudioController(audioFactory) {\n this.audios = [];\n this.audioFactory = audioFactory;\n this._volume = 1;\n this._isMuted = false;\n }\n\n AudioController.prototype = {\n addAudio: function addAudio(audio) {\n this.audios.push(audio);\n },\n pause: function pause() {\n var i;\n var len = this.audios.length;\n\n for (i = 0; i < len; i += 1) {\n this.audios[i].pause();\n }\n },\n resume: function resume() {\n var i;\n var len = this.audios.length;\n\n for (i = 0; i < len; i += 1) {\n this.audios[i].resume();\n }\n },\n setRate: function setRate(rateValue) {\n var i;\n var len = this.audios.length;\n\n for (i = 0; i < len; i += 1) {\n this.audios[i].setRate(rateValue);\n }\n },\n createAudio: function createAudio(assetPath) {\n if (this.audioFactory) {\n return this.audioFactory(assetPath);\n }\n\n if (window.Howl) {\n return new window.Howl({\n src: [assetPath]\n });\n }\n\n return {\n isPlaying: false,\n play: function play() {\n this.isPlaying = true;\n },\n seek: function seek() {\n this.isPlaying = false;\n },\n playing: function playing() {},\n rate: function rate() {},\n setVolume: function setVolume() {}\n };\n },\n setAudioFactory: function setAudioFactory(audioFactory) {\n this.audioFactory = audioFactory;\n },\n setVolume: function setVolume(value) {\n this._volume = value;\n\n this._updateVolume();\n },\n mute: function mute() {\n this._isMuted = true;\n\n this._updateVolume();\n },\n unmute: function unmute() {\n this._isMuted = false;\n\n this._updateVolume();\n },\n getVolume: function getVolume() {\n return this._volume;\n },\n _updateVolume: function _updateVolume() {\n var i;\n var len = this.audios.length;\n\n for (i = 0; i < len; i += 1) {\n this.audios[i].volume(this._volume * (this._isMuted ? 0 : 1));\n }\n }\n };\n return function () {\n return new AudioController();\n };\n }();\n\n var createTypedArray = function () {\n function createRegularArray(type, len) {\n var i = 0;\n var arr = [];\n var value;\n\n switch (type) {\n case 'int16':\n case 'uint8c':\n value = 1;\n break;\n\n default:\n value = 1.1;\n break;\n }\n\n for (i = 0; i < len; i += 1) {\n arr.push(value);\n }\n\n return arr;\n }\n\n function createTypedArrayFactory(type, len) {\n if (type === 'float32') {\n return new Float32Array(len);\n }\n\n if (type === 'int16') {\n return new Int16Array(len);\n }\n\n if (type === 'uint8c') {\n return new Uint8ClampedArray(len);\n }\n\n return createRegularArray(type, len);\n }\n\n if (typeof Uint8ClampedArray === 'function' && typeof Float32Array === 'function') {\n return createTypedArrayFactory;\n }\n\n return createRegularArray;\n }();\n\n function createSizedArray(len) {\n return Array.apply(null, {\n length: len\n });\n }\n\n function _typeof$6(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof$6 = function _typeof(obj) { return typeof obj; }; } else { _typeof$6 = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof$6(obj); }\n var subframeEnabled = true;\n var expressionsPlugin = null;\n var expressionsInterfaces = null;\n var idPrefix$1 = '';\n var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n var _shouldRoundValues = false;\n var bmPow = Math.pow;\n var bmSqrt = Math.sqrt;\n var bmFloor = Math.floor;\n var bmMax = Math.max;\n var bmMin = Math.min;\n var BMMath = {};\n\n (function () {\n var propertyNames = ['abs', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atanh', 'atan2', 'ceil', 'cbrt', 'expm1', 'clz32', 'cos', 'cosh', 'exp', 'floor', 'fround', 'hypot', 'imul', 'log', 'log1p', 'log2', 'log10', 'max', 'min', 'pow', 'random', 'round', 'sign', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc', 'E', 'LN10', 'LN2', 'LOG10E', 'LOG2E', 'PI', 'SQRT1_2', 'SQRT2'];\n var i;\n var len = propertyNames.length;\n\n for (i = 0; i < len; i += 1) {\n BMMath[propertyNames[i]] = Math[propertyNames[i]];\n }\n })();\n\n function ProjectInterface$1() {\n return {};\n }\n\n BMMath.random = Math.random;\n\n BMMath.abs = function (val) {\n var tOfVal = _typeof$6(val);\n\n if (tOfVal === 'object' && val.length) {\n var absArr = createSizedArray(val.length);\n var i;\n var len = val.length;\n\n for (i = 0; i < len; i += 1) {\n absArr[i] = Math.abs(val[i]);\n }\n\n return absArr;\n }\n\n return Math.abs(val);\n };\n\n var defaultCurveSegments = 150;\n var degToRads = Math.PI / 180;\n var roundCorner = 0.5519;\n\n function roundValues(flag) {\n _shouldRoundValues = !!flag;\n }\n\n function bmRnd(value) {\n if (_shouldRoundValues) {\n return Math.round(value);\n }\n\n return value;\n }\n\n function styleDiv(element) {\n element.style.position = 'absolute';\n element.style.top = 0;\n element.style.left = 0;\n element.style.display = 'block';\n element.style.transformOrigin = '0 0';\n element.style.webkitTransformOrigin = '0 0';\n element.style.backfaceVisibility = 'visible';\n element.style.webkitBackfaceVisibility = 'visible';\n element.style.transformStyle = 'preserve-3d';\n element.style.webkitTransformStyle = 'preserve-3d';\n element.style.mozTransformStyle = 'preserve-3d';\n }\n\n function BMEnterFrameEvent(type, currentTime, totalTime, frameMultiplier) {\n this.type = type;\n this.currentTime = currentTime;\n this.totalTime = totalTime;\n this.direction = frameMultiplier < 0 ? -1 : 1;\n }\n\n function BMCompleteEvent(type, frameMultiplier) {\n this.type = type;\n this.direction = frameMultiplier < 0 ? -1 : 1;\n }\n\n function BMCompleteLoopEvent(type, totalLoops, currentLoop, frameMultiplier) {\n this.type = type;\n this.currentLoop = currentLoop;\n this.totalLoops = totalLoops;\n this.direction = frameMultiplier < 0 ? -1 : 1;\n }\n\n function BMSegmentStartEvent(type, firstFrame, totalFrames) {\n this.type = type;\n this.firstFrame = firstFrame;\n this.totalFrames = totalFrames;\n }\n\n function BMDestroyEvent(type, target) {\n this.type = type;\n this.target = target;\n }\n\n function BMRenderFrameErrorEvent(nativeError, currentTime) {\n this.type = 'renderFrameError';\n this.nativeError = nativeError;\n this.currentTime = currentTime;\n }\n\n function BMConfigErrorEvent(nativeError) {\n this.type = 'configError';\n this.nativeError = nativeError;\n }\n\n function BMAnimationConfigErrorEvent(type, nativeError) {\n this.type = type;\n this.nativeError = nativeError;\n }\n\n var createElementID = function () {\n var _count = 0;\n return function createID() {\n _count += 1;\n return idPrefix$1 + '__lottie_element_' + _count;\n };\n }();\n\n function HSVtoRGB(h, s, v) {\n var r;\n var g;\n var b;\n var i;\n var f;\n var p;\n var q;\n var t;\n i = Math.floor(h * 6);\n f = h * 6 - i;\n p = v * (1 - s);\n q = v * (1 - f * s);\n t = v * (1 - (1 - f) * s);\n\n switch (i % 6) {\n case 0:\n r = v;\n g = t;\n b = p;\n break;\n\n case 1:\n r = q;\n g = v;\n b = p;\n break;\n\n case 2:\n r = p;\n g = v;\n b = t;\n break;\n\n case 3:\n r = p;\n g = q;\n b = v;\n break;\n\n case 4:\n r = t;\n g = p;\n b = v;\n break;\n\n case 5:\n r = v;\n g = p;\n b = q;\n break;\n\n default:\n break;\n }\n\n return [r, g, b];\n }\n\n function RGBtoHSV(r, g, b) {\n var max = Math.max(r, g, b);\n var min = Math.min(r, g, b);\n var d = max - min;\n var h;\n var s = max === 0 ? 0 : d / max;\n var v = max / 255;\n\n switch (max) {\n case min:\n h = 0;\n break;\n\n case r:\n h = g - b + d * (g < b ? 6 : 0);\n h /= 6 * d;\n break;\n\n case g:\n h = b - r + d * 2;\n h /= 6 * d;\n break;\n\n case b:\n h = r - g + d * 4;\n h /= 6 * d;\n break;\n\n default:\n break;\n }\n\n return [h, s, v];\n }\n\n function addSaturationToRGB(color, offset) {\n var hsv = RGBtoHSV(color[0] * 255, color[1] * 255, color[2] * 255);\n hsv[1] += offset;\n\n if (hsv[1] > 1) {\n hsv[1] = 1;\n } else if (hsv[1] <= 0) {\n hsv[1] = 0;\n }\n\n return HSVtoRGB(hsv[0], hsv[1], hsv[2]);\n }\n\n function addBrightnessToRGB(color, offset) {\n var hsv = RGBtoHSV(color[0] * 255, color[1] * 255, color[2] * 255);\n hsv[2] += offset;\n\n if (hsv[2] > 1) {\n hsv[2] = 1;\n } else if (hsv[2] < 0) {\n hsv[2] = 0;\n }\n\n return HSVtoRGB(hsv[0], hsv[1], hsv[2]);\n }\n\n function addHueToRGB(color, offset) {\n var hsv = RGBtoHSV(color[0] * 255, color[1] * 255, color[2] * 255);\n hsv[0] += offset / 360;\n\n if (hsv[0] > 1) {\n hsv[0] -= 1;\n } else if (hsv[0] < 0) {\n hsv[0] += 1;\n }\n\n return HSVtoRGB(hsv[0], hsv[1], hsv[2]);\n }\n\n var rgbToHex = function () {\n var colorMap = [];\n var i;\n var hex;\n\n for (i = 0; i < 256; i += 1) {\n hex = i.toString(16);\n colorMap[i] = hex.length === 1 ? '0' + hex : hex;\n }\n\n return function (r, g, b) {\n if (r < 0) {\n r = 0;\n }\n\n if (g < 0) {\n g = 0;\n }\n\n if (b < 0) {\n b = 0;\n }\n\n return '#' + colorMap[r] + colorMap[g] + colorMap[b];\n };\n }();\n\n var setSubframeEnabled = function setSubframeEnabled(flag) {\n subframeEnabled = !!flag;\n };\n\n var getSubframeEnabled = function getSubframeEnabled() {\n return subframeEnabled;\n };\n\n var setExpressionsPlugin = function setExpressionsPlugin(value) {\n expressionsPlugin = value;\n };\n\n var getExpressionsPlugin = function getExpressionsPlugin() {\n return expressionsPlugin;\n };\n\n var setExpressionInterfaces = function setExpressionInterfaces(value) {\n expressionsInterfaces = value;\n };\n\n var getExpressionInterfaces = function getExpressionInterfaces() {\n return expressionsInterfaces;\n };\n\n var setDefaultCurveSegments = function setDefaultCurveSegments(value) {\n defaultCurveSegments = value;\n };\n\n var getDefaultCurveSegments = function getDefaultCurveSegments() {\n return defaultCurveSegments;\n };\n\n var setIdPrefix = function setIdPrefix(value) {\n idPrefix$1 = value;\n };\n\n var getIdPrefix = function getIdPrefix() {\n return idPrefix$1;\n };\n\n function createNS(type) {\n // return {appendChild:function(){},setAttribute:function(){},style:{}}\n return document.createElementNS(svgNS, type);\n }\n\n function _typeof$5(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof$5 = function _typeof(obj) { return typeof obj; }; } else { _typeof$5 = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof$5(obj); }\n\n var dataManager = function () {\n var _counterId = 1;\n var processes = [];\n var workerFn;\n var workerInstance;\n var workerProxy = {\n onmessage: function onmessage() {},\n postMessage: function postMessage(path) {\n workerFn({\n data: path\n });\n }\n };\n var _workerSelf = {\n postMessage: function postMessage(data) {\n workerProxy.onmessage({\n data: data\n });\n }\n };\n\n function createWorker(fn) {\n if (window.Worker && window.Blob && getWebWorker()) {\n var blob = new Blob(['var _workerSelf = self; self.onmessage = ', fn.toString()], {\n type: 'text/javascript'\n }); // var blob = new Blob(['self.onmessage = ', fn.toString()], { type: 'text/javascript' });\n\n var url = URL.createObjectURL(blob);\n return new Worker(url);\n }\n\n workerFn = fn;\n return workerProxy;\n }\n\n function setupWorker() {\n if (!workerInstance) {\n workerInstance = createWorker(function workerStart(e) {\n function dataFunctionManager() {\n function completeLayers(layers, comps) {\n var layerData;\n var i;\n var len = layers.length;\n var j;\n var jLen;\n var k;\n var kLen;\n\n for (i = 0; i < len; i += 1) {\n layerData = layers[i];\n\n if ('ks' in layerData && !layerData.completed) {\n layerData.completed = true;\n\n if (layerData.hasMask) {\n var maskProps = layerData.masksProperties;\n jLen = maskProps.length;\n\n for (j = 0; j < jLen; j += 1) {\n if (maskProps[j].pt.k.i) {\n convertPathsToAbsoluteValues(maskProps[j].pt.k);\n } else {\n kLen = maskProps[j].pt.k.length;\n\n for (k = 0; k < kLen; k += 1) {\n if (maskProps[j].pt.k[k].s) {\n convertPathsToAbsoluteValues(maskProps[j].pt.k[k].s[0]);\n }\n\n if (maskProps[j].pt.k[k].e) {\n convertPathsToAbsoluteValues(maskProps[j].pt.k[k].e[0]);\n }\n }\n }\n }\n }\n\n if (layerData.ty === 0) {\n layerData.layers = findCompLayers(layerData.refId, comps);\n completeLayers(layerData.layers, comps);\n } else if (layerData.ty === 4) {\n completeShapes(layerData.shapes);\n } else if (layerData.ty === 5) {\n completeText(layerData);\n }\n }\n }\n }\n\n function completeChars(chars, assets) {\n if (chars) {\n var i = 0;\n var len = chars.length;\n\n for (i = 0; i < len; i += 1) {\n if (chars[i].t === 1) {\n // var compData = findComp(chars[i].data.refId, assets);\n chars[i].data.layers = findCompLayers(chars[i].data.refId, assets); // chars[i].data.ip = 0;\n // chars[i].data.op = 99999;\n // chars[i].data.st = 0;\n // chars[i].data.sr = 1;\n // chars[i].w = compData.w;\n // chars[i].data.ks = {\n // a: { k: [0, 0, 0], a: 0 },\n // p: { k: [0, -compData.h, 0], a: 0 },\n // r: { k: 0, a: 0 },\n // s: { k: [100, 100], a: 0 },\n // o: { k: 100, a: 0 },\n // };\n\n completeLayers(chars[i].data.layers, assets);\n }\n }\n }\n }\n\n function findComp(id, comps) {\n var i = 0;\n var len = comps.length;\n\n while (i < len) {\n if (comps[i].id === id) {\n return comps[i];\n }\n\n i += 1;\n }\n\n return null;\n }\n\n function findCompLayers(id, comps) {\n var comp = findComp(id, comps);\n\n if (comp) {\n if (!comp.layers.__used) {\n comp.layers.__used = true;\n return comp.layers;\n }\n\n return JSON.parse(JSON.stringify(comp.layers));\n }\n\n return null;\n }\n\n function completeShapes(arr) {\n var i;\n var len = arr.length;\n var j;\n var jLen;\n\n for (i = len - 1; i >= 0; i -= 1) {\n if (arr[i].ty === 'sh') {\n if (arr[i].ks.k.i) {\n convertPathsToAbsoluteValues(arr[i].ks.k);\n } else {\n jLen = arr[i].ks.k.length;\n\n for (j = 0; j < jLen; j += 1) {\n if (arr[i].ks.k[j].s) {\n convertPathsToAbsoluteValues(arr[i].ks.k[j].s[0]);\n }\n\n if (arr[i].ks.k[j].e) {\n convertPathsToAbsoluteValues(arr[i].ks.k[j].e[0]);\n }\n }\n }\n } else if (arr[i].ty === 'gr') {\n completeShapes(arr[i].it);\n }\n }\n }\n\n function convertPathsToAbsoluteValues(path) {\n var i;\n var len = path.i.length;\n\n for (i = 0; i < len; i += 1) {\n path.i[i][0] += path.v[i][0];\n path.i[i][1] += path.v[i][1];\n path.o[i][0] += path.v[i][0];\n path.o[i][1] += path.v[i][1];\n }\n }\n\n function checkVersion(minimum, animVersionString) {\n var animVersion = animVersionString ? animVersionString.split('.') : [100, 100, 100];\n\n if (minimum[0] > animVersion[0]) {\n return true;\n }\n\n if (animVersion[0] > minimum[0]) {\n return false;\n }\n\n if (minimum[1] > animVersion[1]) {\n return true;\n }\n\n if (animVersion[1] > minimum[1]) {\n return false;\n }\n\n if (minimum[2] > animVersion[2]) {\n return true;\n }\n\n if (animVersion[2] > minimum[2]) {\n return false;\n }\n\n return null;\n }\n\n var checkText = function () {\n var minimumVersion = [4, 4, 14];\n\n function updateTextLayer(textLayer) {\n var documentData = textLayer.t.d;\n textLayer.t.d = {\n k: [{\n s: documentData,\n t: 0\n }]\n };\n }\n\n function iterateLayers(layers) {\n var i;\n var len = layers.length;\n\n for (i = 0; i < len; i += 1) {\n if (layers[i].ty === 5) {\n updateTextLayer(layers[i]);\n }\n }\n }\n\n return function (animationData) {\n if (checkVersion(minimumVersion, animationData.v)) {\n iterateLayers(animationData.layers);\n\n if (animationData.assets) {\n var i;\n var len = animationData.assets.length;\n\n for (i = 0; i < len; i += 1) {\n if (animationData.assets[i].layers) {\n iterateLayers(animationData.assets[i].layers);\n }\n }\n }\n }\n };\n }();\n\n var checkChars = function () {\n var minimumVersion = [4, 7, 99];\n return function (animationData) {\n if (animationData.chars && !checkVersion(minimumVersion, animationData.v)) {\n var i;\n var len = animationData.chars.length;\n\n for (i = 0; i < len; i += 1) {\n var charData = animationData.chars[i];\n\n if (charData.data && charData.data.shapes) {\n completeShapes(charData.data.shapes);\n charData.data.ip = 0;\n charData.data.op = 99999;\n charData.data.st = 0;\n charData.data.sr = 1;\n charData.data.ks = {\n p: {\n k: [0, 0],\n a: 0\n },\n s: {\n k: [100, 100],\n a: 0\n },\n a: {\n k: [0, 0],\n a: 0\n },\n r: {\n k: 0,\n a: 0\n },\n o: {\n k: 100,\n a: 0\n }\n };\n\n if (!animationData.chars[i].t) {\n charData.data.shapes.push({\n ty: 'no'\n });\n charData.data.shapes[0].it.push({\n p: {\n k: [0, 0],\n a: 0\n },\n s: {\n k: [100, 100],\n a: 0\n },\n a: {\n k: [0, 0],\n a: 0\n },\n r: {\n k: 0,\n a: 0\n },\n o: {\n k: 100,\n a: 0\n },\n sk: {\n k: 0,\n a: 0\n },\n sa: {\n k: 0,\n a: 0\n },\n ty: 'tr'\n });\n }\n }\n }\n }\n };\n }();\n\n var checkPathProperties = function () {\n var minimumVersion = [5, 7, 15];\n\n function updateTextLayer(textLayer) {\n var pathData = textLayer.t.p;\n\n if (typeof pathData.a === 'number') {\n pathData.a = {\n a: 0,\n k: pathData.a\n };\n }\n\n if (typeof pathData.p === 'number') {\n pathData.p = {\n a: 0,\n k: pathData.p\n };\n }\n\n if (typeof pathData.r === 'number') {\n pathData.r = {\n a: 0,\n k: pathData.r\n };\n }\n }\n\n function iterateLayers(layers) {\n var i;\n var len = layers.length;\n\n for (i = 0; i < len; i += 1) {\n if (layers[i].ty === 5) {\n updateTextLayer(layers[i]);\n }\n }\n }\n\n return function (animationData) {\n if (checkVersion(minimumVersion, animationData.v)) {\n iterateLayers(animationData.layers);\n\n if (animationData.assets) {\n var i;\n var len = animationData.assets.length;\n\n for (i = 0; i < len; i += 1) {\n if (animationData.assets[i].layers) {\n iterateLayers(animationData.assets[i].layers);\n }\n }\n }\n }\n };\n }();\n\n var checkColors = function () {\n var minimumVersion = [4, 1, 9];\n\n function iterateShapes(shapes) {\n var i;\n var len = shapes.length;\n var j;\n var jLen;\n\n for (i = 0; i < len; i += 1) {\n if (shapes[i].ty === 'gr') {\n iterateShapes(shapes[i].it);\n } else if (shapes[i].ty === 'fl' || shapes[i].ty === 'st') {\n if (shapes[i].c.k && shapes[i].c.k[0].i) {\n jLen = shapes[i].c.k.length;\n\n for (j = 0; j < jLen; j += 1) {\n if (shapes[i].c.k[j].s) {\n shapes[i].c.k[j].s[0] /= 255;\n shapes[i].c.k[j].s[1] /= 255;\n shapes[i].c.k[j].s[2] /= 255;\n shapes[i].c.k[j].s[3] /= 255;\n }\n\n if (shapes[i].c.k[j].e) {\n shapes[i].c.k[j].e[0] /= 255;\n shapes[i].c.k[j].e[1] /= 255;\n shapes[i].c.k[j].e[2] /= 255;\n shapes[i].c.k[j].e[3] /= 255;\n }\n }\n } else {\n shapes[i].c.k[0] /= 255;\n shapes[i].c.k[1] /= 255;\n shapes[i].c.k[2] /= 255;\n shapes[i].c.k[3] /= 255;\n }\n }\n }\n }\n\n function iterateLayers(layers) {\n var i;\n var len = layers.length;\n\n for (i = 0; i < len; i += 1) {\n if (layers[i].ty === 4) {\n iterateShapes(layers[i].shapes);\n }\n }\n }\n\n return function (animationData) {\n if (checkVersion(minimumVersion, animationData.v)) {\n iterateLayers(animationData.layers);\n\n if (animationData.assets) {\n var i;\n var len = animationData.assets.length;\n\n for (i = 0; i < len; i += 1) {\n if (animationData.assets[i].layers) {\n iterateLayers(animationData.assets[i].layers);\n }\n }\n }\n }\n };\n }();\n\n var checkShapes = function () {\n var minimumVersion = [4, 4, 18];\n\n function completeClosingShapes(arr) {\n var i;\n var len = arr.length;\n var j;\n var jLen;\n\n for (i = len - 1; i >= 0; i -= 1) {\n if (arr[i].ty === 'sh') {\n if (arr[i].ks.k.i) {\n arr[i].ks.k.c = arr[i].closed;\n } else {\n jLen = arr[i].ks.k.length;\n\n for (j = 0; j < jLen; j += 1) {\n if (arr[i].ks.k[j].s) {\n arr[i].ks.k[j].s[0].c = arr[i].closed;\n }\n\n if (arr[i].ks.k[j].e) {\n arr[i].ks.k[j].e[0].c = arr[i].closed;\n }\n }\n }\n } else if (arr[i].ty === 'gr') {\n completeClosingShapes(arr[i].it);\n }\n }\n }\n\n function iterateLayers(layers) {\n var layerData;\n var i;\n var len = layers.length;\n var j;\n var jLen;\n var k;\n var kLen;\n\n for (i = 0; i < len; i += 1) {\n layerData = layers[i];\n\n if (layerData.hasMask) {\n var maskProps = layerData.masksProperties;\n jLen = maskProps.length;\n\n for (j = 0; j < jLen; j += 1) {\n if (maskProps[j].pt.k.i) {\n maskProps[j].pt.k.c = maskProps[j].cl;\n } else {\n kLen = maskProps[j].pt.k.length;\n\n for (k = 0; k < kLen; k += 1) {\n if (maskProps[j].pt.k[k].s) {\n maskProps[j].pt.k[k].s[0].c = maskProps[j].cl;\n }\n\n if (maskProps[j].pt.k[k].e) {\n maskProps[j].pt.k[k].e[0].c = maskProps[j].cl;\n }\n }\n }\n }\n }\n\n if (layerData.ty === 4) {\n completeClosingShapes(layerData.shapes);\n }\n }\n }\n\n return function (animationData) {\n if (checkVersion(minimumVersion, animationData.v)) {\n iterateLayers(animationData.layers);\n\n if (animationData.assets) {\n var i;\n var len = animationData.assets.length;\n\n for (i = 0; i < len; i += 1) {\n if (animationData.assets[i].layers) {\n iterateLayers(animationData.assets[i].layers);\n }\n }\n }\n }\n };\n }();\n\n function completeData(animationData) {\n if (animationData.__complete) {\n return;\n }\n\n checkColors(animationData);\n checkText(animationData);\n checkChars(animationData);\n checkPathProperties(animationData);\n checkShapes(animationData);\n completeLayers(animationData.layers, animationData.assets);\n completeChars(animationData.chars, animationData.assets);\n animationData.__complete = true;\n }\n\n function completeText(data) {\n if (data.t.a.length === 0 && !('m' in data.t.p)) {// data.singleShape = true;\n }\n }\n\n var moduleOb = {};\n moduleOb.completeData = completeData;\n moduleOb.checkColors = checkColors;\n moduleOb.checkChars = checkChars;\n moduleOb.checkPathProperties = checkPathProperties;\n moduleOb.checkShapes = checkShapes;\n moduleOb.completeLayers = completeLayers;\n return moduleOb;\n }\n\n if (!_workerSelf.dataManager) {\n _workerSelf.dataManager = dataFunctionManager();\n }\n\n if (!_workerSelf.assetLoader) {\n _workerSelf.assetLoader = function () {\n function formatResponse(xhr) {\n // using typeof doubles the time of execution of this method,\n // so if available, it's better to use the header to validate the type\n var contentTypeHeader = xhr.getResponseHeader('content-type');\n\n if (contentTypeHeader && xhr.responseType === 'json' && contentTypeHeader.indexOf('json') !== -1) {\n return xhr.response;\n }\n\n if (xhr.response && _typeof$5(xhr.response) === 'object') {\n return xhr.response;\n }\n\n if (xhr.response && typeof xhr.response === 'string') {\n return JSON.parse(xhr.response);\n }\n\n if (xhr.responseText) {\n return JSON.parse(xhr.responseText);\n }\n\n return null;\n }\n\n function loadAsset(path, fullPath, callback, errorCallback) {\n var response;\n var xhr = new XMLHttpRequest(); // set responseType after calling open or IE will break.\n\n try {\n // This crashes on Android WebView prior to KitKat\n xhr.responseType = 'json';\n } catch (err) {} // eslint-disable-line no-empty\n\n\n xhr.onreadystatechange = function () {\n if (xhr.readyState === 4) {\n if (xhr.status === 200) {\n response = formatResponse(xhr);\n callback(response);\n } else {\n try {\n response = formatResponse(xhr);\n callback(response);\n } catch (err) {\n if (errorCallback) {\n errorCallback(err);\n }\n }\n }\n }\n };\n\n try {\n // Hack to workaround banner validation\n xhr.open(['G', 'E', 'T'].join(''), path, true);\n } catch (error) {\n // Hack to workaround banner validation\n xhr.open(['G', 'E', 'T'].join(''), fullPath + '/' + path, true);\n }\n\n xhr.send();\n }\n\n return {\n load: loadAsset\n };\n }();\n }\n\n if (e.data.type === 'loadAnimation') {\n _workerSelf.assetLoader.load(e.data.path, e.data.fullPath, function (data) {\n _workerSelf.dataManager.completeData(data);\n\n _workerSelf.postMessage({\n id: e.data.id,\n payload: data,\n status: 'success'\n });\n }, function () {\n _workerSelf.postMessage({\n id: e.data.id,\n status: 'error'\n });\n });\n } else if (e.data.type === 'complete') {\n var animation = e.data.animation;\n\n _workerSelf.dataManager.completeData(animation);\n\n _workerSelf.postMessage({\n id: e.data.id,\n payload: animation,\n status: 'success'\n });\n } else if (e.data.type === 'loadData') {\n _workerSelf.assetLoader.load(e.data.path, e.data.fullPath, function (data) {\n _workerSelf.postMessage({\n id: e.data.id,\n payload: data,\n status: 'success'\n });\n }, function () {\n _workerSelf.postMessage({\n id: e.data.id,\n status: 'error'\n });\n });\n }\n });\n\n workerInstance.onmessage = function (event) {\n var data = event.data;\n var id = data.id;\n var process = processes[id];\n processes[id] = null;\n\n if (data.status === 'success') {\n process.onComplete(data.payload);\n } else if (process.onError) {\n process.onError();\n }\n };\n }\n }\n\n function createProcess(onComplete, onError) {\n _counterId += 1;\n var id = 'processId_' + _counterId;\n processes[id] = {\n onComplete: onComplete,\n onError: onError\n };\n return id;\n }\n\n function loadAnimation(path, onComplete, onError) {\n setupWorker();\n var processId = createProcess(onComplete, onError);\n workerInstance.postMessage({\n type: 'loadAnimation',\n path: path,\n fullPath: window.location.origin + window.location.pathname,\n id: processId\n });\n }\n\n function loadData(path, onComplete, onError) {\n setupWorker();\n var processId = createProcess(onComplete, onError);\n workerInstance.postMessage({\n type: 'loadData',\n path: path,\n fullPath: window.location.origin + window.location.pathname,\n id: processId\n });\n }\n\n function completeAnimation(anim, onComplete, onError) {\n setupWorker();\n var processId = createProcess(onComplete, onError);\n workerInstance.postMessage({\n type: 'complete',\n animation: anim,\n id: processId\n });\n }\n\n return {\n loadAnimation: loadAnimation,\n loadData: loadData,\n completeAnimation: completeAnimation\n };\n }();\n\n var ImagePreloader = function () {\n var proxyImage = function () {\n var canvas = createTag('canvas');\n canvas.width = 1;\n canvas.height = 1;\n var ctx = canvas.getContext('2d');\n ctx.fillStyle = 'rgba(0,0,0,0)';\n ctx.fillRect(0, 0, 1, 1);\n return canvas;\n }();\n\n function imageLoaded() {\n this.loadedAssets += 1;\n\n if (this.loadedAssets === this.totalImages && this.loadedFootagesCount === this.totalFootages) {\n if (this.imagesLoadedCb) {\n this.imagesLoadedCb(null);\n }\n }\n }\n\n function footageLoaded() {\n this.loadedFootagesCount += 1;\n\n if (this.loadedAssets === this.totalImages && this.loadedFootagesCount === this.totalFootages) {\n if (this.imagesLoadedCb) {\n this.imagesLoadedCb(null);\n }\n }\n }\n\n function getAssetsPath(assetData, assetsPath, originalPath) {\n var path = '';\n\n if (assetData.e) {\n path = assetData.p;\n } else if (assetsPath) {\n var imagePath = assetData.p;\n\n if (imagePath.indexOf('images/') !== -1) {\n imagePath = imagePath.split('/')[1];\n }\n\n path = assetsPath + imagePath;\n } else {\n path = originalPath;\n path += assetData.u ? assetData.u : '';\n path += assetData.p;\n }\n\n return path;\n }\n\n function testImageLoaded(img) {\n var _count = 0;\n var intervalId = setInterval(function () {\n var box = img.getBBox();\n\n if (box.width || _count > 500) {\n this._imageLoaded();\n\n clearInterval(intervalId);\n }\n\n _count += 1;\n }.bind(this), 50);\n }\n\n function createImageData(assetData) {\n var path = getAssetsPath(assetData, this.assetsPath, this.path);\n var img = createNS('image');\n\n if (isSafari) {\n this.testImageLoaded(img);\n } else {\n img.addEventListener('load', this._imageLoaded, false);\n }\n\n img.addEventListener('error', function () {\n ob.img = proxyImage;\n\n this._imageLoaded();\n }.bind(this), false);\n img.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n\n if (this._elementHelper.append) {\n this._elementHelper.append(img);\n } else {\n this._elementHelper.appendChild(img);\n }\n\n var ob = {\n img: img,\n assetData: assetData\n };\n return ob;\n }\n\n function createImgData(assetData) {\n var path = getAssetsPath(assetData, this.assetsPath, this.path);\n var img = createTag('img');\n img.crossOrigin = 'anonymous';\n img.addEventListener('load', this._imageLoaded, false);\n img.addEventListener('error', function () {\n ob.img = proxyImage;\n\n this._imageLoaded();\n }.bind(this), false);\n img.src = path;\n var ob = {\n img: img,\n assetData: assetData\n };\n return ob;\n }\n\n function createFootageData(data) {\n var ob = {\n assetData: data\n };\n var path = getAssetsPath(data, this.assetsPath, this.path);\n dataManager.loadData(path, function (footageData) {\n ob.img = footageData;\n\n this._footageLoaded();\n }.bind(this), function () {\n ob.img = {};\n\n this._footageLoaded();\n }.bind(this));\n return ob;\n }\n\n function loadAssets(assets, cb) {\n this.imagesLoadedCb = cb;\n var i;\n var len = assets.length;\n\n for (i = 0; i < len; i += 1) {\n if (!assets[i].layers) {\n if (!assets[i].t || assets[i].t === 'seq') {\n this.totalImages += 1;\n this.images.push(this._createImageData(assets[i]));\n } else if (assets[i].t === 3) {\n this.totalFootages += 1;\n this.images.push(this.createFootageData(assets[i]));\n }\n }\n }\n }\n\n function setPath(path) {\n this.path = path || '';\n }\n\n function setAssetsPath(path) {\n this.assetsPath = path || '';\n }\n\n function getAsset(assetData) {\n var i = 0;\n var len = this.images.length;\n\n while (i < len) {\n if (this.images[i].assetData === assetData) {\n return this.images[i].img;\n }\n\n i += 1;\n }\n\n return null;\n }\n\n function destroy() {\n this.imagesLoadedCb = null;\n this.images.length = 0;\n }\n\n function loadedImages() {\n return this.totalImages === this.loadedAssets;\n }\n\n function loadedFootages() {\n return this.totalFootages === this.loadedFootagesCount;\n }\n\n function setCacheType(type, elementHelper) {\n if (type === 'svg') {\n this._elementHelper = elementHelper;\n this._createImageData = this.createImageData.bind(this);\n } else {\n this._createImageData = this.createImgData.bind(this);\n }\n }\n\n function ImagePreloaderFactory() {\n this._imageLoaded = imageLoaded.bind(this);\n this._footageLoaded = footageLoaded.bind(this);\n this.testImageLoaded = testImageLoaded.bind(this);\n this.createFootageData = createFootageData.bind(this);\n this.assetsPath = '';\n this.path = '';\n this.totalImages = 0;\n this.totalFootages = 0;\n this.loadedAssets = 0;\n this.loadedFootagesCount = 0;\n this.imagesLoadedCb = null;\n this.images = [];\n }\n\n ImagePreloaderFactory.prototype = {\n loadAssets: loadAssets,\n setAssetsPath: setAssetsPath,\n setPath: setPath,\n loadedImages: loadedImages,\n loadedFootages: loadedFootages,\n destroy: destroy,\n getAsset: getAsset,\n createImgData: createImgData,\n createImageData: createImageData,\n imageLoaded: imageLoaded,\n footageLoaded: footageLoaded,\n setCacheType: setCacheType\n };\n return ImagePreloaderFactory;\n }();\n\n function BaseEvent() {}\n\n BaseEvent.prototype = {\n triggerEvent: function triggerEvent(eventName, args) {\n if (this._cbs[eventName]) {\n var callbacks = this._cbs[eventName];\n\n for (var i = 0; i < callbacks.length; i += 1) {\n callbacks[i](args);\n }\n }\n },\n addEventListener: function addEventListener(eventName, callback) {\n if (!this._cbs[eventName]) {\n this._cbs[eventName] = [];\n }\n\n this._cbs[eventName].push(callback);\n\n return function () {\n this.removeEventListener(eventName, callback);\n }.bind(this);\n },\n removeEventListener: function removeEventListener(eventName, callback) {\n if (!callback) {\n this._cbs[eventName] = null;\n } else if (this._cbs[eventName]) {\n var i = 0;\n var len = this._cbs[eventName].length;\n\n while (i < len) {\n if (this._cbs[eventName][i] === callback) {\n this._cbs[eventName].splice(i, 1);\n\n i -= 1;\n len -= 1;\n }\n\n i += 1;\n }\n\n if (!this._cbs[eventName].length) {\n this._cbs[eventName] = null;\n }\n }\n }\n };\n\n var markerParser = function () {\n function parsePayloadLines(payload) {\n var lines = payload.split('\\r\\n');\n var keys = {};\n var line;\n var keysCount = 0;\n\n for (var i = 0; i < lines.length; i += 1) {\n line = lines[i].split(':');\n\n if (line.length === 2) {\n keys[line[0]] = line[1].trim();\n keysCount += 1;\n }\n }\n\n if (keysCount === 0) {\n throw new Error();\n }\n\n return keys;\n }\n\n return function (_markers) {\n var markers = [];\n\n for (var i = 0; i < _markers.length; i += 1) {\n var _marker = _markers[i];\n var markerData = {\n time: _marker.tm,\n duration: _marker.dr\n };\n\n try {\n markerData.payload = JSON.parse(_markers[i].cm);\n } catch (_) {\n try {\n markerData.payload = parsePayloadLines(_markers[i].cm);\n } catch (__) {\n markerData.payload = {\n name: _markers[i].cm\n };\n }\n }\n\n markers.push(markerData);\n }\n\n return markers;\n };\n }();\n\n var ProjectInterface = function () {\n function registerComposition(comp) {\n this.compositions.push(comp);\n }\n\n return function () {\n function _thisProjectFunction(name) {\n var i = 0;\n var len = this.compositions.length;\n\n while (i < len) {\n if (this.compositions[i].data && this.compositions[i].data.nm === name) {\n if (this.compositions[i].prepareFrame && this.compositions[i].data.xt) {\n this.compositions[i].prepareFrame(this.currentFrame);\n }\n\n return this.compositions[i].compInterface;\n }\n\n i += 1;\n }\n\n return null;\n }\n\n _thisProjectFunction.compositions = [];\n _thisProjectFunction.currentFrame = 0;\n _thisProjectFunction.registerComposition = registerComposition;\n return _thisProjectFunction;\n };\n }();\n\n var renderers = {};\n\n var registerRenderer = function registerRenderer(key, value) {\n renderers[key] = value;\n };\n\n function getRenderer(key) {\n return renderers[key];\n }\n\n function getRegisteredRenderer() {\n // Returns canvas by default for compatibility\n if (renderers.canvas) {\n return 'canvas';\n } // Returns any renderer that is registered\n\n\n for (var key in renderers) {\n if (renderers[key]) {\n return key;\n }\n }\n\n return '';\n }\n\n function _typeof$4(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof$4 = function _typeof(obj) { return typeof obj; }; } else { _typeof$4 = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof$4(obj); }\n\n var AnimationItem = function AnimationItem() {\n this._cbs = [];\n this.name = '';\n this.path = '';\n this.isLoaded = false;\n this.currentFrame = 0;\n this.currentRawFrame = 0;\n this.firstFrame = 0;\n this.totalFrames = 0;\n this.frameRate = 0;\n this.frameMult = 0;\n this.playSpeed = 1;\n this.playDirection = 1;\n this.playCount = 0;\n this.animationData = {};\n this.assets = [];\n this.isPaused = true;\n this.autoplay = false;\n this.loop = true;\n this.renderer = null;\n this.animationID = createElementID();\n this.assetsPath = '';\n this.timeCompleted = 0;\n this.segmentPos = 0;\n this.isSubframeEnabled = getSubframeEnabled();\n this.segments = [];\n this._idle = true;\n this._completedLoop = false;\n this.projectInterface = ProjectInterface();\n this.imagePreloader = new ImagePreloader();\n this.audioController = audioControllerFactory();\n this.markers = [];\n this.configAnimation = this.configAnimation.bind(this);\n this.onSetupError = this.onSetupError.bind(this);\n this.onSegmentComplete = this.onSegmentComplete.bind(this);\n this.drawnFrameEvent = new BMEnterFrameEvent('drawnFrame', 0, 0, 0);\n this.expressionsPlugin = getExpressionsPlugin();\n };\n\n extendPrototype([BaseEvent], AnimationItem);\n\n AnimationItem.prototype.setParams = function (params) {\n if (params.wrapper || params.container) {\n this.wrapper = params.wrapper || params.container;\n }\n\n var animType = 'svg';\n\n if (params.animType) {\n animType = params.animType;\n } else if (params.renderer) {\n animType = params.renderer;\n }\n\n var RendererClass = getRenderer(animType);\n this.renderer = new RendererClass(this, params.rendererSettings);\n this.imagePreloader.setCacheType(animType, this.renderer.globalData.defs);\n this.renderer.setProjectInterface(this.projectInterface);\n this.animType = animType;\n\n if (params.loop === '' || params.loop === null || params.loop === undefined || params.loop === true) {\n this.loop = true;\n } else if (params.loop === false) {\n this.loop = false;\n } else {\n this.loop = parseInt(params.loop, 10);\n }\n\n this.autoplay = 'autoplay' in params ? params.autoplay : true;\n this.name = params.name ? params.name : '';\n this.autoloadSegments = Object.prototype.hasOwnProperty.call(params, 'autoloadSegments') ? params.autoloadSegments : true;\n this.assetsPath = params.assetsPath;\n this.initialSegment = params.initialSegment;\n\n if (params.audioFactory) {\n this.audioController.setAudioFactory(params.audioFactory);\n }\n\n if (params.animationData) {\n this.setupAnimation(params.animationData);\n } else if (params.path) {\n if (params.path.lastIndexOf('\\\\') !== -1) {\n this.path = params.path.substr(0, params.path.lastIndexOf('\\\\') + 1);\n } else {\n this.path = params.path.substr(0, params.path.lastIndexOf('/') + 1);\n }\n\n this.fileName = params.path.substr(params.path.lastIndexOf('/') + 1);\n this.fileName = this.fileName.substr(0, this.fileName.lastIndexOf('.json'));\n dataManager.loadAnimation(params.path, this.configAnimation, this.onSetupError);\n }\n };\n\n AnimationItem.prototype.onSetupError = function () {\n this.trigger('data_failed');\n };\n\n AnimationItem.prototype.setupAnimation = function (data) {\n dataManager.completeAnimation(data, this.configAnimation);\n };\n\n AnimationItem.prototype.setData = function (wrapper, animationData) {\n if (animationData) {\n if (_typeof$4(animationData) !== 'object') {\n animationData = JSON.parse(animationData);\n }\n }\n\n var params = {\n wrapper: wrapper,\n animationData: animationData\n };\n var wrapperAttributes = wrapper.attributes;\n params.path = wrapperAttributes.getNamedItem('data-animation-path') // eslint-disable-line no-nested-ternary\n ? wrapperAttributes.getNamedItem('data-animation-path').value : wrapperAttributes.getNamedItem('data-bm-path') // eslint-disable-line no-nested-ternary\n ? wrapperAttributes.getNamedItem('data-bm-path').value : wrapperAttributes.getNamedItem('bm-path') ? wrapperAttributes.getNamedItem('bm-path').value : '';\n params.animType = wrapperAttributes.getNamedItem('data-anim-type') // eslint-disable-line no-nested-ternary\n ? wrapperAttributes.getNamedItem('data-anim-type').value : wrapperAttributes.getNamedItem('data-bm-type') // eslint-disable-line no-nested-ternary\n ? wrapperAttributes.getNamedItem('data-bm-type').value : wrapperAttributes.getNamedItem('bm-type') // eslint-disable-line no-nested-ternary\n ? wrapperAttributes.getNamedItem('bm-type').value : wrapperAttributes.getNamedItem('data-bm-renderer') // eslint-disable-line no-nested-ternary\n ? wrapperAttributes.getNamedItem('data-bm-renderer').value : wrapperAttributes.getNamedItem('bm-renderer') ? wrapperAttributes.getNamedItem('bm-renderer').value : getRegisteredRenderer() || 'canvas';\n var loop = wrapperAttributes.getNamedItem('data-anim-loop') // eslint-disable-line no-nested-ternary\n ? wrapperAttributes.getNamedItem('data-anim-loop').value : wrapperAttributes.getNamedItem('data-bm-loop') // eslint-disable-line no-nested-ternary\n ? wrapperAttributes.getNamedItem('data-bm-loop').value : wrapperAttributes.getNamedItem('bm-loop') ? wrapperAttributes.getNamedItem('bm-loop').value : '';\n\n if (loop === 'false') {\n params.loop = false;\n } else if (loop === 'true') {\n params.loop = true;\n } else if (loop !== '') {\n params.loop = parseInt(loop, 10);\n }\n\n var autoplay = wrapperAttributes.getNamedItem('data-anim-autoplay') // eslint-disable-line no-nested-ternary\n ? wrapperAttributes.getNamedItem('data-anim-autoplay').value : wrapperAttributes.getNamedItem('data-bm-autoplay') // eslint-disable-line no-nested-ternary\n ? wrapperAttributes.getNamedItem('data-bm-autoplay').value : wrapperAttributes.getNamedItem('bm-autoplay') ? wrapperAttributes.getNamedItem('bm-autoplay').value : true;\n params.autoplay = autoplay !== 'false';\n params.name = wrapperAttributes.getNamedItem('data-name') // eslint-disable-line no-nested-ternary\n ? wrapperAttributes.getNamedItem('data-name').value : wrapperAttributes.getNamedItem('data-bm-name') // eslint-disable-line no-nested-ternary\n ? wrapperAttributes.getNamedItem('data-bm-name').value : wrapperAttributes.getNamedItem('bm-name') ? wrapperAttributes.getNamedItem('bm-name').value : '';\n var prerender = wrapperAttributes.getNamedItem('data-anim-prerender') // eslint-disable-line no-nested-ternary\n ? wrapperAttributes.getNamedItem('data-anim-prerender').value : wrapperAttributes.getNamedItem('data-bm-prerender') // eslint-disable-line no-nested-ternary\n ? wrapperAttributes.getNamedItem('data-bm-prerender').value : wrapperAttributes.getNamedItem('bm-prerender') ? wrapperAttributes.getNamedItem('bm-prerender').value : '';\n\n if (prerender === 'false') {\n params.prerender = false;\n }\n\n if (!params.path) {\n this.trigger('destroy');\n } else {\n this.setParams(params);\n }\n };\n\n AnimationItem.prototype.includeLayers = function (data) {\n if (data.op > this.animationData.op) {\n this.animationData.op = data.op;\n this.totalFrames = Math.floor(data.op - this.animationData.ip);\n }\n\n var layers = this.animationData.layers;\n var i;\n var len = layers.length;\n var newLayers = data.layers;\n var j;\n var jLen = newLayers.length;\n\n for (j = 0; j < jLen; j += 1) {\n i = 0;\n\n while (i < len) {\n if (layers[i].id === newLayers[j].id) {\n layers[i] = newLayers[j];\n break;\n }\n\n i += 1;\n }\n }\n\n if (data.chars || data.fonts) {\n this.renderer.globalData.fontManager.addChars(data.chars);\n this.renderer.globalData.fontManager.addFonts(data.fonts, this.renderer.globalData.defs);\n }\n\n if (data.assets) {\n len = data.assets.length;\n\n for (i = 0; i < len; i += 1) {\n this.animationData.assets.push(data.assets[i]);\n }\n }\n\n this.animationData.__complete = false;\n dataManager.completeAnimation(this.animationData, this.onSegmentComplete);\n };\n\n AnimationItem.prototype.onSegmentComplete = function (data) {\n this.animationData = data;\n var expressionsPlugin = getExpressionsPlugin();\n\n if (expressionsPlugin) {\n expressionsPlugin.initExpressions(this);\n }\n\n this.loadNextSegment();\n };\n\n AnimationItem.prototype.loadNextSegment = function () {\n var segments = this.animationData.segments;\n\n if (!segments || segments.length === 0 || !this.autoloadSegments) {\n this.trigger('data_ready');\n this.timeCompleted = this.totalFrames;\n return;\n }\n\n var segment = segments.shift();\n this.timeCompleted = segment.time * this.frameRate;\n var segmentPath = this.path + this.fileName + '_' + this.segmentPos + '.json';\n this.segmentPos += 1;\n dataManager.loadData(segmentPath, this.includeLayers.bind(this), function () {\n this.trigger('data_failed');\n }.bind(this));\n };\n\n AnimationItem.prototype.loadSegments = function () {\n var segments = this.animationData.segments;\n\n if (!segments) {\n this.timeCompleted = this.totalFrames;\n }\n\n this.loadNextSegment();\n };\n\n AnimationItem.prototype.imagesLoaded = function () {\n this.trigger('loaded_images');\n this.checkLoaded();\n };\n\n AnimationItem.prototype.preloadImages = function () {\n this.imagePreloader.setAssetsPath(this.assetsPath);\n this.imagePreloader.setPath(this.path);\n this.imagePreloader.loadAssets(this.animationData.assets, this.imagesLoaded.bind(this));\n };\n\n AnimationItem.prototype.configAnimation = function (animData) {\n if (!this.renderer) {\n return;\n }\n\n try {\n this.animationData = animData;\n\n if (this.initialSegment) {\n this.totalFrames = Math.floor(this.initialSegment[1] - this.initialSegment[0]);\n this.firstFrame = Math.round(this.initialSegment[0]);\n } else {\n this.totalFrames = Math.floor(this.animationData.op - this.animationData.ip);\n this.firstFrame = Math.round(this.animationData.ip);\n }\n\n this.renderer.configAnimation(animData);\n\n if (!animData.assets) {\n animData.assets = [];\n }\n\n this.assets = this.animationData.assets;\n this.frameRate = this.animationData.fr;\n this.frameMult = this.animationData.fr / 1000;\n this.renderer.searchExtraCompositions(animData.assets);\n this.markers = markerParser(animData.markers || []);\n this.trigger('config_ready');\n this.preloadImages();\n this.loadSegments();\n this.updaFrameModifier();\n this.waitForFontsLoaded();\n\n if (this.isPaused) {\n this.audioController.pause();\n }\n } catch (error) {\n this.triggerConfigError(error);\n }\n };\n\n AnimationItem.prototype.waitForFontsLoaded = function () {\n if (!this.renderer) {\n return;\n }\n\n if (this.renderer.globalData.fontManager.isLoaded) {\n this.checkLoaded();\n } else {\n setTimeout(this.waitForFontsLoaded.bind(this), 20);\n }\n };\n\n AnimationItem.prototype.checkLoaded = function () {\n if (!this.isLoaded && this.renderer.globalData.fontManager.isLoaded && (this.imagePreloader.loadedImages() || this.renderer.rendererType !== 'canvas') && this.imagePreloader.loadedFootages()) {\n this.isLoaded = true;\n var expressionsPlugin = getExpressionsPlugin();\n\n if (expressionsPlugin) {\n expressionsPlugin.initExpressions(this);\n }\n\n this.renderer.initItems();\n setTimeout(function () {\n this.trigger('DOMLoaded');\n }.bind(this), 0);\n this.gotoFrame();\n\n if (this.autoplay) {\n this.play();\n }\n }\n };\n\n AnimationItem.prototype.resize = function (width, height) {\n // Adding this validation for backwards compatibility in case an event object was being passed down\n var _width = typeof width === 'number' ? width : undefined;\n\n var _height = typeof height === 'number' ? height : undefined;\n\n this.renderer.updateContainerSize(_width, _height);\n };\n\n AnimationItem.prototype.setSubframe = function (flag) {\n this.isSubframeEnabled = !!flag;\n };\n\n AnimationItem.prototype.gotoFrame = function () {\n this.currentFrame = this.isSubframeEnabled ? this.currentRawFrame : ~~this.currentRawFrame; // eslint-disable-line no-bitwise\n\n if (this.timeCompleted !== this.totalFrames && this.currentFrame > this.timeCompleted) {\n this.currentFrame = this.timeCompleted;\n }\n\n this.trigger('enterFrame');\n this.renderFrame();\n this.trigger('drawnFrame');\n };\n\n AnimationItem.prototype.renderFrame = function () {\n if (this.isLoaded === false || !this.renderer) {\n return;\n }\n\n try {\n if (this.expressionsPlugin) {\n this.expressionsPlugin.resetFrame();\n }\n\n this.renderer.renderFrame(this.currentFrame + this.firstFrame);\n } catch (error) {\n this.triggerRenderFrameError(error);\n }\n };\n\n AnimationItem.prototype.play = function (name) {\n if (name && this.name !== name) {\n return;\n }\n\n if (this.isPaused === true) {\n this.isPaused = false;\n this.trigger('_play');\n this.audioController.resume();\n\n if (this._idle) {\n this._idle = false;\n this.trigger('_active');\n }\n }\n };\n\n AnimationItem.prototype.pause = function (name) {\n if (name && this.name !== name) {\n return;\n }\n\n if (this.isPaused === false) {\n this.isPaused = true;\n this.trigger('_pause');\n this._idle = true;\n this.trigger('_idle');\n this.audioController.pause();\n }\n };\n\n AnimationItem.prototype.togglePause = function (name) {\n if (name && this.name !== name) {\n return;\n }\n\n if (this.isPaused === true) {\n this.play();\n } else {\n this.pause();\n }\n };\n\n AnimationItem.prototype.stop = function (name) {\n if (name && this.name !== name) {\n return;\n }\n\n this.pause();\n this.playCount = 0;\n this._completedLoop = false;\n this.setCurrentRawFrameValue(0);\n };\n\n AnimationItem.prototype.getMarkerData = function (markerName) {\n var marker;\n\n for (var i = 0; i < this.markers.length; i += 1) {\n marker = this.markers[i];\n\n if (marker.payload && marker.payload.name === markerName) {\n return marker;\n }\n }\n\n return null;\n };\n\n AnimationItem.prototype.goToAndStop = function (value, isFrame, name) {\n if (name && this.name !== name) {\n return;\n }\n\n var numValue = Number(value);\n\n if (isNaN(numValue)) {\n var marker = this.getMarkerData(value);\n\n if (marker) {\n this.goToAndStop(marker.time, true);\n }\n } else if (isFrame) {\n this.setCurrentRawFrameValue(value);\n } else {\n this.setCurrentRawFrameValue(value * this.frameModifier);\n }\n\n this.pause();\n };\n\n AnimationItem.prototype.goToAndPlay = function (value, isFrame, name) {\n if (name && this.name !== name) {\n return;\n }\n\n var numValue = Number(value);\n\n if (isNaN(numValue)) {\n var marker = this.getMarkerData(value);\n\n if (marker) {\n if (!marker.duration) {\n this.goToAndStop(marker.time, true);\n } else {\n this.playSegments([marker.time, marker.time + marker.duration], true);\n }\n }\n } else {\n this.goToAndStop(numValue, isFrame, name);\n }\n\n this.play();\n };\n\n AnimationItem.prototype.advanceTime = function (value) {\n if (this.isPaused === true || this.isLoaded === false) {\n return;\n }\n\n var nextValue = this.currentRawFrame + value * this.frameModifier;\n var _isComplete = false; // Checking if nextValue > totalFrames - 1 for addressing non looping and looping animations.\n // If animation won't loop, it should stop at totalFrames - 1. If it will loop it should complete the last frame and then loop.\n\n if (nextValue >= this.totalFrames - 1 && this.frameModifier > 0) {\n if (!this.loop || this.playCount === this.loop) {\n if (!this.checkSegments(nextValue > this.totalFrames ? nextValue % this.totalFrames : 0)) {\n _isComplete = true;\n nextValue = this.totalFrames - 1;\n }\n } else if (nextValue >= this.totalFrames) {\n this.playCount += 1;\n\n if (!this.checkSegments(nextValue % this.totalFrames)) {\n this.setCurrentRawFrameValue(nextValue % this.totalFrames);\n this._completedLoop = true;\n this.trigger('loopComplete');\n }\n } else {\n this.setCurrentRawFrameValue(nextValue);\n }\n } else if (nextValue < 0) {\n if (!this.checkSegments(nextValue % this.totalFrames)) {\n if (this.loop && !(this.playCount-- <= 0 && this.loop !== true)) {\n // eslint-disable-line no-plusplus\n this.setCurrentRawFrameValue(this.totalFrames + nextValue % this.totalFrames);\n\n if (!this._completedLoop) {\n this._completedLoop = true;\n } else {\n this.trigger('loopComplete');\n }\n } else {\n _isComplete = true;\n nextValue = 0;\n }\n }\n } else {\n this.setCurrentRawFrameValue(nextValue);\n }\n\n if (_isComplete) {\n this.setCurrentRawFrameValue(nextValue);\n this.pause();\n this.trigger('complete');\n }\n };\n\n AnimationItem.prototype.adjustSegment = function (arr, offset) {\n this.playCount = 0;\n\n if (arr[1] < arr[0]) {\n if (this.frameModifier > 0) {\n if (this.playSpeed < 0) {\n this.setSpeed(-this.playSpeed);\n } else {\n this.setDirection(-1);\n }\n }\n\n this.totalFrames = arr[0] - arr[1];\n this.timeCompleted = this.totalFrames;\n this.firstFrame = arr[1];\n this.setCurrentRawFrameValue(this.totalFrames - 0.001 - offset);\n } else if (arr[1] > arr[0]) {\n if (this.frameModifier < 0) {\n if (this.playSpeed < 0) {\n this.setSpeed(-this.playSpeed);\n } else {\n this.setDirection(1);\n }\n }\n\n this.totalFrames = arr[1] - arr[0];\n this.timeCompleted = this.totalFrames;\n this.firstFrame = arr[0];\n this.setCurrentRawFrameValue(0.001 + offset);\n }\n\n this.trigger('segmentStart');\n };\n\n AnimationItem.prototype.setSegment = function (init, end) {\n var pendingFrame = -1;\n\n if (this.isPaused) {\n if (this.currentRawFrame + this.firstFrame < init) {\n pendingFrame = init;\n } else if (this.currentRawFrame + this.firstFrame > end) {\n pendingFrame = end - init;\n }\n }\n\n this.firstFrame = init;\n this.totalFrames = end - init;\n this.timeCompleted = this.totalFrames;\n\n if (pendingFrame !== -1) {\n this.goToAndStop(pendingFrame, true);\n }\n };\n\n AnimationItem.prototype.playSegments = function (arr, forceFlag) {\n if (forceFlag) {\n this.segments.length = 0;\n }\n\n if (_typeof$4(arr[0]) === 'object') {\n var i;\n var len = arr.length;\n\n for (i = 0; i < len; i += 1) {\n this.segments.push(arr[i]);\n }\n } else {\n this.segments.push(arr);\n }\n\n if (this.segments.length && forceFlag) {\n this.adjustSegment(this.segments.shift(), 0);\n }\n\n if (this.isPaused) {\n this.play();\n }\n };\n\n AnimationItem.prototype.resetSegments = function (forceFlag) {\n this.segments.length = 0;\n this.segments.push([this.animationData.ip, this.animationData.op]);\n\n if (forceFlag) {\n this.checkSegments(0);\n }\n };\n\n AnimationItem.prototype.checkSegments = function (offset) {\n if (this.segments.length) {\n this.adjustSegment(this.segments.shift(), offset);\n return true;\n }\n\n return false;\n };\n\n AnimationItem.prototype.destroy = function (name) {\n if (name && this.name !== name || !this.renderer) {\n return;\n }\n\n this.renderer.destroy();\n this.imagePreloader.destroy();\n this.trigger('destroy');\n this._cbs = null;\n this.onEnterFrame = null;\n this.onLoopComplete = null;\n this.onComplete = null;\n this.onSegmentStart = null;\n this.onDestroy = null;\n this.renderer = null;\n this.expressionsPlugin = null;\n this.imagePreloader = null;\n this.projectInterface = null;\n };\n\n AnimationItem.prototype.setCurrentRawFrameValue = function (value) {\n this.currentRawFrame = value;\n this.gotoFrame();\n };\n\n AnimationItem.prototype.setSpeed = function (val) {\n this.playSpeed = val;\n this.updaFrameModifier();\n };\n\n AnimationItem.prototype.setDirection = function (val) {\n this.playDirection = val < 0 ? -1 : 1;\n this.updaFrameModifier();\n };\n\n AnimationItem.prototype.setLoop = function (isLooping) {\n this.loop = isLooping;\n };\n\n AnimationItem.prototype.setVolume = function (val, name) {\n if (name && this.name !== name) {\n return;\n }\n\n this.audioController.setVolume(val);\n };\n\n AnimationItem.prototype.getVolume = function () {\n return this.audioController.getVolume();\n };\n\n AnimationItem.prototype.mute = function (name) {\n if (name && this.name !== name) {\n return;\n }\n\n this.audioController.mute();\n };\n\n AnimationItem.prototype.unmute = function (name) {\n if (name && this.name !== name) {\n return;\n }\n\n this.audioController.unmute();\n };\n\n AnimationItem.prototype.updaFrameModifier = function () {\n this.frameModifier = this.frameMult * this.playSpeed * this.playDirection;\n this.audioController.setRate(this.playSpeed * this.playDirection);\n };\n\n AnimationItem.prototype.getPath = function () {\n return this.path;\n };\n\n AnimationItem.prototype.getAssetsPath = function (assetData) {\n var path = '';\n\n if (assetData.e) {\n path = assetData.p;\n } else if (this.assetsPath) {\n var imagePath = assetData.p;\n\n if (imagePath.indexOf('images/') !== -1) {\n imagePath = imagePath.split('/')[1];\n }\n\n path = this.assetsPath + imagePath;\n } else {\n path = this.path;\n path += assetData.u ? assetData.u : '';\n path += assetData.p;\n }\n\n return path;\n };\n\n AnimationItem.prototype.getAssetData = function (id) {\n var i = 0;\n var len = this.assets.length;\n\n while (i < len) {\n if (id === this.assets[i].id) {\n return this.assets[i];\n }\n\n i += 1;\n }\n\n return null;\n };\n\n AnimationItem.prototype.hide = function () {\n this.renderer.hide();\n };\n\n AnimationItem.prototype.show = function () {\n this.renderer.show();\n };\n\n AnimationItem.prototype.getDuration = function (isFrame) {\n return isFrame ? this.totalFrames : this.totalFrames / this.frameRate;\n };\n\n AnimationItem.prototype.updateDocumentData = function (path, documentData, index) {\n try {\n var element = this.renderer.getElementByPath(path);\n element.updateDocumentData(documentData, index);\n } catch (error) {// TODO: decide how to handle catch case\n }\n };\n\n AnimationItem.prototype.trigger = function (name) {\n if (this._cbs && this._cbs[name]) {\n switch (name) {\n case 'enterFrame':\n this.triggerEvent(name, new BMEnterFrameEvent(name, this.currentFrame, this.totalFrames, this.frameModifier));\n break;\n\n case 'drawnFrame':\n this.drawnFrameEvent.currentTime = this.currentFrame;\n this.drawnFrameEvent.totalTime = this.totalFrames;\n this.drawnFrameEvent.direction = this.frameModifier;\n this.triggerEvent(name, this.drawnFrameEvent);\n break;\n\n case 'loopComplete':\n this.triggerEvent(name, new BMCompleteLoopEvent(name, this.loop, this.playCount, this.frameMult));\n break;\n\n case 'complete':\n this.triggerEvent(name, new BMCompleteEvent(name, this.frameMult));\n break;\n\n case 'segmentStart':\n this.triggerEvent(name, new BMSegmentStartEvent(name, this.firstFrame, this.totalFrames));\n break;\n\n case 'destroy':\n this.triggerEvent(name, new BMDestroyEvent(name, this));\n break;\n\n default:\n this.triggerEvent(name);\n }\n }\n\n if (name === 'enterFrame' && this.onEnterFrame) {\n this.onEnterFrame.call(this, new BMEnterFrameEvent(name, this.currentFrame, this.totalFrames, this.frameMult));\n }\n\n if (name === 'loopComplete' && this.onLoopComplete) {\n this.onLoopComplete.call(this, new BMCompleteLoopEvent(name, this.loop, this.playCount, this.frameMult));\n }\n\n if (name === 'complete' && this.onComplete) {\n this.onComplete.call(this, new BMCompleteEvent(name, this.frameMult));\n }\n\n if (name === 'segmentStart' && this.onSegmentStart) {\n this.onSegmentStart.call(this, new BMSegmentStartEvent(name, this.firstFrame, this.totalFrames));\n }\n\n if (name === 'destroy' && this.onDestroy) {\n this.onDestroy.call(this, new BMDestroyEvent(name, this));\n }\n };\n\n AnimationItem.prototype.triggerRenderFrameError = function (nativeError) {\n var error = new BMRenderFrameErrorEvent(nativeError, this.currentFrame);\n this.triggerEvent('error', error);\n\n if (this.onError) {\n this.onError.call(this, error);\n }\n };\n\n AnimationItem.prototype.triggerConfigError = function (nativeError) {\n var error = new BMConfigErrorEvent(nativeError, this.currentFrame);\n this.triggerEvent('error', error);\n\n if (this.onError) {\n this.onError.call(this, error);\n }\n };\n\n var animationManager = function () {\n var moduleOb = {};\n var registeredAnimations = [];\n var initTime = 0;\n var len = 0;\n var playingAnimationsNum = 0;\n var _stopped = true;\n var _isFrozen = false;\n\n function removeElement(ev) {\n var i = 0;\n var animItem = ev.target;\n\n while (i < len) {\n if (registeredAnimations[i].animation === animItem) {\n registeredAnimations.splice(i, 1);\n i -= 1;\n len -= 1;\n\n if (!animItem.isPaused) {\n subtractPlayingCount();\n }\n }\n\n i += 1;\n }\n }\n\n function registerAnimation(element, animationData) {\n if (!element) {\n return null;\n }\n\n var i = 0;\n\n while (i < len) {\n if (registeredAnimations[i].elem === element && registeredAnimations[i].elem !== null) {\n return registeredAnimations[i].animation;\n }\n\n i += 1;\n }\n\n var animItem = new AnimationItem();\n setupAnimation(animItem, element);\n animItem.setData(element, animationData);\n return animItem;\n }\n\n function getRegisteredAnimations() {\n var i;\n var lenAnims = registeredAnimations.length;\n var animations = [];\n\n for (i = 0; i < lenAnims; i += 1) {\n animations.push(registeredAnimations[i].animation);\n }\n\n return animations;\n }\n\n function addPlayingCount() {\n playingAnimationsNum += 1;\n activate();\n }\n\n function subtractPlayingCount() {\n playingAnimationsNum -= 1;\n }\n\n function setupAnimation(animItem, element) {\n animItem.addEventListener('destroy', removeElement);\n animItem.addEventListener('_active', addPlayingCount);\n animItem.addEventListener('_idle', subtractPlayingCount);\n registeredAnimations.push({\n elem: element,\n animation: animItem\n });\n len += 1;\n }\n\n function loadAnimation(params) {\n var animItem = new AnimationItem();\n setupAnimation(animItem, null);\n animItem.setParams(params);\n return animItem;\n }\n\n function setSpeed(val, animation) {\n var i;\n\n for (i = 0; i < len; i += 1) {\n registeredAnimations[i].animation.setSpeed(val, animation);\n }\n }\n\n function setDirection(val, animation) {\n var i;\n\n for (i = 0; i < len; i += 1) {\n registeredAnimations[i].animation.setDirection(val, animation);\n }\n }\n\n function play(animation) {\n var i;\n\n for (i = 0; i < len; i += 1) {\n registeredAnimations[i].animation.play(animation);\n }\n }\n\n function resume(nowTime) {\n var elapsedTime = nowTime - initTime;\n var i;\n\n for (i = 0; i < len; i += 1) {\n registeredAnimations[i].animation.advanceTime(elapsedTime);\n }\n\n initTime = nowTime;\n\n if (playingAnimationsNum && !_isFrozen) {\n window.requestAnimationFrame(resume);\n } else {\n _stopped = true;\n }\n }\n\n function first(nowTime) {\n initTime = nowTime;\n window.requestAnimationFrame(resume);\n }\n\n function pause(animation) {\n var i;\n\n for (i = 0; i < len; i += 1) {\n registeredAnimations[i].animation.pause(animation);\n }\n }\n\n function goToAndStop(value, isFrame, animation) {\n var i;\n\n for (i = 0; i < len; i += 1) {\n registeredAnimations[i].animation.goToAndStop(value, isFrame, animation);\n }\n }\n\n function stop(animation) {\n var i;\n\n for (i = 0; i < len; i += 1) {\n registeredAnimations[i].animation.stop(animation);\n }\n }\n\n function togglePause(animation) {\n var i;\n\n for (i = 0; i < len; i += 1) {\n registeredAnimations[i].animation.togglePause(animation);\n }\n }\n\n function destroy(animation) {\n var i;\n\n for (i = len - 1; i >= 0; i -= 1) {\n registeredAnimations[i].animation.destroy(animation);\n }\n }\n\n function searchAnimations(animationData, standalone, renderer) {\n var animElements = [].concat([].slice.call(document.getElementsByClassName('lottie')), [].slice.call(document.getElementsByClassName('bodymovin')));\n var i;\n var lenAnims = animElements.length;\n\n for (i = 0; i < lenAnims; i += 1) {\n if (renderer) {\n animElements[i].setAttribute('data-bm-type', renderer);\n }\n\n registerAnimation(animElements[i], animationData);\n }\n\n if (standalone && lenAnims === 0) {\n if (!renderer) {\n renderer = 'svg';\n }\n\n var body = document.getElementsByTagName('body')[0];\n body.innerText = '';\n var div = createTag('div');\n div.style.width = '100%';\n div.style.height = '100%';\n div.setAttribute('data-bm-type', renderer);\n body.appendChild(div);\n registerAnimation(div, animationData);\n }\n }\n\n function resize() {\n var i;\n\n for (i = 0; i < len; i += 1) {\n registeredAnimations[i].animation.resize();\n }\n }\n\n function activate() {\n if (!_isFrozen && playingAnimationsNum) {\n if (_stopped) {\n window.requestAnimationFrame(first);\n _stopped = false;\n }\n }\n }\n\n function freeze() {\n _isFrozen = true;\n }\n\n function unfreeze() {\n _isFrozen = false;\n activate();\n }\n\n function setVolume(val, animation) {\n var i;\n\n for (i = 0; i < len; i += 1) {\n registeredAnimations[i].animation.setVolume(val, animation);\n }\n }\n\n function mute(animation) {\n var i;\n\n for (i = 0; i < len; i += 1) {\n registeredAnimations[i].animation.mute(animation);\n }\n }\n\n function unmute(animation) {\n var i;\n\n for (i = 0; i < len; i += 1) {\n registeredAnimations[i].animation.unmute(animation);\n }\n }\n\n moduleOb.registerAnimation = registerAnimation;\n moduleOb.loadAnimation = loadAnimation;\n moduleOb.setSpeed = setSpeed;\n moduleOb.setDirection = setDirection;\n moduleOb.play = play;\n moduleOb.pause = pause;\n moduleOb.stop = stop;\n moduleOb.togglePause = togglePause;\n moduleOb.searchAnimations = searchAnimations;\n moduleOb.resize = resize; // moduleOb.start = start;\n\n moduleOb.goToAndStop = goToAndStop;\n moduleOb.destroy = destroy;\n moduleOb.freeze = freeze;\n moduleOb.unfreeze = unfreeze;\n moduleOb.setVolume = setVolume;\n moduleOb.mute = mute;\n moduleOb.unmute = unmute;\n moduleOb.getRegisteredAnimations = getRegisteredAnimations;\n return moduleOb;\n }();\n\n /* eslint-disable */\n var BezierFactory = function () {\n /**\r\n * BezierEasing - use bezier curve for transition easing function\r\n * by Gaëtan Renaudeau 2014 - 2015 – MIT License\r\n *\r\n * Credits: is based on Firefox's nsSMILKeySpline.cpp\r\n * Usage:\r\n * var spline = BezierEasing([ 0.25, 0.1, 0.25, 1.0 ])\r\n * spline.get(x) => returns the easing value | x must be in [0, 1] range\r\n *\r\n */\n var ob = {};\n ob.getBezierEasing = getBezierEasing;\n var beziers = {};\n\n function getBezierEasing(a, b, c, d, nm) {\n var str = nm || ('bez_' + a + '_' + b + '_' + c + '_' + d).replace(/\\./g, 'p');\n\n if (beziers[str]) {\n return beziers[str];\n }\n\n var bezEasing = new BezierEasing([a, b, c, d]);\n beziers[str] = bezEasing;\n return bezEasing;\n } // These values are established by empiricism with tests (tradeoff: performance VS precision)\n\n\n var NEWTON_ITERATIONS = 4;\n var NEWTON_MIN_SLOPE = 0.001;\n var SUBDIVISION_PRECISION = 0.0000001;\n var SUBDIVISION_MAX_ITERATIONS = 10;\n var kSplineTableSize = 11;\n var kSampleStepSize = 1.0 / (kSplineTableSize - 1.0);\n var float32ArraySupported = typeof Float32Array === 'function';\n\n function A(aA1, aA2) {\n return 1.0 - 3.0 * aA2 + 3.0 * aA1;\n }\n\n function B(aA1, aA2) {\n return 3.0 * aA2 - 6.0 * aA1;\n }\n\n function C(aA1) {\n return 3.0 * aA1;\n } // Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2.\n\n\n function calcBezier(aT, aA1, aA2) {\n return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT;\n } // Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2.\n\n\n function getSlope(aT, aA1, aA2) {\n return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1);\n }\n\n function binarySubdivide(aX, aA, aB, mX1, mX2) {\n var currentX,\n currentT,\n i = 0;\n\n do {\n currentT = aA + (aB - aA) / 2.0;\n currentX = calcBezier(currentT, mX1, mX2) - aX;\n\n if (currentX > 0.0) {\n aB = currentT;\n } else {\n aA = currentT;\n }\n } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);\n\n return currentT;\n }\n\n function newtonRaphsonIterate(aX, aGuessT, mX1, mX2) {\n for (var i = 0; i < NEWTON_ITERATIONS; ++i) {\n var currentSlope = getSlope(aGuessT, mX1, mX2);\n if (currentSlope === 0.0) return aGuessT;\n var currentX = calcBezier(aGuessT, mX1, mX2) - aX;\n aGuessT -= currentX / currentSlope;\n }\n\n return aGuessT;\n }\n /**\r\n * points is an array of [ mX1, mY1, mX2, mY2 ]\r\n */\n\n\n function BezierEasing(points) {\n this._p = points;\n this._mSampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize);\n this._precomputed = false;\n this.get = this.get.bind(this);\n }\n\n BezierEasing.prototype = {\n get: function get(x) {\n var mX1 = this._p[0],\n mY1 = this._p[1],\n mX2 = this._p[2],\n mY2 = this._p[3];\n if (!this._precomputed) this._precompute();\n if (mX1 === mY1 && mX2 === mY2) return x; // linear\n // Because JavaScript number are imprecise, we should guarantee the extremes are right.\n\n if (x === 0) return 0;\n if (x === 1) return 1;\n return calcBezier(this._getTForX(x), mY1, mY2);\n },\n // Private part\n _precompute: function _precompute() {\n var mX1 = this._p[0],\n mY1 = this._p[1],\n mX2 = this._p[2],\n mY2 = this._p[3];\n this._precomputed = true;\n\n if (mX1 !== mY1 || mX2 !== mY2) {\n this._calcSampleValues();\n }\n },\n _calcSampleValues: function _calcSampleValues() {\n var mX1 = this._p[0],\n mX2 = this._p[2];\n\n for (var i = 0; i < kSplineTableSize; ++i) {\n this._mSampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2);\n }\n },\n\n /**\r\n * getTForX chose the fastest heuristic to determine the percentage value precisely from a given X projection.\r\n */\n _getTForX: function _getTForX(aX) {\n var mX1 = this._p[0],\n mX2 = this._p[2],\n mSampleValues = this._mSampleValues;\n var intervalStart = 0.0;\n var currentSample = 1;\n var lastSample = kSplineTableSize - 1;\n\n for (; currentSample !== lastSample && mSampleValues[currentSample] <= aX; ++currentSample) {\n intervalStart += kSampleStepSize;\n }\n\n --currentSample; // Interpolate to provide an initial guess for t\n\n var dist = (aX - mSampleValues[currentSample]) / (mSampleValues[currentSample + 1] - mSampleValues[currentSample]);\n var guessForT = intervalStart + dist * kSampleStepSize;\n var initialSlope = getSlope(guessForT, mX1, mX2);\n\n if (initialSlope >= NEWTON_MIN_SLOPE) {\n return newtonRaphsonIterate(aX, guessForT, mX1, mX2);\n }\n\n if (initialSlope === 0.0) {\n return guessForT;\n }\n\n return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2);\n }\n };\n return ob;\n }();\n\n var pooling = function () {\n function _double(arr) {\n return arr.concat(createSizedArray(arr.length));\n }\n\n return {\n \"double\": _double\n };\n }();\n\n var poolFactory = function () {\n return function (initialLength, _create, _release) {\n var _length = 0;\n var _maxLength = initialLength;\n var pool = createSizedArray(_maxLength);\n var ob = {\n newElement: newElement,\n release: release\n };\n\n function newElement() {\n var element;\n\n if (_length) {\n _length -= 1;\n element = pool[_length];\n } else {\n element = _create();\n }\n\n return element;\n }\n\n function release(element) {\n if (_length === _maxLength) {\n pool = pooling[\"double\"](pool);\n _maxLength *= 2;\n }\n\n if (_release) {\n _release(element);\n }\n\n pool[_length] = element;\n _length += 1;\n }\n\n return ob;\n };\n }();\n\n var bezierLengthPool = function () {\n function create() {\n return {\n addedLength: 0,\n percents: createTypedArray('float32', getDefaultCurveSegments()),\n lengths: createTypedArray('float32', getDefaultCurveSegments())\n };\n }\n\n return poolFactory(8, create);\n }();\n\n var segmentsLengthPool = function () {\n function create() {\n return {\n lengths: [],\n totalLength: 0\n };\n }\n\n function release(element) {\n var i;\n var len = element.lengths.length;\n\n for (i = 0; i < len; i += 1) {\n bezierLengthPool.release(element.lengths[i]);\n }\n\n element.lengths.length = 0;\n }\n\n return poolFactory(8, create, release);\n }();\n\n function bezFunction() {\n var math = Math;\n\n function pointOnLine2D(x1, y1, x2, y2, x3, y3) {\n var det1 = x1 * y2 + y1 * x3 + x2 * y3 - x3 * y2 - y3 * x1 - x2 * y1;\n return det1 > -0.001 && det1 < 0.001;\n }\n\n function pointOnLine3D(x1, y1, z1, x2, y2, z2, x3, y3, z3) {\n if (z1 === 0 && z2 === 0 && z3 === 0) {\n return pointOnLine2D(x1, y1, x2, y2, x3, y3);\n }\n\n var dist1 = math.sqrt(math.pow(x2 - x1, 2) + math.pow(y2 - y1, 2) + math.pow(z2 - z1, 2));\n var dist2 = math.sqrt(math.pow(x3 - x1, 2) + math.pow(y3 - y1, 2) + math.pow(z3 - z1, 2));\n var dist3 = math.sqrt(math.pow(x3 - x2, 2) + math.pow(y3 - y2, 2) + math.pow(z3 - z2, 2));\n var diffDist;\n\n if (dist1 > dist2) {\n if (dist1 > dist3) {\n diffDist = dist1 - dist2 - dist3;\n } else {\n diffDist = dist3 - dist2 - dist1;\n }\n } else if (dist3 > dist2) {\n diffDist = dist3 - dist2 - dist1;\n } else {\n diffDist = dist2 - dist1 - dist3;\n }\n\n return diffDist > -0.0001 && diffDist < 0.0001;\n }\n\n var getBezierLength = function () {\n return function (pt1, pt2, pt3, pt4) {\n var curveSegments = getDefaultCurveSegments();\n var k;\n var i;\n var len;\n var ptCoord;\n var perc;\n var addedLength = 0;\n var ptDistance;\n var point = [];\n var lastPoint = [];\n var lengthData = bezierLengthPool.newElement();\n len = pt3.length;\n\n for (k = 0; k < curveSegments; k += 1) {\n perc = k / (curveSegments - 1);\n ptDistance = 0;\n\n for (i = 0; i < len; i += 1) {\n ptCoord = bmPow(1 - perc, 3) * pt1[i] + 3 * bmPow(1 - perc, 2) * perc * pt3[i] + 3 * (1 - perc) * bmPow(perc, 2) * pt4[i] + bmPow(perc, 3) * pt2[i];\n point[i] = ptCoord;\n\n if (lastPoint[i] !== null) {\n ptDistance += bmPow(point[i] - lastPoint[i], 2);\n }\n\n lastPoint[i] = point[i];\n }\n\n if (ptDistance) {\n ptDistance = bmSqrt(ptDistance);\n addedLength += ptDistance;\n }\n\n lengthData.percents[k] = perc;\n lengthData.lengths[k] = addedLength;\n }\n\n lengthData.addedLength = addedLength;\n return lengthData;\n };\n }();\n\n function getSegmentsLength(shapeData) {\n var segmentsLength = segmentsLengthPool.newElement();\n var closed = shapeData.c;\n var pathV = shapeData.v;\n var pathO = shapeData.o;\n var pathI = shapeData.i;\n var i;\n var len = shapeData._length;\n var lengths = segmentsLength.lengths;\n var totalLength = 0;\n\n for (i = 0; i < len - 1; i += 1) {\n lengths[i] = getBezierLength(pathV[i], pathV[i + 1], pathO[i], pathI[i + 1]);\n totalLength += lengths[i].addedLength;\n }\n\n if (closed && len) {\n lengths[i] = getBezierLength(pathV[i], pathV[0], pathO[i], pathI[0]);\n totalLength += lengths[i].addedLength;\n }\n\n segmentsLength.totalLength = totalLength;\n return segmentsLength;\n }\n\n function BezierData(length) {\n this.segmentLength = 0;\n this.points = new Array(length);\n }\n\n function PointData(partial, point) {\n this.partialLength = partial;\n this.point = point;\n }\n\n var buildBezierData = function () {\n var storedData = {};\n return function (pt1, pt2, pt3, pt4) {\n var bezierName = (pt1[0] + '_' + pt1[1] + '_' + pt2[0] + '_' + pt2[1] + '_' + pt3[0] + '_' + pt3[1] + '_' + pt4[0] + '_' + pt4[1]).replace(/\\./g, 'p');\n\n if (!storedData[bezierName]) {\n var curveSegments = getDefaultCurveSegments();\n var k;\n var i;\n var len;\n var ptCoord;\n var perc;\n var addedLength = 0;\n var ptDistance;\n var point;\n var lastPoint = null;\n\n if (pt1.length === 2 && (pt1[0] !== pt2[0] || pt1[1] !== pt2[1]) && pointOnLine2D(pt1[0], pt1[1], pt2[0], pt2[1], pt1[0] + pt3[0], pt1[1] + pt3[1]) && pointOnLine2D(pt1[0], pt1[1], pt2[0], pt2[1], pt2[0] + pt4[0], pt2[1] + pt4[1])) {\n curveSegments = 2;\n }\n\n var bezierData = new BezierData(curveSegments);\n len = pt3.length;\n\n for (k = 0; k < curveSegments; k += 1) {\n point = createSizedArray(len);\n perc = k / (curveSegments - 1);\n ptDistance = 0;\n\n for (i = 0; i < len; i += 1) {\n ptCoord = bmPow(1 - perc, 3) * pt1[i] + 3 * bmPow(1 - perc, 2) * perc * (pt1[i] + pt3[i]) + 3 * (1 - perc) * bmPow(perc, 2) * (pt2[i] + pt4[i]) + bmPow(perc, 3) * pt2[i];\n point[i] = ptCoord;\n\n if (lastPoint !== null) {\n ptDistance += bmPow(point[i] - lastPoint[i], 2);\n }\n }\n\n ptDistance = bmSqrt(ptDistance);\n addedLength += ptDistance;\n bezierData.points[k] = new PointData(ptDistance, point);\n lastPoint = point;\n }\n\n bezierData.segmentLength = addedLength;\n storedData[bezierName] = bezierData;\n }\n\n return storedData[bezierName];\n };\n }();\n\n function getDistancePerc(perc, bezierData) {\n var percents = bezierData.percents;\n var lengths = bezierData.lengths;\n var len = percents.length;\n var initPos = bmFloor((len - 1) * perc);\n var lengthPos = perc * bezierData.addedLength;\n var lPerc = 0;\n\n if (initPos === len - 1 || initPos === 0 || lengthPos === lengths[initPos]) {\n return percents[initPos];\n }\n\n var dir = lengths[initPos] > lengthPos ? -1 : 1;\n var flag = true;\n\n while (flag) {\n if (lengths[initPos] <= lengthPos && lengths[initPos + 1] > lengthPos) {\n lPerc = (lengthPos - lengths[initPos]) / (lengths[initPos + 1] - lengths[initPos]);\n flag = false;\n } else {\n initPos += dir;\n }\n\n if (initPos < 0 || initPos >= len - 1) {\n // FIX for TypedArrays that don't store floating point values with enough accuracy\n if (initPos === len - 1) {\n return percents[initPos];\n }\n\n flag = false;\n }\n }\n\n return percents[initPos] + (percents[initPos + 1] - percents[initPos]) * lPerc;\n }\n\n function getPointInSegment(pt1, pt2, pt3, pt4, percent, bezierData) {\n var t1 = getDistancePerc(percent, bezierData);\n var u1 = 1 - t1;\n var ptX = math.round((u1 * u1 * u1 * pt1[0] + (t1 * u1 * u1 + u1 * t1 * u1 + u1 * u1 * t1) * pt3[0] + (t1 * t1 * u1 + u1 * t1 * t1 + t1 * u1 * t1) * pt4[0] + t1 * t1 * t1 * pt2[0]) * 1000) / 1000;\n var ptY = math.round((u1 * u1 * u1 * pt1[1] + (t1 * u1 * u1 + u1 * t1 * u1 + u1 * u1 * t1) * pt3[1] + (t1 * t1 * u1 + u1 * t1 * t1 + t1 * u1 * t1) * pt4[1] + t1 * t1 * t1 * pt2[1]) * 1000) / 1000;\n return [ptX, ptY];\n }\n\n var bezierSegmentPoints = createTypedArray('float32', 8);\n\n function getNewSegment(pt1, pt2, pt3, pt4, startPerc, endPerc, bezierData) {\n if (startPerc < 0) {\n startPerc = 0;\n } else if (startPerc > 1) {\n startPerc = 1;\n }\n\n var t0 = getDistancePerc(startPerc, bezierData);\n endPerc = endPerc > 1 ? 1 : endPerc;\n var t1 = getDistancePerc(endPerc, bezierData);\n var i;\n var len = pt1.length;\n var u0 = 1 - t0;\n var u1 = 1 - t1;\n var u0u0u0 = u0 * u0 * u0;\n var t0u0u0_3 = t0 * u0 * u0 * 3; // eslint-disable-line camelcase\n\n var t0t0u0_3 = t0 * t0 * u0 * 3; // eslint-disable-line camelcase\n\n var t0t0t0 = t0 * t0 * t0; //\n\n var u0u0u1 = u0 * u0 * u1;\n var t0u0u1_3 = t0 * u0 * u1 + u0 * t0 * u1 + u0 * u0 * t1; // eslint-disable-line camelcase\n\n var t0t0u1_3 = t0 * t0 * u1 + u0 * t0 * t1 + t0 * u0 * t1; // eslint-disable-line camelcase\n\n var t0t0t1 = t0 * t0 * t1; //\n\n var u0u1u1 = u0 * u1 * u1;\n var t0u1u1_3 = t0 * u1 * u1 + u0 * t1 * u1 + u0 * u1 * t1; // eslint-disable-line camelcase\n\n var t0t1u1_3 = t0 * t1 * u1 + u0 * t1 * t1 + t0 * u1 * t1; // eslint-disable-line camelcase\n\n var t0t1t1 = t0 * t1 * t1; //\n\n var u1u1u1 = u1 * u1 * u1;\n var t1u1u1_3 = t1 * u1 * u1 + u1 * t1 * u1 + u1 * u1 * t1; // eslint-disable-line camelcase\n\n var t1t1u1_3 = t1 * t1 * u1 + u1 * t1 * t1 + t1 * u1 * t1; // eslint-disable-line camelcase\n\n var t1t1t1 = t1 * t1 * t1;\n\n for (i = 0; i < len; i += 1) {\n bezierSegmentPoints[i * 4] = math.round((u0u0u0 * pt1[i] + t0u0u0_3 * pt3[i] + t0t0u0_3 * pt4[i] + t0t0t0 * pt2[i]) * 1000) / 1000; // eslint-disable-line camelcase\n\n bezierSegmentPoints[i * 4 + 1] = math.round((u0u0u1 * pt1[i] + t0u0u1_3 * pt3[i] + t0t0u1_3 * pt4[i] + t0t0t1 * pt2[i]) * 1000) / 1000; // eslint-disable-line camelcase\n\n bezierSegmentPoints[i * 4 + 2] = math.round((u0u1u1 * pt1[i] + t0u1u1_3 * pt3[i] + t0t1u1_3 * pt4[i] + t0t1t1 * pt2[i]) * 1000) / 1000; // eslint-disable-line camelcase\n\n bezierSegmentPoints[i * 4 + 3] = math.round((u1u1u1 * pt1[i] + t1u1u1_3 * pt3[i] + t1t1u1_3 * pt4[i] + t1t1t1 * pt2[i]) * 1000) / 1000; // eslint-disable-line camelcase\n }\n\n return bezierSegmentPoints;\n }\n\n return {\n getSegmentsLength: getSegmentsLength,\n getNewSegment: getNewSegment,\n getPointInSegment: getPointInSegment,\n buildBezierData: buildBezierData,\n pointOnLine2D: pointOnLine2D,\n pointOnLine3D: pointOnLine3D\n };\n }\n\n var bez = bezFunction();\n\n var initFrame = initialDefaultFrame;\n var mathAbs = Math.abs;\n\n function interpolateValue(frameNum, caching) {\n var offsetTime = this.offsetTime;\n var newValue;\n\n if (this.propType === 'multidimensional') {\n newValue = createTypedArray('float32', this.pv.length);\n }\n\n var iterationIndex = caching.lastIndex;\n var i = iterationIndex;\n var len = this.keyframes.length - 1;\n var flag = true;\n var keyData;\n var nextKeyData;\n var keyframeMetadata;\n\n while (flag) {\n keyData = this.keyframes[i];\n nextKeyData = this.keyframes[i + 1];\n\n if (i === len - 1 && frameNum >= nextKeyData.t - offsetTime) {\n if (keyData.h) {\n keyData = nextKeyData;\n }\n\n iterationIndex = 0;\n break;\n }\n\n if (nextKeyData.t - offsetTime > frameNum) {\n iterationIndex = i;\n break;\n }\n\n if (i < len - 1) {\n i += 1;\n } else {\n iterationIndex = 0;\n flag = false;\n }\n }\n\n keyframeMetadata = this.keyframesMetadata[i] || {};\n var k;\n var kLen;\n var perc;\n var jLen;\n var j;\n var fnc;\n var nextKeyTime = nextKeyData.t - offsetTime;\n var keyTime = keyData.t - offsetTime;\n var endValue;\n\n if (keyData.to) {\n if (!keyframeMetadata.bezierData) {\n keyframeMetadata.bezierData = bez.buildBezierData(keyData.s, nextKeyData.s || keyData.e, keyData.to, keyData.ti);\n }\n\n var bezierData = keyframeMetadata.bezierData;\n\n if (frameNum >= nextKeyTime || frameNum < keyTime) {\n var ind = frameNum >= nextKeyTime ? bezierData.points.length - 1 : 0;\n kLen = bezierData.points[ind].point.length;\n\n for (k = 0; k < kLen; k += 1) {\n newValue[k] = bezierData.points[ind].point[k];\n } // caching._lastKeyframeIndex = -1;\n\n } else {\n if (keyframeMetadata.__fnct) {\n fnc = keyframeMetadata.__fnct;\n } else {\n fnc = BezierFactory.getBezierEasing(keyData.o.x, keyData.o.y, keyData.i.x, keyData.i.y, keyData.n).get;\n keyframeMetadata.__fnct = fnc;\n }\n\n perc = fnc((frameNum - keyTime) / (nextKeyTime - keyTime));\n var distanceInLine = bezierData.segmentLength * perc;\n var segmentPerc;\n var addedLength = caching.lastFrame < frameNum && caching._lastKeyframeIndex === i ? caching._lastAddedLength : 0;\n j = caching.lastFrame < frameNum && caching._lastKeyframeIndex === i ? caching._lastPoint : 0;\n flag = true;\n jLen = bezierData.points.length;\n\n while (flag) {\n addedLength += bezierData.points[j].partialLength;\n\n if (distanceInLine === 0 || perc === 0 || j === bezierData.points.length - 1) {\n kLen = bezierData.points[j].point.length;\n\n for (k = 0; k < kLen; k += 1) {\n newValue[k] = bezierData.points[j].point[k];\n }\n\n break;\n } else if (distanceInLine >= addedLength && distanceInLine < addedLength + bezierData.points[j + 1].partialLength) {\n segmentPerc = (distanceInLine - addedLength) / bezierData.points[j + 1].partialLength;\n kLen = bezierData.points[j].point.length;\n\n for (k = 0; k < kLen; k += 1) {\n newValue[k] = bezierData.points[j].point[k] + (bezierData.points[j + 1].point[k] - bezierData.points[j].point[k]) * segmentPerc;\n }\n\n break;\n }\n\n if (j < jLen - 1) {\n j += 1;\n } else {\n flag = false;\n }\n }\n\n caching._lastPoint = j;\n caching._lastAddedLength = addedLength - bezierData.points[j].partialLength;\n caching._lastKeyframeIndex = i;\n }\n } else {\n var outX;\n var outY;\n var inX;\n var inY;\n var keyValue;\n len = keyData.s.length;\n endValue = nextKeyData.s || keyData.e;\n\n if (this.sh && keyData.h !== 1) {\n if (frameNum >= nextKeyTime) {\n newValue[0] = endValue[0];\n newValue[1] = endValue[1];\n newValue[2] = endValue[2];\n } else if (frameNum <= keyTime) {\n newValue[0] = keyData.s[0];\n newValue[1] = keyData.s[1];\n newValue[2] = keyData.s[2];\n } else {\n var quatStart = createQuaternion(keyData.s);\n var quatEnd = createQuaternion(endValue);\n var time = (frameNum - keyTime) / (nextKeyTime - keyTime);\n quaternionToEuler(newValue, slerp(quatStart, quatEnd, time));\n }\n } else {\n for (i = 0; i < len; i += 1) {\n if (keyData.h !== 1) {\n if (frameNum >= nextKeyTime) {\n perc = 1;\n } else if (frameNum < keyTime) {\n perc = 0;\n } else {\n if (keyData.o.x.constructor === Array) {\n if (!keyframeMetadata.__fnct) {\n keyframeMetadata.__fnct = [];\n }\n\n if (!keyframeMetadata.__fnct[i]) {\n outX = keyData.o.x[i] === undefined ? keyData.o.x[0] : keyData.o.x[i];\n outY = keyData.o.y[i] === undefined ? keyData.o.y[0] : keyData.o.y[i];\n inX = keyData.i.x[i] === undefined ? keyData.i.x[0] : keyData.i.x[i];\n inY = keyData.i.y[i] === undefined ? keyData.i.y[0] : keyData.i.y[i];\n fnc = BezierFactory.getBezierEasing(outX, outY, inX, inY).get;\n keyframeMetadata.__fnct[i] = fnc;\n } else {\n fnc = keyframeMetadata.__fnct[i];\n }\n } else if (!keyframeMetadata.__fnct) {\n outX = keyData.o.x;\n outY = keyData.o.y;\n inX = keyData.i.x;\n inY = keyData.i.y;\n fnc = BezierFactory.getBezierEasing(outX, outY, inX, inY).get;\n keyData.keyframeMetadata = fnc;\n } else {\n fnc = keyframeMetadata.__fnct;\n }\n\n perc = fnc((frameNum - keyTime) / (nextKeyTime - keyTime));\n }\n }\n\n endValue = nextKeyData.s || keyData.e;\n keyValue = keyData.h === 1 ? keyData.s[i] : keyData.s[i] + (endValue[i] - keyData.s[i]) * perc;\n\n if (this.propType === 'multidimensional') {\n newValue[i] = keyValue;\n } else {\n newValue = keyValue;\n }\n }\n }\n }\n\n caching.lastIndex = iterationIndex;\n return newValue;\n } // based on @Toji's https://github.com/toji/gl-matrix/\n\n\n function slerp(a, b, t) {\n var out = [];\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n var aw = a[3];\n var bx = b[0];\n var by = b[1];\n var bz = b[2];\n var bw = b[3];\n var omega;\n var cosom;\n var sinom;\n var scale0;\n var scale1;\n cosom = ax * bx + ay * by + az * bz + aw * bw;\n\n if (cosom < 0.0) {\n cosom = -cosom;\n bx = -bx;\n by = -by;\n bz = -bz;\n bw = -bw;\n }\n\n if (1.0 - cosom > 0.000001) {\n omega = Math.acos(cosom);\n sinom = Math.sin(omega);\n scale0 = Math.sin((1.0 - t) * omega) / sinom;\n scale1 = Math.sin(t * omega) / sinom;\n } else {\n scale0 = 1.0 - t;\n scale1 = t;\n }\n\n out[0] = scale0 * ax + scale1 * bx;\n out[1] = scale0 * ay + scale1 * by;\n out[2] = scale0 * az + scale1 * bz;\n out[3] = scale0 * aw + scale1 * bw;\n return out;\n }\n\n function quaternionToEuler(out, quat) {\n var qx = quat[0];\n var qy = quat[1];\n var qz = quat[2];\n var qw = quat[3];\n var heading = Math.atan2(2 * qy * qw - 2 * qx * qz, 1 - 2 * qy * qy - 2 * qz * qz);\n var attitude = Math.asin(2 * qx * qy + 2 * qz * qw);\n var bank = Math.atan2(2 * qx * qw - 2 * qy * qz, 1 - 2 * qx * qx - 2 * qz * qz);\n out[0] = heading / degToRads;\n out[1] = attitude / degToRads;\n out[2] = bank / degToRads;\n }\n\n function createQuaternion(values) {\n var heading = values[0] * degToRads;\n var attitude = values[1] * degToRads;\n var bank = values[2] * degToRads;\n var c1 = Math.cos(heading / 2);\n var c2 = Math.cos(attitude / 2);\n var c3 = Math.cos(bank / 2);\n var s1 = Math.sin(heading / 2);\n var s2 = Math.sin(attitude / 2);\n var s3 = Math.sin(bank / 2);\n var w = c1 * c2 * c3 - s1 * s2 * s3;\n var x = s1 * s2 * c3 + c1 * c2 * s3;\n var y = s1 * c2 * c3 + c1 * s2 * s3;\n var z = c1 * s2 * c3 - s1 * c2 * s3;\n return [x, y, z, w];\n }\n\n function getValueAtCurrentTime() {\n var frameNum = this.comp.renderedFrame - this.offsetTime;\n var initTime = this.keyframes[0].t - this.offsetTime;\n var endTime = this.keyframes[this.keyframes.length - 1].t - this.offsetTime;\n\n if (!(frameNum === this._caching.lastFrame || this._caching.lastFrame !== initFrame && (this._caching.lastFrame >= endTime && frameNum >= endTime || this._caching.lastFrame < initTime && frameNum < initTime))) {\n if (this._caching.lastFrame >= frameNum) {\n this._caching._lastKeyframeIndex = -1;\n this._caching.lastIndex = 0;\n }\n\n var renderResult = this.interpolateValue(frameNum, this._caching);\n this.pv = renderResult;\n }\n\n this._caching.lastFrame = frameNum;\n return this.pv;\n }\n\n function setVValue(val) {\n var multipliedValue;\n\n if (this.propType === 'unidimensional') {\n multipliedValue = val * this.mult;\n\n if (mathAbs(this.v - multipliedValue) > 0.00001) {\n this.v = multipliedValue;\n this._mdf = true;\n }\n } else {\n var i = 0;\n var len = this.v.length;\n\n while (i < len) {\n multipliedValue = val[i] * this.mult;\n\n if (mathAbs(this.v[i] - multipliedValue) > 0.00001) {\n this.v[i] = multipliedValue;\n this._mdf = true;\n }\n\n i += 1;\n }\n }\n }\n\n function processEffectsSequence() {\n if (this.elem.globalData.frameId === this.frameId || !this.effectsSequence.length) {\n return;\n }\n\n if (this.lock) {\n this.setVValue(this.pv);\n return;\n }\n\n this.lock = true;\n this._mdf = this._isFirstFrame;\n var i;\n var len = this.effectsSequence.length;\n var finalValue = this.kf ? this.pv : this.data.k;\n\n for (i = 0; i < len; i += 1) {\n finalValue = this.effectsSequence[i](finalValue);\n }\n\n this.setVValue(finalValue);\n this._isFirstFrame = false;\n this.lock = false;\n this.frameId = this.elem.globalData.frameId;\n }\n\n function addEffect(effectFunction) {\n this.effectsSequence.push(effectFunction);\n this.container.addDynamicProperty(this);\n }\n\n function ValueProperty(elem, data, mult, container) {\n this.propType = 'unidimensional';\n this.mult = mult || 1;\n this.data = data;\n this.v = mult ? data.k * mult : data.k;\n this.pv = data.k;\n this._mdf = false;\n this.elem = elem;\n this.container = container;\n this.comp = elem.comp;\n this.k = false;\n this.kf = false;\n this.vel = 0;\n this.effectsSequence = [];\n this._isFirstFrame = true;\n this.getValue = processEffectsSequence;\n this.setVValue = setVValue;\n this.addEffect = addEffect;\n }\n\n function MultiDimensionalProperty(elem, data, mult, container) {\n this.propType = 'multidimensional';\n this.mult = mult || 1;\n this.data = data;\n this._mdf = false;\n this.elem = elem;\n this.container = container;\n this.comp = elem.comp;\n this.k = false;\n this.kf = false;\n this.frameId = -1;\n var i;\n var len = data.k.length;\n this.v = createTypedArray('float32', len);\n this.pv = createTypedArray('float32', len);\n this.vel = createTypedArray('float32', len);\n\n for (i = 0; i < len; i += 1) {\n this.v[i] = data.k[i] * this.mult;\n this.pv[i] = data.k[i];\n }\n\n this._isFirstFrame = true;\n this.effectsSequence = [];\n this.getValue = processEffectsSequence;\n this.setVValue = setVValue;\n this.addEffect = addEffect;\n }\n\n function KeyframedValueProperty(elem, data, mult, container) {\n this.propType = 'unidimensional';\n this.keyframes = data.k;\n this.keyframesMetadata = [];\n this.offsetTime = elem.data.st;\n this.frameId = -1;\n this._caching = {\n lastFrame: initFrame,\n lastIndex: 0,\n value: 0,\n _lastKeyframeIndex: -1\n };\n this.k = true;\n this.kf = true;\n this.data = data;\n this.mult = mult || 1;\n this.elem = elem;\n this.container = container;\n this.comp = elem.comp;\n this.v = initFrame;\n this.pv = initFrame;\n this._isFirstFrame = true;\n this.getValue = processEffectsSequence;\n this.setVValue = setVValue;\n this.interpolateValue = interpolateValue;\n this.effectsSequence = [getValueAtCurrentTime.bind(this)];\n this.addEffect = addEffect;\n }\n\n function KeyframedMultidimensionalProperty(elem, data, mult, container) {\n this.propType = 'multidimensional';\n var i;\n var len = data.k.length;\n var s;\n var e;\n var to;\n var ti;\n\n for (i = 0; i < len - 1; i += 1) {\n if (data.k[i].to && data.k[i].s && data.k[i + 1] && data.k[i + 1].s) {\n s = data.k[i].s;\n e = data.k[i + 1].s;\n to = data.k[i].to;\n ti = data.k[i].ti;\n\n if (s.length === 2 && !(s[0] === e[0] && s[1] === e[1]) && bez.pointOnLine2D(s[0], s[1], e[0], e[1], s[0] + to[0], s[1] + to[1]) && bez.pointOnLine2D(s[0], s[1], e[0], e[1], e[0] + ti[0], e[1] + ti[1]) || s.length === 3 && !(s[0] === e[0] && s[1] === e[1] && s[2] === e[2]) && bez.pointOnLine3D(s[0], s[1], s[2], e[0], e[1], e[2], s[0] + to[0], s[1] + to[1], s[2] + to[2]) && bez.pointOnLine3D(s[0], s[1], s[2], e[0], e[1], e[2], e[0] + ti[0], e[1] + ti[1], e[2] + ti[2])) {\n data.k[i].to = null;\n data.k[i].ti = null;\n }\n\n if (s[0] === e[0] && s[1] === e[1] && to[0] === 0 && to[1] === 0 && ti[0] === 0 && ti[1] === 0) {\n if (s.length === 2 || s[2] === e[2] && to[2] === 0 && ti[2] === 0) {\n data.k[i].to = null;\n data.k[i].ti = null;\n }\n }\n }\n }\n\n this.effectsSequence = [getValueAtCurrentTime.bind(this)];\n this.data = data;\n this.keyframes = data.k;\n this.keyframesMetadata = [];\n this.offsetTime = elem.data.st;\n this.k = true;\n this.kf = true;\n this._isFirstFrame = true;\n this.mult = mult || 1;\n this.elem = elem;\n this.container = container;\n this.comp = elem.comp;\n this.getValue = processEffectsSequence;\n this.setVValue = setVValue;\n this.interpolateValue = interpolateValue;\n this.frameId = -1;\n var arrLen = data.k[0].s.length;\n this.v = createTypedArray('float32', arrLen);\n this.pv = createTypedArray('float32', arrLen);\n\n for (i = 0; i < arrLen; i += 1) {\n this.v[i] = initFrame;\n this.pv[i] = initFrame;\n }\n\n this._caching = {\n lastFrame: initFrame,\n lastIndex: 0,\n value: createTypedArray('float32', arrLen)\n };\n this.addEffect = addEffect;\n }\n\n var PropertyFactory = function () {\n function getProp(elem, data, type, mult, container) {\n if (data.sid) {\n data = elem.globalData.slotManager.getProp(data);\n }\n\n var p;\n\n if (!data.k.length) {\n p = new ValueProperty(elem, data, mult, container);\n } else if (typeof data.k[0] === 'number') {\n p = new MultiDimensionalProperty(elem, data, mult, container);\n } else {\n switch (type) {\n case 0:\n p = new KeyframedValueProperty(elem, data, mult, container);\n break;\n\n case 1:\n p = new KeyframedMultidimensionalProperty(elem, data, mult, container);\n break;\n\n default:\n break;\n }\n }\n\n if (p.effectsSequence.length) {\n container.addDynamicProperty(p);\n }\n\n return p;\n }\n\n var ob = {\n getProp: getProp\n };\n return ob;\n }();\n\n function DynamicPropertyContainer() {}\n\n DynamicPropertyContainer.prototype = {\n addDynamicProperty: function addDynamicProperty(prop) {\n if (this.dynamicProperties.indexOf(prop) === -1) {\n this.dynamicProperties.push(prop);\n this.container.addDynamicProperty(this);\n this._isAnimated = true;\n }\n },\n iterateDynamicProperties: function iterateDynamicProperties() {\n this._mdf = false;\n var i;\n var len = this.dynamicProperties.length;\n\n for (i = 0; i < len; i += 1) {\n this.dynamicProperties[i].getValue();\n\n if (this.dynamicProperties[i]._mdf) {\n this._mdf = true;\n }\n }\n },\n initDynamicPropertyContainer: function initDynamicPropertyContainer(container) {\n this.container = container;\n this.dynamicProperties = [];\n this._mdf = false;\n this._isAnimated = false;\n }\n };\n\n var pointPool = function () {\n function create() {\n return createTypedArray('float32', 2);\n }\n\n return poolFactory(8, create);\n }();\n\n function ShapePath() {\n this.c = false;\n this._length = 0;\n this._maxLength = 8;\n this.v = createSizedArray(this._maxLength);\n this.o = createSizedArray(this._maxLength);\n this.i = createSizedArray(this._maxLength);\n }\n\n ShapePath.prototype.setPathData = function (closed, len) {\n this.c = closed;\n this.setLength(len);\n var i = 0;\n\n while (i < len) {\n this.v[i] = pointPool.newElement();\n this.o[i] = pointPool.newElement();\n this.i[i] = pointPool.newElement();\n i += 1;\n }\n };\n\n ShapePath.prototype.setLength = function (len) {\n while (this._maxLength < len) {\n this.doubleArrayLength();\n }\n\n this._length = len;\n };\n\n ShapePath.prototype.doubleArrayLength = function () {\n this.v = this.v.concat(createSizedArray(this._maxLength));\n this.i = this.i.concat(createSizedArray(this._maxLength));\n this.o = this.o.concat(createSizedArray(this._maxLength));\n this._maxLength *= 2;\n };\n\n ShapePath.prototype.setXYAt = function (x, y, type, pos, replace) {\n var arr;\n this._length = Math.max(this._length, pos + 1);\n\n if (this._length >= this._maxLength) {\n this.doubleArrayLength();\n }\n\n switch (type) {\n case 'v':\n arr = this.v;\n break;\n\n case 'i':\n arr = this.i;\n break;\n\n case 'o':\n arr = this.o;\n break;\n\n default:\n arr = [];\n break;\n }\n\n if (!arr[pos] || arr[pos] && !replace) {\n arr[pos] = pointPool.newElement();\n }\n\n arr[pos][0] = x;\n arr[pos][1] = y;\n };\n\n ShapePath.prototype.setTripleAt = function (vX, vY, oX, oY, iX, iY, pos, replace) {\n this.setXYAt(vX, vY, 'v', pos, replace);\n this.setXYAt(oX, oY, 'o', pos, replace);\n this.setXYAt(iX, iY, 'i', pos, replace);\n };\n\n ShapePath.prototype.reverse = function () {\n var newPath = new ShapePath();\n newPath.setPathData(this.c, this._length);\n var vertices = this.v;\n var outPoints = this.o;\n var inPoints = this.i;\n var init = 0;\n\n if (this.c) {\n newPath.setTripleAt(vertices[0][0], vertices[0][1], inPoints[0][0], inPoints[0][1], outPoints[0][0], outPoints[0][1], 0, false);\n init = 1;\n }\n\n var cnt = this._length - 1;\n var len = this._length;\n var i;\n\n for (i = init; i < len; i += 1) {\n newPath.setTripleAt(vertices[cnt][0], vertices[cnt][1], inPoints[cnt][0], inPoints[cnt][1], outPoints[cnt][0], outPoints[cnt][1], i, false);\n cnt -= 1;\n }\n\n return newPath;\n };\n\n ShapePath.prototype.length = function () {\n return this._length;\n };\n\n var shapePool = function () {\n function create() {\n return new ShapePath();\n }\n\n function release(shapePath) {\n var len = shapePath._length;\n var i;\n\n for (i = 0; i < len; i += 1) {\n pointPool.release(shapePath.v[i]);\n pointPool.release(shapePath.i[i]);\n pointPool.release(shapePath.o[i]);\n shapePath.v[i] = null;\n shapePath.i[i] = null;\n shapePath.o[i] = null;\n }\n\n shapePath._length = 0;\n shapePath.c = false;\n }\n\n function clone(shape) {\n var cloned = factory.newElement();\n var i;\n var len = shape._length === undefined ? shape.v.length : shape._length;\n cloned.setLength(len);\n cloned.c = shape.c;\n\n for (i = 0; i < len; i += 1) {\n cloned.setTripleAt(shape.v[i][0], shape.v[i][1], shape.o[i][0], shape.o[i][1], shape.i[i][0], shape.i[i][1], i);\n }\n\n return cloned;\n }\n\n var factory = poolFactory(4, create, release);\n factory.clone = clone;\n return factory;\n }();\n\n function ShapeCollection() {\n this._length = 0;\n this._maxLength = 4;\n this.shapes = createSizedArray(this._maxLength);\n }\n\n ShapeCollection.prototype.addShape = function (shapeData) {\n if (this._length === this._maxLength) {\n this.shapes = this.shapes.concat(createSizedArray(this._maxLength));\n this._maxLength *= 2;\n }\n\n this.shapes[this._length] = shapeData;\n this._length += 1;\n };\n\n ShapeCollection.prototype.releaseShapes = function () {\n var i;\n\n for (i = 0; i < this._length; i += 1) {\n shapePool.release(this.shapes[i]);\n }\n\n this._length = 0;\n };\n\n var shapeCollectionPool = function () {\n var ob = {\n newShapeCollection: newShapeCollection,\n release: release\n };\n var _length = 0;\n var _maxLength = 4;\n var pool = createSizedArray(_maxLength);\n\n function newShapeCollection() {\n var shapeCollection;\n\n if (_length) {\n _length -= 1;\n shapeCollection = pool[_length];\n } else {\n shapeCollection = new ShapeCollection();\n }\n\n return shapeCollection;\n }\n\n function release(shapeCollection) {\n var i;\n var len = shapeCollection._length;\n\n for (i = 0; i < len; i += 1) {\n shapePool.release(shapeCollection.shapes[i]);\n }\n\n shapeCollection._length = 0;\n\n if (_length === _maxLength) {\n pool = pooling[\"double\"](pool);\n _maxLength *= 2;\n }\n\n pool[_length] = shapeCollection;\n _length += 1;\n }\n\n return ob;\n }();\n\n var ShapePropertyFactory = function () {\n var initFrame = -999999;\n\n function interpolateShape(frameNum, previousValue, caching) {\n var iterationIndex = caching.lastIndex;\n var keyPropS;\n var keyPropE;\n var isHold;\n var j;\n var k;\n var jLen;\n var kLen;\n var perc;\n var vertexValue;\n var kf = this.keyframes;\n\n if (frameNum < kf[0].t - this.offsetTime) {\n keyPropS = kf[0].s[0];\n isHold = true;\n iterationIndex = 0;\n } else if (frameNum >= kf[kf.length - 1].t - this.offsetTime) {\n keyPropS = kf[kf.length - 1].s ? kf[kf.length - 1].s[0] : kf[kf.length - 2].e[0];\n /* if(kf[kf.length - 1].s){\r\n keyPropS = kf[kf.length - 1].s[0];\r\n }else{\r\n keyPropS = kf[kf.length - 2].e[0];\r\n } */\n\n isHold = true;\n } else {\n var i = iterationIndex;\n var len = kf.length - 1;\n var flag = true;\n var keyData;\n var nextKeyData;\n var keyframeMetadata;\n\n while (flag) {\n keyData = kf[i];\n nextKeyData = kf[i + 1];\n\n if (nextKeyData.t - this.offsetTime > frameNum) {\n break;\n }\n\n if (i < len - 1) {\n i += 1;\n } else {\n flag = false;\n }\n }\n\n keyframeMetadata = this.keyframesMetadata[i] || {};\n isHold = keyData.h === 1;\n iterationIndex = i;\n\n if (!isHold) {\n if (frameNum >= nextKeyData.t - this.offsetTime) {\n perc = 1;\n } else if (frameNum < keyData.t - this.offsetTime) {\n perc = 0;\n } else {\n var fnc;\n\n if (keyframeMetadata.__fnct) {\n fnc = keyframeMetadata.__fnct;\n } else {\n fnc = BezierFactory.getBezierEasing(keyData.o.x, keyData.o.y, keyData.i.x, keyData.i.y).get;\n keyframeMetadata.__fnct = fnc;\n }\n\n perc = fnc((frameNum - (keyData.t - this.offsetTime)) / (nextKeyData.t - this.offsetTime - (keyData.t - this.offsetTime)));\n }\n\n keyPropE = nextKeyData.s ? nextKeyData.s[0] : keyData.e[0];\n }\n\n keyPropS = keyData.s[0];\n }\n\n jLen = previousValue._length;\n kLen = keyPropS.i[0].length;\n caching.lastIndex = iterationIndex;\n\n for (j = 0; j < jLen; j += 1) {\n for (k = 0; k < kLen; k += 1) {\n vertexValue = isHold ? keyPropS.i[j][k] : keyPropS.i[j][k] + (keyPropE.i[j][k] - keyPropS.i[j][k]) * perc;\n previousValue.i[j][k] = vertexValue;\n vertexValue = isHold ? keyPropS.o[j][k] : keyPropS.o[j][k] + (keyPropE.o[j][k] - keyPropS.o[j][k]) * perc;\n previousValue.o[j][k] = vertexValue;\n vertexValue = isHold ? keyPropS.v[j][k] : keyPropS.v[j][k] + (keyPropE.v[j][k] - keyPropS.v[j][k]) * perc;\n previousValue.v[j][k] = vertexValue;\n }\n }\n }\n\n function interpolateShapeCurrentTime() {\n var frameNum = this.comp.renderedFrame - this.offsetTime;\n var initTime = this.keyframes[0].t - this.offsetTime;\n var endTime = this.keyframes[this.keyframes.length - 1].t - this.offsetTime;\n var lastFrame = this._caching.lastFrame;\n\n if (!(lastFrame !== initFrame && (lastFrame < initTime && frameNum < initTime || lastFrame > endTime && frameNum > endTime))) {\n /// /\n this._caching.lastIndex = lastFrame < frameNum ? this._caching.lastIndex : 0;\n this.interpolateShape(frameNum, this.pv, this._caching); /// /\n }\n\n this._caching.lastFrame = frameNum;\n return this.pv;\n }\n\n function resetShape() {\n this.paths = this.localShapeCollection;\n }\n\n function shapesEqual(shape1, shape2) {\n if (shape1._length !== shape2._length || shape1.c !== shape2.c) {\n return false;\n }\n\n var i;\n var len = shape1._length;\n\n for (i = 0; i < len; i += 1) {\n if (shape1.v[i][0] !== shape2.v[i][0] || shape1.v[i][1] !== shape2.v[i][1] || shape1.o[i][0] !== shape2.o[i][0] || shape1.o[i][1] !== shape2.o[i][1] || shape1.i[i][0] !== shape2.i[i][0] || shape1.i[i][1] !== shape2.i[i][1]) {\n return false;\n }\n }\n\n return true;\n }\n\n function setVValue(newPath) {\n if (!shapesEqual(this.v, newPath)) {\n this.v = shapePool.clone(newPath);\n this.localShapeCollection.releaseShapes();\n this.localShapeCollection.addShape(this.v);\n this._mdf = true;\n this.paths = this.localShapeCollection;\n }\n }\n\n function processEffectsSequence() {\n if (this.elem.globalData.frameId === this.frameId) {\n return;\n }\n\n if (!this.effectsSequence.length) {\n this._mdf = false;\n return;\n }\n\n if (this.lock) {\n this.setVValue(this.pv);\n return;\n }\n\n this.lock = true;\n this._mdf = false;\n var finalValue;\n\n if (this.kf) {\n finalValue = this.pv;\n } else if (this.data.ks) {\n finalValue = this.data.ks.k;\n } else {\n finalValue = this.data.pt.k;\n }\n\n var i;\n var len = this.effectsSequence.length;\n\n for (i = 0; i < len; i += 1) {\n finalValue = this.effectsSequence[i](finalValue);\n }\n\n this.setVValue(finalValue);\n this.lock = false;\n this.frameId = this.elem.globalData.frameId;\n }\n\n function ShapeProperty(elem, data, type) {\n this.propType = 'shape';\n this.comp = elem.comp;\n this.container = elem;\n this.elem = elem;\n this.data = data;\n this.k = false;\n this.kf = false;\n this._mdf = false;\n var pathData = type === 3 ? data.pt.k : data.ks.k;\n this.v = shapePool.clone(pathData);\n this.pv = shapePool.clone(this.v);\n this.localShapeCollection = shapeCollectionPool.newShapeCollection();\n this.paths = this.localShapeCollection;\n this.paths.addShape(this.v);\n this.reset = resetShape;\n this.effectsSequence = [];\n }\n\n function addEffect(effectFunction) {\n this.effectsSequence.push(effectFunction);\n this.container.addDynamicProperty(this);\n }\n\n ShapeProperty.prototype.interpolateShape = interpolateShape;\n ShapeProperty.prototype.getValue = processEffectsSequence;\n ShapeProperty.prototype.setVValue = setVValue;\n ShapeProperty.prototype.addEffect = addEffect;\n\n function KeyframedShapeProperty(elem, data, type) {\n this.propType = 'shape';\n this.comp = elem.comp;\n this.elem = elem;\n this.container = elem;\n this.offsetTime = elem.data.st;\n this.keyframes = type === 3 ? data.pt.k : data.ks.k;\n this.keyframesMetadata = [];\n this.k = true;\n this.kf = true;\n var len = this.keyframes[0].s[0].i.length;\n this.v = shapePool.newElement();\n this.v.setPathData(this.keyframes[0].s[0].c, len);\n this.pv = shapePool.clone(this.v);\n this.localShapeCollection = shapeCollectionPool.newShapeCollection();\n this.paths = this.localShapeCollection;\n this.paths.addShape(this.v);\n this.lastFrame = initFrame;\n this.reset = resetShape;\n this._caching = {\n lastFrame: initFrame,\n lastIndex: 0\n };\n this.effectsSequence = [interpolateShapeCurrentTime.bind(this)];\n }\n\n KeyframedShapeProperty.prototype.getValue = processEffectsSequence;\n KeyframedShapeProperty.prototype.interpolateShape = interpolateShape;\n KeyframedShapeProperty.prototype.setVValue = setVValue;\n KeyframedShapeProperty.prototype.addEffect = addEffect;\n\n var EllShapeProperty = function () {\n var cPoint = roundCorner;\n\n function EllShapePropertyFactory(elem, data) {\n this.v = shapePool.newElement();\n this.v.setPathData(true, 4);\n this.localShapeCollection = shapeCollectionPool.newShapeCollection();\n this.paths = this.localShapeCollection;\n this.localShapeCollection.addShape(this.v);\n this.d = data.d;\n this.elem = elem;\n this.comp = elem.comp;\n this.frameId = -1;\n this.initDynamicPropertyContainer(elem);\n this.p = PropertyFactory.getProp(elem, data.p, 1, 0, this);\n this.s = PropertyFactory.getProp(elem, data.s, 1, 0, this);\n\n if (this.dynamicProperties.length) {\n this.k = true;\n } else {\n this.k = false;\n this.convertEllToPath();\n }\n }\n\n EllShapePropertyFactory.prototype = {\n reset: resetShape,\n getValue: function getValue() {\n if (this.elem.globalData.frameId === this.frameId) {\n return;\n }\n\n this.frameId = this.elem.globalData.frameId;\n this.iterateDynamicProperties();\n\n if (this._mdf) {\n this.convertEllToPath();\n }\n },\n convertEllToPath: function convertEllToPath() {\n var p0 = this.p.v[0];\n var p1 = this.p.v[1];\n var s0 = this.s.v[0] / 2;\n var s1 = this.s.v[1] / 2;\n\n var _cw = this.d !== 3;\n\n var _v = this.v;\n _v.v[0][0] = p0;\n _v.v[0][1] = p1 - s1;\n _v.v[1][0] = _cw ? p0 + s0 : p0 - s0;\n _v.v[1][1] = p1;\n _v.v[2][0] = p0;\n _v.v[2][1] = p1 + s1;\n _v.v[3][0] = _cw ? p0 - s0 : p0 + s0;\n _v.v[3][1] = p1;\n _v.i[0][0] = _cw ? p0 - s0 * cPoint : p0 + s0 * cPoint;\n _v.i[0][1] = p1 - s1;\n _v.i[1][0] = _cw ? p0 + s0 : p0 - s0;\n _v.i[1][1] = p1 - s1 * cPoint;\n _v.i[2][0] = _cw ? p0 + s0 * cPoint : p0 - s0 * cPoint;\n _v.i[2][1] = p1 + s1;\n _v.i[3][0] = _cw ? p0 - s0 : p0 + s0;\n _v.i[3][1] = p1 + s1 * cPoint;\n _v.o[0][0] = _cw ? p0 + s0 * cPoint : p0 - s0 * cPoint;\n _v.o[0][1] = p1 - s1;\n _v.o[1][0] = _cw ? p0 + s0 : p0 - s0;\n _v.o[1][1] = p1 + s1 * cPoint;\n _v.o[2][0] = _cw ? p0 - s0 * cPoint : p0 + s0 * cPoint;\n _v.o[2][1] = p1 + s1;\n _v.o[3][0] = _cw ? p0 - s0 : p0 + s0;\n _v.o[3][1] = p1 - s1 * cPoint;\n }\n };\n extendPrototype([DynamicPropertyContainer], EllShapePropertyFactory);\n return EllShapePropertyFactory;\n }();\n\n var StarShapeProperty = function () {\n function StarShapePropertyFactory(elem, data) {\n this.v = shapePool.newElement();\n this.v.setPathData(true, 0);\n this.elem = elem;\n this.comp = elem.comp;\n this.data = data;\n this.frameId = -1;\n this.d = data.d;\n this.initDynamicPropertyContainer(elem);\n\n if (data.sy === 1) {\n this.ir = PropertyFactory.getProp(elem, data.ir, 0, 0, this);\n this.is = PropertyFactory.getProp(elem, data.is, 0, 0.01, this);\n this.convertToPath = this.convertStarToPath;\n } else {\n this.convertToPath = this.convertPolygonToPath;\n }\n\n this.pt = PropertyFactory.getProp(elem, data.pt, 0, 0, this);\n this.p = PropertyFactory.getProp(elem, data.p, 1, 0, this);\n this.r = PropertyFactory.getProp(elem, data.r, 0, degToRads, this);\n this.or = PropertyFactory.getProp(elem, data.or, 0, 0, this);\n this.os = PropertyFactory.getProp(elem, data.os, 0, 0.01, this);\n this.localShapeCollection = shapeCollectionPool.newShapeCollection();\n this.localShapeCollection.addShape(this.v);\n this.paths = this.localShapeCollection;\n\n if (this.dynamicProperties.length) {\n this.k = true;\n } else {\n this.k = false;\n this.convertToPath();\n }\n }\n\n StarShapePropertyFactory.prototype = {\n reset: resetShape,\n getValue: function getValue() {\n if (this.elem.globalData.frameId === this.frameId) {\n return;\n }\n\n this.frameId = this.elem.globalData.frameId;\n this.iterateDynamicProperties();\n\n if (this._mdf) {\n this.convertToPath();\n }\n },\n convertStarToPath: function convertStarToPath() {\n var numPts = Math.floor(this.pt.v) * 2;\n var angle = Math.PI * 2 / numPts;\n /* this.v.v.length = numPts;\r\n this.v.i.length = numPts;\r\n this.v.o.length = numPts; */\n\n var longFlag = true;\n var longRad = this.or.v;\n var shortRad = this.ir.v;\n var longRound = this.os.v;\n var shortRound = this.is.v;\n var longPerimSegment = 2 * Math.PI * longRad / (numPts * 2);\n var shortPerimSegment = 2 * Math.PI * shortRad / (numPts * 2);\n var i;\n var rad;\n var roundness;\n var perimSegment;\n var currentAng = -Math.PI / 2;\n currentAng += this.r.v;\n var dir = this.data.d === 3 ? -1 : 1;\n this.v._length = 0;\n\n for (i = 0; i < numPts; i += 1) {\n rad = longFlag ? longRad : shortRad;\n roundness = longFlag ? longRound : shortRound;\n perimSegment = longFlag ? longPerimSegment : shortPerimSegment;\n var x = rad * Math.cos(currentAng);\n var y = rad * Math.sin(currentAng);\n var ox = x === 0 && y === 0 ? 0 : y / Math.sqrt(x * x + y * y);\n var oy = x === 0 && y === 0 ? 0 : -x / Math.sqrt(x * x + y * y);\n x += +this.p.v[0];\n y += +this.p.v[1];\n this.v.setTripleAt(x, y, x - ox * perimSegment * roundness * dir, y - oy * perimSegment * roundness * dir, x + ox * perimSegment * roundness * dir, y + oy * perimSegment * roundness * dir, i, true);\n /* this.v.v[i] = [x,y];\r\n this.v.i[i] = [x+ox*perimSegment*roundness*dir,y+oy*perimSegment*roundness*dir];\r\n this.v.o[i] = [x-ox*perimSegment*roundness*dir,y-oy*perimSegment*roundness*dir];\r\n this.v._length = numPts; */\n\n longFlag = !longFlag;\n currentAng += angle * dir;\n }\n },\n convertPolygonToPath: function convertPolygonToPath() {\n var numPts = Math.floor(this.pt.v);\n var angle = Math.PI * 2 / numPts;\n var rad = this.or.v;\n var roundness = this.os.v;\n var perimSegment = 2 * Math.PI * rad / (numPts * 4);\n var i;\n var currentAng = -Math.PI * 0.5;\n var dir = this.data.d === 3 ? -1 : 1;\n currentAng += this.r.v;\n this.v._length = 0;\n\n for (i = 0; i < numPts; i += 1) {\n var x = rad * Math.cos(currentAng);\n var y = rad * Math.sin(currentAng);\n var ox = x === 0 && y === 0 ? 0 : y / Math.sqrt(x * x + y * y);\n var oy = x === 0 && y === 0 ? 0 : -x / Math.sqrt(x * x + y * y);\n x += +this.p.v[0];\n y += +this.p.v[1];\n this.v.setTripleAt(x, y, x - ox * perimSegment * roundness * dir, y - oy * perimSegment * roundness * dir, x + ox * perimSegment * roundness * dir, y + oy * perimSegment * roundness * dir, i, true);\n currentAng += angle * dir;\n }\n\n this.paths.length = 0;\n this.paths[0] = this.v;\n }\n };\n extendPrototype([DynamicPropertyContainer], StarShapePropertyFactory);\n return StarShapePropertyFactory;\n }();\n\n var RectShapeProperty = function () {\n function RectShapePropertyFactory(elem, data) {\n this.v = shapePool.newElement();\n this.v.c = true;\n this.localShapeCollection = shapeCollectionPool.newShapeCollection();\n this.localShapeCollection.addShape(this.v);\n this.paths = this.localShapeCollection;\n this.elem = elem;\n this.comp = elem.comp;\n this.frameId = -1;\n this.d = data.d;\n this.initDynamicPropertyContainer(elem);\n this.p = PropertyFactory.getProp(elem, data.p, 1, 0, this);\n this.s = PropertyFactory.getProp(elem, data.s, 1, 0, this);\n this.r = PropertyFactory.getProp(elem, data.r, 0, 0, this);\n\n if (this.dynamicProperties.length) {\n this.k = true;\n } else {\n this.k = false;\n this.convertRectToPath();\n }\n }\n\n RectShapePropertyFactory.prototype = {\n convertRectToPath: function convertRectToPath() {\n var p0 = this.p.v[0];\n var p1 = this.p.v[1];\n var v0 = this.s.v[0] / 2;\n var v1 = this.s.v[1] / 2;\n var round = bmMin(v0, v1, this.r.v);\n var cPoint = round * (1 - roundCorner);\n this.v._length = 0;\n\n if (this.d === 2 || this.d === 1) {\n this.v.setTripleAt(p0 + v0, p1 - v1 + round, p0 + v0, p1 - v1 + round, p0 + v0, p1 - v1 + cPoint, 0, true);\n this.v.setTripleAt(p0 + v0, p1 + v1 - round, p0 + v0, p1 + v1 - cPoint, p0 + v0, p1 + v1 - round, 1, true);\n\n if (round !== 0) {\n this.v.setTripleAt(p0 + v0 - round, p1 + v1, p0 + v0 - round, p1 + v1, p0 + v0 - cPoint, p1 + v1, 2, true);\n this.v.setTripleAt(p0 - v0 + round, p1 + v1, p0 - v0 + cPoint, p1 + v1, p0 - v0 + round, p1 + v1, 3, true);\n this.v.setTripleAt(p0 - v0, p1 + v1 - round, p0 - v0, p1 + v1 - round, p0 - v0, p1 + v1 - cPoint, 4, true);\n this.v.setTripleAt(p0 - v0, p1 - v1 + round, p0 - v0, p1 - v1 + cPoint, p0 - v0, p1 - v1 + round, 5, true);\n this.v.setTripleAt(p0 - v0 + round, p1 - v1, p0 - v0 + round, p1 - v1, p0 - v0 + cPoint, p1 - v1, 6, true);\n this.v.setTripleAt(p0 + v0 - round, p1 - v1, p0 + v0 - cPoint, p1 - v1, p0 + v0 - round, p1 - v1, 7, true);\n } else {\n this.v.setTripleAt(p0 - v0, p1 + v1, p0 - v0 + cPoint, p1 + v1, p0 - v0, p1 + v1, 2);\n this.v.setTripleAt(p0 - v0, p1 - v1, p0 - v0, p1 - v1 + cPoint, p0 - v0, p1 - v1, 3);\n }\n } else {\n this.v.setTripleAt(p0 + v0, p1 - v1 + round, p0 + v0, p1 - v1 + cPoint, p0 + v0, p1 - v1 + round, 0, true);\n\n if (round !== 0) {\n this.v.setTripleAt(p0 + v0 - round, p1 - v1, p0 + v0 - round, p1 - v1, p0 + v0 - cPoint, p1 - v1, 1, true);\n this.v.setTripleAt(p0 - v0 + round, p1 - v1, p0 - v0 + cPoint, p1 - v1, p0 - v0 + round, p1 - v1, 2, true);\n this.v.setTripleAt(p0 - v0, p1 - v1 + round, p0 - v0, p1 - v1 + round, p0 - v0, p1 - v1 + cPoint, 3, true);\n this.v.setTripleAt(p0 - v0, p1 + v1 - round, p0 - v0, p1 + v1 - cPoint, p0 - v0, p1 + v1 - round, 4, true);\n this.v.setTripleAt(p0 - v0 + round, p1 + v1, p0 - v0 + round, p1 + v1, p0 - v0 + cPoint, p1 + v1, 5, true);\n this.v.setTripleAt(p0 + v0 - round, p1 + v1, p0 + v0 - cPoint, p1 + v1, p0 + v0 - round, p1 + v1, 6, true);\n this.v.setTripleAt(p0 + v0, p1 + v1 - round, p0 + v0, p1 + v1 - round, p0 + v0, p1 + v1 - cPoint, 7, true);\n } else {\n this.v.setTripleAt(p0 - v0, p1 - v1, p0 - v0 + cPoint, p1 - v1, p0 - v0, p1 - v1, 1, true);\n this.v.setTripleAt(p0 - v0, p1 + v1, p0 - v0, p1 + v1 - cPoint, p0 - v0, p1 + v1, 2, true);\n this.v.setTripleAt(p0 + v0, p1 + v1, p0 + v0 - cPoint, p1 + v1, p0 + v0, p1 + v1, 3, true);\n }\n }\n },\n getValue: function getValue() {\n if (this.elem.globalData.frameId === this.frameId) {\n return;\n }\n\n this.frameId = this.elem.globalData.frameId;\n this.iterateDynamicProperties();\n\n if (this._mdf) {\n this.convertRectToPath();\n }\n },\n reset: resetShape\n };\n extendPrototype([DynamicPropertyContainer], RectShapePropertyFactory);\n return RectShapePropertyFactory;\n }();\n\n function getShapeProp(elem, data, type) {\n var prop;\n\n if (type === 3 || type === 4) {\n var dataProp = type === 3 ? data.pt : data.ks;\n var keys = dataProp.k;\n\n if (keys.length) {\n prop = new KeyframedShapeProperty(elem, data, type);\n } else {\n prop = new ShapeProperty(elem, data, type);\n }\n } else if (type === 5) {\n prop = new RectShapeProperty(elem, data);\n } else if (type === 6) {\n prop = new EllShapeProperty(elem, data);\n } else if (type === 7) {\n prop = new StarShapeProperty(elem, data);\n }\n\n if (prop.k) {\n elem.addDynamicProperty(prop);\n }\n\n return prop;\n }\n\n function getConstructorFunction() {\n return ShapeProperty;\n }\n\n function getKeyframedConstructorFunction() {\n return KeyframedShapeProperty;\n }\n\n var ob = {};\n ob.getShapeProp = getShapeProp;\n ob.getConstructorFunction = getConstructorFunction;\n ob.getKeyframedConstructorFunction = getKeyframedConstructorFunction;\n return ob;\n }();\n\n /*!\r\n Transformation Matrix v2.0\r\n (c) Epistemex 2014-2015\r\n www.epistemex.com\r\n By Ken Fyrstenberg\r\n Contributions by leeoniya.\r\n License: MIT, header required.\r\n */\n\n /**\r\n * 2D transformation matrix object initialized with identity matrix.\r\n *\r\n * The matrix can synchronize a canvas context by supplying the context\r\n * as an argument, or later apply current absolute transform to an\r\n * existing context.\r\n *\r\n * All values are handled as floating point values.\r\n *\r\n * @param {CanvasRenderingContext2D} [context] - Optional context to sync with Matrix\r\n * @prop {number} a - scale x\r\n * @prop {number} b - shear y\r\n * @prop {number} c - shear x\r\n * @prop {number} d - scale y\r\n * @prop {number} e - translate x\r\n * @prop {number} f - translate y\r\n * @prop {CanvasRenderingContext2D|null} [context=null] - set or get current canvas context\r\n * @constructor\r\n */\n\n var Matrix = function () {\n var _cos = Math.cos;\n var _sin = Math.sin;\n var _tan = Math.tan;\n var _rnd = Math.round;\n\n function reset() {\n this.props[0] = 1;\n this.props[1] = 0;\n this.props[2] = 0;\n this.props[3] = 0;\n this.props[4] = 0;\n this.props[5] = 1;\n this.props[6] = 0;\n this.props[7] = 0;\n this.props[8] = 0;\n this.props[9] = 0;\n this.props[10] = 1;\n this.props[11] = 0;\n this.props[12] = 0;\n this.props[13] = 0;\n this.props[14] = 0;\n this.props[15] = 1;\n return this;\n }\n\n function rotate(angle) {\n if (angle === 0) {\n return this;\n }\n\n var mCos = _cos(angle);\n\n var mSin = _sin(angle);\n\n return this._t(mCos, -mSin, 0, 0, mSin, mCos, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n }\n\n function rotateX(angle) {\n if (angle === 0) {\n return this;\n }\n\n var mCos = _cos(angle);\n\n var mSin = _sin(angle);\n\n return this._t(1, 0, 0, 0, 0, mCos, -mSin, 0, 0, mSin, mCos, 0, 0, 0, 0, 1);\n }\n\n function rotateY(angle) {\n if (angle === 0) {\n return this;\n }\n\n var mCos = _cos(angle);\n\n var mSin = _sin(angle);\n\n return this._t(mCos, 0, mSin, 0, 0, 1, 0, 0, -mSin, 0, mCos, 0, 0, 0, 0, 1);\n }\n\n function rotateZ(angle) {\n if (angle === 0) {\n return this;\n }\n\n var mCos = _cos(angle);\n\n var mSin = _sin(angle);\n\n return this._t(mCos, -mSin, 0, 0, mSin, mCos, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n }\n\n function shear(sx, sy) {\n return this._t(1, sy, sx, 1, 0, 0);\n }\n\n function skew(ax, ay) {\n return this.shear(_tan(ax), _tan(ay));\n }\n\n function skewFromAxis(ax, angle) {\n var mCos = _cos(angle);\n\n var mSin = _sin(angle);\n\n return this._t(mCos, mSin, 0, 0, -mSin, mCos, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)._t(1, 0, 0, 0, _tan(ax), 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)._t(mCos, -mSin, 0, 0, mSin, mCos, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); // return this._t(mCos, mSin, -mSin, mCos, 0, 0)._t(1, 0, _tan(ax), 1, 0, 0)._t(mCos, -mSin, mSin, mCos, 0, 0);\n }\n\n function scale(sx, sy, sz) {\n if (!sz && sz !== 0) {\n sz = 1;\n }\n\n if (sx === 1 && sy === 1 && sz === 1) {\n return this;\n }\n\n return this._t(sx, 0, 0, 0, 0, sy, 0, 0, 0, 0, sz, 0, 0, 0, 0, 1);\n }\n\n function setTransform(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) {\n this.props[0] = a;\n this.props[1] = b;\n this.props[2] = c;\n this.props[3] = d;\n this.props[4] = e;\n this.props[5] = f;\n this.props[6] = g;\n this.props[7] = h;\n this.props[8] = i;\n this.props[9] = j;\n this.props[10] = k;\n this.props[11] = l;\n this.props[12] = m;\n this.props[13] = n;\n this.props[14] = o;\n this.props[15] = p;\n return this;\n }\n\n function translate(tx, ty, tz) {\n tz = tz || 0;\n\n if (tx !== 0 || ty !== 0 || tz !== 0) {\n return this._t(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, tx, ty, tz, 1);\n }\n\n return this;\n }\n\n function transform(a2, b2, c2, d2, e2, f2, g2, h2, i2, j2, k2, l2, m2, n2, o2, p2) {\n var _p = this.props;\n\n if (a2 === 1 && b2 === 0 && c2 === 0 && d2 === 0 && e2 === 0 && f2 === 1 && g2 === 0 && h2 === 0 && i2 === 0 && j2 === 0 && k2 === 1 && l2 === 0) {\n // NOTE: commenting this condition because TurboFan deoptimizes code when present\n // if(m2 !== 0 || n2 !== 0 || o2 !== 0){\n _p[12] = _p[12] * a2 + _p[15] * m2;\n _p[13] = _p[13] * f2 + _p[15] * n2;\n _p[14] = _p[14] * k2 + _p[15] * o2;\n _p[15] *= p2; // }\n\n this._identityCalculated = false;\n return this;\n }\n\n var a1 = _p[0];\n var b1 = _p[1];\n var c1 = _p[2];\n var d1 = _p[3];\n var e1 = _p[4];\n var f1 = _p[5];\n var g1 = _p[6];\n var h1 = _p[7];\n var i1 = _p[8];\n var j1 = _p[9];\n var k1 = _p[10];\n var l1 = _p[11];\n var m1 = _p[12];\n var n1 = _p[13];\n var o1 = _p[14];\n var p1 = _p[15];\n /* matrix order (canvas compatible):\r\n * ace\r\n * bdf\r\n * 001\r\n */\n\n _p[0] = a1 * a2 + b1 * e2 + c1 * i2 + d1 * m2;\n _p[1] = a1 * b2 + b1 * f2 + c1 * j2 + d1 * n2;\n _p[2] = a1 * c2 + b1 * g2 + c1 * k2 + d1 * o2;\n _p[3] = a1 * d2 + b1 * h2 + c1 * l2 + d1 * p2;\n _p[4] = e1 * a2 + f1 * e2 + g1 * i2 + h1 * m2;\n _p[5] = e1 * b2 + f1 * f2 + g1 * j2 + h1 * n2;\n _p[6] = e1 * c2 + f1 * g2 + g1 * k2 + h1 * o2;\n _p[7] = e1 * d2 + f1 * h2 + g1 * l2 + h1 * p2;\n _p[8] = i1 * a2 + j1 * e2 + k1 * i2 + l1 * m2;\n _p[9] = i1 * b2 + j1 * f2 + k1 * j2 + l1 * n2;\n _p[10] = i1 * c2 + j1 * g2 + k1 * k2 + l1 * o2;\n _p[11] = i1 * d2 + j1 * h2 + k1 * l2 + l1 * p2;\n _p[12] = m1 * a2 + n1 * e2 + o1 * i2 + p1 * m2;\n _p[13] = m1 * b2 + n1 * f2 + o1 * j2 + p1 * n2;\n _p[14] = m1 * c2 + n1 * g2 + o1 * k2 + p1 * o2;\n _p[15] = m1 * d2 + n1 * h2 + o1 * l2 + p1 * p2;\n this._identityCalculated = false;\n return this;\n }\n\n function multiply(matrix) {\n var matrixProps = matrix.props;\n return this.transform(matrixProps[0], matrixProps[1], matrixProps[2], matrixProps[3], matrixProps[4], matrixProps[5], matrixProps[6], matrixProps[7], matrixProps[8], matrixProps[9], matrixProps[10], matrixProps[11], matrixProps[12], matrixProps[13], matrixProps[14], matrixProps[15]);\n }\n\n function isIdentity() {\n if (!this._identityCalculated) {\n this._identity = !(this.props[0] !== 1 || this.props[1] !== 0 || this.props[2] !== 0 || this.props[3] !== 0 || this.props[4] !== 0 || this.props[5] !== 1 || this.props[6] !== 0 || this.props[7] !== 0 || this.props[8] !== 0 || this.props[9] !== 0 || this.props[10] !== 1 || this.props[11] !== 0 || this.props[12] !== 0 || this.props[13] !== 0 || this.props[14] !== 0 || this.props[15] !== 1);\n this._identityCalculated = true;\n }\n\n return this._identity;\n }\n\n function equals(matr) {\n var i = 0;\n\n while (i < 16) {\n if (matr.props[i] !== this.props[i]) {\n return false;\n }\n\n i += 1;\n }\n\n return true;\n }\n\n function clone(matr) {\n var i;\n\n for (i = 0; i < 16; i += 1) {\n matr.props[i] = this.props[i];\n }\n\n return matr;\n }\n\n function cloneFromProps(props) {\n var i;\n\n for (i = 0; i < 16; i += 1) {\n this.props[i] = props[i];\n }\n }\n\n function applyToPoint(x, y, z) {\n return {\n x: x * this.props[0] + y * this.props[4] + z * this.props[8] + this.props[12],\n y: x * this.props[1] + y * this.props[5] + z * this.props[9] + this.props[13],\n z: x * this.props[2] + y * this.props[6] + z * this.props[10] + this.props[14]\n };\n /* return {\r\n x: x * me.a + y * me.c + me.e,\r\n y: x * me.b + y * me.d + me.f\r\n }; */\n }\n\n function applyToX(x, y, z) {\n return x * this.props[0] + y * this.props[4] + z * this.props[8] + this.props[12];\n }\n\n function applyToY(x, y, z) {\n return x * this.props[1] + y * this.props[5] + z * this.props[9] + this.props[13];\n }\n\n function applyToZ(x, y, z) {\n return x * this.props[2] + y * this.props[6] + z * this.props[10] + this.props[14];\n }\n\n function getInverseMatrix() {\n var determinant = this.props[0] * this.props[5] - this.props[1] * this.props[4];\n var a = this.props[5] / determinant;\n var b = -this.props[1] / determinant;\n var c = -this.props[4] / determinant;\n var d = this.props[0] / determinant;\n var e = (this.props[4] * this.props[13] - this.props[5] * this.props[12]) / determinant;\n var f = -(this.props[0] * this.props[13] - this.props[1] * this.props[12]) / determinant;\n var inverseMatrix = new Matrix();\n inverseMatrix.props[0] = a;\n inverseMatrix.props[1] = b;\n inverseMatrix.props[4] = c;\n inverseMatrix.props[5] = d;\n inverseMatrix.props[12] = e;\n inverseMatrix.props[13] = f;\n return inverseMatrix;\n }\n\n function inversePoint(pt) {\n var inverseMatrix = this.getInverseMatrix();\n return inverseMatrix.applyToPointArray(pt[0], pt[1], pt[2] || 0);\n }\n\n function inversePoints(pts) {\n var i;\n var len = pts.length;\n var retPts = [];\n\n for (i = 0; i < len; i += 1) {\n retPts[i] = inversePoint(pts[i]);\n }\n\n return retPts;\n }\n\n function applyToTriplePoints(pt1, pt2, pt3) {\n var arr = createTypedArray('float32', 6);\n\n if (this.isIdentity()) {\n arr[0] = pt1[0];\n arr[1] = pt1[1];\n arr[2] = pt2[0];\n arr[3] = pt2[1];\n arr[4] = pt3[0];\n arr[5] = pt3[1];\n } else {\n var p0 = this.props[0];\n var p1 = this.props[1];\n var p4 = this.props[4];\n var p5 = this.props[5];\n var p12 = this.props[12];\n var p13 = this.props[13];\n arr[0] = pt1[0] * p0 + pt1[1] * p4 + p12;\n arr[1] = pt1[0] * p1 + pt1[1] * p5 + p13;\n arr[2] = pt2[0] * p0 + pt2[1] * p4 + p12;\n arr[3] = pt2[0] * p1 + pt2[1] * p5 + p13;\n arr[4] = pt3[0] * p0 + pt3[1] * p4 + p12;\n arr[5] = pt3[0] * p1 + pt3[1] * p5 + p13;\n }\n\n return arr;\n }\n\n function applyToPointArray(x, y, z) {\n var arr;\n\n if (this.isIdentity()) {\n arr = [x, y, z];\n } else {\n arr = [x * this.props[0] + y * this.props[4] + z * this.props[8] + this.props[12], x * this.props[1] + y * this.props[5] + z * this.props[9] + this.props[13], x * this.props[2] + y * this.props[6] + z * this.props[10] + this.props[14]];\n }\n\n return arr;\n }\n\n function applyToPointStringified(x, y) {\n if (this.isIdentity()) {\n return x + ',' + y;\n }\n\n var _p = this.props;\n return Math.round((x * _p[0] + y * _p[4] + _p[12]) * 100) / 100 + ',' + Math.round((x * _p[1] + y * _p[5] + _p[13]) * 100) / 100;\n }\n\n function toCSS() {\n // Doesn't make much sense to add this optimization. If it is an identity matrix, it's very likely this will get called only once since it won't be keyframed.\n\n /* if(this.isIdentity()) {\r\n return '';\r\n } */\n var i = 0;\n var props = this.props;\n var cssValue = 'matrix3d(';\n var v = 10000;\n\n while (i < 16) {\n cssValue += _rnd(props[i] * v) / v;\n cssValue += i === 15 ? ')' : ',';\n i += 1;\n }\n\n return cssValue;\n }\n\n function roundMatrixProperty(val) {\n var v = 10000;\n\n if (val < 0.000001 && val > 0 || val > -0.000001 && val < 0) {\n return _rnd(val * v) / v;\n }\n\n return val;\n }\n\n function to2dCSS() {\n // Doesn't make much sense to add this optimization. If it is an identity matrix, it's very likely this will get called only once since it won't be keyframed.\n\n /* if(this.isIdentity()) {\r\n return '';\r\n } */\n var props = this.props;\n\n var _a = roundMatrixProperty(props[0]);\n\n var _b = roundMatrixProperty(props[1]);\n\n var _c = roundMatrixProperty(props[4]);\n\n var _d = roundMatrixProperty(props[5]);\n\n var _e = roundMatrixProperty(props[12]);\n\n var _f = roundMatrixProperty(props[13]);\n\n return 'matrix(' + _a + ',' + _b + ',' + _c + ',' + _d + ',' + _e + ',' + _f + ')';\n }\n\n return function () {\n this.reset = reset;\n this.rotate = rotate;\n this.rotateX = rotateX;\n this.rotateY = rotateY;\n this.rotateZ = rotateZ;\n this.skew = skew;\n this.skewFromAxis = skewFromAxis;\n this.shear = shear;\n this.scale = scale;\n this.setTransform = setTransform;\n this.translate = translate;\n this.transform = transform;\n this.multiply = multiply;\n this.applyToPoint = applyToPoint;\n this.applyToX = applyToX;\n this.applyToY = applyToY;\n this.applyToZ = applyToZ;\n this.applyToPointArray = applyToPointArray;\n this.applyToTriplePoints = applyToTriplePoints;\n this.applyToPointStringified = applyToPointStringified;\n this.toCSS = toCSS;\n this.to2dCSS = to2dCSS;\n this.clone = clone;\n this.cloneFromProps = cloneFromProps;\n this.equals = equals;\n this.inversePoints = inversePoints;\n this.inversePoint = inversePoint;\n this.getInverseMatrix = getInverseMatrix;\n this._t = this.transform;\n this.isIdentity = isIdentity;\n this._identity = true;\n this._identityCalculated = false;\n this.props = createTypedArray('float32', 16);\n this.reset();\n };\n }();\n\n function _typeof$3(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof$3 = function _typeof(obj) { return typeof obj; }; } else { _typeof$3 = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof$3(obj); }\n var lottie = {};\n var standalone = '__[STANDALONE]__';\n var animationData = '__[ANIMATIONDATA]__';\n var renderer = '';\n\n function setLocation(href) {\n setLocationHref(href);\n }\n\n function searchAnimations() {\n if (standalone === true) {\n animationManager.searchAnimations(animationData, standalone, renderer);\n } else {\n animationManager.searchAnimations();\n }\n }\n\n function setSubframeRendering(flag) {\n setSubframeEnabled(flag);\n }\n\n function setPrefix(prefix) {\n setIdPrefix(prefix);\n }\n\n function loadAnimation(params) {\n if (standalone === true) {\n params.animationData = JSON.parse(animationData);\n }\n\n return animationManager.loadAnimation(params);\n }\n\n function setQuality(value) {\n if (typeof value === 'string') {\n switch (value) {\n case 'high':\n setDefaultCurveSegments(200);\n break;\n\n default:\n case 'medium':\n setDefaultCurveSegments(50);\n break;\n\n case 'low':\n setDefaultCurveSegments(10);\n break;\n }\n } else if (!isNaN(value) && value > 1) {\n setDefaultCurveSegments(value);\n }\n\n if (getDefaultCurveSegments() >= 50) {\n roundValues(false);\n } else {\n roundValues(true);\n }\n }\n\n function inBrowser() {\n return typeof navigator !== 'undefined';\n }\n\n function installPlugin(type, plugin) {\n if (type === 'expressions') {\n setExpressionsPlugin(plugin);\n }\n }\n\n function getFactory(name) {\n switch (name) {\n case 'propertyFactory':\n return PropertyFactory;\n\n case 'shapePropertyFactory':\n return ShapePropertyFactory;\n\n case 'matrix':\n return Matrix;\n\n default:\n return null;\n }\n }\n\n lottie.play = animationManager.play;\n lottie.pause = animationManager.pause;\n lottie.setLocationHref = setLocation;\n lottie.togglePause = animationManager.togglePause;\n lottie.setSpeed = animationManager.setSpeed;\n lottie.setDirection = animationManager.setDirection;\n lottie.stop = animationManager.stop;\n lottie.searchAnimations = searchAnimations;\n lottie.registerAnimation = animationManager.registerAnimation;\n lottie.loadAnimation = loadAnimation;\n lottie.setSubframeRendering = setSubframeRendering;\n lottie.resize = animationManager.resize; // lottie.start = start;\n\n lottie.goToAndStop = animationManager.goToAndStop;\n lottie.destroy = animationManager.destroy;\n lottie.setQuality = setQuality;\n lottie.inBrowser = inBrowser;\n lottie.installPlugin = installPlugin;\n lottie.freeze = animationManager.freeze;\n lottie.unfreeze = animationManager.unfreeze;\n lottie.setVolume = animationManager.setVolume;\n lottie.mute = animationManager.mute;\n lottie.unmute = animationManager.unmute;\n lottie.getRegisteredAnimations = animationManager.getRegisteredAnimations;\n lottie.useWebWorker = setWebWorker;\n lottie.setIDPrefix = setPrefix;\n lottie.__getFactory = getFactory;\n lottie.version = '5.12.2';\n\n function checkReady() {\n if (document.readyState === 'complete') {\n clearInterval(readyStateCheckInterval);\n searchAnimations();\n }\n }\n\n function getQueryVariable(variable) {\n var vars = queryString.split('&');\n\n for (var i = 0; i < vars.length; i += 1) {\n var pair = vars[i].split('=');\n\n if (decodeURIComponent(pair[0]) == variable) {\n // eslint-disable-line eqeqeq\n return decodeURIComponent(pair[1]);\n }\n }\n\n return null;\n }\n\n var queryString = '';\n\n if (standalone) {\n var scripts = document.getElementsByTagName('script');\n var index = scripts.length - 1;\n var myScript = scripts[index] || {\n src: ''\n };\n queryString = myScript.src ? myScript.src.replace(/^[^\\?]+\\??/, '') : ''; // eslint-disable-line no-useless-escape\n\n renderer = getQueryVariable('renderer');\n }\n\n var readyStateCheckInterval = setInterval(checkReady, 100); // this adds bodymovin to the window object for backwards compatibility\n\n try {\n if (!((typeof exports === \"undefined\" ? \"undefined\" : _typeof$3(exports)) === 'object' && typeof module !== 'undefined') && !(typeof define === 'function' && define.amd) // eslint-disable-line no-undef\n ) {\n window.bodymovin = lottie;\n }\n } catch (err) {//\n }\n\n var ShapeModifiers = function () {\n var ob = {};\n var modifiers = {};\n ob.registerModifier = registerModifier;\n ob.getModifier = getModifier;\n\n function registerModifier(nm, factory) {\n if (!modifiers[nm]) {\n modifiers[nm] = factory;\n }\n }\n\n function getModifier(nm, elem, data) {\n return new modifiers[nm](elem, data);\n }\n\n return ob;\n }();\n\n function ShapeModifier() {}\n\n ShapeModifier.prototype.initModifierProperties = function () {};\n\n ShapeModifier.prototype.addShapeToModifier = function () {};\n\n ShapeModifier.prototype.addShape = function (data) {\n if (!this.closed) {\n // Adding shape to dynamic properties. It covers the case where a shape has no effects applied, to reset it's _mdf state on every tick.\n data.sh.container.addDynamicProperty(data.sh);\n var shapeData = {\n shape: data.sh,\n data: data,\n localShapeCollection: shapeCollectionPool.newShapeCollection()\n };\n this.shapes.push(shapeData);\n this.addShapeToModifier(shapeData);\n\n if (this._isAnimated) {\n data.setAsAnimated();\n }\n }\n };\n\n ShapeModifier.prototype.init = function (elem, data) {\n this.shapes = [];\n this.elem = elem;\n this.initDynamicPropertyContainer(elem);\n this.initModifierProperties(elem, data);\n this.frameId = initialDefaultFrame;\n this.closed = false;\n this.k = false;\n\n if (this.dynamicProperties.length) {\n this.k = true;\n } else {\n this.getValue(true);\n }\n };\n\n ShapeModifier.prototype.processKeys = function () {\n if (this.elem.globalData.frameId === this.frameId) {\n return;\n }\n\n this.frameId = this.elem.globalData.frameId;\n this.iterateDynamicProperties();\n };\n\n extendPrototype([DynamicPropertyContainer], ShapeModifier);\n\n function TrimModifier() {}\n\n extendPrototype([ShapeModifier], TrimModifier);\n\n TrimModifier.prototype.initModifierProperties = function (elem, data) {\n this.s = PropertyFactory.getProp(elem, data.s, 0, 0.01, this);\n this.e = PropertyFactory.getProp(elem, data.e, 0, 0.01, this);\n this.o = PropertyFactory.getProp(elem, data.o, 0, 0, this);\n this.sValue = 0;\n this.eValue = 0;\n this.getValue = this.processKeys;\n this.m = data.m;\n this._isAnimated = !!this.s.effectsSequence.length || !!this.e.effectsSequence.length || !!this.o.effectsSequence.length;\n };\n\n TrimModifier.prototype.addShapeToModifier = function (shapeData) {\n shapeData.pathsData = [];\n };\n\n TrimModifier.prototype.calculateShapeEdges = function (s, e, shapeLength, addedLength, totalModifierLength) {\n var segments = [];\n\n if (e <= 1) {\n segments.push({\n s: s,\n e: e\n });\n } else if (s >= 1) {\n segments.push({\n s: s - 1,\n e: e - 1\n });\n } else {\n segments.push({\n s: s,\n e: 1\n });\n segments.push({\n s: 0,\n e: e - 1\n });\n }\n\n var shapeSegments = [];\n var i;\n var len = segments.length;\n var segmentOb;\n\n for (i = 0; i < len; i += 1) {\n segmentOb = segments[i];\n\n if (!(segmentOb.e * totalModifierLength < addedLength || segmentOb.s * totalModifierLength > addedLength + shapeLength)) {\n var shapeS;\n var shapeE;\n\n if (segmentOb.s * totalModifierLength <= addedLength) {\n shapeS = 0;\n } else {\n shapeS = (segmentOb.s * totalModifierLength - addedLength) / shapeLength;\n }\n\n if (segmentOb.e * totalModifierLength >= addedLength + shapeLength) {\n shapeE = 1;\n } else {\n shapeE = (segmentOb.e * totalModifierLength - addedLength) / shapeLength;\n }\n\n shapeSegments.push([shapeS, shapeE]);\n }\n }\n\n if (!shapeSegments.length) {\n shapeSegments.push([0, 0]);\n }\n\n return shapeSegments;\n };\n\n TrimModifier.prototype.releasePathsData = function (pathsData) {\n var i;\n var len = pathsData.length;\n\n for (i = 0; i < len; i += 1) {\n segmentsLengthPool.release(pathsData[i]);\n }\n\n pathsData.length = 0;\n return pathsData;\n };\n\n TrimModifier.prototype.processShapes = function (_isFirstFrame) {\n var s;\n var e;\n\n if (this._mdf || _isFirstFrame) {\n var o = this.o.v % 360 / 360;\n\n if (o < 0) {\n o += 1;\n }\n\n if (this.s.v > 1) {\n s = 1 + o;\n } else if (this.s.v < 0) {\n s = 0 + o;\n } else {\n s = this.s.v + o;\n }\n\n if (this.e.v > 1) {\n e = 1 + o;\n } else if (this.e.v < 0) {\n e = 0 + o;\n } else {\n e = this.e.v + o;\n }\n\n if (s > e) {\n var _s = s;\n s = e;\n e = _s;\n }\n\n s = Math.round(s * 10000) * 0.0001;\n e = Math.round(e * 10000) * 0.0001;\n this.sValue = s;\n this.eValue = e;\n } else {\n s = this.sValue;\n e = this.eValue;\n }\n\n var shapePaths;\n var i;\n var len = this.shapes.length;\n var j;\n var jLen;\n var pathsData;\n var pathData;\n var totalShapeLength;\n var totalModifierLength = 0;\n\n if (e === s) {\n for (i = 0; i < len; i += 1) {\n this.shapes[i].localShapeCollection.releaseShapes();\n this.shapes[i].shape._mdf = true;\n this.shapes[i].shape.paths = this.shapes[i].localShapeCollection;\n\n if (this._mdf) {\n this.shapes[i].pathsData.length = 0;\n }\n }\n } else if (!(e === 1 && s === 0 || e === 0 && s === 1)) {\n var segments = [];\n var shapeData;\n var localShapeCollection;\n\n for (i = 0; i < len; i += 1) {\n shapeData = this.shapes[i]; // if shape hasn't changed and trim properties haven't changed, cached previous path can be used\n\n if (!shapeData.shape._mdf && !this._mdf && !_isFirstFrame && this.m !== 2) {\n shapeData.shape.paths = shapeData.localShapeCollection;\n } else {\n shapePaths = shapeData.shape.paths;\n jLen = shapePaths._length;\n totalShapeLength = 0;\n\n if (!shapeData.shape._mdf && shapeData.pathsData.length) {\n totalShapeLength = shapeData.totalShapeLength;\n } else {\n pathsData = this.releasePathsData(shapeData.pathsData);\n\n for (j = 0; j < jLen; j += 1) {\n pathData = bez.getSegmentsLength(shapePaths.shapes[j]);\n pathsData.push(pathData);\n totalShapeLength += pathData.totalLength;\n }\n\n shapeData.totalShapeLength = totalShapeLength;\n shapeData.pathsData = pathsData;\n }\n\n totalModifierLength += totalShapeLength;\n shapeData.shape._mdf = true;\n }\n }\n\n var shapeS = s;\n var shapeE = e;\n var addedLength = 0;\n var edges;\n\n for (i = len - 1; i >= 0; i -= 1) {\n shapeData = this.shapes[i];\n\n if (shapeData.shape._mdf) {\n localShapeCollection = shapeData.localShapeCollection;\n localShapeCollection.releaseShapes(); // if m === 2 means paths are trimmed individually so edges need to be found for this specific shape relative to whoel group\n\n if (this.m === 2 && len > 1) {\n edges = this.calculateShapeEdges(s, e, shapeData.totalShapeLength, addedLength, totalModifierLength);\n addedLength += shapeData.totalShapeLength;\n } else {\n edges = [[shapeS, shapeE]];\n }\n\n jLen = edges.length;\n\n for (j = 0; j < jLen; j += 1) {\n shapeS = edges[j][0];\n shapeE = edges[j][1];\n segments.length = 0;\n\n if (shapeE <= 1) {\n segments.push({\n s: shapeData.totalShapeLength * shapeS,\n e: shapeData.totalShapeLength * shapeE\n });\n } else if (shapeS >= 1) {\n segments.push({\n s: shapeData.totalShapeLength * (shapeS - 1),\n e: shapeData.totalShapeLength * (shapeE - 1)\n });\n } else {\n segments.push({\n s: shapeData.totalShapeLength * shapeS,\n e: shapeData.totalShapeLength\n });\n segments.push({\n s: 0,\n e: shapeData.totalShapeLength * (shapeE - 1)\n });\n }\n\n var newShapesData = this.addShapes(shapeData, segments[0]);\n\n if (segments[0].s !== segments[0].e) {\n if (segments.length > 1) {\n var lastShapeInCollection = shapeData.shape.paths.shapes[shapeData.shape.paths._length - 1];\n\n if (lastShapeInCollection.c) {\n var lastShape = newShapesData.pop();\n this.addPaths(newShapesData, localShapeCollection);\n newShapesData = this.addShapes(shapeData, segments[1], lastShape);\n } else {\n this.addPaths(newShapesData, localShapeCollection);\n newShapesData = this.addShapes(shapeData, segments[1]);\n }\n }\n\n this.addPaths(newShapesData, localShapeCollection);\n }\n }\n\n shapeData.shape.paths = localShapeCollection;\n }\n }\n } else if (this._mdf) {\n for (i = 0; i < len; i += 1) {\n // Releasign Trim Cached paths data when no trim applied in case shapes are modified inbetween.\n // Don't remove this even if it's losing cached info.\n this.shapes[i].pathsData.length = 0;\n this.shapes[i].shape._mdf = true;\n }\n }\n };\n\n TrimModifier.prototype.addPaths = function (newPaths, localShapeCollection) {\n var i;\n var len = newPaths.length;\n\n for (i = 0; i < len; i += 1) {\n localShapeCollection.addShape(newPaths[i]);\n }\n };\n\n TrimModifier.prototype.addSegment = function (pt1, pt2, pt3, pt4, shapePath, pos, newShape) {\n shapePath.setXYAt(pt2[0], pt2[1], 'o', pos);\n shapePath.setXYAt(pt3[0], pt3[1], 'i', pos + 1);\n\n if (newShape) {\n shapePath.setXYAt(pt1[0], pt1[1], 'v', pos);\n }\n\n shapePath.setXYAt(pt4[0], pt4[1], 'v', pos + 1);\n };\n\n TrimModifier.prototype.addSegmentFromArray = function (points, shapePath, pos, newShape) {\n shapePath.setXYAt(points[1], points[5], 'o', pos);\n shapePath.setXYAt(points[2], points[6], 'i', pos + 1);\n\n if (newShape) {\n shapePath.setXYAt(points[0], points[4], 'v', pos);\n }\n\n shapePath.setXYAt(points[3], points[7], 'v', pos + 1);\n };\n\n TrimModifier.prototype.addShapes = function (shapeData, shapeSegment, shapePath) {\n var pathsData = shapeData.pathsData;\n var shapePaths = shapeData.shape.paths.shapes;\n var i;\n var len = shapeData.shape.paths._length;\n var j;\n var jLen;\n var addedLength = 0;\n var currentLengthData;\n var segmentCount;\n var lengths;\n var segment;\n var shapes = [];\n var initPos;\n var newShape = true;\n\n if (!shapePath) {\n shapePath = shapePool.newElement();\n segmentCount = 0;\n initPos = 0;\n } else {\n segmentCount = shapePath._length;\n initPos = shapePath._length;\n }\n\n shapes.push(shapePath);\n\n for (i = 0; i < len; i += 1) {\n lengths = pathsData[i].lengths;\n shapePath.c = shapePaths[i].c;\n jLen = shapePaths[i].c ? lengths.length : lengths.length + 1;\n\n for (j = 1; j < jLen; j += 1) {\n currentLengthData = lengths[j - 1];\n\n if (addedLength + currentLengthData.addedLength < shapeSegment.s) {\n addedLength += currentLengthData.addedLength;\n shapePath.c = false;\n } else if (addedLength > shapeSegment.e) {\n shapePath.c = false;\n break;\n } else {\n if (shapeSegment.s <= addedLength && shapeSegment.e >= addedLength + currentLengthData.addedLength) {\n this.addSegment(shapePaths[i].v[j - 1], shapePaths[i].o[j - 1], shapePaths[i].i[j], shapePaths[i].v[j], shapePath, segmentCount, newShape);\n newShape = false;\n } else {\n segment = bez.getNewSegment(shapePaths[i].v[j - 1], shapePaths[i].v[j], shapePaths[i].o[j - 1], shapePaths[i].i[j], (shapeSegment.s - addedLength) / currentLengthData.addedLength, (shapeSegment.e - addedLength) / currentLengthData.addedLength, lengths[j - 1]);\n this.addSegmentFromArray(segment, shapePath, segmentCount, newShape); // this.addSegment(segment.pt1, segment.pt3, segment.pt4, segment.pt2, shapePath, segmentCount, newShape);\n\n newShape = false;\n shapePath.c = false;\n }\n\n addedLength += currentLengthData.addedLength;\n segmentCount += 1;\n }\n }\n\n if (shapePaths[i].c && lengths.length) {\n currentLengthData = lengths[j - 1];\n\n if (addedLength <= shapeSegment.e) {\n var segmentLength = lengths[j - 1].addedLength;\n\n if (shapeSegment.s <= addedLength && shapeSegment.e >= addedLength + segmentLength) {\n this.addSegment(shapePaths[i].v[j - 1], shapePaths[i].o[j - 1], shapePaths[i].i[0], shapePaths[i].v[0], shapePath, segmentCount, newShape);\n newShape = false;\n } else {\n segment = bez.getNewSegment(shapePaths[i].v[j - 1], shapePaths[i].v[0], shapePaths[i].o[j - 1], shapePaths[i].i[0], (shapeSegment.s - addedLength) / segmentLength, (shapeSegment.e - addedLength) / segmentLength, lengths[j - 1]);\n this.addSegmentFromArray(segment, shapePath, segmentCount, newShape); // this.addSegment(segment.pt1, segment.pt3, segment.pt4, segment.pt2, shapePath, segmentCount, newShape);\n\n newShape = false;\n shapePath.c = false;\n }\n } else {\n shapePath.c = false;\n }\n\n addedLength += currentLengthData.addedLength;\n segmentCount += 1;\n }\n\n if (shapePath._length) {\n shapePath.setXYAt(shapePath.v[initPos][0], shapePath.v[initPos][1], 'i', initPos);\n shapePath.setXYAt(shapePath.v[shapePath._length - 1][0], shapePath.v[shapePath._length - 1][1], 'o', shapePath._length - 1);\n }\n\n if (addedLength > shapeSegment.e) {\n break;\n }\n\n if (i < len - 1) {\n shapePath = shapePool.newElement();\n newShape = true;\n shapes.push(shapePath);\n segmentCount = 0;\n }\n }\n\n return shapes;\n };\n\n function PuckerAndBloatModifier() {}\n\n extendPrototype([ShapeModifier], PuckerAndBloatModifier);\n\n PuckerAndBloatModifier.prototype.initModifierProperties = function (elem, data) {\n this.getValue = this.processKeys;\n this.amount = PropertyFactory.getProp(elem, data.a, 0, null, this);\n this._isAnimated = !!this.amount.effectsSequence.length;\n };\n\n PuckerAndBloatModifier.prototype.processPath = function (path, amount) {\n var percent = amount / 100;\n var centerPoint = [0, 0];\n var pathLength = path._length;\n var i = 0;\n\n for (i = 0; i < pathLength; i += 1) {\n centerPoint[0] += path.v[i][0];\n centerPoint[1] += path.v[i][1];\n }\n\n centerPoint[0] /= pathLength;\n centerPoint[1] /= pathLength;\n var clonedPath = shapePool.newElement();\n clonedPath.c = path.c;\n var vX;\n var vY;\n var oX;\n var oY;\n var iX;\n var iY;\n\n for (i = 0; i < pathLength; i += 1) {\n vX = path.v[i][0] + (centerPoint[0] - path.v[i][0]) * percent;\n vY = path.v[i][1] + (centerPoint[1] - path.v[i][1]) * percent;\n oX = path.o[i][0] + (centerPoint[0] - path.o[i][0]) * -percent;\n oY = path.o[i][1] + (centerPoint[1] - path.o[i][1]) * -percent;\n iX = path.i[i][0] + (centerPoint[0] - path.i[i][0]) * -percent;\n iY = path.i[i][1] + (centerPoint[1] - path.i[i][1]) * -percent;\n clonedPath.setTripleAt(vX, vY, oX, oY, iX, iY, i);\n }\n\n return clonedPath;\n };\n\n PuckerAndBloatModifier.prototype.processShapes = function (_isFirstFrame) {\n var shapePaths;\n var i;\n var len = this.shapes.length;\n var j;\n var jLen;\n var amount = this.amount.v;\n\n if (amount !== 0) {\n var shapeData;\n var localShapeCollection;\n\n for (i = 0; i < len; i += 1) {\n shapeData = this.shapes[i];\n localShapeCollection = shapeData.localShapeCollection;\n\n if (!(!shapeData.shape._mdf && !this._mdf && !_isFirstFrame)) {\n localShapeCollection.releaseShapes();\n shapeData.shape._mdf = true;\n shapePaths = shapeData.shape.paths.shapes;\n jLen = shapeData.shape.paths._length;\n\n for (j = 0; j < jLen; j += 1) {\n localShapeCollection.addShape(this.processPath(shapePaths[j], amount));\n }\n }\n\n shapeData.shape.paths = shapeData.localShapeCollection;\n }\n }\n\n if (!this.dynamicProperties.length) {\n this._mdf = false;\n }\n };\n\n var TransformPropertyFactory = function () {\n var defaultVector = [0, 0];\n\n function applyToMatrix(mat) {\n var _mdf = this._mdf;\n this.iterateDynamicProperties();\n this._mdf = this._mdf || _mdf;\n\n if (this.a) {\n mat.translate(-this.a.v[0], -this.a.v[1], this.a.v[2]);\n }\n\n if (this.s) {\n mat.scale(this.s.v[0], this.s.v[1], this.s.v[2]);\n }\n\n if (this.sk) {\n mat.skewFromAxis(-this.sk.v, this.sa.v);\n }\n\n if (this.r) {\n mat.rotate(-this.r.v);\n } else {\n mat.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]);\n }\n\n if (this.data.p.s) {\n if (this.data.p.z) {\n mat.translate(this.px.v, this.py.v, -this.pz.v);\n } else {\n mat.translate(this.px.v, this.py.v, 0);\n }\n } else {\n mat.translate(this.p.v[0], this.p.v[1], -this.p.v[2]);\n }\n }\n\n function processKeys(forceRender) {\n if (this.elem.globalData.frameId === this.frameId) {\n return;\n }\n\n if (this._isDirty) {\n this.precalculateMatrix();\n this._isDirty = false;\n }\n\n this.iterateDynamicProperties();\n\n if (this._mdf || forceRender) {\n var frameRate;\n this.v.cloneFromProps(this.pre.props);\n\n if (this.appliedTransformations < 1) {\n this.v.translate(-this.a.v[0], -this.a.v[1], this.a.v[2]);\n }\n\n if (this.appliedTransformations < 2) {\n this.v.scale(this.s.v[0], this.s.v[1], this.s.v[2]);\n }\n\n if (this.sk && this.appliedTransformations < 3) {\n this.v.skewFromAxis(-this.sk.v, this.sa.v);\n }\n\n if (this.r && this.appliedTransformations < 4) {\n this.v.rotate(-this.r.v);\n } else if (!this.r && this.appliedTransformations < 4) {\n this.v.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]);\n }\n\n if (this.autoOriented) {\n var v1;\n var v2;\n frameRate = this.elem.globalData.frameRate;\n\n if (this.p && this.p.keyframes && this.p.getValueAtTime) {\n if (this.p._caching.lastFrame + this.p.offsetTime <= this.p.keyframes[0].t) {\n v1 = this.p.getValueAtTime((this.p.keyframes[0].t + 0.01) / frameRate, 0);\n v2 = this.p.getValueAtTime(this.p.keyframes[0].t / frameRate, 0);\n } else if (this.p._caching.lastFrame + this.p.offsetTime >= this.p.keyframes[this.p.keyframes.length - 1].t) {\n v1 = this.p.getValueAtTime(this.p.keyframes[this.p.keyframes.length - 1].t / frameRate, 0);\n v2 = this.p.getValueAtTime((this.p.keyframes[this.p.keyframes.length - 1].t - 0.05) / frameRate, 0);\n } else {\n v1 = this.p.pv;\n v2 = this.p.getValueAtTime((this.p._caching.lastFrame + this.p.offsetTime - 0.01) / frameRate, this.p.offsetTime);\n }\n } else if (this.px && this.px.keyframes && this.py.keyframes && this.px.getValueAtTime && this.py.getValueAtTime) {\n v1 = [];\n v2 = [];\n var px = this.px;\n var py = this.py;\n\n if (px._caching.lastFrame + px.offsetTime <= px.keyframes[0].t) {\n v1[0] = px.getValueAtTime((px.keyframes[0].t + 0.01) / frameRate, 0);\n v1[1] = py.getValueAtTime((py.keyframes[0].t + 0.01) / frameRate, 0);\n v2[0] = px.getValueAtTime(px.keyframes[0].t / frameRate, 0);\n v2[1] = py.getValueAtTime(py.keyframes[0].t / frameRate, 0);\n } else if (px._caching.lastFrame + px.offsetTime >= px.keyframes[px.keyframes.length - 1].t) {\n v1[0] = px.getValueAtTime(px.keyframes[px.keyframes.length - 1].t / frameRate, 0);\n v1[1] = py.getValueAtTime(py.keyframes[py.keyframes.length - 1].t / frameRate, 0);\n v2[0] = px.getValueAtTime((px.keyframes[px.keyframes.length - 1].t - 0.01) / frameRate, 0);\n v2[1] = py.getValueAtTime((py.keyframes[py.keyframes.length - 1].t - 0.01) / frameRate, 0);\n } else {\n v1 = [px.pv, py.pv];\n v2[0] = px.getValueAtTime((px._caching.lastFrame + px.offsetTime - 0.01) / frameRate, px.offsetTime);\n v2[1] = py.getValueAtTime((py._caching.lastFrame + py.offsetTime - 0.01) / frameRate, py.offsetTime);\n }\n } else {\n v2 = defaultVector;\n v1 = v2;\n }\n\n this.v.rotate(-Math.atan2(v1[1] - v2[1], v1[0] - v2[0]));\n }\n\n if (this.data.p && this.data.p.s) {\n if (this.data.p.z) {\n this.v.translate(this.px.v, this.py.v, -this.pz.v);\n } else {\n this.v.translate(this.px.v, this.py.v, 0);\n }\n } else {\n this.v.translate(this.p.v[0], this.p.v[1], -this.p.v[2]);\n }\n }\n\n this.frameId = this.elem.globalData.frameId;\n }\n\n function precalculateMatrix() {\n this.appliedTransformations = 0;\n this.pre.reset();\n\n if (!this.a.effectsSequence.length) {\n this.pre.translate(-this.a.v[0], -this.a.v[1], this.a.v[2]);\n this.appliedTransformations = 1;\n } else {\n return;\n }\n\n if (!this.s.effectsSequence.length) {\n this.pre.scale(this.s.v[0], this.s.v[1], this.s.v[2]);\n this.appliedTransformations = 2;\n } else {\n return;\n }\n\n if (this.sk) {\n if (!this.sk.effectsSequence.length && !this.sa.effectsSequence.length) {\n this.pre.skewFromAxis(-this.sk.v, this.sa.v);\n this.appliedTransformations = 3;\n } else {\n return;\n }\n }\n\n if (this.r) {\n if (!this.r.effectsSequence.length) {\n this.pre.rotate(-this.r.v);\n this.appliedTransformations = 4;\n }\n } else if (!this.rz.effectsSequence.length && !this.ry.effectsSequence.length && !this.rx.effectsSequence.length && !this.or.effectsSequence.length) {\n this.pre.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]);\n this.appliedTransformations = 4;\n }\n }\n\n function autoOrient() {//\n // var prevP = this.getValueAtTime();\n }\n\n function addDynamicProperty(prop) {\n this._addDynamicProperty(prop);\n\n this.elem.addDynamicProperty(prop);\n this._isDirty = true;\n }\n\n function TransformProperty(elem, data, container) {\n this.elem = elem;\n this.frameId = -1;\n this.propType = 'transform';\n this.data = data;\n this.v = new Matrix(); // Precalculated matrix with non animated properties\n\n this.pre = new Matrix();\n this.appliedTransformations = 0;\n this.initDynamicPropertyContainer(container || elem);\n\n if (data.p && data.p.s) {\n this.px = PropertyFactory.getProp(elem, data.p.x, 0, 0, this);\n this.py = PropertyFactory.getProp(elem, data.p.y, 0, 0, this);\n\n if (data.p.z) {\n this.pz = PropertyFactory.getProp(elem, data.p.z, 0, 0, this);\n }\n } else {\n this.p = PropertyFactory.getProp(elem, data.p || {\n k: [0, 0, 0]\n }, 1, 0, this);\n }\n\n if (data.rx) {\n this.rx = PropertyFactory.getProp(elem, data.rx, 0, degToRads, this);\n this.ry = PropertyFactory.getProp(elem, data.ry, 0, degToRads, this);\n this.rz = PropertyFactory.getProp(elem, data.rz, 0, degToRads, this);\n\n if (data.or.k[0].ti) {\n var i;\n var len = data.or.k.length;\n\n for (i = 0; i < len; i += 1) {\n data.or.k[i].to = null;\n data.or.k[i].ti = null;\n }\n }\n\n this.or = PropertyFactory.getProp(elem, data.or, 1, degToRads, this); // sh Indicates it needs to be capped between -180 and 180\n\n this.or.sh = true;\n } else {\n this.r = PropertyFactory.getProp(elem, data.r || {\n k: 0\n }, 0, degToRads, this);\n }\n\n if (data.sk) {\n this.sk = PropertyFactory.getProp(elem, data.sk, 0, degToRads, this);\n this.sa = PropertyFactory.getProp(elem, data.sa, 0, degToRads, this);\n }\n\n this.a = PropertyFactory.getProp(elem, data.a || {\n k: [0, 0, 0]\n }, 1, 0, this);\n this.s = PropertyFactory.getProp(elem, data.s || {\n k: [100, 100, 100]\n }, 1, 0.01, this); // Opacity is not part of the transform properties, that's why it won't use this.dynamicProperties. That way transforms won't get updated if opacity changes.\n\n if (data.o) {\n this.o = PropertyFactory.getProp(elem, data.o, 0, 0.01, elem);\n } else {\n this.o = {\n _mdf: false,\n v: 1\n };\n }\n\n this._isDirty = true;\n\n if (!this.dynamicProperties.length) {\n this.getValue(true);\n }\n }\n\n TransformProperty.prototype = {\n applyToMatrix: applyToMatrix,\n getValue: processKeys,\n precalculateMatrix: precalculateMatrix,\n autoOrient: autoOrient\n };\n extendPrototype([DynamicPropertyContainer], TransformProperty);\n TransformProperty.prototype.addDynamicProperty = addDynamicProperty;\n TransformProperty.prototype._addDynamicProperty = DynamicPropertyContainer.prototype.addDynamicProperty;\n\n function getTransformProperty(elem, data, container) {\n return new TransformProperty(elem, data, container);\n }\n\n return {\n getTransformProperty: getTransformProperty\n };\n }();\n\n function RepeaterModifier() {}\n\n extendPrototype([ShapeModifier], RepeaterModifier);\n\n RepeaterModifier.prototype.initModifierProperties = function (elem, data) {\n this.getValue = this.processKeys;\n this.c = PropertyFactory.getProp(elem, data.c, 0, null, this);\n this.o = PropertyFactory.getProp(elem, data.o, 0, null, this);\n this.tr = TransformPropertyFactory.getTransformProperty(elem, data.tr, this);\n this.so = PropertyFactory.getProp(elem, data.tr.so, 0, 0.01, this);\n this.eo = PropertyFactory.getProp(elem, data.tr.eo, 0, 0.01, this);\n this.data = data;\n\n if (!this.dynamicProperties.length) {\n this.getValue(true);\n }\n\n this._isAnimated = !!this.dynamicProperties.length;\n this.pMatrix = new Matrix();\n this.rMatrix = new Matrix();\n this.sMatrix = new Matrix();\n this.tMatrix = new Matrix();\n this.matrix = new Matrix();\n };\n\n RepeaterModifier.prototype.applyTransforms = function (pMatrix, rMatrix, sMatrix, transform, perc, inv) {\n var dir = inv ? -1 : 1;\n var scaleX = transform.s.v[0] + (1 - transform.s.v[0]) * (1 - perc);\n var scaleY = transform.s.v[1] + (1 - transform.s.v[1]) * (1 - perc);\n pMatrix.translate(transform.p.v[0] * dir * perc, transform.p.v[1] * dir * perc, transform.p.v[2]);\n rMatrix.translate(-transform.a.v[0], -transform.a.v[1], transform.a.v[2]);\n rMatrix.rotate(-transform.r.v * dir * perc);\n rMatrix.translate(transform.a.v[0], transform.a.v[1], transform.a.v[2]);\n sMatrix.translate(-transform.a.v[0], -transform.a.v[1], transform.a.v[2]);\n sMatrix.scale(inv ? 1 / scaleX : scaleX, inv ? 1 / scaleY : scaleY);\n sMatrix.translate(transform.a.v[0], transform.a.v[1], transform.a.v[2]);\n };\n\n RepeaterModifier.prototype.init = function (elem, arr, pos, elemsData) {\n this.elem = elem;\n this.arr = arr;\n this.pos = pos;\n this.elemsData = elemsData;\n this._currentCopies = 0;\n this._elements = [];\n this._groups = [];\n this.frameId = -1;\n this.initDynamicPropertyContainer(elem);\n this.initModifierProperties(elem, arr[pos]);\n\n while (pos > 0) {\n pos -= 1; // this._elements.unshift(arr.splice(pos,1)[0]);\n\n this._elements.unshift(arr[pos]);\n }\n\n if (this.dynamicProperties.length) {\n this.k = true;\n } else {\n this.getValue(true);\n }\n };\n\n RepeaterModifier.prototype.resetElements = function (elements) {\n var i;\n var len = elements.length;\n\n for (i = 0; i < len; i += 1) {\n elements[i]._processed = false;\n\n if (elements[i].ty === 'gr') {\n this.resetElements(elements[i].it);\n }\n }\n };\n\n RepeaterModifier.prototype.cloneElements = function (elements) {\n var newElements = JSON.parse(JSON.stringify(elements));\n this.resetElements(newElements);\n return newElements;\n };\n\n RepeaterModifier.prototype.changeGroupRender = function (elements, renderFlag) {\n var i;\n var len = elements.length;\n\n for (i = 0; i < len; i += 1) {\n elements[i]._render = renderFlag;\n\n if (elements[i].ty === 'gr') {\n this.changeGroupRender(elements[i].it, renderFlag);\n }\n }\n };\n\n RepeaterModifier.prototype.processShapes = function (_isFirstFrame) {\n var items;\n var itemsTransform;\n var i;\n var dir;\n var cont;\n var hasReloaded = false;\n\n if (this._mdf || _isFirstFrame) {\n var copies = Math.ceil(this.c.v);\n\n if (this._groups.length < copies) {\n while (this._groups.length < copies) {\n var group = {\n it: this.cloneElements(this._elements),\n ty: 'gr'\n };\n group.it.push({\n a: {\n a: 0,\n ix: 1,\n k: [0, 0]\n },\n nm: 'Transform',\n o: {\n a: 0,\n ix: 7,\n k: 100\n },\n p: {\n a: 0,\n ix: 2,\n k: [0, 0]\n },\n r: {\n a: 1,\n ix: 6,\n k: [{\n s: 0,\n e: 0,\n t: 0\n }, {\n s: 0,\n e: 0,\n t: 1\n }]\n },\n s: {\n a: 0,\n ix: 3,\n k: [100, 100]\n },\n sa: {\n a: 0,\n ix: 5,\n k: 0\n },\n sk: {\n a: 0,\n ix: 4,\n k: 0\n },\n ty: 'tr'\n });\n this.arr.splice(0, 0, group);\n\n this._groups.splice(0, 0, group);\n\n this._currentCopies += 1;\n }\n\n this.elem.reloadShapes();\n hasReloaded = true;\n }\n\n cont = 0;\n var renderFlag;\n\n for (i = 0; i <= this._groups.length - 1; i += 1) {\n renderFlag = cont < copies;\n this._groups[i]._render = renderFlag;\n this.changeGroupRender(this._groups[i].it, renderFlag);\n\n if (!renderFlag) {\n var elems = this.elemsData[i].it;\n var transformData = elems[elems.length - 1];\n\n if (transformData.transform.op.v !== 0) {\n transformData.transform.op._mdf = true;\n transformData.transform.op.v = 0;\n } else {\n transformData.transform.op._mdf = false;\n }\n }\n\n cont += 1;\n }\n\n this._currentCopies = copies; /// /\n\n var offset = this.o.v;\n var offsetModulo = offset % 1;\n var roundOffset = offset > 0 ? Math.floor(offset) : Math.ceil(offset);\n var pProps = this.pMatrix.props;\n var rProps = this.rMatrix.props;\n var sProps = this.sMatrix.props;\n this.pMatrix.reset();\n this.rMatrix.reset();\n this.sMatrix.reset();\n this.tMatrix.reset();\n this.matrix.reset();\n var iteration = 0;\n\n if (offset > 0) {\n while (iteration < roundOffset) {\n this.applyTransforms(this.pMatrix, this.rMatrix, this.sMatrix, this.tr, 1, false);\n iteration += 1;\n }\n\n if (offsetModulo) {\n this.applyTransforms(this.pMatrix, this.rMatrix, this.sMatrix, this.tr, offsetModulo, false);\n iteration += offsetModulo;\n }\n } else if (offset < 0) {\n while (iteration > roundOffset) {\n this.applyTransforms(this.pMatrix, this.rMatrix, this.sMatrix, this.tr, 1, true);\n iteration -= 1;\n }\n\n if (offsetModulo) {\n this.applyTransforms(this.pMatrix, this.rMatrix, this.sMatrix, this.tr, -offsetModulo, true);\n iteration -= offsetModulo;\n }\n }\n\n i = this.data.m === 1 ? 0 : this._currentCopies - 1;\n dir = this.data.m === 1 ? 1 : -1;\n cont = this._currentCopies;\n var j;\n var jLen;\n\n while (cont) {\n items = this.elemsData[i].it;\n itemsTransform = items[items.length - 1].transform.mProps.v.props;\n jLen = itemsTransform.length;\n items[items.length - 1].transform.mProps._mdf = true;\n items[items.length - 1].transform.op._mdf = true;\n items[items.length - 1].transform.op.v = this._currentCopies === 1 ? this.so.v : this.so.v + (this.eo.v - this.so.v) * (i / (this._currentCopies - 1));\n\n if (iteration !== 0) {\n if (i !== 0 && dir === 1 || i !== this._currentCopies - 1 && dir === -1) {\n this.applyTransforms(this.pMatrix, this.rMatrix, this.sMatrix, this.tr, 1, false);\n }\n\n this.matrix.transform(rProps[0], rProps[1], rProps[2], rProps[3], rProps[4], rProps[5], rProps[6], rProps[7], rProps[8], rProps[9], rProps[10], rProps[11], rProps[12], rProps[13], rProps[14], rProps[15]);\n this.matrix.transform(sProps[0], sProps[1], sProps[2], sProps[3], sProps[4], sProps[5], sProps[6], sProps[7], sProps[8], sProps[9], sProps[10], sProps[11], sProps[12], sProps[13], sProps[14], sProps[15]);\n this.matrix.transform(pProps[0], pProps[1], pProps[2], pProps[3], pProps[4], pProps[5], pProps[6], pProps[7], pProps[8], pProps[9], pProps[10], pProps[11], pProps[12], pProps[13], pProps[14], pProps[15]);\n\n for (j = 0; j < jLen; j += 1) {\n itemsTransform[j] = this.matrix.props[j];\n }\n\n this.matrix.reset();\n } else {\n this.matrix.reset();\n\n for (j = 0; j < jLen; j += 1) {\n itemsTransform[j] = this.matrix.props[j];\n }\n }\n\n iteration += 1;\n cont -= 1;\n i += dir;\n }\n } else {\n cont = this._currentCopies;\n i = 0;\n dir = 1;\n\n while (cont) {\n items = this.elemsData[i].it;\n itemsTransform = items[items.length - 1].transform.mProps.v.props;\n items[items.length - 1].transform.mProps._mdf = false;\n items[items.length - 1].transform.op._mdf = false;\n cont -= 1;\n i += dir;\n }\n }\n\n return hasReloaded;\n };\n\n RepeaterModifier.prototype.addShape = function () {};\n\n function RoundCornersModifier() {}\n\n extendPrototype([ShapeModifier], RoundCornersModifier);\n\n RoundCornersModifier.prototype.initModifierProperties = function (elem, data) {\n this.getValue = this.processKeys;\n this.rd = PropertyFactory.getProp(elem, data.r, 0, null, this);\n this._isAnimated = !!this.rd.effectsSequence.length;\n };\n\n RoundCornersModifier.prototype.processPath = function (path, round) {\n var clonedPath = shapePool.newElement();\n clonedPath.c = path.c;\n var i;\n var len = path._length;\n var currentV;\n var currentI;\n var currentO;\n var closerV;\n var distance;\n var newPosPerc;\n var index = 0;\n var vX;\n var vY;\n var oX;\n var oY;\n var iX;\n var iY;\n\n for (i = 0; i < len; i += 1) {\n currentV = path.v[i];\n currentO = path.o[i];\n currentI = path.i[i];\n\n if (currentV[0] === currentO[0] && currentV[1] === currentO[1] && currentV[0] === currentI[0] && currentV[1] === currentI[1]) {\n if ((i === 0 || i === len - 1) && !path.c) {\n clonedPath.setTripleAt(currentV[0], currentV[1], currentO[0], currentO[1], currentI[0], currentI[1], index);\n /* clonedPath.v[index] = currentV;\r\n clonedPath.o[index] = currentO;\r\n clonedPath.i[index] = currentI; */\n\n index += 1;\n } else {\n if (i === 0) {\n closerV = path.v[len - 1];\n } else {\n closerV = path.v[i - 1];\n }\n\n distance = Math.sqrt(Math.pow(currentV[0] - closerV[0], 2) + Math.pow(currentV[1] - closerV[1], 2));\n newPosPerc = distance ? Math.min(distance / 2, round) / distance : 0;\n iX = currentV[0] + (closerV[0] - currentV[0]) * newPosPerc;\n vX = iX;\n iY = currentV[1] - (currentV[1] - closerV[1]) * newPosPerc;\n vY = iY;\n oX = vX - (vX - currentV[0]) * roundCorner;\n oY = vY - (vY - currentV[1]) * roundCorner;\n clonedPath.setTripleAt(vX, vY, oX, oY, iX, iY, index);\n index += 1;\n\n if (i === len - 1) {\n closerV = path.v[0];\n } else {\n closerV = path.v[i + 1];\n }\n\n distance = Math.sqrt(Math.pow(currentV[0] - closerV[0], 2) + Math.pow(currentV[1] - closerV[1], 2));\n newPosPerc = distance ? Math.min(distance / 2, round) / distance : 0;\n oX = currentV[0] + (closerV[0] - currentV[0]) * newPosPerc;\n vX = oX;\n oY = currentV[1] + (closerV[1] - currentV[1]) * newPosPerc;\n vY = oY;\n iX = vX - (vX - currentV[0]) * roundCorner;\n iY = vY - (vY - currentV[1]) * roundCorner;\n clonedPath.setTripleAt(vX, vY, oX, oY, iX, iY, index);\n index += 1;\n }\n } else {\n clonedPath.setTripleAt(path.v[i][0], path.v[i][1], path.o[i][0], path.o[i][1], path.i[i][0], path.i[i][1], index);\n index += 1;\n }\n }\n\n return clonedPath;\n };\n\n RoundCornersModifier.prototype.processShapes = function (_isFirstFrame) {\n var shapePaths;\n var i;\n var len = this.shapes.length;\n var j;\n var jLen;\n var rd = this.rd.v;\n\n if (rd !== 0) {\n var shapeData;\n var localShapeCollection;\n\n for (i = 0; i < len; i += 1) {\n shapeData = this.shapes[i];\n localShapeCollection = shapeData.localShapeCollection;\n\n if (!(!shapeData.shape._mdf && !this._mdf && !_isFirstFrame)) {\n localShapeCollection.releaseShapes();\n shapeData.shape._mdf = true;\n shapePaths = shapeData.shape.paths.shapes;\n jLen = shapeData.shape.paths._length;\n\n for (j = 0; j < jLen; j += 1) {\n localShapeCollection.addShape(this.processPath(shapePaths[j], rd));\n }\n }\n\n shapeData.shape.paths = shapeData.localShapeCollection;\n }\n }\n\n if (!this.dynamicProperties.length) {\n this._mdf = false;\n }\n };\n\n function floatEqual(a, b) {\n return Math.abs(a - b) * 100000 <= Math.min(Math.abs(a), Math.abs(b));\n }\n\n function floatZero(f) {\n return Math.abs(f) <= 0.00001;\n }\n\n function lerp(p0, p1, amount) {\n return p0 * (1 - amount) + p1 * amount;\n }\n\n function lerpPoint(p0, p1, amount) {\n return [lerp(p0[0], p1[0], amount), lerp(p0[1], p1[1], amount)];\n }\n\n function quadRoots(a, b, c) {\n // no root\n if (a === 0) return [];\n var s = b * b - 4 * a * c; // Complex roots\n\n if (s < 0) return [];\n var singleRoot = -b / (2 * a); // 1 root\n\n if (s === 0) return [singleRoot];\n var delta = Math.sqrt(s) / (2 * a); // 2 roots\n\n return [singleRoot - delta, singleRoot + delta];\n }\n\n function polynomialCoefficients(p0, p1, p2, p3) {\n return [-p0 + 3 * p1 - 3 * p2 + p3, 3 * p0 - 6 * p1 + 3 * p2, -3 * p0 + 3 * p1, p0];\n }\n\n function singlePoint(p) {\n return new PolynomialBezier(p, p, p, p, false);\n }\n\n function PolynomialBezier(p0, p1, p2, p3, linearize) {\n if (linearize && pointEqual(p0, p1)) {\n p1 = lerpPoint(p0, p3, 1 / 3);\n }\n\n if (linearize && pointEqual(p2, p3)) {\n p2 = lerpPoint(p0, p3, 2 / 3);\n }\n\n var coeffx = polynomialCoefficients(p0[0], p1[0], p2[0], p3[0]);\n var coeffy = polynomialCoefficients(p0[1], p1[1], p2[1], p3[1]);\n this.a = [coeffx[0], coeffy[0]];\n this.b = [coeffx[1], coeffy[1]];\n this.c = [coeffx[2], coeffy[2]];\n this.d = [coeffx[3], coeffy[3]];\n this.points = [p0, p1, p2, p3];\n }\n\n PolynomialBezier.prototype.point = function (t) {\n return [((this.a[0] * t + this.b[0]) * t + this.c[0]) * t + this.d[0], ((this.a[1] * t + this.b[1]) * t + this.c[1]) * t + this.d[1]];\n };\n\n PolynomialBezier.prototype.derivative = function (t) {\n return [(3 * t * this.a[0] + 2 * this.b[0]) * t + this.c[0], (3 * t * this.a[1] + 2 * this.b[1]) * t + this.c[1]];\n };\n\n PolynomialBezier.prototype.tangentAngle = function (t) {\n var p = this.derivative(t);\n return Math.atan2(p[1], p[0]);\n };\n\n PolynomialBezier.prototype.normalAngle = function (t) {\n var p = this.derivative(t);\n return Math.atan2(p[0], p[1]);\n };\n\n PolynomialBezier.prototype.inflectionPoints = function () {\n var denom = this.a[1] * this.b[0] - this.a[0] * this.b[1];\n if (floatZero(denom)) return [];\n var tcusp = -0.5 * (this.a[1] * this.c[0] - this.a[0] * this.c[1]) / denom;\n var square = tcusp * tcusp - 1 / 3 * (this.b[1] * this.c[0] - this.b[0] * this.c[1]) / denom;\n if (square < 0) return [];\n var root = Math.sqrt(square);\n\n if (floatZero(root)) {\n if (root > 0 && root < 1) return [tcusp];\n return [];\n }\n\n return [tcusp - root, tcusp + root].filter(function (r) {\n return r > 0 && r < 1;\n });\n };\n\n PolynomialBezier.prototype.split = function (t) {\n if (t <= 0) return [singlePoint(this.points[0]), this];\n if (t >= 1) return [this, singlePoint(this.points[this.points.length - 1])];\n var p10 = lerpPoint(this.points[0], this.points[1], t);\n var p11 = lerpPoint(this.points[1], this.points[2], t);\n var p12 = lerpPoint(this.points[2], this.points[3], t);\n var p20 = lerpPoint(p10, p11, t);\n var p21 = lerpPoint(p11, p12, t);\n var p3 = lerpPoint(p20, p21, t);\n return [new PolynomialBezier(this.points[0], p10, p20, p3, true), new PolynomialBezier(p3, p21, p12, this.points[3], true)];\n };\n\n function extrema(bez, comp) {\n var min = bez.points[0][comp];\n var max = bez.points[bez.points.length - 1][comp];\n\n if (min > max) {\n var e = max;\n max = min;\n min = e;\n } // Derivative roots to find min/max\n\n\n var f = quadRoots(3 * bez.a[comp], 2 * bez.b[comp], bez.c[comp]);\n\n for (var i = 0; i < f.length; i += 1) {\n if (f[i] > 0 && f[i] < 1) {\n var val = bez.point(f[i])[comp];\n if (val < min) min = val;else if (val > max) max = val;\n }\n }\n\n return {\n min: min,\n max: max\n };\n }\n\n PolynomialBezier.prototype.bounds = function () {\n return {\n x: extrema(this, 0),\n y: extrema(this, 1)\n };\n };\n\n PolynomialBezier.prototype.boundingBox = function () {\n var bounds = this.bounds();\n return {\n left: bounds.x.min,\n right: bounds.x.max,\n top: bounds.y.min,\n bottom: bounds.y.max,\n width: bounds.x.max - bounds.x.min,\n height: bounds.y.max - bounds.y.min,\n cx: (bounds.x.max + bounds.x.min) / 2,\n cy: (bounds.y.max + bounds.y.min) / 2\n };\n };\n\n function intersectData(bez, t1, t2) {\n var box = bez.boundingBox();\n return {\n cx: box.cx,\n cy: box.cy,\n width: box.width,\n height: box.height,\n bez: bez,\n t: (t1 + t2) / 2,\n t1: t1,\n t2: t2\n };\n }\n\n function splitData(data) {\n var split = data.bez.split(0.5);\n return [intersectData(split[0], data.t1, data.t), intersectData(split[1], data.t, data.t2)];\n }\n\n function boxIntersect(b1, b2) {\n return Math.abs(b1.cx - b2.cx) * 2 < b1.width + b2.width && Math.abs(b1.cy - b2.cy) * 2 < b1.height + b2.height;\n }\n\n function intersectsImpl(d1, d2, depth, tolerance, intersections, maxRecursion) {\n if (!boxIntersect(d1, d2)) return;\n\n if (depth >= maxRecursion || d1.width <= tolerance && d1.height <= tolerance && d2.width <= tolerance && d2.height <= tolerance) {\n intersections.push([d1.t, d2.t]);\n return;\n }\n\n var d1s = splitData(d1);\n var d2s = splitData(d2);\n intersectsImpl(d1s[0], d2s[0], depth + 1, tolerance, intersections, maxRecursion);\n intersectsImpl(d1s[0], d2s[1], depth + 1, tolerance, intersections, maxRecursion);\n intersectsImpl(d1s[1], d2s[0], depth + 1, tolerance, intersections, maxRecursion);\n intersectsImpl(d1s[1], d2s[1], depth + 1, tolerance, intersections, maxRecursion);\n }\n\n PolynomialBezier.prototype.intersections = function (other, tolerance, maxRecursion) {\n if (tolerance === undefined) tolerance = 2;\n if (maxRecursion === undefined) maxRecursion = 7;\n var intersections = [];\n intersectsImpl(intersectData(this, 0, 1), intersectData(other, 0, 1), 0, tolerance, intersections, maxRecursion);\n return intersections;\n };\n\n PolynomialBezier.shapeSegment = function (shapePath, index) {\n var nextIndex = (index + 1) % shapePath.length();\n return new PolynomialBezier(shapePath.v[index], shapePath.o[index], shapePath.i[nextIndex], shapePath.v[nextIndex], true);\n };\n\n PolynomialBezier.shapeSegmentInverted = function (shapePath, index) {\n var nextIndex = (index + 1) % shapePath.length();\n return new PolynomialBezier(shapePath.v[nextIndex], shapePath.i[nextIndex], shapePath.o[index], shapePath.v[index], true);\n };\n\n function crossProduct(a, b) {\n return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];\n }\n\n function lineIntersection(start1, end1, start2, end2) {\n var v1 = [start1[0], start1[1], 1];\n var v2 = [end1[0], end1[1], 1];\n var v3 = [start2[0], start2[1], 1];\n var v4 = [end2[0], end2[1], 1];\n var r = crossProduct(crossProduct(v1, v2), crossProduct(v3, v4));\n if (floatZero(r[2])) return null;\n return [r[0] / r[2], r[1] / r[2]];\n }\n\n function polarOffset(p, angle, length) {\n return [p[0] + Math.cos(angle) * length, p[1] - Math.sin(angle) * length];\n }\n\n function pointDistance(p1, p2) {\n return Math.hypot(p1[0] - p2[0], p1[1] - p2[1]);\n }\n\n function pointEqual(p1, p2) {\n return floatEqual(p1[0], p2[0]) && floatEqual(p1[1], p2[1]);\n }\n\n function ZigZagModifier() {}\n\n extendPrototype([ShapeModifier], ZigZagModifier);\n\n ZigZagModifier.prototype.initModifierProperties = function (elem, data) {\n this.getValue = this.processKeys;\n this.amplitude = PropertyFactory.getProp(elem, data.s, 0, null, this);\n this.frequency = PropertyFactory.getProp(elem, data.r, 0, null, this);\n this.pointsType = PropertyFactory.getProp(elem, data.pt, 0, null, this);\n this._isAnimated = this.amplitude.effectsSequence.length !== 0 || this.frequency.effectsSequence.length !== 0 || this.pointsType.effectsSequence.length !== 0;\n };\n\n function setPoint(outputBezier, point, angle, direction, amplitude, outAmplitude, inAmplitude) {\n var angO = angle - Math.PI / 2;\n var angI = angle + Math.PI / 2;\n var px = point[0] + Math.cos(angle) * direction * amplitude;\n var py = point[1] - Math.sin(angle) * direction * amplitude;\n outputBezier.setTripleAt(px, py, px + Math.cos(angO) * outAmplitude, py - Math.sin(angO) * outAmplitude, px + Math.cos(angI) * inAmplitude, py - Math.sin(angI) * inAmplitude, outputBezier.length());\n }\n\n function getPerpendicularVector(pt1, pt2) {\n var vector = [pt2[0] - pt1[0], pt2[1] - pt1[1]];\n var rot = -Math.PI * 0.5;\n var rotatedVector = [Math.cos(rot) * vector[0] - Math.sin(rot) * vector[1], Math.sin(rot) * vector[0] + Math.cos(rot) * vector[1]];\n return rotatedVector;\n }\n\n function getProjectingAngle(path, cur) {\n var prevIndex = cur === 0 ? path.length() - 1 : cur - 1;\n var nextIndex = (cur + 1) % path.length();\n var prevPoint = path.v[prevIndex];\n var nextPoint = path.v[nextIndex];\n var pVector = getPerpendicularVector(prevPoint, nextPoint);\n return Math.atan2(0, 1) - Math.atan2(pVector[1], pVector[0]);\n }\n\n function zigZagCorner(outputBezier, path, cur, amplitude, frequency, pointType, direction) {\n var angle = getProjectingAngle(path, cur);\n var point = path.v[cur % path._length];\n var prevPoint = path.v[cur === 0 ? path._length - 1 : cur - 1];\n var nextPoint = path.v[(cur + 1) % path._length];\n var prevDist = pointType === 2 ? Math.sqrt(Math.pow(point[0] - prevPoint[0], 2) + Math.pow(point[1] - prevPoint[1], 2)) : 0;\n var nextDist = pointType === 2 ? Math.sqrt(Math.pow(point[0] - nextPoint[0], 2) + Math.pow(point[1] - nextPoint[1], 2)) : 0;\n setPoint(outputBezier, path.v[cur % path._length], angle, direction, amplitude, nextDist / ((frequency + 1) * 2), prevDist / ((frequency + 1) * 2), pointType);\n }\n\n function zigZagSegment(outputBezier, segment, amplitude, frequency, pointType, direction) {\n for (var i = 0; i < frequency; i += 1) {\n var t = (i + 1) / (frequency + 1);\n var dist = pointType === 2 ? Math.sqrt(Math.pow(segment.points[3][0] - segment.points[0][0], 2) + Math.pow(segment.points[3][1] - segment.points[0][1], 2)) : 0;\n var angle = segment.normalAngle(t);\n var point = segment.point(t);\n setPoint(outputBezier, point, angle, direction, amplitude, dist / ((frequency + 1) * 2), dist / ((frequency + 1) * 2), pointType);\n direction = -direction;\n }\n\n return direction;\n }\n\n ZigZagModifier.prototype.processPath = function (path, amplitude, frequency, pointType) {\n var count = path._length;\n var clonedPath = shapePool.newElement();\n clonedPath.c = path.c;\n\n if (!path.c) {\n count -= 1;\n }\n\n if (count === 0) return clonedPath;\n var direction = -1;\n var segment = PolynomialBezier.shapeSegment(path, 0);\n zigZagCorner(clonedPath, path, 0, amplitude, frequency, pointType, direction);\n\n for (var i = 0; i < count; i += 1) {\n direction = zigZagSegment(clonedPath, segment, amplitude, frequency, pointType, -direction);\n\n if (i === count - 1 && !path.c) {\n segment = null;\n } else {\n segment = PolynomialBezier.shapeSegment(path, (i + 1) % count);\n }\n\n zigZagCorner(clonedPath, path, i + 1, amplitude, frequency, pointType, direction);\n }\n\n return clonedPath;\n };\n\n ZigZagModifier.prototype.processShapes = function (_isFirstFrame) {\n var shapePaths;\n var i;\n var len = this.shapes.length;\n var j;\n var jLen;\n var amplitude = this.amplitude.v;\n var frequency = Math.max(0, Math.round(this.frequency.v));\n var pointType = this.pointsType.v;\n\n if (amplitude !== 0) {\n var shapeData;\n var localShapeCollection;\n\n for (i = 0; i < len; i += 1) {\n shapeData = this.shapes[i];\n localShapeCollection = shapeData.localShapeCollection;\n\n if (!(!shapeData.shape._mdf && !this._mdf && !_isFirstFrame)) {\n localShapeCollection.releaseShapes();\n shapeData.shape._mdf = true;\n shapePaths = shapeData.shape.paths.shapes;\n jLen = shapeData.shape.paths._length;\n\n for (j = 0; j < jLen; j += 1) {\n localShapeCollection.addShape(this.processPath(shapePaths[j], amplitude, frequency, pointType));\n }\n }\n\n shapeData.shape.paths = shapeData.localShapeCollection;\n }\n }\n\n if (!this.dynamicProperties.length) {\n this._mdf = false;\n }\n };\n\n function linearOffset(p1, p2, amount) {\n var angle = Math.atan2(p2[0] - p1[0], p2[1] - p1[1]);\n return [polarOffset(p1, angle, amount), polarOffset(p2, angle, amount)];\n }\n\n function offsetSegment(segment, amount) {\n var p0;\n var p1a;\n var p1b;\n var p2b;\n var p2a;\n var p3;\n var e;\n e = linearOffset(segment.points[0], segment.points[1], amount);\n p0 = e[0];\n p1a = e[1];\n e = linearOffset(segment.points[1], segment.points[2], amount);\n p1b = e[0];\n p2b = e[1];\n e = linearOffset(segment.points[2], segment.points[3], amount);\n p2a = e[0];\n p3 = e[1];\n var p1 = lineIntersection(p0, p1a, p1b, p2b);\n if (p1 === null) p1 = p1a;\n var p2 = lineIntersection(p2a, p3, p1b, p2b);\n if (p2 === null) p2 = p2a;\n return new PolynomialBezier(p0, p1, p2, p3);\n }\n\n function joinLines(outputBezier, seg1, seg2, lineJoin, miterLimit) {\n var p0 = seg1.points[3];\n var p1 = seg2.points[0]; // Bevel\n\n if (lineJoin === 3) return p0; // Connected, they don't need a joint\n\n if (pointEqual(p0, p1)) return p0; // Round\n\n if (lineJoin === 2) {\n var angleOut = -seg1.tangentAngle(1);\n var angleIn = -seg2.tangentAngle(0) + Math.PI;\n var center = lineIntersection(p0, polarOffset(p0, angleOut + Math.PI / 2, 100), p1, polarOffset(p1, angleOut + Math.PI / 2, 100));\n var radius = center ? pointDistance(center, p0) : pointDistance(p0, p1) / 2;\n var tan = polarOffset(p0, angleOut, 2 * radius * roundCorner);\n outputBezier.setXYAt(tan[0], tan[1], 'o', outputBezier.length() - 1);\n tan = polarOffset(p1, angleIn, 2 * radius * roundCorner);\n outputBezier.setTripleAt(p1[0], p1[1], p1[0], p1[1], tan[0], tan[1], outputBezier.length());\n return p1;\n } // Miter\n\n\n var t0 = pointEqual(p0, seg1.points[2]) ? seg1.points[0] : seg1.points[2];\n var t1 = pointEqual(p1, seg2.points[1]) ? seg2.points[3] : seg2.points[1];\n var intersection = lineIntersection(t0, p0, p1, t1);\n\n if (intersection && pointDistance(intersection, p0) < miterLimit) {\n outputBezier.setTripleAt(intersection[0], intersection[1], intersection[0], intersection[1], intersection[0], intersection[1], outputBezier.length());\n return intersection;\n }\n\n return p0;\n }\n\n function getIntersection(a, b) {\n var intersect = a.intersections(b);\n if (intersect.length && floatEqual(intersect[0][0], 1)) intersect.shift();\n if (intersect.length) return intersect[0];\n return null;\n }\n\n function pruneSegmentIntersection(a, b) {\n var outa = a.slice();\n var outb = b.slice();\n var intersect = getIntersection(a[a.length - 1], b[0]);\n\n if (intersect) {\n outa[a.length - 1] = a[a.length - 1].split(intersect[0])[0];\n outb[0] = b[0].split(intersect[1])[1];\n }\n\n if (a.length > 1 && b.length > 1) {\n intersect = getIntersection(a[0], b[b.length - 1]);\n\n if (intersect) {\n return [[a[0].split(intersect[0])[0]], [b[b.length - 1].split(intersect[1])[1]]];\n }\n }\n\n return [outa, outb];\n }\n\n function pruneIntersections(segments) {\n var e;\n\n for (var i = 1; i < segments.length; i += 1) {\n e = pruneSegmentIntersection(segments[i - 1], segments[i]);\n segments[i - 1] = e[0];\n segments[i] = e[1];\n }\n\n if (segments.length > 1) {\n e = pruneSegmentIntersection(segments[segments.length - 1], segments[0]);\n segments[segments.length - 1] = e[0];\n segments[0] = e[1];\n }\n\n return segments;\n }\n\n function offsetSegmentSplit(segment, amount) {\n /*\r\n We split each bezier segment into smaller pieces based\r\n on inflection points, this ensures the control point\r\n polygon is convex.\r\n (A cubic bezier can have none, one, or two inflection points)\r\n */\n var flex = segment.inflectionPoints();\n var left;\n var right;\n var split;\n var mid;\n\n if (flex.length === 0) {\n return [offsetSegment(segment, amount)];\n }\n\n if (flex.length === 1 || floatEqual(flex[1], 1)) {\n split = segment.split(flex[0]);\n left = split[0];\n right = split[1];\n return [offsetSegment(left, amount), offsetSegment(right, amount)];\n }\n\n split = segment.split(flex[0]);\n left = split[0];\n var t = (flex[1] - flex[0]) / (1 - flex[0]);\n split = split[1].split(t);\n mid = split[0];\n right = split[1];\n return [offsetSegment(left, amount), offsetSegment(mid, amount), offsetSegment(right, amount)];\n }\n\n function OffsetPathModifier() {}\n\n extendPrototype([ShapeModifier], OffsetPathModifier);\n\n OffsetPathModifier.prototype.initModifierProperties = function (elem, data) {\n this.getValue = this.processKeys;\n this.amount = PropertyFactory.getProp(elem, data.a, 0, null, this);\n this.miterLimit = PropertyFactory.getProp(elem, data.ml, 0, null, this);\n this.lineJoin = data.lj;\n this._isAnimated = this.amount.effectsSequence.length !== 0;\n };\n\n OffsetPathModifier.prototype.processPath = function (inputBezier, amount, lineJoin, miterLimit) {\n var outputBezier = shapePool.newElement();\n outputBezier.c = inputBezier.c;\n var count = inputBezier.length();\n\n if (!inputBezier.c) {\n count -= 1;\n }\n\n var i;\n var j;\n var segment;\n var multiSegments = [];\n\n for (i = 0; i < count; i += 1) {\n segment = PolynomialBezier.shapeSegment(inputBezier, i);\n multiSegments.push(offsetSegmentSplit(segment, amount));\n }\n\n if (!inputBezier.c) {\n for (i = count - 1; i >= 0; i -= 1) {\n segment = PolynomialBezier.shapeSegmentInverted(inputBezier, i);\n multiSegments.push(offsetSegmentSplit(segment, amount));\n }\n }\n\n multiSegments = pruneIntersections(multiSegments); // Add bezier segments to the output and apply line joints\n\n var lastPoint = null;\n var lastSeg = null;\n\n for (i = 0; i < multiSegments.length; i += 1) {\n var multiSegment = multiSegments[i];\n if (lastSeg) lastPoint = joinLines(outputBezier, lastSeg, multiSegment[0], lineJoin, miterLimit);\n lastSeg = multiSegment[multiSegment.length - 1];\n\n for (j = 0; j < multiSegment.length; j += 1) {\n segment = multiSegment[j];\n\n if (lastPoint && pointEqual(segment.points[0], lastPoint)) {\n outputBezier.setXYAt(segment.points[1][0], segment.points[1][1], 'o', outputBezier.length() - 1);\n } else {\n outputBezier.setTripleAt(segment.points[0][0], segment.points[0][1], segment.points[1][0], segment.points[1][1], segment.points[0][0], segment.points[0][1], outputBezier.length());\n }\n\n outputBezier.setTripleAt(segment.points[3][0], segment.points[3][1], segment.points[3][0], segment.points[3][1], segment.points[2][0], segment.points[2][1], outputBezier.length());\n lastPoint = segment.points[3];\n }\n }\n\n if (multiSegments.length) joinLines(outputBezier, lastSeg, multiSegments[0][0], lineJoin, miterLimit);\n return outputBezier;\n };\n\n OffsetPathModifier.prototype.processShapes = function (_isFirstFrame) {\n var shapePaths;\n var i;\n var len = this.shapes.length;\n var j;\n var jLen;\n var amount = this.amount.v;\n var miterLimit = this.miterLimit.v;\n var lineJoin = this.lineJoin;\n\n if (amount !== 0) {\n var shapeData;\n var localShapeCollection;\n\n for (i = 0; i < len; i += 1) {\n shapeData = this.shapes[i];\n localShapeCollection = shapeData.localShapeCollection;\n\n if (!(!shapeData.shape._mdf && !this._mdf && !_isFirstFrame)) {\n localShapeCollection.releaseShapes();\n shapeData.shape._mdf = true;\n shapePaths = shapeData.shape.paths.shapes;\n jLen = shapeData.shape.paths._length;\n\n for (j = 0; j < jLen; j += 1) {\n localShapeCollection.addShape(this.processPath(shapePaths[j], amount, lineJoin, miterLimit));\n }\n }\n\n shapeData.shape.paths = shapeData.localShapeCollection;\n }\n }\n\n if (!this.dynamicProperties.length) {\n this._mdf = false;\n }\n };\n\n function getFontProperties(fontData) {\n var styles = fontData.fStyle ? fontData.fStyle.split(' ') : [];\n var fWeight = 'normal';\n var fStyle = 'normal';\n var len = styles.length;\n var styleName;\n\n for (var i = 0; i < len; i += 1) {\n styleName = styles[i].toLowerCase();\n\n switch (styleName) {\n case 'italic':\n fStyle = 'italic';\n break;\n\n case 'bold':\n fWeight = '700';\n break;\n\n case 'black':\n fWeight = '900';\n break;\n\n case 'medium':\n fWeight = '500';\n break;\n\n case 'regular':\n case 'normal':\n fWeight = '400';\n break;\n\n case 'light':\n case 'thin':\n fWeight = '200';\n break;\n\n default:\n break;\n }\n }\n\n return {\n style: fStyle,\n weight: fontData.fWeight || fWeight\n };\n }\n\n var FontManager = function () {\n var maxWaitingTime = 5000;\n var emptyChar = {\n w: 0,\n size: 0,\n shapes: [],\n data: {\n shapes: []\n }\n };\n var combinedCharacters = []; // Hindi characters\n\n combinedCharacters = combinedCharacters.concat([2304, 2305, 2306, 2307, 2362, 2363, 2364, 2364, 2366, 2367, 2368, 2369, 2370, 2371, 2372, 2373, 2374, 2375, 2376, 2377, 2378, 2379, 2380, 2381, 2382, 2383, 2387, 2388, 2389, 2390, 2391, 2402, 2403]);\n var BLACK_FLAG_CODE_POINT = 127988;\n var CANCEL_TAG_CODE_POINT = 917631;\n var A_TAG_CODE_POINT = 917601;\n var Z_TAG_CODE_POINT = 917626;\n var VARIATION_SELECTOR_16_CODE_POINT = 65039;\n var ZERO_WIDTH_JOINER_CODE_POINT = 8205;\n var REGIONAL_CHARACTER_A_CODE_POINT = 127462;\n var REGIONAL_CHARACTER_Z_CODE_POINT = 127487;\n var surrogateModifiers = ['d83cdffb', 'd83cdffc', 'd83cdffd', 'd83cdffe', 'd83cdfff'];\n\n function trimFontOptions(font) {\n var familyArray = font.split(',');\n var i;\n var len = familyArray.length;\n var enabledFamilies = [];\n\n for (i = 0; i < len; i += 1) {\n if (familyArray[i] !== 'sans-serif' && familyArray[i] !== 'monospace') {\n enabledFamilies.push(familyArray[i]);\n }\n }\n\n return enabledFamilies.join(',');\n }\n\n function setUpNode(font, family) {\n var parentNode = createTag('span'); // Node is invisible to screen readers.\n\n parentNode.setAttribute('aria-hidden', true);\n parentNode.style.fontFamily = family;\n var node = createTag('span'); // Characters that vary significantly among different fonts\n\n node.innerText = 'giItT1WQy@!-/#'; // Visible - so we can measure it - but not on the screen\n\n parentNode.style.position = 'absolute';\n parentNode.style.left = '-10000px';\n parentNode.style.top = '-10000px'; // Large font size makes even subtle changes obvious\n\n parentNode.style.fontSize = '300px'; // Reset any font properties\n\n parentNode.style.fontVariant = 'normal';\n parentNode.style.fontStyle = 'normal';\n parentNode.style.fontWeight = 'normal';\n parentNode.style.letterSpacing = '0';\n parentNode.appendChild(node);\n document.body.appendChild(parentNode); // Remember width with no applied web font\n\n var width = node.offsetWidth;\n node.style.fontFamily = trimFontOptions(font) + ', ' + family;\n return {\n node: node,\n w: width,\n parent: parentNode\n };\n }\n\n function checkLoadedFonts() {\n var i;\n var len = this.fonts.length;\n var node;\n var w;\n var loadedCount = len;\n\n for (i = 0; i < len; i += 1) {\n if (this.fonts[i].loaded) {\n loadedCount -= 1;\n } else if (this.fonts[i].fOrigin === 'n' || this.fonts[i].origin === 0) {\n this.fonts[i].loaded = true;\n } else {\n node = this.fonts[i].monoCase.node;\n w = this.fonts[i].monoCase.w;\n\n if (node.offsetWidth !== w) {\n loadedCount -= 1;\n this.fonts[i].loaded = true;\n } else {\n node = this.fonts[i].sansCase.node;\n w = this.fonts[i].sansCase.w;\n\n if (node.offsetWidth !== w) {\n loadedCount -= 1;\n this.fonts[i].loaded = true;\n }\n }\n\n if (this.fonts[i].loaded) {\n this.fonts[i].sansCase.parent.parentNode.removeChild(this.fonts[i].sansCase.parent);\n this.fonts[i].monoCase.parent.parentNode.removeChild(this.fonts[i].monoCase.parent);\n }\n }\n }\n\n if (loadedCount !== 0 && Date.now() - this.initTime < maxWaitingTime) {\n setTimeout(this.checkLoadedFontsBinded, 20);\n } else {\n setTimeout(this.setIsLoadedBinded, 10);\n }\n }\n\n function createHelper(fontData, def) {\n var engine = document.body && def ? 'svg' : 'canvas';\n var helper;\n var fontProps = getFontProperties(fontData);\n\n if (engine === 'svg') {\n var tHelper = createNS('text');\n tHelper.style.fontSize = '100px'; // tHelper.style.fontFamily = fontData.fFamily;\n\n tHelper.setAttribute('font-family', fontData.fFamily);\n tHelper.setAttribute('font-style', fontProps.style);\n tHelper.setAttribute('font-weight', fontProps.weight);\n tHelper.textContent = '1';\n\n if (fontData.fClass) {\n tHelper.style.fontFamily = 'inherit';\n tHelper.setAttribute('class', fontData.fClass);\n } else {\n tHelper.style.fontFamily = fontData.fFamily;\n }\n\n def.appendChild(tHelper);\n helper = tHelper;\n } else {\n var tCanvasHelper = new OffscreenCanvas(500, 500).getContext('2d');\n tCanvasHelper.font = fontProps.style + ' ' + fontProps.weight + ' 100px ' + fontData.fFamily;\n helper = tCanvasHelper;\n }\n\n function measure(text) {\n if (engine === 'svg') {\n helper.textContent = text;\n return helper.getComputedTextLength();\n }\n\n return helper.measureText(text).width;\n }\n\n return {\n measureText: measure\n };\n }\n\n function addFonts(fontData, defs) {\n if (!fontData) {\n this.isLoaded = true;\n return;\n }\n\n if (this.chars) {\n this.isLoaded = true;\n this.fonts = fontData.list;\n return;\n }\n\n if (!document.body) {\n this.isLoaded = true;\n fontData.list.forEach(function (data) {\n data.helper = createHelper(data);\n data.cache = {};\n });\n this.fonts = fontData.list;\n return;\n }\n\n var fontArr = fontData.list;\n var i;\n var len = fontArr.length;\n var _pendingFonts = len;\n\n for (i = 0; i < len; i += 1) {\n var shouldLoadFont = true;\n var loadedSelector;\n var j;\n fontArr[i].loaded = false;\n fontArr[i].monoCase = setUpNode(fontArr[i].fFamily, 'monospace');\n fontArr[i].sansCase = setUpNode(fontArr[i].fFamily, 'sans-serif');\n\n if (!fontArr[i].fPath) {\n fontArr[i].loaded = true;\n _pendingFonts -= 1;\n } else if (fontArr[i].fOrigin === 'p' || fontArr[i].origin === 3) {\n loadedSelector = document.querySelectorAll('style[f-forigin=\"p\"][f-family=\"' + fontArr[i].fFamily + '\"], style[f-origin=\"3\"][f-family=\"' + fontArr[i].fFamily + '\"]');\n\n if (loadedSelector.length > 0) {\n shouldLoadFont = false;\n }\n\n if (shouldLoadFont) {\n var s = createTag('style');\n s.setAttribute('f-forigin', fontArr[i].fOrigin);\n s.setAttribute('f-origin', fontArr[i].origin);\n s.setAttribute('f-family', fontArr[i].fFamily);\n s.type = 'text/css';\n s.innerText = '@font-face {font-family: ' + fontArr[i].fFamily + \"; font-style: normal; src: url('\" + fontArr[i].fPath + \"');}\";\n defs.appendChild(s);\n }\n } else if (fontArr[i].fOrigin === 'g' || fontArr[i].origin === 1) {\n loadedSelector = document.querySelectorAll('link[f-forigin=\"g\"], link[f-origin=\"1\"]');\n\n for (j = 0; j < loadedSelector.length; j += 1) {\n if (loadedSelector[j].href.indexOf(fontArr[i].fPath) !== -1) {\n // Font is already loaded\n shouldLoadFont = false;\n }\n }\n\n if (shouldLoadFont) {\n var l = createTag('link');\n l.setAttribute('f-forigin', fontArr[i].fOrigin);\n l.setAttribute('f-origin', fontArr[i].origin);\n l.type = 'text/css';\n l.rel = 'stylesheet';\n l.href = fontArr[i].fPath;\n document.body.appendChild(l);\n }\n } else if (fontArr[i].fOrigin === 't' || fontArr[i].origin === 2) {\n loadedSelector = document.querySelectorAll('script[f-forigin=\"t\"], script[f-origin=\"2\"]');\n\n for (j = 0; j < loadedSelector.length; j += 1) {\n if (fontArr[i].fPath === loadedSelector[j].src) {\n // Font is already loaded\n shouldLoadFont = false;\n }\n }\n\n if (shouldLoadFont) {\n var sc = createTag('link');\n sc.setAttribute('f-forigin', fontArr[i].fOrigin);\n sc.setAttribute('f-origin', fontArr[i].origin);\n sc.setAttribute('rel', 'stylesheet');\n sc.setAttribute('href', fontArr[i].fPath);\n defs.appendChild(sc);\n }\n }\n\n fontArr[i].helper = createHelper(fontArr[i], defs);\n fontArr[i].cache = {};\n this.fonts.push(fontArr[i]);\n }\n\n if (_pendingFonts === 0) {\n this.isLoaded = true;\n } else {\n // On some cases even if the font is loaded, it won't load correctly when measuring text on canvas.\n // Adding this timeout seems to fix it\n setTimeout(this.checkLoadedFonts.bind(this), 100);\n }\n }\n\n function addChars(chars) {\n if (!chars) {\n return;\n }\n\n if (!this.chars) {\n this.chars = [];\n }\n\n var i;\n var len = chars.length;\n var j;\n var jLen = this.chars.length;\n var found;\n\n for (i = 0; i < len; i += 1) {\n j = 0;\n found = false;\n\n while (j < jLen) {\n if (this.chars[j].style === chars[i].style && this.chars[j].fFamily === chars[i].fFamily && this.chars[j].ch === chars[i].ch) {\n found = true;\n }\n\n j += 1;\n }\n\n if (!found) {\n this.chars.push(chars[i]);\n jLen += 1;\n }\n }\n }\n\n function getCharData(_char, style, font) {\n var i = 0;\n var len = this.chars.length;\n\n while (i < len) {\n if (this.chars[i].ch === _char && this.chars[i].style === style && this.chars[i].fFamily === font) {\n return this.chars[i];\n }\n\n i += 1;\n }\n\n if ((typeof _char === 'string' && _char.charCodeAt(0) !== 13 || !_char) && console && console.warn // eslint-disable-line no-console\n && !this._warned) {\n this._warned = true;\n console.warn('Missing character from exported characters list: ', _char, style, font); // eslint-disable-line no-console\n }\n\n return emptyChar;\n }\n\n function measureText(_char2, fontName, size) {\n var fontData = this.getFontByName(fontName); // Using the char instead of char.charCodeAt(0)\n // to avoid collisions between equal chars\n\n var index = _char2;\n\n if (!fontData.cache[index]) {\n var tHelper = fontData.helper;\n\n if (_char2 === ' ') {\n var doubleSize = tHelper.measureText('|' + _char2 + '|');\n var singleSize = tHelper.measureText('||');\n fontData.cache[index] = (doubleSize - singleSize) / 100;\n } else {\n fontData.cache[index] = tHelper.measureText(_char2) / 100;\n }\n }\n\n return fontData.cache[index] * size;\n }\n\n function getFontByName(name) {\n var i = 0;\n var len = this.fonts.length;\n\n while (i < len) {\n if (this.fonts[i].fName === name) {\n return this.fonts[i];\n }\n\n i += 1;\n }\n\n return this.fonts[0];\n }\n\n function getCodePoint(string) {\n var codePoint = 0;\n var first = string.charCodeAt(0);\n\n if (first >= 0xD800 && first <= 0xDBFF) {\n var second = string.charCodeAt(1);\n\n if (second >= 0xDC00 && second <= 0xDFFF) {\n codePoint = (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n }\n }\n\n return codePoint;\n } // Skin tone modifiers\n\n\n function isModifier(firstCharCode, secondCharCode) {\n var sum = firstCharCode.toString(16) + secondCharCode.toString(16);\n return surrogateModifiers.indexOf(sum) !== -1;\n }\n\n function isZeroWidthJoiner(charCode) {\n return charCode === ZERO_WIDTH_JOINER_CODE_POINT;\n } // This codepoint may change the appearance of the preceding character.\n // If that is a symbol, dingbat or emoji, U+FE0F forces it to be rendered\n // as a colorful image as compared to a monochrome text variant.\n\n\n function isVariationSelector(charCode) {\n return charCode === VARIATION_SELECTOR_16_CODE_POINT;\n } // The regional indicator symbols are a set of 26 alphabetic Unicode\n /// characters (A–Z) intended to be used to encode ISO 3166-1 alpha-2\n // two-letter country codes in a way that allows optional special treatment.\n\n\n function isRegionalCode(string) {\n var codePoint = getCodePoint(string);\n\n if (codePoint >= REGIONAL_CHARACTER_A_CODE_POINT && codePoint <= REGIONAL_CHARACTER_Z_CODE_POINT) {\n return true;\n }\n\n return false;\n } // Some Emoji implementations represent combinations of\n // two “regional indicator” letters as a single flag symbol.\n\n\n function isFlagEmoji(string) {\n return isRegionalCode(string.substr(0, 2)) && isRegionalCode(string.substr(2, 2));\n }\n\n function isCombinedCharacter(_char3) {\n return combinedCharacters.indexOf(_char3) !== -1;\n } // Regional flags start with a BLACK_FLAG_CODE_POINT\n // folowed by 5 chars in the TAG range\n // and end with a CANCEL_TAG_CODE_POINT\n\n\n function isRegionalFlag(text, index) {\n var codePoint = getCodePoint(text.substr(index, 2));\n\n if (codePoint !== BLACK_FLAG_CODE_POINT) {\n return false;\n }\n\n var count = 0;\n index += 2;\n\n while (count < 5) {\n codePoint = getCodePoint(text.substr(index, 2));\n\n if (codePoint < A_TAG_CODE_POINT || codePoint > Z_TAG_CODE_POINT) {\n return false;\n }\n\n count += 1;\n index += 2;\n }\n\n return getCodePoint(text.substr(index, 2)) === CANCEL_TAG_CODE_POINT;\n }\n\n function setIsLoaded() {\n this.isLoaded = true;\n }\n\n var Font = function Font() {\n this.fonts = [];\n this.chars = null;\n this.typekitLoaded = 0;\n this.isLoaded = false;\n this._warned = false;\n this.initTime = Date.now();\n this.setIsLoadedBinded = this.setIsLoaded.bind(this);\n this.checkLoadedFontsBinded = this.checkLoadedFonts.bind(this);\n };\n\n Font.isModifier = isModifier;\n Font.isZeroWidthJoiner = isZeroWidthJoiner;\n Font.isFlagEmoji = isFlagEmoji;\n Font.isRegionalCode = isRegionalCode;\n Font.isCombinedCharacter = isCombinedCharacter;\n Font.isRegionalFlag = isRegionalFlag;\n Font.isVariationSelector = isVariationSelector;\n Font.BLACK_FLAG_CODE_POINT = BLACK_FLAG_CODE_POINT;\n var fontPrototype = {\n addChars: addChars,\n addFonts: addFonts,\n getCharData: getCharData,\n getFontByName: getFontByName,\n measureText: measureText,\n checkLoadedFonts: checkLoadedFonts,\n setIsLoaded: setIsLoaded\n };\n Font.prototype = fontPrototype;\n return Font;\n }();\n\n function SlotManager(animationData) {\n this.animationData = animationData;\n }\n\n SlotManager.prototype.getProp = function (data) {\n if (this.animationData.slots && this.animationData.slots[data.sid]) {\n return Object.assign(data, this.animationData.slots[data.sid].p);\n }\n\n return data;\n };\n\n function slotFactory(animationData) {\n return new SlotManager(animationData);\n }\n\n function RenderableElement() {}\n\n RenderableElement.prototype = {\n initRenderable: function initRenderable() {\n // layer's visibility related to inpoint and outpoint. Rename isVisible to isInRange\n this.isInRange = false; // layer's display state\n\n this.hidden = false; // If layer's transparency equals 0, it can be hidden\n\n this.isTransparent = false; // list of animated components\n\n this.renderableComponents = [];\n },\n addRenderableComponent: function addRenderableComponent(component) {\n if (this.renderableComponents.indexOf(component) === -1) {\n this.renderableComponents.push(component);\n }\n },\n removeRenderableComponent: function removeRenderableComponent(component) {\n if (this.renderableComponents.indexOf(component) !== -1) {\n this.renderableComponents.splice(this.renderableComponents.indexOf(component), 1);\n }\n },\n prepareRenderableFrame: function prepareRenderableFrame(num) {\n this.checkLayerLimits(num);\n },\n checkTransparency: function checkTransparency() {\n if (this.finalTransform.mProp.o.v <= 0) {\n if (!this.isTransparent && this.globalData.renderConfig.hideOnTransparent) {\n this.isTransparent = true;\n this.hide();\n }\n } else if (this.isTransparent) {\n this.isTransparent = false;\n this.show();\n }\n },\n\n /**\r\n * @function\r\n * Initializes frame related properties.\r\n *\r\n * @param {number} num\r\n * current frame number in Layer's time\r\n *\r\n */\n checkLayerLimits: function checkLayerLimits(num) {\n if (this.data.ip - this.data.st <= num && this.data.op - this.data.st > num) {\n if (this.isInRange !== true) {\n this.globalData._mdf = true;\n this._mdf = true;\n this.isInRange = true;\n this.show();\n }\n } else if (this.isInRange !== false) {\n this.globalData._mdf = true;\n this.isInRange = false;\n this.hide();\n }\n },\n renderRenderable: function renderRenderable() {\n var i;\n var len = this.renderableComponents.length;\n\n for (i = 0; i < len; i += 1) {\n this.renderableComponents[i].renderFrame(this._isFirstFrame);\n }\n /* this.maskManager.renderFrame(this.finalTransform.mat);\r\n this.renderableEffectsManager.renderFrame(this._isFirstFrame); */\n\n },\n sourceRectAtTime: function sourceRectAtTime() {\n return {\n top: 0,\n left: 0,\n width: 100,\n height: 100\n };\n },\n getLayerSize: function getLayerSize() {\n if (this.data.ty === 5) {\n return {\n w: this.data.textData.width,\n h: this.data.textData.height\n };\n }\n\n return {\n w: this.data.width,\n h: this.data.height\n };\n }\n };\n\n var getBlendMode = function () {\n var blendModeEnums = {\n 0: 'source-over',\n 1: 'multiply',\n 2: 'screen',\n 3: 'overlay',\n 4: 'darken',\n 5: 'lighten',\n 6: 'color-dodge',\n 7: 'color-burn',\n 8: 'hard-light',\n 9: 'soft-light',\n 10: 'difference',\n 11: 'exclusion',\n 12: 'hue',\n 13: 'saturation',\n 14: 'color',\n 15: 'luminosity'\n };\n return function (mode) {\n return blendModeEnums[mode] || '';\n };\n }();\n\n function SliderEffect(data, elem, container) {\n this.p = PropertyFactory.getProp(elem, data.v, 0, 0, container);\n }\n\n function AngleEffect(data, elem, container) {\n this.p = PropertyFactory.getProp(elem, data.v, 0, 0, container);\n }\n\n function ColorEffect(data, elem, container) {\n this.p = PropertyFactory.getProp(elem, data.v, 1, 0, container);\n }\n\n function PointEffect(data, elem, container) {\n this.p = PropertyFactory.getProp(elem, data.v, 1, 0, container);\n }\n\n function LayerIndexEffect(data, elem, container) {\n this.p = PropertyFactory.getProp(elem, data.v, 0, 0, container);\n }\n\n function MaskIndexEffect(data, elem, container) {\n this.p = PropertyFactory.getProp(elem, data.v, 0, 0, container);\n }\n\n function CheckboxEffect(data, elem, container) {\n this.p = PropertyFactory.getProp(elem, data.v, 0, 0, container);\n }\n\n function NoValueEffect() {\n this.p = {};\n }\n\n function EffectsManager(data, element) {\n var effects = data.ef || [];\n this.effectElements = [];\n var i;\n var len = effects.length;\n var effectItem;\n\n for (i = 0; i < len; i += 1) {\n effectItem = new GroupEffect(effects[i], element);\n this.effectElements.push(effectItem);\n }\n }\n\n function GroupEffect(data, element) {\n this.init(data, element);\n }\n\n extendPrototype([DynamicPropertyContainer], GroupEffect);\n GroupEffect.prototype.getValue = GroupEffect.prototype.iterateDynamicProperties;\n\n GroupEffect.prototype.init = function (data, element) {\n this.data = data;\n this.effectElements = [];\n this.initDynamicPropertyContainer(element);\n var i;\n var len = this.data.ef.length;\n var eff;\n var effects = this.data.ef;\n\n for (i = 0; i < len; i += 1) {\n eff = null;\n\n switch (effects[i].ty) {\n case 0:\n eff = new SliderEffect(effects[i], element, this);\n break;\n\n case 1:\n eff = new AngleEffect(effects[i], element, this);\n break;\n\n case 2:\n eff = new ColorEffect(effects[i], element, this);\n break;\n\n case 3:\n eff = new PointEffect(effects[i], element, this);\n break;\n\n case 4:\n case 7:\n eff = new CheckboxEffect(effects[i], element, this);\n break;\n\n case 10:\n eff = new LayerIndexEffect(effects[i], element, this);\n break;\n\n case 11:\n eff = new MaskIndexEffect(effects[i], element, this);\n break;\n\n case 5:\n eff = new EffectsManager(effects[i], element, this);\n break;\n // case 6:\n\n default:\n eff = new NoValueEffect(effects[i], element, this);\n break;\n }\n\n if (eff) {\n this.effectElements.push(eff);\n }\n }\n };\n\n function BaseElement() {}\n\n BaseElement.prototype = {\n checkMasks: function checkMasks() {\n if (!this.data.hasMask) {\n return false;\n }\n\n var i = 0;\n var len = this.data.masksProperties.length;\n\n while (i < len) {\n if (this.data.masksProperties[i].mode !== 'n' && this.data.masksProperties[i].cl !== false) {\n return true;\n }\n\n i += 1;\n }\n\n return false;\n },\n initExpressions: function initExpressions() {\n var expressionsInterfaces = getExpressionInterfaces();\n\n if (!expressionsInterfaces) {\n return;\n }\n\n var LayerExpressionInterface = expressionsInterfaces('layer');\n var EffectsExpressionInterface = expressionsInterfaces('effects');\n var ShapeExpressionInterface = expressionsInterfaces('shape');\n var TextExpressionInterface = expressionsInterfaces('text');\n var CompExpressionInterface = expressionsInterfaces('comp');\n this.layerInterface = LayerExpressionInterface(this);\n\n if (this.data.hasMask && this.maskManager) {\n this.layerInterface.registerMaskInterface(this.maskManager);\n }\n\n var effectsInterface = EffectsExpressionInterface.createEffectsInterface(this, this.layerInterface);\n this.layerInterface.registerEffectsInterface(effectsInterface);\n\n if (this.data.ty === 0 || this.data.xt) {\n this.compInterface = CompExpressionInterface(this);\n } else if (this.data.ty === 4) {\n this.layerInterface.shapeInterface = ShapeExpressionInterface(this.shapesData, this.itemsData, this.layerInterface);\n this.layerInterface.content = this.layerInterface.shapeInterface;\n } else if (this.data.ty === 5) {\n this.layerInterface.textInterface = TextExpressionInterface(this);\n this.layerInterface.text = this.layerInterface.textInterface;\n }\n },\n setBlendMode: function setBlendMode() {\n var blendModeValue = getBlendMode(this.data.bm);\n var elem = this.baseElement || this.layerElement;\n elem.style['mix-blend-mode'] = blendModeValue;\n },\n initBaseData: function initBaseData(data, globalData, comp) {\n this.globalData = globalData;\n this.comp = comp;\n this.data = data;\n this.layerId = createElementID(); // Stretch factor for old animations missing this property.\n\n if (!this.data.sr) {\n this.data.sr = 1;\n } // effects manager\n\n\n this.effectsManager = new EffectsManager(this.data, this, this.dynamicProperties);\n },\n getType: function getType() {\n return this.type;\n },\n sourceRectAtTime: function sourceRectAtTime() {}\n };\n\n /**\r\n * @file\r\n * Handles element's layer frame update.\r\n * Checks layer in point and out point\r\n *\r\n */\n function FrameElement() {}\n\n FrameElement.prototype = {\n /**\r\n * @function\r\n * Initializes frame related properties.\r\n *\r\n */\n initFrame: function initFrame() {\n // set to true when inpoint is rendered\n this._isFirstFrame = false; // list of animated properties\n\n this.dynamicProperties = []; // If layer has been modified in current tick this will be true\n\n this._mdf = false;\n },\n\n /**\r\n * @function\r\n * Calculates all dynamic values\r\n *\r\n * @param {number} num\r\n * current frame number in Layer's time\r\n * @param {boolean} isVisible\r\n * if layers is currently in range\r\n *\r\n */\n prepareProperties: function prepareProperties(num, isVisible) {\n var i;\n var len = this.dynamicProperties.length;\n\n for (i = 0; i < len; i += 1) {\n if (isVisible || this._isParent && this.dynamicProperties[i].propType === 'transform') {\n this.dynamicProperties[i].getValue();\n\n if (this.dynamicProperties[i]._mdf) {\n this.globalData._mdf = true;\n this._mdf = true;\n }\n }\n }\n },\n addDynamicProperty: function addDynamicProperty(prop) {\n if (this.dynamicProperties.indexOf(prop) === -1) {\n this.dynamicProperties.push(prop);\n }\n }\n };\n\n function FootageElement(data, globalData, comp) {\n this.initFrame();\n this.initRenderable();\n this.assetData = globalData.getAssetData(data.refId);\n this.footageData = globalData.imageLoader.getAsset(this.assetData);\n this.initBaseData(data, globalData, comp);\n }\n\n FootageElement.prototype.prepareFrame = function () {};\n\n extendPrototype([RenderableElement, BaseElement, FrameElement], FootageElement);\n\n FootageElement.prototype.getBaseElement = function () {\n return null;\n };\n\n FootageElement.prototype.renderFrame = function () {};\n\n FootageElement.prototype.destroy = function () {};\n\n FootageElement.prototype.initExpressions = function () {\n var expressionsInterfaces = getExpressionInterfaces();\n\n if (!expressionsInterfaces) {\n return;\n }\n\n var FootageInterface = expressionsInterfaces('footage');\n this.layerInterface = FootageInterface(this);\n };\n\n FootageElement.prototype.getFootageData = function () {\n return this.footageData;\n };\n\n function AudioElement(data, globalData, comp) {\n this.initFrame();\n this.initRenderable();\n this.assetData = globalData.getAssetData(data.refId);\n this.initBaseData(data, globalData, comp);\n this._isPlaying = false;\n this._canPlay = false;\n var assetPath = this.globalData.getAssetsPath(this.assetData);\n this.audio = this.globalData.audioController.createAudio(assetPath);\n this._currentTime = 0;\n this.globalData.audioController.addAudio(this);\n this._volumeMultiplier = 1;\n this._volume = 1;\n this._previousVolume = null;\n this.tm = data.tm ? PropertyFactory.getProp(this, data.tm, 0, globalData.frameRate, this) : {\n _placeholder: true\n };\n this.lv = PropertyFactory.getProp(this, data.au && data.au.lv ? data.au.lv : {\n k: [100]\n }, 1, 0.01, this);\n }\n\n AudioElement.prototype.prepareFrame = function (num) {\n this.prepareRenderableFrame(num, true);\n this.prepareProperties(num, true);\n\n if (!this.tm._placeholder) {\n var timeRemapped = this.tm.v;\n this._currentTime = timeRemapped;\n } else {\n this._currentTime = num / this.data.sr;\n }\n\n this._volume = this.lv.v[0];\n var totalVolume = this._volume * this._volumeMultiplier;\n\n if (this._previousVolume !== totalVolume) {\n this._previousVolume = totalVolume;\n this.audio.volume(totalVolume);\n }\n };\n\n extendPrototype([RenderableElement, BaseElement, FrameElement], AudioElement);\n\n AudioElement.prototype.renderFrame = function () {\n if (this.isInRange && this._canPlay) {\n if (!this._isPlaying) {\n this.audio.play();\n this.audio.seek(this._currentTime / this.globalData.frameRate);\n this._isPlaying = true;\n } else if (!this.audio.playing() || Math.abs(this._currentTime / this.globalData.frameRate - this.audio.seek()) > 0.1) {\n this.audio.seek(this._currentTime / this.globalData.frameRate);\n }\n }\n };\n\n AudioElement.prototype.show = function () {// this.audio.play()\n };\n\n AudioElement.prototype.hide = function () {\n this.audio.pause();\n this._isPlaying = false;\n };\n\n AudioElement.prototype.pause = function () {\n this.audio.pause();\n this._isPlaying = false;\n this._canPlay = false;\n };\n\n AudioElement.prototype.resume = function () {\n this._canPlay = true;\n };\n\n AudioElement.prototype.setRate = function (rateValue) {\n this.audio.rate(rateValue);\n };\n\n AudioElement.prototype.volume = function (volumeValue) {\n this._volumeMultiplier = volumeValue;\n this._previousVolume = volumeValue * this._volume;\n this.audio.volume(this._previousVolume);\n };\n\n AudioElement.prototype.getBaseElement = function () {\n return null;\n };\n\n AudioElement.prototype.destroy = function () {};\n\n AudioElement.prototype.sourceRectAtTime = function () {};\n\n AudioElement.prototype.initExpressions = function () {};\n\n function BaseRenderer() {}\n\n BaseRenderer.prototype.checkLayers = function (num) {\n var i;\n var len = this.layers.length;\n var data;\n this.completeLayers = true;\n\n for (i = len - 1; i >= 0; i -= 1) {\n if (!this.elements[i]) {\n data = this.layers[i];\n\n if (data.ip - data.st <= num - this.layers[i].st && data.op - data.st > num - this.layers[i].st) {\n this.buildItem(i);\n }\n }\n\n this.completeLayers = this.elements[i] ? this.completeLayers : false;\n }\n\n this.checkPendingElements();\n };\n\n BaseRenderer.prototype.createItem = function (layer) {\n switch (layer.ty) {\n case 2:\n return this.createImage(layer);\n\n case 0:\n return this.createComp(layer);\n\n case 1:\n return this.createSolid(layer);\n\n case 3:\n return this.createNull(layer);\n\n case 4:\n return this.createShape(layer);\n\n case 5:\n return this.createText(layer);\n\n case 6:\n return this.createAudio(layer);\n\n case 13:\n return this.createCamera(layer);\n\n case 15:\n return this.createFootage(layer);\n\n default:\n return this.createNull(layer);\n }\n };\n\n BaseRenderer.prototype.createCamera = function () {\n throw new Error('You\\'re using a 3d camera. Try the html renderer.');\n };\n\n BaseRenderer.prototype.createAudio = function (data) {\n return new AudioElement(data, this.globalData, this);\n };\n\n BaseRenderer.prototype.createFootage = function (data) {\n return new FootageElement(data, this.globalData, this);\n };\n\n BaseRenderer.prototype.buildAllItems = function () {\n var i;\n var len = this.layers.length;\n\n for (i = 0; i < len; i += 1) {\n this.buildItem(i);\n }\n\n this.checkPendingElements();\n };\n\n BaseRenderer.prototype.includeLayers = function (newLayers) {\n this.completeLayers = false;\n var i;\n var len = newLayers.length;\n var j;\n var jLen = this.layers.length;\n\n for (i = 0; i < len; i += 1) {\n j = 0;\n\n while (j < jLen) {\n if (this.layers[j].id === newLayers[i].id) {\n this.layers[j] = newLayers[i];\n break;\n }\n\n j += 1;\n }\n }\n };\n\n BaseRenderer.prototype.setProjectInterface = function (pInterface) {\n this.globalData.projectInterface = pInterface;\n };\n\n BaseRenderer.prototype.initItems = function () {\n if (!this.globalData.progressiveLoad) {\n this.buildAllItems();\n }\n };\n\n BaseRenderer.prototype.buildElementParenting = function (element, parentName, hierarchy) {\n var elements = this.elements;\n var layers = this.layers;\n var i = 0;\n var len = layers.length;\n\n while (i < len) {\n if (layers[i].ind == parentName) {\n // eslint-disable-line eqeqeq\n if (!elements[i] || elements[i] === true) {\n this.buildItem(i);\n this.addPendingElement(element);\n } else {\n hierarchy.push(elements[i]);\n elements[i].setAsParent();\n\n if (layers[i].parent !== undefined) {\n this.buildElementParenting(element, layers[i].parent, hierarchy);\n } else {\n element.setHierarchy(hierarchy);\n }\n }\n }\n\n i += 1;\n }\n };\n\n BaseRenderer.prototype.addPendingElement = function (element) {\n this.pendingElements.push(element);\n };\n\n BaseRenderer.prototype.searchExtraCompositions = function (assets) {\n var i;\n var len = assets.length;\n\n for (i = 0; i < len; i += 1) {\n if (assets[i].xt) {\n var comp = this.createComp(assets[i]);\n comp.initExpressions();\n this.globalData.projectInterface.registerComposition(comp);\n }\n }\n };\n\n BaseRenderer.prototype.getElementById = function (ind) {\n var i;\n var len = this.elements.length;\n\n for (i = 0; i < len; i += 1) {\n if (this.elements[i].data.ind === ind) {\n return this.elements[i];\n }\n }\n\n return null;\n };\n\n BaseRenderer.prototype.getElementByPath = function (path) {\n var pathValue = path.shift();\n var element;\n\n if (typeof pathValue === 'number') {\n element = this.elements[pathValue];\n } else {\n var i;\n var len = this.elements.length;\n\n for (i = 0; i < len; i += 1) {\n if (this.elements[i].data.nm === pathValue) {\n element = this.elements[i];\n break;\n }\n }\n }\n\n if (path.length === 0) {\n return element;\n }\n\n return element.getElementByPath(path);\n };\n\n BaseRenderer.prototype.setupGlobalData = function (animData, fontsContainer) {\n this.globalData.fontManager = new FontManager();\n this.globalData.slotManager = slotFactory(animData);\n this.globalData.fontManager.addChars(animData.chars);\n this.globalData.fontManager.addFonts(animData.fonts, fontsContainer);\n this.globalData.getAssetData = this.animationItem.getAssetData.bind(this.animationItem);\n this.globalData.getAssetsPath = this.animationItem.getAssetsPath.bind(this.animationItem);\n this.globalData.imageLoader = this.animationItem.imagePreloader;\n this.globalData.audioController = this.animationItem.audioController;\n this.globalData.frameId = 0;\n this.globalData.frameRate = animData.fr;\n this.globalData.nm = animData.nm;\n this.globalData.compSize = {\n w: animData.w,\n h: animData.h\n };\n };\n\n var effectTypes = {\n TRANSFORM_EFFECT: 'transformEFfect'\n };\n\n function TransformElement() {}\n\n TransformElement.prototype = {\n initTransform: function initTransform() {\n var mat = new Matrix();\n this.finalTransform = {\n mProp: this.data.ks ? TransformPropertyFactory.getTransformProperty(this, this.data.ks, this) : {\n o: 0\n },\n _matMdf: false,\n _localMatMdf: false,\n _opMdf: false,\n mat: mat,\n localMat: mat,\n localOpacity: 1\n };\n\n if (this.data.ao) {\n this.finalTransform.mProp.autoOriented = true;\n } // TODO: check TYPE 11: Guided elements\n\n\n if (this.data.ty !== 11) {// this.createElements();\n }\n },\n renderTransform: function renderTransform() {\n this.finalTransform._opMdf = this.finalTransform.mProp.o._mdf || this._isFirstFrame;\n this.finalTransform._matMdf = this.finalTransform.mProp._mdf || this._isFirstFrame;\n\n if (this.hierarchy) {\n var mat;\n var finalMat = this.finalTransform.mat;\n var i = 0;\n var len = this.hierarchy.length; // Checking if any of the transformation matrices in the hierarchy chain has changed.\n\n if (!this.finalTransform._matMdf) {\n while (i < len) {\n if (this.hierarchy[i].finalTransform.mProp._mdf) {\n this.finalTransform._matMdf = true;\n break;\n }\n\n i += 1;\n }\n }\n\n if (this.finalTransform._matMdf) {\n mat = this.finalTransform.mProp.v.props;\n finalMat.cloneFromProps(mat);\n\n for (i = 0; i < len; i += 1) {\n finalMat.multiply(this.hierarchy[i].finalTransform.mProp.v);\n }\n }\n }\n\n if (this.finalTransform._matMdf) {\n this.finalTransform._localMatMdf = this.finalTransform._matMdf;\n }\n\n if (this.finalTransform._opMdf) {\n this.finalTransform.localOpacity = this.finalTransform.mProp.o.v;\n }\n },\n renderLocalTransform: function renderLocalTransform() {\n if (this.localTransforms) {\n var i = 0;\n var len = this.localTransforms.length;\n this.finalTransform._localMatMdf = this.finalTransform._matMdf;\n\n if (!this.finalTransform._localMatMdf || !this.finalTransform._opMdf) {\n while (i < len) {\n if (this.localTransforms[i]._mdf) {\n this.finalTransform._localMatMdf = true;\n }\n\n if (this.localTransforms[i]._opMdf && !this.finalTransform._opMdf) {\n this.finalTransform.localOpacity = this.finalTransform.mProp.o.v;\n this.finalTransform._opMdf = true;\n }\n\n i += 1;\n }\n }\n\n if (this.finalTransform._localMatMdf) {\n var localMat = this.finalTransform.localMat;\n this.localTransforms[0].matrix.clone(localMat);\n\n for (i = 1; i < len; i += 1) {\n var lmat = this.localTransforms[i].matrix;\n localMat.multiply(lmat);\n }\n\n localMat.multiply(this.finalTransform.mat);\n }\n\n if (this.finalTransform._opMdf) {\n var localOp = this.finalTransform.localOpacity;\n\n for (i = 0; i < len; i += 1) {\n localOp *= this.localTransforms[i].opacity * 0.01;\n }\n\n this.finalTransform.localOpacity = localOp;\n }\n }\n },\n searchEffectTransforms: function searchEffectTransforms() {\n if (this.renderableEffectsManager) {\n var transformEffects = this.renderableEffectsManager.getEffects(effectTypes.TRANSFORM_EFFECT);\n\n if (transformEffects.length) {\n this.localTransforms = [];\n this.finalTransform.localMat = new Matrix();\n var i = 0;\n var len = transformEffects.length;\n\n for (i = 0; i < len; i += 1) {\n this.localTransforms.push(transformEffects[i]);\n }\n }\n }\n },\n globalToLocal: function globalToLocal(pt) {\n var transforms = [];\n transforms.push(this.finalTransform);\n var flag = true;\n var comp = this.comp;\n\n while (flag) {\n if (comp.finalTransform) {\n if (comp.data.hasMask) {\n transforms.splice(0, 0, comp.finalTransform);\n }\n\n comp = comp.comp;\n } else {\n flag = false;\n }\n }\n\n var i;\n var len = transforms.length;\n var ptNew;\n\n for (i = 0; i < len; i += 1) {\n ptNew = transforms[i].mat.applyToPointArray(0, 0, 0); // ptNew = transforms[i].mat.applyToPointArray(pt[0],pt[1],pt[2]);\n\n pt = [pt[0] - ptNew[0], pt[1] - ptNew[1], 0];\n }\n\n return pt;\n },\n mHelper: new Matrix()\n };\n\n function MaskElement(data, element, globalData) {\n this.data = data;\n this.element = element;\n this.globalData = globalData;\n this.storedData = [];\n this.masksProperties = this.data.masksProperties || [];\n this.maskElement = null;\n var defs = this.globalData.defs;\n var i;\n var len = this.masksProperties ? this.masksProperties.length : 0;\n this.viewData = createSizedArray(len);\n this.solidPath = '';\n var path;\n var properties = this.masksProperties;\n var count = 0;\n var currentMasks = [];\n var j;\n var jLen;\n var layerId = createElementID();\n var rect;\n var expansor;\n var feMorph;\n var x;\n var maskType = 'clipPath';\n var maskRef = 'clip-path';\n\n for (i = 0; i < len; i += 1) {\n if (properties[i].mode !== 'a' && properties[i].mode !== 'n' || properties[i].inv || properties[i].o.k !== 100 || properties[i].o.x) {\n maskType = 'mask';\n maskRef = 'mask';\n }\n\n if ((properties[i].mode === 's' || properties[i].mode === 'i') && count === 0) {\n rect = createNS('rect');\n rect.setAttribute('fill', '#ffffff');\n rect.setAttribute('width', this.element.comp.data.w || 0);\n rect.setAttribute('height', this.element.comp.data.h || 0);\n currentMasks.push(rect);\n } else {\n rect = null;\n }\n\n path = createNS('path');\n\n if (properties[i].mode === 'n') {\n // TODO move this to a factory or to a constructor\n this.viewData[i] = {\n op: PropertyFactory.getProp(this.element, properties[i].o, 0, 0.01, this.element),\n prop: ShapePropertyFactory.getShapeProp(this.element, properties[i], 3),\n elem: path,\n lastPath: ''\n };\n defs.appendChild(path);\n } else {\n count += 1;\n path.setAttribute('fill', properties[i].mode === 's' ? '#000000' : '#ffffff');\n path.setAttribute('clip-rule', 'nonzero');\n var filterID;\n\n if (properties[i].x.k !== 0) {\n maskType = 'mask';\n maskRef = 'mask';\n x = PropertyFactory.getProp(this.element, properties[i].x, 0, null, this.element);\n filterID = createElementID();\n expansor = createNS('filter');\n expansor.setAttribute('id', filterID);\n feMorph = createNS('feMorphology');\n feMorph.setAttribute('operator', 'erode');\n feMorph.setAttribute('in', 'SourceGraphic');\n feMorph.setAttribute('radius', '0');\n expansor.appendChild(feMorph);\n defs.appendChild(expansor);\n path.setAttribute('stroke', properties[i].mode === 's' ? '#000000' : '#ffffff');\n } else {\n feMorph = null;\n x = null;\n } // TODO move this to a factory or to a constructor\n\n\n this.storedData[i] = {\n elem: path,\n x: x,\n expan: feMorph,\n lastPath: '',\n lastOperator: '',\n filterId: filterID,\n lastRadius: 0\n };\n\n if (properties[i].mode === 'i') {\n jLen = currentMasks.length;\n var g = createNS('g');\n\n for (j = 0; j < jLen; j += 1) {\n g.appendChild(currentMasks[j]);\n }\n\n var mask = createNS('mask');\n mask.setAttribute('mask-type', 'alpha');\n mask.setAttribute('id', layerId + '_' + count);\n mask.appendChild(path);\n defs.appendChild(mask);\n g.setAttribute('mask', 'url(' + getLocationHref() + '#' + layerId + '_' + count + ')');\n currentMasks.length = 0;\n currentMasks.push(g);\n } else {\n currentMasks.push(path);\n }\n\n if (properties[i].inv && !this.solidPath) {\n this.solidPath = this.createLayerSolidPath();\n } // TODO move this to a factory or to a constructor\n\n\n this.viewData[i] = {\n elem: path,\n lastPath: '',\n op: PropertyFactory.getProp(this.element, properties[i].o, 0, 0.01, this.element),\n prop: ShapePropertyFactory.getShapeProp(this.element, properties[i], 3),\n invRect: rect\n };\n\n if (!this.viewData[i].prop.k) {\n this.drawPath(properties[i], this.viewData[i].prop.v, this.viewData[i]);\n }\n }\n }\n\n this.maskElement = createNS(maskType);\n len = currentMasks.length;\n\n for (i = 0; i < len; i += 1) {\n this.maskElement.appendChild(currentMasks[i]);\n }\n\n if (count > 0) {\n this.maskElement.setAttribute('id', layerId);\n this.element.maskedElement.setAttribute(maskRef, 'url(' + getLocationHref() + '#' + layerId + ')');\n defs.appendChild(this.maskElement);\n }\n\n if (this.viewData.length) {\n this.element.addRenderableComponent(this);\n }\n }\n\n MaskElement.prototype.getMaskProperty = function (pos) {\n return this.viewData[pos].prop;\n };\n\n MaskElement.prototype.renderFrame = function (isFirstFrame) {\n var finalMat = this.element.finalTransform.mat;\n var i;\n var len = this.masksProperties.length;\n\n for (i = 0; i < len; i += 1) {\n if (this.viewData[i].prop._mdf || isFirstFrame) {\n this.drawPath(this.masksProperties[i], this.viewData[i].prop.v, this.viewData[i]);\n }\n\n if (this.viewData[i].op._mdf || isFirstFrame) {\n this.viewData[i].elem.setAttribute('fill-opacity', this.viewData[i].op.v);\n }\n\n if (this.masksProperties[i].mode !== 'n') {\n if (this.viewData[i].invRect && (this.element.finalTransform.mProp._mdf || isFirstFrame)) {\n this.viewData[i].invRect.setAttribute('transform', finalMat.getInverseMatrix().to2dCSS());\n }\n\n if (this.storedData[i].x && (this.storedData[i].x._mdf || isFirstFrame)) {\n var feMorph = this.storedData[i].expan;\n\n if (this.storedData[i].x.v < 0) {\n if (this.storedData[i].lastOperator !== 'erode') {\n this.storedData[i].lastOperator = 'erode';\n this.storedData[i].elem.setAttribute('filter', 'url(' + getLocationHref() + '#' + this.storedData[i].filterId + ')');\n }\n\n feMorph.setAttribute('radius', -this.storedData[i].x.v);\n } else {\n if (this.storedData[i].lastOperator !== 'dilate') {\n this.storedData[i].lastOperator = 'dilate';\n this.storedData[i].elem.setAttribute('filter', null);\n }\n\n this.storedData[i].elem.setAttribute('stroke-width', this.storedData[i].x.v * 2);\n }\n }\n }\n }\n };\n\n MaskElement.prototype.getMaskelement = function () {\n return this.maskElement;\n };\n\n MaskElement.prototype.createLayerSolidPath = function () {\n var path = 'M0,0 ';\n path += ' h' + this.globalData.compSize.w;\n path += ' v' + this.globalData.compSize.h;\n path += ' h-' + this.globalData.compSize.w;\n path += ' v-' + this.globalData.compSize.h + ' ';\n return path;\n };\n\n MaskElement.prototype.drawPath = function (pathData, pathNodes, viewData) {\n var pathString = ' M' + pathNodes.v[0][0] + ',' + pathNodes.v[0][1];\n var i;\n var len;\n len = pathNodes._length;\n\n for (i = 1; i < len; i += 1) {\n // pathString += \" C\"+pathNodes.o[i-1][0]+','+pathNodes.o[i-1][1] + \" \"+pathNodes.i[i][0]+','+pathNodes.i[i][1] + \" \"+pathNodes.v[i][0]+','+pathNodes.v[i][1];\n pathString += ' C' + pathNodes.o[i - 1][0] + ',' + pathNodes.o[i - 1][1] + ' ' + pathNodes.i[i][0] + ',' + pathNodes.i[i][1] + ' ' + pathNodes.v[i][0] + ',' + pathNodes.v[i][1];\n } // pathString += \" C\"+pathNodes.o[i-1][0]+','+pathNodes.o[i-1][1] + \" \"+pathNodes.i[0][0]+','+pathNodes.i[0][1] + \" \"+pathNodes.v[0][0]+','+pathNodes.v[0][1];\n\n\n if (pathNodes.c && len > 1) {\n pathString += ' C' + pathNodes.o[i - 1][0] + ',' + pathNodes.o[i - 1][1] + ' ' + pathNodes.i[0][0] + ',' + pathNodes.i[0][1] + ' ' + pathNodes.v[0][0] + ',' + pathNodes.v[0][1];\n } // pathNodes.__renderedString = pathString;\n\n\n if (viewData.lastPath !== pathString) {\n var pathShapeValue = '';\n\n if (viewData.elem) {\n if (pathNodes.c) {\n pathShapeValue = pathData.inv ? this.solidPath + pathString : pathString;\n }\n\n viewData.elem.setAttribute('d', pathShapeValue);\n }\n\n viewData.lastPath = pathString;\n }\n };\n\n MaskElement.prototype.destroy = function () {\n this.element = null;\n this.globalData = null;\n this.maskElement = null;\n this.data = null;\n this.masksProperties = null;\n };\n\n var filtersFactory = function () {\n var ob = {};\n ob.createFilter = createFilter;\n ob.createAlphaToLuminanceFilter = createAlphaToLuminanceFilter;\n\n function createFilter(filId, skipCoordinates) {\n var fil = createNS('filter');\n fil.setAttribute('id', filId);\n\n if (skipCoordinates !== true) {\n fil.setAttribute('filterUnits', 'objectBoundingBox');\n fil.setAttribute('x', '0%');\n fil.setAttribute('y', '0%');\n fil.setAttribute('width', '100%');\n fil.setAttribute('height', '100%');\n }\n\n return fil;\n }\n\n function createAlphaToLuminanceFilter() {\n var feColorMatrix = createNS('feColorMatrix');\n feColorMatrix.setAttribute('type', 'matrix');\n feColorMatrix.setAttribute('color-interpolation-filters', 'sRGB');\n feColorMatrix.setAttribute('values', '0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1');\n return feColorMatrix;\n }\n\n return ob;\n }();\n\n var featureSupport = function () {\n var ob = {\n maskType: true,\n svgLumaHidden: true,\n offscreenCanvas: typeof OffscreenCanvas !== 'undefined'\n };\n\n if (/MSIE 10/i.test(navigator.userAgent) || /MSIE 9/i.test(navigator.userAgent) || /rv:11.0/i.test(navigator.userAgent) || /Edge\\/\\d./i.test(navigator.userAgent)) {\n ob.maskType = false;\n }\n\n if (/firefox/i.test(navigator.userAgent)) {\n ob.svgLumaHidden = false;\n }\n\n return ob;\n }();\n\n var registeredEffects$1 = {};\n var idPrefix = 'filter_result_';\n\n function SVGEffects(elem) {\n var i;\n var source = 'SourceGraphic';\n var len = elem.data.ef ? elem.data.ef.length : 0;\n var filId = createElementID();\n var fil = filtersFactory.createFilter(filId, true);\n var count = 0;\n this.filters = [];\n var filterManager;\n\n for (i = 0; i < len; i += 1) {\n filterManager = null;\n var type = elem.data.ef[i].ty;\n\n if (registeredEffects$1[type]) {\n var Effect = registeredEffects$1[type].effect;\n filterManager = new Effect(fil, elem.effectsManager.effectElements[i], elem, idPrefix + count, source);\n source = idPrefix + count;\n\n if (registeredEffects$1[type].countsAsEffect) {\n count += 1;\n }\n }\n\n if (filterManager) {\n this.filters.push(filterManager);\n }\n }\n\n if (count) {\n elem.globalData.defs.appendChild(fil);\n elem.layerElement.setAttribute('filter', 'url(' + getLocationHref() + '#' + filId + ')');\n }\n\n if (this.filters.length) {\n elem.addRenderableComponent(this);\n }\n }\n\n SVGEffects.prototype.renderFrame = function (_isFirstFrame) {\n var i;\n var len = this.filters.length;\n\n for (i = 0; i < len; i += 1) {\n this.filters[i].renderFrame(_isFirstFrame);\n }\n };\n\n SVGEffects.prototype.getEffects = function (type) {\n var i;\n var len = this.filters.length;\n var effects = [];\n\n for (i = 0; i < len; i += 1) {\n if (this.filters[i].type === type) {\n effects.push(this.filters[i]);\n }\n }\n\n return effects;\n };\n\n function registerEffect$1(id, effect, countsAsEffect) {\n registeredEffects$1[id] = {\n effect: effect,\n countsAsEffect: countsAsEffect\n };\n }\n\n function SVGBaseElement() {}\n\n SVGBaseElement.prototype = {\n initRendererElement: function initRendererElement() {\n this.layerElement = createNS('g');\n },\n createContainerElements: function createContainerElements() {\n this.matteElement = createNS('g');\n this.transformedElement = this.layerElement;\n this.maskedElement = this.layerElement;\n this._sizeChanged = false;\n var layerElementParent = null; // If this layer acts as a mask for the following layer\n\n if (this.data.td) {\n this.matteMasks = {};\n var gg = createNS('g');\n gg.setAttribute('id', this.layerId);\n gg.appendChild(this.layerElement);\n layerElementParent = gg;\n this.globalData.defs.appendChild(gg);\n } else if (this.data.tt) {\n this.matteElement.appendChild(this.layerElement);\n layerElementParent = this.matteElement;\n this.baseElement = this.matteElement;\n } else {\n this.baseElement = this.layerElement;\n }\n\n if (this.data.ln) {\n this.layerElement.setAttribute('id', this.data.ln);\n }\n\n if (this.data.cl) {\n this.layerElement.setAttribute('class', this.data.cl);\n } // Clipping compositions to hide content that exceeds boundaries. If collapsed transformations is on, component should not be clipped\n\n\n if (this.data.ty === 0 && !this.data.hd) {\n var cp = createNS('clipPath');\n var pt = createNS('path');\n pt.setAttribute('d', 'M0,0 L' + this.data.w + ',0 L' + this.data.w + ',' + this.data.h + ' L0,' + this.data.h + 'z');\n var clipId = createElementID();\n cp.setAttribute('id', clipId);\n cp.appendChild(pt);\n this.globalData.defs.appendChild(cp);\n\n if (this.checkMasks()) {\n var cpGroup = createNS('g');\n cpGroup.setAttribute('clip-path', 'url(' + getLocationHref() + '#' + clipId + ')');\n cpGroup.appendChild(this.layerElement);\n this.transformedElement = cpGroup;\n\n if (layerElementParent) {\n layerElementParent.appendChild(this.transformedElement);\n } else {\n this.baseElement = this.transformedElement;\n }\n } else {\n this.layerElement.setAttribute('clip-path', 'url(' + getLocationHref() + '#' + clipId + ')');\n }\n }\n\n if (this.data.bm !== 0) {\n this.setBlendMode();\n }\n },\n renderElement: function renderElement() {\n if (this.finalTransform._localMatMdf) {\n this.transformedElement.setAttribute('transform', this.finalTransform.localMat.to2dCSS());\n }\n\n if (this.finalTransform._opMdf) {\n this.transformedElement.setAttribute('opacity', this.finalTransform.localOpacity);\n }\n },\n destroyBaseElement: function destroyBaseElement() {\n this.layerElement = null;\n this.matteElement = null;\n this.maskManager.destroy();\n },\n getBaseElement: function getBaseElement() {\n if (this.data.hd) {\n return null;\n }\n\n return this.baseElement;\n },\n createRenderableComponents: function createRenderableComponents() {\n this.maskManager = new MaskElement(this.data, this, this.globalData);\n this.renderableEffectsManager = new SVGEffects(this);\n this.searchEffectTransforms();\n },\n getMatte: function getMatte(matteType) {\n // This should not be a common case. But for backward compatibility, we'll create the matte object.\n // It solves animations that have two consecutive layers marked as matte masks.\n // Which is an undefined behavior in AE.\n if (!this.matteMasks) {\n this.matteMasks = {};\n }\n\n if (!this.matteMasks[matteType]) {\n var id = this.layerId + '_' + matteType;\n var filId;\n var fil;\n var useElement;\n var gg;\n\n if (matteType === 1 || matteType === 3) {\n var masker = createNS('mask');\n masker.setAttribute('id', id);\n masker.setAttribute('mask-type', matteType === 3 ? 'luminance' : 'alpha');\n useElement = createNS('use');\n useElement.setAttributeNS('http://www.w3.org/1999/xlink', 'href', '#' + this.layerId);\n masker.appendChild(useElement);\n this.globalData.defs.appendChild(masker);\n\n if (!featureSupport.maskType && matteType === 1) {\n masker.setAttribute('mask-type', 'luminance');\n filId = createElementID();\n fil = filtersFactory.createFilter(filId);\n this.globalData.defs.appendChild(fil);\n fil.appendChild(filtersFactory.createAlphaToLuminanceFilter());\n gg = createNS('g');\n gg.appendChild(useElement);\n masker.appendChild(gg);\n gg.setAttribute('filter', 'url(' + getLocationHref() + '#' + filId + ')');\n }\n } else if (matteType === 2) {\n var maskGroup = createNS('mask');\n maskGroup.setAttribute('id', id);\n maskGroup.setAttribute('mask-type', 'alpha');\n var maskGrouper = createNS('g');\n maskGroup.appendChild(maskGrouper);\n filId = createElementID();\n fil = filtersFactory.createFilter(filId); /// /\n\n var feCTr = createNS('feComponentTransfer');\n feCTr.setAttribute('in', 'SourceGraphic');\n fil.appendChild(feCTr);\n var feFunc = createNS('feFuncA');\n feFunc.setAttribute('type', 'table');\n feFunc.setAttribute('tableValues', '1.0 0.0');\n feCTr.appendChild(feFunc); /// /\n\n this.globalData.defs.appendChild(fil);\n var alphaRect = createNS('rect');\n alphaRect.setAttribute('width', this.comp.data.w);\n alphaRect.setAttribute('height', this.comp.data.h);\n alphaRect.setAttribute('x', '0');\n alphaRect.setAttribute('y', '0');\n alphaRect.setAttribute('fill', '#ffffff');\n alphaRect.setAttribute('opacity', '0');\n maskGrouper.setAttribute('filter', 'url(' + getLocationHref() + '#' + filId + ')');\n maskGrouper.appendChild(alphaRect);\n useElement = createNS('use');\n useElement.setAttributeNS('http://www.w3.org/1999/xlink', 'href', '#' + this.layerId);\n maskGrouper.appendChild(useElement);\n\n if (!featureSupport.maskType) {\n maskGroup.setAttribute('mask-type', 'luminance');\n fil.appendChild(filtersFactory.createAlphaToLuminanceFilter());\n gg = createNS('g');\n maskGrouper.appendChild(alphaRect);\n gg.appendChild(this.layerElement);\n maskGrouper.appendChild(gg);\n }\n\n this.globalData.defs.appendChild(maskGroup);\n }\n\n this.matteMasks[matteType] = id;\n }\n\n return this.matteMasks[matteType];\n },\n setMatte: function setMatte(id) {\n if (!this.matteElement) {\n return;\n }\n\n this.matteElement.setAttribute('mask', 'url(' + getLocationHref() + '#' + id + ')');\n }\n };\n\n /**\r\n * @file\r\n * Handles AE's layer parenting property.\r\n *\r\n */\n function HierarchyElement() {}\n\n HierarchyElement.prototype = {\n /**\r\n * @function\r\n * Initializes hierarchy properties\r\n *\r\n */\n initHierarchy: function initHierarchy() {\n // element's parent list\n this.hierarchy = []; // if element is parent of another layer _isParent will be true\n\n this._isParent = false;\n this.checkParenting();\n },\n\n /**\r\n * @function\r\n * Sets layer's hierarchy.\r\n * @param {array} hierarch\r\n * layer's parent list\r\n *\r\n */\n setHierarchy: function setHierarchy(hierarchy) {\n this.hierarchy = hierarchy;\n },\n\n /**\r\n * @function\r\n * Sets layer as parent.\r\n *\r\n */\n setAsParent: function setAsParent() {\n this._isParent = true;\n },\n\n /**\r\n * @function\r\n * Searches layer's parenting chain\r\n *\r\n */\n checkParenting: function checkParenting() {\n if (this.data.parent !== undefined) {\n this.comp.buildElementParenting(this, this.data.parent, []);\n }\n }\n };\n\n function RenderableDOMElement() {}\n\n (function () {\n var _prototype = {\n initElement: function initElement(data, globalData, comp) {\n this.initFrame();\n this.initBaseData(data, globalData, comp);\n this.initTransform(data, globalData, comp);\n this.initHierarchy();\n this.initRenderable();\n this.initRendererElement();\n this.createContainerElements();\n this.createRenderableComponents();\n this.createContent();\n this.hide();\n },\n hide: function hide() {\n // console.log('HIDE', this);\n if (!this.hidden && (!this.isInRange || this.isTransparent)) {\n var elem = this.baseElement || this.layerElement;\n elem.style.display = 'none';\n this.hidden = true;\n }\n },\n show: function show() {\n // console.log('SHOW', this);\n if (this.isInRange && !this.isTransparent) {\n if (!this.data.hd) {\n var elem = this.baseElement || this.layerElement;\n elem.style.display = 'block';\n }\n\n this.hidden = false;\n this._isFirstFrame = true;\n }\n },\n renderFrame: function renderFrame() {\n // If it is exported as hidden (data.hd === true) no need to render\n // If it is not visible no need to render\n if (this.data.hd || this.hidden) {\n return;\n }\n\n this.renderTransform();\n this.renderRenderable();\n this.renderLocalTransform();\n this.renderElement();\n this.renderInnerContent();\n\n if (this._isFirstFrame) {\n this._isFirstFrame = false;\n }\n },\n renderInnerContent: function renderInnerContent() {},\n prepareFrame: function prepareFrame(num) {\n this._mdf = false;\n this.prepareRenderableFrame(num);\n this.prepareProperties(num, this.isInRange);\n this.checkTransparency();\n },\n destroy: function destroy() {\n this.innerElem = null;\n this.destroyBaseElement();\n }\n };\n extendPrototype([RenderableElement, createProxyFunction(_prototype)], RenderableDOMElement);\n })();\n\n function IImageElement(data, globalData, comp) {\n this.assetData = globalData.getAssetData(data.refId);\n\n if (this.assetData && this.assetData.sid) {\n this.assetData = globalData.slotManager.getProp(this.assetData);\n }\n\n this.initElement(data, globalData, comp);\n this.sourceRect = {\n top: 0,\n left: 0,\n width: this.assetData.w,\n height: this.assetData.h\n };\n }\n\n extendPrototype([BaseElement, TransformElement, SVGBaseElement, HierarchyElement, FrameElement, RenderableDOMElement], IImageElement);\n\n IImageElement.prototype.createContent = function () {\n var assetPath = this.globalData.getAssetsPath(this.assetData);\n this.innerElem = createNS('image');\n this.innerElem.setAttribute('width', this.assetData.w + 'px');\n this.innerElem.setAttribute('height', this.assetData.h + 'px');\n this.innerElem.setAttribute('preserveAspectRatio', this.assetData.pr || this.globalData.renderConfig.imagePreserveAspectRatio);\n this.innerElem.setAttributeNS('http://www.w3.org/1999/xlink', 'href', assetPath);\n this.layerElement.appendChild(this.innerElem);\n };\n\n IImageElement.prototype.sourceRectAtTime = function () {\n return this.sourceRect;\n };\n\n function ProcessedElement(element, position) {\n this.elem = element;\n this.pos = position;\n }\n\n function IShapeElement() {}\n\n IShapeElement.prototype = {\n addShapeToModifiers: function addShapeToModifiers(data) {\n var i;\n var len = this.shapeModifiers.length;\n\n for (i = 0; i < len; i += 1) {\n this.shapeModifiers[i].addShape(data);\n }\n },\n isShapeInAnimatedModifiers: function isShapeInAnimatedModifiers(data) {\n var i = 0;\n var len = this.shapeModifiers.length;\n\n while (i < len) {\n if (this.shapeModifiers[i].isAnimatedWithShape(data)) {\n return true;\n }\n }\n\n return false;\n },\n renderModifiers: function renderModifiers() {\n if (!this.shapeModifiers.length) {\n return;\n }\n\n var i;\n var len = this.shapes.length;\n\n for (i = 0; i < len; i += 1) {\n this.shapes[i].sh.reset();\n }\n\n len = this.shapeModifiers.length;\n var shouldBreakProcess;\n\n for (i = len - 1; i >= 0; i -= 1) {\n shouldBreakProcess = this.shapeModifiers[i].processShapes(this._isFirstFrame); // workaround to fix cases where a repeater resets the shape so the following processes get called twice\n // TODO: find a better solution for this\n\n if (shouldBreakProcess) {\n break;\n }\n }\n },\n searchProcessedElement: function searchProcessedElement(elem) {\n var elements = this.processedElements;\n var i = 0;\n var len = elements.length;\n\n while (i < len) {\n if (elements[i].elem === elem) {\n return elements[i].pos;\n }\n\n i += 1;\n }\n\n return 0;\n },\n addProcessedElement: function addProcessedElement(elem, pos) {\n var elements = this.processedElements;\n var i = elements.length;\n\n while (i) {\n i -= 1;\n\n if (elements[i].elem === elem) {\n elements[i].pos = pos;\n return;\n }\n }\n\n elements.push(new ProcessedElement(elem, pos));\n },\n prepareFrame: function prepareFrame(num) {\n this.prepareRenderableFrame(num);\n this.prepareProperties(num, this.isInRange);\n }\n };\n\n var lineCapEnum = {\n 1: 'butt',\n 2: 'round',\n 3: 'square'\n };\n var lineJoinEnum = {\n 1: 'miter',\n 2: 'round',\n 3: 'bevel'\n };\n\n function SVGShapeData(transformers, level, shape) {\n this.caches = [];\n this.styles = [];\n this.transformers = transformers;\n this.lStr = '';\n this.sh = shape;\n this.lvl = level; // TODO find if there are some cases where _isAnimated can be false.\n // For now, since shapes add up with other shapes. They have to be calculated every time.\n // One way of finding out is checking if all styles associated to this shape depend only of this shape\n\n this._isAnimated = !!shape.k; // TODO: commenting this for now since all shapes are animated\n\n var i = 0;\n var len = transformers.length;\n\n while (i < len) {\n if (transformers[i].mProps.dynamicProperties.length) {\n this._isAnimated = true;\n break;\n }\n\n i += 1;\n }\n }\n\n SVGShapeData.prototype.setAsAnimated = function () {\n this._isAnimated = true;\n };\n\n function SVGStyleData(data, level) {\n this.data = data;\n this.type = data.ty;\n this.d = '';\n this.lvl = level;\n this._mdf = false;\n this.closed = data.hd === true;\n this.pElem = createNS('path');\n this.msElem = null;\n }\n\n SVGStyleData.prototype.reset = function () {\n this.d = '';\n this._mdf = false;\n };\n\n function DashProperty(elem, data, renderer, container) {\n this.elem = elem;\n this.frameId = -1;\n this.dataProps = createSizedArray(data.length);\n this.renderer = renderer;\n this.k = false;\n this.dashStr = '';\n this.dashArray = createTypedArray('float32', data.length ? data.length - 1 : 0);\n this.dashoffset = createTypedArray('float32', 1);\n this.initDynamicPropertyContainer(container);\n var i;\n var len = data.length || 0;\n var prop;\n\n for (i = 0; i < len; i += 1) {\n prop = PropertyFactory.getProp(elem, data[i].v, 0, 0, this);\n this.k = prop.k || this.k;\n this.dataProps[i] = {\n n: data[i].n,\n p: prop\n };\n }\n\n if (!this.k) {\n this.getValue(true);\n }\n\n this._isAnimated = this.k;\n }\n\n DashProperty.prototype.getValue = function (forceRender) {\n if (this.elem.globalData.frameId === this.frameId && !forceRender) {\n return;\n }\n\n this.frameId = this.elem.globalData.frameId;\n this.iterateDynamicProperties();\n this._mdf = this._mdf || forceRender;\n\n if (this._mdf) {\n var i = 0;\n var len = this.dataProps.length;\n\n if (this.renderer === 'svg') {\n this.dashStr = '';\n }\n\n for (i = 0; i < len; i += 1) {\n if (this.dataProps[i].n !== 'o') {\n if (this.renderer === 'svg') {\n this.dashStr += ' ' + this.dataProps[i].p.v;\n } else {\n this.dashArray[i] = this.dataProps[i].p.v;\n }\n } else {\n this.dashoffset[0] = this.dataProps[i].p.v;\n }\n }\n }\n };\n\n extendPrototype([DynamicPropertyContainer], DashProperty);\n\n function SVGStrokeStyleData(elem, data, styleOb) {\n this.initDynamicPropertyContainer(elem);\n this.getValue = this.iterateDynamicProperties;\n this.o = PropertyFactory.getProp(elem, data.o, 0, 0.01, this);\n this.w = PropertyFactory.getProp(elem, data.w, 0, null, this);\n this.d = new DashProperty(elem, data.d || {}, 'svg', this);\n this.c = PropertyFactory.getProp(elem, data.c, 1, 255, this);\n this.style = styleOb;\n this._isAnimated = !!this._isAnimated;\n }\n\n extendPrototype([DynamicPropertyContainer], SVGStrokeStyleData);\n\n function SVGFillStyleData(elem, data, styleOb) {\n this.initDynamicPropertyContainer(elem);\n this.getValue = this.iterateDynamicProperties;\n this.o = PropertyFactory.getProp(elem, data.o, 0, 0.01, this);\n this.c = PropertyFactory.getProp(elem, data.c, 1, 255, this);\n this.style = styleOb;\n }\n\n extendPrototype([DynamicPropertyContainer], SVGFillStyleData);\n\n function SVGNoStyleData(elem, data, styleOb) {\n this.initDynamicPropertyContainer(elem);\n this.getValue = this.iterateDynamicProperties;\n this.style = styleOb;\n }\n\n extendPrototype([DynamicPropertyContainer], SVGNoStyleData);\n\n function GradientProperty(elem, data, container) {\n this.data = data;\n this.c = createTypedArray('uint8c', data.p * 4);\n var cLength = data.k.k[0].s ? data.k.k[0].s.length - data.p * 4 : data.k.k.length - data.p * 4;\n this.o = createTypedArray('float32', cLength);\n this._cmdf = false;\n this._omdf = false;\n this._collapsable = this.checkCollapsable();\n this._hasOpacity = cLength;\n this.initDynamicPropertyContainer(container);\n this.prop = PropertyFactory.getProp(elem, data.k, 1, null, this);\n this.k = this.prop.k;\n this.getValue(true);\n }\n\n GradientProperty.prototype.comparePoints = function (values, points) {\n var i = 0;\n var len = this.o.length / 2;\n var diff;\n\n while (i < len) {\n diff = Math.abs(values[i * 4] - values[points * 4 + i * 2]);\n\n if (diff > 0.01) {\n return false;\n }\n\n i += 1;\n }\n\n return true;\n };\n\n GradientProperty.prototype.checkCollapsable = function () {\n if (this.o.length / 2 !== this.c.length / 4) {\n return false;\n }\n\n if (this.data.k.k[0].s) {\n var i = 0;\n var len = this.data.k.k.length;\n\n while (i < len) {\n if (!this.comparePoints(this.data.k.k[i].s, this.data.p)) {\n return false;\n }\n\n i += 1;\n }\n } else if (!this.comparePoints(this.data.k.k, this.data.p)) {\n return false;\n }\n\n return true;\n };\n\n GradientProperty.prototype.getValue = function (forceRender) {\n this.prop.getValue();\n this._mdf = false;\n this._cmdf = false;\n this._omdf = false;\n\n if (this.prop._mdf || forceRender) {\n var i;\n var len = this.data.p * 4;\n var mult;\n var val;\n\n for (i = 0; i < len; i += 1) {\n mult = i % 4 === 0 ? 100 : 255;\n val = Math.round(this.prop.v[i] * mult);\n\n if (this.c[i] !== val) {\n this.c[i] = val;\n this._cmdf = !forceRender;\n }\n }\n\n if (this.o.length) {\n len = this.prop.v.length;\n\n for (i = this.data.p * 4; i < len; i += 1) {\n mult = i % 2 === 0 ? 100 : 1;\n val = i % 2 === 0 ? Math.round(this.prop.v[i] * 100) : this.prop.v[i];\n\n if (this.o[i - this.data.p * 4] !== val) {\n this.o[i - this.data.p * 4] = val;\n this._omdf = !forceRender;\n }\n }\n }\n\n this._mdf = !forceRender;\n }\n };\n\n extendPrototype([DynamicPropertyContainer], GradientProperty);\n\n function SVGGradientFillStyleData(elem, data, styleOb) {\n this.initDynamicPropertyContainer(elem);\n this.getValue = this.iterateDynamicProperties;\n this.initGradientData(elem, data, styleOb);\n }\n\n SVGGradientFillStyleData.prototype.initGradientData = function (elem, data, styleOb) {\n this.o = PropertyFactory.getProp(elem, data.o, 0, 0.01, this);\n this.s = PropertyFactory.getProp(elem, data.s, 1, null, this);\n this.e = PropertyFactory.getProp(elem, data.e, 1, null, this);\n this.h = PropertyFactory.getProp(elem, data.h || {\n k: 0\n }, 0, 0.01, this);\n this.a = PropertyFactory.getProp(elem, data.a || {\n k: 0\n }, 0, degToRads, this);\n this.g = new GradientProperty(elem, data.g, this);\n this.style = styleOb;\n this.stops = [];\n this.setGradientData(styleOb.pElem, data);\n this.setGradientOpacity(data, styleOb);\n this._isAnimated = !!this._isAnimated;\n };\n\n SVGGradientFillStyleData.prototype.setGradientData = function (pathElement, data) {\n var gradientId = createElementID();\n var gfill = createNS(data.t === 1 ? 'linearGradient' : 'radialGradient');\n gfill.setAttribute('id', gradientId);\n gfill.setAttribute('spreadMethod', 'pad');\n gfill.setAttribute('gradientUnits', 'userSpaceOnUse');\n var stops = [];\n var stop;\n var j;\n var jLen;\n jLen = data.g.p * 4;\n\n for (j = 0; j < jLen; j += 4) {\n stop = createNS('stop');\n gfill.appendChild(stop);\n stops.push(stop);\n }\n\n pathElement.setAttribute(data.ty === 'gf' ? 'fill' : 'stroke', 'url(' + getLocationHref() + '#' + gradientId + ')');\n this.gf = gfill;\n this.cst = stops;\n };\n\n SVGGradientFillStyleData.prototype.setGradientOpacity = function (data, styleOb) {\n if (this.g._hasOpacity && !this.g._collapsable) {\n var stop;\n var j;\n var jLen;\n var mask = createNS('mask');\n var maskElement = createNS('path');\n mask.appendChild(maskElement);\n var opacityId = createElementID();\n var maskId = createElementID();\n mask.setAttribute('id', maskId);\n var opFill = createNS(data.t === 1 ? 'linearGradient' : 'radialGradient');\n opFill.setAttribute('id', opacityId);\n opFill.setAttribute('spreadMethod', 'pad');\n opFill.setAttribute('gradientUnits', 'userSpaceOnUse');\n jLen = data.g.k.k[0].s ? data.g.k.k[0].s.length : data.g.k.k.length;\n var stops = this.stops;\n\n for (j = data.g.p * 4; j < jLen; j += 2) {\n stop = createNS('stop');\n stop.setAttribute('stop-color', 'rgb(255,255,255)');\n opFill.appendChild(stop);\n stops.push(stop);\n }\n\n maskElement.setAttribute(data.ty === 'gf' ? 'fill' : 'stroke', 'url(' + getLocationHref() + '#' + opacityId + ')');\n\n if (data.ty === 'gs') {\n maskElement.setAttribute('stroke-linecap', lineCapEnum[data.lc || 2]);\n maskElement.setAttribute('stroke-linejoin', lineJoinEnum[data.lj || 2]);\n\n if (data.lj === 1) {\n maskElement.setAttribute('stroke-miterlimit', data.ml);\n }\n }\n\n this.of = opFill;\n this.ms = mask;\n this.ost = stops;\n this.maskId = maskId;\n styleOb.msElem = maskElement;\n }\n };\n\n extendPrototype([DynamicPropertyContainer], SVGGradientFillStyleData);\n\n function SVGGradientStrokeStyleData(elem, data, styleOb) {\n this.initDynamicPropertyContainer(elem);\n this.getValue = this.iterateDynamicProperties;\n this.w = PropertyFactory.getProp(elem, data.w, 0, null, this);\n this.d = new DashProperty(elem, data.d || {}, 'svg', this);\n this.initGradientData(elem, data, styleOb);\n this._isAnimated = !!this._isAnimated;\n }\n\n extendPrototype([SVGGradientFillStyleData, DynamicPropertyContainer], SVGGradientStrokeStyleData);\n\n function ShapeGroupData() {\n this.it = [];\n this.prevViewData = [];\n this.gr = createNS('g');\n }\n\n function SVGTransformData(mProps, op, container) {\n this.transform = {\n mProps: mProps,\n op: op,\n container: container\n };\n this.elements = [];\n this._isAnimated = this.transform.mProps.dynamicProperties.length || this.transform.op.effectsSequence.length;\n }\n\n var buildShapeString = function buildShapeString(pathNodes, length, closed, mat) {\n if (length === 0) {\n return '';\n }\n\n var _o = pathNodes.o;\n var _i = pathNodes.i;\n var _v = pathNodes.v;\n var i;\n var shapeString = ' M' + mat.applyToPointStringified(_v[0][0], _v[0][1]);\n\n for (i = 1; i < length; i += 1) {\n shapeString += ' C' + mat.applyToPointStringified(_o[i - 1][0], _o[i - 1][1]) + ' ' + mat.applyToPointStringified(_i[i][0], _i[i][1]) + ' ' + mat.applyToPointStringified(_v[i][0], _v[i][1]);\n }\n\n if (closed && length) {\n shapeString += ' C' + mat.applyToPointStringified(_o[i - 1][0], _o[i - 1][1]) + ' ' + mat.applyToPointStringified(_i[0][0], _i[0][1]) + ' ' + mat.applyToPointStringified(_v[0][0], _v[0][1]);\n shapeString += 'z';\n }\n\n return shapeString;\n };\n\n var SVGElementsRenderer = function () {\n var _identityMatrix = new Matrix();\n\n var _matrixHelper = new Matrix();\n\n var ob = {\n createRenderFunction: createRenderFunction\n };\n\n function createRenderFunction(data) {\n switch (data.ty) {\n case 'fl':\n return renderFill;\n\n case 'gf':\n return renderGradient;\n\n case 'gs':\n return renderGradientStroke;\n\n case 'st':\n return renderStroke;\n\n case 'sh':\n case 'el':\n case 'rc':\n case 'sr':\n return renderPath;\n\n case 'tr':\n return renderContentTransform;\n\n case 'no':\n return renderNoop;\n\n default:\n return null;\n }\n }\n\n function renderContentTransform(styleData, itemData, isFirstFrame) {\n if (isFirstFrame || itemData.transform.op._mdf) {\n itemData.transform.container.setAttribute('opacity', itemData.transform.op.v);\n }\n\n if (isFirstFrame || itemData.transform.mProps._mdf) {\n itemData.transform.container.setAttribute('transform', itemData.transform.mProps.v.to2dCSS());\n }\n }\n\n function renderNoop() {}\n\n function renderPath(styleData, itemData, isFirstFrame) {\n var j;\n var jLen;\n var pathStringTransformed;\n var redraw;\n var pathNodes;\n var l;\n var lLen = itemData.styles.length;\n var lvl = itemData.lvl;\n var paths;\n var mat;\n var iterations;\n var k;\n\n for (l = 0; l < lLen; l += 1) {\n redraw = itemData.sh._mdf || isFirstFrame;\n\n if (itemData.styles[l].lvl < lvl) {\n mat = _matrixHelper.reset();\n iterations = lvl - itemData.styles[l].lvl;\n k = itemData.transformers.length - 1;\n\n while (!redraw && iterations > 0) {\n redraw = itemData.transformers[k].mProps._mdf || redraw;\n iterations -= 1;\n k -= 1;\n }\n\n if (redraw) {\n iterations = lvl - itemData.styles[l].lvl;\n k = itemData.transformers.length - 1;\n\n while (iterations > 0) {\n mat.multiply(itemData.transformers[k].mProps.v);\n iterations -= 1;\n k -= 1;\n }\n }\n } else {\n mat = _identityMatrix;\n }\n\n paths = itemData.sh.paths;\n jLen = paths._length;\n\n if (redraw) {\n pathStringTransformed = '';\n\n for (j = 0; j < jLen; j += 1) {\n pathNodes = paths.shapes[j];\n\n if (pathNodes && pathNodes._length) {\n pathStringTransformed += buildShapeString(pathNodes, pathNodes._length, pathNodes.c, mat);\n }\n }\n\n itemData.caches[l] = pathStringTransformed;\n } else {\n pathStringTransformed = itemData.caches[l];\n }\n\n itemData.styles[l].d += styleData.hd === true ? '' : pathStringTransformed;\n itemData.styles[l]._mdf = redraw || itemData.styles[l]._mdf;\n }\n }\n\n function renderFill(styleData, itemData, isFirstFrame) {\n var styleElem = itemData.style;\n\n if (itemData.c._mdf || isFirstFrame) {\n styleElem.pElem.setAttribute('fill', 'rgb(' + bmFloor(itemData.c.v[0]) + ',' + bmFloor(itemData.c.v[1]) + ',' + bmFloor(itemData.c.v[2]) + ')');\n }\n\n if (itemData.o._mdf || isFirstFrame) {\n styleElem.pElem.setAttribute('fill-opacity', itemData.o.v);\n }\n }\n\n function renderGradientStroke(styleData, itemData, isFirstFrame) {\n renderGradient(styleData, itemData, isFirstFrame);\n renderStroke(styleData, itemData, isFirstFrame);\n }\n\n function renderGradient(styleData, itemData, isFirstFrame) {\n var gfill = itemData.gf;\n var hasOpacity = itemData.g._hasOpacity;\n var pt1 = itemData.s.v;\n var pt2 = itemData.e.v;\n\n if (itemData.o._mdf || isFirstFrame) {\n var attr = styleData.ty === 'gf' ? 'fill-opacity' : 'stroke-opacity';\n itemData.style.pElem.setAttribute(attr, itemData.o.v);\n }\n\n if (itemData.s._mdf || isFirstFrame) {\n var attr1 = styleData.t === 1 ? 'x1' : 'cx';\n var attr2 = attr1 === 'x1' ? 'y1' : 'cy';\n gfill.setAttribute(attr1, pt1[0]);\n gfill.setAttribute(attr2, pt1[1]);\n\n if (hasOpacity && !itemData.g._collapsable) {\n itemData.of.setAttribute(attr1, pt1[0]);\n itemData.of.setAttribute(attr2, pt1[1]);\n }\n }\n\n var stops;\n var i;\n var len;\n var stop;\n\n if (itemData.g._cmdf || isFirstFrame) {\n stops = itemData.cst;\n var cValues = itemData.g.c;\n len = stops.length;\n\n for (i = 0; i < len; i += 1) {\n stop = stops[i];\n stop.setAttribute('offset', cValues[i * 4] + '%');\n stop.setAttribute('stop-color', 'rgb(' + cValues[i * 4 + 1] + ',' + cValues[i * 4 + 2] + ',' + cValues[i * 4 + 3] + ')');\n }\n }\n\n if (hasOpacity && (itemData.g._omdf || isFirstFrame)) {\n var oValues = itemData.g.o;\n\n if (itemData.g._collapsable) {\n stops = itemData.cst;\n } else {\n stops = itemData.ost;\n }\n\n len = stops.length;\n\n for (i = 0; i < len; i += 1) {\n stop = stops[i];\n\n if (!itemData.g._collapsable) {\n stop.setAttribute('offset', oValues[i * 2] + '%');\n }\n\n stop.setAttribute('stop-opacity', oValues[i * 2 + 1]);\n }\n }\n\n if (styleData.t === 1) {\n if (itemData.e._mdf || isFirstFrame) {\n gfill.setAttribute('x2', pt2[0]);\n gfill.setAttribute('y2', pt2[1]);\n\n if (hasOpacity && !itemData.g._collapsable) {\n itemData.of.setAttribute('x2', pt2[0]);\n itemData.of.setAttribute('y2', pt2[1]);\n }\n }\n } else {\n var rad;\n\n if (itemData.s._mdf || itemData.e._mdf || isFirstFrame) {\n rad = Math.sqrt(Math.pow(pt1[0] - pt2[0], 2) + Math.pow(pt1[1] - pt2[1], 2));\n gfill.setAttribute('r', rad);\n\n if (hasOpacity && !itemData.g._collapsable) {\n itemData.of.setAttribute('r', rad);\n }\n }\n\n if (itemData.e._mdf || itemData.h._mdf || itemData.a._mdf || isFirstFrame) {\n if (!rad) {\n rad = Math.sqrt(Math.pow(pt1[0] - pt2[0], 2) + Math.pow(pt1[1] - pt2[1], 2));\n }\n\n var ang = Math.atan2(pt2[1] - pt1[1], pt2[0] - pt1[0]);\n var percent = itemData.h.v;\n\n if (percent >= 1) {\n percent = 0.99;\n } else if (percent <= -1) {\n percent = -0.99;\n }\n\n var dist = rad * percent;\n var x = Math.cos(ang + itemData.a.v) * dist + pt1[0];\n var y = Math.sin(ang + itemData.a.v) * dist + pt1[1];\n gfill.setAttribute('fx', x);\n gfill.setAttribute('fy', y);\n\n if (hasOpacity && !itemData.g._collapsable) {\n itemData.of.setAttribute('fx', x);\n itemData.of.setAttribute('fy', y);\n }\n } // gfill.setAttribute('fy','200');\n\n }\n }\n\n function renderStroke(styleData, itemData, isFirstFrame) {\n var styleElem = itemData.style;\n var d = itemData.d;\n\n if (d && (d._mdf || isFirstFrame) && d.dashStr) {\n styleElem.pElem.setAttribute('stroke-dasharray', d.dashStr);\n styleElem.pElem.setAttribute('stroke-dashoffset', d.dashoffset[0]);\n }\n\n if (itemData.c && (itemData.c._mdf || isFirstFrame)) {\n styleElem.pElem.setAttribute('stroke', 'rgb(' + bmFloor(itemData.c.v[0]) + ',' + bmFloor(itemData.c.v[1]) + ',' + bmFloor(itemData.c.v[2]) + ')');\n }\n\n if (itemData.o._mdf || isFirstFrame) {\n styleElem.pElem.setAttribute('stroke-opacity', itemData.o.v);\n }\n\n if (itemData.w._mdf || isFirstFrame) {\n styleElem.pElem.setAttribute('stroke-width', itemData.w.v);\n\n if (styleElem.msElem) {\n styleElem.msElem.setAttribute('stroke-width', itemData.w.v);\n }\n }\n }\n\n return ob;\n }();\n\n function SVGShapeElement(data, globalData, comp) {\n // List of drawable elements\n this.shapes = []; // Full shape data\n\n this.shapesData = data.shapes; // List of styles that will be applied to shapes\n\n this.stylesList = []; // List of modifiers that will be applied to shapes\n\n this.shapeModifiers = []; // List of items in shape tree\n\n this.itemsData = []; // List of items in previous shape tree\n\n this.processedElements = []; // List of animated components\n\n this.animatedContents = [];\n this.initElement(data, globalData, comp); // Moving any property that doesn't get too much access after initialization because of v8 way of handling more than 10 properties.\n // List of elements that have been created\n\n this.prevViewData = []; // Moving any property that doesn't get too much access after initialization because of v8 way of handling more than 10 properties.\n }\n\n extendPrototype([BaseElement, TransformElement, SVGBaseElement, IShapeElement, HierarchyElement, FrameElement, RenderableDOMElement], SVGShapeElement);\n\n SVGShapeElement.prototype.initSecondaryElement = function () {};\n\n SVGShapeElement.prototype.identityMatrix = new Matrix();\n\n SVGShapeElement.prototype.buildExpressionInterface = function () {};\n\n SVGShapeElement.prototype.createContent = function () {\n this.searchShapes(this.shapesData, this.itemsData, this.prevViewData, this.layerElement, 0, [], true);\n this.filterUniqueShapes();\n };\n /*\r\n This method searches for multiple shapes that affect a single element and one of them is animated\r\n */\n\n\n SVGShapeElement.prototype.filterUniqueShapes = function () {\n var i;\n var len = this.shapes.length;\n var shape;\n var j;\n var jLen = this.stylesList.length;\n var style;\n var tempShapes = [];\n var areAnimated = false;\n\n for (j = 0; j < jLen; j += 1) {\n style = this.stylesList[j];\n areAnimated = false;\n tempShapes.length = 0;\n\n for (i = 0; i < len; i += 1) {\n shape = this.shapes[i];\n\n if (shape.styles.indexOf(style) !== -1) {\n tempShapes.push(shape);\n areAnimated = shape._isAnimated || areAnimated;\n }\n }\n\n if (tempShapes.length > 1 && areAnimated) {\n this.setShapesAsAnimated(tempShapes);\n }\n }\n };\n\n SVGShapeElement.prototype.setShapesAsAnimated = function (shapes) {\n var i;\n var len = shapes.length;\n\n for (i = 0; i < len; i += 1) {\n shapes[i].setAsAnimated();\n }\n };\n\n SVGShapeElement.prototype.createStyleElement = function (data, level) {\n // TODO: prevent drawing of hidden styles\n var elementData;\n var styleOb = new SVGStyleData(data, level);\n var pathElement = styleOb.pElem;\n\n if (data.ty === 'st') {\n elementData = new SVGStrokeStyleData(this, data, styleOb);\n } else if (data.ty === 'fl') {\n elementData = new SVGFillStyleData(this, data, styleOb);\n } else if (data.ty === 'gf' || data.ty === 'gs') {\n var GradientConstructor = data.ty === 'gf' ? SVGGradientFillStyleData : SVGGradientStrokeStyleData;\n elementData = new GradientConstructor(this, data, styleOb);\n this.globalData.defs.appendChild(elementData.gf);\n\n if (elementData.maskId) {\n this.globalData.defs.appendChild(elementData.ms);\n this.globalData.defs.appendChild(elementData.of);\n pathElement.setAttribute('mask', 'url(' + getLocationHref() + '#' + elementData.maskId + ')');\n }\n } else if (data.ty === 'no') {\n elementData = new SVGNoStyleData(this, data, styleOb);\n }\n\n if (data.ty === 'st' || data.ty === 'gs') {\n pathElement.setAttribute('stroke-linecap', lineCapEnum[data.lc || 2]);\n pathElement.setAttribute('stroke-linejoin', lineJoinEnum[data.lj || 2]);\n pathElement.setAttribute('fill-opacity', '0');\n\n if (data.lj === 1) {\n pathElement.setAttribute('stroke-miterlimit', data.ml);\n }\n }\n\n if (data.r === 2) {\n pathElement.setAttribute('fill-rule', 'evenodd');\n }\n\n if (data.ln) {\n pathElement.setAttribute('id', data.ln);\n }\n\n if (data.cl) {\n pathElement.setAttribute('class', data.cl);\n }\n\n if (data.bm) {\n pathElement.style['mix-blend-mode'] = getBlendMode(data.bm);\n }\n\n this.stylesList.push(styleOb);\n this.addToAnimatedContents(data, elementData);\n return elementData;\n };\n\n SVGShapeElement.prototype.createGroupElement = function (data) {\n var elementData = new ShapeGroupData();\n\n if (data.ln) {\n elementData.gr.setAttribute('id', data.ln);\n }\n\n if (data.cl) {\n elementData.gr.setAttribute('class', data.cl);\n }\n\n if (data.bm) {\n elementData.gr.style['mix-blend-mode'] = getBlendMode(data.bm);\n }\n\n return elementData;\n };\n\n SVGShapeElement.prototype.createTransformElement = function (data, container) {\n var transformProperty = TransformPropertyFactory.getTransformProperty(this, data, this);\n var elementData = new SVGTransformData(transformProperty, transformProperty.o, container);\n this.addToAnimatedContents(data, elementData);\n return elementData;\n };\n\n SVGShapeElement.prototype.createShapeElement = function (data, ownTransformers, level) {\n var ty = 4;\n\n if (data.ty === 'rc') {\n ty = 5;\n } else if (data.ty === 'el') {\n ty = 6;\n } else if (data.ty === 'sr') {\n ty = 7;\n }\n\n var shapeProperty = ShapePropertyFactory.getShapeProp(this, data, ty, this);\n var elementData = new SVGShapeData(ownTransformers, level, shapeProperty);\n this.shapes.push(elementData);\n this.addShapeToModifiers(elementData);\n this.addToAnimatedContents(data, elementData);\n return elementData;\n };\n\n SVGShapeElement.prototype.addToAnimatedContents = function (data, element) {\n var i = 0;\n var len = this.animatedContents.length;\n\n while (i < len) {\n if (this.animatedContents[i].element === element) {\n return;\n }\n\n i += 1;\n }\n\n this.animatedContents.push({\n fn: SVGElementsRenderer.createRenderFunction(data),\n element: element,\n data: data\n });\n };\n\n SVGShapeElement.prototype.setElementStyles = function (elementData) {\n var arr = elementData.styles;\n var j;\n var jLen = this.stylesList.length;\n\n for (j = 0; j < jLen; j += 1) {\n if (!this.stylesList[j].closed) {\n arr.push(this.stylesList[j]);\n }\n }\n };\n\n SVGShapeElement.prototype.reloadShapes = function () {\n this._isFirstFrame = true;\n var i;\n var len = this.itemsData.length;\n\n for (i = 0; i < len; i += 1) {\n this.prevViewData[i] = this.itemsData[i];\n }\n\n this.searchShapes(this.shapesData, this.itemsData, this.prevViewData, this.layerElement, 0, [], true);\n this.filterUniqueShapes();\n len = this.dynamicProperties.length;\n\n for (i = 0; i < len; i += 1) {\n this.dynamicProperties[i].getValue();\n }\n\n this.renderModifiers();\n };\n\n SVGShapeElement.prototype.searchShapes = function (arr, itemsData, prevViewData, container, level, transformers, render) {\n var ownTransformers = [].concat(transformers);\n var i;\n var len = arr.length - 1;\n var j;\n var jLen;\n var ownStyles = [];\n var ownModifiers = [];\n var currentTransform;\n var modifier;\n var processedPos;\n\n for (i = len; i >= 0; i -= 1) {\n processedPos = this.searchProcessedElement(arr[i]);\n\n if (!processedPos) {\n arr[i]._render = render;\n } else {\n itemsData[i] = prevViewData[processedPos - 1];\n }\n\n if (arr[i].ty === 'fl' || arr[i].ty === 'st' || arr[i].ty === 'gf' || arr[i].ty === 'gs' || arr[i].ty === 'no') {\n if (!processedPos) {\n itemsData[i] = this.createStyleElement(arr[i], level);\n } else {\n itemsData[i].style.closed = false;\n }\n\n if (arr[i]._render) {\n if (itemsData[i].style.pElem.parentNode !== container) {\n container.appendChild(itemsData[i].style.pElem);\n }\n }\n\n ownStyles.push(itemsData[i].style);\n } else if (arr[i].ty === 'gr') {\n if (!processedPos) {\n itemsData[i] = this.createGroupElement(arr[i]);\n } else {\n jLen = itemsData[i].it.length;\n\n for (j = 0; j < jLen; j += 1) {\n itemsData[i].prevViewData[j] = itemsData[i].it[j];\n }\n }\n\n this.searchShapes(arr[i].it, itemsData[i].it, itemsData[i].prevViewData, itemsData[i].gr, level + 1, ownTransformers, render);\n\n if (arr[i]._render) {\n if (itemsData[i].gr.parentNode !== container) {\n container.appendChild(itemsData[i].gr);\n }\n }\n } else if (arr[i].ty === 'tr') {\n if (!processedPos) {\n itemsData[i] = this.createTransformElement(arr[i], container);\n }\n\n currentTransform = itemsData[i].transform;\n ownTransformers.push(currentTransform);\n } else if (arr[i].ty === 'sh' || arr[i].ty === 'rc' || arr[i].ty === 'el' || arr[i].ty === 'sr') {\n if (!processedPos) {\n itemsData[i] = this.createShapeElement(arr[i], ownTransformers, level);\n }\n\n this.setElementStyles(itemsData[i]);\n } else if (arr[i].ty === 'tm' || arr[i].ty === 'rd' || arr[i].ty === 'ms' || arr[i].ty === 'pb' || arr[i].ty === 'zz' || arr[i].ty === 'op') {\n if (!processedPos) {\n modifier = ShapeModifiers.getModifier(arr[i].ty);\n modifier.init(this, arr[i]);\n itemsData[i] = modifier;\n this.shapeModifiers.push(modifier);\n } else {\n modifier = itemsData[i];\n modifier.closed = false;\n }\n\n ownModifiers.push(modifier);\n } else if (arr[i].ty === 'rp') {\n if (!processedPos) {\n modifier = ShapeModifiers.getModifier(arr[i].ty);\n itemsData[i] = modifier;\n modifier.init(this, arr, i, itemsData);\n this.shapeModifiers.push(modifier);\n render = false;\n } else {\n modifier = itemsData[i];\n modifier.closed = true;\n }\n\n ownModifiers.push(modifier);\n }\n\n this.addProcessedElement(arr[i], i + 1);\n }\n\n len = ownStyles.length;\n\n for (i = 0; i < len; i += 1) {\n ownStyles[i].closed = true;\n }\n\n len = ownModifiers.length;\n\n for (i = 0; i < len; i += 1) {\n ownModifiers[i].closed = true;\n }\n };\n\n SVGShapeElement.prototype.renderInnerContent = function () {\n this.renderModifiers();\n var i;\n var len = this.stylesList.length;\n\n for (i = 0; i < len; i += 1) {\n this.stylesList[i].reset();\n }\n\n this.renderShape();\n\n for (i = 0; i < len; i += 1) {\n if (this.stylesList[i]._mdf || this._isFirstFrame) {\n if (this.stylesList[i].msElem) {\n this.stylesList[i].msElem.setAttribute('d', this.stylesList[i].d); // Adding M0 0 fixes same mask bug on all browsers\n\n this.stylesList[i].d = 'M0 0' + this.stylesList[i].d;\n }\n\n this.stylesList[i].pElem.setAttribute('d', this.stylesList[i].d || 'M0 0');\n }\n }\n };\n\n SVGShapeElement.prototype.renderShape = function () {\n var i;\n var len = this.animatedContents.length;\n var animatedContent;\n\n for (i = 0; i < len; i += 1) {\n animatedContent = this.animatedContents[i];\n\n if ((this._isFirstFrame || animatedContent.element._isAnimated) && animatedContent.data !== true) {\n animatedContent.fn(animatedContent.data, animatedContent.element, this._isFirstFrame);\n }\n }\n };\n\n SVGShapeElement.prototype.destroy = function () {\n this.destroyBaseElement();\n this.shapesData = null;\n this.itemsData = null;\n };\n\n function LetterProps(o, sw, sc, fc, m, p) {\n this.o = o;\n this.sw = sw;\n this.sc = sc;\n this.fc = fc;\n this.m = m;\n this.p = p;\n this._mdf = {\n o: true,\n sw: !!sw,\n sc: !!sc,\n fc: !!fc,\n m: true,\n p: true\n };\n }\n\n LetterProps.prototype.update = function (o, sw, sc, fc, m, p) {\n this._mdf.o = false;\n this._mdf.sw = false;\n this._mdf.sc = false;\n this._mdf.fc = false;\n this._mdf.m = false;\n this._mdf.p = false;\n var updated = false;\n\n if (this.o !== o) {\n this.o = o;\n this._mdf.o = true;\n updated = true;\n }\n\n if (this.sw !== sw) {\n this.sw = sw;\n this._mdf.sw = true;\n updated = true;\n }\n\n if (this.sc !== sc) {\n this.sc = sc;\n this._mdf.sc = true;\n updated = true;\n }\n\n if (this.fc !== fc) {\n this.fc = fc;\n this._mdf.fc = true;\n updated = true;\n }\n\n if (this.m !== m) {\n this.m = m;\n this._mdf.m = true;\n updated = true;\n }\n\n if (p.length && (this.p[0] !== p[0] || this.p[1] !== p[1] || this.p[4] !== p[4] || this.p[5] !== p[5] || this.p[12] !== p[12] || this.p[13] !== p[13])) {\n this.p = p;\n this._mdf.p = true;\n updated = true;\n }\n\n return updated;\n };\n\n function TextProperty(elem, data) {\n this._frameId = initialDefaultFrame;\n this.pv = '';\n this.v = '';\n this.kf = false;\n this._isFirstFrame = true;\n this._mdf = false;\n\n if (data.d && data.d.sid) {\n data.d = elem.globalData.slotManager.getProp(data.d);\n }\n\n this.data = data;\n this.elem = elem;\n this.comp = this.elem.comp;\n this.keysIndex = 0;\n this.canResize = false;\n this.minimumFontSize = 1;\n this.effectsSequence = [];\n this.currentData = {\n ascent: 0,\n boxWidth: this.defaultBoxWidth,\n f: '',\n fStyle: '',\n fWeight: '',\n fc: '',\n j: '',\n justifyOffset: '',\n l: [],\n lh: 0,\n lineWidths: [],\n ls: '',\n of: '',\n s: '',\n sc: '',\n sw: 0,\n t: 0,\n tr: 0,\n sz: 0,\n ps: null,\n fillColorAnim: false,\n strokeColorAnim: false,\n strokeWidthAnim: false,\n yOffset: 0,\n finalSize: 0,\n finalText: [],\n finalLineHeight: 0,\n __complete: false\n };\n this.copyData(this.currentData, this.data.d.k[0].s);\n\n if (!this.searchProperty()) {\n this.completeTextData(this.currentData);\n }\n }\n\n TextProperty.prototype.defaultBoxWidth = [0, 0];\n\n TextProperty.prototype.copyData = function (obj, data) {\n for (var s in data) {\n if (Object.prototype.hasOwnProperty.call(data, s)) {\n obj[s] = data[s];\n }\n }\n\n return obj;\n };\n\n TextProperty.prototype.setCurrentData = function (data) {\n if (!data.__complete) {\n this.completeTextData(data);\n }\n\n this.currentData = data;\n this.currentData.boxWidth = this.currentData.boxWidth || this.defaultBoxWidth;\n this._mdf = true;\n };\n\n TextProperty.prototype.searchProperty = function () {\n return this.searchKeyframes();\n };\n\n TextProperty.prototype.searchKeyframes = function () {\n this.kf = this.data.d.k.length > 1;\n\n if (this.kf) {\n this.addEffect(this.getKeyframeValue.bind(this));\n }\n\n return this.kf;\n };\n\n TextProperty.prototype.addEffect = function (effectFunction) {\n this.effectsSequence.push(effectFunction);\n this.elem.addDynamicProperty(this);\n };\n\n TextProperty.prototype.getValue = function (_finalValue) {\n if ((this.elem.globalData.frameId === this.frameId || !this.effectsSequence.length) && !_finalValue) {\n return;\n }\n\n this.currentData.t = this.data.d.k[this.keysIndex].s.t;\n var currentValue = this.currentData;\n var currentIndex = this.keysIndex;\n\n if (this.lock) {\n this.setCurrentData(this.currentData);\n return;\n }\n\n this.lock = true;\n this._mdf = false;\n var i;\n var len = this.effectsSequence.length;\n var finalValue = _finalValue || this.data.d.k[this.keysIndex].s;\n\n for (i = 0; i < len; i += 1) {\n // Checking if index changed to prevent creating a new object every time the expression updates.\n if (currentIndex !== this.keysIndex) {\n finalValue = this.effectsSequence[i](finalValue, finalValue.t);\n } else {\n finalValue = this.effectsSequence[i](this.currentData, finalValue.t);\n }\n }\n\n if (currentValue !== finalValue) {\n this.setCurrentData(finalValue);\n }\n\n this.v = this.currentData;\n this.pv = this.v;\n this.lock = false;\n this.frameId = this.elem.globalData.frameId;\n };\n\n TextProperty.prototype.getKeyframeValue = function () {\n var textKeys = this.data.d.k;\n var frameNum = this.elem.comp.renderedFrame;\n var i = 0;\n var len = textKeys.length;\n\n while (i <= len - 1) {\n if (i === len - 1 || textKeys[i + 1].t > frameNum) {\n break;\n }\n\n i += 1;\n }\n\n if (this.keysIndex !== i) {\n this.keysIndex = i;\n }\n\n return this.data.d.k[this.keysIndex].s;\n };\n\n TextProperty.prototype.buildFinalText = function (text) {\n var charactersArray = [];\n var i = 0;\n var len = text.length;\n var charCode;\n var secondCharCode;\n var shouldCombine = false;\n var shouldCombineNext = false;\n var currentChars = '';\n\n while (i < len) {\n shouldCombine = shouldCombineNext;\n shouldCombineNext = false;\n charCode = text.charCodeAt(i);\n currentChars = text.charAt(i);\n\n if (FontManager.isCombinedCharacter(charCode)) {\n shouldCombine = true; // It's a potential surrogate pair (this is the High surrogate)\n } else if (charCode >= 0xD800 && charCode <= 0xDBFF) {\n if (FontManager.isRegionalFlag(text, i)) {\n currentChars = text.substr(i, 14);\n } else {\n secondCharCode = text.charCodeAt(i + 1); // It's a surrogate pair (this is the Low surrogate)\n\n if (secondCharCode >= 0xDC00 && secondCharCode <= 0xDFFF) {\n if (FontManager.isModifier(charCode, secondCharCode)) {\n currentChars = text.substr(i, 2);\n shouldCombine = true;\n } else if (FontManager.isFlagEmoji(text.substr(i, 4))) {\n currentChars = text.substr(i, 4);\n } else {\n currentChars = text.substr(i, 2);\n }\n }\n }\n } else if (charCode > 0xDBFF) {\n secondCharCode = text.charCodeAt(i + 1);\n\n if (FontManager.isVariationSelector(charCode)) {\n shouldCombine = true;\n }\n } else if (FontManager.isZeroWidthJoiner(charCode)) {\n shouldCombine = true;\n shouldCombineNext = true;\n }\n\n if (shouldCombine) {\n charactersArray[charactersArray.length - 1] += currentChars;\n shouldCombine = false;\n } else {\n charactersArray.push(currentChars);\n }\n\n i += currentChars.length;\n }\n\n return charactersArray;\n };\n\n TextProperty.prototype.completeTextData = function (documentData) {\n documentData.__complete = true;\n var fontManager = this.elem.globalData.fontManager;\n var data = this.data;\n var letters = [];\n var i;\n var len;\n var newLineFlag;\n var index = 0;\n var val;\n var anchorGrouping = data.m.g;\n var currentSize = 0;\n var currentPos = 0;\n var currentLine = 0;\n var lineWidths = [];\n var lineWidth = 0;\n var maxLineWidth = 0;\n var j;\n var jLen;\n var fontData = fontManager.getFontByName(documentData.f);\n var charData;\n var cLength = 0;\n var fontProps = getFontProperties(fontData);\n documentData.fWeight = fontProps.weight;\n documentData.fStyle = fontProps.style;\n documentData.finalSize = documentData.s;\n documentData.finalText = this.buildFinalText(documentData.t);\n len = documentData.finalText.length;\n documentData.finalLineHeight = documentData.lh;\n var trackingOffset = documentData.tr / 1000 * documentData.finalSize;\n var charCode;\n\n if (documentData.sz) {\n var flag = true;\n var boxWidth = documentData.sz[0];\n var boxHeight = documentData.sz[1];\n var currentHeight;\n var finalText;\n\n while (flag) {\n finalText = this.buildFinalText(documentData.t);\n currentHeight = 0;\n lineWidth = 0;\n len = finalText.length;\n trackingOffset = documentData.tr / 1000 * documentData.finalSize;\n var lastSpaceIndex = -1;\n\n for (i = 0; i < len; i += 1) {\n charCode = finalText[i].charCodeAt(0);\n newLineFlag = false;\n\n if (finalText[i] === ' ') {\n lastSpaceIndex = i;\n } else if (charCode === 13 || charCode === 3) {\n lineWidth = 0;\n newLineFlag = true;\n currentHeight += documentData.finalLineHeight || documentData.finalSize * 1.2;\n }\n\n if (fontManager.chars) {\n charData = fontManager.getCharData(finalText[i], fontData.fStyle, fontData.fFamily);\n cLength = newLineFlag ? 0 : charData.w * documentData.finalSize / 100;\n } else {\n // tCanvasHelper.font = documentData.s + 'px '+ fontData.fFamily;\n cLength = fontManager.measureText(finalText[i], documentData.f, documentData.finalSize);\n }\n\n if (lineWidth + cLength > boxWidth && finalText[i] !== ' ') {\n if (lastSpaceIndex === -1) {\n len += 1;\n } else {\n i = lastSpaceIndex;\n }\n\n currentHeight += documentData.finalLineHeight || documentData.finalSize * 1.2;\n finalText.splice(i, lastSpaceIndex === i ? 1 : 0, '\\r'); // finalText = finalText.substr(0,i) + \"\\r\" + finalText.substr(i === lastSpaceIndex ? i + 1 : i);\n\n lastSpaceIndex = -1;\n lineWidth = 0;\n } else {\n lineWidth += cLength;\n lineWidth += trackingOffset;\n }\n }\n\n currentHeight += fontData.ascent * documentData.finalSize / 100;\n\n if (this.canResize && documentData.finalSize > this.minimumFontSize && boxHeight < currentHeight) {\n documentData.finalSize -= 1;\n documentData.finalLineHeight = documentData.finalSize * documentData.lh / documentData.s;\n } else {\n documentData.finalText = finalText;\n len = documentData.finalText.length;\n flag = false;\n }\n }\n }\n\n lineWidth = -trackingOffset;\n cLength = 0;\n var uncollapsedSpaces = 0;\n var currentChar;\n\n for (i = 0; i < len; i += 1) {\n newLineFlag = false;\n currentChar = documentData.finalText[i];\n charCode = currentChar.charCodeAt(0);\n\n if (charCode === 13 || charCode === 3) {\n uncollapsedSpaces = 0;\n lineWidths.push(lineWidth);\n maxLineWidth = lineWidth > maxLineWidth ? lineWidth : maxLineWidth;\n lineWidth = -2 * trackingOffset;\n val = '';\n newLineFlag = true;\n currentLine += 1;\n } else {\n val = currentChar;\n }\n\n if (fontManager.chars) {\n charData = fontManager.getCharData(currentChar, fontData.fStyle, fontManager.getFontByName(documentData.f).fFamily);\n cLength = newLineFlag ? 0 : charData.w * documentData.finalSize / 100;\n } else {\n // var charWidth = fontManager.measureText(val, documentData.f, documentData.finalSize);\n // tCanvasHelper.font = documentData.finalSize + 'px '+ fontManager.getFontByName(documentData.f).fFamily;\n cLength = fontManager.measureText(val, documentData.f, documentData.finalSize);\n } //\n\n\n if (currentChar === ' ') {\n uncollapsedSpaces += cLength + trackingOffset;\n } else {\n lineWidth += cLength + trackingOffset + uncollapsedSpaces;\n uncollapsedSpaces = 0;\n }\n\n letters.push({\n l: cLength,\n an: cLength,\n add: currentSize,\n n: newLineFlag,\n anIndexes: [],\n val: val,\n line: currentLine,\n animatorJustifyOffset: 0\n });\n\n if (anchorGrouping == 2) {\n // eslint-disable-line eqeqeq\n currentSize += cLength;\n\n if (val === '' || val === ' ' || i === len - 1) {\n if (val === '' || val === ' ') {\n currentSize -= cLength;\n }\n\n while (currentPos <= i) {\n letters[currentPos].an = currentSize;\n letters[currentPos].ind = index;\n letters[currentPos].extra = cLength;\n currentPos += 1;\n }\n\n index += 1;\n currentSize = 0;\n }\n } else if (anchorGrouping == 3) {\n // eslint-disable-line eqeqeq\n currentSize += cLength;\n\n if (val === '' || i === len - 1) {\n if (val === '') {\n currentSize -= cLength;\n }\n\n while (currentPos <= i) {\n letters[currentPos].an = currentSize;\n letters[currentPos].ind = index;\n letters[currentPos].extra = cLength;\n currentPos += 1;\n }\n\n currentSize = 0;\n index += 1;\n }\n } else {\n letters[index].ind = index;\n letters[index].extra = 0;\n index += 1;\n }\n }\n\n documentData.l = letters;\n maxLineWidth = lineWidth > maxLineWidth ? lineWidth : maxLineWidth;\n lineWidths.push(lineWidth);\n\n if (documentData.sz) {\n documentData.boxWidth = documentData.sz[0];\n documentData.justifyOffset = 0;\n } else {\n documentData.boxWidth = maxLineWidth;\n\n switch (documentData.j) {\n case 1:\n documentData.justifyOffset = -documentData.boxWidth;\n break;\n\n case 2:\n documentData.justifyOffset = -documentData.boxWidth / 2;\n break;\n\n default:\n documentData.justifyOffset = 0;\n }\n }\n\n documentData.lineWidths = lineWidths;\n var animators = data.a;\n var animatorData;\n var letterData;\n jLen = animators.length;\n var based;\n var ind;\n var indexes = [];\n\n for (j = 0; j < jLen; j += 1) {\n animatorData = animators[j];\n\n if (animatorData.a.sc) {\n documentData.strokeColorAnim = true;\n }\n\n if (animatorData.a.sw) {\n documentData.strokeWidthAnim = true;\n }\n\n if (animatorData.a.fc || animatorData.a.fh || animatorData.a.fs || animatorData.a.fb) {\n documentData.fillColorAnim = true;\n }\n\n ind = 0;\n based = animatorData.s.b;\n\n for (i = 0; i < len; i += 1) {\n letterData = letters[i];\n letterData.anIndexes[j] = ind;\n\n if (based == 1 && letterData.val !== '' || based == 2 && letterData.val !== '' && letterData.val !== ' ' || based == 3 && (letterData.n || letterData.val == ' ' || i == len - 1) || based == 4 && (letterData.n || i == len - 1)) {\n // eslint-disable-line eqeqeq\n if (animatorData.s.rn === 1) {\n indexes.push(ind);\n }\n\n ind += 1;\n }\n }\n\n data.a[j].s.totalChars = ind;\n var currentInd = -1;\n var newInd;\n\n if (animatorData.s.rn === 1) {\n for (i = 0; i < len; i += 1) {\n letterData = letters[i];\n\n if (currentInd != letterData.anIndexes[j]) {\n // eslint-disable-line eqeqeq\n currentInd = letterData.anIndexes[j];\n newInd = indexes.splice(Math.floor(Math.random() * indexes.length), 1)[0];\n }\n\n letterData.anIndexes[j] = newInd;\n }\n }\n }\n\n documentData.yOffset = documentData.finalLineHeight || documentData.finalSize * 1.2;\n documentData.ls = documentData.ls || 0;\n documentData.ascent = fontData.ascent * documentData.finalSize / 100;\n };\n\n TextProperty.prototype.updateDocumentData = function (newData, index) {\n index = index === undefined ? this.keysIndex : index;\n var dData = this.copyData({}, this.data.d.k[index].s);\n dData = this.copyData(dData, newData);\n this.data.d.k[index].s = dData;\n this.recalculate(index);\n this.setCurrentData(dData);\n this.elem.addDynamicProperty(this);\n };\n\n TextProperty.prototype.recalculate = function (index) {\n var dData = this.data.d.k[index].s;\n dData.__complete = false;\n this.keysIndex = 0;\n this._isFirstFrame = true;\n this.getValue(dData);\n };\n\n TextProperty.prototype.canResizeFont = function (_canResize) {\n this.canResize = _canResize;\n this.recalculate(this.keysIndex);\n this.elem.addDynamicProperty(this);\n };\n\n TextProperty.prototype.setMinimumFontSize = function (_fontValue) {\n this.minimumFontSize = Math.floor(_fontValue) || 1;\n this.recalculate(this.keysIndex);\n this.elem.addDynamicProperty(this);\n };\n\n var TextSelectorProp = function () {\n var max = Math.max;\n var min = Math.min;\n var floor = Math.floor;\n\n function TextSelectorPropFactory(elem, data) {\n this._currentTextLength = -1;\n this.k = false;\n this.data = data;\n this.elem = elem;\n this.comp = elem.comp;\n this.finalS = 0;\n this.finalE = 0;\n this.initDynamicPropertyContainer(elem);\n this.s = PropertyFactory.getProp(elem, data.s || {\n k: 0\n }, 0, 0, this);\n\n if ('e' in data) {\n this.e = PropertyFactory.getProp(elem, data.e, 0, 0, this);\n } else {\n this.e = {\n v: 100\n };\n }\n\n this.o = PropertyFactory.getProp(elem, data.o || {\n k: 0\n }, 0, 0, this);\n this.xe = PropertyFactory.getProp(elem, data.xe || {\n k: 0\n }, 0, 0, this);\n this.ne = PropertyFactory.getProp(elem, data.ne || {\n k: 0\n }, 0, 0, this);\n this.sm = PropertyFactory.getProp(elem, data.sm || {\n k: 100\n }, 0, 0, this);\n this.a = PropertyFactory.getProp(elem, data.a, 0, 0.01, this);\n\n if (!this.dynamicProperties.length) {\n this.getValue();\n }\n }\n\n TextSelectorPropFactory.prototype = {\n getMult: function getMult(ind) {\n if (this._currentTextLength !== this.elem.textProperty.currentData.l.length) {\n this.getValue();\n }\n\n var x1 = 0;\n var y1 = 0;\n var x2 = 1;\n var y2 = 1;\n\n if (this.ne.v > 0) {\n x1 = this.ne.v / 100.0;\n } else {\n y1 = -this.ne.v / 100.0;\n }\n\n if (this.xe.v > 0) {\n x2 = 1.0 - this.xe.v / 100.0;\n } else {\n y2 = 1.0 + this.xe.v / 100.0;\n }\n\n var easer = BezierFactory.getBezierEasing(x1, y1, x2, y2).get;\n var mult = 0;\n var s = this.finalS;\n var e = this.finalE;\n var type = this.data.sh;\n\n if (type === 2) {\n if (e === s) {\n mult = ind >= e ? 1 : 0;\n } else {\n mult = max(0, min(0.5 / (e - s) + (ind - s) / (e - s), 1));\n }\n\n mult = easer(mult);\n } else if (type === 3) {\n if (e === s) {\n mult = ind >= e ? 0 : 1;\n } else {\n mult = 1 - max(0, min(0.5 / (e - s) + (ind - s) / (e - s), 1));\n }\n\n mult = easer(mult);\n } else if (type === 4) {\n if (e === s) {\n mult = 0;\n } else {\n mult = max(0, min(0.5 / (e - s) + (ind - s) / (e - s), 1));\n\n if (mult < 0.5) {\n mult *= 2;\n } else {\n mult = 1 - 2 * (mult - 0.5);\n }\n }\n\n mult = easer(mult);\n } else if (type === 5) {\n if (e === s) {\n mult = 0;\n } else {\n var tot = e - s;\n /* ind += 0.5;\r\n mult = -4/(tot*tot)*(ind*ind)+(4/tot)*ind; */\n\n ind = min(max(0, ind + 0.5 - s), e - s);\n var x = -tot / 2 + ind;\n var a = tot / 2;\n mult = Math.sqrt(1 - x * x / (a * a));\n }\n\n mult = easer(mult);\n } else if (type === 6) {\n if (e === s) {\n mult = 0;\n } else {\n ind = min(max(0, ind + 0.5 - s), e - s);\n mult = (1 + Math.cos(Math.PI + Math.PI * 2 * ind / (e - s))) / 2; // eslint-disable-line\n }\n\n mult = easer(mult);\n } else {\n if (ind >= floor(s)) {\n if (ind - s < 0) {\n mult = max(0, min(min(e, 1) - (s - ind), 1));\n } else {\n mult = max(0, min(e - ind, 1));\n }\n }\n\n mult = easer(mult);\n } // Smoothness implementation.\n // The smoothness represents a reduced range of the original [0; 1] range.\n // if smoothness is 25%, the new range will be [0.375; 0.625]\n // Steps are:\n // - find the lower value of the new range (threshold)\n // - if multiplier is smaller than that value, floor it to 0\n // - if it is larger,\n // - subtract the threshold\n // - divide it by the smoothness (this will return the range to [0; 1])\n // Note: If it doesn't work on some scenarios, consider applying it before the easer.\n\n\n if (this.sm.v !== 100) {\n var smoothness = this.sm.v * 0.01;\n\n if (smoothness === 0) {\n smoothness = 0.00000001;\n }\n\n var threshold = 0.5 - smoothness * 0.5;\n\n if (mult < threshold) {\n mult = 0;\n } else {\n mult = (mult - threshold) / smoothness;\n\n if (mult > 1) {\n mult = 1;\n }\n }\n }\n\n return mult * this.a.v;\n },\n getValue: function getValue(newCharsFlag) {\n this.iterateDynamicProperties();\n this._mdf = newCharsFlag || this._mdf;\n this._currentTextLength = this.elem.textProperty.currentData.l.length || 0;\n\n if (newCharsFlag && this.data.r === 2) {\n this.e.v = this._currentTextLength;\n }\n\n var divisor = this.data.r === 2 ? 1 : 100 / this.data.totalChars;\n var o = this.o.v / divisor;\n var s = this.s.v / divisor + o;\n var e = this.e.v / divisor + o;\n\n if (s > e) {\n var _s = s;\n s = e;\n e = _s;\n }\n\n this.finalS = s;\n this.finalE = e;\n }\n };\n extendPrototype([DynamicPropertyContainer], TextSelectorPropFactory);\n\n function getTextSelectorProp(elem, data, arr) {\n return new TextSelectorPropFactory(elem, data, arr);\n }\n\n return {\n getTextSelectorProp: getTextSelectorProp\n };\n }();\n\n function TextAnimatorDataProperty(elem, animatorProps, container) {\n var defaultData = {\n propType: false\n };\n var getProp = PropertyFactory.getProp;\n var textAnimatorAnimatables = animatorProps.a;\n this.a = {\n r: textAnimatorAnimatables.r ? getProp(elem, textAnimatorAnimatables.r, 0, degToRads, container) : defaultData,\n rx: textAnimatorAnimatables.rx ? getProp(elem, textAnimatorAnimatables.rx, 0, degToRads, container) : defaultData,\n ry: textAnimatorAnimatables.ry ? getProp(elem, textAnimatorAnimatables.ry, 0, degToRads, container) : defaultData,\n sk: textAnimatorAnimatables.sk ? getProp(elem, textAnimatorAnimatables.sk, 0, degToRads, container) : defaultData,\n sa: textAnimatorAnimatables.sa ? getProp(elem, textAnimatorAnimatables.sa, 0, degToRads, container) : defaultData,\n s: textAnimatorAnimatables.s ? getProp(elem, textAnimatorAnimatables.s, 1, 0.01, container) : defaultData,\n a: textAnimatorAnimatables.a ? getProp(elem, textAnimatorAnimatables.a, 1, 0, container) : defaultData,\n o: textAnimatorAnimatables.o ? getProp(elem, textAnimatorAnimatables.o, 0, 0.01, container) : defaultData,\n p: textAnimatorAnimatables.p ? getProp(elem, textAnimatorAnimatables.p, 1, 0, container) : defaultData,\n sw: textAnimatorAnimatables.sw ? getProp(elem, textAnimatorAnimatables.sw, 0, 0, container) : defaultData,\n sc: textAnimatorAnimatables.sc ? getProp(elem, textAnimatorAnimatables.sc, 1, 0, container) : defaultData,\n fc: textAnimatorAnimatables.fc ? getProp(elem, textAnimatorAnimatables.fc, 1, 0, container) : defaultData,\n fh: textAnimatorAnimatables.fh ? getProp(elem, textAnimatorAnimatables.fh, 0, 0, container) : defaultData,\n fs: textAnimatorAnimatables.fs ? getProp(elem, textAnimatorAnimatables.fs, 0, 0.01, container) : defaultData,\n fb: textAnimatorAnimatables.fb ? getProp(elem, textAnimatorAnimatables.fb, 0, 0.01, container) : defaultData,\n t: textAnimatorAnimatables.t ? getProp(elem, textAnimatorAnimatables.t, 0, 0, container) : defaultData\n };\n this.s = TextSelectorProp.getTextSelectorProp(elem, animatorProps.s, container);\n this.s.t = animatorProps.s.t;\n }\n\n function TextAnimatorProperty(textData, renderType, elem) {\n this._isFirstFrame = true;\n this._hasMaskedPath = false;\n this._frameId = -1;\n this._textData = textData;\n this._renderType = renderType;\n this._elem = elem;\n this._animatorsData = createSizedArray(this._textData.a.length);\n this._pathData = {};\n this._moreOptions = {\n alignment: {}\n };\n this.renderedLetters = [];\n this.lettersChangedFlag = false;\n this.initDynamicPropertyContainer(elem);\n }\n\n TextAnimatorProperty.prototype.searchProperties = function () {\n var i;\n var len = this._textData.a.length;\n var animatorProps;\n var getProp = PropertyFactory.getProp;\n\n for (i = 0; i < len; i += 1) {\n animatorProps = this._textData.a[i];\n this._animatorsData[i] = new TextAnimatorDataProperty(this._elem, animatorProps, this);\n }\n\n if (this._textData.p && 'm' in this._textData.p) {\n this._pathData = {\n a: getProp(this._elem, this._textData.p.a, 0, 0, this),\n f: getProp(this._elem, this._textData.p.f, 0, 0, this),\n l: getProp(this._elem, this._textData.p.l, 0, 0, this),\n r: getProp(this._elem, this._textData.p.r, 0, 0, this),\n p: getProp(this._elem, this._textData.p.p, 0, 0, this),\n m: this._elem.maskManager.getMaskProperty(this._textData.p.m)\n };\n this._hasMaskedPath = true;\n } else {\n this._hasMaskedPath = false;\n }\n\n this._moreOptions.alignment = getProp(this._elem, this._textData.m.a, 1, 0, this);\n };\n\n TextAnimatorProperty.prototype.getMeasures = function (documentData, lettersChangedFlag) {\n this.lettersChangedFlag = lettersChangedFlag;\n\n if (!this._mdf && !this._isFirstFrame && !lettersChangedFlag && (!this._hasMaskedPath || !this._pathData.m._mdf)) {\n return;\n }\n\n this._isFirstFrame = false;\n var alignment = this._moreOptions.alignment.v;\n var animators = this._animatorsData;\n var textData = this._textData;\n var matrixHelper = this.mHelper;\n var renderType = this._renderType;\n var renderedLettersCount = this.renderedLetters.length;\n var xPos;\n var yPos;\n var i;\n var len;\n var letters = documentData.l;\n var pathInfo;\n var currentLength;\n var currentPoint;\n var segmentLength;\n var flag;\n var pointInd;\n var segmentInd;\n var prevPoint;\n var points;\n var segments;\n var partialLength;\n var totalLength;\n var perc;\n var tanAngle;\n var mask;\n\n if (this._hasMaskedPath) {\n mask = this._pathData.m;\n\n if (!this._pathData.n || this._pathData._mdf) {\n var paths = mask.v;\n\n if (this._pathData.r.v) {\n paths = paths.reverse();\n } // TODO: release bezier data cached from previous pathInfo: this._pathData.pi\n\n\n pathInfo = {\n tLength: 0,\n segments: []\n };\n len = paths._length - 1;\n var bezierData;\n totalLength = 0;\n\n for (i = 0; i < len; i += 1) {\n bezierData = bez.buildBezierData(paths.v[i], paths.v[i + 1], [paths.o[i][0] - paths.v[i][0], paths.o[i][1] - paths.v[i][1]], [paths.i[i + 1][0] - paths.v[i + 1][0], paths.i[i + 1][1] - paths.v[i + 1][1]]);\n pathInfo.tLength += bezierData.segmentLength;\n pathInfo.segments.push(bezierData);\n totalLength += bezierData.segmentLength;\n }\n\n i = len;\n\n if (mask.v.c) {\n bezierData = bez.buildBezierData(paths.v[i], paths.v[0], [paths.o[i][0] - paths.v[i][0], paths.o[i][1] - paths.v[i][1]], [paths.i[0][0] - paths.v[0][0], paths.i[0][1] - paths.v[0][1]]);\n pathInfo.tLength += bezierData.segmentLength;\n pathInfo.segments.push(bezierData);\n totalLength += bezierData.segmentLength;\n }\n\n this._pathData.pi = pathInfo;\n }\n\n pathInfo = this._pathData.pi;\n currentLength = this._pathData.f.v;\n segmentInd = 0;\n pointInd = 1;\n segmentLength = 0;\n flag = true;\n segments = pathInfo.segments;\n\n if (currentLength < 0 && mask.v.c) {\n if (pathInfo.tLength < Math.abs(currentLength)) {\n currentLength = -Math.abs(currentLength) % pathInfo.tLength;\n }\n\n segmentInd = segments.length - 1;\n points = segments[segmentInd].points;\n pointInd = points.length - 1;\n\n while (currentLength < 0) {\n currentLength += points[pointInd].partialLength;\n pointInd -= 1;\n\n if (pointInd < 0) {\n segmentInd -= 1;\n points = segments[segmentInd].points;\n pointInd = points.length - 1;\n }\n }\n }\n\n points = segments[segmentInd].points;\n prevPoint = points[pointInd - 1];\n currentPoint = points[pointInd];\n partialLength = currentPoint.partialLength;\n }\n\n len = letters.length;\n xPos = 0;\n yPos = 0;\n var yOff = documentData.finalSize * 1.2 * 0.714;\n var firstLine = true;\n var animatorProps;\n var animatorSelector;\n var j;\n var jLen;\n var letterValue;\n jLen = animators.length;\n var mult;\n var ind = -1;\n var offf;\n var xPathPos;\n var yPathPos;\n var initPathPos = currentLength;\n var initSegmentInd = segmentInd;\n var initPointInd = pointInd;\n var currentLine = -1;\n var elemOpacity;\n var sc;\n var sw;\n var fc;\n var k;\n var letterSw;\n var letterSc;\n var letterFc;\n var letterM = '';\n var letterP = this.defaultPropsArray;\n var letterO; //\n\n if (documentData.j === 2 || documentData.j === 1) {\n var animatorJustifyOffset = 0;\n var animatorFirstCharOffset = 0;\n var justifyOffsetMult = documentData.j === 2 ? -0.5 : -1;\n var lastIndex = 0;\n var isNewLine = true;\n\n for (i = 0; i < len; i += 1) {\n if (letters[i].n) {\n if (animatorJustifyOffset) {\n animatorJustifyOffset += animatorFirstCharOffset;\n }\n\n while (lastIndex < i) {\n letters[lastIndex].animatorJustifyOffset = animatorJustifyOffset;\n lastIndex += 1;\n }\n\n animatorJustifyOffset = 0;\n isNewLine = true;\n } else {\n for (j = 0; j < jLen; j += 1) {\n animatorProps = animators[j].a;\n\n if (animatorProps.t.propType) {\n if (isNewLine && documentData.j === 2) {\n animatorFirstCharOffset += animatorProps.t.v * justifyOffsetMult;\n }\n\n animatorSelector = animators[j].s;\n mult = animatorSelector.getMult(letters[i].anIndexes[j], textData.a[j].s.totalChars);\n\n if (mult.length) {\n animatorJustifyOffset += animatorProps.t.v * mult[0] * justifyOffsetMult;\n } else {\n animatorJustifyOffset += animatorProps.t.v * mult * justifyOffsetMult;\n }\n }\n }\n\n isNewLine = false;\n }\n }\n\n if (animatorJustifyOffset) {\n animatorJustifyOffset += animatorFirstCharOffset;\n }\n\n while (lastIndex < i) {\n letters[lastIndex].animatorJustifyOffset = animatorJustifyOffset;\n lastIndex += 1;\n }\n } //\n\n\n for (i = 0; i < len; i += 1) {\n matrixHelper.reset();\n elemOpacity = 1;\n\n if (letters[i].n) {\n xPos = 0;\n yPos += documentData.yOffset;\n yPos += firstLine ? 1 : 0;\n currentLength = initPathPos;\n firstLine = false;\n\n if (this._hasMaskedPath) {\n segmentInd = initSegmentInd;\n pointInd = initPointInd;\n points = segments[segmentInd].points;\n prevPoint = points[pointInd - 1];\n currentPoint = points[pointInd];\n partialLength = currentPoint.partialLength;\n segmentLength = 0;\n }\n\n letterM = '';\n letterFc = '';\n letterSw = '';\n letterO = '';\n letterP = this.defaultPropsArray;\n } else {\n if (this._hasMaskedPath) {\n if (currentLine !== letters[i].line) {\n switch (documentData.j) {\n case 1:\n currentLength += totalLength - documentData.lineWidths[letters[i].line];\n break;\n\n case 2:\n currentLength += (totalLength - documentData.lineWidths[letters[i].line]) / 2;\n break;\n\n default:\n break;\n }\n\n currentLine = letters[i].line;\n }\n\n if (ind !== letters[i].ind) {\n if (letters[ind]) {\n currentLength += letters[ind].extra;\n }\n\n currentLength += letters[i].an / 2;\n ind = letters[i].ind;\n }\n\n currentLength += alignment[0] * letters[i].an * 0.005;\n var animatorOffset = 0;\n\n for (j = 0; j < jLen; j += 1) {\n animatorProps = animators[j].a;\n\n if (animatorProps.p.propType) {\n animatorSelector = animators[j].s;\n mult = animatorSelector.getMult(letters[i].anIndexes[j], textData.a[j].s.totalChars);\n\n if (mult.length) {\n animatorOffset += animatorProps.p.v[0] * mult[0];\n } else {\n animatorOffset += animatorProps.p.v[0] * mult;\n }\n }\n\n if (animatorProps.a.propType) {\n animatorSelector = animators[j].s;\n mult = animatorSelector.getMult(letters[i].anIndexes[j], textData.a[j].s.totalChars);\n\n if (mult.length) {\n animatorOffset += animatorProps.a.v[0] * mult[0];\n } else {\n animatorOffset += animatorProps.a.v[0] * mult;\n }\n }\n }\n\n flag = true; // Force alignment only works with a single line for now\n\n if (this._pathData.a.v) {\n currentLength = letters[0].an * 0.5 + (totalLength - this._pathData.f.v - letters[0].an * 0.5 - letters[letters.length - 1].an * 0.5) * ind / (len - 1);\n currentLength += this._pathData.f.v;\n }\n\n while (flag) {\n if (segmentLength + partialLength >= currentLength + animatorOffset || !points) {\n perc = (currentLength + animatorOffset - segmentLength) / currentPoint.partialLength;\n xPathPos = prevPoint.point[0] + (currentPoint.point[0] - prevPoint.point[0]) * perc;\n yPathPos = prevPoint.point[1] + (currentPoint.point[1] - prevPoint.point[1]) * perc;\n matrixHelper.translate(-alignment[0] * letters[i].an * 0.005, -(alignment[1] * yOff) * 0.01);\n flag = false;\n } else if (points) {\n segmentLength += currentPoint.partialLength;\n pointInd += 1;\n\n if (pointInd >= points.length) {\n pointInd = 0;\n segmentInd += 1;\n\n if (!segments[segmentInd]) {\n if (mask.v.c) {\n pointInd = 0;\n segmentInd = 0;\n points = segments[segmentInd].points;\n } else {\n segmentLength -= currentPoint.partialLength;\n points = null;\n }\n } else {\n points = segments[segmentInd].points;\n }\n }\n\n if (points) {\n prevPoint = currentPoint;\n currentPoint = points[pointInd];\n partialLength = currentPoint.partialLength;\n }\n }\n }\n\n offf = letters[i].an / 2 - letters[i].add;\n matrixHelper.translate(-offf, 0, 0);\n } else {\n offf = letters[i].an / 2 - letters[i].add;\n matrixHelper.translate(-offf, 0, 0); // Grouping alignment\n\n matrixHelper.translate(-alignment[0] * letters[i].an * 0.005, -alignment[1] * yOff * 0.01, 0);\n }\n\n for (j = 0; j < jLen; j += 1) {\n animatorProps = animators[j].a;\n\n if (animatorProps.t.propType) {\n animatorSelector = animators[j].s;\n mult = animatorSelector.getMult(letters[i].anIndexes[j], textData.a[j].s.totalChars); // This condition is to prevent applying tracking to first character in each line. Might be better to use a boolean \"isNewLine\"\n\n if (xPos !== 0 || documentData.j !== 0) {\n if (this._hasMaskedPath) {\n if (mult.length) {\n currentLength += animatorProps.t.v * mult[0];\n } else {\n currentLength += animatorProps.t.v * mult;\n }\n } else if (mult.length) {\n xPos += animatorProps.t.v * mult[0];\n } else {\n xPos += animatorProps.t.v * mult;\n }\n }\n }\n }\n\n if (documentData.strokeWidthAnim) {\n sw = documentData.sw || 0;\n }\n\n if (documentData.strokeColorAnim) {\n if (documentData.sc) {\n sc = [documentData.sc[0], documentData.sc[1], documentData.sc[2]];\n } else {\n sc = [0, 0, 0];\n }\n }\n\n if (documentData.fillColorAnim && documentData.fc) {\n fc = [documentData.fc[0], documentData.fc[1], documentData.fc[2]];\n }\n\n for (j = 0; j < jLen; j += 1) {\n animatorProps = animators[j].a;\n\n if (animatorProps.a.propType) {\n animatorSelector = animators[j].s;\n mult = animatorSelector.getMult(letters[i].anIndexes[j], textData.a[j].s.totalChars);\n\n if (mult.length) {\n matrixHelper.translate(-animatorProps.a.v[0] * mult[0], -animatorProps.a.v[1] * mult[1], animatorProps.a.v[2] * mult[2]);\n } else {\n matrixHelper.translate(-animatorProps.a.v[0] * mult, -animatorProps.a.v[1] * mult, animatorProps.a.v[2] * mult);\n }\n }\n }\n\n for (j = 0; j < jLen; j += 1) {\n animatorProps = animators[j].a;\n\n if (animatorProps.s.propType) {\n animatorSelector = animators[j].s;\n mult = animatorSelector.getMult(letters[i].anIndexes[j], textData.a[j].s.totalChars);\n\n if (mult.length) {\n matrixHelper.scale(1 + (animatorProps.s.v[0] - 1) * mult[0], 1 + (animatorProps.s.v[1] - 1) * mult[1], 1);\n } else {\n matrixHelper.scale(1 + (animatorProps.s.v[0] - 1) * mult, 1 + (animatorProps.s.v[1] - 1) * mult, 1);\n }\n }\n }\n\n for (j = 0; j < jLen; j += 1) {\n animatorProps = animators[j].a;\n animatorSelector = animators[j].s;\n mult = animatorSelector.getMult(letters[i].anIndexes[j], textData.a[j].s.totalChars);\n\n if (animatorProps.sk.propType) {\n if (mult.length) {\n matrixHelper.skewFromAxis(-animatorProps.sk.v * mult[0], animatorProps.sa.v * mult[1]);\n } else {\n matrixHelper.skewFromAxis(-animatorProps.sk.v * mult, animatorProps.sa.v * mult);\n }\n }\n\n if (animatorProps.r.propType) {\n if (mult.length) {\n matrixHelper.rotateZ(-animatorProps.r.v * mult[2]);\n } else {\n matrixHelper.rotateZ(-animatorProps.r.v * mult);\n }\n }\n\n if (animatorProps.ry.propType) {\n if (mult.length) {\n matrixHelper.rotateY(animatorProps.ry.v * mult[1]);\n } else {\n matrixHelper.rotateY(animatorProps.ry.v * mult);\n }\n }\n\n if (animatorProps.rx.propType) {\n if (mult.length) {\n matrixHelper.rotateX(animatorProps.rx.v * mult[0]);\n } else {\n matrixHelper.rotateX(animatorProps.rx.v * mult);\n }\n }\n\n if (animatorProps.o.propType) {\n if (mult.length) {\n elemOpacity += (animatorProps.o.v * mult[0] - elemOpacity) * mult[0];\n } else {\n elemOpacity += (animatorProps.o.v * mult - elemOpacity) * mult;\n }\n }\n\n if (documentData.strokeWidthAnim && animatorProps.sw.propType) {\n if (mult.length) {\n sw += animatorProps.sw.v * mult[0];\n } else {\n sw += animatorProps.sw.v * mult;\n }\n }\n\n if (documentData.strokeColorAnim && animatorProps.sc.propType) {\n for (k = 0; k < 3; k += 1) {\n if (mult.length) {\n sc[k] += (animatorProps.sc.v[k] - sc[k]) * mult[0];\n } else {\n sc[k] += (animatorProps.sc.v[k] - sc[k]) * mult;\n }\n }\n }\n\n if (documentData.fillColorAnim && documentData.fc) {\n if (animatorProps.fc.propType) {\n for (k = 0; k < 3; k += 1) {\n if (mult.length) {\n fc[k] += (animatorProps.fc.v[k] - fc[k]) * mult[0];\n } else {\n fc[k] += (animatorProps.fc.v[k] - fc[k]) * mult;\n }\n }\n }\n\n if (animatorProps.fh.propType) {\n if (mult.length) {\n fc = addHueToRGB(fc, animatorProps.fh.v * mult[0]);\n } else {\n fc = addHueToRGB(fc, animatorProps.fh.v * mult);\n }\n }\n\n if (animatorProps.fs.propType) {\n if (mult.length) {\n fc = addSaturationToRGB(fc, animatorProps.fs.v * mult[0]);\n } else {\n fc = addSaturationToRGB(fc, animatorProps.fs.v * mult);\n }\n }\n\n if (animatorProps.fb.propType) {\n if (mult.length) {\n fc = addBrightnessToRGB(fc, animatorProps.fb.v * mult[0]);\n } else {\n fc = addBrightnessToRGB(fc, animatorProps.fb.v * mult);\n }\n }\n }\n }\n\n for (j = 0; j < jLen; j += 1) {\n animatorProps = animators[j].a;\n\n if (animatorProps.p.propType) {\n animatorSelector = animators[j].s;\n mult = animatorSelector.getMult(letters[i].anIndexes[j], textData.a[j].s.totalChars);\n\n if (this._hasMaskedPath) {\n if (mult.length) {\n matrixHelper.translate(0, animatorProps.p.v[1] * mult[0], -animatorProps.p.v[2] * mult[1]);\n } else {\n matrixHelper.translate(0, animatorProps.p.v[1] * mult, -animatorProps.p.v[2] * mult);\n }\n } else if (mult.length) {\n matrixHelper.translate(animatorProps.p.v[0] * mult[0], animatorProps.p.v[1] * mult[1], -animatorProps.p.v[2] * mult[2]);\n } else {\n matrixHelper.translate(animatorProps.p.v[0] * mult, animatorProps.p.v[1] * mult, -animatorProps.p.v[2] * mult);\n }\n }\n }\n\n if (documentData.strokeWidthAnim) {\n letterSw = sw < 0 ? 0 : sw;\n }\n\n if (documentData.strokeColorAnim) {\n letterSc = 'rgb(' + Math.round(sc[0] * 255) + ',' + Math.round(sc[1] * 255) + ',' + Math.round(sc[2] * 255) + ')';\n }\n\n if (documentData.fillColorAnim && documentData.fc) {\n letterFc = 'rgb(' + Math.round(fc[0] * 255) + ',' + Math.round(fc[1] * 255) + ',' + Math.round(fc[2] * 255) + ')';\n }\n\n if (this._hasMaskedPath) {\n matrixHelper.translate(0, -documentData.ls);\n matrixHelper.translate(0, alignment[1] * yOff * 0.01 + yPos, 0);\n\n if (this._pathData.p.v) {\n tanAngle = (currentPoint.point[1] - prevPoint.point[1]) / (currentPoint.point[0] - prevPoint.point[0]);\n var rot = Math.atan(tanAngle) * 180 / Math.PI;\n\n if (currentPoint.point[0] < prevPoint.point[0]) {\n rot += 180;\n }\n\n matrixHelper.rotate(-rot * Math.PI / 180);\n }\n\n matrixHelper.translate(xPathPos, yPathPos, 0);\n currentLength -= alignment[0] * letters[i].an * 0.005;\n\n if (letters[i + 1] && ind !== letters[i + 1].ind) {\n currentLength += letters[i].an / 2;\n currentLength += documentData.tr * 0.001 * documentData.finalSize;\n }\n } else {\n matrixHelper.translate(xPos, yPos, 0);\n\n if (documentData.ps) {\n // matrixHelper.translate(documentData.ps[0],documentData.ps[1],0);\n matrixHelper.translate(documentData.ps[0], documentData.ps[1] + documentData.ascent, 0);\n }\n\n switch (documentData.j) {\n case 1:\n matrixHelper.translate(letters[i].animatorJustifyOffset + documentData.justifyOffset + (documentData.boxWidth - documentData.lineWidths[letters[i].line]), 0, 0);\n break;\n\n case 2:\n matrixHelper.translate(letters[i].animatorJustifyOffset + documentData.justifyOffset + (documentData.boxWidth - documentData.lineWidths[letters[i].line]) / 2, 0, 0);\n break;\n\n default:\n break;\n }\n\n matrixHelper.translate(0, -documentData.ls);\n matrixHelper.translate(offf, 0, 0);\n matrixHelper.translate(alignment[0] * letters[i].an * 0.005, alignment[1] * yOff * 0.01, 0);\n xPos += letters[i].l + documentData.tr * 0.001 * documentData.finalSize;\n }\n\n if (renderType === 'html') {\n letterM = matrixHelper.toCSS();\n } else if (renderType === 'svg') {\n letterM = matrixHelper.to2dCSS();\n } else {\n letterP = [matrixHelper.props[0], matrixHelper.props[1], matrixHelper.props[2], matrixHelper.props[3], matrixHelper.props[4], matrixHelper.props[5], matrixHelper.props[6], matrixHelper.props[7], matrixHelper.props[8], matrixHelper.props[9], matrixHelper.props[10], matrixHelper.props[11], matrixHelper.props[12], matrixHelper.props[13], matrixHelper.props[14], matrixHelper.props[15]];\n }\n\n letterO = elemOpacity;\n }\n\n if (renderedLettersCount <= i) {\n letterValue = new LetterProps(letterO, letterSw, letterSc, letterFc, letterM, letterP);\n this.renderedLetters.push(letterValue);\n renderedLettersCount += 1;\n this.lettersChangedFlag = true;\n } else {\n letterValue = this.renderedLetters[i];\n this.lettersChangedFlag = letterValue.update(letterO, letterSw, letterSc, letterFc, letterM, letterP) || this.lettersChangedFlag;\n }\n }\n };\n\n TextAnimatorProperty.prototype.getValue = function () {\n if (this._elem.globalData.frameId === this._frameId) {\n return;\n }\n\n this._frameId = this._elem.globalData.frameId;\n this.iterateDynamicProperties();\n };\n\n TextAnimatorProperty.prototype.mHelper = new Matrix();\n TextAnimatorProperty.prototype.defaultPropsArray = [];\n extendPrototype([DynamicPropertyContainer], TextAnimatorProperty);\n\n function ITextElement() {}\n\n ITextElement.prototype.initElement = function (data, globalData, comp) {\n this.lettersChangedFlag = true;\n this.initFrame();\n this.initBaseData(data, globalData, comp);\n this.textProperty = new TextProperty(this, data.t, this.dynamicProperties);\n this.textAnimator = new TextAnimatorProperty(data.t, this.renderType, this);\n this.initTransform(data, globalData, comp);\n this.initHierarchy();\n this.initRenderable();\n this.initRendererElement();\n this.createContainerElements();\n this.createRenderableComponents();\n this.createContent();\n this.hide();\n this.textAnimator.searchProperties(this.dynamicProperties);\n };\n\n ITextElement.prototype.prepareFrame = function (num) {\n this._mdf = false;\n this.prepareRenderableFrame(num);\n this.prepareProperties(num, this.isInRange);\n };\n\n ITextElement.prototype.createPathShape = function (matrixHelper, shapes) {\n var j;\n var jLen = shapes.length;\n var pathNodes;\n var shapeStr = '';\n\n for (j = 0; j < jLen; j += 1) {\n if (shapes[j].ty === 'sh') {\n pathNodes = shapes[j].ks.k;\n shapeStr += buildShapeString(pathNodes, pathNodes.i.length, true, matrixHelper);\n }\n }\n\n return shapeStr;\n };\n\n ITextElement.prototype.updateDocumentData = function (newData, index) {\n this.textProperty.updateDocumentData(newData, index);\n };\n\n ITextElement.prototype.canResizeFont = function (_canResize) {\n this.textProperty.canResizeFont(_canResize);\n };\n\n ITextElement.prototype.setMinimumFontSize = function (_fontSize) {\n this.textProperty.setMinimumFontSize(_fontSize);\n };\n\n ITextElement.prototype.applyTextPropertiesToMatrix = function (documentData, matrixHelper, lineNumber, xPos, yPos) {\n if (documentData.ps) {\n matrixHelper.translate(documentData.ps[0], documentData.ps[1] + documentData.ascent, 0);\n }\n\n matrixHelper.translate(0, -documentData.ls, 0);\n\n switch (documentData.j) {\n case 1:\n matrixHelper.translate(documentData.justifyOffset + (documentData.boxWidth - documentData.lineWidths[lineNumber]), 0, 0);\n break;\n\n case 2:\n matrixHelper.translate(documentData.justifyOffset + (documentData.boxWidth - documentData.lineWidths[lineNumber]) / 2, 0, 0);\n break;\n\n default:\n break;\n }\n\n matrixHelper.translate(xPos, yPos, 0);\n };\n\n ITextElement.prototype.buildColor = function (colorData) {\n return 'rgb(' + Math.round(colorData[0] * 255) + ',' + Math.round(colorData[1] * 255) + ',' + Math.round(colorData[2] * 255) + ')';\n };\n\n ITextElement.prototype.emptyProp = new LetterProps();\n\n ITextElement.prototype.destroy = function () {};\n\n ITextElement.prototype.validateText = function () {\n if (this.textProperty._mdf || this.textProperty._isFirstFrame) {\n this.buildNewText();\n this.textProperty._isFirstFrame = false;\n this.textProperty._mdf = false;\n }\n };\n\n var emptyShapeData = {\n shapes: []\n };\n\n function SVGTextLottieElement(data, globalData, comp) {\n this.textSpans = [];\n this.renderType = 'svg';\n this.initElement(data, globalData, comp);\n }\n\n extendPrototype([BaseElement, TransformElement, SVGBaseElement, HierarchyElement, FrameElement, RenderableDOMElement, ITextElement], SVGTextLottieElement);\n\n SVGTextLottieElement.prototype.createContent = function () {\n if (this.data.singleShape && !this.globalData.fontManager.chars) {\n this.textContainer = createNS('text');\n }\n };\n\n SVGTextLottieElement.prototype.buildTextContents = function (textArray) {\n var i = 0;\n var len = textArray.length;\n var textContents = [];\n var currentTextContent = '';\n\n while (i < len) {\n if (textArray[i] === String.fromCharCode(13) || textArray[i] === String.fromCharCode(3)) {\n textContents.push(currentTextContent);\n currentTextContent = '';\n } else {\n currentTextContent += textArray[i];\n }\n\n i += 1;\n }\n\n textContents.push(currentTextContent);\n return textContents;\n };\n\n SVGTextLottieElement.prototype.buildShapeData = function (data, scale) {\n // data should probably be cloned to apply scale separately to each instance of a text on different layers\n // but since text internal content gets only rendered once and then it's never rerendered,\n // it's probably safe not to clone data and reuse always the same instance even if the object is mutated.\n // Avoiding cloning is preferred since cloning each character shape data is expensive\n if (data.shapes && data.shapes.length) {\n var shape = data.shapes[0];\n\n if (shape.it) {\n var shapeItem = shape.it[shape.it.length - 1];\n\n if (shapeItem.s) {\n shapeItem.s.k[0] = scale;\n shapeItem.s.k[1] = scale;\n }\n }\n }\n\n return data;\n };\n\n SVGTextLottieElement.prototype.buildNewText = function () {\n this.addDynamicProperty(this);\n var i;\n var len;\n var documentData = this.textProperty.currentData;\n this.renderedLetters = createSizedArray(documentData ? documentData.l.length : 0);\n\n if (documentData.fc) {\n this.layerElement.setAttribute('fill', this.buildColor(documentData.fc));\n } else {\n this.layerElement.setAttribute('fill', 'rgba(0,0,0,0)');\n }\n\n if (documentData.sc) {\n this.layerElement.setAttribute('stroke', this.buildColor(documentData.sc));\n this.layerElement.setAttribute('stroke-width', documentData.sw);\n }\n\n this.layerElement.setAttribute('font-size', documentData.finalSize);\n var fontData = this.globalData.fontManager.getFontByName(documentData.f);\n\n if (fontData.fClass) {\n this.layerElement.setAttribute('class', fontData.fClass);\n } else {\n this.layerElement.setAttribute('font-family', fontData.fFamily);\n var fWeight = documentData.fWeight;\n var fStyle = documentData.fStyle;\n this.layerElement.setAttribute('font-style', fStyle);\n this.layerElement.setAttribute('font-weight', fWeight);\n }\n\n this.layerElement.setAttribute('aria-label', documentData.t);\n var letters = documentData.l || [];\n var usesGlyphs = !!this.globalData.fontManager.chars;\n len = letters.length;\n var tSpan;\n var matrixHelper = this.mHelper;\n var shapeStr = '';\n var singleShape = this.data.singleShape;\n var xPos = 0;\n var yPos = 0;\n var firstLine = true;\n var trackingOffset = documentData.tr * 0.001 * documentData.finalSize;\n\n if (singleShape && !usesGlyphs && !documentData.sz) {\n var tElement = this.textContainer;\n var justify = 'start';\n\n switch (documentData.j) {\n case 1:\n justify = 'end';\n break;\n\n case 2:\n justify = 'middle';\n break;\n\n default:\n justify = 'start';\n break;\n }\n\n tElement.setAttribute('text-anchor', justify);\n tElement.setAttribute('letter-spacing', trackingOffset);\n var textContent = this.buildTextContents(documentData.finalText);\n len = textContent.length;\n yPos = documentData.ps ? documentData.ps[1] + documentData.ascent : 0;\n\n for (i = 0; i < len; i += 1) {\n tSpan = this.textSpans[i].span || createNS('tspan');\n tSpan.textContent = textContent[i];\n tSpan.setAttribute('x', 0);\n tSpan.setAttribute('y', yPos);\n tSpan.style.display = 'inherit';\n tElement.appendChild(tSpan);\n\n if (!this.textSpans[i]) {\n this.textSpans[i] = {\n span: null,\n glyph: null\n };\n }\n\n this.textSpans[i].span = tSpan;\n yPos += documentData.finalLineHeight;\n }\n\n this.layerElement.appendChild(tElement);\n } else {\n var cachedSpansLength = this.textSpans.length;\n var charData;\n\n for (i = 0; i < len; i += 1) {\n if (!this.textSpans[i]) {\n this.textSpans[i] = {\n span: null,\n childSpan: null,\n glyph: null\n };\n }\n\n if (!usesGlyphs || !singleShape || i === 0) {\n tSpan = cachedSpansLength > i ? this.textSpans[i].span : createNS(usesGlyphs ? 'g' : 'text');\n\n if (cachedSpansLength <= i) {\n tSpan.setAttribute('stroke-linecap', 'butt');\n tSpan.setAttribute('stroke-linejoin', 'round');\n tSpan.setAttribute('stroke-miterlimit', '4');\n this.textSpans[i].span = tSpan;\n\n if (usesGlyphs) {\n var childSpan = createNS('g');\n tSpan.appendChild(childSpan);\n this.textSpans[i].childSpan = childSpan;\n }\n\n this.textSpans[i].span = tSpan;\n this.layerElement.appendChild(tSpan);\n }\n\n tSpan.style.display = 'inherit';\n }\n\n matrixHelper.reset();\n\n if (singleShape) {\n if (letters[i].n) {\n xPos = -trackingOffset;\n yPos += documentData.yOffset;\n yPos += firstLine ? 1 : 0;\n firstLine = false;\n }\n\n this.applyTextPropertiesToMatrix(documentData, matrixHelper, letters[i].line, xPos, yPos);\n xPos += letters[i].l || 0; // xPos += letters[i].val === ' ' ? 0 : trackingOffset;\n\n xPos += trackingOffset;\n }\n\n if (usesGlyphs) {\n charData = this.globalData.fontManager.getCharData(documentData.finalText[i], fontData.fStyle, this.globalData.fontManager.getFontByName(documentData.f).fFamily);\n var glyphElement; // t === 1 means the character has been replaced with an animated shaped\n\n if (charData.t === 1) {\n glyphElement = new SVGCompElement(charData.data, this.globalData, this);\n } else {\n var data = emptyShapeData;\n\n if (charData.data && charData.data.shapes) {\n data = this.buildShapeData(charData.data, documentData.finalSize);\n }\n\n glyphElement = new SVGShapeElement(data, this.globalData, this);\n }\n\n if (this.textSpans[i].glyph) {\n var glyph = this.textSpans[i].glyph;\n this.textSpans[i].childSpan.removeChild(glyph.layerElement);\n glyph.destroy();\n }\n\n this.textSpans[i].glyph = glyphElement;\n glyphElement._debug = true;\n glyphElement.prepareFrame(0);\n glyphElement.renderFrame();\n this.textSpans[i].childSpan.appendChild(glyphElement.layerElement); // when using animated shapes, the layer will be scaled instead of replacing the internal scale\n // this might have issues with strokes and might need a different solution\n\n if (charData.t === 1) {\n this.textSpans[i].childSpan.setAttribute('transform', 'scale(' + documentData.finalSize / 100 + ',' + documentData.finalSize / 100 + ')');\n }\n } else {\n if (singleShape) {\n tSpan.setAttribute('transform', 'translate(' + matrixHelper.props[12] + ',' + matrixHelper.props[13] + ')');\n }\n\n tSpan.textContent = letters[i].val;\n tSpan.setAttributeNS('http://www.w3.org/XML/1998/namespace', 'xml:space', 'preserve');\n } //\n\n }\n\n if (singleShape && tSpan) {\n tSpan.setAttribute('d', shapeStr);\n }\n }\n\n while (i < this.textSpans.length) {\n this.textSpans[i].span.style.display = 'none';\n i += 1;\n }\n\n this._sizeChanged = true;\n };\n\n SVGTextLottieElement.prototype.sourceRectAtTime = function () {\n this.prepareFrame(this.comp.renderedFrame - this.data.st);\n this.renderInnerContent();\n\n if (this._sizeChanged) {\n this._sizeChanged = false;\n var textBox = this.layerElement.getBBox();\n this.bbox = {\n top: textBox.y,\n left: textBox.x,\n width: textBox.width,\n height: textBox.height\n };\n }\n\n return this.bbox;\n };\n\n SVGTextLottieElement.prototype.getValue = function () {\n var i;\n var len = this.textSpans.length;\n var glyphElement;\n this.renderedFrame = this.comp.renderedFrame;\n\n for (i = 0; i < len; i += 1) {\n glyphElement = this.textSpans[i].glyph;\n\n if (glyphElement) {\n glyphElement.prepareFrame(this.comp.renderedFrame - this.data.st);\n\n if (glyphElement._mdf) {\n this._mdf = true;\n }\n }\n }\n };\n\n SVGTextLottieElement.prototype.renderInnerContent = function () {\n this.validateText();\n\n if (!this.data.singleShape || this._mdf) {\n this.textAnimator.getMeasures(this.textProperty.currentData, this.lettersChangedFlag);\n\n if (this.lettersChangedFlag || this.textAnimator.lettersChangedFlag) {\n this._sizeChanged = true;\n var i;\n var len;\n var renderedLetters = this.textAnimator.renderedLetters;\n var letters = this.textProperty.currentData.l;\n len = letters.length;\n var renderedLetter;\n var textSpan;\n var glyphElement;\n\n for (i = 0; i < len; i += 1) {\n if (!letters[i].n) {\n renderedLetter = renderedLetters[i];\n textSpan = this.textSpans[i].span;\n glyphElement = this.textSpans[i].glyph;\n\n if (glyphElement) {\n glyphElement.renderFrame();\n }\n\n if (renderedLetter._mdf.m) {\n textSpan.setAttribute('transform', renderedLetter.m);\n }\n\n if (renderedLetter._mdf.o) {\n textSpan.setAttribute('opacity', renderedLetter.o);\n }\n\n if (renderedLetter._mdf.sw) {\n textSpan.setAttribute('stroke-width', renderedLetter.sw);\n }\n\n if (renderedLetter._mdf.sc) {\n textSpan.setAttribute('stroke', renderedLetter.sc);\n }\n\n if (renderedLetter._mdf.fc) {\n textSpan.setAttribute('fill', renderedLetter.fc);\n }\n }\n }\n }\n }\n };\n\n function ISolidElement(data, globalData, comp) {\n this.initElement(data, globalData, comp);\n }\n\n extendPrototype([IImageElement], ISolidElement);\n\n ISolidElement.prototype.createContent = function () {\n var rect = createNS('rect'); /// /rect.style.width = this.data.sw;\n /// /rect.style.height = this.data.sh;\n /// /rect.style.fill = this.data.sc;\n\n rect.setAttribute('width', this.data.sw);\n rect.setAttribute('height', this.data.sh);\n rect.setAttribute('fill', this.data.sc);\n this.layerElement.appendChild(rect);\n };\n\n function NullElement(data, globalData, comp) {\n this.initFrame();\n this.initBaseData(data, globalData, comp);\n this.initFrame();\n this.initTransform(data, globalData, comp);\n this.initHierarchy();\n }\n\n NullElement.prototype.prepareFrame = function (num) {\n this.prepareProperties(num, true);\n };\n\n NullElement.prototype.renderFrame = function () {};\n\n NullElement.prototype.getBaseElement = function () {\n return null;\n };\n\n NullElement.prototype.destroy = function () {};\n\n NullElement.prototype.sourceRectAtTime = function () {};\n\n NullElement.prototype.hide = function () {};\n\n extendPrototype([BaseElement, TransformElement, HierarchyElement, FrameElement], NullElement);\n\n function SVGRendererBase() {}\n\n extendPrototype([BaseRenderer], SVGRendererBase);\n\n SVGRendererBase.prototype.createNull = function (data) {\n return new NullElement(data, this.globalData, this);\n };\n\n SVGRendererBase.prototype.createShape = function (data) {\n return new SVGShapeElement(data, this.globalData, this);\n };\n\n SVGRendererBase.prototype.createText = function (data) {\n return new SVGTextLottieElement(data, this.globalData, this);\n };\n\n SVGRendererBase.prototype.createImage = function (data) {\n return new IImageElement(data, this.globalData, this);\n };\n\n SVGRendererBase.prototype.createSolid = function (data) {\n return new ISolidElement(data, this.globalData, this);\n };\n\n SVGRendererBase.prototype.configAnimation = function (animData) {\n this.svgElement.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\n this.svgElement.setAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink');\n\n if (this.renderConfig.viewBoxSize) {\n this.svgElement.setAttribute('viewBox', this.renderConfig.viewBoxSize);\n } else {\n this.svgElement.setAttribute('viewBox', '0 0 ' + animData.w + ' ' + animData.h);\n }\n\n if (!this.renderConfig.viewBoxOnly) {\n this.svgElement.setAttribute('width', animData.w);\n this.svgElement.setAttribute('height', animData.h);\n this.svgElement.style.width = '100%';\n this.svgElement.style.height = '100%';\n this.svgElement.style.transform = 'translate3d(0,0,0)';\n this.svgElement.style.contentVisibility = this.renderConfig.contentVisibility;\n }\n\n if (this.renderConfig.width) {\n this.svgElement.setAttribute('width', this.renderConfig.width);\n }\n\n if (this.renderConfig.height) {\n this.svgElement.setAttribute('height', this.renderConfig.height);\n }\n\n if (this.renderConfig.className) {\n this.svgElement.setAttribute('class', this.renderConfig.className);\n }\n\n if (this.renderConfig.id) {\n this.svgElement.setAttribute('id', this.renderConfig.id);\n }\n\n if (this.renderConfig.focusable !== undefined) {\n this.svgElement.setAttribute('focusable', this.renderConfig.focusable);\n }\n\n this.svgElement.setAttribute('preserveAspectRatio', this.renderConfig.preserveAspectRatio); // this.layerElement.style.transform = 'translate3d(0,0,0)';\n // this.layerElement.style.transformOrigin = this.layerElement.style.mozTransformOrigin = this.layerElement.style.webkitTransformOrigin = this.layerElement.style['-webkit-transform'] = \"0px 0px 0px\";\n\n this.animationItem.wrapper.appendChild(this.svgElement); // Mask animation\n\n var defs = this.globalData.defs;\n this.setupGlobalData(animData, defs);\n this.globalData.progressiveLoad = this.renderConfig.progressiveLoad;\n this.data = animData;\n var maskElement = createNS('clipPath');\n var rect = createNS('rect');\n rect.setAttribute('width', animData.w);\n rect.setAttribute('height', animData.h);\n rect.setAttribute('x', 0);\n rect.setAttribute('y', 0);\n var maskId = createElementID();\n maskElement.setAttribute('id', maskId);\n maskElement.appendChild(rect);\n this.layerElement.setAttribute('clip-path', 'url(' + getLocationHref() + '#' + maskId + ')');\n defs.appendChild(maskElement);\n this.layers = animData.layers;\n this.elements = createSizedArray(animData.layers.length);\n };\n\n SVGRendererBase.prototype.destroy = function () {\n if (this.animationItem.wrapper) {\n this.animationItem.wrapper.innerText = '';\n }\n\n this.layerElement = null;\n this.globalData.defs = null;\n var i;\n var len = this.layers ? this.layers.length : 0;\n\n for (i = 0; i < len; i += 1) {\n if (this.elements[i] && this.elements[i].destroy) {\n this.elements[i].destroy();\n }\n }\n\n this.elements.length = 0;\n this.destroyed = true;\n this.animationItem = null;\n };\n\n SVGRendererBase.prototype.updateContainerSize = function () {};\n\n SVGRendererBase.prototype.findIndexByInd = function (ind) {\n var i = 0;\n var len = this.layers.length;\n\n for (i = 0; i < len; i += 1) {\n if (this.layers[i].ind === ind) {\n return i;\n }\n }\n\n return -1;\n };\n\n SVGRendererBase.prototype.buildItem = function (pos) {\n var elements = this.elements;\n\n if (elements[pos] || this.layers[pos].ty === 99) {\n return;\n }\n\n elements[pos] = true;\n var element = this.createItem(this.layers[pos]);\n elements[pos] = element;\n\n if (getExpressionsPlugin()) {\n if (this.layers[pos].ty === 0) {\n this.globalData.projectInterface.registerComposition(element);\n }\n\n element.initExpressions();\n }\n\n this.appendElementInPos(element, pos);\n\n if (this.layers[pos].tt) {\n var elementIndex = 'tp' in this.layers[pos] ? this.findIndexByInd(this.layers[pos].tp) : pos - 1;\n\n if (elementIndex === -1) {\n return;\n }\n\n if (!this.elements[elementIndex] || this.elements[elementIndex] === true) {\n this.buildItem(elementIndex);\n this.addPendingElement(element);\n } else {\n var matteElement = elements[elementIndex];\n var matteMask = matteElement.getMatte(this.layers[pos].tt);\n element.setMatte(matteMask);\n }\n }\n };\n\n SVGRendererBase.prototype.checkPendingElements = function () {\n while (this.pendingElements.length) {\n var element = this.pendingElements.pop();\n element.checkParenting();\n\n if (element.data.tt) {\n var i = 0;\n var len = this.elements.length;\n\n while (i < len) {\n if (this.elements[i] === element) {\n var elementIndex = 'tp' in element.data ? this.findIndexByInd(element.data.tp) : i - 1;\n var matteElement = this.elements[elementIndex];\n var matteMask = matteElement.getMatte(this.layers[i].tt);\n element.setMatte(matteMask);\n break;\n }\n\n i += 1;\n }\n }\n }\n };\n\n SVGRendererBase.prototype.renderFrame = function (num) {\n if (this.renderedFrame === num || this.destroyed) {\n return;\n }\n\n if (num === null) {\n num = this.renderedFrame;\n } else {\n this.renderedFrame = num;\n } // console.log('-------');\n // console.log('FRAME ',num);\n\n\n this.globalData.frameNum = num;\n this.globalData.frameId += 1;\n this.globalData.projectInterface.currentFrame = num;\n this.globalData._mdf = false;\n var i;\n var len = this.layers.length;\n\n if (!this.completeLayers) {\n this.checkLayers(num);\n }\n\n for (i = len - 1; i >= 0; i -= 1) {\n if (this.completeLayers || this.elements[i]) {\n this.elements[i].prepareFrame(num - this.layers[i].st);\n }\n }\n\n if (this.globalData._mdf) {\n for (i = 0; i < len; i += 1) {\n if (this.completeLayers || this.elements[i]) {\n this.elements[i].renderFrame();\n }\n }\n }\n };\n\n SVGRendererBase.prototype.appendElementInPos = function (element, pos) {\n var newElement = element.getBaseElement();\n\n if (!newElement) {\n return;\n }\n\n var i = 0;\n var nextElement;\n\n while (i < pos) {\n if (this.elements[i] && this.elements[i] !== true && this.elements[i].getBaseElement()) {\n nextElement = this.elements[i].getBaseElement();\n }\n\n i += 1;\n }\n\n if (nextElement) {\n this.layerElement.insertBefore(newElement, nextElement);\n } else {\n this.layerElement.appendChild(newElement);\n }\n };\n\n SVGRendererBase.prototype.hide = function () {\n this.layerElement.style.display = 'none';\n };\n\n SVGRendererBase.prototype.show = function () {\n this.layerElement.style.display = 'block';\n };\n\n function ICompElement() {}\n\n extendPrototype([BaseElement, TransformElement, HierarchyElement, FrameElement, RenderableDOMElement], ICompElement);\n\n ICompElement.prototype.initElement = function (data, globalData, comp) {\n this.initFrame();\n this.initBaseData(data, globalData, comp);\n this.initTransform(data, globalData, comp);\n this.initRenderable();\n this.initHierarchy();\n this.initRendererElement();\n this.createContainerElements();\n this.createRenderableComponents();\n\n if (this.data.xt || !globalData.progressiveLoad) {\n this.buildAllItems();\n }\n\n this.hide();\n };\n /* ICompElement.prototype.hide = function(){\r\n if(!this.hidden){\r\n this.hideElement();\r\n var i,len = this.elements.length;\r\n for( i = 0; i < len; i+=1 ){\r\n if(this.elements[i]){\r\n this.elements[i].hide();\r\n }\r\n }\r\n }\r\n }; */\n\n\n ICompElement.prototype.prepareFrame = function (num) {\n this._mdf = false;\n this.prepareRenderableFrame(num);\n this.prepareProperties(num, this.isInRange);\n\n if (!this.isInRange && !this.data.xt) {\n return;\n }\n\n if (!this.tm._placeholder) {\n var timeRemapped = this.tm.v;\n\n if (timeRemapped === this.data.op) {\n timeRemapped = this.data.op - 1;\n }\n\n this.renderedFrame = timeRemapped;\n } else {\n this.renderedFrame = num / this.data.sr;\n }\n\n var i;\n var len = this.elements.length;\n\n if (!this.completeLayers) {\n this.checkLayers(this.renderedFrame);\n } // This iteration needs to be backwards because of how expressions connect between each other\n\n\n for (i = len - 1; i >= 0; i -= 1) {\n if (this.completeLayers || this.elements[i]) {\n this.elements[i].prepareFrame(this.renderedFrame - this.layers[i].st);\n\n if (this.elements[i]._mdf) {\n this._mdf = true;\n }\n }\n }\n };\n\n ICompElement.prototype.renderInnerContent = function () {\n var i;\n var len = this.layers.length;\n\n for (i = 0; i < len; i += 1) {\n if (this.completeLayers || this.elements[i]) {\n this.elements[i].renderFrame();\n }\n }\n };\n\n ICompElement.prototype.setElements = function (elems) {\n this.elements = elems;\n };\n\n ICompElement.prototype.getElements = function () {\n return this.elements;\n };\n\n ICompElement.prototype.destroyElements = function () {\n var i;\n var len = this.layers.length;\n\n for (i = 0; i < len; i += 1) {\n if (this.elements[i]) {\n this.elements[i].destroy();\n }\n }\n };\n\n ICompElement.prototype.destroy = function () {\n this.destroyElements();\n this.destroyBaseElement();\n };\n\n function SVGCompElement(data, globalData, comp) {\n this.layers = data.layers;\n this.supports3d = true;\n this.completeLayers = false;\n this.pendingElements = [];\n this.elements = this.layers ? createSizedArray(this.layers.length) : [];\n this.initElement(data, globalData, comp);\n this.tm = data.tm ? PropertyFactory.getProp(this, data.tm, 0, globalData.frameRate, this) : {\n _placeholder: true\n };\n }\n\n extendPrototype([SVGRendererBase, ICompElement, SVGBaseElement], SVGCompElement);\n\n SVGCompElement.prototype.createComp = function (data) {\n return new SVGCompElement(data, this.globalData, this);\n };\n\n function SVGRenderer(animationItem, config) {\n this.animationItem = animationItem;\n this.layers = null;\n this.renderedFrame = -1;\n this.svgElement = createNS('svg');\n var ariaLabel = '';\n\n if (config && config.title) {\n var titleElement = createNS('title');\n var titleId = createElementID();\n titleElement.setAttribute('id', titleId);\n titleElement.textContent = config.title;\n this.svgElement.appendChild(titleElement);\n ariaLabel += titleId;\n }\n\n if (config && config.description) {\n var descElement = createNS('desc');\n var descId = createElementID();\n descElement.setAttribute('id', descId);\n descElement.textContent = config.description;\n this.svgElement.appendChild(descElement);\n ariaLabel += ' ' + descId;\n }\n\n if (ariaLabel) {\n this.svgElement.setAttribute('aria-labelledby', ariaLabel);\n }\n\n var defs = createNS('defs');\n this.svgElement.appendChild(defs);\n var maskElement = createNS('g');\n this.svgElement.appendChild(maskElement);\n this.layerElement = maskElement;\n this.renderConfig = {\n preserveAspectRatio: config && config.preserveAspectRatio || 'xMidYMid meet',\n imagePreserveAspectRatio: config && config.imagePreserveAspectRatio || 'xMidYMid slice',\n contentVisibility: config && config.contentVisibility || 'visible',\n progressiveLoad: config && config.progressiveLoad || false,\n hideOnTransparent: !(config && config.hideOnTransparent === false),\n viewBoxOnly: config && config.viewBoxOnly || false,\n viewBoxSize: config && config.viewBoxSize || false,\n className: config && config.className || '',\n id: config && config.id || '',\n focusable: config && config.focusable,\n filterSize: {\n width: config && config.filterSize && config.filterSize.width || '100%',\n height: config && config.filterSize && config.filterSize.height || '100%',\n x: config && config.filterSize && config.filterSize.x || '0%',\n y: config && config.filterSize && config.filterSize.y || '0%'\n },\n width: config && config.width,\n height: config && config.height,\n runExpressions: !config || config.runExpressions === undefined || config.runExpressions\n };\n this.globalData = {\n _mdf: false,\n frameNum: -1,\n defs: defs,\n renderConfig: this.renderConfig\n };\n this.elements = [];\n this.pendingElements = [];\n this.destroyed = false;\n this.rendererType = 'svg';\n }\n\n extendPrototype([SVGRendererBase], SVGRenderer);\n\n SVGRenderer.prototype.createComp = function (data) {\n return new SVGCompElement(data, this.globalData, this);\n };\n\n function ShapeTransformManager() {\n this.sequences = {};\n this.sequenceList = [];\n this.transform_key_count = 0;\n }\n\n ShapeTransformManager.prototype = {\n addTransformSequence: function addTransformSequence(transforms) {\n var i;\n var len = transforms.length;\n var key = '_';\n\n for (i = 0; i < len; i += 1) {\n key += transforms[i].transform.key + '_';\n }\n\n var sequence = this.sequences[key];\n\n if (!sequence) {\n sequence = {\n transforms: [].concat(transforms),\n finalTransform: new Matrix(),\n _mdf: false\n };\n this.sequences[key] = sequence;\n this.sequenceList.push(sequence);\n }\n\n return sequence;\n },\n processSequence: function processSequence(sequence, isFirstFrame) {\n var i = 0;\n var len = sequence.transforms.length;\n var _mdf = isFirstFrame;\n\n while (i < len && !isFirstFrame) {\n if (sequence.transforms[i].transform.mProps._mdf) {\n _mdf = true;\n break;\n }\n\n i += 1;\n }\n\n if (_mdf) {\n sequence.finalTransform.reset();\n\n for (i = len - 1; i >= 0; i -= 1) {\n sequence.finalTransform.multiply(sequence.transforms[i].transform.mProps.v);\n }\n }\n\n sequence._mdf = _mdf;\n },\n processSequences: function processSequences(isFirstFrame) {\n var i;\n var len = this.sequenceList.length;\n\n for (i = 0; i < len; i += 1) {\n this.processSequence(this.sequenceList[i], isFirstFrame);\n }\n },\n getNewKey: function getNewKey() {\n this.transform_key_count += 1;\n return '_' + this.transform_key_count;\n }\n };\n\n var lumaLoader = function lumaLoader() {\n var id = '__lottie_element_luma_buffer';\n var lumaBuffer = null;\n var lumaBufferCtx = null;\n var svg = null; // This alternate solution has a slight delay before the filter is applied, resulting in a flicker on the first frame.\n // Keeping this here for reference, and in the future, if offscreen canvas supports url filters, this can be used.\n // For now, neither of them work for offscreen canvas, so canvas workers can't support the luma track matte mask.\n // Naming it solution 2 to mark the extra comment lines.\n\n /*\r\n var svgString = [\r\n '<svg xmlns=\"http://www.w3.org/2000/svg\">',\r\n '<filter id=\"' + id + '\">',\r\n '<feColorMatrix type=\"matrix\" color-interpolation-filters=\"sRGB\" values=\"',\r\n '0.3, 0.3, 0.3, 0, 0, ',\r\n '0.3, 0.3, 0.3, 0, 0, ',\r\n '0.3, 0.3, 0.3, 0, 0, ',\r\n '0.3, 0.3, 0.3, 0, 0',\r\n '\"/>',\r\n '</filter>',\r\n '</svg>',\r\n ].join('');\r\n var blob = new Blob([svgString], { type: 'image/svg+xml' });\r\n var url = URL.createObjectURL(blob);\r\n */\n\n function createLumaSvgFilter() {\n var _svg = createNS('svg');\n\n var fil = createNS('filter');\n var matrix = createNS('feColorMatrix');\n fil.setAttribute('id', id);\n matrix.setAttribute('type', 'matrix');\n matrix.setAttribute('color-interpolation-filters', 'sRGB');\n matrix.setAttribute('values', '0.3, 0.3, 0.3, 0, 0, 0.3, 0.3, 0.3, 0, 0, 0.3, 0.3, 0.3, 0, 0, 0.3, 0.3, 0.3, 0, 0');\n fil.appendChild(matrix);\n\n _svg.appendChild(fil);\n\n _svg.setAttribute('id', id + '_svg');\n\n if (featureSupport.svgLumaHidden) {\n _svg.style.display = 'none';\n }\n\n return _svg;\n }\n\n function loadLuma() {\n if (!lumaBuffer) {\n svg = createLumaSvgFilter();\n document.body.appendChild(svg);\n lumaBuffer = createTag('canvas');\n lumaBufferCtx = lumaBuffer.getContext('2d'); // lumaBufferCtx.filter = `url('${url}#__lottie_element_luma_buffer')`; // part of solution 2\n\n lumaBufferCtx.filter = 'url(#' + id + ')';\n lumaBufferCtx.fillStyle = 'rgba(0,0,0,0)';\n lumaBufferCtx.fillRect(0, 0, 1, 1);\n }\n }\n\n function getLuma(canvas) {\n if (!lumaBuffer) {\n loadLuma();\n }\n\n lumaBuffer.width = canvas.width;\n lumaBuffer.height = canvas.height; // lumaBufferCtx.filter = `url('${url}#__lottie_element_luma_buffer')`; // part of solution 2\n\n lumaBufferCtx.filter = 'url(#' + id + ')';\n return lumaBuffer;\n }\n\n return {\n load: loadLuma,\n get: getLuma\n };\n };\n\n function createCanvas(width, height) {\n if (featureSupport.offscreenCanvas) {\n return new OffscreenCanvas(width, height);\n }\n\n var canvas = createTag('canvas');\n canvas.width = width;\n canvas.height = height;\n return canvas;\n }\n\n var assetLoader = function () {\n return {\n loadLumaCanvas: lumaLoader.load,\n getLumaCanvas: lumaLoader.get,\n createCanvas: createCanvas\n };\n }();\n\n var registeredEffects = {};\n\n function CVEffects(elem) {\n var i;\n var len = elem.data.ef ? elem.data.ef.length : 0;\n this.filters = [];\n var filterManager;\n\n for (i = 0; i < len; i += 1) {\n filterManager = null;\n var type = elem.data.ef[i].ty;\n\n if (registeredEffects[type]) {\n var Effect = registeredEffects[type].effect;\n filterManager = new Effect(elem.effectsManager.effectElements[i], elem);\n }\n\n if (filterManager) {\n this.filters.push(filterManager);\n }\n }\n\n if (this.filters.length) {\n elem.addRenderableComponent(this);\n }\n }\n\n CVEffects.prototype.renderFrame = function (_isFirstFrame) {\n var i;\n var len = this.filters.length;\n\n for (i = 0; i < len; i += 1) {\n this.filters[i].renderFrame(_isFirstFrame);\n }\n };\n\n CVEffects.prototype.getEffects = function (type) {\n var i;\n var len = this.filters.length;\n var effects = [];\n\n for (i = 0; i < len; i += 1) {\n if (this.filters[i].type === type) {\n effects.push(this.filters[i]);\n }\n }\n\n return effects;\n };\n\n function registerEffect(id, effect) {\n registeredEffects[id] = {\n effect: effect\n };\n }\n\n function CVMaskElement(data, element) {\n this.data = data;\n this.element = element;\n this.masksProperties = this.data.masksProperties || [];\n this.viewData = createSizedArray(this.masksProperties.length);\n var i;\n var len = this.masksProperties.length;\n var hasMasks = false;\n\n for (i = 0; i < len; i += 1) {\n if (this.masksProperties[i].mode !== 'n') {\n hasMasks = true;\n }\n\n this.viewData[i] = ShapePropertyFactory.getShapeProp(this.element, this.masksProperties[i], 3);\n }\n\n this.hasMasks = hasMasks;\n\n if (hasMasks) {\n this.element.addRenderableComponent(this);\n }\n }\n\n CVMaskElement.prototype.renderFrame = function () {\n if (!this.hasMasks) {\n return;\n }\n\n var transform = this.element.finalTransform.mat;\n var ctx = this.element.canvasContext;\n var i;\n var len = this.masksProperties.length;\n var pt;\n var pts;\n var data;\n ctx.beginPath();\n\n for (i = 0; i < len; i += 1) {\n if (this.masksProperties[i].mode !== 'n') {\n if (this.masksProperties[i].inv) {\n ctx.moveTo(0, 0);\n ctx.lineTo(this.element.globalData.compSize.w, 0);\n ctx.lineTo(this.element.globalData.compSize.w, this.element.globalData.compSize.h);\n ctx.lineTo(0, this.element.globalData.compSize.h);\n ctx.lineTo(0, 0);\n }\n\n data = this.viewData[i].v;\n pt = transform.applyToPointArray(data.v[0][0], data.v[0][1], 0);\n ctx.moveTo(pt[0], pt[1]);\n var j;\n var jLen = data._length;\n\n for (j = 1; j < jLen; j += 1) {\n pts = transform.applyToTriplePoints(data.o[j - 1], data.i[j], data.v[j]);\n ctx.bezierCurveTo(pts[0], pts[1], pts[2], pts[3], pts[4], pts[5]);\n }\n\n pts = transform.applyToTriplePoints(data.o[j - 1], data.i[0], data.v[0]);\n ctx.bezierCurveTo(pts[0], pts[1], pts[2], pts[3], pts[4], pts[5]);\n }\n }\n\n this.element.globalData.renderer.save(true);\n ctx.clip();\n };\n\n CVMaskElement.prototype.getMaskProperty = MaskElement.prototype.getMaskProperty;\n\n CVMaskElement.prototype.destroy = function () {\n this.element = null;\n };\n\n function CVBaseElement() {}\n\n var operationsMap = {\n 1: 'source-in',\n 2: 'source-out',\n 3: 'source-in',\n 4: 'source-out'\n };\n CVBaseElement.prototype = {\n createElements: function createElements() {},\n initRendererElement: function initRendererElement() {},\n createContainerElements: function createContainerElements() {\n // If the layer is masked we will use two buffers to store each different states of the drawing\n // This solution is not ideal for several reason. But unfortunately, because of the recursive\n // nature of the render tree, it's the only simple way to make sure one inner mask doesn't override an outer mask.\n // TODO: try to reduce the size of these buffers to the size of the composition contaning the layer\n // It might be challenging because the layer most likely is transformed in some way\n if (this.data.tt >= 1) {\n this.buffers = [];\n var canvasContext = this.globalData.canvasContext;\n var bufferCanvas = assetLoader.createCanvas(canvasContext.canvas.width, canvasContext.canvas.height);\n this.buffers.push(bufferCanvas);\n var bufferCanvas2 = assetLoader.createCanvas(canvasContext.canvas.width, canvasContext.canvas.height);\n this.buffers.push(bufferCanvas2);\n\n if (this.data.tt >= 3 && !document._isProxy) {\n assetLoader.loadLumaCanvas();\n }\n }\n\n this.canvasContext = this.globalData.canvasContext;\n this.transformCanvas = this.globalData.transformCanvas;\n this.renderableEffectsManager = new CVEffects(this);\n this.searchEffectTransforms();\n },\n createContent: function createContent() {},\n setBlendMode: function setBlendMode() {\n var globalData = this.globalData;\n\n if (globalData.blendMode !== this.data.bm) {\n globalData.blendMode = this.data.bm;\n var blendModeValue = getBlendMode(this.data.bm);\n globalData.canvasContext.globalCompositeOperation = blendModeValue;\n }\n },\n createRenderableComponents: function createRenderableComponents() {\n this.maskManager = new CVMaskElement(this.data, this);\n this.transformEffects = this.renderableEffectsManager.getEffects(effectTypes.TRANSFORM_EFFECT);\n },\n hideElement: function hideElement() {\n if (!this.hidden && (!this.isInRange || this.isTransparent)) {\n this.hidden = true;\n }\n },\n showElement: function showElement() {\n if (this.isInRange && !this.isTransparent) {\n this.hidden = false;\n this._isFirstFrame = true;\n this.maskManager._isFirstFrame = true;\n }\n },\n clearCanvas: function clearCanvas(canvasContext) {\n canvasContext.clearRect(this.transformCanvas.tx, this.transformCanvas.ty, this.transformCanvas.w * this.transformCanvas.sx, this.transformCanvas.h * this.transformCanvas.sy);\n },\n prepareLayer: function prepareLayer() {\n if (this.data.tt >= 1) {\n var buffer = this.buffers[0];\n var bufferCtx = buffer.getContext('2d');\n this.clearCanvas(bufferCtx); // on the first buffer we store the current state of the global drawing\n\n bufferCtx.drawImage(this.canvasContext.canvas, 0, 0); // The next four lines are to clear the canvas\n // TODO: Check if there is a way to clear the canvas without resetting the transform\n\n this.currentTransform = this.canvasContext.getTransform();\n this.canvasContext.setTransform(1, 0, 0, 1, 0, 0);\n this.clearCanvas(this.canvasContext);\n this.canvasContext.setTransform(this.currentTransform);\n }\n },\n exitLayer: function exitLayer() {\n if (this.data.tt >= 1) {\n var buffer = this.buffers[1]; // On the second buffer we store the current state of the global drawing\n // that only contains the content of this layer\n // (if it is a composition, it also includes the nested layers)\n\n var bufferCtx = buffer.getContext('2d');\n this.clearCanvas(bufferCtx);\n bufferCtx.drawImage(this.canvasContext.canvas, 0, 0); // We clear the canvas again\n\n this.canvasContext.setTransform(1, 0, 0, 1, 0, 0);\n this.clearCanvas(this.canvasContext);\n this.canvasContext.setTransform(this.currentTransform); // We draw the mask\n\n var mask = this.comp.getElementById('tp' in this.data ? this.data.tp : this.data.ind - 1);\n mask.renderFrame(true); // We draw the second buffer (that contains the content of this layer)\n\n this.canvasContext.setTransform(1, 0, 0, 1, 0, 0); // If the mask is a Luma matte, we need to do two extra painting operations\n // the _isProxy check is to avoid drawing a fake canvas in workers that will throw an error\n\n if (this.data.tt >= 3 && !document._isProxy) {\n // We copy the painted mask to a buffer that has a color matrix filter applied to it\n // that applies the rgb values to the alpha channel\n var lumaBuffer = assetLoader.getLumaCanvas(this.canvasContext.canvas);\n var lumaBufferCtx = lumaBuffer.getContext('2d');\n lumaBufferCtx.drawImage(this.canvasContext.canvas, 0, 0);\n this.clearCanvas(this.canvasContext); // we repaint the context with the mask applied to it\n\n this.canvasContext.drawImage(lumaBuffer, 0, 0);\n }\n\n this.canvasContext.globalCompositeOperation = operationsMap[this.data.tt];\n this.canvasContext.drawImage(buffer, 0, 0); // We finally draw the first buffer (that contains the content of the global drawing)\n // We use destination-over to draw the global drawing below the current layer\n\n this.canvasContext.globalCompositeOperation = 'destination-over';\n this.canvasContext.drawImage(this.buffers[0], 0, 0);\n this.canvasContext.setTransform(this.currentTransform); // We reset the globalCompositeOperation to source-over, the standard type of operation\n\n this.canvasContext.globalCompositeOperation = 'source-over';\n }\n },\n renderFrame: function renderFrame(forceRender) {\n if (this.hidden || this.data.hd) {\n return;\n }\n\n if (this.data.td === 1 && !forceRender) {\n return;\n }\n\n this.renderTransform();\n this.renderRenderable();\n this.renderLocalTransform();\n this.setBlendMode();\n var forceRealStack = this.data.ty === 0;\n this.prepareLayer();\n this.globalData.renderer.save(forceRealStack);\n this.globalData.renderer.ctxTransform(this.finalTransform.localMat.props);\n this.globalData.renderer.ctxOpacity(this.finalTransform.localOpacity);\n this.renderInnerContent();\n this.globalData.renderer.restore(forceRealStack);\n this.exitLayer();\n\n if (this.maskManager.hasMasks) {\n this.globalData.renderer.restore(true);\n }\n\n if (this._isFirstFrame) {\n this._isFirstFrame = false;\n }\n },\n destroy: function destroy() {\n this.canvasContext = null;\n this.data = null;\n this.globalData = null;\n this.maskManager.destroy();\n },\n mHelper: new Matrix()\n };\n CVBaseElement.prototype.hide = CVBaseElement.prototype.hideElement;\n CVBaseElement.prototype.show = CVBaseElement.prototype.showElement;\n\n function CVShapeData(element, data, styles, transformsManager) {\n this.styledShapes = [];\n this.tr = [0, 0, 0, 0, 0, 0];\n var ty = 4;\n\n if (data.ty === 'rc') {\n ty = 5;\n } else if (data.ty === 'el') {\n ty = 6;\n } else if (data.ty === 'sr') {\n ty = 7;\n }\n\n this.sh = ShapePropertyFactory.getShapeProp(element, data, ty, element);\n var i;\n var len = styles.length;\n var styledShape;\n\n for (i = 0; i < len; i += 1) {\n if (!styles[i].closed) {\n styledShape = {\n transforms: transformsManager.addTransformSequence(styles[i].transforms),\n trNodes: []\n };\n this.styledShapes.push(styledShape);\n styles[i].elements.push(styledShape);\n }\n }\n }\n\n CVShapeData.prototype.setAsAnimated = SVGShapeData.prototype.setAsAnimated;\n\n function CVShapeElement(data, globalData, comp) {\n this.shapes = [];\n this.shapesData = data.shapes;\n this.stylesList = [];\n this.itemsData = [];\n this.prevViewData = [];\n this.shapeModifiers = [];\n this.processedElements = [];\n this.transformsManager = new ShapeTransformManager();\n this.initElement(data, globalData, comp);\n }\n\n extendPrototype([BaseElement, TransformElement, CVBaseElement, IShapeElement, HierarchyElement, FrameElement, RenderableElement], CVShapeElement);\n CVShapeElement.prototype.initElement = RenderableDOMElement.prototype.initElement;\n CVShapeElement.prototype.transformHelper = {\n opacity: 1,\n _opMdf: false\n };\n CVShapeElement.prototype.dashResetter = [];\n\n CVShapeElement.prototype.createContent = function () {\n this.searchShapes(this.shapesData, this.itemsData, this.prevViewData, true, []);\n };\n\n CVShapeElement.prototype.createStyleElement = function (data, transforms) {\n var styleElem = {\n data: data,\n type: data.ty,\n preTransforms: this.transformsManager.addTransformSequence(transforms),\n transforms: [],\n elements: [],\n closed: data.hd === true\n };\n var elementData = {};\n\n if (data.ty === 'fl' || data.ty === 'st') {\n elementData.c = PropertyFactory.getProp(this, data.c, 1, 255, this);\n\n if (!elementData.c.k) {\n styleElem.co = 'rgb(' + bmFloor(elementData.c.v[0]) + ',' + bmFloor(elementData.c.v[1]) + ',' + bmFloor(elementData.c.v[2]) + ')';\n }\n } else if (data.ty === 'gf' || data.ty === 'gs') {\n elementData.s = PropertyFactory.getProp(this, data.s, 1, null, this);\n elementData.e = PropertyFactory.getProp(this, data.e, 1, null, this);\n elementData.h = PropertyFactory.getProp(this, data.h || {\n k: 0\n }, 0, 0.01, this);\n elementData.a = PropertyFactory.getProp(this, data.a || {\n k: 0\n }, 0, degToRads, this);\n elementData.g = new GradientProperty(this, data.g, this);\n }\n\n elementData.o = PropertyFactory.getProp(this, data.o, 0, 0.01, this);\n\n if (data.ty === 'st' || data.ty === 'gs') {\n styleElem.lc = lineCapEnum[data.lc || 2];\n styleElem.lj = lineJoinEnum[data.lj || 2];\n\n if (data.lj == 1) {\n // eslint-disable-line eqeqeq\n styleElem.ml = data.ml;\n }\n\n elementData.w = PropertyFactory.getProp(this, data.w, 0, null, this);\n\n if (!elementData.w.k) {\n styleElem.wi = elementData.w.v;\n }\n\n if (data.d) {\n var d = new DashProperty(this, data.d, 'canvas', this);\n elementData.d = d;\n\n if (!elementData.d.k) {\n styleElem.da = elementData.d.dashArray;\n styleElem[\"do\"] = elementData.d.dashoffset[0];\n }\n }\n } else {\n styleElem.r = data.r === 2 ? 'evenodd' : 'nonzero';\n }\n\n this.stylesList.push(styleElem);\n elementData.style = styleElem;\n return elementData;\n };\n\n CVShapeElement.prototype.createGroupElement = function () {\n var elementData = {\n it: [],\n prevViewData: []\n };\n return elementData;\n };\n\n CVShapeElement.prototype.createTransformElement = function (data) {\n var elementData = {\n transform: {\n opacity: 1,\n _opMdf: false,\n key: this.transformsManager.getNewKey(),\n op: PropertyFactory.getProp(this, data.o, 0, 0.01, this),\n mProps: TransformPropertyFactory.getTransformProperty(this, data, this)\n }\n };\n return elementData;\n };\n\n CVShapeElement.prototype.createShapeElement = function (data) {\n var elementData = new CVShapeData(this, data, this.stylesList, this.transformsManager);\n this.shapes.push(elementData);\n this.addShapeToModifiers(elementData);\n return elementData;\n };\n\n CVShapeElement.prototype.reloadShapes = function () {\n this._isFirstFrame = true;\n var i;\n var len = this.itemsData.length;\n\n for (i = 0; i < len; i += 1) {\n this.prevViewData[i] = this.itemsData[i];\n }\n\n this.searchShapes(this.shapesData, this.itemsData, this.prevViewData, true, []);\n len = this.dynamicProperties.length;\n\n for (i = 0; i < len; i += 1) {\n this.dynamicProperties[i].getValue();\n }\n\n this.renderModifiers();\n this.transformsManager.processSequences(this._isFirstFrame);\n };\n\n CVShapeElement.prototype.addTransformToStyleList = function (transform) {\n var i;\n var len = this.stylesList.length;\n\n for (i = 0; i < len; i += 1) {\n if (!this.stylesList[i].closed) {\n this.stylesList[i].transforms.push(transform);\n }\n }\n };\n\n CVShapeElement.prototype.removeTransformFromStyleList = function () {\n var i;\n var len = this.stylesList.length;\n\n for (i = 0; i < len; i += 1) {\n if (!this.stylesList[i].closed) {\n this.stylesList[i].transforms.pop();\n }\n }\n };\n\n CVShapeElement.prototype.closeStyles = function (styles) {\n var i;\n var len = styles.length;\n\n for (i = 0; i < len; i += 1) {\n styles[i].closed = true;\n }\n };\n\n CVShapeElement.prototype.searchShapes = function (arr, itemsData, prevViewData, shouldRender, transforms) {\n var i;\n var len = arr.length - 1;\n var j;\n var jLen;\n var ownStyles = [];\n var ownModifiers = [];\n var processedPos;\n var modifier;\n var currentTransform;\n var ownTransforms = [].concat(transforms);\n\n for (i = len; i >= 0; i -= 1) {\n processedPos = this.searchProcessedElement(arr[i]);\n\n if (!processedPos) {\n arr[i]._shouldRender = shouldRender;\n } else {\n itemsData[i] = prevViewData[processedPos - 1];\n }\n\n if (arr[i].ty === 'fl' || arr[i].ty === 'st' || arr[i].ty === 'gf' || arr[i].ty === 'gs') {\n if (!processedPos) {\n itemsData[i] = this.createStyleElement(arr[i], ownTransforms);\n } else {\n itemsData[i].style.closed = false;\n }\n\n ownStyles.push(itemsData[i].style);\n } else if (arr[i].ty === 'gr') {\n if (!processedPos) {\n itemsData[i] = this.createGroupElement(arr[i]);\n } else {\n jLen = itemsData[i].it.length;\n\n for (j = 0; j < jLen; j += 1) {\n itemsData[i].prevViewData[j] = itemsData[i].it[j];\n }\n }\n\n this.searchShapes(arr[i].it, itemsData[i].it, itemsData[i].prevViewData, shouldRender, ownTransforms);\n } else if (arr[i].ty === 'tr') {\n if (!processedPos) {\n currentTransform = this.createTransformElement(arr[i]);\n itemsData[i] = currentTransform;\n }\n\n ownTransforms.push(itemsData[i]);\n this.addTransformToStyleList(itemsData[i]);\n } else if (arr[i].ty === 'sh' || arr[i].ty === 'rc' || arr[i].ty === 'el' || arr[i].ty === 'sr') {\n if (!processedPos) {\n itemsData[i] = this.createShapeElement(arr[i]);\n }\n } else if (arr[i].ty === 'tm' || arr[i].ty === 'rd' || arr[i].ty === 'pb' || arr[i].ty === 'zz' || arr[i].ty === 'op') {\n if (!processedPos) {\n modifier = ShapeModifiers.getModifier(arr[i].ty);\n modifier.init(this, arr[i]);\n itemsData[i] = modifier;\n this.shapeModifiers.push(modifier);\n } else {\n modifier = itemsData[i];\n modifier.closed = false;\n }\n\n ownModifiers.push(modifier);\n } else if (arr[i].ty === 'rp') {\n if (!processedPos) {\n modifier = ShapeModifiers.getModifier(arr[i].ty);\n itemsData[i] = modifier;\n modifier.init(this, arr, i, itemsData);\n this.shapeModifiers.push(modifier);\n shouldRender = false;\n } else {\n modifier = itemsData[i];\n modifier.closed = true;\n }\n\n ownModifiers.push(modifier);\n }\n\n this.addProcessedElement(arr[i], i + 1);\n }\n\n this.removeTransformFromStyleList();\n this.closeStyles(ownStyles);\n len = ownModifiers.length;\n\n for (i = 0; i < len; i += 1) {\n ownModifiers[i].closed = true;\n }\n };\n\n CVShapeElement.prototype.renderInnerContent = function () {\n this.transformHelper.opacity = 1;\n this.transformHelper._opMdf = false;\n this.renderModifiers();\n this.transformsManager.processSequences(this._isFirstFrame);\n this.renderShape(this.transformHelper, this.shapesData, this.itemsData, true);\n };\n\n CVShapeElement.prototype.renderShapeTransform = function (parentTransform, groupTransform) {\n if (parentTransform._opMdf || groupTransform.op._mdf || this._isFirstFrame) {\n groupTransform.opacity = parentTransform.opacity;\n groupTransform.opacity *= groupTransform.op.v;\n groupTransform._opMdf = true;\n }\n };\n\n CVShapeElement.prototype.drawLayer = function () {\n var i;\n var len = this.stylesList.length;\n var j;\n var jLen;\n var k;\n var kLen;\n var elems;\n var nodes;\n var renderer = this.globalData.renderer;\n var ctx = this.globalData.canvasContext;\n var type;\n var currentStyle;\n\n for (i = 0; i < len; i += 1) {\n currentStyle = this.stylesList[i];\n type = currentStyle.type; // Skipping style when\n // Stroke width equals 0\n // style should not be rendered (extra unused repeaters)\n // current opacity equals 0\n // global opacity equals 0\n\n if (!((type === 'st' || type === 'gs') && currentStyle.wi === 0 || !currentStyle.data._shouldRender || currentStyle.coOp === 0 || this.globalData.currentGlobalAlpha === 0)) {\n renderer.save();\n elems = currentStyle.elements;\n\n if (type === 'st' || type === 'gs') {\n renderer.ctxStrokeStyle(type === 'st' ? currentStyle.co : currentStyle.grd); // ctx.strokeStyle = type === 'st' ? currentStyle.co : currentStyle.grd;\n\n renderer.ctxLineWidth(currentStyle.wi); // ctx.lineWidth = currentStyle.wi;\n\n renderer.ctxLineCap(currentStyle.lc); // ctx.lineCap = currentStyle.lc;\n\n renderer.ctxLineJoin(currentStyle.lj); // ctx.lineJoin = currentStyle.lj;\n\n renderer.ctxMiterLimit(currentStyle.ml || 0); // ctx.miterLimit = currentStyle.ml || 0;\n } else {\n renderer.ctxFillStyle(type === 'fl' ? currentStyle.co : currentStyle.grd); // ctx.fillStyle = type === 'fl' ? currentStyle.co : currentStyle.grd;\n }\n\n renderer.ctxOpacity(currentStyle.coOp);\n\n if (type !== 'st' && type !== 'gs') {\n ctx.beginPath();\n }\n\n renderer.ctxTransform(currentStyle.preTransforms.finalTransform.props);\n jLen = elems.length;\n\n for (j = 0; j < jLen; j += 1) {\n if (type === 'st' || type === 'gs') {\n ctx.beginPath();\n\n if (currentStyle.da) {\n ctx.setLineDash(currentStyle.da);\n ctx.lineDashOffset = currentStyle[\"do\"];\n }\n }\n\n nodes = elems[j].trNodes;\n kLen = nodes.length;\n\n for (k = 0; k < kLen; k += 1) {\n if (nodes[k].t === 'm') {\n ctx.moveTo(nodes[k].p[0], nodes[k].p[1]);\n } else if (nodes[k].t === 'c') {\n ctx.bezierCurveTo(nodes[k].pts[0], nodes[k].pts[1], nodes[k].pts[2], nodes[k].pts[3], nodes[k].pts[4], nodes[k].pts[5]);\n } else {\n ctx.closePath();\n }\n }\n\n if (type === 'st' || type === 'gs') {\n // ctx.stroke();\n renderer.ctxStroke();\n\n if (currentStyle.da) {\n ctx.setLineDash(this.dashResetter);\n }\n }\n }\n\n if (type !== 'st' && type !== 'gs') {\n // ctx.fill(currentStyle.r);\n this.globalData.renderer.ctxFill(currentStyle.r);\n }\n\n renderer.restore();\n }\n }\n };\n\n CVShapeElement.prototype.renderShape = function (parentTransform, items, data, isMain) {\n var i;\n var len = items.length - 1;\n var groupTransform;\n groupTransform = parentTransform;\n\n for (i = len; i >= 0; i -= 1) {\n if (items[i].ty === 'tr') {\n groupTransform = data[i].transform;\n this.renderShapeTransform(parentTransform, groupTransform);\n } else if (items[i].ty === 'sh' || items[i].ty === 'el' || items[i].ty === 'rc' || items[i].ty === 'sr') {\n this.renderPath(items[i], data[i]);\n } else if (items[i].ty === 'fl') {\n this.renderFill(items[i], data[i], groupTransform);\n } else if (items[i].ty === 'st') {\n this.renderStroke(items[i], data[i], groupTransform);\n } else if (items[i].ty === 'gf' || items[i].ty === 'gs') {\n this.renderGradientFill(items[i], data[i], groupTransform);\n } else if (items[i].ty === 'gr') {\n this.renderShape(groupTransform, items[i].it, data[i].it);\n } else if (items[i].ty === 'tm') {//\n }\n }\n\n if (isMain) {\n this.drawLayer();\n }\n };\n\n CVShapeElement.prototype.renderStyledShape = function (styledShape, shape) {\n if (this._isFirstFrame || shape._mdf || styledShape.transforms._mdf) {\n var shapeNodes = styledShape.trNodes;\n var paths = shape.paths;\n var i;\n var len;\n var j;\n var jLen = paths._length;\n shapeNodes.length = 0;\n var groupTransformMat = styledShape.transforms.finalTransform;\n\n for (j = 0; j < jLen; j += 1) {\n var pathNodes = paths.shapes[j];\n\n if (pathNodes && pathNodes.v) {\n len = pathNodes._length;\n\n for (i = 1; i < len; i += 1) {\n if (i === 1) {\n shapeNodes.push({\n t: 'm',\n p: groupTransformMat.applyToPointArray(pathNodes.v[0][0], pathNodes.v[0][1], 0)\n });\n }\n\n shapeNodes.push({\n t: 'c',\n pts: groupTransformMat.applyToTriplePoints(pathNodes.o[i - 1], pathNodes.i[i], pathNodes.v[i])\n });\n }\n\n if (len === 1) {\n shapeNodes.push({\n t: 'm',\n p: groupTransformMat.applyToPointArray(pathNodes.v[0][0], pathNodes.v[0][1], 0)\n });\n }\n\n if (pathNodes.c && len) {\n shapeNodes.push({\n t: 'c',\n pts: groupTransformMat.applyToTriplePoints(pathNodes.o[i - 1], pathNodes.i[0], pathNodes.v[0])\n });\n shapeNodes.push({\n t: 'z'\n });\n }\n }\n }\n\n styledShape.trNodes = shapeNodes;\n }\n };\n\n CVShapeElement.prototype.renderPath = function (pathData, itemData) {\n if (pathData.hd !== true && pathData._shouldRender) {\n var i;\n var len = itemData.styledShapes.length;\n\n for (i = 0; i < len; i += 1) {\n this.renderStyledShape(itemData.styledShapes[i], itemData.sh);\n }\n }\n };\n\n CVShapeElement.prototype.renderFill = function (styleData, itemData, groupTransform) {\n var styleElem = itemData.style;\n\n if (itemData.c._mdf || this._isFirstFrame) {\n styleElem.co = 'rgb(' + bmFloor(itemData.c.v[0]) + ',' + bmFloor(itemData.c.v[1]) + ',' + bmFloor(itemData.c.v[2]) + ')';\n }\n\n if (itemData.o._mdf || groupTransform._opMdf || this._isFirstFrame) {\n styleElem.coOp = itemData.o.v * groupTransform.opacity;\n }\n };\n\n CVShapeElement.prototype.renderGradientFill = function (styleData, itemData, groupTransform) {\n var styleElem = itemData.style;\n var grd;\n\n if (!styleElem.grd || itemData.g._mdf || itemData.s._mdf || itemData.e._mdf || styleData.t !== 1 && (itemData.h._mdf || itemData.a._mdf)) {\n var ctx = this.globalData.canvasContext;\n var pt1 = itemData.s.v;\n var pt2 = itemData.e.v;\n\n if (styleData.t === 1) {\n grd = ctx.createLinearGradient(pt1[0], pt1[1], pt2[0], pt2[1]);\n } else {\n var rad = Math.sqrt(Math.pow(pt1[0] - pt2[0], 2) + Math.pow(pt1[1] - pt2[1], 2));\n var ang = Math.atan2(pt2[1] - pt1[1], pt2[0] - pt1[0]);\n var percent = itemData.h.v;\n\n if (percent >= 1) {\n percent = 0.99;\n } else if (percent <= -1) {\n percent = -0.99;\n }\n\n var dist = rad * percent;\n var x = Math.cos(ang + itemData.a.v) * dist + pt1[0];\n var y = Math.sin(ang + itemData.a.v) * dist + pt1[1];\n grd = ctx.createRadialGradient(x, y, 0, pt1[0], pt1[1], rad);\n }\n\n var i;\n var len = styleData.g.p;\n var cValues = itemData.g.c;\n var opacity = 1;\n\n for (i = 0; i < len; i += 1) {\n if (itemData.g._hasOpacity && itemData.g._collapsable) {\n opacity = itemData.g.o[i * 2 + 1];\n }\n\n grd.addColorStop(cValues[i * 4] / 100, 'rgba(' + cValues[i * 4 + 1] + ',' + cValues[i * 4 + 2] + ',' + cValues[i * 4 + 3] + ',' + opacity + ')');\n }\n\n styleElem.grd = grd;\n }\n\n styleElem.coOp = itemData.o.v * groupTransform.opacity;\n };\n\n CVShapeElement.prototype.renderStroke = function (styleData, itemData, groupTransform) {\n var styleElem = itemData.style;\n var d = itemData.d;\n\n if (d && (d._mdf || this._isFirstFrame)) {\n styleElem.da = d.dashArray;\n styleElem[\"do\"] = d.dashoffset[0];\n }\n\n if (itemData.c._mdf || this._isFirstFrame) {\n styleElem.co = 'rgb(' + bmFloor(itemData.c.v[0]) + ',' + bmFloor(itemData.c.v[1]) + ',' + bmFloor(itemData.c.v[2]) + ')';\n }\n\n if (itemData.o._mdf || groupTransform._opMdf || this._isFirstFrame) {\n styleElem.coOp = itemData.o.v * groupTransform.opacity;\n }\n\n if (itemData.w._mdf || this._isFirstFrame) {\n styleElem.wi = itemData.w.v;\n }\n };\n\n CVShapeElement.prototype.destroy = function () {\n this.shapesData = null;\n this.globalData = null;\n this.canvasContext = null;\n this.stylesList.length = 0;\n this.itemsData.length = 0;\n };\n\n function CVTextElement(data, globalData, comp) {\n this.textSpans = [];\n this.yOffset = 0;\n this.fillColorAnim = false;\n this.strokeColorAnim = false;\n this.strokeWidthAnim = false;\n this.stroke = false;\n this.fill = false;\n this.justifyOffset = 0;\n this.currentRender = null;\n this.renderType = 'canvas';\n this.values = {\n fill: 'rgba(0,0,0,0)',\n stroke: 'rgba(0,0,0,0)',\n sWidth: 0,\n fValue: ''\n };\n this.initElement(data, globalData, comp);\n }\n\n extendPrototype([BaseElement, TransformElement, CVBaseElement, HierarchyElement, FrameElement, RenderableElement, ITextElement], CVTextElement);\n CVTextElement.prototype.tHelper = createTag('canvas').getContext('2d');\n\n CVTextElement.prototype.buildNewText = function () {\n var documentData = this.textProperty.currentData;\n this.renderedLetters = createSizedArray(documentData.l ? documentData.l.length : 0);\n var hasFill = false;\n\n if (documentData.fc) {\n hasFill = true;\n this.values.fill = this.buildColor(documentData.fc);\n } else {\n this.values.fill = 'rgba(0,0,0,0)';\n }\n\n this.fill = hasFill;\n var hasStroke = false;\n\n if (documentData.sc) {\n hasStroke = true;\n this.values.stroke = this.buildColor(documentData.sc);\n this.values.sWidth = documentData.sw;\n }\n\n var fontData = this.globalData.fontManager.getFontByName(documentData.f);\n var i;\n var len;\n var letters = documentData.l;\n var matrixHelper = this.mHelper;\n this.stroke = hasStroke;\n this.values.fValue = documentData.finalSize + 'px ' + this.globalData.fontManager.getFontByName(documentData.f).fFamily;\n len = documentData.finalText.length; // this.tHelper.font = this.values.fValue;\n\n var charData;\n var shapeData;\n var k;\n var kLen;\n var shapes;\n var j;\n var jLen;\n var pathNodes;\n var commands;\n var pathArr;\n var singleShape = this.data.singleShape;\n var trackingOffset = documentData.tr * 0.001 * documentData.finalSize;\n var xPos = 0;\n var yPos = 0;\n var firstLine = true;\n var cnt = 0;\n\n for (i = 0; i < len; i += 1) {\n charData = this.globalData.fontManager.getCharData(documentData.finalText[i], fontData.fStyle, this.globalData.fontManager.getFontByName(documentData.f).fFamily);\n shapeData = charData && charData.data || {};\n matrixHelper.reset();\n\n if (singleShape && letters[i].n) {\n xPos = -trackingOffset;\n yPos += documentData.yOffset;\n yPos += firstLine ? 1 : 0;\n firstLine = false;\n }\n\n shapes = shapeData.shapes ? shapeData.shapes[0].it : [];\n jLen = shapes.length;\n matrixHelper.scale(documentData.finalSize / 100, documentData.finalSize / 100);\n\n if (singleShape) {\n this.applyTextPropertiesToMatrix(documentData, matrixHelper, letters[i].line, xPos, yPos);\n }\n\n commands = createSizedArray(jLen - 1);\n var commandsCounter = 0;\n\n for (j = 0; j < jLen; j += 1) {\n if (shapes[j].ty === 'sh') {\n kLen = shapes[j].ks.k.i.length;\n pathNodes = shapes[j].ks.k;\n pathArr = [];\n\n for (k = 1; k < kLen; k += 1) {\n if (k === 1) {\n pathArr.push(matrixHelper.applyToX(pathNodes.v[0][0], pathNodes.v[0][1], 0), matrixHelper.applyToY(pathNodes.v[0][0], pathNodes.v[0][1], 0));\n }\n\n pathArr.push(matrixHelper.applyToX(pathNodes.o[k - 1][0], pathNodes.o[k - 1][1], 0), matrixHelper.applyToY(pathNodes.o[k - 1][0], pathNodes.o[k - 1][1], 0), matrixHelper.applyToX(pathNodes.i[k][0], pathNodes.i[k][1], 0), matrixHelper.applyToY(pathNodes.i[k][0], pathNodes.i[k][1], 0), matrixHelper.applyToX(pathNodes.v[k][0], pathNodes.v[k][1], 0), matrixHelper.applyToY(pathNodes.v[k][0], pathNodes.v[k][1], 0));\n }\n\n pathArr.push(matrixHelper.applyToX(pathNodes.o[k - 1][0], pathNodes.o[k - 1][1], 0), matrixHelper.applyToY(pathNodes.o[k - 1][0], pathNodes.o[k - 1][1], 0), matrixHelper.applyToX(pathNodes.i[0][0], pathNodes.i[0][1], 0), matrixHelper.applyToY(pathNodes.i[0][0], pathNodes.i[0][1], 0), matrixHelper.applyToX(pathNodes.v[0][0], pathNodes.v[0][1], 0), matrixHelper.applyToY(pathNodes.v[0][0], pathNodes.v[0][1], 0));\n commands[commandsCounter] = pathArr;\n commandsCounter += 1;\n }\n }\n\n if (singleShape) {\n xPos += letters[i].l;\n xPos += trackingOffset;\n }\n\n if (this.textSpans[cnt]) {\n this.textSpans[cnt].elem = commands;\n } else {\n this.textSpans[cnt] = {\n elem: commands\n };\n }\n\n cnt += 1;\n }\n };\n\n CVTextElement.prototype.renderInnerContent = function () {\n this.validateText();\n var ctx = this.canvasContext;\n ctx.font = this.values.fValue;\n this.globalData.renderer.ctxLineCap('butt'); // ctx.lineCap = 'butt';\n\n this.globalData.renderer.ctxLineJoin('miter'); // ctx.lineJoin = 'miter';\n\n this.globalData.renderer.ctxMiterLimit(4); // ctx.miterLimit = 4;\n\n if (!this.data.singleShape) {\n this.textAnimator.getMeasures(this.textProperty.currentData, this.lettersChangedFlag);\n }\n\n var i;\n var len;\n var j;\n var jLen;\n var k;\n var kLen;\n var renderedLetters = this.textAnimator.renderedLetters;\n var letters = this.textProperty.currentData.l;\n len = letters.length;\n var renderedLetter;\n var lastFill = null;\n var lastStroke = null;\n var lastStrokeW = null;\n var commands;\n var pathArr;\n var renderer = this.globalData.renderer;\n\n for (i = 0; i < len; i += 1) {\n if (!letters[i].n) {\n renderedLetter = renderedLetters[i];\n\n if (renderedLetter) {\n renderer.save();\n renderer.ctxTransform(renderedLetter.p);\n renderer.ctxOpacity(renderedLetter.o);\n }\n\n if (this.fill) {\n if (renderedLetter && renderedLetter.fc) {\n if (lastFill !== renderedLetter.fc) {\n renderer.ctxFillStyle(renderedLetter.fc);\n lastFill = renderedLetter.fc; // ctx.fillStyle = renderedLetter.fc;\n }\n } else if (lastFill !== this.values.fill) {\n lastFill = this.values.fill;\n renderer.ctxFillStyle(this.values.fill); // ctx.fillStyle = this.values.fill;\n }\n\n commands = this.textSpans[i].elem;\n jLen = commands.length;\n this.globalData.canvasContext.beginPath();\n\n for (j = 0; j < jLen; j += 1) {\n pathArr = commands[j];\n kLen = pathArr.length;\n this.globalData.canvasContext.moveTo(pathArr[0], pathArr[1]);\n\n for (k = 2; k < kLen; k += 6) {\n this.globalData.canvasContext.bezierCurveTo(pathArr[k], pathArr[k + 1], pathArr[k + 2], pathArr[k + 3], pathArr[k + 4], pathArr[k + 5]);\n }\n }\n\n this.globalData.canvasContext.closePath();\n renderer.ctxFill(); // this.globalData.canvasContext.fill();\n /// ctx.fillText(this.textSpans[i].val,0,0);\n }\n\n if (this.stroke) {\n if (renderedLetter && renderedLetter.sw) {\n if (lastStrokeW !== renderedLetter.sw) {\n lastStrokeW = renderedLetter.sw;\n renderer.ctxLineWidth(renderedLetter.sw); // ctx.lineWidth = renderedLetter.sw;\n }\n } else if (lastStrokeW !== this.values.sWidth) {\n lastStrokeW = this.values.sWidth;\n renderer.ctxLineWidth(this.values.sWidth); // ctx.lineWidth = this.values.sWidth;\n }\n\n if (renderedLetter && renderedLetter.sc) {\n if (lastStroke !== renderedLetter.sc) {\n lastStroke = renderedLetter.sc;\n renderer.ctxStrokeStyle(renderedLetter.sc); // ctx.strokeStyle = renderedLetter.sc;\n }\n } else if (lastStroke !== this.values.stroke) {\n lastStroke = this.values.stroke;\n renderer.ctxStrokeStyle(this.values.stroke); // ctx.strokeStyle = this.values.stroke;\n }\n\n commands = this.textSpans[i].elem;\n jLen = commands.length;\n this.globalData.canvasContext.beginPath();\n\n for (j = 0; j < jLen; j += 1) {\n pathArr = commands[j];\n kLen = pathArr.length;\n this.globalData.canvasContext.moveTo(pathArr[0], pathArr[1]);\n\n for (k = 2; k < kLen; k += 6) {\n this.globalData.canvasContext.bezierCurveTo(pathArr[k], pathArr[k + 1], pathArr[k + 2], pathArr[k + 3], pathArr[k + 4], pathArr[k + 5]);\n }\n }\n\n this.globalData.canvasContext.closePath();\n renderer.ctxStroke(); // this.globalData.canvasContext.stroke();\n /// ctx.strokeText(letters[i].val,0,0);\n }\n\n if (renderedLetter) {\n this.globalData.renderer.restore();\n }\n }\n }\n };\n\n function CVImageElement(data, globalData, comp) {\n this.assetData = globalData.getAssetData(data.refId);\n this.img = globalData.imageLoader.getAsset(this.assetData);\n this.initElement(data, globalData, comp);\n }\n\n extendPrototype([BaseElement, TransformElement, CVBaseElement, HierarchyElement, FrameElement, RenderableElement], CVImageElement);\n CVImageElement.prototype.initElement = SVGShapeElement.prototype.initElement;\n CVImageElement.prototype.prepareFrame = IImageElement.prototype.prepareFrame;\n\n CVImageElement.prototype.createContent = function () {\n if (this.img.width && (this.assetData.w !== this.img.width || this.assetData.h !== this.img.height)) {\n var canvas = createTag('canvas');\n canvas.width = this.assetData.w;\n canvas.height = this.assetData.h;\n var ctx = canvas.getContext('2d');\n var imgW = this.img.width;\n var imgH = this.img.height;\n var imgRel = imgW / imgH;\n var canvasRel = this.assetData.w / this.assetData.h;\n var widthCrop;\n var heightCrop;\n var par = this.assetData.pr || this.globalData.renderConfig.imagePreserveAspectRatio;\n\n if (imgRel > canvasRel && par === 'xMidYMid slice' || imgRel < canvasRel && par !== 'xMidYMid slice') {\n heightCrop = imgH;\n widthCrop = heightCrop * canvasRel;\n } else {\n widthCrop = imgW;\n heightCrop = widthCrop / canvasRel;\n }\n\n ctx.drawImage(this.img, (imgW - widthCrop) / 2, (imgH - heightCrop) / 2, widthCrop, heightCrop, 0, 0, this.assetData.w, this.assetData.h);\n this.img = canvas;\n }\n };\n\n CVImageElement.prototype.renderInnerContent = function () {\n this.canvasContext.drawImage(this.img, 0, 0);\n };\n\n CVImageElement.prototype.destroy = function () {\n this.img = null;\n };\n\n function CVSolidElement(data, globalData, comp) {\n this.initElement(data, globalData, comp);\n }\n\n extendPrototype([BaseElement, TransformElement, CVBaseElement, HierarchyElement, FrameElement, RenderableElement], CVSolidElement);\n CVSolidElement.prototype.initElement = SVGShapeElement.prototype.initElement;\n CVSolidElement.prototype.prepareFrame = IImageElement.prototype.prepareFrame;\n\n CVSolidElement.prototype.renderInnerContent = function () {\n // var ctx = this.canvasContext;\n this.globalData.renderer.ctxFillStyle(this.data.sc); // ctx.fillStyle = this.data.sc;\n\n this.globalData.renderer.ctxFillRect(0, 0, this.data.sw, this.data.sh); // ctx.fillRect(0, 0, this.data.sw, this.data.sh);\n //\n };\n\n function CanvasRendererBase() {}\n\n extendPrototype([BaseRenderer], CanvasRendererBase);\n\n CanvasRendererBase.prototype.createShape = function (data) {\n return new CVShapeElement(data, this.globalData, this);\n };\n\n CanvasRendererBase.prototype.createText = function (data) {\n return new CVTextElement(data, this.globalData, this);\n };\n\n CanvasRendererBase.prototype.createImage = function (data) {\n return new CVImageElement(data, this.globalData, this);\n };\n\n CanvasRendererBase.prototype.createSolid = function (data) {\n return new CVSolidElement(data, this.globalData, this);\n };\n\n CanvasRendererBase.prototype.createNull = SVGRenderer.prototype.createNull;\n\n CanvasRendererBase.prototype.ctxTransform = function (props) {\n if (props[0] === 1 && props[1] === 0 && props[4] === 0 && props[5] === 1 && props[12] === 0 && props[13] === 0) {\n return;\n }\n\n this.canvasContext.transform(props[0], props[1], props[4], props[5], props[12], props[13]);\n };\n\n CanvasRendererBase.prototype.ctxOpacity = function (op) {\n this.canvasContext.globalAlpha *= op < 0 ? 0 : op;\n };\n\n CanvasRendererBase.prototype.ctxFillStyle = function (value) {\n this.canvasContext.fillStyle = value;\n };\n\n CanvasRendererBase.prototype.ctxStrokeStyle = function (value) {\n this.canvasContext.strokeStyle = value;\n };\n\n CanvasRendererBase.prototype.ctxLineWidth = function (value) {\n this.canvasContext.lineWidth = value;\n };\n\n CanvasRendererBase.prototype.ctxLineCap = function (value) {\n this.canvasContext.lineCap = value;\n };\n\n CanvasRendererBase.prototype.ctxLineJoin = function (value) {\n this.canvasContext.lineJoin = value;\n };\n\n CanvasRendererBase.prototype.ctxMiterLimit = function (value) {\n this.canvasContext.miterLimit = value;\n };\n\n CanvasRendererBase.prototype.ctxFill = function (rule) {\n this.canvasContext.fill(rule);\n };\n\n CanvasRendererBase.prototype.ctxFillRect = function (x, y, w, h) {\n this.canvasContext.fillRect(x, y, w, h);\n };\n\n CanvasRendererBase.prototype.ctxStroke = function () {\n this.canvasContext.stroke();\n };\n\n CanvasRendererBase.prototype.reset = function () {\n if (!this.renderConfig.clearCanvas) {\n this.canvasContext.restore();\n return;\n }\n\n this.contextData.reset();\n };\n\n CanvasRendererBase.prototype.save = function () {\n this.canvasContext.save();\n };\n\n CanvasRendererBase.prototype.restore = function (actionFlag) {\n if (!this.renderConfig.clearCanvas) {\n this.canvasContext.restore();\n return;\n }\n\n if (actionFlag) {\n this.globalData.blendMode = 'source-over';\n }\n\n this.contextData.restore(actionFlag);\n };\n\n CanvasRendererBase.prototype.configAnimation = function (animData) {\n if (this.animationItem.wrapper) {\n this.animationItem.container = createTag('canvas');\n var containerStyle = this.animationItem.container.style;\n containerStyle.width = '100%';\n containerStyle.height = '100%';\n var origin = '0px 0px 0px';\n containerStyle.transformOrigin = origin;\n containerStyle.mozTransformOrigin = origin;\n containerStyle.webkitTransformOrigin = origin;\n containerStyle['-webkit-transform'] = origin;\n containerStyle.contentVisibility = this.renderConfig.contentVisibility;\n this.animationItem.wrapper.appendChild(this.animationItem.container);\n this.canvasContext = this.animationItem.container.getContext('2d');\n\n if (this.renderConfig.className) {\n this.animationItem.container.setAttribute('class', this.renderConfig.className);\n }\n\n if (this.renderConfig.id) {\n this.animationItem.container.setAttribute('id', this.renderConfig.id);\n }\n } else {\n this.canvasContext = this.renderConfig.context;\n }\n\n this.contextData.setContext(this.canvasContext);\n this.data = animData;\n this.layers = animData.layers;\n this.transformCanvas = {\n w: animData.w,\n h: animData.h,\n sx: 0,\n sy: 0,\n tx: 0,\n ty: 0\n };\n this.setupGlobalData(animData, document.body);\n this.globalData.canvasContext = this.canvasContext;\n this.globalData.renderer = this;\n this.globalData.isDashed = false;\n this.globalData.progressiveLoad = this.renderConfig.progressiveLoad;\n this.globalData.transformCanvas = this.transformCanvas;\n this.elements = createSizedArray(animData.layers.length);\n this.updateContainerSize();\n };\n\n CanvasRendererBase.prototype.updateContainerSize = function (width, height) {\n this.reset();\n var elementWidth;\n var elementHeight;\n\n if (width) {\n elementWidth = width;\n elementHeight = height;\n this.canvasContext.canvas.width = elementWidth;\n this.canvasContext.canvas.height = elementHeight;\n } else {\n if (this.animationItem.wrapper && this.animationItem.container) {\n elementWidth = this.animationItem.wrapper.offsetWidth;\n elementHeight = this.animationItem.wrapper.offsetHeight;\n } else {\n elementWidth = this.canvasContext.canvas.width;\n elementHeight = this.canvasContext.canvas.height;\n }\n\n this.canvasContext.canvas.width = elementWidth * this.renderConfig.dpr;\n this.canvasContext.canvas.height = elementHeight * this.renderConfig.dpr;\n }\n\n var elementRel;\n var animationRel;\n\n if (this.renderConfig.preserveAspectRatio.indexOf('meet') !== -1 || this.renderConfig.preserveAspectRatio.indexOf('slice') !== -1) {\n var par = this.renderConfig.preserveAspectRatio.split(' ');\n var fillType = par[1] || 'meet';\n var pos = par[0] || 'xMidYMid';\n var xPos = pos.substr(0, 4);\n var yPos = pos.substr(4);\n elementRel = elementWidth / elementHeight;\n animationRel = this.transformCanvas.w / this.transformCanvas.h;\n\n if (animationRel > elementRel && fillType === 'meet' || animationRel < elementRel && fillType === 'slice') {\n this.transformCanvas.sx = elementWidth / (this.transformCanvas.w / this.renderConfig.dpr);\n this.transformCanvas.sy = elementWidth / (this.transformCanvas.w / this.renderConfig.dpr);\n } else {\n this.transformCanvas.sx = elementHeight / (this.transformCanvas.h / this.renderConfig.dpr);\n this.transformCanvas.sy = elementHeight / (this.transformCanvas.h / this.renderConfig.dpr);\n }\n\n if (xPos === 'xMid' && (animationRel < elementRel && fillType === 'meet' || animationRel > elementRel && fillType === 'slice')) {\n this.transformCanvas.tx = (elementWidth - this.transformCanvas.w * (elementHeight / this.transformCanvas.h)) / 2 * this.renderConfig.dpr;\n } else if (xPos === 'xMax' && (animationRel < elementRel && fillType === 'meet' || animationRel > elementRel && fillType === 'slice')) {\n this.transformCanvas.tx = (elementWidth - this.transformCanvas.w * (elementHeight / this.transformCanvas.h)) * this.renderConfig.dpr;\n } else {\n this.transformCanvas.tx = 0;\n }\n\n if (yPos === 'YMid' && (animationRel > elementRel && fillType === 'meet' || animationRel < elementRel && fillType === 'slice')) {\n this.transformCanvas.ty = (elementHeight - this.transformCanvas.h * (elementWidth / this.transformCanvas.w)) / 2 * this.renderConfig.dpr;\n } else if (yPos === 'YMax' && (animationRel > elementRel && fillType === 'meet' || animationRel < elementRel && fillType === 'slice')) {\n this.transformCanvas.ty = (elementHeight - this.transformCanvas.h * (elementWidth / this.transformCanvas.w)) * this.renderConfig.dpr;\n } else {\n this.transformCanvas.ty = 0;\n }\n } else if (this.renderConfig.preserveAspectRatio === 'none') {\n this.transformCanvas.sx = elementWidth / (this.transformCanvas.w / this.renderConfig.dpr);\n this.transformCanvas.sy = elementHeight / (this.transformCanvas.h / this.renderConfig.dpr);\n this.transformCanvas.tx = 0;\n this.transformCanvas.ty = 0;\n } else {\n this.transformCanvas.sx = this.renderConfig.dpr;\n this.transformCanvas.sy = this.renderConfig.dpr;\n this.transformCanvas.tx = 0;\n this.transformCanvas.ty = 0;\n }\n\n this.transformCanvas.props = [this.transformCanvas.sx, 0, 0, 0, 0, this.transformCanvas.sy, 0, 0, 0, 0, 1, 0, this.transformCanvas.tx, this.transformCanvas.ty, 0, 1];\n /* var i, len = this.elements.length;\r\n for(i=0;i<len;i+=1){\r\n if(this.elements[i] && this.elements[i].data.ty === 0){\r\n this.elements[i].resize(this.globalData.transformCanvas);\r\n }\r\n } */\n\n this.ctxTransform(this.transformCanvas.props);\n this.canvasContext.beginPath();\n this.canvasContext.rect(0, 0, this.transformCanvas.w, this.transformCanvas.h);\n this.canvasContext.closePath();\n this.canvasContext.clip();\n this.renderFrame(this.renderedFrame, true);\n };\n\n CanvasRendererBase.prototype.destroy = function () {\n if (this.renderConfig.clearCanvas && this.animationItem.wrapper) {\n this.animationItem.wrapper.innerText = '';\n }\n\n var i;\n var len = this.layers ? this.layers.length : 0;\n\n for (i = len - 1; i >= 0; i -= 1) {\n if (this.elements[i] && this.elements[i].destroy) {\n this.elements[i].destroy();\n }\n }\n\n this.elements.length = 0;\n this.globalData.canvasContext = null;\n this.animationItem.container = null;\n this.destroyed = true;\n };\n\n CanvasRendererBase.prototype.renderFrame = function (num, forceRender) {\n if (this.renderedFrame === num && this.renderConfig.clearCanvas === true && !forceRender || this.destroyed || num === -1) {\n return;\n }\n\n this.renderedFrame = num;\n this.globalData.frameNum = num - this.animationItem._isFirstFrame;\n this.globalData.frameId += 1;\n this.globalData._mdf = !this.renderConfig.clearCanvas || forceRender;\n this.globalData.projectInterface.currentFrame = num; // console.log('--------');\n // console.log('NEW: ',num);\n\n var i;\n var len = this.layers.length;\n\n if (!this.completeLayers) {\n this.checkLayers(num);\n }\n\n for (i = len - 1; i >= 0; i -= 1) {\n if (this.completeLayers || this.elements[i]) {\n this.elements[i].prepareFrame(num - this.layers[i].st);\n }\n }\n\n if (this.globalData._mdf) {\n if (this.renderConfig.clearCanvas === true) {\n this.canvasContext.clearRect(0, 0, this.transformCanvas.w, this.transformCanvas.h);\n } else {\n this.save();\n }\n\n for (i = len - 1; i >= 0; i -= 1) {\n if (this.completeLayers || this.elements[i]) {\n this.elements[i].renderFrame();\n }\n }\n\n if (this.renderConfig.clearCanvas !== true) {\n this.restore();\n }\n }\n };\n\n CanvasRendererBase.prototype.buildItem = function (pos) {\n var elements = this.elements;\n\n if (elements[pos] || this.layers[pos].ty === 99) {\n return;\n }\n\n var element = this.createItem(this.layers[pos], this, this.globalData);\n elements[pos] = element;\n element.initExpressions();\n /* if(this.layers[pos].ty === 0){\r\n element.resize(this.globalData.transformCanvas);\r\n } */\n };\n\n CanvasRendererBase.prototype.checkPendingElements = function () {\n while (this.pendingElements.length) {\n var element = this.pendingElements.pop();\n element.checkParenting();\n }\n };\n\n CanvasRendererBase.prototype.hide = function () {\n this.animationItem.container.style.display = 'none';\n };\n\n CanvasRendererBase.prototype.show = function () {\n this.animationItem.container.style.display = 'block';\n };\n\n function CanvasContext() {\n this.opacity = -1;\n this.transform = createTypedArray('float32', 16);\n this.fillStyle = '';\n this.strokeStyle = '';\n this.lineWidth = '';\n this.lineCap = '';\n this.lineJoin = '';\n this.miterLimit = '';\n this.id = Math.random();\n }\n\n function CVContextData() {\n this.stack = [];\n this.cArrPos = 0;\n this.cTr = new Matrix();\n var i;\n var len = 15;\n\n for (i = 0; i < len; i += 1) {\n var canvasContext = new CanvasContext();\n this.stack[i] = canvasContext;\n }\n\n this._length = len;\n this.nativeContext = null;\n this.transformMat = new Matrix();\n this.currentOpacity = 1; //\n\n this.currentFillStyle = '';\n this.appliedFillStyle = ''; //\n\n this.currentStrokeStyle = '';\n this.appliedStrokeStyle = ''; //\n\n this.currentLineWidth = '';\n this.appliedLineWidth = ''; //\n\n this.currentLineCap = '';\n this.appliedLineCap = ''; //\n\n this.currentLineJoin = '';\n this.appliedLineJoin = ''; //\n\n this.appliedMiterLimit = '';\n this.currentMiterLimit = '';\n }\n\n CVContextData.prototype.duplicate = function () {\n var newLength = this._length * 2;\n var i = 0;\n\n for (i = this._length; i < newLength; i += 1) {\n this.stack[i] = new CanvasContext();\n }\n\n this._length = newLength;\n };\n\n CVContextData.prototype.reset = function () {\n this.cArrPos = 0;\n this.cTr.reset();\n this.stack[this.cArrPos].opacity = 1;\n };\n\n CVContextData.prototype.restore = function (forceRestore) {\n this.cArrPos -= 1;\n var currentContext = this.stack[this.cArrPos];\n var transform = currentContext.transform;\n var i;\n var arr = this.cTr.props;\n\n for (i = 0; i < 16; i += 1) {\n arr[i] = transform[i];\n }\n\n if (forceRestore) {\n this.nativeContext.restore();\n var prevStack = this.stack[this.cArrPos + 1];\n this.appliedFillStyle = prevStack.fillStyle;\n this.appliedStrokeStyle = prevStack.strokeStyle;\n this.appliedLineWidth = prevStack.lineWidth;\n this.appliedLineCap = prevStack.lineCap;\n this.appliedLineJoin = prevStack.lineJoin;\n this.appliedMiterLimit = prevStack.miterLimit;\n }\n\n this.nativeContext.setTransform(transform[0], transform[1], transform[4], transform[5], transform[12], transform[13]);\n\n if (forceRestore || currentContext.opacity !== -1 && this.currentOpacity !== currentContext.opacity) {\n this.nativeContext.globalAlpha = currentContext.opacity;\n this.currentOpacity = currentContext.opacity;\n }\n\n this.currentFillStyle = currentContext.fillStyle;\n this.currentStrokeStyle = currentContext.strokeStyle;\n this.currentLineWidth = currentContext.lineWidth;\n this.currentLineCap = currentContext.lineCap;\n this.currentLineJoin = currentContext.lineJoin;\n this.currentMiterLimit = currentContext.miterLimit;\n };\n\n CVContextData.prototype.save = function (saveOnNativeFlag) {\n if (saveOnNativeFlag) {\n this.nativeContext.save();\n }\n\n var props = this.cTr.props;\n\n if (this._length <= this.cArrPos) {\n this.duplicate();\n }\n\n var currentStack = this.stack[this.cArrPos];\n var i;\n\n for (i = 0; i < 16; i += 1) {\n currentStack.transform[i] = props[i];\n }\n\n this.cArrPos += 1;\n var newStack = this.stack[this.cArrPos];\n newStack.opacity = currentStack.opacity;\n newStack.fillStyle = currentStack.fillStyle;\n newStack.strokeStyle = currentStack.strokeStyle;\n newStack.lineWidth = currentStack.lineWidth;\n newStack.lineCap = currentStack.lineCap;\n newStack.lineJoin = currentStack.lineJoin;\n newStack.miterLimit = currentStack.miterLimit;\n };\n\n CVContextData.prototype.setOpacity = function (value) {\n this.stack[this.cArrPos].opacity = value;\n };\n\n CVContextData.prototype.setContext = function (value) {\n this.nativeContext = value;\n };\n\n CVContextData.prototype.fillStyle = function (value) {\n if (this.stack[this.cArrPos].fillStyle !== value) {\n this.currentFillStyle = value;\n this.stack[this.cArrPos].fillStyle = value;\n }\n };\n\n CVContextData.prototype.strokeStyle = function (value) {\n if (this.stack[this.cArrPos].strokeStyle !== value) {\n this.currentStrokeStyle = value;\n this.stack[this.cArrPos].strokeStyle = value;\n }\n };\n\n CVContextData.prototype.lineWidth = function (value) {\n if (this.stack[this.cArrPos].lineWidth !== value) {\n this.currentLineWidth = value;\n this.stack[this.cArrPos].lineWidth = value;\n }\n };\n\n CVContextData.prototype.lineCap = function (value) {\n if (this.stack[this.cArrPos].lineCap !== value) {\n this.currentLineCap = value;\n this.stack[this.cArrPos].lineCap = value;\n }\n };\n\n CVContextData.prototype.lineJoin = function (value) {\n if (this.stack[this.cArrPos].lineJoin !== value) {\n this.currentLineJoin = value;\n this.stack[this.cArrPos].lineJoin = value;\n }\n };\n\n CVContextData.prototype.miterLimit = function (value) {\n if (this.stack[this.cArrPos].miterLimit !== value) {\n this.currentMiterLimit = value;\n this.stack[this.cArrPos].miterLimit = value;\n }\n };\n\n CVContextData.prototype.transform = function (props) {\n this.transformMat.cloneFromProps(props); // Taking the last transform value from the stored stack of transforms\n\n var currentTransform = this.cTr; // Applying the last transform value after the new transform to respect the order of transformations\n\n this.transformMat.multiply(currentTransform); // Storing the new transformed value in the stored transform\n\n currentTransform.cloneFromProps(this.transformMat.props);\n var trProps = currentTransform.props; // Applying the new transform to the canvas\n\n this.nativeContext.setTransform(trProps[0], trProps[1], trProps[4], trProps[5], trProps[12], trProps[13]);\n };\n\n CVContextData.prototype.opacity = function (op) {\n var currentOpacity = this.stack[this.cArrPos].opacity;\n currentOpacity *= op < 0 ? 0 : op;\n\n if (this.stack[this.cArrPos].opacity !== currentOpacity) {\n if (this.currentOpacity !== op) {\n this.nativeContext.globalAlpha = op;\n this.currentOpacity = op;\n }\n\n this.stack[this.cArrPos].opacity = currentOpacity;\n }\n };\n\n CVContextData.prototype.fill = function (rule) {\n if (this.appliedFillStyle !== this.currentFillStyle) {\n this.appliedFillStyle = this.currentFillStyle;\n this.nativeContext.fillStyle = this.appliedFillStyle;\n }\n\n this.nativeContext.fill(rule);\n };\n\n CVContextData.prototype.fillRect = function (x, y, w, h) {\n if (this.appliedFillStyle !== this.currentFillStyle) {\n this.appliedFillStyle = this.currentFillStyle;\n this.nativeContext.fillStyle = this.appliedFillStyle;\n }\n\n this.nativeContext.fillRect(x, y, w, h);\n };\n\n CVContextData.prototype.stroke = function () {\n if (this.appliedStrokeStyle !== this.currentStrokeStyle) {\n this.appliedStrokeStyle = this.currentStrokeStyle;\n this.nativeContext.strokeStyle = this.appliedStrokeStyle;\n }\n\n if (this.appliedLineWidth !== this.currentLineWidth) {\n this.appliedLineWidth = this.currentLineWidth;\n this.nativeContext.lineWidth = this.appliedLineWidth;\n }\n\n if (this.appliedLineCap !== this.currentLineCap) {\n this.appliedLineCap = this.currentLineCap;\n this.nativeContext.lineCap = this.appliedLineCap;\n }\n\n if (this.appliedLineJoin !== this.currentLineJoin) {\n this.appliedLineJoin = this.currentLineJoin;\n this.nativeContext.lineJoin = this.appliedLineJoin;\n }\n\n if (this.appliedMiterLimit !== this.currentMiterLimit) {\n this.appliedMiterLimit = this.currentMiterLimit;\n this.nativeContext.miterLimit = this.appliedMiterLimit;\n }\n\n this.nativeContext.stroke();\n };\n\n function CVCompElement(data, globalData, comp) {\n this.completeLayers = false;\n this.layers = data.layers;\n this.pendingElements = [];\n this.elements = createSizedArray(this.layers.length);\n this.initElement(data, globalData, comp);\n this.tm = data.tm ? PropertyFactory.getProp(this, data.tm, 0, globalData.frameRate, this) : {\n _placeholder: true\n };\n }\n\n extendPrototype([CanvasRendererBase, ICompElement, CVBaseElement], CVCompElement);\n\n CVCompElement.prototype.renderInnerContent = function () {\n var ctx = this.canvasContext;\n ctx.beginPath();\n ctx.moveTo(0, 0);\n ctx.lineTo(this.data.w, 0);\n ctx.lineTo(this.data.w, this.data.h);\n ctx.lineTo(0, this.data.h);\n ctx.lineTo(0, 0);\n ctx.clip();\n var i;\n var len = this.layers.length;\n\n for (i = len - 1; i >= 0; i -= 1) {\n if (this.completeLayers || this.elements[i]) {\n this.elements[i].renderFrame();\n }\n }\n };\n\n CVCompElement.prototype.destroy = function () {\n var i;\n var len = this.layers.length;\n\n for (i = len - 1; i >= 0; i -= 1) {\n if (this.elements[i]) {\n this.elements[i].destroy();\n }\n }\n\n this.layers = null;\n this.elements = null;\n };\n\n CVCompElement.prototype.createComp = function (data) {\n return new CVCompElement(data, this.globalData, this);\n };\n\n function CanvasRenderer(animationItem, config) {\n this.animationItem = animationItem;\n this.renderConfig = {\n clearCanvas: config && config.clearCanvas !== undefined ? config.clearCanvas : true,\n context: config && config.context || null,\n progressiveLoad: config && config.progressiveLoad || false,\n preserveAspectRatio: config && config.preserveAspectRatio || 'xMidYMid meet',\n imagePreserveAspectRatio: config && config.imagePreserveAspectRatio || 'xMidYMid slice',\n contentVisibility: config && config.contentVisibility || 'visible',\n className: config && config.className || '',\n id: config && config.id || '',\n runExpressions: !config || config.runExpressions === undefined || config.runExpressions\n };\n this.renderConfig.dpr = config && config.dpr || 1;\n\n if (this.animationItem.wrapper) {\n this.renderConfig.dpr = config && config.dpr || window.devicePixelRatio || 1;\n }\n\n this.renderedFrame = -1;\n this.globalData = {\n frameNum: -1,\n _mdf: false,\n renderConfig: this.renderConfig,\n currentGlobalAlpha: -1\n };\n this.contextData = new CVContextData();\n this.elements = [];\n this.pendingElements = [];\n this.transformMat = new Matrix();\n this.completeLayers = false;\n this.rendererType = 'canvas';\n\n if (this.renderConfig.clearCanvas) {\n this.ctxTransform = this.contextData.transform.bind(this.contextData);\n this.ctxOpacity = this.contextData.opacity.bind(this.contextData);\n this.ctxFillStyle = this.contextData.fillStyle.bind(this.contextData);\n this.ctxStrokeStyle = this.contextData.strokeStyle.bind(this.contextData);\n this.ctxLineWidth = this.contextData.lineWidth.bind(this.contextData);\n this.ctxLineCap = this.contextData.lineCap.bind(this.contextData);\n this.ctxLineJoin = this.contextData.lineJoin.bind(this.contextData);\n this.ctxMiterLimit = this.contextData.miterLimit.bind(this.contextData);\n this.ctxFill = this.contextData.fill.bind(this.contextData);\n this.ctxFillRect = this.contextData.fillRect.bind(this.contextData);\n this.ctxStroke = this.contextData.stroke.bind(this.contextData);\n this.save = this.contextData.save.bind(this.contextData);\n }\n }\n\n extendPrototype([CanvasRendererBase], CanvasRenderer);\n\n CanvasRenderer.prototype.createComp = function (data) {\n return new CVCompElement(data, this.globalData, this);\n };\n\n function HBaseElement() {}\n\n HBaseElement.prototype = {\n checkBlendMode: function checkBlendMode() {},\n initRendererElement: function initRendererElement() {\n this.baseElement = createTag(this.data.tg || 'div');\n\n if (this.data.hasMask) {\n this.svgElement = createNS('svg');\n this.layerElement = createNS('g');\n this.maskedElement = this.layerElement;\n this.svgElement.appendChild(this.layerElement);\n this.baseElement.appendChild(this.svgElement);\n } else {\n this.layerElement = this.baseElement;\n }\n\n styleDiv(this.baseElement);\n },\n createContainerElements: function createContainerElements() {\n this.renderableEffectsManager = new CVEffects(this);\n this.transformedElement = this.baseElement;\n this.maskedElement = this.layerElement;\n\n if (this.data.ln) {\n this.layerElement.setAttribute('id', this.data.ln);\n }\n\n if (this.data.cl) {\n this.layerElement.setAttribute('class', this.data.cl);\n }\n\n if (this.data.bm !== 0) {\n this.setBlendMode();\n }\n },\n renderElement: function renderElement() {\n var transformedElementStyle = this.transformedElement ? this.transformedElement.style : {};\n\n if (this.finalTransform._matMdf) {\n var matrixValue = this.finalTransform.mat.toCSS();\n transformedElementStyle.transform = matrixValue;\n transformedElementStyle.webkitTransform = matrixValue;\n }\n\n if (this.finalTransform._opMdf) {\n transformedElementStyle.opacity = this.finalTransform.mProp.o.v;\n }\n },\n renderFrame: function renderFrame() {\n // If it is exported as hidden (data.hd === true) no need to render\n // If it is not visible no need to render\n if (this.data.hd || this.hidden) {\n return;\n }\n\n this.renderTransform();\n this.renderRenderable();\n this.renderElement();\n this.renderInnerContent();\n\n if (this._isFirstFrame) {\n this._isFirstFrame = false;\n }\n },\n destroy: function destroy() {\n this.layerElement = null;\n this.transformedElement = null;\n\n if (this.matteElement) {\n this.matteElement = null;\n }\n\n if (this.maskManager) {\n this.maskManager.destroy();\n this.maskManager = null;\n }\n },\n createRenderableComponents: function createRenderableComponents() {\n this.maskManager = new MaskElement(this.data, this, this.globalData);\n },\n addEffects: function addEffects() {},\n setMatte: function setMatte() {}\n };\n HBaseElement.prototype.getBaseElement = SVGBaseElement.prototype.getBaseElement;\n HBaseElement.prototype.destroyBaseElement = HBaseElement.prototype.destroy;\n HBaseElement.prototype.buildElementParenting = BaseRenderer.prototype.buildElementParenting;\n\n function HSolidElement(data, globalData, comp) {\n this.initElement(data, globalData, comp);\n }\n\n extendPrototype([BaseElement, TransformElement, HBaseElement, HierarchyElement, FrameElement, RenderableDOMElement], HSolidElement);\n\n HSolidElement.prototype.createContent = function () {\n var rect;\n\n if (this.data.hasMask) {\n rect = createNS('rect');\n rect.setAttribute('width', this.data.sw);\n rect.setAttribute('height', this.data.sh);\n rect.setAttribute('fill', this.data.sc);\n this.svgElement.setAttribute('width', this.data.sw);\n this.svgElement.setAttribute('height', this.data.sh);\n } else {\n rect = createTag('div');\n rect.style.width = this.data.sw + 'px';\n rect.style.height = this.data.sh + 'px';\n rect.style.backgroundColor = this.data.sc;\n }\n\n this.layerElement.appendChild(rect);\n };\n\n function HShapeElement(data, globalData, comp) {\n // List of drawable elements\n this.shapes = []; // Full shape data\n\n this.shapesData = data.shapes; // List of styles that will be applied to shapes\n\n this.stylesList = []; // List of modifiers that will be applied to shapes\n\n this.shapeModifiers = []; // List of items in shape tree\n\n this.itemsData = []; // List of items in previous shape tree\n\n this.processedElements = []; // List of animated components\n\n this.animatedContents = [];\n this.shapesContainer = createNS('g');\n this.initElement(data, globalData, comp); // Moving any property that doesn't get too much access after initialization because of v8 way of handling more than 10 properties.\n // List of elements that have been created\n\n this.prevViewData = [];\n this.currentBBox = {\n x: 999999,\n y: -999999,\n h: 0,\n w: 0\n };\n }\n\n extendPrototype([BaseElement, TransformElement, HSolidElement, SVGShapeElement, HBaseElement, HierarchyElement, FrameElement, RenderableElement], HShapeElement);\n HShapeElement.prototype._renderShapeFrame = HShapeElement.prototype.renderInnerContent;\n\n HShapeElement.prototype.createContent = function () {\n var cont;\n this.baseElement.style.fontSize = 0;\n\n if (this.data.hasMask) {\n this.layerElement.appendChild(this.shapesContainer);\n cont = this.svgElement;\n } else {\n cont = createNS('svg');\n var size = this.comp.data ? this.comp.data : this.globalData.compSize;\n cont.setAttribute('width', size.w);\n cont.setAttribute('height', size.h);\n cont.appendChild(this.shapesContainer);\n this.layerElement.appendChild(cont);\n }\n\n this.searchShapes(this.shapesData, this.itemsData, this.prevViewData, this.shapesContainer, 0, [], true);\n this.filterUniqueShapes();\n this.shapeCont = cont;\n };\n\n HShapeElement.prototype.getTransformedPoint = function (transformers, point) {\n var i;\n var len = transformers.length;\n\n for (i = 0; i < len; i += 1) {\n point = transformers[i].mProps.v.applyToPointArray(point[0], point[1], 0);\n }\n\n return point;\n };\n\n HShapeElement.prototype.calculateShapeBoundingBox = function (item, boundingBox) {\n var shape = item.sh.v;\n var transformers = item.transformers;\n var i;\n var len = shape._length;\n var vPoint;\n var oPoint;\n var nextIPoint;\n var nextVPoint;\n\n if (len <= 1) {\n return;\n }\n\n for (i = 0; i < len - 1; i += 1) {\n vPoint = this.getTransformedPoint(transformers, shape.v[i]);\n oPoint = this.getTransformedPoint(transformers, shape.o[i]);\n nextIPoint = this.getTransformedPoint(transformers, shape.i[i + 1]);\n nextVPoint = this.getTransformedPoint(transformers, shape.v[i + 1]);\n this.checkBounds(vPoint, oPoint, nextIPoint, nextVPoint, boundingBox);\n }\n\n if (shape.c) {\n vPoint = this.getTransformedPoint(transformers, shape.v[i]);\n oPoint = this.getTransformedPoint(transformers, shape.o[i]);\n nextIPoint = this.getTransformedPoint(transformers, shape.i[0]);\n nextVPoint = this.getTransformedPoint(transformers, shape.v[0]);\n this.checkBounds(vPoint, oPoint, nextIPoint, nextVPoint, boundingBox);\n }\n };\n\n HShapeElement.prototype.checkBounds = function (vPoint, oPoint, nextIPoint, nextVPoint, boundingBox) {\n this.getBoundsOfCurve(vPoint, oPoint, nextIPoint, nextVPoint);\n var bounds = this.shapeBoundingBox;\n boundingBox.x = bmMin(bounds.left, boundingBox.x);\n boundingBox.xMax = bmMax(bounds.right, boundingBox.xMax);\n boundingBox.y = bmMin(bounds.top, boundingBox.y);\n boundingBox.yMax = bmMax(bounds.bottom, boundingBox.yMax);\n };\n\n HShapeElement.prototype.shapeBoundingBox = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n };\n HShapeElement.prototype.tempBoundingBox = {\n x: 0,\n xMax: 0,\n y: 0,\n yMax: 0,\n width: 0,\n height: 0\n };\n\n HShapeElement.prototype.getBoundsOfCurve = function (p0, p1, p2, p3) {\n var bounds = [[p0[0], p3[0]], [p0[1], p3[1]]];\n\n for (var a, b, c, t, b2ac, t1, t2, i = 0; i < 2; ++i) {\n // eslint-disable-line no-plusplus\n b = 6 * p0[i] - 12 * p1[i] + 6 * p2[i];\n a = -3 * p0[i] + 9 * p1[i] - 9 * p2[i] + 3 * p3[i];\n c = 3 * p1[i] - 3 * p0[i];\n b |= 0; // eslint-disable-line no-bitwise\n\n a |= 0; // eslint-disable-line no-bitwise\n\n c |= 0; // eslint-disable-line no-bitwise\n\n if (a === 0 && b === 0) {//\n } else if (a === 0) {\n t = -c / b;\n\n if (t > 0 && t < 1) {\n bounds[i].push(this.calculateF(t, p0, p1, p2, p3, i));\n }\n } else {\n b2ac = b * b - 4 * c * a;\n\n if (b2ac >= 0) {\n t1 = (-b + bmSqrt(b2ac)) / (2 * a);\n if (t1 > 0 && t1 < 1) bounds[i].push(this.calculateF(t1, p0, p1, p2, p3, i));\n t2 = (-b - bmSqrt(b2ac)) / (2 * a);\n if (t2 > 0 && t2 < 1) bounds[i].push(this.calculateF(t2, p0, p1, p2, p3, i));\n }\n }\n }\n\n this.shapeBoundingBox.left = bmMin.apply(null, bounds[0]);\n this.shapeBoundingBox.top = bmMin.apply(null, bounds[1]);\n this.shapeBoundingBox.right = bmMax.apply(null, bounds[0]);\n this.shapeBoundingBox.bottom = bmMax.apply(null, bounds[1]);\n };\n\n HShapeElement.prototype.calculateF = function (t, p0, p1, p2, p3, i) {\n return bmPow(1 - t, 3) * p0[i] + 3 * bmPow(1 - t, 2) * t * p1[i] + 3 * (1 - t) * bmPow(t, 2) * p2[i] + bmPow(t, 3) * p3[i];\n };\n\n HShapeElement.prototype.calculateBoundingBox = function (itemsData, boundingBox) {\n var i;\n var len = itemsData.length;\n\n for (i = 0; i < len; i += 1) {\n if (itemsData[i] && itemsData[i].sh) {\n this.calculateShapeBoundingBox(itemsData[i], boundingBox);\n } else if (itemsData[i] && itemsData[i].it) {\n this.calculateBoundingBox(itemsData[i].it, boundingBox);\n } else if (itemsData[i] && itemsData[i].style && itemsData[i].w) {\n this.expandStrokeBoundingBox(itemsData[i].w, boundingBox);\n }\n }\n };\n\n HShapeElement.prototype.expandStrokeBoundingBox = function (widthProperty, boundingBox) {\n var width = 0;\n\n if (widthProperty.keyframes) {\n for (var i = 0; i < widthProperty.keyframes.length; i += 1) {\n var kfw = widthProperty.keyframes[i].s;\n\n if (kfw > width) {\n width = kfw;\n }\n }\n\n width *= widthProperty.mult;\n } else {\n width = widthProperty.v * widthProperty.mult;\n }\n\n boundingBox.x -= width;\n boundingBox.xMax += width;\n boundingBox.y -= width;\n boundingBox.yMax += width;\n };\n\n HShapeElement.prototype.currentBoxContains = function (box) {\n return this.currentBBox.x <= box.x && this.currentBBox.y <= box.y && this.currentBBox.width + this.currentBBox.x >= box.x + box.width && this.currentBBox.height + this.currentBBox.y >= box.y + box.height;\n };\n\n HShapeElement.prototype.renderInnerContent = function () {\n this._renderShapeFrame();\n\n if (!this.hidden && (this._isFirstFrame || this._mdf)) {\n var tempBoundingBox = this.tempBoundingBox;\n var max = 999999;\n tempBoundingBox.x = max;\n tempBoundingBox.xMax = -max;\n tempBoundingBox.y = max;\n tempBoundingBox.yMax = -max;\n this.calculateBoundingBox(this.itemsData, tempBoundingBox);\n tempBoundingBox.width = tempBoundingBox.xMax < tempBoundingBox.x ? 0 : tempBoundingBox.xMax - tempBoundingBox.x;\n tempBoundingBox.height = tempBoundingBox.yMax < tempBoundingBox.y ? 0 : tempBoundingBox.yMax - tempBoundingBox.y; // var tempBoundingBox = this.shapeCont.getBBox();\n\n if (this.currentBoxContains(tempBoundingBox)) {\n return;\n }\n\n var changed = false;\n\n if (this.currentBBox.w !== tempBoundingBox.width) {\n this.currentBBox.w = tempBoundingBox.width;\n this.shapeCont.setAttribute('width', tempBoundingBox.width);\n changed = true;\n }\n\n if (this.currentBBox.h !== tempBoundingBox.height) {\n this.currentBBox.h = tempBoundingBox.height;\n this.shapeCont.setAttribute('height', tempBoundingBox.height);\n changed = true;\n }\n\n if (changed || this.currentBBox.x !== tempBoundingBox.x || this.currentBBox.y !== tempBoundingBox.y) {\n this.currentBBox.w = tempBoundingBox.width;\n this.currentBBox.h = tempBoundingBox.height;\n this.currentBBox.x = tempBoundingBox.x;\n this.currentBBox.y = tempBoundingBox.y;\n this.shapeCont.setAttribute('viewBox', this.currentBBox.x + ' ' + this.currentBBox.y + ' ' + this.currentBBox.w + ' ' + this.currentBBox.h);\n var shapeStyle = this.shapeCont.style;\n var shapeTransform = 'translate(' + this.currentBBox.x + 'px,' + this.currentBBox.y + 'px)';\n shapeStyle.transform = shapeTransform;\n shapeStyle.webkitTransform = shapeTransform;\n }\n }\n };\n\n function HTextElement(data, globalData, comp) {\n this.textSpans = [];\n this.textPaths = [];\n this.currentBBox = {\n x: 999999,\n y: -999999,\n h: 0,\n w: 0\n };\n this.renderType = 'svg';\n this.isMasked = false;\n this.initElement(data, globalData, comp);\n }\n\n extendPrototype([BaseElement, TransformElement, HBaseElement, HierarchyElement, FrameElement, RenderableDOMElement, ITextElement], HTextElement);\n\n HTextElement.prototype.createContent = function () {\n this.isMasked = this.checkMasks();\n\n if (this.isMasked) {\n this.renderType = 'svg';\n this.compW = this.comp.data.w;\n this.compH = this.comp.data.h;\n this.svgElement.setAttribute('width', this.compW);\n this.svgElement.setAttribute('height', this.compH);\n var g = createNS('g');\n this.maskedElement.appendChild(g);\n this.innerElem = g;\n } else {\n this.renderType = 'html';\n this.innerElem = this.layerElement;\n }\n\n this.checkParenting();\n };\n\n HTextElement.prototype.buildNewText = function () {\n var documentData = this.textProperty.currentData;\n this.renderedLetters = createSizedArray(documentData.l ? documentData.l.length : 0);\n var innerElemStyle = this.innerElem.style;\n var textColor = documentData.fc ? this.buildColor(documentData.fc) : 'rgba(0,0,0,0)';\n innerElemStyle.fill = textColor;\n innerElemStyle.color = textColor;\n\n if (documentData.sc) {\n innerElemStyle.stroke = this.buildColor(documentData.sc);\n innerElemStyle.strokeWidth = documentData.sw + 'px';\n }\n\n var fontData = this.globalData.fontManager.getFontByName(documentData.f);\n\n if (!this.globalData.fontManager.chars) {\n innerElemStyle.fontSize = documentData.finalSize + 'px';\n innerElemStyle.lineHeight = documentData.finalSize + 'px';\n\n if (fontData.fClass) {\n this.innerElem.className = fontData.fClass;\n } else {\n innerElemStyle.fontFamily = fontData.fFamily;\n var fWeight = documentData.fWeight;\n var fStyle = documentData.fStyle;\n innerElemStyle.fontStyle = fStyle;\n innerElemStyle.fontWeight = fWeight;\n }\n }\n\n var i;\n var len;\n var letters = documentData.l;\n len = letters.length;\n var tSpan;\n var tParent;\n var tCont;\n var matrixHelper = this.mHelper;\n var shapes;\n var shapeStr = '';\n var cnt = 0;\n\n for (i = 0; i < len; i += 1) {\n if (this.globalData.fontManager.chars) {\n if (!this.textPaths[cnt]) {\n tSpan = createNS('path');\n tSpan.setAttribute('stroke-linecap', lineCapEnum[1]);\n tSpan.setAttribute('stroke-linejoin', lineJoinEnum[2]);\n tSpan.setAttribute('stroke-miterlimit', '4');\n } else {\n tSpan = this.textPaths[cnt];\n }\n\n if (!this.isMasked) {\n if (this.textSpans[cnt]) {\n tParent = this.textSpans[cnt];\n tCont = tParent.children[0];\n } else {\n tParent = createTag('div');\n tParent.style.lineHeight = 0;\n tCont = createNS('svg');\n tCont.appendChild(tSpan);\n styleDiv(tParent);\n }\n }\n } else if (!this.isMasked) {\n if (this.textSpans[cnt]) {\n tParent = this.textSpans[cnt];\n tSpan = this.textPaths[cnt];\n } else {\n tParent = createTag('span');\n styleDiv(tParent);\n tSpan = createTag('span');\n styleDiv(tSpan);\n tParent.appendChild(tSpan);\n }\n } else {\n tSpan = this.textPaths[cnt] ? this.textPaths[cnt] : createNS('text');\n } // tSpan.setAttribute('visibility', 'hidden');\n\n\n if (this.globalData.fontManager.chars) {\n var charData = this.globalData.fontManager.getCharData(documentData.finalText[i], fontData.fStyle, this.globalData.fontManager.getFontByName(documentData.f).fFamily);\n var shapeData;\n\n if (charData) {\n shapeData = charData.data;\n } else {\n shapeData = null;\n }\n\n matrixHelper.reset();\n\n if (shapeData && shapeData.shapes && shapeData.shapes.length) {\n shapes = shapeData.shapes[0].it;\n matrixHelper.scale(documentData.finalSize / 100, documentData.finalSize / 100);\n shapeStr = this.createPathShape(matrixHelper, shapes);\n tSpan.setAttribute('d', shapeStr);\n }\n\n if (!this.isMasked) {\n this.innerElem.appendChild(tParent);\n\n if (shapeData && shapeData.shapes) {\n // document.body.appendChild is needed to get exact measure of shape\n document.body.appendChild(tCont);\n var boundingBox = tCont.getBBox();\n tCont.setAttribute('width', boundingBox.width + 2);\n tCont.setAttribute('height', boundingBox.height + 2);\n tCont.setAttribute('viewBox', boundingBox.x - 1 + ' ' + (boundingBox.y - 1) + ' ' + (boundingBox.width + 2) + ' ' + (boundingBox.height + 2));\n var tContStyle = tCont.style;\n var tContTranslation = 'translate(' + (boundingBox.x - 1) + 'px,' + (boundingBox.y - 1) + 'px)';\n tContStyle.transform = tContTranslation;\n tContStyle.webkitTransform = tContTranslation;\n letters[i].yOffset = boundingBox.y - 1;\n } else {\n tCont.setAttribute('width', 1);\n tCont.setAttribute('height', 1);\n }\n\n tParent.appendChild(tCont);\n } else {\n this.innerElem.appendChild(tSpan);\n }\n } else {\n tSpan.textContent = letters[i].val;\n tSpan.setAttributeNS('http://www.w3.org/XML/1998/namespace', 'xml:space', 'preserve');\n\n if (!this.isMasked) {\n this.innerElem.appendChild(tParent); //\n\n var tStyle = tSpan.style;\n var tSpanTranslation = 'translate3d(0,' + -documentData.finalSize / 1.2 + 'px,0)';\n tStyle.transform = tSpanTranslation;\n tStyle.webkitTransform = tSpanTranslation;\n } else {\n this.innerElem.appendChild(tSpan);\n }\n } //\n\n\n if (!this.isMasked) {\n this.textSpans[cnt] = tParent;\n } else {\n this.textSpans[cnt] = tSpan;\n }\n\n this.textSpans[cnt].style.display = 'block';\n this.textPaths[cnt] = tSpan;\n cnt += 1;\n }\n\n while (cnt < this.textSpans.length) {\n this.textSpans[cnt].style.display = 'none';\n cnt += 1;\n }\n };\n\n HTextElement.prototype.renderInnerContent = function () {\n this.validateText();\n var svgStyle;\n\n if (this.data.singleShape) {\n if (!this._isFirstFrame && !this.lettersChangedFlag) {\n return;\n }\n\n if (this.isMasked && this.finalTransform._matMdf) {\n // Todo Benchmark if using this is better than getBBox\n this.svgElement.setAttribute('viewBox', -this.finalTransform.mProp.p.v[0] + ' ' + -this.finalTransform.mProp.p.v[1] + ' ' + this.compW + ' ' + this.compH);\n svgStyle = this.svgElement.style;\n var translation = 'translate(' + -this.finalTransform.mProp.p.v[0] + 'px,' + -this.finalTransform.mProp.p.v[1] + 'px)';\n svgStyle.transform = translation;\n svgStyle.webkitTransform = translation;\n }\n }\n\n this.textAnimator.getMeasures(this.textProperty.currentData, this.lettersChangedFlag);\n\n if (!this.lettersChangedFlag && !this.textAnimator.lettersChangedFlag) {\n return;\n }\n\n var i;\n var len;\n var count = 0;\n var renderedLetters = this.textAnimator.renderedLetters;\n var letters = this.textProperty.currentData.l;\n len = letters.length;\n var renderedLetter;\n var textSpan;\n var textPath;\n\n for (i = 0; i < len; i += 1) {\n if (letters[i].n) {\n count += 1;\n } else {\n textSpan = this.textSpans[i];\n textPath = this.textPaths[i];\n renderedLetter = renderedLetters[count];\n count += 1;\n\n if (renderedLetter._mdf.m) {\n if (!this.isMasked) {\n textSpan.style.webkitTransform = renderedLetter.m;\n textSpan.style.transform = renderedLetter.m;\n } else {\n textSpan.setAttribute('transform', renderedLetter.m);\n }\n } /// /textSpan.setAttribute('opacity',renderedLetter.o);\n\n\n textSpan.style.opacity = renderedLetter.o;\n\n if (renderedLetter.sw && renderedLetter._mdf.sw) {\n textPath.setAttribute('stroke-width', renderedLetter.sw);\n }\n\n if (renderedLetter.sc && renderedLetter._mdf.sc) {\n textPath.setAttribute('stroke', renderedLetter.sc);\n }\n\n if (renderedLetter.fc && renderedLetter._mdf.fc) {\n textPath.setAttribute('fill', renderedLetter.fc);\n textPath.style.color = renderedLetter.fc;\n }\n }\n }\n\n if (this.innerElem.getBBox && !this.hidden && (this._isFirstFrame || this._mdf)) {\n var boundingBox = this.innerElem.getBBox();\n\n if (this.currentBBox.w !== boundingBox.width) {\n this.currentBBox.w = boundingBox.width;\n this.svgElement.setAttribute('width', boundingBox.width);\n }\n\n if (this.currentBBox.h !== boundingBox.height) {\n this.currentBBox.h = boundingBox.height;\n this.svgElement.setAttribute('height', boundingBox.height);\n }\n\n var margin = 1;\n\n if (this.currentBBox.w !== boundingBox.width + margin * 2 || this.currentBBox.h !== boundingBox.height + margin * 2 || this.currentBBox.x !== boundingBox.x - margin || this.currentBBox.y !== boundingBox.y - margin) {\n this.currentBBox.w = boundingBox.width + margin * 2;\n this.currentBBox.h = boundingBox.height + margin * 2;\n this.currentBBox.x = boundingBox.x - margin;\n this.currentBBox.y = boundingBox.y - margin;\n this.svgElement.setAttribute('viewBox', this.currentBBox.x + ' ' + this.currentBBox.y + ' ' + this.currentBBox.w + ' ' + this.currentBBox.h);\n svgStyle = this.svgElement.style;\n var svgTransform = 'translate(' + this.currentBBox.x + 'px,' + this.currentBBox.y + 'px)';\n svgStyle.transform = svgTransform;\n svgStyle.webkitTransform = svgTransform;\n }\n }\n };\n\n function HCameraElement(data, globalData, comp) {\n this.initFrame();\n this.initBaseData(data, globalData, comp);\n this.initHierarchy();\n var getProp = PropertyFactory.getProp;\n this.pe = getProp(this, data.pe, 0, 0, this);\n\n if (data.ks.p.s) {\n this.px = getProp(this, data.ks.p.x, 1, 0, this);\n this.py = getProp(this, data.ks.p.y, 1, 0, this);\n this.pz = getProp(this, data.ks.p.z, 1, 0, this);\n } else {\n this.p = getProp(this, data.ks.p, 1, 0, this);\n }\n\n if (data.ks.a) {\n this.a = getProp(this, data.ks.a, 1, 0, this);\n }\n\n if (data.ks.or.k.length && data.ks.or.k[0].to) {\n var i;\n var len = data.ks.or.k.length;\n\n for (i = 0; i < len; i += 1) {\n data.ks.or.k[i].to = null;\n data.ks.or.k[i].ti = null;\n }\n }\n\n this.or = getProp(this, data.ks.or, 1, degToRads, this);\n this.or.sh = true;\n this.rx = getProp(this, data.ks.rx, 0, degToRads, this);\n this.ry = getProp(this, data.ks.ry, 0, degToRads, this);\n this.rz = getProp(this, data.ks.rz, 0, degToRads, this);\n this.mat = new Matrix();\n this._prevMat = new Matrix();\n this._isFirstFrame = true; // TODO: find a better way to make the HCamera element to be compatible with the LayerInterface and TransformInterface.\n\n this.finalTransform = {\n mProp: this\n };\n }\n\n extendPrototype([BaseElement, FrameElement, HierarchyElement], HCameraElement);\n\n HCameraElement.prototype.setup = function () {\n var i;\n var len = this.comp.threeDElements.length;\n var comp;\n var perspectiveStyle;\n var containerStyle;\n\n for (i = 0; i < len; i += 1) {\n // [perspectiveElem,container]\n comp = this.comp.threeDElements[i];\n\n if (comp.type === '3d') {\n perspectiveStyle = comp.perspectiveElem.style;\n containerStyle = comp.container.style;\n var perspective = this.pe.v + 'px';\n var origin = '0px 0px 0px';\n var matrix = 'matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)';\n perspectiveStyle.perspective = perspective;\n perspectiveStyle.webkitPerspective = perspective;\n containerStyle.transformOrigin = origin;\n containerStyle.mozTransformOrigin = origin;\n containerStyle.webkitTransformOrigin = origin;\n perspectiveStyle.transform = matrix;\n perspectiveStyle.webkitTransform = matrix;\n }\n }\n };\n\n HCameraElement.prototype.createElements = function () {};\n\n HCameraElement.prototype.hide = function () {};\n\n HCameraElement.prototype.renderFrame = function () {\n var _mdf = this._isFirstFrame;\n var i;\n var len;\n\n if (this.hierarchy) {\n len = this.hierarchy.length;\n\n for (i = 0; i < len; i += 1) {\n _mdf = this.hierarchy[i].finalTransform.mProp._mdf || _mdf;\n }\n }\n\n if (_mdf || this.pe._mdf || this.p && this.p._mdf || this.px && (this.px._mdf || this.py._mdf || this.pz._mdf) || this.rx._mdf || this.ry._mdf || this.rz._mdf || this.or._mdf || this.a && this.a._mdf) {\n this.mat.reset();\n\n if (this.hierarchy) {\n len = this.hierarchy.length - 1;\n\n for (i = len; i >= 0; i -= 1) {\n var mTransf = this.hierarchy[i].finalTransform.mProp;\n this.mat.translate(-mTransf.p.v[0], -mTransf.p.v[1], mTransf.p.v[2]);\n this.mat.rotateX(-mTransf.or.v[0]).rotateY(-mTransf.or.v[1]).rotateZ(mTransf.or.v[2]);\n this.mat.rotateX(-mTransf.rx.v).rotateY(-mTransf.ry.v).rotateZ(mTransf.rz.v);\n this.mat.scale(1 / mTransf.s.v[0], 1 / mTransf.s.v[1], 1 / mTransf.s.v[2]);\n this.mat.translate(mTransf.a.v[0], mTransf.a.v[1], mTransf.a.v[2]);\n }\n }\n\n if (this.p) {\n this.mat.translate(-this.p.v[0], -this.p.v[1], this.p.v[2]);\n } else {\n this.mat.translate(-this.px.v, -this.py.v, this.pz.v);\n }\n\n if (this.a) {\n var diffVector;\n\n if (this.p) {\n diffVector = [this.p.v[0] - this.a.v[0], this.p.v[1] - this.a.v[1], this.p.v[2] - this.a.v[2]];\n } else {\n diffVector = [this.px.v - this.a.v[0], this.py.v - this.a.v[1], this.pz.v - this.a.v[2]];\n }\n\n var mag = Math.sqrt(Math.pow(diffVector[0], 2) + Math.pow(diffVector[1], 2) + Math.pow(diffVector[2], 2)); // var lookDir = getNormalizedPoint(getDiffVector(this.a.v,this.p.v));\n\n var lookDir = [diffVector[0] / mag, diffVector[1] / mag, diffVector[2] / mag];\n var lookLengthOnXZ = Math.sqrt(lookDir[2] * lookDir[2] + lookDir[0] * lookDir[0]);\n var mRotationX = Math.atan2(lookDir[1], lookLengthOnXZ);\n var mRotationY = Math.atan2(lookDir[0], -lookDir[2]);\n this.mat.rotateY(mRotationY).rotateX(-mRotationX);\n }\n\n this.mat.rotateX(-this.rx.v).rotateY(-this.ry.v).rotateZ(this.rz.v);\n this.mat.rotateX(-this.or.v[0]).rotateY(-this.or.v[1]).rotateZ(this.or.v[2]);\n this.mat.translate(this.globalData.compSize.w / 2, this.globalData.compSize.h / 2, 0);\n this.mat.translate(0, 0, this.pe.v);\n var hasMatrixChanged = !this._prevMat.equals(this.mat);\n\n if ((hasMatrixChanged || this.pe._mdf) && this.comp.threeDElements) {\n len = this.comp.threeDElements.length;\n var comp;\n var perspectiveStyle;\n var containerStyle;\n\n for (i = 0; i < len; i += 1) {\n comp = this.comp.threeDElements[i];\n\n if (comp.type === '3d') {\n if (hasMatrixChanged) {\n var matValue = this.mat.toCSS();\n containerStyle = comp.container.style;\n containerStyle.transform = matValue;\n containerStyle.webkitTransform = matValue;\n }\n\n if (this.pe._mdf) {\n perspectiveStyle = comp.perspectiveElem.style;\n perspectiveStyle.perspective = this.pe.v + 'px';\n perspectiveStyle.webkitPerspective = this.pe.v + 'px';\n }\n }\n }\n\n this.mat.clone(this._prevMat);\n }\n }\n\n this._isFirstFrame = false;\n };\n\n HCameraElement.prototype.prepareFrame = function (num) {\n this.prepareProperties(num, true);\n };\n\n HCameraElement.prototype.destroy = function () {};\n\n HCameraElement.prototype.getBaseElement = function () {\n return null;\n };\n\n function HImageElement(data, globalData, comp) {\n this.assetData = globalData.getAssetData(data.refId);\n this.initElement(data, globalData, comp);\n }\n\n extendPrototype([BaseElement, TransformElement, HBaseElement, HSolidElement, HierarchyElement, FrameElement, RenderableElement], HImageElement);\n\n HImageElement.prototype.createContent = function () {\n var assetPath = this.globalData.getAssetsPath(this.assetData);\n var img = new Image();\n\n if (this.data.hasMask) {\n this.imageElem = createNS('image');\n this.imageElem.setAttribute('width', this.assetData.w + 'px');\n this.imageElem.setAttribute('height', this.assetData.h + 'px');\n this.imageElem.setAttributeNS('http://www.w3.org/1999/xlink', 'href', assetPath);\n this.layerElement.appendChild(this.imageElem);\n this.baseElement.setAttribute('width', this.assetData.w);\n this.baseElement.setAttribute('height', this.assetData.h);\n } else {\n this.layerElement.appendChild(img);\n }\n\n img.crossOrigin = 'anonymous';\n img.src = assetPath;\n\n if (this.data.ln) {\n this.baseElement.setAttribute('id', this.data.ln);\n }\n };\n\n function HybridRendererBase(animationItem, config) {\n this.animationItem = animationItem;\n this.layers = null;\n this.renderedFrame = -1;\n this.renderConfig = {\n className: config && config.className || '',\n imagePreserveAspectRatio: config && config.imagePreserveAspectRatio || 'xMidYMid slice',\n hideOnTransparent: !(config && config.hideOnTransparent === false),\n filterSize: {\n width: config && config.filterSize && config.filterSize.width || '400%',\n height: config && config.filterSize && config.filterSize.height || '400%',\n x: config && config.filterSize && config.filterSize.x || '-100%',\n y: config && config.filterSize && config.filterSize.y || '-100%'\n }\n };\n this.globalData = {\n _mdf: false,\n frameNum: -1,\n renderConfig: this.renderConfig\n };\n this.pendingElements = [];\n this.elements = [];\n this.threeDElements = [];\n this.destroyed = false;\n this.camera = null;\n this.supports3d = true;\n this.rendererType = 'html';\n }\n\n extendPrototype([BaseRenderer], HybridRendererBase);\n HybridRendererBase.prototype.buildItem = SVGRenderer.prototype.buildItem;\n\n HybridRendererBase.prototype.checkPendingElements = function () {\n while (this.pendingElements.length) {\n var element = this.pendingElements.pop();\n element.checkParenting();\n }\n };\n\n HybridRendererBase.prototype.appendElementInPos = function (element, pos) {\n var newDOMElement = element.getBaseElement();\n\n if (!newDOMElement) {\n return;\n }\n\n var layer = this.layers[pos];\n\n if (!layer.ddd || !this.supports3d) {\n if (this.threeDElements) {\n this.addTo3dContainer(newDOMElement, pos);\n } else {\n var i = 0;\n var nextDOMElement;\n var nextLayer;\n var tmpDOMElement;\n\n while (i < pos) {\n if (this.elements[i] && this.elements[i] !== true && this.elements[i].getBaseElement) {\n nextLayer = this.elements[i];\n tmpDOMElement = this.layers[i].ddd ? this.getThreeDContainerByPos(i) : nextLayer.getBaseElement();\n nextDOMElement = tmpDOMElement || nextDOMElement;\n }\n\n i += 1;\n }\n\n if (nextDOMElement) {\n if (!layer.ddd || !this.supports3d) {\n this.layerElement.insertBefore(newDOMElement, nextDOMElement);\n }\n } else if (!layer.ddd || !this.supports3d) {\n this.layerElement.appendChild(newDOMElement);\n }\n }\n } else {\n this.addTo3dContainer(newDOMElement, pos);\n }\n };\n\n HybridRendererBase.prototype.createShape = function (data) {\n if (!this.supports3d) {\n return new SVGShapeElement(data, this.globalData, this);\n }\n\n return new HShapeElement(data, this.globalData, this);\n };\n\n HybridRendererBase.prototype.createText = function (data) {\n if (!this.supports3d) {\n return new SVGTextLottieElement(data, this.globalData, this);\n }\n\n return new HTextElement(data, this.globalData, this);\n };\n\n HybridRendererBase.prototype.createCamera = function (data) {\n this.camera = new HCameraElement(data, this.globalData, this);\n return this.camera;\n };\n\n HybridRendererBase.prototype.createImage = function (data) {\n if (!this.supports3d) {\n return new IImageElement(data, this.globalData, this);\n }\n\n return new HImageElement(data, this.globalData, this);\n };\n\n HybridRendererBase.prototype.createSolid = function (data) {\n if (!this.supports3d) {\n return new ISolidElement(data, this.globalData, this);\n }\n\n return new HSolidElement(data, this.globalData, this);\n };\n\n HybridRendererBase.prototype.createNull = SVGRenderer.prototype.createNull;\n\n HybridRendererBase.prototype.getThreeDContainerByPos = function (pos) {\n var i = 0;\n var len = this.threeDElements.length;\n\n while (i < len) {\n if (this.threeDElements[i].startPos <= pos && this.threeDElements[i].endPos >= pos) {\n return this.threeDElements[i].perspectiveElem;\n }\n\n i += 1;\n }\n\n return null;\n };\n\n HybridRendererBase.prototype.createThreeDContainer = function (pos, type) {\n var perspectiveElem = createTag('div');\n var style;\n var containerStyle;\n styleDiv(perspectiveElem);\n var container = createTag('div');\n styleDiv(container);\n\n if (type === '3d') {\n style = perspectiveElem.style;\n style.width = this.globalData.compSize.w + 'px';\n style.height = this.globalData.compSize.h + 'px';\n var center = '50% 50%';\n style.webkitTransformOrigin = center;\n style.mozTransformOrigin = center;\n style.transformOrigin = center;\n containerStyle = container.style;\n var matrix = 'matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)';\n containerStyle.transform = matrix;\n containerStyle.webkitTransform = matrix;\n }\n\n perspectiveElem.appendChild(container); // this.resizerElem.appendChild(perspectiveElem);\n\n var threeDContainerData = {\n container: container,\n perspectiveElem: perspectiveElem,\n startPos: pos,\n endPos: pos,\n type: type\n };\n this.threeDElements.push(threeDContainerData);\n return threeDContainerData;\n };\n\n HybridRendererBase.prototype.build3dContainers = function () {\n var i;\n var len = this.layers.length;\n var lastThreeDContainerData;\n var currentContainer = '';\n\n for (i = 0; i < len; i += 1) {\n if (this.layers[i].ddd && this.layers[i].ty !== 3) {\n if (currentContainer !== '3d') {\n currentContainer = '3d';\n lastThreeDContainerData = this.createThreeDContainer(i, '3d');\n }\n\n lastThreeDContainerData.endPos = Math.max(lastThreeDContainerData.endPos, i);\n } else {\n if (currentContainer !== '2d') {\n currentContainer = '2d';\n lastThreeDContainerData = this.createThreeDContainer(i, '2d');\n }\n\n lastThreeDContainerData.endPos = Math.max(lastThreeDContainerData.endPos, i);\n }\n }\n\n len = this.threeDElements.length;\n\n for (i = len - 1; i >= 0; i -= 1) {\n this.resizerElem.appendChild(this.threeDElements[i].perspectiveElem);\n }\n };\n\n HybridRendererBase.prototype.addTo3dContainer = function (elem, pos) {\n var i = 0;\n var len = this.threeDElements.length;\n\n while (i < len) {\n if (pos <= this.threeDElements[i].endPos) {\n var j = this.threeDElements[i].startPos;\n var nextElement;\n\n while (j < pos) {\n if (this.elements[j] && this.elements[j].getBaseElement) {\n nextElement = this.elements[j].getBaseElement();\n }\n\n j += 1;\n }\n\n if (nextElement) {\n this.threeDElements[i].container.insertBefore(elem, nextElement);\n } else {\n this.threeDElements[i].container.appendChild(elem);\n }\n\n break;\n }\n\n i += 1;\n }\n };\n\n HybridRendererBase.prototype.configAnimation = function (animData) {\n var resizerElem = createTag('div');\n var wrapper = this.animationItem.wrapper;\n var style = resizerElem.style;\n style.width = animData.w + 'px';\n style.height = animData.h + 'px';\n this.resizerElem = resizerElem;\n styleDiv(resizerElem);\n style.transformStyle = 'flat';\n style.mozTransformStyle = 'flat';\n style.webkitTransformStyle = 'flat';\n\n if (this.renderConfig.className) {\n resizerElem.setAttribute('class', this.renderConfig.className);\n }\n\n wrapper.appendChild(resizerElem);\n style.overflow = 'hidden';\n var svg = createNS('svg');\n svg.setAttribute('width', '1');\n svg.setAttribute('height', '1');\n styleDiv(svg);\n this.resizerElem.appendChild(svg);\n var defs = createNS('defs');\n svg.appendChild(defs);\n this.data = animData; // Mask animation\n\n this.setupGlobalData(animData, svg);\n this.globalData.defs = defs;\n this.layers = animData.layers;\n this.layerElement = this.resizerElem;\n this.build3dContainers();\n this.updateContainerSize();\n };\n\n HybridRendererBase.prototype.destroy = function () {\n if (this.animationItem.wrapper) {\n this.animationItem.wrapper.innerText = '';\n }\n\n this.animationItem.container = null;\n this.globalData.defs = null;\n var i;\n var len = this.layers ? this.layers.length : 0;\n\n for (i = 0; i < len; i += 1) {\n if (this.elements[i] && this.elements[i].destroy) {\n this.elements[i].destroy();\n }\n }\n\n this.elements.length = 0;\n this.destroyed = true;\n this.animationItem = null;\n };\n\n HybridRendererBase.prototype.updateContainerSize = function () {\n var elementWidth = this.animationItem.wrapper.offsetWidth;\n var elementHeight = this.animationItem.wrapper.offsetHeight;\n var elementRel = elementWidth / elementHeight;\n var animationRel = this.globalData.compSize.w / this.globalData.compSize.h;\n var sx;\n var sy;\n var tx;\n var ty;\n\n if (animationRel > elementRel) {\n sx = elementWidth / this.globalData.compSize.w;\n sy = elementWidth / this.globalData.compSize.w;\n tx = 0;\n ty = (elementHeight - this.globalData.compSize.h * (elementWidth / this.globalData.compSize.w)) / 2;\n } else {\n sx = elementHeight / this.globalData.compSize.h;\n sy = elementHeight / this.globalData.compSize.h;\n tx = (elementWidth - this.globalData.compSize.w * (elementHeight / this.globalData.compSize.h)) / 2;\n ty = 0;\n }\n\n var style = this.resizerElem.style;\n style.webkitTransform = 'matrix3d(' + sx + ',0,0,0,0,' + sy + ',0,0,0,0,1,0,' + tx + ',' + ty + ',0,1)';\n style.transform = style.webkitTransform;\n };\n\n HybridRendererBase.prototype.renderFrame = SVGRenderer.prototype.renderFrame;\n\n HybridRendererBase.prototype.hide = function () {\n this.resizerElem.style.display = 'none';\n };\n\n HybridRendererBase.prototype.show = function () {\n this.resizerElem.style.display = 'block';\n };\n\n HybridRendererBase.prototype.initItems = function () {\n this.buildAllItems();\n\n if (this.camera) {\n this.camera.setup();\n } else {\n var cWidth = this.globalData.compSize.w;\n var cHeight = this.globalData.compSize.h;\n var i;\n var len = this.threeDElements.length;\n\n for (i = 0; i < len; i += 1) {\n var style = this.threeDElements[i].perspectiveElem.style;\n style.webkitPerspective = Math.sqrt(Math.pow(cWidth, 2) + Math.pow(cHeight, 2)) + 'px';\n style.perspective = style.webkitPerspective;\n }\n }\n };\n\n HybridRendererBase.prototype.searchExtraCompositions = function (assets) {\n var i;\n var len = assets.length;\n var floatingContainer = createTag('div');\n\n for (i = 0; i < len; i += 1) {\n if (assets[i].xt) {\n var comp = this.createComp(assets[i], floatingContainer, this.globalData.comp, null);\n comp.initExpressions();\n this.globalData.projectInterface.registerComposition(comp);\n }\n }\n };\n\n function HCompElement(data, globalData, comp) {\n this.layers = data.layers;\n this.supports3d = !data.hasMask;\n this.completeLayers = false;\n this.pendingElements = [];\n this.elements = this.layers ? createSizedArray(this.layers.length) : [];\n this.initElement(data, globalData, comp);\n this.tm = data.tm ? PropertyFactory.getProp(this, data.tm, 0, globalData.frameRate, this) : {\n _placeholder: true\n };\n }\n\n extendPrototype([HybridRendererBase, ICompElement, HBaseElement], HCompElement);\n HCompElement.prototype._createBaseContainerElements = HCompElement.prototype.createContainerElements;\n\n HCompElement.prototype.createContainerElements = function () {\n this._createBaseContainerElements(); // divElement.style.clip = 'rect(0px, '+this.data.w+'px, '+this.data.h+'px, 0px)';\n\n\n if (this.data.hasMask) {\n this.svgElement.setAttribute('width', this.data.w);\n this.svgElement.setAttribute('height', this.data.h);\n this.transformedElement = this.baseElement;\n } else {\n this.transformedElement = this.layerElement;\n }\n };\n\n HCompElement.prototype.addTo3dContainer = function (elem, pos) {\n var j = 0;\n var nextElement;\n\n while (j < pos) {\n if (this.elements[j] && this.elements[j].getBaseElement) {\n nextElement = this.elements[j].getBaseElement();\n }\n\n j += 1;\n }\n\n if (nextElement) {\n this.layerElement.insertBefore(elem, nextElement);\n } else {\n this.layerElement.appendChild(elem);\n }\n };\n\n HCompElement.prototype.createComp = function (data) {\n if (!this.supports3d) {\n return new SVGCompElement(data, this.globalData, this);\n }\n\n return new HCompElement(data, this.globalData, this);\n };\n\n function HybridRenderer(animationItem, config) {\n this.animationItem = animationItem;\n this.layers = null;\n this.renderedFrame = -1;\n this.renderConfig = {\n className: config && config.className || '',\n imagePreserveAspectRatio: config && config.imagePreserveAspectRatio || 'xMidYMid slice',\n hideOnTransparent: !(config && config.hideOnTransparent === false),\n filterSize: {\n width: config && config.filterSize && config.filterSize.width || '400%',\n height: config && config.filterSize && config.filterSize.height || '400%',\n x: config && config.filterSize && config.filterSize.x || '-100%',\n y: config && config.filterSize && config.filterSize.y || '-100%'\n },\n runExpressions: !config || config.runExpressions === undefined || config.runExpressions\n };\n this.globalData = {\n _mdf: false,\n frameNum: -1,\n renderConfig: this.renderConfig\n };\n this.pendingElements = [];\n this.elements = [];\n this.threeDElements = [];\n this.destroyed = false;\n this.camera = null;\n this.supports3d = true;\n this.rendererType = 'html';\n }\n\n extendPrototype([HybridRendererBase], HybridRenderer);\n\n HybridRenderer.prototype.createComp = function (data) {\n if (!this.supports3d) {\n return new SVGCompElement(data, this.globalData, this);\n }\n\n return new HCompElement(data, this.globalData, this);\n };\n\n var CompExpressionInterface = function () {\n return function (comp) {\n function _thisLayerFunction(name) {\n var i = 0;\n var len = comp.layers.length;\n\n while (i < len) {\n if (comp.layers[i].nm === name || comp.layers[i].ind === name) {\n return comp.elements[i].layerInterface;\n }\n\n i += 1;\n }\n\n return null; // return {active:false};\n }\n\n Object.defineProperty(_thisLayerFunction, '_name', {\n value: comp.data.nm\n });\n _thisLayerFunction.layer = _thisLayerFunction;\n _thisLayerFunction.pixelAspect = 1;\n _thisLayerFunction.height = comp.data.h || comp.globalData.compSize.h;\n _thisLayerFunction.width = comp.data.w || comp.globalData.compSize.w;\n _thisLayerFunction.pixelAspect = 1;\n _thisLayerFunction.frameDuration = 1 / comp.globalData.frameRate;\n _thisLayerFunction.displayStartTime = 0;\n _thisLayerFunction.numLayers = comp.layers.length;\n return _thisLayerFunction;\n };\n }();\n\n function _typeof$2(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof$2 = function _typeof(obj) { return typeof obj; }; } else { _typeof$2 = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof$2(obj); }\n\n /* eslint-disable */\n\n /*\r\n Copyright 2014 David Bau.\r\n\r\n Permission is hereby granted, free of charge, to any person obtaining\r\n a copy of this software and associated documentation files (the\r\n \"Software\"), to deal in the Software without restriction, including\r\n without limitation the rights to use, copy, modify, merge, publish,\r\n distribute, sublicense, and/or sell copies of the Software, and to\r\n permit persons to whom the Software is furnished to do so, subject to\r\n the following conditions:\r\n\r\n The above copyright notice and this permission notice shall be\r\n included in all copies or substantial portions of the Software.\r\n\r\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\r\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r\n MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\r\n IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\r\n CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\r\n TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\r\n SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n\r\n */\n function seedRandom(pool, math) {\n //\n // The following constants are related to IEEE 754 limits.\n //\n var global = this,\n width = 256,\n // each RC4 output is 0 <= x < 256\n chunks = 6,\n // at least six RC4 outputs for each double\n digits = 52,\n // there are 52 significant digits in a double\n rngname = 'random',\n // rngname: name for Math.random and Math.seedrandom\n startdenom = math.pow(width, chunks),\n significance = math.pow(2, digits),\n overflow = significance * 2,\n mask = width - 1,\n nodecrypto; // node.js crypto module, initialized at the bottom.\n //\n // seedrandom()\n // This is the seedrandom function described above.\n //\n\n function seedrandom(seed, options, callback) {\n var key = [];\n options = options === true ? {\n entropy: true\n } : options || {}; // Flatten the seed string or build one from local entropy if needed.\n\n var shortseed = mixkey(flatten(options.entropy ? [seed, tostring(pool)] : seed === null ? autoseed() : seed, 3), key); // Use the seed to initialize an ARC4 generator.\n\n var arc4 = new ARC4(key); // This function returns a random double in [0, 1) that contains\n // randomness in every bit of the mantissa of the IEEE 754 value.\n\n var prng = function prng() {\n var n = arc4.g(chunks),\n // Start with a numerator n < 2 ^ 48\n d = startdenom,\n // and denominator d = 2 ^ 48.\n x = 0; // and no 'extra last byte'.\n\n while (n < significance) {\n // Fill up all significant digits by\n n = (n + x) * width; // shifting numerator and\n\n d *= width; // denominator and generating a\n\n x = arc4.g(1); // new least-significant-byte.\n }\n\n while (n >= overflow) {\n // To avoid rounding up, before adding\n n /= 2; // last byte, shift everything\n\n d /= 2; // right using integer math until\n\n x >>>= 1; // we have exactly the desired bits.\n }\n\n return (n + x) / d; // Form the number within [0, 1).\n };\n\n prng.int32 = function () {\n return arc4.g(4) | 0;\n };\n\n prng.quick = function () {\n return arc4.g(4) / 0x100000000;\n };\n\n prng[\"double\"] = prng; // Mix the randomness into accumulated entropy.\n\n mixkey(tostring(arc4.S), pool); // Calling convention: what to return as a function of prng, seed, is_math.\n\n return (options.pass || callback || function (prng, seed, is_math_call, state) {\n if (state) {\n // Load the arc4 state from the given state if it has an S array.\n if (state.S) {\n copy(state, arc4);\n } // Only provide the .state method if requested via options.state.\n\n\n prng.state = function () {\n return copy(arc4, {});\n };\n } // If called as a method of Math (Math.seedrandom()), mutate\n // Math.random because that is how seedrandom.js has worked since v1.0.\n\n\n if (is_math_call) {\n math[rngname] = prng;\n return seed;\n } // Otherwise, it is a newer calling convention, so return the\n // prng directly.\n else return prng;\n })(prng, shortseed, 'global' in options ? options.global : this == math, options.state);\n }\n\n math['seed' + rngname] = seedrandom; //\n // ARC4\n //\n // An ARC4 implementation. The constructor takes a key in the form of\n // an array of at most (width) integers that should be 0 <= x < (width).\n //\n // The g(count) method returns a pseudorandom integer that concatenates\n // the next (count) outputs from ARC4. Its return value is a number x\n // that is in the range 0 <= x < (width ^ count).\n //\n\n function ARC4(key) {\n var t,\n keylen = key.length,\n me = this,\n i = 0,\n j = me.i = me.j = 0,\n s = me.S = []; // The empty key [] is treated as [0].\n\n if (!keylen) {\n key = [keylen++];\n } // Set up S using the standard key scheduling algorithm.\n\n\n while (i < width) {\n s[i] = i++;\n }\n\n for (i = 0; i < width; i++) {\n s[i] = s[j = mask & j + key[i % keylen] + (t = s[i])];\n s[j] = t;\n } // The \"g\" method returns the next (count) outputs as one number.\n\n\n me.g = function (count) {\n // Using instance members instead of closure state nearly doubles speed.\n var t,\n r = 0,\n i = me.i,\n j = me.j,\n s = me.S;\n\n while (count--) {\n t = s[i = mask & i + 1];\n r = r * width + s[mask & (s[i] = s[j = mask & j + t]) + (s[j] = t)];\n }\n\n me.i = i;\n me.j = j;\n return r; // For robust unpredictability, the function call below automatically\n // discards an initial batch of values. This is called RC4-drop[256].\n // See http://google.com/search?q=rsa+fluhrer+response&btnI\n };\n } //\n // copy()\n // Copies internal state of ARC4 to or from a plain object.\n //\n\n\n function copy(f, t) {\n t.i = f.i;\n t.j = f.j;\n t.S = f.S.slice();\n return t;\n } //\n // flatten()\n // Converts an object tree to nested arrays of strings.\n //\n\n\n function flatten(obj, depth) {\n var result = [],\n typ = _typeof$2(obj),\n prop;\n\n if (depth && typ == 'object') {\n for (prop in obj) {\n try {\n result.push(flatten(obj[prop], depth - 1));\n } catch (e) {}\n }\n }\n\n return result.length ? result : typ == 'string' ? obj : obj + '\\0';\n } //\n // mixkey()\n // Mixes a string seed into a key that is an array of integers, and\n // returns a shortened string seed that is equivalent to the result key.\n //\n\n\n function mixkey(seed, key) {\n var stringseed = seed + '',\n smear,\n j = 0;\n\n while (j < stringseed.length) {\n key[mask & j] = mask & (smear ^= key[mask & j] * 19) + stringseed.charCodeAt(j++);\n }\n\n return tostring(key);\n } //\n // autoseed()\n // Returns an object for autoseeding, using window.crypto and Node crypto\n // module if available.\n //\n\n\n function autoseed() {\n try {\n if (nodecrypto) {\n return tostring(nodecrypto.randomBytes(width));\n }\n\n var out = new Uint8Array(width);\n (global.crypto || global.msCrypto).getRandomValues(out);\n return tostring(out);\n } catch (e) {\n var browser = global.navigator,\n plugins = browser && browser.plugins;\n return [+new Date(), global, plugins, global.screen, tostring(pool)];\n }\n } //\n // tostring()\n // Converts an array of charcodes to a string\n //\n\n\n function tostring(a) {\n return String.fromCharCode.apply(0, a);\n } //\n // When seedrandom.js is loaded, we immediately mix a few bits\n // from the built-in RNG into the entropy pool. Because we do\n // not want to interfere with deterministic PRNG state later,\n // seedrandom will not call math.random on its own again after\n // initialization.\n //\n\n\n mixkey(math.random(), pool); //\n // Nodejs and AMD support: export the implementation as a module using\n // either convention.\n //\n // End anonymous scope, and pass initial values.\n }\n\n ;\n\n function initialize$2(BMMath) {\n seedRandom([], BMMath);\n }\n\n var propTypes = {\n SHAPE: 'shape'\n };\n\n function _typeof$1(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof$1 = function _typeof(obj) { return typeof obj; }; } else { _typeof$1 = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof$1(obj); }\n\n var ExpressionManager = function () {\n 'use strict';\n\n var ob = {};\n var Math = BMMath;\n var window = null;\n var document = null;\n var XMLHttpRequest = null;\n var fetch = null;\n var frames = null;\n var _lottieGlobal = {};\n initialize$2(BMMath);\n\n function resetFrame() {\n _lottieGlobal = {};\n }\n\n function $bm_isInstanceOfArray(arr) {\n return arr.constructor === Array || arr.constructor === Float32Array;\n }\n\n function isNumerable(tOfV, v) {\n return tOfV === 'number' || v instanceof Number || tOfV === 'boolean' || tOfV === 'string';\n }\n\n function $bm_neg(a) {\n var tOfA = _typeof$1(a);\n\n if (tOfA === 'number' || a instanceof Number || tOfA === 'boolean') {\n return -a;\n }\n\n if ($bm_isInstanceOfArray(a)) {\n var i;\n var lenA = a.length;\n var retArr = [];\n\n for (i = 0; i < lenA; i += 1) {\n retArr[i] = -a[i];\n }\n\n return retArr;\n }\n\n if (a.propType) {\n return a.v;\n }\n\n return -a;\n }\n\n var easeInBez = BezierFactory.getBezierEasing(0.333, 0, 0.833, 0.833, 'easeIn').get;\n var easeOutBez = BezierFactory.getBezierEasing(0.167, 0.167, 0.667, 1, 'easeOut').get;\n var easeInOutBez = BezierFactory.getBezierEasing(0.33, 0, 0.667, 1, 'easeInOut').get;\n\n function sum(a, b) {\n var tOfA = _typeof$1(a);\n\n var tOfB = _typeof$1(b);\n\n if (isNumerable(tOfA, a) && isNumerable(tOfB, b) || tOfA === 'string' || tOfB === 'string') {\n return a + b;\n }\n\n if ($bm_isInstanceOfArray(a) && isNumerable(tOfB, b)) {\n a = a.slice(0);\n a[0] += b;\n return a;\n }\n\n if (isNumerable(tOfA, a) && $bm_isInstanceOfArray(b)) {\n b = b.slice(0);\n b[0] = a + b[0];\n return b;\n }\n\n if ($bm_isInstanceOfArray(a) && $bm_isInstanceOfArray(b)) {\n var i = 0;\n var lenA = a.length;\n var lenB = b.length;\n var retArr = [];\n\n while (i < lenA || i < lenB) {\n if ((typeof a[i] === 'number' || a[i] instanceof Number) && (typeof b[i] === 'number' || b[i] instanceof Number)) {\n retArr[i] = a[i] + b[i];\n } else {\n retArr[i] = b[i] === undefined ? a[i] : a[i] || b[i];\n }\n\n i += 1;\n }\n\n return retArr;\n }\n\n return 0;\n }\n\n var add = sum;\n\n function sub(a, b) {\n var tOfA = _typeof$1(a);\n\n var tOfB = _typeof$1(b);\n\n if (isNumerable(tOfA, a) && isNumerable(tOfB, b)) {\n if (tOfA === 'string') {\n a = parseInt(a, 10);\n }\n\n if (tOfB === 'string') {\n b = parseInt(b, 10);\n }\n\n return a - b;\n }\n\n if ($bm_isInstanceOfArray(a) && isNumerable(tOfB, b)) {\n a = a.slice(0);\n a[0] -= b;\n return a;\n }\n\n if (isNumerable(tOfA, a) && $bm_isInstanceOfArray(b)) {\n b = b.slice(0);\n b[0] = a - b[0];\n return b;\n }\n\n if ($bm_isInstanceOfArray(a) && $bm_isInstanceOfArray(b)) {\n var i = 0;\n var lenA = a.length;\n var lenB = b.length;\n var retArr = [];\n\n while (i < lenA || i < lenB) {\n if ((typeof a[i] === 'number' || a[i] instanceof Number) && (typeof b[i] === 'number' || b[i] instanceof Number)) {\n retArr[i] = a[i] - b[i];\n } else {\n retArr[i] = b[i] === undefined ? a[i] : a[i] || b[i];\n }\n\n i += 1;\n }\n\n return retArr;\n }\n\n return 0;\n }\n\n function mul(a, b) {\n var tOfA = _typeof$1(a);\n\n var tOfB = _typeof$1(b);\n\n var arr;\n\n if (isNumerable(tOfA, a) && isNumerable(tOfB, b)) {\n return a * b;\n }\n\n var i;\n var len;\n\n if ($bm_isInstanceOfArray(a) && isNumerable(tOfB, b)) {\n len = a.length;\n arr = createTypedArray('float32', len);\n\n for (i = 0; i < len; i += 1) {\n arr[i] = a[i] * b;\n }\n\n return arr;\n }\n\n if (isNumerable(tOfA, a) && $bm_isInstanceOfArray(b)) {\n len = b.length;\n arr = createTypedArray('float32', len);\n\n for (i = 0; i < len; i += 1) {\n arr[i] = a * b[i];\n }\n\n return arr;\n }\n\n return 0;\n }\n\n function div(a, b) {\n var tOfA = _typeof$1(a);\n\n var tOfB = _typeof$1(b);\n\n var arr;\n\n if (isNumerable(tOfA, a) && isNumerable(tOfB, b)) {\n return a / b;\n }\n\n var i;\n var len;\n\n if ($bm_isInstanceOfArray(a) && isNumerable(tOfB, b)) {\n len = a.length;\n arr = createTypedArray('float32', len);\n\n for (i = 0; i < len; i += 1) {\n arr[i] = a[i] / b;\n }\n\n return arr;\n }\n\n if (isNumerable(tOfA, a) && $bm_isInstanceOfArray(b)) {\n len = b.length;\n arr = createTypedArray('float32', len);\n\n for (i = 0; i < len; i += 1) {\n arr[i] = a / b[i];\n }\n\n return arr;\n }\n\n return 0;\n }\n\n function mod(a, b) {\n if (typeof a === 'string') {\n a = parseInt(a, 10);\n }\n\n if (typeof b === 'string') {\n b = parseInt(b, 10);\n }\n\n return a % b;\n }\n\n var $bm_sum = sum;\n var $bm_sub = sub;\n var $bm_mul = mul;\n var $bm_div = div;\n var $bm_mod = mod;\n\n function clamp(num, min, max) {\n if (min > max) {\n var mm = max;\n max = min;\n min = mm;\n }\n\n return Math.min(Math.max(num, min), max);\n }\n\n function radiansToDegrees(val) {\n return val / degToRads;\n }\n\n var radians_to_degrees = radiansToDegrees;\n\n function degreesToRadians(val) {\n return val * degToRads;\n }\n\n var degrees_to_radians = radiansToDegrees;\n var helperLengthArray = [0, 0, 0, 0, 0, 0];\n\n function length(arr1, arr2) {\n if (typeof arr1 === 'number' || arr1 instanceof Number) {\n arr2 = arr2 || 0;\n return Math.abs(arr1 - arr2);\n }\n\n if (!arr2) {\n arr2 = helperLengthArray;\n }\n\n var i;\n var len = Math.min(arr1.length, arr2.length);\n var addedLength = 0;\n\n for (i = 0; i < len; i += 1) {\n addedLength += Math.pow(arr2[i] - arr1[i], 2);\n }\n\n return Math.sqrt(addedLength);\n }\n\n function normalize(vec) {\n return div(vec, length(vec));\n }\n\n function rgbToHsl(val) {\n var r = val[0];\n var g = val[1];\n var b = val[2];\n var max = Math.max(r, g, b);\n var min = Math.min(r, g, b);\n var h;\n var s;\n var l = (max + min) / 2;\n\n if (max === min) {\n h = 0; // achromatic\n\n s = 0; // achromatic\n } else {\n var d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n\n case g:\n h = (b - r) / d + 2;\n break;\n\n case b:\n h = (r - g) / d + 4;\n break;\n\n default:\n break;\n }\n\n h /= 6;\n }\n\n return [h, s, l, val[3]];\n }\n\n function hue2rgb(p, q, t) {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n }\n\n function hslToRgb(val) {\n var h = val[0];\n var s = val[1];\n var l = val[2];\n var r;\n var g;\n var b;\n\n if (s === 0) {\n r = l; // achromatic\n\n b = l; // achromatic\n\n g = l; // achromatic\n } else {\n var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n var p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n\n return [r, g, b, val[3]];\n }\n\n function linear(t, tMin, tMax, value1, value2) {\n if (value1 === undefined || value2 === undefined) {\n value1 = tMin;\n value2 = tMax;\n tMin = 0;\n tMax = 1;\n }\n\n if (tMax < tMin) {\n var _tMin = tMax;\n tMax = tMin;\n tMin = _tMin;\n }\n\n if (t <= tMin) {\n return value1;\n }\n\n if (t >= tMax) {\n return value2;\n }\n\n var perc = tMax === tMin ? 0 : (t - tMin) / (tMax - tMin);\n\n if (!value1.length) {\n return value1 + (value2 - value1) * perc;\n }\n\n var i;\n var len = value1.length;\n var arr = createTypedArray('float32', len);\n\n for (i = 0; i < len; i += 1) {\n arr[i] = value1[i] + (value2[i] - value1[i]) * perc;\n }\n\n return arr;\n }\n\n function random(min, max) {\n if (max === undefined) {\n if (min === undefined) {\n min = 0;\n max = 1;\n } else {\n max = min;\n min = undefined;\n }\n }\n\n if (max.length) {\n var i;\n var len = max.length;\n\n if (!min) {\n min = createTypedArray('float32', len);\n }\n\n var arr = createTypedArray('float32', len);\n var rnd = BMMath.random();\n\n for (i = 0; i < len; i += 1) {\n arr[i] = min[i] + rnd * (max[i] - min[i]);\n }\n\n return arr;\n }\n\n if (min === undefined) {\n min = 0;\n }\n\n var rndm = BMMath.random();\n return min + rndm * (max - min);\n }\n\n function createPath(points, inTangents, outTangents, closed) {\n var i;\n var len = points.length;\n var path = shapePool.newElement();\n path.setPathData(!!closed, len);\n var arrPlaceholder = [0, 0];\n var inVertexPoint;\n var outVertexPoint;\n\n for (i = 0; i < len; i += 1) {\n inVertexPoint = inTangents && inTangents[i] ? inTangents[i] : arrPlaceholder;\n outVertexPoint = outTangents && outTangents[i] ? outTangents[i] : arrPlaceholder;\n path.setTripleAt(points[i][0], points[i][1], outVertexPoint[0] + points[i][0], outVertexPoint[1] + points[i][1], inVertexPoint[0] + points[i][0], inVertexPoint[1] + points[i][1], i, true);\n }\n\n return path;\n }\n\n function initiateExpression(elem, data, property) {\n // Bail out if we don't want expressions\n function noOp(_value) {\n return _value;\n }\n\n if (!elem.globalData.renderConfig.runExpressions) {\n return noOp;\n }\n\n var val = data.x;\n var needsVelocity = /velocity(?![\\w\\d])/.test(val);\n\n var _needsRandom = val.indexOf('random') !== -1;\n\n var elemType = elem.data.ty;\n var transform;\n var $bm_transform;\n var content;\n var effect;\n var thisProperty = property;\n thisProperty.valueAtTime = thisProperty.getValueAtTime;\n Object.defineProperty(thisProperty, 'value', {\n get: function get() {\n return thisProperty.v;\n }\n });\n elem.comp.frameDuration = 1 / elem.comp.globalData.frameRate;\n elem.comp.displayStartTime = 0;\n var inPoint = elem.data.ip / elem.comp.globalData.frameRate;\n var outPoint = elem.data.op / elem.comp.globalData.frameRate;\n var width = elem.data.sw ? elem.data.sw : 0;\n var height = elem.data.sh ? elem.data.sh : 0;\n var name = elem.data.nm;\n var loopIn;\n var loop_in;\n var loopOut;\n var loop_out;\n var smooth;\n var toWorld;\n var fromWorld;\n var fromComp;\n var toComp;\n var fromCompToSurface;\n var position;\n var rotation;\n var anchorPoint;\n var scale;\n var thisLayer;\n var thisComp;\n var mask;\n var valueAtTime;\n var velocityAtTime;\n var scoped_bm_rt; // val = val.replace(/(\\\\?\"|')((http)(s)?(:\\/))?\\/.*?(\\\\?\"|')/g, \"\\\"\\\"\"); // deter potential network calls\n\n var expression_function = eval('[function _expression_function(){' + val + ';scoped_bm_rt=$bm_rt}]')[0]; // eslint-disable-line no-eval\n\n var numKeys = property.kf ? data.k.length : 0;\n var active = !this.data || this.data.hd !== true;\n\n var wiggle = function wiggle(freq, amp) {\n var iWiggle;\n var j;\n var lenWiggle = this.pv.length ? this.pv.length : 1;\n var addedAmps = createTypedArray('float32', lenWiggle);\n freq = 5;\n var iterations = Math.floor(time * freq);\n iWiggle = 0;\n j = 0;\n\n while (iWiggle < iterations) {\n // var rnd = BMMath.random();\n for (j = 0; j < lenWiggle; j += 1) {\n addedAmps[j] += -amp + amp * 2 * BMMath.random(); // addedAmps[j] += -amp + amp*2*rnd;\n }\n\n iWiggle += 1;\n } // var rnd2 = BMMath.random();\n\n\n var periods = time * freq;\n var perc = periods - Math.floor(periods);\n var arr = createTypedArray('float32', lenWiggle);\n\n if (lenWiggle > 1) {\n for (j = 0; j < lenWiggle; j += 1) {\n arr[j] = this.pv[j] + addedAmps[j] + (-amp + amp * 2 * BMMath.random()) * perc; // arr[j] = this.pv[j] + addedAmps[j] + (-amp + amp*2*rnd)*perc;\n // arr[i] = this.pv[i] + addedAmp + amp1*perc + amp2*(1-perc);\n }\n\n return arr;\n }\n\n return this.pv + addedAmps[0] + (-amp + amp * 2 * BMMath.random()) * perc;\n }.bind(this);\n\n if (thisProperty.loopIn) {\n loopIn = thisProperty.loopIn.bind(thisProperty);\n loop_in = loopIn;\n }\n\n if (thisProperty.loopOut) {\n loopOut = thisProperty.loopOut.bind(thisProperty);\n loop_out = loopOut;\n }\n\n if (thisProperty.smooth) {\n smooth = thisProperty.smooth.bind(thisProperty);\n }\n\n function loopInDuration(type, duration) {\n return loopIn(type, duration, true);\n }\n\n function loopOutDuration(type, duration) {\n return loopOut(type, duration, true);\n }\n\n if (this.getValueAtTime) {\n valueAtTime = this.getValueAtTime.bind(this);\n }\n\n if (this.getVelocityAtTime) {\n velocityAtTime = this.getVelocityAtTime.bind(this);\n }\n\n var comp = elem.comp.globalData.projectInterface.bind(elem.comp.globalData.projectInterface);\n\n function lookAt(elem1, elem2) {\n var fVec = [elem2[0] - elem1[0], elem2[1] - elem1[1], elem2[2] - elem1[2]];\n var pitch = Math.atan2(fVec[0], Math.sqrt(fVec[1] * fVec[1] + fVec[2] * fVec[2])) / degToRads;\n var yaw = -Math.atan2(fVec[1], fVec[2]) / degToRads;\n return [yaw, pitch, 0];\n }\n\n function easeOut(t, tMin, tMax, val1, val2) {\n return applyEase(easeOutBez, t, tMin, tMax, val1, val2);\n }\n\n function easeIn(t, tMin, tMax, val1, val2) {\n return applyEase(easeInBez, t, tMin, tMax, val1, val2);\n }\n\n function ease(t, tMin, tMax, val1, val2) {\n return applyEase(easeInOutBez, t, tMin, tMax, val1, val2);\n }\n\n function applyEase(fn, t, tMin, tMax, val1, val2) {\n if (val1 === undefined) {\n val1 = tMin;\n val2 = tMax;\n } else {\n t = (t - tMin) / (tMax - tMin);\n }\n\n if (t > 1) {\n t = 1;\n } else if (t < 0) {\n t = 0;\n }\n\n var mult = fn(t);\n\n if ($bm_isInstanceOfArray(val1)) {\n var iKey;\n var lenKey = val1.length;\n var arr = createTypedArray('float32', lenKey);\n\n for (iKey = 0; iKey < lenKey; iKey += 1) {\n arr[iKey] = (val2[iKey] - val1[iKey]) * mult + val1[iKey];\n }\n\n return arr;\n }\n\n return (val2 - val1) * mult + val1;\n }\n\n function nearestKey(time) {\n var iKey;\n var lenKey = data.k.length;\n var index;\n var keyTime;\n\n if (!data.k.length || typeof data.k[0] === 'number') {\n index = 0;\n keyTime = 0;\n } else {\n index = -1;\n time *= elem.comp.globalData.frameRate;\n\n if (time < data.k[0].t) {\n index = 1;\n keyTime = data.k[0].t;\n } else {\n for (iKey = 0; iKey < lenKey - 1; iKey += 1) {\n if (time === data.k[iKey].t) {\n index = iKey + 1;\n keyTime = data.k[iKey].t;\n break;\n } else if (time > data.k[iKey].t && time < data.k[iKey + 1].t) {\n if (time - data.k[iKey].t > data.k[iKey + 1].t - time) {\n index = iKey + 2;\n keyTime = data.k[iKey + 1].t;\n } else {\n index = iKey + 1;\n keyTime = data.k[iKey].t;\n }\n\n break;\n }\n }\n\n if (index === -1) {\n index = iKey + 1;\n keyTime = data.k[iKey].t;\n }\n }\n }\n\n var obKey = {};\n obKey.index = index;\n obKey.time = keyTime / elem.comp.globalData.frameRate;\n return obKey;\n }\n\n function key(ind) {\n var obKey;\n var iKey;\n var lenKey;\n\n if (!data.k.length || typeof data.k[0] === 'number') {\n throw new Error('The property has no keyframe at index ' + ind);\n }\n\n ind -= 1;\n obKey = {\n time: data.k[ind].t / elem.comp.globalData.frameRate,\n value: []\n };\n var arr = Object.prototype.hasOwnProperty.call(data.k[ind], 's') ? data.k[ind].s : data.k[ind - 1].e;\n lenKey = arr.length;\n\n for (iKey = 0; iKey < lenKey; iKey += 1) {\n obKey[iKey] = arr[iKey];\n obKey.value[iKey] = arr[iKey];\n }\n\n return obKey;\n }\n\n function framesToTime(fr, fps) {\n if (!fps) {\n fps = elem.comp.globalData.frameRate;\n }\n\n return fr / fps;\n }\n\n function timeToFrames(t, fps) {\n if (!t && t !== 0) {\n t = time;\n }\n\n if (!fps) {\n fps = elem.comp.globalData.frameRate;\n }\n\n return t * fps;\n }\n\n function seedRandom(seed) {\n BMMath.seedrandom(randSeed + seed);\n }\n\n function sourceRectAtTime() {\n return elem.sourceRectAtTime();\n }\n\n function substring(init, end) {\n if (typeof value === 'string') {\n if (end === undefined) {\n return value.substring(init);\n }\n\n return value.substring(init, end);\n }\n\n return '';\n }\n\n function substr(init, end) {\n if (typeof value === 'string') {\n if (end === undefined) {\n return value.substr(init);\n }\n\n return value.substr(init, end);\n }\n\n return '';\n }\n\n function posterizeTime(framesPerSecond) {\n time = framesPerSecond === 0 ? 0 : Math.floor(time * framesPerSecond) / framesPerSecond;\n value = valueAtTime(time);\n }\n\n var time;\n var velocity;\n var value;\n var text;\n var textIndex;\n var textTotal;\n var selectorValue;\n var index = elem.data.ind;\n var hasParent = !!(elem.hierarchy && elem.hierarchy.length);\n var parent;\n var randSeed = Math.floor(Math.random() * 1000000);\n var globalData = elem.globalData;\n\n function executeExpression(_value) {\n // globalData.pushExpression();\n value = _value;\n\n if (this.frameExpressionId === elem.globalData.frameId && this.propType !== 'textSelector') {\n return value;\n }\n\n if (this.propType === 'textSelector') {\n textIndex = this.textIndex;\n textTotal = this.textTotal;\n selectorValue = this.selectorValue;\n }\n\n if (!thisLayer) {\n text = elem.layerInterface.text;\n thisLayer = elem.layerInterface;\n thisComp = elem.comp.compInterface;\n toWorld = thisLayer.toWorld.bind(thisLayer);\n fromWorld = thisLayer.fromWorld.bind(thisLayer);\n fromComp = thisLayer.fromComp.bind(thisLayer);\n toComp = thisLayer.toComp.bind(thisLayer);\n mask = thisLayer.mask ? thisLayer.mask.bind(thisLayer) : null;\n fromCompToSurface = fromComp;\n }\n\n if (!transform) {\n transform = elem.layerInterface('ADBE Transform Group');\n $bm_transform = transform;\n\n if (transform) {\n anchorPoint = transform.anchorPoint;\n /* position = transform.position;\r\n rotation = transform.rotation;\r\n scale = transform.scale; */\n }\n }\n\n if (elemType === 4 && !content) {\n content = thisLayer('ADBE Root Vectors Group');\n }\n\n if (!effect) {\n effect = thisLayer(4);\n }\n\n hasParent = !!(elem.hierarchy && elem.hierarchy.length);\n\n if (hasParent && !parent) {\n parent = elem.hierarchy[0].layerInterface;\n }\n\n time = this.comp.renderedFrame / this.comp.globalData.frameRate;\n\n if (_needsRandom) {\n seedRandom(randSeed + time);\n }\n\n if (needsVelocity) {\n velocity = velocityAtTime(time);\n }\n\n expression_function();\n this.frameExpressionId = elem.globalData.frameId; // TODO: Check if it's possible to return on ShapeInterface the .v value\n // Changed this to a ternary operation because Rollup failed compiling it correctly\n\n scoped_bm_rt = scoped_bm_rt.propType === propTypes.SHAPE ? scoped_bm_rt.v : scoped_bm_rt;\n return scoped_bm_rt;\n } // Bundlers will see these as dead code and unless we reference them\n\n\n executeExpression.__preventDeadCodeRemoval = [$bm_transform, anchorPoint, time, velocity, inPoint, outPoint, width, height, name, loop_in, loop_out, smooth, toComp, fromCompToSurface, toWorld, fromWorld, mask, position, rotation, scale, thisComp, numKeys, active, wiggle, loopInDuration, loopOutDuration, comp, lookAt, easeOut, easeIn, ease, nearestKey, key, text, textIndex, textTotal, selectorValue, framesToTime, timeToFrames, sourceRectAtTime, substring, substr, posterizeTime, index, globalData];\n return executeExpression;\n }\n\n ob.initiateExpression = initiateExpression;\n ob.__preventDeadCodeRemoval = [window, document, XMLHttpRequest, fetch, frames, $bm_neg, add, $bm_sum, $bm_sub, $bm_mul, $bm_div, $bm_mod, clamp, radians_to_degrees, degreesToRadians, degrees_to_radians, normalize, rgbToHsl, hslToRgb, linear, random, createPath, _lottieGlobal];\n ob.resetFrame = resetFrame;\n return ob;\n }();\n\n var Expressions = function () {\n var ob = {};\n ob.initExpressions = initExpressions;\n ob.resetFrame = ExpressionManager.resetFrame;\n\n function initExpressions(animation) {\n var stackCount = 0;\n var registers = [];\n\n function pushExpression() {\n stackCount += 1;\n }\n\n function popExpression() {\n stackCount -= 1;\n\n if (stackCount === 0) {\n releaseInstances();\n }\n }\n\n function registerExpressionProperty(expression) {\n if (registers.indexOf(expression) === -1) {\n registers.push(expression);\n }\n }\n\n function releaseInstances() {\n var i;\n var len = registers.length;\n\n for (i = 0; i < len; i += 1) {\n registers[i].release();\n }\n\n registers.length = 0;\n }\n\n animation.renderer.compInterface = CompExpressionInterface(animation.renderer);\n animation.renderer.globalData.projectInterface.registerComposition(animation.renderer);\n animation.renderer.globalData.pushExpression = pushExpression;\n animation.renderer.globalData.popExpression = popExpression;\n animation.renderer.globalData.registerExpressionProperty = registerExpressionProperty;\n }\n\n return ob;\n }();\n\n var MaskManagerInterface = function () {\n function MaskInterface(mask, data) {\n this._mask = mask;\n this._data = data;\n }\n\n Object.defineProperty(MaskInterface.prototype, 'maskPath', {\n get: function get() {\n if (this._mask.prop.k) {\n this._mask.prop.getValue();\n }\n\n return this._mask.prop;\n }\n });\n Object.defineProperty(MaskInterface.prototype, 'maskOpacity', {\n get: function get() {\n if (this._mask.op.k) {\n this._mask.op.getValue();\n }\n\n return this._mask.op.v * 100;\n }\n });\n\n var MaskManager = function MaskManager(maskManager) {\n var _masksInterfaces = createSizedArray(maskManager.viewData.length);\n\n var i;\n var len = maskManager.viewData.length;\n\n for (i = 0; i < len; i += 1) {\n _masksInterfaces[i] = new MaskInterface(maskManager.viewData[i], maskManager.masksProperties[i]);\n }\n\n var maskFunction = function maskFunction(name) {\n i = 0;\n\n while (i < len) {\n if (maskManager.masksProperties[i].nm === name) {\n return _masksInterfaces[i];\n }\n\n i += 1;\n }\n\n return null;\n };\n\n return maskFunction;\n };\n\n return MaskManager;\n }();\n\n var ExpressionPropertyInterface = function () {\n var defaultUnidimensionalValue = {\n pv: 0,\n v: 0,\n mult: 1\n };\n var defaultMultidimensionalValue = {\n pv: [0, 0, 0],\n v: [0, 0, 0],\n mult: 1\n };\n\n function completeProperty(expressionValue, property, type) {\n Object.defineProperty(expressionValue, 'velocity', {\n get: function get() {\n return property.getVelocityAtTime(property.comp.currentFrame);\n }\n });\n expressionValue.numKeys = property.keyframes ? property.keyframes.length : 0;\n\n expressionValue.key = function (pos) {\n if (!expressionValue.numKeys) {\n return 0;\n }\n\n var value = '';\n\n if ('s' in property.keyframes[pos - 1]) {\n value = property.keyframes[pos - 1].s;\n } else if ('e' in property.keyframes[pos - 2]) {\n value = property.keyframes[pos - 2].e;\n } else {\n value = property.keyframes[pos - 2].s;\n }\n\n var valueProp = type === 'unidimensional' ? new Number(value) : Object.assign({}, value); // eslint-disable-line no-new-wrappers\n\n valueProp.time = property.keyframes[pos - 1].t / property.elem.comp.globalData.frameRate;\n valueProp.value = type === 'unidimensional' ? value[0] : value;\n return valueProp;\n };\n\n expressionValue.valueAtTime = property.getValueAtTime;\n expressionValue.speedAtTime = property.getSpeedAtTime;\n expressionValue.velocityAtTime = property.getVelocityAtTime;\n expressionValue.propertyGroup = property.propertyGroup;\n }\n\n function UnidimensionalPropertyInterface(property) {\n if (!property || !('pv' in property)) {\n property = defaultUnidimensionalValue;\n }\n\n var mult = 1 / property.mult;\n var val = property.pv * mult;\n var expressionValue = new Number(val); // eslint-disable-line no-new-wrappers\n\n expressionValue.value = val;\n completeProperty(expressionValue, property, 'unidimensional');\n return function () {\n if (property.k) {\n property.getValue();\n }\n\n val = property.v * mult;\n\n if (expressionValue.value !== val) {\n expressionValue = new Number(val); // eslint-disable-line no-new-wrappers\n\n expressionValue.value = val;\n completeProperty(expressionValue, property, 'unidimensional');\n }\n\n return expressionValue;\n };\n }\n\n function MultidimensionalPropertyInterface(property) {\n if (!property || !('pv' in property)) {\n property = defaultMultidimensionalValue;\n }\n\n var mult = 1 / property.mult;\n var len = property.data && property.data.l || property.pv.length;\n var expressionValue = createTypedArray('float32', len);\n var arrValue = createTypedArray('float32', len);\n expressionValue.value = arrValue;\n completeProperty(expressionValue, property, 'multidimensional');\n return function () {\n if (property.k) {\n property.getValue();\n }\n\n for (var i = 0; i < len; i += 1) {\n arrValue[i] = property.v[i] * mult;\n expressionValue[i] = arrValue[i];\n }\n\n return expressionValue;\n };\n } // TODO: try to avoid using this getter\n\n\n function defaultGetter() {\n return defaultUnidimensionalValue;\n }\n\n return function (property) {\n if (!property) {\n return defaultGetter;\n }\n\n if (property.propType === 'unidimensional') {\n return UnidimensionalPropertyInterface(property);\n }\n\n return MultidimensionalPropertyInterface(property);\n };\n }();\n\n var TransformExpressionInterface = function () {\n return function (transform) {\n function _thisFunction(name) {\n switch (name) {\n case 'scale':\n case 'Scale':\n case 'ADBE Scale':\n case 6:\n return _thisFunction.scale;\n\n case 'rotation':\n case 'Rotation':\n case 'ADBE Rotation':\n case 'ADBE Rotate Z':\n case 10:\n return _thisFunction.rotation;\n\n case 'ADBE Rotate X':\n return _thisFunction.xRotation;\n\n case 'ADBE Rotate Y':\n return _thisFunction.yRotation;\n\n case 'position':\n case 'Position':\n case 'ADBE Position':\n case 2:\n return _thisFunction.position;\n\n case 'ADBE Position_0':\n return _thisFunction.xPosition;\n\n case 'ADBE Position_1':\n return _thisFunction.yPosition;\n\n case 'ADBE Position_2':\n return _thisFunction.zPosition;\n\n case 'anchorPoint':\n case 'AnchorPoint':\n case 'Anchor Point':\n case 'ADBE AnchorPoint':\n case 1:\n return _thisFunction.anchorPoint;\n\n case 'opacity':\n case 'Opacity':\n case 11:\n return _thisFunction.opacity;\n\n default:\n return null;\n }\n }\n\n Object.defineProperty(_thisFunction, 'rotation', {\n get: ExpressionPropertyInterface(transform.r || transform.rz)\n });\n Object.defineProperty(_thisFunction, 'zRotation', {\n get: ExpressionPropertyInterface(transform.rz || transform.r)\n });\n Object.defineProperty(_thisFunction, 'xRotation', {\n get: ExpressionPropertyInterface(transform.rx)\n });\n Object.defineProperty(_thisFunction, 'yRotation', {\n get: ExpressionPropertyInterface(transform.ry)\n });\n Object.defineProperty(_thisFunction, 'scale', {\n get: ExpressionPropertyInterface(transform.s)\n });\n\n var _px;\n\n var _py;\n\n var _pz;\n\n var _transformFactory;\n\n if (transform.p) {\n _transformFactory = ExpressionPropertyInterface(transform.p);\n } else {\n _px = ExpressionPropertyInterface(transform.px);\n _py = ExpressionPropertyInterface(transform.py);\n\n if (transform.pz) {\n _pz = ExpressionPropertyInterface(transform.pz);\n }\n }\n\n Object.defineProperty(_thisFunction, 'position', {\n get: function get() {\n if (transform.p) {\n return _transformFactory();\n }\n\n return [_px(), _py(), _pz ? _pz() : 0];\n }\n });\n Object.defineProperty(_thisFunction, 'xPosition', {\n get: ExpressionPropertyInterface(transform.px)\n });\n Object.defineProperty(_thisFunction, 'yPosition', {\n get: ExpressionPropertyInterface(transform.py)\n });\n Object.defineProperty(_thisFunction, 'zPosition', {\n get: ExpressionPropertyInterface(transform.pz)\n });\n Object.defineProperty(_thisFunction, 'anchorPoint', {\n get: ExpressionPropertyInterface(transform.a)\n });\n Object.defineProperty(_thisFunction, 'opacity', {\n get: ExpressionPropertyInterface(transform.o)\n });\n Object.defineProperty(_thisFunction, 'skew', {\n get: ExpressionPropertyInterface(transform.sk)\n });\n Object.defineProperty(_thisFunction, 'skewAxis', {\n get: ExpressionPropertyInterface(transform.sa)\n });\n Object.defineProperty(_thisFunction, 'orientation', {\n get: ExpressionPropertyInterface(transform.or)\n });\n return _thisFunction;\n };\n }();\n\n var LayerExpressionInterface = function () {\n function getMatrix(time) {\n var toWorldMat = new Matrix();\n\n if (time !== undefined) {\n var propMatrix = this._elem.finalTransform.mProp.getValueAtTime(time);\n\n propMatrix.clone(toWorldMat);\n } else {\n var transformMat = this._elem.finalTransform.mProp;\n transformMat.applyToMatrix(toWorldMat);\n }\n\n return toWorldMat;\n }\n\n function toWorldVec(arr, time) {\n var toWorldMat = this.getMatrix(time);\n toWorldMat.props[12] = 0;\n toWorldMat.props[13] = 0;\n toWorldMat.props[14] = 0;\n return this.applyPoint(toWorldMat, arr);\n }\n\n function toWorld(arr, time) {\n var toWorldMat = this.getMatrix(time);\n return this.applyPoint(toWorldMat, arr);\n }\n\n function fromWorldVec(arr, time) {\n var toWorldMat = this.getMatrix(time);\n toWorldMat.props[12] = 0;\n toWorldMat.props[13] = 0;\n toWorldMat.props[14] = 0;\n return this.invertPoint(toWorldMat, arr);\n }\n\n function fromWorld(arr, time) {\n var toWorldMat = this.getMatrix(time);\n return this.invertPoint(toWorldMat, arr);\n }\n\n function applyPoint(matrix, arr) {\n if (this._elem.hierarchy && this._elem.hierarchy.length) {\n var i;\n var len = this._elem.hierarchy.length;\n\n for (i = 0; i < len; i += 1) {\n this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(matrix);\n }\n }\n\n return matrix.applyToPointArray(arr[0], arr[1], arr[2] || 0);\n }\n\n function invertPoint(matrix, arr) {\n if (this._elem.hierarchy && this._elem.hierarchy.length) {\n var i;\n var len = this._elem.hierarchy.length;\n\n for (i = 0; i < len; i += 1) {\n this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(matrix);\n }\n }\n\n return matrix.inversePoint(arr);\n }\n\n function fromComp(arr) {\n var toWorldMat = new Matrix();\n toWorldMat.reset();\n\n this._elem.finalTransform.mProp.applyToMatrix(toWorldMat);\n\n if (this._elem.hierarchy && this._elem.hierarchy.length) {\n var i;\n var len = this._elem.hierarchy.length;\n\n for (i = 0; i < len; i += 1) {\n this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(toWorldMat);\n }\n\n return toWorldMat.inversePoint(arr);\n }\n\n return toWorldMat.inversePoint(arr);\n }\n\n function sampleImage() {\n return [1, 1, 1, 1];\n }\n\n return function (elem) {\n var transformInterface;\n\n function _registerMaskInterface(maskManager) {\n _thisLayerFunction.mask = new MaskManagerInterface(maskManager, elem);\n }\n\n function _registerEffectsInterface(effects) {\n _thisLayerFunction.effect = effects;\n }\n\n function _thisLayerFunction(name) {\n switch (name) {\n case 'ADBE Root Vectors Group':\n case 'Contents':\n case 2:\n return _thisLayerFunction.shapeInterface;\n\n case 1:\n case 6:\n case 'Transform':\n case 'transform':\n case 'ADBE Transform Group':\n return transformInterface;\n\n case 4:\n case 'ADBE Effect Parade':\n case 'effects':\n case 'Effects':\n return _thisLayerFunction.effect;\n\n case 'ADBE Text Properties':\n return _thisLayerFunction.textInterface;\n\n default:\n return null;\n }\n }\n\n _thisLayerFunction.getMatrix = getMatrix;\n _thisLayerFunction.invertPoint = invertPoint;\n _thisLayerFunction.applyPoint = applyPoint;\n _thisLayerFunction.toWorld = toWorld;\n _thisLayerFunction.toWorldVec = toWorldVec;\n _thisLayerFunction.fromWorld = fromWorld;\n _thisLayerFunction.fromWorldVec = fromWorldVec;\n _thisLayerFunction.toComp = toWorld;\n _thisLayerFunction.fromComp = fromComp;\n _thisLayerFunction.sampleImage = sampleImage;\n _thisLayerFunction.sourceRectAtTime = elem.sourceRectAtTime.bind(elem);\n _thisLayerFunction._elem = elem;\n transformInterface = TransformExpressionInterface(elem.finalTransform.mProp);\n var anchorPointDescriptor = getDescriptor(transformInterface, 'anchorPoint');\n Object.defineProperties(_thisLayerFunction, {\n hasParent: {\n get: function get() {\n return elem.hierarchy.length;\n }\n },\n parent: {\n get: function get() {\n return elem.hierarchy[0].layerInterface;\n }\n },\n rotation: getDescriptor(transformInterface, 'rotation'),\n scale: getDescriptor(transformInterface, 'scale'),\n position: getDescriptor(transformInterface, 'position'),\n opacity: getDescriptor(transformInterface, 'opacity'),\n anchorPoint: anchorPointDescriptor,\n anchor_point: anchorPointDescriptor,\n transform: {\n get: function get() {\n return transformInterface;\n }\n },\n active: {\n get: function get() {\n return elem.isInRange;\n }\n }\n });\n _thisLayerFunction.startTime = elem.data.st;\n _thisLayerFunction.index = elem.data.ind;\n _thisLayerFunction.source = elem.data.refId;\n _thisLayerFunction.height = elem.data.ty === 0 ? elem.data.h : 100;\n _thisLayerFunction.width = elem.data.ty === 0 ? elem.data.w : 100;\n _thisLayerFunction.inPoint = elem.data.ip / elem.comp.globalData.frameRate;\n _thisLayerFunction.outPoint = elem.data.op / elem.comp.globalData.frameRate;\n _thisLayerFunction._name = elem.data.nm;\n _thisLayerFunction.registerMaskInterface = _registerMaskInterface;\n _thisLayerFunction.registerEffectsInterface = _registerEffectsInterface;\n return _thisLayerFunction;\n };\n }();\n\n var propertyGroupFactory = function () {\n return function (interfaceFunction, parentPropertyGroup) {\n return function (val) {\n val = val === undefined ? 1 : val;\n\n if (val <= 0) {\n return interfaceFunction;\n }\n\n return parentPropertyGroup(val - 1);\n };\n };\n }();\n\n var PropertyInterface = function () {\n return function (propertyName, propertyGroup) {\n var interfaceFunction = {\n _name: propertyName\n };\n\n function _propertyGroup(val) {\n val = val === undefined ? 1 : val;\n\n if (val <= 0) {\n return interfaceFunction;\n }\n\n return propertyGroup(val - 1);\n }\n\n return _propertyGroup;\n };\n }();\n\n var EffectsExpressionInterface = function () {\n var ob = {\n createEffectsInterface: createEffectsInterface\n };\n\n function createEffectsInterface(elem, propertyGroup) {\n if (elem.effectsManager) {\n var effectElements = [];\n var effectsData = elem.data.ef;\n var i;\n var len = elem.effectsManager.effectElements.length;\n\n for (i = 0; i < len; i += 1) {\n effectElements.push(createGroupInterface(effectsData[i], elem.effectsManager.effectElements[i], propertyGroup, elem));\n }\n\n var effects = elem.data.ef || [];\n\n var groupInterface = function groupInterface(name) {\n i = 0;\n len = effects.length;\n\n while (i < len) {\n if (name === effects[i].nm || name === effects[i].mn || name === effects[i].ix) {\n return effectElements[i];\n }\n\n i += 1;\n }\n\n return null;\n };\n\n Object.defineProperty(groupInterface, 'numProperties', {\n get: function get() {\n return effects.length;\n }\n });\n return groupInterface;\n }\n\n return null;\n }\n\n function createGroupInterface(data, elements, propertyGroup, elem) {\n function groupInterface(name) {\n var effects = data.ef;\n var i = 0;\n var len = effects.length;\n\n while (i < len) {\n if (name === effects[i].nm || name === effects[i].mn || name === effects[i].ix) {\n if (effects[i].ty === 5) {\n return effectElements[i];\n }\n\n return effectElements[i]();\n }\n\n i += 1;\n }\n\n throw new Error();\n }\n\n var _propertyGroup = propertyGroupFactory(groupInterface, propertyGroup);\n\n var effectElements = [];\n var i;\n var len = data.ef.length;\n\n for (i = 0; i < len; i += 1) {\n if (data.ef[i].ty === 5) {\n effectElements.push(createGroupInterface(data.ef[i], elements.effectElements[i], elements.effectElements[i].propertyGroup, elem));\n } else {\n effectElements.push(createValueInterface(elements.effectElements[i], data.ef[i].ty, elem, _propertyGroup));\n }\n }\n\n if (data.mn === 'ADBE Color Control') {\n Object.defineProperty(groupInterface, 'color', {\n get: function get() {\n return effectElements[0]();\n }\n });\n }\n\n Object.defineProperties(groupInterface, {\n numProperties: {\n get: function get() {\n return data.np;\n }\n },\n _name: {\n value: data.nm\n },\n propertyGroup: {\n value: _propertyGroup\n }\n });\n groupInterface.enabled = data.en !== 0;\n groupInterface.active = groupInterface.enabled;\n return groupInterface;\n }\n\n function createValueInterface(element, type, elem, propertyGroup) {\n var expressionProperty = ExpressionPropertyInterface(element.p);\n\n function interfaceFunction() {\n if (type === 10) {\n return elem.comp.compInterface(element.p.v);\n }\n\n return expressionProperty();\n }\n\n if (element.p.setGroupProperty) {\n element.p.setGroupProperty(PropertyInterface('', propertyGroup));\n }\n\n return interfaceFunction;\n }\n\n return ob;\n }();\n\n var ShapePathInterface = function () {\n return function pathInterfaceFactory(shape, view, propertyGroup) {\n var prop = view.sh;\n\n function interfaceFunction(val) {\n if (val === 'Shape' || val === 'shape' || val === 'Path' || val === 'path' || val === 'ADBE Vector Shape' || val === 2) {\n return interfaceFunction.path;\n }\n\n return null;\n }\n\n var _propertyGroup = propertyGroupFactory(interfaceFunction, propertyGroup);\n\n prop.setGroupProperty(PropertyInterface('Path', _propertyGroup));\n Object.defineProperties(interfaceFunction, {\n path: {\n get: function get() {\n if (prop.k) {\n prop.getValue();\n }\n\n return prop;\n }\n },\n shape: {\n get: function get() {\n if (prop.k) {\n prop.getValue();\n }\n\n return prop;\n }\n },\n _name: {\n value: shape.nm\n },\n ix: {\n value: shape.ix\n },\n propertyIndex: {\n value: shape.ix\n },\n mn: {\n value: shape.mn\n },\n propertyGroup: {\n value: propertyGroup\n }\n });\n return interfaceFunction;\n };\n }();\n\n var ShapeExpressionInterface = function () {\n function iterateElements(shapes, view, propertyGroup) {\n var arr = [];\n var i;\n var len = shapes ? shapes.length : 0;\n\n for (i = 0; i < len; i += 1) {\n if (shapes[i].ty === 'gr') {\n arr.push(groupInterfaceFactory(shapes[i], view[i], propertyGroup));\n } else if (shapes[i].ty === 'fl') {\n arr.push(fillInterfaceFactory(shapes[i], view[i], propertyGroup));\n } else if (shapes[i].ty === 'st') {\n arr.push(strokeInterfaceFactory(shapes[i], view[i], propertyGroup));\n } else if (shapes[i].ty === 'tm') {\n arr.push(trimInterfaceFactory(shapes[i], view[i], propertyGroup));\n } else if (shapes[i].ty === 'tr') {// arr.push(transformInterfaceFactory(shapes[i],view[i],propertyGroup));\n } else if (shapes[i].ty === 'el') {\n arr.push(ellipseInterfaceFactory(shapes[i], view[i], propertyGroup));\n } else if (shapes[i].ty === 'sr') {\n arr.push(starInterfaceFactory(shapes[i], view[i], propertyGroup));\n } else if (shapes[i].ty === 'sh') {\n arr.push(ShapePathInterface(shapes[i], view[i], propertyGroup));\n } else if (shapes[i].ty === 'rc') {\n arr.push(rectInterfaceFactory(shapes[i], view[i], propertyGroup));\n } else if (shapes[i].ty === 'rd') {\n arr.push(roundedInterfaceFactory(shapes[i], view[i], propertyGroup));\n } else if (shapes[i].ty === 'rp') {\n arr.push(repeaterInterfaceFactory(shapes[i], view[i], propertyGroup));\n } else if (shapes[i].ty === 'gf') {\n arr.push(gradientFillInterfaceFactory(shapes[i], view[i], propertyGroup));\n } else {\n arr.push(defaultInterfaceFactory(shapes[i], view[i], propertyGroup));\n }\n }\n\n return arr;\n }\n\n function contentsInterfaceFactory(shape, view, propertyGroup) {\n var interfaces;\n\n var interfaceFunction = function _interfaceFunction(value) {\n var i = 0;\n var len = interfaces.length;\n\n while (i < len) {\n if (interfaces[i]._name === value || interfaces[i].mn === value || interfaces[i].propertyIndex === value || interfaces[i].ix === value || interfaces[i].ind === value) {\n return interfaces[i];\n }\n\n i += 1;\n }\n\n if (typeof value === 'number') {\n return interfaces[value - 1];\n }\n\n return null;\n };\n\n interfaceFunction.propertyGroup = propertyGroupFactory(interfaceFunction, propertyGroup);\n interfaces = iterateElements(shape.it, view.it, interfaceFunction.propertyGroup);\n interfaceFunction.numProperties = interfaces.length;\n var transformInterface = transformInterfaceFactory(shape.it[shape.it.length - 1], view.it[view.it.length - 1], interfaceFunction.propertyGroup);\n interfaceFunction.transform = transformInterface;\n interfaceFunction.propertyIndex = shape.cix;\n interfaceFunction._name = shape.nm;\n return interfaceFunction;\n }\n\n function groupInterfaceFactory(shape, view, propertyGroup) {\n var interfaceFunction = function _interfaceFunction(value) {\n switch (value) {\n case 'ADBE Vectors Group':\n case 'Contents':\n case 2:\n return interfaceFunction.content;\n // Not necessary for now. Keeping them here in case a new case appears\n // case 'ADBE Vector Transform Group':\n // case 3:\n\n default:\n return interfaceFunction.transform;\n }\n };\n\n interfaceFunction.propertyGroup = propertyGroupFactory(interfaceFunction, propertyGroup);\n var content = contentsInterfaceFactory(shape, view, interfaceFunction.propertyGroup);\n var transformInterface = transformInterfaceFactory(shape.it[shape.it.length - 1], view.it[view.it.length - 1], interfaceFunction.propertyGroup);\n interfaceFunction.content = content;\n interfaceFunction.transform = transformInterface;\n Object.defineProperty(interfaceFunction, '_name', {\n get: function get() {\n return shape.nm;\n }\n }); // interfaceFunction.content = interfaceFunction;\n\n interfaceFunction.numProperties = shape.np;\n interfaceFunction.propertyIndex = shape.ix;\n interfaceFunction.nm = shape.nm;\n interfaceFunction.mn = shape.mn;\n return interfaceFunction;\n }\n\n function fillInterfaceFactory(shape, view, propertyGroup) {\n function interfaceFunction(val) {\n if (val === 'Color' || val === 'color') {\n return interfaceFunction.color;\n }\n\n if (val === 'Opacity' || val === 'opacity') {\n return interfaceFunction.opacity;\n }\n\n return null;\n }\n\n Object.defineProperties(interfaceFunction, {\n color: {\n get: ExpressionPropertyInterface(view.c)\n },\n opacity: {\n get: ExpressionPropertyInterface(view.o)\n },\n _name: {\n value: shape.nm\n },\n mn: {\n value: shape.mn\n }\n });\n view.c.setGroupProperty(PropertyInterface('Color', propertyGroup));\n view.o.setGroupProperty(PropertyInterface('Opacity', propertyGroup));\n return interfaceFunction;\n }\n\n function gradientFillInterfaceFactory(shape, view, propertyGroup) {\n function interfaceFunction(val) {\n if (val === 'Start Point' || val === 'start point') {\n return interfaceFunction.startPoint;\n }\n\n if (val === 'End Point' || val === 'end point') {\n return interfaceFunction.endPoint;\n }\n\n if (val === 'Opacity' || val === 'opacity') {\n return interfaceFunction.opacity;\n }\n\n return null;\n }\n\n Object.defineProperties(interfaceFunction, {\n startPoint: {\n get: ExpressionPropertyInterface(view.s)\n },\n endPoint: {\n get: ExpressionPropertyInterface(view.e)\n },\n opacity: {\n get: ExpressionPropertyInterface(view.o)\n },\n type: {\n get: function get() {\n return 'a';\n }\n },\n _name: {\n value: shape.nm\n },\n mn: {\n value: shape.mn\n }\n });\n view.s.setGroupProperty(PropertyInterface('Start Point', propertyGroup));\n view.e.setGroupProperty(PropertyInterface('End Point', propertyGroup));\n view.o.setGroupProperty(PropertyInterface('Opacity', propertyGroup));\n return interfaceFunction;\n }\n\n function defaultInterfaceFactory() {\n function interfaceFunction() {\n return null;\n }\n\n return interfaceFunction;\n }\n\n function strokeInterfaceFactory(shape, view, propertyGroup) {\n var _propertyGroup = propertyGroupFactory(interfaceFunction, propertyGroup);\n\n var _dashPropertyGroup = propertyGroupFactory(dashOb, _propertyGroup);\n\n function addPropertyToDashOb(i) {\n Object.defineProperty(dashOb, shape.d[i].nm, {\n get: ExpressionPropertyInterface(view.d.dataProps[i].p)\n });\n }\n\n var i;\n var len = shape.d ? shape.d.length : 0;\n var dashOb = {};\n\n for (i = 0; i < len; i += 1) {\n addPropertyToDashOb(i);\n view.d.dataProps[i].p.setGroupProperty(_dashPropertyGroup);\n }\n\n function interfaceFunction(val) {\n if (val === 'Color' || val === 'color') {\n return interfaceFunction.color;\n }\n\n if (val === 'Opacity' || val === 'opacity') {\n return interfaceFunction.opacity;\n }\n\n if (val === 'Stroke Width' || val === 'stroke width') {\n return interfaceFunction.strokeWidth;\n }\n\n return null;\n }\n\n Object.defineProperties(interfaceFunction, {\n color: {\n get: ExpressionPropertyInterface(view.c)\n },\n opacity: {\n get: ExpressionPropertyInterface(view.o)\n },\n strokeWidth: {\n get: ExpressionPropertyInterface(view.w)\n },\n dash: {\n get: function get() {\n return dashOb;\n }\n },\n _name: {\n value: shape.nm\n },\n mn: {\n value: shape.mn\n }\n });\n view.c.setGroupProperty(PropertyInterface('Color', _propertyGroup));\n view.o.setGroupProperty(PropertyInterface('Opacity', _propertyGroup));\n view.w.setGroupProperty(PropertyInterface('Stroke Width', _propertyGroup));\n return interfaceFunction;\n }\n\n function trimInterfaceFactory(shape, view, propertyGroup) {\n function interfaceFunction(val) {\n if (val === shape.e.ix || val === 'End' || val === 'end') {\n return interfaceFunction.end;\n }\n\n if (val === shape.s.ix) {\n return interfaceFunction.start;\n }\n\n if (val === shape.o.ix) {\n return interfaceFunction.offset;\n }\n\n return null;\n }\n\n var _propertyGroup = propertyGroupFactory(interfaceFunction, propertyGroup);\n\n interfaceFunction.propertyIndex = shape.ix;\n view.s.setGroupProperty(PropertyInterface('Start', _propertyGroup));\n view.e.setGroupProperty(PropertyInterface('End', _propertyGroup));\n view.o.setGroupProperty(PropertyInterface('Offset', _propertyGroup));\n interfaceFunction.propertyIndex = shape.ix;\n interfaceFunction.propertyGroup = propertyGroup;\n Object.defineProperties(interfaceFunction, {\n start: {\n get: ExpressionPropertyInterface(view.s)\n },\n end: {\n get: ExpressionPropertyInterface(view.e)\n },\n offset: {\n get: ExpressionPropertyInterface(view.o)\n },\n _name: {\n value: shape.nm\n }\n });\n interfaceFunction.mn = shape.mn;\n return interfaceFunction;\n }\n\n function transformInterfaceFactory(shape, view, propertyGroup) {\n function interfaceFunction(value) {\n if (shape.a.ix === value || value === 'Anchor Point') {\n return interfaceFunction.anchorPoint;\n }\n\n if (shape.o.ix === value || value === 'Opacity') {\n return interfaceFunction.opacity;\n }\n\n if (shape.p.ix === value || value === 'Position') {\n return interfaceFunction.position;\n }\n\n if (shape.r.ix === value || value === 'Rotation' || value === 'ADBE Vector Rotation') {\n return interfaceFunction.rotation;\n }\n\n if (shape.s.ix === value || value === 'Scale') {\n return interfaceFunction.scale;\n }\n\n if (shape.sk && shape.sk.ix === value || value === 'Skew') {\n return interfaceFunction.skew;\n }\n\n if (shape.sa && shape.sa.ix === value || value === 'Skew Axis') {\n return interfaceFunction.skewAxis;\n }\n\n return null;\n }\n\n var _propertyGroup = propertyGroupFactory(interfaceFunction, propertyGroup);\n\n view.transform.mProps.o.setGroupProperty(PropertyInterface('Opacity', _propertyGroup));\n view.transform.mProps.p.setGroupProperty(PropertyInterface('Position', _propertyGroup));\n view.transform.mProps.a.setGroupProperty(PropertyInterface('Anchor Point', _propertyGroup));\n view.transform.mProps.s.setGroupProperty(PropertyInterface('Scale', _propertyGroup));\n view.transform.mProps.r.setGroupProperty(PropertyInterface('Rotation', _propertyGroup));\n\n if (view.transform.mProps.sk) {\n view.transform.mProps.sk.setGroupProperty(PropertyInterface('Skew', _propertyGroup));\n view.transform.mProps.sa.setGroupProperty(PropertyInterface('Skew Angle', _propertyGroup));\n }\n\n view.transform.op.setGroupProperty(PropertyInterface('Opacity', _propertyGroup));\n Object.defineProperties(interfaceFunction, {\n opacity: {\n get: ExpressionPropertyInterface(view.transform.mProps.o)\n },\n position: {\n get: ExpressionPropertyInterface(view.transform.mProps.p)\n },\n anchorPoint: {\n get: ExpressionPropertyInterface(view.transform.mProps.a)\n },\n scale: {\n get: ExpressionPropertyInterface(view.transform.mProps.s)\n },\n rotation: {\n get: ExpressionPropertyInterface(view.transform.mProps.r)\n },\n skew: {\n get: ExpressionPropertyInterface(view.transform.mProps.sk)\n },\n skewAxis: {\n get: ExpressionPropertyInterface(view.transform.mProps.sa)\n },\n _name: {\n value: shape.nm\n }\n });\n interfaceFunction.ty = 'tr';\n interfaceFunction.mn = shape.mn;\n interfaceFunction.propertyGroup = propertyGroup;\n return interfaceFunction;\n }\n\n function ellipseInterfaceFactory(shape, view, propertyGroup) {\n function interfaceFunction(value) {\n if (shape.p.ix === value) {\n return interfaceFunction.position;\n }\n\n if (shape.s.ix === value) {\n return interfaceFunction.size;\n }\n\n return null;\n }\n\n var _propertyGroup = propertyGroupFactory(interfaceFunction, propertyGroup);\n\n interfaceFunction.propertyIndex = shape.ix;\n var prop = view.sh.ty === 'tm' ? view.sh.prop : view.sh;\n prop.s.setGroupProperty(PropertyInterface('Size', _propertyGroup));\n prop.p.setGroupProperty(PropertyInterface('Position', _propertyGroup));\n Object.defineProperties(interfaceFunction, {\n size: {\n get: ExpressionPropertyInterface(prop.s)\n },\n position: {\n get: ExpressionPropertyInterface(prop.p)\n },\n _name: {\n value: shape.nm\n }\n });\n interfaceFunction.mn = shape.mn;\n return interfaceFunction;\n }\n\n function starInterfaceFactory(shape, view, propertyGroup) {\n function interfaceFunction(value) {\n if (shape.p.ix === value) {\n return interfaceFunction.position;\n }\n\n if (shape.r.ix === value) {\n return interfaceFunction.rotation;\n }\n\n if (shape.pt.ix === value) {\n return interfaceFunction.points;\n }\n\n if (shape.or.ix === value || value === 'ADBE Vector Star Outer Radius') {\n return interfaceFunction.outerRadius;\n }\n\n if (shape.os.ix === value) {\n return interfaceFunction.outerRoundness;\n }\n\n if (shape.ir && (shape.ir.ix === value || value === 'ADBE Vector Star Inner Radius')) {\n return interfaceFunction.innerRadius;\n }\n\n if (shape.is && shape.is.ix === value) {\n return interfaceFunction.innerRoundness;\n }\n\n return null;\n }\n\n var _propertyGroup = propertyGroupFactory(interfaceFunction, propertyGroup);\n\n var prop = view.sh.ty === 'tm' ? view.sh.prop : view.sh;\n interfaceFunction.propertyIndex = shape.ix;\n prop.or.setGroupProperty(PropertyInterface('Outer Radius', _propertyGroup));\n prop.os.setGroupProperty(PropertyInterface('Outer Roundness', _propertyGroup));\n prop.pt.setGroupProperty(PropertyInterface('Points', _propertyGroup));\n prop.p.setGroupProperty(PropertyInterface('Position', _propertyGroup));\n prop.r.setGroupProperty(PropertyInterface('Rotation', _propertyGroup));\n\n if (shape.ir) {\n prop.ir.setGroupProperty(PropertyInterface('Inner Radius', _propertyGroup));\n prop.is.setGroupProperty(PropertyInterface('Inner Roundness', _propertyGroup));\n }\n\n Object.defineProperties(interfaceFunction, {\n position: {\n get: ExpressionPropertyInterface(prop.p)\n },\n rotation: {\n get: ExpressionPropertyInterface(prop.r)\n },\n points: {\n get: ExpressionPropertyInterface(prop.pt)\n },\n outerRadius: {\n get: ExpressionPropertyInterface(prop.or)\n },\n outerRoundness: {\n get: ExpressionPropertyInterface(prop.os)\n },\n innerRadius: {\n get: ExpressionPropertyInterface(prop.ir)\n },\n innerRoundness: {\n get: ExpressionPropertyInterface(prop.is)\n },\n _name: {\n value: shape.nm\n }\n });\n interfaceFunction.mn = shape.mn;\n return interfaceFunction;\n }\n\n function rectInterfaceFactory(shape, view, propertyGroup) {\n function interfaceFunction(value) {\n if (shape.p.ix === value) {\n return interfaceFunction.position;\n }\n\n if (shape.r.ix === value) {\n return interfaceFunction.roundness;\n }\n\n if (shape.s.ix === value || value === 'Size' || value === 'ADBE Vector Rect Size') {\n return interfaceFunction.size;\n }\n\n return null;\n }\n\n var _propertyGroup = propertyGroupFactory(interfaceFunction, propertyGroup);\n\n var prop = view.sh.ty === 'tm' ? view.sh.prop : view.sh;\n interfaceFunction.propertyIndex = shape.ix;\n prop.p.setGroupProperty(PropertyInterface('Position', _propertyGroup));\n prop.s.setGroupProperty(PropertyInterface('Size', _propertyGroup));\n prop.r.setGroupProperty(PropertyInterface('Rotation', _propertyGroup));\n Object.defineProperties(interfaceFunction, {\n position: {\n get: ExpressionPropertyInterface(prop.p)\n },\n roundness: {\n get: ExpressionPropertyInterface(prop.r)\n },\n size: {\n get: ExpressionPropertyInterface(prop.s)\n },\n _name: {\n value: shape.nm\n }\n });\n interfaceFunction.mn = shape.mn;\n return interfaceFunction;\n }\n\n function roundedInterfaceFactory(shape, view, propertyGroup) {\n function interfaceFunction(value) {\n if (shape.r.ix === value || value === 'Round Corners 1') {\n return interfaceFunction.radius;\n }\n\n return null;\n }\n\n var _propertyGroup = propertyGroupFactory(interfaceFunction, propertyGroup);\n\n var prop = view;\n interfaceFunction.propertyIndex = shape.ix;\n prop.rd.setGroupProperty(PropertyInterface('Radius', _propertyGroup));\n Object.defineProperties(interfaceFunction, {\n radius: {\n get: ExpressionPropertyInterface(prop.rd)\n },\n _name: {\n value: shape.nm\n }\n });\n interfaceFunction.mn = shape.mn;\n return interfaceFunction;\n }\n\n function repeaterInterfaceFactory(shape, view, propertyGroup) {\n function interfaceFunction(value) {\n if (shape.c.ix === value || value === 'Copies') {\n return interfaceFunction.copies;\n }\n\n if (shape.o.ix === value || value === 'Offset') {\n return interfaceFunction.offset;\n }\n\n return null;\n }\n\n var _propertyGroup = propertyGroupFactory(interfaceFunction, propertyGroup);\n\n var prop = view;\n interfaceFunction.propertyIndex = shape.ix;\n prop.c.setGroupProperty(PropertyInterface('Copies', _propertyGroup));\n prop.o.setGroupProperty(PropertyInterface('Offset', _propertyGroup));\n Object.defineProperties(interfaceFunction, {\n copies: {\n get: ExpressionPropertyInterface(prop.c)\n },\n offset: {\n get: ExpressionPropertyInterface(prop.o)\n },\n _name: {\n value: shape.nm\n }\n });\n interfaceFunction.mn = shape.mn;\n return interfaceFunction;\n }\n\n return function (shapes, view, propertyGroup) {\n var interfaces;\n\n function _interfaceFunction(value) {\n if (typeof value === 'number') {\n value = value === undefined ? 1 : value;\n\n if (value === 0) {\n return propertyGroup;\n }\n\n return interfaces[value - 1];\n }\n\n var i = 0;\n var len = interfaces.length;\n\n while (i < len) {\n if (interfaces[i]._name === value) {\n return interfaces[i];\n }\n\n i += 1;\n }\n\n return null;\n }\n\n function parentGroupWrapper() {\n return propertyGroup;\n }\n\n _interfaceFunction.propertyGroup = propertyGroupFactory(_interfaceFunction, parentGroupWrapper);\n interfaces = iterateElements(shapes, view, _interfaceFunction.propertyGroup);\n _interfaceFunction.numProperties = interfaces.length;\n _interfaceFunction._name = 'Contents';\n return _interfaceFunction;\n };\n }();\n\n var TextExpressionInterface = function () {\n return function (elem) {\n var _sourceText;\n\n function _thisLayerFunction(name) {\n switch (name) {\n case 'ADBE Text Document':\n return _thisLayerFunction.sourceText;\n\n default:\n return null;\n }\n }\n\n Object.defineProperty(_thisLayerFunction, 'sourceText', {\n get: function get() {\n elem.textProperty.getValue();\n var stringValue = elem.textProperty.currentData.t;\n\n if (!_sourceText || stringValue !== _sourceText.value) {\n _sourceText = new String(stringValue); // eslint-disable-line no-new-wrappers\n // If stringValue is an empty string, eval returns undefined, so it has to be returned as a String primitive\n\n _sourceText.value = stringValue || new String(stringValue); // eslint-disable-line no-new-wrappers\n\n Object.defineProperty(_sourceText, 'style', {\n get: function get() {\n return {\n fillColor: elem.textProperty.currentData.fc\n };\n }\n });\n }\n\n return _sourceText;\n }\n });\n return _thisLayerFunction;\n };\n }();\n\n function _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n var FootageInterface = function () {\n var outlineInterfaceFactory = function outlineInterfaceFactory(elem) {\n var currentPropertyName = '';\n var currentProperty = elem.getFootageData();\n\n function init() {\n currentPropertyName = '';\n currentProperty = elem.getFootageData();\n return searchProperty;\n }\n\n function searchProperty(value) {\n if (currentProperty[value]) {\n currentPropertyName = value;\n currentProperty = currentProperty[value];\n\n if (_typeof(currentProperty) === 'object') {\n return searchProperty;\n }\n\n return currentProperty;\n }\n\n var propertyNameIndex = value.indexOf(currentPropertyName);\n\n if (propertyNameIndex !== -1) {\n var index = parseInt(value.substr(propertyNameIndex + currentPropertyName.length), 10);\n currentProperty = currentProperty[index];\n\n if (_typeof(currentProperty) === 'object') {\n return searchProperty;\n }\n\n return currentProperty;\n }\n\n return '';\n }\n\n return init;\n };\n\n var dataInterfaceFactory = function dataInterfaceFactory(elem) {\n function interfaceFunction(value) {\n if (value === 'Outline') {\n return interfaceFunction.outlineInterface();\n }\n\n return null;\n }\n\n interfaceFunction._name = 'Outline';\n interfaceFunction.outlineInterface = outlineInterfaceFactory(elem);\n return interfaceFunction;\n };\n\n return function (elem) {\n function _interfaceFunction(value) {\n if (value === 'Data') {\n return _interfaceFunction.dataInterface;\n }\n\n return null;\n }\n\n _interfaceFunction._name = 'Data';\n _interfaceFunction.dataInterface = dataInterfaceFactory(elem);\n return _interfaceFunction;\n };\n }();\n\n var interfaces = {\n layer: LayerExpressionInterface,\n effects: EffectsExpressionInterface,\n comp: CompExpressionInterface,\n shape: ShapeExpressionInterface,\n text: TextExpressionInterface,\n footage: FootageInterface\n };\n\n function getInterface(type) {\n return interfaces[type] || null;\n }\n\n var expressionHelpers = function () {\n function searchExpressions(elem, data, prop) {\n if (data.x) {\n prop.k = true;\n prop.x = true;\n prop.initiateExpression = ExpressionManager.initiateExpression;\n prop.effectsSequence.push(prop.initiateExpression(elem, data, prop).bind(prop));\n }\n }\n\n function getValueAtTime(frameNum) {\n frameNum *= this.elem.globalData.frameRate;\n frameNum -= this.offsetTime;\n\n if (frameNum !== this._cachingAtTime.lastFrame) {\n this._cachingAtTime.lastIndex = this._cachingAtTime.lastFrame < frameNum ? this._cachingAtTime.lastIndex : 0;\n this._cachingAtTime.value = this.interpolateValue(frameNum, this._cachingAtTime);\n this._cachingAtTime.lastFrame = frameNum;\n }\n\n return this._cachingAtTime.value;\n }\n\n function getSpeedAtTime(frameNum) {\n var delta = -0.01;\n var v1 = this.getValueAtTime(frameNum);\n var v2 = this.getValueAtTime(frameNum + delta);\n var speed = 0;\n\n if (v1.length) {\n var i;\n\n for (i = 0; i < v1.length; i += 1) {\n speed += Math.pow(v2[i] - v1[i], 2);\n }\n\n speed = Math.sqrt(speed) * 100;\n } else {\n speed = 0;\n }\n\n return speed;\n }\n\n function getVelocityAtTime(frameNum) {\n if (this.vel !== undefined) {\n return this.vel;\n }\n\n var delta = -0.001; // frameNum += this.elem.data.st;\n\n var v1 = this.getValueAtTime(frameNum);\n var v2 = this.getValueAtTime(frameNum + delta);\n var velocity;\n\n if (v1.length) {\n velocity = createTypedArray('float32', v1.length);\n var i;\n\n for (i = 0; i < v1.length; i += 1) {\n // removing frameRate\n // if needed, don't add it here\n // velocity[i] = this.elem.globalData.frameRate*((v2[i] - v1[i])/delta);\n velocity[i] = (v2[i] - v1[i]) / delta;\n }\n } else {\n velocity = (v2 - v1) / delta;\n }\n\n return velocity;\n }\n\n function getStaticValueAtTime() {\n return this.pv;\n }\n\n function setGroupProperty(propertyGroup) {\n this.propertyGroup = propertyGroup;\n }\n\n return {\n searchExpressions: searchExpressions,\n getSpeedAtTime: getSpeedAtTime,\n getVelocityAtTime: getVelocityAtTime,\n getValueAtTime: getValueAtTime,\n getStaticValueAtTime: getStaticValueAtTime,\n setGroupProperty: setGroupProperty\n };\n }();\n\n function addPropertyDecorator() {\n function loopOut(type, duration, durationFlag) {\n if (!this.k || !this.keyframes) {\n return this.pv;\n }\n\n type = type ? type.toLowerCase() : '';\n var currentFrame = this.comp.renderedFrame;\n var keyframes = this.keyframes;\n var lastKeyFrame = keyframes[keyframes.length - 1].t;\n\n if (currentFrame <= lastKeyFrame) {\n return this.pv;\n }\n\n var cycleDuration;\n var firstKeyFrame;\n\n if (!durationFlag) {\n if (!duration || duration > keyframes.length - 1) {\n duration = keyframes.length - 1;\n }\n\n firstKeyFrame = keyframes[keyframes.length - 1 - duration].t;\n cycleDuration = lastKeyFrame - firstKeyFrame;\n } else {\n if (!duration) {\n cycleDuration = Math.max(0, lastKeyFrame - this.elem.data.ip);\n } else {\n cycleDuration = Math.abs(lastKeyFrame - this.elem.comp.globalData.frameRate * duration);\n }\n\n firstKeyFrame = lastKeyFrame - cycleDuration;\n }\n\n var i;\n var len;\n var ret;\n\n if (type === 'pingpong') {\n var iterations = Math.floor((currentFrame - firstKeyFrame) / cycleDuration);\n\n if (iterations % 2 !== 0) {\n return this.getValueAtTime((cycleDuration - (currentFrame - firstKeyFrame) % cycleDuration + firstKeyFrame) / this.comp.globalData.frameRate, 0); // eslint-disable-line\n }\n } else if (type === 'offset') {\n var initV = this.getValueAtTime(firstKeyFrame / this.comp.globalData.frameRate, 0);\n var endV = this.getValueAtTime(lastKeyFrame / this.comp.globalData.frameRate, 0);\n var current = this.getValueAtTime(((currentFrame - firstKeyFrame) % cycleDuration + firstKeyFrame) / this.comp.globalData.frameRate, 0); // eslint-disable-line\n\n var repeats = Math.floor((currentFrame - firstKeyFrame) / cycleDuration);\n\n if (this.pv.length) {\n ret = new Array(initV.length);\n len = ret.length;\n\n for (i = 0; i < len; i += 1) {\n ret[i] = (endV[i] - initV[i]) * repeats + current[i];\n }\n\n return ret;\n }\n\n return (endV - initV) * repeats + current;\n } else if (type === 'continue') {\n var lastValue = this.getValueAtTime(lastKeyFrame / this.comp.globalData.frameRate, 0);\n var nextLastValue = this.getValueAtTime((lastKeyFrame - 0.001) / this.comp.globalData.frameRate, 0);\n\n if (this.pv.length) {\n ret = new Array(lastValue.length);\n len = ret.length;\n\n for (i = 0; i < len; i += 1) {\n ret[i] = lastValue[i] + (lastValue[i] - nextLastValue[i]) * ((currentFrame - lastKeyFrame) / this.comp.globalData.frameRate) / 0.0005; // eslint-disable-line\n }\n\n return ret;\n }\n\n return lastValue + (lastValue - nextLastValue) * ((currentFrame - lastKeyFrame) / 0.001);\n }\n\n return this.getValueAtTime(((currentFrame - firstKeyFrame) % cycleDuration + firstKeyFrame) / this.comp.globalData.frameRate, 0); // eslint-disable-line\n }\n\n function loopIn(type, duration, durationFlag) {\n if (!this.k) {\n return this.pv;\n }\n\n type = type ? type.toLowerCase() : '';\n var currentFrame = this.comp.renderedFrame;\n var keyframes = this.keyframes;\n var firstKeyFrame = keyframes[0].t;\n\n if (currentFrame >= firstKeyFrame) {\n return this.pv;\n }\n\n var cycleDuration;\n var lastKeyFrame;\n\n if (!durationFlag) {\n if (!duration || duration > keyframes.length - 1) {\n duration = keyframes.length - 1;\n }\n\n lastKeyFrame = keyframes[duration].t;\n cycleDuration = lastKeyFrame - firstKeyFrame;\n } else {\n if (!duration) {\n cycleDuration = Math.max(0, this.elem.data.op - firstKeyFrame);\n } else {\n cycleDuration = Math.abs(this.elem.comp.globalData.frameRate * duration);\n }\n\n lastKeyFrame = firstKeyFrame + cycleDuration;\n }\n\n var i;\n var len;\n var ret;\n\n if (type === 'pingpong') {\n var iterations = Math.floor((firstKeyFrame - currentFrame) / cycleDuration);\n\n if (iterations % 2 === 0) {\n return this.getValueAtTime(((firstKeyFrame - currentFrame) % cycleDuration + firstKeyFrame) / this.comp.globalData.frameRate, 0); // eslint-disable-line\n }\n } else if (type === 'offset') {\n var initV = this.getValueAtTime(firstKeyFrame / this.comp.globalData.frameRate, 0);\n var endV = this.getValueAtTime(lastKeyFrame / this.comp.globalData.frameRate, 0);\n var current = this.getValueAtTime((cycleDuration - (firstKeyFrame - currentFrame) % cycleDuration + firstKeyFrame) / this.comp.globalData.frameRate, 0);\n var repeats = Math.floor((firstKeyFrame - currentFrame) / cycleDuration) + 1;\n\n if (this.pv.length) {\n ret = new Array(initV.length);\n len = ret.length;\n\n for (i = 0; i < len; i += 1) {\n ret[i] = current[i] - (endV[i] - initV[i]) * repeats;\n }\n\n return ret;\n }\n\n return current - (endV - initV) * repeats;\n } else if (type === 'continue') {\n var firstValue = this.getValueAtTime(firstKeyFrame / this.comp.globalData.frameRate, 0);\n var nextFirstValue = this.getValueAtTime((firstKeyFrame + 0.001) / this.comp.globalData.frameRate, 0);\n\n if (this.pv.length) {\n ret = new Array(firstValue.length);\n len = ret.length;\n\n for (i = 0; i < len; i += 1) {\n ret[i] = firstValue[i] + (firstValue[i] - nextFirstValue[i]) * (firstKeyFrame - currentFrame) / 0.001;\n }\n\n return ret;\n }\n\n return firstValue + (firstValue - nextFirstValue) * (firstKeyFrame - currentFrame) / 0.001;\n }\n\n return this.getValueAtTime((cycleDuration - ((firstKeyFrame - currentFrame) % cycleDuration + firstKeyFrame)) / this.comp.globalData.frameRate, 0); // eslint-disable-line\n }\n\n function smooth(width, samples) {\n if (!this.k) {\n return this.pv;\n }\n\n width = (width || 0.4) * 0.5;\n samples = Math.floor(samples || 5);\n\n if (samples <= 1) {\n return this.pv;\n }\n\n var currentTime = this.comp.renderedFrame / this.comp.globalData.frameRate;\n var initFrame = currentTime - width;\n var endFrame = currentTime + width;\n var sampleFrequency = samples > 1 ? (endFrame - initFrame) / (samples - 1) : 1;\n var i = 0;\n var j = 0;\n var value;\n\n if (this.pv.length) {\n value = createTypedArray('float32', this.pv.length);\n } else {\n value = 0;\n }\n\n var sampleValue;\n\n while (i < samples) {\n sampleValue = this.getValueAtTime(initFrame + i * sampleFrequency);\n\n if (this.pv.length) {\n for (j = 0; j < this.pv.length; j += 1) {\n value[j] += sampleValue[j];\n }\n } else {\n value += sampleValue;\n }\n\n i += 1;\n }\n\n if (this.pv.length) {\n for (j = 0; j < this.pv.length; j += 1) {\n value[j] /= samples;\n }\n } else {\n value /= samples;\n }\n\n return value;\n }\n\n function getTransformValueAtTime(time) {\n if (!this._transformCachingAtTime) {\n this._transformCachingAtTime = {\n v: new Matrix()\n };\n } /// /\n\n\n var matrix = this._transformCachingAtTime.v;\n matrix.cloneFromProps(this.pre.props);\n\n if (this.appliedTransformations < 1) {\n var anchor = this.a.getValueAtTime(time);\n matrix.translate(-anchor[0] * this.a.mult, -anchor[1] * this.a.mult, anchor[2] * this.a.mult);\n }\n\n if (this.appliedTransformations < 2) {\n var scale = this.s.getValueAtTime(time);\n matrix.scale(scale[0] * this.s.mult, scale[1] * this.s.mult, scale[2] * this.s.mult);\n }\n\n if (this.sk && this.appliedTransformations < 3) {\n var skew = this.sk.getValueAtTime(time);\n var skewAxis = this.sa.getValueAtTime(time);\n matrix.skewFromAxis(-skew * this.sk.mult, skewAxis * this.sa.mult);\n }\n\n if (this.r && this.appliedTransformations < 4) {\n var rotation = this.r.getValueAtTime(time);\n matrix.rotate(-rotation * this.r.mult);\n } else if (!this.r && this.appliedTransformations < 4) {\n var rotationZ = this.rz.getValueAtTime(time);\n var rotationY = this.ry.getValueAtTime(time);\n var rotationX = this.rx.getValueAtTime(time);\n var orientation = this.or.getValueAtTime(time);\n matrix.rotateZ(-rotationZ * this.rz.mult).rotateY(rotationY * this.ry.mult).rotateX(rotationX * this.rx.mult).rotateZ(-orientation[2] * this.or.mult).rotateY(orientation[1] * this.or.mult).rotateX(orientation[0] * this.or.mult);\n }\n\n if (this.data.p && this.data.p.s) {\n var positionX = this.px.getValueAtTime(time);\n var positionY = this.py.getValueAtTime(time);\n\n if (this.data.p.z) {\n var positionZ = this.pz.getValueAtTime(time);\n matrix.translate(positionX * this.px.mult, positionY * this.py.mult, -positionZ * this.pz.mult);\n } else {\n matrix.translate(positionX * this.px.mult, positionY * this.py.mult, 0);\n }\n } else {\n var position = this.p.getValueAtTime(time);\n matrix.translate(position[0] * this.p.mult, position[1] * this.p.mult, -position[2] * this.p.mult);\n }\n\n return matrix; /// /\n }\n\n function getTransformStaticValueAtTime() {\n return this.v.clone(new Matrix());\n }\n\n var getTransformProperty = TransformPropertyFactory.getTransformProperty;\n\n TransformPropertyFactory.getTransformProperty = function (elem, data, container) {\n var prop = getTransformProperty(elem, data, container);\n\n if (prop.dynamicProperties.length) {\n prop.getValueAtTime = getTransformValueAtTime.bind(prop);\n } else {\n prop.getValueAtTime = getTransformStaticValueAtTime.bind(prop);\n }\n\n prop.setGroupProperty = expressionHelpers.setGroupProperty;\n return prop;\n };\n\n var propertyGetProp = PropertyFactory.getProp;\n\n PropertyFactory.getProp = function (elem, data, type, mult, container) {\n var prop = propertyGetProp(elem, data, type, mult, container); // prop.getVelocityAtTime = getVelocityAtTime;\n // prop.loopOut = loopOut;\n // prop.loopIn = loopIn;\n\n if (prop.kf) {\n prop.getValueAtTime = expressionHelpers.getValueAtTime.bind(prop);\n } else {\n prop.getValueAtTime = expressionHelpers.getStaticValueAtTime.bind(prop);\n }\n\n prop.setGroupProperty = expressionHelpers.setGroupProperty;\n prop.loopOut = loopOut;\n prop.loopIn = loopIn;\n prop.smooth = smooth;\n prop.getVelocityAtTime = expressionHelpers.getVelocityAtTime.bind(prop);\n prop.getSpeedAtTime = expressionHelpers.getSpeedAtTime.bind(prop);\n prop.numKeys = data.a === 1 ? data.k.length : 0;\n prop.propertyIndex = data.ix;\n var value = 0;\n\n if (type !== 0) {\n value = createTypedArray('float32', data.a === 1 ? data.k[0].s.length : data.k.length);\n }\n\n prop._cachingAtTime = {\n lastFrame: initialDefaultFrame,\n lastIndex: 0,\n value: value\n };\n expressionHelpers.searchExpressions(elem, data, prop);\n\n if (prop.k) {\n container.addDynamicProperty(prop);\n }\n\n return prop;\n };\n\n function getShapeValueAtTime(frameNum) {\n // For now this caching object is created only when needed instead of creating it when the shape is initialized.\n if (!this._cachingAtTime) {\n this._cachingAtTime = {\n shapeValue: shapePool.clone(this.pv),\n lastIndex: 0,\n lastTime: initialDefaultFrame\n };\n }\n\n frameNum *= this.elem.globalData.frameRate;\n frameNum -= this.offsetTime;\n\n if (frameNum !== this._cachingAtTime.lastTime) {\n this._cachingAtTime.lastIndex = this._cachingAtTime.lastTime < frameNum ? this._caching.lastIndex : 0;\n this._cachingAtTime.lastTime = frameNum;\n this.interpolateShape(frameNum, this._cachingAtTime.shapeValue, this._cachingAtTime);\n }\n\n return this._cachingAtTime.shapeValue;\n }\n\n var ShapePropertyConstructorFunction = ShapePropertyFactory.getConstructorFunction();\n var KeyframedShapePropertyConstructorFunction = ShapePropertyFactory.getKeyframedConstructorFunction();\n\n function ShapeExpressions() {}\n\n ShapeExpressions.prototype = {\n vertices: function vertices(prop, time) {\n if (this.k) {\n this.getValue();\n }\n\n var shapePath = this.v;\n\n if (time !== undefined) {\n shapePath = this.getValueAtTime(time, 0);\n }\n\n var i;\n var len = shapePath._length;\n var vertices = shapePath[prop];\n var points = shapePath.v;\n var arr = createSizedArray(len);\n\n for (i = 0; i < len; i += 1) {\n if (prop === 'i' || prop === 'o') {\n arr[i] = [vertices[i][0] - points[i][0], vertices[i][1] - points[i][1]];\n } else {\n arr[i] = [vertices[i][0], vertices[i][1]];\n }\n }\n\n return arr;\n },\n points: function points(time) {\n return this.vertices('v', time);\n },\n inTangents: function inTangents(time) {\n return this.vertices('i', time);\n },\n outTangents: function outTangents(time) {\n return this.vertices('o', time);\n },\n isClosed: function isClosed() {\n return this.v.c;\n },\n pointOnPath: function pointOnPath(perc, time) {\n var shapePath = this.v;\n\n if (time !== undefined) {\n shapePath = this.getValueAtTime(time, 0);\n }\n\n if (!this._segmentsLength) {\n this._segmentsLength = bez.getSegmentsLength(shapePath);\n }\n\n var segmentsLength = this._segmentsLength;\n var lengths = segmentsLength.lengths;\n var lengthPos = segmentsLength.totalLength * perc;\n var i = 0;\n var len = lengths.length;\n var accumulatedLength = 0;\n var pt;\n\n while (i < len) {\n if (accumulatedLength + lengths[i].addedLength > lengthPos) {\n var initIndex = i;\n var endIndex = shapePath.c && i === len - 1 ? 0 : i + 1;\n var segmentPerc = (lengthPos - accumulatedLength) / lengths[i].addedLength;\n pt = bez.getPointInSegment(shapePath.v[initIndex], shapePath.v[endIndex], shapePath.o[initIndex], shapePath.i[endIndex], segmentPerc, lengths[i]);\n break;\n } else {\n accumulatedLength += lengths[i].addedLength;\n }\n\n i += 1;\n }\n\n if (!pt) {\n pt = shapePath.c ? [shapePath.v[0][0], shapePath.v[0][1]] : [shapePath.v[shapePath._length - 1][0], shapePath.v[shapePath._length - 1][1]];\n }\n\n return pt;\n },\n vectorOnPath: function vectorOnPath(perc, time, vectorType) {\n // perc doesn't use triple equality because it can be a Number object as well as a primitive.\n if (perc == 1) {\n // eslint-disable-line eqeqeq\n perc = this.v.c;\n } else if (perc == 0) {\n // eslint-disable-line eqeqeq\n perc = 0.999;\n }\n\n var pt1 = this.pointOnPath(perc, time);\n var pt2 = this.pointOnPath(perc + 0.001, time);\n var xLength = pt2[0] - pt1[0];\n var yLength = pt2[1] - pt1[1];\n var magnitude = Math.sqrt(Math.pow(xLength, 2) + Math.pow(yLength, 2));\n\n if (magnitude === 0) {\n return [0, 0];\n }\n\n var unitVector = vectorType === 'tangent' ? [xLength / magnitude, yLength / magnitude] : [-yLength / magnitude, xLength / magnitude];\n return unitVector;\n },\n tangentOnPath: function tangentOnPath(perc, time) {\n return this.vectorOnPath(perc, time, 'tangent');\n },\n normalOnPath: function normalOnPath(perc, time) {\n return this.vectorOnPath(perc, time, 'normal');\n },\n setGroupProperty: expressionHelpers.setGroupProperty,\n getValueAtTime: expressionHelpers.getStaticValueAtTime\n };\n extendPrototype([ShapeExpressions], ShapePropertyConstructorFunction);\n extendPrototype([ShapeExpressions], KeyframedShapePropertyConstructorFunction);\n KeyframedShapePropertyConstructorFunction.prototype.getValueAtTime = getShapeValueAtTime;\n KeyframedShapePropertyConstructorFunction.prototype.initiateExpression = ExpressionManager.initiateExpression;\n var propertyGetShapeProp = ShapePropertyFactory.getShapeProp;\n\n ShapePropertyFactory.getShapeProp = function (elem, data, type, arr, trims) {\n var prop = propertyGetShapeProp(elem, data, type, arr, trims);\n prop.propertyIndex = data.ix;\n prop.lock = false;\n\n if (type === 3) {\n expressionHelpers.searchExpressions(elem, data.pt, prop);\n } else if (type === 4) {\n expressionHelpers.searchExpressions(elem, data.ks, prop);\n }\n\n if (prop.k) {\n elem.addDynamicProperty(prop);\n }\n\n return prop;\n };\n }\n\n function initialize$1() {\n addPropertyDecorator();\n }\n\n function addDecorator() {\n function searchExpressions() {\n if (this.data.d.x) {\n this.calculateExpression = ExpressionManager.initiateExpression.bind(this)(this.elem, this.data.d, this);\n this.addEffect(this.getExpressionValue.bind(this));\n return true;\n }\n\n return null;\n }\n\n TextProperty.prototype.getExpressionValue = function (currentValue, text) {\n var newValue = this.calculateExpression(text);\n\n if (currentValue.t !== newValue) {\n var newData = {};\n this.copyData(newData, currentValue);\n newData.t = newValue.toString();\n newData.__complete = false;\n return newData;\n }\n\n return currentValue;\n };\n\n TextProperty.prototype.searchProperty = function () {\n var isKeyframed = this.searchKeyframes();\n var hasExpressions = this.searchExpressions();\n this.kf = isKeyframed || hasExpressions;\n return this.kf;\n };\n\n TextProperty.prototype.searchExpressions = searchExpressions;\n }\n\n function initialize() {\n addDecorator();\n }\n\n function SVGComposableEffect() {}\n\n SVGComposableEffect.prototype = {\n createMergeNode: function createMergeNode(resultId, ins) {\n var feMerge = createNS('feMerge');\n feMerge.setAttribute('result', resultId);\n var feMergeNode;\n var i;\n\n for (i = 0; i < ins.length; i += 1) {\n feMergeNode = createNS('feMergeNode');\n feMergeNode.setAttribute('in', ins[i]);\n feMerge.appendChild(feMergeNode);\n feMerge.appendChild(feMergeNode);\n }\n\n return feMerge;\n }\n };\n\n var linearFilterValue = '0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0';\n\n function SVGTintFilter(filter, filterManager, elem, id, source) {\n this.filterManager = filterManager;\n var feColorMatrix = createNS('feColorMatrix');\n feColorMatrix.setAttribute('type', 'matrix');\n feColorMatrix.setAttribute('color-interpolation-filters', 'linearRGB');\n feColorMatrix.setAttribute('values', linearFilterValue + ' 1 0');\n this.linearFilter = feColorMatrix;\n feColorMatrix.setAttribute('result', id + '_tint_1');\n filter.appendChild(feColorMatrix);\n feColorMatrix = createNS('feColorMatrix');\n feColorMatrix.setAttribute('type', 'matrix');\n feColorMatrix.setAttribute('color-interpolation-filters', 'sRGB');\n feColorMatrix.setAttribute('values', '1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0');\n feColorMatrix.setAttribute('result', id + '_tint_2');\n filter.appendChild(feColorMatrix);\n this.matrixFilter = feColorMatrix;\n var feMerge = this.createMergeNode(id, [source, id + '_tint_1', id + '_tint_2']);\n filter.appendChild(feMerge);\n }\n\n extendPrototype([SVGComposableEffect], SVGTintFilter);\n\n SVGTintFilter.prototype.renderFrame = function (forceRender) {\n if (forceRender || this.filterManager._mdf) {\n var colorBlack = this.filterManager.effectElements[0].p.v;\n var colorWhite = this.filterManager.effectElements[1].p.v;\n var opacity = this.filterManager.effectElements[2].p.v / 100;\n this.linearFilter.setAttribute('values', linearFilterValue + ' ' + opacity + ' 0');\n this.matrixFilter.setAttribute('values', colorWhite[0] - colorBlack[0] + ' 0 0 0 ' + colorBlack[0] + ' ' + (colorWhite[1] - colorBlack[1]) + ' 0 0 0 ' + colorBlack[1] + ' ' + (colorWhite[2] - colorBlack[2]) + ' 0 0 0 ' + colorBlack[2] + ' 0 0 0 1 0');\n }\n };\n\n function SVGFillFilter(filter, filterManager, elem, id) {\n this.filterManager = filterManager;\n var feColorMatrix = createNS('feColorMatrix');\n feColorMatrix.setAttribute('type', 'matrix');\n feColorMatrix.setAttribute('color-interpolation-filters', 'sRGB');\n feColorMatrix.setAttribute('values', '1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0');\n feColorMatrix.setAttribute('result', id);\n filter.appendChild(feColorMatrix);\n this.matrixFilter = feColorMatrix;\n }\n\n SVGFillFilter.prototype.renderFrame = function (forceRender) {\n if (forceRender || this.filterManager._mdf) {\n var color = this.filterManager.effectElements[2].p.v;\n var opacity = this.filterManager.effectElements[6].p.v;\n this.matrixFilter.setAttribute('values', '0 0 0 0 ' + color[0] + ' 0 0 0 0 ' + color[1] + ' 0 0 0 0 ' + color[2] + ' 0 0 0 ' + opacity + ' 0');\n }\n };\n\n function SVGStrokeEffect(fil, filterManager, elem) {\n this.initialized = false;\n this.filterManager = filterManager;\n this.elem = elem;\n this.paths = [];\n }\n\n SVGStrokeEffect.prototype.initialize = function () {\n var elemChildren = this.elem.layerElement.children || this.elem.layerElement.childNodes;\n var path;\n var groupPath;\n var i;\n var len;\n\n if (this.filterManager.effectElements[1].p.v === 1) {\n len = this.elem.maskManager.masksProperties.length;\n i = 0;\n } else {\n i = this.filterManager.effectElements[0].p.v - 1;\n len = i + 1;\n }\n\n groupPath = createNS('g');\n groupPath.setAttribute('fill', 'none');\n groupPath.setAttribute('stroke-linecap', 'round');\n groupPath.setAttribute('stroke-dashoffset', 1);\n\n for (i; i < len; i += 1) {\n path = createNS('path');\n groupPath.appendChild(path);\n this.paths.push({\n p: path,\n m: i\n });\n }\n\n if (this.filterManager.effectElements[10].p.v === 3) {\n var mask = createNS('mask');\n var id = createElementID();\n mask.setAttribute('id', id);\n mask.setAttribute('mask-type', 'alpha');\n mask.appendChild(groupPath);\n this.elem.globalData.defs.appendChild(mask);\n var g = createNS('g');\n g.setAttribute('mask', 'url(' + getLocationHref() + '#' + id + ')');\n\n while (elemChildren[0]) {\n g.appendChild(elemChildren[0]);\n }\n\n this.elem.layerElement.appendChild(g);\n this.masker = mask;\n groupPath.setAttribute('stroke', '#fff');\n } else if (this.filterManager.effectElements[10].p.v === 1 || this.filterManager.effectElements[10].p.v === 2) {\n if (this.filterManager.effectElements[10].p.v === 2) {\n elemChildren = this.elem.layerElement.children || this.elem.layerElement.childNodes;\n\n while (elemChildren.length) {\n this.elem.layerElement.removeChild(elemChildren[0]);\n }\n }\n\n this.elem.layerElement.appendChild(groupPath);\n this.elem.layerElement.removeAttribute('mask');\n groupPath.setAttribute('stroke', '#fff');\n }\n\n this.initialized = true;\n this.pathMasker = groupPath;\n };\n\n SVGStrokeEffect.prototype.renderFrame = function (forceRender) {\n if (!this.initialized) {\n this.initialize();\n }\n\n var i;\n var len = this.paths.length;\n var mask;\n var path;\n\n for (i = 0; i < len; i += 1) {\n if (this.paths[i].m !== -1) {\n mask = this.elem.maskManager.viewData[this.paths[i].m];\n path = this.paths[i].p;\n\n if (forceRender || this.filterManager._mdf || mask.prop._mdf) {\n path.setAttribute('d', mask.lastPath);\n }\n\n if (forceRender || this.filterManager.effectElements[9].p._mdf || this.filterManager.effectElements[4].p._mdf || this.filterManager.effectElements[7].p._mdf || this.filterManager.effectElements[8].p._mdf || mask.prop._mdf) {\n var dasharrayValue;\n\n if (this.filterManager.effectElements[7].p.v !== 0 || this.filterManager.effectElements[8].p.v !== 100) {\n var s = Math.min(this.filterManager.effectElements[7].p.v, this.filterManager.effectElements[8].p.v) * 0.01;\n var e = Math.max(this.filterManager.effectElements[7].p.v, this.filterManager.effectElements[8].p.v) * 0.01;\n var l = path.getTotalLength();\n dasharrayValue = '0 0 0 ' + l * s + ' ';\n var lineLength = l * (e - s);\n var segment = 1 + this.filterManager.effectElements[4].p.v * 2 * this.filterManager.effectElements[9].p.v * 0.01;\n var units = Math.floor(lineLength / segment);\n var j;\n\n for (j = 0; j < units; j += 1) {\n dasharrayValue += '1 ' + this.filterManager.effectElements[4].p.v * 2 * this.filterManager.effectElements[9].p.v * 0.01 + ' ';\n }\n\n dasharrayValue += '0 ' + l * 10 + ' 0 0';\n } else {\n dasharrayValue = '1 ' + this.filterManager.effectElements[4].p.v * 2 * this.filterManager.effectElements[9].p.v * 0.01;\n }\n\n path.setAttribute('stroke-dasharray', dasharrayValue);\n }\n }\n }\n\n if (forceRender || this.filterManager.effectElements[4].p._mdf) {\n this.pathMasker.setAttribute('stroke-width', this.filterManager.effectElements[4].p.v * 2);\n }\n\n if (forceRender || this.filterManager.effectElements[6].p._mdf) {\n this.pathMasker.setAttribute('opacity', this.filterManager.effectElements[6].p.v);\n }\n\n if (this.filterManager.effectElements[10].p.v === 1 || this.filterManager.effectElements[10].p.v === 2) {\n if (forceRender || this.filterManager.effectElements[3].p._mdf) {\n var color = this.filterManager.effectElements[3].p.v;\n this.pathMasker.setAttribute('stroke', 'rgb(' + bmFloor(color[0] * 255) + ',' + bmFloor(color[1] * 255) + ',' + bmFloor(color[2] * 255) + ')');\n }\n }\n };\n\n function SVGTritoneFilter(filter, filterManager, elem, id) {\n this.filterManager = filterManager;\n var feColorMatrix = createNS('feColorMatrix');\n feColorMatrix.setAttribute('type', 'matrix');\n feColorMatrix.setAttribute('color-interpolation-filters', 'linearRGB');\n feColorMatrix.setAttribute('values', '0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0');\n filter.appendChild(feColorMatrix);\n var feComponentTransfer = createNS('feComponentTransfer');\n feComponentTransfer.setAttribute('color-interpolation-filters', 'sRGB');\n feComponentTransfer.setAttribute('result', id);\n this.matrixFilter = feComponentTransfer;\n var feFuncR = createNS('feFuncR');\n feFuncR.setAttribute('type', 'table');\n feComponentTransfer.appendChild(feFuncR);\n this.feFuncR = feFuncR;\n var feFuncG = createNS('feFuncG');\n feFuncG.setAttribute('type', 'table');\n feComponentTransfer.appendChild(feFuncG);\n this.feFuncG = feFuncG;\n var feFuncB = createNS('feFuncB');\n feFuncB.setAttribute('type', 'table');\n feComponentTransfer.appendChild(feFuncB);\n this.feFuncB = feFuncB;\n filter.appendChild(feComponentTransfer);\n }\n\n SVGTritoneFilter.prototype.renderFrame = function (forceRender) {\n if (forceRender || this.filterManager._mdf) {\n var color1 = this.filterManager.effectElements[0].p.v;\n var color2 = this.filterManager.effectElements[1].p.v;\n var color3 = this.filterManager.effectElements[2].p.v;\n var tableR = color3[0] + ' ' + color2[0] + ' ' + color1[0];\n var tableG = color3[1] + ' ' + color2[1] + ' ' + color1[1];\n var tableB = color3[2] + ' ' + color2[2] + ' ' + color1[2];\n this.feFuncR.setAttribute('tableValues', tableR);\n this.feFuncG.setAttribute('tableValues', tableG);\n this.feFuncB.setAttribute('tableValues', tableB);\n }\n };\n\n function SVGProLevelsFilter(filter, filterManager, elem, id) {\n this.filterManager = filterManager;\n var effectElements = this.filterManager.effectElements;\n var feComponentTransfer = createNS('feComponentTransfer'); // Red\n\n if (effectElements[10].p.k || effectElements[10].p.v !== 0 || effectElements[11].p.k || effectElements[11].p.v !== 1 || effectElements[12].p.k || effectElements[12].p.v !== 1 || effectElements[13].p.k || effectElements[13].p.v !== 0 || effectElements[14].p.k || effectElements[14].p.v !== 1) {\n this.feFuncR = this.createFeFunc('feFuncR', feComponentTransfer);\n } // Green\n\n\n if (effectElements[17].p.k || effectElements[17].p.v !== 0 || effectElements[18].p.k || effectElements[18].p.v !== 1 || effectElements[19].p.k || effectElements[19].p.v !== 1 || effectElements[20].p.k || effectElements[20].p.v !== 0 || effectElements[21].p.k || effectElements[21].p.v !== 1) {\n this.feFuncG = this.createFeFunc('feFuncG', feComponentTransfer);\n } // Blue\n\n\n if (effectElements[24].p.k || effectElements[24].p.v !== 0 || effectElements[25].p.k || effectElements[25].p.v !== 1 || effectElements[26].p.k || effectElements[26].p.v !== 1 || effectElements[27].p.k || effectElements[27].p.v !== 0 || effectElements[28].p.k || effectElements[28].p.v !== 1) {\n this.feFuncB = this.createFeFunc('feFuncB', feComponentTransfer);\n } // Alpha\n\n\n if (effectElements[31].p.k || effectElements[31].p.v !== 0 || effectElements[32].p.k || effectElements[32].p.v !== 1 || effectElements[33].p.k || effectElements[33].p.v !== 1 || effectElements[34].p.k || effectElements[34].p.v !== 0 || effectElements[35].p.k || effectElements[35].p.v !== 1) {\n this.feFuncA = this.createFeFunc('feFuncA', feComponentTransfer);\n } // RGB\n\n\n if (this.feFuncR || this.feFuncG || this.feFuncB || this.feFuncA) {\n feComponentTransfer.setAttribute('color-interpolation-filters', 'sRGB');\n filter.appendChild(feComponentTransfer);\n }\n\n if (effectElements[3].p.k || effectElements[3].p.v !== 0 || effectElements[4].p.k || effectElements[4].p.v !== 1 || effectElements[5].p.k || effectElements[5].p.v !== 1 || effectElements[6].p.k || effectElements[6].p.v !== 0 || effectElements[7].p.k || effectElements[7].p.v !== 1) {\n feComponentTransfer = createNS('feComponentTransfer');\n feComponentTransfer.setAttribute('color-interpolation-filters', 'sRGB');\n feComponentTransfer.setAttribute('result', id);\n filter.appendChild(feComponentTransfer);\n this.feFuncRComposed = this.createFeFunc('feFuncR', feComponentTransfer);\n this.feFuncGComposed = this.createFeFunc('feFuncG', feComponentTransfer);\n this.feFuncBComposed = this.createFeFunc('feFuncB', feComponentTransfer);\n }\n }\n\n SVGProLevelsFilter.prototype.createFeFunc = function (type, feComponentTransfer) {\n var feFunc = createNS(type);\n feFunc.setAttribute('type', 'table');\n feComponentTransfer.appendChild(feFunc);\n return feFunc;\n };\n\n SVGProLevelsFilter.prototype.getTableValue = function (inputBlack, inputWhite, gamma, outputBlack, outputWhite) {\n var cnt = 0;\n var segments = 256;\n var perc;\n var min = Math.min(inputBlack, inputWhite);\n var max = Math.max(inputBlack, inputWhite);\n var table = Array.call(null, {\n length: segments\n });\n var colorValue;\n var pos = 0;\n var outputDelta = outputWhite - outputBlack;\n var inputDelta = inputWhite - inputBlack;\n\n while (cnt <= 256) {\n perc = cnt / 256;\n\n if (perc <= min) {\n colorValue = inputDelta < 0 ? outputWhite : outputBlack;\n } else if (perc >= max) {\n colorValue = inputDelta < 0 ? outputBlack : outputWhite;\n } else {\n colorValue = outputBlack + outputDelta * Math.pow((perc - inputBlack) / inputDelta, 1 / gamma);\n }\n\n table[pos] = colorValue;\n pos += 1;\n cnt += 256 / (segments - 1);\n }\n\n return table.join(' ');\n };\n\n SVGProLevelsFilter.prototype.renderFrame = function (forceRender) {\n if (forceRender || this.filterManager._mdf) {\n var val;\n var effectElements = this.filterManager.effectElements;\n\n if (this.feFuncRComposed && (forceRender || effectElements[3].p._mdf || effectElements[4].p._mdf || effectElements[5].p._mdf || effectElements[6].p._mdf || effectElements[7].p._mdf)) {\n val = this.getTableValue(effectElements[3].p.v, effectElements[4].p.v, effectElements[5].p.v, effectElements[6].p.v, effectElements[7].p.v);\n this.feFuncRComposed.setAttribute('tableValues', val);\n this.feFuncGComposed.setAttribute('tableValues', val);\n this.feFuncBComposed.setAttribute('tableValues', val);\n }\n\n if (this.feFuncR && (forceRender || effectElements[10].p._mdf || effectElements[11].p._mdf || effectElements[12].p._mdf || effectElements[13].p._mdf || effectElements[14].p._mdf)) {\n val = this.getTableValue(effectElements[10].p.v, effectElements[11].p.v, effectElements[12].p.v, effectElements[13].p.v, effectElements[14].p.v);\n this.feFuncR.setAttribute('tableValues', val);\n }\n\n if (this.feFuncG && (forceRender || effectElements[17].p._mdf || effectElements[18].p._mdf || effectElements[19].p._mdf || effectElements[20].p._mdf || effectElements[21].p._mdf)) {\n val = this.getTableValue(effectElements[17].p.v, effectElements[18].p.v, effectElements[19].p.v, effectElements[20].p.v, effectElements[21].p.v);\n this.feFuncG.setAttribute('tableValues', val);\n }\n\n if (this.feFuncB && (forceRender || effectElements[24].p._mdf || effectElements[25].p._mdf || effectElements[26].p._mdf || effectElements[27].p._mdf || effectElements[28].p._mdf)) {\n val = this.getTableValue(effectElements[24].p.v, effectElements[25].p.v, effectElements[26].p.v, effectElements[27].p.v, effectElements[28].p.v);\n this.feFuncB.setAttribute('tableValues', val);\n }\n\n if (this.feFuncA && (forceRender || effectElements[31].p._mdf || effectElements[32].p._mdf || effectElements[33].p._mdf || effectElements[34].p._mdf || effectElements[35].p._mdf)) {\n val = this.getTableValue(effectElements[31].p.v, effectElements[32].p.v, effectElements[33].p.v, effectElements[34].p.v, effectElements[35].p.v);\n this.feFuncA.setAttribute('tableValues', val);\n }\n }\n };\n\n function SVGDropShadowEffect(filter, filterManager, elem, id, source) {\n var globalFilterSize = filterManager.container.globalData.renderConfig.filterSize;\n var filterSize = filterManager.data.fs || globalFilterSize;\n filter.setAttribute('x', filterSize.x || globalFilterSize.x);\n filter.setAttribute('y', filterSize.y || globalFilterSize.y);\n filter.setAttribute('width', filterSize.width || globalFilterSize.width);\n filter.setAttribute('height', filterSize.height || globalFilterSize.height);\n this.filterManager = filterManager;\n var feGaussianBlur = createNS('feGaussianBlur');\n feGaussianBlur.setAttribute('in', 'SourceAlpha');\n feGaussianBlur.setAttribute('result', id + '_drop_shadow_1');\n feGaussianBlur.setAttribute('stdDeviation', '0');\n this.feGaussianBlur = feGaussianBlur;\n filter.appendChild(feGaussianBlur);\n var feOffset = createNS('feOffset');\n feOffset.setAttribute('dx', '25');\n feOffset.setAttribute('dy', '0');\n feOffset.setAttribute('in', id + '_drop_shadow_1');\n feOffset.setAttribute('result', id + '_drop_shadow_2');\n this.feOffset = feOffset;\n filter.appendChild(feOffset);\n var feFlood = createNS('feFlood');\n feFlood.setAttribute('flood-color', '#00ff00');\n feFlood.setAttribute('flood-opacity', '1');\n feFlood.setAttribute('result', id + '_drop_shadow_3');\n this.feFlood = feFlood;\n filter.appendChild(feFlood);\n var feComposite = createNS('feComposite');\n feComposite.setAttribute('in', id + '_drop_shadow_3');\n feComposite.setAttribute('in2', id + '_drop_shadow_2');\n feComposite.setAttribute('operator', 'in');\n feComposite.setAttribute('result', id + '_drop_shadow_4');\n filter.appendChild(feComposite);\n var feMerge = this.createMergeNode(id, [id + '_drop_shadow_4', source]);\n filter.appendChild(feMerge); //\n }\n\n extendPrototype([SVGComposableEffect], SVGDropShadowEffect);\n\n SVGDropShadowEffect.prototype.renderFrame = function (forceRender) {\n if (forceRender || this.filterManager._mdf) {\n if (forceRender || this.filterManager.effectElements[4].p._mdf) {\n this.feGaussianBlur.setAttribute('stdDeviation', this.filterManager.effectElements[4].p.v / 4);\n }\n\n if (forceRender || this.filterManager.effectElements[0].p._mdf) {\n var col = this.filterManager.effectElements[0].p.v;\n this.feFlood.setAttribute('flood-color', rgbToHex(Math.round(col[0] * 255), Math.round(col[1] * 255), Math.round(col[2] * 255)));\n }\n\n if (forceRender || this.filterManager.effectElements[1].p._mdf) {\n this.feFlood.setAttribute('flood-opacity', this.filterManager.effectElements[1].p.v / 255);\n }\n\n if (forceRender || this.filterManager.effectElements[2].p._mdf || this.filterManager.effectElements[3].p._mdf) {\n var distance = this.filterManager.effectElements[3].p.v;\n var angle = (this.filterManager.effectElements[2].p.v - 90) * degToRads;\n var x = distance * Math.cos(angle);\n var y = distance * Math.sin(angle);\n this.feOffset.setAttribute('dx', x);\n this.feOffset.setAttribute('dy', y);\n }\n }\n };\n\n var _svgMatteSymbols = [];\n\n function SVGMatte3Effect(filterElem, filterManager, elem) {\n this.initialized = false;\n this.filterManager = filterManager;\n this.filterElem = filterElem;\n this.elem = elem;\n elem.matteElement = createNS('g');\n elem.matteElement.appendChild(elem.layerElement);\n elem.matteElement.appendChild(elem.transformedElement);\n elem.baseElement = elem.matteElement;\n }\n\n SVGMatte3Effect.prototype.findSymbol = function (mask) {\n var i = 0;\n var len = _svgMatteSymbols.length;\n\n while (i < len) {\n if (_svgMatteSymbols[i] === mask) {\n return _svgMatteSymbols[i];\n }\n\n i += 1;\n }\n\n return null;\n };\n\n SVGMatte3Effect.prototype.replaceInParent = function (mask, symbolId) {\n var parentNode = mask.layerElement.parentNode;\n\n if (!parentNode) {\n return;\n }\n\n var children = parentNode.children;\n var i = 0;\n var len = children.length;\n\n while (i < len) {\n if (children[i] === mask.layerElement) {\n break;\n }\n\n i += 1;\n }\n\n var nextChild;\n\n if (i <= len - 2) {\n nextChild = children[i + 1];\n }\n\n var useElem = createNS('use');\n useElem.setAttribute('href', '#' + symbolId);\n\n if (nextChild) {\n parentNode.insertBefore(useElem, nextChild);\n } else {\n parentNode.appendChild(useElem);\n }\n };\n\n SVGMatte3Effect.prototype.setElementAsMask = function (elem, mask) {\n if (!this.findSymbol(mask)) {\n var symbolId = createElementID();\n var masker = createNS('mask');\n masker.setAttribute('id', mask.layerId);\n masker.setAttribute('mask-type', 'alpha');\n\n _svgMatteSymbols.push(mask);\n\n var defs = elem.globalData.defs;\n defs.appendChild(masker);\n var symbol = createNS('symbol');\n symbol.setAttribute('id', symbolId);\n this.replaceInParent(mask, symbolId);\n symbol.appendChild(mask.layerElement);\n defs.appendChild(symbol);\n var useElem = createNS('use');\n useElem.setAttribute('href', '#' + symbolId);\n masker.appendChild(useElem);\n mask.data.hd = false;\n mask.show();\n }\n\n elem.setMatte(mask.layerId);\n };\n\n SVGMatte3Effect.prototype.initialize = function () {\n var ind = this.filterManager.effectElements[0].p.v;\n var elements = this.elem.comp.elements;\n var i = 0;\n var len = elements.length;\n\n while (i < len) {\n if (elements[i] && elements[i].data.ind === ind) {\n this.setElementAsMask(this.elem, elements[i]);\n }\n\n i += 1;\n }\n\n this.initialized = true;\n };\n\n SVGMatte3Effect.prototype.renderFrame = function () {\n if (!this.initialized) {\n this.initialize();\n }\n };\n\n function SVGGaussianBlurEffect(filter, filterManager, elem, id) {\n // Outset the filter region by 100% on all sides to accommodate blur expansion.\n filter.setAttribute('x', '-100%');\n filter.setAttribute('y', '-100%');\n filter.setAttribute('width', '300%');\n filter.setAttribute('height', '300%');\n this.filterManager = filterManager;\n var feGaussianBlur = createNS('feGaussianBlur');\n feGaussianBlur.setAttribute('result', id);\n filter.appendChild(feGaussianBlur);\n this.feGaussianBlur = feGaussianBlur;\n }\n\n SVGGaussianBlurEffect.prototype.renderFrame = function (forceRender) {\n if (forceRender || this.filterManager._mdf) {\n // Empirical value, matching AE's blur appearance.\n var kBlurrinessToSigma = 0.3;\n var sigma = this.filterManager.effectElements[0].p.v * kBlurrinessToSigma; // Dimensions mapping:\n //\n // 1 -> horizontal & vertical\n // 2 -> horizontal only\n // 3 -> vertical only\n //\n\n var dimensions = this.filterManager.effectElements[1].p.v;\n var sigmaX = dimensions == 3 ? 0 : sigma; // eslint-disable-line eqeqeq\n\n var sigmaY = dimensions == 2 ? 0 : sigma; // eslint-disable-line eqeqeq\n\n this.feGaussianBlur.setAttribute('stdDeviation', sigmaX + ' ' + sigmaY); // Repeat edges mapping:\n //\n // 0 -> off -> duplicate\n // 1 -> on -> wrap\n\n var edgeMode = this.filterManager.effectElements[2].p.v == 1 ? 'wrap' : 'duplicate'; // eslint-disable-line eqeqeq\n\n this.feGaussianBlur.setAttribute('edgeMode', edgeMode);\n }\n };\n\n function TransformEffect() {}\n\n TransformEffect.prototype.init = function (effectsManager) {\n this.effectsManager = effectsManager;\n this.type = effectTypes.TRANSFORM_EFFECT;\n this.matrix = new Matrix();\n this.opacity = -1;\n this._mdf = false;\n this._opMdf = false;\n };\n\n TransformEffect.prototype.renderFrame = function (forceFrame) {\n this._opMdf = false;\n this._mdf = false;\n\n if (forceFrame || this.effectsManager._mdf) {\n var effectElements = this.effectsManager.effectElements;\n var anchor = effectElements[0].p.v;\n var position = effectElements[1].p.v;\n var isUniformScale = effectElements[2].p.v === 1;\n var scaleHeight = effectElements[3].p.v;\n var scaleWidth = isUniformScale ? scaleHeight : effectElements[4].p.v;\n var skew = effectElements[5].p.v;\n var skewAxis = effectElements[6].p.v;\n var rotation = effectElements[7].p.v;\n this.matrix.reset();\n this.matrix.translate(-anchor[0], -anchor[1], anchor[2]);\n this.matrix.scale(scaleWidth * 0.01, scaleHeight * 0.01, 1);\n this.matrix.rotate(-rotation * degToRads);\n this.matrix.skewFromAxis(-skew * degToRads, (skewAxis + 90) * degToRads);\n this.matrix.translate(position[0], position[1], 0);\n this._mdf = true;\n\n if (this.opacity !== effectElements[8].p.v) {\n this.opacity = effectElements[8].p.v;\n this._opMdf = true;\n }\n }\n };\n\n function SVGTransformEffect(_, filterManager) {\n this.init(filterManager);\n }\n\n extendPrototype([TransformEffect], SVGTransformEffect);\n\n function CVTransformEffect(effectsManager) {\n this.init(effectsManager);\n }\n\n extendPrototype([TransformEffect], CVTransformEffect);\n\n registerRenderer('canvas', CanvasRenderer);\n registerRenderer('html', HybridRenderer);\n registerRenderer('svg', SVGRenderer); // Registering shape modifiers\n\n ShapeModifiers.registerModifier('tm', TrimModifier);\n ShapeModifiers.registerModifier('pb', PuckerAndBloatModifier);\n ShapeModifiers.registerModifier('rp', RepeaterModifier);\n ShapeModifiers.registerModifier('rd', RoundCornersModifier);\n ShapeModifiers.registerModifier('zz', ZigZagModifier);\n ShapeModifiers.registerModifier('op', OffsetPathModifier); // Registering expression plugin\n\n setExpressionsPlugin(Expressions);\n setExpressionInterfaces(getInterface);\n initialize$1();\n initialize(); // Registering svg effects\n\n registerEffect$1(20, SVGTintFilter, true);\n registerEffect$1(21, SVGFillFilter, true);\n registerEffect$1(22, SVGStrokeEffect, false);\n registerEffect$1(23, SVGTritoneFilter, true);\n registerEffect$1(24, SVGProLevelsFilter, true);\n registerEffect$1(25, SVGDropShadowEffect, true);\n registerEffect$1(28, SVGMatte3Effect, false);\n registerEffect$1(29, SVGGaussianBlurEffect, true);\n registerEffect$1(35, SVGTransformEffect, false);\n registerEffect(35, CVTransformEffect);\n\n return lottie;\n\n}));\n","/**\n * @license React\n * react-dom.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n/*\n Modernizr 3.0.0pre (Custom Build) | MIT\n*/\n'use strict';var aa=require(\"react\"),ca=require(\"scheduler\");function p(a){for(var b=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+a,c=1;c<arguments.length;c++)b+=\"&args[]=\"+encodeURIComponent(arguments[c]);return\"Minified React error #\"+a+\"; visit \"+b+\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"}var da=new Set,ea={};function fa(a,b){ha(a,b);ha(a+\"Capture\",b)}\nfunction ha(a,b){ea[a]=b;for(a=0;a<b.length;a++)da.add(b[a])}\nvar ia=!(\"undefined\"===typeof window||\"undefined\"===typeof window.document||\"undefined\"===typeof window.document.createElement),ja=Object.prototype.hasOwnProperty,ka=/^[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$/,la=\n{},ma={};function oa(a){if(ja.call(ma,a))return!0;if(ja.call(la,a))return!1;if(ka.test(a))return ma[a]=!0;la[a]=!0;return!1}function pa(a,b,c,d){if(null!==c&&0===c.type)return!1;switch(typeof b){case \"function\":case \"symbol\":return!0;case \"boolean\":if(d)return!1;if(null!==c)return!c.acceptsBooleans;a=a.toLowerCase().slice(0,5);return\"data-\"!==a&&\"aria-\"!==a;default:return!1}}\nfunction qa(a,b,c,d){if(null===b||\"undefined\"===typeof b||pa(a,b,c,d))return!0;if(d)return!1;if(null!==c)switch(c.type){case 3:return!b;case 4:return!1===b;case 5:return isNaN(b);case 6:return isNaN(b)||1>b}return!1}function v(a,b,c,d,e,f,g){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=e;this.mustUseProperty=c;this.propertyName=a;this.type=b;this.sanitizeURL=f;this.removeEmptyString=g}var z={};\n\"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style\".split(\" \").forEach(function(a){z[a]=new v(a,0,!1,a,null,!1,!1)});[[\"acceptCharset\",\"accept-charset\"],[\"className\",\"class\"],[\"htmlFor\",\"for\"],[\"httpEquiv\",\"http-equiv\"]].forEach(function(a){var b=a[0];z[b]=new v(b,1,!1,a[1],null,!1,!1)});[\"contentEditable\",\"draggable\",\"spellCheck\",\"value\"].forEach(function(a){z[a]=new v(a,2,!1,a.toLowerCase(),null,!1,!1)});\n[\"autoReverse\",\"externalResourcesRequired\",\"focusable\",\"preserveAlpha\"].forEach(function(a){z[a]=new v(a,2,!1,a,null,!1,!1)});\"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope\".split(\" \").forEach(function(a){z[a]=new v(a,3,!1,a.toLowerCase(),null,!1,!1)});\n[\"checked\",\"multiple\",\"muted\",\"selected\"].forEach(function(a){z[a]=new v(a,3,!0,a,null,!1,!1)});[\"capture\",\"download\"].forEach(function(a){z[a]=new v(a,4,!1,a,null,!1,!1)});[\"cols\",\"rows\",\"size\",\"span\"].forEach(function(a){z[a]=new v(a,6,!1,a,null,!1,!1)});[\"rowSpan\",\"start\"].forEach(function(a){z[a]=new v(a,5,!1,a.toLowerCase(),null,!1,!1)});var ra=/[\\-:]([a-z])/g;function sa(a){return a[1].toUpperCase()}\n\"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height\".split(\" \").forEach(function(a){var b=a.replace(ra,\nsa);z[b]=new v(b,1,!1,a,null,!1,!1)});\"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type\".split(\" \").forEach(function(a){var b=a.replace(ra,sa);z[b]=new v(b,1,!1,a,\"http://www.w3.org/1999/xlink\",!1,!1)});[\"xml:base\",\"xml:lang\",\"xml:space\"].forEach(function(a){var b=a.replace(ra,sa);z[b]=new v(b,1,!1,a,\"http://www.w3.org/XML/1998/namespace\",!1,!1)});[\"tabIndex\",\"crossOrigin\"].forEach(function(a){z[a]=new v(a,1,!1,a.toLowerCase(),null,!1,!1)});\nz.xlinkHref=new v(\"xlinkHref\",1,!1,\"xlink:href\",\"http://www.w3.org/1999/xlink\",!0,!1);[\"src\",\"href\",\"action\",\"formAction\"].forEach(function(a){z[a]=new v(a,1,!1,a.toLowerCase(),null,!0,!0)});\nfunction ta(a,b,c,d){var e=z.hasOwnProperty(b)?z[b]:null;if(null!==e?0!==e.type:d||!(2<b.length)||\"o\"!==b[0]&&\"O\"!==b[0]||\"n\"!==b[1]&&\"N\"!==b[1])qa(b,c,e,d)&&(c=null),d||null===e?oa(b)&&(null===c?a.removeAttribute(b):a.setAttribute(b,\"\"+c)):e.mustUseProperty?a[e.propertyName]=null===c?3===e.type?!1:\"\":c:(b=e.attributeName,d=e.attributeNamespace,null===c?a.removeAttribute(b):(e=e.type,c=3===e||4===e&&!0===c?\"\":\"\"+c,d?a.setAttributeNS(d,b,c):a.setAttribute(b,c)))}\nvar ua=aa.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,va=Symbol.for(\"react.element\"),wa=Symbol.for(\"react.portal\"),ya=Symbol.for(\"react.fragment\"),za=Symbol.for(\"react.strict_mode\"),Aa=Symbol.for(\"react.profiler\"),Ba=Symbol.for(\"react.provider\"),Ca=Symbol.for(\"react.context\"),Da=Symbol.for(\"react.forward_ref\"),Ea=Symbol.for(\"react.suspense\"),Fa=Symbol.for(\"react.suspense_list\"),Ga=Symbol.for(\"react.memo\"),Ha=Symbol.for(\"react.lazy\");Symbol.for(\"react.scope\");Symbol.for(\"react.debug_trace_mode\");\nvar Ia=Symbol.for(\"react.offscreen\");Symbol.for(\"react.legacy_hidden\");Symbol.for(\"react.cache\");Symbol.for(\"react.tracing_marker\");var Ja=Symbol.iterator;function Ka(a){if(null===a||\"object\"!==typeof a)return null;a=Ja&&a[Ja]||a[\"@@iterator\"];return\"function\"===typeof a?a:null}var A=Object.assign,La;function Ma(a){if(void 0===La)try{throw Error();}catch(c){var b=c.stack.trim().match(/\\n( *(at )?)/);La=b&&b[1]||\"\"}return\"\\n\"+La+a}var Na=!1;\nfunction Oa(a,b){if(!a||Na)return\"\";Na=!0;var c=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(b)if(b=function(){throw Error();},Object.defineProperty(b.prototype,\"props\",{set:function(){throw Error();}}),\"object\"===typeof Reflect&&Reflect.construct){try{Reflect.construct(b,[])}catch(l){var d=l}Reflect.construct(a,[],b)}else{try{b.call()}catch(l){d=l}a.call(b.prototype)}else{try{throw Error();}catch(l){d=l}a()}}catch(l){if(l&&d&&\"string\"===typeof l.stack){for(var e=l.stack.split(\"\\n\"),\nf=d.stack.split(\"\\n\"),g=e.length-1,h=f.length-1;1<=g&&0<=h&&e[g]!==f[h];)h--;for(;1<=g&&0<=h;g--,h--)if(e[g]!==f[h]){if(1!==g||1!==h){do if(g--,h--,0>h||e[g]!==f[h]){var k=\"\\n\"+e[g].replace(\" at new \",\" at \");a.displayName&&k.includes(\"<anonymous>\")&&(k=k.replace(\"<anonymous>\",a.displayName));return k}while(1<=g&&0<=h)}break}}}finally{Na=!1,Error.prepareStackTrace=c}return(a=a?a.displayName||a.name:\"\")?Ma(a):\"\"}\nfunction Pa(a){switch(a.tag){case 5:return Ma(a.type);case 16:return Ma(\"Lazy\");case 13:return Ma(\"Suspense\");case 19:return Ma(\"SuspenseList\");case 0:case 2:case 15:return a=Oa(a.type,!1),a;case 11:return a=Oa(a.type.render,!1),a;case 1:return a=Oa(a.type,!0),a;default:return\"\"}}\nfunction Qa(a){if(null==a)return null;if(\"function\"===typeof a)return a.displayName||a.name||null;if(\"string\"===typeof a)return a;switch(a){case ya:return\"Fragment\";case wa:return\"Portal\";case Aa:return\"Profiler\";case za:return\"StrictMode\";case Ea:return\"Suspense\";case Fa:return\"SuspenseList\"}if(\"object\"===typeof a)switch(a.$$typeof){case Ca:return(a.displayName||\"Context\")+\".Consumer\";case Ba:return(a._context.displayName||\"Context\")+\".Provider\";case Da:var b=a.render;a=a.displayName;a||(a=b.displayName||\nb.name||\"\",a=\"\"!==a?\"ForwardRef(\"+a+\")\":\"ForwardRef\");return a;case Ga:return b=a.displayName||null,null!==b?b:Qa(a.type)||\"Memo\";case Ha:b=a._payload;a=a._init;try{return Qa(a(b))}catch(c){}}return null}\nfunction Ra(a){var b=a.type;switch(a.tag){case 24:return\"Cache\";case 9:return(b.displayName||\"Context\")+\".Consumer\";case 10:return(b._context.displayName||\"Context\")+\".Provider\";case 18:return\"DehydratedFragment\";case 11:return a=b.render,a=a.displayName||a.name||\"\",b.displayName||(\"\"!==a?\"ForwardRef(\"+a+\")\":\"ForwardRef\");case 7:return\"Fragment\";case 5:return b;case 4:return\"Portal\";case 3:return\"Root\";case 6:return\"Text\";case 16:return Qa(b);case 8:return b===za?\"StrictMode\":\"Mode\";case 22:return\"Offscreen\";\ncase 12:return\"Profiler\";case 21:return\"Scope\";case 13:return\"Suspense\";case 19:return\"SuspenseList\";case 25:return\"TracingMarker\";case 1:case 0:case 17:case 2:case 14:case 15:if(\"function\"===typeof b)return b.displayName||b.name||null;if(\"string\"===typeof b)return b}return null}function Sa(a){switch(typeof a){case \"boolean\":case \"number\":case \"string\":case \"undefined\":return a;case \"object\":return a;default:return\"\"}}\nfunction Ta(a){var b=a.type;return(a=a.nodeName)&&\"input\"===a.toLowerCase()&&(\"checkbox\"===b||\"radio\"===b)}\nfunction Ua(a){var b=Ta(a)?\"checked\":\"value\",c=Object.getOwnPropertyDescriptor(a.constructor.prototype,b),d=\"\"+a[b];if(!a.hasOwnProperty(b)&&\"undefined\"!==typeof c&&\"function\"===typeof c.get&&\"function\"===typeof c.set){var e=c.get,f=c.set;Object.defineProperty(a,b,{configurable:!0,get:function(){return e.call(this)},set:function(a){d=\"\"+a;f.call(this,a)}});Object.defineProperty(a,b,{enumerable:c.enumerable});return{getValue:function(){return d},setValue:function(a){d=\"\"+a},stopTracking:function(){a._valueTracker=\nnull;delete a[b]}}}}function Va(a){a._valueTracker||(a._valueTracker=Ua(a))}function Wa(a){if(!a)return!1;var b=a._valueTracker;if(!b)return!0;var c=b.getValue();var d=\"\";a&&(d=Ta(a)?a.checked?\"true\":\"false\":a.value);a=d;return a!==c?(b.setValue(a),!0):!1}function Xa(a){a=a||(\"undefined\"!==typeof document?document:void 0);if(\"undefined\"===typeof a)return null;try{return a.activeElement||a.body}catch(b){return a.body}}\nfunction Ya(a,b){var c=b.checked;return A({},b,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=c?c:a._wrapperState.initialChecked})}function Za(a,b){var c=null==b.defaultValue?\"\":b.defaultValue,d=null!=b.checked?b.checked:b.defaultChecked;c=Sa(null!=b.value?b.value:c);a._wrapperState={initialChecked:d,initialValue:c,controlled:\"checkbox\"===b.type||\"radio\"===b.type?null!=b.checked:null!=b.value}}function ab(a,b){b=b.checked;null!=b&&ta(a,\"checked\",b,!1)}\nfunction bb(a,b){ab(a,b);var c=Sa(b.value),d=b.type;if(null!=c)if(\"number\"===d){if(0===c&&\"\"===a.value||a.value!=c)a.value=\"\"+c}else a.value!==\"\"+c&&(a.value=\"\"+c);else if(\"submit\"===d||\"reset\"===d){a.removeAttribute(\"value\");return}b.hasOwnProperty(\"value\")?cb(a,b.type,c):b.hasOwnProperty(\"defaultValue\")&&cb(a,b.type,Sa(b.defaultValue));null==b.checked&&null!=b.defaultChecked&&(a.defaultChecked=!!b.defaultChecked)}\nfunction db(a,b,c){if(b.hasOwnProperty(\"value\")||b.hasOwnProperty(\"defaultValue\")){var d=b.type;if(!(\"submit\"!==d&&\"reset\"!==d||void 0!==b.value&&null!==b.value))return;b=\"\"+a._wrapperState.initialValue;c||b===a.value||(a.value=b);a.defaultValue=b}c=a.name;\"\"!==c&&(a.name=\"\");a.defaultChecked=!!a._wrapperState.initialChecked;\"\"!==c&&(a.name=c)}\nfunction cb(a,b,c){if(\"number\"!==b||Xa(a.ownerDocument)!==a)null==c?a.defaultValue=\"\"+a._wrapperState.initialValue:a.defaultValue!==\"\"+c&&(a.defaultValue=\"\"+c)}var eb=Array.isArray;\nfunction fb(a,b,c,d){a=a.options;if(b){b={};for(var e=0;e<c.length;e++)b[\"$\"+c[e]]=!0;for(c=0;c<a.length;c++)e=b.hasOwnProperty(\"$\"+a[c].value),a[c].selected!==e&&(a[c].selected=e),e&&d&&(a[c].defaultSelected=!0)}else{c=\"\"+Sa(c);b=null;for(e=0;e<a.length;e++){if(a[e].value===c){a[e].selected=!0;d&&(a[e].defaultSelected=!0);return}null!==b||a[e].disabled||(b=a[e])}null!==b&&(b.selected=!0)}}\nfunction gb(a,b){if(null!=b.dangerouslySetInnerHTML)throw Error(p(91));return A({},b,{value:void 0,defaultValue:void 0,children:\"\"+a._wrapperState.initialValue})}function hb(a,b){var c=b.value;if(null==c){c=b.children;b=b.defaultValue;if(null!=c){if(null!=b)throw Error(p(92));if(eb(c)){if(1<c.length)throw Error(p(93));c=c[0]}b=c}null==b&&(b=\"\");c=b}a._wrapperState={initialValue:Sa(c)}}\nfunction ib(a,b){var c=Sa(b.value),d=Sa(b.defaultValue);null!=c&&(c=\"\"+c,c!==a.value&&(a.value=c),null==b.defaultValue&&a.defaultValue!==c&&(a.defaultValue=c));null!=d&&(a.defaultValue=\"\"+d)}function jb(a){var b=a.textContent;b===a._wrapperState.initialValue&&\"\"!==b&&null!==b&&(a.value=b)}function kb(a){switch(a){case \"svg\":return\"http://www.w3.org/2000/svg\";case \"math\":return\"http://www.w3.org/1998/Math/MathML\";default:return\"http://www.w3.org/1999/xhtml\"}}\nfunction lb(a,b){return null==a||\"http://www.w3.org/1999/xhtml\"===a?kb(b):\"http://www.w3.org/2000/svg\"===a&&\"foreignObject\"===b?\"http://www.w3.org/1999/xhtml\":a}\nvar mb,nb=function(a){return\"undefined\"!==typeof MSApp&&MSApp.execUnsafeLocalFunction?function(b,c,d,e){MSApp.execUnsafeLocalFunction(function(){return a(b,c,d,e)})}:a}(function(a,b){if(\"http://www.w3.org/2000/svg\"!==a.namespaceURI||\"innerHTML\"in a)a.innerHTML=b;else{mb=mb||document.createElement(\"div\");mb.innerHTML=\"<svg>\"+b.valueOf().toString()+\"</svg>\";for(b=mb.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;b.firstChild;)a.appendChild(b.firstChild)}});\nfunction ob(a,b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&3===c.nodeType){c.nodeValue=b;return}}a.textContent=b}\nvar pb={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,\nzoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},qb=[\"Webkit\",\"ms\",\"Moz\",\"O\"];Object.keys(pb).forEach(function(a){qb.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);pb[b]=pb[a]})});function rb(a,b,c){return null==b||\"boolean\"===typeof b||\"\"===b?\"\":c||\"number\"!==typeof b||0===b||pb.hasOwnProperty(a)&&pb[a]?(\"\"+b).trim():b+\"px\"}\nfunction sb(a,b){a=a.style;for(var c in b)if(b.hasOwnProperty(c)){var d=0===c.indexOf(\"--\"),e=rb(c,b[c],d);\"float\"===c&&(c=\"cssFloat\");d?a.setProperty(c,e):a[c]=e}}var tb=A({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});\nfunction ub(a,b){if(b){if(tb[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML))throw Error(p(137,a));if(null!=b.dangerouslySetInnerHTML){if(null!=b.children)throw Error(p(60));if(\"object\"!==typeof b.dangerouslySetInnerHTML||!(\"__html\"in b.dangerouslySetInnerHTML))throw Error(p(61));}if(null!=b.style&&\"object\"!==typeof b.style)throw Error(p(62));}}\nfunction vb(a,b){if(-1===a.indexOf(\"-\"))return\"string\"===typeof b.is;switch(a){case \"annotation-xml\":case \"color-profile\":case \"font-face\":case \"font-face-src\":case \"font-face-uri\":case \"font-face-format\":case \"font-face-name\":case \"missing-glyph\":return!1;default:return!0}}var wb=null;function xb(a){a=a.target||a.srcElement||window;a.correspondingUseElement&&(a=a.correspondingUseElement);return 3===a.nodeType?a.parentNode:a}var yb=null,zb=null,Ab=null;\nfunction Bb(a){if(a=Cb(a)){if(\"function\"!==typeof yb)throw Error(p(280));var b=a.stateNode;b&&(b=Db(b),yb(a.stateNode,a.type,b))}}function Eb(a){zb?Ab?Ab.push(a):Ab=[a]:zb=a}function Fb(){if(zb){var a=zb,b=Ab;Ab=zb=null;Bb(a);if(b)for(a=0;a<b.length;a++)Bb(b[a])}}function Gb(a,b){return a(b)}function Hb(){}var Ib=!1;function Jb(a,b,c){if(Ib)return a(b,c);Ib=!0;try{return Gb(a,b,c)}finally{if(Ib=!1,null!==zb||null!==Ab)Hb(),Fb()}}\nfunction Kb(a,b){var c=a.stateNode;if(null===c)return null;var d=Db(c);if(null===d)return null;c=d[b];a:switch(b){case \"onClick\":case \"onClickCapture\":case \"onDoubleClick\":case \"onDoubleClickCapture\":case \"onMouseDown\":case \"onMouseDownCapture\":case \"onMouseMove\":case \"onMouseMoveCapture\":case \"onMouseUp\":case \"onMouseUpCapture\":case \"onMouseEnter\":(d=!d.disabled)||(a=a.type,d=!(\"button\"===a||\"input\"===a||\"select\"===a||\"textarea\"===a));a=!d;break a;default:a=!1}if(a)return null;if(c&&\"function\"!==\ntypeof c)throw Error(p(231,b,typeof c));return c}var Lb=!1;if(ia)try{var Mb={};Object.defineProperty(Mb,\"passive\",{get:function(){Lb=!0}});window.addEventListener(\"test\",Mb,Mb);window.removeEventListener(\"test\",Mb,Mb)}catch(a){Lb=!1}function Nb(a,b,c,d,e,f,g,h,k){var l=Array.prototype.slice.call(arguments,3);try{b.apply(c,l)}catch(m){this.onError(m)}}var Ob=!1,Pb=null,Qb=!1,Rb=null,Sb={onError:function(a){Ob=!0;Pb=a}};function Tb(a,b,c,d,e,f,g,h,k){Ob=!1;Pb=null;Nb.apply(Sb,arguments)}\nfunction Ub(a,b,c,d,e,f,g,h,k){Tb.apply(this,arguments);if(Ob){if(Ob){var l=Pb;Ob=!1;Pb=null}else throw Error(p(198));Qb||(Qb=!0,Rb=l)}}function Vb(a){var b=a,c=a;if(a.alternate)for(;b.return;)b=b.return;else{a=b;do b=a,0!==(b.flags&4098)&&(c=b.return),a=b.return;while(a)}return 3===b.tag?c:null}function Wb(a){if(13===a.tag){var b=a.memoizedState;null===b&&(a=a.alternate,null!==a&&(b=a.memoizedState));if(null!==b)return b.dehydrated}return null}function Xb(a){if(Vb(a)!==a)throw Error(p(188));}\nfunction Yb(a){var b=a.alternate;if(!b){b=Vb(a);if(null===b)throw Error(p(188));return b!==a?null:a}for(var c=a,d=b;;){var e=c.return;if(null===e)break;var f=e.alternate;if(null===f){d=e.return;if(null!==d){c=d;continue}break}if(e.child===f.child){for(f=e.child;f;){if(f===c)return Xb(e),a;if(f===d)return Xb(e),b;f=f.sibling}throw Error(p(188));}if(c.return!==d.return)c=e,d=f;else{for(var g=!1,h=e.child;h;){if(h===c){g=!0;c=e;d=f;break}if(h===d){g=!0;d=e;c=f;break}h=h.sibling}if(!g){for(h=f.child;h;){if(h===\nc){g=!0;c=f;d=e;break}if(h===d){g=!0;d=f;c=e;break}h=h.sibling}if(!g)throw Error(p(189));}}if(c.alternate!==d)throw Error(p(190));}if(3!==c.tag)throw Error(p(188));return c.stateNode.current===c?a:b}function Zb(a){a=Yb(a);return null!==a?$b(a):null}function $b(a){if(5===a.tag||6===a.tag)return a;for(a=a.child;null!==a;){var b=$b(a);if(null!==b)return b;a=a.sibling}return null}\nvar ac=ca.unstable_scheduleCallback,bc=ca.unstable_cancelCallback,cc=ca.unstable_shouldYield,dc=ca.unstable_requestPaint,B=ca.unstable_now,ec=ca.unstable_getCurrentPriorityLevel,fc=ca.unstable_ImmediatePriority,gc=ca.unstable_UserBlockingPriority,hc=ca.unstable_NormalPriority,ic=ca.unstable_LowPriority,jc=ca.unstable_IdlePriority,kc=null,lc=null;function mc(a){if(lc&&\"function\"===typeof lc.onCommitFiberRoot)try{lc.onCommitFiberRoot(kc,a,void 0,128===(a.current.flags&128))}catch(b){}}\nvar oc=Math.clz32?Math.clz32:nc,pc=Math.log,qc=Math.LN2;function nc(a){a>>>=0;return 0===a?32:31-(pc(a)/qc|0)|0}var rc=64,sc=4194304;\nfunction tc(a){switch(a&-a){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return a&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return a&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;\ndefault:return a}}function uc(a,b){var c=a.pendingLanes;if(0===c)return 0;var d=0,e=a.suspendedLanes,f=a.pingedLanes,g=c&268435455;if(0!==g){var h=g&~e;0!==h?d=tc(h):(f&=g,0!==f&&(d=tc(f)))}else g=c&~e,0!==g?d=tc(g):0!==f&&(d=tc(f));if(0===d)return 0;if(0!==b&&b!==d&&0===(b&e)&&(e=d&-d,f=b&-b,e>=f||16===e&&0!==(f&4194240)))return b;0!==(d&4)&&(d|=c&16);b=a.entangledLanes;if(0!==b)for(a=a.entanglements,b&=d;0<b;)c=31-oc(b),e=1<<c,d|=a[c],b&=~e;return d}\nfunction vc(a,b){switch(a){case 1:case 2:case 4:return b+250;case 8:case 16:case 32:case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return b+5E3;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return-1;case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}\nfunction wc(a,b){for(var c=a.suspendedLanes,d=a.pingedLanes,e=a.expirationTimes,f=a.pendingLanes;0<f;){var g=31-oc(f),h=1<<g,k=e[g];if(-1===k){if(0===(h&c)||0!==(h&d))e[g]=vc(h,b)}else k<=b&&(a.expiredLanes|=h);f&=~h}}function xc(a){a=a.pendingLanes&-1073741825;return 0!==a?a:a&1073741824?1073741824:0}function yc(){var a=rc;rc<<=1;0===(rc&4194240)&&(rc=64);return a}function zc(a){for(var b=[],c=0;31>c;c++)b.push(a);return b}\nfunction Ac(a,b,c){a.pendingLanes|=b;536870912!==b&&(a.suspendedLanes=0,a.pingedLanes=0);a=a.eventTimes;b=31-oc(b);a[b]=c}function Bc(a,b){var c=a.pendingLanes&~b;a.pendingLanes=b;a.suspendedLanes=0;a.pingedLanes=0;a.expiredLanes&=b;a.mutableReadLanes&=b;a.entangledLanes&=b;b=a.entanglements;var d=a.eventTimes;for(a=a.expirationTimes;0<c;){var e=31-oc(c),f=1<<e;b[e]=0;d[e]=-1;a[e]=-1;c&=~f}}\nfunction Cc(a,b){var c=a.entangledLanes|=b;for(a=a.entanglements;c;){var d=31-oc(c),e=1<<d;e&b|a[d]&b&&(a[d]|=b);c&=~e}}var C=0;function Dc(a){a&=-a;return 1<a?4<a?0!==(a&268435455)?16:536870912:4:1}var Ec,Fc,Gc,Hc,Ic,Jc=!1,Kc=[],Lc=null,Mc=null,Nc=null,Oc=new Map,Pc=new Map,Qc=[],Rc=\"mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit\".split(\" \");\nfunction Sc(a,b){switch(a){case \"focusin\":case \"focusout\":Lc=null;break;case \"dragenter\":case \"dragleave\":Mc=null;break;case \"mouseover\":case \"mouseout\":Nc=null;break;case \"pointerover\":case \"pointerout\":Oc.delete(b.pointerId);break;case \"gotpointercapture\":case \"lostpointercapture\":Pc.delete(b.pointerId)}}\nfunction Tc(a,b,c,d,e,f){if(null===a||a.nativeEvent!==f)return a={blockedOn:b,domEventName:c,eventSystemFlags:d,nativeEvent:f,targetContainers:[e]},null!==b&&(b=Cb(b),null!==b&&Fc(b)),a;a.eventSystemFlags|=d;b=a.targetContainers;null!==e&&-1===b.indexOf(e)&&b.push(e);return a}\nfunction Uc(a,b,c,d,e){switch(b){case \"focusin\":return Lc=Tc(Lc,a,b,c,d,e),!0;case \"dragenter\":return Mc=Tc(Mc,a,b,c,d,e),!0;case \"mouseover\":return Nc=Tc(Nc,a,b,c,d,e),!0;case \"pointerover\":var f=e.pointerId;Oc.set(f,Tc(Oc.get(f)||null,a,b,c,d,e));return!0;case \"gotpointercapture\":return f=e.pointerId,Pc.set(f,Tc(Pc.get(f)||null,a,b,c,d,e)),!0}return!1}\nfunction Vc(a){var b=Wc(a.target);if(null!==b){var c=Vb(b);if(null!==c)if(b=c.tag,13===b){if(b=Wb(c),null!==b){a.blockedOn=b;Ic(a.priority,function(){Gc(c)});return}}else if(3===b&&c.stateNode.current.memoizedState.isDehydrated){a.blockedOn=3===c.tag?c.stateNode.containerInfo:null;return}}a.blockedOn=null}\nfunction Xc(a){if(null!==a.blockedOn)return!1;for(var b=a.targetContainers;0<b.length;){var c=Yc(a.domEventName,a.eventSystemFlags,b[0],a.nativeEvent);if(null===c){c=a.nativeEvent;var d=new c.constructor(c.type,c);wb=d;c.target.dispatchEvent(d);wb=null}else return b=Cb(c),null!==b&&Fc(b),a.blockedOn=c,!1;b.shift()}return!0}function Zc(a,b,c){Xc(a)&&c.delete(b)}function $c(){Jc=!1;null!==Lc&&Xc(Lc)&&(Lc=null);null!==Mc&&Xc(Mc)&&(Mc=null);null!==Nc&&Xc(Nc)&&(Nc=null);Oc.forEach(Zc);Pc.forEach(Zc)}\nfunction ad(a,b){a.blockedOn===b&&(a.blockedOn=null,Jc||(Jc=!0,ca.unstable_scheduleCallback(ca.unstable_NormalPriority,$c)))}\nfunction bd(a){function b(b){return ad(b,a)}if(0<Kc.length){ad(Kc[0],a);for(var c=1;c<Kc.length;c++){var d=Kc[c];d.blockedOn===a&&(d.blockedOn=null)}}null!==Lc&&ad(Lc,a);null!==Mc&&ad(Mc,a);null!==Nc&&ad(Nc,a);Oc.forEach(b);Pc.forEach(b);for(c=0;c<Qc.length;c++)d=Qc[c],d.blockedOn===a&&(d.blockedOn=null);for(;0<Qc.length&&(c=Qc[0],null===c.blockedOn);)Vc(c),null===c.blockedOn&&Qc.shift()}var cd=ua.ReactCurrentBatchConfig,dd=!0;\nfunction ed(a,b,c,d){var e=C,f=cd.transition;cd.transition=null;try{C=1,fd(a,b,c,d)}finally{C=e,cd.transition=f}}function gd(a,b,c,d){var e=C,f=cd.transition;cd.transition=null;try{C=4,fd(a,b,c,d)}finally{C=e,cd.transition=f}}\nfunction fd(a,b,c,d){if(dd){var e=Yc(a,b,c,d);if(null===e)hd(a,b,d,id,c),Sc(a,d);else if(Uc(e,a,b,c,d))d.stopPropagation();else if(Sc(a,d),b&4&&-1<Rc.indexOf(a)){for(;null!==e;){var f=Cb(e);null!==f&&Ec(f);f=Yc(a,b,c,d);null===f&&hd(a,b,d,id,c);if(f===e)break;e=f}null!==e&&d.stopPropagation()}else hd(a,b,d,null,c)}}var id=null;\nfunction Yc(a,b,c,d){id=null;a=xb(d);a=Wc(a);if(null!==a)if(b=Vb(a),null===b)a=null;else if(c=b.tag,13===c){a=Wb(b);if(null!==a)return a;a=null}else if(3===c){if(b.stateNode.current.memoizedState.isDehydrated)return 3===b.tag?b.stateNode.containerInfo:null;a=null}else b!==a&&(a=null);id=a;return null}\nfunction jd(a){switch(a){case \"cancel\":case \"click\":case \"close\":case \"contextmenu\":case \"copy\":case \"cut\":case \"auxclick\":case \"dblclick\":case \"dragend\":case \"dragstart\":case \"drop\":case \"focusin\":case \"focusout\":case \"input\":case \"invalid\":case \"keydown\":case \"keypress\":case \"keyup\":case \"mousedown\":case \"mouseup\":case \"paste\":case \"pause\":case \"play\":case \"pointercancel\":case \"pointerdown\":case \"pointerup\":case \"ratechange\":case \"reset\":case \"resize\":case \"seeked\":case \"submit\":case \"touchcancel\":case \"touchend\":case \"touchstart\":case \"volumechange\":case \"change\":case \"selectionchange\":case \"textInput\":case \"compositionstart\":case \"compositionend\":case \"compositionupdate\":case \"beforeblur\":case \"afterblur\":case \"beforeinput\":case \"blur\":case \"fullscreenchange\":case \"focus\":case \"hashchange\":case \"popstate\":case \"select\":case \"selectstart\":return 1;case \"drag\":case \"dragenter\":case \"dragexit\":case \"dragleave\":case \"dragover\":case \"mousemove\":case \"mouseout\":case \"mouseover\":case \"pointermove\":case \"pointerout\":case \"pointerover\":case \"scroll\":case \"toggle\":case \"touchmove\":case \"wheel\":case \"mouseenter\":case \"mouseleave\":case \"pointerenter\":case \"pointerleave\":return 4;\ncase \"message\":switch(ec()){case fc:return 1;case gc:return 4;case hc:case ic:return 16;case jc:return 536870912;default:return 16}default:return 16}}var kd=null,ld=null,md=null;function nd(){if(md)return md;var a,b=ld,c=b.length,d,e=\"value\"in kd?kd.value:kd.textContent,f=e.length;for(a=0;a<c&&b[a]===e[a];a++);var g=c-a;for(d=1;d<=g&&b[c-d]===e[f-d];d++);return md=e.slice(a,1<d?1-d:void 0)}\nfunction od(a){var b=a.keyCode;\"charCode\"in a?(a=a.charCode,0===a&&13===b&&(a=13)):a=b;10===a&&(a=13);return 32<=a||13===a?a:0}function pd(){return!0}function qd(){return!1}\nfunction rd(a){function b(b,d,e,f,g){this._reactName=b;this._targetInst=e;this.type=d;this.nativeEvent=f;this.target=g;this.currentTarget=null;for(var c in a)a.hasOwnProperty(c)&&(b=a[c],this[c]=b?b(f):f[c]);this.isDefaultPrevented=(null!=f.defaultPrevented?f.defaultPrevented:!1===f.returnValue)?pd:qd;this.isPropagationStopped=qd;return this}A(b.prototype,{preventDefault:function(){this.defaultPrevented=!0;var a=this.nativeEvent;a&&(a.preventDefault?a.preventDefault():\"unknown\"!==typeof a.returnValue&&\n(a.returnValue=!1),this.isDefaultPrevented=pd)},stopPropagation:function(){var a=this.nativeEvent;a&&(a.stopPropagation?a.stopPropagation():\"unknown\"!==typeof a.cancelBubble&&(a.cancelBubble=!0),this.isPropagationStopped=pd)},persist:function(){},isPersistent:pd});return b}\nvar sd={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(a){return a.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},td=rd(sd),ud=A({},sd,{view:0,detail:0}),vd=rd(ud),wd,xd,yd,Ad=A({},ud,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:zd,button:0,buttons:0,relatedTarget:function(a){return void 0===a.relatedTarget?a.fromElement===a.srcElement?a.toElement:a.fromElement:a.relatedTarget},movementX:function(a){if(\"movementX\"in\na)return a.movementX;a!==yd&&(yd&&\"mousemove\"===a.type?(wd=a.screenX-yd.screenX,xd=a.screenY-yd.screenY):xd=wd=0,yd=a);return wd},movementY:function(a){return\"movementY\"in a?a.movementY:xd}}),Bd=rd(Ad),Cd=A({},Ad,{dataTransfer:0}),Dd=rd(Cd),Ed=A({},ud,{relatedTarget:0}),Fd=rd(Ed),Gd=A({},sd,{animationName:0,elapsedTime:0,pseudoElement:0}),Hd=rd(Gd),Id=A({},sd,{clipboardData:function(a){return\"clipboardData\"in a?a.clipboardData:window.clipboardData}}),Jd=rd(Id),Kd=A({},sd,{data:0}),Ld=rd(Kd),Md={Esc:\"Escape\",\nSpacebar:\" \",Left:\"ArrowLeft\",Up:\"ArrowUp\",Right:\"ArrowRight\",Down:\"ArrowDown\",Del:\"Delete\",Win:\"OS\",Menu:\"ContextMenu\",Apps:\"ContextMenu\",Scroll:\"ScrollLock\",MozPrintableKey:\"Unidentified\"},Nd={8:\"Backspace\",9:\"Tab\",12:\"Clear\",13:\"Enter\",16:\"Shift\",17:\"Control\",18:\"Alt\",19:\"Pause\",20:\"CapsLock\",27:\"Escape\",32:\" \",33:\"PageUp\",34:\"PageDown\",35:\"End\",36:\"Home\",37:\"ArrowLeft\",38:\"ArrowUp\",39:\"ArrowRight\",40:\"ArrowDown\",45:\"Insert\",46:\"Delete\",112:\"F1\",113:\"F2\",114:\"F3\",115:\"F4\",116:\"F5\",117:\"F6\",118:\"F7\",\n119:\"F8\",120:\"F9\",121:\"F10\",122:\"F11\",123:\"F12\",144:\"NumLock\",145:\"ScrollLock\",224:\"Meta\"},Od={Alt:\"altKey\",Control:\"ctrlKey\",Meta:\"metaKey\",Shift:\"shiftKey\"};function Pd(a){var b=this.nativeEvent;return b.getModifierState?b.getModifierState(a):(a=Od[a])?!!b[a]:!1}function zd(){return Pd}\nvar Qd=A({},ud,{key:function(a){if(a.key){var b=Md[a.key]||a.key;if(\"Unidentified\"!==b)return b}return\"keypress\"===a.type?(a=od(a),13===a?\"Enter\":String.fromCharCode(a)):\"keydown\"===a.type||\"keyup\"===a.type?Nd[a.keyCode]||\"Unidentified\":\"\"},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:zd,charCode:function(a){return\"keypress\"===a.type?od(a):0},keyCode:function(a){return\"keydown\"===a.type||\"keyup\"===a.type?a.keyCode:0},which:function(a){return\"keypress\"===\na.type?od(a):\"keydown\"===a.type||\"keyup\"===a.type?a.keyCode:0}}),Rd=rd(Qd),Sd=A({},Ad,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0}),Td=rd(Sd),Ud=A({},ud,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:zd}),Vd=rd(Ud),Wd=A({},sd,{propertyName:0,elapsedTime:0,pseudoElement:0}),Xd=rd(Wd),Yd=A({},Ad,{deltaX:function(a){return\"deltaX\"in a?a.deltaX:\"wheelDeltaX\"in a?-a.wheelDeltaX:0},\ndeltaY:function(a){return\"deltaY\"in a?a.deltaY:\"wheelDeltaY\"in a?-a.wheelDeltaY:\"wheelDelta\"in a?-a.wheelDelta:0},deltaZ:0,deltaMode:0}),Zd=rd(Yd),$d=[9,13,27,32],ae=ia&&\"CompositionEvent\"in window,be=null;ia&&\"documentMode\"in document&&(be=document.documentMode);var ce=ia&&\"TextEvent\"in window&&!be,de=ia&&(!ae||be&&8<be&&11>=be),ee=String.fromCharCode(32),fe=!1;\nfunction ge(a,b){switch(a){case \"keyup\":return-1!==$d.indexOf(b.keyCode);case \"keydown\":return 229!==b.keyCode;case \"keypress\":case \"mousedown\":case \"focusout\":return!0;default:return!1}}function he(a){a=a.detail;return\"object\"===typeof a&&\"data\"in a?a.data:null}var ie=!1;function je(a,b){switch(a){case \"compositionend\":return he(b);case \"keypress\":if(32!==b.which)return null;fe=!0;return ee;case \"textInput\":return a=b.data,a===ee&&fe?null:a;default:return null}}\nfunction ke(a,b){if(ie)return\"compositionend\"===a||!ae&&ge(a,b)?(a=nd(),md=ld=kd=null,ie=!1,a):null;switch(a){case \"paste\":return null;case \"keypress\":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1<b.char.length)return b.char;if(b.which)return String.fromCharCode(b.which)}return null;case \"compositionend\":return de&&\"ko\"!==b.locale?null:b.data;default:return null}}\nvar le={color:!0,date:!0,datetime:!0,\"datetime-local\":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function me(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return\"input\"===b?!!le[a.type]:\"textarea\"===b?!0:!1}function ne(a,b,c,d){Eb(d);b=oe(b,\"onChange\");0<b.length&&(c=new td(\"onChange\",\"change\",null,c,d),a.push({event:c,listeners:b}))}var pe=null,qe=null;function re(a){se(a,0)}function te(a){var b=ue(a);if(Wa(b))return a}\nfunction ve(a,b){if(\"change\"===a)return b}var we=!1;if(ia){var xe;if(ia){var ye=\"oninput\"in document;if(!ye){var ze=document.createElement(\"div\");ze.setAttribute(\"oninput\",\"return;\");ye=\"function\"===typeof ze.oninput}xe=ye}else xe=!1;we=xe&&(!document.documentMode||9<document.documentMode)}function Ae(){pe&&(pe.detachEvent(\"onpropertychange\",Be),qe=pe=null)}function Be(a){if(\"value\"===a.propertyName&&te(qe)){var b=[];ne(b,qe,a,xb(a));Jb(re,b)}}\nfunction Ce(a,b,c){\"focusin\"===a?(Ae(),pe=b,qe=c,pe.attachEvent(\"onpropertychange\",Be)):\"focusout\"===a&&Ae()}function De(a){if(\"selectionchange\"===a||\"keyup\"===a||\"keydown\"===a)return te(qe)}function Ee(a,b){if(\"click\"===a)return te(b)}function Fe(a,b){if(\"input\"===a||\"change\"===a)return te(b)}function Ge(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}var He=\"function\"===typeof Object.is?Object.is:Ge;\nfunction Ie(a,b){if(He(a,b))return!0;if(\"object\"!==typeof a||null===a||\"object\"!==typeof b||null===b)return!1;var c=Object.keys(a),d=Object.keys(b);if(c.length!==d.length)return!1;for(d=0;d<c.length;d++){var e=c[d];if(!ja.call(b,e)||!He(a[e],b[e]))return!1}return!0}function Je(a){for(;a&&a.firstChild;)a=a.firstChild;return a}\nfunction Ke(a,b){var c=Je(a);a=0;for(var d;c;){if(3===c.nodeType){d=a+c.textContent.length;if(a<=b&&d>=b)return{node:c,offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=Je(c)}}function Le(a,b){return a&&b?a===b?!0:a&&3===a.nodeType?!1:b&&3===b.nodeType?Le(a,b.parentNode):\"contains\"in a?a.contains(b):a.compareDocumentPosition?!!(a.compareDocumentPosition(b)&16):!1:!1}\nfunction Me(){for(var a=window,b=Xa();b instanceof a.HTMLIFrameElement;){try{var c=\"string\"===typeof b.contentWindow.location.href}catch(d){c=!1}if(c)a=b.contentWindow;else break;b=Xa(a.document)}return b}function Ne(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&(\"input\"===b&&(\"text\"===a.type||\"search\"===a.type||\"tel\"===a.type||\"url\"===a.type||\"password\"===a.type)||\"textarea\"===b||\"true\"===a.contentEditable)}\nfunction Oe(a){var b=Me(),c=a.focusedElem,d=a.selectionRange;if(b!==c&&c&&c.ownerDocument&&Le(c.ownerDocument.documentElement,c)){if(null!==d&&Ne(c))if(b=d.start,a=d.end,void 0===a&&(a=b),\"selectionStart\"in c)c.selectionStart=b,c.selectionEnd=Math.min(a,c.value.length);else if(a=(b=c.ownerDocument||document)&&b.defaultView||window,a.getSelection){a=a.getSelection();var e=c.textContent.length,f=Math.min(d.start,e);d=void 0===d.end?f:Math.min(d.end,e);!a.extend&&f>d&&(e=d,d=f,f=e);e=Ke(c,f);var g=Ke(c,\nd);e&&g&&(1!==a.rangeCount||a.anchorNode!==e.node||a.anchorOffset!==e.offset||a.focusNode!==g.node||a.focusOffset!==g.offset)&&(b=b.createRange(),b.setStart(e.node,e.offset),a.removeAllRanges(),f>d?(a.addRange(b),a.extend(g.node,g.offset)):(b.setEnd(g.node,g.offset),a.addRange(b)))}b=[];for(a=c;a=a.parentNode;)1===a.nodeType&&b.push({element:a,left:a.scrollLeft,top:a.scrollTop});\"function\"===typeof c.focus&&c.focus();for(c=0;c<b.length;c++)a=b[c],a.element.scrollLeft=a.left,a.element.scrollTop=a.top}}\nvar Pe=ia&&\"documentMode\"in document&&11>=document.documentMode,Qe=null,Re=null,Se=null,Te=!1;\nfunction Ue(a,b,c){var d=c.window===c?c.document:9===c.nodeType?c:c.ownerDocument;Te||null==Qe||Qe!==Xa(d)||(d=Qe,\"selectionStart\"in d&&Ne(d)?d={start:d.selectionStart,end:d.selectionEnd}:(d=(d.ownerDocument&&d.ownerDocument.defaultView||window).getSelection(),d={anchorNode:d.anchorNode,anchorOffset:d.anchorOffset,focusNode:d.focusNode,focusOffset:d.focusOffset}),Se&&Ie(Se,d)||(Se=d,d=oe(Re,\"onSelect\"),0<d.length&&(b=new td(\"onSelect\",\"select\",null,b,c),a.push({event:b,listeners:d}),b.target=Qe)))}\nfunction Ve(a,b){var c={};c[a.toLowerCase()]=b.toLowerCase();c[\"Webkit\"+a]=\"webkit\"+b;c[\"Moz\"+a]=\"moz\"+b;return c}var We={animationend:Ve(\"Animation\",\"AnimationEnd\"),animationiteration:Ve(\"Animation\",\"AnimationIteration\"),animationstart:Ve(\"Animation\",\"AnimationStart\"),transitionend:Ve(\"Transition\",\"TransitionEnd\")},Xe={},Ye={};\nia&&(Ye=document.createElement(\"div\").style,\"AnimationEvent\"in window||(delete We.animationend.animation,delete We.animationiteration.animation,delete We.animationstart.animation),\"TransitionEvent\"in window||delete We.transitionend.transition);function Ze(a){if(Xe[a])return Xe[a];if(!We[a])return a;var b=We[a],c;for(c in b)if(b.hasOwnProperty(c)&&c in Ye)return Xe[a]=b[c];return a}var $e=Ze(\"animationend\"),af=Ze(\"animationiteration\"),bf=Ze(\"animationstart\"),cf=Ze(\"transitionend\"),df=new Map,ef=\"abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel\".split(\" \");\nfunction ff(a,b){df.set(a,b);fa(b,[a])}for(var gf=0;gf<ef.length;gf++){var hf=ef[gf],jf=hf.toLowerCase(),kf=hf[0].toUpperCase()+hf.slice(1);ff(jf,\"on\"+kf)}ff($e,\"onAnimationEnd\");ff(af,\"onAnimationIteration\");ff(bf,\"onAnimationStart\");ff(\"dblclick\",\"onDoubleClick\");ff(\"focusin\",\"onFocus\");ff(\"focusout\",\"onBlur\");ff(cf,\"onTransitionEnd\");ha(\"onMouseEnter\",[\"mouseout\",\"mouseover\"]);ha(\"onMouseLeave\",[\"mouseout\",\"mouseover\"]);ha(\"onPointerEnter\",[\"pointerout\",\"pointerover\"]);\nha(\"onPointerLeave\",[\"pointerout\",\"pointerover\"]);fa(\"onChange\",\"change click focusin focusout input keydown keyup selectionchange\".split(\" \"));fa(\"onSelect\",\"focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange\".split(\" \"));fa(\"onBeforeInput\",[\"compositionend\",\"keypress\",\"textInput\",\"paste\"]);fa(\"onCompositionEnd\",\"compositionend focusout keydown keypress keyup mousedown\".split(\" \"));fa(\"onCompositionStart\",\"compositionstart focusout keydown keypress keyup mousedown\".split(\" \"));\nfa(\"onCompositionUpdate\",\"compositionupdate focusout keydown keypress keyup mousedown\".split(\" \"));var lf=\"abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting\".split(\" \"),mf=new Set(\"cancel close invalid load scroll toggle\".split(\" \").concat(lf));\nfunction nf(a,b,c){var d=a.type||\"unknown-event\";a.currentTarget=c;Ub(d,b,void 0,a);a.currentTarget=null}\nfunction se(a,b){b=0!==(b&4);for(var c=0;c<a.length;c++){var d=a[c],e=d.event;d=d.listeners;a:{var f=void 0;if(b)for(var g=d.length-1;0<=g;g--){var h=d[g],k=h.instance,l=h.currentTarget;h=h.listener;if(k!==f&&e.isPropagationStopped())break a;nf(e,h,l);f=k}else for(g=0;g<d.length;g++){h=d[g];k=h.instance;l=h.currentTarget;h=h.listener;if(k!==f&&e.isPropagationStopped())break a;nf(e,h,l);f=k}}}if(Qb)throw a=Rb,Qb=!1,Rb=null,a;}\nfunction D(a,b){var c=b[of];void 0===c&&(c=b[of]=new Set);var d=a+\"__bubble\";c.has(d)||(pf(b,a,2,!1),c.add(d))}function qf(a,b,c){var d=0;b&&(d|=4);pf(c,a,d,b)}var rf=\"_reactListening\"+Math.random().toString(36).slice(2);function sf(a){if(!a[rf]){a[rf]=!0;da.forEach(function(b){\"selectionchange\"!==b&&(mf.has(b)||qf(b,!1,a),qf(b,!0,a))});var b=9===a.nodeType?a:a.ownerDocument;null===b||b[rf]||(b[rf]=!0,qf(\"selectionchange\",!1,b))}}\nfunction pf(a,b,c,d){switch(jd(b)){case 1:var e=ed;break;case 4:e=gd;break;default:e=fd}c=e.bind(null,b,c,a);e=void 0;!Lb||\"touchstart\"!==b&&\"touchmove\"!==b&&\"wheel\"!==b||(e=!0);d?void 0!==e?a.addEventListener(b,c,{capture:!0,passive:e}):a.addEventListener(b,c,!0):void 0!==e?a.addEventListener(b,c,{passive:e}):a.addEventListener(b,c,!1)}\nfunction hd(a,b,c,d,e){var f=d;if(0===(b&1)&&0===(b&2)&&null!==d)a:for(;;){if(null===d)return;var g=d.tag;if(3===g||4===g){var h=d.stateNode.containerInfo;if(h===e||8===h.nodeType&&h.parentNode===e)break;if(4===g)for(g=d.return;null!==g;){var k=g.tag;if(3===k||4===k)if(k=g.stateNode.containerInfo,k===e||8===k.nodeType&&k.parentNode===e)return;g=g.return}for(;null!==h;){g=Wc(h);if(null===g)return;k=g.tag;if(5===k||6===k){d=f=g;continue a}h=h.parentNode}}d=d.return}Jb(function(){var d=f,e=xb(c),g=[];\na:{var h=df.get(a);if(void 0!==h){var k=td,n=a;switch(a){case \"keypress\":if(0===od(c))break a;case \"keydown\":case \"keyup\":k=Rd;break;case \"focusin\":n=\"focus\";k=Fd;break;case \"focusout\":n=\"blur\";k=Fd;break;case \"beforeblur\":case \"afterblur\":k=Fd;break;case \"click\":if(2===c.button)break a;case \"auxclick\":case \"dblclick\":case \"mousedown\":case \"mousemove\":case \"mouseup\":case \"mouseout\":case \"mouseover\":case \"contextmenu\":k=Bd;break;case \"drag\":case \"dragend\":case \"dragenter\":case \"dragexit\":case \"dragleave\":case \"dragover\":case \"dragstart\":case \"drop\":k=\nDd;break;case \"touchcancel\":case \"touchend\":case \"touchmove\":case \"touchstart\":k=Vd;break;case $e:case af:case bf:k=Hd;break;case cf:k=Xd;break;case \"scroll\":k=vd;break;case \"wheel\":k=Zd;break;case \"copy\":case \"cut\":case \"paste\":k=Jd;break;case \"gotpointercapture\":case \"lostpointercapture\":case \"pointercancel\":case \"pointerdown\":case \"pointermove\":case \"pointerout\":case \"pointerover\":case \"pointerup\":k=Td}var t=0!==(b&4),J=!t&&\"scroll\"===a,x=t?null!==h?h+\"Capture\":null:h;t=[];for(var w=d,u;null!==\nw;){u=w;var F=u.stateNode;5===u.tag&&null!==F&&(u=F,null!==x&&(F=Kb(w,x),null!=F&&t.push(tf(w,F,u))));if(J)break;w=w.return}0<t.length&&(h=new k(h,n,null,c,e),g.push({event:h,listeners:t}))}}if(0===(b&7)){a:{h=\"mouseover\"===a||\"pointerover\"===a;k=\"mouseout\"===a||\"pointerout\"===a;if(h&&c!==wb&&(n=c.relatedTarget||c.fromElement)&&(Wc(n)||n[uf]))break a;if(k||h){h=e.window===e?e:(h=e.ownerDocument)?h.defaultView||h.parentWindow:window;if(k){if(n=c.relatedTarget||c.toElement,k=d,n=n?Wc(n):null,null!==\nn&&(J=Vb(n),n!==J||5!==n.tag&&6!==n.tag))n=null}else k=null,n=d;if(k!==n){t=Bd;F=\"onMouseLeave\";x=\"onMouseEnter\";w=\"mouse\";if(\"pointerout\"===a||\"pointerover\"===a)t=Td,F=\"onPointerLeave\",x=\"onPointerEnter\",w=\"pointer\";J=null==k?h:ue(k);u=null==n?h:ue(n);h=new t(F,w+\"leave\",k,c,e);h.target=J;h.relatedTarget=u;F=null;Wc(e)===d&&(t=new t(x,w+\"enter\",n,c,e),t.target=u,t.relatedTarget=J,F=t);J=F;if(k&&n)b:{t=k;x=n;w=0;for(u=t;u;u=vf(u))w++;u=0;for(F=x;F;F=vf(F))u++;for(;0<w-u;)t=vf(t),w--;for(;0<u-w;)x=\nvf(x),u--;for(;w--;){if(t===x||null!==x&&t===x.alternate)break b;t=vf(t);x=vf(x)}t=null}else t=null;null!==k&&wf(g,h,k,t,!1);null!==n&&null!==J&&wf(g,J,n,t,!0)}}}a:{h=d?ue(d):window;k=h.nodeName&&h.nodeName.toLowerCase();if(\"select\"===k||\"input\"===k&&\"file\"===h.type)var na=ve;else if(me(h))if(we)na=Fe;else{na=De;var xa=Ce}else(k=h.nodeName)&&\"input\"===k.toLowerCase()&&(\"checkbox\"===h.type||\"radio\"===h.type)&&(na=Ee);if(na&&(na=na(a,d))){ne(g,na,c,e);break a}xa&&xa(a,h,d);\"focusout\"===a&&(xa=h._wrapperState)&&\nxa.controlled&&\"number\"===h.type&&cb(h,\"number\",h.value)}xa=d?ue(d):window;switch(a){case \"focusin\":if(me(xa)||\"true\"===xa.contentEditable)Qe=xa,Re=d,Se=null;break;case \"focusout\":Se=Re=Qe=null;break;case \"mousedown\":Te=!0;break;case \"contextmenu\":case \"mouseup\":case \"dragend\":Te=!1;Ue(g,c,e);break;case \"selectionchange\":if(Pe)break;case \"keydown\":case \"keyup\":Ue(g,c,e)}var $a;if(ae)b:{switch(a){case \"compositionstart\":var ba=\"onCompositionStart\";break b;case \"compositionend\":ba=\"onCompositionEnd\";\nbreak b;case \"compositionupdate\":ba=\"onCompositionUpdate\";break b}ba=void 0}else ie?ge(a,c)&&(ba=\"onCompositionEnd\"):\"keydown\"===a&&229===c.keyCode&&(ba=\"onCompositionStart\");ba&&(de&&\"ko\"!==c.locale&&(ie||\"onCompositionStart\"!==ba?\"onCompositionEnd\"===ba&&ie&&($a=nd()):(kd=e,ld=\"value\"in kd?kd.value:kd.textContent,ie=!0)),xa=oe(d,ba),0<xa.length&&(ba=new Ld(ba,a,null,c,e),g.push({event:ba,listeners:xa}),$a?ba.data=$a:($a=he(c),null!==$a&&(ba.data=$a))));if($a=ce?je(a,c):ke(a,c))d=oe(d,\"onBeforeInput\"),\n0<d.length&&(e=new Ld(\"onBeforeInput\",\"beforeinput\",null,c,e),g.push({event:e,listeners:d}),e.data=$a)}se(g,b)})}function tf(a,b,c){return{instance:a,listener:b,currentTarget:c}}function oe(a,b){for(var c=b+\"Capture\",d=[];null!==a;){var e=a,f=e.stateNode;5===e.tag&&null!==f&&(e=f,f=Kb(a,c),null!=f&&d.unshift(tf(a,f,e)),f=Kb(a,b),null!=f&&d.push(tf(a,f,e)));a=a.return}return d}function vf(a){if(null===a)return null;do a=a.return;while(a&&5!==a.tag);return a?a:null}\nfunction wf(a,b,c,d,e){for(var f=b._reactName,g=[];null!==c&&c!==d;){var h=c,k=h.alternate,l=h.stateNode;if(null!==k&&k===d)break;5===h.tag&&null!==l&&(h=l,e?(k=Kb(c,f),null!=k&&g.unshift(tf(c,k,h))):e||(k=Kb(c,f),null!=k&&g.push(tf(c,k,h))));c=c.return}0!==g.length&&a.push({event:b,listeners:g})}var xf=/\\r\\n?/g,yf=/\\u0000|\\uFFFD/g;function zf(a){return(\"string\"===typeof a?a:\"\"+a).replace(xf,\"\\n\").replace(yf,\"\")}function Af(a,b,c){b=zf(b);if(zf(a)!==b&&c)throw Error(p(425));}function Bf(){}\nvar Cf=null,Df=null;function Ef(a,b){return\"textarea\"===a||\"noscript\"===a||\"string\"===typeof b.children||\"number\"===typeof b.children||\"object\"===typeof b.dangerouslySetInnerHTML&&null!==b.dangerouslySetInnerHTML&&null!=b.dangerouslySetInnerHTML.__html}\nvar Ff=\"function\"===typeof setTimeout?setTimeout:void 0,Gf=\"function\"===typeof clearTimeout?clearTimeout:void 0,Hf=\"function\"===typeof Promise?Promise:void 0,Jf=\"function\"===typeof queueMicrotask?queueMicrotask:\"undefined\"!==typeof Hf?function(a){return Hf.resolve(null).then(a).catch(If)}:Ff;function If(a){setTimeout(function(){throw a;})}\nfunction Kf(a,b){var c=b,d=0;do{var e=c.nextSibling;a.removeChild(c);if(e&&8===e.nodeType)if(c=e.data,\"/$\"===c){if(0===d){a.removeChild(e);bd(b);return}d--}else\"$\"!==c&&\"$?\"!==c&&\"$!\"!==c||d++;c=e}while(c);bd(b)}function Lf(a){for(;null!=a;a=a.nextSibling){var b=a.nodeType;if(1===b||3===b)break;if(8===b){b=a.data;if(\"$\"===b||\"$!\"===b||\"$?\"===b)break;if(\"/$\"===b)return null}}return a}\nfunction Mf(a){a=a.previousSibling;for(var b=0;a;){if(8===a.nodeType){var c=a.data;if(\"$\"===c||\"$!\"===c||\"$?\"===c){if(0===b)return a;b--}else\"/$\"===c&&b++}a=a.previousSibling}return null}var Nf=Math.random().toString(36).slice(2),Of=\"__reactFiber$\"+Nf,Pf=\"__reactProps$\"+Nf,uf=\"__reactContainer$\"+Nf,of=\"__reactEvents$\"+Nf,Qf=\"__reactListeners$\"+Nf,Rf=\"__reactHandles$\"+Nf;\nfunction Wc(a){var b=a[Of];if(b)return b;for(var c=a.parentNode;c;){if(b=c[uf]||c[Of]){c=b.alternate;if(null!==b.child||null!==c&&null!==c.child)for(a=Mf(a);null!==a;){if(c=a[Of])return c;a=Mf(a)}return b}a=c;c=a.parentNode}return null}function Cb(a){a=a[Of]||a[uf];return!a||5!==a.tag&&6!==a.tag&&13!==a.tag&&3!==a.tag?null:a}function ue(a){if(5===a.tag||6===a.tag)return a.stateNode;throw Error(p(33));}function Db(a){return a[Pf]||null}var Sf=[],Tf=-1;function Uf(a){return{current:a}}\nfunction E(a){0>Tf||(a.current=Sf[Tf],Sf[Tf]=null,Tf--)}function G(a,b){Tf++;Sf[Tf]=a.current;a.current=b}var Vf={},H=Uf(Vf),Wf=Uf(!1),Xf=Vf;function Yf(a,b){var c=a.type.contextTypes;if(!c)return Vf;var d=a.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===b)return d.__reactInternalMemoizedMaskedChildContext;var e={},f;for(f in c)e[f]=b[f];d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=b,a.__reactInternalMemoizedMaskedChildContext=e);return e}\nfunction Zf(a){a=a.childContextTypes;return null!==a&&void 0!==a}function $f(){E(Wf);E(H)}function ag(a,b,c){if(H.current!==Vf)throw Error(p(168));G(H,b);G(Wf,c)}function bg(a,b,c){var d=a.stateNode;b=b.childContextTypes;if(\"function\"!==typeof d.getChildContext)return c;d=d.getChildContext();for(var e in d)if(!(e in b))throw Error(p(108,Ra(a)||\"Unknown\",e));return A({},c,d)}\nfunction cg(a){a=(a=a.stateNode)&&a.__reactInternalMemoizedMergedChildContext||Vf;Xf=H.current;G(H,a);G(Wf,Wf.current);return!0}function dg(a,b,c){var d=a.stateNode;if(!d)throw Error(p(169));c?(a=bg(a,b,Xf),d.__reactInternalMemoizedMergedChildContext=a,E(Wf),E(H),G(H,a)):E(Wf);G(Wf,c)}var eg=null,fg=!1,gg=!1;function hg(a){null===eg?eg=[a]:eg.push(a)}function ig(a){fg=!0;hg(a)}\nfunction jg(){if(!gg&&null!==eg){gg=!0;var a=0,b=C;try{var c=eg;for(C=1;a<c.length;a++){var d=c[a];do d=d(!0);while(null!==d)}eg=null;fg=!1}catch(e){throw null!==eg&&(eg=eg.slice(a+1)),ac(fc,jg),e;}finally{C=b,gg=!1}}return null}var kg=[],lg=0,mg=null,ng=0,og=[],pg=0,qg=null,rg=1,sg=\"\";function tg(a,b){kg[lg++]=ng;kg[lg++]=mg;mg=a;ng=b}\nfunction ug(a,b,c){og[pg++]=rg;og[pg++]=sg;og[pg++]=qg;qg=a;var d=rg;a=sg;var e=32-oc(d)-1;d&=~(1<<e);c+=1;var f=32-oc(b)+e;if(30<f){var g=e-e%5;f=(d&(1<<g)-1).toString(32);d>>=g;e-=g;rg=1<<32-oc(b)+e|c<<e|d;sg=f+a}else rg=1<<f|c<<e|d,sg=a}function vg(a){null!==a.return&&(tg(a,1),ug(a,1,0))}function wg(a){for(;a===mg;)mg=kg[--lg],kg[lg]=null,ng=kg[--lg],kg[lg]=null;for(;a===qg;)qg=og[--pg],og[pg]=null,sg=og[--pg],og[pg]=null,rg=og[--pg],og[pg]=null}var xg=null,yg=null,I=!1,zg=null;\nfunction Ag(a,b){var c=Bg(5,null,null,0);c.elementType=\"DELETED\";c.stateNode=b;c.return=a;b=a.deletions;null===b?(a.deletions=[c],a.flags|=16):b.push(c)}\nfunction Cg(a,b){switch(a.tag){case 5:var c=a.type;b=1!==b.nodeType||c.toLowerCase()!==b.nodeName.toLowerCase()?null:b;return null!==b?(a.stateNode=b,xg=a,yg=Lf(b.firstChild),!0):!1;case 6:return b=\"\"===a.pendingProps||3!==b.nodeType?null:b,null!==b?(a.stateNode=b,xg=a,yg=null,!0):!1;case 13:return b=8!==b.nodeType?null:b,null!==b?(c=null!==qg?{id:rg,overflow:sg}:null,a.memoizedState={dehydrated:b,treeContext:c,retryLane:1073741824},c=Bg(18,null,null,0),c.stateNode=b,c.return=a,a.child=c,xg=a,yg=\nnull,!0):!1;default:return!1}}function Dg(a){return 0!==(a.mode&1)&&0===(a.flags&128)}function Eg(a){if(I){var b=yg;if(b){var c=b;if(!Cg(a,b)){if(Dg(a))throw Error(p(418));b=Lf(c.nextSibling);var d=xg;b&&Cg(a,b)?Ag(d,c):(a.flags=a.flags&-4097|2,I=!1,xg=a)}}else{if(Dg(a))throw Error(p(418));a.flags=a.flags&-4097|2;I=!1;xg=a}}}function Fg(a){for(a=a.return;null!==a&&5!==a.tag&&3!==a.tag&&13!==a.tag;)a=a.return;xg=a}\nfunction Gg(a){if(a!==xg)return!1;if(!I)return Fg(a),I=!0,!1;var b;(b=3!==a.tag)&&!(b=5!==a.tag)&&(b=a.type,b=\"head\"!==b&&\"body\"!==b&&!Ef(a.type,a.memoizedProps));if(b&&(b=yg)){if(Dg(a))throw Hg(),Error(p(418));for(;b;)Ag(a,b),b=Lf(b.nextSibling)}Fg(a);if(13===a.tag){a=a.memoizedState;a=null!==a?a.dehydrated:null;if(!a)throw Error(p(317));a:{a=a.nextSibling;for(b=0;a;){if(8===a.nodeType){var c=a.data;if(\"/$\"===c){if(0===b){yg=Lf(a.nextSibling);break a}b--}else\"$\"!==c&&\"$!\"!==c&&\"$?\"!==c||b++}a=a.nextSibling}yg=\nnull}}else yg=xg?Lf(a.stateNode.nextSibling):null;return!0}function Hg(){for(var a=yg;a;)a=Lf(a.nextSibling)}function Ig(){yg=xg=null;I=!1}function Jg(a){null===zg?zg=[a]:zg.push(a)}var Kg=ua.ReactCurrentBatchConfig;\nfunction Lg(a,b,c){a=c.ref;if(null!==a&&\"function\"!==typeof a&&\"object\"!==typeof a){if(c._owner){c=c._owner;if(c){if(1!==c.tag)throw Error(p(309));var d=c.stateNode}if(!d)throw Error(p(147,a));var e=d,f=\"\"+a;if(null!==b&&null!==b.ref&&\"function\"===typeof b.ref&&b.ref._stringRef===f)return b.ref;b=function(a){var b=e.refs;null===a?delete b[f]:b[f]=a};b._stringRef=f;return b}if(\"string\"!==typeof a)throw Error(p(284));if(!c._owner)throw Error(p(290,a));}return a}\nfunction Mg(a,b){a=Object.prototype.toString.call(b);throw Error(p(31,\"[object Object]\"===a?\"object with keys {\"+Object.keys(b).join(\", \")+\"}\":a));}function Ng(a){var b=a._init;return b(a._payload)}\nfunction Og(a){function b(b,c){if(a){var d=b.deletions;null===d?(b.deletions=[c],b.flags|=16):d.push(c)}}function c(c,d){if(!a)return null;for(;null!==d;)b(c,d),d=d.sibling;return null}function d(a,b){for(a=new Map;null!==b;)null!==b.key?a.set(b.key,b):a.set(b.index,b),b=b.sibling;return a}function e(a,b){a=Pg(a,b);a.index=0;a.sibling=null;return a}function f(b,c,d){b.index=d;if(!a)return b.flags|=1048576,c;d=b.alternate;if(null!==d)return d=d.index,d<c?(b.flags|=2,c):d;b.flags|=2;return c}function g(b){a&&\nnull===b.alternate&&(b.flags|=2);return b}function h(a,b,c,d){if(null===b||6!==b.tag)return b=Qg(c,a.mode,d),b.return=a,b;b=e(b,c);b.return=a;return b}function k(a,b,c,d){var f=c.type;if(f===ya)return m(a,b,c.props.children,d,c.key);if(null!==b&&(b.elementType===f||\"object\"===typeof f&&null!==f&&f.$$typeof===Ha&&Ng(f)===b.type))return d=e(b,c.props),d.ref=Lg(a,b,c),d.return=a,d;d=Rg(c.type,c.key,c.props,null,a.mode,d);d.ref=Lg(a,b,c);d.return=a;return d}function l(a,b,c,d){if(null===b||4!==b.tag||\nb.stateNode.containerInfo!==c.containerInfo||b.stateNode.implementation!==c.implementation)return b=Sg(c,a.mode,d),b.return=a,b;b=e(b,c.children||[]);b.return=a;return b}function m(a,b,c,d,f){if(null===b||7!==b.tag)return b=Tg(c,a.mode,d,f),b.return=a,b;b=e(b,c);b.return=a;return b}function q(a,b,c){if(\"string\"===typeof b&&\"\"!==b||\"number\"===typeof b)return b=Qg(\"\"+b,a.mode,c),b.return=a,b;if(\"object\"===typeof b&&null!==b){switch(b.$$typeof){case va:return c=Rg(b.type,b.key,b.props,null,a.mode,c),\nc.ref=Lg(a,null,b),c.return=a,c;case wa:return b=Sg(b,a.mode,c),b.return=a,b;case Ha:var d=b._init;return q(a,d(b._payload),c)}if(eb(b)||Ka(b))return b=Tg(b,a.mode,c,null),b.return=a,b;Mg(a,b)}return null}function r(a,b,c,d){var e=null!==b?b.key:null;if(\"string\"===typeof c&&\"\"!==c||\"number\"===typeof c)return null!==e?null:h(a,b,\"\"+c,d);if(\"object\"===typeof c&&null!==c){switch(c.$$typeof){case va:return c.key===e?k(a,b,c,d):null;case wa:return c.key===e?l(a,b,c,d):null;case Ha:return e=c._init,r(a,\nb,e(c._payload),d)}if(eb(c)||Ka(c))return null!==e?null:m(a,b,c,d,null);Mg(a,c)}return null}function y(a,b,c,d,e){if(\"string\"===typeof d&&\"\"!==d||\"number\"===typeof d)return a=a.get(c)||null,h(b,a,\"\"+d,e);if(\"object\"===typeof d&&null!==d){switch(d.$$typeof){case va:return a=a.get(null===d.key?c:d.key)||null,k(b,a,d,e);case wa:return a=a.get(null===d.key?c:d.key)||null,l(b,a,d,e);case Ha:var f=d._init;return y(a,b,c,f(d._payload),e)}if(eb(d)||Ka(d))return a=a.get(c)||null,m(b,a,d,e,null);Mg(b,d)}return null}\nfunction n(e,g,h,k){for(var l=null,m=null,u=g,w=g=0,x=null;null!==u&&w<h.length;w++){u.index>w?(x=u,u=null):x=u.sibling;var n=r(e,u,h[w],k);if(null===n){null===u&&(u=x);break}a&&u&&null===n.alternate&&b(e,u);g=f(n,g,w);null===m?l=n:m.sibling=n;m=n;u=x}if(w===h.length)return c(e,u),I&&tg(e,w),l;if(null===u){for(;w<h.length;w++)u=q(e,h[w],k),null!==u&&(g=f(u,g,w),null===m?l=u:m.sibling=u,m=u);I&&tg(e,w);return l}for(u=d(e,u);w<h.length;w++)x=y(u,e,w,h[w],k),null!==x&&(a&&null!==x.alternate&&u.delete(null===\nx.key?w:x.key),g=f(x,g,w),null===m?l=x:m.sibling=x,m=x);a&&u.forEach(function(a){return b(e,a)});I&&tg(e,w);return l}function t(e,g,h,k){var l=Ka(h);if(\"function\"!==typeof l)throw Error(p(150));h=l.call(h);if(null==h)throw Error(p(151));for(var u=l=null,m=g,w=g=0,x=null,n=h.next();null!==m&&!n.done;w++,n=h.next()){m.index>w?(x=m,m=null):x=m.sibling;var t=r(e,m,n.value,k);if(null===t){null===m&&(m=x);break}a&&m&&null===t.alternate&&b(e,m);g=f(t,g,w);null===u?l=t:u.sibling=t;u=t;m=x}if(n.done)return c(e,\nm),I&&tg(e,w),l;if(null===m){for(;!n.done;w++,n=h.next())n=q(e,n.value,k),null!==n&&(g=f(n,g,w),null===u?l=n:u.sibling=n,u=n);I&&tg(e,w);return l}for(m=d(e,m);!n.done;w++,n=h.next())n=y(m,e,w,n.value,k),null!==n&&(a&&null!==n.alternate&&m.delete(null===n.key?w:n.key),g=f(n,g,w),null===u?l=n:u.sibling=n,u=n);a&&m.forEach(function(a){return b(e,a)});I&&tg(e,w);return l}function J(a,d,f,h){\"object\"===typeof f&&null!==f&&f.type===ya&&null===f.key&&(f=f.props.children);if(\"object\"===typeof f&&null!==f){switch(f.$$typeof){case va:a:{for(var k=\nf.key,l=d;null!==l;){if(l.key===k){k=f.type;if(k===ya){if(7===l.tag){c(a,l.sibling);d=e(l,f.props.children);d.return=a;a=d;break a}}else if(l.elementType===k||\"object\"===typeof k&&null!==k&&k.$$typeof===Ha&&Ng(k)===l.type){c(a,l.sibling);d=e(l,f.props);d.ref=Lg(a,l,f);d.return=a;a=d;break a}c(a,l);break}else b(a,l);l=l.sibling}f.type===ya?(d=Tg(f.props.children,a.mode,h,f.key),d.return=a,a=d):(h=Rg(f.type,f.key,f.props,null,a.mode,h),h.ref=Lg(a,d,f),h.return=a,a=h)}return g(a);case wa:a:{for(l=f.key;null!==\nd;){if(d.key===l)if(4===d.tag&&d.stateNode.containerInfo===f.containerInfo&&d.stateNode.implementation===f.implementation){c(a,d.sibling);d=e(d,f.children||[]);d.return=a;a=d;break a}else{c(a,d);break}else b(a,d);d=d.sibling}d=Sg(f,a.mode,h);d.return=a;a=d}return g(a);case Ha:return l=f._init,J(a,d,l(f._payload),h)}if(eb(f))return n(a,d,f,h);if(Ka(f))return t(a,d,f,h);Mg(a,f)}return\"string\"===typeof f&&\"\"!==f||\"number\"===typeof f?(f=\"\"+f,null!==d&&6===d.tag?(c(a,d.sibling),d=e(d,f),d.return=a,a=d):\n(c(a,d),d=Qg(f,a.mode,h),d.return=a,a=d),g(a)):c(a,d)}return J}var Ug=Og(!0),Vg=Og(!1),Wg=Uf(null),Xg=null,Yg=null,Zg=null;function $g(){Zg=Yg=Xg=null}function ah(a){var b=Wg.current;E(Wg);a._currentValue=b}function bh(a,b,c){for(;null!==a;){var d=a.alternate;(a.childLanes&b)!==b?(a.childLanes|=b,null!==d&&(d.childLanes|=b)):null!==d&&(d.childLanes&b)!==b&&(d.childLanes|=b);if(a===c)break;a=a.return}}\nfunction ch(a,b){Xg=a;Zg=Yg=null;a=a.dependencies;null!==a&&null!==a.firstContext&&(0!==(a.lanes&b)&&(dh=!0),a.firstContext=null)}function eh(a){var b=a._currentValue;if(Zg!==a)if(a={context:a,memoizedValue:b,next:null},null===Yg){if(null===Xg)throw Error(p(308));Yg=a;Xg.dependencies={lanes:0,firstContext:a}}else Yg=Yg.next=a;return b}var fh=null;function gh(a){null===fh?fh=[a]:fh.push(a)}\nfunction hh(a,b,c,d){var e=b.interleaved;null===e?(c.next=c,gh(b)):(c.next=e.next,e.next=c);b.interleaved=c;return ih(a,d)}function ih(a,b){a.lanes|=b;var c=a.alternate;null!==c&&(c.lanes|=b);c=a;for(a=a.return;null!==a;)a.childLanes|=b,c=a.alternate,null!==c&&(c.childLanes|=b),c=a,a=a.return;return 3===c.tag?c.stateNode:null}var jh=!1;function kh(a){a.updateQueue={baseState:a.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}\nfunction lh(a,b){a=a.updateQueue;b.updateQueue===a&&(b.updateQueue={baseState:a.baseState,firstBaseUpdate:a.firstBaseUpdate,lastBaseUpdate:a.lastBaseUpdate,shared:a.shared,effects:a.effects})}function mh(a,b){return{eventTime:a,lane:b,tag:0,payload:null,callback:null,next:null}}\nfunction nh(a,b,c){var d=a.updateQueue;if(null===d)return null;d=d.shared;if(0!==(K&2)){var e=d.pending;null===e?b.next=b:(b.next=e.next,e.next=b);d.pending=b;return ih(a,c)}e=d.interleaved;null===e?(b.next=b,gh(d)):(b.next=e.next,e.next=b);d.interleaved=b;return ih(a,c)}function oh(a,b,c){b=b.updateQueue;if(null!==b&&(b=b.shared,0!==(c&4194240))){var d=b.lanes;d&=a.pendingLanes;c|=d;b.lanes=c;Cc(a,c)}}\nfunction ph(a,b){var c=a.updateQueue,d=a.alternate;if(null!==d&&(d=d.updateQueue,c===d)){var e=null,f=null;c=c.firstBaseUpdate;if(null!==c){do{var g={eventTime:c.eventTime,lane:c.lane,tag:c.tag,payload:c.payload,callback:c.callback,next:null};null===f?e=f=g:f=f.next=g;c=c.next}while(null!==c);null===f?e=f=b:f=f.next=b}else e=f=b;c={baseState:d.baseState,firstBaseUpdate:e,lastBaseUpdate:f,shared:d.shared,effects:d.effects};a.updateQueue=c;return}a=c.lastBaseUpdate;null===a?c.firstBaseUpdate=b:a.next=\nb;c.lastBaseUpdate=b}\nfunction qh(a,b,c,d){var e=a.updateQueue;jh=!1;var f=e.firstBaseUpdate,g=e.lastBaseUpdate,h=e.shared.pending;if(null!==h){e.shared.pending=null;var k=h,l=k.next;k.next=null;null===g?f=l:g.next=l;g=k;var m=a.alternate;null!==m&&(m=m.updateQueue,h=m.lastBaseUpdate,h!==g&&(null===h?m.firstBaseUpdate=l:h.next=l,m.lastBaseUpdate=k))}if(null!==f){var q=e.baseState;g=0;m=l=k=null;h=f;do{var r=h.lane,y=h.eventTime;if((d&r)===r){null!==m&&(m=m.next={eventTime:y,lane:0,tag:h.tag,payload:h.payload,callback:h.callback,\nnext:null});a:{var n=a,t=h;r=b;y=c;switch(t.tag){case 1:n=t.payload;if(\"function\"===typeof n){q=n.call(y,q,r);break a}q=n;break a;case 3:n.flags=n.flags&-65537|128;case 0:n=t.payload;r=\"function\"===typeof n?n.call(y,q,r):n;if(null===r||void 0===r)break a;q=A({},q,r);break a;case 2:jh=!0}}null!==h.callback&&0!==h.lane&&(a.flags|=64,r=e.effects,null===r?e.effects=[h]:r.push(h))}else y={eventTime:y,lane:r,tag:h.tag,payload:h.payload,callback:h.callback,next:null},null===m?(l=m=y,k=q):m=m.next=y,g|=r;\nh=h.next;if(null===h)if(h=e.shared.pending,null===h)break;else r=h,h=r.next,r.next=null,e.lastBaseUpdate=r,e.shared.pending=null}while(1);null===m&&(k=q);e.baseState=k;e.firstBaseUpdate=l;e.lastBaseUpdate=m;b=e.shared.interleaved;if(null!==b){e=b;do g|=e.lane,e=e.next;while(e!==b)}else null===f&&(e.shared.lanes=0);rh|=g;a.lanes=g;a.memoizedState=q}}\nfunction sh(a,b,c){a=b.effects;b.effects=null;if(null!==a)for(b=0;b<a.length;b++){var d=a[b],e=d.callback;if(null!==e){d.callback=null;d=c;if(\"function\"!==typeof e)throw Error(p(191,e));e.call(d)}}}var th={},uh=Uf(th),vh=Uf(th),wh=Uf(th);function xh(a){if(a===th)throw Error(p(174));return a}\nfunction yh(a,b){G(wh,b);G(vh,a);G(uh,th);a=b.nodeType;switch(a){case 9:case 11:b=(b=b.documentElement)?b.namespaceURI:lb(null,\"\");break;default:a=8===a?b.parentNode:b,b=a.namespaceURI||null,a=a.tagName,b=lb(b,a)}E(uh);G(uh,b)}function zh(){E(uh);E(vh);E(wh)}function Ah(a){xh(wh.current);var b=xh(uh.current);var c=lb(b,a.type);b!==c&&(G(vh,a),G(uh,c))}function Bh(a){vh.current===a&&(E(uh),E(vh))}var L=Uf(0);\nfunction Ch(a){for(var b=a;null!==b;){if(13===b.tag){var c=b.memoizedState;if(null!==c&&(c=c.dehydrated,null===c||\"$?\"===c.data||\"$!\"===c.data))return b}else if(19===b.tag&&void 0!==b.memoizedProps.revealOrder){if(0!==(b.flags&128))return b}else if(null!==b.child){b.child.return=b;b=b.child;continue}if(b===a)break;for(;null===b.sibling;){if(null===b.return||b.return===a)return null;b=b.return}b.sibling.return=b.return;b=b.sibling}return null}var Dh=[];\nfunction Eh(){for(var a=0;a<Dh.length;a++)Dh[a]._workInProgressVersionPrimary=null;Dh.length=0}var Fh=ua.ReactCurrentDispatcher,Gh=ua.ReactCurrentBatchConfig,Hh=0,M=null,N=null,O=null,Ih=!1,Jh=!1,Kh=0,Lh=0;function P(){throw Error(p(321));}function Mh(a,b){if(null===b)return!1;for(var c=0;c<b.length&&c<a.length;c++)if(!He(a[c],b[c]))return!1;return!0}\nfunction Nh(a,b,c,d,e,f){Hh=f;M=b;b.memoizedState=null;b.updateQueue=null;b.lanes=0;Fh.current=null===a||null===a.memoizedState?Oh:Ph;a=c(d,e);if(Jh){f=0;do{Jh=!1;Kh=0;if(25<=f)throw Error(p(301));f+=1;O=N=null;b.updateQueue=null;Fh.current=Qh;a=c(d,e)}while(Jh)}Fh.current=Rh;b=null!==N&&null!==N.next;Hh=0;O=N=M=null;Ih=!1;if(b)throw Error(p(300));return a}function Sh(){var a=0!==Kh;Kh=0;return a}\nfunction Th(){var a={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};null===O?M.memoizedState=O=a:O=O.next=a;return O}function Uh(){if(null===N){var a=M.alternate;a=null!==a?a.memoizedState:null}else a=N.next;var b=null===O?M.memoizedState:O.next;if(null!==b)O=b,N=a;else{if(null===a)throw Error(p(310));N=a;a={memoizedState:N.memoizedState,baseState:N.baseState,baseQueue:N.baseQueue,queue:N.queue,next:null};null===O?M.memoizedState=O=a:O=O.next=a}return O}\nfunction Vh(a,b){return\"function\"===typeof b?b(a):b}\nfunction Wh(a){var b=Uh(),c=b.queue;if(null===c)throw Error(p(311));c.lastRenderedReducer=a;var d=N,e=d.baseQueue,f=c.pending;if(null!==f){if(null!==e){var g=e.next;e.next=f.next;f.next=g}d.baseQueue=e=f;c.pending=null}if(null!==e){f=e.next;d=d.baseState;var h=g=null,k=null,l=f;do{var m=l.lane;if((Hh&m)===m)null!==k&&(k=k.next={lane:0,action:l.action,hasEagerState:l.hasEagerState,eagerState:l.eagerState,next:null}),d=l.hasEagerState?l.eagerState:a(d,l.action);else{var q={lane:m,action:l.action,hasEagerState:l.hasEagerState,\neagerState:l.eagerState,next:null};null===k?(h=k=q,g=d):k=k.next=q;M.lanes|=m;rh|=m}l=l.next}while(null!==l&&l!==f);null===k?g=d:k.next=h;He(d,b.memoizedState)||(dh=!0);b.memoizedState=d;b.baseState=g;b.baseQueue=k;c.lastRenderedState=d}a=c.interleaved;if(null!==a){e=a;do f=e.lane,M.lanes|=f,rh|=f,e=e.next;while(e!==a)}else null===e&&(c.lanes=0);return[b.memoizedState,c.dispatch]}\nfunction Xh(a){var b=Uh(),c=b.queue;if(null===c)throw Error(p(311));c.lastRenderedReducer=a;var d=c.dispatch,e=c.pending,f=b.memoizedState;if(null!==e){c.pending=null;var g=e=e.next;do f=a(f,g.action),g=g.next;while(g!==e);He(f,b.memoizedState)||(dh=!0);b.memoizedState=f;null===b.baseQueue&&(b.baseState=f);c.lastRenderedState=f}return[f,d]}function Yh(){}\nfunction Zh(a,b){var c=M,d=Uh(),e=b(),f=!He(d.memoizedState,e);f&&(d.memoizedState=e,dh=!0);d=d.queue;$h(ai.bind(null,c,d,a),[a]);if(d.getSnapshot!==b||f||null!==O&&O.memoizedState.tag&1){c.flags|=2048;bi(9,ci.bind(null,c,d,e,b),void 0,null);if(null===Q)throw Error(p(349));0!==(Hh&30)||di(c,b,e)}return e}function di(a,b,c){a.flags|=16384;a={getSnapshot:b,value:c};b=M.updateQueue;null===b?(b={lastEffect:null,stores:null},M.updateQueue=b,b.stores=[a]):(c=b.stores,null===c?b.stores=[a]:c.push(a))}\nfunction ci(a,b,c,d){b.value=c;b.getSnapshot=d;ei(b)&&fi(a)}function ai(a,b,c){return c(function(){ei(b)&&fi(a)})}function ei(a){var b=a.getSnapshot;a=a.value;try{var c=b();return!He(a,c)}catch(d){return!0}}function fi(a){var b=ih(a,1);null!==b&&gi(b,a,1,-1)}\nfunction hi(a){var b=Th();\"function\"===typeof a&&(a=a());b.memoizedState=b.baseState=a;a={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:Vh,lastRenderedState:a};b.queue=a;a=a.dispatch=ii.bind(null,M,a);return[b.memoizedState,a]}\nfunction bi(a,b,c,d){a={tag:a,create:b,destroy:c,deps:d,next:null};b=M.updateQueue;null===b?(b={lastEffect:null,stores:null},M.updateQueue=b,b.lastEffect=a.next=a):(c=b.lastEffect,null===c?b.lastEffect=a.next=a:(d=c.next,c.next=a,a.next=d,b.lastEffect=a));return a}function ji(){return Uh().memoizedState}function ki(a,b,c,d){var e=Th();M.flags|=a;e.memoizedState=bi(1|b,c,void 0,void 0===d?null:d)}\nfunction li(a,b,c,d){var e=Uh();d=void 0===d?null:d;var f=void 0;if(null!==N){var g=N.memoizedState;f=g.destroy;if(null!==d&&Mh(d,g.deps)){e.memoizedState=bi(b,c,f,d);return}}M.flags|=a;e.memoizedState=bi(1|b,c,f,d)}function mi(a,b){return ki(8390656,8,a,b)}function $h(a,b){return li(2048,8,a,b)}function ni(a,b){return li(4,2,a,b)}function oi(a,b){return li(4,4,a,b)}\nfunction pi(a,b){if(\"function\"===typeof b)return a=a(),b(a),function(){b(null)};if(null!==b&&void 0!==b)return a=a(),b.current=a,function(){b.current=null}}function qi(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return li(4,4,pi.bind(null,b,a),c)}function ri(){}function si(a,b){var c=Uh();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&Mh(b,d[1]))return d[0];c.memoizedState=[a,b];return a}\nfunction ti(a,b){var c=Uh();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&Mh(b,d[1]))return d[0];a=a();c.memoizedState=[a,b];return a}function ui(a,b,c){if(0===(Hh&21))return a.baseState&&(a.baseState=!1,dh=!0),a.memoizedState=c;He(c,b)||(c=yc(),M.lanes|=c,rh|=c,a.baseState=!0);return b}function vi(a,b){var c=C;C=0!==c&&4>c?c:4;a(!0);var d=Gh.transition;Gh.transition={};try{a(!1),b()}finally{C=c,Gh.transition=d}}function wi(){return Uh().memoizedState}\nfunction xi(a,b,c){var d=yi(a);c={lane:d,action:c,hasEagerState:!1,eagerState:null,next:null};if(zi(a))Ai(b,c);else if(c=hh(a,b,c,d),null!==c){var e=R();gi(c,a,d,e);Bi(c,b,d)}}\nfunction ii(a,b,c){var d=yi(a),e={lane:d,action:c,hasEagerState:!1,eagerState:null,next:null};if(zi(a))Ai(b,e);else{var f=a.alternate;if(0===a.lanes&&(null===f||0===f.lanes)&&(f=b.lastRenderedReducer,null!==f))try{var g=b.lastRenderedState,h=f(g,c);e.hasEagerState=!0;e.eagerState=h;if(He(h,g)){var k=b.interleaved;null===k?(e.next=e,gh(b)):(e.next=k.next,k.next=e);b.interleaved=e;return}}catch(l){}finally{}c=hh(a,b,e,d);null!==c&&(e=R(),gi(c,a,d,e),Bi(c,b,d))}}\nfunction zi(a){var b=a.alternate;return a===M||null!==b&&b===M}function Ai(a,b){Jh=Ih=!0;var c=a.pending;null===c?b.next=b:(b.next=c.next,c.next=b);a.pending=b}function Bi(a,b,c){if(0!==(c&4194240)){var d=b.lanes;d&=a.pendingLanes;c|=d;b.lanes=c;Cc(a,c)}}\nvar Rh={readContext:eh,useCallback:P,useContext:P,useEffect:P,useImperativeHandle:P,useInsertionEffect:P,useLayoutEffect:P,useMemo:P,useReducer:P,useRef:P,useState:P,useDebugValue:P,useDeferredValue:P,useTransition:P,useMutableSource:P,useSyncExternalStore:P,useId:P,unstable_isNewReconciler:!1},Oh={readContext:eh,useCallback:function(a,b){Th().memoizedState=[a,void 0===b?null:b];return a},useContext:eh,useEffect:mi,useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return ki(4194308,\n4,pi.bind(null,b,a),c)},useLayoutEffect:function(a,b){return ki(4194308,4,a,b)},useInsertionEffect:function(a,b){return ki(4,2,a,b)},useMemo:function(a,b){var c=Th();b=void 0===b?null:b;a=a();c.memoizedState=[a,b];return a},useReducer:function(a,b,c){var d=Th();b=void 0!==c?c(b):b;d.memoizedState=d.baseState=b;a={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:a,lastRenderedState:b};d.queue=a;a=a.dispatch=xi.bind(null,M,a);return[d.memoizedState,a]},useRef:function(a){var b=\nTh();a={current:a};return b.memoizedState=a},useState:hi,useDebugValue:ri,useDeferredValue:function(a){return Th().memoizedState=a},useTransition:function(){var a=hi(!1),b=a[0];a=vi.bind(null,a[1]);Th().memoizedState=a;return[b,a]},useMutableSource:function(){},useSyncExternalStore:function(a,b,c){var d=M,e=Th();if(I){if(void 0===c)throw Error(p(407));c=c()}else{c=b();if(null===Q)throw Error(p(349));0!==(Hh&30)||di(d,b,c)}e.memoizedState=c;var f={value:c,getSnapshot:b};e.queue=f;mi(ai.bind(null,d,\nf,a),[a]);d.flags|=2048;bi(9,ci.bind(null,d,f,c,b),void 0,null);return c},useId:function(){var a=Th(),b=Q.identifierPrefix;if(I){var c=sg;var d=rg;c=(d&~(1<<32-oc(d)-1)).toString(32)+c;b=\":\"+b+\"R\"+c;c=Kh++;0<c&&(b+=\"H\"+c.toString(32));b+=\":\"}else c=Lh++,b=\":\"+b+\"r\"+c.toString(32)+\":\";return a.memoizedState=b},unstable_isNewReconciler:!1},Ph={readContext:eh,useCallback:si,useContext:eh,useEffect:$h,useImperativeHandle:qi,useInsertionEffect:ni,useLayoutEffect:oi,useMemo:ti,useReducer:Wh,useRef:ji,useState:function(){return Wh(Vh)},\nuseDebugValue:ri,useDeferredValue:function(a){var b=Uh();return ui(b,N.memoizedState,a)},useTransition:function(){var a=Wh(Vh)[0],b=Uh().memoizedState;return[a,b]},useMutableSource:Yh,useSyncExternalStore:Zh,useId:wi,unstable_isNewReconciler:!1},Qh={readContext:eh,useCallback:si,useContext:eh,useEffect:$h,useImperativeHandle:qi,useInsertionEffect:ni,useLayoutEffect:oi,useMemo:ti,useReducer:Xh,useRef:ji,useState:function(){return Xh(Vh)},useDebugValue:ri,useDeferredValue:function(a){var b=Uh();return null===\nN?b.memoizedState=a:ui(b,N.memoizedState,a)},useTransition:function(){var a=Xh(Vh)[0],b=Uh().memoizedState;return[a,b]},useMutableSource:Yh,useSyncExternalStore:Zh,useId:wi,unstable_isNewReconciler:!1};function Ci(a,b){if(a&&a.defaultProps){b=A({},b);a=a.defaultProps;for(var c in a)void 0===b[c]&&(b[c]=a[c]);return b}return b}function Di(a,b,c,d){b=a.memoizedState;c=c(d,b);c=null===c||void 0===c?b:A({},b,c);a.memoizedState=c;0===a.lanes&&(a.updateQueue.baseState=c)}\nvar Ei={isMounted:function(a){return(a=a._reactInternals)?Vb(a)===a:!1},enqueueSetState:function(a,b,c){a=a._reactInternals;var d=R(),e=yi(a),f=mh(d,e);f.payload=b;void 0!==c&&null!==c&&(f.callback=c);b=nh(a,f,e);null!==b&&(gi(b,a,e,d),oh(b,a,e))},enqueueReplaceState:function(a,b,c){a=a._reactInternals;var d=R(),e=yi(a),f=mh(d,e);f.tag=1;f.payload=b;void 0!==c&&null!==c&&(f.callback=c);b=nh(a,f,e);null!==b&&(gi(b,a,e,d),oh(b,a,e))},enqueueForceUpdate:function(a,b){a=a._reactInternals;var c=R(),d=\nyi(a),e=mh(c,d);e.tag=2;void 0!==b&&null!==b&&(e.callback=b);b=nh(a,e,d);null!==b&&(gi(b,a,d,c),oh(b,a,d))}};function Fi(a,b,c,d,e,f,g){a=a.stateNode;return\"function\"===typeof a.shouldComponentUpdate?a.shouldComponentUpdate(d,f,g):b.prototype&&b.prototype.isPureReactComponent?!Ie(c,d)||!Ie(e,f):!0}\nfunction Gi(a,b,c){var d=!1,e=Vf;var f=b.contextType;\"object\"===typeof f&&null!==f?f=eh(f):(e=Zf(b)?Xf:H.current,d=b.contextTypes,f=(d=null!==d&&void 0!==d)?Yf(a,e):Vf);b=new b(c,f);a.memoizedState=null!==b.state&&void 0!==b.state?b.state:null;b.updater=Ei;a.stateNode=b;b._reactInternals=a;d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=e,a.__reactInternalMemoizedMaskedChildContext=f);return b}\nfunction Hi(a,b,c,d){a=b.state;\"function\"===typeof b.componentWillReceiveProps&&b.componentWillReceiveProps(c,d);\"function\"===typeof b.UNSAFE_componentWillReceiveProps&&b.UNSAFE_componentWillReceiveProps(c,d);b.state!==a&&Ei.enqueueReplaceState(b,b.state,null)}\nfunction Ii(a,b,c,d){var e=a.stateNode;e.props=c;e.state=a.memoizedState;e.refs={};kh(a);var f=b.contextType;\"object\"===typeof f&&null!==f?e.context=eh(f):(f=Zf(b)?Xf:H.current,e.context=Yf(a,f));e.state=a.memoizedState;f=b.getDerivedStateFromProps;\"function\"===typeof f&&(Di(a,b,f,c),e.state=a.memoizedState);\"function\"===typeof b.getDerivedStateFromProps||\"function\"===typeof e.getSnapshotBeforeUpdate||\"function\"!==typeof e.UNSAFE_componentWillMount&&\"function\"!==typeof e.componentWillMount||(b=e.state,\n\"function\"===typeof e.componentWillMount&&e.componentWillMount(),\"function\"===typeof e.UNSAFE_componentWillMount&&e.UNSAFE_componentWillMount(),b!==e.state&&Ei.enqueueReplaceState(e,e.state,null),qh(a,c,e,d),e.state=a.memoizedState);\"function\"===typeof e.componentDidMount&&(a.flags|=4194308)}function Ji(a,b){try{var c=\"\",d=b;do c+=Pa(d),d=d.return;while(d);var e=c}catch(f){e=\"\\nError generating stack: \"+f.message+\"\\n\"+f.stack}return{value:a,source:b,stack:e,digest:null}}\nfunction Ki(a,b,c){return{value:a,source:null,stack:null!=c?c:null,digest:null!=b?b:null}}function Li(a,b){try{console.error(b.value)}catch(c){setTimeout(function(){throw c;})}}var Mi=\"function\"===typeof WeakMap?WeakMap:Map;function Ni(a,b,c){c=mh(-1,c);c.tag=3;c.payload={element:null};var d=b.value;c.callback=function(){Oi||(Oi=!0,Pi=d);Li(a,b)};return c}\nfunction Qi(a,b,c){c=mh(-1,c);c.tag=3;var d=a.type.getDerivedStateFromError;if(\"function\"===typeof d){var e=b.value;c.payload=function(){return d(e)};c.callback=function(){Li(a,b)}}var f=a.stateNode;null!==f&&\"function\"===typeof f.componentDidCatch&&(c.callback=function(){Li(a,b);\"function\"!==typeof d&&(null===Ri?Ri=new Set([this]):Ri.add(this));var c=b.stack;this.componentDidCatch(b.value,{componentStack:null!==c?c:\"\"})});return c}\nfunction Si(a,b,c){var d=a.pingCache;if(null===d){d=a.pingCache=new Mi;var e=new Set;d.set(b,e)}else e=d.get(b),void 0===e&&(e=new Set,d.set(b,e));e.has(c)||(e.add(c),a=Ti.bind(null,a,b,c),b.then(a,a))}function Ui(a){do{var b;if(b=13===a.tag)b=a.memoizedState,b=null!==b?null!==b.dehydrated?!0:!1:!0;if(b)return a;a=a.return}while(null!==a);return null}\nfunction Vi(a,b,c,d,e){if(0===(a.mode&1))return a===b?a.flags|=65536:(a.flags|=128,c.flags|=131072,c.flags&=-52805,1===c.tag&&(null===c.alternate?c.tag=17:(b=mh(-1,1),b.tag=2,nh(c,b,1))),c.lanes|=1),a;a.flags|=65536;a.lanes=e;return a}var Wi=ua.ReactCurrentOwner,dh=!1;function Xi(a,b,c,d){b.child=null===a?Vg(b,null,c,d):Ug(b,a.child,c,d)}\nfunction Yi(a,b,c,d,e){c=c.render;var f=b.ref;ch(b,e);d=Nh(a,b,c,d,f,e);c=Sh();if(null!==a&&!dh)return b.updateQueue=a.updateQueue,b.flags&=-2053,a.lanes&=~e,Zi(a,b,e);I&&c&&vg(b);b.flags|=1;Xi(a,b,d,e);return b.child}\nfunction $i(a,b,c,d,e){if(null===a){var f=c.type;if(\"function\"===typeof f&&!aj(f)&&void 0===f.defaultProps&&null===c.compare&&void 0===c.defaultProps)return b.tag=15,b.type=f,bj(a,b,f,d,e);a=Rg(c.type,null,d,b,b.mode,e);a.ref=b.ref;a.return=b;return b.child=a}f=a.child;if(0===(a.lanes&e)){var g=f.memoizedProps;c=c.compare;c=null!==c?c:Ie;if(c(g,d)&&a.ref===b.ref)return Zi(a,b,e)}b.flags|=1;a=Pg(f,d);a.ref=b.ref;a.return=b;return b.child=a}\nfunction bj(a,b,c,d,e){if(null!==a){var f=a.memoizedProps;if(Ie(f,d)&&a.ref===b.ref)if(dh=!1,b.pendingProps=d=f,0!==(a.lanes&e))0!==(a.flags&131072)&&(dh=!0);else return b.lanes=a.lanes,Zi(a,b,e)}return cj(a,b,c,d,e)}\nfunction dj(a,b,c){var d=b.pendingProps,e=d.children,f=null!==a?a.memoizedState:null;if(\"hidden\"===d.mode)if(0===(b.mode&1))b.memoizedState={baseLanes:0,cachePool:null,transitions:null},G(ej,fj),fj|=c;else{if(0===(c&1073741824))return a=null!==f?f.baseLanes|c:c,b.lanes=b.childLanes=1073741824,b.memoizedState={baseLanes:a,cachePool:null,transitions:null},b.updateQueue=null,G(ej,fj),fj|=a,null;b.memoizedState={baseLanes:0,cachePool:null,transitions:null};d=null!==f?f.baseLanes:c;G(ej,fj);fj|=d}else null!==\nf?(d=f.baseLanes|c,b.memoizedState=null):d=c,G(ej,fj),fj|=d;Xi(a,b,e,c);return b.child}function gj(a,b){var c=b.ref;if(null===a&&null!==c||null!==a&&a.ref!==c)b.flags|=512,b.flags|=2097152}function cj(a,b,c,d,e){var f=Zf(c)?Xf:H.current;f=Yf(b,f);ch(b,e);c=Nh(a,b,c,d,f,e);d=Sh();if(null!==a&&!dh)return b.updateQueue=a.updateQueue,b.flags&=-2053,a.lanes&=~e,Zi(a,b,e);I&&d&&vg(b);b.flags|=1;Xi(a,b,c,e);return b.child}\nfunction hj(a,b,c,d,e){if(Zf(c)){var f=!0;cg(b)}else f=!1;ch(b,e);if(null===b.stateNode)ij(a,b),Gi(b,c,d),Ii(b,c,d,e),d=!0;else if(null===a){var g=b.stateNode,h=b.memoizedProps;g.props=h;var k=g.context,l=c.contextType;\"object\"===typeof l&&null!==l?l=eh(l):(l=Zf(c)?Xf:H.current,l=Yf(b,l));var m=c.getDerivedStateFromProps,q=\"function\"===typeof m||\"function\"===typeof g.getSnapshotBeforeUpdate;q||\"function\"!==typeof g.UNSAFE_componentWillReceiveProps&&\"function\"!==typeof g.componentWillReceiveProps||\n(h!==d||k!==l)&&Hi(b,g,d,l);jh=!1;var r=b.memoizedState;g.state=r;qh(b,d,g,e);k=b.memoizedState;h!==d||r!==k||Wf.current||jh?(\"function\"===typeof m&&(Di(b,c,m,d),k=b.memoizedState),(h=jh||Fi(b,c,h,d,r,k,l))?(q||\"function\"!==typeof g.UNSAFE_componentWillMount&&\"function\"!==typeof g.componentWillMount||(\"function\"===typeof g.componentWillMount&&g.componentWillMount(),\"function\"===typeof g.UNSAFE_componentWillMount&&g.UNSAFE_componentWillMount()),\"function\"===typeof g.componentDidMount&&(b.flags|=4194308)):\n(\"function\"===typeof g.componentDidMount&&(b.flags|=4194308),b.memoizedProps=d,b.memoizedState=k),g.props=d,g.state=k,g.context=l,d=h):(\"function\"===typeof g.componentDidMount&&(b.flags|=4194308),d=!1)}else{g=b.stateNode;lh(a,b);h=b.memoizedProps;l=b.type===b.elementType?h:Ci(b.type,h);g.props=l;q=b.pendingProps;r=g.context;k=c.contextType;\"object\"===typeof k&&null!==k?k=eh(k):(k=Zf(c)?Xf:H.current,k=Yf(b,k));var y=c.getDerivedStateFromProps;(m=\"function\"===typeof y||\"function\"===typeof g.getSnapshotBeforeUpdate)||\n\"function\"!==typeof g.UNSAFE_componentWillReceiveProps&&\"function\"!==typeof g.componentWillReceiveProps||(h!==q||r!==k)&&Hi(b,g,d,k);jh=!1;r=b.memoizedState;g.state=r;qh(b,d,g,e);var n=b.memoizedState;h!==q||r!==n||Wf.current||jh?(\"function\"===typeof y&&(Di(b,c,y,d),n=b.memoizedState),(l=jh||Fi(b,c,l,d,r,n,k)||!1)?(m||\"function\"!==typeof g.UNSAFE_componentWillUpdate&&\"function\"!==typeof g.componentWillUpdate||(\"function\"===typeof g.componentWillUpdate&&g.componentWillUpdate(d,n,k),\"function\"===typeof g.UNSAFE_componentWillUpdate&&\ng.UNSAFE_componentWillUpdate(d,n,k)),\"function\"===typeof g.componentDidUpdate&&(b.flags|=4),\"function\"===typeof g.getSnapshotBeforeUpdate&&(b.flags|=1024)):(\"function\"!==typeof g.componentDidUpdate||h===a.memoizedProps&&r===a.memoizedState||(b.flags|=4),\"function\"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&r===a.memoizedState||(b.flags|=1024),b.memoizedProps=d,b.memoizedState=n),g.props=d,g.state=n,g.context=k,d=l):(\"function\"!==typeof g.componentDidUpdate||h===a.memoizedProps&&r===\na.memoizedState||(b.flags|=4),\"function\"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&r===a.memoizedState||(b.flags|=1024),d=!1)}return jj(a,b,c,d,f,e)}\nfunction jj(a,b,c,d,e,f){gj(a,b);var g=0!==(b.flags&128);if(!d&&!g)return e&&dg(b,c,!1),Zi(a,b,f);d=b.stateNode;Wi.current=b;var h=g&&\"function\"!==typeof c.getDerivedStateFromError?null:d.render();b.flags|=1;null!==a&&g?(b.child=Ug(b,a.child,null,f),b.child=Ug(b,null,h,f)):Xi(a,b,h,f);b.memoizedState=d.state;e&&dg(b,c,!0);return b.child}function kj(a){var b=a.stateNode;b.pendingContext?ag(a,b.pendingContext,b.pendingContext!==b.context):b.context&&ag(a,b.context,!1);yh(a,b.containerInfo)}\nfunction lj(a,b,c,d,e){Ig();Jg(e);b.flags|=256;Xi(a,b,c,d);return b.child}var mj={dehydrated:null,treeContext:null,retryLane:0};function nj(a){return{baseLanes:a,cachePool:null,transitions:null}}\nfunction oj(a,b,c){var d=b.pendingProps,e=L.current,f=!1,g=0!==(b.flags&128),h;(h=g)||(h=null!==a&&null===a.memoizedState?!1:0!==(e&2));if(h)f=!0,b.flags&=-129;else if(null===a||null!==a.memoizedState)e|=1;G(L,e&1);if(null===a){Eg(b);a=b.memoizedState;if(null!==a&&(a=a.dehydrated,null!==a))return 0===(b.mode&1)?b.lanes=1:\"$!\"===a.data?b.lanes=8:b.lanes=1073741824,null;g=d.children;a=d.fallback;return f?(d=b.mode,f=b.child,g={mode:\"hidden\",children:g},0===(d&1)&&null!==f?(f.childLanes=0,f.pendingProps=\ng):f=pj(g,d,0,null),a=Tg(a,d,c,null),f.return=b,a.return=b,f.sibling=a,b.child=f,b.child.memoizedState=nj(c),b.memoizedState=mj,a):qj(b,g)}e=a.memoizedState;if(null!==e&&(h=e.dehydrated,null!==h))return rj(a,b,g,d,h,e,c);if(f){f=d.fallback;g=b.mode;e=a.child;h=e.sibling;var k={mode:\"hidden\",children:d.children};0===(g&1)&&b.child!==e?(d=b.child,d.childLanes=0,d.pendingProps=k,b.deletions=null):(d=Pg(e,k),d.subtreeFlags=e.subtreeFlags&14680064);null!==h?f=Pg(h,f):(f=Tg(f,g,c,null),f.flags|=2);f.return=\nb;d.return=b;d.sibling=f;b.child=d;d=f;f=b.child;g=a.child.memoizedState;g=null===g?nj(c):{baseLanes:g.baseLanes|c,cachePool:null,transitions:g.transitions};f.memoizedState=g;f.childLanes=a.childLanes&~c;b.memoizedState=mj;return d}f=a.child;a=f.sibling;d=Pg(f,{mode:\"visible\",children:d.children});0===(b.mode&1)&&(d.lanes=c);d.return=b;d.sibling=null;null!==a&&(c=b.deletions,null===c?(b.deletions=[a],b.flags|=16):c.push(a));b.child=d;b.memoizedState=null;return d}\nfunction qj(a,b){b=pj({mode:\"visible\",children:b},a.mode,0,null);b.return=a;return a.child=b}function sj(a,b,c,d){null!==d&&Jg(d);Ug(b,a.child,null,c);a=qj(b,b.pendingProps.children);a.flags|=2;b.memoizedState=null;return a}\nfunction rj(a,b,c,d,e,f,g){if(c){if(b.flags&256)return b.flags&=-257,d=Ki(Error(p(422))),sj(a,b,g,d);if(null!==b.memoizedState)return b.child=a.child,b.flags|=128,null;f=d.fallback;e=b.mode;d=pj({mode:\"visible\",children:d.children},e,0,null);f=Tg(f,e,g,null);f.flags|=2;d.return=b;f.return=b;d.sibling=f;b.child=d;0!==(b.mode&1)&&Ug(b,a.child,null,g);b.child.memoizedState=nj(g);b.memoizedState=mj;return f}if(0===(b.mode&1))return sj(a,b,g,null);if(\"$!\"===e.data){d=e.nextSibling&&e.nextSibling.dataset;\nif(d)var h=d.dgst;d=h;f=Error(p(419));d=Ki(f,d,void 0);return sj(a,b,g,d)}h=0!==(g&a.childLanes);if(dh||h){d=Q;if(null!==d){switch(g&-g){case 4:e=2;break;case 16:e=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:e=32;break;case 536870912:e=268435456;break;default:e=0}e=0!==(e&(d.suspendedLanes|g))?0:e;\n0!==e&&e!==f.retryLane&&(f.retryLane=e,ih(a,e),gi(d,a,e,-1))}tj();d=Ki(Error(p(421)));return sj(a,b,g,d)}if(\"$?\"===e.data)return b.flags|=128,b.child=a.child,b=uj.bind(null,a),e._reactRetry=b,null;a=f.treeContext;yg=Lf(e.nextSibling);xg=b;I=!0;zg=null;null!==a&&(og[pg++]=rg,og[pg++]=sg,og[pg++]=qg,rg=a.id,sg=a.overflow,qg=b);b=qj(b,d.children);b.flags|=4096;return b}function vj(a,b,c){a.lanes|=b;var d=a.alternate;null!==d&&(d.lanes|=b);bh(a.return,b,c)}\nfunction wj(a,b,c,d,e){var f=a.memoizedState;null===f?a.memoizedState={isBackwards:b,rendering:null,renderingStartTime:0,last:d,tail:c,tailMode:e}:(f.isBackwards=b,f.rendering=null,f.renderingStartTime=0,f.last=d,f.tail=c,f.tailMode=e)}\nfunction xj(a,b,c){var d=b.pendingProps,e=d.revealOrder,f=d.tail;Xi(a,b,d.children,c);d=L.current;if(0!==(d&2))d=d&1|2,b.flags|=128;else{if(null!==a&&0!==(a.flags&128))a:for(a=b.child;null!==a;){if(13===a.tag)null!==a.memoizedState&&vj(a,c,b);else if(19===a.tag)vj(a,c,b);else if(null!==a.child){a.child.return=a;a=a.child;continue}if(a===b)break a;for(;null===a.sibling;){if(null===a.return||a.return===b)break a;a=a.return}a.sibling.return=a.return;a=a.sibling}d&=1}G(L,d);if(0===(b.mode&1))b.memoizedState=\nnull;else switch(e){case \"forwards\":c=b.child;for(e=null;null!==c;)a=c.alternate,null!==a&&null===Ch(a)&&(e=c),c=c.sibling;c=e;null===c?(e=b.child,b.child=null):(e=c.sibling,c.sibling=null);wj(b,!1,e,c,f);break;case \"backwards\":c=null;e=b.child;for(b.child=null;null!==e;){a=e.alternate;if(null!==a&&null===Ch(a)){b.child=e;break}a=e.sibling;e.sibling=c;c=e;e=a}wj(b,!0,c,null,f);break;case \"together\":wj(b,!1,null,null,void 0);break;default:b.memoizedState=null}return b.child}\nfunction ij(a,b){0===(b.mode&1)&&null!==a&&(a.alternate=null,b.alternate=null,b.flags|=2)}function Zi(a,b,c){null!==a&&(b.dependencies=a.dependencies);rh|=b.lanes;if(0===(c&b.childLanes))return null;if(null!==a&&b.child!==a.child)throw Error(p(153));if(null!==b.child){a=b.child;c=Pg(a,a.pendingProps);b.child=c;for(c.return=b;null!==a.sibling;)a=a.sibling,c=c.sibling=Pg(a,a.pendingProps),c.return=b;c.sibling=null}return b.child}\nfunction yj(a,b,c){switch(b.tag){case 3:kj(b);Ig();break;case 5:Ah(b);break;case 1:Zf(b.type)&&cg(b);break;case 4:yh(b,b.stateNode.containerInfo);break;case 10:var d=b.type._context,e=b.memoizedProps.value;G(Wg,d._currentValue);d._currentValue=e;break;case 13:d=b.memoizedState;if(null!==d){if(null!==d.dehydrated)return G(L,L.current&1),b.flags|=128,null;if(0!==(c&b.child.childLanes))return oj(a,b,c);G(L,L.current&1);a=Zi(a,b,c);return null!==a?a.sibling:null}G(L,L.current&1);break;case 19:d=0!==(c&\nb.childLanes);if(0!==(a.flags&128)){if(d)return xj(a,b,c);b.flags|=128}e=b.memoizedState;null!==e&&(e.rendering=null,e.tail=null,e.lastEffect=null);G(L,L.current);if(d)break;else return null;case 22:case 23:return b.lanes=0,dj(a,b,c)}return Zi(a,b,c)}var zj,Aj,Bj,Cj;\nzj=function(a,b){for(var c=b.child;null!==c;){if(5===c.tag||6===c.tag)a.appendChild(c.stateNode);else if(4!==c.tag&&null!==c.child){c.child.return=c;c=c.child;continue}if(c===b)break;for(;null===c.sibling;){if(null===c.return||c.return===b)return;c=c.return}c.sibling.return=c.return;c=c.sibling}};Aj=function(){};\nBj=function(a,b,c,d){var e=a.memoizedProps;if(e!==d){a=b.stateNode;xh(uh.current);var f=null;switch(c){case \"input\":e=Ya(a,e);d=Ya(a,d);f=[];break;case \"select\":e=A({},e,{value:void 0});d=A({},d,{value:void 0});f=[];break;case \"textarea\":e=gb(a,e);d=gb(a,d);f=[];break;default:\"function\"!==typeof e.onClick&&\"function\"===typeof d.onClick&&(a.onclick=Bf)}ub(c,d);var g;c=null;for(l in e)if(!d.hasOwnProperty(l)&&e.hasOwnProperty(l)&&null!=e[l])if(\"style\"===l){var h=e[l];for(g in h)h.hasOwnProperty(g)&&\n(c||(c={}),c[g]=\"\")}else\"dangerouslySetInnerHTML\"!==l&&\"children\"!==l&&\"suppressContentEditableWarning\"!==l&&\"suppressHydrationWarning\"!==l&&\"autoFocus\"!==l&&(ea.hasOwnProperty(l)?f||(f=[]):(f=f||[]).push(l,null));for(l in d){var k=d[l];h=null!=e?e[l]:void 0;if(d.hasOwnProperty(l)&&k!==h&&(null!=k||null!=h))if(\"style\"===l)if(h){for(g in h)!h.hasOwnProperty(g)||k&&k.hasOwnProperty(g)||(c||(c={}),c[g]=\"\");for(g in k)k.hasOwnProperty(g)&&h[g]!==k[g]&&(c||(c={}),c[g]=k[g])}else c||(f||(f=[]),f.push(l,\nc)),c=k;else\"dangerouslySetInnerHTML\"===l?(k=k?k.__html:void 0,h=h?h.__html:void 0,null!=k&&h!==k&&(f=f||[]).push(l,k)):\"children\"===l?\"string\"!==typeof k&&\"number\"!==typeof k||(f=f||[]).push(l,\"\"+k):\"suppressContentEditableWarning\"!==l&&\"suppressHydrationWarning\"!==l&&(ea.hasOwnProperty(l)?(null!=k&&\"onScroll\"===l&&D(\"scroll\",a),f||h===k||(f=[])):(f=f||[]).push(l,k))}c&&(f=f||[]).push(\"style\",c);var l=f;if(b.updateQueue=l)b.flags|=4}};Cj=function(a,b,c,d){c!==d&&(b.flags|=4)};\nfunction Dj(a,b){if(!I)switch(a.tailMode){case \"hidden\":b=a.tail;for(var c=null;null!==b;)null!==b.alternate&&(c=b),b=b.sibling;null===c?a.tail=null:c.sibling=null;break;case \"collapsed\":c=a.tail;for(var d=null;null!==c;)null!==c.alternate&&(d=c),c=c.sibling;null===d?b||null===a.tail?a.tail=null:a.tail.sibling=null:d.sibling=null}}\nfunction S(a){var b=null!==a.alternate&&a.alternate.child===a.child,c=0,d=0;if(b)for(var e=a.child;null!==e;)c|=e.lanes|e.childLanes,d|=e.subtreeFlags&14680064,d|=e.flags&14680064,e.return=a,e=e.sibling;else for(e=a.child;null!==e;)c|=e.lanes|e.childLanes,d|=e.subtreeFlags,d|=e.flags,e.return=a,e=e.sibling;a.subtreeFlags|=d;a.childLanes=c;return b}\nfunction Ej(a,b,c){var d=b.pendingProps;wg(b);switch(b.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return S(b),null;case 1:return Zf(b.type)&&$f(),S(b),null;case 3:d=b.stateNode;zh();E(Wf);E(H);Eh();d.pendingContext&&(d.context=d.pendingContext,d.pendingContext=null);if(null===a||null===a.child)Gg(b)?b.flags|=4:null===a||a.memoizedState.isDehydrated&&0===(b.flags&256)||(b.flags|=1024,null!==zg&&(Fj(zg),zg=null));Aj(a,b);S(b);return null;case 5:Bh(b);var e=xh(wh.current);\nc=b.type;if(null!==a&&null!=b.stateNode)Bj(a,b,c,d,e),a.ref!==b.ref&&(b.flags|=512,b.flags|=2097152);else{if(!d){if(null===b.stateNode)throw Error(p(166));S(b);return null}a=xh(uh.current);if(Gg(b)){d=b.stateNode;c=b.type;var f=b.memoizedProps;d[Of]=b;d[Pf]=f;a=0!==(b.mode&1);switch(c){case \"dialog\":D(\"cancel\",d);D(\"close\",d);break;case \"iframe\":case \"object\":case \"embed\":D(\"load\",d);break;case \"video\":case \"audio\":for(e=0;e<lf.length;e++)D(lf[e],d);break;case \"source\":D(\"error\",d);break;case \"img\":case \"image\":case \"link\":D(\"error\",\nd);D(\"load\",d);break;case \"details\":D(\"toggle\",d);break;case \"input\":Za(d,f);D(\"invalid\",d);break;case \"select\":d._wrapperState={wasMultiple:!!f.multiple};D(\"invalid\",d);break;case \"textarea\":hb(d,f),D(\"invalid\",d)}ub(c,f);e=null;for(var g in f)if(f.hasOwnProperty(g)){var h=f[g];\"children\"===g?\"string\"===typeof h?d.textContent!==h&&(!0!==f.suppressHydrationWarning&&Af(d.textContent,h,a),e=[\"children\",h]):\"number\"===typeof h&&d.textContent!==\"\"+h&&(!0!==f.suppressHydrationWarning&&Af(d.textContent,\nh,a),e=[\"children\",\"\"+h]):ea.hasOwnProperty(g)&&null!=h&&\"onScroll\"===g&&D(\"scroll\",d)}switch(c){case \"input\":Va(d);db(d,f,!0);break;case \"textarea\":Va(d);jb(d);break;case \"select\":case \"option\":break;default:\"function\"===typeof f.onClick&&(d.onclick=Bf)}d=e;b.updateQueue=d;null!==d&&(b.flags|=4)}else{g=9===e.nodeType?e:e.ownerDocument;\"http://www.w3.org/1999/xhtml\"===a&&(a=kb(c));\"http://www.w3.org/1999/xhtml\"===a?\"script\"===c?(a=g.createElement(\"div\"),a.innerHTML=\"<script>\\x3c/script>\",a=a.removeChild(a.firstChild)):\n\"string\"===typeof d.is?a=g.createElement(c,{is:d.is}):(a=g.createElement(c),\"select\"===c&&(g=a,d.multiple?g.multiple=!0:d.size&&(g.size=d.size))):a=g.createElementNS(a,c);a[Of]=b;a[Pf]=d;zj(a,b,!1,!1);b.stateNode=a;a:{g=vb(c,d);switch(c){case \"dialog\":D(\"cancel\",a);D(\"close\",a);e=d;break;case \"iframe\":case \"object\":case \"embed\":D(\"load\",a);e=d;break;case \"video\":case \"audio\":for(e=0;e<lf.length;e++)D(lf[e],a);e=d;break;case \"source\":D(\"error\",a);e=d;break;case \"img\":case \"image\":case \"link\":D(\"error\",\na);D(\"load\",a);e=d;break;case \"details\":D(\"toggle\",a);e=d;break;case \"input\":Za(a,d);e=Ya(a,d);D(\"invalid\",a);break;case \"option\":e=d;break;case \"select\":a._wrapperState={wasMultiple:!!d.multiple};e=A({},d,{value:void 0});D(\"invalid\",a);break;case \"textarea\":hb(a,d);e=gb(a,d);D(\"invalid\",a);break;default:e=d}ub(c,e);h=e;for(f in h)if(h.hasOwnProperty(f)){var k=h[f];\"style\"===f?sb(a,k):\"dangerouslySetInnerHTML\"===f?(k=k?k.__html:void 0,null!=k&&nb(a,k)):\"children\"===f?\"string\"===typeof k?(\"textarea\"!==\nc||\"\"!==k)&&ob(a,k):\"number\"===typeof k&&ob(a,\"\"+k):\"suppressContentEditableWarning\"!==f&&\"suppressHydrationWarning\"!==f&&\"autoFocus\"!==f&&(ea.hasOwnProperty(f)?null!=k&&\"onScroll\"===f&&D(\"scroll\",a):null!=k&&ta(a,f,k,g))}switch(c){case \"input\":Va(a);db(a,d,!1);break;case \"textarea\":Va(a);jb(a);break;case \"option\":null!=d.value&&a.setAttribute(\"value\",\"\"+Sa(d.value));break;case \"select\":a.multiple=!!d.multiple;f=d.value;null!=f?fb(a,!!d.multiple,f,!1):null!=d.defaultValue&&fb(a,!!d.multiple,d.defaultValue,\n!0);break;default:\"function\"===typeof e.onClick&&(a.onclick=Bf)}switch(c){case \"button\":case \"input\":case \"select\":case \"textarea\":d=!!d.autoFocus;break a;case \"img\":d=!0;break a;default:d=!1}}d&&(b.flags|=4)}null!==b.ref&&(b.flags|=512,b.flags|=2097152)}S(b);return null;case 6:if(a&&null!=b.stateNode)Cj(a,b,a.memoizedProps,d);else{if(\"string\"!==typeof d&&null===b.stateNode)throw Error(p(166));c=xh(wh.current);xh(uh.current);if(Gg(b)){d=b.stateNode;c=b.memoizedProps;d[Of]=b;if(f=d.nodeValue!==c)if(a=\nxg,null!==a)switch(a.tag){case 3:Af(d.nodeValue,c,0!==(a.mode&1));break;case 5:!0!==a.memoizedProps.suppressHydrationWarning&&Af(d.nodeValue,c,0!==(a.mode&1))}f&&(b.flags|=4)}else d=(9===c.nodeType?c:c.ownerDocument).createTextNode(d),d[Of]=b,b.stateNode=d}S(b);return null;case 13:E(L);d=b.memoizedState;if(null===a||null!==a.memoizedState&&null!==a.memoizedState.dehydrated){if(I&&null!==yg&&0!==(b.mode&1)&&0===(b.flags&128))Hg(),Ig(),b.flags|=98560,f=!1;else if(f=Gg(b),null!==d&&null!==d.dehydrated){if(null===\na){if(!f)throw Error(p(318));f=b.memoizedState;f=null!==f?f.dehydrated:null;if(!f)throw Error(p(317));f[Of]=b}else Ig(),0===(b.flags&128)&&(b.memoizedState=null),b.flags|=4;S(b);f=!1}else null!==zg&&(Fj(zg),zg=null),f=!0;if(!f)return b.flags&65536?b:null}if(0!==(b.flags&128))return b.lanes=c,b;d=null!==d;d!==(null!==a&&null!==a.memoizedState)&&d&&(b.child.flags|=8192,0!==(b.mode&1)&&(null===a||0!==(L.current&1)?0===T&&(T=3):tj()));null!==b.updateQueue&&(b.flags|=4);S(b);return null;case 4:return zh(),\nAj(a,b),null===a&&sf(b.stateNode.containerInfo),S(b),null;case 10:return ah(b.type._context),S(b),null;case 17:return Zf(b.type)&&$f(),S(b),null;case 19:E(L);f=b.memoizedState;if(null===f)return S(b),null;d=0!==(b.flags&128);g=f.rendering;if(null===g)if(d)Dj(f,!1);else{if(0!==T||null!==a&&0!==(a.flags&128))for(a=b.child;null!==a;){g=Ch(a);if(null!==g){b.flags|=128;Dj(f,!1);d=g.updateQueue;null!==d&&(b.updateQueue=d,b.flags|=4);b.subtreeFlags=0;d=c;for(c=b.child;null!==c;)f=c,a=d,f.flags&=14680066,\ng=f.alternate,null===g?(f.childLanes=0,f.lanes=a,f.child=null,f.subtreeFlags=0,f.memoizedProps=null,f.memoizedState=null,f.updateQueue=null,f.dependencies=null,f.stateNode=null):(f.childLanes=g.childLanes,f.lanes=g.lanes,f.child=g.child,f.subtreeFlags=0,f.deletions=null,f.memoizedProps=g.memoizedProps,f.memoizedState=g.memoizedState,f.updateQueue=g.updateQueue,f.type=g.type,a=g.dependencies,f.dependencies=null===a?null:{lanes:a.lanes,firstContext:a.firstContext}),c=c.sibling;G(L,L.current&1|2);return b.child}a=\na.sibling}null!==f.tail&&B()>Gj&&(b.flags|=128,d=!0,Dj(f,!1),b.lanes=4194304)}else{if(!d)if(a=Ch(g),null!==a){if(b.flags|=128,d=!0,c=a.updateQueue,null!==c&&(b.updateQueue=c,b.flags|=4),Dj(f,!0),null===f.tail&&\"hidden\"===f.tailMode&&!g.alternate&&!I)return S(b),null}else 2*B()-f.renderingStartTime>Gj&&1073741824!==c&&(b.flags|=128,d=!0,Dj(f,!1),b.lanes=4194304);f.isBackwards?(g.sibling=b.child,b.child=g):(c=f.last,null!==c?c.sibling=g:b.child=g,f.last=g)}if(null!==f.tail)return b=f.tail,f.rendering=\nb,f.tail=b.sibling,f.renderingStartTime=B(),b.sibling=null,c=L.current,G(L,d?c&1|2:c&1),b;S(b);return null;case 22:case 23:return Hj(),d=null!==b.memoizedState,null!==a&&null!==a.memoizedState!==d&&(b.flags|=8192),d&&0!==(b.mode&1)?0!==(fj&1073741824)&&(S(b),b.subtreeFlags&6&&(b.flags|=8192)):S(b),null;case 24:return null;case 25:return null}throw Error(p(156,b.tag));}\nfunction Ij(a,b){wg(b);switch(b.tag){case 1:return Zf(b.type)&&$f(),a=b.flags,a&65536?(b.flags=a&-65537|128,b):null;case 3:return zh(),E(Wf),E(H),Eh(),a=b.flags,0!==(a&65536)&&0===(a&128)?(b.flags=a&-65537|128,b):null;case 5:return Bh(b),null;case 13:E(L);a=b.memoizedState;if(null!==a&&null!==a.dehydrated){if(null===b.alternate)throw Error(p(340));Ig()}a=b.flags;return a&65536?(b.flags=a&-65537|128,b):null;case 19:return E(L),null;case 4:return zh(),null;case 10:return ah(b.type._context),null;case 22:case 23:return Hj(),\nnull;case 24:return null;default:return null}}var Jj=!1,U=!1,Kj=\"function\"===typeof WeakSet?WeakSet:Set,V=null;function Lj(a,b){var c=a.ref;if(null!==c)if(\"function\"===typeof c)try{c(null)}catch(d){W(a,b,d)}else c.current=null}function Mj(a,b,c){try{c()}catch(d){W(a,b,d)}}var Nj=!1;\nfunction Oj(a,b){Cf=dd;a=Me();if(Ne(a)){if(\"selectionStart\"in a)var c={start:a.selectionStart,end:a.selectionEnd};else a:{c=(c=a.ownerDocument)&&c.defaultView||window;var d=c.getSelection&&c.getSelection();if(d&&0!==d.rangeCount){c=d.anchorNode;var e=d.anchorOffset,f=d.focusNode;d=d.focusOffset;try{c.nodeType,f.nodeType}catch(F){c=null;break a}var g=0,h=-1,k=-1,l=0,m=0,q=a,r=null;b:for(;;){for(var y;;){q!==c||0!==e&&3!==q.nodeType||(h=g+e);q!==f||0!==d&&3!==q.nodeType||(k=g+d);3===q.nodeType&&(g+=\nq.nodeValue.length);if(null===(y=q.firstChild))break;r=q;q=y}for(;;){if(q===a)break b;r===c&&++l===e&&(h=g);r===f&&++m===d&&(k=g);if(null!==(y=q.nextSibling))break;q=r;r=q.parentNode}q=y}c=-1===h||-1===k?null:{start:h,end:k}}else c=null}c=c||{start:0,end:0}}else c=null;Df={focusedElem:a,selectionRange:c};dd=!1;for(V=b;null!==V;)if(b=V,a=b.child,0!==(b.subtreeFlags&1028)&&null!==a)a.return=b,V=a;else for(;null!==V;){b=V;try{var n=b.alternate;if(0!==(b.flags&1024))switch(b.tag){case 0:case 11:case 15:break;\ncase 1:if(null!==n){var t=n.memoizedProps,J=n.memoizedState,x=b.stateNode,w=x.getSnapshotBeforeUpdate(b.elementType===b.type?t:Ci(b.type,t),J);x.__reactInternalSnapshotBeforeUpdate=w}break;case 3:var u=b.stateNode.containerInfo;1===u.nodeType?u.textContent=\"\":9===u.nodeType&&u.documentElement&&u.removeChild(u.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(p(163));}}catch(F){W(b,b.return,F)}a=b.sibling;if(null!==a){a.return=b.return;V=a;break}V=b.return}n=Nj;Nj=!1;return n}\nfunction Pj(a,b,c){var d=b.updateQueue;d=null!==d?d.lastEffect:null;if(null!==d){var e=d=d.next;do{if((e.tag&a)===a){var f=e.destroy;e.destroy=void 0;void 0!==f&&Mj(b,c,f)}e=e.next}while(e!==d)}}function Qj(a,b){b=b.updateQueue;b=null!==b?b.lastEffect:null;if(null!==b){var c=b=b.next;do{if((c.tag&a)===a){var d=c.create;c.destroy=d()}c=c.next}while(c!==b)}}function Rj(a){var b=a.ref;if(null!==b){var c=a.stateNode;switch(a.tag){case 5:a=c;break;default:a=c}\"function\"===typeof b?b(a):b.current=a}}\nfunction Sj(a){var b=a.alternate;null!==b&&(a.alternate=null,Sj(b));a.child=null;a.deletions=null;a.sibling=null;5===a.tag&&(b=a.stateNode,null!==b&&(delete b[Of],delete b[Pf],delete b[of],delete b[Qf],delete b[Rf]));a.stateNode=null;a.return=null;a.dependencies=null;a.memoizedProps=null;a.memoizedState=null;a.pendingProps=null;a.stateNode=null;a.updateQueue=null}function Tj(a){return 5===a.tag||3===a.tag||4===a.tag}\nfunction Uj(a){a:for(;;){for(;null===a.sibling;){if(null===a.return||Tj(a.return))return null;a=a.return}a.sibling.return=a.return;for(a=a.sibling;5!==a.tag&&6!==a.tag&&18!==a.tag;){if(a.flags&2)continue a;if(null===a.child||4===a.tag)continue a;else a.child.return=a,a=a.child}if(!(a.flags&2))return a.stateNode}}\nfunction Vj(a,b,c){var d=a.tag;if(5===d||6===d)a=a.stateNode,b?8===c.nodeType?c.parentNode.insertBefore(a,b):c.insertBefore(a,b):(8===c.nodeType?(b=c.parentNode,b.insertBefore(a,c)):(b=c,b.appendChild(a)),c=c._reactRootContainer,null!==c&&void 0!==c||null!==b.onclick||(b.onclick=Bf));else if(4!==d&&(a=a.child,null!==a))for(Vj(a,b,c),a=a.sibling;null!==a;)Vj(a,b,c),a=a.sibling}\nfunction Wj(a,b,c){var d=a.tag;if(5===d||6===d)a=a.stateNode,b?c.insertBefore(a,b):c.appendChild(a);else if(4!==d&&(a=a.child,null!==a))for(Wj(a,b,c),a=a.sibling;null!==a;)Wj(a,b,c),a=a.sibling}var X=null,Xj=!1;function Yj(a,b,c){for(c=c.child;null!==c;)Zj(a,b,c),c=c.sibling}\nfunction Zj(a,b,c){if(lc&&\"function\"===typeof lc.onCommitFiberUnmount)try{lc.onCommitFiberUnmount(kc,c)}catch(h){}switch(c.tag){case 5:U||Lj(c,b);case 6:var d=X,e=Xj;X=null;Yj(a,b,c);X=d;Xj=e;null!==X&&(Xj?(a=X,c=c.stateNode,8===a.nodeType?a.parentNode.removeChild(c):a.removeChild(c)):X.removeChild(c.stateNode));break;case 18:null!==X&&(Xj?(a=X,c=c.stateNode,8===a.nodeType?Kf(a.parentNode,c):1===a.nodeType&&Kf(a,c),bd(a)):Kf(X,c.stateNode));break;case 4:d=X;e=Xj;X=c.stateNode.containerInfo;Xj=!0;\nYj(a,b,c);X=d;Xj=e;break;case 0:case 11:case 14:case 15:if(!U&&(d=c.updateQueue,null!==d&&(d=d.lastEffect,null!==d))){e=d=d.next;do{var f=e,g=f.destroy;f=f.tag;void 0!==g&&(0!==(f&2)?Mj(c,b,g):0!==(f&4)&&Mj(c,b,g));e=e.next}while(e!==d)}Yj(a,b,c);break;case 1:if(!U&&(Lj(c,b),d=c.stateNode,\"function\"===typeof d.componentWillUnmount))try{d.props=c.memoizedProps,d.state=c.memoizedState,d.componentWillUnmount()}catch(h){W(c,b,h)}Yj(a,b,c);break;case 21:Yj(a,b,c);break;case 22:c.mode&1?(U=(d=U)||null!==\nc.memoizedState,Yj(a,b,c),U=d):Yj(a,b,c);break;default:Yj(a,b,c)}}function ak(a){var b=a.updateQueue;if(null!==b){a.updateQueue=null;var c=a.stateNode;null===c&&(c=a.stateNode=new Kj);b.forEach(function(b){var d=bk.bind(null,a,b);c.has(b)||(c.add(b),b.then(d,d))})}}\nfunction ck(a,b){var c=b.deletions;if(null!==c)for(var d=0;d<c.length;d++){var e=c[d];try{var f=a,g=b,h=g;a:for(;null!==h;){switch(h.tag){case 5:X=h.stateNode;Xj=!1;break a;case 3:X=h.stateNode.containerInfo;Xj=!0;break a;case 4:X=h.stateNode.containerInfo;Xj=!0;break a}h=h.return}if(null===X)throw Error(p(160));Zj(f,g,e);X=null;Xj=!1;var k=e.alternate;null!==k&&(k.return=null);e.return=null}catch(l){W(e,b,l)}}if(b.subtreeFlags&12854)for(b=b.child;null!==b;)dk(b,a),b=b.sibling}\nfunction dk(a,b){var c=a.alternate,d=a.flags;switch(a.tag){case 0:case 11:case 14:case 15:ck(b,a);ek(a);if(d&4){try{Pj(3,a,a.return),Qj(3,a)}catch(t){W(a,a.return,t)}try{Pj(5,a,a.return)}catch(t){W(a,a.return,t)}}break;case 1:ck(b,a);ek(a);d&512&&null!==c&&Lj(c,c.return);break;case 5:ck(b,a);ek(a);d&512&&null!==c&&Lj(c,c.return);if(a.flags&32){var e=a.stateNode;try{ob(e,\"\")}catch(t){W(a,a.return,t)}}if(d&4&&(e=a.stateNode,null!=e)){var f=a.memoizedProps,g=null!==c?c.memoizedProps:f,h=a.type,k=a.updateQueue;\na.updateQueue=null;if(null!==k)try{\"input\"===h&&\"radio\"===f.type&&null!=f.name&&ab(e,f);vb(h,g);var l=vb(h,f);for(g=0;g<k.length;g+=2){var m=k[g],q=k[g+1];\"style\"===m?sb(e,q):\"dangerouslySetInnerHTML\"===m?nb(e,q):\"children\"===m?ob(e,q):ta(e,m,q,l)}switch(h){case \"input\":bb(e,f);break;case \"textarea\":ib(e,f);break;case \"select\":var r=e._wrapperState.wasMultiple;e._wrapperState.wasMultiple=!!f.multiple;var y=f.value;null!=y?fb(e,!!f.multiple,y,!1):r!==!!f.multiple&&(null!=f.defaultValue?fb(e,!!f.multiple,\nf.defaultValue,!0):fb(e,!!f.multiple,f.multiple?[]:\"\",!1))}e[Pf]=f}catch(t){W(a,a.return,t)}}break;case 6:ck(b,a);ek(a);if(d&4){if(null===a.stateNode)throw Error(p(162));e=a.stateNode;f=a.memoizedProps;try{e.nodeValue=f}catch(t){W(a,a.return,t)}}break;case 3:ck(b,a);ek(a);if(d&4&&null!==c&&c.memoizedState.isDehydrated)try{bd(b.containerInfo)}catch(t){W(a,a.return,t)}break;case 4:ck(b,a);ek(a);break;case 13:ck(b,a);ek(a);e=a.child;e.flags&8192&&(f=null!==e.memoizedState,e.stateNode.isHidden=f,!f||\nnull!==e.alternate&&null!==e.alternate.memoizedState||(fk=B()));d&4&&ak(a);break;case 22:m=null!==c&&null!==c.memoizedState;a.mode&1?(U=(l=U)||m,ck(b,a),U=l):ck(b,a);ek(a);if(d&8192){l=null!==a.memoizedState;if((a.stateNode.isHidden=l)&&!m&&0!==(a.mode&1))for(V=a,m=a.child;null!==m;){for(q=V=m;null!==V;){r=V;y=r.child;switch(r.tag){case 0:case 11:case 14:case 15:Pj(4,r,r.return);break;case 1:Lj(r,r.return);var n=r.stateNode;if(\"function\"===typeof n.componentWillUnmount){d=r;c=r.return;try{b=d,n.props=\nb.memoizedProps,n.state=b.memoizedState,n.componentWillUnmount()}catch(t){W(d,c,t)}}break;case 5:Lj(r,r.return);break;case 22:if(null!==r.memoizedState){gk(q);continue}}null!==y?(y.return=r,V=y):gk(q)}m=m.sibling}a:for(m=null,q=a;;){if(5===q.tag){if(null===m){m=q;try{e=q.stateNode,l?(f=e.style,\"function\"===typeof f.setProperty?f.setProperty(\"display\",\"none\",\"important\"):f.display=\"none\"):(h=q.stateNode,k=q.memoizedProps.style,g=void 0!==k&&null!==k&&k.hasOwnProperty(\"display\")?k.display:null,h.style.display=\nrb(\"display\",g))}catch(t){W(a,a.return,t)}}}else if(6===q.tag){if(null===m)try{q.stateNode.nodeValue=l?\"\":q.memoizedProps}catch(t){W(a,a.return,t)}}else if((22!==q.tag&&23!==q.tag||null===q.memoizedState||q===a)&&null!==q.child){q.child.return=q;q=q.child;continue}if(q===a)break a;for(;null===q.sibling;){if(null===q.return||q.return===a)break a;m===q&&(m=null);q=q.return}m===q&&(m=null);q.sibling.return=q.return;q=q.sibling}}break;case 19:ck(b,a);ek(a);d&4&&ak(a);break;case 21:break;default:ck(b,\na),ek(a)}}function ek(a){var b=a.flags;if(b&2){try{a:{for(var c=a.return;null!==c;){if(Tj(c)){var d=c;break a}c=c.return}throw Error(p(160));}switch(d.tag){case 5:var e=d.stateNode;d.flags&32&&(ob(e,\"\"),d.flags&=-33);var f=Uj(a);Wj(a,f,e);break;case 3:case 4:var g=d.stateNode.containerInfo,h=Uj(a);Vj(a,h,g);break;default:throw Error(p(161));}}catch(k){W(a,a.return,k)}a.flags&=-3}b&4096&&(a.flags&=-4097)}function hk(a,b,c){V=a;ik(a,b,c)}\nfunction ik(a,b,c){for(var d=0!==(a.mode&1);null!==V;){var e=V,f=e.child;if(22===e.tag&&d){var g=null!==e.memoizedState||Jj;if(!g){var h=e.alternate,k=null!==h&&null!==h.memoizedState||U;h=Jj;var l=U;Jj=g;if((U=k)&&!l)for(V=e;null!==V;)g=V,k=g.child,22===g.tag&&null!==g.memoizedState?jk(e):null!==k?(k.return=g,V=k):jk(e);for(;null!==f;)V=f,ik(f,b,c),f=f.sibling;V=e;Jj=h;U=l}kk(a,b,c)}else 0!==(e.subtreeFlags&8772)&&null!==f?(f.return=e,V=f):kk(a,b,c)}}\nfunction kk(a){for(;null!==V;){var b=V;if(0!==(b.flags&8772)){var c=b.alternate;try{if(0!==(b.flags&8772))switch(b.tag){case 0:case 11:case 15:U||Qj(5,b);break;case 1:var d=b.stateNode;if(b.flags&4&&!U)if(null===c)d.componentDidMount();else{var e=b.elementType===b.type?c.memoizedProps:Ci(b.type,c.memoizedProps);d.componentDidUpdate(e,c.memoizedState,d.__reactInternalSnapshotBeforeUpdate)}var f=b.updateQueue;null!==f&&sh(b,f,d);break;case 3:var g=b.updateQueue;if(null!==g){c=null;if(null!==b.child)switch(b.child.tag){case 5:c=\nb.child.stateNode;break;case 1:c=b.child.stateNode}sh(b,g,c)}break;case 5:var h=b.stateNode;if(null===c&&b.flags&4){c=h;var k=b.memoizedProps;switch(b.type){case \"button\":case \"input\":case \"select\":case \"textarea\":k.autoFocus&&c.focus();break;case \"img\":k.src&&(c.src=k.src)}}break;case 6:break;case 4:break;case 12:break;case 13:if(null===b.memoizedState){var l=b.alternate;if(null!==l){var m=l.memoizedState;if(null!==m){var q=m.dehydrated;null!==q&&bd(q)}}}break;case 19:case 17:case 21:case 22:case 23:case 25:break;\ndefault:throw Error(p(163));}U||b.flags&512&&Rj(b)}catch(r){W(b,b.return,r)}}if(b===a){V=null;break}c=b.sibling;if(null!==c){c.return=b.return;V=c;break}V=b.return}}function gk(a){for(;null!==V;){var b=V;if(b===a){V=null;break}var c=b.sibling;if(null!==c){c.return=b.return;V=c;break}V=b.return}}\nfunction jk(a){for(;null!==V;){var b=V;try{switch(b.tag){case 0:case 11:case 15:var c=b.return;try{Qj(4,b)}catch(k){W(b,c,k)}break;case 1:var d=b.stateNode;if(\"function\"===typeof d.componentDidMount){var e=b.return;try{d.componentDidMount()}catch(k){W(b,e,k)}}var f=b.return;try{Rj(b)}catch(k){W(b,f,k)}break;case 5:var g=b.return;try{Rj(b)}catch(k){W(b,g,k)}}}catch(k){W(b,b.return,k)}if(b===a){V=null;break}var h=b.sibling;if(null!==h){h.return=b.return;V=h;break}V=b.return}}\nvar lk=Math.ceil,mk=ua.ReactCurrentDispatcher,nk=ua.ReactCurrentOwner,ok=ua.ReactCurrentBatchConfig,K=0,Q=null,Y=null,Z=0,fj=0,ej=Uf(0),T=0,pk=null,rh=0,qk=0,rk=0,sk=null,tk=null,fk=0,Gj=Infinity,uk=null,Oi=!1,Pi=null,Ri=null,vk=!1,wk=null,xk=0,yk=0,zk=null,Ak=-1,Bk=0;function R(){return 0!==(K&6)?B():-1!==Ak?Ak:Ak=B()}\nfunction yi(a){if(0===(a.mode&1))return 1;if(0!==(K&2)&&0!==Z)return Z&-Z;if(null!==Kg.transition)return 0===Bk&&(Bk=yc()),Bk;a=C;if(0!==a)return a;a=window.event;a=void 0===a?16:jd(a.type);return a}function gi(a,b,c,d){if(50<yk)throw yk=0,zk=null,Error(p(185));Ac(a,c,d);if(0===(K&2)||a!==Q)a===Q&&(0===(K&2)&&(qk|=c),4===T&&Ck(a,Z)),Dk(a,d),1===c&&0===K&&0===(b.mode&1)&&(Gj=B()+500,fg&&jg())}\nfunction Dk(a,b){var c=a.callbackNode;wc(a,b);var d=uc(a,a===Q?Z:0);if(0===d)null!==c&&bc(c),a.callbackNode=null,a.callbackPriority=0;else if(b=d&-d,a.callbackPriority!==b){null!=c&&bc(c);if(1===b)0===a.tag?ig(Ek.bind(null,a)):hg(Ek.bind(null,a)),Jf(function(){0===(K&6)&&jg()}),c=null;else{switch(Dc(d)){case 1:c=fc;break;case 4:c=gc;break;case 16:c=hc;break;case 536870912:c=jc;break;default:c=hc}c=Fk(c,Gk.bind(null,a))}a.callbackPriority=b;a.callbackNode=c}}\nfunction Gk(a,b){Ak=-1;Bk=0;if(0!==(K&6))throw Error(p(327));var c=a.callbackNode;if(Hk()&&a.callbackNode!==c)return null;var d=uc(a,a===Q?Z:0);if(0===d)return null;if(0!==(d&30)||0!==(d&a.expiredLanes)||b)b=Ik(a,d);else{b=d;var e=K;K|=2;var f=Jk();if(Q!==a||Z!==b)uk=null,Gj=B()+500,Kk(a,b);do try{Lk();break}catch(h){Mk(a,h)}while(1);$g();mk.current=f;K=e;null!==Y?b=0:(Q=null,Z=0,b=T)}if(0!==b){2===b&&(e=xc(a),0!==e&&(d=e,b=Nk(a,e)));if(1===b)throw c=pk,Kk(a,0),Ck(a,d),Dk(a,B()),c;if(6===b)Ck(a,d);\nelse{e=a.current.alternate;if(0===(d&30)&&!Ok(e)&&(b=Ik(a,d),2===b&&(f=xc(a),0!==f&&(d=f,b=Nk(a,f))),1===b))throw c=pk,Kk(a,0),Ck(a,d),Dk(a,B()),c;a.finishedWork=e;a.finishedLanes=d;switch(b){case 0:case 1:throw Error(p(345));case 2:Pk(a,tk,uk);break;case 3:Ck(a,d);if((d&130023424)===d&&(b=fk+500-B(),10<b)){if(0!==uc(a,0))break;e=a.suspendedLanes;if((e&d)!==d){R();a.pingedLanes|=a.suspendedLanes&e;break}a.timeoutHandle=Ff(Pk.bind(null,a,tk,uk),b);break}Pk(a,tk,uk);break;case 4:Ck(a,d);if((d&4194240)===\nd)break;b=a.eventTimes;for(e=-1;0<d;){var g=31-oc(d);f=1<<g;g=b[g];g>e&&(e=g);d&=~f}d=e;d=B()-d;d=(120>d?120:480>d?480:1080>d?1080:1920>d?1920:3E3>d?3E3:4320>d?4320:1960*lk(d/1960))-d;if(10<d){a.timeoutHandle=Ff(Pk.bind(null,a,tk,uk),d);break}Pk(a,tk,uk);break;case 5:Pk(a,tk,uk);break;default:throw Error(p(329));}}}Dk(a,B());return a.callbackNode===c?Gk.bind(null,a):null}\nfunction Nk(a,b){var c=sk;a.current.memoizedState.isDehydrated&&(Kk(a,b).flags|=256);a=Ik(a,b);2!==a&&(b=tk,tk=c,null!==b&&Fj(b));return a}function Fj(a){null===tk?tk=a:tk.push.apply(tk,a)}\nfunction Ok(a){for(var b=a;;){if(b.flags&16384){var c=b.updateQueue;if(null!==c&&(c=c.stores,null!==c))for(var d=0;d<c.length;d++){var e=c[d],f=e.getSnapshot;e=e.value;try{if(!He(f(),e))return!1}catch(g){return!1}}}c=b.child;if(b.subtreeFlags&16384&&null!==c)c.return=b,b=c;else{if(b===a)break;for(;null===b.sibling;){if(null===b.return||b.return===a)return!0;b=b.return}b.sibling.return=b.return;b=b.sibling}}return!0}\nfunction Ck(a,b){b&=~rk;b&=~qk;a.suspendedLanes|=b;a.pingedLanes&=~b;for(a=a.expirationTimes;0<b;){var c=31-oc(b),d=1<<c;a[c]=-1;b&=~d}}function Ek(a){if(0!==(K&6))throw Error(p(327));Hk();var b=uc(a,0);if(0===(b&1))return Dk(a,B()),null;var c=Ik(a,b);if(0!==a.tag&&2===c){var d=xc(a);0!==d&&(b=d,c=Nk(a,d))}if(1===c)throw c=pk,Kk(a,0),Ck(a,b),Dk(a,B()),c;if(6===c)throw Error(p(345));a.finishedWork=a.current.alternate;a.finishedLanes=b;Pk(a,tk,uk);Dk(a,B());return null}\nfunction Qk(a,b){var c=K;K|=1;try{return a(b)}finally{K=c,0===K&&(Gj=B()+500,fg&&jg())}}function Rk(a){null!==wk&&0===wk.tag&&0===(K&6)&&Hk();var b=K;K|=1;var c=ok.transition,d=C;try{if(ok.transition=null,C=1,a)return a()}finally{C=d,ok.transition=c,K=b,0===(K&6)&&jg()}}function Hj(){fj=ej.current;E(ej)}\nfunction Kk(a,b){a.finishedWork=null;a.finishedLanes=0;var c=a.timeoutHandle;-1!==c&&(a.timeoutHandle=-1,Gf(c));if(null!==Y)for(c=Y.return;null!==c;){var d=c;wg(d);switch(d.tag){case 1:d=d.type.childContextTypes;null!==d&&void 0!==d&&$f();break;case 3:zh();E(Wf);E(H);Eh();break;case 5:Bh(d);break;case 4:zh();break;case 13:E(L);break;case 19:E(L);break;case 10:ah(d.type._context);break;case 22:case 23:Hj()}c=c.return}Q=a;Y=a=Pg(a.current,null);Z=fj=b;T=0;pk=null;rk=qk=rh=0;tk=sk=null;if(null!==fh){for(b=\n0;b<fh.length;b++)if(c=fh[b],d=c.interleaved,null!==d){c.interleaved=null;var e=d.next,f=c.pending;if(null!==f){var g=f.next;f.next=e;d.next=g}c.pending=d}fh=null}return a}\nfunction Mk(a,b){do{var c=Y;try{$g();Fh.current=Rh;if(Ih){for(var d=M.memoizedState;null!==d;){var e=d.queue;null!==e&&(e.pending=null);d=d.next}Ih=!1}Hh=0;O=N=M=null;Jh=!1;Kh=0;nk.current=null;if(null===c||null===c.return){T=1;pk=b;Y=null;break}a:{var f=a,g=c.return,h=c,k=b;b=Z;h.flags|=32768;if(null!==k&&\"object\"===typeof k&&\"function\"===typeof k.then){var l=k,m=h,q=m.tag;if(0===(m.mode&1)&&(0===q||11===q||15===q)){var r=m.alternate;r?(m.updateQueue=r.updateQueue,m.memoizedState=r.memoizedState,\nm.lanes=r.lanes):(m.updateQueue=null,m.memoizedState=null)}var y=Ui(g);if(null!==y){y.flags&=-257;Vi(y,g,h,f,b);y.mode&1&&Si(f,l,b);b=y;k=l;var n=b.updateQueue;if(null===n){var t=new Set;t.add(k);b.updateQueue=t}else n.add(k);break a}else{if(0===(b&1)){Si(f,l,b);tj();break a}k=Error(p(426))}}else if(I&&h.mode&1){var J=Ui(g);if(null!==J){0===(J.flags&65536)&&(J.flags|=256);Vi(J,g,h,f,b);Jg(Ji(k,h));break a}}f=k=Ji(k,h);4!==T&&(T=2);null===sk?sk=[f]:sk.push(f);f=g;do{switch(f.tag){case 3:f.flags|=65536;\nb&=-b;f.lanes|=b;var x=Ni(f,k,b);ph(f,x);break a;case 1:h=k;var w=f.type,u=f.stateNode;if(0===(f.flags&128)&&(\"function\"===typeof w.getDerivedStateFromError||null!==u&&\"function\"===typeof u.componentDidCatch&&(null===Ri||!Ri.has(u)))){f.flags|=65536;b&=-b;f.lanes|=b;var F=Qi(f,h,b);ph(f,F);break a}}f=f.return}while(null!==f)}Sk(c)}catch(na){b=na;Y===c&&null!==c&&(Y=c=c.return);continue}break}while(1)}function Jk(){var a=mk.current;mk.current=Rh;return null===a?Rh:a}\nfunction tj(){if(0===T||3===T||2===T)T=4;null===Q||0===(rh&268435455)&&0===(qk&268435455)||Ck(Q,Z)}function Ik(a,b){var c=K;K|=2;var d=Jk();if(Q!==a||Z!==b)uk=null,Kk(a,b);do try{Tk();break}catch(e){Mk(a,e)}while(1);$g();K=c;mk.current=d;if(null!==Y)throw Error(p(261));Q=null;Z=0;return T}function Tk(){for(;null!==Y;)Uk(Y)}function Lk(){for(;null!==Y&&!cc();)Uk(Y)}function Uk(a){var b=Vk(a.alternate,a,fj);a.memoizedProps=a.pendingProps;null===b?Sk(a):Y=b;nk.current=null}\nfunction Sk(a){var b=a;do{var c=b.alternate;a=b.return;if(0===(b.flags&32768)){if(c=Ej(c,b,fj),null!==c){Y=c;return}}else{c=Ij(c,b);if(null!==c){c.flags&=32767;Y=c;return}if(null!==a)a.flags|=32768,a.subtreeFlags=0,a.deletions=null;else{T=6;Y=null;return}}b=b.sibling;if(null!==b){Y=b;return}Y=b=a}while(null!==b);0===T&&(T=5)}function Pk(a,b,c){var d=C,e=ok.transition;try{ok.transition=null,C=1,Wk(a,b,c,d)}finally{ok.transition=e,C=d}return null}\nfunction Wk(a,b,c,d){do Hk();while(null!==wk);if(0!==(K&6))throw Error(p(327));c=a.finishedWork;var e=a.finishedLanes;if(null===c)return null;a.finishedWork=null;a.finishedLanes=0;if(c===a.current)throw Error(p(177));a.callbackNode=null;a.callbackPriority=0;var f=c.lanes|c.childLanes;Bc(a,f);a===Q&&(Y=Q=null,Z=0);0===(c.subtreeFlags&2064)&&0===(c.flags&2064)||vk||(vk=!0,Fk(hc,function(){Hk();return null}));f=0!==(c.flags&15990);if(0!==(c.subtreeFlags&15990)||f){f=ok.transition;ok.transition=null;\nvar g=C;C=1;var h=K;K|=4;nk.current=null;Oj(a,c);dk(c,a);Oe(Df);dd=!!Cf;Df=Cf=null;a.current=c;hk(c,a,e);dc();K=h;C=g;ok.transition=f}else a.current=c;vk&&(vk=!1,wk=a,xk=e);f=a.pendingLanes;0===f&&(Ri=null);mc(c.stateNode,d);Dk(a,B());if(null!==b)for(d=a.onRecoverableError,c=0;c<b.length;c++)e=b[c],d(e.value,{componentStack:e.stack,digest:e.digest});if(Oi)throw Oi=!1,a=Pi,Pi=null,a;0!==(xk&1)&&0!==a.tag&&Hk();f=a.pendingLanes;0!==(f&1)?a===zk?yk++:(yk=0,zk=a):yk=0;jg();return null}\nfunction Hk(){if(null!==wk){var a=Dc(xk),b=ok.transition,c=C;try{ok.transition=null;C=16>a?16:a;if(null===wk)var d=!1;else{a=wk;wk=null;xk=0;if(0!==(K&6))throw Error(p(331));var e=K;K|=4;for(V=a.current;null!==V;){var f=V,g=f.child;if(0!==(V.flags&16)){var h=f.deletions;if(null!==h){for(var k=0;k<h.length;k++){var l=h[k];for(V=l;null!==V;){var m=V;switch(m.tag){case 0:case 11:case 15:Pj(8,m,f)}var q=m.child;if(null!==q)q.return=m,V=q;else for(;null!==V;){m=V;var r=m.sibling,y=m.return;Sj(m);if(m===\nl){V=null;break}if(null!==r){r.return=y;V=r;break}V=y}}}var n=f.alternate;if(null!==n){var t=n.child;if(null!==t){n.child=null;do{var J=t.sibling;t.sibling=null;t=J}while(null!==t)}}V=f}}if(0!==(f.subtreeFlags&2064)&&null!==g)g.return=f,V=g;else b:for(;null!==V;){f=V;if(0!==(f.flags&2048))switch(f.tag){case 0:case 11:case 15:Pj(9,f,f.return)}var x=f.sibling;if(null!==x){x.return=f.return;V=x;break b}V=f.return}}var w=a.current;for(V=w;null!==V;){g=V;var u=g.child;if(0!==(g.subtreeFlags&2064)&&null!==\nu)u.return=g,V=u;else b:for(g=w;null!==V;){h=V;if(0!==(h.flags&2048))try{switch(h.tag){case 0:case 11:case 15:Qj(9,h)}}catch(na){W(h,h.return,na)}if(h===g){V=null;break b}var F=h.sibling;if(null!==F){F.return=h.return;V=F;break b}V=h.return}}K=e;jg();if(lc&&\"function\"===typeof lc.onPostCommitFiberRoot)try{lc.onPostCommitFiberRoot(kc,a)}catch(na){}d=!0}return d}finally{C=c,ok.transition=b}}return!1}function Xk(a,b,c){b=Ji(c,b);b=Ni(a,b,1);a=nh(a,b,1);b=R();null!==a&&(Ac(a,1,b),Dk(a,b))}\nfunction W(a,b,c){if(3===a.tag)Xk(a,a,c);else for(;null!==b;){if(3===b.tag){Xk(b,a,c);break}else if(1===b.tag){var d=b.stateNode;if(\"function\"===typeof b.type.getDerivedStateFromError||\"function\"===typeof d.componentDidCatch&&(null===Ri||!Ri.has(d))){a=Ji(c,a);a=Qi(b,a,1);b=nh(b,a,1);a=R();null!==b&&(Ac(b,1,a),Dk(b,a));break}}b=b.return}}\nfunction Ti(a,b,c){var d=a.pingCache;null!==d&&d.delete(b);b=R();a.pingedLanes|=a.suspendedLanes&c;Q===a&&(Z&c)===c&&(4===T||3===T&&(Z&130023424)===Z&&500>B()-fk?Kk(a,0):rk|=c);Dk(a,b)}function Yk(a,b){0===b&&(0===(a.mode&1)?b=1:(b=sc,sc<<=1,0===(sc&130023424)&&(sc=4194304)));var c=R();a=ih(a,b);null!==a&&(Ac(a,b,c),Dk(a,c))}function uj(a){var b=a.memoizedState,c=0;null!==b&&(c=b.retryLane);Yk(a,c)}\nfunction bk(a,b){var c=0;switch(a.tag){case 13:var d=a.stateNode;var e=a.memoizedState;null!==e&&(c=e.retryLane);break;case 19:d=a.stateNode;break;default:throw Error(p(314));}null!==d&&d.delete(b);Yk(a,c)}var Vk;\nVk=function(a,b,c){if(null!==a)if(a.memoizedProps!==b.pendingProps||Wf.current)dh=!0;else{if(0===(a.lanes&c)&&0===(b.flags&128))return dh=!1,yj(a,b,c);dh=0!==(a.flags&131072)?!0:!1}else dh=!1,I&&0!==(b.flags&1048576)&&ug(b,ng,b.index);b.lanes=0;switch(b.tag){case 2:var d=b.type;ij(a,b);a=b.pendingProps;var e=Yf(b,H.current);ch(b,c);e=Nh(null,b,d,a,e,c);var f=Sh();b.flags|=1;\"object\"===typeof e&&null!==e&&\"function\"===typeof e.render&&void 0===e.$$typeof?(b.tag=1,b.memoizedState=null,b.updateQueue=\nnull,Zf(d)?(f=!0,cg(b)):f=!1,b.memoizedState=null!==e.state&&void 0!==e.state?e.state:null,kh(b),e.updater=Ei,b.stateNode=e,e._reactInternals=b,Ii(b,d,a,c),b=jj(null,b,d,!0,f,c)):(b.tag=0,I&&f&&vg(b),Xi(null,b,e,c),b=b.child);return b;case 16:d=b.elementType;a:{ij(a,b);a=b.pendingProps;e=d._init;d=e(d._payload);b.type=d;e=b.tag=Zk(d);a=Ci(d,a);switch(e){case 0:b=cj(null,b,d,a,c);break a;case 1:b=hj(null,b,d,a,c);break a;case 11:b=Yi(null,b,d,a,c);break a;case 14:b=$i(null,b,d,Ci(d.type,a),c);break a}throw Error(p(306,\nd,\"\"));}return b;case 0:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Ci(d,e),cj(a,b,d,e,c);case 1:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Ci(d,e),hj(a,b,d,e,c);case 3:a:{kj(b);if(null===a)throw Error(p(387));d=b.pendingProps;f=b.memoizedState;e=f.element;lh(a,b);qh(b,d,null,c);var g=b.memoizedState;d=g.element;if(f.isDehydrated)if(f={element:d,isDehydrated:!1,cache:g.cache,pendingSuspenseBoundaries:g.pendingSuspenseBoundaries,transitions:g.transitions},b.updateQueue.baseState=\nf,b.memoizedState=f,b.flags&256){e=Ji(Error(p(423)),b);b=lj(a,b,d,c,e);break a}else if(d!==e){e=Ji(Error(p(424)),b);b=lj(a,b,d,c,e);break a}else for(yg=Lf(b.stateNode.containerInfo.firstChild),xg=b,I=!0,zg=null,c=Vg(b,null,d,c),b.child=c;c;)c.flags=c.flags&-3|4096,c=c.sibling;else{Ig();if(d===e){b=Zi(a,b,c);break a}Xi(a,b,d,c)}b=b.child}return b;case 5:return Ah(b),null===a&&Eg(b),d=b.type,e=b.pendingProps,f=null!==a?a.memoizedProps:null,g=e.children,Ef(d,e)?g=null:null!==f&&Ef(d,f)&&(b.flags|=32),\ngj(a,b),Xi(a,b,g,c),b.child;case 6:return null===a&&Eg(b),null;case 13:return oj(a,b,c);case 4:return yh(b,b.stateNode.containerInfo),d=b.pendingProps,null===a?b.child=Ug(b,null,d,c):Xi(a,b,d,c),b.child;case 11:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Ci(d,e),Yi(a,b,d,e,c);case 7:return Xi(a,b,b.pendingProps,c),b.child;case 8:return Xi(a,b,b.pendingProps.children,c),b.child;case 12:return Xi(a,b,b.pendingProps.children,c),b.child;case 10:a:{d=b.type._context;e=b.pendingProps;f=b.memoizedProps;\ng=e.value;G(Wg,d._currentValue);d._currentValue=g;if(null!==f)if(He(f.value,g)){if(f.children===e.children&&!Wf.current){b=Zi(a,b,c);break a}}else for(f=b.child,null!==f&&(f.return=b);null!==f;){var h=f.dependencies;if(null!==h){g=f.child;for(var k=h.firstContext;null!==k;){if(k.context===d){if(1===f.tag){k=mh(-1,c&-c);k.tag=2;var l=f.updateQueue;if(null!==l){l=l.shared;var m=l.pending;null===m?k.next=k:(k.next=m.next,m.next=k);l.pending=k}}f.lanes|=c;k=f.alternate;null!==k&&(k.lanes|=c);bh(f.return,\nc,b);h.lanes|=c;break}k=k.next}}else if(10===f.tag)g=f.type===b.type?null:f.child;else if(18===f.tag){g=f.return;if(null===g)throw Error(p(341));g.lanes|=c;h=g.alternate;null!==h&&(h.lanes|=c);bh(g,c,b);g=f.sibling}else g=f.child;if(null!==g)g.return=f;else for(g=f;null!==g;){if(g===b){g=null;break}f=g.sibling;if(null!==f){f.return=g.return;g=f;break}g=g.return}f=g}Xi(a,b,e.children,c);b=b.child}return b;case 9:return e=b.type,d=b.pendingProps.children,ch(b,c),e=eh(e),d=d(e),b.flags|=1,Xi(a,b,d,c),\nb.child;case 14:return d=b.type,e=Ci(d,b.pendingProps),e=Ci(d.type,e),$i(a,b,d,e,c);case 15:return bj(a,b,b.type,b.pendingProps,c);case 17:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Ci(d,e),ij(a,b),b.tag=1,Zf(d)?(a=!0,cg(b)):a=!1,ch(b,c),Gi(b,d,e),Ii(b,d,e,c),jj(null,b,d,!0,a,c);case 19:return xj(a,b,c);case 22:return dj(a,b,c)}throw Error(p(156,b.tag));};function Fk(a,b){return ac(a,b)}\nfunction $k(a,b,c,d){this.tag=a;this.key=c;this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null;this.index=0;this.ref=null;this.pendingProps=b;this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null;this.mode=d;this.subtreeFlags=this.flags=0;this.deletions=null;this.childLanes=this.lanes=0;this.alternate=null}function Bg(a,b,c,d){return new $k(a,b,c,d)}function aj(a){a=a.prototype;return!(!a||!a.isReactComponent)}\nfunction Zk(a){if(\"function\"===typeof a)return aj(a)?1:0;if(void 0!==a&&null!==a){a=a.$$typeof;if(a===Da)return 11;if(a===Ga)return 14}return 2}\nfunction Pg(a,b){var c=a.alternate;null===c?(c=Bg(a.tag,b,a.key,a.mode),c.elementType=a.elementType,c.type=a.type,c.stateNode=a.stateNode,c.alternate=a,a.alternate=c):(c.pendingProps=b,c.type=a.type,c.flags=0,c.subtreeFlags=0,c.deletions=null);c.flags=a.flags&14680064;c.childLanes=a.childLanes;c.lanes=a.lanes;c.child=a.child;c.memoizedProps=a.memoizedProps;c.memoizedState=a.memoizedState;c.updateQueue=a.updateQueue;b=a.dependencies;c.dependencies=null===b?null:{lanes:b.lanes,firstContext:b.firstContext};\nc.sibling=a.sibling;c.index=a.index;c.ref=a.ref;return c}\nfunction Rg(a,b,c,d,e,f){var g=2;d=a;if(\"function\"===typeof a)aj(a)&&(g=1);else if(\"string\"===typeof a)g=5;else a:switch(a){case ya:return Tg(c.children,e,f,b);case za:g=8;e|=8;break;case Aa:return a=Bg(12,c,b,e|2),a.elementType=Aa,a.lanes=f,a;case Ea:return a=Bg(13,c,b,e),a.elementType=Ea,a.lanes=f,a;case Fa:return a=Bg(19,c,b,e),a.elementType=Fa,a.lanes=f,a;case Ia:return pj(c,e,f,b);default:if(\"object\"===typeof a&&null!==a)switch(a.$$typeof){case Ba:g=10;break a;case Ca:g=9;break a;case Da:g=11;\nbreak a;case Ga:g=14;break a;case Ha:g=16;d=null;break a}throw Error(p(130,null==a?a:typeof a,\"\"));}b=Bg(g,c,b,e);b.elementType=a;b.type=d;b.lanes=f;return b}function Tg(a,b,c,d){a=Bg(7,a,d,b);a.lanes=c;return a}function pj(a,b,c,d){a=Bg(22,a,d,b);a.elementType=Ia;a.lanes=c;a.stateNode={isHidden:!1};return a}function Qg(a,b,c){a=Bg(6,a,null,b);a.lanes=c;return a}\nfunction Sg(a,b,c){b=Bg(4,null!==a.children?a.children:[],a.key,b);b.lanes=c;b.stateNode={containerInfo:a.containerInfo,pendingChildren:null,implementation:a.implementation};return b}\nfunction al(a,b,c,d,e){this.tag=b;this.containerInfo=a;this.finishedWork=this.pingCache=this.current=this.pendingChildren=null;this.timeoutHandle=-1;this.callbackNode=this.pendingContext=this.context=null;this.callbackPriority=0;this.eventTimes=zc(0);this.expirationTimes=zc(-1);this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0;this.entanglements=zc(0);this.identifierPrefix=d;this.onRecoverableError=e;this.mutableSourceEagerHydrationData=\nnull}function bl(a,b,c,d,e,f,g,h,k){a=new al(a,b,c,h,k);1===b?(b=1,!0===f&&(b|=8)):b=0;f=Bg(3,null,null,b);a.current=f;f.stateNode=a;f.memoizedState={element:d,isDehydrated:c,cache:null,transitions:null,pendingSuspenseBoundaries:null};kh(f);return a}function cl(a,b,c){var d=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:wa,key:null==d?null:\"\"+d,children:a,containerInfo:b,implementation:c}}\nfunction dl(a){if(!a)return Vf;a=a._reactInternals;a:{if(Vb(a)!==a||1!==a.tag)throw Error(p(170));var b=a;do{switch(b.tag){case 3:b=b.stateNode.context;break a;case 1:if(Zf(b.type)){b=b.stateNode.__reactInternalMemoizedMergedChildContext;break a}}b=b.return}while(null!==b);throw Error(p(171));}if(1===a.tag){var c=a.type;if(Zf(c))return bg(a,c,b)}return b}\nfunction el(a,b,c,d,e,f,g,h,k){a=bl(c,d,!0,a,e,f,g,h,k);a.context=dl(null);c=a.current;d=R();e=yi(c);f=mh(d,e);f.callback=void 0!==b&&null!==b?b:null;nh(c,f,e);a.current.lanes=e;Ac(a,e,d);Dk(a,d);return a}function fl(a,b,c,d){var e=b.current,f=R(),g=yi(e);c=dl(c);null===b.context?b.context=c:b.pendingContext=c;b=mh(f,g);b.payload={element:a};d=void 0===d?null:d;null!==d&&(b.callback=d);a=nh(e,b,g);null!==a&&(gi(a,e,g,f),oh(a,e,g));return g}\nfunction gl(a){a=a.current;if(!a.child)return null;switch(a.child.tag){case 5:return a.child.stateNode;default:return a.child.stateNode}}function hl(a,b){a=a.memoizedState;if(null!==a&&null!==a.dehydrated){var c=a.retryLane;a.retryLane=0!==c&&c<b?c:b}}function il(a,b){hl(a,b);(a=a.alternate)&&hl(a,b)}function jl(){return null}var kl=\"function\"===typeof reportError?reportError:function(a){console.error(a)};function ll(a){this._internalRoot=a}\nml.prototype.render=ll.prototype.render=function(a){var b=this._internalRoot;if(null===b)throw Error(p(409));fl(a,b,null,null)};ml.prototype.unmount=ll.prototype.unmount=function(){var a=this._internalRoot;if(null!==a){this._internalRoot=null;var b=a.containerInfo;Rk(function(){fl(null,a,null,null)});b[uf]=null}};function ml(a){this._internalRoot=a}\nml.prototype.unstable_scheduleHydration=function(a){if(a){var b=Hc();a={blockedOn:null,target:a,priority:b};for(var c=0;c<Qc.length&&0!==b&&b<Qc[c].priority;c++);Qc.splice(c,0,a);0===c&&Vc(a)}};function nl(a){return!(!a||1!==a.nodeType&&9!==a.nodeType&&11!==a.nodeType)}function ol(a){return!(!a||1!==a.nodeType&&9!==a.nodeType&&11!==a.nodeType&&(8!==a.nodeType||\" react-mount-point-unstable \"!==a.nodeValue))}function pl(){}\nfunction ql(a,b,c,d,e){if(e){if(\"function\"===typeof d){var f=d;d=function(){var a=gl(g);f.call(a)}}var g=el(b,d,a,0,null,!1,!1,\"\",pl);a._reactRootContainer=g;a[uf]=g.current;sf(8===a.nodeType?a.parentNode:a);Rk();return g}for(;e=a.lastChild;)a.removeChild(e);if(\"function\"===typeof d){var h=d;d=function(){var a=gl(k);h.call(a)}}var k=bl(a,0,!1,null,null,!1,!1,\"\",pl);a._reactRootContainer=k;a[uf]=k.current;sf(8===a.nodeType?a.parentNode:a);Rk(function(){fl(b,k,c,d)});return k}\nfunction rl(a,b,c,d,e){var f=c._reactRootContainer;if(f){var g=f;if(\"function\"===typeof e){var h=e;e=function(){var a=gl(g);h.call(a)}}fl(b,g,a,e)}else g=ql(c,b,a,e,d);return gl(g)}Ec=function(a){switch(a.tag){case 3:var b=a.stateNode;if(b.current.memoizedState.isDehydrated){var c=tc(b.pendingLanes);0!==c&&(Cc(b,c|1),Dk(b,B()),0===(K&6)&&(Gj=B()+500,jg()))}break;case 13:Rk(function(){var b=ih(a,1);if(null!==b){var c=R();gi(b,a,1,c)}}),il(a,1)}};\nFc=function(a){if(13===a.tag){var b=ih(a,134217728);if(null!==b){var c=R();gi(b,a,134217728,c)}il(a,134217728)}};Gc=function(a){if(13===a.tag){var b=yi(a),c=ih(a,b);if(null!==c){var d=R();gi(c,a,b,d)}il(a,b)}};Hc=function(){return C};Ic=function(a,b){var c=C;try{return C=a,b()}finally{C=c}};\nyb=function(a,b,c){switch(b){case \"input\":bb(a,c);b=c.name;if(\"radio\"===c.type&&null!=b){for(c=a;c.parentNode;)c=c.parentNode;c=c.querySelectorAll(\"input[name=\"+JSON.stringify(\"\"+b)+'][type=\"radio\"]');for(b=0;b<c.length;b++){var d=c[b];if(d!==a&&d.form===a.form){var e=Db(d);if(!e)throw Error(p(90));Wa(d);bb(d,e)}}}break;case \"textarea\":ib(a,c);break;case \"select\":b=c.value,null!=b&&fb(a,!!c.multiple,b,!1)}};Gb=Qk;Hb=Rk;\nvar sl={usingClientEntryPoint:!1,Events:[Cb,ue,Db,Eb,Fb,Qk]},tl={findFiberByHostInstance:Wc,bundleType:0,version:\"18.3.1\",rendererPackageName:\"react-dom\"};\nvar ul={bundleType:tl.bundleType,version:tl.version,rendererPackageName:tl.rendererPackageName,rendererConfig:tl.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:ua.ReactCurrentDispatcher,findHostInstanceByFiber:function(a){a=Zb(a);return null===a?null:a.stateNode},findFiberByHostInstance:tl.findFiberByHostInstance||\njl,findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:\"18.3.1-next-f1338f8080-20240426\"};if(\"undefined\"!==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var vl=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!vl.isDisabled&&vl.supportsFiber)try{kc=vl.inject(ul),lc=vl}catch(a){}}exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=sl;\nexports.createPortal=function(a,b){var c=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!nl(b))throw Error(p(200));return cl(a,b,null,c)};exports.createRoot=function(a,b){if(!nl(a))throw Error(p(299));var c=!1,d=\"\",e=kl;null!==b&&void 0!==b&&(!0===b.unstable_strictMode&&(c=!0),void 0!==b.identifierPrefix&&(d=b.identifierPrefix),void 0!==b.onRecoverableError&&(e=b.onRecoverableError));b=bl(a,1,!1,null,null,c,!1,d,e);a[uf]=b.current;sf(8===a.nodeType?a.parentNode:a);return new ll(b)};\nexports.findDOMNode=function(a){if(null==a)return null;if(1===a.nodeType)return a;var b=a._reactInternals;if(void 0===b){if(\"function\"===typeof a.render)throw Error(p(188));a=Object.keys(a).join(\",\");throw Error(p(268,a));}a=Zb(b);a=null===a?null:a.stateNode;return a};exports.flushSync=function(a){return Rk(a)};exports.hydrate=function(a,b,c){if(!ol(b))throw Error(p(200));return rl(null,a,b,!0,c)};\nexports.hydrateRoot=function(a,b,c){if(!nl(a))throw Error(p(405));var d=null!=c&&c.hydratedSources||null,e=!1,f=\"\",g=kl;null!==c&&void 0!==c&&(!0===c.unstable_strictMode&&(e=!0),void 0!==c.identifierPrefix&&(f=c.identifierPrefix),void 0!==c.onRecoverableError&&(g=c.onRecoverableError));b=el(b,null,a,1,null!=c?c:null,e,!1,f,g);a[uf]=b.current;sf(a);if(d)for(a=0;a<d.length;a++)c=d[a],e=c._getVersion,e=e(c._source),null==b.mutableSourceEagerHydrationData?b.mutableSourceEagerHydrationData=[c,e]:b.mutableSourceEagerHydrationData.push(c,\ne);return new ml(b)};exports.render=function(a,b,c){if(!ol(b))throw Error(p(200));return rl(null,a,b,!1,c)};exports.unmountComponentAtNode=function(a){if(!ol(a))throw Error(p(40));return a._reactRootContainer?(Rk(function(){rl(null,null,a,!1,function(){a._reactRootContainer=null;a[uf]=null})}),!0):!1};exports.unstable_batchedUpdates=Qk;\nexports.unstable_renderSubtreeIntoContainer=function(a,b,c,d){if(!ol(c))throw Error(p(200));if(null==a||void 0===a._reactInternals)throw Error(p(38));return rl(a,b,c,!1,d)};exports.version=\"18.3.1-next-f1338f8080-20240426\";\n","'use strict';\n\nvar m = require('react-dom');\nif (process.env.NODE_ENV === 'production') {\n exports.createRoot = m.createRoot;\n exports.hydrateRoot = m.hydrateRoot;\n} else {\n var i = m.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n exports.createRoot = function(c, o) {\n i.usingClientEntryPoint = true;\n try {\n return m.createRoot(c, o);\n } finally {\n i.usingClientEntryPoint = false;\n }\n };\n exports.hydrateRoot = function(c, h, o) {\n i.usingClientEntryPoint = true;\n try {\n return m.hydrateRoot(c, h, o);\n } finally {\n i.usingClientEntryPoint = false;\n }\n };\n}\n","'use strict';\n\nfunction checkDCE() {\n /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\n if (\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined' ||\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== 'function'\n ) {\n return;\n }\n if (process.env.NODE_ENV !== 'production') {\n // This branch is unreachable because this function is only called\n // in production, but the condition is true only in development.\n // Therefore if the branch is still here, dead code elimination wasn't\n // properly applied.\n // Don't change the message. React DevTools relies on it. Also make sure\n // this message doesn't occur elsewhere in this function, or it will cause\n // a false positive.\n throw new Error('^_^');\n }\n try {\n // Verify that the code above has been dead code eliminated (DCE'd).\n __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);\n } catch (err) {\n // DevTools shouldn't crash React, no matter what.\n // We should still report in case we break this code.\n console.error(err);\n }\n}\n\nif (process.env.NODE_ENV === 'production') {\n // DCE check should happen before ReactDOM bundle executes so that\n // DevTools can report bad minification during injection.\n checkDCE();\n module.exports = require('./cjs/react-dom.production.min.js');\n} else {\n module.exports = require('./cjs/react-dom.development.js');\n}\n","/**\n * @license React\n * scheduler.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';function f(a,b){var c=a.length;a.push(b);a:for(;0<c;){var d=c-1>>>1,e=a[d];if(0<g(e,b))a[d]=b,a[c]=e,c=d;else break a}}function h(a){return 0===a.length?null:a[0]}function k(a){if(0===a.length)return null;var b=a[0],c=a.pop();if(c!==b){a[0]=c;a:for(var d=0,e=a.length,w=e>>>1;d<w;){var m=2*(d+1)-1,C=a[m],n=m+1,x=a[n];if(0>g(C,c))n<e&&0>g(x,C)?(a[d]=x,a[n]=c,d=n):(a[d]=C,a[m]=c,d=m);else if(n<e&&0>g(x,c))a[d]=x,a[n]=c,d=n;else break a}}return b}\nfunction g(a,b){var c=a.sortIndex-b.sortIndex;return 0!==c?c:a.id-b.id}if(\"object\"===typeof performance&&\"function\"===typeof performance.now){var l=performance;exports.unstable_now=function(){return l.now()}}else{var p=Date,q=p.now();exports.unstable_now=function(){return p.now()-q}}var r=[],t=[],u=1,v=null,y=3,z=!1,A=!1,B=!1,D=\"function\"===typeof setTimeout?setTimeout:null,E=\"function\"===typeof clearTimeout?clearTimeout:null,F=\"undefined\"!==typeof setImmediate?setImmediate:null;\n\"undefined\"!==typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function G(a){for(var b=h(t);null!==b;){if(null===b.callback)k(t);else if(b.startTime<=a)k(t),b.sortIndex=b.expirationTime,f(r,b);else break;b=h(t)}}function H(a){B=!1;G(a);if(!A)if(null!==h(r))A=!0,I(J);else{var b=h(t);null!==b&&K(H,b.startTime-a)}}\nfunction J(a,b){A=!1;B&&(B=!1,E(L),L=-1);z=!0;var c=y;try{G(b);for(v=h(r);null!==v&&(!(v.expirationTime>b)||a&&!M());){var d=v.callback;if(\"function\"===typeof d){v.callback=null;y=v.priorityLevel;var e=d(v.expirationTime<=b);b=exports.unstable_now();\"function\"===typeof e?v.callback=e:v===h(r)&&k(r);G(b)}else k(r);v=h(r)}if(null!==v)var w=!0;else{var m=h(t);null!==m&&K(H,m.startTime-b);w=!1}return w}finally{v=null,y=c,z=!1}}var N=!1,O=null,L=-1,P=5,Q=-1;\nfunction M(){return exports.unstable_now()-Q<P?!1:!0}function R(){if(null!==O){var a=exports.unstable_now();Q=a;var b=!0;try{b=O(!0,a)}finally{b?S():(N=!1,O=null)}}else N=!1}var S;if(\"function\"===typeof F)S=function(){F(R)};else if(\"undefined\"!==typeof MessageChannel){var T=new MessageChannel,U=T.port2;T.port1.onmessage=R;S=function(){U.postMessage(null)}}else S=function(){D(R,0)};function I(a){O=a;N||(N=!0,S())}function K(a,b){L=D(function(){a(exports.unstable_now())},b)}\nexports.unstable_IdlePriority=5;exports.unstable_ImmediatePriority=1;exports.unstable_LowPriority=4;exports.unstable_NormalPriority=3;exports.unstable_Profiling=null;exports.unstable_UserBlockingPriority=2;exports.unstable_cancelCallback=function(a){a.callback=null};exports.unstable_continueExecution=function(){A||z||(A=!0,I(J))};\nexports.unstable_forceFrameRate=function(a){0>a||125<a?console.error(\"forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported\"):P=0<a?Math.floor(1E3/a):5};exports.unstable_getCurrentPriorityLevel=function(){return y};exports.unstable_getFirstCallbackNode=function(){return h(r)};exports.unstable_next=function(a){switch(y){case 1:case 2:case 3:var b=3;break;default:b=y}var c=y;y=b;try{return a()}finally{y=c}};exports.unstable_pauseExecution=function(){};\nexports.unstable_requestPaint=function(){};exports.unstable_runWithPriority=function(a,b){switch(a){case 1:case 2:case 3:case 4:case 5:break;default:a=3}var c=y;y=a;try{return b()}finally{y=c}};\nexports.unstable_scheduleCallback=function(a,b,c){var d=exports.unstable_now();\"object\"===typeof c&&null!==c?(c=c.delay,c=\"number\"===typeof c&&0<c?d+c:d):c=d;switch(a){case 1:var e=-1;break;case 2:e=250;break;case 5:e=1073741823;break;case 4:e=1E4;break;default:e=5E3}e=c+e;a={id:u++,callback:b,priorityLevel:a,startTime:c,expirationTime:e,sortIndex:-1};c>d?(a.sortIndex=c,f(t,a),null===h(r)&&a===h(t)&&(B?(E(L),L=-1):B=!0,K(H,c-d))):(a.sortIndex=e,f(r,a),A||z||(A=!0,I(J)));return a};\nexports.unstable_shouldYield=M;exports.unstable_wrapCallback=function(a){var b=y;return function(){var c=y;y=b;try{return a.apply(this,arguments)}finally{y=c}}};\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/scheduler.production.min.js');\n} else {\n module.exports = require('./cjs/scheduler.development.js');\n}\n","/**\n * This file automatically generated from `pre-publish.js`.\n * Do not manually edit.\n */\n\nmodule.exports = {\n \"area\": true,\n \"base\": true,\n \"br\": true,\n \"col\": true,\n \"embed\": true,\n \"hr\": true,\n \"img\": true,\n \"input\": true,\n \"link\": true,\n \"meta\": true,\n \"param\": true,\n \"source\": true,\n \"track\": true,\n \"wbr\": true\n};\n","/**\n * @license React\n * use-sync-external-store-with-selector.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar React = require(\"react\");\nfunction is(x, y) {\n return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n}\nvar objectIs = \"function\" === typeof Object.is ? Object.is : is,\n useSyncExternalStore = React.useSyncExternalStore,\n useRef = React.useRef,\n useEffect = React.useEffect,\n useMemo = React.useMemo,\n useDebugValue = React.useDebugValue;\nexports.useSyncExternalStoreWithSelector = function (\n subscribe,\n getSnapshot,\n getServerSnapshot,\n selector,\n isEqual\n) {\n var instRef = useRef(null);\n if (null === instRef.current) {\n var inst = { hasValue: !1, value: null };\n instRef.current = inst;\n } else inst = instRef.current;\n instRef = useMemo(\n function () {\n function memoizedSelector(nextSnapshot) {\n if (!hasMemo) {\n hasMemo = !0;\n memoizedSnapshot = nextSnapshot;\n nextSnapshot = selector(nextSnapshot);\n if (void 0 !== isEqual && inst.hasValue) {\n var currentSelection = inst.value;\n if (isEqual(currentSelection, nextSnapshot))\n return (memoizedSelection = currentSelection);\n }\n return (memoizedSelection = nextSnapshot);\n }\n currentSelection = memoizedSelection;\n if (objectIs(memoizedSnapshot, nextSnapshot)) return currentSelection;\n var nextSelection = selector(nextSnapshot);\n if (void 0 !== isEqual && isEqual(currentSelection, nextSelection))\n return (memoizedSnapshot = nextSnapshot), currentSelection;\n memoizedSnapshot = nextSnapshot;\n return (memoizedSelection = nextSelection);\n }\n var hasMemo = !1,\n memoizedSnapshot,\n memoizedSelection,\n maybeGetServerSnapshot =\n void 0 === getServerSnapshot ? null : getServerSnapshot;\n return [\n function () {\n return memoizedSelector(getSnapshot());\n },\n null === maybeGetServerSnapshot\n ? void 0\n : function () {\n return memoizedSelector(maybeGetServerSnapshot());\n }\n ];\n },\n [getSnapshot, getServerSnapshot, selector, isEqual]\n );\n var value = useSyncExternalStore(subscribe, instRef[0], instRef[1]);\n useEffect(\n function () {\n inst.hasValue = !0;\n inst.value = value;\n },\n [value]\n );\n useDebugValue(value);\n return value;\n};\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/use-sync-external-store-with-selector.production.js');\n} else {\n module.exports = require('./cjs/use-sync-external-store-with-selector.development.js');\n}\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","var trimmedEndIndex = require('./_trimmedEndIndex');\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nmodule.exports = baseTrim;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nmodule.exports = trimmedEndIndex;\n","var isObject = require('./isObject'),\n now = require('./now'),\n toNumber = require('./toNumber');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\nmodule.exports = debounce;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","var root = require('./_root');\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\nmodule.exports = now;\n","var debounce = require('./debounce'),\n isObject = require('./isObject');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide `options` to indicate whether `func`\n * should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n * Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, {\n 'leading': leading,\n 'maxWait': wait,\n 'trailing': trailing\n });\n}\n\nmodule.exports = throttle;\n","var baseTrim = require('./_baseTrim'),\n isObject = require('./isObject'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = toNumber;\n","function _setPrototypeOf(t, e) {\n return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) {\n return t.__proto__ = e, t;\n }, _setPrototypeOf(t, e);\n}\nexport { _setPrototypeOf as default };","var CAN_USE_DOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);\n\n// Adapted from Modernizr\n// https://github.com/Modernizr/Modernizr/blob/acb3f0d9/feature-detects/dom/passiveeventlisteners.js#L26-L37\nfunction testPassiveEventListeners() {\n if (!CAN_USE_DOM) {\n return false;\n }\n\n if (!window.addEventListener || !window.removeEventListener || !Object.defineProperty) {\n return false;\n }\n\n var supportsPassiveOption = false;\n try {\n var opts = Object.defineProperty({}, 'passive', {\n // eslint-disable-next-line getter-return\n get: function () {\n function get() {\n supportsPassiveOption = true;\n }\n\n return get;\n }()\n });\n var noop = function noop() {};\n window.addEventListener('testPassiveEventSupport', noop, opts);\n window.removeEventListener('testPassiveEventSupport', noop, opts);\n } catch (e) {\n // do nothing\n }\n\n return supportsPassiveOption;\n}\n\nvar memoized = void 0;\n\nfunction canUsePassiveEventListeners() {\n if (memoized === undefined) {\n memoized = testPassiveEventListeners();\n }\n return memoized;\n}\n\nfunction normalizeEventOptions(eventOptions) {\n if (!eventOptions) {\n return undefined;\n }\n\n if (!canUsePassiveEventListeners()) {\n // If the browser does not support the passive option, then it is expecting\n // a boolean for the options argument to specify whether it should use\n // capture or not. In more modern browsers, this is passed via the `capture`\n // option, so let's just hoist that value up.\n return !!eventOptions.capture;\n }\n\n return eventOptions;\n}\n\n/* eslint-disable no-bitwise */\n\n/**\n * Generate a unique key for any set of event options\n */\nfunction eventOptionsKey(normalizedEventOptions) {\n if (!normalizedEventOptions) {\n return 0;\n }\n\n // If the browser does not support passive event listeners, the normalized\n // event options will be a boolean.\n if (normalizedEventOptions === true) {\n return 100;\n }\n\n // At this point, the browser supports passive event listeners, so we expect\n // the event options to be an object with possible properties of capture,\n // passive, and once.\n //\n // We want to consistently return the same value, regardless of the order of\n // these properties, so let's use binary maths to assign each property to a\n // bit, and then add those together (with an offset to account for the\n // booleans at the beginning of this function).\n var capture = normalizedEventOptions.capture << 0;\n var passive = normalizedEventOptions.passive << 1;\n var once = normalizedEventOptions.once << 2;\n return capture + passive + once;\n}\n\nfunction ensureCanMutateNextEventHandlers(eventHandlers) {\n if (eventHandlers.handlers === eventHandlers.nextHandlers) {\n // eslint-disable-next-line no-param-reassign\n eventHandlers.nextHandlers = eventHandlers.handlers.slice();\n }\n}\n\nfunction TargetEventHandlers(target) {\n this.target = target;\n this.events = {};\n}\n\nTargetEventHandlers.prototype.getEventHandlers = function () {\n function getEventHandlers(eventName, options) {\n var key = String(eventName) + ' ' + String(eventOptionsKey(options));\n\n if (!this.events[key]) {\n this.events[key] = {\n handlers: [],\n handleEvent: undefined\n };\n this.events[key].nextHandlers = this.events[key].handlers;\n }\n\n return this.events[key];\n }\n\n return getEventHandlers;\n}();\n\nTargetEventHandlers.prototype.handleEvent = function () {\n function handleEvent(eventName, options, event) {\n var eventHandlers = this.getEventHandlers(eventName, options);\n eventHandlers.handlers = eventHandlers.nextHandlers;\n eventHandlers.handlers.forEach(function (handler) {\n if (handler) {\n // We need to check for presence here because a handler function may\n // cause later handlers to get removed. This can happen if you for\n // instance have a waypoint that unmounts another waypoint as part of an\n // onEnter/onLeave handler.\n handler(event);\n }\n });\n }\n\n return handleEvent;\n}();\n\nTargetEventHandlers.prototype.add = function () {\n function add(eventName, listener, options) {\n var _this = this;\n\n // options has already been normalized at this point.\n var eventHandlers = this.getEventHandlers(eventName, options);\n\n ensureCanMutateNextEventHandlers(eventHandlers);\n\n if (eventHandlers.nextHandlers.length === 0) {\n eventHandlers.handleEvent = this.handleEvent.bind(this, eventName, options);\n\n this.target.addEventListener(eventName, eventHandlers.handleEvent, options);\n }\n\n eventHandlers.nextHandlers.push(listener);\n\n var isSubscribed = true;\n var unsubscribe = function () {\n function unsubscribe() {\n if (!isSubscribed) {\n return;\n }\n\n isSubscribed = false;\n\n ensureCanMutateNextEventHandlers(eventHandlers);\n var index = eventHandlers.nextHandlers.indexOf(listener);\n eventHandlers.nextHandlers.splice(index, 1);\n\n if (eventHandlers.nextHandlers.length === 0) {\n // All event handlers have been removed, so we want to remove the event\n // listener from the target node.\n\n if (_this.target) {\n // There can be a race condition where the target may no longer exist\n // when this function is called, e.g. when a React component is\n // unmounting. Guarding against this prevents the following error:\n //\n // Cannot read property 'removeEventListener' of undefined\n _this.target.removeEventListener(eventName, eventHandlers.handleEvent, options);\n }\n\n eventHandlers.handleEvent = undefined;\n }\n }\n\n return unsubscribe;\n }();\n return unsubscribe;\n }\n\n return add;\n}();\n\nvar EVENT_HANDLERS_KEY = '__consolidated_events_handlers__';\n\n// eslint-disable-next-line import/prefer-default-export\nfunction addEventListener(target, eventName, listener, options) {\n if (!target[EVENT_HANDLERS_KEY]) {\n // eslint-disable-next-line no-param-reassign\n target[EVENT_HANDLERS_KEY] = new TargetEventHandlers(target);\n }\n var normalizedEventOptions = normalizeEventOptions(options);\n return target[EVENT_HANDLERS_KEY].add(eventName, listener, normalizedEventOptions);\n}\n\nexport { addEventListener };\n","import _inheritsLoose from '@babel/runtime/helpers/esm/inheritsLoose';\nimport { addEventListener } from 'consolidated-events';\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport { isForwardRef } from 'react-is';\n\n/**\n * Attempts to parse the offset provided as a prop as a percentage. For\n * instance, if the component has been provided with the string \"20%\" as\n * a value of one of the offset props. If the value matches, then it returns\n * a numeric version of the prop. For instance, \"20%\" would become `0.2`.\n * If `str` isn't a percentage, then `undefined` will be returned.\n *\n * @param {string} str The value of an offset prop to be converted to a\n * number.\n * @return {number|undefined} The numeric version of `str`. Undefined if `str`\n * was not a percentage.\n */\nfunction parseOffsetAsPercentage(str) {\n if (str.slice(-1) === '%') {\n return parseFloat(str.slice(0, -1)) / 100;\n }\n\n return undefined;\n}\n\n/**\n * Attempts to parse the offset provided as a prop as a pixel value. If\n * parsing fails, then `undefined` is returned. Three examples of values that\n * will be successfully parsed are:\n * `20`\n * \"20px\"\n * \"20\"\n *\n * @param {string|number} str A string of the form \"{number}\" or \"{number}px\",\n * or just a number.\n * @return {number|undefined} The numeric version of `str`. Undefined if `str`\n * was neither a number nor string ending in \"px\".\n */\nfunction parseOffsetAsPixels(str) {\n if (!isNaN(parseFloat(str)) && isFinite(str)) {\n return parseFloat(str);\n }\n\n if (str.slice(-2) === 'px') {\n return parseFloat(str.slice(0, -2));\n }\n\n return undefined;\n}\n\n/**\n * @param {string|number} offset\n * @param {number} contextHeight\n * @return {number} A number representing `offset` converted into pixels.\n */\n\nfunction computeOffsetPixels(offset, contextHeight) {\n var pixelOffset = parseOffsetAsPixels(offset);\n\n if (typeof pixelOffset === 'number') {\n return pixelOffset;\n }\n\n var percentOffset = parseOffsetAsPercentage(offset);\n\n if (typeof percentOffset === 'number') {\n return percentOffset * contextHeight;\n }\n\n return undefined;\n}\n\nvar ABOVE = 'above';\nvar INSIDE = 'inside';\nvar BELOW = 'below';\nvar INVISIBLE = 'invisible';\n\nfunction debugLog() {\n if (process.env.NODE_ENV !== 'production') {\n var _console;\n\n (_console = console).log.apply(_console, arguments); // eslint-disable-line no-console\n\n }\n}\n\n/**\n * When an element's type is a string, it represents a DOM node with that tag name\n * https://facebook.github.io/react/blog/2015/12/18/react-components-elements-and-instances.html#dom-elements\n *\n * @param {React.element} Component\n * @return {bool} Whether the component is a DOM Element\n */\nfunction isDOMElement(Component) {\n return typeof Component.type === 'string';\n}\n\nvar errorMessage = '<Waypoint> needs a DOM element to compute boundaries. The child you passed is neither a ' + 'DOM element (e.g. <div>) nor does it use the innerRef prop.\\n\\n' + 'See https://goo.gl/LrBNgw for more info.';\n/**\n * Raise an error if \"children\" is not a DOM Element and there is no ref provided to Waypoint\n *\n * @param {?React.element} children\n * @param {?HTMLElement} ref\n * @return {undefined}\n */\n\nfunction ensureRefIsProvidedByChild(children, ref) {\n if (children && !isDOMElement(children) && !ref) {\n throw new Error(errorMessage);\n }\n}\n\n/**\n * @param {object} bounds An object with bounds data for the waypoint and\n * scrollable parent\n * @return {string} The current position of the waypoint in relation to the\n * visible portion of the scrollable parent. One of the constants `ABOVE`,\n * `BELOW`, `INSIDE` or `INVISIBLE`.\n */\n\nfunction getCurrentPosition(bounds) {\n if (bounds.viewportBottom - bounds.viewportTop === 0) {\n return INVISIBLE;\n } // top is within the viewport\n\n\n if (bounds.viewportTop <= bounds.waypointTop && bounds.waypointTop <= bounds.viewportBottom) {\n return INSIDE;\n } // bottom is within the viewport\n\n\n if (bounds.viewportTop <= bounds.waypointBottom && bounds.waypointBottom <= bounds.viewportBottom) {\n return INSIDE;\n } // top is above the viewport and bottom is below the viewport\n\n\n if (bounds.waypointTop <= bounds.viewportTop && bounds.viewportBottom <= bounds.waypointBottom) {\n return INSIDE;\n }\n\n if (bounds.viewportBottom < bounds.waypointTop) {\n return BELOW;\n }\n\n if (bounds.waypointTop < bounds.viewportTop) {\n return ABOVE;\n }\n\n return INVISIBLE;\n}\n\nvar timeout;\nvar timeoutQueue = [];\nfunction onNextTick(cb) {\n timeoutQueue.push(cb);\n\n if (!timeout) {\n timeout = setTimeout(function () {\n timeout = null; // Drain the timeoutQueue\n\n var item; // eslint-disable-next-line no-cond-assign\n\n while (item = timeoutQueue.shift()) {\n item();\n }\n }, 0);\n }\n\n var isSubscribed = true;\n return function unsubscribe() {\n if (!isSubscribed) {\n return;\n }\n\n isSubscribed = false;\n var index = timeoutQueue.indexOf(cb);\n\n if (index === -1) {\n return;\n }\n\n timeoutQueue.splice(index, 1);\n\n if (!timeoutQueue.length && timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n };\n}\n\nfunction resolveScrollableAncestorProp(scrollableAncestor) {\n // When Waypoint is rendered on the server, `window` is not available.\n // To make Waypoint easier to work with, we allow this to be specified in\n // string form and safely convert to `window` here.\n if (scrollableAncestor === 'window') {\n return global.window;\n }\n\n return scrollableAncestor;\n}\n\nvar hasWindow = typeof window !== 'undefined';\nvar defaultProps = {\n debug: false,\n scrollableAncestor: undefined,\n children: undefined,\n topOffset: '0px',\n bottomOffset: '0px',\n horizontal: false,\n onEnter: function onEnter() {},\n onLeave: function onLeave() {},\n onPositionChange: function onPositionChange() {},\n fireOnRapidScroll: true\n}; // Calls a function when you scroll to the element.\n\nvar Waypoint = /*#__PURE__*/function (_React$PureComponent) {\n _inheritsLoose(Waypoint, _React$PureComponent);\n\n function Waypoint(props) {\n var _this;\n\n _this = _React$PureComponent.call(this, props) || this;\n\n _this.refElement = function (e) {\n _this._ref = e;\n };\n\n return _this;\n }\n\n var _proto = Waypoint.prototype;\n\n _proto.componentDidMount = function componentDidMount() {\n var _this2 = this;\n\n if (!hasWindow) {\n return;\n } // this._ref may occasionally not be set at this time. To help ensure that\n // this works smoothly and to avoid layout thrashing, we want to delay the\n // initial execution until the next tick.\n\n\n this.cancelOnNextTick = onNextTick(function () {\n _this2.cancelOnNextTick = null;\n var _this2$props = _this2.props,\n children = _this2$props.children,\n debug = _this2$props.debug; // Berofe doing anything, we want to check that this._ref is avaliable in Waypoint\n\n ensureRefIsProvidedByChild(children, _this2._ref);\n _this2._handleScroll = _this2._handleScroll.bind(_this2);\n _this2.scrollableAncestor = _this2._findScrollableAncestor();\n\n if (process.env.NODE_ENV !== 'production' && debug) {\n debugLog('scrollableAncestor', _this2.scrollableAncestor);\n }\n\n _this2.scrollEventListenerUnsubscribe = addEventListener(_this2.scrollableAncestor, 'scroll', _this2._handleScroll, {\n passive: true\n });\n _this2.resizeEventListenerUnsubscribe = addEventListener(window, 'resize', _this2._handleScroll, {\n passive: true\n });\n\n _this2._handleScroll(null);\n });\n };\n\n _proto.componentDidUpdate = function componentDidUpdate() {\n var _this3 = this;\n\n if (!hasWindow) {\n return;\n }\n\n if (!this.scrollableAncestor) {\n // The Waypoint has not yet initialized.\n return;\n } // The element may have moved, so we need to recompute its position on the\n // page. This happens via handleScroll in a way that forces layout to be\n // computed.\n //\n // We want this to be deferred to avoid forcing layout during render, which\n // causes layout thrashing. And, if we already have this work enqueued, we\n // can just wait for that to happen instead of enqueueing again.\n\n\n if (this.cancelOnNextTick) {\n return;\n }\n\n this.cancelOnNextTick = onNextTick(function () {\n _this3.cancelOnNextTick = null;\n\n _this3._handleScroll(null);\n });\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n if (!hasWindow) {\n return;\n }\n\n if (this.scrollEventListenerUnsubscribe) {\n this.scrollEventListenerUnsubscribe();\n }\n\n if (this.resizeEventListenerUnsubscribe) {\n this.resizeEventListenerUnsubscribe();\n }\n\n if (this.cancelOnNextTick) {\n this.cancelOnNextTick();\n }\n }\n /**\n * Traverses up the DOM to find an ancestor container which has an overflow\n * style that allows for scrolling.\n *\n * @return {Object} the closest ancestor element with an overflow style that\n * allows for scrolling. If none is found, the `window` object is returned\n * as a fallback.\n */\n ;\n\n _proto._findScrollableAncestor = function _findScrollableAncestor() {\n var _this$props = this.props,\n horizontal = _this$props.horizontal,\n scrollableAncestor = _this$props.scrollableAncestor;\n\n if (scrollableAncestor) {\n return resolveScrollableAncestorProp(scrollableAncestor);\n }\n\n var node = this._ref;\n\n while (node.parentNode) {\n node = node.parentNode;\n\n if (node === document.body) {\n // We've reached all the way to the root node.\n return window;\n }\n\n var style = window.getComputedStyle(node);\n var overflowDirec = horizontal ? style.getPropertyValue('overflow-x') : style.getPropertyValue('overflow-y');\n var overflow = overflowDirec || style.getPropertyValue('overflow');\n\n if (overflow === 'auto' || overflow === 'scroll' || overflow === 'overlay') {\n return node;\n }\n } // A scrollable ancestor element was not found, which means that we need to\n // do stuff on window.\n\n\n return window;\n }\n /**\n * @param {Object} event the native scroll event coming from the scrollable\n * ancestor, or resize event coming from the window. Will be undefined if\n * called by a React lifecyle method\n */\n ;\n\n _proto._handleScroll = function _handleScroll(event) {\n if (!this._ref) {\n // There's a chance we end up here after the component has been unmounted.\n return;\n }\n\n var bounds = this._getBounds();\n\n var currentPosition = getCurrentPosition(bounds);\n var previousPosition = this._previousPosition;\n var _this$props2 = this.props,\n debug = _this$props2.debug,\n onPositionChange = _this$props2.onPositionChange,\n onEnter = _this$props2.onEnter,\n onLeave = _this$props2.onLeave,\n fireOnRapidScroll = _this$props2.fireOnRapidScroll;\n\n if (process.env.NODE_ENV !== 'production' && debug) {\n debugLog('currentPosition', currentPosition);\n debugLog('previousPosition', previousPosition);\n } // Save previous position as early as possible to prevent cycles\n\n\n this._previousPosition = currentPosition;\n\n if (previousPosition === currentPosition) {\n // No change since last trigger\n return;\n }\n\n var callbackArg = {\n currentPosition: currentPosition,\n previousPosition: previousPosition,\n event: event,\n waypointTop: bounds.waypointTop,\n waypointBottom: bounds.waypointBottom,\n viewportTop: bounds.viewportTop,\n viewportBottom: bounds.viewportBottom\n };\n onPositionChange.call(this, callbackArg);\n\n if (currentPosition === INSIDE) {\n onEnter.call(this, callbackArg);\n } else if (previousPosition === INSIDE) {\n onLeave.call(this, callbackArg);\n }\n\n var isRapidScrollDown = previousPosition === BELOW && currentPosition === ABOVE;\n var isRapidScrollUp = previousPosition === ABOVE && currentPosition === BELOW;\n\n if (fireOnRapidScroll && (isRapidScrollDown || isRapidScrollUp)) {\n // If the scroll event isn't fired often enough to occur while the\n // waypoint was visible, we trigger both callbacks anyway.\n onEnter.call(this, {\n currentPosition: INSIDE,\n previousPosition: previousPosition,\n event: event,\n waypointTop: bounds.waypointTop,\n waypointBottom: bounds.waypointBottom,\n viewportTop: bounds.viewportTop,\n viewportBottom: bounds.viewportBottom\n });\n onLeave.call(this, {\n currentPosition: currentPosition,\n previousPosition: INSIDE,\n event: event,\n waypointTop: bounds.waypointTop,\n waypointBottom: bounds.waypointBottom,\n viewportTop: bounds.viewportTop,\n viewportBottom: bounds.viewportBottom\n });\n }\n };\n\n _proto._getBounds = function _getBounds() {\n var _this$props3 = this.props,\n horizontal = _this$props3.horizontal,\n debug = _this$props3.debug;\n\n var _this$_ref$getBoundin = this._ref.getBoundingClientRect(),\n left = _this$_ref$getBoundin.left,\n top = _this$_ref$getBoundin.top,\n right = _this$_ref$getBoundin.right,\n bottom = _this$_ref$getBoundin.bottom;\n\n var waypointTop = horizontal ? left : top;\n var waypointBottom = horizontal ? right : bottom;\n var contextHeight;\n var contextScrollTop;\n\n if (this.scrollableAncestor === window) {\n contextHeight = horizontal ? window.innerWidth : window.innerHeight;\n contextScrollTop = 0;\n } else {\n contextHeight = horizontal ? this.scrollableAncestor.offsetWidth : this.scrollableAncestor.offsetHeight;\n contextScrollTop = horizontal ? this.scrollableAncestor.getBoundingClientRect().left : this.scrollableAncestor.getBoundingClientRect().top;\n }\n\n if (process.env.NODE_ENV !== 'production' && debug) {\n debugLog('waypoint top', waypointTop);\n debugLog('waypoint bottom', waypointBottom);\n debugLog('scrollableAncestor height', contextHeight);\n debugLog('scrollableAncestor scrollTop', contextScrollTop);\n }\n\n var _this$props4 = this.props,\n bottomOffset = _this$props4.bottomOffset,\n topOffset = _this$props4.topOffset;\n var topOffsetPx = computeOffsetPixels(topOffset, contextHeight);\n var bottomOffsetPx = computeOffsetPixels(bottomOffset, contextHeight);\n var contextBottom = contextScrollTop + contextHeight;\n return {\n waypointTop: waypointTop,\n waypointBottom: waypointBottom,\n viewportTop: contextScrollTop + topOffsetPx,\n viewportBottom: contextBottom - bottomOffsetPx\n };\n }\n /**\n * @return {Object}\n */\n ;\n\n _proto.render = function render() {\n var _this4 = this;\n\n var children = this.props.children;\n\n if (!children) {\n // We need an element that we can locate in the DOM to determine where it is\n // rendered relative to the top of its context.\n return /*#__PURE__*/React.createElement(\"span\", {\n ref: this.refElement,\n style: {\n fontSize: 0\n }\n });\n }\n\n if (isDOMElement(children) || isForwardRef(children)) {\n var ref = function ref(node) {\n _this4.refElement(node);\n\n if (children.ref) {\n if (typeof children.ref === 'function') {\n children.ref(node);\n } else {\n children.ref.current = node;\n }\n }\n };\n\n return /*#__PURE__*/React.cloneElement(children, {\n ref: ref\n });\n }\n\n return /*#__PURE__*/React.cloneElement(children, {\n innerRef: this.refElement\n });\n };\n\n return Waypoint;\n}(React.PureComponent);\n\nif (process.env.NODE_ENV !== 'production') {\n Waypoint.propTypes = {\n children: PropTypes.element,\n debug: PropTypes.bool,\n onEnter: PropTypes.func,\n onLeave: PropTypes.func,\n onPositionChange: PropTypes.func,\n fireOnRapidScroll: PropTypes.bool,\n // eslint-disable-next-line react/forbid-prop-types\n scrollableAncestor: PropTypes.any,\n horizontal: PropTypes.bool,\n // `topOffset` can either be a number, in which case its a distance from the\n // top of the container in pixels, or a string value. Valid string values are\n // of the form \"20px\", which is parsed as pixels, or \"20%\", which is parsed\n // as a percentage of the height of the containing element.\n // For instance, if you pass \"-20%\", and the containing element is 100px tall,\n // then the waypoint will be triggered when it has been scrolled 20px beyond\n // the top of the containing element.\n topOffset: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n // `bottomOffset` can either be a number, in which case its a distance from the\n // bottom of the container in pixels, or a string value. Valid string values are\n // of the form \"20px\", which is parsed as pixels, or \"20%\", which is parsed\n // as a percentage of the height of the containing element.\n // For instance, if you pass \"20%\", and the containing element is 100px tall,\n // then the waypoint will be triggered when it has been scrolled 20px beyond\n // the bottom of the containing element.\n // Similar to `topOffset`, but for the bottom of the container.\n bottomOffset: PropTypes.oneOfType([PropTypes.string, PropTypes.number])\n };\n}\n\nWaypoint.above = ABOVE;\nWaypoint.below = BELOW;\nWaypoint.inside = INSIDE;\nWaypoint.invisible = INVISIBLE;\nWaypoint.defaultProps = defaultProps;\nWaypoint.displayName = 'Waypoint';\n\nexport { Waypoint };\n","import setPrototypeOf from \"./setPrototypeOf.js\";\nfunction _inheritsLoose(t, o) {\n t.prototype = Object.create(o.prototype), t.prototype.constructor = t, setPrototypeOf(t, o);\n}\nexport { _inheritsLoose as default };","/**\n * @license React\n * react-is.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var b=Symbol.for(\"react.element\"),c=Symbol.for(\"react.portal\"),d=Symbol.for(\"react.fragment\"),e=Symbol.for(\"react.strict_mode\"),f=Symbol.for(\"react.profiler\"),g=Symbol.for(\"react.provider\"),h=Symbol.for(\"react.context\"),k=Symbol.for(\"react.server_context\"),l=Symbol.for(\"react.forward_ref\"),m=Symbol.for(\"react.suspense\"),n=Symbol.for(\"react.suspense_list\"),p=Symbol.for(\"react.memo\"),q=Symbol.for(\"react.lazy\"),t=Symbol.for(\"react.offscreen\"),u;u=Symbol.for(\"react.module.reference\");\nfunction v(a){if(\"object\"===typeof a&&null!==a){var r=a.$$typeof;switch(r){case b:switch(a=a.type,a){case d:case f:case e:case m:case n:return a;default:switch(a=a&&a.$$typeof,a){case k:case h:case l:case q:case p:case g:return a;default:return r}}case c:return r}}}exports.ContextConsumer=h;exports.ContextProvider=g;exports.Element=b;exports.ForwardRef=l;exports.Fragment=d;exports.Lazy=q;exports.Memo=p;exports.Portal=c;exports.Profiler=f;exports.StrictMode=e;exports.Suspense=m;\nexports.SuspenseList=n;exports.isAsyncMode=function(){return!1};exports.isConcurrentMode=function(){return!1};exports.isContextConsumer=function(a){return v(a)===h};exports.isContextProvider=function(a){return v(a)===g};exports.isElement=function(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===b};exports.isForwardRef=function(a){return v(a)===l};exports.isFragment=function(a){return v(a)===d};exports.isLazy=function(a){return v(a)===q};exports.isMemo=function(a){return v(a)===p};\nexports.isPortal=function(a){return v(a)===c};exports.isProfiler=function(a){return v(a)===f};exports.isStrictMode=function(a){return v(a)===e};exports.isSuspense=function(a){return v(a)===m};exports.isSuspenseList=function(a){return v(a)===n};\nexports.isValidElementType=function(a){return\"string\"===typeof a||\"function\"===typeof a||a===d||a===f||a===e||a===m||a===n||a===t||\"object\"===typeof a&&null!==a&&(a.$$typeof===q||a.$$typeof===p||a.$$typeof===g||a.$$typeof===h||a.$$typeof===l||a.$$typeof===u||void 0!==a.getModuleId)?!0:!1};exports.typeOf=v;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-is.production.min.js');\n} else {\n module.exports = require('./cjs/react-is.development.js');\n}\n","/**\n * @license React\n * react-jsx-runtime.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var f=require(\"react\"),k=Symbol.for(\"react.element\"),l=Symbol.for(\"react.fragment\"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};\nfunction q(c,a,g){var b,d={},e=null,h=null;void 0!==g&&(e=\"\"+g);void 0!==a.key&&(e=\"\"+a.key);void 0!==a.ref&&(h=a.ref);for(b in a)m.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:k,type:c,key:e,ref:h,props:d,_owner:n.current}}exports.Fragment=l;exports.jsx=q;exports.jsxs=q;\n","/**\n * @license React\n * react.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var l=Symbol.for(\"react.element\"),n=Symbol.for(\"react.portal\"),p=Symbol.for(\"react.fragment\"),q=Symbol.for(\"react.strict_mode\"),r=Symbol.for(\"react.profiler\"),t=Symbol.for(\"react.provider\"),u=Symbol.for(\"react.context\"),v=Symbol.for(\"react.forward_ref\"),w=Symbol.for(\"react.suspense\"),x=Symbol.for(\"react.memo\"),y=Symbol.for(\"react.lazy\"),z=Symbol.iterator;function A(a){if(null===a||\"object\"!==typeof a)return null;a=z&&a[z]||a[\"@@iterator\"];return\"function\"===typeof a?a:null}\nvar B={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},C=Object.assign,D={};function E(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B}E.prototype.isReactComponent={};\nE.prototype.setState=function(a,b){if(\"object\"!==typeof a&&\"function\"!==typeof a&&null!=a)throw Error(\"setState(...): takes an object of state variables to update or a function which returns an object of state variables.\");this.updater.enqueueSetState(this,a,b,\"setState\")};E.prototype.forceUpdate=function(a){this.updater.enqueueForceUpdate(this,a,\"forceUpdate\")};function F(){}F.prototype=E.prototype;function G(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B}var H=G.prototype=new F;\nH.constructor=G;C(H,E.prototype);H.isPureReactComponent=!0;var I=Array.isArray,J=Object.prototype.hasOwnProperty,K={current:null},L={key:!0,ref:!0,__self:!0,__source:!0};\nfunction M(a,b,e){var d,c={},k=null,h=null;if(null!=b)for(d in void 0!==b.ref&&(h=b.ref),void 0!==b.key&&(k=\"\"+b.key),b)J.call(b,d)&&!L.hasOwnProperty(d)&&(c[d]=b[d]);var g=arguments.length-2;if(1===g)c.children=e;else if(1<g){for(var f=Array(g),m=0;m<g;m++)f[m]=arguments[m+2];c.children=f}if(a&&a.defaultProps)for(d in g=a.defaultProps,g)void 0===c[d]&&(c[d]=g[d]);return{$$typeof:l,type:a,key:k,ref:h,props:c,_owner:K.current}}\nfunction N(a,b){return{$$typeof:l,type:a.type,key:b,ref:a.ref,props:a.props,_owner:a._owner}}function O(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===l}function escape(a){var b={\"=\":\"=0\",\":\":\"=2\"};return\"$\"+a.replace(/[=:]/g,function(a){return b[a]})}var P=/\\/+/g;function Q(a,b){return\"object\"===typeof a&&null!==a&&null!=a.key?escape(\"\"+a.key):b.toString(36)}\nfunction R(a,b,e,d,c){var k=typeof a;if(\"undefined\"===k||\"boolean\"===k)a=null;var h=!1;if(null===a)h=!0;else switch(k){case \"string\":case \"number\":h=!0;break;case \"object\":switch(a.$$typeof){case l:case n:h=!0}}if(h)return h=a,c=c(h),a=\"\"===d?\".\"+Q(h,0):d,I(c)?(e=\"\",null!=a&&(e=a.replace(P,\"$&/\")+\"/\"),R(c,b,e,\"\",function(a){return a})):null!=c&&(O(c)&&(c=N(c,e+(!c.key||h&&h.key===c.key?\"\":(\"\"+c.key).replace(P,\"$&/\")+\"/\")+a)),b.push(c)),1;h=0;d=\"\"===d?\".\":d+\":\";if(I(a))for(var g=0;g<a.length;g++){k=\na[g];var f=d+Q(k,g);h+=R(k,b,e,f,c)}else if(f=A(a),\"function\"===typeof f)for(a=f.call(a),g=0;!(k=a.next()).done;)k=k.value,f=d+Q(k,g++),h+=R(k,b,e,f,c);else if(\"object\"===k)throw b=String(a),Error(\"Objects are not valid as a React child (found: \"+(\"[object Object]\"===b?\"object with keys {\"+Object.keys(a).join(\", \")+\"}\":b)+\"). If you meant to render a collection of children, use an array instead.\");return h}\nfunction S(a,b,e){if(null==a)return a;var d=[],c=0;R(a,d,\"\",\"\",function(a){return b.call(e,a,c++)});return d}function T(a){if(-1===a._status){var b=a._result;b=b();b.then(function(b){if(0===a._status||-1===a._status)a._status=1,a._result=b},function(b){if(0===a._status||-1===a._status)a._status=2,a._result=b});-1===a._status&&(a._status=0,a._result=b)}if(1===a._status)return a._result.default;throw a._result;}\nvar U={current:null},V={transition:null},W={ReactCurrentDispatcher:U,ReactCurrentBatchConfig:V,ReactCurrentOwner:K};function X(){throw Error(\"act(...) is not supported in production builds of React.\");}\nexports.Children={map:S,forEach:function(a,b,e){S(a,function(){b.apply(this,arguments)},e)},count:function(a){var b=0;S(a,function(){b++});return b},toArray:function(a){return S(a,function(a){return a})||[]},only:function(a){if(!O(a))throw Error(\"React.Children.only expected to receive a single React element child.\");return a}};exports.Component=E;exports.Fragment=p;exports.Profiler=r;exports.PureComponent=G;exports.StrictMode=q;exports.Suspense=w;\nexports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=W;exports.act=X;\nexports.cloneElement=function(a,b,e){if(null===a||void 0===a)throw Error(\"React.cloneElement(...): The argument must be a React element, but you passed \"+a+\".\");var d=C({},a.props),c=a.key,k=a.ref,h=a._owner;if(null!=b){void 0!==b.ref&&(k=b.ref,h=K.current);void 0!==b.key&&(c=\"\"+b.key);if(a.type&&a.type.defaultProps)var g=a.type.defaultProps;for(f in b)J.call(b,f)&&!L.hasOwnProperty(f)&&(d[f]=void 0===b[f]&&void 0!==g?g[f]:b[f])}var f=arguments.length-2;if(1===f)d.children=e;else if(1<f){g=Array(f);\nfor(var m=0;m<f;m++)g[m]=arguments[m+2];d.children=g}return{$$typeof:l,type:a.type,key:c,ref:k,props:d,_owner:h}};exports.createContext=function(a){a={$$typeof:u,_currentValue:a,_currentValue2:a,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null};a.Provider={$$typeof:t,_context:a};return a.Consumer=a};exports.createElement=M;exports.createFactory=function(a){var b=M.bind(null,a);b.type=a;return b};exports.createRef=function(){return{current:null}};\nexports.forwardRef=function(a){return{$$typeof:v,render:a}};exports.isValidElement=O;exports.lazy=function(a){return{$$typeof:y,_payload:{_status:-1,_result:a},_init:T}};exports.memo=function(a,b){return{$$typeof:x,type:a,compare:void 0===b?null:b}};exports.startTransition=function(a){var b=V.transition;V.transition={};try{a()}finally{V.transition=b}};exports.unstable_act=X;exports.useCallback=function(a,b){return U.current.useCallback(a,b)};exports.useContext=function(a){return U.current.useContext(a)};\nexports.useDebugValue=function(){};exports.useDeferredValue=function(a){return U.current.useDeferredValue(a)};exports.useEffect=function(a,b){return U.current.useEffect(a,b)};exports.useId=function(){return U.current.useId()};exports.useImperativeHandle=function(a,b,e){return U.current.useImperativeHandle(a,b,e)};exports.useInsertionEffect=function(a,b){return U.current.useInsertionEffect(a,b)};exports.useLayoutEffect=function(a,b){return U.current.useLayoutEffect(a,b)};\nexports.useMemo=function(a,b){return U.current.useMemo(a,b)};exports.useReducer=function(a,b,e){return U.current.useReducer(a,b,e)};exports.useRef=function(a){return U.current.useRef(a)};exports.useState=function(a){return U.current.useState(a)};exports.useSyncExternalStore=function(a,b,e){return U.current.useSyncExternalStore(a,b,e)};exports.useTransition=function(){return U.current.useTransition()};exports.version=\"18.3.1\";\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react.production.min.js');\n} else {\n module.exports = require('./cjs/react.development.js');\n}\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.min.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","/*!\n * @license\n * EME Encryption Scheme Polyfill\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n// This special header is retained in minified bundle, and only adds ~120 bytes.\n\n/**\n * A polyfill to add support for EncryptionScheme queries in EME.\n *\n * Because this polyfill can't know what schemes the UA or CDM actually support,\n * it assumes support for the historically-supported schemes of each well-known\n * key system.\n *\n * In source form, this is compatible with the Closure Compiler, CommonJS, and\n * AMD module formats. It can also be directly included via a script tag.\n *\n * The minified bundle is a standalone module compatible with the CommonJS and\n * AMD module formats, and can also be directly included via a script tag.\n *\n * @see https://wicg.github.io/encrypted-media-encryption-scheme/\n * @see https://github.com/w3c/encrypted-media/pull/457\n * @export\n */\nclass EmeEncryptionSchemePolyfill {\n /**\n * Installs the polyfill. To avoid the possibility of extra user prompts,\n * this will shim EME so long as it exists, without checking support for\n * encryptionScheme upfront. The support check will happen on-demand the\n * first time EME is used.\n *\n * @export\n */\n static install() {\n if (EmeEncryptionSchemePolyfill.originalRMKSA_ ||\n navigator['emeEncryptionSchemePolyfilled']) {\n console.debug('EmeEncryptionSchemePolyfill: Already installed.');\n return;\n }\n if (!navigator.requestMediaKeySystemAccess ||\n !MediaKeySystemAccess.prototype.getConfiguration) {\n console.debug('EmeEncryptionSchemePolyfill: EME not found');\n // No EME.\n return;\n }\n\n // Save the original.\n EmeEncryptionSchemePolyfill.originalRMKSA_ =\n navigator.requestMediaKeySystemAccess;\n\n // Patch in a method which will check for support on the first call.\n console.debug('EmeEncryptionSchemePolyfill: ' +\n 'Waiting to detect encryptionScheme support.');\n navigator.requestMediaKeySystemAccess =\n EmeEncryptionSchemePolyfill.probeRMKSA_;\n\n // Mark EME as polyfilled. This keeps us from running into conflicts\n // between multiple versions of this (compiled Shaka lib vs\n // uncompiled source).\n navigator['emeEncryptionSchemePolyfilled'] = true;\n }\n\n /**\n * A shim for navigator.requestMediaKeySystemAccess to check for\n * encryptionScheme support. Only used until we know if the browser has\n * native support for the encryptionScheme field.\n *\n * @this {Navigator}\n * @param {string} keySystem The key system ID.\n * @param {!Array.<!MediaKeySystemConfiguration>} supportedConfigurations An\n * array of supported configurations the application can use.\n * @return {!Promise.<!MediaKeySystemAccess>} A Promise to a\n * MediaKeySystemAccess instance.\n * @private\n */\n static async probeRMKSA_(keySystem, supportedConfigurations) {\n console.assert(this == navigator,\n 'bad \"this\" for requestMediaKeySystemAccess');\n\n // Call the original version. If the call succeeds, we look at the result\n // to decide if the encryptionScheme field is supported or not.\n const mediaKeySystemAccess =\n await EmeEncryptionSchemePolyfill.originalRMKSA_.call(\n this, keySystem, supportedConfigurations);\n\n if (hasEncryptionScheme(mediaKeySystemAccess)) {\n // The browser supports the encryptionScheme field!\n // No need for a patch. Revert back to the original implementation.\n console.debug('EmeEncryptionSchemePolyfill: ' +\n 'Native encryptionScheme support found.');\n // eslint-disable-next-line require-atomic-updates\n navigator.requestMediaKeySystemAccess =\n EmeEncryptionSchemePolyfill.originalRMKSA_;\n // Return the results, which are completely valid.\n return mediaKeySystemAccess;\n }\n\n // If we land here, the browser does _not_ support the encryptionScheme\n // field. So we install another patch to check the encryptionScheme field\n // in future calls.\n console.debug('EmeEncryptionSchemePolyfill: ' +\n 'No native encryptionScheme support found. '+\n 'Patching encryptionScheme support.');\n // eslint-disable-next-line require-atomic-updates\n navigator.requestMediaKeySystemAccess =\n EmeEncryptionSchemePolyfill.polyfillRMKSA_;\n\n // The results we have may not be valid. Run the query again through our\n // polyfill.\n return EmeEncryptionSchemePolyfill.polyfillRMKSA_.call(\n this, keySystem, supportedConfigurations);\n }\n\n /**\n * A polyfill for navigator.requestMediaKeySystemAccess to handle the\n * encryptionScheme field in browsers that don't support it. It uses the\n * user-agent string to guess what encryption schemes are supported, then\n * those guesses are used to filter videoCapabilities and audioCapabilities\n * and reject unsupported schemes.\n *\n * @this {Navigator}\n * @param {string} keySystem The key system ID.\n * @param {!Array.<!MediaKeySystemConfiguration>} supportedConfigurations An\n * array of supported configurations the application can use.\n * @return {!Promise.<!MediaKeySystemAccess>} A Promise to a\n * MediaKeySystemAccess instance.\n * @private\n */\n static async polyfillRMKSA_(keySystem, supportedConfigurations) {\n console.assert(this == navigator,\n 'bad \"this\" for requestMediaKeySystemAccess');\n\n const supportedScheme = guessSupportedScheme(keySystem);\n\n // Filter the application's configurations based on our guess of what\n // encryption scheme is supported.\n const filteredSupportedConfigurations = [];\n for (const configuration of supportedConfigurations) {\n const filteredVideoCapabilities =\n EmeEncryptionSchemePolyfill.filterCapabilities_(\n configuration.videoCapabilities, supportedScheme);\n const filteredAudioCapabilities =\n EmeEncryptionSchemePolyfill.filterCapabilities_(\n configuration.audioCapabilities, supportedScheme);\n\n if (configuration.videoCapabilities &&\n configuration.videoCapabilities.length &&\n !filteredVideoCapabilities.length) {\n // We eliminated all of the video capabilities, so this configuration\n // is unusable.\n } else if (configuration.audioCapabilities &&\n configuration.audioCapabilities.length &&\n !filteredAudioCapabilities.length) {\n // We eliminated all of the audio capabilities, so this configuration\n // is unusable.\n } else {\n // Recreate a clone of the configuration and modify that. This way, we\n // don't modify the application-provided config objects.\n /** @type {!MediaKeySystemConfiguration} */\n const clonedConfiguration = Object.assign({}, configuration);\n clonedConfiguration.videoCapabilities = filteredVideoCapabilities;\n clonedConfiguration.audioCapabilities = filteredAudioCapabilities;\n filteredSupportedConfigurations.push(clonedConfiguration);\n }\n }\n\n if (!filteredSupportedConfigurations.length) {\n // None of the application's configurations passed our encryptionScheme\n // filters, so this request fails.\n\n // As spec'd, this should be a DOMException, but there is not a public\n // constructor for this in all browsers. This should be close enough for\n // most applications.\n const unsupportedError = new Error(\n 'Unsupported keySystem or supportedConfigurations.');\n unsupportedError.name = 'NotSupportedError';\n unsupportedError['code'] = DOMException.NOT_SUPPORTED_ERR;\n throw unsupportedError;\n }\n\n // At this point, we have some filtered configurations that we think could\n // work. Pass this subset to the native version of RMKSA.\n const mediaKeySystemAccess =\n await EmeEncryptionSchemePolyfill.originalRMKSA_.call(\n this, keySystem, filteredSupportedConfigurations);\n\n // Wrap the MKSA object in ours to provide the missing field in the\n // returned configuration.\n let videoScheme = null;\n let audioScheme = null;\n if (filteredSupportedConfigurations[0]) {\n if (filteredSupportedConfigurations[0].videoCapabilities) {\n videoScheme = filteredSupportedConfigurations[0]\n .videoCapabilities[0].encryptionScheme;\n }\n if (filteredSupportedConfigurations[0].audioCapabilities) {\n audioScheme = filteredSupportedConfigurations[0]\n .audioCapabilities[0].encryptionScheme;\n }\n }\n return new EmeEncryptionSchemePolyfillMediaKeySystemAccess(\n mediaKeySystemAccess, videoScheme, audioScheme);\n }\n\n /**\n * Filters out capabilities that don't match the supported encryption scheme.\n *\n * @param {!Array.<!MediaKeySystemMediaCapability>|undefined} capabilities\n * An array of capabilities, or null or undefined.\n * @param {?string} supportedScheme The encryption scheme that we think is\n * supported by the key system.\n * @return {!Array.<!MediaKeySystemMediaCapability>|undefined} A filtered\n * array of capabilities based on |supportedScheme|. May be undefined if\n * the input was undefined.\n * @private\n */\n static filterCapabilities_(capabilities, supportedScheme) {\n if (!capabilities) {\n return capabilities;\n }\n\n return capabilities.filter((capability) => {\n return checkSupportedScheme(\n capability['encryptionScheme'], supportedScheme);\n });\n }\n}\n\n/**\n * A polyfill to add support for EncryptionScheme queries in MediaCapabilities.\n *\n * Because this polyfill can't know what schemes the UA or CDM actually support,\n * it assumes support for the historically-supported schemes of each well-known\n * key system.\n *\n * In source form, this is compatible with the Closure Compiler, CommonJS, and\n * AMD module formats. It can also be directly included via a script tag.\n *\n * The minified bundle is a standalone module compatible with the CommonJS and\n * AMD module formats, and can also be directly included via a script tag.\n *\n * @see https://wicg.github.io/encrypted-media-encryption-scheme/\n * @see https://github.com/w3c/encrypted-media/pull/457\n * @export\n */\nclass McEncryptionSchemePolyfill {\n /**\n * Installs the polyfill. To avoid the possibility of extra user prompts,\n * this will shim MC so long as it exists, without checking support for\n * encryptionScheme upfront. The support check will happen on-demand the\n * first time MC is used.\n *\n * @export\n */\n static install() {\n if (McEncryptionSchemePolyfill.originalDecodingInfo_ ||\n navigator['mediaCapabilitiesEncryptionSchemePolyfilled']) {\n console.debug('McEncryptionSchemePolyfill: Already installed.');\n return;\n }\n if (!navigator.mediaCapabilities) {\n console.debug('McEncryptionSchemePolyfill: MediaCapabilities not found');\n // No MediaCapabilities.\n return;\n }\n\n // Save the original.\n McEncryptionSchemePolyfill.originalDecodingInfo_ =\n navigator.mediaCapabilities.decodingInfo;\n\n // Patch in a method which will check for support on the first call.\n console.debug('McEncryptionSchemePolyfill: ' +\n 'Waiting to detect encryptionScheme support.');\n navigator.mediaCapabilities.decodingInfo =\n McEncryptionSchemePolyfill.probeDecodingInfo_;\n\n // Mark MediaCapabilities as polyfilled. This keeps us from running into\n // conflicts between multiple versions of this (compiled Shaka lib vs\n // uncompiled source).\n navigator['mediaCapabilitiesEncryptionSchemePolyfilled'] = true;\n }\n\n /**\n * A shim for mediaCapabilities.decodingInfo to check for encryptionScheme\n * support. Only used until we know if the browser has native support for the\n * encryptionScheme field.\n *\n * @this {MediaCapabilities}\n * @param {!MediaDecodingConfiguration} requestedConfiguration The requested\n * decoding configuration.\n * @return {!Promise.<!MediaCapabilitiesDecodingInfo>} A Promise to a result\n * describing the capabilities of the browser in the request configuration.\n * @private\n */\n static async probeDecodingInfo_(requestedConfiguration) {\n console.assert(this == navigator.mediaCapabilities,\n 'bad \"this\" for decodingInfo');\n\n // Call the original version. If the call succeeds, we look at the result\n // to decide if the encryptionScheme field is supported or not.\n const capabilities =\n await McEncryptionSchemePolyfill.originalDecodingInfo_.call(\n this, requestedConfiguration);\n\n // If the config is not supported, we don't need to try anything else.\n if (!capabilities.supported) {\n return capabilities;\n }\n\n if (!requestedConfiguration.keySystemConfiguration) {\n // This was not a query regarding encrypted content. The results are\n // valid, but won't tell us anything about native support for\n // encryptionScheme. Just return the results.\n return capabilities;\n }\n\n const mediaKeySystemAccess = capabilities.keySystemAccess;\n\n if (mediaKeySystemAccess && hasEncryptionScheme(mediaKeySystemAccess)) {\n // The browser supports the encryptionScheme field!\n // No need for a patch. Revert back to the original implementation.\n console.debug('McEncryptionSchemePolyfill: ' +\n 'Native encryptionScheme support found.');\n // eslint-disable-next-line require-atomic-updates\n navigator.mediaCapabilities.decodingInfo =\n McEncryptionSchemePolyfill.originalDecodingInfo_;\n // Return the results, which are completely valid.\n return capabilities;\n }\n\n // If we land here, either the browser does not support the\n // encryptionScheme field, or the browser does not support EME-related\n // fields in MCap _at all_.\n\n // First, install a patch to check the mediaKeySystemAccess or\n // encryptionScheme field in future calls.\n console.debug('McEncryptionSchemePolyfill: ' +\n 'No native encryptionScheme support found. '+\n 'Patching encryptionScheme support.');\n // eslint-disable-next-line require-atomic-updates\n navigator.mediaCapabilities.decodingInfo =\n McEncryptionSchemePolyfill.polyfillDecodingInfo_;\n\n // Second, if _none_ of the EME-related fields of MCap are supported, fill\n // them in now before returning the results.\n if (!mediaKeySystemAccess) {\n capabilities.keySystemAccess =\n await McEncryptionSchemePolyfill.getMediaKeySystemAccess_(\n requestedConfiguration);\n return capabilities;\n }\n\n // If we land here, it's only the encryption scheme field that is missing.\n // The results we have may not be valid, since they didn't account for\n // encryption scheme. Run the query again through our polyfill.\n return McEncryptionSchemePolyfill.polyfillDecodingInfo_.call(\n this, requestedConfiguration);\n }\n\n /**\n * A polyfill for mediaCapabilities.decodingInfo to handle the\n * encryptionScheme field in browsers that don't support it. It uses the\n * user-agent string to guess what encryption schemes are supported, then\n * those guesses are used to reject unsupported schemes.\n *\n * @this {MediaCapabilities}\n * @param {!MediaDecodingConfiguration} requestedConfiguration The requested\n * decoding configuration.\n * @return {!Promise.<!MediaCapabilitiesDecodingInfo>} A Promise to a result\n * describing the capabilities of the browser in the request configuration.\n * @private\n */\n static async polyfillDecodingInfo_(requestedConfiguration) {\n console.assert(this == navigator.mediaCapabilities,\n 'bad \"this\" for decodingInfo');\n\n let videoScheme = null;\n let audioScheme = null;\n\n if (requestedConfiguration.keySystemConfiguration) {\n const keySystemConfig = requestedConfiguration.keySystemConfiguration;\n\n const keySystem = keySystemConfig.keySystem;\n\n audioScheme = keySystemConfig.audio &&\n keySystemConfig.audio.encryptionScheme;\n videoScheme = keySystemConfig.video &&\n keySystemConfig.video.encryptionScheme;\n\n const supportedScheme = guessSupportedScheme(keySystem);\n\n const notSupportedResult = {\n powerEfficient: false,\n smooth: false,\n supported: false,\n keySystemAccess: null,\n configuration: requestedConfiguration,\n };\n\n if (!checkSupportedScheme(audioScheme, supportedScheme)) {\n return notSupportedResult;\n }\n if (!checkSupportedScheme(videoScheme, supportedScheme)) {\n return notSupportedResult;\n }\n }\n\n // At this point, either it's unencrypted or we assume the encryption scheme\n // is supported. So delegate to the original decodingInfo() method.\n const capabilities =\n await McEncryptionSchemePolyfill.originalDecodingInfo_.call(\n this, requestedConfiguration);\n\n if (capabilities.keySystemAccess) {\n // If the result is supported and encrypted, this will be a\n // MediaKeySystemAccess instance. Wrap the MKSA object in ours to provide\n // the missing field in the returned configuration.\n capabilities.keySystemAccess =\n new EmeEncryptionSchemePolyfillMediaKeySystemAccess(\n capabilities.keySystemAccess, videoScheme, audioScheme);\n } else if (requestedConfiguration.keySystemConfiguration) {\n // If the result is supported and the content is encrypted, we should have\n // a MediaKeySystemAccess instance as part of the result. If we land\n // here, the browser doesn't support the EME-related fields of MCap.\n capabilities.keySystemAccess =\n await McEncryptionSchemePolyfill.getMediaKeySystemAccess_(\n requestedConfiguration);\n }\n\n return capabilities;\n }\n\n /**\n * Call navigator.requestMediaKeySystemAccess to get the MediaKeySystemAccess\n * information.\n *\n * @param {!MediaDecodingConfiguration} requestedConfiguration The requested\n * decoding configuration.\n * @return {!Promise.<!MediaKeySystemAccess>} A Promise to a\n * MediaKeySystemAccess instance.\n * @private\n */\n static async getMediaKeySystemAccess_(requestedConfiguration) {\n const mediaKeySystemConfig =\n McEncryptionSchemePolyfill.convertToMediaKeySystemConfig_(\n requestedConfiguration);\n const keySystemAccess =\n await navigator.requestMediaKeySystemAccess(\n requestedConfiguration.keySystemConfiguration.keySystem,\n [mediaKeySystemConfig]);\n return keySystemAccess;\n }\n\n /**\n * Convert the MediaDecodingConfiguration object to a\n * MediaKeySystemConfiguration object.\n *\n * @param {!MediaDecodingConfiguration} decodingConfig The decoding\n * configuration.\n * @return {!MediaKeySystemConfiguration} The converted MediaKeys\n * configuration.\n */\n static convertToMediaKeySystemConfig_(decodingConfig) {\n const mediaCapKeySystemConfig = decodingConfig.keySystemConfiguration;\n const audioCapabilities = [];\n const videoCapabilities = [];\n\n if (mediaCapKeySystemConfig.audio) {\n const capability = {\n robustness: mediaCapKeySystemConfig.audio.robustness || '',\n contentType: decodingConfig.audio.contentType,\n encryptionScheme: mediaCapKeySystemConfig.audio.encryptionScheme,\n };\n audioCapabilities.push(capability);\n }\n\n if (mediaCapKeySystemConfig.video) {\n const capability = {\n robustness: mediaCapKeySystemConfig.video.robustness || '',\n contentType: decodingConfig.video.contentType,\n encryptionScheme: mediaCapKeySystemConfig.video.encryptionScheme,\n };\n videoCapabilities.push(capability);\n }\n\n const initDataTypes = mediaCapKeySystemConfig.initDataType ?\n [mediaCapKeySystemConfig.initDataType] : [];\n\n /** @type {!MediaKeySystemConfiguration} */\n const mediaKeySystemConfig = {\n initDataTypes: initDataTypes,\n distinctiveIdentifier: mediaCapKeySystemConfig.distinctiveIdentifier,\n persistentState: mediaCapKeySystemConfig.persistentState,\n sessionTypes: mediaCapKeySystemConfig.sessionTypes,\n };\n\n // Only add the audio video capablities if they have valid data.\n // Otherwise the query will fail.\n if (audioCapabilities.length) {\n mediaKeySystemConfig.audioCapabilities = audioCapabilities;\n }\n if (videoCapabilities.length) {\n mediaKeySystemConfig.videoCapabilities = videoCapabilities;\n }\n return mediaKeySystemConfig;\n }\n}\n\n/**\n * A wrapper around MediaKeySystemAccess that adds encryptionScheme\n * fields to the configuration, to emulate what a browser with native support\n * for this field would do.\n *\n * @see https://github.com/w3c/encrypted-media/pull/457\n * @see https://github.com/WICG/encrypted-media-encryption-scheme/issues/13\n * @implements {MediaKeySystemAccess}\n */\nclass EmeEncryptionSchemePolyfillMediaKeySystemAccess {\n /**\n * @param {!MediaKeySystemAccess} mksa A native MediaKeySystemAccess instance\n * to wrap.\n * @param {?string|undefined} videoScheme The encryption scheme to add to the\n * configuration for video.\n * @param {?string|undefined} audioScheme The encryption scheme to add to the\n * configuration for audio.\n */\n constructor(mksa, videoScheme, audioScheme) {\n /**\n * @const {!MediaKeySystemAccess}\n * @private\n */\n this.mksa_ = mksa;\n\n /**\n * @const {?string}\n * @private\n */\n this.videoScheme_ = videoScheme || null;\n\n /**\n * @const {?string}\n * @private\n */\n this.audioScheme_ = audioScheme || null;\n\n /** @const {string} */\n this.keySystem = mksa.keySystem;\n }\n\n /**\n * @override\n * @return {!MediaKeySystemConfiguration} A MediaKeys config with\n * encryptionScheme fields added\n */\n getConfiguration() {\n // A browser which supports the encryptionScheme field would always return\n // that field in the resulting configuration. So here, we emulate that.\n const configuration = this.mksa_.getConfiguration();\n\n if (configuration.videoCapabilities) {\n for (const capability of configuration.videoCapabilities) {\n capability['encryptionScheme'] = this.videoScheme_;\n }\n }\n\n if (configuration.audioCapabilities) {\n for (const capability of configuration.audioCapabilities) {\n capability['encryptionScheme'] = this.audioScheme_;\n }\n }\n\n return configuration;\n }\n\n /**\n * @override\n * @return {!Promise<!MediaKeys>} A passthru of the native MediaKeys object\n */\n createMediaKeys() {\n return this.mksa_.createMediaKeys();\n }\n}\n\n/**\n * Guess the supported encryption scheme for the key system.\n *\n * @param {string} keySystem The key system ID.\n * @return {?string} A guess at the encryption scheme this key system\n * supports.\n */\nfunction guessSupportedScheme(keySystem) {\n if (keySystem.startsWith('com.widevine')) {\n return 'cenc';\n } else if (keySystem.startsWith('com.microsoft')) {\n return 'cenc';\n } else if (keySystem.startsWith('com.chromecast')) {\n return 'cenc';\n } else if (keySystem.startsWith('com.adobe')) {\n return 'cenc';\n } else if (keySystem.startsWith('org.w3')) {\n return 'cenc';\n } else if (keySystem.startsWith('com.apple')) {\n return 'cbcs';\n } else if (keySystem.startsWith('com.huawei')) {\n return 'cenc';\n }\n\n // We don't have this key system in our map!\n\n // Log a warning. The only way the request will succeed now is if the\n // app doesn't specify an encryption scheme in their own configs.\n // Use bracket notation to keep this from being stripped from the build.\n console['warn']('EmeEncryptionSchemePolyfill: Unknown key system:',\n keySystem, 'Please contribute!');\n\n return null;\n}\n\n/**\n * @param {?MediaKeySystemAccess} mediaKeySystemAccess A native\n * MediaKeySystemAccess instance from the browser.\n * @return {boolean} True if browser natively supports encryptionScheme.\n */\nfunction hasEncryptionScheme(mediaKeySystemAccess) {\n const configuration = mediaKeySystemAccess.getConfiguration();\n\n // It doesn't matter which capability we look at. For this check, they\n // should all produce the same result.\n const firstVideoCapability =\n configuration.videoCapabilities && configuration.videoCapabilities[0];\n const firstAudioCapability =\n configuration.audioCapabilities && configuration.audioCapabilities[0];\n const firstCapability = firstVideoCapability || firstAudioCapability;\n\n // If supported by the browser, the encryptionScheme field must appear in\n // the returned configuration, regardless of whether or not it was\n // specified in the supportedConfigurations given by the application.\n if (firstCapability && firstCapability['encryptionScheme'] !== undefined) {\n return true;\n }\n return false;\n}\n\n/**\n * @param {(string|undefined|null)} scheme Encryption scheme to check\n * @param {?string} supportedScheme A guess at the encryption scheme this\n * supports.\n * @return {boolean} True if the scheme is compatible.\n */\nfunction checkSupportedScheme(scheme, supportedScheme) {\n if (!scheme) {\n // Not encrypted = always supported\n return true;\n }\n\n if (scheme == supportedScheme) {\n // The assumed-supported legacy scheme for this platform.\n return true;\n }\n\n if (scheme == 'cbcs' || scheme == 'cbcs-1-9') {\n if (EncryptionSchemePolyfills.isRecentFirefox ||\n EncryptionSchemePolyfills.isRecentWebOS ||\n EncryptionSchemePolyfills.isChromecast) {\n // Firefox >= 100 supports CBCS, but doesn't support queries yet.\n // WebOS >= 6 supports CBCS, but doesn't support queries yet.\n // Older Chromecast devices are assumed to support CBCS as well.\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * The original requestMediaKeySystemAccess, before we patched it.\n *\n * @type {\n * function(this:Navigator,\n * string,\n * !Array.<!MediaKeySystemConfiguration>\n * ):!Promise.<!MediaKeySystemAccess>\n * }\n * @private\n */\nEmeEncryptionSchemePolyfill.originalRMKSA_;\n\n/**\n * The original decodingInfo, before we patched it.\n *\n * @type {\n * function(this:MediaCapabilities,\n * !MediaDecodingConfiguration\n * ):!Promise.<!MediaCapabilitiesDecodingInfo>\n * }\n * @private\n */\nMcEncryptionSchemePolyfill.originalDecodingInfo_;\n\n/**\n * A single entry point for both polyfills (EME & MC).\n *\n * @export\n */\nclass EncryptionSchemePolyfills {\n /**\n * Installs both polyfills (EME & MC).\n *\n * @export\n */\n static install() {\n EmeEncryptionSchemePolyfill.install();\n McEncryptionSchemePolyfill.install();\n }\n}\n\n/**\n * @const {boolean}\n */\nEncryptionSchemePolyfills.isChromecast =\n navigator.userAgent.includes('CrKey');\n\n/**\n * @const {boolean}\n */\nEncryptionSchemePolyfills.isRecentFirefox =\n parseInt(navigator.userAgent.split('Firefox/').pop(), 10) >= 100;\n\n/**\n * @const {boolean}\n */\nEncryptionSchemePolyfills.isRecentWebOS = (() => {\n const userAgent = navigator.userAgent || '';\n const isWebOS = userAgent.includes('Web0S');\n if (!isWebOS) {\n return false;\n }\n const chromeVersionMatch = userAgent.match(/Chrome\\/(\\d+)/);\n if (!chromeVersionMatch) {\n return false;\n }\n const chromeVersion = parseInt(chromeVersionMatch[1], 10);\n return chromeVersion >= 79;\n})();\n\n// Support for CommonJS and AMD module formats.\n/** @suppress {undefinedVars} */\n(() => {\n if (typeof module !== 'undefined' && module.exports) {\n module.exports = EncryptionSchemePolyfills;\n }\n})();\n",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('goog.asserts');\n\n\n/**\n * @summary An assertion framework which is compiled out for deployment.\n * NOTE: this is not the closure library version. This uses the same name so\n * the closure compiler will be able to use the conditions to assist type\n * checking.\n */\ngoog.asserts = class {\n /**\n * @param {*} val\n * @param {string} message\n */\n static assert(val, message) {}\n};\n\n\n/**\n * @define {boolean} true to enable asserts, false otherwise.\n */\ngoog.asserts.ENABLE_ASSERTS = goog.DEBUG;\n\n\n// Install assert functions.\nif (goog.asserts.ENABLE_ASSERTS) {\n if (console.assert && console.assert.bind) {\n // eslint-disable-next-line no-restricted-syntax\n goog.asserts.assert = console.assert.bind(console);\n }\n}\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.abr.Ewma');\n\ngoog.require('goog.asserts');\n\n\n/**\n * @summary\n * This class computes an exponentially-weighted moving average.\n */\nshaka.abr.Ewma = class {\n /**\n * @param {number} halfLife The quantity of prior samples (by weight) used\n * when creating a new estimate. Those prior samples make up half of the\n * new estimate.\n */\n constructor(halfLife) {\n goog.asserts.assert(halfLife > 0, 'expected halfLife to be positive');\n\n /**\n * Larger values of alpha expire historical data more slowly.\n * @private {number}\n */\n this.alpha_ = Math.exp(Math.log(0.5) / halfLife);\n\n /** @private {number} */\n this.estimate_ = 0;\n\n /** @private {number} */\n this.totalWeight_ = 0;\n }\n\n\n /**\n * Update the alpha with a new halfLife value.\n *\n * @param {number} halfLife The quantity of prior samples (by weight) used\n * when creating a new estimate. Those prior samples make up half of the\n * new estimate.\n */\n updateAlpha(halfLife) {\n goog.asserts.assert(halfLife > 0, 'expected halfLife to be positive');\n this.alpha_ = Math.exp(Math.log(0.5) / halfLife);\n }\n\n\n /**\n * Takes a sample.\n *\n * @param {number} weight\n * @param {number} value\n */\n sample(weight, value) {\n const adjAlpha = Math.pow(this.alpha_, weight);\n const newEstimate = value * (1 - adjAlpha) + adjAlpha * this.estimate_;\n\n if (!isNaN(newEstimate)) {\n this.estimate_ = newEstimate;\n this.totalWeight_ += weight;\n }\n }\n\n\n /**\n * @return {number}\n */\n getEstimate() {\n const zeroFactor = 1 - Math.pow(this.alpha_, this.totalWeight_);\n return this.estimate_ / zeroFactor;\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.abr.EwmaBandwidthEstimator');\n\ngoog.require('shaka.abr.Ewma');\n\n\n/**\n * @summary\n * This class tracks bandwidth samples and estimates available bandwidth.\n * Based on the minimum of two exponentially-weighted moving averages with\n * different half-lives.\n *\n */\nshaka.abr.EwmaBandwidthEstimator = class {\n /** */\n constructor() {\n /**\n * A fast-moving average.\n * Half of the estimate is based on the last 2 seconds of sample history.\n * @private {!shaka.abr.Ewma}\n */\n this.fast_ = new shaka.abr.Ewma(2);\n\n /**\n * A slow-moving average.\n * Half of the estimate is based on the last 5 seconds of sample history.\n * @private {!shaka.abr.Ewma}\n */\n this.slow_ = new shaka.abr.Ewma(5);\n\n /**\n * Number of bytes sampled.\n * @private {number}\n */\n this.bytesSampled_ = 0;\n\n\n /**\n * Minimum number of bytes sampled before we trust the estimate. If we have\n * not sampled much data, our estimate may not be accurate enough to trust.\n * If bytesSampled_ is less than minTotalBytes_, we use defaultEstimate_.\n * This specific value is based on experimentation.\n *\n * @private {number}\n */\n this.minTotalBytes_ = 128e3; // 128kB\n\n /**\n * Minimum number of bytes, under which samples are discarded. Our models\n * do not include latency information, so connection startup time (time to\n * first byte) is considered part of the download time. Because of this, we\n * should ignore very small downloads which would cause our estimate to be\n * too low.\n * This specific value is based on experimentation.\n *\n * @private {number}\n */\n this.minBytes_ = 16e3; // 16kB\n }\n\n\n /**\n * Called by the Player to provide an updated configuration any time it\n * changes.\n * Must be called at least once before init().\n *\n * @param {shaka.extern.AdvancedAbrConfiguration} config\n */\n configure(config) {\n this.minTotalBytes_ = config.minTotalBytes;\n this.minBytes_ = config.minBytes;\n this.fast_.updateAlpha(config.fastHalfLife);\n this.slow_.updateAlpha(config.slowHalfLife);\n }\n\n\n /**\n * Takes a bandwidth sample.\n *\n * @param {number} durationMs The amount of time, in milliseconds, for a\n * particular request.\n * @param {number} numBytes The total number of bytes transferred in that\n * request.\n */\n sample(\n durationMs, numBytes) {\n if (numBytes < this.minBytes_) {\n return;\n }\n\n const bandwidth = 8000 * numBytes / durationMs;\n const weight = durationMs / 1000;\n\n this.bytesSampled_ += numBytes;\n this.fast_.sample(weight, bandwidth);\n this.slow_.sample(weight, bandwidth);\n }\n\n\n /**\n * Gets the current bandwidth estimate.\n *\n * @param {number} defaultEstimate\n * @return {number} The bandwidth estimate in bits per second.\n */\n getBandwidthEstimate(defaultEstimate) {\n if (this.bytesSampled_ < this.minTotalBytes_) {\n return defaultEstimate;\n }\n\n // Take the minimum of these two estimates. This should have the effect\n // of adapting down quickly, but up more slowly.\n return Math.min(this.fast_.getEstimate(), this.slow_.getEstimate());\n }\n\n\n /**\n * @return {boolean} True if there is enough data to produce a meaningful\n * estimate.\n */\n hasGoodEstimate() {\n return this.bytesSampled_ >= this.minTotalBytes_;\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.log');\n\ngoog.require('goog.asserts');\n\n/**\n * @summary\n * A console logging framework which is compiled out for deployment. This is\n * only available when using the uncompiled version.\n * @exportDoc\n */\nshaka.log = class {\n /**\n * This always logs to the console, even in Release mode. This should only be\n * used for deprecation messages and things the app should never ignore.\n *\n * @param {...*} args\n */\n static alwaysError(...args) {}\n\n /**\n * This always logs to the console, even in Release mode. This should only be\n * used for deprecation messages and things the app should never ignore.\n *\n * @param {...*} args\n */\n static alwaysWarn(...args) {}\n\n /**\n * This always logs to the console, even in Release mode. This should only be\n * used for deprecation messages and things the app should never ignore.\n *\n * @param {string} id\n * @param {...*} args\n */\n static warnOnce(id, ...args) {\n if (shaka.log.oneTimeWarningIssued_.has(id)) {\n return;\n }\n\n shaka.log.oneTimeWarningIssued_.add(id);\n shaka.log.alwaysWarn(...args);\n }\n\n /**\n * This log is for when an error occurs. This should always be accompanied\n * with an error event, thrown exception, or rejected Promise. Logs are\n * disabled in Release mode, so there should be other methods of detecting the\n * error.\n *\n * @param {...*} args\n */\n static error(...args) {}\n\n /**\n * This log is for possible errors or things that may be surprising to a user.\n * For example, if we work around unusual or bad content, we should warn that\n * they should fix their content. Deprecation messages and messages the app\n * shouldn't ignore should use alwaysWarn instead.\n *\n * @param {...*} args\n */\n static warning(...args) {}\n\n /**\n * This log is for messages to the user about what is happening. For example,\n * when we update a manifest or install a polyfill.\n *\n * @param {...*} args\n */\n static info(...args) {}\n\n /**\n * This log is to aid *users* in debugging their content. This should be for\n * logs about the content and what we do with it. For example, when we change\n * streams or what we are choosing.\n *\n * @param {...*} args\n */\n static debug(...args) {}\n\n /**\n * This log is for debugging Shaka Player itself. This may be logs about\n * internal states or events. This may also be for more verbose logs about\n * content, such as for segment appends.\n *\n * @param {...*} args\n */\n static v1(...args) {}\n\n /**\n * This log is for tracing and debugging Shaka Player. These logs will happen\n * a lot, for example, logging every segment append or every update check.\n * These are mostly used for tracking which calls happen through the code.\n *\n * @param {...*} args\n */\n static v2(...args) {}\n};\n\n\n/**\n * Log levels.\n * @enum {number}\n * @exportDoc\n */\nshaka.log.Level = {\n NONE: 0,\n ERROR: 1,\n WARNING: 2,\n INFO: 3,\n DEBUG: 4,\n V1: 5,\n V2: 6,\n};\n\n\n/**\n * @define {number} the maximum log level.\n */\nshaka.log.MAX_LOG_LEVEL = 3;\n\n\n/**\n * A Set to indicate which one-time warnings have been issued.\n *\n * @private {!Set<string>}\n */\nshaka.log.oneTimeWarningIssued_ = new Set();\n\n\nif (window.console) {\n /** @private {!Map<shaka.log.Level, function(...*)>} */\n shaka.log.logMap_ = new Map()\n .set(shaka.log.Level.ERROR, (...args) => console.error(...args))\n .set(shaka.log.Level.WARNING, (...args) => console.warn(...args))\n .set(shaka.log.Level.INFO, (...args) => console.info(...args))\n .set(shaka.log.Level.DEBUG, (...args) => console.log(...args))\n .set(shaka.log.Level.V1, (...args) => console.debug(...args))\n .set(shaka.log.Level.V2, (...args) => console.debug(...args));\n\n shaka.log.alwaysWarn = (...args) => console.warn(...args);\n shaka.log.alwaysError = (...args) => console.error(...args);\n\n if (goog.DEBUG) {\n // Since we don't want to export shaka.log in production builds, we don't\n // use the @export annotation. But the module wrapper (used in debug builds\n // since v2.5.11) hides anything non-exported. This is a debug-only,\n // API-based export to make sure logging is available in debug builds.\n goog.exportSymbol('shaka.log', shaka.log);\n\n /** @type {number} */\n shaka.log.currentLevel;\n\n /**\n * Change the log level. Useful for debugging in uncompiled mode.\n *\n * @param {number} level\n * @exportDoc\n */\n shaka.log.setLevel = (level) => {\n const getLog = (curLevel) => {\n if (curLevel <= level) {\n goog.asserts.assert(\n shaka.log.logMap_.has(curLevel), 'Unexpected log level');\n return shaka.log.logMap_.get(curLevel);\n } else {\n return () => {};\n }\n };\n\n shaka.log.currentLevel = level;\n shaka.log.error = getLog(shaka.log.Level.ERROR);\n shaka.log.warning = getLog(shaka.log.Level.WARNING);\n shaka.log.info = getLog(shaka.log.Level.INFO);\n shaka.log.debug = getLog(shaka.log.Level.DEBUG);\n shaka.log.v1 = getLog(shaka.log.Level.V1);\n shaka.log.v2 = getLog(shaka.log.Level.V2);\n };\n\n shaka.log.setLevel(shaka.log.MAX_LOG_LEVEL);\n } else {\n if (shaka.log.MAX_LOG_LEVEL >= shaka.log.Level.ERROR) {\n shaka.log.error = shaka.log.logMap_.get(shaka.log.Level.ERROR);\n }\n if (shaka.log.MAX_LOG_LEVEL >= shaka.log.Level.WARNING) {\n shaka.log.warning = shaka.log.logMap_.get(shaka.log.Level.WARNING);\n }\n if (shaka.log.MAX_LOG_LEVEL >= shaka.log.Level.INFO) {\n shaka.log.info = shaka.log.logMap_.get(shaka.log.Level.INFO);\n }\n if (shaka.log.MAX_LOG_LEVEL >= shaka.log.Level.DEBUG) {\n shaka.log.debug = shaka.log.logMap_.get(shaka.log.Level.DEBUG);\n }\n if (shaka.log.MAX_LOG_LEVEL >= shaka.log.Level.V1) {\n shaka.log.v1 = shaka.log.logMap_.get(shaka.log.Level.V1);\n }\n if (shaka.log.MAX_LOG_LEVEL >= shaka.log.Level.V2) {\n shaka.log.v2 = shaka.log.logMap_.get(shaka.log.Level.V2);\n }\n }\n}\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.MultiMap');\n\n\n/**\n * @summary A simple multimap template.\n * @template T\n */\nshaka.util.MultiMap = class {\n /** */\n constructor() {\n /** @private {!Map<string, !Array<T>>} */\n this.map_ = new Map();\n }\n\n\n /**\n * Add a key, value pair to the map.\n * @param {string} key\n * @param {T} value\n */\n push(key, value) {\n if (this.map_.has(key)) {\n this.map_.get(key).push(value);\n } else {\n this.map_.set(key, [value]);\n }\n }\n\n\n /**\n * Get a list of values by key.\n * @param {string} key\n * @return {Array<T>} or null if no such key exists.\n */\n get(key) {\n if (!this.map_.has(key)) {\n return null;\n }\n // slice() clones the list so that it and the map can each be modified\n // without affecting the other.\n return this.map_.get(key).slice();\n }\n\n\n /**\n * Get a list of all values.\n * @return {!Array<T>}\n */\n getAll() {\n const list = [];\n for (const value of this.map_.values()) {\n list.push(...value);\n }\n return list;\n }\n\n\n /**\n * Remove a specific value, if it exists.\n * @param {string} key\n * @param {T} value\n */\n remove(key, value) {\n if (!this.map_.has(key)) {\n return;\n }\n const newValue = this.map_.get(key).filter((i) => i != value);\n this.map_.set(key, newValue);\n if (!newValue.length) {\n // Delete the array if it's empty, so that |get| will reliably return null\n // \"if no such key exists\", instead of sometimes returning an empty array.\n this.map_.delete(key);\n }\n }\n\n\n /**\n * Clear all keys and values from the multimap.\n */\n clear() {\n this.map_.clear();\n }\n\n\n /**\n * @param {function(string, !Array<T>)} callback\n */\n forEach(callback) {\n this.map_.forEach((value, key) => {\n callback(key, value);\n });\n }\n\n /**\n * Returns the number of elements in the multimap.\n * @return {number}\n */\n size() {\n return this.map_.size;\n }\n\n /**\n * Get a list of all the keys.\n * @return {!Array<string>}\n */\n keys() {\n return Array.from(this.map_.keys());\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.EventManager');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.util.IReleasable');\ngoog.require('shaka.util.MultiMap');\n\n\n/**\n * @summary\n * An EventManager maintains a collection of \"event\n * bindings\" between event targets and event listeners.\n *\n * @implements {shaka.util.IReleasable}\n * @export\n */\nshaka.util.EventManager = class {\n /** */\n constructor() {\n /**\n * Maps an event type to an array of event bindings.\n * @private {shaka.util.MultiMap<!shaka.util.EventManager.Binding_>}\n */\n this.bindingMap_ = new shaka.util.MultiMap();\n }\n\n\n /**\n * Detaches all event listeners.\n * @override\n * @export\n */\n release() {\n this.removeAll();\n this.bindingMap_ = null;\n }\n\n\n /**\n * Attaches an event listener to an event target.\n * @param {EventTarget} target The event target.\n * @param {string} type The event type.\n * @param {shaka.util.EventManager.ListenerType} listener The event listener.\n * @param {(boolean|!AddEventListenerOptions)=} options An object that\n * specifies characteristics about the event listener.\n * The passive option, if true, indicates that this function will never\n * call preventDefault(), which improves scrolling performance.\n * @export\n */\n listen(target, type, listener, options) {\n if (!this.bindingMap_) {\n return;\n }\n\n const binding =\n new shaka.util.EventManager.Binding_(target, type, listener, options);\n this.bindingMap_.push(type, binding);\n }\n\n\n /**\n * Attaches an event listener to an event target. The listener will be\n * removed when the first instance of the event is fired.\n * @param {EventTarget} target The event target.\n * @param {string} type The event type.\n * @param {shaka.util.EventManager.ListenerType} listener The event listener.\n * @param {(boolean|!AddEventListenerOptions)=} options An object that\n * specifies characteristics about the event listener.\n * The passive option, if true, indicates that this function will never\n * call preventDefault(), which improves scrolling performance.\n * @export\n */\n listenOnce(target, type, listener, options) {\n // Install a shim listener that will stop listening after the first event.\n const shim = (event) => {\n // Stop listening to this event.\n this.unlisten(target, type, shim);\n // Call the original listener.\n listener(event);\n };\n this.listen(target, type, shim, options);\n }\n\n\n /**\n * Detaches an event listener from an event target.\n * @param {EventTarget} target The event target.\n * @param {string} type The event type.\n * @param {shaka.util.EventManager.ListenerType=} listener The event listener.\n * @export\n */\n unlisten(target, type, listener) {\n if (!this.bindingMap_) {\n return;\n }\n\n const list = this.bindingMap_.get(type) || [];\n\n for (const binding of list) {\n if (binding.target == target) {\n if (listener == binding.listener || !listener) {\n binding.unlisten();\n this.bindingMap_.remove(type, binding);\n }\n }\n }\n }\n\n\n /**\n * Detaches all event listeners from all targets.\n * @export\n */\n removeAll() {\n if (!this.bindingMap_) {\n return;\n }\n\n const list = this.bindingMap_.getAll();\n\n for (const binding of list) {\n binding.unlisten();\n }\n\n this.bindingMap_.clear();\n }\n};\n\n\n/**\n * @typedef {function(!Event)}\n * @export\n */\nshaka.util.EventManager.ListenerType;\n\n\n/**\n * Creates a new Binding_ and attaches the event listener to the event target.\n *\n * @private\n */\nshaka.util.EventManager.Binding_ = class {\n /**\n * @param {EventTarget} target The event target.\n * @param {string} type The event type.\n * @param {shaka.util.EventManager.ListenerType} listener The event listener.\n * @param {(boolean|!AddEventListenerOptions)=} options An object that\n * specifies characteristics about the event listener.\n * The passive option, if true, indicates that this function will never\n * call preventDefault(), which improves scrolling performance.\n */\n constructor(target, type, listener, options) {\n /** @type {EventTarget} */\n this.target = target;\n\n /** @type {string} */\n this.type = type;\n\n /** @type {?shaka.util.EventManager.ListenerType} */\n this.listener = listener;\n\n /** @type {(boolean|!AddEventListenerOptions)} */\n this.options =\n shaka.util.EventManager.Binding_.convertOptions_(target, options);\n\n this.target.addEventListener(type, listener, this.options);\n }\n\n\n /**\n * Detaches the event listener from the event target. This does nothing if\n * the event listener is already detached.\n */\n unlisten() {\n goog.asserts.assert(this.target, 'Missing target');\n this.target.removeEventListener(this.type, this.listener, this.options);\n\n this.target = null;\n this.listener = null;\n this.options = false;\n }\n\n /**\n * Converts the provided options value into a value accepted by the browser.\n * Some browsers (e.g. Tizen) don't support passing options as an\n * object. So this detects this case and converts it.\n *\n * @param {EventTarget} target\n * @param {(boolean|!AddEventListenerOptions)=} value\n * @return {(boolean|!AddEventListenerOptions)}\n * @private\n */\n static convertOptions_(target, value) {\n if (value == undefined) {\n return false;\n } else if (typeof value == 'boolean') {\n return value;\n } else {\n // Ignore the 'passive' option since it is just an optimization and\n // doesn't affect behavior. Assert there aren't any other settings to\n // ensure we don't have different behavior on different browsers by\n // ignoring an important option.\n const ignored = new Set(['passive', 'capture']);\n const keys = Object.keys(value).filter((k) => !ignored.has(k));\n goog.asserts.assert(\n keys.length == 0,\n 'Unsupported flag(s) to addEventListener: ' + keys.join(','));\n\n const supports =\n shaka.util.EventManager.Binding_.doesSupportObject_(target);\n if (supports) {\n return value;\n } else {\n return value['capture'] || false;\n }\n }\n }\n\n /**\n * Checks whether the browser supports passing objects as the third argument\n * to addEventListener. This caches the result value in a static field to\n * avoid a bunch of checks.\n *\n * @param {EventTarget} target\n * @return {boolean}\n * @private\n */\n static doesSupportObject_(target) {\n // https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support\n let supports = shaka.util.EventManager.Binding_.supportsObject_;\n if (supports == undefined) {\n supports = false;\n try {\n const options = {};\n // This defines a getter that will set this variable if called. So if\n // the browser gets this property, it supports using an object. If the\n // browser doesn't get these fields, it won't support objects.\n const prop = {\n get: () => {\n supports = true;\n return false;\n },\n };\n Object.defineProperty(options, 'passive', prop);\n Object.defineProperty(options, 'capture', prop);\n\n const call = () => {};\n target.addEventListener('test', call, options);\n target.removeEventListener('test', call, options);\n } catch (e) {\n supports = false;\n }\n shaka.util.EventManager.Binding_.supportsObject_ = supports;\n }\n return supports || false; // \"false\" fallback needed for compiler.\n }\n};\n\n/** @private {(boolean|undefined)} */\nshaka.util.EventManager.Binding_.supportsObject_ = undefined;\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.deprecate.Version');\n\n/**\n * A class that defines what a library version is within the deprecation\n * system. Within deprecation we only care about the major and minor versions.\n *\n * @final\n */\nshaka.deprecate.Version = class {\n /**\n * @param {number} major\n * @param {number} minor\n */\n constructor(major, minor) {\n this.major_ = major;\n this.minor_ = minor;\n }\n\n /** @return {number} */\n major() { return this.major_; }\n\n /** @return {number} */\n minor() { return this.minor_; }\n\n /**\n * Returns:\n * - positive if |this| > |other|\n * - zero if |this| == |other|\n * - negative if |this| < |other|\n *\n * @param {!shaka.deprecate.Version} other\n * @return {number}\n */\n compareTo(other) {\n const majorCheck = this.major_ - other.major_;\n const minorCheck = this.minor_ - other.minor_;\n\n return majorCheck || minorCheck;\n }\n\n /** @override */\n toString() {\n return 'v' + this.major_ + '.' + this.minor_;\n }\n\n /**\n * Parse the major and minor values out of a version string that is assumed\n * to follow the grammar: \"vMAJOR.MINOR.\". What comes after the last \".\" we\n * will ignore.\n *\n * @param {string} versionString\n * @return {!shaka.deprecate.Version}\n */\n static parse(versionString) {\n // Make sure to drop the \"v\" from the front. We limit the number of splits\n // to two as we don't care what happens after the minor version number.\n // For example: 'a.b.c.d'.split('.', 2) == ['a', 'b']\n const components = versionString.substring(1).split('.', /* limit= */ 2);\n\n return new shaka.deprecate.Version(\n Number(components[0]),\n Number(components[1]));\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.Deprecate');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.deprecate.Enforcer');\ngoog.require('shaka.deprecate.Version');\ngoog.require('shaka.log');\n\n\n/**\n * |shaka.Deprecate| is the front-end of the deprecation system, allowing for\n * any part of the code to say that \"this block of code should be removed by\n * version X\".\n *\n * @final\n */\nshaka.Deprecate = class {\n /**\n * Initialize the system. This must happen before any calls to |enforce|. In\n * our code base, |shaka.Player| will be the only one to call this (it has the\n * version string).\n *\n * If the |Deprecate| called |Player.version| to initialize itself, it would\n * mean that |Player| could not use |Deprecate| because it would create a\n * circular dependency. To work around this, we provide this method so that\n * |Player| can give us the version without us needing to know about |Player|.\n *\n * This will initialize the system to:\n * - print warning messages when the feature is scheduled to be removed in a\n * later version\n * - print errors and fail assertions when the feature should be removed now\n *\n * @param {string} versionString\n */\n static init(versionString) {\n goog.asserts.assert(\n shaka.Deprecate.enforcer_ == null,\n 'Deprecate.init should only be called once.');\n\n shaka.Deprecate.enforcer_ = new shaka.deprecate.Enforcer(\n shaka.deprecate.Version.parse(versionString),\n shaka.Deprecate.onPending_,\n shaka.Deprecate.onExpired_);\n }\n\n /**\n * Ask the deprecation system to require this feature to be removed by the\n * given version.\n *\n * @param {number} major\n * @param {string} name\n * @param {string} description\n */\n static deprecateFeature(major, name, description) {\n const enforcer = shaka.Deprecate.enforcer_;\n goog.asserts.assert(\n enforcer,\n 'Missing deprecation enforcer. Was |init| called?');\n\n const expiresAt = new shaka.deprecate.Version(major, 0);\n enforcer.enforce(expiresAt, name, description);\n }\n\n /**\n * @param {!shaka.deprecate.Version} libraryVersion\n * @param {!shaka.deprecate.Version} featureVersion\n * @param {string} name\n * @param {string} description\n * @private\n */\n static onPending_(libraryVersion, featureVersion, name, description) {\n // If we were to pass each value to the log call, it would be printed as\n // a comma-separated list. To make the print state appear more natural to\n // the reader, create one string for the message.\n shaka.log.alwaysWarn([\n name,\n 'has been deprecated and will be removed in',\n featureVersion,\n '. We are currently at version',\n libraryVersion,\n '. Additional information:',\n description,\n ].join(' '));\n }\n\n /**\n * @param {!shaka.deprecate.Version} libraryVersion\n * @param {!shaka.deprecate.Version} featureVersion\n * @param {string} name\n * @param {string} description\n * @private\n */\n static onExpired_(libraryVersion, featureVersion, name, description) {\n // If we were to pass each value to the log call, it would be printed as\n // a comma-separated list. To make the print state appear more natural to\n // the reader, create one string for the message.\n const errorMessage = [\n name,\n 'has been deprecated and has been removed in',\n featureVersion,\n '. We are now at version',\n libraryVersion,\n '. Additional information:',\n description,\n ].join(' ');\n\n shaka.log.alwaysError(errorMessage);\n goog.asserts.assert(false, errorMessage);\n }\n};\n\n/**\n * The global deprecation enforcer that will be set by the player (because the\n * player knows the version) when it calls |init|. This may appear a little\n * round-about to you, because it is. Since player uses |Deprecate|, it means\n * that |Deprecate| can't depend on Player directly.\n *\n * @private {shaka.deprecate.Enforcer}\n */\nshaka.Deprecate.enforcer_ = null;\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.lcevc.Dec');\ngoog.require('shaka.log');\ngoog.require('shaka.Deprecate');\ngoog.require('shaka.util.IReleasable');\ngoog.require('shaka.util.ManifestParserUtils');\n\n/**\n * @summary\n * lcevcDec - (MPEG-5 Part 2 LCEVC - Decoder) provides\n * all the operations related to the enhancement and rendering\n * of LCEVC enabled streams and on to a canvas.\n * @implements {shaka.util.IReleasable}\n * @export\n */\nshaka.lcevc.Dec = class {\n /**\n * @param {HTMLVideoElement} media The video element that will be attached to\n * LCEVC Decoder for input.\n * @param {HTMLCanvasElement} canvas The canvas element that will be attached\n * to LCEVC Decoder to render the enhanced frames.\n * @param {shaka.extern.LcevcConfiguration} lcevcConfig LCEVC configuration\n * object to initialize the LCEVC Decoder.\n * @param {boolean} isDualTrack\n */\n constructor(media, canvas, lcevcConfig, isDualTrack) {\n /**\n * LCEVC Decoder library based on availability, to check if either\n * lcevc_dil or lcevc_dec is present.\n * @private {LCEVCmodule}\n */\n this.lcevcLib_;\n\n /** @private {?LCEVCdec.LCEVCdec} */\n this.dec_ = null;\n\n /** @private {HTMLVideoElement} */\n this.media_ = media;\n\n /** @private {HTMLCanvasElement} */\n this.canvas_ = canvas;\n\n /** @private {shaka.extern.LcevcConfiguration} */\n this.decConfig_ = lcevcConfig;\n\n /** @private {boolean} */\n this.isDualTrack_ = isDualTrack;\n\n /** @private {boolean} */\n this.toBeDeprecated_ = false;\n\n this.create_();\n }\n\n /**\n * Append data to the LCEVC Dec.\n * @param {BufferSource} data\n * @param {number} timestampOffset\n * @param {shaka.extern.Stream} stream\n */\n appendBuffer(data, timestampOffset, stream) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n // LCEVC only supports VIDEO.\n if (stream.type !== ContentType.VIDEO ||\n (this.isDualTrack_ && !stream.baseOriginalId)) {\n return;\n }\n if (this.dec_) {\n // Timestamp offset describes how much offset should be applied to the\n // LCEVC enhancement to match the decoded video frame, as such it needs\n // to be negated.\n this.dec_.appendBuffer(data, 'video', stream.id, -timestampOffset,\n !this.isDualTrack_);\n }\n }\n\n /**\n * Hide the canvas specifically in the case of a DRM Content\n */\n hideCanvas() {\n if (this.dec_) {\n this.canvas_.classList.add('shaka-hidden');\n }\n }\n\n /**\n * Create LCEVC Decoder.\n * @private\n */\n create_() {\n if (this.isSupported_() && !this.dec_) {\n if (this.lcevcLib_.SupportObject.webGLSupport(this.canvas_)) {\n // Make sure the canvas is not hidden from a previous playback session.\n this.canvas_.classList.remove('shaka-hidden');\n // Initiate LCEVC Dec Library based on the type of module available.\n if (this.toBeDeprecated_) {\n this.dec_ = new this.lcevcLib_.LcevcDil(\n this.media_,\n this.canvas_,\n this.decConfig_);\n } else {\n this.dec_ = new this.lcevcLib_.LCEVCdec(\n this.media_,\n this.canvas_,\n this.decConfig_);\n }\n }\n }\n }\n\n /**\n * Close LCEVC Decoder.\n * @override\n * @export\n */\n release() {\n if (this.dec_) {\n this.dec_.close();\n this.dec_ = null;\n }\n }\n\n /**\n * Check if the LCEVC Decoder lib is present and is supported by the browser.\n * @return {boolean}\n * @private\n */\n isSupported_() {\n if (typeof libDPIModule === 'undefined') {\n shaka.log.alwaysWarn(\n 'Could not find LCEVC Library dependencies on this page');\n }\n\n // This is a check to make the LCEVC Dec Integration is backwards compatible\n // with previous Integration. This logic checks for both implementations\n // and uses the one available.\n if (typeof LCEVCdec !== 'undefined') {\n this.lcevcLib_ = LCEVCdec;\n } else {\n if (typeof LcevcDil !== 'undefined') {\n this.lcevcLib_ = LcevcDil;\n this.toBeDeprecated_ = true;\n shaka.Deprecate.deprecateFeature(5,\n 'LcevcDil',\n 'lcevc_dil.js is deprecated, please use lcevc_dec.js instead');\n } else {\n shaka.log.alwaysWarn('Could not find LCEVC Library on this page');\n return false;\n }\n }\n\n // Making Sure if there is a valid LCEVC Dec Library exists.\n if (typeof this.lcevcLib_.SupportObject === 'undefined') {\n shaka.log.alwaysWarn('Could not find LCEVC Library on this page');\n return false;\n } else {\n if (!this.lcevcLib_.SupportObject.SupportStatus) {\n shaka.log.alwaysWarn(this.lcevcLib_.SupportObject.SupportError);\n }\n }\n\n return typeof this.lcevcLib_ !== 'undefined' &&\n typeof libDPIModule !== 'undefined' &&\n this.canvas_ instanceof HTMLCanvasElement &&\n this.lcevcLib_.SupportObject.SupportStatus;\n }\n\n /**\n * Update current active variant\n * @param {shaka.extern.Variant} variant\n * @param {?string} manifestType\n */\n updateVariant(variant, manifestType) {\n let stream = variant.video;\n if (!stream) {\n return;\n }\n if (stream.dependencyStream) {\n stream = stream.dependencyStream;\n }\n let containerFormat = shaka.lcevc.Dec.ContainerFormat.MPEG2_TS;\n let streamingFormat = shaka.lcevc.Dec.StreamingFormat.OTHER;\n switch (stream.mimeType) {\n case 'video/webm': {\n containerFormat = shaka.lcevc.Dec.ContainerFormat.WEBM;\n break;\n }\n case 'video/mp4': {\n containerFormat = shaka.lcevc.Dec.ContainerFormat.MP4;\n break;\n }\n }\n switch (manifestType) {\n case 'DASH': {\n streamingFormat = shaka.lcevc.Dec.StreamingFormat.DASH;\n break;\n }\n case 'HLS': {\n streamingFormat = shaka.lcevc.Dec.StreamingFormat.HLS;\n break;\n }\n }\n if (this.dec_) {\n this.dec_.setLevelSwitching(stream.id, true);\n this.dec_.setContainerFormat(containerFormat);\n // This functionality is only available on the LCEVC Dec Library.\n if (!this.toBeDeprecated_) {\n this.dec_.setStreamingFormat(streamingFormat);\n }\n }\n }\n\n /**\n * Checks if a dual track content enhancement stream is supported.\n *\n * @param {shaka.extern.Stream} stream\n * @return {boolean}\n */\n static isStreamSupported(stream) {\n if (!stream || typeof LCEVCdec === 'undefined') {\n return false;\n }\n return stream.codecs == 'lvc1';\n }\n};\n\n/**\n * Container Formats.\n * @const @enum {number}\n */\nshaka.lcevc.Dec.ContainerFormat = {\n MPEG2_TS: 0,\n WEBM: 1,\n MP4: 2,\n};\n\n/**\n * Streaming Formats.\n * @const @enum {number}\n */\nshaka.lcevc.Dec.StreamingFormat = {\n HLS: 0,\n DASH: 1,\n OTHER: -1,\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.deprecate.Enforcer');\n\ngoog.require('shaka.deprecate.Version');\n\n\n/**\n * The enforcer's job is to call the correct callback when a feature will need\n * to be removed later or removed now.\n *\n * The \"what should be done\" is not part of the enforcer, that must be provided\n * to the enforcer when it is created. This separation was created so that\n * testing and production could be equal users of the enforcer.\n *\n * @final\n */\nshaka.deprecate.Enforcer = class {\n /**\n * @param {!shaka.deprecate.Version} libraryVersion\n * @param {shaka.deprecate.Listener} onPending\n * @param {shaka.deprecate.Listener} onExpired\n */\n constructor(libraryVersion, onPending, onExpired) {\n /** @private {!shaka.deprecate.Version} */\n this.libraryVersion_ = libraryVersion;\n\n /** @private {shaka.deprecate.Listener} */\n this.onPending_ = onPending;\n /** @private {shaka.deprecate.Listener} */\n this.onExpired_ = onExpired;\n }\n\n /**\n * Tell the enforcer that a feature will expire on |expiredOn| and that it\n * should notify the listeners if it is pending or expired.\n *\n * @param {!shaka.deprecate.Version} expiresOn\n * @param {string} name\n * @param {string} description\n */\n enforce(expiresOn, name, description) {\n // If the expiration version is larger than the library version\n // (compareTo > 0), it means the expiration is in the future, and is still\n // pending.\n const isPending = expiresOn.compareTo(this.libraryVersion_) > 0;\n\n // Find the right callback (pending or expired) for this enforcement request\n // call it to handle this features pending/expired removal.\n const callback = isPending ? this.onPending_ : this.onExpired_;\n callback(this.libraryVersion_, expiresOn, name, description);\n }\n};\n\n/**\n * A callback for listening to deprecation events.\n *\n * Parameters:\n * libraryVersion: !shaka.deprecate.Version\n * featureVersion: !shaka.deprecate.Version\n * name: string\n * description: string\n *\n * libraryVersion: The current version of the library.\n * featureVersion: The version of the library when the feature should be\n * removed.\n * name: The name of the feature that will/should be removed.\n * description: A description of what is changing.\n *\n * @typedef {function(\n * !shaka.deprecate.Version,\n * !shaka.deprecate.Version,\n * string,\n * string)}\n */\nshaka.deprecate.Listener;\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.config.AutoShowText');\n\n/**\n * @enum {number}\n * @export\n */\nshaka.config.AutoShowText = {\n /** Never show text automatically on startup. */\n 'NEVER': 0,\n /** Always show text automatically on startup. */\n 'ALWAYS': 1,\n /**\n * Show text automatically on startup if it matches the preferred text\n * language.\n */\n 'IF_PREFERRED_TEXT_LANGUAGE': 2,\n /**\n * Show text automatically on startup if we think that subtitles may be\n * needed. This is specifically if the selected text matches the preferred\n * text language AND is different from the initial audio language. (Example:\n * You prefer English, but the audio is only available in French, so English\n * subtitles should be enabled by default.)\n * <br>\n * This is the default setting.\n */\n 'IF_SUBTITLES_MAY_BE_NEEDED': 3,\n};\n","/*! @license\n * Copyright 2008 The Closure Library Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Simple utilities for splitting URI strings.\n *\n * Uses features of RFC 3986 for parsing/formatting URIs:\n * http://www.ietf.org/rfc/rfc3986.txt\n *\n * @author gboyer@google.com (Garrett Boyer) - The \"lightened\" design.\n * @author msamuel@google.com (Mike Samuel) - Domain knowledge and regexes.\n */\n\ngoog.provide('goog.uri.utils');\ngoog.provide('goog.uri.utils.ComponentIndex');\n\n\n/**\n * A regular expression for breaking a URI into its component parts.\n *\n * {@link http://www.ietf.org/rfc/rfc3986.txt} says in Appendix B\n * As the \"first-match-wins\" algorithm is identical to the \"greedy\"\n * disambiguation method used by POSIX regular expressions, it is natural and\n * commonplace to use a regular expression for parsing the potential five\n * components of a URI reference.\n *\n * The following line is the regular expression for breaking-down a\n * well-formed URI reference into its components.\n *\n * <pre>\n * ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?\n * 12 3 4 5 6 7 8 9\n * </pre>\n *\n * The numbers in the second line above are only to assist readability; they\n * indicate the reference points for each subexpression (i.e., each paired\n * parenthesis). We refer to the value matched for subexpression <n> as $<n>.\n * For example, matching the above expression to\n * <pre>\n * http://www.ics.uci.edu/pub/ietf/uri/#Related\n * </pre>\n * results in the following subexpression matches:\n * <pre>\n * $1 = http:\n * $2 = http\n * $3 = //www.ics.uci.edu\n * $4 = www.ics.uci.edu\n * $5 = /pub/ietf/uri/\n * $6 = <undefined>\n * $7 = <undefined>\n * $8 = #Related\n * $9 = Related\n * </pre>\n * where <undefined> indicates that the component is not present, as is the\n * case for the query component in the above example. Therefore, we can\n * determine the value of the five components as\n * <pre>\n * scheme = $2\n * authority = $4\n * path = $5\n * query = $7\n * fragment = $9\n * </pre>\n *\n * The regular expression has been modified slightly to expose the\n * userInfo, domain, and port separately from the authority.\n * The modified version yields\n * <pre>\n * $1 = http scheme\n * $2 = <undefined> userInfo -\\\n * $3 = www.ics.uci.edu domain | authority\n * $4 = <undefined> port -/\n * $5 = /pub/ietf/uri/ path\n * $6 = <undefined> query without ?\n * $7 = Related fragment without #\n * </pre>\n * @type {!RegExp}\n * @private\n */\ngoog.uri.utils.splitRe_ = new RegExp(\n '^' +\n '(?:' +\n '([^:/?#.]+)' + // scheme - ignore special characters\n // used by other URL parts such as :,\n // ?, /, #, and .\n ':)?' +\n '(?://' +\n '(?:([^/?#]*)@)?' + // userInfo\n '([^/#?]*?)' + // domain\n '(?::([0-9]+))?' + // port\n '(?=[/#?]|$)' + // authority-terminating character\n ')?' +\n '([^?#]+)?' + // path\n '(?:\\\\?([^#]*))?' + // query\n '(?:#(.*))?' + // fragment\n '$');\n\n\n/**\n * The index of each URI component in the return value of goog.uri.utils.split.\n * @enum {number}\n */\ngoog.uri.utils.ComponentIndex = {\n SCHEME: 1,\n USER_INFO: 2,\n DOMAIN: 3,\n PORT: 4,\n PATH: 5,\n QUERY_DATA: 6,\n FRAGMENT: 7\n};\n\n\n/**\n * Splits a URI into its component parts.\n *\n * Each component can be accessed via the component indices; for example:\n * <pre>\n * goog.uri.utils.split(someStr)[goog.uri.utils.CompontentIndex.QUERY_DATA];\n * </pre>\n *\n * @param {string} uri The URI string to examine.\n * @return {!Array<string|undefined>} Each component still URI-encoded.\n * Each component that is present will contain the encoded value, whereas\n * components that are not present will be undefined or empty, depending\n * on the browser's regular expression implementation. Never null, since\n * arbitrary strings may still look like path names.\n */\ngoog.uri.utils.split = function(uri) {\n // See @return comment -- never null.\n return /** @type {!Array<string|undefined>} */ (\n uri.match(goog.uri.utils.splitRe_));\n};\n","/*! @license\n * Copyright 2006 The Closure Library Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Class for parsing and formatting URIs.\n *\n * Use new goog.Uri(string) to parse a URI string.\n *\n * e.g.: <code>var myUri = new goog.Uri(window.location);</code>\n *\n * Implements RFC 3986 for parsing/formatting URIs.\n * http://www.ietf.org/rfc/rfc3986.txt\n *\n * Some changes have been made to the interface (more like .NETs), though the\n * internal representation is now of un-encoded parts, this will change the\n * behavior slightly.\n *\n */\n\ngoog.provide('goog.Uri');\ngoog.provide('goog.Uri.QueryData');\n\ngoog.require('goog.asserts');\ngoog.require('goog.uri.utils');\ngoog.require('goog.uri.utils.ComponentIndex');\n\n\n\n/**\n * This class contains setters and getters for the parts of the URI.\n * The <code>getXyz</code>/<code>setXyz</code> methods return the decoded part\n * -- so<code>new goog.Uri('/foo%20bar').getPath()</code> will return the\n * decoded path, <code>/foo bar</code>.\n *\n * Reserved characters (see RFC 3986 section 2.2) can be present in\n * their percent-encoded form in scheme, domain, and path URI components and\n * will not be auto-decoded. For example:\n * <code>new goog.Uri('rel%61tive/path%2fto/resource').getPath()</code> will\n * return <code>relative/path%2fto/resource</code>.\n *\n * The constructor accepts an optional unparsed, raw URI string. The parser\n * is relaxed, so special characters that aren't escaped but don't cause\n * ambiguities will not cause parse failures.\n *\n * All setters return <code>this</code> and so may be chained, a la\n * <code>new goog.Uri('/foo').setFragment('part').toString()</code>.\n *\n * @param {*=} uri Optional string URI to parse, or if a goog.Uri is\n * passed, a clone is created.\n *\n * @constructor\n */\ngoog.Uri = function(uri) {\n // Parse in the uri string\n var m;\n if (uri instanceof goog.Uri) {\n this.setScheme(uri.getScheme());\n this.setUserInfo(uri.getUserInfo());\n this.setDomain(uri.getDomain());\n this.setPort(uri.getPort());\n this.setPath(uri.getPath());\n this.setQueryData(uri.getQueryData().clone());\n this.setFragment(uri.getFragment());\n } else if (uri && (m = goog.uri.utils.split(String(uri)))) {\n // Set the parts -- decoding as we do so.\n // COMPATABILITY NOTE - In IE, unmatched fields may be empty strings,\n // whereas in other browsers they will be undefined.\n this.setScheme(m[goog.uri.utils.ComponentIndex.SCHEME] || '', true);\n this.setUserInfo(m[goog.uri.utils.ComponentIndex.USER_INFO] || '', true);\n this.setDomain(m[goog.uri.utils.ComponentIndex.DOMAIN] || '', true);\n this.setPort(m[goog.uri.utils.ComponentIndex.PORT]);\n this.setPath(m[goog.uri.utils.ComponentIndex.PATH] || '', true);\n this.setQueryData(m[goog.uri.utils.ComponentIndex.QUERY_DATA] || '', true);\n this.setFragment(m[goog.uri.utils.ComponentIndex.FRAGMENT] || '', true);\n } else {\n this.queryData_ = new goog.Uri.QueryData(null, null);\n }\n};\n\n\n/**\n * Scheme such as \"http\".\n * @type {string}\n * @private\n */\ngoog.Uri.prototype.scheme_ = '';\n\n\n/**\n * User credentials in the form \"username:password\".\n * @type {string}\n * @private\n */\ngoog.Uri.prototype.userInfo_ = '';\n\n\n/**\n * Domain part, e.g. \"www.google.com\".\n * @type {string}\n * @private\n */\ngoog.Uri.prototype.domain_ = '';\n\n\n/**\n * Port, e.g. 8080.\n * @type {?number}\n * @private\n */\ngoog.Uri.prototype.port_ = null;\n\n\n/**\n * Path, e.g. \"/tests/img.png\".\n * @type {string}\n * @private\n */\ngoog.Uri.prototype.path_ = '';\n\n\n/**\n * Object representing query data.\n * @type {!goog.Uri.QueryData}\n * @private\n */\ngoog.Uri.prototype.queryData_;\n\n\n/**\n * The fragment without the #.\n * @type {string}\n * @private\n */\ngoog.Uri.prototype.fragment_ = '';\n\n\n/**\n * @return {string} The string form of the url.\n * @override\n */\ngoog.Uri.prototype.toString = function() {\n var out = [];\n\n var scheme = this.getScheme();\n if (scheme) {\n out.push(goog.Uri.encodeSpecialChars_(\n scheme, goog.Uri.reDisallowedInSchemeOrUserInfo_, true), ':');\n }\n\n var domain = this.getDomain();\n if (domain) {\n out.push('//');\n\n var userInfo = this.getUserInfo();\n if (userInfo) {\n out.push(goog.Uri.encodeSpecialChars_(\n userInfo, goog.Uri.reDisallowedInSchemeOrUserInfo_, true), '@');\n }\n\n out.push(goog.Uri.removeDoubleEncoding_(encodeURIComponent(domain)));\n\n var port = this.getPort();\n if (port != null) {\n out.push(':', String(port));\n }\n }\n\n var path = this.getPath();\n if (path) {\n if (this.hasDomain() && path.charAt(0) != '/') {\n out.push('/');\n }\n out.push(goog.Uri.encodeSpecialChars_(\n path,\n path.charAt(0) == '/' ?\n goog.Uri.reDisallowedInAbsolutePath_ :\n goog.Uri.reDisallowedInRelativePath_,\n true));\n }\n\n var query = this.getEncodedQuery();\n if (query) {\n out.push('?', query);\n }\n\n var fragment = this.getFragment();\n if (fragment) {\n out.push('#', goog.Uri.encodeSpecialChars_(\n fragment, goog.Uri.reDisallowedInFragment_));\n }\n return out.join('');\n};\n\n\n/**\n * Resolves the given relative URI (a goog.Uri object), using the URI\n * represented by this instance as the base URI.\n *\n * There are several kinds of relative URIs:<br>\n * 1. foo - replaces the last part of the path, the whole query and fragment<br>\n * 2. /foo - replaces the the path, the query and fragment<br>\n * 3. //foo - replaces everything from the domain on. foo is a domain name<br>\n * 4. ?foo - replace the query and fragment<br>\n * 5. #foo - replace the fragment only\n *\n * Additionally, if relative URI has a non-empty path, all \"..\" and \".\"\n * segments will be resolved, as described in RFC 3986.\n *\n * @param {goog.Uri} relativeUri The relative URI to resolve.\n * @return {!goog.Uri} The resolved URI.\n */\ngoog.Uri.prototype.resolve = function(relativeUri) {\n\n var absoluteUri = this.clone();\n if (absoluteUri.scheme_ === 'data') {\n // Cannot have a relative URI to a data URI.\n absoluteUri = new goog.Uri();\n }\n\n // we satisfy these conditions by looking for the first part of relativeUri\n // that is not blank and applying defaults to the rest\n\n var overridden = relativeUri.hasScheme();\n\n if (overridden) {\n absoluteUri.setScheme(relativeUri.getScheme());\n } else {\n overridden = relativeUri.hasUserInfo();\n }\n\n if (overridden) {\n absoluteUri.setUserInfo(relativeUri.getUserInfo());\n } else {\n overridden = relativeUri.hasDomain();\n }\n\n if (overridden) {\n absoluteUri.setDomain(relativeUri.getDomain());\n } else {\n overridden = relativeUri.hasPort();\n }\n\n var path = relativeUri.getPath();\n if (overridden) {\n absoluteUri.setPort(relativeUri.getPort());\n } else {\n overridden = relativeUri.hasPath();\n if (overridden) {\n // resolve path properly\n if (path.charAt(0) != '/') {\n // path is relative\n if (this.hasDomain() && !this.hasPath()) {\n // RFC 3986, section 5.2.3, case 1\n path = '/' + path;\n } else {\n // RFC 3986, section 5.2.3, case 2\n var lastSlashIndex = absoluteUri.getPath().lastIndexOf('/');\n if (lastSlashIndex != -1) {\n path = absoluteUri.getPath().substr(0, lastSlashIndex + 1) + path;\n }\n }\n }\n path = goog.Uri.removeDotSegments(path);\n }\n }\n\n if (overridden) {\n absoluteUri.setPath(path);\n } else {\n overridden = relativeUri.hasQuery();\n }\n\n if (overridden) {\n absoluteUri.setQueryData(relativeUri.getQueryData().clone());\n } else {\n overridden = relativeUri.hasFragment();\n }\n\n if (overridden) {\n absoluteUri.setFragment(relativeUri.getFragment());\n }\n\n return absoluteUri;\n};\n\n\n/**\n * Clones the URI instance.\n * @return {!goog.Uri} New instance of the URI object.\n */\ngoog.Uri.prototype.clone = function() {\n return new goog.Uri(this);\n};\n\n\n/**\n * @return {string} The encoded scheme/protocol for the URI.\n */\ngoog.Uri.prototype.getScheme = function() {\n return this.scheme_;\n};\n\n\n/**\n * Sets the scheme/protocol.\n * @param {string} newScheme New scheme value.\n * @param {boolean=} decode Optional param for whether to decode new value.\n * @return {!goog.Uri} Reference to this URI object.\n */\ngoog.Uri.prototype.setScheme = function(newScheme, decode) {\n this.scheme_ = decode ? goog.Uri.decodeOrEmpty_(newScheme, true) :\n newScheme;\n\n // remove an : at the end of the scheme so somebody can pass in\n // window.location.protocol\n if (this.scheme_) {\n this.scheme_ = this.scheme_.replace(/:$/, '');\n }\n return this;\n};\n\n\n/**\n * @return {boolean} Whether the scheme has been set.\n */\ngoog.Uri.prototype.hasScheme = function() {\n return !!this.scheme_;\n};\n\n\n/**\n * @return {string} The decoded user info.\n */\ngoog.Uri.prototype.getUserInfo = function() {\n return this.userInfo_;\n};\n\n\n/**\n * Sets the userInfo.\n * @param {string} newUserInfo New userInfo value.\n * @param {boolean=} decode Optional param for whether to decode new value.\n * @return {!goog.Uri} Reference to this URI object.\n */\ngoog.Uri.prototype.setUserInfo = function(newUserInfo, decode) {\n this.userInfo_ = decode ? goog.Uri.decodeOrEmpty_(newUserInfo) :\n newUserInfo;\n return this;\n};\n\n\n/**\n * @return {boolean} Whether the user info has been set.\n */\ngoog.Uri.prototype.hasUserInfo = function() {\n return !!this.userInfo_;\n};\n\n\n/**\n * @return {string} The decoded domain.\n */\ngoog.Uri.prototype.getDomain = function() {\n return this.domain_;\n};\n\n\n/**\n * Sets the domain.\n * @param {string} newDomain New domain value.\n * @param {boolean=} decode Optional param for whether to decode new value.\n * @return {!goog.Uri} Reference to this URI object.\n */\ngoog.Uri.prototype.setDomain = function(newDomain, decode) {\n this.domain_ = decode ? goog.Uri.decodeOrEmpty_(newDomain, true) :\n newDomain;\n return this;\n};\n\n\n/**\n * @return {boolean} Whether the domain has been set.\n */\ngoog.Uri.prototype.hasDomain = function() {\n return !!this.domain_;\n};\n\n\n/**\n * @return {?number} The port number.\n */\ngoog.Uri.prototype.getPort = function() {\n return this.port_;\n};\n\n\n/**\n * Sets the port number.\n * @param {*} newPort Port number. Will be explicitly casted to a number.\n * @return {!goog.Uri} Reference to this URI object.\n */\ngoog.Uri.prototype.setPort = function(newPort) {\n if (newPort) {\n newPort = Number(newPort);\n if (isNaN(newPort) || newPort < 0) {\n throw Error('Bad port number ' + newPort);\n }\n this.port_ = newPort;\n } else {\n this.port_ = null;\n }\n\n return this;\n};\n\n\n/**\n * @return {boolean} Whether the port has been set.\n */\ngoog.Uri.prototype.hasPort = function() {\n return this.port_ != null;\n};\n\n\n/**\n * @return {string} The decoded path.\n */\ngoog.Uri.prototype.getPath = function() {\n return this.path_;\n};\n\n\n/**\n * Sets the path.\n * @param {string} newPath New path value.\n * @param {boolean=} decode Optional param for whether to decode new value.\n * @return {!goog.Uri} Reference to this URI object.\n */\ngoog.Uri.prototype.setPath = function(newPath, decode) {\n this.path_ = decode ? goog.Uri.decodeOrEmpty_(newPath, true) : newPath;\n return this;\n};\n\n\n/**\n * @return {boolean} Whether the path has been set.\n */\ngoog.Uri.prototype.hasPath = function() {\n return !!this.path_;\n};\n\n\n/**\n * @return {boolean} Whether the query string has been set.\n */\ngoog.Uri.prototype.hasQuery = function() {\n return this.queryData_.toString() !== '';\n};\n\n\n/**\n * Sets the query data.\n * @param {goog.Uri.QueryData|string|undefined} queryData QueryData object.\n * @param {boolean=} decode Optional param for whether to decode new value.\n * Applies only if queryData is a string.\n * @return {!goog.Uri} Reference to this URI object.\n */\ngoog.Uri.prototype.setQueryData = function(queryData, decode) {\n if (queryData instanceof goog.Uri.QueryData) {\n this.queryData_ = queryData;\n } else {\n if (!decode) {\n // QueryData accepts encoded query string, so encode it if\n // decode flag is not true.\n queryData = goog.Uri.encodeSpecialChars_(queryData,\n goog.Uri.reDisallowedInQuery_);\n }\n this.queryData_ = new goog.Uri.QueryData(queryData, null);\n }\n\n return this;\n};\n\n\n/**\n * @return {string} The encoded URI query, not including the ?.\n */\ngoog.Uri.prototype.getEncodedQuery = function() {\n return this.queryData_.toString();\n};\n\n\n/**\n * @return {string} The decoded URI query, not including the ?.\n */\ngoog.Uri.prototype.getDecodedQuery = function() {\n return this.queryData_.toDecodedString();\n};\n\n\n/**\n * Returns the query data.\n * @return {!goog.Uri.QueryData} QueryData object.\n */\ngoog.Uri.prototype.getQueryData = function() {\n return this.queryData_;\n};\n\n\n/**\n * @return {string} The URI fragment, not including the #.\n */\ngoog.Uri.prototype.getFragment = function() {\n return this.fragment_;\n};\n\n\n/**\n * Sets the URI fragment.\n * @param {string} newFragment New fragment value.\n * @param {boolean=} decode Optional param for whether to decode new value.\n * @return {!goog.Uri} Reference to this URI object.\n */\ngoog.Uri.prototype.setFragment = function(newFragment, decode) {\n this.fragment_ = decode ? goog.Uri.decodeOrEmpty_(newFragment) :\n newFragment;\n return this;\n};\n\n\n/**\n * @return {boolean} Whether the URI has a fragment set.\n */\ngoog.Uri.prototype.hasFragment = function() {\n return !!this.fragment_;\n};\n\n\n//==============================================================================\n// Static members\n//==============================================================================\n\n\n/**\n * Removes dot segments in given path component, as described in\n * RFC 3986, section 5.2.4.\n *\n * @param {string} path A non-empty path component.\n * @return {string} Path component with removed dot segments.\n */\ngoog.Uri.removeDotSegments = function(path) {\n if (path == '..' || path == '.') {\n return '';\n\n } else if (path.indexOf('./') == -1 &&\n path.indexOf('/.') == -1) {\n // This optimization detects uris which do not contain dot-segments,\n // and as a consequence do not require any processing.\n return path;\n\n } else {\n var leadingSlash = (path.lastIndexOf('/', 0) == 0);\n var segments = path.split('/');\n var out = [];\n\n for (var pos = 0; pos < segments.length; ) {\n var segment = segments[pos++];\n\n if (segment == '.') {\n if (leadingSlash && pos == segments.length) {\n out.push('');\n }\n } else if (segment == '..') {\n if (out.length > 1 || out.length == 1 && out[0] != '') {\n out.pop();\n }\n if (leadingSlash && pos == segments.length) {\n out.push('');\n }\n } else {\n out.push(segment);\n leadingSlash = true;\n }\n }\n\n return out.join('/');\n }\n};\n\n\n/**\n * Decodes a value or returns the empty string if it isn't defined or empty.\n * @param {string|undefined} val Value to decode.\n * @param {boolean=} preserveReserved If true, restricted characters will\n * not be decoded.\n * @return {string} Decoded value.\n * @private\n */\ngoog.Uri.decodeOrEmpty_ = function(val, preserveReserved) {\n // Don't use UrlDecode() here because val is not a query parameter.\n if (!val) {\n return '';\n }\n\n return preserveReserved ? decodeURI(val) : decodeURIComponent(val);\n};\n\n\n/**\n * If unescapedPart is non null, then escapes any characters in it that aren't\n * valid characters in a url and also escapes any special characters that\n * appear in extra.\n *\n * @param {(?string|undefined)} unescapedPart The string to encode.\n * @param {RegExp} extra A character set of characters in [\\01-\\177].\n * @param {boolean=} removeDoubleEncoding If true, remove double percent\n * encoding.\n * @return {?string} null iff unescapedPart == null.\n * @private\n */\ngoog.Uri.encodeSpecialChars_ = function(unescapedPart, extra,\n removeDoubleEncoding) {\n if (unescapedPart != null) {\n var encoded = encodeURI(unescapedPart).\n replace(extra, goog.Uri.encodeChar_);\n if (removeDoubleEncoding) {\n // encodeURI double-escapes %XX sequences used to represent restricted\n // characters in some URI components, remove the double escaping here.\n encoded = goog.Uri.removeDoubleEncoding_(encoded);\n }\n return encoded;\n }\n return null;\n};\n\n\n/**\n * Converts a character in [\\01-\\177] to its unicode character equivalent.\n * @param {string} ch One character string.\n * @return {string} Encoded string.\n * @private\n */\ngoog.Uri.encodeChar_ = function(ch) {\n var n = ch.charCodeAt(0);\n return '%' + ((n >> 4) & 0xf).toString(16) + (n & 0xf).toString(16);\n};\n\n\n/**\n * Removes double percent-encoding from a string.\n * @param {string} doubleEncodedString String\n * @return {string} String with double encoding removed.\n * @private\n */\ngoog.Uri.removeDoubleEncoding_ = function(doubleEncodedString) {\n return doubleEncodedString.replace(/%25([0-9a-fA-F]{2})/g, '%$1');\n};\n\n\n/**\n * Regular expression for characters that are disallowed in the scheme or\n * userInfo part of the URI.\n * @type {RegExp}\n * @private\n */\ngoog.Uri.reDisallowedInSchemeOrUserInfo_ = /[#\\/\\?@]/g;\n\n\n/**\n * Regular expression for characters that are disallowed in a relative path.\n * Colon is included due to RFC 3986 3.3.\n * @type {RegExp}\n * @private\n */\ngoog.Uri.reDisallowedInRelativePath_ = /[\\#\\?:]/g;\n\n\n/**\n * Regular expression for characters that are disallowed in an absolute path.\n * @type {RegExp}\n * @private\n */\ngoog.Uri.reDisallowedInAbsolutePath_ = /[\\#\\?]/g;\n\n\n/**\n * Regular expression for characters that are disallowed in the query.\n * @type {RegExp}\n * @private\n */\ngoog.Uri.reDisallowedInQuery_ = /[\\#\\?@]/g;\n\n\n/**\n * Regular expression for characters that are disallowed in the fragment.\n * @type {RegExp}\n * @private\n */\ngoog.Uri.reDisallowedInFragment_ = /#/g;\n\n\n\n/**\n * Class used to represent URI query parameters. It is essentially a hash of\n * name-value pairs, though a name can be present more than once.\n *\n * Has the same interface as the collections in goog.structs.\n *\n * @param {?string=} query Optional encoded query string to parse into\n * the object.\n * @param {goog.Uri=} uri Optional uri object that should have its\n * cache invalidated when this object updates. Deprecated -- this\n * is no longer required.\n * @constructor\n * @final\n */\ngoog.Uri.QueryData = function(query, uri) {\n /**\n * Encoded query string, or null if it requires computing from the key map.\n * @type {?string}\n * @private\n */\n this.encodedQuery_ = query || null;\n};\n\n\n/**\n * If the underlying key map is not yet initialized, it parses the\n * query string and fills the map with parsed data.\n * @private\n */\ngoog.Uri.QueryData.prototype.ensureKeyMapInitialized_ = function() {\n if (!this.keyMap_) {\n this.keyMap_ = new Map();\n this.count_ = 0;\n\n if (this.encodedQuery_) {\n var pairs = this.encodedQuery_.split('&');\n for (var i = 0; i < pairs.length; i++) {\n var indexOfEquals = pairs[i].indexOf('=');\n var name = null;\n var value = null;\n if (indexOfEquals >= 0) {\n name = pairs[i].substring(0, indexOfEquals);\n value = pairs[i].substring(indexOfEquals + 1);\n } else {\n name = pairs[i];\n }\n name = decodeURIComponent(name.replace(/\\+/g, ' '));\n value = value || '';\n this.add(name, decodeURIComponent(value.replace(/\\+/g, ' ')));\n }\n }\n }\n};\n\n\n/**\n * The map containing name/value or name/array-of-values pairs.\n * May be null if it requires parsing from the query string.\n *\n * We need to use a Map because we cannot guarantee that the key names will\n * not be problematic for IE.\n *\n * @type {Map<string, !Array<string>>}\n * @private\n */\ngoog.Uri.QueryData.prototype.keyMap_ = null;\n\n\n/**\n * The number of params, or null if it requires computing.\n * @type {?number}\n * @private\n */\ngoog.Uri.QueryData.prototype.count_ = null;\n\n\n/**\n * @return {?number} The number of parameters.\n */\ngoog.Uri.QueryData.prototype.getCount = function() {\n this.ensureKeyMapInitialized_();\n return this.count_;\n};\n\n\n/**\n * Adds a key value pair.\n * @param {string} key Name.\n * @param {string} value Value.\n * @return {!goog.Uri.QueryData} Instance of this object.\n */\ngoog.Uri.QueryData.prototype.add = function(key, value) {\n this.ensureKeyMapInitialized_();\n // Invalidate the cache.\n this.encodedQuery_ = null;\n\n var values = this.keyMap_.has(key) ? this.keyMap_.get(key) : null;\n if (!values) {\n this.keyMap_.set(key, (values = []));\n }\n values.push(value);\n goog.asserts.assert(this.count_ != null, 'Should not be null.');\n this.count_++;\n return this;\n};\n\n/**\n * Sets a key value pair and removes all other keys with the same value.\n *\n * @param {string} key Name.\n * @param {string} value Value.\n * @return {!goog.Uri.QueryData} Instance of this object.\n */\n goog.Uri.QueryData.prototype.set = function(key, value) {\n this.ensureKeyMapInitialized_();\n // Invalidate the cache.\n this.encodedQuery_ = null;\n\n if (!this.keyMap_.has(key)) {\n this.add(key, value);\n } else {\n this.keyMap_.set(key, [value]);\n }\n\n return this;\n};\n\n\n/**\n * Get the values from a key.\n *\n * @param {string} key Name.\n * @return {Array<string>}\n */\n goog.Uri.QueryData.prototype.get = function(key) {\n this.ensureKeyMapInitialized_();\n return this.keyMap_.get(key) || [];\n};\n\n\n/**\n * @return {string} Encoded query string.\n * @override\n */\ngoog.Uri.QueryData.prototype.toString = function() {\n if (this.encodedQuery_) {\n return this.encodedQuery_;\n }\n\n if (!this.keyMap_ || !this.keyMap_.size) {\n return '';\n }\n\n var sb = [];\n\n for (const key of this.keyMap_.keys()) {\n var encodedKey = encodeURIComponent(key);\n var val = this.keyMap_.get(key);\n for (var j = 0; j < val.length; j++) {\n var param = encodedKey;\n // Ensure that null and undefined are encoded into the url as\n // literal strings.\n if (val[j] !== '') {\n param += '=' + encodeURIComponent(val[j]);\n }\n sb.push(param);\n }\n }\n\n return this.encodedQuery_ = sb.join('&');\n};\n\n\n/**\n * @return {string} Decoded query string.\n */\ngoog.Uri.QueryData.prototype.toDecodedString = function() {\n return goog.Uri.decodeOrEmpty_(this.toString());\n};\n\n\n/**\n * Clone the query data instance.\n * @return {!goog.Uri.QueryData} New instance of the QueryData object.\n */\ngoog.Uri.QueryData.prototype.clone = function() {\n var rv = new goog.Uri.QueryData();\n rv.encodedQuery_ = this.encodedQuery_;\n if (this.keyMap_) {\n var cloneMap = new Map();\n for (const [key, val] of this.keyMap_) {\n cloneMap.set(key, val.concat());\n }\n rv.keyMap_ = cloneMap;\n rv.count_ = this.count_;\n }\n return rv;\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.BufferUtils');\n\n\n/**\n * @summary A set of BufferSource utility functions.\n * @export\n */\nshaka.util.BufferUtils = class {\n /**\n * Compare two buffers for equality. For buffers of different types, this\n * compares the underlying buffers as binary data.\n *\n * @param {?BufferSource} arr1\n * @param {?BufferSource} arr2\n * @return {boolean}\n * @export\n * @suppress {strictMissingProperties}\n */\n static equal(arr1, arr2) {\n const BufferUtils = shaka.util.BufferUtils;\n if (!arr1 && !arr2) {\n return true;\n }\n if (!arr1 || !arr2) {\n return false;\n }\n if (arr1.byteLength != arr2.byteLength) {\n return false;\n }\n\n // Quickly check if these are views of the same buffer. An ArrayBuffer can\n // be passed but doesn't have a byteOffset field, so default to 0.\n if (BufferUtils.unsafeGetArrayBuffer_(arr1) ==\n BufferUtils.unsafeGetArrayBuffer_(arr2) &&\n (arr1.byteOffset || 0) == (arr2.byteOffset || 0)) {\n return true;\n }\n\n const uint8A = shaka.util.BufferUtils.toUint8(arr1);\n const uint8B = shaka.util.BufferUtils.toUint8(arr2);\n for (let i = 0; i < arr1.byteLength; i++) {\n if (uint8A[i] != uint8B[i]) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Gets the underlying ArrayBuffer of the given view. The caller needs to\n * ensure it uses the \"byteOffset\" and \"byteLength\" fields of the view to\n * only use the same \"view\" of the data.\n *\n * @param {BufferSource} view\n * @return {!ArrayBuffer}\n * @private\n */\n static unsafeGetArrayBuffer_(view) {\n if (!ArrayBuffer.isView(view)) {\n return /** @type {!ArrayBuffer} */(view);\n } else {\n return /** @type {!ArrayBufferView} */(view).buffer;\n }\n }\n\n /**\n * Gets an ArrayBuffer that contains the data from the given TypedArray. Note\n * this will allocate a new ArrayBuffer if the object is a partial view of\n * the data.\n *\n * @param {!BufferSource} view\n * @return {!ArrayBuffer}\n * @export\n */\n static toArrayBuffer(view) {\n if (!ArrayBuffer.isView(view)) {\n return /** @type {!ArrayBuffer} */(view);\n } else {\n const aView = /** @type {!ArrayBufferView} */(view);\n if (aView.byteOffset == 0 &&\n aView.byteLength == aView.buffer.byteLength) {\n // This is a TypedArray over the whole buffer.\n return aView.buffer;\n }\n // This is a \"view\" on the buffer. Create a new buffer that only contains\n // the data. Note that since this isn't an ArrayBuffer, the \"new\" call\n // will allocate a new buffer to hold the copy.\n return new Uint8Array(aView).buffer;\n }\n }\n\n /**\n * Creates a new Uint8Array view on the same buffer. This clamps the values\n * to be within the same view (i.e. you can't use this to move past the end\n * of the view, even if the underlying buffer is larger). However, you can\n * pass a negative offset to access the data before the view.\n *\n * @param {BufferSource} data\n * @param {number=} offset The offset from the beginning of this data's view\n * to start the new view at.\n * @param {number=} length The byte length of the new view.\n * @return {!Uint8Array}\n * @export\n */\n static toUint8(data, offset = 0, length = Infinity) {\n return shaka.util.BufferUtils.view_(data, offset, length, Uint8Array);\n }\n\n /**\n * Creates a new Uint16Array view on the same buffer. This clamps the values\n * to be within the same view (i.e. you can't use this to move past the end\n * of the view, even if the underlying buffer is larger). However, you can\n * pass a negative offset to access the data before the view.\n *\n * @param {BufferSource} data\n * @param {number=} offset The offset from the beginning of this data's view\n * to start the new view at.\n * @param {number=} length The byte length of the new view.\n * @return {!Uint16Array}\n * @export\n */\n static toUint16(data, offset = 0, length = Infinity) {\n return shaka.util.BufferUtils.view_(data, offset, length, Uint16Array);\n }\n\n /**\n * Creates a DataView over the given buffer.\n *\n * @see toUint8\n * @param {BufferSource} buffer\n * @param {number=} offset\n * @param {number=} length\n * @return {!DataView}\n * @export\n */\n static toDataView(buffer, offset = 0, length = Infinity) {\n return shaka.util.BufferUtils.view_(buffer, offset, length, DataView);\n }\n\n /**\n * @param {BufferSource} data\n * @param {number} offset\n * @param {number} length\n * @param {function(new:T, ArrayBuffer, number, number)} Type\n * @return {!T}\n * @template T\n * @private\n */\n static view_(data, offset, length, Type) {\n const buffer = shaka.util.BufferUtils.unsafeGetArrayBuffer_(data);\n let bytesPerElement = 1;\n if ('BYTES_PER_ELEMENT' in Type) {\n bytesPerElement = Type.BYTES_PER_ELEMENT;\n }\n // Absolute end of the |data| view within |buffer|.\n /** @suppress {strictMissingProperties} */\n const dataEnd = ((data.byteOffset || 0) + data.byteLength) /\n bytesPerElement;\n // Absolute start of the result within |buffer|.\n /** @suppress {strictMissingProperties} */\n const rawStart = ((data.byteOffset || 0) + offset) / bytesPerElement;\n const start = Math.floor(Math.max(0, Math.min(rawStart, dataEnd)));\n // Absolute end of the result within |buffer|.\n const end = Math.floor(Math.min(start + Math.max(length, 0), dataEnd));\n return new Type(buffer, start, end - start);\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.Error');\n\n\n/**\n * @summary\n * Describes an error that happened.\n *\n * @description\n * This uses numerical codes to describe\n * which error happened.\n *\n * Some error are caused by errors from the browser. In these cases, the error\n * object is provided as part of the <code>data</code> field. System codes come\n * from the browser and may or may not be documented. Here are some places\n * where the errors may be documented:\n * <ul>\n * <li><a href=\"https://developer.mozilla.org/en-US/docs/Web/API/MediaError\">MediaError</a>\n * <li><a href=\"https://developer.mozilla.org/en-US/docs/Web/HTTP/Status\">HTTP Codes</a>\n * <li><a href=\"https://hresult.info\">Edge/PlayReady errors</a>\n * </ul>\n *\n * @export\n * @implements {shaka.extern.Error}\n * @extends {Error}\n */\nshaka.util.Error = class {\n /**\n * @param {shaka.util.Error.Severity} severity\n * @param {shaka.util.Error.Category} category\n * @param {shaka.util.Error.Code} code\n * @param {...*} varArgs\n */\n constructor(severity, category, code, ...varArgs) {\n /**\n * @override\n * @exportInterface\n */\n this.severity = severity;\n /**\n * @override\n * @exportInterface\n */\n this.category = category;\n /**\n * @override\n * @exportInterface\n */\n this.code = code;\n /**\n * @override\n * @exportInterface\n */\n this.data = varArgs;\n /**\n * @override\n * @exportInterface\n */\n this.handled = false;\n\n // A basic message for compiled mode.\n let formattedMessage = 'Shaka Error ' + this.code;\n if (goog.DEBUG) {\n // This improves the formatting of Errors in failure messages in the\n // tests in debug mode.\n let categoryName = 'UNKNOWN';\n let codeName = 'UNKNOWN';\n\n for (const k in shaka.util.Error.Category) {\n if (shaka.util.Error.Category[k] == this.category) {\n categoryName = k;\n }\n }\n for (const k in shaka.util.Error.Code) {\n if (shaka.util.Error.Code[k] == this.code) {\n codeName = k;\n }\n }\n\n formattedMessage = 'Shaka Error ' + categoryName + '.' + codeName +\n ' (' + this.data.toString() + ')';\n }\n\n /**\n * In compiled mode, contains a basic message string with the error code.\n * In uncompiled and debug modes, contains a human-readable version of the\n * category and code as enums.\n *\n * @const {string}\n * @exportDoc\n */\n this.message = formattedMessage;\n\n if (shaka.util.Error.createStack) {\n try {\n throw new Error(this.message || 'Shaka Error');\n } catch (e) {\n /**\n * A stack-trace showing where the error occurred.\n *\n * @const {string}\n * @exportDoc\n */\n this.stack = e.stack;\n }\n }\n }\n\n\n /**\n * @return {string}\n * @override\n */\n toString() {\n return 'shaka.util.Error ' + JSON.stringify(this, null, ' ');\n }\n};\n\n\n/**\n * If true, create a stack trace in Error objects.\n *\n * Disabled in tests to avoid issues with karma-jasmine.\n * See comments in test/test/boot.js for details.\n *\n * @type {boolean}\n */\nshaka.util.Error.createStack = true;\n\n/**\n * @enum {number}\n * @export\n */\nshaka.util.Error.Severity = {\n /**\n * An error occurred, but the Player is attempting to recover from the error.\n *\n * If the Player cannot ultimately recover, it still may not throw a CRITICAL\n * error. For example, retrying for a media segment will never result in\n * a CRITICAL error (the Player will just retry forever).\n */\n 'RECOVERABLE': 1,\n\n /**\n * A critical error that the library cannot recover from. These usually cause\n * the Player to stop loading or updating. A new manifest must be loaded\n * to reset the library.\n */\n 'CRITICAL': 2,\n};\n\n\n/**\n * @enum {number}\n * @export\n */\nshaka.util.Error.Category = {\n /** Errors from the network stack. */\n 'NETWORK': 1,\n\n /** Errors parsing text streams. */\n 'TEXT': 2,\n\n /** Errors parsing or processing audio or video streams. */\n 'MEDIA': 3,\n\n /** Errors parsing the Manifest. */\n 'MANIFEST': 4,\n\n /** Errors related to streaming. */\n 'STREAMING': 5,\n\n /** Errors related to DRM. */\n 'DRM': 6,\n\n /** Miscellaneous errors from the player. */\n 'PLAYER': 7,\n\n /** Errors related to cast. */\n 'CAST': 8,\n\n /** Errors in the database storage (offline). */\n 'STORAGE': 9,\n\n /** Errors related to ad insertion. */\n 'ADS': 10,\n};\n\n\n/**\n * @enum {number}\n * @export\n */\nshaka.util.Error.Code = {\n /**\n * A network request was made using an unsupported URI scheme.\n * <br> error.data[0] is the URI.\n */\n 'UNSUPPORTED_SCHEME': 1000,\n\n /**\n * An HTTP network request returned an HTTP status that indicated a failure.\n * <br> error.data[0] is the URI.\n * <br> error.data[1] is the status code.\n * <br> error.data[2] is the response text, or null if the response could not\n * be interpreted as text.\n * <br> error.data[3] is the map of response headers.\n * <br> error.data[4] is the NetworkingEngine.RequestType of the request,\n * if one was provided.\n * <br> error.data[5] is the final URI. This may be different if the initial\n * URI (error.data[0]) issued a redirect.\n */\n 'BAD_HTTP_STATUS': 1001,\n\n /**\n * An HTTP network request failed with an error, but not from the server.\n * <br> error.data[0] is the URI.\n * <br> error.data[1] is the original error.\n * <br> error.data[2] is the NetworkingEngine.RequestType of the request.\n */\n 'HTTP_ERROR': 1002,\n\n /**\n * A network request timed out.\n * <br> error.data[0] is the URI.\n * <br> error.data[1] is the NetworkingEngine.RequestType of the request,\n * if one was provided.\n */\n 'TIMEOUT': 1003,\n\n /**\n * A network request was made with a malformed data URI.\n * <br> error.data[0] is the URI.\n */\n 'MALFORMED_DATA_URI': 1004,\n\n // RETIRED: 'UNKNOWN_DATA_URI_ENCODING': 1005,\n\n /**\n * A request filter threw an error.\n * <br> error.data[0] is the original error.\n */\n 'REQUEST_FILTER_ERROR': 1006,\n\n /**\n * A response filter threw an error.\n * <br> error.data[0] is the original error.\n */\n 'RESPONSE_FILTER_ERROR': 1007,\n\n /**\n * A testing network request was made with a malformed URI.\n * This error is only used by unit and integration tests.\n */\n 'MALFORMED_TEST_URI': 1008,\n\n /**\n * An unexpected network request was made to the FakeNetworkingEngine.\n * This error is only used by unit and integration tests.\n */\n 'UNEXPECTED_TEST_REQUEST': 1009,\n\n /**\n * The number of retry attempts have run out.\n * This is an internal error and shouldn't be propagated.\n */\n 'ATTEMPTS_EXHAUSTED': 1010,\n\n /**\n * The segment is missing.\n * <br> error.data[0] is the URI.\n */\n 'SEGMENT_MISSING': 1011,\n\n\n /** The text parser failed to parse a text stream due to an invalid header. */\n 'INVALID_TEXT_HEADER': 2000,\n\n /**\n * The text parser failed to parse a text stream due to an invalid cue.\n * <br> error.data[0] is extra context, if available.\n */\n 'INVALID_TEXT_CUE': 2001,\n\n // RETIRED: 'INVALID_TEXT_SETTINGS': 2002,\n\n /**\n * Was unable to detect the encoding of the response text. Suggest adding\n * byte-order-markings to the response data.\n */\n 'UNABLE_TO_DETECT_ENCODING': 2003,\n\n /** The response data contains invalid Unicode character encoding. */\n 'BAD_ENCODING': 2004,\n\n /**\n * The XML parser failed to parse an xml stream, or the XML lacks mandatory\n * elements for TTML.\n * <br> error.data[0] is extra context, if available.\n */\n 'INVALID_XML': 2005,\n\n // RETIRED: 'INVALID_TTML': 2006,\n\n /**\n * MP4 segment does not contain TTML.\n */\n 'INVALID_MP4_TTML': 2007,\n\n /**\n * MP4 segment does not contain VTT.\n */\n 'INVALID_MP4_VTT': 2008,\n\n /**\n * When examining media in advance, we were unable to extract the cue time.\n * This should only be possible with HLS, where we do not have explicit\n * segment start times.\n * <br> error.data[0] is the underlying exception or Error object.\n */\n 'UNABLE_TO_EXTRACT_CUE_START_TIME': 2009,\n\n /**\n * MP4 segment for CEA data is invalid.\n */\n 'INVALID_MP4_CEA': 2010,\n\n /**\n * Unable to guess mime type of the text.\n * <br> error.data[0] is the text file's uri.\n */\n 'TEXT_COULD_NOT_GUESS_MIME_TYPE': 2011,\n\n /**\n * External text tracks cannot be added in src= because native platform\n * doesn't support it.\n */\n 'CANNOT_ADD_EXTERNAL_TEXT_TO_SRC_EQUALS': 2012,\n\n /**\n * Only WebVTT is supported when using src=.\n * <br> error.data[0] is the text MIME type.\n */\n 'TEXT_ONLY_WEBVTT_SRC_EQUALS': 2013,\n\n /**\n * The compilation does not contain a required text plugin for this\n * operation.\n * <br> error.data[0] is the text MIME type.\n */\n 'MISSING_TEXT_PLUGIN': 2014,\n\n /**\n * The chapters track failed to load. The browser does not provide any\n * information in this case to identify why it failed, but there may be\n * details in the JavaScript console.\n */\n 'CHAPTERS_TRACK_FAILED': 2015,\n\n // RETIRED: 'CANNOT_ADD_EXTERNAL_THUMBNAILS_TO_SRC_EQUALS': 2016,\n\n /**\n * Only external urls of WebVTT type are supported.\n * <br> error.data[0] is the uri.\n */\n 'UNSUPPORTED_EXTERNAL_THUMBNAILS_URI': 2017,\n\n /**\n * Some component tried to read past the end of a buffer. The segment index,\n * init segment, or PSSH may be malformed.\n */\n 'BUFFER_READ_OUT_OF_BOUNDS': 3000,\n\n /**\n * Some component tried to parse an integer that was too large to fit in a\n * JavaScript number without rounding error. JavaScript can only natively\n * represent integers up to 53 bits.\n */\n 'JS_INTEGER_OVERFLOW': 3001,\n\n /**\n * The EBML parser used to parse the WebM container encountered an integer,\n * ID, or other field larger than the maximum supported by the parser.\n */\n 'EBML_OVERFLOW': 3002,\n\n /**\n * The EBML parser used to parse the WebM container encountered a floating-\n * point field of a size not supported by the parser.\n */\n 'EBML_BAD_FLOATING_POINT_SIZE': 3003,\n\n /**\n * The MP4 SIDX parser found the wrong box type.\n * Either the segment index range is incorrect or the data is corrupt.\n */\n 'MP4_SIDX_WRONG_BOX_TYPE': 3004,\n\n /**\n * The MP4 SIDX parser encountered an invalid timescale.\n * The segment index data may be corrupt.\n */\n 'MP4_SIDX_INVALID_TIMESCALE': 3005,\n\n /** The MP4 SIDX parser encountered a type of SIDX that is not supported. */\n 'MP4_SIDX_TYPE_NOT_SUPPORTED': 3006,\n\n /**\n * The WebM Cues parser was unable to locate the Cues element.\n * The segment index data may be corrupt.\n */\n 'WEBM_CUES_ELEMENT_MISSING': 3007,\n\n /**\n * The WebM header parser was unable to locate the Ebml element.\n * The init segment data may be corrupt.\n */\n 'WEBM_EBML_HEADER_ELEMENT_MISSING': 3008,\n\n /**\n * The WebM header parser was unable to locate the Segment element.\n * The init segment data may be corrupt.\n */\n 'WEBM_SEGMENT_ELEMENT_MISSING': 3009,\n\n /**\n * The WebM header parser was unable to locate the Info element.\n * The init segment data may be corrupt.\n */\n 'WEBM_INFO_ELEMENT_MISSING': 3010,\n\n /**\n * The WebM header parser was unable to locate the Duration element.\n * The init segment data may be corrupt or may have been incorrectly encoded.\n * Shaka requires a duration in WebM DASH content.\n */\n 'WEBM_DURATION_ELEMENT_MISSING': 3011,\n\n /**\n * The WebM Cues parser was unable to locate the Cue Track Positions element.\n * The segment index data may be corrupt.\n */\n 'WEBM_CUE_TRACK_POSITIONS_ELEMENT_MISSING': 3012,\n\n /**\n * The WebM Cues parser was unable to locate the Cue Time element.\n * The segment index data may be corrupt.\n */\n 'WEBM_CUE_TIME_ELEMENT_MISSING': 3013,\n\n /**\n * A MediaSource operation failed.\n * <br> error.data[0] is a MediaError code from the video element.\n * <br> error.data[1] is the segment URI that triggered the error, if any.\n */\n 'MEDIA_SOURCE_OPERATION_FAILED': 3014,\n\n /**\n * A MediaSource operation threw an exception.\n * <br> error.data[0] is the exception that was thrown.\n * <br> error.data[1] is the error object from the video element.\n * <br> error.data[2] is the segment URI that triggered the error, if any.\n */\n 'MEDIA_SOURCE_OPERATION_THREW': 3015,\n\n /**\n * The video element reported an error.\n * <br> error.data[0] is a MediaError code from the video element.\n * <br> On Edge, error.data[1] is a Microsoft extended error code in hex.\n * <br> On Chrome, error.data[2] is a string with details on the error.\n * <br> See top of file for links to browser error codes.\n */\n 'VIDEO_ERROR': 3016,\n\n /**\n * A MediaSource operation threw QuotaExceededError and recovery failed. The\n * content cannot be played correctly because the segments are too large for\n * the browser/platform. This may occur when attempting to play very high\n * quality, very high bitrate content on low-end devices.\n * <br> error.data[0] is the type of content which caused the error.\n */\n 'QUOTA_EXCEEDED_ERROR': 3017,\n\n /**\n * Transmuxing with our internal transmuxer failed.\n * <br> error.data[0] is the segment URI that triggered the error, if any.\n */\n 'TRANSMUXING_FAILED': 3018,\n\n /**\n * Content transformations required by the platform could not be performed for\n * some reason (unsupported container, etc.)\n * <br> @see https://github.com/shaka-project/shaka-player/issues/2759\n * <br> error.data[0] is the segment URI that triggered the error, if any.\n */\n 'CONTENT_TRANSFORMATION_FAILED': 3019,\n\n /**\n * Important data is missing to be able to do the transmuxing of MSS.\n * <br> error.data[0] is the segment URI that triggered the error, if any.\n */\n 'MSS_MISSING_DATA_FOR_TRANSMUXING': 3020,\n\n // RETIRED: 'MSS_TRANSMUXING_CODEC_UNKNOWN': 3021,\n\n /**\n * MSS transmuxing failed for unknown reason.\n * <br> error.data[0] is the segment URI that triggered the error, if any.\n */\n 'MSS_TRANSMUXING_FAILED': 3022,\n\n /**\n * An internal error which indicates that transmuxing operation has no video\n * data. This should not be seen by applications.\n * <br> error.data[0] is the segment URI that triggered the error, if any.\n */\n 'TRANSMUXING_NO_VIDEO_DATA': 3023,\n\n /**\n * A MediaSource operation is not allowed because the streaming is not\n * allowed.\n * <br> error.data[0] is the type of content which caused the error.\n */\n 'STREAMING_NOT_ALLOWED': 3024,\n\n\n /**\n * The Player was unable to guess the manifest type based on file extension\n * or MIME type. To fix, try one of the following:\n * <br><ul>\n * <li>Rename the manifest so that the URI ends in a well-known extension.\n * <li>Configure the server to send a recognizable Content-Type header.\n * <li>Configure the server to accept a HEAD request for the manifest.\n * </ul>\n * <br> error.data[0] is the manifest URI.\n * <br> error.data[1] is the detected or specified MIME type.\n */\n 'UNABLE_TO_GUESS_MANIFEST_TYPE': 4000,\n\n /**\n * The DASH Manifest contained invalid XML markup.\n * <br> error.data[0] is the URI associated with the XML.\n */\n 'DASH_INVALID_XML': 4001,\n\n /**\n * The DASH Manifest contained a Representation with insufficient segment\n * information.\n */\n 'DASH_NO_SEGMENT_INFO': 4002,\n\n /** The DASH Manifest contained an AdaptationSet with no Representations. */\n 'DASH_EMPTY_ADAPTATION_SET': 4003,\n\n /** The DASH Manifest contained an Period with no AdaptationSets. */\n 'DASH_EMPTY_PERIOD': 4004,\n\n /**\n * The DASH Manifest does not specify an init segment with a WebM container.\n */\n 'DASH_WEBM_MISSING_INIT': 4005,\n\n /** The DASH Manifest contained an unsupported container format. */\n 'DASH_UNSUPPORTED_CONTAINER': 4006,\n\n /** The embedded PSSH data has invalid encoding. */\n 'DASH_PSSH_BAD_ENCODING': 4007,\n\n /**\n * There is an AdaptationSet whose Representations do not have any common\n * key-systems.\n */\n 'DASH_NO_COMMON_KEY_SYSTEM': 4008,\n\n /** Having multiple key IDs per Representation is not supported. */\n 'DASH_MULTIPLE_KEY_IDS_NOT_SUPPORTED': 4009,\n\n /** The DASH Manifest specifies conflicting key IDs. */\n 'DASH_CONFLICTING_KEY_IDS': 4010,\n\n // RETIRED: 'UNPLAYABLE_PERIOD': 4011,\n\n /**\n * There exist some streams that could be decoded, but restrictions imposed\n * by the application or the key system prevent us from playing. This may\n * happen under the following conditions:\n * <ul>\n * <li>The application has given restrictions to the Player that restrict\n * at least one content type completely (e.g. no playable audio).\n * <li>The manifest specifies different keys than were given to us from the\n * license server.\n * <li>The key system has imposed output restrictions that cannot be met\n * (such as HDCP) and there are no unrestricted alternatives.\n * </ul>\n * <br> error.data[0] is a {@link shaka.extern.RestrictionInfo} object\n * describing the kinds of restrictions that caused this error.\n */\n 'RESTRICTIONS_CANNOT_BE_MET': 4012,\n\n // RETIRED: 'INTERNAL_ERROR_KEY_STATUS': 4013,\n\n // RETIRED: 'NO_PERIODS': 4014,\n\n /**\n * HLS playlist doesn't start with a mandatory #EXTM3U tag.\n */\n 'HLS_PLAYLIST_HEADER_MISSING': 4015,\n\n /**\n * HLS tag has an invalid name that doesn't start with '#EXT'\n * <br> error.data[0] is the invalid tag.\n */\n 'INVALID_HLS_TAG': 4016,\n\n /**\n * HLS playlist has both Master and Media/Segment tags.\n */\n 'HLS_INVALID_PLAYLIST_HIERARCHY': 4017,\n\n /**\n * A Representation has an id that is the same as another Representation in\n * the same Period. This makes manifest updates impossible since we cannot\n * map the updated Representation to the old one.\n */\n 'DASH_DUPLICATE_REPRESENTATION_ID': 4018,\n\n // RETIRED: 'HLS_MEDIA_INIT_SECTION_INFO_MISSING': 4019,\n\n /**\n * HLS manifest has several #EXT-X-MAP tags. We can only\n * support one at the moment.\n */\n 'HLS_MULTIPLE_MEDIA_INIT_SECTIONS_FOUND': 4020,\n\n // RETIRED: 'HLS_COULD_NOT_GUESS_MIME_TYPE': 4021,\n\n // RETIRED: 'HLS_MASTER_PLAYLIST_NOT_PROVIDED': 4022,\n\n /**\n * One of the required attributes was not provided, so the\n * HLS manifest is invalid.\n * <br> error.data[0] is the missing attribute's name.\n */\n 'HLS_REQUIRED_ATTRIBUTE_MISSING': 4023,\n\n /**\n * One of the required tags was not provided, so the\n * HLS manifest is invalid.\n * <br> error.data[0] is the missing tag's name.\n */\n 'HLS_REQUIRED_TAG_MISSING': 4024,\n\n /**\n * The HLS parser was unable to guess codecs of a stream.\n * <br> error.data[0] is the list of all codecs for the variant.\n */\n 'HLS_COULD_NOT_GUESS_CODECS': 4025,\n\n /**\n * The HLS parser has encountered encrypted content with unsupported\n * KEYFORMAT attributes.\n */\n 'HLS_KEYFORMATS_NOT_SUPPORTED': 4026,\n\n /**\n * The manifest parser only supports xlink links with xlink:actuate=\"onLoad\".\n */\n 'DASH_UNSUPPORTED_XLINK_ACTUATE': 4027,\n\n /**\n * The manifest parser has hit its depth limit on xlink link chains.\n */\n 'DASH_XLINK_DEPTH_LIMIT': 4028,\n\n // RETIRED: 'HLS_LIVE_CONTENT_NOT_SUPPORTED': 4029,\n\n // RETIRED: 'HLS_COULD_NOT_PARSE_SEGMENT_START_TIME': 4030,\n\n // RETIRED: 'HLS_MEDIA_SEQUENCE_REQUIRED_IN_LIVE_STREAMS': 4031,\n\n /**\n * The content container or codecs are not supported by this browser. For\n * example, this could happen if the content is WebM, but your browser does\n * not support the WebM container, or if the content uses HEVC, but your\n * browser does not support the HEVC codec. This can also occur for\n * multi codec or multi container manifests if none of the codecs\n * or containers are supported by the browser.\n *\n * To see what your browser supports, you can check the JSON data dumped by\n * http://support.shaka-player-demo.appspot.com/\n */\n 'CONTENT_UNSUPPORTED_BY_BROWSER': 4032,\n\n /**\n * External text tracks cannot be added to live streams.\n */\n 'CANNOT_ADD_EXTERNAL_TEXT_TO_LIVE_STREAM': 4033,\n\n // RETIRED: 'HLS_AES_128_ENCRYPTION_NOT_SUPPORTED': 4034,\n // RETIRED: 'HLS_INTERNAL_SKIP_STREAM': 4035,\n\n /** The Manifest contained no Variants. */\n 'NO_VARIANTS': 4036,\n\n /**\n * We failed to find matching streams across DASH Periods, and the\n * period-flattening algorithm introduced in v3.0 has failed.\n */\n 'PERIOD_FLATTENING_FAILED': 4037,\n\n /**\n * We failed to find matching streams across DASH Periods due to inconsistent\n * DRM systems across periods.\n */\n 'INCONSISTENT_DRM_ACROSS_PERIODS': 4038,\n\n /**\n * The HLS manifest refers to an undeclared variables.\n * <br> error.data[0] is the variable undeclared.\n */\n 'HLS_VARIABLE_NOT_FOUND': 4039,\n\n /**\n * We do not support playing encrypted mp2t with MSE\n */\n 'HLS_MSE_ENCRYPTED_MP2T_NOT_SUPPORTED': 4040,\n\n /**\n * We do not support playing encrypted content (different than mp2t) with MSE\n * and legacy Apple MediaKeys API.\n */\n 'HLS_MSE_ENCRYPTED_LEGACY_APPLE_MEDIA_KEYS_NOT_SUPPORTED': 4041,\n\n /**\n * Web Crypto API is not available (to decrypt AES-128 streams). Web Crypto\n * only exists in secure origins like https.\n */\n 'NO_WEB_CRYPTO_API': 4042,\n\n // RETIRED: 'HLS_AES_128_INVALID_IV_LENGTH': 4043,\n // RETIRED: 'HLS_AES_128_INVALID_KEY_LENGTH': 4044,\n\n /**\n * External thumbnails tracks cannot be added to live streams.\n */\n 'CANNOT_ADD_EXTERNAL_THUMBNAILS_TO_LIVE_STREAM': 4045,\n\n /**\n * The MSS Manifest contained invalid XML markup.\n * <br> error.data[0] is the URI associated with the XML.\n */\n 'MSS_INVALID_XML': 4046,\n\n /**\n * MSS parser encountered a live playlist.\n */\n 'MSS_LIVE_CONTENT_NOT_SUPPORTED': 4047,\n\n /**\n * AES-128 iv length should be 16 bytes.\n */\n 'AES_128_INVALID_IV_LENGTH': 4048,\n\n /**\n * AES-128 encryption key length should be 16 bytes.\n */\n 'AES_128_INVALID_KEY_LENGTH': 4049,\n\n /**\n * The DASH Manifest specifies conflicting AES-128 keys.\n */\n 'DASH_CONFLICTING_AES_128': 4050,\n\n /**\n * The DASH Manifest specifies a unsupported AES-128 encryption.\n */\n 'DASH_UNSUPPORTED_AES_128': 4051,\n\n /**\n * Patch requested during an update did not match original manifest.\n */\n 'DASH_INVALID_PATCH': 4052,\n\n /**\n * The media playlist has not segments or all segments are gap.\n */\n 'HLS_EMPTY_MEDIA_PLAYLIST': 4053,\n\n /**\n * We do not support playing encrypted content with MSE\n * and legacy Apple MediaKeys API.\n */\n 'DASH_MSE_ENCRYPTED_LEGACY_APPLE_MEDIA_KEYS_NOT_SUPPORTED': 4054,\n\n // RETIRED: 'INCONSISTENT_BUFFER_STATE': 5000,\n // RETIRED: 'INVALID_SEGMENT_INDEX': 5001,\n // RETIRED: 'SEGMENT_DOES_NOT_EXIST': 5002,\n // RETIRED: 'CANNOT_SATISFY_BYTE_LIMIT': 5003,\n // RETIRED: 'BAD_SEGMENT': 5004,\n // RETIRED: 'INVALID_STREAMS_CHOSEN': 5005,\n\n /**\n * This would only happen if StreamingEngine were not started correctly, and\n * should not be seen in production.\n */\n 'STREAMING_ENGINE_STARTUP_INVALID_STATE': 5006,\n\n\n /**\n * The manifest indicated protected content, but the manifest parser was\n * unable to determine what key systems should be used.\n */\n 'NO_RECOGNIZED_KEY_SYSTEMS': 6000,\n\n /**\n * None of the requested key system configurations are available. This may\n * happen under the following conditions:\n * <ul>\n * <li> The key system is not supported.\n * <li> The key system does not support the features requested (e.g.\n * persistent state).\n * <li> A user prompt was shown and the user denied access.\n * <li> The key system is not available from unsecure contexts. (i.e.\n requires HTTPS) See https://bit.ly/2K9X1nY\n * </ul>\n */\n 'REQUESTED_KEY_SYSTEM_CONFIG_UNAVAILABLE': 6001,\n\n /**\n * The browser found one of the requested key systems, but it failed to\n * create an instance of the CDM for some unknown reason.\n * <br> error.data[0] is an error message string from the browser.\n */\n 'FAILED_TO_CREATE_CDM': 6002,\n\n /**\n * The browser found one of the requested key systems and created an instance\n * of the CDM, but it failed to attach the CDM to the video for some unknown\n * reason.\n * <br> error.data[0] is an error message string from the browser.\n */\n 'FAILED_TO_ATTACH_TO_VIDEO': 6003,\n\n /**\n * The CDM rejected the server certificate supplied by the application.\n * The certificate may be malformed or in an unsupported format.\n * <br> error.data[0] is an error message string from the browser.\n */\n 'INVALID_SERVER_CERTIFICATE': 6004,\n\n /**\n * The CDM refused to create a session for some unknown reason.\n * <br> error.data[0] is an error message string from the browser.\n */\n 'FAILED_TO_CREATE_SESSION': 6005,\n\n /**\n * The CDM was unable to generate a license request for the init data it was\n * given. The init data may be malformed or in an unsupported format.\n * <br> error.data[0] is an error message string from the browser.\n * <br> error.data[1] is the error object from the browser.\n * <br> error.data[2] is a string with the extended error code, if available.\n * <br> See top of file for links to browser error codes.\n */\n 'FAILED_TO_GENERATE_LICENSE_REQUEST': 6006,\n\n /**\n * The license request failed. This could be a timeout, a network failure, or\n * a rejection by the server.\n * <br> error.data[0] is a shaka.util.Error from the networking engine.\n */\n 'LICENSE_REQUEST_FAILED': 6007,\n\n /**\n * The license response was rejected by the CDM. The server's response may be\n * invalid or malformed for this CDM.\n * <br> error.data[0] is an error message string from the browser.\n * <br> See top of file for links to browser error codes.\n */\n 'LICENSE_RESPONSE_REJECTED': 6008,\n\n // RETIRED: 'NO_LICENSE_SERVER_SPECIFIED': 6009,\n\n /**\n * The manifest does not specify any DRM info, but the content is encrypted.\n * Either the manifest or the manifest parser are broken.\n */\n 'ENCRYPTED_CONTENT_WITHOUT_DRM_INFO': 6010,\n\n // RETIRED: 'WRONG_KEYS': 6011,\n\n /**\n * No license server was given for the key system signaled by the manifest.\n * A license server URI is required for every key system.\n * <br> error.data[0] is the key system identifier.\n */\n 'NO_LICENSE_SERVER_GIVEN': 6012,\n\n /**\n * A required offline session was removed. The content might not be playable\n * depending of the playback context.\n */\n 'OFFLINE_SESSION_REMOVED': 6013,\n\n /**\n * The license has expired. This is triggered when all keys in the key\n * status map have a status of 'expired'.\n */\n 'EXPIRED': 6014,\n\n /**\n * A server certificate wasn't given when it is required. FairPlay requires\n * setting an explicit server certificate in the configuration.\n */\n 'SERVER_CERTIFICATE_REQUIRED': 6015,\n\n /**\n * An error was thrown while executing the init data transformation.\n * <br> error.data[0] is the original error.\n */\n 'INIT_DATA_TRANSFORM_ERROR': 6016,\n\n /**\n * The server certificate request failed.\n * <br> error.data[0] is a shaka.util.Error from the networking engine.\n */\n 'SERVER_CERTIFICATE_REQUEST_FAILED': 6017,\n\n /**\n * The HDCP version does not meet the requirements.\n */\n 'MIN_HDCP_VERSION_NOT_MATCH': 6018,\n\n /**\n * Error when checking HDCP version.\n * <br> error.data[0] is an error message string from the browser.\n */\n 'ERROR_CHECKING_HDCP_VERSION': 6019,\n\n /**\n * The browser does not support EME APIs, so DRM content cannot be played.\n */\n 'MISSING_EME_SUPPORT': 6020,\n\n\n /**\n * The call to Player.load() was interrupted by a call to Player.unload()\n * or another call to Player.load().\n */\n 'LOAD_INTERRUPTED': 7000,\n\n /**\n * An internal error which indicates that an operation was aborted. This\n * should not be seen by applications.\n */\n 'OPERATION_ABORTED': 7001,\n\n /**\n * The call to Player.load() failed because the Player does not have a video\n * element. The video element must either be provided to the constructor or\n * to Player.attach() before Player.load() is called.\n */\n 'NO_VIDEO_ELEMENT': 7002,\n\n /**\n * The operation failed because the object has been destroyed.\n */\n 'OBJECT_DESTROYED': 7003,\n\n /**\n * The content has not been loaded in the Player.\n */\n 'CONTENT_NOT_LOADED': 7004,\n\n /**\n * The call to preload failed, due to being called on src= content.\n */\n 'SRC_EQUALS_PRELOAD_NOT_SUPPORTED': 7005,\n\n /**\n * The operation failed because the preload has been destroyed. This can\n * happen by reusing the same preload in multiple load calls.\n */\n 'PRELOAD_DESTROYED': 7006,\n\n /**\n * The Cast API is unavailable. This may be because of one of the following:\n * 1. The browser may not have Cast support\n * 2. The browser may be missing a necessary Cast extension\n * 3. The Cast sender library may not be loaded in your app\n */\n 'CAST_API_UNAVAILABLE': 8000,\n\n /**\n * No cast receivers are available at this time.\n */\n 'NO_CAST_RECEIVERS': 8001,\n\n /**\n * The library is already casting.\n */\n 'ALREADY_CASTING': 8002,\n\n /**\n * A Cast SDK error that we did not explicitly plan for has occurred.\n * Check data[0] and refer to the Cast SDK documentation for details.\n * <br> error.data[0] is an error object from the Cast SDK.\n */\n 'UNEXPECTED_CAST_ERROR': 8003,\n\n /**\n * The cast operation was canceled by the user.\n * <br> error.data[0] is an error object from the Cast SDK.\n */\n 'CAST_CANCELED_BY_USER': 8004,\n\n /**\n * The cast connection timed out.\n * <br> error.data[0] is an error object from the Cast SDK.\n */\n 'CAST_CONNECTION_TIMED_OUT': 8005,\n\n /**\n * The requested receiver app ID does not exist or is unavailable.\n * Check the requested app ID for typos.\n * <br> error.data[0] is an error object from the Cast SDK.\n */\n 'CAST_RECEIVER_APP_UNAVAILABLE': 8006,\n\n\n // RETIRED: CAST_RECEIVER_APP_ID_MISSING': 8007,\n\n\n /**\n * Offline storage is not supported on this browser; it is required for\n * offline support.\n */\n 'STORAGE_NOT_SUPPORTED': 9000,\n\n /**\n * An unknown error occurred in the IndexedDB.\n * <br> On Firefox, one common source for UnknownError calls is reverting\n * Firefox to an old version. This makes the IndexedDB storage inaccessible\n * for older versions. The only way to fix this is to delete the storage\n * data in your profile. See https://mzl.la/2yCGWCm\n * <br> error.data[0] is the error object.\n */\n 'INDEXED_DB_ERROR': 9001,\n\n /**\n * The storage operation was aborted. Deprecated in favor of more general\n * OPERATION_ABORTED.\n */\n 'DEPRECATED_OPERATION_ABORTED': 9002,\n\n /**\n * The specified item was not found in the IndexedDB.\n * <br> error.data[0] is the offline URI.\n */\n 'REQUESTED_ITEM_NOT_FOUND': 9003,\n\n /**\n * A network request was made with a malformed offline URI.\n * <br> error.data[0] is the URI.\n */\n 'MALFORMED_OFFLINE_URI': 9004,\n\n /**\n * The specified content is live or in-progress.\n * Live and in-progress streams cannot be stored offline.\n * <br> error.data[0] is the URI.\n */\n 'CANNOT_STORE_LIVE_OFFLINE': 9005,\n\n // RETIRED: 'STORE_ALREADY_IN_PROGRESS': 9006,\n\n /**\n * There was no init data available for offline storage. This happens when\n * there is no init data in the manifest nor could we find any in the\n * segments. We currently only support searching MP4 init segments for init\n * data.\n */\n 'NO_INIT_DATA_FOR_OFFLINE': 9007,\n\n /**\n * shaka.offline.Storage was constructed with a Player proxy instead of a\n * local player instance. To fix this, use Player directly with Storage\n * instead of the results of CastProxy.prototype.getPlayer().\n */\n 'LOCAL_PLAYER_INSTANCE_REQUIRED': 9008,\n\n // RETIRED/MOVED TO 4000's: 'CONTENT_UNSUPPORTED_BY_BROWSER': 9009,\n\n // RETIRED: 'UNSUPPORTED_UPGRADE_REQUEST': 9010,\n\n /**\n * The storage cell does not allow new operations that require new keys.\n */\n 'NEW_KEY_OPERATION_NOT_SUPPORTED': 9011,\n\n /**\n * A key was not found in a storage cell.\n */\n 'KEY_NOT_FOUND': 9012,\n\n /**\n * A storage cell was not found.\n */\n 'MISSING_STORAGE_CELL': 9013,\n\n /**\n * The storage limit defined in <code>downloadSizeCallback</code> has been\n * reached.\n */\n 'STORAGE_LIMIT_REACHED': 9014,\n\n /**\n * <code>downloadSizeCallback</code> has produced an unexpected error.\n */\n 'DOWNLOAD_SIZE_CALLBACK_ERROR': 9015,\n\n /**\n * The storage cell does not allow new operations that significantly change\n * existing data.\n */\n 'MODIFY_OPERATION_NOT_SUPPORTED': 9016,\n\n /**\n * When attempting to open an indexedDB instance, nothing happened for long\n * enough for us to time out. This keeps the storage mechanism from hanging\n * indefinitely, if neither the success nor error callbacks are called.\n */\n 'INDEXED_DB_INIT_TIMED_OUT': 9017,\n\n /**\n * CS IMA SDK, required for ad insertion, has not been included on the page.\n */\n 'CS_IMA_SDK_MISSING': 10000,\n\n /**\n * Client Side Ad Manager needs to be initialized to enable Client Side\n * Ad Insertion. Call adManager.initClientSide() to do it.\n */\n 'CS_AD_MANAGER_NOT_INITIALIZED': 10001,\n\n /**\n * SS IMA SDK, required for ad insertion, has not been included on the page.\n */\n 'SS_IMA_SDK_MISSING': 10002,\n\n /**\n * Server Side Ad Manager needs to be initialized to enable Server Side\n * Ad Insertion. Call adManager.initServerSide() to do it.\n */\n 'SS_AD_MANAGER_NOT_INITIALIZED': 10003,\n\n /**\n * A new DAI steam was requested before the previous request had been\n * resolved. Only one stream request at a time is supported. Please wait\n * for the previous request to complete before initiating a new one.\n */\n 'CURRENT_DAI_REQUEST_NOT_FINISHED': 10004,\n\n /**\n * MediaTailor Ad Manager needs to be initialized to enable MediaTailor\n * Ad Insertion. Call adManager.initMediaTailor() to do it.\n */\n 'MT_AD_MANAGER_NOT_INITIALIZED': 10005,\n\n /**\n * Interstitial Ad Manager needs to be initialized to enable interstitial\n * Ad Insertion. Call adManager.initInterstitial() to do it.\n */\n 'INTERSTITIAL_AD_MANAGER_NOT_INITIALIZED': 10006,\n\n /**\n * The VAST contained invalid XML markup.\n */\n 'VAST_INVALID_XML': 10007,\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.Lazy');\n\ngoog.require('goog.asserts');\n\n\n/**\n * @summary\n * This contains a single value that is lazily generated when it is first\n * requested. This can store any value except \"undefined\".\n *\n * @template T\n */\nshaka.util.Lazy = class {\n /** @param {function():T} gen */\n constructor(gen) {\n /** @private {function():T} */\n this.gen_ = gen;\n\n /** @private {T|undefined} */\n this.value_ = undefined;\n }\n\n /** @return {T} */\n value() {\n if (this.value_ === undefined) {\n // Compiler complains about unknown fields without this cast.\n this.value_ = /** @type {*} */ (this.gen_());\n goog.asserts.assert(\n this.value_ !== undefined, 'Unable to create lazy value');\n }\n return this.value_;\n }\n\n /** Resets the value of the lazy function, so it has to be remade. */\n reset() {\n this.value_ = undefined;\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.drm.DrmUtils');\n\ngoog.require('shaka.util.BufferUtils');\ngoog.require('shaka.util.Lazy');\n\n\nshaka.drm.DrmUtils = class {\n /**\n * Returns true if the browser has recent EME APIs.\n *\n * @return {boolean}\n */\n static isBrowserSupported() {\n const basic =\n !!window.MediaKeys &&\n !!window.navigator &&\n !!window.navigator.requestMediaKeySystemAccess &&\n !!window.MediaKeySystemAccess &&\n // eslint-disable-next-line no-restricted-syntax\n !!window.MediaKeySystemAccess.prototype.getConfiguration;\n\n return basic;\n }\n\n /**\n * Checks if two DrmInfos can be decrypted using the same key system.\n * Clear content is considered compatible with every key system.\n *\n * @param {!Array<!shaka.extern.DrmInfo>} drms1\n * @param {!Array<!shaka.extern.DrmInfo>} drms2\n * @return {boolean}\n */\n static areDrmCompatible(drms1, drms2) {\n if (!drms1.length || !drms2.length) {\n return true;\n }\n\n if (drms1 === drms2) {\n return true;\n }\n\n return shaka.drm.DrmUtils.getCommonDrmInfos(\n drms1, drms2).length > 0;\n }\n\n /**\n * Returns an array of drm infos that are present in both input arrays.\n * If one of the arrays is empty, returns the other one since clear\n * content is considered compatible with every drm info.\n *\n * @param {!Array<!shaka.extern.DrmInfo>} drms1\n * @param {!Array<!shaka.extern.DrmInfo>} drms2\n * @return {!Array<!shaka.extern.DrmInfo>}\n */\n static getCommonDrmInfos(drms1, drms2) {\n if (!drms1.length) {\n return drms2;\n }\n if (!drms2.length) {\n return drms1;\n }\n\n const commonDrms = [];\n\n for (const drm1 of drms1) {\n for (const drm2 of drms2) {\n if (drm1.keySystem == drm2.keySystem) {\n const initDataMap = new Map();\n const bothInitDatas = (drm1.initData || [])\n .concat(drm2.initData || []);\n for (const d of bothInitDatas) {\n initDataMap.set(d.keyId, d);\n }\n const initData = Array.from(initDataMap.values());\n\n const keyIds = drm1.keyIds && drm2.keyIds ?\n new Set([...drm1.keyIds, ...drm2.keyIds]) :\n drm1.keyIds || drm2.keyIds;\n const mergedDrm = {\n keySystem: drm1.keySystem,\n licenseServerUri: drm1.licenseServerUri || drm2.licenseServerUri,\n distinctiveIdentifierRequired: drm1.distinctiveIdentifierRequired ||\n drm2.distinctiveIdentifierRequired,\n persistentStateRequired: drm1.persistentStateRequired ||\n drm2.persistentStateRequired,\n videoRobustness: drm1.videoRobustness || drm2.videoRobustness,\n audioRobustness: drm1.audioRobustness || drm2.audioRobustness,\n serverCertificate: drm1.serverCertificate || drm2.serverCertificate,\n serverCertificateUri: drm1.serverCertificateUri ||\n drm2.serverCertificateUri,\n initData,\n keyIds,\n };\n commonDrms.push(mergedDrm);\n break;\n }\n }\n }\n\n return commonDrms;\n }\n\n /**\n * @param {?shaka.extern.DrmInfo} drmInfo\n * @return {string}\n */\n static keySystem(drmInfo) {\n return drmInfo ? drmInfo.keySystem : '';\n }\n\n /**\n * @param {?string} keySystem\n * @return {boolean}\n */\n static isClearKeySystem(keySystem) {\n return keySystem === 'org.w3.clearkey';\n }\n\n /**\n * @param {?string} keySystem\n * @return {boolean}\n */\n static isWidevineKeySystem(keySystem) {\n if (keySystem) {\n return !!keySystem.match(/^com\\.widevine\\.alpha/);\n }\n\n return false;\n }\n\n /**\n * @param {?string} keySystem\n * @return {boolean}\n */\n static isPlayReadyKeySystem(keySystem) {\n if (keySystem) {\n return !!keySystem.match(/^com\\.(microsoft|chromecast)\\.playready/);\n }\n\n return false;\n }\n\n /**\n * @param {?string} keySystem\n * @return {boolean}\n */\n static isFairPlayKeySystem(keySystem) {\n if (keySystem) {\n return !!keySystem.match(/^com\\.apple\\.fps/);\n }\n\n return false;\n }\n\n /**\n * @param {?string} keySystem\n * @return {boolean}\n */\n static isWisePlayKeySystem(keySystem) {\n return keySystem === 'com.huawei.wiseplay';\n }\n\n /**\n * A method for generating a key for the MediaKeySystemAccessRequests cache.\n *\n * @param {string} videoCodec\n * @param {string} audioCodec\n * @param {string} keySystem\n * @return {string}\n * @private\n */\n static generateKeySystemCacheKey_(videoCodec, audioCodec, keySystem) {\n return `${videoCodec}#${audioCodec}#${keySystem}`;\n }\n\n /**\n * Check does MediaKeySystemAccess cache contains something for following\n * attributes.\n *\n * @param {string} videoCodec\n * @param {string} audioCodec\n * @param {string} keySystem\n * @return {boolean}\n */\n static hasMediaKeySystemAccess(videoCodec, audioCodec, keySystem) {\n const DrmUtils = shaka.drm.DrmUtils;\n const key = DrmUtils.generateKeySystemCacheKey_(\n videoCodec, audioCodec, keySystem);\n return DrmUtils.memoizedMediaKeySystemAccessRequests_.has(key);\n }\n\n /**\n * Get MediaKeySystemAccess object for following attributes.\n *\n * @param {string} videoCodec\n * @param {string} audioCodec\n * @param {string} keySystem\n * @return {?MediaKeySystemAccess}\n */\n static getMediaKeySystemAccess(videoCodec, audioCodec, keySystem) {\n const DrmUtils = shaka.drm.DrmUtils;\n const key = DrmUtils.generateKeySystemCacheKey_(\n videoCodec, audioCodec, keySystem);\n return DrmUtils.memoizedMediaKeySystemAccessRequests_.get(key) || null;\n }\n\n /**\n * Store MediaKeySystemAccess object associated with specified attributes.\n *\n * @param {string} videoCodec\n * @param {string} audioCodec\n * @param {string} keySystem\n * @param {!MediaKeySystemAccess} mksa\n */\n static setMediaKeySystemAccess(videoCodec, audioCodec, keySystem, mksa) {\n const DrmUtils = shaka.drm.DrmUtils;\n const key = DrmUtils.generateKeySystemCacheKey_(\n videoCodec, audioCodec, keySystem);\n DrmUtils.memoizedMediaKeySystemAccessRequests_.set(key, mksa);\n }\n\n /**\n * Clears underlying cache.\n */\n static clearMediaKeySystemAccessMap() {\n const DrmUtils = shaka.drm.DrmUtils;\n DrmUtils.memoizedMediaKeySystemAccessRequests_.clear();\n }\n\n /**\n * Returns true if MediaKeys is polyfilled by the specified polyfill.\n *\n * @param {string} polyfillType\n * @return {boolean}\n */\n static isMediaKeysPolyfilled(polyfillType) {\n return polyfillType === window.shakaMediaKeysPolyfill;\n }\n};\n\n\n/**\n * Contains the suggested \"default\" key ID used by EME polyfills that do not\n * have a per-key key status. See w3c/encrypted-media#32.\n * @type {!shaka.util.Lazy<!ArrayBuffer>}\n */\nshaka.drm.DrmUtils.DUMMY_KEY_ID = new shaka.util.Lazy(\n () => shaka.util.BufferUtils.toArrayBuffer(new Uint8Array([0])));\n\n\n/**\n * A cache that stores the MediaKeySystemAccess result of calling\n * `navigator.requestMediaKeySystemAccess` by a key combination of\n * video/audio codec and key system string.\n *\n * @private {!Map<string, !MediaKeySystemAccess>}\n */\nshaka.drm.DrmUtils.memoizedMediaKeySystemAccessRequests_ = new Map();\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.DelayedTick');\n\n\n/**\n * @summary\n * This class wraps a function so that we can defer executing the function by X\n * seconds.\n *\n * @final\n */\nshaka.util.DelayedTick = class {\n /**\n * @param {function()} onTick\n */\n constructor(onTick) {\n /** @private {function()} */\n this.onTick_ = onTick;\n\n /** @private {?function()} */\n this.cancelPending_ = null;\n }\n\n /**\n * Call |onTick| after |delayInSeconds| has elapsed. If there is already a\n * pending call to |onTick|, the pending call will be canceled.\n *\n * @param {number} delayInSeconds\n * @return {!shaka.util.DelayedTick}\n */\n tickAfter(delayInSeconds) {\n // We only want one timeout set at a time, so make sure no other timeouts\n // are running.\n this.stop();\n\n // We will wrap these values in a function to allow us to cancel the timeout\n // we are about to create.\n let alive = true;\n let timeoutId = null;\n\n this.cancelPending_ = () => {\n window.clearTimeout(timeoutId);\n alive = false;\n };\n\n // For some reason, a timeout may still execute after we have cleared it in\n // our tests. We will wrap the callback so that we can double-check our\n // |alive| flag.\n const onTick = () => {\n if (alive) {\n this.onTick_();\n }\n };\n\n timeoutId = window.setTimeout(onTick, delayInSeconds * 1000);\n\n return this;\n }\n\n /**\n * Cancel any pending calls to |onTick|. If there are no pending calls to\n * |onTick|, this will be a no-op.\n */\n stop() {\n if (this.cancelPending_) {\n this.cancelPending_();\n this.cancelPending_ = null;\n }\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.Timer');\n\ngoog.require('shaka.util.DelayedTick');\n\n\n/**\n * A timer allows a single function to be executed at a later time or at\n * regular intervals.\n *\n * @final\n * @export\n */\nshaka.util.Timer = class {\n /**\n * Create a new timer. A timer is committed to a single callback function.\n * While there is no technical reason to do this, it is far easier to\n * understand and use timers when they are connected to one functional idea.\n *\n * @param {function()} onTick\n */\n constructor(onTick) {\n /**\n * Each time our timer \"does work\", we call that a \"tick\". The name comes\n * from old analog clocks.\n *\n * @private {function()}\n */\n this.onTick_ = onTick;\n\n /** @private {shaka.util.DelayedTick} */\n this.ticker_ = null;\n }\n\n /**\n * Have the timer call |onTick| now.\n *\n * @return {!shaka.util.Timer}\n * @export\n */\n tickNow() {\n this.stop();\n this.onTick_();\n\n return this;\n }\n\n /**\n * Have the timer call |onTick| after |seconds| has elapsed unless |stop| is\n * called first.\n *\n * @param {number} seconds\n * @return {!shaka.util.Timer}\n * @export\n */\n tickAfter(seconds) {\n this.stop();\n\n this.ticker_ = new shaka.util.DelayedTick(() => {\n this.onTick_();\n }).tickAfter(seconds);\n\n return this;\n }\n\n /**\n * Have the timer call |onTick| every |seconds| until |stop| is called.\n *\n * @param {number} seconds\n * @return {!shaka.util.Timer}\n * @export\n */\n tickEvery(seconds) {\n this.stop();\n\n if (goog.DEBUG) {\n // Capture the stack trace by making a fake error.\n const stackTrace = Error('Timer created').stack;\n shaka.util.Timer.activeTimers.set(this, stackTrace);\n }\n this.ticker_ = new shaka.util.DelayedTick(() => {\n // Schedule the timer again first. |onTick_| could cancel the timer and\n // rescheduling first simplifies the implementation.\n this.ticker_.tickAfter(seconds);\n this.onTick_();\n }).tickAfter(seconds);\n\n return this;\n }\n\n /**\n * Stop the timer and clear the previous behaviour. The timer is still usable\n * after calling |stop|.\n *\n * @export\n */\n stop() {\n if (this.ticker_) {\n this.ticker_.stop();\n this.ticker_ = null;\n }\n if (goog.DEBUG) {\n shaka.util.Timer.activeTimers.delete(this);\n }\n }\n};\n\nif (goog.DEBUG) {\n /**\n * Tracks all active timer instances, along with the stack trace that created\n * that timer.\n * @type {!Map<!shaka.util.Timer, string>}\n */\n shaka.util.Timer.activeTimers = new Map();\n}\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.Platform');\n\ngoog.require('shaka.drm.DrmUtils');\ngoog.require('shaka.log');\ngoog.require('shaka.util.Timer');\n\n\n/**\n * A wrapper for platform-specific functions.\n *\n * @final\n */\nshaka.util.Platform = class {\n /**\n * Check if the current platform supports media source. We assume that if\n * the current platform supports media source, then we can use media source\n * as per its design.\n *\n * @return {boolean}\n */\n static supportsMediaSource() {\n const mediaSource = window.ManagedMediaSource || window.MediaSource;\n // Browsers that lack a media source implementation will have no reference\n // to |window.MediaSource|. Platforms that we see having problematic media\n // source implementations will have this reference removed via a polyfill.\n if (!mediaSource) {\n return false;\n }\n\n // Some very old MediaSource implementations didn't have isTypeSupported.\n if (!mediaSource.isTypeSupported) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Returns true if the media type is supported natively by the platform.\n *\n * @param {string} mimeType\n * @return {boolean}\n */\n static supportsMediaType(mimeType) {\n const video = shaka.util.Platform.anyMediaElement();\n return video.canPlayType(mimeType) != '';\n }\n\n /**\n * Check if the current platform is MS Edge.\n *\n * @return {boolean}\n */\n static isEdge() {\n // Legacy Edge contains \"Edge/version\".\n // Chromium-based Edge contains \"Edg/version\" (no \"e\").\n if (navigator.userAgent.match(/Edge?\\//)) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Check if the current platform is Legacy Edge.\n *\n * @return {boolean}\n */\n static isLegacyEdge() {\n // Legacy Edge contains \"Edge/version\".\n // Chromium-based Edge contains \"Edg/version\" (no \"e\").\n if (navigator.userAgent.match(/Edge\\//)) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Check if the current platform is MS IE.\n *\n * @return {boolean}\n */\n static isIE() {\n return shaka.util.Platform.userAgentContains_('Trident/');\n }\n\n /**\n * Check if the current platform is an Xbox One.\n *\n * @return {boolean}\n */\n static isXboxOne() {\n return shaka.util.Platform.userAgentContains_('Xbox One');\n }\n\n /**\n * Check if the current platform is a Tizen TV.\n *\n * @return {boolean}\n */\n static isTizen() {\n return shaka.util.Platform.userAgentContains_('Tizen');\n }\n\n /**\n * Check if the current platform is a Tizen 6 TV.\n *\n * @return {boolean}\n */\n static isTizen6() {\n return shaka.util.Platform.userAgentContains_('Tizen 6');\n }\n\n /**\n * Check if the current platform is a Tizen 5.0 TV.\n *\n * @return {boolean}\n */\n static isTizen5_0() {\n return shaka.util.Platform.userAgentContains_('Tizen 5.0');\n }\n\n /**\n * Check if the current platform is a Tizen 5 TV.\n *\n * @return {boolean}\n */\n static isTizen5() {\n return shaka.util.Platform.userAgentContains_('Tizen 5');\n }\n\n /**\n * Check if the current platform is a Tizen 4 TV.\n *\n * @return {boolean}\n */\n static isTizen4() {\n return shaka.util.Platform.userAgentContains_('Tizen 4');\n }\n\n /**\n * Check if the current platform is a Tizen 3 TV.\n *\n * @return {boolean}\n */\n static isTizen3() {\n return shaka.util.Platform.userAgentContains_('Tizen 3');\n }\n\n /**\n * Check if the current platform is a Tizen 2 TV.\n *\n * @return {boolean}\n */\n static isTizen2() {\n return shaka.util.Platform.userAgentContains_('Tizen 2');\n }\n\n /**\n * Check if the current platform is a WebOS.\n *\n * @return {boolean}\n */\n static isWebOS() {\n return shaka.util.Platform.userAgentContains_('Web0S');\n }\n\n /**\n * Check if the current platform is a WebOS 3.\n *\n * @return {boolean}\n */\n static isWebOS3() {\n // See: https://webostv.developer.lge.com/develop/specifications/web-api-and-web-engine#useragent-string\n return shaka.util.Platform.isWebOS() &&\n shaka.util.Platform.chromeVersion() === 38;\n }\n\n /**\n * Check if the current platform is a WebOS 4.\n *\n * @return {boolean}\n */\n static isWebOS4() {\n // See: https://webostv.developer.lge.com/develop/specifications/web-api-and-web-engine#useragent-string\n return shaka.util.Platform.isWebOS() &&\n shaka.util.Platform.chromeVersion() === 53;\n }\n\n /**\n * Check if the current platform is a WebOS 5.\n *\n * @return {boolean}\n */\n static isWebOS5() {\n // See: https://webostv.developer.lge.com/develop/specifications/web-api-and-web-engine#useragent-string\n return shaka.util.Platform.isWebOS() &&\n shaka.util.Platform.chromeVersion() === 68;\n }\n\n /**\n * Check if the current platform is a WebOS 6.\n *\n * @return {boolean}\n */\n static isWebOS6() {\n // See: https://webostv.developer.lge.com/develop/specifications/web-api-and-web-engine#useragent-string\n return shaka.util.Platform.isWebOS() &&\n shaka.util.Platform.chromeVersion() === 79;\n }\n\n /**\n * Check if the current platform is a Google Chromecast.\n *\n * @return {boolean}\n */\n static isChromecast() {\n const Platform = shaka.util.Platform;\n return Platform.userAgentContains_('CrKey') && !Platform.isVizio();\n }\n\n /**\n * Check if the current platform is a Google Chromecast without\n * Android or Fuchsia.\n *\n * @return {boolean}\n */\n static isOlderChromecast() {\n const Platform = shaka.util.Platform;\n return Platform.isChromecast() &&\n !Platform.isAndroid() && !Platform.isFuchsia();\n }\n\n /**\n * Check if the current platform is a Google Chromecast with Android\n * (i.e. Chromecast with GoogleTV).\n *\n * @return {boolean}\n */\n static isAndroidCastDevice() {\n const Platform = shaka.util.Platform;\n return Platform.isChromecast() && Platform.isAndroid();\n }\n\n /**\n * Check if the current platform is a Google Chromecast with Fuchsia\n * (i.e. Google Nest Hub).\n *\n * @return {boolean}\n */\n static isFuchsiaCastDevice() {\n const Platform = shaka.util.Platform;\n return Platform.isChromecast() && Platform.isFuchsia();\n }\n\n /**\n * Returns a major version number for Chrome, or Chromium-based browsers.\n *\n * For example:\n * - Chrome 106.0.5249.61 returns 106.\n * - Edge 106.0.1370.34 returns 106 (since this is based on Chromium).\n * - Safari returns null (since this is independent of Chromium).\n *\n * @return {?number} A major version number or null if not Chromium-based.\n */\n static chromeVersion() {\n if (!shaka.util.Platform.isChrome()) {\n return null;\n }\n\n // Looking for something like \"Chrome/106.0.0.0\".\n const match = navigator.userAgent.match(/Chrome\\/(\\d+)/);\n if (match) {\n return parseInt(match[1], /* base= */ 10);\n }\n\n return null;\n }\n\n /**\n * Check if the current platform is Google Chrome.\n *\n * @return {boolean}\n */\n static isChrome() {\n // The Edge Legacy user agent will also contain the \"Chrome\" keyword, so we\n // need to make sure this is not Edge Legacy.\n return shaka.util.Platform.userAgentContains_('Chrome') &&\n !shaka.util.Platform.isLegacyEdge();\n }\n\n /**\n * Check if the current platform is Firefox.\n *\n * @return {boolean}\n */\n static isFirefox() {\n return shaka.util.Platform.userAgentContains_('Firefox');\n }\n\n /**\n * Check if the current platform is from Apple.\n *\n * Returns true on all iOS browsers and on desktop Safari.\n *\n * Returns false for non-Safari browsers on macOS, which are independent of\n * Apple.\n *\n * @return {boolean}\n */\n static isApple() {\n return shaka.util.Platform.isAppleVendor_() &&\n (shaka.util.Platform.isMac() || shaka.util.Platform.isIOS());\n }\n\n /**\n * Check if the current platform is Playstation 5.\n *\n * Returns true on Playstation 5 browsers.\n *\n * Returns false for Playstation 5 browsers\n *\n * @return {boolean}\n */\n static isPS5() {\n return shaka.util.Platform.userAgentContains_('PlayStation 5');\n }\n\n /**\n * Check if the current platform is Playstation 4.\n * @return {boolean}\n */\n static isPS4() {\n return shaka.util.Platform.userAgentContains_('PlayStation 4');\n }\n\n /**\n * Check if the current platform is Hisense.\n * @return {boolean}\n */\n static isHisense() {\n return shaka.util.Platform.userAgentContains_('Hisense') ||\n shaka.util.Platform.userAgentContains_('VIDAA');\n }\n\n /**\n * Check if the current platform is Vizio TV.\n * @return {boolean}\n */\n static isVizio() {\n return shaka.util.Platform.userAgentContains_('VIZIO SmartCast');\n }\n\n /**\n * Check if the current platform is Orange.\n * @return {boolean}\n */\n static isOrange() {\n return shaka.util.Platform.userAgentContains_('SOPOpenBrowser');\n }\n\n /**\n * Check if the current platform is SkyQ STB.\n * @return {boolean}\n */\n static isSkyQ() {\n return shaka.util.Platform.userAgentContains_('Sky_STB');\n }\n\n /**\n * Check if the current platform is Deutsche Telecom Zenterio STB.\n * @return {boolean}\n */\n static isZenterio() {\n return shaka.util.Platform.userAgentContains_('DT_STB_BCM');\n }\n\n /**\n * Returns a major version number for Safari, or Webkit-based STBs,\n * or Safari-based iOS browsers.\n *\n * For example:\n * - Safari 13.0.4 on macOS returns 13.\n * - Safari on iOS 13.3.1 returns 13.\n * - Chrome on iOS 13.3.1 returns 13 (since this is based on Safari/WebKit).\n * - Chrome on macOS returns null (since this is independent of Apple).\n *\n * Returns null on Firefox on iOS, where this version information is not\n * available.\n *\n * @return {?number} A major version number or null if not iOS.\n */\n static safariVersion() {\n // All iOS browsers and desktop Safari will return true for isApple().\n if (!shaka.util.Platform.isApple() && !shaka.util.Platform.isWebkitSTB()) {\n return null;\n }\n\n // This works for iOS Safari and desktop Safari, which contain something\n // like \"Version/13.0\" indicating the major Safari or iOS version.\n let match = navigator.userAgent.match(/Version\\/(\\d+)/);\n if (match) {\n return parseInt(match[1], /* base= */ 10);\n }\n\n // This works for all other browsers on iOS, which contain something like\n // \"OS 13_3\" indicating the major & minor iOS version.\n match = navigator.userAgent.match(/OS (\\d+)(?:_\\d+)?/);\n if (match) {\n return parseInt(match[1], /* base= */ 10);\n }\n\n return null;\n }\n\n /**\n * Guesses if the platform is an Apple mobile one (iOS, iPad, iPod).\n * @return {boolean}\n */\n static isIOS() {\n if (/(?:iPhone|iPad|iPod)/.test(navigator.userAgent)) {\n // This is Android, iOS, or iPad < 13.\n return true;\n }\n\n // Starting with iOS 13 on iPad, the user agent string no longer has the\n // word \"iPad\" in it. It looks very similar to desktop Safari. This seems\n // to be intentional on Apple's part.\n // See: https://forums.developer.apple.com/thread/119186\n //\n // So if it's an Apple device with multi-touch support, assume it's a mobile\n // device. If some future iOS version starts masking their user agent on\n // both iPhone & iPad, this clause should still work. If a future\n // multi-touch desktop Mac is released, this will need some adjustment.\n //\n // As of January 2020, this is mainly used to adjust the default UI config\n // for mobile devices, so it's low risk if something changes to break this\n // detection.\n return shaka.util.Platform.isAppleVendor_() && navigator.maxTouchPoints > 1;\n }\n\n /**\n * Guesses if the platform is a mobile one.\n * @return {boolean}\n */\n static isMobile() {\n if (navigator.userAgentData) {\n return navigator.userAgentData.mobile;\n }\n return shaka.util.Platform.isIOS() || shaka.util.Platform.isAndroid();\n }\n\n /**\n * Return true if the platform is a Mac, regardless of the browser.\n *\n * @return {boolean}\n */\n static isMac() {\n // Try the newer standard first.\n if (navigator.userAgentData && navigator.userAgentData.platform) {\n return navigator.userAgentData.platform.toLowerCase() == 'macos';\n }\n // Fall back to the old API, with less strict matching.\n if (!navigator.platform) {\n return false;\n }\n return navigator.platform.toLowerCase().includes('mac');\n }\n\n /**\n * Return true if the platform is a VisionOS.\n *\n * @return {boolean}\n */\n static isVisionOS() {\n if (!shaka.util.Platform.isMac()) {\n return false;\n }\n if (!('xr' in navigator)) {\n return false;\n }\n return true;\n }\n\n /**\n * Checks is non-Apple STB based on Webkit.\n * @return {boolean}\n */\n static isWebkitSTB() {\n return shaka.util.Platform.isAppleVendor_() &&\n !shaka.util.Platform.isApple();\n }\n\n /**\n * Return true if the platform is a Windows, regardless of the browser.\n *\n * @return {boolean}\n */\n static isWindows() {\n // Try the newer standard first.\n if (navigator.userAgentData && navigator.userAgentData.platform) {\n return navigator.userAgentData.platform.toLowerCase() == 'windows';\n }\n // Fall back to the old API, with less strict matching.\n if (!navigator.platform) {\n return false;\n }\n return navigator.platform.toLowerCase().includes('win32');\n }\n\n /**\n * Return true if the platform is a Android, regardless of the browser.\n *\n * @return {boolean}\n */\n static isAndroid() {\n if (navigator.userAgentData && navigator.userAgentData.platform) {\n return navigator.userAgentData.platform.toLowerCase() == 'android';\n }\n return shaka.util.Platform.userAgentContains_('Android');\n }\n\n /**\n * Return true if the platform is a Fuchsia, regardless of the browser.\n *\n * @return {boolean}\n */\n static isFuchsia() {\n if (navigator.userAgentData && navigator.userAgentData.platform) {\n return navigator.userAgentData.platform.toLowerCase() == 'fuchsia';\n }\n return shaka.util.Platform.userAgentContains_('Fuchsia');\n }\n\n /**\n * Return true if the platform is controlled by a remote control.\n *\n * @return {boolean}\n */\n static isSmartTV() {\n const Platform = shaka.util.Platform;\n if (Platform.isTizen() || Platform.isWebOS() ||\n Platform.isXboxOne() || Platform.isPS4() ||\n Platform.isPS5() || Platform.isChromecast() ||\n Platform.isHisense() || Platform.isVizio() ||\n Platform.isWebkitSTB()) {\n return true;\n }\n return false;\n }\n\n /**\n * Check if the user agent contains a key. This is the best way we know of\n * right now to detect platforms. If there is a better way, please send a\n * PR.\n *\n * @param {string} key\n * @return {boolean}\n * @private\n */\n static userAgentContains_(key) {\n const userAgent = navigator.userAgent || '';\n return userAgent.includes(key);\n }\n\n /**\n * @return {boolean}\n * @private\n */\n static isAppleVendor_() {\n return (navigator.vendor || '').includes('Apple');\n }\n\n /**\n * For canPlayType queries, we just need any instance.\n *\n * First, use a cached element from a previous query.\n * Second, search the page for one.\n * Third, create a temporary one.\n *\n * Cached elements expire in one second so that they can be GC'd or removed.\n *\n * @return {!HTMLMediaElement}\n */\n static anyMediaElement() {\n const Platform = shaka.util.Platform;\n if (Platform.cachedMediaElement_) {\n return Platform.cachedMediaElement_;\n }\n\n if (!Platform.cacheExpirationTimer_) {\n Platform.cacheExpirationTimer_ = new shaka.util.Timer(() => {\n Platform.cachedMediaElement_ = null;\n });\n }\n\n Platform.cachedMediaElement_ = /** @type {HTMLMediaElement} */(\n document.getElementsByTagName('video')[0] ||\n document.getElementsByTagName('audio')[0]);\n\n if (!Platform.cachedMediaElement_) {\n Platform.cachedMediaElement_ = /** @type {!HTMLMediaElement} */(\n document.createElement('video'));\n }\n\n Platform.cacheExpirationTimer_.tickAfter(/* seconds= */ 1);\n return Platform.cachedMediaElement_;\n }\n\n /**\n * Returns true if the platform requires encryption information in all init\n * segments. For such platforms, MediaSourceEngine will attempt to work\n * around a lack of such info by inserting fake encryption information into\n * initialization segments.\n *\n * @param {?string} keySystem\n * @return {boolean}\n * @see https://github.com/shaka-project/shaka-player/issues/2759\n */\n static requiresEncryptionInfoInAllInitSegments(keySystem) {\n const Platform = shaka.util.Platform;\n const isPlayReady = shaka.drm.DrmUtils.isPlayReadyKeySystem(keySystem);\n return Platform.isTizen() || Platform.isXboxOne() || Platform.isOrange() ||\n (Platform.isEdge() && Platform.isWindows() && isPlayReady);\n }\n\n /**\n * Returns true if the platform requires AC-3 signalling in init\n * segments to be replaced with EC-3 signalling.\n * For such platforms, MediaSourceEngine will attempt to work\n * around it by inserting fake EC-3 signalling into\n * initialization segments.\n *\n * @return {boolean}\n */\n static requiresEC3InitSegments() {\n return shaka.util.Platform.isTizen3();\n }\n\n /**\n * Returns true if the platform supports SourceBuffer \"sequence mode\".\n *\n * @return {boolean}\n */\n static supportsSequenceMode() {\n const Platform = shaka.util.Platform;\n if (Platform.isTizen3() || Platform.isTizen2() ||\n Platform.isWebOS3() || Platform.isPS4() || Platform.isPS5()) {\n return false;\n }\n // See: https://bugs.webkit.org/show_bug.cgi?id=210341\n const safariVersion = Platform.safariVersion();\n if (Platform.isWebkitSTB() && safariVersion != null && safariVersion < 15) {\n return false;\n }\n return true;\n }\n\n /**\n * Returns if codec switching SMOOTH is known reliable device support.\n *\n * Some devices are known not to support <code>SourceBuffer.changeType</code>\n * well. These devices should use the reload strategy. If a device\n * reports that it supports <code<changeType</code> but supports it unreliably\n * it should be disallowed in this method.\n *\n * @return {boolean}\n */\n static supportsSmoothCodecSwitching() {\n const Platform = shaka.util.Platform;\n // All Tizen versions (up to Tizen 8) do not support SMOOTH so far.\n // webOS seems to support SMOOTH from webOS 22.\n if (Platform.isTizen() || Platform.isPS4() || Platform.isPS5() ||\n Platform.isWebOS6()) {\n return false;\n }\n // Older chromecasts without GoogleTV seem to not support SMOOTH properly.\n if (Platform.isOlderChromecast()) {\n return false;\n }\n // See: https://chromium-review.googlesource.com/c/chromium/src/+/4577759\n if (Platform.isWindows() && Platform.isEdge()) {\n return false;\n }\n return true;\n }\n\n /**\n * On some platforms, such as v1 Chromecasts, the act of seeking can take a\n * significant amount of time.\n *\n * @return {boolean}\n */\n static isSeekingSlow() {\n const Platform = shaka.util.Platform;\n if (Platform.isChromecast()) {\n if (Platform.isAndroidCastDevice()) {\n // Android-based Chromecasts are new enough to not be a problem.\n return false;\n } else {\n return true;\n }\n }\n return false;\n }\n\n\n /**\n * Detect the maximum resolution that the platform's hardware can handle.\n *\n * @return {!Promise<shaka.extern.Resolution>}\n */\n static async detectMaxHardwareResolution() {\n const Platform = shaka.util.Platform;\n\n /** @type {shaka.extern.Resolution} */\n const maxResolution = {\n width: Infinity,\n height: Infinity,\n };\n\n if (Platform.isChromecast()) {\n // In our tests, the original Chromecast seems to have trouble decoding\n // above 1080p. It would be a waste to select a higher res anyway, given\n // that the device only outputs 1080p to begin with.\n // Chromecast has an extension to query the device/display's resolution.\n const hasCanDisplayType = window.cast && cast.__platform__ &&\n cast.__platform__.canDisplayType;\n\n // Some hub devices can only do 720p. Default to that.\n maxResolution.width = 1280;\n maxResolution.height = 720;\n\n try {\n if (hasCanDisplayType && await cast.__platform__.canDisplayType(\n 'video/mp4; codecs=\"avc1.640028\"; width=3840; height=2160')) {\n // The device and display can both do 4k. Assume a 4k limit.\n maxResolution.width = 3840;\n maxResolution.height = 2160;\n } else if (hasCanDisplayType && await cast.__platform__.canDisplayType(\n 'video/mp4; codecs=\"avc1.640028\"; width=1920; height=1080')) {\n // Most Chromecasts can do 1080p.\n maxResolution.width = 1920;\n maxResolution.height = 1080;\n }\n } catch (error) {\n // This shouldn't generally happen. Log the error.\n shaka.log.alwaysError('Failed to check canDisplayType:', error);\n // Now ignore the error and let the 720p default stand.\n }\n } else if (Platform.isTizen()) {\n maxResolution.width = 1920;\n maxResolution.height = 1080;\n try {\n if (webapis.systeminfo && webapis.systeminfo.getMaxVideoResolution) {\n const maxVideoResolution =\n webapis.systeminfo.getMaxVideoResolution();\n maxResolution.width = maxVideoResolution.width;\n maxResolution.height = maxVideoResolution.height;\n } else {\n if (webapis.productinfo.is8KPanelSupported &&\n webapis.productinfo.is8KPanelSupported()) {\n maxResolution.width = 7680;\n maxResolution.height = 4320;\n } else if (webapis.productinfo.isUdPanelSupported &&\n webapis.productinfo.isUdPanelSupported()) {\n maxResolution.width = 3840;\n maxResolution.height = 2160;\n }\n }\n } catch (e) {\n shaka.log.alwaysWarn('Tizen: Error detecting screen size, default ' +\n 'screen size 1920x1080.');\n }\n } else if (Platform.isWebOS()) {\n try {\n const deviceInfo =\n /** @type {{screenWidth: number, screenHeight: number}} */(\n JSON.parse(window.PalmSystem.deviceInfo));\n // WebOS has always been able to do 1080p. Assume a 1080p limit.\n maxResolution.width = Math.max(1920, deviceInfo['screenWidth']);\n maxResolution.height = Math.max(1080, deviceInfo['screenHeight']);\n } catch (e) {\n shaka.log.alwaysWarn('WebOS: Error detecting screen size, default ' +\n 'screen size 1920x1080.');\n maxResolution.width = 1920;\n maxResolution.height = 1080;\n }\n } else if (Platform.isHisense()) {\n let supports4k = null;\n if (window.Hisense_Get4KSupportState) {\n try {\n // eslint-disable-next-line new-cap\n supports4k = window.Hisense_Get4KSupportState();\n } catch (e) {\n shaka.log.debug('Hisense: Failed to get 4K support state', e);\n }\n }\n if (supports4k == null) {\n // If API is not there or not working for whatever reason, fallback to\n // user agent check, as it contains UHD or FHD info.\n supports4k = Platform.userAgentContains_('UHD');\n }\n if (supports4k) {\n maxResolution.width = 3840;\n maxResolution.height = 2160;\n } else {\n maxResolution.width = 1920;\n maxResolution.height = 1080;\n }\n } else if (Platform.isPS4() || Platform.isPS5()) {\n let supports4K = false;\n try {\n const result = await window.msdk.device.getDisplayInfo();\n supports4K = result.resolution === '4K';\n } catch (e) {\n try {\n const result = await window.msdk.device.getDisplayInfoImmediate();\n supports4K = result.resolution === '4K';\n } catch (e) {\n shaka.log.alwaysWarn(\n 'PlayStation: Failed to get the display info:', e);\n }\n }\n if (supports4K) {\n maxResolution.width = 3840;\n maxResolution.height = 2160;\n } else {\n maxResolution.width = 1920;\n maxResolution.height = 1080;\n }\n } else {\n // For Xbox and UWP apps.\n let winRT = undefined;\n try {\n // Try to access to WinRT for WebView, if it's not defined,\n // try to access to WinRT for WebView2, if it's not defined either,\n // let it throw.\n if (typeof Windows !== 'undefined') {\n winRT = Windows;\n } else {\n winRT = chrome.webview.hostObjects.sync.Windows;\n }\n } catch (e) {}\n if (winRT) {\n maxResolution.width = 1920;\n maxResolution.height = 1080;\n try {\n const protectionCapabilities =\n new winRT.Media.Protection.ProtectionCapabilities();\n const protectionResult =\n winRT.Media.Protection.ProtectionCapabilityResult;\n // isTypeSupported may return \"maybe\", which means the operation\n // is not completed. This means we need to retry\n // https://learn.microsoft.com/en-us/uwp/api/windows.media.protection.protectioncapabilityresult?view=winrt-22621\n let result = null;\n const type =\n 'video/mp4;codecs=\"hvc1,mp4a\";features=\"decode-res-x=3840,' +\n 'decode-res-y=2160,decode-bitrate=20000,decode-fps=30,' +\n 'decode-bpc=10,display-res-x=3840,display-res-y=2160,' +\n 'display-bpc=8\"';\n const keySystem = 'com.microsoft.playready.recommendation';\n do {\n result = protectionCapabilities.isTypeSupported(type, keySystem);\n } while (result === protectionResult.maybe);\n if (result === protectionResult.probably) {\n maxResolution.width = 3840;\n maxResolution.height = 2160;\n }\n } catch (e) {\n shaka.log.alwaysWarn('Xbox: Error detecting screen size, default ' +\n 'screen size 1920x1080.');\n }\n } else if (Platform.isXboxOne()) {\n maxResolution.width = 1920;\n maxResolution.height = 1080;\n shaka.log.alwaysWarn('Xbox: Error detecting screen size, default ' +\n 'screen size 1920x1080.');\n }\n }\n return maxResolution;\n }\n};\n\n/** @private {shaka.util.Timer} */\nshaka.util.Platform.cacheExpirationTimer_ = null;\n\n/** @private {HTMLMediaElement} */\nshaka.util.Platform.cachedMediaElement_ = null;\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.StringUtils');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.log');\ngoog.require('shaka.util.BufferUtils');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.Lazy');\ngoog.require('shaka.util.Platform');\n\n\n/**\n * @namespace shaka.util.StringUtils\n * @summary A set of string utility functions.\n * @export\n */\nshaka.util.StringUtils = class {\n /**\n * Creates a string from the given buffer as UTF-8 encoding.\n *\n * @param {?BufferSource} data\n * @return {string}\n * @export\n */\n static fromUTF8(data) {\n if (!data) {\n return '';\n }\n\n let uint8 = shaka.util.BufferUtils.toUint8(data);\n // If present, strip off the UTF-8 BOM.\n if (uint8[0] == 0xef && uint8[1] == 0xbb && uint8[2] == 0xbf) {\n uint8 = uint8.subarray(3);\n }\n\n if (window.TextDecoder && !shaka.util.Platform.isPS4()) {\n // Use the TextDecoder interface to decode the text. This has the\n // advantage compared to the previously-standard decodeUriComponent that\n // it will continue parsing even if it finds an invalid UTF8 character,\n // rather than stop and throw an error.\n const utf8decoder = new TextDecoder();\n const decoded = utf8decoder.decode(uint8);\n if (decoded.includes('\\uFFFD')) {\n shaka.log.alwaysError('Decoded string contains an \"unknown character' +\n '\" codepoint. That probably means the UTF8 ' +\n 'encoding was incorrect!');\n }\n return decoded;\n } else {\n // Homebrewed UTF-8 decoder based on\n // https://en.wikipedia.org/wiki/UTF-8#Encoding\n // Unlike decodeURIComponent, won't throw on bad encoding.\n // In this way, it is similar to TextDecoder.\n\n let decoded = '';\n for (let i = 0; i < uint8.length; ++i) {\n // By default, the \"replacement character\" codepoint.\n let codePoint = 0xFFFD;\n\n // Top bit is 0, 1-byte encoding.\n if ((uint8[i] & 0x80) == 0) {\n codePoint = uint8[i];\n\n // Top 3 bits of byte 0 are 110, top 2 bits of byte 1 are 10,\n // 2-byte encoding.\n } else if (uint8.length >= i + 2 &&\n (uint8[i] & 0xe0) == 0xc0 &&\n (uint8[i + 1] & 0xc0) == 0x80) {\n codePoint = ((uint8[i] & 0x1f) << 6) |\n ((uint8[i + 1] & 0x3f));\n i += 1; // Consume one extra byte.\n\n // Top 4 bits of byte 0 are 1110, top 2 bits of byte 1 and 2 are 10,\n // 3-byte encoding.\n } else if (uint8.length >= i + 3 &&\n (uint8[i] & 0xf0) == 0xe0 &&\n (uint8[i + 1] & 0xc0) == 0x80 &&\n (uint8[i + 2] & 0xc0) == 0x80) {\n codePoint = ((uint8[i] & 0x0f) << 12) |\n ((uint8[i + 1] & 0x3f) << 6) |\n ((uint8[i + 2] & 0x3f));\n i += 2; // Consume two extra bytes.\n\n // Top 5 bits of byte 0 are 11110, top 2 bits of byte 1, 2 and 3 are 10,\n // 4-byte encoding.\n } else if (uint8.length >= i + 4 &&\n (uint8[i] & 0xf1) == 0xf0 &&\n (uint8[i + 1] & 0xc0) == 0x80 &&\n (uint8[i + 2] & 0xc0) == 0x80 &&\n (uint8[i + 3] & 0xc0) == 0x80) {\n codePoint = ((uint8[i] & 0x07) << 18) |\n ((uint8[i + 1] & 0x3f) << 12) |\n ((uint8[i + 2] & 0x3f) << 6) |\n ((uint8[i + 3] & 0x3f));\n i += 3; // Consume three extra bytes.\n }\n\n // JavaScript strings are a series of UTF-16 characters.\n if (codePoint <= 0xffff) {\n decoded += String.fromCharCode(codePoint);\n } else {\n // UTF-16 surrogate-pair encoding, based on\n // https://en.wikipedia.org/wiki/UTF-16#Description\n const baseCodePoint = codePoint - 0x10000;\n const highPart = baseCodePoint >> 10;\n const lowPart = baseCodePoint & 0x3ff;\n decoded += String.fromCharCode(0xd800 + highPart);\n decoded += String.fromCharCode(0xdc00 + lowPart);\n }\n }\n\n return decoded;\n }\n }\n\n\n /**\n * Creates a string from the given buffer as UTF-16 encoding.\n *\n * @param {?BufferSource} data\n * @param {boolean} littleEndian\n true to read little endian, false to read big.\n * @param {boolean=} noThrow true to avoid throwing in cases where we may\n * expect invalid input. If noThrow is true and the data has an odd\n * length,it will be truncated.\n * @return {string}\n * @export\n */\n static fromUTF16(data, littleEndian, noThrow) {\n if (!data) {\n return '';\n }\n\n if (!noThrow && data.byteLength % 2 != 0) {\n shaka.log.error('Data has an incorrect length, must be even.');\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL, shaka.util.Error.Category.TEXT,\n shaka.util.Error.Code.BAD_ENCODING);\n }\n\n // Use a DataView to ensure correct endianness.\n const length = Math.floor(data.byteLength / 2);\n const arr = new Uint16Array(length);\n const dataView = shaka.util.BufferUtils.toDataView(data);\n for (let i = 0; i < length; i++) {\n arr[i] = dataView.getUint16(i * 2, littleEndian);\n }\n return shaka.util.StringUtils.fromCharCode(arr);\n }\n\n\n /**\n * Creates a string from the given buffer, auto-detecting the encoding that is\n * being used. If it cannot detect the encoding, it will throw an exception.\n *\n * @param {?BufferSource} data\n * @return {string}\n * @export\n */\n static fromBytesAutoDetect(data) {\n const StringUtils = shaka.util.StringUtils;\n if (!data) {\n return '';\n }\n\n const uint8 = shaka.util.BufferUtils.toUint8(data);\n if (uint8[0] == 0xef && uint8[1] == 0xbb && uint8[2] == 0xbf) {\n return StringUtils.fromUTF8(uint8);\n } else if (uint8[0] == 0xfe && uint8[1] == 0xff) {\n return StringUtils.fromUTF16(\n uint8.subarray(2), /* littleEndian= */ false);\n } else if (uint8[0] == 0xff && uint8[1] == 0xfe) {\n return StringUtils.fromUTF16(uint8.subarray(2), /* littleEndian= */ true);\n }\n\n const isAscii = (i) => {\n // arr[i] >= ' ' && arr[i] <= '~';\n return uint8.byteLength <= i || (uint8[i] >= 0x20 && uint8[i] <= 0x7e);\n };\n\n shaka.log.debug(\n 'Unable to find byte-order-mark, making an educated guess.');\n if (uint8[0] == 0 && uint8[2] == 0) {\n return StringUtils.fromUTF16(data, /* littleEndian= */ false);\n } else if (uint8[1] == 0 && uint8[3] == 0) {\n return StringUtils.fromUTF16(data, /* littleEndian= */ true);\n } else if (isAscii(0) && isAscii(1) && isAscii(2) && isAscii(3)) {\n return StringUtils.fromUTF8(data);\n }\n\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.TEXT,\n shaka.util.Error.Code.UNABLE_TO_DETECT_ENCODING);\n }\n\n\n /**\n * Creates a ArrayBuffer from the given string, converting to UTF-8 encoding.\n *\n * @param {string} str\n * @return {!ArrayBuffer}\n * @export\n */\n static toUTF8(str) {\n if (window.TextEncoder && !shaka.util.Platform.isPS4()) {\n const utf8Encoder = new TextEncoder();\n return shaka.util.BufferUtils.toArrayBuffer(utf8Encoder.encode(str));\n } else {\n // http://stackoverflow.com/a/13691499\n // Converts the given string to a URI encoded string. If a character\n // falls in the ASCII range, it is not converted; otherwise it will be\n // converted to a series of URI escape sequences according to UTF-8.\n // Example: 'g#€' -> 'g#%E3%82%AC'\n const encoded = encodeURIComponent(str);\n // Convert each escape sequence individually into a character. Each\n // escape sequence is interpreted as a code-point, so if an escape\n // sequence happens to be part of a multi-byte sequence, each byte will\n // be converted to a single character.\n // Example: 'g#%E3%82%AC' -> '\\x67\\x35\\xe3\\x82\\xac'\n const utf8 = unescape(encoded);\n\n const result = new Uint8Array(utf8.length);\n for (let i = 0; i < utf8.length; i++) {\n const item = utf8[i];\n result[i] = item.charCodeAt(0);\n }\n return shaka.util.BufferUtils.toArrayBuffer(result);\n }\n }\n\n\n /**\n * Creates a ArrayBuffer from the given string, converting to UTF-16 encoding.\n *\n * @param {string} str\n * @param {boolean} littleEndian\n * @return {!ArrayBuffer}\n * @export\n */\n static toUTF16(str, littleEndian) {\n const result = new ArrayBuffer(str.length * 2);\n const view = new DataView(result);\n for (let i = 0; i < str.length; ++i) {\n const value = str.charCodeAt(i);\n view.setUint16(/* position= */ i * 2, value, littleEndian);\n }\n return result;\n }\n\n\n /**\n * Creates a new string from the given array of char codes.\n *\n * Using String.fromCharCode.apply is risky because you can trigger stack\n * errors on very large arrays. This breaks up the array into several pieces\n * to avoid this.\n *\n * @param {!TypedArray} array\n * @return {string}\n */\n static fromCharCode(array) {\n return shaka.util.StringUtils.fromCharCodeImpl_.value()(array);\n }\n\n /**\n * Resets the fromCharCode method's implementation.\n * For debug use.\n * @export\n */\n static resetFromCharCode() {\n shaka.util.StringUtils.fromCharCodeImpl_.reset();\n }\n\n /**\n * This method converts the HTML entities &, <, >, ", ',\n *  , ‎ and ‏ in string to their corresponding characters.\n *\n * @param {!string} input\n * @return {string}\n */\n static htmlUnescape(input) {\n // Used to map HTML entities to characters.\n const htmlUnescapes = {\n '&': '&',\n '<': '<',\n '>': '>',\n '"': '\"',\n ''': '\\'',\n ' ': '\\u{a0}',\n '‎': '\\u{200e}',\n '‏': '\\u{200f}',\n };\n\n // Used to match HTML entities and HTML characters.\n const reEscapedHtml =\n /&(?:amp|lt|gt|quot|apos|nbsp|lrm|rlm|#[xX]?[0-9a-fA-F]+);/g;\n const reHasEscapedHtml = RegExp(reEscapedHtml.source);\n // This check is an optimization, since replace always makes a copy\n if (input && reHasEscapedHtml.test(input)) {\n return input.replace(reEscapedHtml, (entity) => {\n if (entity[1] == '#') {\n // Translate this into an HTML character.\n let code = 0;\n if (entity[2] == 'x' || entity[2] == 'X') {\n // It's hex.\n code = parseInt(entity.substring(3), 16);\n } else {\n // It's decimal.\n code = parseInt(entity.substring(2), 10);\n }\n // Ignore it if it's an invalid code point.\n if (code >= 0 && code <= 0x10FFFF) {\n return String.fromCodePoint(code);\n } else {\n return '';\n }\n }\n // The only thing that might not match the dictionary above is the\n // single quote, which can be matched by many strings in the regex, but\n // only has a single entry in the dictionary.\n return htmlUnescapes[entity] || '\\'';\n });\n }\n return input || '';\n }\n};\n\n\n/** @private {!shaka.util.Lazy.<function(!TypedArray):string>} */\nshaka.util.StringUtils.fromCharCodeImpl_ = new shaka.util.Lazy(() => {\n /**\n * @param {number} size\n * @return {boolean}\n */\n const supportsChunkSize = (size) => {\n try {\n // The compiler will complain about suspicious value if this isn't\n // stored in a variable and used.\n const buffer = new Uint8Array(size);\n\n // This can't use the spread operator, or it blows up on Xbox One.\n // So we use apply() instead, which is normally not allowed.\n // See issue #2186 for more details.\n const foo = String.fromCharCode.apply(null, buffer);\n goog.asserts.assert(foo, 'Should get value');\n return foo.length > 0; // Actually use \"foo\", so it's not compiled out.\n } catch (error) {\n return false;\n }\n };\n\n // Different browsers support different chunk sizes; find out the largest\n // this browser supports so we can use larger chunks on supported browsers\n // but still support lower-end devices that require small chunks.\n // 64k is supported on all major desktop browsers.\n for (let size = 64 * 1024; size > 0; size /= 2) {\n if (supportsChunkSize(size)) {\n return (buffer) => {\n let ret = '';\n for (let i = 0; i < buffer.length; i += size) {\n const subArray = buffer.subarray(i, i + size);\n\n // This can't use the spread operator, or it blows up on Xbox One.\n // So we use apply() instead, which is normally not allowed.\n // See issue #2186 for more details.\n ret += String.fromCharCode.apply(null, subArray); // Issue #2186\n }\n return ret;\n };\n }\n }\n goog.asserts.assert(false, 'Unable to create a fromCharCode method');\n return null;\n});\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.Uint8ArrayUtils');\n\ngoog.require('shaka.util.BufferUtils');\ngoog.require('shaka.util.StringUtils');\n\n\n// TODO: revisit this when Closure Compiler supports partially-exported classes.\n/**\n * @summary A set of Uint8Array utility functions.\n * @export\n */\nshaka.util.Uint8ArrayUtils = class {\n /**\n * Convert a buffer to a base64 string. The output will be standard\n * alphabet as opposed to base64url safe alphabet.\n * @param {BufferSource} data\n * @return {string}\n * @export\n */\n static toStandardBase64(data) {\n const bytes = shaka.util.StringUtils.fromCharCode(\n shaka.util.BufferUtils.toUint8(data));\n return btoa(bytes);\n }\n\n /**\n * Convert a buffer to a base64 string. The output will always use the\n * alternate encoding/alphabet also known as \"base64url\".\n * @param {BufferSource} data\n * @param {boolean=} padding If true, pad the output with equals signs.\n * Defaults to true.\n * @return {string}\n * @export\n */\n static toBase64(data, padding) {\n padding = (padding == undefined) ? true : padding;\n const base64 = shaka.util.Uint8ArrayUtils.toStandardBase64(data)\n .replace(/\\+/g, '-').replace(/\\//g, '_');\n return padding ? base64 : base64.replace(/[=]*$/, '');\n }\n\n /**\n * Convert a base64 string to a Uint8Array. Accepts either the standard\n * alphabet or the alternate \"base64url\" alphabet.\n * @param {string} str\n * @return {!Uint8Array}\n * @export\n */\n static fromBase64(str) {\n // atob creates a \"raw string\" where each character is interpreted as a\n // byte.\n const bytes = window.atob(str.replace(/-/g, '+').replace(/_/g, '/'));\n const result = new Uint8Array(bytes.length);\n for (let i = 0; i < bytes.length; ++i) {\n result[i] = bytes.charCodeAt(i);\n }\n return result;\n }\n\n\n /**\n * Convert a hex string to a Uint8Array.\n * @param {string} str\n * @return {!Uint8Array}\n * @export\n */\n static fromHex(str) {\n const size = str.length / 2;\n const arr = new Uint8Array(size);\n for (let i = 0; i < size; i++) {\n arr[i] = window.parseInt(str.substr(i * 2, 2), 16);\n }\n return arr;\n }\n\n\n /**\n * Convert a buffer to a hex string.\n * @param {BufferSource} data\n * @return {string}\n * @export\n */\n static toHex(data) {\n const arr = shaka.util.BufferUtils.toUint8(data);\n let hex = '';\n for (let value of arr) {\n value = value.toString(16);\n if (value.length == 1) {\n value = '0' + value;\n }\n hex += value;\n }\n return hex;\n }\n\n\n /**\n * Concatenate buffers.\n * @param {...BufferSource} varArgs\n * @return {!Uint8Array}\n * @export\n */\n static concat(...varArgs) {\n const BufferUtils = shaka.util.BufferUtils;\n let totalLength = 0;\n for (let i = 0; i < varArgs.length; ++i) {\n const value = varArgs[i];\n totalLength += value.byteLength;\n }\n\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n for (let i = 0; i < varArgs.length; ++i) {\n const value = varArgs[i];\n if (ArrayBuffer.isView(value) &&\n /** @type {TypedArray} */ (value).BYTES_PER_ELEMENT === 1) {\n result.set(/** @type {!Uint8Array} */(value), offset);\n } else {\n result.set(BufferUtils.toUint8(value), offset);\n }\n offset += value.byteLength;\n }\n\n return result;\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.ManifestParserUtils');\n\ngoog.require('goog.Uri');\ngoog.require('shaka.util.BufferUtils');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.StringUtils');\ngoog.require('shaka.util.Uint8ArrayUtils');\n\n\n/**\n * @summary Utility functions for manifest parsing.\n */\nshaka.util.ManifestParserUtils = class {\n /**\n * Resolves an array of relative URIs to the given base URIs. This will result\n * in M*N number of URIs.\n *\n * Note: This method is slow in SmartTVs and Consoles. It should only be\n * called when necessary.\n *\n * @param {!Array<string>} baseUris\n * @param {!Array<string>} relativeUris\n * @param {string=} extraQueryParams\n * @return {!Array<string>}\n */\n static resolveUris(baseUris, relativeUris, extraQueryParams = '') {\n if (relativeUris.length == 0) {\n return baseUris;\n }\n\n if (baseUris.length == 1 && relativeUris.length == 1) {\n const baseUri = new goog.Uri(baseUris[0]);\n const relativeUri = new goog.Uri(relativeUris[0]);\n const resolvedUri = baseUri.resolve(relativeUri);\n if (extraQueryParams) {\n resolvedUri.setQueryData(extraQueryParams);\n }\n return [resolvedUri.toString()];\n }\n\n const relativeAsGoog = relativeUris.map((uri) => new goog.Uri(uri));\n\n // For each base URI, this code resolves it with every relative URI.\n // The result is a single array containing all the resolved URIs.\n const resolvedUris = [];\n for (const baseStr of baseUris) {\n const base = new goog.Uri(baseStr);\n for (const relative of relativeAsGoog) {\n const resolvedUri = base.resolve(relative);\n if (extraQueryParams) {\n resolvedUri.setQueryData(extraQueryParams);\n }\n resolvedUris.push(resolvedUri.toString());\n }\n }\n\n return resolvedUris;\n }\n\n\n /**\n * Creates a DrmInfo object from the given info.\n *\n * @param {string} keySystem\n * @param {string} encryptionScheme\n * @param {Array<shaka.extern.InitDataOverride>} initData\n * @param {string} [keySystemUri]\n * @return {shaka.extern.DrmInfo}\n */\n static createDrmInfo(keySystem, encryptionScheme, initData, keySystemUri) {\n const drmInfo = {\n keySystem,\n encryptionScheme,\n licenseServerUri: '',\n distinctiveIdentifierRequired: false,\n persistentStateRequired: false,\n audioRobustness: '',\n videoRobustness: '',\n serverCertificate: null,\n serverCertificateUri: '',\n sessionType: '',\n initData: initData || [],\n keyIds: new Set(),\n };\n\n if (keySystemUri) {\n drmInfo.keySystemUris = new Set([keySystemUri]);\n }\n\n return drmInfo;\n }\n\n /**\n * Creates a DrmInfo object from ClearKeys.\n *\n * @param {!Map<string, string>} clearKeys\n * @param {string=} encryptionScheme\n * @return {shaka.extern.DrmInfo}\n */\n static createDrmInfoFromClearKeys(clearKeys, encryptionScheme = 'cenc') {\n const StringUtils = shaka.util.StringUtils;\n const Uint8ArrayUtils = shaka.util.Uint8ArrayUtils;\n const keys = [];\n const keyIds = [];\n const originalKeyIds = [];\n\n clearKeys.forEach((key, keyId) => {\n let kid = keyId;\n if (kid.length != 22) {\n kid = Uint8ArrayUtils.toBase64(\n Uint8ArrayUtils.fromHex(keyId), false);\n }\n let k = key;\n if (k.length != 22) {\n k = Uint8ArrayUtils.toBase64(\n Uint8ArrayUtils.fromHex(key), false);\n }\n const keyObj = {\n kty: 'oct',\n kid: kid,\n k: k,\n };\n\n keys.push(keyObj);\n keyIds.push(keyObj.kid);\n originalKeyIds.push(keyId);\n });\n\n const jwkSet = {keys: keys};\n const license = JSON.stringify(jwkSet);\n\n // Use the keyids init data since is suggested by EME.\n // Suggestion: https://bit.ly/2JYcNTu\n // Format: https://www.w3.org/TR/eme-initdata-keyids/\n const initDataStr = JSON.stringify({'kids': keyIds});\n const initData =\n shaka.util.BufferUtils.toUint8(StringUtils.toUTF8(initDataStr));\n const initDatas = [{initData: initData, initDataType: 'keyids'}];\n\n return {\n keySystem: 'org.w3.clearkey',\n encryptionScheme,\n licenseServerUri: 'data:application/json;base64,' + window.btoa(license),\n distinctiveIdentifierRequired: false,\n persistentStateRequired: false,\n audioRobustness: '',\n videoRobustness: '',\n serverCertificate: null,\n serverCertificateUri: '',\n sessionType: '',\n initData: initDatas,\n keyIds: new Set(originalKeyIds),\n };\n }\n\n\n /**\n * Attempts to guess which codecs from the codecs list belong to a given\n * content type.\n * Assumes that at least one codec is correct, and throws if none are.\n *\n * @param {string} contentType\n * @param {!Array<string>} codecs\n * @return {string}\n */\n static guessCodecs(contentType, codecs) {\n if (codecs.length == 1) {\n return codecs[0];\n }\n\n const match = shaka.util.ManifestParserUtils.guessCodecsSafe(\n contentType, codecs);\n // A failure is specifically denoted by null; an empty string represents a\n // valid match of no codec.\n if (match != null) {\n return match;\n }\n\n // Unable to guess codecs.\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.HLS_COULD_NOT_GUESS_CODECS,\n codecs);\n }\n\n\n /**\n * Attempts to guess which codecs from the codecs list belong to a given\n * content type. Does not assume a single codec is anything special, and does\n * not throw if it fails to match.\n *\n * @param {string} contentType\n * @param {!Array<string>} codecs\n * @return {?string} or null if no match is found\n */\n static guessCodecsSafe(contentType, codecs) {\n const formats = shaka.util.ManifestParserUtils\n .CODEC_REGEXPS_BY_CONTENT_TYPE_.get(contentType);\n for (const format of formats) {\n for (const codec of codecs) {\n if (format.test(codec.trim())) {\n return codec.trim();\n }\n }\n }\n\n // Text does not require a codec string.\n if (contentType == shaka.util.ManifestParserUtils.ContentType.TEXT) {\n return '';\n }\n\n return null;\n }\n\n\n /**\n * Attempts to guess which codecs from the codecs list belong to a given\n * content.\n *\n * @param {string} contentType\n * @param {!Array<string>} codecs\n * @return {!Array<string>}\n */\n static guessAllCodecsSafe(contentType, codecs) {\n const allCodecs = [];\n const formats = shaka.util.ManifestParserUtils\n .CODEC_REGEXPS_BY_CONTENT_TYPE_.get(contentType);\n for (const format of formats) {\n for (const codec of codecs) {\n if (format.test(codec.trim())) {\n allCodecs.push(codec.trim());\n }\n }\n }\n\n return allCodecs;\n }\n};\n\n\n/**\n * @enum {string}\n */\nshaka.util.ManifestParserUtils.ContentType = {\n VIDEO: 'video',\n AUDIO: 'audio',\n TEXT: 'text',\n IMAGE: 'image',\n APPLICATION: 'application',\n};\n\n\n/**\n * @enum {string}\n */\nshaka.util.ManifestParserUtils.TextStreamKind = {\n SUBTITLE: 'subtitle',\n CLOSED_CAPTION: 'caption',\n};\n\n\n/**\n * Specifies how tolerant the player is of inaccurate segment start times and\n * end times within a manifest. For example, gaps or overlaps between segments\n * in a SegmentTimeline which are greater than or equal to this value will\n * result in a warning message.\n *\n * @const {number}\n */\nshaka.util.ManifestParserUtils.GAP_OVERLAP_TOLERANCE_SECONDS = 1 / 15;\n\n\n/**\n * A list of regexps to detect well-known video codecs.\n *\n * @const {!Array<!RegExp>}\n * @private\n */\nshaka.util.ManifestParserUtils.VIDEO_CODEC_REGEXPS_ = [\n /^avc/,\n /^hev/,\n /^hvc/,\n /^vvc/,\n /^vvi/,\n /^vp0?[89]/,\n /^av01/,\n /^dvh/, // Dolby Vision based in HEVC\n /^dva/, // Dolby Vision based in AVC\n /^dav/, // Dolby Vision based in AV1\n];\n\n\n/**\n * A list of regexps to detect well-known audio codecs.\n *\n * @const {!Array<!RegExp>}\n * @private\n */\nshaka.util.ManifestParserUtils.AUDIO_CODEC_REGEXPS_ = [\n /^vorbis$/,\n /^Opus$/, // correct codec string according to RFC 6381 section 3.3\n /^opus$/, // some manifests wrongfully use this\n /^fLaC$/, // correct codec string according to RFC 6381 section 3.3\n /^flac$/, // some manifests wrongfully use this\n /^mp4a/,\n /^[ae]c-3$/,\n /^ac-4/,\n /^dts[cex]$/, // DTS Digital Surround (dtsc), DTS Express (dtse), DTS:X (dtsx)\n /^iamf/,\n /^mhm[12]/, // MPEG-H Audio LC\n];\n\n\n/**\n * A list of regexps to detect well-known text codecs.\n *\n * @const {!Array<!RegExp>}\n * @private\n */\nshaka.util.ManifestParserUtils.TEXT_CODEC_REGEXPS_ = [\n /^vtt$/,\n /^wvtt/,\n /^stpp/,\n];\n\n\n/**\n * @const {!Map<string, !Array<!RegExp>>}\n */\nshaka.util.ManifestParserUtils.CODEC_REGEXPS_BY_CONTENT_TYPE_ = new Map()\n .set('audio', shaka.util.ManifestParserUtils.AUDIO_CODEC_REGEXPS_)\n .set('video', shaka.util.ManifestParserUtils.VIDEO_CODEC_REGEXPS_)\n .set('text', shaka.util.ManifestParserUtils.TEXT_CODEC_REGEXPS_);\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.media.Capabilities');\n\n/**\n * @summary\n * This is for capturing all media source capabilities on current platform.\n * And this is for static check and can not be constructed.\n */\nshaka.media.Capabilities = class {\n /**\n * Cache browser engine call to improve performance on some poor platforms\n *\n * @param {string} type\n * @return {boolean}\n */\n static isTypeSupported(type) {\n const supportMap = shaka.media.Capabilities.MediaSourceTypeSupportMap;\n if (supportMap.has(type)) {\n return supportMap.get(type);\n }\n const mediaSource = window.ManagedMediaSource || window.MediaSource;\n if (mediaSource) {\n const currentSupport = mediaSource.isTypeSupported(type);\n supportMap.set(type, currentSupport);\n return currentSupport;\n }\n return false;\n }\n\n /**\n * Determine support for SourceBuffer.changeType\n * @return {boolean}\n */\n static isChangeTypeSupported() {\n const sourceBuffer = window.ManagedSourceBuffer || window.SourceBuffer;\n return !!sourceBuffer &&\n // eslint-disable-next-line no-restricted-syntax\n !!sourceBuffer.prototype && !!sourceBuffer.prototype.changeType;\n }\n\n /**\n * Determine support for MediaSource.setLiveSeekableRange and\n * MediaSource.clearLiveSeekableRange, which can allow for a media element\n * duration of Infinite by providing a non-infinite seekable range.\n *\n * @return {boolean}\n */\n static isInfiniteLiveStreamDurationSupported() {\n const mediaSource = window.ManagedMediaSource || window.MediaSource;\n // eslint-disable-next-line no-restricted-syntax\n if (mediaSource && mediaSource.prototype) {\n // eslint-disable-next-line no-restricted-syntax\n return !!mediaSource.prototype.setLiveSeekableRange &&\n // eslint-disable-next-line no-restricted-syntax\n !!mediaSource.prototype.clearLiveSeekableRange;\n }\n return false;\n }\n};\n\n/**\n * Public it for unit test, and developer could also check the support map.\n * @type {!Map<string, boolean>}\n */\nshaka.media.Capabilities.MediaSourceTypeSupportMap = new Map();\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.cea.DummyCaptionDecoder');\n\n/** @implements {shaka.extern.ICaptionDecoder} */\nshaka.cea.DummyCaptionDecoder = class {\n /** @override */\n extract(userDataSeiMessage, pts) {}\n\n /** @override */\n decode() {\n return [];\n }\n\n /** @override */\n clear() {}\n\n /** @override */\n getStreams() {\n return [];\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.cea.DummyCeaParser');\n\n/**\n * Dummy CEA parser.\n * @implements {shaka.extern.ICeaParser}\n */\nshaka.cea.DummyCeaParser = class {\n /**\n * @override\n */\n init(initSegment) {\n }\n\n /**\n * @override\n */\n parse(mediaSegment) {\n return /* captionPackets= */ [];\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.media.ClosedCaptionParser');\ngoog.provide('shaka.media.IClosedCaptionParser');\n\ngoog.require('shaka.cea.DummyCaptionDecoder');\ngoog.require('shaka.cea.DummyCeaParser');\ngoog.require('shaka.log');\ngoog.require('shaka.util.BufferUtils');\n\n\n/**\n * The IClosedCaptionParser defines the interface to provide all operations for\n * parsing the closed captions embedded in Dash videos streams.\n * TODO: Remove this interface and move method definitions\n * directly to ClosedCaptionParser.\n * @interface\n * @export\n */\nshaka.media.IClosedCaptionParser = class {\n /**\n * Initialize the caption parser. This should be called whenever new init\n * segment arrives.\n * @param {BufferSource} initSegment\n * @param {boolean=} adaptation True if we just automatically switched active\n * variant(s).\n */\n init(initSegment, adaptation = false) {}\n\n /**\n * Parses embedded CEA closed captions and interacts with the underlying\n * CaptionStream, and calls the callback function when there are closed\n * captions.\n *\n * @param {BufferSource} mediaFragment\n * @return {!Array<!shaka.extern.ICaptionDecoder.ClosedCaption>}\n * An array of parsed closed captions.\n */\n parseFrom(mediaFragment) {}\n\n /**\n * Resets the CaptionStream.\n */\n reset() {}\n\n /**\n * Returns the streams that the CEA decoder found.\n * @return {!Array<string>}\n */\n getStreams() {}\n};\n\n/**\n * Closed Caption Parser provides all operations for parsing the closed captions\n * embedded in Dash videos streams.\n *\n * @implements {shaka.media.IClosedCaptionParser}\n * @final\n * @export\n */\nshaka.media.ClosedCaptionParser = class {\n /**\n * @param {string} mimeType\n */\n constructor(mimeType) {\n /** @private {!shaka.extern.ICeaParser} */\n this.ceaParser_ = new shaka.cea.DummyCeaParser();\n\n const parserFactory =\n shaka.media.ClosedCaptionParser.findParser(mimeType.toLowerCase());\n if (parserFactory) {\n this.ceaParser_ = parserFactory();\n }\n\n /**\n * Decoder for decoding CEA-X08 data from closed caption packets.\n * @private {!shaka.extern.ICaptionDecoder}\n */\n this.ceaDecoder_ = new shaka.cea.DummyCaptionDecoder();\n\n const decoderFactory = shaka.media.ClosedCaptionParser.findDecoder();\n if (decoderFactory) {\n this.ceaDecoder_ = decoderFactory();\n }\n }\n\n /**\n * @override\n */\n init(initSegment, adaptation = false) {\n shaka.log.debug('Passing new init segment to CEA parser');\n if (!adaptation) {\n // Reset underlying decoder when new init segment arrives\n // to clear stored pts values.\n // This is necessary when a new Period comes in DASH or a discontinuity\n // in HLS.\n this.reset();\n }\n this.ceaParser_.init(initSegment);\n }\n\n /**\n * @override\n */\n parseFrom(mediaFragment) {\n // Parse the fragment.\n const captionPackets = this.ceaParser_.parse(mediaFragment);\n\n // Extract the caption packets for decoding.\n for (const captionPacket of captionPackets) {\n const uint8ArrayData =\n shaka.util.BufferUtils.toUint8(captionPacket.packet);\n if (uint8ArrayData.length > 0) {\n this.ceaDecoder_.extract(uint8ArrayData, captionPacket.pts);\n }\n }\n\n // Decode and return the parsed captions.\n return this.ceaDecoder_.decode();\n }\n\n /**\n * @override\n */\n reset() {\n this.ceaDecoder_.clear();\n }\n\n /**\n * @override\n */\n getStreams() {\n return this.ceaDecoder_.getStreams();\n }\n\n /**\n * @param {string} mimeType\n * @param {!shaka.extern.CeaParserPlugin} plugin\n * @export\n */\n static registerParser(mimeType, plugin) {\n shaka.media.ClosedCaptionParser.parserMap_.set(mimeType, plugin);\n }\n\n /**\n * @param {string} mimeType\n * @export\n */\n static unregisterParser(mimeType) {\n shaka.media.ClosedCaptionParser.parserMap_.delete(mimeType);\n }\n\n /**\n * @param {string} mimeType\n * @return {?shaka.extern.CeaParserPlugin}\n * @export\n */\n static findParser(mimeType) {\n return shaka.media.ClosedCaptionParser.parserMap_.get(mimeType);\n }\n\n /**\n * @param {!shaka.extern.CaptionDecoderPlugin} plugin\n * @export\n */\n static registerDecoder(plugin) {\n shaka.media.ClosedCaptionParser.decoderFactory_ = plugin;\n }\n\n /**\n * @export\n */\n static unregisterDecoder() {\n shaka.media.ClosedCaptionParser.decoderFactory_ = null;\n }\n\n /**\n * @return {?shaka.extern.CaptionDecoderPlugin}\n * @export\n */\n static findDecoder() {\n return shaka.media.ClosedCaptionParser.decoderFactory_;\n }\n};\n\n/** @private {!Map<string, shaka.extern.CeaParserPlugin>} */\nshaka.media.ClosedCaptionParser.parserMap_ = new Map();\n\n/** @private {?shaka.extern.CaptionDecoderPlugin} */\nshaka.media.ClosedCaptionParser.decoderFactory_ = null;\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.text.CueRegion');\n\n\n/**\n * @export\n */\nshaka.text.CueRegion = class {\n /** */\n constructor() {\n const CueRegion = shaka.text.CueRegion;\n\n /**\n * Region identifier.\n * @type {string}\n * @export\n */\n this.id = '';\n\n /**\n * The X offset to start the rendering area in viewportAnchorUnits of the\n * video width.\n * @type {number}\n * @export\n */\n this.viewportAnchorX = 0;\n\n /**\n * The X offset to start the rendering area in viewportAnchorUnits of the\n * video height.\n * @type {number}\n * @export\n */\n this.viewportAnchorY = 0;\n\n /**\n * The X offset to start the rendering area in percentage (0-100) of this\n * region width.\n * @type {number}\n * @export\n */\n this.regionAnchorX = 0;\n\n /**\n * The Y offset to start the rendering area in percentage (0-100) of the\n * region height.\n * @type {number}\n * @export\n */\n this.regionAnchorY = 0;\n\n /**\n * The width of the rendering area in widthUnits.\n * @type {number}\n * @export\n */\n this.width = 100;\n\n /**\n * The width of the rendering area in heightUnits.\n * @type {number}\n * @export\n */\n this.height = 100;\n\n /**\n * The units (percentage, pixels or lines) the region height is in.\n * @type {shaka.text.CueRegion.units}\n * @export\n */\n this.heightUnits = CueRegion.units.PERCENTAGE;\n\n /**\n * The units (percentage or pixels) the region width is in.\n * @type {shaka.text.CueRegion.units}\n * @export\n */\n this.widthUnits = CueRegion.units.PERCENTAGE;\n\n /**\n * The units (percentage or pixels) the region viewportAnchors are in.\n * @type {shaka.text.CueRegion.units}\n * @export\n */\n this.viewportAnchorUnits = CueRegion.units.PERCENTAGE;\n\n /**\n * If scroll=UP, it means that cues in the region will be added to the\n * bottom of the region and will push any already displayed cues in the\n * region up. Otherwise (scroll=NONE) cues will stay fixed at the location\n * they were first painted in.\n * @type {shaka.text.CueRegion.scrollMode}\n * @export\n */\n this.scroll = CueRegion.scrollMode.NONE;\n }\n};\n\n\n/**\n * @enum {number}\n * @export\n */\nshaka.text.CueRegion.units = {\n 'PX': 0,\n 'PERCENTAGE': 1,\n 'LINES': 2,\n};\n\n\n/**\n * @enum {string}\n * @export\n */\nshaka.text.CueRegion.scrollMode = {\n 'NONE': '',\n 'UP': 'up',\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.ArrayUtils');\n\n\n/**\n * @namespace shaka.util.ArrayUtils\n * @summary Array utility functions.\n */\n\n\nshaka.util.ArrayUtils = class {\n /**\n * Returns whether the two values contain the same value. This correctly\n * handles comparisons involving NaN.\n * @param {T} a\n * @param {T} b\n * @return {boolean}\n * @template T\n */\n static defaultEquals(a, b) {\n // NaN !== NaN, so we need to special case it.\n if (typeof a === 'number' &&\n typeof b === 'number' && isNaN(a) && isNaN(b)) {\n return true;\n }\n return a === b;\n }\n\n\n /**\n * Remove given element from array (assumes no duplicates).\n * @param {!Array<T>} array\n * @param {T} element\n * @template T\n */\n static remove(array, element) {\n const index = array.indexOf(element);\n if (index > -1) {\n array.splice(index, 1);\n }\n }\n\n\n /**\n * Count the number of items in the list that pass the check function.\n * @param {!Array<T>} array\n * @param {function(T):boolean} check\n * @return {number}\n * @template T\n */\n static count(array, check) {\n let count = 0;\n\n for (const element of array) {\n count += check(element) ? 1 : 0;\n }\n\n return count;\n }\n\n\n /**\n * Determines if the given arrays contain equal elements in any order.\n *\n * @param {!Array<T>} a\n * @param {!Array<T>} b\n * @param {function(T, T):boolean=} compareFn\n * @return {boolean}\n * @template T\n */\n static hasSameElements(a, b, compareFn) {\n if (!compareFn) {\n compareFn = shaka.util.ArrayUtils.defaultEquals;\n }\n if (a.length != b.length) {\n return false;\n }\n\n const copy = b.slice();\n for (const item of a) {\n const idx = copy.findIndex((other) => compareFn(item, other));\n if (idx == -1) {\n return false;\n }\n // Since order doesn't matter, just swap the last element with\n // this one and then drop the last element.\n copy[idx] = copy[copy.length - 1];\n copy.pop();\n }\n\n return copy.length == 0;\n }\n\n\n /**\n * Determines if the given arrays contain equal elements in the same order.\n *\n * @param {Array<T>} a\n * @param {Array<T>} b\n * @param {function(T, T):boolean=} compareFn\n * @return {boolean}\n * @template T\n */\n static equal(a, b, compareFn) {\n if (a === b) {\n return true;\n }\n if (!a || !b) {\n return a == b;\n }\n if (!compareFn) {\n compareFn = shaka.util.ArrayUtils.defaultEquals;\n }\n if (a.length != b.length) {\n return false;\n }\n\n for (let i = 0; i < a.length; i++) {\n if (!compareFn(a[i], b[i])) {\n return false;\n }\n }\n return true;\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.TextParser');\n\ngoog.require('goog.asserts');\n\n\n/**\n * Reads elements from strings.\n */\nshaka.util.TextParser = class {\n /**\n * @param {string} data\n */\n constructor(data) {\n /**\n * @const\n * @private {string}\n */\n this.data_ = data || '';\n\n /** @private {number} */\n this.position_ = 0;\n }\n\n\n /** @return {boolean} Whether it is at the end of the string. */\n atEnd() {\n return this.position_ == this.data_.length;\n }\n\n\n /**\n * Reads a line from the parser. This will read but not return the newline.\n * Returns null at the end.\n *\n * @return {?string}\n */\n readLine() {\n return this.readRegexReturnCapture_(/(.*?)(\\n|$)/gm, 1);\n }\n\n\n /**\n * Reads a word from the parser. This will not read or return any whitespace\n * before or after the word (including newlines). Returns null at the end.\n *\n * @return {?string}\n */\n readWord() {\n return this.readRegexReturnCapture_(/[^ \\t\\n]*/gm, 0);\n }\n\n\n /**\n * Skips any continuous whitespace from the parser. Returns null at the end.\n */\n skipWhitespace() {\n this.readRegex(/[ \\t]+/gm);\n }\n\n\n /**\n * Reads the given regular expression from the parser. This requires the\n * match to be at the current position; there is no need to include a head\n * anchor.\n * This requires that the regex have the global flag to be set so that it can\n * set lastIndex to start the search at the current position. Returns null at\n * the end or if the regex does not match the current position.\n *\n * @param {!RegExp} regex\n * @return {Array<string>}\n */\n readRegex(regex) {\n const index = this.indexOf_(regex);\n if (this.atEnd() || index == null || index.position != this.position_) {\n return null;\n }\n\n this.position_ += index.length;\n return index.results;\n }\n\n\n /**\n * Reads a regex from the parser and returns the given capture.\n *\n * @param {!RegExp} regex\n * @param {number} index\n * @return {?string}\n * @private\n */\n readRegexReturnCapture_(regex, index) {\n if (this.atEnd()) {\n return null;\n }\n\n const ret = this.readRegex(regex);\n if (!ret) {\n return null;\n } else {\n return ret[index];\n }\n }\n\n\n /**\n * Returns the index info about a regular expression match.\n *\n * @param {!RegExp} regex\n * @return {?{position: number, length: number, results: !Array<string>}}\n * @private\n */\n indexOf_(regex) {\n // The global flag is required to use lastIndex.\n goog.asserts.assert(regex.global, 'global flag should be set');\n\n regex.lastIndex = this.position_;\n const results = regex.exec(this.data_);\n if (results == null) {\n return null;\n } else {\n return {\n position: results.index,\n length: results[0].length,\n results: results,\n };\n }\n }\n\n /**\n * Parses a time.\n *\n * @return {?number}\n */\n parseTime() {\n const results = this.readRegex(shaka.util.TextParser.timeFormat_);\n if (results == null) {\n return null;\n }\n // This capture is optional, but will still be in the array as undefined,\n // in which case it is 0.\n const hours = Number(results[1]) || 0;\n const minutes = Number(results[2]);\n const seconds = Number(results[3]);\n const milliseconds = Number(results[6]) || 0;\n if (minutes > 59 || seconds > 59) {\n return null;\n }\n\n return (milliseconds / 1000) + seconds + (minutes * 60) + (hours * 3600);\n }\n\n /**\n * Parses a time from string.\n *\n * @param {?string} time\n * @return {?number}\n */\n static parseTime(time) {\n if (!time) {\n return null;\n }\n const parser = new shaka.util.TextParser(time);\n return parser.parseTime();\n }\n};\n\n/**\n * @const\n * @private {!RegExp}\n * @example 00:00.000 or 00:00:00.000 or 0:00:00.000 or\n * 00:00.00 or 00:00:00.00 or 0:00:00.00 or 00:00:00\n */\nshaka.util.TextParser.timeFormat_ =\n /(?:(\\d{1,}):)?(\\d{2}):(\\d{2})((\\.(\\d{1,3})))?/g;\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.ObjectUtils');\n\n\nshaka.util.ObjectUtils = class {\n /**\n * Performs a deep clone of the given simple object. This does not copy\n * prototypes, custom properties (e.g. read-only), or multiple references to\n * the same object. If the caller needs these fields, it will need to set\n * them after this returns.\n *\n * @template T\n * @param {T} arg\n * @return {T}\n */\n static cloneObject(arg) {\n const seenObjects = new WeakSet();\n // This recursively clones the value |val|, using the captured variable\n // |seenObjects| to track the objects we have already cloned.\n /**\n * @param {*} val\n * @return {*}\n * @suppress {strictMissingProperties}\n */\n const clone = (val) => {\n switch (typeof val) {\n case 'undefined':\n case 'boolean':\n case 'number':\n case 'string':\n case 'symbol':\n case 'function':\n return val;\n case 'object':\n default: {\n // typeof null === 'object'\n if (!val) {\n return val;\n }\n\n // This covers Uint8Array and friends, even without a TypedArray\n // base-class constructor.\n const isTypedArray = ArrayBuffer.isView(val);\n if (isTypedArray) {\n return val;\n }\n\n if (seenObjects.has(val)) {\n return null;\n }\n\n const isArray = val.constructor == Array;\n if (val.constructor != Object && !isArray) {\n return null;\n }\n\n seenObjects.add(val);\n const ret = isArray ? [] : {};\n // Note |name| will equal a number for arrays.\n for (const name in val) {\n ret[name] = clone(val[name]);\n }\n\n // Length is a non-enumerable property, but we should copy it over in\n // case it is not the default.\n if (isArray) {\n ret.length = val.length;\n }\n return ret;\n }\n }\n };\n return clone(arg);\n }\n\n /**\n * Performs a shallow clone of the given simple object. This does not copy\n * prototypes or custom properties (e.g. read-only).\n *\n * @template T\n * @param {T} original\n * @return {T}\n */\n static shallowCloneObject(original) {\n const clone = /** @type {?} */({});\n for (const k in original) {\n clone[k] = original[k];\n }\n return clone;\n }\n\n\n /**\n * Constructs a string out of a value, similar to the JSON.stringify method.\n * Unlike that method, this guarantees that the order of the keys in an\n * object is alphabetical, so it can be used as a way to reliably compare two\n * objects.\n *\n * @param {?} value\n * @return {string}\n */\n static alphabeticalKeyOrderStringify(value) {\n if (Array.isArray(value)) {\n return shaka.util.ObjectUtils.arrayStringify_(value);\n } else if (typeof value == 'function') {\n // For safety, skip functions. For function x,\n // x.prototype.constructor.prototype === x.prototype, so all functions\n // contain circular references if treated like Objects.\n return '';\n } else if (value instanceof Object) {\n return shaka.util.ObjectUtils.objectStringify_(value);\n } else {\n return JSON.stringify(value);\n }\n }\n\n\n /**\n * Helper for alphabeticalKeyOrderStringify for objects.\n *\n * @param {!Object} obj\n * @return {string}\n * @private\n */\n static objectStringify_(obj) {\n // NOTE: This excludes prototype chain keys. For now, this is intended for\n // anonymous objects only, so we don't care. If that changes, go back to a\n // for-in loop.\n const keys = Object.keys(obj);\n // Alphabetically sort the keys, so they will be in a reliable order.\n keys.sort();\n\n const terms = [];\n for (const key of keys) {\n const escapedKey = JSON.stringify(key);\n const value = obj[key];\n if (value !== undefined) {\n const escapedValue =\n shaka.util.ObjectUtils.alphabeticalKeyOrderStringify(value);\n if (escapedValue) {\n terms.push(escapedKey + ':' + escapedValue);\n }\n }\n }\n return '{' + terms.join(',') + '}';\n }\n\n\n /**\n * Helper for alphabeticalKeyOrderStringify for arrays.\n *\n * This could itself be JSON.stringify, except we want objects within the\n * array to go through our own stringifiers.\n *\n * @param {!Array} arr\n * @return {string}\n * @private\n */\n static arrayStringify_(arr) {\n const terms = [];\n for (let index = 0; index < arr.length; index++) {\n const escapedKey = index.toString();\n const value = arr[index];\n if (value !== undefined) {\n const escapedValue =\n shaka.util.ObjectUtils.alphabeticalKeyOrderStringify(value);\n if (escapedValue) {\n terms.push(escapedKey + ':' + escapedValue);\n }\n }\n }\n return '[' + terms.join(',') + ']';\n }\n};\n","/*! @license\n * tXml\n * Copyright 2015 Tobias Nickel\n * SPDX-License-Identifier: MIT\n */\n\ngoog.provide('shaka.util.TXml');\n\ngoog.require('shaka.util.ObjectUtils');\ngoog.require('shaka.util.StringUtils');\ngoog.require('shaka.log');\n\n/**\n * This code is a modified version of the tXml library.\n *\n * @author Tobias Nickel\n * created: 06.04.2015\n * https://github.com/TobiasNickel/tXml\n */\n\n/**\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n\nshaka.util.TXml = class {\n /**\n * Parse some data\n * @param {BufferSource} data\n * @param {string=} expectedRootElemName\n * @param {boolean=} includeParent\n * @return {shaka.extern.xml.Node | null}\n */\n static parseXml(data, expectedRootElemName, includeParent = false) {\n const xmlString = shaka.util.StringUtils.fromBytesAutoDetect(data);\n return shaka.util.TXml.parseXmlString(\n xmlString, expectedRootElemName, includeParent);\n }\n\n /**\n * Parse some data\n * @param {string} xmlString\n * @param {string=} expectedRootElemName\n * @param {boolean=} includeParent\n * @return {shaka.extern.xml.Node | null}\n */\n static parseXmlString(xmlString, expectedRootElemName,\n includeParent = false) {\n const result = shaka.util.TXml.parse(xmlString, includeParent);\n if (!expectedRootElemName && result.length) {\n return result[0];\n }\n const rootNode = result.find((n) =>\n expectedRootElemName.split(',').includes(n.tagName));\n if (rootNode) {\n return rootNode;\n }\n\n shaka.log.error('parseXml root element not found!');\n return null;\n }\n\n /**\n * Get namespace based on schema\n * @param {string} schema\n * @return {string}\n */\n static getKnownNameSpace(schema) {\n if (shaka.util.TXml.uriToNameSpace_.has(schema)) {\n return shaka.util.TXml.uriToNameSpace_.get(schema);\n }\n return '';\n }\n\n /**\n * Get schema based on namespace\n * @param {string} NS\n * @return {string}\n */\n static getKnownSchema(NS) {\n if (shaka.util.TXml.nameSpaceToUri_.has(NS)) {\n return shaka.util.TXml.nameSpaceToUri_.get(NS);\n }\n return '';\n }\n\n /**\n * Sets NS <-> schema bidirectional mapping\n * @param {string} schema\n * @param {string} NS\n */\n static setKnownNameSpace(schema, NS) {\n shaka.util.TXml.uriToNameSpace_.set(schema, NS);\n shaka.util.TXml.nameSpaceToUri_.set(NS, schema);\n }\n\n /**\n * parseXML / html into a DOM Object,\n * with no validation and some failure tolerance\n * @param {string} S your XML to parse\n * @param {boolean} includeParent\n * @return {Array<shaka.extern.xml.Node>}\n */\n static parse(S, includeParent) {\n let pos = 0;\n\n const openBracket = '<';\n const openBracketCC = '<'.charCodeAt(0);\n const closeBracket = '>';\n const closeBracketCC = '>'.charCodeAt(0);\n const minusCC = '-'.charCodeAt(0);\n const slashCC = '/'.charCodeAt(0);\n const exclamationCC = '!'.charCodeAt(0);\n const singleQuoteCC = '\\''.charCodeAt(0);\n const doubleQuoteCC = '\"'.charCodeAt(0);\n const openCornerBracketCC = '['.charCodeAt(0);\n\n /**\n * parsing a list of entries\n * @param {string} tagName\n * @param {boolean=} preserveSpace\n * @return {!Array<shaka.extern.xml.Node | string>}\n */\n function parseChildren(tagName, preserveSpace = false) {\n /** @type {!Array<shaka.extern.xml.Node | string>} */\n const children = [];\n while (S[pos]) {\n if (S.charCodeAt(pos) == openBracketCC) {\n if (S.charCodeAt(pos + 1) === slashCC) {\n const closeStart = pos + 2;\n pos = S.indexOf(closeBracket, pos);\n\n const closeTag = S.substring(closeStart, pos);\n let indexOfCloseTag = closeTag.indexOf(tagName);\n if (indexOfCloseTag == -1) {\n // handle VTT closing tags like <c.lime></c>\n const indexOfPeriod = tagName.indexOf('.');\n if (indexOfPeriod > 0) {\n const shortTag = tagName.substring(0, indexOfPeriod);\n indexOfCloseTag = closeTag.indexOf(shortTag);\n }\n }\n if (indexOfCloseTag == -1) {\n const parsedText = S.substring(0, pos).split('\\n');\n throw new Error(\n 'Unexpected close tag\\nLine: ' + (parsedText.length - 1) +\n '\\nColumn: ' +\n (parsedText[parsedText.length - 1].length + 1) +\n '\\nChar: ' + S[pos],\n );\n }\n\n if (pos + 1) {\n pos += 1;\n }\n\n return children;\n } else if (S.charCodeAt(pos + 1) === exclamationCC) {\n if (S.charCodeAt(pos + 2) == minusCC) {\n while (pos !== -1 && !(S.charCodeAt(pos) === closeBracketCC &&\n S.charCodeAt(pos - 1) == minusCC &&\n S.charCodeAt(pos - 2) == minusCC &&\n pos != -1)) {\n pos = S.indexOf(closeBracket, pos + 1);\n }\n if (pos === -1) {\n pos = S.length;\n }\n } else if (\n S.charCodeAt(pos + 2) === openCornerBracketCC &&\n S.charCodeAt(pos + 8) === openCornerBracketCC &&\n S.substr(pos + 3, 5).toLowerCase() === 'cdata'\n ) {\n // cdata\n const cdataEndIndex = S.indexOf(']]>', pos);\n if (cdataEndIndex == -1) {\n children.push(S.substr(pos + 9));\n pos = S.length;\n } else {\n children.push(S.substring(pos + 9, cdataEndIndex));\n pos = cdataEndIndex + 3;\n }\n continue;\n }\n pos++;\n continue;\n }\n const node = parseNode(preserveSpace);\n children.push(node);\n if (typeof node === 'string') {\n return children;\n }\n if (node.tagName[0] === '?' && node.children) {\n children.push(...node.children);\n node.children = [];\n }\n } else {\n const text = parseText();\n if (preserveSpace) {\n if (text.length > 0) {\n children.push(text);\n }\n } else if (children.length &&\n text.length == 1 && text[0] == '\\n') {\n children.push(text);\n } else {\n const trimmed = text.trim();\n if (trimmed.length > 0) {\n children.push(text);\n }\n }\n pos++;\n }\n }\n return children;\n }\n\n /**\n * returns the text outside of texts until the first '<'\n * @return {string}\n */\n function parseText() {\n const start = pos;\n pos = S.indexOf(openBracket, pos) - 1;\n if (pos === -2) {\n pos = S.length;\n }\n return S.slice(start, pos + 1);\n }\n /**\n * returns text until the first nonAlphabetic letter\n */\n const nameSpacer = '\\r\\n\\t>/= ';\n\n /**\n * Parse text in current context\n * @return {string}\n */\n function parseName() {\n const start = pos;\n while (nameSpacer.indexOf(S[pos]) === -1 && S[pos]) {\n pos++;\n }\n return S.slice(start, pos);\n }\n\n /**\n * Parse text in current context\n * @param {boolean} preserveSpace Preserve the space between nodes\n * @return {shaka.extern.xml.Node | string}\n */\n function parseNode(preserveSpace) {\n pos++;\n const tagName = parseName();\n const attributes = {};\n let children = [];\n\n // parsing attributes\n while (S.charCodeAt(pos) !== closeBracketCC && S[pos]) {\n const c = S.charCodeAt(pos);\n // abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'\n if ((c > 64 && c < 91) || (c > 96 && c < 123)) {\n const name = parseName();\n // search beginning of the string\n let code = S.charCodeAt(pos);\n while (code && code !== singleQuoteCC && code !== doubleQuoteCC &&\n !((code > 64 && code < 91) || (code > 96 && code < 123)) &&\n code !== closeBracketCC) {\n pos++;\n code = S.charCodeAt(pos);\n }\n let value = parseString();\n if (code === singleQuoteCC || code === doubleQuoteCC) {\n if (pos === -1) {\n /** @type {shaka.extern.xml.Node} */\n const node = {\n tagName,\n attributes,\n children,\n parent: null,\n };\n if (includeParent) {\n for (let i = 0; i < children.length; i++) {\n if (typeof children[i] !== 'string') {\n children[i].parent = node;\n }\n }\n }\n return node;\n }\n } else {\n value = null;\n pos--;\n }\n if (name.startsWith('xmlns:')) {\n const segments = name.split(':');\n shaka.util.TXml.setKnownNameSpace(\n /** @type {string} */ (value), segments[1]);\n }\n if (tagName === 'tt' &&\n name === 'xml:space' &&\n value === 'preserve') {\n preserveSpace = true;\n }\n attributes[name] = value;\n }\n pos++;\n }\n\n if (S.charCodeAt(pos - 1) !== slashCC) {\n pos++;\n const contents = parseChildren(tagName, preserveSpace);\n children = contents;\n } else {\n pos++;\n }\n /** @type {shaka.extern.xml.Node} */\n const node = {\n tagName,\n attributes,\n children,\n parent: null,\n };\n const childrenLength = children.length;\n for (let i = 0; i < childrenLength; i++) {\n const childrenValue = children[i];\n if (typeof childrenValue !== 'string') {\n if (includeParent) {\n childrenValue.parent = node;\n }\n } else if (i == childrenLength - 1 && childrenValue == '\\n') {\n children.pop();\n }\n }\n return node;\n }\n\n /**\n * Parse string in current context\n * @return {string}\n */\n function parseString() {\n const startChar = S[pos];\n const startPos = pos + 1;\n pos = S.indexOf(startChar, startPos);\n return S.slice(startPos, pos);\n }\n\n return parseChildren('');\n }\n\n /**\n * Verifies if the element is a TXml node.\n * @param {!shaka.extern.xml.Node} elem The XML element.\n * @return {!boolean} Is the element a TXml node\n */\n static isNode(elem) {\n return !!(elem.tagName);\n }\n\n /**\n * Checks if a node is of type text.\n * @param {!shaka.extern.xml.Node | string} elem The XML element.\n * @return {boolean} True if it is a text node.\n */\n static isText(elem) {\n return typeof elem === 'string';\n }\n\n /**\n * gets child XML elements.\n * @param {!shaka.extern.xml.Node} elem The parent XML element.\n * @return {!Array<!shaka.extern.xml.Node>} The child XML elements.\n */\n static getChildNodes(elem) {\n const found = [];\n if (!elem.children) {\n return [];\n }\n for (const child of elem.children) {\n if (typeof child !== 'string') {\n found.push(child);\n }\n }\n return found;\n }\n\n /**\n * Finds child XML elements.\n * @param {!shaka.extern.xml.Node} elem The parent XML element.\n * @param {string} name The child XML element's tag name.\n * @return {!Array<!shaka.extern.xml.Node>} The child XML elements.\n */\n static findChildren(elem, name) {\n const found = [];\n if (!elem.children) {\n return [];\n }\n for (const child of elem.children) {\n if (child.tagName === name) {\n found.push(child);\n }\n }\n return found;\n }\n\n /**\n * Gets inner text.\n * @param {!shaka.extern.xml.Node | string} node The XML element.\n * @return {?string} The text contents, or null if there are none.\n */\n static getTextContents(node) {\n const StringUtils = shaka.util.StringUtils;\n if (typeof node === 'string') {\n return StringUtils.htmlUnescape(node);\n }\n const textContent = node.children.reduce(\n (acc, curr) => (typeof curr === 'string' ? acc + curr : acc),\n '',\n );\n if (textContent === '') {\n return null;\n }\n return StringUtils.htmlUnescape(textContent);\n }\n\n /**\n * Gets the text contents of a node.\n * @param {!shaka.extern.xml.Node} node The XML element.\n * @return {?string} The text contents, or null if there are none.\n */\n static getContents(node) {\n if (!Array.from(node.children).every(\n (n) => typeof n === 'string' )) {\n return null;\n }\n\n // Read merged text content from all text nodes.\n let text = shaka.util.TXml.getTextContents(node);\n if (text) {\n text = text.trim();\n }\n return text;\n }\n\n /**\n * Finds child XML elements recursively.\n * @param {!shaka.extern.xml.Node} elem The parent XML element.\n * @param {string} name The child XML element's tag name.\n * @param {!Array<!shaka.extern.xml.Node>} found accumulator for found nodes\n * @return {!Array<!shaka.extern.xml.Node>} The child XML elements.\n */\n static getElementsByTagName(elem, name, found = []) {\n if (elem.tagName === name) {\n found.push(elem);\n }\n if (elem.children) {\n for (const child of elem.children) {\n shaka.util.TXml.getElementsByTagName(child, name, found);\n }\n }\n return found;\n }\n\n /**\n * Finds a child XML element.\n * @param {!shaka.extern.xml.Node} elem The parent XML element.\n * @param {string} name The child XML element's tag name.\n * @return {shaka.extern.xml.Node | null} The child XML element,\n * or null if a child XML element\n * does not exist with the given tag name OR if there exists more than one\n * child XML element with the given tag name.\n */\n static findChild(elem, name) {\n const children = shaka.util.TXml.findChildren(elem, name);\n if (children.length != 1) {\n return null;\n }\n return children[0];\n }\n\n /**\n * Finds a namespace-qualified child XML element.\n * @param {!shaka.extern.xml.Node} elem The parent XML element.\n * @param {string} ns The child XML element's namespace URI.\n * @param {string} name The child XML element's local name.\n * @return {shaka.extern.xml.Node | null} The child XML element, or null\n * if a child XML element\n * does not exist with the given tag name OR if there exists more than one\n * child XML element with the given tag name.\n */\n static findChildNS(elem, ns, name) {\n const children = shaka.util.TXml.findChildrenNS(elem, ns, name);\n if (children.length != 1) {\n return null;\n }\n return children[0];\n }\n\n /**\n * Parses an attribute by its name.\n * @param {!shaka.extern.xml.Node} elem The XML element.\n * @param {string} name The attribute name.\n * @param {function(string): (T|null)} parseFunction A function that parses\n * the attribute.\n * @param {(T|null)=} defaultValue The attribute's default value, if not\n * specified, the attribute's default value is null.\n * @return {(T|null)} The parsed attribute on success, or the attribute's\n * default value if the attribute does not exist or could not be parsed.\n * @template T\n */\n static parseAttr(elem, name, parseFunction, defaultValue = null) {\n let parsedValue = null;\n\n const value = elem.attributes[name];\n if (value != null) {\n parsedValue = parseFunction(value);\n }\n return parsedValue == null ? defaultValue : parsedValue;\n }\n\n /**\n * Gets a namespace-qualified attribute.\n * @param {!shaka.extern.xml.Node} elem The element to get from.\n * @param {string} ns The namespace URI.\n * @param {string} name The local name of the attribute.\n * @return {?string} The attribute's value, or null if not present.\n */\n static getAttributeNS(elem, ns, name) {\n const schemaNS = shaka.util.TXml.getKnownNameSpace(ns);\n // Think this is equivalent\n const attribute = elem.attributes[`${schemaNS}:${name}`];\n return attribute || null;\n }\n\n /**\n * Finds namespace-qualified child XML elements.\n * @param {!shaka.extern.xml.Node} elem The parent XML element.\n * @param {string} ns The child XML element's namespace URI.\n * @param {string} name The child XML element's local name.\n * @return {!Array<!shaka.extern.xml.Node>} The child XML elements.\n */\n static findChildrenNS(elem, ns, name) {\n const schemaNS = shaka.util.TXml.getKnownNameSpace(ns);\n const found = [];\n if (elem.children) {\n const tagName = schemaNS ? `${schemaNS}:${name}` : name;\n for (const child of elem.children) {\n if (child && child.tagName === tagName) {\n found.push(child);\n }\n }\n }\n return found;\n }\n\n /**\n * Gets a namespace-qualified attribute.\n * @param {!shaka.extern.xml.Node} elem The element to get from.\n * @param {!Array<string>} nsList The lis of namespace URIs.\n * @param {string} name The local name of the attribute.\n * @return {?string} The attribute's value, or null if not present.\n */\n static getAttributeNSList(elem, nsList, name) {\n for (const ns of nsList) {\n const attr = shaka.util.TXml.getAttributeNS(\n elem, ns, name,\n );\n if (attr) {\n return attr;\n }\n }\n return null;\n }\n\n\n /**\n * Parses an XML date string.\n * @param {string} dateString\n * @return {?number} The parsed date in seconds on success; otherwise, return\n * null.\n */\n static parseDate(dateString) {\n if (!dateString) {\n return null;\n }\n\n // Times in the manifest should be in UTC. If they don't specify a timezone,\n // Date.parse() will use the local timezone instead of UTC. So manually add\n // the timezone if missing ('Z' indicates the UTC timezone).\n // Format: YYYY-MM-DDThh:mm:ss.ssssss\n if (/^\\d+-\\d+-\\d+T\\d+:\\d+:\\d+(\\.\\d+)?$/.test(dateString)) {\n dateString += 'Z';\n }\n\n const result = Date.parse(dateString);\n return isNaN(result) ? null : (result / 1000.0);\n }\n\n\n /**\n * Parses an XML duration string.\n * Negative values are not supported. Years and months are treated as exactly\n * 365 and 30 days respectively.\n * @param {string} durationString The duration string, e.g., \"PT1H3M43.2S\",\n * which means 1 hour, 3 minutes, and 43.2 seconds.\n * @return {?number} The parsed duration in seconds on success; otherwise,\n * return null.\n * @see {@link http://www.datypic.com/sc/xsd/t-xsd_duration.html}\n */\n static parseDuration(durationString) {\n if (!durationString) {\n return null;\n }\n\n const re = '^P(?:([0-9]*)Y)?(?:([0-9]*)M)?(?:([0-9]*)D)?' +\n '(?:T(?:([0-9]*)H)?(?:([0-9]*)M)?(?:([0-9.]*)S)?)?$';\n const matches = new RegExp(re, 'i').exec(durationString);\n\n if (!matches) {\n shaka.log.warning('Invalid duration string:', durationString);\n return null;\n }\n\n // Note: Number(null) == 0 but Number(undefined) == NaN.\n const years = Number(matches[1] || null);\n const months = Number(matches[2] || null);\n const days = Number(matches[3] || null);\n const hours = Number(matches[4] || null);\n const minutes = Number(matches[5] || null);\n const seconds = Number(matches[6] || null);\n\n // Assume a year always has 365 days and a month always has 30 days.\n const d = (60 * 60 * 24 * 365) * years +\n (60 * 60 * 24 * 30) * months +\n (60 * 60 * 24) * days +\n (60 * 60) * hours +\n 60 * minutes +\n seconds;\n return isFinite(d) ? d : null;\n }\n\n\n /**\n * Parses a range string.\n * @param {string} rangeString The range string, e.g., \"101-9213\".\n * @return {?{start: number, end: number}} The parsed range on success;\n * otherwise, return null.\n */\n static parseRange(rangeString) {\n const matches = /([0-9]+)-([0-9]+)/.exec(rangeString);\n\n if (!matches) {\n return null;\n }\n\n const start = Number(matches[1]);\n if (!isFinite(start)) {\n return null;\n }\n\n const end = Number(matches[2]);\n if (!isFinite(end)) {\n return null;\n }\n\n return {start: start, end: end};\n }\n\n\n /**\n * Parses an integer.\n * @param {string} intString The integer string.\n * @return {?number} The parsed integer on success; otherwise, return null.\n */\n static parseInt(intString) {\n const n = Number(intString);\n return (n % 1 === 0) ? n : null;\n }\n\n\n /**\n * Parses a positive integer.\n * @param {string} intString The integer string.\n * @return {?number} The parsed positive integer on success; otherwise,\n * return null.\n */\n static parsePositiveInt(intString) {\n const n = Number(intString);\n return (n % 1 === 0) && (n > 0) ? n : null;\n }\n\n\n /**\n * Parses a non-negative integer.\n * @param {string} intString The integer string.\n * @return {?number} The parsed non-negative integer on success; otherwise,\n * return null.\n */\n static parseNonNegativeInt(intString) {\n const n = Number(intString);\n return (n % 1 === 0) && (n >= 0) ? n : null;\n }\n\n\n /**\n * Parses a floating point number.\n * @param {string} floatString The floating point number string.\n * @return {?number} The parsed floating point number on success; otherwise,\n * return null. May return -Infinity or Infinity.\n */\n static parseFloat(floatString) {\n const n = Number(floatString);\n return !isNaN(n) ? n : null;\n }\n\n\n /**\n * Parses a boolean.\n * @param {string} booleanString The boolean string.\n * @return {boolean} The boolean\n */\n static parseBoolean(booleanString) {\n if (!booleanString) {\n return false;\n }\n return booleanString.toLowerCase() === 'true';\n }\n\n\n /**\n * Evaluate a division expressed as a string.\n * @param {string} exprString\n * The expression to evaluate, e.g. \"200/2\". Can also be a single number.\n * @return {?number} The evaluated expression as floating point number on\n * success; otherwise return null.\n */\n static evalDivision(exprString) {\n let res;\n let n;\n if ((res = exprString.match(/^(\\d+)\\/(\\d+)$/))) {\n n = Number(res[1]) / Number(res[2]);\n } else {\n n = Number(exprString);\n }\n return !isNaN(n) ? n : null;\n }\n\n\n /**\n * Parse xPath strings for segments and id targets.\n * @param {string} exprString\n * @return {!Array<!shaka.util.TXml.PathNode>}\n */\n static parseXpath(exprString) {\n const StringUtils = shaka.util.StringUtils;\n const returnPaths = [];\n // Split string by paths but ignore '/' in quotes\n const paths = StringUtils.htmlUnescape(exprString)\n .split(/\\/+(?=(?:[^'\"]*['\"][^'\"]*['\"])*[^'\"]*$)/);\n for (const path of paths) {\n const nodeName = path.match(/^([\\w]+)/);\n\n if (nodeName) {\n // We only want the id attribute in which case\n // /'(.*?)'/ will suffice to get it.\n const idAttr = path.match(/(@id='(.*?)')/);\n const tAttr = path.match(/(@t='(\\d+)')/);\n const numberIndex = path.match(/(@n='(\\d+)')/);\n const position = path.match(/\\[(\\d+)\\]/);\n returnPaths.push({\n name: nodeName[0],\n id: idAttr ?\n idAttr[0].match(/'(.*?)'/)[0].replace(/'/gm, '') : null,\n t: tAttr ?\n Number(tAttr[0].match(/'(.*?)'/)[0].replace(/'/gm, '')) : null,\n n: numberIndex ?\n Number(numberIndex[0].match(/'(.*?)'/)[0].replace(/'/gm, '')):\n null,\n // position is counted from 1, so make it readable for devs\n position: position ? Number(position[1]) - 1 : null,\n attribute: path.split('/@')[1] || null,\n });\n } else if (path.startsWith('@') && returnPaths.length) {\n returnPaths[returnPaths.length - 1].attribute = path.slice(1);\n }\n }\n return returnPaths;\n }\n\n\n /**\n * Modifies nodes in specified array by adding or removing nodes\n * and updating attributes.\n * @param {!Array<shaka.extern.xml.Node>} nodes\n * @param {!shaka.extern.xml.Node} patchNode\n */\n static modifyNodes(nodes, patchNode) {\n const TXml = shaka.util.TXml;\n\n const paths = TXml.parseXpath(patchNode.attributes['sel'] || '');\n if (!paths.length) {\n return;\n }\n const lastNode = paths[paths.length - 1];\n const position = patchNode.attributes['pos'] || null;\n\n let index = lastNode.position;\n if (index == null) {\n if (lastNode.t !== null) {\n index = TXml.nodePositionByAttribute_(nodes, 't', lastNode.t);\n }\n if (lastNode.n !== null) {\n index = TXml.nodePositionByAttribute_(nodes, 'n', lastNode.n);\n }\n }\n if (index === null) {\n index = position === 'prepend' ? 0 : nodes.length;\n } else if (position === 'prepend') {\n --index;\n } else if (position === 'after') {\n ++index;\n }\n const action = patchNode.tagName;\n const attribute = lastNode.attribute;\n\n // Modify attribute\n if (attribute && nodes[index]) {\n TXml.modifyNodeAttribute(nodes[index], action, attribute,\n TXml.getContents(patchNode) || '');\n // Rearrange nodes\n } else {\n if (action === 'remove' || action === 'replace') {\n nodes.splice(index, 1);\n }\n if (action === 'add' || action === 'replace') {\n const newNodes = patchNode.children;\n nodes.splice(index, 0, ...newNodes);\n }\n }\n }\n\n\n /**\n * Search the node index by the t attribute\n * and return the index. if not found return null\n * @param {!Array<shaka.extern.xml.Node>} nodes\n * @param {!string} attribute\n * @param {!number} value\n * @return {?number}\n * @private\n */\n static nodePositionByAttribute_(nodes, attribute, value) {\n let index = 0;\n for (const node of nodes) {\n const attrs = node.attributes;\n const val = Number(attrs[attribute]);\n if (val === value) {\n return index;\n }\n index++;\n }\n return null;\n }\n\n\n /**\n * @param {!shaka.extern.xml.Node} node\n * @param {string} action\n * @param {string} attribute\n * @param {string} value\n */\n static modifyNodeAttribute(node, action, attribute, value) {\n if (action === 'remove') {\n delete node.attributes[attribute];\n } else if (action === 'add' || action === 'replace') {\n node.attributes[attribute] = value;\n }\n }\n\n\n /**\n * Converts a tXml node to DOM element.\n * @param {shaka.extern.xml.Node} node\n * @return {!Element}\n */\n static txmlNodeToDomElement(node) {\n const TXml = shaka.util.TXml;\n let namespace = '';\n const parts = node.tagName.split(':');\n if (parts.length > 0) {\n namespace = TXml.getKnownSchema(parts[0]);\n }\n const element = document.createElementNS(namespace, node.tagName);\n\n for (const k in node.attributes) {\n const v = node.attributes[k];\n element.setAttribute(k, v);\n }\n\n for (const child of node.children) {\n let childElement;\n if (typeof child == 'string') {\n childElement = new Text(child);\n } else {\n childElement = TXml.txmlNodeToDomElement(child);\n }\n element.appendChild(childElement);\n }\n\n return element;\n }\n\n /**\n * Clones node and its children recursively. Skips parent.\n * @param {?shaka.extern.xml.Node} node\n * @return {?shaka.extern.xml.Node}\n */\n static cloneNode(node) {\n if (!node) {\n return null;\n }\n /** @type {!shaka.extern.xml.Node} */\n const clone = {\n tagName: node.tagName,\n attributes: shaka.util.ObjectUtils.shallowCloneObject(node.attributes),\n children: [],\n parent: null,\n };\n for (const child of node.children) {\n if (typeof child === 'string') {\n clone.children.push(child);\n } else {\n const clonedChild = shaka.util.TXml.cloneNode(child);\n clonedChild.parent = clone;\n clone.children.push(clonedChild);\n }\n }\n return clone;\n }\n};\n\n/** @private {!Map<string, string>} */\nshaka.util.TXml.uriToNameSpace_ = new Map();\n\n/** @private {!Map<string, string>} */\nshaka.util.TXml.nameSpaceToUri_ = new Map();\n\n\n/**\n * @typedef {{\n * name: string,\n * id: ?string,\n * t: ?number,\n * n: ?number,\n * position: ?number,\n * attribute: ?string\n * }}\n */\nshaka.util.TXml.PathNode;\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.text.Cue');\n\ngoog.require('shaka.log');\ngoog.require('shaka.text.CueRegion');\ngoog.require('shaka.util.ArrayUtils');\ngoog.require('shaka.util.StringUtils');\ngoog.require('shaka.util.TextParser');\ngoog.require('shaka.util.TXml');\n\n\n/**\n * @export\n */\nshaka.text.Cue = class {\n /**\n * @param {number} startTime\n * @param {number} endTime\n * @param {string} payload\n */\n constructor(startTime, endTime, payload) {\n const Cue = shaka.text.Cue;\n\n /**\n * The start time of the cue in seconds, relative to the start of the\n * presentation.\n * @type {number}\n * @export\n */\n this.startTime = startTime;\n\n /**\n * The end time of the cue in seconds, relative to the start of the\n * presentation.\n * @type {number}\n * @export\n */\n this.endTime = endTime;\n\n /**\n * The text payload of the cue. If nestedCues is non-empty, this should be\n * empty. Top-level block containers should have no payload of their own.\n * @type {string}\n * @export\n */\n this.payload = payload;\n\n /**\n * The region to render the cue into. Only supported on top-level cues,\n * because nested cues are inline elements.\n * @type {shaka.text.CueRegion}\n * @export\n */\n this.region = new shaka.text.CueRegion();\n\n /**\n * The indent (in percent) of the cue box in the direction defined by the\n * writing direction.\n * @type {?number}\n * @export\n */\n this.position = null;\n\n /**\n * Position alignment of the cue.\n * @type {shaka.text.Cue.positionAlign}\n * @export\n */\n this.positionAlign = Cue.positionAlign.AUTO;\n\n /**\n * Size of the cue box (in percents), where 0 means \"auto\".\n * @type {number}\n * @export\n */\n this.size = 0;\n\n /**\n * Alignment of the text inside the cue box.\n * @type {shaka.text.Cue.textAlign}\n * @export\n */\n this.textAlign = Cue.textAlign.CENTER;\n\n /**\n * Text direction of the cue.\n * @type {shaka.text.Cue.direction}\n * @export\n */\n this.direction = Cue.direction.HORIZONTAL_LEFT_TO_RIGHT;\n\n /**\n * Text writing mode of the cue.\n * @type {shaka.text.Cue.writingMode}\n * @export\n */\n this.writingMode = Cue.writingMode.HORIZONTAL_TOP_TO_BOTTOM;\n\n /**\n * The way to interpret line field. (Either as an integer line number or\n * percentage from the display box).\n * @type {shaka.text.Cue.lineInterpretation}\n * @export\n */\n this.lineInterpretation = Cue.lineInterpretation.LINE_NUMBER;\n\n /**\n * The offset from the display box in either number of lines or\n * percentage depending on the value of lineInterpretation.\n * @type {?number}\n * @export\n */\n this.line = null;\n\n /**\n * Separation between line areas inside the cue box in px or em\n * (e.g. '100px'/'100em'). If not specified, this should be no less than\n * the largest font size applied to the text in the cue.\n * @type {string}.\n * @export\n */\n this.lineHeight = '';\n\n /**\n * Line alignment of the cue box.\n * Start alignment means the cue box’s top side (for horizontal cues), left\n * side (for vertical growing right), or right side (for vertical growing\n * left) is aligned at the line.\n * Center alignment means the cue box is centered at the line.\n * End alignment The cue box’s bottom side (for horizontal cues), right side\n * (for vertical growing right), or left side (for vertical growing left) is\n * aligned at the line.\n * @type {shaka.text.Cue.lineAlign}\n * @export\n */\n this.lineAlign = Cue.lineAlign.START;\n\n /**\n * Vertical alignments of the cues within their extents.\n * 'BEFORE' means displaying the captions at the top of the text display\n * container box, 'CENTER' means in the middle, 'AFTER' means at the bottom.\n * @type {shaka.text.Cue.displayAlign}\n * @export\n */\n this.displayAlign = Cue.displayAlign.AFTER;\n\n /**\n * Text color as a CSS color, e.g. \"#FFFFFF\" or \"white\".\n * @type {string}\n * @export\n */\n this.color = '';\n\n /**\n * Text background color as a CSS color, e.g. \"#FFFFFF\" or \"white\".\n * @type {string}\n * @export\n */\n this.backgroundColor = '';\n\n /**\n * The URL of the background image, e.g. \"data:[mime type];base64,[data]\".\n * @type {string}\n * @export\n */\n this.backgroundImage = '';\n\n /**\n * The border around this cue as a CSS border.\n * @type {string}\n * @export\n */\n this.border = '';\n\n /**\n * Text font size in px or em (e.g. '100px'/'100em').\n * @type {string}\n * @export\n */\n this.fontSize = '';\n\n /**\n * Text font weight. Either normal or bold.\n * @type {shaka.text.Cue.fontWeight}\n * @export\n */\n this.fontWeight = Cue.fontWeight.NORMAL;\n\n /**\n * Text font style. Normal, italic or oblique.\n * @type {shaka.text.Cue.fontStyle}\n * @export\n */\n this.fontStyle = Cue.fontStyle.NORMAL;\n\n /**\n * Text font family.\n * @type {string}\n * @export\n */\n this.fontFamily = '';\n\n /**\n * Text letter spacing as a CSS letter-spacing value.\n * @type {string}\n * @export\n */\n this.letterSpacing = '';\n\n /**\n * Text line padding as a CSS line-padding value.\n * @type {string}\n * @export\n */\n this.linePadding = '';\n\n /**\n * Opacity of the cue element, from 0-1.\n * @type {number}\n * @export\n */\n this.opacity = 1;\n\n /**\n * Text combine upright as a CSS text-combine-upright value.\n * @type {string}\n * @export\n */\n this.textCombineUpright = '';\n\n /**\n * Text decoration. A combination of underline, overline\n * and line through. Empty array means no decoration.\n * @type {!Array<!shaka.text.Cue.textDecoration>}\n * @export\n */\n this.textDecoration = [];\n\n /**\n * Text shadow color as a CSS text-shadow value.\n * @type {string}\n * @export\n */\n this.textShadow = '';\n\n /**\n * Text stroke color as a CSS color, e.g. \"#FFFFFF\" or \"white\".\n * @type {string}\n * @export\n */\n this.textStrokeColor = '';\n\n /**\n * Text stroke width as a CSS stroke-width value.\n * @type {string}\n * @export\n */\n this.textStrokeWidth = '';\n\n /**\n * Whether or not line wrapping should be applied to the cue.\n * @type {boolean}\n * @export\n */\n this.wrapLine = true;\n\n /**\n * Id of the cue.\n * @type {string}\n * @export\n */\n this.id = '';\n\n /**\n * Nested cues, which should be laid out horizontally in one block.\n * Top-level cues are blocks, and nested cues are inline elements.\n * Cues can be nested arbitrarily deeply.\n * @type {!Array<!shaka.text.Cue>}\n * @export\n */\n this.nestedCues = [];\n\n /**\n * If true, this represents a container element that is \"above\" the main\n * cues. For example, the <body> and <div> tags that contain the <p> tags\n * in a TTML file. This controls the flow of the final cues; any nested cues\n * within an \"isContainer\" cue will be laid out as separate lines.\n * @type {boolean}\n * @export\n */\n this.isContainer = false;\n\n /**\n * Whether or not the cue only acts as a line break between two nested cues.\n * Should only appear in nested cues.\n * @type {boolean}\n * @export\n */\n this.lineBreak = false;\n\n /**\n * Used to indicate the type of ruby tag that should be used when rendering\n * the cue. Valid values: ruby, rp, rt.\n * @type {?string}\n * @export\n */\n this.rubyTag = null;\n\n /**\n * The number of horizontal and vertical cells into which the Root Container\n * Region area is divided.\n *\n * @type {{ columns: number, rows: number }}\n * @export\n */\n this.cellResolution = {\n columns: 32,\n rows: 15,\n };\n }\n\n /**\n * @param {number} start\n * @param {number} end\n * @return {!shaka.text.Cue}\n */\n static lineBreak(start, end) {\n const cue = new shaka.text.Cue(start, end, '');\n cue.lineBreak = true;\n return cue;\n }\n\n /**\n * Create a copy of the cue with the same properties.\n * @return {!shaka.text.Cue}\n * @suppress {checkTypes} since we must use [] and \"in\" with a struct type.\n * @export\n */\n clone() {\n const clone = new shaka.text.Cue(0, 0, '');\n\n for (const k in this) {\n clone[k] = this[k];\n\n // Make copies of array fields, but only one level deep. That way, if we\n // change, for instance, textDecoration on the clone, we don't affect the\n // original.\n if (clone[k] && clone[k].constructor == Array) {\n clone[k] = /** @type {!Array} */(clone[k]).slice();\n }\n }\n\n return clone;\n }\n\n /**\n * Check if two Cues have all the same values in all properties.\n * @param {!shaka.text.Cue} cue1\n * @param {!shaka.text.Cue} cue2\n * @return {boolean}\n * @suppress {checkTypes} since we must use [] and \"in\" with a struct type.\n * @export\n */\n static equal(cue1, cue2) {\n // Compare the start time, end time and payload of the cues first for\n // performance optimization. We can avoid the more expensive recursive\n // checks if the top-level properties don't match.\n // See: https://github.com/shaka-project/shaka-player/issues/3018\n if (cue1.payload != cue2.payload) {\n return false;\n }\n const isDiffNegligible = (a, b) => Math.abs(a - b) < 0.001;\n if (!isDiffNegligible(cue1.startTime, cue2.startTime) ||\n !isDiffNegligible(cue1.endTime, cue2.endTime)) {\n return false;\n }\n for (const k in cue1) {\n if (k == 'startTime' || k == 'endTime' || k == 'payload') {\n // Already compared.\n } else if (k == 'nestedCues') {\n // This uses shaka.text.Cue.equal rather than just this.equal, since\n // otherwise recursing here will unbox the method and cause \"this\" to be\n // undefined in deeper recursion.\n if (!shaka.util.ArrayUtils.equal(\n cue1.nestedCues, cue2.nestedCues, shaka.text.Cue.equal)) {\n return false;\n }\n } else if (k == 'region' || k == 'cellResolution') {\n for (const k2 in cue1[k]) {\n if (cue1[k][k2] != cue2[k][k2]) {\n return false;\n }\n }\n } else if (Array.isArray(cue1[k])) {\n if (!shaka.util.ArrayUtils.equal(cue1[k], cue2[k])) {\n return false;\n }\n } else {\n if (cue1[k] != cue2[k]) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n /**\n * Parses cue payload, searches for styling entities and, if needed,\n * modifies original payload and creates nested cues to better represent\n * styling found in payload. All changes are done in-place.\n * @param {!shaka.text.Cue} cue\n * @param {!Map<string, !shaka.text.Cue>=} styles\n * @export\n */\n static parseCuePayload(cue, styles = new Map()) {\n const StringUtils = shaka.util.StringUtils;\n const TXml = shaka.util.TXml;\n let payload = cue.payload;\n if (!payload.includes('<')) {\n cue.payload = StringUtils.htmlUnescape(payload);\n return;\n }\n if (styles.size === 0) {\n shaka.text.Cue.addDefaultTextColor(styles);\n }\n payload = shaka.text.Cue.replaceKaraokeStylePayload_(payload);\n payload = shaka.text.Cue.replaceVoiceStylePayload_(payload);\n payload = shaka.text.Cue.escapeInvalidChevrons_(payload);\n\n cue.payload = '';\n\n const xmlPayload = '<span>' + payload + '</span>';\n let element;\n try {\n element = TXml.parseXmlString(xmlPayload, 'span');\n } catch (e) {\n shaka.log.warning('cue parse fail: ', e);\n }\n if (element) {\n const childNodes = element.children;\n if (childNodes.length == 1) {\n const childNode = childNodes[0];\n if (!TXml.isNode(childNode)) {\n cue.payload = StringUtils.htmlUnescape(payload);\n return;\n }\n }\n for (const childNode of childNodes) {\n shaka.text.Cue.generateCueFromElement_(childNode, cue, styles);\n }\n } else {\n shaka.log.warning('The cue\\'s markup could not be parsed: ', payload);\n cue.payload = StringUtils.htmlUnescape(payload);\n }\n }\n\n /**\n * Add default color\n *\n * @param {!Map<string, !shaka.text.Cue>} styles\n */\n static addDefaultTextColor(styles) {\n const textColor = shaka.text.Cue.defaultTextColor;\n for (const [key, value] of Object.entries(textColor)) {\n const cue = new shaka.text.Cue(0, 0, '');\n cue.color = value;\n styles.set('.' + key, cue);\n }\n\n const bgColor = shaka.text.Cue.defaultTextBackgroundColor;\n for (const [key, value] of Object.entries(bgColor)) {\n const cue = new shaka.text.Cue(0, 0, '');\n cue.backgroundColor = value;\n styles.set('.' + key, cue);\n }\n }\n\n /**\n * Converts karaoke style tag to be valid for xml parsing\n * For example,\n * input: Text <00:00:00.450> time <00:00:01.450> 1\n * output: Text <div time=\"00:00:00.450\"> time\n * <div time=\"00:00:01.450\"> 1</div></div>\n *\n * @param {string} payload\n * @return {string} processed payload\n * @private\n */\n static replaceKaraokeStylePayload_(payload) {\n const names = [];\n let nameStart = -1;\n for (let i = 0; i < payload.length; i++) {\n if (payload[i] === '<') {\n nameStart = i + 1;\n } else if (payload[i] === '>') {\n if (nameStart > 0) {\n const name = payload.substr(nameStart, i - nameStart);\n if (name.match(shaka.text.Cue.timeFormat_)) {\n names.push(name);\n }\n nameStart = -1;\n }\n }\n }\n let newPayload = payload;\n for (const name of names) {\n const replaceTag = '<' + name + '>';\n const startTag = '<div time=\"' + name + '\">';\n const endTag = '</div>';\n newPayload = newPayload.replace(replaceTag, startTag);\n newPayload += endTag;\n }\n return newPayload;\n }\n\n /**\n * Converts voice style tag to be valid for xml parsing\n * For example,\n * input: <v Shaka>Test\n * output: <v.voice-Shaka>Test</v.voice-Shaka>\n *\n * @param {string} payload\n * @return {string} processed payload\n * @private\n */\n static replaceVoiceStylePayload_(payload) {\n const voiceTag = 'v';\n const names = [];\n let nameStart = -1;\n let newPayload = '';\n let hasVoiceEndTag = false;\n for (let i = 0; i < payload.length; i++) {\n // This condition is used to manage tags that have end tags.\n if (payload[i] === '/') {\n const end = payload.indexOf('>', i);\n if (end === -1) {\n return payload;\n }\n const tagEnd = payload.substring(i + 1, end);\n if (!tagEnd || tagEnd != voiceTag) {\n newPayload += payload[i];\n continue;\n }\n hasVoiceEndTag = true;\n let tagStart = null;\n if (names.length) {\n tagStart = names[names.length -1];\n }\n if (!tagStart) {\n newPayload += payload[i];\n } else if (tagStart === tagEnd) {\n newPayload += '/' + tagEnd + '>';\n i += tagEnd.length + 1;\n } else {\n if (!tagStart.startsWith(voiceTag)) {\n newPayload += payload[i];\n continue;\n }\n newPayload += '/' + tagStart + '>';\n i += tagEnd.length + 1;\n }\n } else {\n // Here we only want the tag name, not any other payload.\n if (payload[i] === '<') {\n nameStart = i + 1;\n if (payload[nameStart] != voiceTag) {\n nameStart = -1;\n }\n } else if (payload[i] === '>') {\n if (nameStart > 0) {\n names.push(payload.substr(nameStart, i - nameStart));\n nameStart = -1;\n }\n }\n newPayload += payload[i];\n }\n }\n for (const name of names) {\n const newName = name.replace(' ', '.voice-');\n newPayload = newPayload.replace(`<${name}>`, `<${newName}>`);\n newPayload = newPayload.replace(`</${name}>`, `</${newName}>`);\n if (!hasVoiceEndTag) {\n newPayload += `</${newName}>`;\n }\n }\n return newPayload;\n }\n\n /**\n * This method converts invalid > chevrons to HTML entities.\n * It also removes < chevrons as per spec.\n *\n * @param {!string} input\n * @return {string}\n * @private\n */\n static escapeInvalidChevrons_(input) {\n // Used to map HTML entities to characters.\n const htmlEscapes = {\n '< ': '',\n ' >': ' >',\n };\n\n const reEscapedHtml = /(< +>|<\\s|\\s>)/g;\n const reHasEscapedHtml = RegExp(reEscapedHtml.source);\n // This check is an optimization, since replace always makes a copy\n if (input && reHasEscapedHtml.test(input)) {\n return input.replace(reEscapedHtml, (entity) => {\n return htmlEscapes[entity] || '';\n });\n }\n return input || '';\n }\n\n /**\n * @param {!shaka.extern.xml.Node} element\n * @param {!shaka.text.Cue} rootCue\n * @param {!Map<string, !shaka.text.Cue>} styles\n * @private\n */\n static generateCueFromElement_(element, rootCue, styles) {\n const TXml = shaka.util.TXml;\n const nestedCue = rootCue.clone();\n // We don't want propagate some properties.\n nestedCue.nestedCues = [];\n nestedCue.payload = '';\n nestedCue.rubyTag = '';\n // We don't want propagate some position settings\n nestedCue.line = null;\n nestedCue.region = new shaka.text.CueRegion();\n nestedCue.position = null;\n nestedCue.size = 0;\n nestedCue.textAlign = shaka.text.Cue.textAlign.CENTER;\n\n if (TXml.isNode(element)) {\n const bold = shaka.text.Cue.fontWeight.BOLD;\n const italic = shaka.text.Cue.fontStyle.ITALIC;\n const underline = shaka.text.Cue.textDecoration.UNDERLINE;\n const tags = element.tagName.split(/(?=[ .])+/g);\n for (const tag of tags) {\n let styleTag = tag;\n // White blanks at start indicate that the style is a voice\n if (styleTag.startsWith('.voice-')) {\n const voice = styleTag.split('-').pop();\n styleTag = `v[voice=\"${voice}\"]`;\n // The specification allows to have quotes and not, so we check to\n // see which one is being used.\n if (!styles.has(styleTag)) {\n styleTag = `v[voice=${voice}]`;\n }\n }\n if (styles.has(styleTag)) {\n shaka.text.Cue.mergeStyle_(nestedCue, styles.get(styleTag));\n }\n switch (tag) {\n case 'br': {\n const lineBreakCue = shaka.text.Cue.lineBreak(\n nestedCue.startTime, nestedCue.endTime);\n rootCue.nestedCues.push(lineBreakCue);\n return;\n }\n case 'b':\n nestedCue.fontWeight = bold;\n break;\n case 'i':\n nestedCue.fontStyle = italic;\n break;\n case 'u':\n nestedCue.textDecoration.push(underline);\n break;\n case 'font': {\n const color = element.attributes['color'];\n if (color) {\n nestedCue.color = color;\n }\n break;\n }\n case 'div': {\n const time = element.attributes['time'];\n if (!time) {\n break;\n }\n const cueTime = shaka.util.TextParser.parseTime(time);\n if (cueTime) {\n nestedCue.startTime = cueTime;\n }\n break;\n }\n case 'ruby':\n case 'rp':\n case 'rt':\n nestedCue.rubyTag = tag;\n break;\n default:\n break;\n }\n }\n }\n\n const isTextNode = (item) => TXml.isText(item);\n const childNodes = element.children;\n if (isTextNode(element) ||\n (childNodes.length == 1 && isTextNode(childNodes[0]))) {\n // Trailing line breaks may lost when convert cue to HTML tag\n // Need to insert line break cue to preserve line breaks\n const textArr = TXml.getTextContents(element).split('\\n');\n let isFirst = true;\n for (const text of textArr) {\n if (!isFirst) {\n const lineBreakCue = shaka.text.Cue.lineBreak(\n nestedCue.startTime, nestedCue.endTime);\n rootCue.nestedCues.push(lineBreakCue);\n }\n if (text.length > 0) {\n const textCue = nestedCue.clone();\n textCue.payload = shaka.util.StringUtils.htmlUnescape(text);\n rootCue.nestedCues.push(textCue);\n }\n isFirst = false;\n }\n } else {\n rootCue.nestedCues.push(nestedCue);\n for (const childNode of childNodes) {\n shaka.text.Cue.generateCueFromElement_(childNode, nestedCue, styles);\n }\n }\n }\n\n /**\n * Merges values created in parseStyle_\n * @param {!shaka.text.Cue} cue\n * @param {shaka.text.Cue} refCue\n * @private\n */\n static mergeStyle_(cue, refCue) {\n if (!refCue) {\n return;\n }\n\n // Overwrites if new value string length > 0\n cue.backgroundColor = shaka.text.Cue.getOrDefault_(\n refCue.backgroundColor, cue.backgroundColor);\n cue.color = shaka.text.Cue.getOrDefault_(\n refCue.color, cue.color);\n cue.fontFamily = shaka.text.Cue.getOrDefault_(\n refCue.fontFamily, cue.fontFamily);\n cue.fontSize = shaka.text.Cue.getOrDefault_(\n refCue.fontSize, cue.fontSize);\n cue.textShadow = shaka.text.Cue.getOrDefault_(\n refCue.textShadow, cue.textShadow);\n\n // Overwrite with new values as unable to determine\n // if new value is set or not\n cue.fontWeight = refCue.fontWeight;\n cue.fontStyle = refCue.fontStyle;\n cue.opacity = refCue.opacity;\n cue.rubyTag = refCue.rubyTag;\n cue.textCombineUpright = refCue.textCombineUpright;\n cue.wrapLine = refCue.wrapLine;\n }\n\n /**\n * @param {string} value\n * @param {string} defaultValue\n * @return {string}\n * @private\n */\n static getOrDefault_(value, defaultValue) {\n if (value && value.length > 0) {\n return value;\n }\n return defaultValue;\n }\n};\n\n\n/**\n * @enum {string}\n * @export\n */\nshaka.text.Cue.positionAlign = {\n 'LEFT': 'line-left',\n 'RIGHT': 'line-right',\n 'CENTER': 'center',\n 'AUTO': 'auto',\n};\n\n\n/**\n * @enum {string}\n * @export\n */\nshaka.text.Cue.textAlign = {\n 'LEFT': 'left',\n 'RIGHT': 'right',\n 'CENTER': 'center',\n 'START': 'start',\n 'END': 'end',\n};\n\n\n/**\n * Vertical alignments of the cues within their extents.\n * 'BEFORE' means displaying at the top of the captions container box, 'CENTER'\n * means in the middle, 'AFTER' means at the bottom.\n * @enum {string}\n * @export\n */\nshaka.text.Cue.displayAlign = {\n 'BEFORE': 'before',\n 'CENTER': 'center',\n 'AFTER': 'after',\n};\n\n\n/**\n * @enum {string}\n * @export\n */\nshaka.text.Cue.direction = {\n 'HORIZONTAL_LEFT_TO_RIGHT': 'ltr',\n 'HORIZONTAL_RIGHT_TO_LEFT': 'rtl',\n};\n\n\n/**\n * @enum {string}\n * @export\n */\nshaka.text.Cue.writingMode = {\n 'HORIZONTAL_TOP_TO_BOTTOM': 'horizontal-tb',\n 'VERTICAL_LEFT_TO_RIGHT': 'vertical-lr',\n 'VERTICAL_RIGHT_TO_LEFT': 'vertical-rl',\n};\n\n\n/**\n * @enum {number}\n * @export\n */\nshaka.text.Cue.lineInterpretation = {\n 'LINE_NUMBER': 0,\n 'PERCENTAGE': 1,\n};\n\n\n/**\n * @enum {string}\n * @export\n */\nshaka.text.Cue.lineAlign = {\n 'CENTER': 'center',\n 'START': 'start',\n 'END': 'end',\n};\n\n\n/**\n * Default text color according to\n * https://w3c.github.io/webvtt/#default-text-color\n * @enum {string}\n * @export\n */\nshaka.text.Cue.defaultTextColor = {\n 'white': 'white',\n 'lime': 'lime',\n 'cyan': 'cyan',\n 'red': 'red',\n 'yellow': 'yellow',\n 'magenta': 'magenta',\n 'blue': 'blue',\n 'black': 'black',\n};\n\n\n/**\n * Default text background color according to\n * https://w3c.github.io/webvtt/#default-text-background\n * @enum {string}\n * @export\n */\nshaka.text.Cue.defaultTextBackgroundColor = {\n 'bg_white': 'white',\n 'bg_lime': 'lime',\n 'bg_cyan': 'cyan',\n 'bg_red': 'red',\n 'bg_yellow': 'yellow',\n 'bg_magenta': 'magenta',\n 'bg_blue': 'blue',\n 'bg_black': 'black',\n};\n\n\n/**\n * In CSS font weight can be a number, where 400 is normal and 700 is bold.\n * Use these values for the enum for consistency.\n * @enum {number}\n * @export\n */\nshaka.text.Cue.fontWeight = {\n 'NORMAL': 400,\n 'BOLD': 700,\n};\n\n\n/**\n * @enum {string}\n * @export\n */\nshaka.text.Cue.fontStyle = {\n 'NORMAL': 'normal',\n 'ITALIC': 'italic',\n 'OBLIQUE': 'oblique',\n};\n\n\n/**\n * @enum {string}\n * @export\n */\nshaka.text.Cue.textDecoration = {\n 'UNDERLINE': 'underline',\n 'LINE_THROUGH': 'lineThrough',\n 'OVERLINE': 'overline',\n};\n\n/** @private */\nshaka.text.Cue.timeFormat_ = /(?:(\\d{1,}):)?(\\d{2}):(\\d{2})\\.(\\d{2,3})/g;\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.transmuxer.TransmuxerEngine');\n\ngoog.require('shaka.util.IDestroyable');\n\n\n// TODO: revisit this when Closure Compiler supports partially-exported classes.\n/**\n * @summary Manages transmuxer plugins.\n * @implements {shaka.util.IDestroyable}\n * @export\n */\nshaka.transmuxer.TransmuxerEngine = class {\n // TODO: revisit this when the compiler supports partially-exported classes.\n /**\n * @override\n * @export\n */\n destroy() {}\n\n /**\n * @param {string} mimeType\n * @param {!shaka.extern.TransmuxerPlugin} plugin\n * @param {number} priority\n * @export\n */\n static registerTransmuxer(mimeType, plugin, priority) {\n const TransmuxerEngine = shaka.transmuxer.TransmuxerEngine;\n const normalizedMimetype = TransmuxerEngine.normalizeMimeType_(mimeType);\n const key = normalizedMimetype + '-' + priority;\n TransmuxerEngine.transmuxerMap_.set(key, {\n priority: priority,\n plugin: plugin,\n });\n }\n\n /**\n * @param {string} mimeType\n * @param {number} priority\n * @export\n */\n static unregisterTransmuxer(mimeType, priority) {\n const TransmuxerEngine = shaka.transmuxer.TransmuxerEngine;\n const normalizedMimetype = TransmuxerEngine.normalizeMimeType_(mimeType);\n const key = normalizedMimetype + '-' + priority;\n TransmuxerEngine.transmuxerMap_.delete(key);\n }\n\n /**\n * @param {string} mimeType\n * @param {string=} contentType\n * @return {?shaka.extern.TransmuxerPlugin}\n * @export\n */\n static findTransmuxer(mimeType, contentType) {\n const TransmuxerEngine = shaka.transmuxer.TransmuxerEngine;\n const normalizedMimetype = TransmuxerEngine.normalizeMimeType_(mimeType);\n const priorities = [\n TransmuxerEngine.PluginPriority.APPLICATION,\n TransmuxerEngine.PluginPriority.PREFERRED,\n TransmuxerEngine.PluginPriority.PREFERRED_SECONDARY,\n TransmuxerEngine.PluginPriority.FALLBACK,\n ];\n for (const priority of priorities) {\n const key = normalizedMimetype + '-' + priority;\n const object = TransmuxerEngine.transmuxerMap_.get(key);\n if (object) {\n const transmuxer = object.plugin();\n const isSupported = transmuxer.isSupported(mimeType, contentType);\n transmuxer.destroy();\n if (isSupported) {\n return object.plugin;\n }\n }\n }\n return null;\n }\n\n /**\n * @param {string} mimeType\n * @return {string}\n * @private\n */\n static normalizeMimeType_(mimeType) {\n return mimeType.toLowerCase().split(';')[0];\n }\n\n /**\n * Check if the mime type and the content type is supported.\n * @param {string} mimeType\n * @param {string=} contentType\n * @return {boolean}\n */\n static isSupported(mimeType, contentType) {\n const TransmuxerEngine = shaka.transmuxer.TransmuxerEngine;\n const transmuxerPlugin = TransmuxerEngine.findTransmuxer(mimeType);\n if (!transmuxerPlugin) {\n return false;\n }\n return true;\n }\n\n /**\n * For any stream, convert its codecs to MP4 codecs.\n * @param {string} contentType\n * @param {string} mimeType\n * @return {string}\n */\n static convertCodecs(contentType, mimeType) {\n const TransmuxerEngine = shaka.transmuxer.TransmuxerEngine;\n const transmuxerPlugin = TransmuxerEngine.findTransmuxer(mimeType);\n if (!transmuxerPlugin) {\n return mimeType;\n }\n const transmuxer = transmuxerPlugin();\n const codecs = transmuxer.convertCodecs(contentType, mimeType);\n transmuxer.destroy();\n return codecs;\n }\n};\n\n\n/**\n * @typedef {{\n * plugin: shaka.extern.TransmuxerPlugin,\n * priority: number\n * }}\n * @property {shaka.extern.TransmuxerPlugin} plugin\n * The associated plugin.\n * @property {number} priority\n * The plugin's priority.\n */\nshaka.transmuxer.TransmuxerEngine.PluginObject;\n\n\n/**\n * @private {!Map<string, !shaka.transmuxer.TransmuxerEngine.PluginObject>}\n */\nshaka.transmuxer.TransmuxerEngine.transmuxerMap_ = new Map();\n\n\n/**\n * Priority level for transmuxer plugins.\n * If multiple plugins are provided for the same mime type, only the\n * highest-priority one is used.\n *\n * @enum {number}\n * @export\n */\nshaka.transmuxer.TransmuxerEngine.PluginPriority = {\n 'FALLBACK': 1,\n 'PREFERRED_SECONDARY': 2,\n 'PREFERRED': 3,\n 'APPLICATION': 4,\n};\n\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.MimeUtils');\n\ngoog.require('shaka.transmuxer.TransmuxerEngine');\ngoog.require('shaka.util.ManifestParserUtils');\n\n/**\n * @summary A set of utility functions for dealing with MIME types.\n * @export\n */\nshaka.util.MimeUtils = class {\n /**\n * Takes a MIME type and optional codecs string and produces the full MIME\n * type. Also remove the codecs for raw formats.\n *\n * @param {string} mimeType\n * @param {string=} codecs\n * @return {string}\n * @export\n */\n static getFullType(mimeType, codecs) {\n let fullMimeType = mimeType;\n if (codecs && !shaka.util.MimeUtils.RAW_FORMATS.includes(mimeType)) {\n fullMimeType += '; codecs=\"' + codecs + '\"';\n }\n return fullMimeType;\n }\n\n /**\n * Takes a MIME type and optional codecs string and produces the full MIME\n * type.\n *\n * @param {string} mimeType\n * @param {string=} codecs\n * @return {string}\n * @export\n */\n static getFullTypeWithAllCodecs(mimeType, codecs) {\n let fullMimeType = mimeType;\n if (codecs) {\n fullMimeType += '; codecs=\"' + codecs + '\"';\n }\n return fullMimeType;\n }\n\n /**\n * Takes a MIME type and a codecs string and produces the full MIME\n * type. If it's a transport stream, convert its codecs to MP4 codecs.\n * Otherwise for multiplexed content, convert the video MIME types to\n * their audio equivalents if the content type is audio.\n *\n * @param {string} mimeType\n * @param {string} codecs\n * @param {string} contentType\n * @return {string}\n */\n static getFullOrConvertedType(mimeType, codecs, contentType) {\n const MimeUtils = shaka.util.MimeUtils;\n const fullMimeType = MimeUtils.getFullType(mimeType, codecs);\n const fullMimeTypeWithAllCodecs = MimeUtils.getFullTypeWithAllCodecs(\n mimeType, codecs);\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n const TransmuxerEngine = shaka.transmuxer.TransmuxerEngine;\n\n if (TransmuxerEngine.isSupported(fullMimeTypeWithAllCodecs, contentType)) {\n return TransmuxerEngine.convertCodecs(\n contentType, fullMimeTypeWithAllCodecs);\n } else if (mimeType != 'video/mp2t' && contentType == ContentType.AUDIO) {\n // video/mp2t is the correct mime type for TS audio, so only replace the\n // word \"video\" with \"audio\" for non-TS audio content.\n return fullMimeType.replace('video', 'audio');\n }\n return fullMimeType;\n }\n\n\n /**\n * Takes a Stream object and produces an extended MIME type with information\n * beyond the container and codec type, when available.\n *\n * @param {shaka.extern.Stream} stream\n * @param {string} mimeType\n * @param {string} codecs\n * @return {string}\n */\n static getExtendedType(stream, mimeType, codecs) {\n const components = [mimeType];\n\n const extendedMimeParams = shaka.util.MimeUtils.EXTENDED_MIME_PARAMETERS_;\n extendedMimeParams.forEach((mimeKey, streamKey) => {\n const value = stream[streamKey];\n if (streamKey == 'codecs') {\n if (shaka.util.MimeUtils.RAW_FORMATS.includes(stream.mimeType)) {\n // Skip codecs for raw formats\n } else {\n components.push('codecs=\"' + codecs + '\"');\n }\n } else if (value) {\n components.push(mimeKey + '=\"' + value + '\"');\n }\n });\n if (stream.hdr == 'PQ') {\n components.push('eotf=\"smpte2084\"');\n }\n\n return components.join(';');\n }\n\n /**\n * Takes a full MIME type (with codecs) or basic MIME type (without codecs)\n * and returns a container type string (\"mp2t\", \"mp4\", \"webm\", etc.)\n *\n * @param {string} mimeType\n * @return {string}\n */\n static getContainerType(mimeType) {\n return mimeType.split(';')[0].split('/')[1];\n }\n\n /**\n * Split a list of codecs encoded in a string into a list of codecs.\n * @param {string} codecs\n * @return {!Array<string>}\n */\n static splitCodecs(codecs) {\n return codecs.split(',');\n }\n\n /**\n * Get the normalized codec from a codec string,\n * independently of their container.\n *\n * @param {string} codecString\n * @return {string}\n */\n static getNormalizedCodec(codecString) {\n const parts =\n shaka.util.MimeUtils.getCodecParts_(codecString);\n const base = parts[0].toLowerCase();\n const profile = parts[1].toLowerCase();\n switch (true) {\n case base === 'mp4a' && profile === '69':\n case base === 'mp4a' && profile === '6b':\n case base === 'mp4a' && profile === '40.34':\n return 'mp3';\n case base === 'mp4a' && profile === '66':\n case base === 'mp4a' && profile === '67':\n case base === 'mp4a' && profile === '68':\n case base === 'mp4a' && profile === '40.2':\n case base === 'mp4a' && profile === '40.02':\n case base === 'mp4a' && profile === '40.5':\n case base === 'mp4a' && profile === '40.05':\n case base === 'mp4a' && profile === '40.29':\n case base === 'mp4a' && profile === '40.42': // Extended HE-AAC\n return 'aac';\n case base === 'mp4a' && profile === 'a5':\n return 'ac-3'; // Dolby Digital\n case base === 'mp4a' && profile === 'a6':\n return 'ec-3'; // Dolby Digital Plus\n case base === 'mp4a' && profile === 'b2':\n return 'dtsx'; // DTS:X\n case base === 'mp4a' && profile === 'a9':\n return 'dtsc'; // DTS Digital Surround\n case base === 'vp09':\n return 'vp9';\n case base === 'avc1':\n case base === 'avc3':\n return 'avc'; // H264\n case base === 'hvc1':\n case base === 'hev1':\n return 'hevc'; // H265\n case base === 'vvc1':\n case base === 'vvi1':\n return 'vvc'; // H266\n case base === 'dvh1':\n case base === 'dvhe':\n if (profile && profile.startsWith('05')) {\n return 'dovi-p5'; // Dolby Vision profile 5\n }\n return 'dovi-hevc'; // Dolby Vision based in HEVC\n case base === 'dvav':\n case base === 'dva1':\n return 'dovi-avc'; // Dolby Vision based in AVC\n case base === 'dav1':\n return 'dovi-av1'; // Dolby Vision based in AV1\n case base === 'dvc1':\n case base === 'dvi1':\n return 'dovi-vvc'; // Dolby Vision based in VVC\n }\n return base;\n }\n\n /**\n * Get the base codec from a codec string.\n *\n * @param {string} codecString\n * @return {string}\n */\n static getCodecBase(codecString) {\n const codecsBase = [];\n for (const codec of codecString.split(',')) {\n const parts = shaka.util.MimeUtils.getCodecParts_(codec);\n codecsBase.push(parts[0]);\n }\n return codecsBase.sort().join(',');\n }\n\n /**\n * Takes a full MIME type (with codecs) or basic MIME type (without codecs)\n * and returns a basic MIME type (without codecs or other parameters).\n *\n * @param {string} mimeType\n * @return {string}\n */\n static getBasicType(mimeType) {\n return mimeType.split(';')[0];\n }\n\n /**\n * Takes a MIME type and returns the codecs parameter, or an empty string if\n * there is no codecs parameter.\n *\n * @param {string} mimeType\n * @return {string}\n */\n static getCodecs(mimeType) {\n // Parse the basic MIME type from its parameters.\n const pieces = mimeType.split(/ *; */);\n pieces.shift(); // Remove basic MIME type from pieces.\n\n const codecs = pieces.find((piece) => piece.startsWith('codecs='));\n if (!codecs) {\n return '';\n }\n\n // The value may be quoted, so remove quotes at the beginning or end.\n const value = codecs.split('=')[1].replace(/^\"|\"$/g, '');\n return value;\n }\n\n /**\n * Checks if the given MIME type is HLS MIME type.\n *\n * @param {string} mimeType\n * @return {boolean}\n */\n static isHlsType(mimeType) {\n return mimeType === 'application/x-mpegurl' ||\n mimeType === 'application/vnd.apple.mpegurl';\n }\n\n /**\n * Checks if the given MIME type is DASH MIME type.\n *\n * @param {string} mimeType\n * @return {boolean}\n */\n static isDashType(mimeType) {\n return mimeType === 'application/dash+xml' ||\n mimeType === 'video/vnd.mpeg.dash.mpd';\n }\n\n /**\n * Get the base and profile of a codec string. Where [0] will be the codec\n * base and [1] will be the profile.\n * @param {string} codecString\n * @return {!Array<string>}\n * @private\n */\n static getCodecParts_(codecString) {\n const parts = codecString.split('.');\n\n const base = parts[0];\n\n parts.shift();\n const profile = parts.join('.');\n\n // Make sure that we always return a \"base\" and \"profile\".\n return [base, profile];\n }\n};\n\n\n/**\n * A map from Stream object keys to MIME type parameters. These should be\n * ignored by platforms that do not recognize them.\n *\n * This initial set of parameters are all recognized by Chromecast.\n *\n * @const {!Map<string, string>}\n * @private\n */\nshaka.util.MimeUtils.EXTENDED_MIME_PARAMETERS_ = new Map()\n .set('codecs', 'codecs')\n .set('frameRate', 'framerate') // Ours is camelCase, theirs is lowercase.\n .set('bandwidth', 'bitrate') // They are in the same units: bits/sec.\n .set('width', 'width')\n .set('height', 'height')\n .set('channelsCount', 'channels');\n\n\n/**\n * A mimetype created for CEA-608 closed captions.\n * @const {string}\n */\nshaka.util.MimeUtils.CEA608_CLOSED_CAPTION_MIMETYPE = 'application/cea-608';\n\n/**\n * A mimetype created for CEA-708 closed captions.\n * @const {string}\n */\nshaka.util.MimeUtils.CEA708_CLOSED_CAPTION_MIMETYPE = 'application/cea-708';\n\n/**\n * MIME types of raw formats.\n *\n * @const {!Array<string>}\n */\nshaka.util.MimeUtils.RAW_FORMATS = [\n 'audio/aac',\n 'audio/ac3',\n 'audio/ec3',\n 'audio/mpeg',\n];\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.text.TextEngine');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.Deprecate');\ngoog.require('shaka.media.ClosedCaptionParser');\ngoog.require('shaka.text.Cue');\ngoog.require('shaka.util.BufferUtils');\ngoog.require('shaka.util.IDestroyable');\ngoog.require('shaka.util.MimeUtils');\n\n\n// TODO: revisit this when Closure Compiler supports partially-exported classes.\n/**\n * @summary Manages text parsers and cues.\n * @implements {shaka.util.IDestroyable}\n * @export\n */\nshaka.text.TextEngine = class {\n /** @param {shaka.extern.TextDisplayer} displayer */\n constructor(displayer) {\n /** @private {?shaka.extern.TextParser} */\n this.parser_ = null;\n\n /** @private {shaka.extern.TextDisplayer} */\n this.displayer_ = displayer;\n\n /** @private {boolean} */\n this.segmentRelativeVttTiming_ = false;\n\n /** @private {number} */\n this.timestampOffset_ = 0;\n\n /** @private {number} */\n this.appendWindowStart_ = 0;\n\n /** @private {number} */\n this.appendWindowEnd_ = Infinity;\n\n /** @private {?number} */\n this.bufferStart_ = null;\n\n /** @private {?number} */\n this.bufferEnd_ = null;\n\n /** @private {string} */\n this.selectedClosedCaptionId_ = '';\n\n /** @private {shaka.extern.TextParser.ModifyCueCallback} */\n this.modifyCueCallback_ = (cue, uri) => {};\n\n /**\n * The closed captions map stores the CEA closed captions by closed captions\n * id and start and end time.\n * It's used as the buffer of closed caption text streams, to show captions\n * when we start displaying captions or switch caption tracks, we need to be\n * able to get the cues for the other language and display them without\n * re-fetching the video segments they were embedded in.\n * Structure of closed caption map:\n * closed caption id -> {start and end time -> cues}\n * @private {!Map<string, !Map<string, !Array<shaka.text.Cue>>>}\n */\n this.closedCaptionsMap_ = new Map();\n }\n\n /**\n * @param {string} mimeType\n * @param {!shaka.extern.TextParserPlugin} plugin\n * @export\n */\n static registerParser(mimeType, plugin) {\n shaka.text.TextEngine.parserMap_.set(mimeType, plugin);\n }\n\n /**\n * @param {string} mimeType\n * @export\n */\n static unregisterParser(mimeType) {\n shaka.text.TextEngine.parserMap_.delete(mimeType);\n }\n\n /**\n * @return {?shaka.extern.TextParserPlugin}\n * @export\n */\n static findParser(mimeType) {\n return shaka.text.TextEngine.parserMap_.get(mimeType);\n }\n\n /**\n * @param {string} mimeType\n * @return {boolean}\n */\n static isTypeSupported(mimeType) {\n if (shaka.text.TextEngine.parserMap_.has(mimeType)) {\n // An actual parser is available.\n return true;\n }\n if (mimeType == shaka.util.MimeUtils.CEA608_CLOSED_CAPTION_MIMETYPE ||\n mimeType == shaka.util.MimeUtils.CEA708_CLOSED_CAPTION_MIMETYPE ) {\n return !!shaka.media.ClosedCaptionParser.findDecoder();\n }\n return false;\n }\n\n // TODO: revisit this when the compiler supports partially-exported classes.\n /**\n * @override\n * @export\n */\n destroy() {\n this.parser_ = null;\n this.displayer_ = null;\n this.closedCaptionsMap_.clear();\n\n return Promise.resolve();\n }\n\n /**\n * @param {!shaka.extern.TextDisplayer} displayer\n */\n setDisplayer(displayer) {\n this.displayer_ = displayer;\n }\n\n /**\n * Initialize the parser. This can be called multiple times, but must be\n * called at least once before appendBuffer.\n *\n * @param {string} mimeType\n * @param {boolean} sequenceMode\n * @param {boolean} segmentRelativeVttTiming\n * @param {string} manifestType\n */\n initParser(mimeType, sequenceMode, segmentRelativeVttTiming, manifestType) {\n // No parser for CEA, which is extracted from video and side-loaded\n // into TextEngine and TextDisplayer.\n if (mimeType == shaka.util.MimeUtils.CEA608_CLOSED_CAPTION_MIMETYPE ||\n mimeType == shaka.util.MimeUtils.CEA708_CLOSED_CAPTION_MIMETYPE) {\n this.parser_ = null;\n return;\n }\n\n const factory = shaka.text.TextEngine.parserMap_.get(mimeType);\n goog.asserts.assert(\n factory, 'Text type negotiation should have happened already');\n this.parser_ = factory();\n if (this.parser_.setSequenceMode) {\n this.parser_.setSequenceMode(sequenceMode);\n } else {\n shaka.Deprecate.deprecateFeature(5,\n 'Text parsers w/ setSequenceMode',\n 'Text parsers should have a \"setSequenceMode\" method!');\n }\n if (this.parser_.setManifestType) {\n this.parser_.setManifestType(manifestType);\n } else {\n shaka.Deprecate.deprecateFeature(5,\n 'Text parsers w/ setManifestType',\n 'Text parsers should have a \"setManifestType\" method!');\n }\n this.segmentRelativeVttTiming_ = segmentRelativeVttTiming;\n }\n\n /** @param {shaka.extern.TextParser.ModifyCueCallback} modifyCueCallback */\n setModifyCueCallback(modifyCueCallback) {\n this.modifyCueCallback_ = modifyCueCallback;\n }\n\n /**\n * @param {BufferSource} buffer\n * @param {?number} startTime relative to the start of the presentation\n * @param {?number} endTime relative to the start of the presentation\n * @param {?string=} uri\n * @return {!Promise}\n */\n async appendBuffer(buffer, startTime, endTime, uri) {\n goog.asserts.assert(\n this.parser_, 'The parser should already be initialized');\n\n // Start the operation asynchronously to avoid blocking the caller.\n await Promise.resolve();\n\n // Check that TextEngine hasn't been destroyed.\n if (!this.parser_ || !this.displayer_) {\n return;\n }\n\n if (startTime == null || endTime == null) {\n this.parser_.parseInit(shaka.util.BufferUtils.toUint8(buffer));\n return;\n }\n\n const vttOffset = this.segmentRelativeVttTiming_ ?\n startTime : this.timestampOffset_;\n\n /** @type {shaka.extern.TextParser.TimeContext} **/\n const time = {\n periodStart: this.timestampOffset_,\n segmentStart: startTime,\n segmentEnd: endTime,\n vttOffset: vttOffset,\n };\n\n // Parse the buffer and add the new cues.\n const allCues = this.parser_.parseMedia(\n shaka.util.BufferUtils.toUint8(buffer), time, uri, /* images= */ []);\n for (const cue of allCues) {\n this.modifyCueCallback_(cue, uri || null, time);\n }\n const cuesToAppend = allCues.filter((cue) => {\n return cue.startTime >= this.appendWindowStart_ &&\n cue.startTime < this.appendWindowEnd_;\n });\n\n this.displayer_.append(cuesToAppend);\n\n // NOTE: We update the buffered range from the start and end times\n // passed down from the segment reference, not with the start and end\n // times of the parsed cues. This is important because some segments\n // may contain no cues, but we must still consider those ranges\n // buffered.\n if (this.bufferStart_ == null) {\n this.bufferStart_ = Math.max(startTime, this.appendWindowStart_);\n } else {\n // We already had something in buffer, and we assume we are extending\n // the range from the end.\n goog.asserts.assert(\n this.bufferEnd_ != null,\n 'There should already be a buffered range end.');\n goog.asserts.assert(\n (startTime - this.bufferEnd_) <= 1,\n 'There should not be a gap in text references >1s');\n }\n this.bufferEnd_ = Math.min(endTime, this.appendWindowEnd_);\n }\n\n /**\n * @param {number} startTime relative to the start of the presentation\n * @param {number} endTime relative to the start of the presentation\n * @return {!Promise}\n */\n async remove(startTime, endTime) {\n // Start the operation asynchronously to avoid blocking the caller.\n await Promise.resolve();\n\n if (this.displayer_ && this.displayer_.remove(startTime, endTime)) {\n if (this.bufferStart_ == null) {\n goog.asserts.assert(\n this.bufferEnd_ == null, 'end must be null if startTime is null');\n } else {\n goog.asserts.assert(\n this.bufferEnd_ != null,\n 'end must be non-null if startTime is non-null');\n\n // Update buffered range.\n if (endTime <= this.bufferStart_ || startTime >= this.bufferEnd_) {\n // No intersection. Nothing was removed.\n } else if (startTime <= this.bufferStart_ &&\n endTime >= this.bufferEnd_) {\n // We wiped out everything.\n this.bufferStart_ = this.bufferEnd_ = null;\n } else if (startTime <= this.bufferStart_ &&\n endTime < this.bufferEnd_) {\n // We removed from the beginning of the range.\n this.bufferStart_ = endTime;\n } else if (startTime > this.bufferStart_ &&\n endTime >= this.bufferEnd_) {\n // We removed from the end of the range.\n this.bufferEnd_ = startTime;\n } else {\n // We removed from the middle? StreamingEngine isn't supposed to.\n goog.asserts.assert(\n false, 'removal from the middle is not supported by TextEngine');\n }\n }\n }\n }\n\n /** @param {number} timestampOffset */\n setTimestampOffset(timestampOffset) {\n this.timestampOffset_ = timestampOffset;\n }\n\n /**\n * @param {number} appendWindowStart\n * @param {number} appendWindowEnd\n */\n setAppendWindow(appendWindowStart, appendWindowEnd) {\n this.appendWindowStart_ = appendWindowStart;\n this.appendWindowEnd_ = appendWindowEnd;\n }\n\n /**\n * @return {?number} Time in seconds of the beginning of the buffered range,\n * or null if nothing is buffered.\n */\n bufferStart() {\n return this.bufferStart_;\n }\n\n /**\n * @return {?number} Time in seconds of the end of the buffered range,\n * or null if nothing is buffered.\n */\n bufferEnd() {\n return this.bufferEnd_;\n }\n\n /**\n * @param {number} t A timestamp\n * @return {boolean}\n */\n isBuffered(t) {\n if (this.bufferStart_ == null || this.bufferEnd_ == null) {\n return false;\n }\n return t >= this.bufferStart_ && t < this.bufferEnd_;\n }\n\n /**\n * @param {number} t A timestamp\n * @return {number} Number of seconds ahead of 't' we have buffered\n */\n bufferedAheadOf(t) {\n if (this.bufferEnd_ == null || this.bufferEnd_ < t) {\n return 0;\n }\n\n goog.asserts.assert(\n this.bufferStart_ != null,\n 'start should not be null if end is not null');\n\n return this.bufferEnd_ - Math.max(t, this.bufferStart_);\n }\n\n /**\n * Set the selected closed captions id.\n * Append the cues stored in the closed captions map until buffer end time.\n * This is to fill the gap between buffered and unbuffered captions, and to\n * avoid duplicates that would be caused by any future video segments parsed\n * for captions.\n *\n * @param {string} id\n * @param {number} bufferEndTime Load any stored cues up to this time.\n */\n setSelectedClosedCaptionId(id, bufferEndTime) {\n this.selectedClosedCaptionId_ = id;\n\n const captionsMap = this.closedCaptionsMap_.get(id);\n if (captionsMap) {\n for (const startAndEndTime of captionsMap.keys()) {\n /** @type {Array<!shaka.text.Cue>} */\n const cues = captionsMap.get(startAndEndTime)\n .filter((c) => c.endTime <= bufferEndTime);\n if (cues) {\n this.displayer_.append(cues);\n }\n }\n }\n }\n\n /**\n * @param {!shaka.text.Cue} cue the cue to apply the timestamp to recursively\n * @param {number} videoTimestampOffset the timestamp offset of the video\n * @private\n */\n applyVideoTimestampOffsetRecursive_(cue, videoTimestampOffset) {\n cue.startTime += videoTimestampOffset;\n cue.endTime += videoTimestampOffset;\n for (const nested of cue.nestedCues) {\n this.applyVideoTimestampOffsetRecursive_(nested, videoTimestampOffset);\n }\n }\n\n /**\n * Store the closed captions in the text engine, and append the cues to the\n * text displayer. This is a side-channel used for embedded text only.\n *\n * @param {!Array<!shaka.extern.ICaptionDecoder.ClosedCaption>} closedCaptions\n * @param {?number} startTime relative to the start of the presentation\n * @param {?number} endTime relative to the start of the presentation\n * @param {number} videoTimestampOffset the timestamp offset of the video\n * stream in which these captions were embedded\n */\n storeAndAppendClosedCaptions(\n closedCaptions, startTime, endTime, videoTimestampOffset) {\n const startAndEndTime = startTime + ' ' + endTime;\n /** @type {!Map<string, !Map<string, !Array<!shaka.text.Cue>>>} */\n const captionsMap = new Map();\n\n for (const caption of closedCaptions) {\n const id = caption.stream;\n const cue = caption.cue;\n if (!captionsMap.has(id)) {\n captionsMap.set(id, new Map());\n }\n if (!captionsMap.get(id).has(startAndEndTime)) {\n captionsMap.get(id).set(startAndEndTime, []);\n }\n\n // Adjust CEA captions with respect to the timestamp offset of the video\n // stream in which they were embedded.\n this.applyVideoTimestampOffsetRecursive_(cue, videoTimestampOffset);\n\n const keepThisCue =\n cue.startTime >= this.appendWindowStart_ &&\n cue.startTime < this.appendWindowEnd_;\n if (!keepThisCue) {\n continue;\n }\n\n captionsMap.get(id).get(startAndEndTime).push(cue);\n if (id == this.selectedClosedCaptionId_) {\n this.displayer_.append([cue]);\n }\n }\n\n for (const id of captionsMap.keys()) {\n if (!this.closedCaptionsMap_.has(id)) {\n this.closedCaptionsMap_.set(id, new Map());\n }\n for (const startAndEndTime of captionsMap.get(id).keys()) {\n const cues = captionsMap.get(id).get(startAndEndTime);\n this.closedCaptionsMap_.get(id).set(startAndEndTime, cues);\n }\n }\n\n if (this.bufferStart_ == null) {\n this.bufferStart_ = Math.max(startTime, this.appendWindowStart_);\n } else {\n this.bufferStart_ = Math.min(\n this.bufferStart_, Math.max(startTime, this.appendWindowStart_));\n }\n\n this.bufferEnd_ = Math.max(\n this.bufferEnd_, Math.min(endTime, this.appendWindowEnd_));\n }\n\n /**\n * Get the number of closed caption channels.\n *\n * This function is for TESTING ONLY. DO NOT USE in the library.\n *\n * @return {number}\n */\n getNumberOfClosedCaptionChannels() {\n return this.closedCaptionsMap_.size;\n }\n\n /**\n * Get the number of closed caption cues for a given channel. If there is\n * no channel for the given channel id, this will return 0.\n *\n * This function is for TESTING ONLY. DO NOT USE in the library.\n *\n * @param {string} channelId\n * @return {number}\n */\n getNumberOfClosedCaptionsInChannel(channelId) {\n const channel = this.closedCaptionsMap_.get(channelId);\n return channel ? channel.size : 0;\n }\n};\n\n/** @private {!Map<string, !shaka.extern.TextParserPlugin>} */\nshaka.text.TextEngine.parserMap_ = new Map();\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.Functional');\n\ngoog.require('shaka.util.Timer');\n\n/**\n * @summary A set of functional utility functions.\n */\nshaka.util.Functional = class {\n /**\n * Creates a promise chain that calls the given callback for each element in\n * the array in a catch of a promise.\n *\n * e.g.:\n * Promise.reject().catch(callback(array[0])).catch(callback(array[1]));\n *\n * @param {!Array<ELEM>} array\n * @param {function(ELEM): !Promise<RESULT>} callback\n * @return {!Promise<RESULT>}\n * @template ELEM,RESULT\n */\n static createFallbackPromiseChain(array, callback) {\n return array.reduce((promise, elem) => {\n return promise.catch(() => callback(elem));\n }, Promise.reject());\n }\n\n\n /**\n * Returns the first array concatenated to the second; used to collapse an\n * array of arrays into a single array.\n *\n * @param {!Array<T>} all\n * @param {!Array<T>} part\n * @return {!Array<T>}\n * @template T\n */\n static collapseArrays(all, part) {\n return all.concat(part);\n }\n\n /**\n * A no-op function that ignores its arguments. This is used to suppress\n * unused variable errors.\n * @param {...*} args\n */\n static ignored(...args) {}\n\n\n /**\n * A no-op function. Useful in promise chains.\n */\n static noop() {}\n\n\n /**\n * Returns if the given value is not null; useful for filtering out null\n * values.\n *\n * @param {T} value\n * @return {boolean}\n * @template T\n */\n static isNotNull(value) {\n return value != null;\n }\n\n /**\n * Returns a Promise which is resolved only if |asyncProcess| is resolved, and\n * only if it is resolved in less than |seconds| seconds.\n *\n * If the returned Promise is resolved, it returns the same value as\n * |asyncProcess|.\n *\n * If |asyncProcess| fails, the returned Promise is rejected.\n * If |asyncProcess| takes too long, the returned Promise is rejected, but\n * |asyncProcess| is still allowed to complete.\n *\n * @param {number} seconds\n * @param {!Promise<T>} asyncProcess\n * @return {!Promise<T>}\n * @template T\n */\n static promiseWithTimeout(seconds, asyncProcess) {\n return Promise.race([\n asyncProcess,\n new Promise(((_, reject) => {\n new shaka.util.Timer(reject).tickAfter(seconds);\n })),\n ]);\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.LanguageUtils');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.util.ManifestParserUtils');\n\n\n/**\n * @summary A set of language utility functions.\n * @final\n * @export\n */\nshaka.util.LanguageUtils = class {\n /**\n * Check if |locale1| and |locale2| are locale-compatible.\n *\n * Locale-compatible is defined as all components in each locale match. Since\n * we only respect the language and region components, we only check that\n * the language and region components match.\n *\n * Examples:\n * Locale A | Locale B | Locale Compatible\n * ---------------------------------------\n * en-US | en-US | true\n * en | en-US | false\n * en-US | en-CA | false\n *\n * @param {string} locale1\n * @param {string} locale2\n * @return {boolean}\n * @export\n */\n static areLocaleCompatible(locale1, locale2) {\n const LanguageUtils = shaka.util.LanguageUtils;\n\n // Even through they SHOULD already be normalized, let's just be safe and\n // do it again.\n locale1 = LanguageUtils.normalize(locale1);\n locale2 = LanguageUtils.normalize(locale2);\n\n return locale1 == locale2;\n }\n\n /**\n * Check if |locale1| and |locale2| are language-compatible.\n *\n * Language compatible is when the language component of each locale matches.\n * This means that no matter what region they have (or don't have) as long as\n * the language components match, they are language-compatible.\n *\n * Examples:\n * Locale A | Locale B | Language-Compatible\n * -----------------------------------------\n * en-US | en-US | true\n * en-US | en | true\n * en-US | en-CA | true\n * en-CA | fr-CA | false\n *\n * @param {string} locale1\n * @param {string} locale2\n * @return {boolean}\n * @export\n */\n static areLanguageCompatible(locale1, locale2) {\n const LanguageUtils = shaka.util.LanguageUtils;\n\n // Even through they SHOULD already be normalized, let's just be safe and\n // do it again.\n locale1 = LanguageUtils.normalize(locale1);\n locale2 = LanguageUtils.normalize(locale2);\n\n // Get all components. This should only be language and region\n // since we do not support dialect.\n /** @type {!Array<string>} */\n const locale1Components = LanguageUtils.disassembleLocale_(locale1);\n /** @type {!Array<string>} */\n const locale2Components = LanguageUtils.disassembleLocale_(locale2);\n\n // We are language compatible if we have the same language.\n return locale1Components[0] == locale2Components[0];\n }\n\n /**\n * Check if |possibleParent| is the parent locale of |possibleChild|. Because\n * we do not support dialects, the parent-child relationship is a lot simpler.\n * In a parent child relationship:\n * - The parent and child have the same language-component\n * - The parent has no region-component\n * - The child has a region-component\n *\n * Example:\n * Locale A | Locale B | Is A The parent of B?\n * --------------------------------------------\n * en-US | en-US | no\n * en-US | en | no\n * en | en-US | yes\n * en | en | no\n * en | fr | no\n *\n * @param {string} possibleParent\n * @param {string} possibleChild\n * @return {boolean}\n * @export\n */\n static isParentOf(possibleParent, possibleChild) {\n const LanguageUtils = shaka.util.LanguageUtils;\n\n // Even through they SHOULD already be normalized, let's just be safe and\n // do it again.\n possibleParent = LanguageUtils.normalize(possibleParent);\n possibleChild = LanguageUtils.normalize(possibleChild);\n\n // Get all components. This should only be language and region\n // since we do not support dialect.\n /** @type {!Array<string>} */\n const possibleParentComponents =\n LanguageUtils.disassembleLocale_(possibleParent);\n /** @type {!Array<string>} */\n const possibleChildComponents =\n LanguageUtils.disassembleLocale_(possibleChild);\n\n return possibleParentComponents[0] == possibleChildComponents[0] &&\n possibleParentComponents.length == 1 &&\n possibleChildComponents.length == 2;\n }\n\n /**\n * Check if |localeA| shares the same parent with |localeB|. Since we don't\n * support dialect, we will only look at language and region. For two locales\n * to be siblings:\n * - Both must have language-components\n * - Both must have region-components\n * - Both must have the same language-component\n *\n * Example:\n * Locale A | Locale B | Siblings?\n * --------------------------------------------\n * en-US | en-US | yes\n * en-US | en-CA | yes\n * en-US | en | no\n * en | en-US | no\n * en | en | no\n * en | fr | no\n *\n * @param {string} localeA\n * @param {string} localeB\n * @return {boolean}\n * @export\n */\n static isSiblingOf(localeA, localeB) {\n const LanguageUtils = shaka.util.LanguageUtils;\n\n // Even through they SHOULD already be normalized, let's just be safe and\n // do it again.\n localeA = LanguageUtils.normalize(localeA);\n localeB = LanguageUtils.normalize(localeB);\n\n // Get all components. This should only be language and region\n // since we do not support dialect.\n /** @type {!Array<string>} */\n const localeAComponents = LanguageUtils.disassembleLocale_(localeA);\n /** @type {!Array<string>} */\n const localeBComponents = LanguageUtils.disassembleLocale_(localeB);\n\n return localeAComponents.length == 2 &&\n localeBComponents.length == 2 &&\n localeAComponents[0] == localeBComponents[0];\n }\n\n /**\n * Normalize a locale. This will take a locale and canonicalize it to a state\n * that we are prepared to work with.\n *\n * We only support with:\n * - language\n * - language-REGION\n *\n * If given a dialect, we will discard it. We will convert any 3-character\n * codes to 2-character codes. We will force language codes to lowercase and\n * region codes to uppercase.\n *\n * @param {string} locale\n * @return {string}\n * @export\n */\n static normalize(locale) {\n const LanguageUtils = shaka.util.LanguageUtils;\n\n const privateUsePrefix = 'x-';\n const [languageRegion = '', privateUseSuffix = ''] =\n locale.split(`-${privateUsePrefix}`);\n const [languageCode = '', regionCode = ''] = languageRegion.split('-');\n\n // We are only going to use the language, the region and the private use part (as per https://datatracker.ietf.org/doc/html/rfc5646).\n // Anything else is thrown away.\n const privateUse = privateUseSuffix ?\n `${privateUsePrefix}${privateUseSuffix}` : '';\n\n // Convert the language to lower case. It is standard for the language code\n // to be in lower case, but it will also make the map look-up easier.\n let language = languageCode.toLowerCase();\n language = LanguageUtils.isoMap_.get(language) || language;\n\n // Convert the region to upper case. It is standard for the region to be in\n // upper case. If there is no upper code, then it will be an empty string\n // and this will be a no-op.\n const region = regionCode.toUpperCase();\n\n return `${region ? `${language}-${region}` : language}${\n privateUse ? `-${privateUse}` : ''}`;\n }\n\n /**\n * Check if two language codes are siblings. Language codes are siblings if\n * they share the same base language while neither one is the base language.\n *\n * For example, \"en-US\" and \"en-CA\" are siblings but \"en-US\" and \"en\" are not\n * siblings.\n *\n * @param {string} a\n * @param {string} b\n * @return {boolean}\n * @export\n */\n static areSiblings(a, b) {\n const LanguageUtils = shaka.util.LanguageUtils;\n\n const baseA = LanguageUtils.getBase(a);\n const baseB = LanguageUtils.getBase(b);\n\n return a != baseA && b != baseB && baseA == baseB;\n }\n\n /**\n * Compute a numerical relatedness for language codes. Language codes with a\n * higher relatedness are a better match. Unrelated language codes have a\n * relatedness score of 0.\n *\n * @param {string} target\n * @param {string} candidate\n * @return {number}\n * @export\n */\n static relatedness(target, candidate) {\n const LanguageUtils = shaka.util.LanguageUtils;\n\n target = LanguageUtils.normalize(target);\n candidate = LanguageUtils.normalize(candidate);\n\n // An exact match is the top score.\n if (candidate == target) {\n return 4;\n }\n\n // Next is a parent of the target language.\n if (LanguageUtils.isParentOf(candidate, target)) {\n return 3;\n }\n\n // Next is a sibling of the target language.\n if (LanguageUtils.isSiblingOf(candidate, target)) {\n return 2;\n }\n\n // Next is a child of the target language.\n if (LanguageUtils.isParentOf(target, candidate)) {\n return 1;\n }\n\n // Otherwise, they are unrelated.\n return 0;\n }\n\n /**\n * Get the normalized base language for a language code.\n *\n * @param {string} lang\n * @return {string}\n * @export\n */\n static getBase(lang) {\n const LanguageUtils = shaka.util.LanguageUtils;\n\n const splitAt = lang.indexOf('-');\n let major;\n\n if (splitAt >= 0) {\n major = lang.substring(0, splitAt);\n } else {\n major = lang;\n }\n\n // Convert the major code to lower case. It is standard for the major code\n // to be in lower case, but it will also make the map look-up easier.\n major = major.toLowerCase();\n major = LanguageUtils.isoMap_.get(major) || major;\n\n return major;\n }\n\n /**\n * Get the normalized language of the given text stream. Will return 'und' if\n * a language is not found on the text stream.\n *\n * This should always be used to get the language from a text stream.\n *\n * @param {shaka.extern.Stream} stream\n * @return {string}\n * @export\n */\n static getLocaleForText(stream) {\n const LanguageUtils = shaka.util.LanguageUtils;\n\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n goog.asserts.assert(\n stream.type == ContentType.TEXT,\n 'Can only get language from text streams');\n\n const language = stream.language || 'und';\n return LanguageUtils.normalize(language);\n }\n\n /**\n * Get the normalized locale for the given variant. This will look through\n * the variant to find the locale that represents the content in the variant.\n * This will return 'und' if no language can be found.\n *\n * This should always be used to get the locale from a variant.\n *\n * @param {shaka.extern.Variant} variant\n * @return {string}\n * @export\n */\n static getLocaleForVariant(variant) {\n const LanguageUtils = shaka.util.LanguageUtils;\n\n // Our preference order is:\n // 1. Variant\n // 2. Audio Stream\n // 3. Video Stream\n //\n // We are going to consider all falsy strings to be invalid locales, this\n // will include empty strings.\n if (variant.language) {\n return LanguageUtils.normalize(variant.language);\n }\n\n if (variant.audio && variant.audio.language) {\n return LanguageUtils.normalize(variant.audio.language);\n }\n\n if (variant.video && variant.video.language) {\n return LanguageUtils.normalize(variant.video.language);\n }\n\n // No language was found, but we still want to return a valid string.\n return 'und';\n }\n\n /**\n * Find the locale in |searchSpace| that comes closest to |target|. If no\n * locale is found to be close to |target|, then |null| will be returned.\n *\n * @param {string} target\n * @param {!Iterable<string>} searchSpace\n * @return {?string}\n * @export\n */\n static findClosestLocale(target, searchSpace) {\n const LanguageUtils = shaka.util.LanguageUtils;\n\n /** @type {string} */\n const safeTarget = LanguageUtils.normalize(target);\n /** @type {!Set<string>} */\n const safeSearchSpace = new Set();\n for (const option of searchSpace) {\n safeSearchSpace.add(LanguageUtils.normalize(option));\n }\n\n // Preference 1 - The option is an exact match. For example, \"en-US\" is an\n // exact match of \"en-US\". So if there is an option that is an exact\n // match, it would be the best match possible.\n for (const option of safeSearchSpace) {\n if (option == safeTarget) {\n return option;\n }\n }\n\n // Preference 2 - The option is the parent of the target. For example,\n // \"en\" is the parent of \"en-US\". So if there is an option with\n // \"en\", it should be good enough when our preference is \"en-US\".\n for (const option of safeSearchSpace) {\n if (LanguageUtils.isParentOf(option, safeTarget)) {\n return option;\n }\n }\n\n // Preference 3 - The option is a sibling of the target. For example,\n // \"en-US\" is a sibling of \"en-CA\". So if there is an option with\n // \"en_CA\", it should be good enough when our preference is \"en-US\".\n for (const option of safeSearchSpace) {\n if (LanguageUtils.isSiblingOf(option, safeTarget)) {\n return option;\n }\n }\n\n // Preference 4 - The option is a child of the target. For example,\n // \"en-US\" is the child of \"en\". SO it there is an option with\n // \"en-US\", it should be good enough when our preference is \"en\".\n for (const option of safeSearchSpace) {\n if (LanguageUtils.isParentOf(safeTarget, option)) {\n return option;\n }\n }\n\n // Failed to find anything.\n return null;\n }\n\n /**\n * Take a locale string and break it into its component. Check that each\n * component matches what we would expect internally for locales. This\n * should ONLY be used to verify locales that have been normalized.\n *\n * @param {string} locale\n * @return {!Array<string>}\n * @private\n */\n static disassembleLocale_(locale) {\n const components = locale.split('-');\n\n goog.asserts.assert(\n components.length <= 2,\n [\n 'Locales should not have more than 2 components. ',\n locale,\n ' has too many components.',\n ].join());\n\n return components;\n }\n};\n\n\n/**\n * A map from 3-letter language codes (ISO 639-2) to 2-letter language codes\n * (ISO 639-1) for all languages which have both in the registry.\n *\n * @const {!Map<string, string>}\n * @private\n */\nshaka.util.LanguageUtils.isoMap_ = new Map([\n ['aar', 'aa'], ['abk', 'ab'], ['afr', 'af'], ['aka', 'ak'], ['alb', 'sq'],\n ['amh', 'am'], ['ara', 'ar'], ['arg', 'an'], ['arm', 'hy'], ['asm', 'as'],\n ['ava', 'av'], ['ave', 'ae'], ['aym', 'ay'], ['aze', 'az'], ['bak', 'ba'],\n ['bam', 'bm'], ['baq', 'eu'], ['bel', 'be'], ['ben', 'bn'], ['bih', 'bh'],\n ['bis', 'bi'], ['bod', 'bo'], ['bos', 'bs'], ['bre', 'br'], ['bul', 'bg'],\n ['bur', 'my'], ['cat', 'ca'], ['ces', 'cs'], ['cha', 'ch'], ['che', 'ce'],\n ['chi', 'zh'], ['chu', 'cu'], ['chv', 'cv'], ['cor', 'kw'], ['cos', 'co'],\n ['cre', 'cr'], ['cym', 'cy'], ['cze', 'cs'], ['dan', 'da'], ['deu', 'de'],\n ['div', 'dv'], ['dut', 'nl'], ['dzo', 'dz'], ['ell', 'el'], ['eng', 'en'],\n ['epo', 'eo'], ['est', 'et'], ['eus', 'eu'], ['ewe', 'ee'], ['fao', 'fo'],\n ['fas', 'fa'], ['fij', 'fj'], ['fin', 'fi'], ['fra', 'fr'], ['fre', 'fr'],\n ['fry', 'fy'], ['ful', 'ff'], ['geo', 'ka'], ['ger', 'de'], ['gla', 'gd'],\n ['gle', 'ga'], ['glg', 'gl'], ['glv', 'gv'], ['gre', 'el'], ['grn', 'gn'],\n ['guj', 'gu'], ['hat', 'ht'], ['hau', 'ha'], ['heb', 'he'], ['her', 'hz'],\n ['hin', 'hi'], ['hmo', 'ho'], ['hrv', 'hr'], ['hun', 'hu'], ['hye', 'hy'],\n ['ibo', 'ig'], ['ice', 'is'], ['ido', 'io'], ['iii', 'ii'], ['iku', 'iu'],\n ['ile', 'ie'], ['ina', 'ia'], ['ind', 'id'], ['ipk', 'ik'], ['isl', 'is'],\n ['ita', 'it'], ['jav', 'jv'], ['jpn', 'ja'], ['kal', 'kl'], ['kan', 'kn'],\n ['kas', 'ks'], ['kat', 'ka'], ['kau', 'kr'], ['kaz', 'kk'], ['khm', 'km'],\n ['kik', 'ki'], ['kin', 'rw'], ['kir', 'ky'], ['kom', 'kv'], ['kon', 'kg'],\n ['kor', 'ko'], ['kua', 'kj'], ['kur', 'ku'], ['lao', 'lo'], ['lat', 'la'],\n ['lav', 'lv'], ['lim', 'li'], ['lin', 'ln'], ['lit', 'lt'], ['ltz', 'lb'],\n ['lub', 'lu'], ['lug', 'lg'], ['mac', 'mk'], ['mah', 'mh'], ['mal', 'ml'],\n ['mao', 'mi'], ['mar', 'mr'], ['may', 'ms'], ['mkd', 'mk'], ['mlg', 'mg'],\n ['mlt', 'mt'], ['mon', 'mn'], ['mri', 'mi'], ['msa', 'ms'], ['mya', 'my'],\n ['nau', 'na'], ['nav', 'nv'], ['nbl', 'nr'], ['nde', 'nd'], ['ndo', 'ng'],\n ['nep', 'ne'], ['nld', 'nl'], ['nno', 'nn'], ['nob', 'nb'], ['nor', 'no'],\n ['nya', 'ny'], ['oci', 'oc'], ['oji', 'oj'], ['ori', 'or'], ['orm', 'om'],\n ['oss', 'os'], ['pan', 'pa'], ['per', 'fa'], ['pli', 'pi'], ['pol', 'pl'],\n ['por', 'pt'], ['pus', 'ps'], ['que', 'qu'], ['roh', 'rm'], ['ron', 'ro'],\n ['rum', 'ro'], ['run', 'rn'], ['rus', 'ru'], ['sag', 'sg'], ['san', 'sa'],\n ['sin', 'si'], ['slk', 'sk'], ['slo', 'sk'], ['slv', 'sl'], ['sme', 'se'],\n ['smo', 'sm'], ['sna', 'sn'], ['snd', 'sd'], ['som', 'so'], ['sot', 'st'],\n ['spa', 'es'], ['sqi', 'sq'], ['srd', 'sc'], ['srp', 'sr'], ['ssw', 'ss'],\n ['sun', 'su'], ['swa', 'sw'], ['swe', 'sv'], ['tah', 'ty'], ['tam', 'ta'],\n ['tat', 'tt'], ['tel', 'te'], ['tgk', 'tg'], ['tgl', 'tl'], ['tha', 'th'],\n ['tib', 'bo'], ['tir', 'ti'], ['ton', 'to'], ['tsn', 'tn'], ['tso', 'ts'],\n ['tuk', 'tk'], ['tur', 'tr'], ['twi', 'tw'], ['uig', 'ug'], ['ukr', 'uk'],\n ['urd', 'ur'], ['uzb', 'uz'], ['ven', 've'], ['vie', 'vi'], ['vol', 'vo'],\n ['wel', 'cy'], ['wln', 'wa'], ['wol', 'wo'], ['xho', 'xh'], ['yid', 'yi'],\n ['yor', 'yo'], ['zha', 'za'], ['zho', 'zh'], ['zul', 'zu'],\n]);\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.StreamUtils');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.config.AutoShowText');\ngoog.require('shaka.lcevc.Dec');\ngoog.require('shaka.log');\ngoog.require('shaka.media.Capabilities');\ngoog.require('shaka.text.TextEngine');\ngoog.require('shaka.util.Functional');\ngoog.require('shaka.util.LanguageUtils');\ngoog.require('shaka.util.ManifestParserUtils');\ngoog.require('shaka.util.MimeUtils');\ngoog.require('shaka.util.MultiMap');\ngoog.require('shaka.util.ObjectUtils');\ngoog.require('shaka.util.Platform');\ngoog.requireType('shaka.drm.DrmEngine');\n\n\n/**\n * @summary A set of utility functions for dealing with Streams and Manifests.\n * @export\n */\nshaka.util.StreamUtils = class {\n /**\n * In case of multiple usable codecs, choose one based on lowest average\n * bandwidth and filter out the rest.\n * Also filters out variants that have too many audio channels.\n * @param {!shaka.extern.Manifest} manifest\n * @param {!Array<string>} preferredVideoCodecs\n * @param {!Array<string>} preferredAudioCodecs\n * @param {!Array<string>} preferredDecodingAttributes\n * @param {!Array<string>} preferredTextFormats\n */\n static chooseCodecsAndFilterManifest(manifest, preferredVideoCodecs,\n preferredAudioCodecs, preferredDecodingAttributes, preferredTextFormats) {\n const StreamUtils = shaka.util.StreamUtils;\n const MimeUtils = shaka.util.MimeUtils;\n\n if (preferredTextFormats.length) {\n let subset = manifest.textStreams;\n for (const textFormat of preferredTextFormats) {\n const filtered = subset.filter((textStream) => {\n if (textStream.codecs.startsWith(textFormat) ||\n textStream.mimeType.startsWith(textFormat)) {\n return true;\n }\n return false;\n });\n if (filtered.length) {\n subset = filtered;\n break;\n }\n }\n manifest.textStreams = subset;\n }\n\n let variants = manifest.variants;\n // To start, choose the codecs based on configured preferences if available.\n if (preferredVideoCodecs.length || preferredAudioCodecs.length) {\n variants = StreamUtils.choosePreferredCodecs(variants,\n preferredVideoCodecs, preferredAudioCodecs);\n }\n\n if (preferredDecodingAttributes.length) {\n // group variants by resolution and choose preferred variants only\n /** @type {!shaka.util.MultiMap<shaka.extern.Variant>} */\n const variantsByResolutionMap = new shaka.util.MultiMap();\n for (const variant of variants) {\n variantsByResolutionMap\n .push(String(variant.video.width || 0), variant);\n }\n const bestVariants = [];\n variantsByResolutionMap.forEach((width, variantsByResolution) => {\n let highestMatch = 0;\n let matchingVariants = [];\n for (const variant of variantsByResolution) {\n const matchCount = preferredDecodingAttributes.filter(\n (attribute) => variant.decodingInfos[0][attribute],\n ).length;\n if (matchCount > highestMatch) {\n highestMatch = matchCount;\n matchingVariants = [variant];\n } else if (matchCount == highestMatch) {\n matchingVariants.push(variant);\n }\n }\n bestVariants.push(...matchingVariants);\n });\n variants = bestVariants;\n }\n\n const audioStreamsSet = new Set();\n const videoStreamsSet = new Set();\n for (const variant of variants) {\n if (variant.audio) {\n audioStreamsSet.add(variant.audio);\n }\n if (variant.video) {\n videoStreamsSet.add(variant.video);\n }\n }\n\n const audioStreams = Array.from(audioStreamsSet).sort((v1, v2) => {\n return v1.bandwidth - v2.bandwidth;\n });\n const validAudioIds = [];\n const validAudioStreamsMap = new Map();\n const getAudioId = (stream) => {\n let id = stream.language + (stream.channelsCount || 0) +\n (stream.audioSamplingRate || 0) + stream.roles.join(',') +\n stream.label + stream.groupId + stream.fastSwitching;\n if (stream.dependencyStream) {\n id += stream.dependencyStream.baseOriginalId || '';\n }\n return id;\n };\n for (const stream of audioStreams) {\n const groupId = getAudioId(stream);\n const validAudioStreams = validAudioStreamsMap.get(groupId) || [];\n if (!validAudioStreams.length) {\n validAudioStreams.push(stream);\n validAudioIds.push(stream.id);\n } else {\n const previousStream = validAudioStreams[validAudioStreams.length - 1];\n const previousCodec =\n MimeUtils.getNormalizedCodec(previousStream.codecs);\n const currentCodec =\n MimeUtils.getNormalizedCodec(stream.codecs);\n if (previousCodec == currentCodec) {\n if (!stream.bandwidth || !previousStream.bandwidth ||\n stream.bandwidth > previousStream.bandwidth) {\n validAudioStreams.push(stream);\n validAudioIds.push(stream.id);\n }\n }\n }\n validAudioStreamsMap.set(groupId, validAudioStreams);\n }\n\n // Keys based in MimeUtils.getNormalizedCodec. Lower is better\n const videoCodecPreference = {\n 'vp8': 1,\n 'avc': 1,\n 'dovi-avc': 0.95,\n 'vp9': 0.9,\n 'vp09': 0.9,\n 'hevc': 0.85,\n 'dovi-hevc': 0.8,\n 'dovi-p5': 0.75,\n 'av01': 0.7,\n 'dovi-av1': 0.65,\n 'vvc': 0.6,\n };\n\n const videoStreams = Array.from(videoStreamsSet)\n .sort((v1, v2) => {\n if (!v1.bandwidth || !v2.bandwidth || v1.bandwidth == v2.bandwidth) {\n if (v1.codecs && v2.codecs && v1.codecs != v2.codecs &&\n v1.width == v2.width) {\n const v1Codecs = MimeUtils.getNormalizedCodec(v1.codecs);\n const v2Codecs = MimeUtils.getNormalizedCodec(v2.codecs);\n if (v1Codecs != v2Codecs) {\n const indexV1 = videoCodecPreference[v1Codecs] || 1;\n const indexV2 = videoCodecPreference[v2Codecs] || 1;\n return indexV1 - indexV2;\n }\n }\n return v1.width - v2.width;\n }\n return v1.bandwidth - v2.bandwidth;\n });\n\n const isChangeTypeSupported =\n shaka.media.Capabilities.isChangeTypeSupported();\n\n const validVideoIds = [];\n const validVideoStreamsMap = new Map();\n const getVideoGroupId = (stream) => {\n let id = String(stream.width || '') + String(stream.height || '') +\n String(Math.round(stream.frameRate || 0)) + (stream.hdr || '') +\n stream.fastSwitching;\n if (stream.dependencyStream) {\n id += stream.dependencyStream.baseOriginalId || '';\n }\n return id;\n };\n for (const stream of videoStreams) {\n const groupId = getVideoGroupId(stream);\n const validVideoStreams = validVideoStreamsMap.get(groupId) || [];\n if (!validVideoStreams.length) {\n validVideoStreams.push(stream);\n validVideoIds.push(stream.id);\n } else {\n const previousStream = validVideoStreams[validVideoStreams.length - 1];\n if (!isChangeTypeSupported) {\n const previousCodec =\n MimeUtils.getNormalizedCodec(previousStream.codecs);\n const currentCodec =\n MimeUtils.getNormalizedCodec(stream.codecs);\n if (previousCodec !== currentCodec) {\n continue;\n }\n }\n const previousCodec =\n MimeUtils.getNormalizedCodec(previousStream.codecs);\n const currentCodec =\n MimeUtils.getNormalizedCodec(stream.codecs);\n if (previousCodec == currentCodec) {\n if (!stream.bandwidth || !previousStream.bandwidth ||\n stream.bandwidth > previousStream.bandwidth) {\n validVideoStreams.push(stream);\n validVideoIds.push(stream.id);\n }\n }\n }\n validVideoStreamsMap.set(groupId, validVideoStreams);\n }\n\n // Filter out any variants that don't match, forcing AbrManager to choose\n // from a single video codec and a single audio codec possible.\n manifest.variants = manifest.variants.filter((variant) => {\n const audio = variant.audio;\n const video = variant.video;\n if (audio) {\n if (!validAudioIds.includes(audio.id)) {\n shaka.log.debug('Dropping Variant (better codec available)', variant);\n return false;\n }\n }\n if (video) {\n if (!validVideoIds.includes(video.id)) {\n shaka.log.debug('Dropping Variant (better codec available)', variant);\n return false;\n }\n }\n return true;\n });\n }\n\n /**\n * Choose the codecs by configured preferred audio and video codecs.\n *\n * @param {!Array<shaka.extern.Variant>} variants\n * @param {!Array<string>} preferredVideoCodecs\n * @param {!Array<string>} preferredAudioCodecs\n * @return {!Array<shaka.extern.Variant>}\n */\n static choosePreferredCodecs(variants, preferredVideoCodecs,\n preferredAudioCodecs) {\n let subset = variants;\n for (const videoCodec of preferredVideoCodecs) {\n const filtered = subset.filter((variant) => {\n return variant.video && variant.video.codecs.startsWith(videoCodec);\n });\n if (filtered.length) {\n subset = filtered;\n break;\n }\n }\n\n for (const audioCodec of preferredAudioCodecs) {\n const filtered = subset.filter((variant) => {\n return variant.audio && variant.audio.codecs.startsWith(audioCodec);\n });\n if (filtered.length) {\n subset = filtered;\n break;\n }\n }\n return subset;\n }\n\n /**\n * Filter the variants in |manifest| to only include the variants that meet\n * the given restrictions.\n *\n * @param {!shaka.extern.Manifest} manifest\n * @param {shaka.extern.Restrictions} restrictions\n * @param {shaka.extern.Resolution} maxHwResolution\n */\n static filterByRestrictions(manifest, restrictions, maxHwResolution) {\n manifest.variants = manifest.variants.filter((variant) => {\n return shaka.util.StreamUtils.meetsRestrictions(\n variant, restrictions, maxHwResolution);\n });\n }\n\n /**\n * @param {shaka.extern.Variant} variant\n * @param {shaka.extern.Restrictions} restrictions\n * Configured restrictions from the user.\n * @param {shaka.extern.Resolution} maxHwRes\n * The maximum resolution the hardware can handle.\n * This is applied separately from user restrictions because the setting\n * should not be easily replaced by the user's configuration.\n * @return {boolean}\n * @export\n */\n static meetsRestrictions(variant, restrictions, maxHwRes) {\n /** @type {function(number, number, number):boolean} */\n const inRange = (x, min, max) => {\n return x >= min && x <= max;\n };\n\n const video = variant.video;\n\n // |video.width| and |video.height| can be undefined, which breaks\n // the math, so make sure they are there first.\n if (video && video.width && video.height) {\n let videoWidth = video.width;\n let videoHeight = video.height;\n if (videoHeight > videoWidth) {\n // Vertical video.\n [videoWidth, videoHeight] = [videoHeight, videoWidth];\n }\n\n if (!inRange(videoWidth,\n restrictions.minWidth,\n Math.min(restrictions.maxWidth, maxHwRes.width))) {\n return false;\n }\n\n if (!inRange(videoHeight,\n restrictions.minHeight,\n Math.min(restrictions.maxHeight, maxHwRes.height))) {\n return false;\n }\n\n if (!inRange(video.width * video.height,\n restrictions.minPixels,\n restrictions.maxPixels)) {\n return false;\n }\n }\n\n // |variant.video.frameRate| can be undefined, which breaks\n // the math, so make sure they are there first.\n if (variant && variant.video && variant.video.frameRate) {\n if (!inRange(variant.video.frameRate,\n restrictions.minFrameRate,\n restrictions.maxFrameRate)) {\n return false;\n }\n }\n\n // |variant.audio.channelsCount| can be undefined, which breaks\n // the math, so make sure they are there first.\n if (variant && variant.audio && variant.audio.channelsCount) {\n if (!inRange(variant.audio.channelsCount,\n restrictions.minChannelsCount,\n restrictions.maxChannelsCount)) {\n return false;\n }\n }\n\n if (!inRange(variant.bandwidth,\n restrictions.minBandwidth,\n restrictions.maxBandwidth)) {\n return false;\n }\n\n return true;\n }\n\n\n /**\n * @param {!Array<shaka.extern.Variant>} variants\n * @param {shaka.extern.Restrictions} restrictions\n * @param {shaka.extern.Resolution} maxHwRes\n * @return {boolean} Whether the tracks changed.\n */\n static applyRestrictions(variants, restrictions, maxHwRes) {\n let tracksChanged = false;\n\n for (const variant of variants) {\n const originalAllowed = variant.allowedByApplication;\n variant.allowedByApplication = shaka.util.StreamUtils.meetsRestrictions(\n variant, restrictions, maxHwRes);\n\n if (originalAllowed != variant.allowedByApplication) {\n tracksChanged = true;\n }\n }\n\n return tracksChanged;\n }\n\n\n /**\n * Alters the given Manifest to filter out any unplayable streams.\n *\n * @param {shaka.drm.DrmEngine} drmEngine\n * @param {shaka.extern.Manifest} manifest\n * @param {!Array<string>=} preferredKeySystems\n * @param {!Object<string, string>=} keySystemsMapping\n */\n static async filterManifest(drmEngine, manifest, preferredKeySystems = [],\n keySystemsMapping = {}) {\n await shaka.util.StreamUtils.filterManifestByMediaCapabilities(\n drmEngine, manifest, manifest.offlineSessionIds.length > 0,\n preferredKeySystems, keySystemsMapping);\n shaka.util.StreamUtils.filterTextStreams_(manifest);\n await shaka.util.StreamUtils.filterImageStreams_(manifest);\n }\n\n\n /**\n * Alters the given Manifest to filter out any streams unsupported by the\n * platform via MediaCapabilities.decodingInfo() API.\n *\n * @param {shaka.drm.DrmEngine} drmEngine\n * @param {shaka.extern.Manifest} manifest\n * @param {boolean} usePersistentLicenses\n * @param {!Array<string>} preferredKeySystems\n * @param {!Object<string, string>} keySystemsMapping\n */\n static async filterManifestByMediaCapabilities(\n drmEngine, manifest, usePersistentLicenses, preferredKeySystems,\n keySystemsMapping) {\n goog.asserts.assert(navigator.mediaCapabilities,\n 'MediaCapabilities should be valid.');\n\n if (shaka.util.Platform.isXboxOne()) {\n shaka.util.StreamUtils.overrideDolbyVisionCodecs(manifest.variants);\n }\n await shaka.util.StreamUtils.getDecodingInfosForVariants(\n manifest.variants, usePersistentLicenses, /* srcEquals= */ false,\n preferredKeySystems);\n\n let keySystem = null;\n if (drmEngine) {\n const drmInfo = drmEngine.getDrmInfo();\n if (drmInfo) {\n keySystem = drmInfo.keySystem;\n }\n }\n\n const StreamUtils = shaka.util.StreamUtils;\n\n manifest.variants = manifest.variants.filter((variant) => {\n const supported = StreamUtils.checkVariantSupported_(\n variant, keySystem, keySystemsMapping);\n // Filter out all unsupported variants.\n if (!supported) {\n shaka.log.debug('Dropping variant - not compatible with platform',\n StreamUtils.getVariantSummaryString_(variant));\n }\n return supported;\n });\n }\n\n\n /**\n * Maps Dolby Vision codecs to H.264 and H.265 equivalents as a workaround\n * to make Dolby Vision playback work on some platforms.\n *\n * Mapping is done according to the relevant Dolby documentation found here:\n * https://professionalsupport.dolby.com/s/article/How-to-signal-Dolby-Vision-in-MPEG-DASH?language=en_US\n * @param {!Array<!shaka.extern.Variant>} variants\n */\n static overrideDolbyVisionCodecs(variants) {\n /** @type {!Map<string, string>} */\n const codecMap = new Map()\n .set('dvav', 'avc3')\n .set('dva1', 'avc1')\n .set('dvhe', 'hev1')\n .set('dvh1', 'hvc1')\n .set('dvc1', 'vvc1')\n .set('dvi1', 'vvi1');\n\n /** @type {!Set<!shaka.extern.Stream>} */\n const streams = new Set();\n for (const variant of variants) {\n if (variant.video) {\n streams.add(variant.video);\n }\n }\n for (const video of streams) {\n for (const [dvCodec, replacement] of codecMap) {\n if (video.codecs.includes(dvCodec)) {\n video.codecs = video.codecs.replace(dvCodec, replacement);\n break;\n }\n }\n }\n }\n\n\n /**\n * @param {!shaka.extern.Variant} variant\n * @param {?string} keySystem\n * @param {!Object<string, string>} keySystemsMapping\n * @return {boolean}\n * @private\n */\n static checkVariantSupported_(variant, keySystem, keySystemsMapping) {\n const variantSupported = variant.decodingInfos.some((decodingInfo) => {\n if (!decodingInfo.supported) {\n return false;\n }\n if (keySystem) {\n const keySystemAccess = decodingInfo.keySystemAccess;\n if (keySystemAccess) {\n const currentKeySystem =\n keySystemsMapping[keySystemAccess.keySystem] ||\n keySystemAccess.keySystem;\n if (currentKeySystem != keySystem) {\n return false;\n }\n }\n }\n return true;\n });\n if (!variantSupported) {\n return false;\n }\n\n const isXboxOne = shaka.util.Platform.isXboxOne();\n const isFirefoxAndroid = shaka.util.Platform.isFirefox() &&\n shaka.util.Platform.isAndroid();\n\n // See: https://github.com/shaka-project/shaka-player/issues/3860\n const video = variant.video;\n const videoWidth = (video && video.width) || 0;\n const videoHeight = (video && video.height) || 0;\n\n // See: https://github.com/shaka-project/shaka-player/issues/3380\n // Note: it makes sense to drop early\n if (isXboxOne && video && (videoWidth > 1920 || videoHeight > 1080) &&\n (video.codecs.includes('avc1.') || video.codecs.includes('avc3.'))) {\n return false;\n }\n\n const videoDependencyStream = video && video.dependencyStream;\n if (videoDependencyStream &&\n !shaka.lcevc.Dec.isStreamSupported(videoDependencyStream)) {\n return false;\n }\n\n const audio = variant.audio;\n\n // See: https://github.com/shaka-project/shaka-player/issues/6111\n // It seems that Firefox Android reports that it supports\n // Opus + Widevine, but it is not actually supported.\n // It makes sense to drop early.\n if (isFirefoxAndroid && audio && audio.encrypted &&\n audio.codecs.toLowerCase().includes('opus')) {\n return false;\n }\n\n const audioDependencyStream = audio && audio.dependencyStream;\n if (audioDependencyStream) {\n return false;\n }\n\n return true;\n }\n\n\n /**\n * Queries mediaCapabilities for the decoding info for that decoding config,\n * and assigns it to the given variant.\n * If that query has been done before, instead return a cached result.\n * @param {!shaka.extern.Variant} variant\n * @param {!Array<!MediaDecodingConfiguration>} decodingConfigs\n * @private\n */\n static async getDecodingInfosForVariant_(variant, decodingConfigs) {\n /**\n * @param {?MediaCapabilitiesDecodingInfo} a\n * @param {!MediaCapabilitiesDecodingInfo} b\n * @return {!MediaCapabilitiesDecodingInfo}\n */\n const merge = (a, b) => {\n if (!a) {\n return b;\n } else {\n const res = shaka.util.ObjectUtils.shallowCloneObject(a);\n res.supported = a.supported && b.supported;\n res.powerEfficient = a.powerEfficient && b.powerEfficient;\n res.smooth = a.smooth && b.smooth;\n if (b.keySystemAccess && !res.keySystemAccess) {\n res.keySystemAccess = b.keySystemAccess;\n }\n return res;\n }\n };\n\n const StreamUtils = shaka.util.StreamUtils;\n /** @type {?MediaCapabilitiesDecodingInfo} */\n let finalResult = null;\n const promises = [];\n for (const decodingConfig of decodingConfigs) {\n const cacheKey =\n shaka.util.ObjectUtils.alphabeticalKeyOrderStringify(decodingConfig);\n\n const cache = StreamUtils.decodingConfigCache_;\n if (cache.has(cacheKey)) {\n shaka.log.v2('Using cached results of mediaCapabilities.decodingInfo',\n 'for key', cacheKey);\n finalResult = merge(finalResult, cache.get(cacheKey));\n } else {\n // Do a final pass-over of the decoding config: if a given stream has\n // multiple codecs, that suggests that it switches between those codecs\n // at points of the go-through.\n // mediaCapabilities by itself will report \"not supported\" when you\n // put in multiple different codecs, so each has to be checked\n // individually. So check each and take the worst result, to determine\n // overall variant compatibility.\n promises.push(StreamUtils\n .checkEachDecodingConfigCombination_(decodingConfig).then((res) => {\n /** @type {?MediaCapabilitiesDecodingInfo} */\n let acc = null;\n for (const result of (res || [])) {\n acc = merge(acc, result);\n }\n if (acc) {\n cache.set(cacheKey, acc);\n finalResult = merge(finalResult, acc);\n }\n }));\n }\n }\n await Promise.all(promises);\n if (finalResult) {\n variant.decodingInfos.push(finalResult);\n }\n }\n\n /**\n * @param {!MediaDecodingConfiguration} decodingConfig\n * @return {!Promise<?Array<!MediaCapabilitiesDecodingInfo>>}\n * @private\n */\n static checkEachDecodingConfigCombination_(decodingConfig) {\n let videoCodecs = [''];\n if (decodingConfig.video) {\n videoCodecs = shaka.util.MimeUtils.getCodecs(\n decodingConfig.video.contentType).split(',');\n }\n let audioCodecs = [''];\n if (decodingConfig.audio) {\n audioCodecs = shaka.util.MimeUtils.getCodecs(\n decodingConfig.audio.contentType).split(',');\n }\n const promises = [];\n for (const videoCodec of videoCodecs) {\n for (const audioCodec of audioCodecs) {\n const copy = shaka.util.ObjectUtils.cloneObject(decodingConfig);\n if (decodingConfig.video) {\n const mimeType = shaka.util.MimeUtils.getBasicType(\n copy.video.contentType);\n copy.video.contentType = shaka.util.MimeUtils.getFullType(\n mimeType, videoCodec);\n }\n if (decodingConfig.audio) {\n const mimeType = shaka.util.MimeUtils.getBasicType(\n copy.audio.contentType);\n copy.audio.contentType = shaka.util.MimeUtils.getFullType(\n mimeType, audioCodec);\n }\n promises.push(new Promise((resolve, reject) => {\n // On some (Android) WebView environments, decodingInfo will\n // not resolve or reject, at least if RESOURCE_PROTECTED_MEDIA_ID\n // is not set. This is a workaround for that issue.\n const TIMEOUT_FOR_DECODING_INFO_IN_SECONDS = 5;\n let promise;\n if (shaka.util.Platform.isAndroid()) {\n promise = shaka.util.Functional.promiseWithTimeout(\n TIMEOUT_FOR_DECODING_INFO_IN_SECONDS,\n navigator.mediaCapabilities.decodingInfo(copy),\n );\n } else {\n promise = navigator.mediaCapabilities.decodingInfo(copy);\n }\n promise.then((res) => {\n resolve(res);\n }).catch(reject);\n }));\n }\n }\n return Promise.all(promises).catch((e) => {\n shaka.log.info('MediaCapabilities.decodingInfo() failed.',\n JSON.stringify(decodingConfig), e);\n return null;\n });\n }\n\n\n /**\n * Get the decodingInfo results of the variants via MediaCapabilities.\n * This should be called after the DrmEngine is created and configured, and\n * before DrmEngine sets the mediaKeys.\n *\n * @param {!Array<shaka.extern.Variant>} variants\n * @param {boolean} usePersistentLicenses\n * @param {boolean} srcEquals\n * @param {!Array<string>} preferredKeySystems\n * @exportDoc\n */\n static async getDecodingInfosForVariants(variants, usePersistentLicenses,\n srcEquals, preferredKeySystems) {\n const gotDecodingInfo = variants.some((variant) =>\n variant.decodingInfos.length);\n if (gotDecodingInfo) {\n shaka.log.debug('Already got the variants\\' decodingInfo.');\n return;\n }\n\n // Try to get preferred key systems first to avoid unneeded calls to CDM.\n for (const preferredKeySystem of preferredKeySystems) {\n let keySystemSatisfied = false;\n for (const variant of variants) {\n /** @type {!Array<!Array<!MediaDecodingConfiguration>>} */\n const decodingConfigs = shaka.util.StreamUtils.getDecodingConfigs_(\n variant, usePersistentLicenses, srcEquals)\n .filter((configs) => {\n // All configs in a batch will have the same keySystem.\n const config = configs[0];\n const keySystem = config.keySystemConfiguration &&\n config.keySystemConfiguration.keySystem;\n return keySystem === preferredKeySystem;\n });\n\n // The reason we are performing this await in a loop rather than\n // batching into a `promise.all` is performance related.\n // https://github.com/shaka-project/shaka-player/pull/4708#discussion_r1022581178\n for (const configs of decodingConfigs) {\n // eslint-disable-next-line no-await-in-loop\n await shaka.util.StreamUtils.getDecodingInfosForVariant_(\n variant, configs);\n }\n if (variant.decodingInfos.length) {\n keySystemSatisfied = true;\n }\n } // for (const variant of variants)\n if (keySystemSatisfied) {\n // Return if any preferred key system is already satisfied.\n return;\n }\n } // for (const preferredKeySystem of preferredKeySystems)\n\n for (const variant of variants) {\n /** @type {!Array<!Array<!MediaDecodingConfiguration>>} */\n const decodingConfigs = shaka.util.StreamUtils.getDecodingConfigs_(\n variant, usePersistentLicenses, srcEquals)\n .filter((configs) => {\n // All configs in a batch will have the same keySystem.\n const config = configs[0];\n const keySystem = config.keySystemConfiguration &&\n config.keySystemConfiguration.keySystem;\n // Avoid checking preferred systems twice.\n return !keySystem || !preferredKeySystems.includes(keySystem);\n });\n\n // The reason we are performing this await in a loop rather than\n // batching into a `promise.all` is performance related.\n // https://github.com/shaka-project/shaka-player/pull/4708#discussion_r1022581178\n for (const configs of decodingConfigs) {\n // eslint-disable-next-line no-await-in-loop\n await shaka.util.StreamUtils.getDecodingInfosForVariant_(\n variant, configs);\n }\n }\n }\n\n\n /**\n * Generate a batch of MediaDecodingConfiguration objects to get the\n * decodingInfo results for each variant.\n * Each batch shares the same DRM information, and represents the various\n * fullMimeType combinations of the streams.\n * @param {!shaka.extern.Variant} variant\n * @param {boolean} usePersistentLicenses\n * @param {boolean} srcEquals\n * @return {!Array<!Array<!MediaDecodingConfiguration>>}\n * @private\n */\n static getDecodingConfigs_(variant, usePersistentLicenses, srcEquals) {\n const audio = variant.audio;\n const video = variant.video;\n\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n const ManifestParserUtils = shaka.util.ManifestParserUtils;\n const MimeUtils = shaka.util.MimeUtils;\n const StreamUtils = shaka.util.StreamUtils;\n\n const videoConfigs = [];\n const audioConfigs = [];\n if (video) {\n for (const fullMimeType of video.fullMimeTypes) {\n let videoCodecs = MimeUtils.getCodecs(fullMimeType);\n\n // For multiplexed streams with audio+video codecs, the config should\n // have AudioConfiguration and VideoConfiguration.\n // We ignore the multiplexed audio when there is normal audio also.\n if (videoCodecs.includes(',') && !audio) {\n const allCodecs = videoCodecs.split(',');\n const baseMimeType = MimeUtils.getBasicType(fullMimeType);\n\n videoCodecs = ManifestParserUtils.guessCodecs(\n ContentType.VIDEO, allCodecs);\n\n let audioCodecs = ManifestParserUtils.guessCodecs(\n ContentType.AUDIO, allCodecs);\n audioCodecs = StreamUtils.getCorrectAudioCodecs(\n audioCodecs, baseMimeType);\n\n const audioFullType = MimeUtils.getFullOrConvertedType(\n baseMimeType, audioCodecs, ContentType.AUDIO);\n\n audioConfigs.push({\n contentType: audioFullType,\n channels: 2,\n bitrate: variant.bandwidth || 1,\n samplerate: 1,\n spatialRendering: false,\n });\n }\n\n videoCodecs = StreamUtils.getCorrectVideoCodecs(videoCodecs);\n const fullType = MimeUtils.getFullOrConvertedType(\n MimeUtils.getBasicType(fullMimeType), videoCodecs,\n ContentType.VIDEO);\n\n // VideoConfiguration\n const videoConfig = {\n contentType: fullType,\n\n // NOTE: Some decoders strictly check the width and height fields and\n // won't decode smaller than 64x64. So if we don't have this info (as\n // is the case in some of our simpler tests), assume a 64x64\n // resolution to fill in this required field for MediaCapabilities.\n //\n // This became an issue specifically on Firefox on M1 Macs.\n width: video.width || 64,\n height: video.height || 64,\n\n bitrate: video.bandwidth || variant.bandwidth || 1,\n // framerate must be greater than 0, otherwise the config is invalid.\n framerate: video.frameRate || 1,\n };\n if (video.hdr) {\n switch (video.hdr) {\n case 'SDR':\n videoConfig.transferFunction = 'srgb';\n break;\n case 'PQ':\n videoConfig.transferFunction = 'pq';\n break;\n case 'HLG':\n videoConfig.transferFunction = 'hlg';\n break;\n }\n }\n if (video.colorGamut) {\n videoConfig.colorGamut = video.colorGamut;\n }\n videoConfigs.push(videoConfig);\n }\n }\n if (audio) {\n for (const fullMimeType of audio.fullMimeTypes) {\n const baseMimeType = MimeUtils.getBasicType(fullMimeType);\n const codecs = StreamUtils.getCorrectAudioCodecs(\n MimeUtils.getCodecs(fullMimeType), baseMimeType);\n const fullType = MimeUtils.getFullOrConvertedType(\n baseMimeType, codecs, ContentType.AUDIO);\n\n // AudioConfiguration\n audioConfigs.push({\n contentType: fullType,\n channels: audio.channelsCount || 2,\n bitrate: audio.bandwidth || variant.bandwidth || 1,\n samplerate: audio.audioSamplingRate || 1,\n spatialRendering: audio.spatialAudio,\n });\n }\n }\n\n // Generate each combination of video and audio config as a separate\n // MediaDecodingConfiguration, inside the main \"batch\".\n /** @type {!Array<!MediaDecodingConfiguration>} */\n const mediaDecodingConfigBatch = [];\n if (videoConfigs.length == 0) {\n videoConfigs.push(null);\n }\n if (audioConfigs.length == 0) {\n audioConfigs.push(null);\n }\n for (const videoConfig of videoConfigs) {\n for (const audioConfig of audioConfigs) {\n /** @type {!MediaDecodingConfiguration} */\n const mediaDecodingConfig = {\n type: srcEquals ? 'file' : 'media-source',\n };\n if (videoConfig) {\n mediaDecodingConfig.video = videoConfig;\n }\n if (audioConfig) {\n mediaDecodingConfig.audio = audioConfig;\n }\n mediaDecodingConfigBatch.push(mediaDecodingConfig);\n }\n }\n\n const videoDrmInfos = variant.video ? variant.video.drmInfos : [];\n const audioDrmInfos = variant.audio ? variant.audio.drmInfos : [];\n const allDrmInfos = videoDrmInfos.concat(audioDrmInfos);\n\n // Return a list containing the mediaDecodingConfig for unencrypted variant.\n if (!allDrmInfos.length) {\n return [mediaDecodingConfigBatch];\n }\n\n // A list of MediaDecodingConfiguration objects created for the variant.\n const configs = [];\n\n // Get all the drm info so that we can avoid using nested loops when we\n // just need the drm info.\n const drmInfoByKeySystems = new Map();\n for (const info of allDrmInfos) {\n if (!drmInfoByKeySystems.get(info.keySystem)) {\n drmInfoByKeySystems.set(info.keySystem, []);\n }\n drmInfoByKeySystems.get(info.keySystem).push(info);\n }\n\n const persistentState =\n usePersistentLicenses ? 'required' : 'optional';\n const sessionTypes =\n usePersistentLicenses ? ['persistent-license'] : ['temporary'];\n\n for (const keySystem of drmInfoByKeySystems.keys()) {\n const drmInfos = drmInfoByKeySystems.get(keySystem);\n\n // Get all the robustness info so that we can avoid using nested\n // loops when we just need the robustness.\n const drmInfosByRobustness = new Map();\n for (const info of drmInfos) {\n const keyName = `${info.videoRobustness},${info.audioRobustness}`;\n if (!drmInfosByRobustness.get(keyName)) {\n drmInfosByRobustness.set(keyName, []);\n }\n drmInfosByRobustness.get(keyName).push(info);\n }\n\n for (const drmInfosRobustness of drmInfosByRobustness.values()) {\n const modifiedMediaDecodingConfigBatch = [];\n for (const base of mediaDecodingConfigBatch) {\n // Create a copy of the mediaDecodingConfig.\n const config = /** @type {!MediaDecodingConfiguration} */\n (Object.assign({}, base));\n\n\n /** @type {!MediaCapabilitiesKeySystemConfiguration} */\n const keySystemConfig = {\n keySystem: keySystem,\n initDataType: 'cenc',\n persistentState: persistentState,\n distinctiveIdentifier: 'optional',\n sessionTypes: sessionTypes,\n };\n\n for (const info of drmInfosRobustness) {\n if (info.initData && info.initData.length) {\n const initDataTypes = new Set();\n for (const initData of info.initData) {\n initDataTypes.add(initData.initDataType);\n }\n if (initDataTypes.size > 1) {\n shaka.log.v2('DrmInfo contains more than one initDataType,',\n 'and we use the initDataType of the first initData.',\n info);\n }\n keySystemConfig.initDataType = info.initData[0].initDataType;\n }\n\n if (info.distinctiveIdentifierRequired) {\n keySystemConfig.distinctiveIdentifier = 'required';\n }\n if (info.persistentStateRequired) {\n keySystemConfig.persistentState = 'required';\n }\n if (info.sessionType) {\n keySystemConfig.sessionTypes = [info.sessionType];\n }\n\n if (audio) {\n if (!keySystemConfig.audio) {\n // KeySystemTrackConfiguration\n keySystemConfig.audio = {\n robustness: info.audioRobustness,\n };\n if (info.encryptionScheme) {\n keySystemConfig.audio.encryptionScheme =\n info.encryptionScheme;\n }\n } else {\n if (info.encryptionScheme) {\n keySystemConfig.audio.encryptionScheme =\n keySystemConfig.audio.encryptionScheme ||\n info.encryptionScheme;\n }\n keySystemConfig.audio.robustness =\n keySystemConfig.audio.robustness ||\n info.audioRobustness;\n }\n // See: https://github.com/shaka-project/shaka-player/issues/4659\n if (keySystemConfig.audio.robustness == '') {\n delete keySystemConfig.audio.robustness;\n }\n }\n\n if (video) {\n if (!keySystemConfig.video) {\n // KeySystemTrackConfiguration\n keySystemConfig.video = {\n robustness: info.videoRobustness,\n };\n if (info.encryptionScheme) {\n keySystemConfig.video.encryptionScheme =\n info.encryptionScheme;\n }\n } else {\n if (info.encryptionScheme) {\n keySystemConfig.video.encryptionScheme =\n keySystemConfig.video.encryptionScheme ||\n info.encryptionScheme;\n }\n keySystemConfig.video.robustness =\n keySystemConfig.video.robustness ||\n info.videoRobustness;\n }\n // See: https://github.com/shaka-project/shaka-player/issues/4659\n if (keySystemConfig.video.robustness == '') {\n delete keySystemConfig.video.robustness;\n }\n }\n }\n config.keySystemConfiguration = keySystemConfig;\n modifiedMediaDecodingConfigBatch.push(config);\n }\n configs.push(modifiedMediaDecodingConfigBatch);\n }\n }\n return configs;\n }\n\n\n /**\n * Generates the correct audio codec for MediaDecodingConfiguration and\n * for MediaSource.isTypeSupported.\n * @param {string} codecs\n * @param {string} mimeType\n * @return {string}\n */\n static getCorrectAudioCodecs(codecs, mimeType) {\n // According to RFC 6381 section 3.3, 'fLaC' is actually the correct\n // codec string. We still need to map it to 'flac', as some browsers\n // currently don't support 'fLaC', while 'flac' is supported by most\n // major browsers.\n // See https://bugs.chromium.org/p/chromium/issues/detail?id=1422728\n if (codecs.toLowerCase() == 'flac') {\n if (!shaka.util.Platform.isApple()) {\n return 'flac';\n } else {\n return 'fLaC';\n }\n }\n\n // The same is true for 'Opus'.\n if (codecs.toLowerCase() === 'opus') {\n if (!shaka.util.Platform.isApple()) {\n return 'opus';\n } else {\n if (shaka.util.MimeUtils.getContainerType(mimeType) == 'mp4') {\n return 'Opus';\n } else {\n return 'opus';\n }\n }\n }\n\n if (codecs.toLowerCase() == 'ac-3' &&\n shaka.util.Platform.requiresEC3InitSegments()) {\n return 'ec-3';\n }\n\n return codecs;\n }\n\n\n /**\n * Generates the correct video codec for MediaDecodingConfiguration and\n * for MediaSource.isTypeSupported.\n * @param {string} codec\n * @return {string}\n */\n static getCorrectVideoCodecs(codec) {\n if (codec.includes('avc1')) {\n // Convert avc1 codec string from RFC-4281 to RFC-6381 for\n // MediaSource.isTypeSupported\n // Example, convert avc1.66.30 to avc1.42001e (0x42 == 66 and 0x1e == 30)\n const avcData = codec.split('.');\n if (avcData.length == 3) {\n let result = avcData.shift() + '.';\n result += parseInt(avcData.shift(), 10).toString(16);\n result +=\n ('000' + parseInt(avcData.shift(), 10).toString(16)).slice(-4);\n return result;\n }\n } else if (codec == 'vp9') {\n // MediaCapabilities supports 'vp09...' codecs, but not 'vp9'. Translate\n // vp9 codec strings into 'vp09...', to allow such content to play with\n // mediaCapabilities enabled.\n // This means profile 0, level 4.1, 8-bit color. This supports 1080p @\n // 60Hz. See https://en.wikipedia.org/wiki/VP9#Levels\n //\n // If we don't have more detailed codec info, assume this profile and\n // level because it's high enough to likely accommodate the parameters we\n // do have, such as width and height. If an implementation is checking\n // the profile and level very strictly, we want older VP9 content to\n // still work to some degree. But we don't want to set a level so high\n // that it is rejected by a hardware decoder that can't handle the\n // maximum requirements of the level.\n //\n // This became an issue specifically on Firefox on M1 Macs.\n return 'vp09.00.41.08';\n }\n return codec;\n }\n\n\n /**\n * Alters the given Manifest to filter out any streams incompatible with the\n * current variant.\n *\n * @param {?shaka.extern.Variant} currentVariant\n * @param {shaka.extern.Manifest} manifest\n */\n static filterManifestByCurrentVariant(currentVariant, manifest) {\n const StreamUtils = shaka.util.StreamUtils;\n manifest.variants = manifest.variants.filter((variant) => {\n const audio = variant.audio;\n const video = variant.video;\n if (audio && currentVariant && currentVariant.audio) {\n if (!StreamUtils.areStreamsCompatible_(audio, currentVariant.audio)) {\n shaka.log.debug('Dropping variant - not compatible with active audio',\n 'active audio',\n StreamUtils.getStreamSummaryString_(currentVariant.audio),\n 'variant.audio',\n StreamUtils.getStreamSummaryString_(audio));\n return false;\n }\n }\n\n if (video && currentVariant && currentVariant.video) {\n if (!StreamUtils.areStreamsCompatible_(video, currentVariant.video)) {\n shaka.log.debug('Dropping variant - not compatible with active video',\n 'active video',\n StreamUtils.getStreamSummaryString_(currentVariant.video),\n 'variant.video',\n StreamUtils.getStreamSummaryString_(video));\n return false;\n }\n }\n\n return true;\n });\n }\n\n /**\n * Alters the given Manifest to filter out any unsupported text streams.\n *\n * @param {shaka.extern.Manifest} manifest\n * @private\n */\n static filterTextStreams_(manifest) {\n // Filter text streams.\n manifest.textStreams = manifest.textStreams.filter((stream) => {\n const fullMimeType = shaka.util.MimeUtils.getFullType(\n stream.mimeType, stream.codecs);\n const keep = shaka.text.TextEngine.isTypeSupported(fullMimeType);\n\n if (!keep) {\n shaka.log.debug('Dropping text stream. Is not supported by the ' +\n 'platform.', stream);\n }\n\n return keep;\n });\n }\n\n\n /**\n * Alters the given Manifest to filter out any unsupported image streams.\n *\n * @param {shaka.extern.Manifest} manifest\n * @private\n */\n static async filterImageStreams_(manifest) {\n const imageStreams = [];\n for (const stream of manifest.imageStreams) {\n let mimeType = stream.mimeType;\n if (mimeType == 'application/mp4' && stream.codecs == 'mjpg') {\n mimeType = 'image/jpg';\n }\n if (!shaka.util.StreamUtils.supportedImageMimeTypes_.has(mimeType)) {\n const minImage = shaka.util.StreamUtils.minImage_.get(mimeType);\n if (minImage) {\n // eslint-disable-next-line no-await-in-loop\n const res = await shaka.util.StreamUtils.isImageSupported_(minImage);\n shaka.util.StreamUtils.supportedImageMimeTypes_.set(mimeType, res);\n } else {\n shaka.util.StreamUtils.supportedImageMimeTypes_.set(mimeType, false);\n }\n }\n\n const keep =\n shaka.util.StreamUtils.supportedImageMimeTypes_.get(mimeType);\n\n if (!keep) {\n shaka.log.debug('Dropping image stream. Is not supported by the ' +\n 'platform.', stream);\n } else {\n imageStreams.push(stream);\n }\n }\n manifest.imageStreams = imageStreams;\n }\n\n /**\n * @param {string} minImage\n * @return {!Promise<boolean>}\n * @private\n */\n static isImageSupported_(minImage) {\n return new Promise((resolve) => {\n const imageElement = /** @type {HTMLImageElement} */(new Image());\n imageElement.src = minImage;\n if ('decode' in imageElement) {\n imageElement.decode().then(() => {\n resolve(true);\n }).catch(() => {\n resolve(false);\n });\n } else {\n imageElement.onload = imageElement.onerror = () => {\n resolve(imageElement.height === 2);\n };\n }\n });\n }\n\n /**\n * @param {shaka.extern.Stream} s0\n * @param {shaka.extern.Stream} s1\n * @return {boolean}\n * @private\n */\n static areStreamsCompatible_(s0, s1) {\n // Basic mime types and basic codecs need to match.\n // For example, we can't adapt between WebM and MP4,\n // nor can we adapt between mp4a.* to ec-3.\n // We can switch between text types on the fly,\n // so don't run this check on text.\n if (s0.mimeType != s1.mimeType) {\n return false;\n }\n\n if (s0.codecs.split('.')[0] != s1.codecs.split('.')[0]) {\n return false;\n }\n\n return true;\n }\n\n\n /**\n * @param {shaka.extern.Variant} variant\n * @return {shaka.extern.Track}\n */\n static variantToTrack(variant) {\n const ManifestParserUtils = shaka.util.ManifestParserUtils;\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n\n /** @type {?shaka.extern.Stream} */\n const audio = variant.audio;\n /** @type {?shaka.extern.Stream} */\n const video = variant.video;\n\n /** @type {?string} */\n const audioMimeType = audio ? audio.mimeType : null;\n /** @type {?string} */\n const videoMimeType = video ? video.mimeType : null;\n\n /** @type {?string} */\n const audioCodec = audio ? audio.codecs : null;\n /** @type {?string} */\n const videoCodec = video ? video.codecs : null;\n\n /** @type {?string} */\n const audioGroupId = audio ? audio.groupId : null;\n\n /** @type {!Array<string>} */\n const mimeTypes = [];\n if (video) {\n mimeTypes.push(video.mimeType);\n }\n if (audio) {\n mimeTypes.push(audio.mimeType);\n }\n /** @type {?string} */\n const mimeType = mimeTypes[0] || null;\n\n /** @type {!Array<string>} */\n const kinds = [];\n if (audio) {\n kinds.push(audio.kind);\n }\n if (video) {\n kinds.push(video.kind);\n }\n /** @type {?string} */\n const kind = kinds[0] || null;\n\n /** @type {!Set<string>} */\n const roles = new Set();\n if (audio) {\n for (const role of audio.roles) {\n roles.add(role);\n }\n }\n if (video) {\n for (const role of video.roles) {\n roles.add(role);\n }\n }\n\n /** @type {shaka.extern.Track} */\n const track = {\n id: variant.id,\n active: false,\n type: 'variant',\n bandwidth: variant.bandwidth,\n language: variant.language,\n label: null,\n kind: kind,\n width: null,\n height: null,\n frameRate: null,\n pixelAspectRatio: null,\n hdr: null,\n colorGamut: null,\n videoLayout: null,\n mimeType: mimeType,\n audioMimeType: audioMimeType,\n videoMimeType: videoMimeType,\n codecs: '',\n audioCodec: audioCodec,\n videoCodec: videoCodec,\n primary: variant.primary,\n roles: Array.from(roles),\n audioRoles: null,\n forced: false,\n videoId: null,\n audioId: null,\n audioGroupId: audioGroupId,\n channelsCount: null,\n audioSamplingRate: null,\n spatialAudio: false,\n tilesLayout: null,\n audioBandwidth: null,\n videoBandwidth: null,\n originalVideoId: null,\n originalAudioId: null,\n originalTextId: null,\n originalImageId: null,\n accessibilityPurpose: null,\n originalLanguage: null,\n };\n\n if (video) {\n track.videoId = video.id;\n track.originalVideoId = video.originalId;\n track.width = video.width || null;\n track.height = video.height || null;\n track.frameRate = video.frameRate || null;\n track.pixelAspectRatio = video.pixelAspectRatio || null;\n track.videoBandwidth = video.bandwidth || null;\n track.hdr = video.hdr || null;\n track.colorGamut = video.colorGamut || null;\n track.videoLayout = video.videoLayout || null;\n\n const dependencyStream = video.dependencyStream;\n if (dependencyStream) {\n track.width = dependencyStream.width || track.width;\n track.height = dependencyStream.height || track.height;\n track.videoCodec = dependencyStream.codecs || track.videoCodec;\n }\n\n if (videoCodec.includes(',')) {\n track.channelsCount = video.channelsCount;\n track.audioSamplingRate = video.audioSamplingRate;\n track.spatialAudio = video.spatialAudio;\n track.originalLanguage = video.originalLanguage;\n track.audioMimeType = videoMimeType;\n const allCodecs = videoCodec.split(',');\n try {\n track.videoCodec = ManifestParserUtils.guessCodecs(\n ContentType.VIDEO, allCodecs);\n track.audioCodec = ManifestParserUtils.guessCodecs(\n ContentType.AUDIO, allCodecs);\n } catch (e) {\n // Ignore this error.\n }\n }\n }\n\n if (audio) {\n track.audioId = audio.id;\n track.originalAudioId = audio.originalId;\n track.channelsCount = audio.channelsCount;\n track.audioSamplingRate = audio.audioSamplingRate;\n track.audioBandwidth = audio.bandwidth || null;\n track.spatialAudio = audio.spatialAudio;\n track.label = audio.label;\n track.audioRoles = audio.roles;\n track.accessibilityPurpose = audio.accessibilityPurpose;\n track.originalLanguage = audio.originalLanguage;\n\n const dependencyStream = audio.dependencyStream;\n if (dependencyStream) {\n track.audioCodec = dependencyStream.codecs || track.audioCodec;\n }\n }\n\n /** @type {!Array<string>} */\n const codecs = [];\n if (track.videoCodec) {\n codecs.push(track.videoCodec);\n }\n if (track.audioCodec) {\n codecs.push(track.audioCodec);\n }\n track.codecs = codecs.join(', ');\n\n return track;\n }\n\n\n /**\n * @param {shaka.extern.Stream} stream\n * @return {shaka.extern.Track}\n */\n static textStreamToTrack(stream) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n\n /** @type {shaka.extern.Track} */\n const track = {\n id: stream.id,\n active: false,\n type: ContentType.TEXT,\n bandwidth: 0,\n language: stream.language,\n label: stream.label,\n kind: stream.kind || null,\n width: null,\n height: null,\n frameRate: null,\n pixelAspectRatio: null,\n hdr: null,\n colorGamut: null,\n videoLayout: null,\n mimeType: stream.mimeType,\n audioMimeType: null,\n videoMimeType: null,\n codecs: stream.codecs || null,\n audioCodec: null,\n videoCodec: null,\n primary: stream.primary,\n roles: stream.roles,\n audioRoles: null,\n forced: stream.forced,\n videoId: null,\n audioId: null,\n audioGroupId: null,\n channelsCount: null,\n audioSamplingRate: null,\n spatialAudio: false,\n tilesLayout: null,\n audioBandwidth: null,\n videoBandwidth: null,\n originalVideoId: null,\n originalAudioId: null,\n originalTextId: stream.originalId,\n originalImageId: null,\n accessibilityPurpose: stream.accessibilityPurpose,\n originalLanguage: stream.originalLanguage,\n };\n\n return track;\n }\n\n\n /**\n * @param {shaka.extern.Stream} stream\n * @return {shaka.extern.Track}\n */\n static imageStreamToTrack(stream) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n\n let width = stream.width || null;\n let height = stream.height || null;\n\n // The stream width and height represent the size of the entire thumbnail\n // sheet, so divide by the layout.\n let reference = null;\n // Note: segmentIndex is built by default for HLS, but not for DASH, but\n // in DASH this information comes at the stream level and not at the\n // segment level.\n if (stream.segmentIndex) {\n reference = stream.segmentIndex.earliestReference();\n }\n let layout = stream.tilesLayout;\n if (reference) {\n layout = reference.getTilesLayout() || layout;\n }\n if (layout && width != null) {\n width /= Number(layout.split('x')[0]);\n }\n if (layout && height != null) {\n height /= Number(layout.split('x')[1]);\n }\n // TODO: What happens if there are multiple grids, with different\n // layout sizes, inside this image stream?\n\n /** @type {shaka.extern.Track} */\n const track = {\n id: stream.id,\n active: false,\n type: ContentType.IMAGE,\n bandwidth: stream.bandwidth || 0,\n language: '',\n label: null,\n kind: null,\n width,\n height,\n frameRate: null,\n pixelAspectRatio: null,\n hdr: null,\n colorGamut: null,\n videoLayout: null,\n mimeType: stream.mimeType,\n audioMimeType: null,\n videoMimeType: null,\n codecs: stream.codecs || null,\n audioCodec: null,\n videoCodec: null,\n primary: false,\n roles: [],\n audioRoles: null,\n forced: false,\n videoId: null,\n audioId: null,\n audioGroupId: null,\n channelsCount: null,\n audioSamplingRate: null,\n spatialAudio: false,\n tilesLayout: layout || null,\n audioBandwidth: null,\n videoBandwidth: null,\n originalVideoId: null,\n originalAudioId: null,\n originalTextId: null,\n originalImageId: stream.originalId,\n accessibilityPurpose: null,\n originalLanguage: null,\n };\n\n return track;\n }\n\n\n /**\n * Generate and return an ID for this track, since the ID field is optional.\n *\n * @param {TextTrack|AudioTrack} html5Track\n * @return {number} The generated ID.\n */\n static html5TrackId(html5Track) {\n if (!html5Track['__shaka_id']) {\n html5Track['__shaka_id'] = shaka.util.StreamUtils.nextTrackId_++;\n }\n return html5Track['__shaka_id'];\n }\n\n\n /**\n * @param {TextTrack} textTrack\n * @return {shaka.extern.Track}\n */\n static html5TextTrackToTrack(textTrack) {\n const StreamUtils = shaka.util.StreamUtils;\n\n /** @type {shaka.extern.Track} */\n const track = StreamUtils.html5TrackToGenericShakaTrack_(textTrack);\n track.active = textTrack.mode != 'disabled';\n track.type = 'text';\n track.originalTextId = textTrack.id;\n if (textTrack.kind == 'captions') {\n // See: https://github.com/shaka-project/shaka-player/issues/6233\n track.mimeType = 'unknown';\n }\n if (textTrack.kind == 'subtitles') {\n track.mimeType = 'text/vtt';\n }\n if (textTrack.kind) {\n track.roles = [textTrack.kind];\n }\n if (textTrack.kind == 'forced') {\n track.forced = true;\n }\n\n return track;\n }\n\n\n /**\n * @param {AudioTrack} audioTrack\n * @return {shaka.extern.Track}\n */\n static html5AudioTrackToTrack(audioTrack) {\n const StreamUtils = shaka.util.StreamUtils;\n\n /** @type {shaka.extern.Track} */\n const track = StreamUtils.html5TrackToGenericShakaTrack_(audioTrack);\n track.active = audioTrack.enabled;\n track.type = 'variant';\n track.originalAudioId = audioTrack.id;\n\n if (audioTrack.kind == 'main') {\n track.primary = true;\n }\n if (audioTrack.kind) {\n track.roles = [audioTrack.kind];\n track.audioRoles = [audioTrack.kind];\n track.label = audioTrack.label;\n }\n\n return track;\n }\n\n\n /**\n * Creates a Track object with non-type specific fields filled out. The\n * caller is responsible for completing the Track object with any\n * type-specific information (audio or text).\n *\n * @param {TextTrack|AudioTrack} html5Track\n * @return {shaka.extern.Track}\n * @private\n */\n static html5TrackToGenericShakaTrack_(html5Track) {\n const language = html5Track.language;\n\n /** @type {shaka.extern.Track} */\n const track = {\n id: shaka.util.StreamUtils.html5TrackId(html5Track),\n active: false,\n type: '',\n bandwidth: 0,\n language: shaka.util.LanguageUtils.normalize(language || 'und'),\n label: html5Track.label,\n kind: html5Track.kind,\n width: null,\n height: null,\n frameRate: null,\n pixelAspectRatio: null,\n hdr: null,\n colorGamut: null,\n videoLayout: null,\n mimeType: null,\n audioMimeType: null,\n videoMimeType: null,\n codecs: null,\n audioCodec: null,\n videoCodec: null,\n primary: false,\n roles: [],\n forced: false,\n audioRoles: null,\n videoId: null,\n audioId: null,\n audioGroupId: null,\n channelsCount: null,\n audioSamplingRate: null,\n spatialAudio: false,\n tilesLayout: null,\n audioBandwidth: null,\n videoBandwidth: null,\n originalVideoId: null,\n originalAudioId: null,\n originalTextId: null,\n originalImageId: null,\n accessibilityPurpose: null,\n originalLanguage: language,\n };\n\n return track;\n }\n\n\n /**\n * Determines if the given variant is playable.\n * @param {!shaka.extern.Variant} variant\n * @return {boolean}\n */\n static isPlayable(variant) {\n return variant.allowedByApplication &&\n variant.allowedByKeySystem &&\n variant.disabledUntilTime == 0;\n }\n\n\n /**\n * Filters out unplayable variants.\n * @param {!Array<!shaka.extern.Variant>} variants\n * @return {!Array<!shaka.extern.Variant>}\n */\n static getPlayableVariants(variants) {\n return variants.filter((variant) => {\n return shaka.util.StreamUtils.isPlayable(variant);\n });\n }\n\n\n /**\n * Chooses streams according to the given config.\n * Works both for Stream and Track types due to their similarities.\n *\n * @param {!Array<!shaka.extern.Stream>|!Array<!shaka.extern.Track>} streams\n * @param {string} preferredLanguage\n * @param {string} preferredRole\n * @param {boolean} preferredForced\n * @return {!Array<!shaka.extern.Stream>|!Array<!shaka.extern.Track>}\n */\n static filterStreamsByLanguageAndRole(\n streams, preferredLanguage, preferredRole, preferredForced) {\n const LanguageUtils = shaka.util.LanguageUtils;\n\n /** @type {!Array<!shaka.extern.Stream>|!Array<!shaka.extern.Track>} */\n let chosen = streams;\n\n // Start with the set of primary streams.\n /** @type {!Array<!shaka.extern.Stream>|!Array<!shaka.extern.Track>} */\n const primary = streams.filter((stream) => {\n return stream.primary;\n });\n\n if (primary.length) {\n chosen = primary;\n }\n\n // Now reduce the set to one language. This covers both arbitrary language\n // choice and the reduction of the \"primary\" stream set to one language.\n const firstLanguage = chosen.length ? chosen[0].language : '';\n chosen = chosen.filter((stream) => {\n return stream.language == firstLanguage;\n });\n\n // Find the streams that best match our language preference. This will\n // override previous selections.\n if (preferredLanguage) {\n const closestLocale = LanguageUtils.findClosestLocale(\n LanguageUtils.normalize(preferredLanguage),\n streams.map((stream) => stream.language));\n\n // Only replace |chosen| if we found a locale that is close to our\n // preference.\n if (closestLocale) {\n chosen = streams.filter((stream) => {\n const locale = LanguageUtils.normalize(stream.language);\n return locale == closestLocale;\n });\n }\n }\n\n // Filter by forced preference\n chosen = chosen.filter((stream) => {\n return stream.forced == preferredForced;\n });\n\n // Now refine the choice based on role preference.\n if (preferredRole) {\n const roleMatches = shaka.util.StreamUtils.filterStreamsByRole_(\n chosen, preferredRole);\n if (roleMatches.length) {\n return roleMatches;\n } else {\n shaka.log.warning('No exact match for the text role could be found.');\n }\n } else {\n // Prefer text streams with no roles, if they exist.\n const noRoleMatches = chosen.filter((stream) => {\n return stream.roles.length == 0;\n });\n if (noRoleMatches.length) {\n return noRoleMatches;\n }\n }\n\n // Either there was no role preference, or it could not be satisfied.\n // Choose an arbitrary role, if there are any, and filter out any other\n // roles. This ensures we never adapt between roles.\n\n const allRoles = chosen.map((stream) => {\n return stream.roles;\n }).reduce(shaka.util.Functional.collapseArrays, []);\n\n if (!allRoles.length) {\n return chosen;\n }\n return shaka.util.StreamUtils.filterStreamsByRole_(chosen, allRoles[0]);\n }\n\n\n /**\n * Filter Streams by role.\n * Works both for Stream and Track types due to their similarities.\n *\n * @param {!Array<!shaka.extern.Stream>|!Array<!shaka.extern.Track>} streams\n * @param {string} preferredRole\n * @return {!Array<!shaka.extern.Stream>|!Array<!shaka.extern.Track>}\n * @private\n */\n static filterStreamsByRole_(streams, preferredRole) {\n return streams.filter((stream) => {\n return stream.roles.includes(preferredRole);\n });\n }\n\n\n /**\n * Checks if the given stream is an audio stream.\n *\n * @param {shaka.extern.Stream} stream\n * @return {boolean}\n */\n static isAudio(stream) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n return stream.type == ContentType.AUDIO;\n }\n\n\n /**\n * Checks if the given stream is a video stream.\n *\n * @param {shaka.extern.Stream} stream\n * @return {boolean}\n */\n static isVideo(stream) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n return stream.type == ContentType.VIDEO;\n }\n\n\n /**\n * Get all non-null streams in the variant as an array.\n *\n * @param {shaka.extern.Variant} variant\n * @return {!Array<shaka.extern.Stream>}\n */\n static getVariantStreams(variant) {\n const streams = [];\n\n if (variant.audio) {\n streams.push(variant.audio);\n }\n if (variant.video) {\n streams.push(variant.video);\n }\n\n return streams;\n }\n\n\n /**\n * Indicates if some of the variant's streams are fastSwitching.\n *\n * @param {shaka.extern.Variant} variant\n * @return {boolean}\n */\n static isFastSwitching(variant) {\n if (variant.audio && variant.audio.fastSwitching) {\n return true;\n }\n if (variant.video && variant.video.fastSwitching) {\n return true;\n }\n return false;\n }\n\n\n /**\n * Set the best iframe stream to the original stream.\n *\n * @param {!shaka.extern.Stream} stream\n * @param {!Array<!shaka.extern.Stream>} iFrameStreams\n */\n static setBetterIFrameStream(stream, iFrameStreams) {\n if (!iFrameStreams.length) {\n return;\n }\n const validStreams = iFrameStreams.filter((iFrameStream) =>\n shaka.util.MimeUtils.getNormalizedCodec(stream.codecs) ==\n shaka.util.MimeUtils.getNormalizedCodec(iFrameStream.codecs))\n .sort((a, b) => {\n if (!a.bandwidth || !b.bandwidth || a.bandwidth == b.bandwidth) {\n return (a.width || 0) - (b.width || 0);\n }\n return a.bandwidth - b.bandwidth;\n });\n stream.trickModeVideo = validStreams[0];\n if (validStreams.length > 1) {\n const sameResolutionStream = validStreams.find((iFrameStream) =>\n stream.width == iFrameStream.width &&\n stream.height == iFrameStream.height);\n if (sameResolutionStream) {\n stream.trickModeVideo = sameResolutionStream;\n }\n }\n }\n\n\n /**\n * Returns a string of a variant, with the attribute values of its audio\n * and/or video streams for log printing.\n * @param {shaka.extern.Variant} variant\n * @return {string}\n * @private\n */\n static getVariantSummaryString_(variant) {\n const summaries = [];\n if (variant.audio) {\n summaries.push(shaka.util.StreamUtils.getStreamSummaryString_(\n variant.audio));\n }\n if (variant.video) {\n summaries.push(shaka.util.StreamUtils.getStreamSummaryString_(\n variant.video));\n }\n return summaries.join(', ');\n }\n\n /**\n * Returns a string of an audio or video stream for log printing.\n * @param {shaka.extern.Stream} stream\n * @return {string}\n * @private\n */\n static getStreamSummaryString_(stream) {\n // Accepted parameters for Chromecast can be found (internally) at\n // go/cast-mime-params\n\n if (shaka.util.StreamUtils.isAudio(stream)) {\n return 'type=audio' +\n ' codecs=' + stream.codecs +\n ' bandwidth='+ stream.bandwidth +\n ' channelsCount=' + stream.channelsCount +\n ' audioSamplingRate=' + stream.audioSamplingRate;\n }\n\n if (shaka.util.StreamUtils.isVideo(stream)) {\n return 'type=video' +\n ' codecs=' + stream.codecs +\n ' bandwidth=' + stream.bandwidth +\n ' frameRate=' + stream.frameRate +\n ' width=' + stream.width +\n ' height=' + stream.height;\n }\n\n return 'unexpected stream type';\n }\n\n\n /**\n * Clears underlying decoding config cache.\n */\n static clearDecodingConfigCache() {\n shaka.util.StreamUtils.decodingConfigCache_.clear();\n }\n\n\n /**\n * Check if we should show text on screen automatically.\n *\n * @param {?shaka.extern.Stream} audioStream\n * @param {shaka.extern.Stream} textStream\n * @param {!shaka.extern.PlayerConfiguration} config\n * @return {boolean}\n */\n static shouldInitiallyShowText(audioStream, textStream, config) {\n const AutoShowText = shaka.config.AutoShowText;\n\n if (config.autoShowText == AutoShowText.NEVER) {\n return false;\n }\n if (config.autoShowText == AutoShowText.ALWAYS) {\n return true;\n }\n\n const LanguageUtils = shaka.util.LanguageUtils;\n\n /** @type {string} */\n const preferredTextLocale =\n LanguageUtils.normalize(config.preferredTextLanguage);\n /** @type {string} */\n const textLocale = LanguageUtils.normalize(textStream.language);\n\n if (config.autoShowText == AutoShowText.IF_PREFERRED_TEXT_LANGUAGE) {\n // Only the text language match matters.\n return LanguageUtils.areLanguageCompatible(\n textLocale,\n preferredTextLocale);\n }\n\n if (config.autoShowText == AutoShowText.IF_SUBTITLES_MAY_BE_NEEDED) {\n if (!audioStream) {\n return false;\n }\n /* The text should automatically be shown if the text is\n * language-compatible with the user's text language preference, but not\n * compatible with the audio. These are cases where we deduce that\n * subtitles may be needed.\n *\n * For example:\n * preferred | chosen | chosen |\n * text | text | audio | show\n * -----------------------------------\n * en-CA | en | jp | true\n * en | en-US | fr | true\n * fr-CA | en-US | jp | false\n * en-CA | en-US | en-US | false\n *\n */\n /** @type {string} */\n const audioLocale = LanguageUtils.normalize(audioStream.language);\n\n return (\n LanguageUtils.areLanguageCompatible(textLocale, preferredTextLocale) &&\n !LanguageUtils.areLanguageCompatible(audioLocale, textLocale));\n }\n\n shaka.log.alwaysWarn('Invalid autoShowText setting!');\n return false;\n }\n};\n\n\n/**\n * A cache of results from mediaCapabilities.decodingInfo, indexed by the\n * (stringified) decodingConfig.\n *\n * @type {Map<string, !MediaCapabilitiesDecodingInfo>}\n * @private\n */\nshaka.util.StreamUtils.decodingConfigCache_ = new Map();\n\n\n/** @private {number} */\nshaka.util.StreamUtils.nextTrackId_ = 0;\n\n/**\n * @enum {string}\n */\nshaka.util.StreamUtils.DecodingAttributes = {\n SMOOTH: 'smooth',\n POWER: 'powerEfficient',\n};\n\n/**\n * @private {!Map<string, boolean>}\n */\nshaka.util.StreamUtils.supportedImageMimeTypes_ = new Map()\n .set('image/svg+xml', true)\n .set('image/png', true)\n .set('image/jpeg', true)\n .set('image/jpg', true);\n\n/**\n * @const {string}\n * @private\n */\n// cspell: disable-next-line\nshaka.util.StreamUtils.minWebPImage_ = 'data:image/webp;base64,UklGRjoAAABXRU' +\n 'JQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwY' +\n 'AAA';\n\n/**\n * @const {string}\n * @private\n */\n// cspell: disable-next-line\nshaka.util.StreamUtils.minAvifImage_ = 'data:image/avif;base64,AAAAIGZ0eXBhdm' +\n 'lmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljd' +\n 'AAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEA' +\n 'AAABAAABGgAAAB0AAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAA' +\n 'AamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAIAAAACAAAAEHBpeGkAAAAAAwgICAAAAA' +\n 'xhdjFDgQ0MAAAAABNjb2xybmNseAACAAIAAYAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAA' +\n 'CVtZGF0EgAKCBgANogQEAwgMg8f8D///8WfhwB8+ErK42A=';\n\n/**\n * @const {!Map<string, string>}\n * @private\n */\nshaka.util.StreamUtils.minImage_ = new Map()\n .set('image/webp', shaka.util.StreamUtils.minWebPImage_)\n .set('image/avif', shaka.util.StreamUtils.minAvifImage_);\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.drm.DrmEngine');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.debug.RunningInLab');\ngoog.require('shaka.log');\ngoog.require('shaka.drm.DrmUtils');\ngoog.require('shaka.net.NetworkingEngine');\ngoog.require('shaka.util.ArrayUtils');\ngoog.require('shaka.util.BufferUtils');\ngoog.require('shaka.util.Destroyer');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.EventManager');\ngoog.require('shaka.util.FakeEvent');\ngoog.require('shaka.util.Functional');\ngoog.require('shaka.util.IDestroyable');\ngoog.require('shaka.util.Iterables');\ngoog.require('shaka.util.ManifestParserUtils');\ngoog.require('shaka.util.MapUtils');\ngoog.require('shaka.util.ObjectUtils');\ngoog.require('shaka.util.Platform');\ngoog.require('shaka.util.Pssh');\ngoog.require('shaka.util.PublicPromise');\ngoog.require('shaka.util.StreamUtils');\ngoog.require('shaka.util.StringUtils');\ngoog.require('shaka.util.Timer');\ngoog.require('shaka.util.TXml');\ngoog.require('shaka.util.Uint8ArrayUtils');\n\n\n/** @implements {shaka.util.IDestroyable} */\nshaka.drm.DrmEngine = class {\n /**\n * @param {shaka.drm.DrmEngine.PlayerInterface} playerInterface\n */\n constructor(playerInterface) {\n /** @private {?shaka.drm.DrmEngine.PlayerInterface} */\n this.playerInterface_ = playerInterface;\n\n /** @private {MediaKeys} */\n this.mediaKeys_ = null;\n\n /** @private {HTMLMediaElement} */\n this.video_ = null;\n\n /** @private {boolean} */\n this.initialized_ = false;\n\n /** @private {boolean} */\n this.initializedForStorage_ = false;\n\n /** @private {number} */\n this.licenseTimeSeconds_ = 0;\n\n /** @private {?shaka.extern.DrmInfo} */\n this.currentDrmInfo_ = null;\n\n /** @private {shaka.util.EventManager} */\n this.eventManager_ = new shaka.util.EventManager();\n\n /**\n * @private {!Map<MediaKeySession,\n * shaka.drm.DrmEngine.SessionMetaData>}\n */\n this.activeSessions_ = new Map();\n\n /** @private {!Array<!shaka.net.NetworkingEngine.PendingRequest>} */\n this.activeRequests_ = [];\n\n /**\n * @private {!Map<string,\n * {initData: ?Uint8Array, initDataType: ?string}>}\n */\n this.storedPersistentSessions_ = new Map();\n\n /** @private {boolean} */\n this.hasInitData_ = false;\n\n /** @private {!shaka.util.PublicPromise} */\n this.allSessionsLoaded_ = new shaka.util.PublicPromise();\n\n /** @private {?shaka.extern.DrmConfiguration} */\n this.config_ = null;\n\n /** @private {function(!shaka.util.Error)} */\n this.onError_ = (err) => {\n if (err.severity == shaka.util.Error.Severity.CRITICAL) {\n this.allSessionsLoaded_.reject(err);\n }\n\n playerInterface.onError(err);\n };\n\n /**\n * The most recent key status information we have.\n * We may not have announced this information to the outside world yet,\n * which we delay to batch up changes and avoid spurious \"missing key\"\n * errors.\n * @private {!Map<string, string>}\n */\n this.keyStatusByKeyId_ = new Map();\n\n /**\n * The key statuses most recently announced to other classes.\n * We may have more up-to-date information being collected in\n * this.keyStatusByKeyId_, which has not been batched up and released yet.\n * @private {!Map<string, string>}\n */\n this.announcedKeyStatusByKeyId_ = new Map();\n\n /** @private {shaka.util.Timer} */\n this.keyStatusTimer_ =\n new shaka.util.Timer(() => this.processKeyStatusChanges_());\n\n /** @private {boolean} */\n this.usePersistentLicenses_ = false;\n\n /** @private {!Array<!MediaKeyMessageEvent>} */\n this.mediaKeyMessageEvents_ = [];\n\n /** @private {boolean} */\n this.initialRequestsSent_ = false;\n\n /** @private {?shaka.util.Timer} */\n this.expirationTimer_ = new shaka.util.Timer(() => {\n this.pollExpiration_();\n });\n\n // Add a catch to the Promise to avoid console logs about uncaught errors.\n const noop = () => {};\n this.allSessionsLoaded_.catch(noop);\n\n /** @const {!shaka.util.Destroyer} */\n this.destroyer_ = new shaka.util.Destroyer(() => this.destroyNow_());\n\n /** @private {boolean} */\n this.srcEquals_ = false;\n\n /** @private {Promise} */\n this.mediaKeysAttached_ = null;\n\n /** @private {?shaka.extern.InitDataOverride} */\n this.manifestInitData_ = null;\n\n /** @private {function():boolean} */\n this.isPreload_ = () => false;\n }\n\n /** @override */\n destroy() {\n return this.destroyer_.destroy();\n }\n\n /**\n * Destroy this instance of DrmEngine. This assumes that all other checks\n * about \"if it should\" have passed.\n *\n * @private\n */\n async destroyNow_() {\n // |eventManager_| should only be |null| after we call |destroy|. Destroy it\n // first so that we will stop responding to events.\n this.eventManager_.release();\n this.eventManager_ = null;\n\n // Since we are destroying ourselves, we don't want to react to the \"all\n // sessions loaded\" event.\n this.allSessionsLoaded_.reject();\n\n // Stop all timers. This will ensure that they do not start any new work\n // while we are destroying ourselves.\n this.expirationTimer_.stop();\n this.expirationTimer_ = null;\n\n this.keyStatusTimer_.stop();\n this.keyStatusTimer_ = null;\n\n // Close all open sessions.\n await this.closeOpenSessions_();\n\n // |video_| will be |null| if we never attached to a video element.\n if (this.video_) {\n // Webkit EME implementation requires the src to be defined to clear\n // the MediaKeys.\n if (!shaka.drm.DrmUtils.isMediaKeysPolyfilled('webkit')) {\n goog.asserts.assert(\n !this.video_.src &&\n !this.video_.getElementsByTagName('source').length,\n 'video src must be removed first!');\n }\n\n try {\n await this.video_.setMediaKeys(null);\n } catch (error) {\n // Ignore any failures while removing media keys from the video element.\n shaka.log.debug(`DrmEngine.destroyNow_ exception`, error);\n }\n\n this.video_ = null;\n }\n\n // Break references to everything else we hold internally.\n this.currentDrmInfo_ = null;\n this.mediaKeys_ = null;\n this.storedPersistentSessions_ = new Map();\n this.config_ = null;\n this.onError_ = () => {};\n this.playerInterface_ = null;\n this.srcEquals_ = false;\n this.mediaKeysAttached_ = null;\n }\n\n /**\n * Called by the Player to provide an updated configuration any time it\n * changes.\n * Must be called at least once before init().\n *\n * @param {shaka.extern.DrmConfiguration} config\n * @param {(function():boolean)=} isPreload\n */\n configure(config, isPreload) {\n this.config_ = config;\n if (isPreload) {\n this.isPreload_ = isPreload;\n }\n if (this.expirationTimer_) {\n this.expirationTimer_.tickEvery(\n /* seconds= */ this.config_.updateExpirationTime);\n }\n }\n\n /**\n * @param {!boolean} value\n */\n setSrcEquals(value) {\n this.srcEquals_ = value;\n }\n\n /**\n * Initialize the drm engine for storing and deleting stored content.\n *\n * @param {!Array<shaka.extern.Variant>} variants\n * The variants that are going to be stored.\n * @param {boolean} usePersistentLicenses\n * Whether or not persistent licenses should be requested and stored for\n * |manifest|.\n * @return {!Promise}\n */\n initForStorage(variants, usePersistentLicenses) {\n this.initializedForStorage_ = true;\n // There are two cases for this call:\n // 1. We are about to store a manifest - in that case, there are no offline\n // sessions and therefore no offline session ids.\n // 2. We are about to remove the offline sessions for this manifest - in\n // that case, we don't need to know about them right now either as\n // we will be told which ones to remove later.\n this.storedPersistentSessions_ = new Map();\n\n // What we really need to know is whether or not they are expecting to use\n // persistent licenses.\n this.usePersistentLicenses_ = usePersistentLicenses;\n\n return this.init_(variants, /* isLive= */ false);\n }\n\n /**\n * Initialize the drm engine for playback operations.\n *\n * @param {!Array<shaka.extern.Variant>} variants\n * The variants that we want to support playing.\n * @param {!Array<string>} offlineSessionIds\n * @param {boolean=} isLive\n * @return {!Promise}\n */\n initForPlayback(variants, offlineSessionIds, isLive = true) {\n this.storedPersistentSessions_ = new Map();\n\n for (const sessionId of offlineSessionIds) {\n this.storedPersistentSessions_.set(\n sessionId, {initData: null, initDataType: null});\n }\n\n for (const metadata of this.config_.persistentSessionsMetadata) {\n this.storedPersistentSessions_.set(\n metadata.sessionId,\n {initData: metadata.initData, initDataType: metadata.initDataType});\n }\n\n this.usePersistentLicenses_ = this.storedPersistentSessions_.size > 0;\n\n return this.init_(variants, isLive);\n }\n\n /**\n * Initializes the drm engine for removing persistent sessions. Only the\n * removeSession(s) methods will work correctly, creating new sessions may not\n * work as desired.\n *\n * @param {string} keySystem\n * @param {string} licenseServerUri\n * @param {Uint8Array} serverCertificate\n * @param {!Array<MediaKeySystemMediaCapability>} audioCapabilities\n * @param {!Array<MediaKeySystemMediaCapability>} videoCapabilities\n * @return {!Promise}\n */\n initForRemoval(keySystem, licenseServerUri, serverCertificate,\n audioCapabilities, videoCapabilities) {\n /** @type {!Map<string, MediaKeySystemConfiguration>} */\n const configsByKeySystem = new Map();\n\n /** @type {MediaKeySystemConfiguration} */\n const config = {\n audioCapabilities: audioCapabilities,\n videoCapabilities: videoCapabilities,\n distinctiveIdentifier: 'optional',\n persistentState: 'required',\n sessionTypes: ['persistent-license'],\n label: keySystem, // Tracked by us, ignored by EME.\n };\n\n // TODO: refactor, don't stick drmInfos onto MediaKeySystemConfiguration\n config['drmInfos'] = [{ // Non-standard attribute, ignored by EME.\n keySystem: keySystem,\n licenseServerUri: licenseServerUri,\n distinctiveIdentifierRequired: false,\n persistentStateRequired: true,\n audioRobustness: '', // Not required by queryMediaKeys_\n videoRobustness: '', // Same\n serverCertificate: serverCertificate,\n serverCertificateUri: '',\n initData: null,\n keyIds: null,\n }];\n\n configsByKeySystem.set(keySystem, config);\n return this.queryMediaKeys_(configsByKeySystem,\n /* variants= */ []);\n }\n\n /**\n * Negotiate for a key system and set up MediaKeys.\n * This will assume that both |usePersistentLicences_| and\n * |storedPersistentSessions_| have been properly set.\n *\n * @param {!Array<shaka.extern.Variant>} variants\n * The variants that we expect to operate with during the drm engine's\n * lifespan of the drm engine.\n * @param {boolean} isLive\n * @return {!Promise} Resolved if/when a key system has been chosen.\n * @private\n */\n async init_(variants, isLive) {\n goog.asserts.assert(this.config_,\n 'DrmEngine configure() must be called before init()!');\n\n shaka.drm.DrmEngine.configureClearKey(this.config_.clearKeys, variants);\n\n const hadDrmInfo = variants.some((variant) => {\n if (variant.video && variant.video.drmInfos.length) {\n return true;\n }\n if (variant.audio && variant.audio.drmInfos.length) {\n return true;\n }\n return false;\n });\n\n // When preparing to play live streams, it is possible that we won't know\n // about some upcoming encrypted content. If we initialize the drm engine\n // with no key systems, we won't be able to play when the encrypted content\n // comes.\n //\n // To avoid this, we will set the drm engine up to work with as many key\n // systems as possible so that we will be ready.\n if (!hadDrmInfo && isLive) {\n const servers = shaka.util.MapUtils.asMap(this.config_.servers);\n shaka.drm.DrmEngine.replaceDrmInfo_(variants, servers);\n }\n\n /** @type {!Set<shaka.extern.DrmInfo>} */\n const drmInfos = new Set();\n for (const variant of variants) {\n const variantDrmInfos = this.getVariantDrmInfos_(variant);\n for (const info of variantDrmInfos) {\n drmInfos.add(info);\n }\n }\n\n for (const info of drmInfos) {\n shaka.drm.DrmEngine.fillInDrmInfoDefaults_(\n info,\n shaka.util.MapUtils.asMap(this.config_.servers),\n shaka.util.MapUtils.asMap(this.config_.advanced || {}),\n this.config_.keySystemsMapping);\n }\n\n /** @type {!Map<string, MediaKeySystemConfiguration>} */\n let configsByKeySystem;\n\n /**\n * Expand robustness into multiple drm infos if multiple video robustness\n * levels were provided.\n *\n * robustness can be either a single item as a string or multiple items as\n * an array of strings.\n *\n * @param {!Array<shaka.extern.DrmInfo>} drmInfos\n * @param {string} robustnessType\n * @return {!Array<shaka.extern.DrmInfo>}\n */\n const expandRobustness = (drmInfos, robustnessType) => {\n const newDrmInfos = [];\n for (const drmInfo of drmInfos) {\n let items = drmInfo[robustnessType] ||\n (this.config_.advanced &&\n this.config_.advanced[drmInfo.keySystem] &&\n this.config_.advanced[drmInfo.keySystem][robustnessType]) || '';\n if (items == '' &&\n shaka.drm.DrmUtils.isWidevineKeySystem(drmInfo.keySystem)) {\n if (robustnessType == 'audioRobustness') {\n items = [this.config_.defaultAudioRobustnessForWidevine];\n } else if (robustnessType == 'videoRobustness') {\n items = [this.config_.defaultVideoRobustnessForWidevine];\n }\n }\n if (typeof items === 'string') {\n // if drmInfo's robustness has already been expanded,\n // use the drmInfo directly.\n newDrmInfos.push(drmInfo);\n } else if (Array.isArray(items)) {\n if (items.length === 0) {\n items = [''];\n }\n for (const item of items) {\n newDrmInfos.push(\n Object.assign({}, drmInfo, {[robustnessType]: item}),\n );\n }\n }\n }\n return newDrmInfos;\n };\n\n for (const variant of variants) {\n if (variant.video) {\n variant.video.drmInfos =\n expandRobustness(variant.video.drmInfos,\n 'videoRobustness');\n variant.video.drmInfos =\n expandRobustness(variant.video.drmInfos,\n 'audioRobustness');\n }\n if (variant.audio) {\n variant.audio.drmInfos =\n expandRobustness(variant.audio.drmInfos,\n 'videoRobustness');\n variant.audio.drmInfos =\n expandRobustness(variant.audio.drmInfos,\n 'audioRobustness');\n }\n }\n\n // We should get the decodingInfo results for the variants after we filling\n // in the drm infos, and before queryMediaKeys_().\n await shaka.util.StreamUtils.getDecodingInfosForVariants(variants,\n this.usePersistentLicenses_, this.srcEquals_,\n this.config_.preferredKeySystems);\n this.destroyer_.ensureNotDestroyed();\n\n const hasDrmInfo = hadDrmInfo || Object.keys(this.config_.servers).length;\n // An unencrypted content is initialized.\n if (!hasDrmInfo) {\n this.initialized_ = true;\n return Promise.resolve();\n }\n\n const p = this.queryMediaKeys_(configsByKeySystem, variants);\n\n // TODO(vaage): Look into the assertion below. If we do not have any drm\n // info, we create drm info so that content can play if it has drm info\n // later.\n // However it is okay if we fail to initialize? If we fail to initialize,\n // it means we won't be able to play the later-encrypted content, which is\n // not okay.\n\n // If the content did not originally have any drm info, then it doesn't\n // matter if we fail to initialize the drm engine, because we won't need it\n // anyway.\n return hadDrmInfo ? p : p.catch(() => {});\n }\n\n /**\n * Attach MediaKeys to the video element\n * @return {Promise}\n * @private\n */\n async attachMediaKeys_() {\n if (this.video_.mediaKeys) {\n return;\n }\n\n // An attach process has already started, let's wait it out\n if (this.mediaKeysAttached_) {\n await this.mediaKeysAttached_;\n\n this.destroyer_.ensureNotDestroyed();\n return;\n }\n\n try {\n this.mediaKeysAttached_ = this.video_.setMediaKeys(this.mediaKeys_);\n\n await this.mediaKeysAttached_;\n } catch (exception) {\n goog.asserts.assert(exception instanceof Error, 'Wrong error type!');\n\n this.onError_(new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.DRM,\n shaka.util.Error.Code.FAILED_TO_ATTACH_TO_VIDEO,\n exception.message));\n }\n\n this.destroyer_.ensureNotDestroyed();\n }\n\n /**\n * Processes encrypted event and start licence challenging\n * @return {!Promise}\n * @private\n */\n async onEncryptedEvent_(event) {\n /**\n * MediaKeys should be added when receiving an encrypted event. Setting\n * mediaKeys before could result into encrypted event not being fired on\n * some browsers\n */\n await this.attachMediaKeys_();\n\n this.newInitData(\n event.initDataType,\n shaka.util.BufferUtils.toUint8(event.initData));\n }\n\n /**\n * Start processing events.\n * @param {HTMLMediaElement} video\n * @return {!Promise}\n */\n async attach(video) {\n if (this.video_ === video) {\n return;\n }\n if (!this.mediaKeys_) {\n // Unencrypted, or so we think. We listen for encrypted events in order\n // to warn when the stream is encrypted, even though the manifest does\n // not know it.\n // Don't complain about this twice, so just listenOnce().\n // FIXME: This is ineffective when a prefixed event is translated by our\n // polyfills, since those events are only caught and translated by a\n // MediaKeys instance. With clear content and no polyfilled MediaKeys\n // instance attached, you'll never see the 'encrypted' event on those\n // platforms (Safari).\n this.eventManager_.listenOnce(video, 'encrypted', (event) => {\n this.onError_(new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.DRM,\n shaka.util.Error.Code.ENCRYPTED_CONTENT_WITHOUT_DRM_INFO));\n });\n return;\n }\n\n this.video_ = video;\n\n this.eventManager_.listenOnce(this.video_, 'play', () => this.onPlay_());\n if (this.video_.remote) {\n this.eventManager_.listen(this.video_.remote, 'connect',\n () => this.closeOpenSessions_());\n this.eventManager_.listen(this.video_.remote, 'connecting',\n () => this.closeOpenSessions_());\n this.eventManager_.listen(this.video_.remote, 'disconnect',\n () => this.closeOpenSessions_());\n } else if ('webkitCurrentPlaybackTargetIsWireless' in this.video_) {\n this.eventManager_.listen(this.video_,\n 'webkitcurrentplaybacktargetiswirelesschanged',\n () => this.closeOpenSessions_());\n }\n\n this.manifestInitData_ = this.currentDrmInfo_ ?\n (this.currentDrmInfo_.initData.find(\n (initDataOverride) => initDataOverride.initData.length > 0,\n ) || null) : null;\n\n /**\n * We can attach media keys before the playback actually begins when:\n * - If we are not using FairPlay Modern EME\n * - Some initData already has been generated (through the manifest)\n * - In case of an offline session\n */\n if (this.manifestInitData_ ||\n this.currentDrmInfo_.keySystem !== 'com.apple.fps' ||\n this.storedPersistentSessions_.size) {\n await this.attachMediaKeys_();\n }\n\n this.createOrLoad().catch(() => {\n // Silence errors\n // createOrLoad will run async, errors are triggered through onError_\n });\n\n // Explicit init data for any one stream or an offline session is\n // sufficient to suppress 'encrypted' events for all streams.\n // Also suppress 'encrypted' events when parsing in-band pssh\n // from media segments because that serves the same purpose as the\n // 'encrypted' events.\n if (!this.manifestInitData_ && !this.storedPersistentSessions_.size &&\n !this.config_.parseInbandPsshEnabled) {\n this.eventManager_.listen(\n this.video_, 'encrypted', (e) => this.onEncryptedEvent_(e));\n }\n }\n\n /**\n * Returns true if the manifest has init data.\n *\n * @return {boolean}\n */\n hasManifestInitData() {\n return !!this.manifestInitData_;\n }\n\n /**\n * Sets the server certificate based on the current DrmInfo.\n *\n * @return {!Promise}\n */\n async setServerCertificate() {\n goog.asserts.assert(this.initialized_,\n 'Must call init() before setServerCertificate');\n\n if (!this.mediaKeys_ || !this.currentDrmInfo_) {\n return;\n }\n\n if (this.currentDrmInfo_.serverCertificateUri &&\n (!this.currentDrmInfo_.serverCertificate ||\n !this.currentDrmInfo_.serverCertificate.length)) {\n const request = shaka.net.NetworkingEngine.makeRequest(\n [this.currentDrmInfo_.serverCertificateUri],\n this.config_.retryParameters);\n\n try {\n const operation = this.playerInterface_.netEngine.request(\n shaka.net.NetworkingEngine.RequestType.SERVER_CERTIFICATE,\n request, {isPreload: this.isPreload_()});\n const response = await operation.promise;\n\n this.currentDrmInfo_.serverCertificate =\n shaka.util.BufferUtils.toUint8(response.data);\n } catch (error) {\n // Request failed!\n goog.asserts.assert(error instanceof shaka.util.Error,\n 'Wrong NetworkingEngine error type!');\n\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.DRM,\n shaka.util.Error.Code.SERVER_CERTIFICATE_REQUEST_FAILED,\n error);\n }\n\n if (this.destroyer_.destroyed()) {\n return;\n }\n }\n\n if (!this.currentDrmInfo_.serverCertificate ||\n !this.currentDrmInfo_.serverCertificate.length) {\n return;\n }\n\n try {\n const supported = await this.mediaKeys_.setServerCertificate(\n this.currentDrmInfo_.serverCertificate);\n\n if (!supported) {\n shaka.log.warning('Server certificates are not supported by the ' +\n 'key system. The server certificate has been ' +\n 'ignored.');\n }\n } catch (exception) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.DRM,\n shaka.util.Error.Code.INVALID_SERVER_CERTIFICATE,\n exception.message);\n }\n }\n\n /**\n * Remove an offline session and delete it's data. This can only be called\n * after a successful call to |init|. This will wait until the\n * 'license-release' message is handled. The returned Promise will be rejected\n * if there is an error releasing the license.\n *\n * @param {string} sessionId\n * @return {!Promise}\n */\n async removeSession(sessionId) {\n goog.asserts.assert(this.mediaKeys_,\n 'Must call init() before removeSession');\n\n const session = await this.loadOfflineSession_(\n sessionId, {initData: null, initDataType: null});\n\n // This will be null on error, such as session not found.\n if (!session) {\n shaka.log.v2('Ignoring attempt to remove missing session', sessionId);\n return;\n }\n\n // TODO: Consider adding a timeout to get the 'message' event.\n // Note that the 'message' event will get raised after the remove()\n // promise resolves.\n const tasks = [];\n\n const found = this.activeSessions_.get(session);\n if (found) {\n // This will force us to wait until the 'license-release' message has been\n // handled.\n found.updatePromise = new shaka.util.PublicPromise();\n tasks.push(found.updatePromise);\n }\n\n shaka.log.v2('Attempting to remove session', sessionId);\n tasks.push(session.remove());\n\n await Promise.all(tasks);\n this.activeSessions_.delete(session);\n }\n\n /**\n * Creates the sessions for the init data and waits for them to become ready.\n *\n * @return {!Promise}\n */\n async createOrLoad() {\n if (this.storedPersistentSessions_.size) {\n this.storedPersistentSessions_.forEach((metadata, sessionId) => {\n this.loadOfflineSession_(sessionId, metadata);\n });\n\n await this.allSessionsLoaded_;\n\n const keyIds = (this.currentDrmInfo_ && this.currentDrmInfo_.keyIds) ||\n new Set([]);\n\n // All the needed keys are already loaded, we don't need another license\n // Therefore we prevent starting a new session\n if (keyIds.size > 0 && this.areAllKeysUsable_()) {\n return this.allSessionsLoaded_;\n }\n\n // Reset the promise for the next sessions to come if key needs aren't\n // satisfied with persistent sessions\n this.hasInitData_ = false;\n this.allSessionsLoaded_ = new shaka.util.PublicPromise();\n this.allSessionsLoaded_.catch(() => {});\n }\n\n // Create sessions.\n const initDatas =\n (this.currentDrmInfo_ ? this.currentDrmInfo_.initData : []) || [];\n for (const initDataOverride of initDatas) {\n this.newInitData(\n initDataOverride.initDataType, initDataOverride.initData);\n }\n\n // If there were no sessions to load, we need to resolve the promise right\n // now or else it will never get resolved.\n // We determine this by checking areAllSessionsLoaded_, rather than checking\n // the number of initDatas, since the newInitData method can reject init\n // datas in some circumstances.\n if (this.areAllSessionsLoaded_()) {\n this.allSessionsLoaded_.resolve();\n }\n\n return this.allSessionsLoaded_;\n }\n\n /**\n * Called when new initialization data is encountered. If this data hasn't\n * been seen yet, this will create a new session for it.\n *\n * @param {string} initDataType\n * @param {!Uint8Array} initData\n */\n newInitData(initDataType, initData) {\n if (!initData.length) {\n return;\n }\n\n // Suppress duplicate init data.\n // Note that some init data are extremely large and can't portably be used\n // as keys in a dictionary.\n\n if (this.config_.ignoreDuplicateInitData) {\n const metadatas = this.activeSessions_.values();\n for (const metadata of metadatas) {\n if (shaka.util.BufferUtils.equal(initData, metadata.initData)) {\n shaka.log.debug('Ignoring duplicate init data.');\n return;\n }\n }\n let duplicate = false;\n this.storedPersistentSessions_.forEach((metadata, sessionId) => {\n if (!duplicate &&\n shaka.util.BufferUtils.equal(initData, metadata.initData)) {\n duplicate = true;\n }\n });\n if (duplicate) {\n shaka.log.debug('Ignoring duplicate init data.');\n return;\n }\n }\n\n // Mark that there is init data, so that the preloader will know to wait\n // for sessions to be loaded.\n this.hasInitData_ = true;\n\n // If there are pre-existing sessions that have all been loaded\n // then reset the allSessionsLoaded_ promise, which can now be\n // used to wait for new sessions to be loaded\n if (this.activeSessions_.size > 0 && this.areAllSessionsLoaded_()) {\n this.allSessionsLoaded_.resolve();\n this.hasInitData_ = false;\n this.allSessionsLoaded_ = new shaka.util.PublicPromise();\n this.allSessionsLoaded_.catch(() => {});\n }\n this.createSession(initDataType, initData,\n this.currentDrmInfo_.sessionType);\n }\n\n /** @return {boolean} */\n initialized() {\n return this.initialized_;\n }\n\n /**\n * Returns the ID of the sessions currently active.\n *\n * @return {!Array<string>}\n */\n getSessionIds() {\n const sessions = this.activeSessions_.keys();\n const ids = shaka.util.Iterables.map(sessions, (s) => s.sessionId);\n\n // TODO: Make |getSessionIds| return |Iterable| instead of |Array|.\n return Array.from(ids);\n }\n\n /**\n * Returns the active sessions metadata\n *\n * @return {!Array<shaka.extern.DrmSessionMetadata>}\n */\n getActiveSessionsMetadata() {\n const sessions = this.activeSessions_.keys();\n\n const metadata = shaka.util.Iterables.map(sessions, (session) => {\n const metadata = this.activeSessions_.get(session);\n\n return {\n sessionId: session.sessionId,\n sessionType: metadata.type,\n initData: metadata.initData,\n initDataType: metadata.initDataType,\n };\n });\n\n return Array.from(metadata);\n }\n\n /**\n * Returns the next expiration time, or Infinity.\n * @return {number}\n */\n getExpiration() {\n // This will equal Infinity if there are no entries.\n let min = Infinity;\n\n const sessions = this.activeSessions_.keys();\n for (const session of sessions) {\n if (!isNaN(session.expiration)) {\n min = Math.min(min, session.expiration);\n }\n }\n\n return min;\n }\n\n /**\n * Returns the time spent on license requests during this session, or NaN.\n *\n * @return {number}\n */\n getLicenseTime() {\n if (this.licenseTimeSeconds_) {\n return this.licenseTimeSeconds_;\n }\n return NaN;\n }\n\n /**\n * Returns the DrmInfo that was used to initialize the current key system.\n *\n * @return {?shaka.extern.DrmInfo}\n */\n getDrmInfo() {\n return this.currentDrmInfo_;\n }\n\n /**\n * Return the media keys created from the current mediaKeySystemAccess.\n * @return {MediaKeys}\n */\n getMediaKeys() {\n return this.mediaKeys_;\n }\n\n /**\n * Returns the current key statuses.\n *\n * @return {!Object<string, string>}\n */\n getKeyStatuses() {\n return shaka.util.MapUtils.asObject(this.announcedKeyStatusByKeyId_);\n }\n\n /**\n * Returns the current media key sessions.\n *\n * @return {!Array<MediaKeySession>}\n */\n getMediaKeySessions() {\n return Array.from(this.activeSessions_.keys());\n }\n\n /**\n * @param {!Map<string, MediaKeySystemConfiguration>} configsByKeySystem\n * A dictionary of configs, indexed by key system, with an iteration order\n * (insertion order) that reflects the preference for the application.\n * @param {!Array<shaka.extern.Variant>} variants\n * @return {!Promise} Resolved if/when a key system has been chosen.\n * @private\n */\n async queryMediaKeys_(configsByKeySystem, variants) {\n const drmInfosByKeySystem = new Map();\n\n const mediaKeySystemAccess = variants.length ?\n this.getKeySystemAccessFromVariants_(variants, drmInfosByKeySystem) :\n await this.getKeySystemAccessByConfigs_(configsByKeySystem);\n\n if (!mediaKeySystemAccess) {\n if (!navigator.requestMediaKeySystemAccess) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.DRM,\n shaka.util.Error.Code.MISSING_EME_SUPPORT);\n }\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.DRM,\n shaka.util.Error.Code.REQUESTED_KEY_SYSTEM_CONFIG_UNAVAILABLE);\n }\n this.destroyer_.ensureNotDestroyed();\n\n try {\n // Store the capabilities of the key system.\n const realConfig = mediaKeySystemAccess.getConfiguration();\n\n shaka.log.v2(\n 'Got MediaKeySystemAccess with configuration',\n realConfig);\n\n const keySystem =\n this.config_.keySystemsMapping[mediaKeySystemAccess.keySystem] ||\n mediaKeySystemAccess.keySystem;\n\n if (variants.length) {\n this.currentDrmInfo_ = this.createDrmInfoByInfos_(\n keySystem, drmInfosByKeySystem.get(keySystem));\n } else {\n this.currentDrmInfo_ = shaka.drm.DrmEngine.createDrmInfoByConfigs_(\n keySystem, configsByKeySystem.get(keySystem));\n }\n if (!this.currentDrmInfo_.licenseServerUri) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.DRM,\n shaka.util.Error.Code.NO_LICENSE_SERVER_GIVEN,\n this.currentDrmInfo_.keySystem);\n }\n\n const mediaKeys = await mediaKeySystemAccess.createMediaKeys();\n this.destroyer_.ensureNotDestroyed();\n shaka.log.info('Created MediaKeys object for key system',\n this.currentDrmInfo_.keySystem);\n\n this.mediaKeys_ = mediaKeys;\n if (this.config_.minHdcpVersion != '' &&\n 'getStatusForPolicy' in this.mediaKeys_) {\n try {\n const status = await this.mediaKeys_.getStatusForPolicy({\n minHdcpVersion: this.config_.minHdcpVersion,\n });\n if (status != 'usable') {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.DRM,\n shaka.util.Error.Code.MIN_HDCP_VERSION_NOT_MATCH);\n }\n this.destroyer_.ensureNotDestroyed();\n } catch (e) {\n if (e instanceof shaka.util.Error) {\n throw e;\n }\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.DRM,\n shaka.util.Error.Code.ERROR_CHECKING_HDCP_VERSION,\n e.message);\n }\n }\n this.initialized_ = true;\n\n await this.setServerCertificate();\n this.destroyer_.ensureNotDestroyed();\n } catch (exception) {\n this.destroyer_.ensureNotDestroyed(exception);\n\n // Don't rewrap a shaka.util.Error from earlier in the chain:\n this.currentDrmInfo_ = null;\n if (exception instanceof shaka.util.Error) {\n throw exception;\n }\n\n // We failed to create MediaKeys. This generally shouldn't happen.\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.DRM,\n shaka.util.Error.Code.FAILED_TO_CREATE_CDM,\n exception.message);\n }\n }\n\n /**\n * Get the MediaKeySystemAccess from the decodingInfos of the variants.\n * @param {!Array<shaka.extern.Variant>} variants\n * @param {!Map<string, !Array<shaka.extern.DrmInfo>>} drmInfosByKeySystem\n * A dictionary of drmInfos, indexed by key system.\n * @return {MediaKeySystemAccess}\n * @private\n */\n getKeySystemAccessFromVariants_(variants, drmInfosByKeySystem) {\n for (const variant of variants) {\n // Get all the key systems in the variant that shouldHaveLicenseServer.\n const drmInfos = this.getVariantDrmInfos_(variant);\n for (const info of drmInfos) {\n if (!drmInfosByKeySystem.has(info.keySystem)) {\n drmInfosByKeySystem.set(info.keySystem, []);\n }\n drmInfosByKeySystem.get(info.keySystem).push(info);\n }\n }\n\n if (drmInfosByKeySystem.size == 1 && drmInfosByKeySystem.has('')) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.DRM,\n shaka.util.Error.Code.NO_RECOGNIZED_KEY_SYSTEMS);\n }\n\n // If we have configured preferredKeySystems, choose a preferred keySystem\n // if available.\n let preferredKeySystems = this.config_.preferredKeySystems;\n if (!preferredKeySystems.length) {\n // If there is no preference set and we only have one license server, we\n // use this as preference. This is used to override manifests on those\n // that have the embedded license and the browser supports multiple DRMs.\n const servers = shaka.util.MapUtils.asMap(this.config_.servers);\n if (servers.size == 1) {\n preferredKeySystems = Array.from(servers.keys());\n }\n }\n for (const preferredKeySystem of preferredKeySystems) {\n for (const variant of variants) {\n const decodingInfo = variant.decodingInfos.find((decodingInfo) => {\n return decodingInfo.supported &&\n decodingInfo.keySystemAccess != null &&\n decodingInfo.keySystemAccess.keySystem == preferredKeySystem;\n });\n if (decodingInfo) {\n return decodingInfo.keySystemAccess;\n }\n }\n }\n\n // Try key systems with configured license servers first. We only have to\n // try key systems without configured license servers for diagnostic\n // reasons, so that we can differentiate between \"none of these key\n // systems are available\" and \"some are available, but you did not\n // configure them properly.\" The former takes precedence.\n for (const shouldHaveLicenseServer of [true, false]) {\n for (const variant of variants) {\n for (const decodingInfo of variant.decodingInfos) {\n if (!decodingInfo.supported || !decodingInfo.keySystemAccess) {\n continue;\n }\n const originalKeySystem = decodingInfo.keySystemAccess.keySystem;\n if (preferredKeySystems.includes(originalKeySystem)) {\n continue;\n }\n let drmInfos = drmInfosByKeySystem.get(originalKeySystem);\n if (!drmInfos && this.config_.keySystemsMapping[originalKeySystem]) {\n drmInfos = drmInfosByKeySystem.get(\n this.config_.keySystemsMapping[originalKeySystem]);\n }\n for (const info of drmInfos) {\n if (!!info.licenseServerUri == shouldHaveLicenseServer) {\n return decodingInfo.keySystemAccess;\n }\n }\n }\n }\n }\n return null;\n }\n\n /**\n * Get the MediaKeySystemAccess by querying requestMediaKeySystemAccess.\n * @param {!Map<string, MediaKeySystemConfiguration>} configsByKeySystem\n * A dictionary of configs, indexed by key system, with an iteration order\n * (insertion order) that reflects the preference for the application.\n * @return {!Promise<MediaKeySystemAccess>} Resolved if/when a\n * mediaKeySystemAccess has been chosen.\n * @private\n */\n async getKeySystemAccessByConfigs_(configsByKeySystem) {\n /** @type {MediaKeySystemAccess} */\n let mediaKeySystemAccess;\n\n if (configsByKeySystem.size == 1 && configsByKeySystem.has('')) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.DRM,\n shaka.util.Error.Code.NO_RECOGNIZED_KEY_SYSTEMS);\n }\n\n // If there are no tracks of a type, these should be not present.\n // Otherwise the query will fail.\n for (const config of configsByKeySystem.values()) {\n if (config.audioCapabilities.length == 0) {\n delete config.audioCapabilities;\n }\n if (config.videoCapabilities.length == 0) {\n delete config.videoCapabilities;\n }\n }\n\n // If we have configured preferredKeySystems, choose the preferred one if\n // available.\n for (const keySystem of this.config_.preferredKeySystems) {\n if (configsByKeySystem.has(keySystem)) {\n const config = configsByKeySystem.get(keySystem);\n try {\n mediaKeySystemAccess = // eslint-disable-next-line no-await-in-loop\n await navigator.requestMediaKeySystemAccess(keySystem, [config]);\n return mediaKeySystemAccess;\n } catch (error) {\n // Suppress errors.\n shaka.log.v2(\n 'Requesting', keySystem, 'failed with config', config, error);\n }\n this.destroyer_.ensureNotDestroyed();\n }\n }\n\n // Try key systems with configured license servers first. We only have to\n // try key systems without configured license servers for diagnostic\n // reasons, so that we can differentiate between \"none of these key\n // systems are available\" and \"some are available, but you did not\n // configure them properly.\" The former takes precedence.\n // TODO: once MediaCap implementation is complete, this part can be\n // simplified or removed.\n for (const shouldHaveLicenseServer of [true, false]) {\n for (const keySystem of configsByKeySystem.keys()) {\n const config = configsByKeySystem.get(keySystem);\n // TODO: refactor, don't stick drmInfos onto\n // MediaKeySystemConfiguration\n const hasLicenseServer = config['drmInfos'].some((info) => {\n return !!info.licenseServerUri;\n });\n if (hasLicenseServer != shouldHaveLicenseServer) {\n continue;\n }\n\n try {\n mediaKeySystemAccess = // eslint-disable-next-line no-await-in-loop\n await navigator.requestMediaKeySystemAccess(keySystem, [config]);\n return mediaKeySystemAccess;\n } catch (error) {\n // Suppress errors.\n shaka.log.v2(\n 'Requesting', keySystem, 'failed with config', config, error);\n }\n this.destroyer_.ensureNotDestroyed();\n }\n }\n return mediaKeySystemAccess;\n }\n\n /**\n * Resolves the allSessionsLoaded_ promise when all the sessions are loaded\n *\n * @private\n */\n checkSessionsLoaded_() {\n if (this.areAllSessionsLoaded_()) {\n this.allSessionsLoaded_.resolve();\n }\n }\n\n /**\n * In case there are no key statuses, consider this session loaded\n * after a reasonable timeout. It should definitely not take 5\n * seconds to process a license.\n * @param {!shaka.drm.DrmEngine.SessionMetaData} metadata\n * @private\n */\n setLoadSessionTimeoutTimer_(metadata) {\n const timer = new shaka.util.Timer(() => {\n metadata.loaded = true;\n this.checkSessionsLoaded_();\n });\n\n timer.tickAfter(\n /* seconds= */ shaka.drm.DrmEngine.SESSION_LOAD_TIMEOUT_);\n }\n\n /**\n * @param {string} sessionId\n * @param {{initData: ?Uint8Array, initDataType: ?string}} sessionMetadata\n * @return {!Promise<MediaKeySession>}\n * @private\n */\n async loadOfflineSession_(sessionId, sessionMetadata) {\n let session;\n\n const sessionType = 'persistent-license';\n\n try {\n shaka.log.v1('Attempting to load an offline session', sessionId);\n session = this.mediaKeys_.createSession(sessionType);\n } catch (exception) {\n const error = new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.DRM,\n shaka.util.Error.Code.FAILED_TO_CREATE_SESSION,\n exception.message);\n this.onError_(error);\n return Promise.reject(error);\n }\n\n this.eventManager_.listen(session, 'message',\n /** @type {shaka.util.EventManager.ListenerType} */(\n (event) => this.onSessionMessage_(event)));\n this.eventManager_.listen(session, 'keystatuseschange',\n (event) => this.onKeyStatusesChange_(event));\n\n const metadata = {\n initData: sessionMetadata.initData,\n initDataType: sessionMetadata.initDataType,\n loaded: false,\n oldExpiration: Infinity,\n updatePromise: null,\n type: sessionType,\n };\n this.activeSessions_.set(session, metadata);\n\n try {\n const present = await session.load(sessionId);\n this.destroyer_.ensureNotDestroyed();\n shaka.log.v2('Loaded offline session', sessionId, present);\n\n if (!present) {\n this.activeSessions_.delete(session);\n\n const severity = this.config_.persistentSessionOnlinePlayback ?\n shaka.util.Error.Severity.RECOVERABLE :\n shaka.util.Error.Severity.CRITICAL;\n\n this.onError_(new shaka.util.Error(\n severity,\n shaka.util.Error.Category.DRM,\n shaka.util.Error.Code.OFFLINE_SESSION_REMOVED));\n\n metadata.loaded = true;\n }\n\n this.setLoadSessionTimeoutTimer_(metadata);\n this.checkSessionsLoaded_();\n\n return session;\n } catch (error) {\n this.destroyer_.ensureNotDestroyed(error);\n\n this.activeSessions_.delete(session);\n\n const severity = this.config_.persistentSessionOnlinePlayback ?\n shaka.util.Error.Severity.RECOVERABLE :\n shaka.util.Error.Severity.CRITICAL;\n\n this.onError_(new shaka.util.Error(\n severity,\n shaka.util.Error.Category.DRM,\n shaka.util.Error.Code.FAILED_TO_CREATE_SESSION,\n error.message));\n\n metadata.loaded = true;\n\n this.checkSessionsLoaded_();\n }\n\n return Promise.resolve();\n }\n\n /**\n * @param {string} initDataType\n * @param {!Uint8Array} initData\n * @param {string} sessionType\n */\n createSession(initDataType, initData, sessionType) {\n goog.asserts.assert(this.mediaKeys_,\n 'mediaKeys_ should be valid when creating temporary session.');\n\n let session;\n\n try {\n shaka.log.info('Creating new', sessionType, 'session');\n\n session = this.mediaKeys_.createSession(sessionType);\n } catch (exception) {\n this.onError_(new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.DRM,\n shaka.util.Error.Code.FAILED_TO_CREATE_SESSION,\n exception.message));\n return;\n }\n\n this.eventManager_.listen(session, 'message',\n /** @type {shaka.util.EventManager.ListenerType} */(\n (event) => this.onSessionMessage_(event)));\n this.eventManager_.listen(session, 'keystatuseschange',\n (event) => this.onKeyStatusesChange_(event));\n\n const metadata = {\n initData: initData,\n initDataType: initDataType,\n loaded: false,\n oldExpiration: Infinity,\n updatePromise: null,\n type: sessionType,\n };\n this.activeSessions_.set(session, metadata);\n\n try {\n initData = this.config_.initDataTransform(\n initData, initDataType, this.currentDrmInfo_);\n } catch (error) {\n let shakaError = error;\n if (!(error instanceof shaka.util.Error)) {\n shakaError = new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.DRM,\n shaka.util.Error.Code.INIT_DATA_TRANSFORM_ERROR,\n error);\n }\n this.onError_(shakaError);\n return;\n }\n\n if (this.config_.logLicenseExchange) {\n const str = shaka.util.Uint8ArrayUtils.toBase64(initData);\n shaka.log.info('EME init data: type=', initDataType, 'data=', str);\n }\n\n session.generateRequest(initDataType, initData).catch((error) => {\n if (this.destroyer_.destroyed()) {\n return;\n }\n goog.asserts.assert(error instanceof Error, 'Wrong error type!');\n\n this.activeSessions_.delete(session);\n\n // This may be supplied by some polyfills.\n /** @type {MediaKeyError} */\n const errorCode = error['errorCode'];\n\n let extended;\n if (errorCode && errorCode.systemCode) {\n extended = errorCode.systemCode;\n if (extended < 0) {\n extended += Math.pow(2, 32);\n }\n extended = '0x' + extended.toString(16);\n }\n\n this.onError_(new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.DRM,\n shaka.util.Error.Code.FAILED_TO_GENERATE_LICENSE_REQUEST,\n error.message, error, extended));\n });\n }\n\n /**\n * @param {!MediaKeyMessageEvent} event\n * @private\n */\n onSessionMessage_(event) {\n if (this.delayLicenseRequest_()) {\n this.mediaKeyMessageEvents_.push(event);\n } else {\n this.sendLicenseRequest_(event);\n }\n }\n\n /**\n * @return {boolean}\n * @private\n */\n delayLicenseRequest_() {\n if (!this.video_) {\n // If there's no video, don't delay the license request; i.e., in the case\n // of offline storage.\n return false;\n }\n return (this.config_.delayLicenseRequestUntilPlayed &&\n this.video_.paused && !this.initialRequestsSent_);\n }\n\n /** @return {!Promise} */\n async waitForActiveRequests() {\n if (this.hasInitData_) {\n await this.allSessionsLoaded_;\n await Promise.all(this.activeRequests_.map((req) => req.promise));\n }\n }\n\n /**\n * Sends a license request.\n * @param {!MediaKeyMessageEvent} event\n * @private\n */\n async sendLicenseRequest_(event) {\n /** @type {!MediaKeySession} */\n const session = event.target;\n shaka.log.v1(\n 'Sending license request for session', session.sessionId, 'of type',\n event.messageType);\n if (this.config_.logLicenseExchange) {\n const str = shaka.util.Uint8ArrayUtils.toBase64(event.message);\n shaka.log.info('EME license request', str);\n }\n\n const metadata = this.activeSessions_.get(session);\n\n let url = this.currentDrmInfo_.licenseServerUri;\n const advancedConfig =\n this.config_.advanced[this.currentDrmInfo_.keySystem];\n\n if (event.messageType == 'individualization-request' && advancedConfig &&\n advancedConfig.individualizationServer) {\n url = advancedConfig.individualizationServer;\n }\n\n const requestType = shaka.net.NetworkingEngine.RequestType.LICENSE;\n const request = shaka.net.NetworkingEngine.makeRequest(\n [url], this.config_.retryParameters);\n request.body = event.message;\n request.method = 'POST';\n request.licenseRequestType = event.messageType;\n request.sessionId = session.sessionId;\n request.drmInfo = this.currentDrmInfo_;\n if (metadata) {\n request.initData = metadata.initData;\n request.initDataType = metadata.initDataType;\n }\n if (advancedConfig && advancedConfig.headers) {\n // Add these to the existing headers. Do not clobber them!\n // For PlayReady, there will already be headers in the request.\n for (const header in advancedConfig.headers) {\n request.headers[header] = advancedConfig.headers[header];\n }\n }\n // NOTE: allowCrossSiteCredentials can be set in a request filter.\n\n if (shaka.drm.DrmUtils.isClearKeySystem(\n this.currentDrmInfo_.keySystem)) {\n this.fixClearKeyRequest_(request, this.currentDrmInfo_);\n }\n\n if (shaka.drm.DrmUtils.isPlayReadyKeySystem(\n this.currentDrmInfo_.keySystem)) {\n this.unpackPlayReadyRequest_(request);\n }\n\n const startTimeRequest = Date.now();\n\n let response;\n try {\n const req = this.playerInterface_.netEngine.request(\n requestType, request, {isPreload: this.isPreload_()});\n this.activeRequests_.push(req);\n response = await req.promise;\n shaka.util.ArrayUtils.remove(this.activeRequests_, req);\n } catch (error) {\n if (this.destroyer_.destroyed()) {\n return;\n }\n // Request failed!\n goog.asserts.assert(error instanceof shaka.util.Error,\n 'Wrong NetworkingEngine error type!');\n const shakaErr = new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.DRM,\n shaka.util.Error.Code.LICENSE_REQUEST_FAILED,\n error);\n if (this.activeSessions_.size == 1) {\n this.onError_(shakaErr);\n if (metadata && metadata.updatePromise) {\n metadata.updatePromise.reject(shakaErr);\n }\n } else {\n if (metadata && metadata.updatePromise) {\n metadata.updatePromise.reject(shakaErr);\n }\n this.activeSessions_.delete(session);\n if (this.areAllSessionsLoaded_()) {\n this.allSessionsLoaded_.resolve();\n this.keyStatusTimer_.tickAfter(/* seconds= */ 0.1);\n }\n }\n return;\n }\n if (this.destroyer_.destroyed()) {\n return;\n }\n\n this.licenseTimeSeconds_ += (Date.now() - startTimeRequest) / 1000;\n\n if (this.config_.logLicenseExchange) {\n const str = shaka.util.Uint8ArrayUtils.toBase64(response.data);\n shaka.log.info('EME license response', str);\n }\n\n // Request succeeded, now pass the response to the CDM.\n try {\n shaka.log.v1('Updating session', session.sessionId);\n await session.update(response.data);\n } catch (error) {\n // Session update failed!\n const shakaErr = new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.DRM,\n shaka.util.Error.Code.LICENSE_RESPONSE_REJECTED,\n error.message);\n this.onError_(shakaErr);\n if (metadata && metadata.updatePromise) {\n metadata.updatePromise.reject(shakaErr);\n }\n return;\n }\n if (this.destroyer_.destroyed()) {\n return;\n }\n\n const updateEvent = new shaka.util.FakeEvent('drmsessionupdate');\n this.playerInterface_.onEvent(updateEvent);\n\n if (metadata) {\n if (metadata.updatePromise) {\n metadata.updatePromise.resolve();\n }\n\n this.setLoadSessionTimeoutTimer_(metadata);\n }\n }\n\n /**\n * Unpacks PlayReady license requests. Modifies the request object.\n * @param {shaka.extern.Request} request\n * @private\n */\n unpackPlayReadyRequest_(request) {\n // On Edge, the raw license message is UTF-16-encoded XML. We need\n // to unpack the Challenge element (base64-encoded string containing the\n // actual license request) and any HttpHeader elements (sent as request\n // headers).\n\n // Example XML:\n\n // <PlayReadyKeyMessage type=\"LicenseAcquisition\">\n // <LicenseAcquisition Version=\"1\">\n // <Challenge encoding=\"base64encoded\">{Base64Data}</Challenge>\n // <HttpHeaders>\n // <HttpHeader>\n // <name>Content-Type</name>\n // <value>text/xml; charset=utf-8</value>\n // </HttpHeader>\n // <HttpHeader>\n // <name>SOAPAction</name>\n // <value>http://schemas.microsoft.com/DRM/etc/etc</value>\n // </HttpHeader>\n // </HttpHeaders>\n // </LicenseAcquisition>\n // </PlayReadyKeyMessage>\n const TXml = shaka.util.TXml;\n\n const xml = shaka.util.StringUtils.fromUTF16(\n request.body, /* littleEndian= */ true, /* noThrow= */ true);\n if (!xml.includes('PlayReadyKeyMessage')) {\n // This does not appear to be a wrapped message as on Edge. Some\n // clients do not need this unwrapping, so we will assume this is one of\n // them. Note that \"xml\" at this point probably looks like random\n // garbage, since we interpreted UTF-8 as UTF-16.\n shaka.log.debug('PlayReady request is already unwrapped.');\n request.headers['Content-Type'] = 'text/xml; charset=utf-8';\n return;\n }\n shaka.log.debug('Unwrapping PlayReady request.');\n const dom = TXml.parseXmlString(xml, 'PlayReadyKeyMessage');\n goog.asserts.assert(dom, 'Failed to parse PlayReady XML!');\n\n // Set request headers.\n const headers = TXml.getElementsByTagName(dom, 'HttpHeader');\n for (const header of headers) {\n const name = TXml.getElementsByTagName(header, 'name')[0];\n const value = TXml.getElementsByTagName(header, 'value')[0];\n goog.asserts.assert(name && value, 'Malformed PlayReady headers!');\n request.headers[\n /** @type {string} */(shaka.util.TXml.getTextContents(name))] =\n /** @type {string} */(shaka.util.TXml.getTextContents(value));\n }\n\n // Unpack the base64-encoded challenge.\n const challenge = TXml.getElementsByTagName(dom, 'Challenge')[0];\n goog.asserts.assert(challenge,\n 'Malformed PlayReady challenge!');\n goog.asserts.assert(challenge.attributes['encoding'] == 'base64encoded',\n 'Unexpected PlayReady challenge encoding!');\n request.body = shaka.util.Uint8ArrayUtils.fromBase64(\n /** @type {string} */(shaka.util.TXml.getTextContents(challenge)));\n }\n\n /**\n * Some old ClearKey CDMs don't include the type in the body request.\n *\n * @param {shaka.extern.Request} request\n * @param {shaka.extern.DrmInfo} drmInfo\n * @private\n */\n fixClearKeyRequest_(request, drmInfo) {\n try {\n const body = shaka.util.StringUtils.fromBytesAutoDetect(request.body);\n if (body) {\n const licenseBody =\n /** @type {shaka.drm.DrmEngine.ClearKeyLicenceRequestFormat} */ (\n JSON.parse(body));\n if (!licenseBody.type) {\n licenseBody.type = drmInfo.sessionType;\n request.body =\n shaka.util.StringUtils.toUTF8(JSON.stringify(licenseBody));\n }\n }\n } catch (e) {\n shaka.log.info('Error unpacking ClearKey license', e);\n }\n }\n\n /**\n * @param {!Event} event\n * @private\n * @suppress {invalidCasts} to swap keyId and status\n */\n onKeyStatusesChange_(event) {\n const session = /** @type {!MediaKeySession} */(event.target);\n shaka.log.v2('Key status changed for session', session.sessionId);\n\n const found = this.activeSessions_.get(session);\n const keyStatusMap = session.keyStatuses;\n let hasExpiredKeys = false;\n\n keyStatusMap.forEach((status, keyId) => {\n // The spec has changed a few times on the exact order of arguments here.\n // As of 2016-06-30, Edge has the order reversed compared to the current\n // EME spec. Given the back and forth in the spec, it may not be the only\n // one. Try to detect this and compensate:\n if (typeof keyId == 'string') {\n const tmp = keyId;\n keyId = /** @type {!ArrayBuffer} */(status);\n status = /** @type {string} */(tmp);\n }\n\n // Microsoft's implementation in Edge seems to present key IDs as\n // little-endian UUIDs, rather than big-endian or just plain array of\n // bytes.\n // standard: 6e 5a 1d 26 - 27 57 - 47 d7 - 80 46 ea a5 d1 d3 4b 5a\n // on Edge: 26 1d 5a 6e - 57 27 - d7 47 - 80 46 ea a5 d1 d3 4b 5a\n // Bug filed: https://bit.ly/2thuzXu\n\n // NOTE that we skip this if byteLength != 16. This is used for Edge\n // which uses single-byte dummy key IDs.\n // However, unlike Edge and Chromecast, Tizen doesn't have this problem.\n if (shaka.drm.DrmUtils.isPlayReadyKeySystem(\n this.currentDrmInfo_.keySystem) &&\n keyId.byteLength == 16 &&\n (shaka.util.Platform.isEdge() || shaka.util.Platform.isPS4())) {\n // Read out some fields in little-endian:\n const dataView = shaka.util.BufferUtils.toDataView(keyId);\n const part0 = dataView.getUint32(0, /* LE= */ true);\n const part1 = dataView.getUint16(4, /* LE= */ true);\n const part2 = dataView.getUint16(6, /* LE= */ true);\n // Write it back in big-endian:\n dataView.setUint32(0, part0, /* BE= */ false);\n dataView.setUint16(4, part1, /* BE= */ false);\n dataView.setUint16(6, part2, /* BE= */ false);\n }\n\n if (status != 'status-pending') {\n found.loaded = true;\n }\n\n if (!found) {\n // We can get a key status changed for a closed session after it has\n // been removed from |activeSessions_|. If it is closed, none of its\n // keys should be usable.\n goog.asserts.assert(\n status != 'usable', 'Usable keys found in closed session');\n }\n\n if (status == 'expired') {\n hasExpiredKeys = true;\n }\n\n const keyIdHex = shaka.util.Uint8ArrayUtils.toHex(keyId).slice(0, 32);\n\n this.keyStatusByKeyId_.set(keyIdHex, status);\n });\n\n // If the session has expired, close it.\n // Some CDMs do not have sub-second time resolution, so the key status may\n // fire with hundreds of milliseconds left until the stated expiration time.\n const msUntilExpiration = session.expiration - Date.now();\n if (msUntilExpiration < 0 || (hasExpiredKeys && msUntilExpiration < 1000)) {\n // If this is part of a remove(), we don't want to close the session until\n // the update is complete. Otherwise, we will orphan the session.\n if (found && !found.updatePromise) {\n shaka.log.debug('Session has expired', session.sessionId);\n this.activeSessions_.delete(session);\n this.closeSession_(session);\n }\n }\n\n if (!this.areAllSessionsLoaded_()) {\n // Don't announce key statuses or resolve the \"all loaded\" promise until\n // everything is loaded.\n return;\n }\n\n this.allSessionsLoaded_.resolve();\n\n // Batch up key status changes before checking them or notifying Player.\n // This handles cases where the statuses of multiple sessions are set\n // simultaneously by the browser before dispatching key status changes for\n // each of them. By batching these up, we only send one status change event\n // and at most one EXPIRED error on expiration.\n this.keyStatusTimer_.tickAfter(\n /* seconds= */ shaka.drm.DrmEngine.KEY_STATUS_BATCH_TIME);\n }\n\n /** @private */\n processKeyStatusChanges_() {\n const privateMap = this.keyStatusByKeyId_;\n const publicMap = this.announcedKeyStatusByKeyId_;\n\n // Copy the latest key statuses into the publicly-accessible map.\n publicMap.clear();\n privateMap.forEach((status, keyId) => publicMap.set(keyId, status));\n\n // If all keys are expired, fire an error. |every| is always true for an\n // empty array but we shouldn't fire an error for a lack of key status info.\n const statuses = Array.from(publicMap.values());\n const allExpired = statuses.length &&\n statuses.every((status) => status == 'expired');\n\n if (allExpired) {\n this.onError_(new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.DRM,\n shaka.util.Error.Code.EXPIRED));\n }\n\n this.playerInterface_.onKeyStatus(shaka.util.MapUtils.asObject(publicMap));\n }\n\n /**\n * Returns a Promise to a map of EME support for well-known key systems.\n *\n * @return {!Promise<!Object<string, ?shaka.extern.DrmSupportType>>}\n */\n static async probeSupport() {\n const testKeySystems = [\n 'org.w3.clearkey',\n 'com.widevine.alpha',\n 'com.widevine.alpha.experiment', // Widevine L1 in Windows\n 'com.microsoft.playready',\n 'com.microsoft.playready.hardware',\n 'com.microsoft.playready.recommendation',\n 'com.chromecast.playready',\n 'com.apple.fps.1_0',\n 'com.apple.fps',\n 'com.huawei.wiseplay',\n ];\n\n if (!shaka.drm.DrmUtils.isBrowserSupported()) {\n const result = {};\n for (const keySystem of testKeySystems) {\n result[keySystem] = null;\n }\n return result;\n }\n\n const hdcpVersions = [\n '1.0',\n '1.1',\n '1.2',\n '1.3',\n '1.4',\n '2.0',\n '2.1',\n '2.2',\n '2.3',\n ];\n\n const widevineRobustness = [\n 'SW_SECURE_CRYPTO',\n 'SW_SECURE_DECODE',\n 'HW_SECURE_CRYPTO',\n 'HW_SECURE_DECODE',\n 'HW_SECURE_ALL',\n ];\n\n const playreadyRobustness = [\n '150',\n '2000',\n '3000',\n ];\n\n const testRobustness = {\n 'com.widevine.alpha': widevineRobustness,\n 'com.widevine.alpha.experiment': widevineRobustness,\n 'com.microsoft.playready.recommendation': playreadyRobustness,\n };\n\n const basicVideoCapabilities = [\n {contentType: 'video/mp4; codecs=\"avc1.42E01E\"'},\n {contentType: 'video/webm; codecs=\"vp8\"'},\n ];\n\n const basicAudioCapabilities = [\n {contentType: 'audio/mp4; codecs=\"mp4a.40.2\"'},\n {contentType: 'audio/webm; codecs=\"opus\"'},\n ];\n\n const basicConfigTemplate = {\n videoCapabilities: basicVideoCapabilities,\n audioCapabilities: basicAudioCapabilities,\n initDataTypes: ['cenc', 'sinf', 'skd', 'keyids'],\n };\n\n const testEncryptionSchemes = [\n null,\n 'cenc',\n 'cbcs',\n 'cbcs-1-9',\n ];\n\n /** @type {!Map<string, ?shaka.extern.DrmSupportType>} */\n const support = new Map();\n\n /**\n * @param {string} keySystem\n * @param {MediaKeySystemAccess} access\n * @return {!Promise}\n */\n const processMediaKeySystemAccess = async (keySystem, access) => {\n let mediaKeys;\n try {\n // Workaround: Our automated test lab runs Windows browsers under a\n // headless service. In this environment, Firefox's CDMs seem to crash\n // when we create the CDM here.\n if (goog.DEBUG && // not a production build\n shaka.util.Platform.isWindows() && // on Windows\n shaka.util.Platform.isFirefox() && // with Firefox\n shaka.debug.RunningInLab) { // in our headless lab\n // Reject this, since it crashes our tests.\n throw new Error('Suppressing Firefox Windows DRM in testing!');\n } else {\n // Otherwise, create the CDM.\n mediaKeys = await access.createMediaKeys();\n }\n } catch (error) {\n // In some cases, we can get a successful access object but fail to\n // create a MediaKeys instance. When this happens, don't update the\n // support structure. If a previous test succeeded, we won't overwrite\n // any of the results.\n return;\n }\n\n // If sessionTypes is missing, assume no support for persistent-license.\n const sessionTypes = access.getConfiguration().sessionTypes;\n let persistentState = sessionTypes ?\n sessionTypes.includes('persistent-license') : false;\n\n // Tizen 3.0 doesn't support persistent licenses, but reports that it\n // does. It doesn't fail until you call update() with a license\n // response, which is way too late.\n // This is a work-around for #894.\n if (shaka.util.Platform.isTizen3()) {\n persistentState = false;\n }\n\n const videoCapabilities = access.getConfiguration().videoCapabilities;\n const audioCapabilities = access.getConfiguration().audioCapabilities;\n\n let supportValue = {\n persistentState,\n encryptionSchemes: [],\n videoRobustnessLevels: [],\n audioRobustnessLevels: [],\n minHdcpVersions: [],\n };\n if (support.has(keySystem) && support.get(keySystem)) {\n // Update the existing non-null value.\n supportValue = support.get(keySystem);\n } else {\n // Set a new one.\n support.set(keySystem, supportValue);\n }\n\n // If the returned config doesn't mention encryptionScheme, the field\n // is not supported. If installed, our polyfills should make sure this\n // doesn't happen.\n const returnedScheme = videoCapabilities[0].encryptionScheme;\n if (returnedScheme &&\n !supportValue.encryptionSchemes.includes(returnedScheme)) {\n supportValue.encryptionSchemes.push(returnedScheme);\n }\n\n const videoRobustness = videoCapabilities[0].robustness;\n if (videoRobustness &&\n !supportValue.videoRobustnessLevels.includes(videoRobustness)) {\n supportValue.videoRobustnessLevels.push(videoRobustness);\n }\n\n const audioRobustness = audioCapabilities[0].robustness;\n if (audioRobustness &&\n !supportValue.audioRobustnessLevels.includes(audioRobustness)) {\n supportValue.audioRobustnessLevels.push(audioRobustness);\n }\n\n if ('getStatusForPolicy' in mediaKeys) {\n const promises = [];\n for (const hdcpVersion of hdcpVersions) {\n if (supportValue.minHdcpVersions.includes(hdcpVersion)) {\n continue;\n }\n promises.push(mediaKeys.getStatusForPolicy({\n minHdcpVersion: hdcpVersion,\n }).then((status) => {\n if (status == 'usable' &&\n !supportValue.minHdcpVersions.includes(hdcpVersion)) {\n supportValue.minHdcpVersions.push(hdcpVersion);\n }\n }));\n }\n await Promise.all(promises);\n }\n };\n\n const testSystemEme = async (keySystem, encryptionScheme,\n videoRobustness, audioRobustness) => {\n try {\n const basicConfig =\n shaka.util.ObjectUtils.cloneObject(basicConfigTemplate);\n for (const cap of basicConfig.videoCapabilities) {\n cap.encryptionScheme = encryptionScheme;\n cap.robustness = videoRobustness;\n }\n for (const cap of basicConfig.audioCapabilities) {\n cap.encryptionScheme = encryptionScheme;\n cap.robustness = audioRobustness;\n }\n\n const offlineConfig = shaka.util.ObjectUtils.cloneObject(basicConfig);\n offlineConfig.persistentState = 'required';\n offlineConfig.sessionTypes = ['persistent-license'];\n\n const configs = [offlineConfig, basicConfig];\n // On some (Android) WebView environments,\n // requestMediaKeySystemAccess will\n // not resolve or reject, at least if RESOURCE_PROTECTED_MEDIA_ID\n // is not set. This is a workaround for that issue.\n const TIMEOUT_FOR_CHECK_ACCESS_IN_SECONDS = 5;\n let access;\n if (shaka.util.Platform.isAndroid()) {\n access =\n await shaka.util.Functional.promiseWithTimeout(\n TIMEOUT_FOR_CHECK_ACCESS_IN_SECONDS,\n navigator.requestMediaKeySystemAccess(keySystem, configs),\n );\n } else {\n access =\n await navigator.requestMediaKeySystemAccess(keySystem, configs);\n }\n await processMediaKeySystemAccess(keySystem, access);\n } catch (error) {} // Ignore errors.\n };\n\n const testSystemMcap = async (keySystem, encryptionScheme,\n videoRobustness, audioRobustness) => {\n try {\n const decodingConfig = {\n type: 'media-source',\n video: {\n contentType: basicVideoCapabilities[0].contentType,\n width: 640,\n height: 480,\n bitrate: 1,\n framerate: 1,\n },\n audio: {\n contentType: basicAudioCapabilities[0].contentType,\n channels: 2,\n bitrate: 1,\n samplerate: 1,\n },\n keySystemConfiguration: {\n keySystem,\n video: {\n encryptionScheme,\n robustness: videoRobustness,\n },\n audio: {\n encryptionScheme,\n robustness: audioRobustness,\n },\n },\n };\n // On some (Android) WebView environments, decodingInfo will\n // not resolve or reject, at least if RESOURCE_PROTECTED_MEDIA_ID\n // is not set. This is a workaround for that issue.\n const TIMEOUT_FOR_DECODING_INFO_IN_SECONDS = 5;\n let decodingInfo;\n if (shaka.util.Platform.isAndroid()) {\n decodingInfo =\n await shaka.util.Functional.promiseWithTimeout(\n TIMEOUT_FOR_DECODING_INFO_IN_SECONDS,\n navigator.mediaCapabilities.decodingInfo(decodingConfig),\n );\n } else {\n decodingInfo =\n await navigator.mediaCapabilities.decodingInfo(decodingConfig);\n }\n\n const access = decodingInfo.keySystemAccess;\n await processMediaKeySystemAccess(keySystem, access);\n } catch (error) {\n // Ignore errors.\n shaka.log.v2('Failed to probe support for', keySystem, error);\n }\n };\n\n // Initialize the support structure for each key system.\n for (const keySystem of testKeySystems) {\n support.set(keySystem, null);\n }\n\n const checkKeySystem = (keySystem) => {\n // Our Polyfill will reject anything apart com.apple.fps key systems.\n // It seems the Safari modern EME API will allow to request a\n // MediaKeySystemAccess for the ClearKey CDM, create and update a key\n // session but playback will never start\n // Safari bug: https://bugs.webkit.org/show_bug.cgi?id=231006\n if (shaka.drm.DrmUtils.isClearKeySystem(keySystem) &&\n shaka.util.Platform.isApple()) {\n return false;\n }\n // FairPlay is a proprietary DRM from Apple and will never work on\n // Windows.\n if (shaka.drm.DrmUtils.isFairPlayKeySystem(keySystem) &&\n shaka.util.Platform.isWindows()) {\n return false;\n }\n // PlayReady is a proprietary DRM from Microsoft and will never work on\n // Apple platforms\n if (shaka.drm.DrmUtils.isPlayReadyKeySystem(keySystem) &&\n (shaka.util.Platform.isMac() || shaka.util.Platform.isApple())) {\n return false;\n }\n // Mozilla has no intention of supporting PlayReady according to\n // comments posted on Bugzilla.\n if (shaka.drm.DrmUtils.isPlayReadyKeySystem(keySystem) &&\n shaka.util.Platform.isFirefox()) {\n return false;\n }\n // We are sure that WisePlay is not supported on Windows or macOS.\n if (shaka.drm.DrmUtils.isWisePlayKeySystem(keySystem) &&\n (shaka.util.Platform.isWindows() || shaka.util.Platform.isMac())) {\n return false;\n }\n return true;\n };\n\n // Test each key system and encryption scheme.\n const tests = [];\n for (const encryptionScheme of testEncryptionSchemes) {\n for (const keySystem of testKeySystems) {\n if (!checkKeySystem(keySystem)) {\n continue;\n }\n tests.push(testSystemEme(keySystem, encryptionScheme, '', ''));\n tests.push(testSystemMcap(keySystem, encryptionScheme, '', ''));\n }\n }\n\n for (const keySystem of testKeySystems) {\n for (const robustness of (testRobustness[keySystem] || [])) {\n if (!checkKeySystem(keySystem)) {\n continue;\n }\n tests.push(testSystemEme(keySystem, null, robustness, ''));\n tests.push(testSystemEme(keySystem, null, '', robustness));\n tests.push(testSystemMcap(keySystem, null, robustness, ''));\n tests.push(testSystemMcap(keySystem, null, '', robustness));\n }\n }\n\n await Promise.all(tests);\n return shaka.util.MapUtils.asObject(support);\n }\n\n /** @private */\n onPlay_() {\n for (const event of this.mediaKeyMessageEvents_) {\n this.sendLicenseRequest_(event);\n }\n\n this.initialRequestsSent_ = true;\n this.mediaKeyMessageEvents_ = [];\n }\n\n /**\n * Close a drm session while accounting for a bug in Chrome. Sometimes the\n * Promise returned by close() never resolves.\n *\n * See issue #2741 and http://crbug.com/1108158.\n * @param {!MediaKeySession} session\n * @return {!Promise}\n * @private\n */\n async closeSession_(session) {\n try {\n await shaka.util.Functional.promiseWithTimeout(\n shaka.drm.DrmEngine.CLOSE_TIMEOUT_,\n Promise.all([session.close().catch(() => {}), session.closed]));\n } catch (e) {\n shaka.log.warning('Timeout waiting for session close');\n }\n }\n\n /** @private */\n async closeOpenSessions_() {\n // Close all open sessions.\n const openSessions = Array.from(this.activeSessions_.entries());\n this.activeSessions_.clear();\n\n // Close all sessions before we remove media keys from the video element.\n await Promise.all(openSessions.map(async ([session, metadata]) => {\n try {\n /**\n * Special case when a persistent-license session has been initiated,\n * without being registered in the offline sessions at start-up.\n * We should remove the session to prevent it from being orphaned after\n * the playback session ends\n */\n if (!this.initializedForStorage_ &&\n !this.storedPersistentSessions_.has(session.sessionId) &&\n metadata.type === 'persistent-license' &&\n !this.config_.persistentSessionOnlinePlayback) {\n shaka.log.v1('Removing session', session.sessionId);\n\n await session.remove();\n } else {\n shaka.log.v1('Closing session', session.sessionId, metadata);\n\n await this.closeSession_(session);\n }\n } catch (error) {\n // Ignore errors when closing the sessions. Closing a session that\n // generated no key requests will throw an error.\n\n shaka.log.error('Failed to close or remove the session', error);\n }\n }));\n }\n\n /**\n * Concat the audio and video drmInfos in a variant.\n * @param {shaka.extern.Variant} variant\n * @return {!Array<!shaka.extern.DrmInfo>}\n * @private\n */\n getVariantDrmInfos_(variant) {\n const videoDrmInfos = variant.video ? variant.video.drmInfos : [];\n const audioDrmInfos = variant.audio ? variant.audio.drmInfos : [];\n return videoDrmInfos.concat(audioDrmInfos);\n }\n\n /**\n * Called in an interval timer to poll the expiration times of the sessions.\n * We don't get an event from EME when the expiration updates, so we poll it\n * so we can fire an event when it happens.\n * @private\n */\n pollExpiration_() {\n this.activeSessions_.forEach((metadata, session) => {\n const oldTime = metadata.oldExpiration;\n let newTime = session.expiration;\n if (isNaN(newTime)) {\n newTime = Infinity;\n }\n\n if (newTime != oldTime) {\n this.playerInterface_.onExpirationUpdated(session.sessionId, newTime);\n metadata.oldExpiration = newTime;\n }\n });\n }\n\n /**\n * @return {boolean}\n * @private\n */\n areAllSessionsLoaded_() {\n const metadatas = this.activeSessions_.values();\n return shaka.util.Iterables.every(metadatas, (data) => data.loaded);\n }\n\n /**\n * @return {boolean}\n * @private\n */\n areAllKeysUsable_() {\n const keyIds = (this.currentDrmInfo_ && this.currentDrmInfo_.keyIds) ||\n new Set([]);\n\n for (const keyId of keyIds) {\n const status = this.keyStatusByKeyId_.get(keyId);\n\n if (status !== 'usable') {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Replace the drm info used in each variant in |variants| to reflect each\n * key service in |keySystems|.\n *\n * @param {!Array<shaka.extern.Variant>} variants\n * @param {!Map<string, string>} keySystems\n * @private\n */\n static replaceDrmInfo_(variants, keySystems) {\n const drmInfos = [];\n\n keySystems.forEach((uri, keySystem) => {\n drmInfos.push({\n keySystem: keySystem,\n licenseServerUri: uri,\n distinctiveIdentifierRequired: false,\n persistentStateRequired: false,\n audioRobustness: '',\n videoRobustness: '',\n serverCertificate: null,\n serverCertificateUri: '',\n initData: [],\n keyIds: new Set(),\n });\n });\n\n for (const variant of variants) {\n if (variant.video) {\n variant.video.drmInfos = drmInfos;\n }\n if (variant.audio) {\n variant.audio.drmInfos = drmInfos;\n }\n }\n }\n\n\n /**\n * Creates a DrmInfo object describing the settings used to initialize the\n * engine.\n *\n * @param {string} keySystem\n * @param {!Array<shaka.extern.DrmInfo>} drmInfos\n * @return {shaka.extern.DrmInfo}\n *\n * @private\n */\n createDrmInfoByInfos_(keySystem, drmInfos) {\n /** @type {!Array<string>} */\n const encryptionSchemes = [];\n\n /** @type {!Array<string>} */\n const licenseServers = [];\n\n /** @type {!Array<string>} */\n const serverCertificateUris = [];\n\n /** @type {!Array<!Uint8Array>} */\n const serverCerts = [];\n\n /** @type {!Array<!shaka.extern.InitDataOverride>} */\n const initDatas = [];\n\n /** @type {!Set<string>} */\n const keyIds = new Set();\n\n /** @type {!Set<string>} */\n const keySystemUris = new Set();\n\n shaka.drm.DrmEngine.processDrmInfos_(\n drmInfos, encryptionSchemes, licenseServers, serverCerts,\n serverCertificateUris, initDatas, keyIds, keySystemUris);\n\n if (encryptionSchemes.length > 1) {\n shaka.log.warning('Multiple unique encryption schemes found! ' +\n 'Only the first will be used.');\n }\n\n if (serverCerts.length > 1) {\n shaka.log.warning('Multiple unique server certificates found! ' +\n 'Only the first will be used.');\n }\n\n if (licenseServers.length > 1) {\n shaka.log.warning('Multiple unique license server URIs found! ' +\n 'Only the first will be used.');\n }\n\n if (serverCertificateUris.length > 1) {\n shaka.log.warning('Multiple unique server certificate URIs found! ' +\n 'Only the first will be used.');\n }\n\n const defaultSessionType =\n this.usePersistentLicenses_ ? 'persistent-license' : 'temporary';\n\n /** @type {shaka.extern.DrmInfo} */\n const res = {\n keySystem,\n encryptionScheme: encryptionSchemes[0],\n licenseServerUri: licenseServers[0],\n distinctiveIdentifierRequired: drmInfos[0].distinctiveIdentifierRequired,\n persistentStateRequired: drmInfos[0].persistentStateRequired,\n sessionType: drmInfos[0].sessionType || defaultSessionType,\n audioRobustness: drmInfos[0].audioRobustness || '',\n videoRobustness: drmInfos[0].videoRobustness || '',\n serverCertificate: serverCerts[0],\n serverCertificateUri: serverCertificateUris[0],\n initData: initDatas,\n keyIds,\n };\n\n if (keySystemUris.size > 0) {\n res.keySystemUris = keySystemUris;\n }\n\n for (const info of drmInfos) {\n if (info.distinctiveIdentifierRequired) {\n res.distinctiveIdentifierRequired = info.distinctiveIdentifierRequired;\n }\n\n if (info.persistentStateRequired) {\n res.persistentStateRequired = info.persistentStateRequired;\n }\n }\n\n return res;\n }\n\n /**\n * Creates a DrmInfo object describing the settings used to initialize the\n * engine.\n *\n * @param {string} keySystem\n * @param {MediaKeySystemConfiguration} config\n * @return {shaka.extern.DrmInfo}\n *\n * @private\n */\n static createDrmInfoByConfigs_(keySystem, config) {\n /** @type {!Array<string>} */\n const encryptionSchemes = [];\n\n /** @type {!Array<string>} */\n const licenseServers = [];\n\n /** @type {!Array<string>} */\n const serverCertificateUris = [];\n\n /** @type {!Array<!Uint8Array>} */\n const serverCerts = [];\n\n /** @type {!Array<!shaka.extern.InitDataOverride>} */\n const initDatas = [];\n\n /** @type {!Set<string>} */\n const keyIds = new Set();\n\n // TODO: refactor, don't stick drmInfos onto MediaKeySystemConfiguration\n shaka.drm.DrmEngine.processDrmInfos_(\n config['drmInfos'], encryptionSchemes, licenseServers, serverCerts,\n serverCertificateUris, initDatas, keyIds);\n\n if (encryptionSchemes.length > 1) {\n shaka.log.warning('Multiple unique encryption schemes found! ' +\n 'Only the first will be used.');\n }\n\n if (serverCerts.length > 1) {\n shaka.log.warning('Multiple unique server certificates found! ' +\n 'Only the first will be used.');\n }\n\n if (serverCertificateUris.length > 1) {\n shaka.log.warning('Multiple unique server certificate URIs found! ' +\n 'Only the first will be used.');\n }\n\n if (licenseServers.length > 1) {\n shaka.log.warning('Multiple unique license server URIs found! ' +\n 'Only the first will be used.');\n }\n\n // TODO: This only works when all DrmInfo have the same robustness.\n const audioRobustness =\n config.audioCapabilities ? config.audioCapabilities[0].robustness : '';\n const videoRobustness =\n config.videoCapabilities ? config.videoCapabilities[0].robustness : '';\n\n const distinctiveIdentifier = config.distinctiveIdentifier;\n return {\n keySystem,\n encryptionScheme: encryptionSchemes[0],\n licenseServerUri: licenseServers[0],\n distinctiveIdentifierRequired: (distinctiveIdentifier == 'required'),\n persistentStateRequired: (config.persistentState == 'required'),\n sessionType: config.sessionTypes[0] || 'temporary',\n audioRobustness: audioRobustness || '',\n videoRobustness: videoRobustness || '',\n serverCertificate: serverCerts[0],\n serverCertificateUri: serverCertificateUris[0],\n initData: initDatas,\n keyIds,\n };\n }\n\n /**\n * Extract license server, server cert, and init data from |drmInfos|, taking\n * care to eliminate duplicates.\n *\n * @param {!Array<shaka.extern.DrmInfo>} drmInfos\n * @param {!Array<string>} encryptionSchemes\n * @param {!Array<string>} licenseServers\n * @param {!Array<!Uint8Array>} serverCerts\n * @param {!Array<string>} serverCertificateUris\n * @param {!Array<!shaka.extern.InitDataOverride>} initDatas\n * @param {!Set<string>} keyIds\n * @param {!Set<string>} [keySystemUris]\n * @private\n */\n static processDrmInfos_(\n drmInfos, encryptionSchemes, licenseServers, serverCerts,\n serverCertificateUris, initDatas, keyIds, keySystemUris) {\n /**\n * @type {function(shaka.extern.InitDataOverride,\n * shaka.extern.InitDataOverride):boolean}\n */\n const initDataOverrideEqual = (a, b) => {\n if (a.keyId && a.keyId == b.keyId) {\n // Two initDatas with the same keyId are considered to be the same,\n // unless that \"same keyId\" is null.\n return true;\n }\n return a.initDataType == b.initDataType &&\n shaka.util.BufferUtils.equal(a.initData, b.initData);\n };\n\n const clearkeyDataStart = 'data:application/json;base64,';\n const clearKeyLicenseServers = [];\n\n for (const drmInfo of drmInfos) {\n // Build an array of unique encryption schemes.\n if (!encryptionSchemes.includes(drmInfo.encryptionScheme)) {\n encryptionSchemes.push(drmInfo.encryptionScheme);\n }\n\n // Build an array of unique license servers.\n if (drmInfo.keySystem == 'org.w3.clearkey' &&\n drmInfo.licenseServerUri.startsWith(clearkeyDataStart)) {\n if (!clearKeyLicenseServers.includes(drmInfo.licenseServerUri)) {\n clearKeyLicenseServers.push(drmInfo.licenseServerUri);\n }\n } else if (!licenseServers.includes(drmInfo.licenseServerUri)) {\n licenseServers.push(drmInfo.licenseServerUri);\n }\n\n // Build an array of unique license servers.\n if (!serverCertificateUris.includes(drmInfo.serverCertificateUri)) {\n serverCertificateUris.push(drmInfo.serverCertificateUri);\n }\n\n // Build an array of unique server certs.\n if (drmInfo.serverCertificate) {\n const found = serverCerts.some(\n (cert) => shaka.util.BufferUtils.equal(\n cert, drmInfo.serverCertificate));\n if (!found) {\n serverCerts.push(drmInfo.serverCertificate);\n }\n }\n\n // Build an array of unique init datas.\n if (drmInfo.initData) {\n for (const initDataOverride of drmInfo.initData) {\n const found = initDatas.some(\n (initData) =>\n initDataOverrideEqual(initData, initDataOverride));\n if (!found) {\n initDatas.push(initDataOverride);\n }\n }\n }\n\n if (drmInfo.keyIds) {\n for (const keyId of drmInfo.keyIds) {\n keyIds.add(keyId);\n }\n }\n\n if (drmInfo.keySystemUris && keySystemUris) {\n for (const keySystemUri of drmInfo.keySystemUris) {\n keySystemUris.add(keySystemUri);\n }\n }\n }\n\n if (clearKeyLicenseServers.length == 1) {\n licenseServers.push(clearKeyLicenseServers[0]);\n } else if (clearKeyLicenseServers.length > 0) {\n const keys = [];\n for (const clearKeyLicenseServer of clearKeyLicenseServers) {\n const license = window.atob(\n clearKeyLicenseServer.split(clearkeyDataStart).pop());\n const jwkSet = /** @type {{keys: !Array}} */(JSON.parse(license));\n keys.push(...jwkSet.keys);\n }\n const newJwkSet = {keys: keys};\n const newLicense = JSON.stringify(newJwkSet);\n licenseServers.push(clearkeyDataStart + window.btoa(newLicense));\n }\n }\n\n /**\n * Use |servers| and |advancedConfigs| to fill in missing values in drmInfo\n * that the parser left blank. Before working with any drmInfo, it should be\n * passed through here as it is uncommon for drmInfo to be complete when\n * fetched from a manifest because most manifest formats do not have the\n * required information. Also applies the key systems mapping.\n *\n * @param {shaka.extern.DrmInfo} drmInfo\n * @param {!Map<string, string>} servers\n * @param {!Map<string,\n * shaka.extern.AdvancedDrmConfiguration>} advancedConfigs\n * @param {!Object<string, string>} keySystemsMapping\n * @private\n */\n static fillInDrmInfoDefaults_(drmInfo, servers, advancedConfigs,\n keySystemsMapping) {\n const originalKeySystem = drmInfo.keySystem;\n\n if (!originalKeySystem) {\n // This is a placeholder from the manifest parser for an unrecognized key\n // system. Skip this entry, to avoid logging nonsensical errors.\n return;\n }\n\n // The order of preference for drmInfo:\n // 1. Clear Key config, used for debugging, should override everything else.\n // (The application can still specify a clearkey license server.)\n // 2. Application-configured servers, if present, override\n // anything from the manifest.\n // 3. Manifest-provided license servers are only used if nothing else is\n // specified.\n // This is important because it allows the application a clear way to\n // indicate which DRM systems should be ignored on platforms with multiple\n // DRM systems.\n // Alternatively, use config.preferredKeySystems to specify the preferred\n // key system.\n\n if (originalKeySystem == 'org.w3.clearkey' && drmInfo.licenseServerUri) {\n // Preference 1: Clear Key with pre-configured keys will have a data URI\n // assigned as its license server. Don't change anything.\n return;\n } else if (servers.size && servers.get(originalKeySystem)) {\n // Preference 2: If a license server for this keySystem is configured at\n // the application level, override whatever was in the manifest.\n const server = servers.get(originalKeySystem);\n\n drmInfo.licenseServerUri = server;\n } else {\n // Preference 3: Keep whatever we had in drmInfo.licenseServerUri, which\n // comes from the manifest.\n }\n\n if (!drmInfo.keyIds) {\n drmInfo.keyIds = new Set();\n }\n\n const advancedConfig = advancedConfigs.get(originalKeySystem);\n\n if (advancedConfig) {\n if (!drmInfo.distinctiveIdentifierRequired) {\n drmInfo.distinctiveIdentifierRequired =\n advancedConfig.distinctiveIdentifierRequired;\n }\n\n if (!drmInfo.persistentStateRequired) {\n drmInfo.persistentStateRequired =\n advancedConfig.persistentStateRequired;\n }\n\n // robustness will be filled in with defaults, if needed, in\n // expandRobustness\n\n if (!drmInfo.serverCertificate) {\n drmInfo.serverCertificate = advancedConfig.serverCertificate;\n }\n\n if (advancedConfig.sessionType) {\n drmInfo.sessionType = advancedConfig.sessionType;\n }\n\n if (!drmInfo.serverCertificateUri) {\n drmInfo.serverCertificateUri = advancedConfig.serverCertificateUri;\n }\n }\n\n if (keySystemsMapping[originalKeySystem]) {\n drmInfo.keySystem = keySystemsMapping[originalKeySystem];\n }\n\n // Chromecast has a variant of PlayReady that uses a different key\n // system ID. Since manifest parsers convert the standard PlayReady\n // UUID to the standard PlayReady key system ID, here we will switch\n // to the Chromecast version if we are running on that platform.\n // Note that this must come after fillInDrmInfoDefaults_, since the\n // player config uses the standard PlayReady ID for license server\n // configuration.\n if (window.cast && window.cast.__platform__) {\n if (originalKeySystem == 'com.microsoft.playready') {\n drmInfo.keySystem = 'com.chromecast.playready';\n }\n }\n }\n\n /**\n * Parse pssh from a media segment and announce new initData\n *\n * @param {shaka.util.ManifestParserUtils.ContentType} contentType\n * @param {!BufferSource} mediaSegment\n * @return {!Promise<void>}\n */\n parseInbandPssh(contentType, mediaSegment) {\n if (!this.config_.parseInbandPsshEnabled || this.manifestInitData_) {\n return Promise.resolve();\n }\n\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n if (![ContentType.AUDIO, ContentType.VIDEO].includes(contentType)) {\n return Promise.resolve();\n }\n\n const pssh = new shaka.util.Pssh(\n shaka.util.BufferUtils.toUint8(mediaSegment));\n\n let totalLength = 0;\n for (const data of pssh.data) {\n totalLength += data.length;\n }\n if (totalLength == 0) {\n return Promise.resolve();\n }\n const combinedData = new Uint8Array(totalLength);\n let pos = 0;\n for (const data of pssh.data) {\n combinedData.set(data, pos);\n pos += data.length;\n }\n this.newInitData('cenc', combinedData);\n return this.allSessionsLoaded_;\n }\n\n /**\n * Create a DrmInfo using configured clear keys and assign it to each variant.\n * Only modify variants if clear keys have been set.\n * @see https://bit.ly/2K8gOnv for the spec on the clearkey license format.\n *\n * @param {!Object<string, string>} configClearKeys\n * @param {!Array<shaka.extern.Variant>} variants\n */\n static configureClearKey(configClearKeys, variants) {\n const clearKeys = shaka.util.MapUtils.asMap(configClearKeys);\n if (clearKeys.size == 0) {\n return;\n }\n const clearKeyDrmInfo =\n shaka.util.ManifestParserUtils.createDrmInfoFromClearKeys(clearKeys);\n for (const variant of variants) {\n if (variant.video) {\n variant.video.drmInfos = [clearKeyDrmInfo];\n }\n if (variant.audio) {\n variant.audio.drmInfos = [clearKeyDrmInfo];\n }\n }\n }\n};\n\n\n/**\n * @typedef {{\n * loaded: boolean,\n * initData: Uint8Array,\n * initDataType: ?string,\n * oldExpiration: number,\n * type: string,\n * updatePromise: shaka.util.PublicPromise\n * }}\n *\n * @description A record to track sessions and suppress duplicate init data.\n * @property {boolean} loaded\n * True once the key status has been updated (to a non-pending state). This\n * does not mean the session is 'usable'.\n * @property {Uint8Array} initData\n * The init data used to create the session.\n * @property {?string} initDataType\n * The init data type used to create the session.\n * @property {!MediaKeySession} session\n * The session object.\n * @property {number} oldExpiration\n * The expiration of the session on the last check. This is used to fire\n * an event when it changes.\n * @property {string} type\n * The session type\n * @property {shaka.util.PublicPromise} updatePromise\n * An optional Promise that will be resolved/rejected on the next update()\n * call. This is used to track the 'license-release' message when calling\n * remove().\n */\nshaka.drm.DrmEngine.SessionMetaData;\n\n\n/**\n * @typedef {{\n * netEngine: !shaka.net.NetworkingEngine,\n * onError: function(!shaka.util.Error),\n * onKeyStatus: function(!Object<string,string>),\n * onExpirationUpdated: function(string,number),\n * onEvent: function(!Event)\n * }}\n *\n * @property {shaka.net.NetworkingEngine} netEngine\n * The NetworkingEngine instance to use. The caller retains ownership.\n * @property {function(!shaka.util.Error)} onError\n * Called when an error occurs. If the error is recoverable (see\n * {@link shaka.util.Error}) then the caller may invoke either\n * StreamingEngine.switch*() or StreamingEngine.seeked() to attempt recovery.\n * @property {function(!Object<string,string>)} onKeyStatus\n * Called when key status changes. The argument is a map of hex key IDs to\n * statuses.\n * @property {function(string,number)} onExpirationUpdated\n * Called when the session expiration value changes.\n * @property {function(!Event)} onEvent\n * Called when an event occurs that should be sent to the app.\n */\nshaka.drm.DrmEngine.PlayerInterface;\n\n/**\n * @typedef {{\n * kids: !Array<string>,\n * type: string\n * }}\n *\n * @property {!Array<string>} kids\n * An array of key IDs. Each element of the array is the base64url encoding of\n * the octet sequence containing the key ID value.\n * @property {string} type\n * The requested MediaKeySessionType.\n * @see https://www.w3.org/TR/encrypted-media/#clear-key-request-format\n */\nshaka.drm.DrmEngine.ClearKeyLicenceRequestFormat;\n\n/**\n * The amount of time, in seconds, we wait to consider a session closed.\n * This allows us to work around Chrome bug https://crbug.com/1108158.\n * @private {number}\n */\nshaka.drm.DrmEngine.CLOSE_TIMEOUT_ = 1;\n\n\n/**\n * The amount of time, in seconds, we wait to consider session loaded even if no\n * key status information is available. This allows us to support browsers/CDMs\n * without key statuses.\n * @private {number}\n */\nshaka.drm.DrmEngine.SESSION_LOAD_TIMEOUT_ = 5;\n\n\n/**\n * The amount of time, in seconds, we wait to batch up rapid key status changes.\n * This allows us to avoid multiple expiration events in most cases.\n * @type {number}\n */\nshaka.drm.DrmEngine.KEY_STATUS_BATCH_TIME = 0.5;\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.media.InitSegmentReference');\ngoog.provide('shaka.media.SegmentReference');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.log');\ngoog.require('shaka.util.ArrayUtils');\ngoog.require('shaka.util.BufferUtils');\n\n\n/**\n * Creates an InitSegmentReference, which provides the location to an\n * initialization segment.\n *\n * @export\n */\nshaka.media.InitSegmentReference = class {\n /**\n * @param {function(): !Array<string>} uris A function that creates the URIs\n * of the resource containing the segment.\n * @param {number} startByte The offset from the start of the resource to the\n * start of the segment.\n * @param {?number} endByte The offset from the start of the resource\n * to the end of the segment, inclusive. A value of null indicates that the\n * segment extends to the end of the resource.\n * @param {null|shaka.extern.MediaQualityInfo=} mediaQuality Information about\n * the quality of the media associated with this init segment.\n * @param {(null|number)=} timescale\n * @param {(null|BufferSource)=} segmentData\n * @param {?shaka.extern.aesKey=} aesKey\n * The segment's AES-128-CBC full segment encryption key and iv.\n * @param {boolean=} encrypted\n */\n constructor(uris, startByte, endByte, mediaQuality = null, timescale = null,\n segmentData = null, aesKey = null, encrypted = false) {\n /** @type {function(): !Array<string>} */\n this.getUris = uris;\n\n /** @const {number} */\n this.startByte = startByte;\n\n /** @const {?number} */\n this.endByte = endByte;\n\n /** @type {shaka.extern.MediaQualityInfo|null} */\n this.mediaQuality = mediaQuality;\n\n /** @type {number|null} */\n this.timescale = timescale;\n\n /** @type {BufferSource|null} */\n this.segmentData = segmentData;\n\n /** @type {?shaka.extern.aesKey} */\n this.aesKey = aesKey;\n\n /** @type {?string} */\n this.codecs = null;\n\n /** @type {?string} */\n this.mimeType = null;\n\n /** @type {?number} */\n this.boundaryEnd = null;\n\n /** @const {boolean} */\n this.encrypted = encrypted;\n }\n\n /**\n * Returns the offset from the start of the resource to the\n * start of the segment.\n *\n * @return {number}\n * @export\n */\n getStartByte() {\n return this.startByte;\n }\n\n /**\n * Returns the offset from the start of the resource to the end of the\n * segment, inclusive. A value of null indicates that the segment extends\n * to the end of the resource.\n *\n * @return {?number}\n * @export\n */\n getEndByte() {\n return this.endByte;\n }\n\n /**\n * Returns the size of the init segment.\n * @return {?number}\n */\n getSize() {\n if (this.endByte) {\n return this.endByte - this.startByte;\n } else {\n return null;\n }\n }\n\n /**\n * Returns media quality information for the segments associated with\n * this init segment.\n *\n * @return {?shaka.extern.MediaQualityInfo}\n */\n getMediaQuality() {\n return this.mediaQuality;\n }\n\n /**\n * Return the segment data.\n *\n * @return {?BufferSource}\n */\n getSegmentData() {\n return this.segmentData;\n }\n\n\n /**\n * Check if two initSegmentReference have all the same values.\n * @param {?shaka.media.InitSegmentReference} reference1\n * @param {?shaka.media.InitSegmentReference} reference2\n * @return {boolean}\n */\n static equal(reference1, reference2) {\n const ArrayUtils = shaka.util.ArrayUtils;\n const BufferUtils = shaka.util.BufferUtils;\n\n if (reference1 === reference2) {\n return true;\n } else if (!reference1 || !reference2) {\n return reference1 == reference2;\n } else {\n return reference1.getStartByte() == reference2.getStartByte() &&\n reference1.getEndByte() == reference2.getEndByte() &&\n ArrayUtils.equal(\n reference1.getUris().sort(), reference2.getUris().sort()) &&\n BufferUtils.equal(reference1.getSegmentData(),\n reference2.getSegmentData());\n }\n }\n};\n\n\n/**\n * SegmentReference provides the start time, end time, and location to a media\n * segment.\n *\n * @export\n */\nshaka.media.SegmentReference = class {\n /**\n * @param {number} startTime The segment's start time in seconds.\n * @param {number} endTime The segment's end time in seconds. The segment\n * ends the instant before this time, so |endTime| must be strictly greater\n * than |startTime|.\n * @param {function(): !Array<string>} uris\n * A function that creates the URIs of the resource containing the segment.\n * @param {number} startByte The offset from the start of the resource to the\n * start of the segment.\n * @param {?number} endByte The offset from the start of the resource to the\n * end of the segment, inclusive. A value of null indicates that the\n * segment extends to the end of the resource.\n * @param {shaka.media.InitSegmentReference} initSegmentReference\n * The segment's initialization segment metadata, or null if the segments\n * are self-initializing.\n * @param {number} timestampOffset\n * The amount of time, in seconds, that must be added to the segment's\n * internal timestamps to align it to the presentation timeline.\n * <br>\n * For DASH, this value should equal the Period start time minus the first\n * presentation timestamp of the first frame/sample in the Period. For\n * example, for MP4 based streams, this value should equal Period start\n * minus the first segment's tfdt box's 'baseMediaDecodeTime' field (after\n * it has been converted to seconds).\n * <br>\n * For HLS, this value should be the start time of the most recent\n * discontinuity, or 0 if there is no preceding discontinuity. Only used\n * in segments mode.\n * @param {number} appendWindowStart\n * The start of the append window for this reference, relative to the\n * presentation. Any content from before this time will be removed by\n * MediaSource.\n * @param {number} appendWindowEnd\n * The end of the append window for this reference, relative to the\n * presentation. Any content from after this time will be removed by\n * MediaSource.\n * @param {!Array<!shaka.media.SegmentReference>=} partialReferences\n * A list of SegmentReferences for the partial segments.\n * @param {?string=} tilesLayout\n * The value is a grid-item-dimension consisting of two positive decimal\n * integers in the format: column-x-row ('4x3'). It describes the\n * arrangement of Images in a Grid. The minimum valid LAYOUT is '1x1'.\n * @param {?number=} tileDuration\n * The explicit duration of an individual tile within the tiles grid.\n * If not provided, the duration should be automatically calculated based on\n * the duration of the reference.\n * @param {?number=} syncTime\n * A time value, expressed in seconds since 1970, which is used to\n * synchronize between streams. Both produced and consumed by the HLS\n * parser. Other components should not need this value.\n * @param {shaka.media.SegmentReference.Status=} status\n * The segment status is used to indicate that a segment does not exist or is\n * not available.\n * @param {?shaka.extern.aesKey=} aesKey\n * The segment's AES-128-CBC full segment encryption key and iv.\n * @param {boolean=} allPartialSegments\n * Indicate if the segment has all partial segments\n */\n constructor(\n startTime, endTime, uris, startByte, endByte, initSegmentReference,\n timestampOffset, appendWindowStart, appendWindowEnd,\n partialReferences = [], tilesLayout = '', tileDuration = null,\n syncTime = null, status = shaka.media.SegmentReference.Status.AVAILABLE,\n aesKey = null, allPartialSegments = false) {\n // A preload hinted Partial Segment has the same startTime and endTime.\n goog.asserts.assert(startTime <= endTime,\n 'startTime must be less than or equal to endTime');\n goog.asserts.assert((endByte == null) || (startByte < endByte),\n 'startByte must be < endByte');\n\n /** @type {number} */\n this.startTime = startTime;\n\n /** @type {number} */\n this.endTime = endTime;\n\n /**\n * The \"true\" end time of the segment, without considering the period end\n * time. This is necessary for thumbnail segments, where timing requires us\n * to know the original segment duration as described in the manifest.\n * @type {number}\n */\n this.trueEndTime = endTime;\n\n /** @type {function(): !Array<string>} */\n this.getUrisInner = uris;\n\n /** @const {number} */\n this.startByte = startByte;\n\n /** @const {?number} */\n this.endByte = endByte;\n\n /** @type {shaka.media.InitSegmentReference} */\n this.initSegmentReference = initSegmentReference;\n\n /** @type {number} */\n this.timestampOffset = timestampOffset;\n\n /** @type {number} */\n this.appendWindowStart = appendWindowStart;\n\n /** @type {number} */\n this.appendWindowEnd = appendWindowEnd;\n\n /** @type {!Array<!shaka.media.SegmentReference>} */\n this.partialReferences = partialReferences;\n\n /** @type {?string} */\n this.tilesLayout = tilesLayout;\n\n /** @type {?number} */\n this.tileDuration = tileDuration;\n\n /**\n * A time value, expressed in seconds since 1970, which is used to\n * synchronize between streams. Both produced and consumed by the HLS\n * parser. Other components should not need this value.\n *\n * @type {?number}\n */\n this.syncTime = syncTime;\n\n /** @type {shaka.media.SegmentReference.Status} */\n this.status = status;\n\n /** @type {boolean} */\n this.preload = false;\n\n /** @type {boolean} */\n this.independent = true;\n\n /** @type {boolean} */\n this.byterangeOptimization = false;\n\n /** @type {?shaka.extern.aesKey} */\n this.aesKey = aesKey;\n\n /** @type {?shaka.extern.ThumbnailSprite} */\n this.thumbnailSprite = null;\n\n /** @type {number} */\n this.discontinuitySequence = -1;\n\n /** @type {boolean} */\n this.allPartialSegments = allPartialSegments;\n\n /** @type {boolean} */\n this.partial = false;\n\n /** @type {boolean} */\n this.lastPartial = false;\n\n for (const partial of this.partialReferences) {\n partial.markAsPartial();\n }\n if (this.allPartialSegments && this.partialReferences.length) {\n const lastPartial =\n this.partialReferences[this.partialReferences.length - 1];\n lastPartial.markAsLastPartial();\n }\n\n /** @type {?string} */\n this.codecs = null;\n\n /** @type {?string} */\n this.mimeType = null;\n\n /** @type {?number} */\n this.bandwidth = null;\n\n /** @type {BufferSource|null} */\n this.segmentData = null;\n }\n\n /**\n * Creates and returns the URIs of the resource containing the segment.\n *\n * @return {!Array<string>}\n * @export\n */\n getUris() {\n return this.getUrisInner();\n }\n\n /**\n * Returns the segment's start time in seconds.\n *\n * @return {number}\n * @export\n */\n getStartTime() {\n return this.startTime;\n }\n\n /**\n * Returns the segment's end time in seconds.\n *\n * @return {number}\n * @export\n */\n getEndTime() {\n return this.endTime;\n }\n\n /**\n * Returns the offset from the start of the resource to the\n * start of the segment.\n *\n * @return {number}\n * @export\n */\n getStartByte() {\n return this.startByte;\n }\n\n /**\n * Returns the offset from the start of the resource to the end of the\n * segment, inclusive. A value of null indicates that the segment extends to\n * the end of the resource.\n *\n * @return {?number}\n * @export\n */\n getEndByte() {\n return this.endByte;\n }\n\n /**\n * Returns the size of the segment.\n * @return {?number}\n */\n getSize() {\n if (this.endByte) {\n return this.endByte - this.startByte;\n } else {\n return null;\n }\n }\n\n /**\n * Returns true if it contains partial SegmentReferences.\n * @return {boolean}\n */\n hasPartialSegments() {\n return this.partialReferences.length > 0;\n }\n\n /**\n * Returns true if it contains all partial SegmentReferences.\n * @return {boolean}\n */\n hasAllPartialSegments() {\n return this.allPartialSegments;\n }\n\n /**\n * Returns the segment's tiles layout. Only defined in image segments.\n *\n * @return {?string}\n * @export\n */\n getTilesLayout() {\n return this.tilesLayout;\n }\n\n /**\n * Returns the segment's explicit tile duration.\n * Only defined in image segments.\n *\n * @return {?number}\n * @export\n */\n getTileDuration() {\n return this.tileDuration;\n }\n\n /**\n * Returns the segment's status.\n *\n * @return {shaka.media.SegmentReference.Status}\n * @export\n */\n getStatus() {\n return this.status;\n }\n\n /**\n * Mark the reference as unavailable.\n *\n * @export\n */\n markAsUnavailable() {\n this.status = shaka.media.SegmentReference.Status.UNAVAILABLE;\n }\n\n /**\n * Mark the reference as preload.\n *\n * @export\n */\n markAsPreload() {\n this.preload = true;\n }\n\n /**\n * Returns true if the segment is preloaded.\n *\n * @return {boolean}\n * @export\n */\n isPreload() {\n return this.preload;\n }\n\n /**\n * Mark the reference as non-independent.\n *\n * @export\n */\n markAsNonIndependent() {\n this.independent = false;\n }\n\n /**\n * Returns true if the segment is independent.\n *\n * @return {boolean}\n * @export\n */\n isIndependent() {\n return this.independent;\n }\n\n /**\n * Mark the reference as partial.\n *\n * @export\n */\n markAsPartial() {\n this.partial = true;\n }\n\n /**\n * Returns true if the segment is partial.\n *\n * @return {boolean}\n * @export\n */\n isPartial() {\n return this.partial;\n }\n\n /**\n * Mark the reference as being the last part of the full segment\n *\n * @export\n */\n markAsLastPartial() {\n this.lastPartial = true;\n }\n\n /**\n * Returns true if reference as being the last part of the full segment.\n *\n * @return {boolean}\n * @export\n */\n isLastPartial() {\n return this.lastPartial;\n }\n\n /**\n * Mark the reference as byterange optimization.\n *\n * The \"byterange optimization\" means that it is playable using MP4 low\n * latency streaming with chunked data.\n *\n * @export\n */\n markAsByterangeOptimization() {\n this.byterangeOptimization = true;\n }\n\n /**\n * Returns true if the segment has a byterange optimization.\n *\n * @return {boolean}\n * @export\n */\n hasByterangeOptimization() {\n return this.byterangeOptimization;\n }\n\n /**\n * Set the segment's thumbnail sprite.\n *\n * @param {shaka.extern.ThumbnailSprite} thumbnailSprite\n * @export\n */\n setThumbnailSprite(thumbnailSprite) {\n this.thumbnailSprite = thumbnailSprite;\n }\n\n /**\n * Returns the segment's thumbnail sprite.\n *\n * @return {?shaka.extern.ThumbnailSprite}\n * @export\n */\n getThumbnailSprite() {\n return this.thumbnailSprite;\n }\n\n /**\n * Offset the segment reference by a fixed amount.\n *\n * @param {number} offset The amount to add to the segment's start and end\n * times.\n * @export\n */\n offset(offset) {\n this.startTime += offset;\n this.endTime += offset;\n this.trueEndTime += offset;\n\n for (const partial of this.partialReferences) {\n partial.startTime += offset;\n partial.endTime += offset;\n partial.trueEndTime += offset;\n }\n }\n\n /**\n * Sync this segment against a particular sync time that will serve as \"0\" in\n * the presentation timeline.\n *\n * @param {number} lowestSyncTime\n * @export\n */\n syncAgainst(lowestSyncTime) {\n if (this.syncTime == null) {\n shaka.log.alwaysError('Sync attempted without sync time!');\n return;\n }\n const desiredStart = this.syncTime - lowestSyncTime;\n const offset = desiredStart - this.startTime;\n if (Math.abs(offset) >= 0.001) {\n this.offset(offset);\n }\n }\n\n /**\n * Set the segment data.\n *\n * @param {!BufferSource} segmentData\n * @export\n */\n setSegmentData(segmentData) {\n this.segmentData = segmentData;\n }\n\n /**\n * Return the segment data.\n *\n * @return {?BufferSource}\n * @export\n */\n getSegmentData() {\n return this.segmentData;\n }\n\n /**\n * Updates the init segment reference and propagates the update to all partial\n * references.\n * @param {shaka.media.InitSegmentReference} initSegmentReference\n */\n updateInitSegmentReference(initSegmentReference) {\n this.initSegmentReference = initSegmentReference;\n for (const partialReference of this.partialReferences) {\n partialReference.updateInitSegmentReference(initSegmentReference);\n }\n }\n};\n\n\n/**\n * Rather than using booleans to communicate what the state of the reference,\n * we have this enum.\n *\n * @enum {number}\n * @export\n */\nshaka.media.SegmentReference.Status = {\n AVAILABLE: 0,\n UNAVAILABLE: 1,\n MISSING: 2,\n};\n\n\n/**\n * A convenient typedef for when either type of reference is acceptable.\n *\n * @typedef {shaka.media.InitSegmentReference|shaka.media.SegmentReference}\n */\nshaka.media.AnySegmentReference;\n\n\n/**\n * @typedef {{\n * height: number,\n * positionX: number,\n * positionY: number,\n * width: number\n * }}\n *\n * @property {number} height\n * The thumbnail height in px.\n * @property {number} positionX\n * The thumbnail left position in px.\n * @property {number} positionY\n * The thumbnail top position in px.\n * @property {number} width\n * The thumbnail width in px.\n * @export\n */\nshaka.media.SegmentReference.ThumbnailSprite;\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.abr.SimpleAbrManager');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.abr.EwmaBandwidthEstimator');\ngoog.require('shaka.log');\ngoog.require('shaka.util.EventManager');\ngoog.require('shaka.util.IReleasable');\ngoog.require('shaka.util.StreamUtils');\ngoog.require('shaka.util.Timer');\n\ngoog.requireType('shaka.util.CmsdManager');\n\n\n/**\n * @summary\n * <p>\n * This defines the default ABR manager for the Player. An instance of this\n * class is used when no ABR manager is given.\n * </p>\n * <p>\n * The behavior of this class is to take throughput samples using\n * segmentDownloaded to estimate the current network bandwidth. Then it will\n * use that to choose the streams that best fit the current bandwidth. It will\n * always pick the highest bandwidth variant it thinks can be played.\n * </p>\n * <p>\n * After initial choices are made, this class will call switchCallback() when\n * there is a better choice. switchCallback() will not be called more than once\n * per ({@link shaka.abr.SimpleAbrManager.SWITCH_INTERVAL_MS}).\n * </p>\n *\n * @implements {shaka.extern.AbrManager}\n * @implements {shaka.util.IReleasable}\n * @export\n */\nshaka.abr.SimpleAbrManager = class {\n /** */\n constructor() {\n /** @private {?shaka.extern.AbrManager.SwitchCallback} */\n this.switch_ = null;\n\n /** @private {boolean} */\n this.enabled_ = false;\n\n /** @private {shaka.abr.EwmaBandwidthEstimator} */\n this.bandwidthEstimator_ = new shaka.abr.EwmaBandwidthEstimator();\n\n /** @private {!shaka.util.EventManager} */\n this.eventManager_ = new shaka.util.EventManager();\n\n // Some browsers implement the Network Information API, which allows\n // retrieving information about a user's network connection. We listen\n // to the change event to be able to make quick changes in case the type\n // of connectivity changes.\n if (navigator.connection && navigator.connection.addEventListener) {\n this.eventManager_.listen(\n /** @type {EventTarget} */(navigator.connection),\n 'change',\n () => {\n if (this.enabled_ && this.config_.useNetworkInformation) {\n this.bandwidthEstimator_ = new shaka.abr.EwmaBandwidthEstimator();\n if (this.config_) {\n this.bandwidthEstimator_.configure(this.config_.advanced);\n }\n const chosenVariant = this.chooseVariant();\n if (chosenVariant && navigator.onLine) {\n this.switch_(chosenVariant, this.config_.clearBufferSwitch,\n this.config_.safeMarginSwitch);\n }\n }\n });\n }\n\n /**\n * A filtered list of Variants to choose from.\n * @private {!Array<!shaka.extern.Variant>}\n */\n this.variants_ = [];\n\n /** @private {number} */\n this.playbackRate_ = 1;\n\n /** @private {boolean} */\n this.startupComplete_ = false;\n\n /**\n * The last wall-clock time, in milliseconds, when streams were chosen.\n *\n * @private {?number}\n */\n this.lastTimeChosenMs_ = null;\n\n /** @private {?shaka.extern.AbrConfiguration} */\n this.config_ = null;\n\n /** @private {HTMLMediaElement} */\n this.mediaElement_ = null;\n\n /** @private {ResizeObserver} */\n this.resizeObserver_ = null;\n\n /** @private {shaka.util.Timer} */\n this.resizeObserverTimer_ = new shaka.util.Timer(() => {\n if (this.enabled_ && (this.config_.restrictToElementSize ||\n this.config_.restrictToScreenSize)) {\n const chosenVariant = this.chooseVariant();\n if (chosenVariant) {\n this.switch_(chosenVariant, this.config_.clearBufferSwitch,\n this.config_.safeMarginSwitch);\n }\n }\n });\n\n /** @private {Window} */\n this.windowToCheck_ = window;\n\n if ('documentPictureInPicture' in window) {\n this.eventManager_.listen(\n window.documentPictureInPicture, 'enter', () => {\n this.windowToCheck_ = window.documentPictureInPicture.window;\n if (this.resizeObserverTimer_) {\n this.resizeObserverTimer_.tickNow();\n }\n this.eventManager_.listenOnce(\n this.windowToCheck_, 'pagehide', () => {\n this.windowToCheck_ = window;\n if (this.resizeObserverTimer_) {\n this.resizeObserverTimer_.tickNow();\n }\n });\n });\n }\n\n /** @private {PictureInPictureWindow} */\n this.pictureInPictureWindow_ = null;\n\n /** @private {?shaka.util.CmsdManager} */\n this.cmsdManager_ = null;\n }\n\n\n /**\n * @override\n * @export\n */\n stop() {\n this.switch_ = null;\n this.enabled_ = false;\n this.variants_ = [];\n this.playbackRate_ = 1;\n this.lastTimeChosenMs_ = null;\n this.mediaElement_ = null;\n\n if (this.resizeObserver_) {\n this.resizeObserver_.disconnect();\n this.resizeObserver_ = null;\n }\n\n this.resizeObserverTimer_.stop();\n\n this.pictureInPictureWindow_ = null;\n\n this.cmsdManager_ = null;\n\n // Don't reset |startupComplete_|: if we've left the startup interval, we\n // can start using bandwidth estimates right away after init() is called.\n }\n\n /**\n * @override\n * @export\n */\n release() {\n // stop() should already have been called for unload\n this.eventManager_.release();\n this.resizeObserverTimer_ = null;\n }\n\n\n /**\n * @override\n * @export\n */\n init(switchCallback) {\n this.switch_ = switchCallback;\n }\n\n\n /**\n * @return {shaka.extern.Variant}\n * @override\n * @export\n */\n chooseVariant() {\n let maxHeight = Infinity;\n let maxWidth = Infinity;\n\n if (this.config_.restrictToScreenSize) {\n const devicePixelRatio = this.config_.ignoreDevicePixelRatio ?\n 1 : this.windowToCheck_.devicePixelRatio;\n maxHeight = this.windowToCheck_.screen.height * devicePixelRatio;\n maxWidth = this.windowToCheck_.screen.width * devicePixelRatio;\n }\n\n if (this.resizeObserver_ && this.config_.restrictToElementSize) {\n const devicePixelRatio = this.config_.ignoreDevicePixelRatio ?\n 1 : this.windowToCheck_.devicePixelRatio;\n let height = this.mediaElement_.clientHeight;\n let width = this.mediaElement_.clientWidth;\n if (this.pictureInPictureWindow_ && document.pictureInPictureElement &&\n document.pictureInPictureElement == this.mediaElement_) {\n height = this.pictureInPictureWindow_.height;\n width = this.pictureInPictureWindow_.width;\n }\n maxHeight = Math.min(maxHeight, height * devicePixelRatio);\n maxWidth = Math.min(maxWidth, width * devicePixelRatio);\n }\n\n let normalVariants = this.variants_.filter((variant) => {\n return variant && !shaka.util.StreamUtils.isFastSwitching(variant);\n });\n if (!normalVariants.length) {\n normalVariants = this.variants_;\n }\n\n let variants = normalVariants;\n if (normalVariants.length != this.variants_.length) {\n variants = this.variants_.filter((variant) => {\n return variant && shaka.util.StreamUtils.isFastSwitching(variant);\n });\n }\n\n // Get sorted Variants.\n let sortedVariants = this.filterAndSortVariants_(\n this.config_.restrictions, variants,\n /* maxHeight= */ Infinity, /* maxWidth= */ Infinity);\n\n if (maxHeight != Infinity || maxWidth != Infinity) {\n const resolutions = this.getResolutionList_(sortedVariants);\n for (const resolution of resolutions) {\n if (resolution.height >= maxHeight && resolution.width >= maxWidth) {\n maxHeight = resolution.height;\n maxWidth = resolution.width;\n break;\n }\n }\n\n sortedVariants = this.filterAndSortVariants_(\n this.config_.restrictions, variants, maxHeight, maxWidth);\n }\n\n const currentBandwidth = this.getBandwidthEstimate();\n\n if (variants.length && !sortedVariants.length) {\n // If we couldn't meet the ABR restrictions, we should still play\n // something.\n // These restrictions are not \"hard\" restrictions in the way that\n // top-level or DRM-based restrictions are. Sort the variants without\n // restrictions and keep just the first (lowest-bandwidth) one.\n shaka.log.warning('No variants met the ABR restrictions. ' +\n 'Choosing a variant by lowest bandwidth.');\n sortedVariants = this.filterAndSortVariants_(\n /* restrictions= */ null, variants,\n /* maxHeight= */ Infinity, /* maxWidth= */ Infinity);\n sortedVariants = [sortedVariants[0]];\n }\n\n // Start by assuming that we will use the first Stream.\n let chosen = sortedVariants[0] || null;\n\n for (let i = 0; i < sortedVariants.length; i++) {\n const item = sortedVariants[i];\n const playbackRate =\n !isNaN(this.playbackRate_) ? Math.abs(this.playbackRate_) : 1;\n const itemBandwidth = playbackRate * item.bandwidth;\n const minBandwidth =\n itemBandwidth / this.config_.bandwidthDowngradeTarget;\n let next = {bandwidth: Infinity};\n for (let j = i + 1; j < sortedVariants.length; j++) {\n if (item.bandwidth != sortedVariants[j].bandwidth) {\n next = sortedVariants[j];\n break;\n }\n }\n const nextBandwidth = playbackRate * next.bandwidth;\n const maxBandwidth = nextBandwidth / this.config_.bandwidthUpgradeTarget;\n shaka.log.v2('Bandwidth ranges:',\n (itemBandwidth / 1e6).toFixed(3),\n (minBandwidth / 1e6).toFixed(3),\n (maxBandwidth / 1e6).toFixed(3));\n\n if (currentBandwidth >= minBandwidth &&\n currentBandwidth <= maxBandwidth &&\n (chosen.bandwidth != item.bandwidth ||\n this.isSameBandwidthAndHigherResolution_(chosen, item))) {\n chosen = item;\n }\n }\n\n this.lastTimeChosenMs_ = Date.now();\n return chosen;\n }\n\n\n /**\n * @override\n * @export\n */\n enable() {\n this.enabled_ = true;\n }\n\n\n /**\n * @override\n * @export\n */\n disable() {\n this.enabled_ = false;\n }\n\n\n /**\n * @param {number} deltaTimeMs The duration, in milliseconds, that the request\n * took to complete.\n * @param {number} numBytes The total number of bytes transferred.\n * @param {boolean} allowSwitch Indicate if the segment is allowed to switch\n * to another stream.\n * @param {shaka.extern.Request=} request\n * A reference to the request\n * @override\n * @export\n */\n segmentDownloaded(deltaTimeMs, numBytes, allowSwitch, request) {\n if (deltaTimeMs < this.config_.cacheLoadThreshold) {\n // The time indicates that it could be a cache response, so we should\n // ignore this value.\n return;\n }\n shaka.log.v2('Segment downloaded:',\n 'contentType=' + (request && request.contentType),\n 'deltaTimeMs=' + deltaTimeMs,\n 'numBytes=' + numBytes,\n 'lastTimeChosenMs=' + this.lastTimeChosenMs_,\n 'enabled=' + this.enabled_);\n goog.asserts.assert(deltaTimeMs >= 0, 'expected a non-negative duration');\n this.bandwidthEstimator_.sample(deltaTimeMs, numBytes);\n\n if (allowSwitch && (this.lastTimeChosenMs_ != null) && this.enabled_) {\n this.suggestStreams_();\n }\n }\n\n\n /**\n * @override\n * @export\n */\n trySuggestStreams() {\n if ((this.lastTimeChosenMs_ != null) && this.enabled_) {\n this.suggestStreams_();\n }\n }\n\n\n /**\n * @override\n * @export\n */\n getBandwidthEstimate() {\n const defaultBandwidthEstimate = this.getDefaultBandwidth_();\n if (navigator.connection && navigator.connection.downlink &&\n this.config_.useNetworkInformation &&\n this.config_.preferNetworkInformationBandwidth) {\n return defaultBandwidthEstimate;\n }\n const bandwidthEstimate = this.bandwidthEstimator_.getBandwidthEstimate(\n defaultBandwidthEstimate);\n if (this.cmsdManager_) {\n return this.cmsdManager_.getBandwidthEstimate(bandwidthEstimate);\n }\n return bandwidthEstimate;\n }\n\n\n /**\n * @override\n * @export\n */\n setVariants(variants) {\n this.variants_ = variants;\n }\n\n\n /**\n * @override\n * @export\n */\n playbackRateChanged(rate) {\n this.playbackRate_ = rate;\n }\n\n\n /**\n * @override\n * @export\n */\n setMediaElement(mediaElement) {\n this.mediaElement_ = mediaElement;\n if (this.resizeObserver_) {\n this.resizeObserver_.disconnect();\n this.resizeObserver_ = null;\n }\n const onResize = () => {\n const SimpleAbrManager = shaka.abr.SimpleAbrManager;\n // Batch up resize changes before checking them.\n this.resizeObserverTimer_.tickAfter(\n /* seconds= */ SimpleAbrManager.RESIZE_OBSERVER_BATCH_TIME);\n };\n if (this.mediaElement_ && 'ResizeObserver' in window) {\n this.resizeObserver_ = new ResizeObserver(onResize);\n this.resizeObserver_.observe(this.mediaElement_);\n }\n\n this.eventManager_.listen(mediaElement, 'enterpictureinpicture', (e) => {\n const event = /** @type {PictureInPictureEvent} */(e);\n if (event.pictureInPictureWindow) {\n this.pictureInPictureWindow_ = event.pictureInPictureWindow;\n this.eventManager_.listen(\n this.pictureInPictureWindow_, 'resize', onResize);\n }\n });\n this.eventManager_.listen(mediaElement, 'leavepictureinpicture', () => {\n if (this.pictureInPictureWindow_) {\n this.eventManager_.unlisten(\n this.pictureInPictureWindow_, 'resize', onResize);\n }\n this.pictureInPictureWindow_ = null;\n });\n }\n\n\n /**\n * @override\n * @export\n */\n setCmsdManager(cmsdManager) {\n this.cmsdManager_ = cmsdManager;\n }\n\n\n /**\n * @override\n * @export\n */\n configure(config) {\n this.config_ = config;\n if (this.bandwidthEstimator_ && this.config_) {\n this.bandwidthEstimator_.configure(this.config_.advanced);\n }\n }\n\n\n /**\n * Calls switch_() with the variant chosen by chooseVariant().\n *\n * @private\n */\n suggestStreams_() {\n shaka.log.v2('Suggesting Streams...');\n goog.asserts.assert(this.lastTimeChosenMs_ != null,\n 'lastTimeChosenMs_ should not be null');\n\n if (!this.startupComplete_) {\n // Check if we've got enough data yet.\n if (!this.bandwidthEstimator_.hasGoodEstimate()) {\n shaka.log.v2('Still waiting for a good estimate...');\n return;\n }\n this.startupComplete_ = true;\n\n this.lastTimeChosenMs_ -=\n (this.config_.switchInterval - this.config_.minTimeToSwitch) * 1000;\n }\n\n // Check if we've left the switch interval.\n const now = Date.now();\n const delta = now - this.lastTimeChosenMs_;\n if (delta < this.config_.switchInterval * 1000) {\n shaka.log.v2('Still within switch interval...');\n return;\n }\n\n const chosenVariant = this.chooseVariant();\n const bandwidthEstimate = this.getBandwidthEstimate();\n const currentBandwidthKbps = Math.round(bandwidthEstimate / 1000.0);\n\n if (chosenVariant) {\n shaka.log.debug(\n 'Calling switch_(), bandwidth=' + currentBandwidthKbps + ' kbps');\n // If any of these chosen streams are already chosen, Player will filter\n // them out before passing the choices on to StreamingEngine.\n this.switch_(chosenVariant, this.config_.clearBufferSwitch,\n this.config_.safeMarginSwitch);\n }\n }\n\n\n /**\n * @private\n */\n getDefaultBandwidth_() {\n let defaultBandwidthEstimate = this.config_.defaultBandwidthEstimate;\n\n // Some browsers implement the Network Information API, which allows\n // retrieving information about a user's network connection. Tizen 3 has\n // NetworkInformation, but not the downlink attribute.\n if (navigator.connection && navigator.connection.downlink &&\n this.config_.useNetworkInformation) {\n // If it's available, get the bandwidth estimate from the browser (in\n // megabits per second) and use it as defaultBandwidthEstimate.\n defaultBandwidthEstimate = navigator.connection.downlink * 1e6;\n }\n return defaultBandwidthEstimate;\n }\n\n\n /**\n * @param {?shaka.extern.Restrictions} restrictions\n * @param {!Array<shaka.extern.Variant>} variants\n * @param {!number} maxHeight\n * @param {!number} maxWidth\n * @return {!Array<shaka.extern.Variant>} variants filtered according to\n * |restrictions| and sorted in ascending order of bandwidth.\n * @private\n */\n filterAndSortVariants_(restrictions, variants, maxHeight, maxWidth) {\n if (this.cmsdManager_) {\n const maxBitrate = this.cmsdManager_.getMaxBitrate();\n if (maxBitrate) {\n variants = variants.filter((variant) => {\n if (!variant.bandwidth || !maxBitrate) {\n return true;\n }\n return variant.bandwidth <= maxBitrate;\n });\n }\n }\n\n if (restrictions) {\n variants = variants.filter((variant) => {\n // This was already checked in another scope, but the compiler doesn't\n // seem to understand that.\n goog.asserts.assert(restrictions, 'Restrictions should exist!');\n\n return shaka.util.StreamUtils.meetsRestrictions(\n variant, restrictions,\n /* maxHwRes= */ {width: maxWidth, height: maxHeight});\n });\n }\n\n return variants.sort((v1, v2) => {\n return v1.bandwidth - v2.bandwidth;\n });\n }\n\n /**\n * @param {!Array<shaka.extern.Variant>} variants\n * @return {!Array<{height: number, width: number}>}\n * @private\n */\n getResolutionList_(variants) {\n const resolutions = [];\n for (const variant of variants) {\n const video = variant.video;\n if (!video || !video.height || !video.width) {\n continue;\n }\n resolutions.push({\n height: video.height,\n width: video.width,\n });\n }\n\n return resolutions.sort((v1, v2) => {\n return v1.width - v2.width;\n });\n }\n\n /**\n * @param {shaka.extern.Variant} chosenVariant\n * @param {shaka.extern.Variant} newVariant\n * @return {boolean}\n * @private\n */\n isSameBandwidthAndHigherResolution_(chosenVariant, newVariant) {\n if (chosenVariant.bandwidth != newVariant.bandwidth) {\n return false;\n }\n if (!chosenVariant.video || !newVariant.video) {\n return false;\n }\n return chosenVariant.video.width < newVariant.video.width ||\n chosenVariant.video.height < newVariant.video.height;\n }\n};\n\n\n/**\n * The amount of time, in seconds, we wait to batch up rapid resize changes.\n * This allows us to avoid multiple resize events in most cases.\n * @type {number}\n */\nshaka.abr.SimpleAbrManager.RESIZE_OBSERVER_BATCH_TIME = 1;\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.net.Backoff');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.Timer');\n\n\n/**\n * Backoff represents delay and backoff state. This is used by NetworkingEngine\n * for individual requests and by StreamingEngine to retry streaming failures.\n *\n * @final\n */\nshaka.net.Backoff = class {\n /**\n * @param {shaka.extern.RetryParameters} parameters\n * @param {boolean=} autoReset If true, start at a \"first retry\" state and\n * and auto-reset that state when we reach maxAttempts.\n * Default set to false.\n */\n constructor(parameters, autoReset = false) {\n // Set defaults as we unpack these, so that individual app-level requests in\n // NetworkingEngine can be missing parameters.\n\n const defaults = shaka.net.Backoff.defaultRetryParameters();\n\n /**\n * @const\n * @private {number}\n */\n this.maxAttempts_ = (parameters.maxAttempts == null) ?\n defaults.maxAttempts : parameters.maxAttempts;\n\n goog.asserts.assert(this.maxAttempts_ >= 1, 'maxAttempts should be >= 1');\n\n /**\n * @const\n * @private {number}\n */\n this.baseDelay_ = (parameters.baseDelay == null) ?\n defaults.baseDelay : parameters.baseDelay;\n\n goog.asserts.assert(this.baseDelay_ >= 0, 'baseDelay should be >= 0');\n\n /**\n * @const\n * @private {number}\n */\n this.fuzzFactor_ = (parameters.fuzzFactor == null) ?\n defaults.fuzzFactor : parameters.fuzzFactor;\n\n goog.asserts.assert(this.fuzzFactor_ >= 0, 'fuzzFactor should be >= 0');\n\n /**\n * @const\n * @private {number}\n */\n this.backoffFactor_ = (parameters.backoffFactor == null) ?\n defaults.backoffFactor : parameters.backoffFactor;\n\n goog.asserts.assert(\n this.backoffFactor_ >= 0, 'backoffFactor should be >= 0');\n\n /** @private {number} */\n this.numAttempts_ = 0;\n\n /** @private {number} */\n this.nextUnfuzzedDelay_ = this.baseDelay_;\n\n /** @private {boolean} */\n this.autoReset_ = autoReset;\n\n if (this.autoReset_) {\n // There is no delay before the first attempt. In StreamingEngine (the\n // intended user of auto-reset mode), the first attempt was implied, so we\n // reset numAttempts to 1. Therefore maxAttempts (which includes the\n // first attempt) must be at least 2 for us to see a delay.\n goog.asserts.assert(this.maxAttempts_ >= 2,\n 'maxAttempts must be >= 2 for autoReset == true');\n this.numAttempts_ = 1;\n }\n }\n\n /**\n * @return {!Promise} Resolves when the caller may make an attempt, possibly\n * after a delay. Rejects if no more attempts are allowed.\n */\n async attempt() {\n if (this.numAttempts_ >= this.maxAttempts_) {\n if (this.autoReset_) {\n this.reset_();\n } else {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.PLAYER,\n shaka.util.Error.Code.ATTEMPTS_EXHAUSTED);\n }\n }\n\n const currentAttempt = this.numAttempts_;\n this.numAttempts_++;\n\n if (currentAttempt == 0) {\n goog.asserts.assert(!this.autoReset_, 'Failed to delay with auto-reset!');\n return;\n }\n\n // We've already tried before, so delay the Promise.\n\n // Fuzz the delay to avoid tons of clients hitting the server at once\n // after it recovers from whatever is causing it to fail.\n const fuzzedDelayMs = shaka.net.Backoff.fuzz_(\n this.nextUnfuzzedDelay_, this.fuzzFactor_);\n\n await new Promise((resolve) => {\n shaka.net.Backoff.defer(fuzzedDelayMs, resolve);\n });\n\n // Update delay_ for next time.\n this.nextUnfuzzedDelay_ *= this.backoffFactor_;\n }\n\n /**\n * Gets a copy of the default retry parameters.\n *\n * @return {shaka.extern.RetryParameters}\n */\n static defaultRetryParameters() {\n // Use a function rather than a constant member so the calling code can\n // modify the values without affecting other call results.\n return {\n maxAttempts: 2,\n baseDelay: 1000,\n backoffFactor: 2,\n fuzzFactor: 0.5,\n timeout: 30000,\n stallTimeout: 5000,\n connectionTimeout: 10000,\n };\n }\n\n /**\n * Fuzz the input value by +/- fuzzFactor. For example, a fuzzFactor of 0.5\n * will create a random value that is between 50% and 150% of the input value.\n *\n * @param {number} value\n * @param {number} fuzzFactor\n * @return {number} The fuzzed value\n * @private\n */\n static fuzz_(value, fuzzFactor) {\n // A random number between -1 and +1.\n const negToPosOne = (Math.random() * 2.0) - 1.0;\n\n // A random number between -fuzzFactor and +fuzzFactor.\n const negToPosFuzzFactor = negToPosOne * fuzzFactor;\n\n // The original value, fuzzed by +/- fuzzFactor.\n return value * (1.0 + negToPosFuzzFactor);\n }\n\n /**\n * Reset state in autoReset mode.\n * @private\n */\n reset_() {\n goog.asserts.assert(this.autoReset_, 'Should only be used for auto-reset!');\n this.numAttempts_ = 1;\n this.nextUnfuzzedDelay_ = this.baseDelay_;\n }\n\n /**\n * This method is only public for testing. It allows us to intercept the\n * time-delay call.\n *\n * @param {number} delayInMs\n * @param {function()} callback\n */\n static defer(delayInMs, callback) {\n const timer = new shaka.util.Timer(callback);\n timer.tickAfter(delayInMs / 1000);\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.PublicPromise');\n\n\n/**\n * @summary\n * A utility to create Promises with convenient public resolve and reject\n * methods.\n *\n * @extends {Promise<T>}\n * @template T\n */\nshaka.util.PublicPromise = class {\n /**\n * @return {!Promise<T>}\n */\n constructor() {\n let resolvePromise;\n let rejectPromise;\n\n // Promise.call causes an error. It seems that inheriting from a native\n // Promise is not permitted by JavaScript interpreters.\n\n // The work-around is to construct a Promise object, modify it to look like\n // the compiler's picture of PublicPromise, then return it. The caller of\n // new PublicPromise will receive |promise| instead of |this|, and the\n // compiler will be aware of the additional properties |resolve| and\n // |reject|.\n\n const promise = new Promise(((resolve, reject) => {\n resolvePromise = resolve;\n rejectPromise = reject;\n }));\n\n // Now cast the Promise object to our subclass PublicPromise so that the\n // compiler will permit us to attach resolve() and reject() to it.\n const publicPromise = /** @type {shaka.util.PublicPromise} */(promise);\n publicPromise.resolve = resolvePromise;\n publicPromise.reject = rejectPromise;\n\n return publicPromise;\n }\n\n\n /** @param {T=} value */\n resolve(value) {}\n\n\n /** @param {*=} reason */\n reject(reason) {}\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.AbortableOperation');\n\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.PublicPromise');\n\n/**\n * A utility to wrap abortable operations. Note that these are not cancelable.\n * Cancellation implies undoing what has been done so far, whereas aborting only\n * means that further work is stopped.\n *\n * @implements {shaka.extern.IAbortableOperation<T>}\n * @template T\n * @export\n */\nshaka.util.AbortableOperation = class {\n /**\n * @param {!Promise<T>} promise\n * A Promise which represents the underlying operation. It is resolved when\n * the operation is complete, and rejected if the operation fails or is\n * aborted. Aborted operations should be rejected with a shaka.util.Error\n * object using the error code OPERATION_ABORTED.\n * @param {function():!Promise} onAbort\n * Will be called by this object to abort the underlying operation.\n * This is not cancellation, and will not necessarily result in any work\n * being undone. abort() should return a Promise which is resolved when the\n * underlying operation has been aborted. The returned Promise should never\n * be rejected.\n */\n constructor(promise, onAbort) {\n /** @const {!Promise<T>} */\n this.promise = promise;\n\n /** @private {function():!Promise} */\n this.onAbort_ = onAbort;\n\n /** @private {?Promise} */\n this.abortPromise_ = null;\n }\n\n /**\n * @return {boolean} True if the operation has been aborted.\n * @export\n */\n get aborted() {\n return this.abortPromise_ !== null;\n }\n\n /**\n * @param {!shaka.util.Error} error\n * @return {!shaka.util.AbortableOperation} An operation which has already\n * failed with the error given by the caller.\n * @export\n */\n static failed(error) {\n return new shaka.util.AbortableOperation(\n Promise.reject(error),\n () => Promise.resolve());\n }\n\n /**\n * @return {!shaka.util.AbortableOperation} An operation which has already\n * failed with the error OPERATION_ABORTED.\n * @export\n */\n static aborted() {\n const p = Promise.reject(shaka.util.AbortableOperation.abortError());\n // Silence uncaught rejection errors, which may otherwise occur any place\n // we don't explicitly handle aborted operations.\n p.catch(() => {});\n return new shaka.util.AbortableOperation(p, () => Promise.resolve());\n }\n\n /** @return {!shaka.util.Error} */\n static abortError() {\n return new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.PLAYER,\n shaka.util.Error.Code.OPERATION_ABORTED);\n }\n\n /**\n * @param {U} value\n * @return {!shaka.util.AbortableOperation.<U>} An operation which has already\n * completed with the given value.\n * @template U\n * @export\n */\n static completed(value) {\n return new shaka.util.AbortableOperation(\n Promise.resolve(value),\n () => Promise.resolve());\n }\n\n /**\n * @param {!Promise<U>} promise\n * @return {!shaka.util.AbortableOperation.<U>} An operation which cannot be\n * aborted. It will be completed when the given Promise is resolved, or\n * will be failed when the given Promise is rejected.\n * @template U\n * @export\n */\n static notAbortable(promise) {\n return new shaka.util.AbortableOperation(\n promise,\n // abort() here will return a Promise which is resolved when the input\n // promise either resolves or fails.\n () => promise.catch(() => {}));\n }\n\n /**\n * @override\n * @export\n */\n abort() {\n if (!this.abortPromise_) {\n this.abortPromise_ = this.onAbort_();\n }\n return this.abortPromise_;\n }\n\n /**\n * @param {!Array<!shaka.util.AbortableOperation>} operations\n * @return {!shaka.util.AbortableOperation} An operation which is resolved\n * when all operations are successful and fails when any operation fails.\n * For this operation, abort() aborts all given operations.\n * @export\n */\n static all(operations) {\n return new shaka.util.AbortableOperation(\n Promise.all(operations.map((op) => op.promise)),\n () => Promise.all(operations.map((op) => op.abort())));\n }\n\n /**\n * @override\n * @export\n */\n finally(onFinal) {\n this.promise.then((value) => onFinal(true), (e) => onFinal(false));\n return this;\n }\n\n /**\n * @param {(undefined|\n * function(T):U|\n * function(T):!Promise<U>|\n * function(T):!shaka.util.AbortableOperation.<U>)} onSuccess\n * A callback to be invoked after this operation is complete, to chain to\n * another operation. The callback can return a plain value, a Promise to\n * an asynchronous value, or another AbortableOperation.\n * @param {function(*)=} onError\n * An optional callback to be invoked if this operation fails, to perform\n * some cleanup or error handling. Analogous to the second parameter of\n * Promise.prototype.then.\n * @return {!shaka.util.AbortableOperation.<U>} An operation which is resolved\n * when this operation and the operation started by the callback are both\n * complete.\n * @template U\n * @export\n */\n chain(onSuccess, onError) {\n const newPromise = new shaka.util.PublicPromise();\n // Silence uncaught rejection errors, which may otherwise occur any place\n // we don't explicitly handle aborted operations.\n newPromise.catch(() => {});\n const abortError = shaka.util.AbortableOperation.abortError();\n\n // If called before \"this\" completes, just abort \"this\".\n let abort = () => {\n newPromise.reject(abortError);\n return this.abort();\n };\n\n const makeCallback = (isSuccess) => {\n return (value) => {\n if (this.abortPromise_ && isSuccess) {\n // If \"this\" is not abortable(), or if abort() is called after \"this\"\n // is complete but before the next stage in the chain begins, we\n // should stop right away.\n newPromise.reject(abortError);\n return;\n }\n\n const cb = isSuccess ? onSuccess : onError;\n if (!cb) {\n // No callback? Pass it along.\n const next = isSuccess ? newPromise.resolve : newPromise.reject;\n next(value);\n return;\n }\n\n // Call the callback, interpret the return value, set the Promise state,\n // and get the next abort function.\n abort = shaka.util.AbortableOperation.wrapChainCallback_(\n cb, value, newPromise);\n };\n };\n this.promise.then(makeCallback(true), makeCallback(false));\n\n return new shaka.util.AbortableOperation(\n newPromise,\n // By creating a closure around abort(), we can update the value of\n // abort() at various stages.\n () => abort());\n }\n\n /**\n * @param {(function(T):U|\n * function(T):!Promise<U>|\n * function(T):!shaka.util.AbortableOperation.<U>|\n * function(*))} callback\n * A callback to be invoked with the given value.\n * @param {T} value\n * @param {!shaka.util.PublicPromise} newPromise The promise for the next\n * stage in the chain.\n * @return {function():!Promise} The next abort() function for the chain.\n * @private\n * @template T, U\n */\n static wrapChainCallback_(callback, value, newPromise) {\n try {\n const ret = callback(value);\n\n if (ret && ret.promise && ret.abort) {\n // This is an abortable operation, with its own abort() method.\n // After this point, abort() should abort the operation from the\n // callback, and the new promise should be tied to the promise\n // from the callback's operation.\n newPromise.resolve(ret.promise);\n // This used to say \"return ret.abort;\", but it caused subtle issues by\n // unbinding part of the abort chain. There is now a test to ensure\n // that we don't call abort with the wrong \"this\".\n return () => ret.abort();\n } else {\n // This is a Promise or a plain value, and this step cannot be aborted.\n newPromise.resolve(ret);\n // Abort is complete when the returned value/Promise is resolved or\n // fails, but never fails itself nor returns a value.\n return () => Promise.resolve(ret).then(() => {}, () => {});\n }\n } catch (exception) {\n // The callback threw an exception or error. Reject the new Promise and\n // resolve any future abort call right away.\n newPromise.reject(exception);\n return () => Promise.resolve();\n }\n }\n};\n\n/**\n * @const {!Promise<T>}\n * @exportInterface\n */\n// eslint-disable-next-line no-restricted-syntax\nshaka.util.AbortableOperation.prototype.promise;\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.FakeEvent');\n\ngoog.require('goog.asserts');\n\n\n/**\n * @summary Create an Event work-alike object based on the provided dictionary.\n * The event should contain all of the same properties from the dict.\n *\n * @extends {Event}\n * @export\n */\nshaka.util.FakeEvent = class {\n /**\n * @param {!Event} event\n * @return {!shaka.util.FakeEvent}\n */\n static fromRealEvent(event) {\n const fakeEvent = new shaka.util.FakeEvent(event.type);\n for (const key in event) {\n Object.defineProperty(fakeEvent, key, {\n value: event[key],\n writable: true,\n enumerable: true,\n });\n }\n return fakeEvent;\n }\n\n /**\n * Allows us to tell the compiler that the dictionary \"map\" is actually a\n * generic object, for backwards compatibility.\n * @param {!Map<string, Object>} dict\n * @return {!Object}\n * @suppress {invalidCasts}\n * @private\n */\n static recastDictAsObject_(dict) {\n goog.asserts.assert(!(dict instanceof Map), 'dict should not be a map');\n return /** @type {!Object} */ (dict);\n }\n\n /**\n * @param {string} type\n * @param {Map<string, Object>=} dict\n */\n constructor(type, dict) {\n if (dict) {\n if (dict instanceof Map) {\n // Take properties from dict if present.\n for (const key of dict.keys()) {\n Object.defineProperty(this, key, {\n value: dict.get(key),\n writable: true,\n enumerable: true,\n });\n }\n } else {\n // For backwards compatibility with external apps that may make use of\n // this public constructor, this should still accept generic objects.\n const obj = shaka.util.FakeEvent.recastDictAsObject_(dict);\n for (const key in obj) {\n Object.defineProperty(this, key, {\n value: obj[key],\n writable: true,\n enumerable: true,\n });\n }\n }\n }\n\n // The properties below cannot be set by the dict. They are all provided\n // for compatibility with native events.\n\n /** @const {boolean} */\n this.bubbles = false;\n\n /** @type {boolean} */\n this.cancelable = false;\n\n /** @type {boolean} */\n this.defaultPrevented = false;\n\n /**\n * According to MDN, Chrome uses high-res timers instead of epoch time.\n * Follow suit so that timeStamps on FakeEvents use the same base as\n * on native Events.\n * @const {number}\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Event/timeStamp\n */\n this.timeStamp = window.performance && window.performance.now ?\n window.performance.now() : Date.now();\n\n /** @const {string} */\n this.type = type;\n\n /** @const {boolean} */\n this.isTrusted = false;\n\n /** @type {EventTarget} */\n this.currentTarget = null;\n\n /** @type {EventTarget} */\n this.target = null;\n\n /**\n * Non-standard property read by FakeEventTarget to stop processing\n * listeners.\n * @type {boolean}\n */\n this.stopped = false;\n }\n\n /**\n * Prevents the default action of the event. Has no effect if the event isn't\n * cancellable.\n * @override\n */\n preventDefault() {\n if (this.cancelable) {\n this.defaultPrevented = true;\n }\n }\n\n /**\n * Stops processing event listeners for this event. Provided for\n * compatibility with native Events.\n * @override\n */\n stopImmediatePropagation() {\n this.stopped = true;\n }\n\n /**\n * Does nothing, since FakeEvents do not bubble. Provided for compatibility\n * with native Events.\n * @override\n */\n stopPropagation() {}\n};\n\n\n/**\n * An internal enum that contains the string values of all of the player events.\n * This exists primarily to act as an implicit list of events, for tests.\n *\n * @enum {string}\n */\nshaka.util.FakeEvent.EventName = {\n AbrStatusChanged: 'abrstatuschanged',\n Adaptation: 'adaptation',\n AudioTrackChanged: 'audiotrackchanged',\n AudioTracksChanged: 'audiotrackschanged',\n BoundaryCrossed: 'boundarycrossed',\n Buffering: 'buffering',\n Complete: 'complete',\n DownloadCompleted: 'downloadcompleted',\n DownloadFailed: 'downloadfailed',\n DownloadHeadersReceived: 'downloadheadersreceived',\n DrmSessionUpdate: 'drmsessionupdate',\n Emsg: 'emsg',\n Prft: 'prft',\n Error: 'error',\n ExpirationUpdated: 'expirationupdated',\n FirstQuartile: 'firstquartile',\n GapJumped: 'gapjumped',\n KeyStatusChanged: 'keystatuschanged',\n Loaded: 'loaded',\n Loading: 'loading',\n ManifestParsed: 'manifestparsed',\n ManifestUpdated: 'manifestupdated',\n MediaQualityChanged: 'mediaqualitychanged',\n MediaSourceRecovered: 'mediasourcerecovered',\n Metadata: 'metadata',\n Midpoint: 'midpoint',\n NoSpatialVideoInfoEvent: 'nospatialvideoinfo',\n OnStateChange: 'onstatechange',\n RateChange: 'ratechange',\n SegmentAppended: 'segmentappended',\n SessionDataEvent: 'sessiondata',\n SpatialVideoInfoEvent: 'spatialvideoinfo',\n StallDetected: 'stalldetected',\n Started: 'started',\n StateChanged: 'statechanged',\n Streaming: 'streaming',\n TextChanged: 'textchanged',\n TextTrackVisibility: 'texttrackvisibility',\n ThirdQuartile: 'thirdquartile',\n TimelineRegionAdded: 'timelineregionadded',\n TimelineRegionEnter: 'timelineregionenter',\n TimelineRegionExit: 'timelineregionexit',\n TracksChanged: 'trackschanged',\n Unloading: 'unloading',\n VariantChanged: 'variantchanged',\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.config.CrossBoundaryStrategy');\n\n/**\n * @enum {string}\n * @export\n */\nshaka.config.CrossBoundaryStrategy = {\n /**\n * Never reset MediaSource when crossing boundary.\n */\n 'KEEP': 'keep',\n /**\n * Always reset MediaSource when crossing boundary.\n */\n 'RESET': 'reset',\n /**\n * Reset MediaSource once, when transitioning from a plain\n * boundary to an encrypted boundary.\n */\n 'RESET_TO_ENCRYPTED': 'reset_to_encrypted',\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.FakeEventTarget');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.log');\ngoog.require('shaka.util.FakeEvent');\ngoog.require('shaka.util.IReleasable');\ngoog.require('shaka.util.MultiMap');\n\n\n/**\n * @summary A work-alike for EventTarget. Only DOM elements may be true\n * EventTargets, but this can be used as a base class to provide event dispatch\n * to non-DOM classes. Only FakeEvents should be dispatched.\n *\n * @implements {EventTarget}\n * @implements {shaka.util.IReleasable}\n * @exportInterface\n */\nshaka.util.FakeEventTarget = class {\n /** */\n constructor() {\n /**\n * @private {shaka.util.MultiMap<shaka.util.FakeEventTarget.ListenerType>}\n */\n this.listeners_ = new shaka.util.MultiMap();\n\n /**\n * The target of all dispatched events. Defaults to |this|.\n * @type {EventTarget}\n */\n this.dispatchTarget = this;\n }\n\n /**\n * Add an event listener to this object.\n *\n * @param {string} type The event type to listen for.\n * @param {shaka.util.FakeEventTarget.ListenerType} listener The callback or\n * listener object to invoke.\n * @param {(!AddEventListenerOptions|boolean)=} options Ignored.\n * @override\n * @exportInterface\n */\n addEventListener(type, listener, options) {\n if (!this.listeners_) {\n return;\n }\n this.listeners_.push(type, listener);\n }\n\n /**\n * Add an event listener to this object that is invoked for all events types\n * the object fires.\n *\n * @param {shaka.util.FakeEventTarget.ListenerType} listener The callback or\n * listener object to invoke.\n * @exportInterface\n */\n listenToAllEvents(listener) {\n this.addEventListener(shaka.util.FakeEventTarget.ALL_EVENTS_, listener);\n }\n\n /**\n * Remove an event listener from this object.\n *\n * @param {string} type The event type for which you wish to remove a\n * listener.\n * @param {shaka.util.FakeEventTarget.ListenerType} listener The callback or\n * listener object to remove.\n * @param {(EventListenerOptions|boolean)=} options Ignored.\n * @override\n * @exportInterface\n */\n removeEventListener(type, listener, options) {\n if (!this.listeners_) {\n return;\n }\n this.listeners_.remove(type, listener);\n }\n\n /**\n * Dispatch an event from this object.\n *\n * @param {!Event} event The event to be dispatched from this object.\n * @return {boolean} True if the default action was prevented.\n * @override\n * @exportInterface\n */\n dispatchEvent(event) {\n // In many browsers, it is complex to overwrite properties of actual Events.\n // Here we expect only to dispatch FakeEvents, which are simpler.\n goog.asserts.assert(event instanceof shaka.util.FakeEvent,\n 'FakeEventTarget can only dispatch FakeEvents!');\n\n if (!this.listeners_) {\n return true;\n }\n\n let listeners = this.listeners_.get(event.type) || [];\n const universalListeners =\n this.listeners_.get(shaka.util.FakeEventTarget.ALL_EVENTS_);\n if (universalListeners) {\n listeners = listeners.concat(universalListeners);\n }\n\n // Execute this event on listeners until the event has been stopped or we\n // run out of listeners.\n for (const listener of listeners) {\n // Do this every time, since events can be re-dispatched from handlers.\n event.target = this.dispatchTarget;\n event.currentTarget = this.dispatchTarget;\n\n try {\n // Check for the |handleEvent| member to test if this is a\n // |EventListener| instance or a basic function.\n if (listener.handleEvent) {\n listener.handleEvent(event);\n } else {\n // eslint-disable-next-line no-restricted-syntax\n listener.call(this, event);\n }\n } catch (exception) {\n // Exceptions during event handlers should not affect the caller,\n // but should appear on the console as uncaught, according to MDN:\n // https://mzl.la/2JXgwRo\n shaka.log.error('Uncaught exception in event handler', exception,\n exception ? exception.message : null,\n exception ? exception.stack : null);\n }\n\n if (event.stopped) {\n break;\n }\n }\n\n return event.defaultPrevented;\n }\n\n /**\n * @override\n * @exportInterface\n */\n release() {\n this.listeners_ = null;\n }\n};\n\n/**\n * These are the listener types defined in the closure extern for EventTarget.\n * @typedef {EventListener|function(!Event):*}\n * @exportInterface\n */\nshaka.util.FakeEventTarget.ListenerType;\n\n\n/**\n * @const {string}\n * @private\n */\nshaka.util.FakeEventTarget.ALL_EVENTS_ = 'All';\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.OperationManager');\n\ngoog.require('shaka.util.ArrayUtils');\ngoog.require('shaka.util.IDestroyable');\n\n/**\n * A utility for cleaning up AbortableOperations, to help simplify common\n * patterns and reduce code duplication.\n *\n * @implements {shaka.util.IDestroyable}\n */\nshaka.util.OperationManager = class {\n /** */\n constructor() {\n /** @private {!Array<!shaka.extern.IAbortableOperation>} */\n this.operations_ = [];\n }\n\n /**\n * Manage an operation. This means aborting it on destroy() and removing it\n * from the management set when it complete.\n *\n * @param {!shaka.extern.IAbortableOperation} operation\n */\n manage(operation) {\n this.operations_.push(operation.finally(() => {\n shaka.util.ArrayUtils.remove(this.operations_, operation);\n }));\n }\n\n /** @override */\n destroy() {\n const cleanup = [];\n for (const op of this.operations_) {\n // Catch and ignore any failures. This silences error logs in the\n // JavaScript console about uncaught Promise failures.\n op.promise.catch(() => {});\n\n // Now abort the operation.\n cleanup.push(op.abort());\n }\n\n this.operations_ = [];\n return Promise.all(cleanup);\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.net.NetworkingEngine');\ngoog.provide('shaka.net.NetworkingEngine.AdvancedRequestType');\ngoog.provide('shaka.net.NetworkingEngine.RequestType');\ngoog.provide('shaka.net.NetworkingEngine.PendingRequest');\n\ngoog.require('goog.Uri');\ngoog.require('goog.asserts');\ngoog.require('shaka.net.Backoff');\ngoog.require('shaka.util.AbortableOperation');\ngoog.require('shaka.util.BufferUtils');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.FakeEvent');\ngoog.require('shaka.util.FakeEventTarget');\ngoog.require('shaka.util.IDestroyable');\ngoog.require('shaka.util.ObjectUtils');\ngoog.require('shaka.util.OperationManager');\ngoog.require('shaka.util.Timer');\n\n\n/**\n * @event shaka.net.NetworkingEngine.RetryEvent\n * @description Fired when the networking engine receives a recoverable error\n * and retries.\n * @property {string} type\n * 'retry'\n * @property {?shaka.util.Error} error\n * The error that caused the retry. If it was a non-Shaka error, this is set\n * to null.\n * @exportDoc\n */\n\n\n/**\n * NetworkingEngine wraps all networking operations. This accepts plugins that\n * handle the actual request. A plugin is registered using registerScheme.\n * Each scheme has at most one plugin to handle the request.\n *\n * @implements {shaka.util.IDestroyable}\n * @export\n */\nshaka.net.NetworkingEngine = class extends shaka.util.FakeEventTarget {\n /**\n * @param {shaka.net.NetworkingEngine.onProgressUpdated=} onProgressUpdated\n * Called when\n * a progress event is triggered. Passed the duration, in milliseconds,\n * that the request took, the number of bytes transferred, and the boolean\n * of whether the switching is allowed.\n * @param {shaka.net.NetworkingEngine.OnHeadersReceived=} onHeadersReceived\n * Called when the headers are received for a download.\n * @param {shaka.net.NetworkingEngine.OnDownloadCompleted=\n * } onDownloadCompleted Called when a download completed successfully.\n * @param {shaka.net.NetworkingEngine.OnDownloadFailed=} onDownloadFailed\n * Called when a download fails, for any reason.\n * @param {shaka.net.NetworkingEngine.OnRequest=} onRequest\n * Called when a request is made\n * @param {shaka.net.NetworkingEngine.OnRetry=} onRetry\n * Called when a request retry is made\n * @param {shaka.net.NetworkingEngine.OnResponse=} onResponse\n * Called when receive the response\n */\n constructor(onProgressUpdated, onHeadersReceived, onDownloadCompleted,\n onDownloadFailed, onRequest, onRetry, onResponse) {\n super();\n\n /** @private {boolean} */\n this.destroyed_ = false;\n\n /** @private {!shaka.util.OperationManager} */\n this.operationManager_ = new shaka.util.OperationManager();\n\n /** @private {!Set<shaka.extern.RequestFilter>} */\n this.requestFilters_ = new Set();\n\n /** @private {!Set<shaka.extern.ResponseFilter>} */\n this.responseFilters_ = new Set();\n\n /** @private {?shaka.net.NetworkingEngine.onProgressUpdated} */\n this.onProgressUpdated_ = onProgressUpdated || null;\n\n /** @private {?shaka.net.NetworkingEngine.OnHeadersReceived} */\n this.onHeadersReceived_ = onHeadersReceived || null;\n\n /** @private {?shaka.net.NetworkingEngine.OnDownloadCompleted} */\n this.onDownloadCompleted_ = onDownloadCompleted || null;\n\n /** @private {?shaka.net.NetworkingEngine.OnDownloadFailed} */\n this.onDownloadFailed_ = onDownloadFailed || null;\n\n /** @private {?shaka.net.NetworkingEngine.OnRequest} */\n this.onRequest_ = onRequest || null;\n\n /** @private {?shaka.net.NetworkingEngine.OnRetry} */\n this.onRetry_ = onRetry || null;\n\n /** @private {?shaka.net.NetworkingEngine.OnResponse} */\n this.onResponse_ = onResponse || null;\n\n /** @private {boolean} */\n this.forceHTTP_ = false;\n\n /** @private {boolean} */\n this.forceHTTPS_ = false;\n\n /** @private {number} */\n this.minBytesForProgressEvents_ = 16e3;\n\n /** @private {!Map<string, string>} */\n this.hostCommonAccessTokenMap_ = new Map();\n }\n\n /**\n * @param {boolean} forceHTTP\n * @export\n */\n setForceHTTP(forceHTTP) {\n this.forceHTTP_ = forceHTTP;\n }\n\n /**\n * @param {boolean} forceHTTPS\n * @export\n */\n setForceHTTPS(forceHTTPS) {\n this.forceHTTPS_ = forceHTTPS;\n }\n\n\n /**\n * @param {number} minBytes\n */\n setMinBytesForProgressEvents(minBytes) {\n this.minBytesForProgressEvents_ = minBytes;\n }\n\n /**\n * Registers a scheme plugin. This plugin will handle all requests with the\n * given scheme. If a plugin with the same scheme already exists, it is\n * replaced, unless the existing plugin is of higher priority.\n * If no priority is provided, this defaults to the highest priority of\n * APPLICATION.\n *\n * @param {string} scheme\n * @param {shaka.extern.SchemePlugin} plugin\n * @param {number=} priority\n * @param {boolean=} progressSupport\n * @export\n */\n static registerScheme(scheme, plugin, priority, progressSupport = false) {\n goog.asserts.assert(\n priority == undefined || priority > 0, 'explicit priority must be > 0');\n priority =\n priority || shaka.net.NetworkingEngine.PluginPriority.APPLICATION;\n const existing = shaka.net.NetworkingEngine.schemes_.get(scheme);\n if (!existing || priority >= existing.priority) {\n shaka.net.NetworkingEngine.schemes_.set(scheme, {\n priority: priority,\n plugin: plugin,\n progressSupport: progressSupport,\n });\n }\n }\n\n /**\n * Removes a scheme plugin.\n *\n * @param {string} scheme\n * @export\n */\n static unregisterScheme(scheme) {\n shaka.net.NetworkingEngine.schemes_.delete(scheme);\n }\n\n /**\n * Copies all of the filters from this networking engine into another.\n * @param {!shaka.net.NetworkingEngine} other\n */\n copyFiltersInto(other) {\n for (const filter of this.requestFilters_) {\n other.requestFilters_.add(filter);\n }\n for (const filter of this.responseFilters_) {\n other.responseFilters_.add(filter);\n }\n }\n\n /**\n * Registers a new request filter. All filters are applied in the order they\n * are registered.\n *\n * @param {shaka.extern.RequestFilter} filter\n * @export\n */\n registerRequestFilter(filter) {\n this.requestFilters_.add(filter);\n }\n\n /**\n * Removes a request filter.\n *\n * @param {shaka.extern.RequestFilter} filter\n * @export\n */\n unregisterRequestFilter(filter) {\n this.requestFilters_.delete(filter);\n }\n\n /**\n * Clears all request filters.\n *\n * @export\n */\n clearAllRequestFilters() {\n this.requestFilters_.clear();\n }\n\n /**\n * Registers a new response filter. All filters are applied in the order they\n * are registered.\n *\n * @param {shaka.extern.ResponseFilter} filter\n * @export\n */\n registerResponseFilter(filter) {\n this.responseFilters_.add(filter);\n }\n\n /**\n * Removes a response filter.\n *\n * @param {shaka.extern.ResponseFilter} filter\n * @export\n */\n unregisterResponseFilter(filter) {\n this.responseFilters_.delete(filter);\n }\n\n /**\n * Clears all response filters.\n *\n * @export\n */\n clearAllResponseFilters() {\n this.responseFilters_.clear();\n }\n\n /**\n * Clears Common Access Token map.\n *\n * @export\n */\n clearCommonAccessTokenMap() {\n this.hostCommonAccessTokenMap_.clear();\n }\n\n /**\n * Gets a copy of the default retry parameters.\n *\n * @return {shaka.extern.RetryParameters}\n *\n * NOTE: The implementation moved to shaka.net.Backoff to avoid a circular\n * dependency between the two classes.\n *\n * @export\n */\n static defaultRetryParameters() {\n return shaka.net.Backoff.defaultRetryParameters();\n }\n\n /**\n * Makes a simple network request for the given URIs.\n *\n * @param {!Array<string>} uris\n * @param {shaka.extern.RetryParameters} retryParams\n * @param {?function(BufferSource):!Promise=} streamDataCallback\n * @return {shaka.extern.Request}\n * @export\n */\n static makeRequest(uris, retryParams, streamDataCallback = null) {\n return {\n uris: uris,\n method: 'GET',\n body: null,\n headers: {},\n allowCrossSiteCredentials: false,\n retryParameters: retryParams,\n licenseRequestType: null,\n sessionId: null,\n drmInfo: null,\n initData: null,\n initDataType: null,\n streamDataCallback: streamDataCallback,\n };\n }\n\n /**\n * @override\n * @export\n */\n destroy() {\n this.destroyed_ = true;\n this.requestFilters_.clear();\n this.responseFilters_.clear();\n this.hostCommonAccessTokenMap_.clear();\n\n // FakeEventTarget implements IReleasable\n super.release();\n\n return this.operationManager_.destroy();\n }\n\n /**\n * Makes a network request and returns the resulting data.\n *\n * @param {shaka.net.NetworkingEngine.RequestType} type\n * @param {shaka.extern.Request} request\n * @param {shaka.extern.RequestContext=} context\n * @return {!shaka.net.NetworkingEngine.PendingRequest}\n * @export\n */\n request(type, request, context) {\n const ObjectUtils = shaka.util.ObjectUtils;\n const numBytesRemainingObj =\n new shaka.net.NetworkingEngine.NumBytesRemainingClass();\n\n // Reject all requests made after destroy is called.\n if (this.destroyed_) {\n const p = Promise.reject(new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.PLAYER,\n shaka.util.Error.Code.OPERATION_ABORTED));\n // Silence uncaught rejection errors, which may otherwise occur any place\n // we don't explicitly handle aborted operations.\n p.catch(() => {});\n return new shaka.net.NetworkingEngine.PendingRequest(\n p, () => Promise.resolve(), numBytesRemainingObj);\n }\n\n goog.asserts.assert(\n request.uris && request.uris.length, 'Request without URIs!');\n\n // If a request comes from outside the library, some parameters may be left\n // undefined. To make it easier for application developers, we will fill\n // them in with defaults if necessary.\n //\n // We clone retryParameters and uris so that if a filter modifies the\n // request, it doesn't contaminate future requests.\n request.method = request.method || 'GET';\n request.headers = request.headers || {};\n request.retryParameters = request.retryParameters ?\n ObjectUtils.cloneObject(request.retryParameters) :\n shaka.net.NetworkingEngine.defaultRetryParameters();\n request.uris = ObjectUtils.cloneObject(request.uris);\n\n // Apply the registered filters to the request.\n const requestFilterOperation = this.filterRequest_(type, request, context);\n const requestOperation = requestFilterOperation.chain(\n () => this.makeRequestWithRetry_(type, request, context,\n numBytesRemainingObj));\n const responseFilterOperation = requestOperation.chain(\n (responseAndGotProgress) =>\n this.filterResponse_(type, responseAndGotProgress, context));\n\n // Keep track of time spent in filters.\n const requestFilterStartTime = Date.now();\n let requestFilterMs = 0;\n requestFilterOperation.promise.then(() => {\n requestFilterMs = Date.now() - requestFilterStartTime;\n }, () => {}); // Silence errors in this fork of the Promise chain.\n\n let responseFilterStartTime = 0;\n requestOperation.promise.then(() => {\n responseFilterStartTime = Date.now();\n }, () => {}); // Silence errors in this fork of the Promise chain.\n\n const op = responseFilterOperation.chain((responseAndGotProgress) => {\n const responseFilterMs = Date.now() - responseFilterStartTime;\n const response = responseAndGotProgress.response;\n response.timeMs += requestFilterMs;\n response.timeMs += responseFilterMs;\n if (!responseAndGotProgress.gotProgress &&\n this.onProgressUpdated_ &&\n !response.fromCache &&\n request.method != 'HEAD' &&\n type == shaka.net.NetworkingEngine.RequestType.SEGMENT) {\n const allowSwitch = this.allowSwitch_(context);\n this.onProgressUpdated_(\n response.timeMs, response.data.byteLength, allowSwitch);\n }\n if (this.onResponse_) {\n this.onResponse_(type, response, context);\n }\n return response;\n }, (e) => {\n // Any error thrown from elsewhere should be recategorized as CRITICAL\n // here. This is because by the time it gets here, we've exhausted\n // retries.\n if (e) {\n goog.asserts.assert(e instanceof shaka.util.Error, 'Wrong error type');\n e.severity = shaka.util.Error.Severity.CRITICAL;\n }\n\n throw e;\n });\n\n // Return the pending request, which carries the response operation, and the\n // number of bytes remaining to be downloaded, updated by the progress\n // events. Add the operation to the manager for later cleanup.\n const pendingRequest =\n new shaka.net.NetworkingEngine.PendingRequest(\n op.promise, () => op.abort(), numBytesRemainingObj);\n this.operationManager_.manage(pendingRequest);\n return pendingRequest;\n }\n\n /**\n * @param {shaka.net.NetworkingEngine.RequestType} type\n * @param {shaka.extern.Request} request\n * @param {shaka.extern.RequestContext=} context\n * @return {!shaka.util.AbortableOperation.<undefined>}\n * @private\n */\n filterRequest_(type, request, context) {\n let filterOperation = shaka.util.AbortableOperation.completed(undefined);\n\n const applyFilter = (requestFilter) => {\n filterOperation = filterOperation.chain(() => {\n if (request.body) {\n // TODO: For v4.0 we should remove this or change to always pass a\n // Uint8Array. To make it easier for apps to write filters, it may be\n // better to always pass a Uint8Array so they know what they are\n // getting; but we shouldn't use ArrayBuffer since that would require\n // copying buffers if this is a partial view.\n request.body = shaka.util.BufferUtils.toArrayBuffer(request.body);\n }\n return requestFilter(type, request, context);\n });\n };\n\n if (this.onRequest_) {\n applyFilter(this.onRequest_);\n }\n\n for (const requestFilter of this.requestFilters_) {\n // Request filters are run sequentially.\n applyFilter(requestFilter);\n }\n\n // Catch any errors thrown by request filters, and substitute\n // them with a Shaka-native error.\n return filterOperation.chain(undefined, (e) => {\n if (e instanceof shaka.util.Error &&\n e.code == shaka.util.Error.Code.OPERATION_ABORTED) {\n // Don't change anything if the operation was aborted.\n throw e;\n }\n\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.NETWORK,\n shaka.util.Error.Code.REQUEST_FILTER_ERROR, e);\n });\n }\n\n /**\n * @param {shaka.net.NetworkingEngine.RequestType} type\n * @param {shaka.extern.Request} request\n * @param {(shaka.extern.RequestContext|undefined)} context\n * @param {shaka.net.NetworkingEngine.NumBytesRemainingClass\n * } numBytesRemainingObj\n * @return {!shaka.extern.IAbortableOperation.<\n * shaka.net.NetworkingEngine.ResponseAndGotProgress>}\n * @private\n */\n makeRequestWithRetry_(type, request, context, numBytesRemainingObj) {\n const backoff = new shaka.net.Backoff(\n request.retryParameters, /* autoReset= */ false);\n const index = 0;\n return this.send_(\n type, request, context, backoff, index, /* lastError= */ null,\n numBytesRemainingObj);\n }\n\n /**\n * Sends the given request to the correct plugin and retry using Backoff.\n *\n * @param {shaka.net.NetworkingEngine.RequestType} type\n * @param {shaka.extern.Request} request\n * @param {(shaka.extern.RequestContext|undefined)} context\n * @param {!shaka.net.Backoff} backoff\n * @param {number} index\n * @param {?shaka.util.Error} lastError\n * @param {shaka.net.NetworkingEngine.NumBytesRemainingClass\n * } numBytesRemainingObj\n * @return {!shaka.extern.IAbortableOperation.<\n * shaka.net.NetworkingEngine.ResponseAndGotProgress>}\n * @private\n */\n send_(type, request, context, backoff, index, lastError,\n numBytesRemainingObj) {\n if (this.forceHTTP_) {\n request.uris[index] = request.uris[index].replace('https://', 'http://');\n }\n if (this.forceHTTPS_) {\n request.uris[index] = request.uris[index].replace('http://', 'https://');\n }\n\n if (index > 0 && this.onRetry_) {\n const newUri = request.uris[index];\n const oldUri = request.uris[index - 1];\n this.onRetry_(type, context, newUri, oldUri);\n }\n\n const uri = new goog.Uri(request.uris[index]);\n let scheme = uri.getScheme();\n // Whether it got a progress event.\n let gotProgress = false;\n if (!scheme) {\n // If there is no scheme, infer one from the location.\n scheme = shaka.net.NetworkingEngine.getLocationProtocol_();\n goog.asserts.assert(\n scheme[scheme.length - 1] == ':',\n 'location.protocol expected to end with a colon!');\n // Drop the colon.\n scheme = scheme.slice(0, -1);\n\n // Override the original URI to make the scheme explicit.\n uri.setScheme(scheme);\n request.uris[index] = uri.toString();\n }\n\n // Schemes are meant to be case-insensitive.\n // See https://github.com/shaka-project/shaka-player/issues/2173\n // and https://tools.ietf.org/html/rfc3986#section-3.1\n scheme = scheme.toLowerCase();\n\n const object = shaka.net.NetworkingEngine.schemes_.get(scheme);\n const plugin = object ? object.plugin : null;\n if (!plugin) {\n return shaka.util.AbortableOperation.failed(\n new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.NETWORK,\n shaka.util.Error.Code.UNSUPPORTED_SCHEME,\n uri));\n }\n const progressSupport = object.progressSupport;\n\n // Add headers from CommonAccessToken\n const commonAccessToken =\n this.hostCommonAccessTokenMap_.get(uri.getDomain());\n if (commonAccessToken) {\n request.headers[shaka.net.NetworkingEngine.CommonAccessTokenHeaderName_] =\n commonAccessToken;\n }\n\n // Every attempt must have an associated backoff.attempt() call so that the\n // accounting is correct.\n const backoffOperation =\n shaka.util.AbortableOperation.notAbortable(backoff.attempt());\n\n /** @type {?shaka.util.Timer} */\n let connectionTimer = null;\n\n /** @type {?shaka.util.Timer} */\n let stallTimer = null;\n\n let aborted = false;\n\n let headersReceivedCalled = false;\n\n let startTimeMs;\n const sendOperation = backoffOperation.chain(() => {\n if (this.destroyed_) {\n return shaka.util.AbortableOperation.aborted();\n }\n\n startTimeMs = Date.now();\n const segment = shaka.net.NetworkingEngine.RequestType.SEGMENT;\n let packetNumber = 0;\n\n const progressUpdated = (time, bytes, numBytesRemaining) => {\n if (connectionTimer) {\n connectionTimer.stop();\n }\n if (stallTimer) {\n stallTimer.tickAfter(stallTimeoutMs / 1000);\n }\n if (this.onProgressUpdated_ && type == segment) {\n packetNumber++;\n request.packetNumber = packetNumber;\n const allowSwitch = this.allowSwitch_(context);\n this.onProgressUpdated_(time, bytes, allowSwitch, request);\n gotProgress = true;\n numBytesRemainingObj.setBytes(numBytesRemaining);\n }\n };\n const headersReceived = (headers) => {\n headersReceivedCalled = true;\n request.timeToFirstByte = Date.now() -\n /** @type {number} */ (request.requestStartTime);\n if (this.onHeadersReceived_) {\n this.onHeadersReceived_(headers, request, type);\n }\n };\n request.requestStartTime = Date.now();\n\n const requestPlugin = plugin(\n request.uris[index], request, type, progressUpdated, headersReceived,\n {\n minBytesForProgressEvents: this.minBytesForProgressEvents_,\n });\n\n if (!progressSupport) {\n return requestPlugin;\n }\n\n const connectionTimeoutMs = request.retryParameters.connectionTimeout;\n if (connectionTimeoutMs) {\n connectionTimer = new shaka.util.Timer(() => {\n aborted = true;\n requestPlugin.abort();\n });\n\n connectionTimer.tickAfter(connectionTimeoutMs / 1000);\n }\n\n const stallTimeoutMs = request.retryParameters.stallTimeout;\n if (stallTimeoutMs) {\n stallTimer = new shaka.util.Timer(() => {\n aborted = true;\n requestPlugin.abort();\n });\n }\n\n return requestPlugin;\n }).chain((response) => {\n if (connectionTimer) {\n connectionTimer.stop();\n }\n if (stallTimer) {\n stallTimer.stop();\n }\n if (response.timeMs == undefined) {\n response.timeMs = Date.now() - startTimeMs;\n }\n // Process headers to get the new CommonAccessToken\n const commonAccessTokenHeader = response.headers[\n shaka.net.NetworkingEngine.CommonAccessTokenHeaderName_];\n if (commonAccessTokenHeader) {\n const responseHost = new goog.Uri(response.uri);\n this.hostCommonAccessTokenMap_.set(\n responseHost.getDomain(), commonAccessTokenHeader);\n }\n const responseAndGotProgress = {\n response: response,\n gotProgress: gotProgress,\n };\n if (!headersReceivedCalled) {\n // The plugin did not call headersReceived, perhaps because it is not\n // able to track that information. So, fire the event manually.\n if (this.onHeadersReceived_) {\n this.onHeadersReceived_(response.headers, request, type);\n }\n }\n if (this.onDownloadCompleted_) {\n this.onDownloadCompleted_(request, response);\n }\n return responseAndGotProgress;\n }, (error) => {\n if (connectionTimer) {\n connectionTimer.stop();\n }\n if (stallTimer) {\n stallTimer.stop();\n }\n if (this.onDownloadFailed_) {\n let shakaError = null;\n let httpResponseCode = 0;\n if (error instanceof shaka.util.Error) {\n shakaError = error;\n if (error.code == shaka.util.Error.Code.BAD_HTTP_STATUS) {\n httpResponseCode = /** @type {number} */ (error.data[1]);\n }\n }\n this.onDownloadFailed_(request, shakaError, httpResponseCode, aborted);\n }\n if (this.destroyed_) {\n return shaka.util.AbortableOperation.aborted();\n }\n\n if (aborted) {\n // It is necessary to change the error code to the correct one because\n // otherwise the retry logic would not work.\n error = new shaka.util.Error(\n shaka.util.Error.Severity.RECOVERABLE,\n shaka.util.Error.Category.NETWORK,\n shaka.util.Error.Code.TIMEOUT,\n request.uris[index], type);\n }\n\n if (error instanceof shaka.util.Error) {\n if (error.code == shaka.util.Error.Code.OPERATION_ABORTED) {\n // Don't change anything if the operation was aborted.\n throw error;\n } else if (error.code == shaka.util.Error.Code.ATTEMPTS_EXHAUSTED) {\n goog.asserts.assert(lastError, 'Should have last error');\n throw lastError;\n }\n\n if (error.severity == shaka.util.Error.Severity.RECOVERABLE) {\n const data = (new Map()).set('error', error);\n const event = new shaka.util.FakeEvent('retry', data);\n // A user can call preventDefault() on a cancelable event.\n event.cancelable = true;\n this.dispatchEvent(event);\n\n if (event.defaultPrevented) {\n // If the caller uses preventDefault() on the 'retry' event, don't\n // retry any more.\n throw error;\n }\n\n // Move to the next URI.\n index = (index + 1) % request.uris.length;\n return this.send_(\n type, request, context, backoff, index, error,\n numBytesRemainingObj);\n }\n }\n\n // The error was not recoverable, so do not try again.\n throw error;\n });\n\n return sendOperation;\n }\n\n /**\n * @param {shaka.net.NetworkingEngine.RequestType} type\n * @param {shaka.net.NetworkingEngine.ResponseAndGotProgress\n * } responseAndGotProgress\n * @param {shaka.extern.RequestContext=} context\n * @return {!shaka.extern.IAbortableOperation.<\n * shaka.net.NetworkingEngine.ResponseAndGotProgress>}\n * @private\n */\n filterResponse_(type, responseAndGotProgress, context) {\n let filterOperation = shaka.util.AbortableOperation.completed(undefined);\n for (const responseFilter of this.responseFilters_) {\n // Response filters are run sequentially.\n filterOperation = filterOperation.chain(() => {\n const resp = responseAndGotProgress.response;\n if (resp.data) {\n // TODO: See TODO in filterRequest_.\n resp.data = shaka.util.BufferUtils.toArrayBuffer(resp.data);\n }\n return responseFilter(type, resp, context);\n });\n }\n // If successful, return the filtered response with whether it got\n // progress.\n return filterOperation.chain(() => {\n return responseAndGotProgress;\n }, (e) => {\n // Catch any errors thrown by request filters, and substitute\n // them with a Shaka-native error.\n\n // The error is assumed to be critical if the original wasn't a Shaka\n // error.\n let severity = shaka.util.Error.Severity.CRITICAL;\n if (e instanceof shaka.util.Error) {\n if (e.code == shaka.util.Error.Code.OPERATION_ABORTED) {\n // Don't change anything if the operation was aborted.\n throw e;\n }\n\n severity = e.severity;\n }\n\n throw new shaka.util.Error(\n severity,\n shaka.util.Error.Category.NETWORK,\n shaka.util.Error.Code.RESPONSE_FILTER_ERROR, e);\n });\n }\n\n /**\n * @param {(shaka.extern.RequestContext|undefined)} context\n * @return {boolean}\n * @private\n */\n allowSwitch_(context) {\n if (context) {\n const segment = context.segment;\n const stream = context.stream;\n if (segment && stream && stream.fastSwitching) {\n if (segment.isPartial()) {\n return false;\n }\n }\n }\n return true;\n }\n\n /**\n * This is here only for testability. We can't mock location in our tests on\n * all browsers, so instead we mock this.\n *\n * @return {string} The value of location.protocol.\n * @private\n */\n static getLocationProtocol_() {\n return location.protocol;\n }\n};\n\n/**\n * A wrapper class for the number of bytes remaining to be downloaded for the\n * request.\n * Instead of using PendingRequest directly, this class is needed to be sent to\n * plugin as a parameter, and a Promise is returned, before PendingRequest is\n * created.\n *\n * @export\n */\nshaka.net.NetworkingEngine.NumBytesRemainingClass = class {\n /**\n * Constructor\n */\n constructor() {\n /** @private {number} */\n this.bytesToLoad_ = 0;\n }\n\n /**\n * @param {number} bytesToLoad\n */\n setBytes(bytesToLoad) {\n this.bytesToLoad_ = bytesToLoad;\n }\n\n /**\n * @return {number}\n */\n getBytes() {\n return this.bytesToLoad_;\n }\n};\n\n/**\n * A pending network request. This can track the current progress of the\n * download, and allows the request to be aborted if the network is slow.\n *\n * @implements {shaka.extern.IAbortableOperation.<shaka.extern.Response>}\n * @extends {shaka.util.AbortableOperation}\n * @export\n */\nshaka.net.NetworkingEngine.PendingRequest =\nclass extends shaka.util.AbortableOperation {\n /**\n * @param {!Promise} promise\n * A Promise which represents the underlying operation. It is resolved\n * when the operation is complete, and rejected if the operation fails or\n * is aborted. Aborted operations should be rejected with a\n * shaka.util.Error object using the error code OPERATION_ABORTED.\n * @param {function():!Promise} onAbort\n * Will be called by this object to abort the underlying operation. This\n * is not cancellation, and will not necessarily result in any work being\n * undone. abort() should return a Promise which is resolved when the\n * underlying operation has been aborted. The returned Promise should\n * never be rejected.\n * @param {shaka.net.NetworkingEngine.NumBytesRemainingClass\n * } numBytesRemainingObj\n */\n constructor(promise, onAbort, numBytesRemainingObj) {\n super(promise, onAbort);\n\n /** @private {shaka.net.NetworkingEngine.NumBytesRemainingClass} */\n this.bytesRemaining_ = numBytesRemainingObj;\n }\n\n /**\n * @return {number}\n */\n getBytesRemaining() {\n return this.bytesRemaining_.getBytes();\n }\n};\n\n/**\n * @const {string}\n * @private\n */\nshaka.net.NetworkingEngine.CommonAccessTokenHeaderName_ =\n 'common-access-token';\n\n\n/**\n * Request types. Allows a filter to decide which requests to read/alter.\n *\n * @enum {number}\n * @export\n */\nshaka.net.NetworkingEngine.RequestType = {\n 'MANIFEST': 0,\n 'SEGMENT': 1,\n 'LICENSE': 2,\n 'APP': 3,\n 'TIMING': 4,\n 'SERVER_CERTIFICATE': 5,\n 'KEY': 6,\n 'ADS': 7,\n 'CONTENT_STEERING': 8,\n};\n\n/**\n * A more advanced form of the RequestType structure, meant to describe\n * sub-types of basic request types.\n * For example, an INIT_SEGMENT is a sub-type of SEGMENT.\n * This is meant to allow for more specificity to be added to the request type\n * data, without breaking backwards compatibility.\n *\n * @enum {number}\n * @export\n */\nshaka.net.NetworkingEngine.AdvancedRequestType = {\n 'INIT_SEGMENT': 0,\n 'MEDIA_SEGMENT': 1,\n 'MEDIA_PLAYLIST': 2,\n 'MASTER_PLAYLIST': 3,\n 'MPD': 4,\n 'MSS': 5,\n 'MPD_PATCH': 6,\n 'MEDIATAILOR_SESSION_INFO': 7,\n 'MEDIATAILOR_TRACKING_INFO': 8,\n 'MEDIATAILOR_STATIC_RESOURCE': 9,\n 'MEDIATAILOR_TRACKING_EVENT': 10,\n 'INTERSTITIAL_ASSET_LIST': 11,\n 'INTERSTITIAL_AD_URL': 12,\n};\n\n\n/**\n * Priority level for network scheme plugins.\n * If multiple plugins are provided for the same scheme, only the\n * highest-priority one is used.\n *\n * @enum {number}\n * @export\n */\nshaka.net.NetworkingEngine.PluginPriority = {\n 'FALLBACK': 1,\n 'PREFERRED': 2,\n 'APPLICATION': 3,\n};\n\n\n/**\n * @typedef {{\n * plugin: shaka.extern.SchemePlugin,\n * priority: number,\n * progressSupport: boolean\n * }}\n * @property {shaka.extern.SchemePlugin} plugin\n * The associated plugin.\n * @property {number} priority\n * The plugin's priority.\n * @property {boolean} progressSupport\n * The plugin's supports progress events\n */\nshaka.net.NetworkingEngine.SchemeObject;\n\n\n/**\n * Contains the scheme plugins.\n *\n * @private {!Map<string, shaka.net.NetworkingEngine.SchemeObject>}\n */\nshaka.net.NetworkingEngine.schemes_ = new Map();\n\n/**\n * @typedef {{\n * response: shaka.extern.Response,\n * gotProgress: boolean\n * }}\n *\n * @description\n * Defines a response wrapper object, including the response object and whether\n * progress event is fired by the scheme plugin.\n *\n * @property {shaka.extern.Response} response\n * @property {boolean} gotProgress\n * @private\n */\nshaka.net.NetworkingEngine.ResponseAndGotProgress;\n\n\n/**\n * @typedef {function(\n * !Object<string, string>,\n * !shaka.extern.Request,\n * !shaka.net.NetworkingEngine.RequestType)}\n *\n * @description\n * A callback function that passes the shaka.extern.HeadersReceived along to\n * the player, plus some extra data.\n * @export\n */\nshaka.net.NetworkingEngine.OnHeadersReceived;\n\n/**\n * @typedef {function(\n * number,\n * number,\n * boolean,\n * shaka.extern.Request=)}\n *\n * @description\n * A callback that is passed the duration, in milliseconds,\n * that the request took, the number of bytes transferred, a boolean\n * representing whether the switching is allowed and a ref to the\n * original request.\n * @export\n */\nshaka.net.NetworkingEngine.onProgressUpdated;\n\n/**\n * @typedef {function(\n * !shaka.extern.Request,\n * !shaka.extern.Response)}\n *\n * @description\n * A callback function that notifies the player when a download completed\n * successfully.\n * @export\n */\nshaka.net.NetworkingEngine.OnDownloadCompleted;\n\n/**\n * @typedef {function(\n * !shaka.extern.Request,\n * ?shaka.util.Error,\n * number,\n * boolean)}\n *\n * @description\n * A callback function that notifies the player when a download fails, for any\n * reason (e.g. even if the download was aborted).\n * @export\n */\nshaka.net.NetworkingEngine.OnDownloadFailed;\n\n\n/**\n * @typedef {function(\n * !shaka.net.NetworkingEngine.RequestType,\n * !shaka.extern.Request,\n * (shaka.extern.RequestContext|undefined))}\n *\n * @description\n * A callback function called on every request\n * @export\n */\nshaka.net.NetworkingEngine.OnRequest;\n\n\n/**\n * @typedef {function(\n * !shaka.net.NetworkingEngine.RequestType,\n * (shaka.extern.RequestContext|undefined),\n * string,\n * string)}\n *\n * @description\n * A callback function called on every request retry. The first string is the\n * new URI and the second string is the old URI.\n * @export\n */\nshaka.net.NetworkingEngine.OnRetry;\n\n\n/**\n * @typedef {function(\n * !shaka.net.NetworkingEngine.RequestType,\n * !shaka.extern.Response,\n * (shaka.extern.RequestContext|undefined))}\n *\n * @description\n * A callback function called on every request\n * @export\n */\nshaka.net.NetworkingEngine.OnResponse;\n\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.Destroyer');\n\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.PublicPromise');\n\n\n/**\n * @summary\n * A utility class to help work with |shaka.util.IDestroyable| objects.\n *\n * @final\n */\nshaka.util.Destroyer = class {\n /**\n * @param {function():!Promise} callback\n * A callback to destroy an object. This callback will only be called once\n * regardless of how many times |destroy| is called.\n */\n constructor(callback) {\n /** @private {boolean} */\n this.destroyed_ = false;\n\n /** @private {!shaka.util.PublicPromise} */\n this.waitOnDestroy_ = new shaka.util.PublicPromise();\n\n /** @private {function():!Promise} */\n this.onDestroy_ = callback;\n }\n\n /**\n * Check if |destroy| has been called. This returning |true| does not mean\n * that the promise returned by |destroy| has resolved yet.\n *\n * @return {boolean}\n * @final\n */\n destroyed() {\n return this.destroyed_;\n }\n\n /**\n * Request that the destroy callback be called. Will return a promise that\n * will resolve once the callback terminates. The promise will never be\n * rejected.\n *\n * @return {!Promise}\n * @final\n */\n destroy() {\n if (this.destroyed_) {\n return this.waitOnDestroy_;\n }\n\n // We have started destroying this object, so we should never get here\n // again.\n this.destroyed_ = true;\n\n return this.onDestroy_().then(\n () => { this.waitOnDestroy_.resolve(); },\n () => { this.waitOnDestroy_.resolve(); });\n }\n\n /**\n * Checks if the object is destroyed and throws an error if it is.\n * @param {*=} error The inner error, if any.\n */\n ensureNotDestroyed(error) {\n if (this.destroyed_) {\n if (error instanceof shaka.util.Error &&\n error.code == shaka.util.Error.Code.OBJECT_DESTROYED) {\n throw error;\n }\n throw shaka.util.Destroyer.destroyedError(error);\n }\n }\n\n /**\n * @param {*=} error The inner error, if any.\n * @return {!shaka.util.Error}\n */\n static destroyedError(error) {\n return new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.PLAYER,\n shaka.util.Error.Code.OBJECT_DESTROYED,\n error);\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.Iterables');\n\n\n/**\n * Recreations of Array-like functions so that they work on any iterable\n * type.\n * @final\n */\nshaka.util.Iterables = class {\n /**\n * @param {!Iterable<FROM>} iterable\n * @param {function(FROM):TO} mapping\n * @return {!Iterable<TO>}\n * @template FROM,TO\n */\n static map(iterable, mapping) {\n const array = [];\n for (const x of iterable) {\n array.push(mapping(x));\n }\n return array;\n }\n\n /**\n * @param {!Iterable<T>} iterable\n * @param {function(T):boolean} test\n * @return {boolean}\n * @template T\n */\n static every(iterable, test) {\n for (const x of iterable) {\n if (!test(x)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * @param {!Iterable<T>} iterable\n * @param {function(T):boolean} test\n * @return {boolean}\n * @template T\n */\n static some(iterable, test) {\n for (const x of iterable) {\n if (test(x)) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Iterate over an iterable object and return only the items that |filter|\n * returns true for.\n *\n * @param {!Iterable<T>} iterable\n * @param {function(T):boolean} filter\n * @return {!Array<T>}\n * @template T\n */\n static filter(iterable, filter) {\n const out = [];\n for (const x of iterable) {\n if (filter(x)) {\n out.push(x);\n }\n }\n return out;\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.MapUtils');\n\n\n/**\n * @summary A set of map/object utility functions.\n */\nshaka.util.MapUtils = class {\n /**\n * @param {!Object<KEY, VALUE>} object\n * @return {!Map<KEY, VALUE>}\n * @template KEY,VALUE\n */\n static asMap(object) {\n const map = new Map();\n for (const key of Object.keys(object)) {\n map.set(key, object[key]);\n }\n\n return map;\n }\n\n\n /**\n * @param {!Map<KEY, VALUE>} map\n * @return {!Object<KEY, VALUE>}\n * @template KEY,VALUE\n */\n static asObject(map) {\n const obj = {};\n map.forEach((value, key) => {\n obj[key] = value;\n });\n\n return obj;\n }\n\n /**\n * NOTE: This only works for simple value types and\n * will not be accurate if map values are objects!\n *\n * @param {Map<KEY, VALUE>} map1\n * @param {Map<KEY, VALUE>} map2\n * @return {boolean}\n * @template KEY,VALUE\n */\n static hasSameElements(map1, map2) {\n if (!map1 && !map2) {\n return true;\n } else if (map1 && !map2) {\n return false;\n } else if (map2 && !map1) {\n return false;\n }\n\n if (map1.size != map2.size) {\n return false;\n }\n\n for (const [key, val] of map1) {\n if (!map2.has(key)) {\n return false;\n }\n\n const val2 = map2.get(key);\n if (val2 != val || (val2 == undefined)) {\n return false;\n }\n }\n return true;\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.DataViewReader');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.util.BufferUtils');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.StringUtils');\n\n\n/**\n * @summary DataViewReader abstracts a DataView object.\n * @export\n */\nshaka.util.DataViewReader = class {\n /**\n * @param {BufferSource} data\n * @param {shaka.util.DataViewReader.Endianness} endianness The endianness.\n */\n constructor(data, endianness) {\n /** @private {!DataView} */\n this.dataView_ = shaka.util.BufferUtils.toDataView(data);\n\n /** @private {boolean} */\n this.littleEndian_ =\n endianness == shaka.util.DataViewReader.Endianness.LITTLE_ENDIAN;\n\n /** @private {number} */\n this.position_ = 0;\n }\n\n\n /** @return {!DataView} The underlying DataView instance. */\n getDataView() {\n return this.dataView_;\n }\n\n\n /**\n * @return {boolean} True if the reader has more data, false otherwise.\n * @export\n */\n hasMoreData() {\n return this.position_ < this.dataView_.byteLength;\n }\n\n\n /**\n * Gets the current byte position.\n * @return {number}\n * @export\n */\n getPosition() {\n return this.position_;\n }\n\n\n /**\n * Gets the byte length of the DataView.\n * @return {number}\n * @export\n */\n getLength() {\n return this.dataView_.byteLength;\n }\n\n\n /**\n * Reads an unsigned 8 bit integer, and advances the reader.\n * @return {number} The integer.\n * @export\n */\n readUint8() {\n try {\n const value = this.dataView_.getUint8(this.position_);\n this.position_ += 1;\n return value;\n } catch (exception) {\n throw this.outOfBounds_();\n }\n }\n\n\n /**\n * Reads an unsigned 16 bit integer, and advances the reader.\n * @return {number} The integer.\n * @export\n */\n readUint16() {\n try {\n const value =\n this.dataView_.getUint16(this.position_, this.littleEndian_);\n this.position_ += 2;\n return value;\n } catch (exception) {\n throw this.outOfBounds_();\n }\n }\n\n\n /**\n * Reads an unsigned 32 bit integer, and advances the reader.\n * @return {number} The integer.\n * @export\n */\n readUint32() {\n try {\n const value =\n this.dataView_.getUint32(this.position_, this.littleEndian_);\n this.position_ += 4;\n return value;\n } catch (exception) {\n throw this.outOfBounds_();\n }\n }\n\n\n /**\n * Reads a signed 32 bit integer, and advances the reader.\n * @return {number} The integer.\n * @export\n */\n readInt32() {\n try {\n const value = this.dataView_.getInt32(this.position_, this.littleEndian_);\n this.position_ += 4;\n return value;\n } catch (exception) {\n throw this.outOfBounds_();\n }\n }\n\n\n /**\n * Reads an unsigned 64 bit integer, and advances the reader.\n * @return {number} The integer.\n * @export\n */\n readUint64() {\n /** @type {number} */\n let low;\n /** @type {number} */\n let high;\n\n try {\n if (this.littleEndian_) {\n low = this.dataView_.getUint32(this.position_, true);\n high = this.dataView_.getUint32(this.position_ + 4, true);\n } else {\n high = this.dataView_.getUint32(this.position_, false);\n low = this.dataView_.getUint32(this.position_ + 4, false);\n }\n } catch (exception) {\n throw this.outOfBounds_();\n }\n\n if (high > 0x1FFFFF) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.JS_INTEGER_OVERFLOW);\n }\n\n this.position_ += 8;\n\n // NOTE: This is subtle, but in JavaScript you can't shift left by 32\n // and get the full range of 53-bit values possible.\n // You must multiply by 2^32.\n return (high * Math.pow(2, 32)) + low;\n }\n\n\n /**\n * Reads the specified number of raw bytes.\n * @param {number} bytes The number of bytes to read.\n * @return {!Uint8Array}\n * @export\n */\n readBytes(bytes) {\n goog.asserts.assert(bytes >= 0, 'Bad call to DataViewReader.readBytes');\n if (this.position_ + bytes > this.dataView_.byteLength) {\n throw this.outOfBounds_();\n }\n\n const value =\n shaka.util.BufferUtils.toUint8(this.dataView_, this.position_, bytes);\n this.position_ += bytes;\n return value;\n }\n\n\n /**\n * Skips the specified number of bytes.\n * @param {number} bytes The number of bytes to skip.\n * @export\n */\n skip(bytes) {\n goog.asserts.assert(bytes >= 0, 'Bad call to DataViewReader.skip');\n if (this.position_ + bytes > this.dataView_.byteLength) {\n throw this.outOfBounds_();\n }\n this.position_ += bytes;\n }\n\n\n /**\n * Rewinds the specified number of bytes.\n * @param {number} bytes The number of bytes to rewind.\n * @export\n */\n rewind(bytes) {\n goog.asserts.assert(bytes >= 0, 'Bad call to DataViewReader.rewind');\n if (this.position_ < bytes) {\n throw this.outOfBounds_();\n }\n this.position_ -= bytes;\n }\n\n\n /**\n * Seeks to a specified position.\n * @param {number} position The desired byte position within the DataView.\n * @export\n */\n seek(position) {\n goog.asserts.assert(position >= 0, 'Bad call to DataViewReader.seek');\n if (position < 0 || position > this.dataView_.byteLength) {\n throw this.outOfBounds_();\n }\n this.position_ = position;\n }\n\n\n /**\n * Keeps reading until it reaches a byte that equals to zero. The text is\n * assumed to be UTF-8.\n * @return {string}\n * @export\n */\n readTerminatedString() {\n const start = this.position_;\n while (this.hasMoreData()) {\n const value = this.dataView_.getUint8(this.position_);\n if (value == 0) {\n break;\n }\n this.position_ += 1;\n }\n\n const ret = shaka.util.BufferUtils.toUint8(\n this.dataView_, start, this.position_ - start);\n // Skip string termination.\n this.position_ += 1;\n return shaka.util.StringUtils.fromUTF8(ret);\n }\n\n\n /**\n * @return {!shaka.util.Error}\n * @private\n */\n outOfBounds_() {\n return new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.BUFFER_READ_OUT_OF_BOUNDS);\n }\n};\n\n/**\n * Endianness.\n * @enum {number}\n * @export\n */\nshaka.util.DataViewReader.Endianness = {\n 'BIG_ENDIAN': 0,\n 'LITTLE_ENDIAN': 1,\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.Mp4Parser');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.log');\ngoog.require('shaka.util.DataViewReader');\n\n\n/**\n * @export\n */\nshaka.util.Mp4Parser = class {\n /** */\n constructor() {\n /** @private {!Map<number, shaka.util.Mp4Parser.BoxType_>} */\n this.headers_ = new Map();\n\n /** @private {!Map<number, !shaka.util.Mp4Parser.CallbackType>} */\n this.boxDefinitions_ = new Map();\n\n /** @private {boolean} */\n this.done_ = false;\n }\n\n\n /**\n * Declare a box type as a Box.\n *\n * @param {string} type\n * @param {!shaka.util.Mp4Parser.CallbackType} definition\n * @return {!shaka.util.Mp4Parser}\n * @export\n */\n box(type, definition) {\n const typeCode = shaka.util.Mp4Parser.typeFromString_(type);\n this.headers_.set(typeCode, shaka.util.Mp4Parser.BoxType_.BASIC_BOX);\n this.boxDefinitions_.set(typeCode, definition);\n return this;\n }\n\n\n /**\n * Declare a box type as a Full Box.\n *\n * @param {string} type\n * @param {!shaka.util.Mp4Parser.CallbackType} definition\n * @return {!shaka.util.Mp4Parser}\n * @export\n */\n fullBox(type, definition) {\n const typeCode = shaka.util.Mp4Parser.typeFromString_(type);\n this.headers_.set(typeCode, shaka.util.Mp4Parser.BoxType_.FULL_BOX);\n this.boxDefinitions_.set(typeCode, definition);\n return this;\n }\n\n\n /**\n * Stop parsing. Useful for extracting information from partial segments and\n * avoiding an out-of-bounds error once you find what you are looking for.\n *\n * @export\n */\n stop() {\n this.done_ = true;\n }\n\n\n /**\n * Parse the given data using the added callbacks.\n *\n * @param {!BufferSource} data\n * @param {boolean=} partialOkay If true, allow reading partial payloads\n * from some boxes. If the goal is a child box, we can sometimes find it\n * without enough data to find all child boxes.\n * @param {boolean=} stopOnPartial If true, stop reading if an incomplete\n * box is detected.\n * @export\n */\n parse(data, partialOkay, stopOnPartial) {\n const reader = new shaka.util.DataViewReader(\n data, shaka.util.DataViewReader.Endianness.BIG_ENDIAN);\n\n this.done_ = false;\n while (reader.hasMoreData() && !this.done_) {\n this.parseNext(0, reader, partialOkay, stopOnPartial);\n }\n }\n\n\n /**\n * Parse the next box on the current level.\n *\n * @param {number} absStart The absolute start position in the original\n * byte array.\n * @param {!shaka.util.DataViewReader} reader\n * @param {boolean=} partialOkay If true, allow reading partial payloads\n * from some boxes. If the goal is a child box, we can sometimes find it\n * without enough data to find all child boxes.\n * @param {boolean=} stopOnPartial If true, stop reading if an incomplete\n * box is detected.\n * @export\n */\n parseNext(absStart, reader, partialOkay, stopOnPartial) {\n const start = reader.getPosition();\n\n // size(4 bytes) + type(4 bytes) = 8 bytes\n if (stopOnPartial && start + 8 > reader.getLength()) {\n this.done_ = true;\n return;\n }\n\n let size = reader.readUint32();\n const type = reader.readUint32();\n const name = shaka.util.Mp4Parser.typeToString(type);\n let has64BitSize = false;\n shaka.log.v2('Parsing MP4 box', name);\n\n switch (size) {\n case 0:\n size = reader.getLength() - start;\n break;\n case 1:\n if (stopOnPartial && reader.getPosition() + 8 > reader.getLength()) {\n this.done_ = true;\n return;\n }\n size = reader.readUint64();\n has64BitSize = true;\n break;\n }\n\n const boxDefinition = this.boxDefinitions_.get(type);\n\n if (boxDefinition) {\n let version = null;\n let flags = null;\n\n if (this.headers_.get(type) == shaka.util.Mp4Parser.BoxType_.FULL_BOX) {\n if (stopOnPartial && reader.getPosition() + 4 > reader.getLength()) {\n this.done_ = true;\n return;\n }\n const versionAndFlags = reader.readUint32();\n version = versionAndFlags >>> 24;\n flags = versionAndFlags & 0xFFFFFF;\n }\n\n // Read the whole payload so that the current level can be safely read\n // regardless of how the payload is parsed.\n let end = start + size;\n if (partialOkay && end > reader.getLength()) {\n // For partial reads, truncate the payload if we must.\n end = reader.getLength();\n }\n\n if (stopOnPartial && end > reader.getLength()) {\n this.done_ = true;\n return;\n }\n const payloadSize = end - reader.getPosition();\n const payload =\n (payloadSize > 0) ? reader.readBytes(payloadSize) : new Uint8Array(0);\n\n const payloadReader = new shaka.util.DataViewReader(\n payload, shaka.util.DataViewReader.Endianness.BIG_ENDIAN);\n\n /** @type {shaka.extern.ParsedBox} */\n const box = {\n name,\n parser: this,\n partialOkay: partialOkay || false,\n version,\n flags,\n reader: payloadReader,\n size,\n start: start + absStart,\n has64BitSize,\n };\n\n boxDefinition(box);\n } else {\n // Move the read head to be at the end of the box.\n // If the box is longer than the remaining parts of the file, e.g. the\n // mp4 is improperly formatted, or this was a partial range request that\n // ended in the middle of a box, just skip to the end.\n const skipLength = Math.min(\n start + size - reader.getPosition(),\n reader.getLength() - reader.getPosition());\n reader.skip(skipLength);\n }\n }\n\n\n /**\n * A callback that tells the Mp4 parser to treat the body of a box as a series\n * of boxes. The number of boxes is limited by the size of the parent box.\n *\n * @param {!shaka.extern.ParsedBox} box\n * @export\n */\n static children(box) {\n // The \"reader\" starts at the payload, so we need to add the header to the\n // start position. The header size varies.\n const headerSize = shaka.util.Mp4Parser.headerSize(box);\n while (box.reader.hasMoreData() && !box.parser.done_) {\n box.parser.parseNext(box.start + headerSize, box.reader, box.partialOkay);\n }\n }\n\n\n /**\n * A callback that tells the Mp4 parser to treat the body of a box as a sample\n * description. A sample description box has a fixed number of children. The\n * number of children is represented by a 4 byte unsigned integer. Each child\n * is a box.\n *\n * @param {!shaka.extern.ParsedBox} box\n * @export\n */\n static sampleDescription(box) {\n // The \"reader\" starts at the payload, so we need to add the header to the\n // start position. The header size varies.\n const headerSize = shaka.util.Mp4Parser.headerSize(box);\n const count = box.reader.readUint32();\n for (let i = 0; i < count; i++) {\n box.parser.parseNext(box.start + headerSize, box.reader, box.partialOkay);\n if (box.parser.done_) {\n break;\n }\n }\n }\n\n\n /**\n * A callback that tells the Mp4 parser to treat the body of a box as a visual\n * sample entry. A visual sample entry has some fixed-sized fields\n * describing the video codec parameters, followed by an arbitrary number of\n * appended children. Each child is a box.\n *\n * @param {!shaka.extern.ParsedBox} box\n * @export\n */\n static visualSampleEntry(box) {\n // The \"reader\" starts at the payload, so we need to add the header to the\n // start position. The header size varies.\n const headerSize = shaka.util.Mp4Parser.headerSize(box);\n\n // Skip 6 reserved bytes.\n // Skip 2-byte data reference index.\n // Skip 16 more reserved bytes.\n // Skip 4 bytes for width/height.\n // Skip 8 bytes for horizontal/vertical resolution.\n // Skip 4 more reserved bytes (0)\n // Skip 2-byte frame count.\n // Skip 32-byte compressor name (length byte, then name, then 0-padding).\n // Skip 2-byte depth.\n // Skip 2 more reserved bytes (0xff)\n // 78 bytes total.\n // See also https://github.com/shaka-project/shaka-packager/blob/d5ca6e84/packager/media/formats/mp4/box_definitions.cc#L1544\n box.reader.skip(78);\n\n while (box.reader.hasMoreData() && !box.parser.done_) {\n box.parser.parseNext(box.start + headerSize, box.reader, box.partialOkay);\n }\n }\n\n\n /**\n * A callback that tells the Mp4 parser to treat the body of a box as a audio\n * sample entry. A audio sample entry has some fixed-sized fields\n * describing the audio codec parameters, followed by an arbitrary number of\n * appended children. Each child is a box.\n *\n * @param {!shaka.extern.ParsedBox} box\n * @export\n */\n static audioSampleEntry(box) {\n // The \"reader\" starts at the payload, so we need to add the header to the\n // start position. The header size varies.\n const headerSize = shaka.util.Mp4Parser.headerSize(box);\n\n // 6 bytes reserved\n // 2 bytes data reference index\n box.reader.skip(8);\n // 2 bytes version\n const version = box.reader.readUint16();\n // 2 bytes revision (0, could be ignored)\n // 4 bytes reserved\n box.reader.skip(6);\n\n if (version == 2) {\n // 16 bytes hard-coded values with no comments\n // 8 bytes sample rate\n // 4 bytes channel count\n // 4 bytes hard-coded values with no comments\n // 4 bytes bits per sample\n // 4 bytes lpcm flags\n // 4 bytes sample size\n // 4 bytes samples per packet\n box.reader.skip(48);\n } else {\n // 2 bytes channel count\n // 2 bytes bits per sample\n // 2 bytes compression ID\n // 2 bytes packet size\n // 2 bytes sample rate\n // 2 byte reserved\n box.reader.skip(12);\n }\n\n if (version == 1) {\n // 4 bytes samples per packet\n // 4 bytes bytes per packet\n // 4 bytes bytes per frame\n // 4 bytes bytes per sample\n box.reader.skip(16);\n }\n\n while (box.reader.hasMoreData() && !box.parser.done_) {\n box.parser.parseNext(box.start + headerSize, box.reader, box.partialOkay);\n }\n }\n\n\n /**\n * Create a callback that tells the Mp4 parser to treat the body of a box as a\n * binary blob and to parse the body's contents using the provided callback.\n *\n * @param {function(!Uint8Array)} callback\n * @return {!shaka.util.Mp4Parser.CallbackType}\n * @export\n */\n static allData(callback) {\n return (box) => {\n const all = box.reader.getLength() - box.reader.getPosition();\n callback(box.reader.readBytes(all));\n };\n }\n\n\n /**\n * Convert an ascii string name to the integer type for a box.\n *\n * @param {string} name The name of the box. The name must be four\n * characters long.\n * @return {number}\n * @private\n */\n static typeFromString_(name) {\n goog.asserts.assert(\n name.length == 4,\n 'Mp4 box names must be 4 characters long');\n\n let code = 0;\n for (const chr of name) {\n code = (code << 8) | chr.charCodeAt(0);\n }\n return code;\n }\n\n\n /**\n * Convert an integer type from a box into an ascii string name.\n * Useful for debugging.\n *\n * @param {number} type The type of the box, a uint32.\n * @return {string}\n * @export\n */\n static typeToString(type) {\n const name = String.fromCharCode(\n (type >> 24) & 0xff,\n (type >> 16) & 0xff,\n (type >> 8) & 0xff,\n type & 0xff);\n return name;\n }\n\n /**\n * Find the header size of the box.\n * Useful for modifying boxes in place or finding the exact offset of a field.\n *\n * @param {shaka.extern.ParsedBox} box\n * @return {number}\n * @export\n */\n static headerSize(box) {\n const basicHeaderSize = 8;\n const _64BitFieldSize = box.has64BitSize ? 8 : 0;\n const versionAndFlagsSize = box.flags != null ? 4 : 0;\n return basicHeaderSize + _64BitFieldSize + versionAndFlagsSize;\n }\n};\n\n\n/**\n * @typedef {function(!shaka.extern.ParsedBox)}\n * @exportInterface\n */\nshaka.util.Mp4Parser.CallbackType;\n\n\n/**\n * An enum used to track the type of box so that the correct values can be\n * read from the header.\n *\n * @enum {number}\n * @private\n */\nshaka.util.Mp4Parser.BoxType_ = {\n BASIC_BOX: 0,\n FULL_BOX: 1,\n};\n\n\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.Pssh');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.log');\ngoog.require('shaka.util.BufferUtils');\ngoog.require('shaka.util.Mp4Parser');\ngoog.require('shaka.util.Uint8ArrayUtils');\n\n\n/**\n * @summary\n * Parse a PSSH box and extract the system IDs.\n */\nshaka.util.Pssh = class {\n /**\n * @param {!Uint8Array} psshBox\n */\n constructor(psshBox) {\n /**\n * In hex.\n * @type {!Array<string>}\n */\n this.systemIds = [];\n\n /**\n * In hex.\n * @type {!Array<string>}\n */\n this.cencKeyIds = [];\n\n /**\n * Array with the pssh boxes found.\n * @type {!Array<!Uint8Array>}\n */\n this.data = [];\n\n new shaka.util.Mp4Parser()\n .box('moov', shaka.util.Mp4Parser.children)\n .box('moof', shaka.util.Mp4Parser.children)\n .fullBox('pssh', (box) => this.parsePsshBox_(box))\n .parse(psshBox);\n\n if (this.data.length == 0) {\n shaka.log.v2('No pssh box found!');\n }\n }\n\n\n /**\n * @param {!shaka.extern.ParsedBox} box\n * @private\n */\n parsePsshBox_(box) {\n goog.asserts.assert(\n box.version != null,\n 'PSSH boxes are full boxes and must have a valid version');\n\n goog.asserts.assert(\n box.flags != null,\n 'PSSH boxes are full boxes and must have a valid flag');\n\n if (box.version > 1) {\n shaka.log.warning('Unrecognized PSSH version found!');\n return;\n }\n\n // The \"reader\" gives us a view on the payload of the box. Create a new\n // view that contains the whole box.\n const dataView = box.reader.getDataView();\n goog.asserts.assert(\n dataView.byteOffset >= 12, 'DataView at incorrect position');\n const pssh = shaka.util.BufferUtils.toUint8(dataView, -12, box.size);\n this.data.push(pssh);\n\n this.systemIds.push(\n shaka.util.Uint8ArrayUtils.toHex(box.reader.readBytes(16)));\n if (box.version > 0) {\n const numKeyIds = box.reader.readUint32();\n for (let i = 0; i < numKeyIds; i++) {\n const keyId =\n shaka.util.Uint8ArrayUtils.toHex(box.reader.readBytes(16));\n this.cencKeyIds.push(keyId);\n }\n }\n }\n\n /**\n * Creates a pssh blob from the given system ID, data, keyIds and version.\n *\n * @param {!Uint8Array} data\n * @param {!Uint8Array} systemId\n * @param {!Set<string>} keyIds\n * @param {number} version\n * @return {!Uint8Array}\n */\n static createPssh(data, systemId, keyIds, version) {\n goog.asserts.assert(systemId.byteLength == 16, 'Invalid system ID length');\n const dataLength = data.length;\n let psshSize = 0x4 + 0x4 + 0x4 + systemId.length + 0x4 + dataLength;\n if (version > 0) {\n psshSize += 0x4 + (16 * keyIds.size);\n }\n\n /** @type {!Uint8Array} */\n const psshBox = new Uint8Array(psshSize);\n /** @type {!DataView} */\n const psshData = shaka.util.BufferUtils.toDataView(psshBox);\n\n let byteCursor = 0;\n psshData.setUint32(byteCursor, psshSize);\n byteCursor += 0x4;\n psshData.setUint32(byteCursor, 0x70737368); // 'pssh'\n byteCursor += 0x4;\n (version < 1) ? psshData.setUint32(byteCursor, 0) :\n psshData.setUint32(byteCursor, 0x01000000); // version + flags\n byteCursor += 0x4;\n psshBox.set(systemId, byteCursor);\n byteCursor += systemId.length;\n\n // if version > 0, add KID count and kid values.\n if (version > 0) {\n psshData.setUint32(byteCursor, keyIds.size); // KID_count\n byteCursor += 0x4;\n const Uint8ArrayUtils = shaka.util.Uint8ArrayUtils;\n for (const keyId of keyIds) {\n const KID = Uint8ArrayUtils.fromHex(keyId);\n psshBox.set(KID, byteCursor);\n byteCursor += KID.length;\n }\n }\n\n psshData.setUint32(byteCursor, dataLength);\n byteCursor += 0x4;\n psshBox.set(data, byteCursor);\n byteCursor += dataLength;\n\n goog.asserts.assert(byteCursor === psshSize, 'PSSH invalid length.');\n return psshBox;\n }\n\n /**\n * Returns just the data portion of a single PSSH\n *\n * @param {!Uint8Array} pssh\n * @return {!Uint8Array}\n */\n static getPsshData(pssh) {\n let offset = 8; // Box size and type fields\n\n /** @type {!DataView} */\n const view = shaka.util.BufferUtils.toDataView(pssh);\n\n // Read version\n const version = view.getUint8(offset);\n\n // Version (1), flags (3), system ID (16)\n offset += 20;\n\n if (version > 0) {\n // Key ID count (4) and All key IDs (16*count)\n offset += 4 + (16 * view.getUint32(offset));\n }\n\n // Data size\n offset += 4;\n\n return shaka.util.BufferUtils.toUint8(view, offset);\n }\n\n /**\n * Normalise the initData array. This is to apply browser specific\n * workarounds, e.g. removing duplicates which appears to occur\n * intermittently when the native msneedkey event fires (i.e. event.initData\n * contains dupes).\n *\n * @param {!Uint8Array} initData\n * @return {!Uint8Array}\n */\n static normaliseInitData(initData) {\n if (!initData) {\n return initData;\n }\n\n const pssh = new shaka.util.Pssh(initData);\n\n // If there is only a single pssh, return the original array.\n if (pssh.data.length <= 1) {\n return initData;\n }\n\n // Dedupe psshData.\n /** @type {!Array<!Uint8Array>} */\n const dedupedInitDatas = [];\n for (const initData of pssh.data) {\n const found = dedupedInitDatas.some((x) => {\n return shaka.util.BufferUtils.equal(x, initData);\n });\n\n if (!found) {\n dedupedInitDatas.push(initData);\n }\n }\n\n return shaka.util.Uint8ArrayUtils.concat(...dedupedInitDatas);\n }\n};\n\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.media.AdaptationSet');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.log');\ngoog.require('shaka.util.MimeUtils');\n\n\n/**\n * A set of variants that we want to adapt between.\n *\n * @final\n * @export\n */\nshaka.media.AdaptationSet = class {\n /**\n * @param {shaka.extern.Variant} root\n * The variant that all other variants will be tested against when being\n * added to the adaptation set. If a variant is not compatible with the\n * root, it will not be added.\n * @param {!Iterable<shaka.extern.Variant>=} candidates\n * Variants that may be compatible with the root and should be added if\n * compatible. If a candidate is not compatible, it will not end up in the\n * adaptation set.\n * @param {boolean=} compareCodecs\n */\n constructor(root, candidates, compareCodecs = true) {\n /** @private {shaka.extern.Variant} */\n this.root_ = root;\n /** @private {!Set<shaka.extern.Variant>} */\n this.variants_ = new Set([root]);\n\n // Try to add all the candidates. If they cannot be added (because they\n // are not compatible with the root, they will be rejected by |add|.\n candidates = candidates || [];\n for (const candidate of candidates) {\n this.add(candidate, compareCodecs);\n }\n }\n\n /**\n * @param {shaka.extern.Variant} variant\n * @param {boolean} compareCodecs\n * @return {boolean}\n */\n add(variant, compareCodecs) {\n if (this.canInclude(variant, compareCodecs)) {\n this.variants_.add(variant);\n return true;\n }\n\n // To be nice, issue a warning if someone is trying to add something that\n // they shouldn't.\n shaka.log.warning('Rejecting variant - not compatible with root.');\n return false;\n }\n\n /**\n * Check if |variant| can be included with the set. If |canInclude| returns\n * |false|, calling |add| will result in it being ignored.\n *\n * @param {shaka.extern.Variant} variant\n * @param {boolean=} compareCodecs\n * @return {boolean}\n */\n canInclude(variant, compareCodecs = true) {\n return shaka.media.AdaptationSet\n .areAdaptable(this.root_, variant, compareCodecs);\n }\n\n /**\n * @param {shaka.extern.Variant} a\n * @param {shaka.extern.Variant} b\n * @param {boolean} compareCodecs\n * @return {boolean}\n */\n static areAdaptable(a, b, compareCodecs) {\n const AdaptationSet = shaka.media.AdaptationSet;\n\n // All variants should have audio or should all not have audio.\n if (!!a.audio != !!b.audio) {\n return false;\n }\n\n // All variants should have video or should all not have video.\n if (!!a.video != !!b.video) {\n return false;\n }\n\n // If the languages don't match, we should not adapt between them.\n if (a.language != b.language) {\n return false;\n }\n\n goog.asserts.assert(\n !!a.audio == !!b.audio,\n 'Both should either have audio or not have audio.');\n if (a.audio && b.audio &&\n !AdaptationSet.areAudiosCompatible_(a.audio, b.audio, compareCodecs)) {\n return false;\n }\n\n goog.asserts.assert(\n !!a.video == !!b.video,\n 'Both should either have video or not have video.');\n if (a.video && b.video &&\n !AdaptationSet.areVideosCompatible_(a.video, b.video, compareCodecs)) {\n return false;\n }\n\n return true;\n }\n\n /**\n * @return {!Iterable<shaka.extern.Variant>}\n */\n values() {\n return this.variants_.values();\n }\n\n /**\n * Check if we can switch between two audio streams.\n *\n * @param {shaka.extern.Stream} a\n * @param {shaka.extern.Stream} b\n * @param {boolean} compareCodecs\n * @return {boolean}\n * @private\n */\n static areAudiosCompatible_(a, b, compareCodecs) {\n const AdaptationSet = shaka.media.AdaptationSet;\n\n // Don't adapt between channel counts, which could annoy the user\n // due to volume changes on downmixing. An exception is made for\n // stereo and mono, which should be fine to adapt between.\n if (!a.channelsCount || !b.channelsCount ||\n a.channelsCount > 2 || b.channelsCount > 2) {\n if (a.channelsCount != b.channelsCount) {\n return false;\n }\n }\n\n // Don't adapt between spatial and non spatial audio, which may\n // annoy the user.\n if (a.spatialAudio !== b.spatialAudio) {\n return false;\n }\n\n // We can only adapt between base-codecs.\n if (compareCodecs && !AdaptationSet.canTransitionBetween_(a, b)) {\n return false;\n }\n\n // Audio roles must not change between adaptations.\n if (!AdaptationSet.areRolesEqual_(a.roles, b.roles)) {\n return false;\n }\n\n // We can only adapt between the same groupId.\n if (a.groupId !== b.groupId) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Check if we can switch between two video streams.\n *\n * @param {shaka.extern.Stream} a\n * @param {shaka.extern.Stream} b\n * @param {boolean} compareCodecs\n * @return {boolean}\n * @private\n */\n static areVideosCompatible_(a, b, compareCodecs) {\n const AdaptationSet = shaka.media.AdaptationSet;\n\n // We can only adapt between base-codecs.\n if (compareCodecs && !AdaptationSet.canTransitionBetween_(a, b)) {\n return false;\n }\n\n // Video roles must not change between adaptations.\n if (!AdaptationSet.areRolesEqual_(a.roles, b.roles)) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Check if we can switch between two streams based on their codec and mime\n * type.\n *\n * @param {shaka.extern.Stream} a\n * @param {shaka.extern.Stream} b\n * @return {boolean}\n * @private\n */\n static canTransitionBetween_(a, b) {\n if (a.mimeType != b.mimeType) {\n return false;\n }\n\n\n // Get the base codec of each codec in each stream.\n const codecsA = shaka.util.MimeUtils.splitCodecs(a.codecs).map((codec) => {\n return shaka.util.MimeUtils.getCodecBase(codec);\n });\n const codecsB = shaka.util.MimeUtils.splitCodecs(b.codecs).map((codec) => {\n return shaka.util.MimeUtils.getCodecBase(codec);\n });\n\n // We don't want to allow switching between transmuxed and non-transmuxed\n // content so the number of codecs should be the same.\n //\n // To avoid the case where an codec is used for audio and video we will\n // codecs using arrays (not sets). While at this time, there are no codecs\n // that work for audio and video, it is possible for \"raw\" codecs to be\n // which would share the same name.\n if (codecsA.length != codecsB.length) {\n return false;\n }\n\n // Sort them so that we can walk through them and compare them\n // element-by-element.\n codecsA.sort();\n codecsB.sort();\n\n for (let i = 0; i < codecsA.length; i++) {\n if (codecsA[i] != codecsB[i]) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Check if two role lists are the equal. This will take into account all\n * unique behaviours when comparing roles.\n *\n * @param {!Iterable<string>} a\n * @param {!Iterable<string>} b\n * @return {boolean}\n * @private\n */\n static areRolesEqual_(a, b) {\n const aSet = new Set(a);\n const bSet = new Set(b);\n\n // Remove the main role from the role lists (we expect to see them only\n // in dash manifests).\n const mainRole = 'main';\n aSet.delete(mainRole);\n bSet.delete(mainRole);\n\n // Make sure that we have the same number roles in each list. Make sure to\n // do it after correcting for 'main'.\n if (aSet.size != bSet.size) {\n return false;\n }\n\n // Because we know the two sets are the same size, if any item is missing\n // if means that they are not the same.\n for (const x of aSet) {\n if (!bSet.has(x)) {\n return false;\n }\n }\n\n return true;\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.media.AdaptationSetCriteria');\n\ngoog.require('shaka.media.AdaptationSet');\ngoog.require('shaka.config.CodecSwitchingStrategy');\n\n\n/**\n * An adaptation set criteria is a unit of logic that can take a set of\n * variants and return a subset of variants that should (and can) be\n * adapted between.\n *\n * @interface\n * @export\n */\nshaka.media.AdaptationSetCriteria = class {\n /**\n * Take a set of variants, and return a subset of variants that can be\n * adapted between.\n *\n * @param {!Array<shaka.extern.Variant>} variants\n * @return {!shaka.media.AdaptationSet}\n * @exportInterface\n */\n create(variants) {}\n\n /**\n * Sets the AdaptationSetCriteria configuration.\n *\n * @param {shaka.media.AdaptationSetCriteria.Configuration} config\n * @exportInterface\n */\n configure(config) {}\n};\n\n/**\n * A factory for creating the AdaptationSetCriteria.\n *\n * @typedef {function():!shaka.media.AdaptationSetCriteria}\n * @export\n */\nshaka.media.AdaptationSetCriteria.Factory;\n\n/**\n * @typedef {{\n * language: string,\n * role: string,\n * channelCount: number,\n * hdrLevel: string,\n * spatialAudio: boolean,\n * videoLayout: string,\n * audioLabel: string,\n * videoLabel: string,\n * codecSwitchingStrategy: shaka.config.CodecSwitchingStrategy,\n * audioCodec: string\n * }}\n *\n * @property {string} language\n * The language used to filter variants.\n * @property {string} role\n * The adaptation role used to filter variants.\n * @property {string} channelCount\n * The audio channel count used to filter variants.\n * @property {string} hdrLevel\n * The HDR level used to filter variants.\n * @property {boolean} spatialAudio\n * Whether should prefer audio tracks with spatial audio.\n * @property {string} videoLayout\n * The video layout used to filter variants.\n * @property {string} audioLabel\n * The audio label used to filter variants.\n * @property {string} videoLabel\n * The video label used to filter variants.\n * @property {shaka.config.CodecSwitchingStrategy} codecSwitchingStrategy\n * The codec switching strategy used to filter variants.\n * @property {string} audioCodec\n * The audio codec used to filter variants.\n * @export\n */\nshaka.media.AdaptationSetCriteria.Configuration;\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.media.BufferingObserver');\n\n\n/**\n * The buffering observer watches how much content has been buffered and raises\n * events when the state changes (enough => not enough or vice versa).\n *\n * @final\n */\nshaka.media.BufferingObserver = class {\n /**\n * @param {number} thresholdWhenStarving\n * @param {number} thresholdWhenSatisfied\n */\n constructor(thresholdWhenStarving, thresholdWhenSatisfied) {\n const State = shaka.media.BufferingObserver.State;\n\n /** @private {shaka.media.BufferingObserver.State} */\n this.previousState_ = State.SATISFIED;\n\n /** @private {!Map<shaka.media.BufferingObserver.State, number>} */\n this.thresholds_ = new Map()\n .set(State.SATISFIED, thresholdWhenSatisfied)\n .set(State.STARVING, thresholdWhenStarving);\n\n /** @private {number} */\n this.lastRebufferTime_ = 0;\n }\n\n /**\n * @param {number} thresholdWhenStarving\n * @param {number} thresholdWhenSatisfied\n */\n setThresholds(thresholdWhenStarving, thresholdWhenSatisfied) {\n const State = shaka.media.BufferingObserver.State;\n this.thresholds_\n .set(State.SATISFIED, thresholdWhenSatisfied)\n .set(State.STARVING, thresholdWhenStarving);\n }\n\n /**\n * Update the observer by telling it how much content has been buffered (in\n * seconds) and if we are buffered to the end of the presentation. If the\n * controller believes the state has changed, it will return |true|.\n *\n * @param {number} bufferLead\n * @param {boolean} bufferedToEnd\n * @return {boolean}\n */\n update(bufferLead, bufferedToEnd) {\n const State = shaka.media.BufferingObserver.State;\n\n /**\n * Our threshold for how much we need before we declare ourselves as\n * starving is based on whether or not we were just starving. If we\n * were just starving, we are more likely to starve again, so we require\n * more content to be buffered than if we were not just starving.\n *\n * @type {number}\n */\n const threshold = this.thresholds_.get(this.previousState_);\n\n const oldState = this.previousState_;\n const newState =\n (bufferedToEnd || (bufferLead >= threshold && bufferLead > 0)) ?\n (State.SATISFIED) :\n (State.STARVING);\n\n // Save the new state now so that calls to |getState| from any callbacks\n // will be accurate.\n this.previousState_ = newState;\n\n // Return |true| only when the state has changed.\n const stateChanged = oldState != newState;\n\n if (stateChanged && newState === State.SATISFIED) {\n this.lastRebufferTime_ = Date.now();\n }\n\n return stateChanged;\n }\n\n /**\n * Set which state that the observer should think playback was in.\n *\n * @param {shaka.media.BufferingObserver.State} state\n */\n setState(state) {\n this.previousState_ = state;\n }\n\n /**\n * Get the state that the observer last thought playback was in.\n *\n * @return {shaka.media.BufferingObserver.State}\n */\n getState() {\n return this.previousState_;\n }\n\n /**\n * Return the last time that the state went from |STARVING| to |SATISFIED|.\n * @return {number}\n */\n getLastRebufferTime() {\n return this.lastRebufferTime_;\n }\n\n /**\n * Reset the last rebuffer time to zero.\n */\n resetLastRebufferTime() {\n this.lastRebufferTime_ = 0;\n }\n};\n\n/**\n * Rather than using booleans to communicate what state we are in, we have this\n * enum.\n *\n * @enum {number}\n */\nshaka.media.BufferingObserver.State = {\n STARVING: 0,\n SATISFIED: 1,\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.Player');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.config.CrossBoundaryStrategy');\ngoog.require('shaka.Deprecate');\ngoog.require('shaka.drm.DrmEngine');\ngoog.require('shaka.drm.DrmUtils');\ngoog.require('shaka.log');\ngoog.require('shaka.media.AdaptationSetCriteria');\ngoog.require('shaka.media.BufferingObserver');\ngoog.require('shaka.media.ManifestFilterer');\ngoog.require('shaka.media.ManifestParser');\ngoog.require('shaka.media.MediaSourceEngine');\ngoog.require('shaka.media.MediaSourcePlayhead');\ngoog.require('shaka.media.MetaSegmentIndex');\ngoog.require('shaka.media.PlayRateController');\ngoog.require('shaka.media.Playhead');\ngoog.require('shaka.media.PlayheadObserverManager');\ngoog.require('shaka.media.PreloadManager');\ngoog.require('shaka.media.QualityObserver');\ngoog.require('shaka.media.RegionObserver');\ngoog.require('shaka.media.RegionTimeline');\ngoog.require('shaka.media.SegmentIndex');\ngoog.require('shaka.media.SegmentPrefetch');\ngoog.require('shaka.media.SegmentReference');\ngoog.require('shaka.media.SrcEqualsPlayhead');\ngoog.require('shaka.media.StreamingEngine');\ngoog.require('shaka.media.TimeRangesUtils');\ngoog.require('shaka.net.NetworkingEngine');\ngoog.require('shaka.net.NetworkingUtils');\ngoog.require('shaka.text.Cue');\ngoog.require('shaka.text.SimpleTextDisplayer');\ngoog.require('shaka.text.StubTextDisplayer');\ngoog.require('shaka.text.TextEngine');\ngoog.require('shaka.text.Utils');\ngoog.require('shaka.text.UITextDisplayer');\ngoog.require('shaka.text.WebVttGenerator');\ngoog.require('shaka.util.ArrayUtils');\ngoog.require('shaka.util.BufferUtils');\ngoog.require('shaka.util.CmcdManager');\ngoog.require('shaka.util.CmsdManager');\ngoog.require('shaka.util.ConfigUtils');\ngoog.require('shaka.util.Dom');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.EventManager');\ngoog.require('shaka.util.FakeEvent');\ngoog.require('shaka.util.FakeEventTarget');\ngoog.require('shaka.util.Functional');\ngoog.require('shaka.util.IDestroyable');\ngoog.require('shaka.util.LanguageUtils');\ngoog.require('shaka.util.ManifestParserUtils');\ngoog.require('shaka.util.MapUtils');\ngoog.require('shaka.util.MediaReadyState');\ngoog.require('shaka.util.MimeUtils');\ngoog.require('shaka.util.Mutex');\ngoog.require('shaka.util.NumberUtils');\ngoog.require('shaka.util.ObjectUtils');\ngoog.require('shaka.util.Platform');\ngoog.require('shaka.util.PlayerConfiguration');\ngoog.require('shaka.util.PublicPromise');\ngoog.require('shaka.util.Stats');\ngoog.require('shaka.util.StreamUtils');\ngoog.require('shaka.util.Timer');\ngoog.require('shaka.lcevc.Dec');\ngoog.requireType('shaka.media.PresentationTimeline');\n\n\n/**\n * @event shaka.Player.ErrorEvent\n * @description Fired when a playback error occurs.\n * @property {string} type\n * 'error'\n * @property {!shaka.util.Error} detail\n * An object which contains details on the error. The error's\n * <code>category</code> and <code>code</code> properties will identify the\n * specific error that occurred. In an uncompiled build, you can also use the\n * <code>message</code> and <code>stack</code> properties to debug.\n * @exportDoc\n */\n\n/**\n * @event shaka.Player.StateChangeEvent\n * @description Fired when the player changes load states.\n * @property {string} type\n * 'onstatechange'\n * @property {string} state\n * The name of the state that the player just entered.\n * @exportDoc\n */\n\n/**\n * @event shaka.Player.EmsgEvent\n * @description Fired when an emsg box is found in a segment.\n * If the application calls preventDefault() on this event, further parsing\n * will not happen, and no 'metadata' event will be raised for ID3 payloads.\n * @property {string} type\n * 'emsg'\n * @property {shaka.extern.EmsgInfo} detail\n * An object which contains the content of the emsg box.\n * @exportDoc\n */\n\n\n/**\n * @event shaka.Player.DownloadCompleted\n * @description Fired when a download has completed.\n * @property {string} type\n * 'downloadcompleted'\n * @property {!shaka.extern.Request} request\n * @property {!shaka.extern.Response} response\n * @exportDoc\n */\n\n\n/**\n * @event shaka.Player.DownloadFailed\n * @description Fired when a download has failed, for any reason.\n * 'downloadfailed'\n * @property {!shaka.extern.Request} request\n * @property {?shaka.util.Error} error\n * @property {number} httpResponseCode\n * @property {boolean} aborted\n * @exportDoc\n */\n\n\n/**\n * @event shaka.Player.DownloadHeadersReceived\n * @description Fired when the networking engine has received the headers for\n * a download, but before the body has been downloaded.\n * If the HTTP plugin being used does not track this information, this event\n * will default to being fired when the body is received, instead.\n * @property {!Object<string, string>} headers\n * @property {!shaka.extern.Request} request\n * @property {!shaka.net.NetworkingEngine.RequestType} type\n * 'downloadheadersreceived'\n * @exportDoc\n */\n\n\n/**\n * @event shaka.Player.DrmSessionUpdateEvent\n * @description Fired when the CDM has accepted the license response.\n * @property {string} type\n * 'drmsessionupdate'\n * @exportDoc\n */\n\n\n/**\n * @event shaka.Player.TimelineRegionAddedEvent\n * @description Fired when a media timeline region is added.\n * @property {string} type\n * 'timelineregionadded'\n * @property {shaka.extern.TimelineRegionInfo} detail\n * An object which contains a description of the region.\n * @exportDoc\n */\n\n\n/**\n * @event shaka.Player.TimelineRegionEnterEvent\n * @description Fired when the playhead enters a timeline region.\n * @property {string} type\n * 'timelineregionenter'\n * @property {shaka.extern.TimelineRegionInfo} detail\n * An object which contains a description of the region.\n * @exportDoc\n */\n\n\n/**\n * @event shaka.Player.TimelineRegionExitEvent\n * @description Fired when the playhead exits a timeline region.\n * @property {string} type\n * 'timelineregionexit'\n * @property {shaka.extern.TimelineRegionInfo} detail\n * An object which contains a description of the region.\n * @exportDoc\n */\n\n/**\n * @event shaka.Player.MediaQualityChangedEvent\n * @description Fired when the media quality changes at the playhead.\n * That may be caused by an adaptation change or a DASH period transition.\n * Separate events are emitted for audio and video contentTypes.\n * @property {string} type\n * 'mediaqualitychanged'\n * @property {shaka.extern.MediaQualityInfo} mediaQuality\n * Information about media quality at the playhead position.\n * @property {number} position\n * The playhead position.\n * @exportDoc\n */\n\n/**\n * @event shaka.Player.MediaSourceRecoveredEvent\n * @description Fired when MediaSource has been successfully recovered\n * after occurrence of video error.\n * @property {string} type\n * 'mediasourcerecovered'\n * @exportDoc\n */\n\n/**\n * @event shaka.Player.AudioTrackChangedEvent\n * @description Fired when the audio track changes at the playhead.\n * That may be caused by a user requesting to chang audio tracks.\n * @property {string} type\n * 'audiotrackchanged'\n * @property {shaka.extern.MediaQualityInfo} mediaQuality\n * Information about media quality at the playhead position.\n * @property {number} position\n * The playhead position.\n * @exportDoc\n */\n\n\n/**\n * @event shaka.Player.BoundaryCrossedEvent\n * @description Fired when the player's crossed a boundary and reset\n * the MediaSource successfully.\n * @property {string} type\n * 'boundarycrossed'\n * @exportDoc\n */\n\n\n/**\n * @event shaka.Player.BufferingEvent\n * @description Fired when the player's buffering state changes.\n * @property {string} type\n * 'buffering'\n * @property {boolean} buffering\n * True when the Player enters the buffering state.\n * False when the Player leaves the buffering state.\n * @exportDoc\n */\n\n\n/**\n * @event shaka.Player.LoadingEvent\n * @description Fired when the player begins loading. The start of loading is\n * defined as when the user has communicated intent to load content (i.e.\n * <code>Player.load</code> has been called).\n * @property {string} type\n * 'loading'\n * @exportDoc\n */\n\n\n/**\n * @event shaka.Player.LoadedEvent\n * @description Fired when the player ends the load.\n * @property {string} type\n * 'loaded'\n * @exportDoc\n */\n\n\n/**\n * @event shaka.Player.UnloadingEvent\n * @description Fired when the player unloads or fails to load.\n * Used by the Cast receiver to determine idle state.\n * @property {string} type\n * 'unloading'\n * @exportDoc\n */\n\n\n/**\n * @event shaka.Player.TextTrackVisibilityEvent\n * @description Fired when text track visibility changes.\n * An app may want to look at <code>getStats()</code> or\n * <code>getVariantTracks()</code> to see what happened.\n * @property {string} type\n * 'texttrackvisibility'\n * @exportDoc\n */\n\n\n/**\n * @event shaka.Player.AudioTracksChangedEvent\n * @description Fired when the list of audio tracks changes.\n * An app may want to look at <code>getAudioTracks()</code> to see what\n * happened.\n * @property {string} type\n * 'audiotrackschanged'\n * @exportDoc\n */\n\n\n/**\n * @event shaka.Player.TracksChangedEvent\n * @description Fired when the list of tracks changes. For example, this will\n * happen when new tracks are added/removed or when track restrictions change.\n * An app may want to look at <code>getVariantTracks()</code> to see what\n * happened.\n * @property {string} type\n * 'trackschanged'\n * @exportDoc\n */\n\n\n/**\n * @event shaka.Player.AdaptationEvent\n * @description Fired when an automatic adaptation causes the active tracks\n * to change. Does not fire when the application calls\n * <code>selectVariantTrack()</code>, <code>selectTextTrack()</code>,\n * <code>selectAudioLanguage()</code>, or <code>selectTextLanguage()</code>.\n * @property {string} type\n * 'adaptation'\n * @property {shaka.extern.Track} oldTrack\n * @property {shaka.extern.Track} newTrack\n * @exportDoc\n */\n\n\n/**\n * @event shaka.Player.VariantChangedEvent\n * @description Fired when a call from the application caused a variant change.\n * Can be triggered by calls to <code>selectVariantTrack()</code> or\n * <code>selectAudioLanguage()</code>. Does not fire when an automatic\n * adaptation causes a variant change.\n * An app may want to look at <code>getStats()</code> or\n * <code>getVariantTracks()</code> to see what happened.\n * @property {string} type\n * 'variantchanged'\n * @property {shaka.extern.Track} oldTrack\n * @property {shaka.extern.Track} newTrack\n * @exportDoc\n */\n\n\n/**\n * @event shaka.Player.TextChangedEvent\n * @description Fired when a call from the application caused a text stream\n * change. Can be triggered by calls to <code>selectTextTrack()</code> or\n * <code>selectTextLanguage()</code>.\n * An app may want to look at <code>getStats()</code> or\n * <code>getTextTracks()</code> to see what happened.\n * @property {string} type\n * 'textchanged'\n * @exportDoc\n */\n\n\n/**\n * @event shaka.Player.ExpirationUpdatedEvent\n * @description Fired when there is a change in the expiration times of an\n * EME session.\n * @property {string} type\n * 'expirationupdated'\n * @exportDoc\n */\n\n\n/**\n * @event shaka.Player.ManifestParsedEvent\n * @description Fired after the manifest has been parsed, but before anything\n * else happens. The manifest may contain streams that will be filtered out,\n * at this stage of the loading process.\n * @property {string} type\n * 'manifestparsed'\n * @exportDoc\n */\n\n\n/**\n * @event shaka.Player.ManifestUpdatedEvent\n * @description Fired after the manifest has been updated (live streams).\n * @property {string} type\n * 'manifestupdated'\n * @property {boolean} isLive\n * True when the playlist is live. Useful to detect transition from live\n * to static playlist..\n * @exportDoc\n */\n\n\n/**\n * @event shaka.Player.MetadataEvent\n * @description Triggers after metadata associated with the stream is found.\n * Usually they are metadata of type ID3.\n * @property {string} type\n * 'metadata'\n * @property {number} startTime\n * The time that describes the beginning of the range of the metadata to\n * which the cue applies.\n * @property {?number} endTime\n * The time that describes the end of the range of the metadata to which\n * the cue applies.\n * @property {string} metadataType\n * Type of metadata. Eg: 'org.id3' or 'com.apple.quicktime.HLS'\n * @property {shaka.extern.MetadataFrame} payload\n * The metadata itself\n * @exportDoc\n */\n\n\n/**\n * @event shaka.Player.StreamingEvent\n * @description Fired after the manifest has been parsed and track information\n * is available, but before streams have been chosen and before any segments\n * have been fetched. You may use this event to configure the player based on\n * information found in the manifest.\n * @property {string} type\n * 'streaming'\n * @exportDoc\n */\n\n\n/**\n * @event shaka.Player.AbrStatusChangedEvent\n * @description Fired when the state of abr has been changed.\n * (Enabled or disabled).\n * @property {string} type\n * 'abrstatuschanged'\n * @property {boolean} newStatus\n * The new status of the application. True for 'is enabled' and\n * false otherwise.\n * @exportDoc\n */\n\n\n/**\n * @event shaka.Player.RateChangeEvent\n * @description Fired when the video's playback rate changes.\n * This allows the PlayRateController to update it's internal rate field,\n * before the UI updates playback button with the newest playback rate.\n * @property {string} type\n * 'ratechange'\n * @exportDoc\n */\n\n\n/**\n * @event shaka.Player.SegmentAppended\n * @description Fired when a segment is appended to the media element.\n * @property {string} type\n * 'segmentappended'\n * @property {number} start\n * The start time of the segment.\n * @property {number} end\n * The end time of the segment.\n * @property {string} contentType\n * The content type of the segment. E.g. 'video', 'audio', or 'text'.\n * @property {boolean} isMuxed\n * Indicates if the segment is muxed (audio + video).\n * @exportDoc\n */\n\n\n/**\n * @event shaka.Player.SessionDataEvent\n * @description Fired when the manifest parser find info about session data.\n * Specification: https://tools.ietf.org/html/rfc8216#section-4.3.4.4\n * @property {string} type\n * 'sessiondata'\n * @property {string} id\n * The id of the session data.\n * @property {string} uri\n * The uri with the session data info.\n * @property {string} language\n * The language of the session data.\n * @property {string} value\n * The value of the session data.\n * @exportDoc\n */\n\n\n/**\n * @event shaka.Player.StallDetectedEvent\n * @description Fired when a stall in playback is detected by the StallDetector.\n * Not all stalls are caused by gaps in the buffered ranges.\n * An app may want to look at <code>getStats()</code> to see what happened.\n * @property {string} type\n * 'stalldetected'\n * @exportDoc\n */\n\n\n/**\n * @event shaka.Player.GapJumpedEvent\n * @description Fired when the GapJumpingController jumps over a gap in the\n * buffered ranges.\n * An app may want to look at <code>getStats()</code> to see what happened.\n * @property {string} type\n * 'gapjumped'\n * @exportDoc\n */\n\n\n/**\n * @event shaka.Player.KeyStatusChanged\n * @description Fired when the key status changed.\n * @property {string} type\n * 'keystatuschanged'\n * @exportDoc\n */\n\n\n/**\n * @event shaka.Player.StateChanged\n * @description Fired when player state is changed.\n * @property {string} type\n * 'statechanged'\n * @property {string} newstate\n * The new state.\n * @exportDoc\n */\n\n\n/**\n * @event shaka.Player.Started\n * @description Fires when the content starts playing.\n * Only for VoD.\n * @property {string} type\n * 'started'\n * @exportDoc\n */\n\n\n/**\n * @event shaka.Player.FirstQuartile\n * @description Fires when the content playhead crosses first quartile.\n * Only for VoD.\n * @property {string} type\n * 'firstquartile'\n * @exportDoc\n */\n\n\n/**\n * @event shaka.Player.Midpoint\n * @description Fires when the content playhead crosses midpoint.\n * Only for VoD.\n * @property {string} type\n * 'midpoint'\n * @exportDoc\n */\n\n\n/**\n * @event shaka.Player.ThirdQuartile\n * @description Fires when the content playhead crosses third quartile.\n * Only for VoD.\n * @property {string} type\n * 'thirdquartile'\n * @exportDoc\n */\n\n\n/**\n * @event shaka.Player.Complete\n * @description Fires when the content completes playing.\n * Only for VoD.\n * @property {string} type\n * 'complete'\n * @exportDoc\n */\n\n\n/**\n * @event shaka.Player.SpatialVideoInfoEvent\n * @description Fired when the video has spatial video info. If a previous\n * event was fired, this include the new info.\n * @property {string} type\n * 'spatialvideoinfo'\n * @property {shaka.extern.SpatialVideoInfo} detail\n * An object which contains the content of the emsg box.\n * @exportDoc\n */\n\n\n/**\n * @event shaka.Player.NoSpatialVideoInfoEvent\n * @description Fired when the video no longer has spatial video information.\n * For it to be fired, the shaka.Player.SpatialVideoInfoEvent event must\n * have been previously fired.\n * @property {string} type\n * 'nospatialvideoinfo'\n * @exportDoc\n */\n\n\n/**\n * @event shaka.Player.ProducerReferenceTimeEvent\n * @description Fired when the content includes ProducerReferenceTime (PRFT)\n * info.\n * @property {string} type\n * 'prft'\n * @property {shaka.extern.ProducerReferenceTime} detail\n * An object which contains the content of the PRFT box.\n * @exportDoc\n */\n\n\n/**\n * @summary The main player object for Shaka Player.\n *\n * @implements {shaka.util.IDestroyable}\n * @export\n */\nshaka.Player = class extends shaka.util.FakeEventTarget {\n /**\n * @param {HTMLMediaElement=} mediaElement\n * When provided, the player will attach to <code>mediaElement</code>,\n * similar to calling <code>attach</code>. When not provided, the player\n * will remain detached.\n * @param {HTMLElement=} videoContainer\n * The videoContainer to construct UITextDisplayer\n * @param {function(shaka.Player)=} dependencyInjector Optional callback\n * which is called to inject mocks into the Player. Used for testing.\n */\n constructor(mediaElement, videoContainer = null, dependencyInjector) {\n super();\n\n /** @private {shaka.Player.LoadMode} */\n this.loadMode_ = shaka.Player.LoadMode.NOT_LOADED;\n\n /** @private {HTMLMediaElement} */\n this.video_ = null;\n\n /** @private {HTMLElement} */\n this.videoContainer_ = videoContainer;\n\n /**\n * Since we may not always have a text displayer created (e.g. before |load|\n * is called), we need to track what text visibility SHOULD be so that we\n * can ensure that when we create the text displayer. When we create our\n * text displayer, we will use this to show (or not show) text as per the\n * user's requests.\n *\n * @private {boolean}\n */\n this.isTextVisible_ = false;\n\n /**\n * For listeners scoped to the lifetime of the Player instance.\n * @private {shaka.util.EventManager}\n */\n this.globalEventManager_ = new shaka.util.EventManager();\n\n /**\n * For listeners scoped to the lifetime of the media element attachment.\n * @private {shaka.util.EventManager}\n */\n this.attachEventManager_ = new shaka.util.EventManager();\n\n /**\n * For listeners scoped to the lifetime of the loaded content.\n * @private {shaka.util.EventManager}\n */\n this.loadEventManager_ = new shaka.util.EventManager();\n\n /**\n * For listeners scoped to the lifetime of the loaded content.\n * @private {shaka.util.EventManager}\n */\n this.trickPlayEventManager_ = new shaka.util.EventManager();\n\n /**\n * For listeners scoped to the lifetime of the ad manager.\n * @private {shaka.util.EventManager}\n */\n this.adManagerEventManager_ = new shaka.util.EventManager();\n\n /** @private {shaka.net.NetworkingEngine} */\n this.networkingEngine_ = null;\n\n /** @private {shaka.drm.DrmEngine} */\n this.drmEngine_ = null;\n\n /** @private {shaka.media.MediaSourceEngine} */\n this.mediaSourceEngine_ = null;\n\n /** @private {shaka.media.Playhead} */\n this.playhead_ = null;\n\n /**\n * Incremented whenever a top-level operation (load, attach, etc) is\n * performed.\n * Used to determine if a load operation has been interrupted.\n * @private {number}\n */\n this.operationId_ = 0;\n\n /** @private {!shaka.util.Mutex} */\n this.mutex_ = new shaka.util.Mutex();\n\n /**\n * The playhead observers are used to monitor the position of the playhead\n * and some other source of data (e.g. buffered content), and raise events.\n *\n * @private {shaka.media.PlayheadObserverManager}\n */\n this.playheadObservers_ = null;\n\n /**\n * This is our control over the playback rate of the media element. This\n * provides the missing functionality that we need to provide trick play,\n * for example a negative playback rate.\n *\n * @private {shaka.media.PlayRateController}\n */\n this.playRateController_ = null;\n\n // We use the buffering observer and timer to track when we move from having\n // enough buffered content to not enough. They only exist when content has\n // been loaded and are not re-used between loads.\n /** @private {shaka.util.Timer} */\n this.bufferPoller_ = null;\n\n /** @private {shaka.media.BufferingObserver} */\n this.bufferObserver_ = null;\n\n /**\n * @private {shaka.media.RegionTimeline<\n * shaka.extern.TimelineRegionInfo>}\n */\n this.regionTimeline_ = null;\n\n /**\n * @private {shaka.media.RegionTimeline<\n * shaka.extern.MetadataTimelineRegionInfo>}\n */\n this.metadataRegionTimeline_ = null;\n\n /**\n * @private {shaka.media.RegionTimeline<\n * shaka.extern.EmsgTimelineRegionInfo>}\n */\n this.emsgRegionTimeline_ = null;\n\n /** @private {shaka.util.CmcdManager} */\n this.cmcdManager_ = null;\n\n /** @private {shaka.util.CmsdManager} */\n this.cmsdManager_ = null;\n\n // This is the canvas element that will be used for rendering LCEVC\n // enhanced frames.\n /** @private {?HTMLCanvasElement} */\n this.lcevcCanvas_ = null;\n\n // This is the LCEVC Decoder object to decode LCEVC.\n /** @private {?shaka.lcevc.Dec} */\n this.lcevcDec_ = null;\n\n /** @private {shaka.media.QualityObserver} */\n this.qualityObserver_ = null;\n\n /** @private {shaka.media.StreamingEngine} */\n this.streamingEngine_ = null;\n\n /** @private {shaka.extern.ManifestParser} */\n this.parser_ = null;\n\n /** @private {?shaka.extern.ManifestParser.Factory} */\n this.parserFactory_ = null;\n\n /** @private {?shaka.extern.Manifest} */\n this.manifest_ = null;\n\n /** @private {?string} */\n this.assetUri_ = null;\n\n /** @private {?string} */\n this.mimeType_ = null;\n\n /** @private {?number} */\n this.startTime_ = null;\n\n /** @private {boolean} */\n this.fullyLoaded_ = false;\n\n /** @private {shaka.extern.AbrManager} */\n this.abrManager_ = null;\n\n /**\n * The factory that was used to create the abrManager_ instance.\n * @private {?shaka.extern.AbrManager.Factory}\n */\n this.abrManagerFactory_ = null;\n\n /**\n * Contains an ID for use with creating streams. The manifest parser should\n * start with small IDs, so this starts with a large one.\n * @private {number}\n */\n this.nextExternalStreamId_ = 1e9;\n\n /** @private {!Array<shaka.extern.Stream>} */\n this.externalSrcEqualsThumbnailsStreams_ = [];\n\n /** @private {number} */\n this.completionPercent_ = -1;\n\n /** @private {?shaka.extern.PlayerConfiguration} */\n this.config_ = this.defaultConfig_();\n\n /** @private {!Object} */\n this.lowLatencyConfig_ =\n shaka.util.PlayerConfiguration.createDefaultForLL();\n\n /** @private {?number} */\n this.currentTargetLatency_ = null;\n\n /** @private {number} */\n this.rebufferingCount_ = -1;\n\n /** @private {?number} */\n this.targetLatencyReached_ = null;\n\n /**\n * The TextDisplayerFactory that was last used to make a text displayer.\n * Stored so that we can tell if a new type of text displayer is desired.\n * @private {?shaka.extern.TextDisplayer.Factory}\n */\n this.lastTextFactory_;\n\n /** @private {shaka.extern.Resolution} */\n this.maxHwRes_ = {width: Infinity, height: Infinity};\n\n /** @private {!shaka.media.ManifestFilterer} */\n this.manifestFilterer_ = new shaka.media.ManifestFilterer(\n this.config_, this.maxHwRes_, null);\n\n /** @private {!Array<shaka.media.PreloadManager>} */\n this.createdPreloadManagers_ = [];\n\n /** @private {shaka.util.Stats} */\n this.stats_ = null;\n\n /** @private {!shaka.media.AdaptationSetCriteria} */\n this.currentAdaptationSetCriteria_ =\n this.config_.adaptationSetCriteriaFactory();\n this.currentAdaptationSetCriteria_.configure({\n language: this.config_.preferredAudioLanguage,\n role: this.config_.preferredVariantRole,\n channelCount: this.config_.preferredAudioChannelCount,\n hdrLevel: this.config_.preferredVideoHdrLevel,\n spatialAudio: this.config_.preferSpatialAudio,\n videoLayout: this.config_.preferredVideoLayout,\n audioLabel: this.config_.preferredAudioLabel,\n videoLabel: this.config_.preferredVideoLabel,\n codecSwitchingStrategy:\n this.config_.mediaSource.codecSwitchingStrategy,\n audioCodec: '',\n });\n\n /** @private {string} */\n this.currentTextLanguage_ = this.config_.preferredTextLanguage;\n\n /** @private {string} */\n this.currentTextRole_ = this.config_.preferredTextRole;\n\n /** @private {boolean} */\n this.currentTextForced_ = this.config_.preferForcedSubs;\n\n /** @private {!Array<function(): (!Promise | undefined)>} */\n this.cleanupOnUnload_ = [];\n\n if (dependencyInjector) {\n dependencyInjector(this);\n }\n\n\n // Create the CMCD manager so client data can be attached to all requests\n this.cmcdManager_ = this.createCmcd_();\n\n this.cmsdManager_ = this.createCmsd_();\n\n this.networkingEngine_ = this.createNetworkingEngine();\n this.networkingEngine_.setForceHTTP(this.config_.streaming.forceHTTP);\n this.networkingEngine_.setForceHTTPS(this.config_.streaming.forceHTTPS);\n this.networkingEngine_.setMinBytesForProgressEvents(\n this.config_.streaming.minBytesForProgressEvents);\n\n /** @private {shaka.extern.IAdManager} */\n this.adManager_ = null;\n\n /** @private {?shaka.media.PreloadManager} */\n this.preloadDueAdManager_ = null;\n\n /** @private {HTMLMediaElement} */\n this.preloadDueAdManagerVideo_ = null;\n\n /** @private {boolean} */\n this.preloadDueAdManagerVideoEnded_ = false;\n\n /** @private {shaka.util.Timer} */\n this.preloadDueAdManagerTimer_ = new shaka.util.Timer(async () => {\n if (this.preloadDueAdManager_) {\n goog.asserts.assert(this.preloadDueAdManagerVideo_, 'Must have video');\n await this.attach(\n this.preloadDueAdManagerVideo_, /* initializeMediaSource= */ true);\n await this.load(this.preloadDueAdManager_);\n if (!this.preloadDueAdManagerVideoEnded_) {\n this.preloadDueAdManagerVideo_.play();\n } else {\n this.preloadDueAdManagerVideo_.pause();\n }\n this.preloadDueAdManager_ = null;\n this.preloadDueAdManagerVideoEnded_ = false;\n }\n });\n\n if (shaka.Player.adManagerFactory_) {\n this.adManager_ = shaka.Player.adManagerFactory_();\n this.adManager_.configure(this.config_.ads);\n\n // Note: we don't use shaka.ads.Utils.AD_CONTENT_PAUSE_REQUESTED to\n // avoid add a optional module in the player.\n this.adManagerEventManager_.listen(\n this.adManager_, 'ad-content-pause-requested', async (e) => {\n this.preloadDueAdManagerTimer_.stop();\n if (!this.preloadDueAdManager_) {\n this.preloadDueAdManagerVideo_ = this.video_;\n this.preloadDueAdManagerVideoEnded_ = this.isEnded();\n const saveLivePosition = /** @type {boolean} */(\n e['saveLivePosition']) || false;\n this.preloadDueAdManager_ = await this.detachAndSavePreload(\n /* keepAdManager= */ true, saveLivePosition);\n }\n });\n\n // Note: we don't use shaka.ads.Utils.AD_CONTENT_RESUME_REQUESTED to\n // avoid add a optional module in the player.\n this.adManagerEventManager_.listen(\n this.adManager_, 'ad-content-resume-requested', (e) => {\n const offset = /** @type {number} */(e['offset']) || 0;\n if (this.preloadDueAdManager_) {\n this.preloadDueAdManager_.setOffsetToStartTime(offset);\n }\n this.preloadDueAdManagerTimer_.tickAfter(0.1);\n });\n\n // Note: we don't use shaka.ads.Utils.AD_CONTENT_ATTACH_REQUESTED to\n // avoid add a optional module in the player.\n this.adManagerEventManager_.listen(\n this.adManager_, 'ad-content-attach-requested', async (e) => {\n if (!this.video_ && this.preloadDueAdManagerVideo_) {\n goog.asserts.assert(this.preloadDueAdManagerVideo_,\n 'Must have video');\n await this.attach(this.preloadDueAdManagerVideo_,\n /* initializeMediaSource= */ true);\n }\n });\n }\n\n // If the browser comes back online after being offline, then try to play\n // again.\n this.globalEventManager_.listen(window, 'online', () => {\n this.restoreDisabledVariants_();\n this.retryStreaming();\n });\n\n /** @private {shaka.util.Timer} */\n this.checkVariantsTimer_ =\n new shaka.util.Timer(() => this.checkVariants_());\n\n /** @private {?shaka.media.PreloadManager} */\n this.preloadNextUrl_ = null;\n\n // Even though |attach| will start in later interpreter cycles, it should be\n // the LAST thing we do in the constructor because conceptually it relies on\n // player having been initialized.\n if (mediaElement) {\n shaka.Deprecate.deprecateFeature(5,\n 'Player w/ mediaElement',\n 'Please migrate from initializing Player with a mediaElement; ' +\n 'use the attach method instead.');\n this.attach(mediaElement, /* initializeMediaSource= */ true);\n }\n\n /** @private {?shaka.extern.TextDisplayer} */\n this.textDisplayer_ = null;\n }\n\n /**\n * Create a shaka.lcevc.Dec object\n * @param {shaka.extern.LcevcConfiguration} config\n * @param {boolean} isDualTrack\n * @private\n */\n createLcevcDec_(config, isDualTrack) {\n if (this.lcevcDec_ == null) {\n this.lcevcDec_ = new shaka.lcevc.Dec(\n /** @type {HTMLVideoElement} */ (this.video_),\n this.lcevcCanvas_,\n config,\n isDualTrack,\n );\n if (this.mediaSourceEngine_) {\n this.mediaSourceEngine_.updateLcevcDec(this.lcevcDec_);\n }\n }\n }\n\n /**\n * Close a shaka.lcevc.Dec object if present and hide the canvas.\n * @private\n */\n closeLcevcDec_() {\n if (this.lcevcDec_ != null) {\n this.lcevcDec_.hideCanvas();\n this.lcevcDec_.release();\n this.lcevcDec_ = null;\n }\n }\n\n /**\n * Setup shaka.lcevc.Dec object\n * @param {?shaka.extern.PlayerConfiguration} config\n * @param {boolean} isDualTrack\n * @private\n */\n setupLcevc_(config, isDualTrack) {\n if (isDualTrack || config.lcevc.enabled) {\n this.closeLcevcDec_();\n this.createLcevcDec_(config.lcevc, isDualTrack);\n } else {\n this.closeLcevcDec_();\n }\n }\n\n /**\n * @param {!shaka.util.FakeEvent.EventName} name\n * @param {Map<string, Object>=} data\n * @return {!shaka.util.FakeEvent}\n * @private\n */\n static makeEvent_(name, data) {\n return new shaka.util.FakeEvent(name, data);\n }\n\n /**\n * After destruction, a Player object cannot be used again.\n *\n * @override\n * @export\n */\n async destroy() {\n // Make sure we only execute the destroy logic once.\n if (this.loadMode_ == shaka.Player.LoadMode.DESTROYED) {\n return;\n }\n\n // If LCEVC Decoder exists close it.\n this.closeLcevcDec_();\n\n const detachPromise = this.detach();\n\n // Mark as \"dead\". This should stop external-facing calls from changing our\n // internal state any more. This will stop calls to |attach|, |detach|, etc.\n // from interrupting our final move to the detached state.\n this.loadMode_ = shaka.Player.LoadMode.DESTROYED;\n\n await detachPromise;\n\n // A PreloadManager can only be used with the Player instance that created\n // it, so all PreloadManagers this Player has created are now useless.\n // Destroy any remaining managers now, to help prevent memory leaks.\n await this.destroyAllPreloads();\n\n // Tear-down the event managers to ensure handlers stop firing.\n if (this.globalEventManager_) {\n this.globalEventManager_.release();\n this.globalEventManager_ = null;\n }\n if (this.attachEventManager_) {\n this.attachEventManager_.release();\n this.attachEventManager_ = null;\n }\n if (this.loadEventManager_) {\n this.loadEventManager_.release();\n this.loadEventManager_ = null;\n }\n if (this.trickPlayEventManager_) {\n this.trickPlayEventManager_.release();\n this.trickPlayEventManager_ = null;\n }\n if (this.adManagerEventManager_) {\n this.adManagerEventManager_.release();\n this.adManagerEventManager_ = null;\n }\n\n this.abrManagerFactory_ = null;\n this.config_ = null;\n this.stats_ = null;\n this.videoContainer_ = null;\n this.cmcdManager_ = null;\n this.cmsdManager_ = null;\n\n if (this.networkingEngine_) {\n await this.networkingEngine_.destroy();\n this.networkingEngine_ = null;\n }\n\n if (this.abrManager_) {\n this.abrManager_.release();\n this.abrManager_ = null;\n }\n\n // FakeEventTarget implements IReleasable\n super.release();\n }\n\n /**\n * Registers a plugin callback that will be called with\n * <code>support()</code>. The callback will return the value that will be\n * stored in the return value from <code>support()</code>.\n *\n * @param {string} name\n * @param {function():*} callback\n * @export\n */\n static registerSupportPlugin(name, callback) {\n shaka.Player.supportPlugins_.set(name, callback);\n }\n\n /**\n * Set a factory to create an ad manager during player construction time.\n * This method needs to be called before instantiating the Player class.\n *\n * @param {!shaka.extern.IAdManager.Factory} factory\n * @export\n */\n static setAdManagerFactory(factory) {\n shaka.Player.adManagerFactory_ = factory;\n }\n\n /**\n * Return whether the browser provides basic support. If this returns false,\n * Shaka Player cannot be used at all. In this case, do not construct a\n * Player instance and do not use the library.\n *\n * @return {boolean}\n * @export\n */\n static isBrowserSupported() {\n if (!window.Promise) {\n shaka.log.alwaysWarn('A Promise implementation or polyfill is required');\n }\n\n // Basic features needed for the library to be usable.\n const basicSupport = !!window.Promise && !!window.Uint8Array &&\n // eslint-disable-next-line no-restricted-syntax\n !!Array.prototype.forEach;\n if (!basicSupport) {\n return false;\n }\n\n // We do not support IE\n if (shaka.util.Platform.isIE()) {\n return false;\n }\n\n // If we have MediaSource (MSE) support, we should be able to use Shaka.\n if (shaka.util.Platform.supportsMediaSource()) {\n return true;\n }\n\n // If we don't have MSE, we _may_ be able to use Shaka. Look for native HLS\n // support, and call this platform usable if we have it.\n return shaka.util.Platform.supportsMediaType('application/x-mpegurl');\n }\n\n /**\n * Probes the browser to determine what features are supported. This makes a\n * number of requests to EME/MSE/etc which may result in user prompts. This\n * should only be used for diagnostics.\n *\n * <p>\n * NOTE: This may show a request to the user for permission.\n *\n * @see https://bit.ly/2ywccmH\n * @param {boolean=} promptsOkay\n * @return {!Promise<shaka.extern.SupportType>}\n * @export\n */\n static async probeSupport(promptsOkay=true) {\n goog.asserts.assert(shaka.Player.isBrowserSupported(),\n 'Must have basic support');\n let drm = {};\n if (promptsOkay) {\n drm = await shaka.drm.DrmEngine.probeSupport();\n }\n const manifest = shaka.media.ManifestParser.probeSupport();\n const media = shaka.media.MediaSourceEngine.probeSupport();\n const hardwareResolution =\n await shaka.util.Platform.detectMaxHardwareResolution();\n\n /** @type {shaka.extern.SupportType} */\n const ret = {\n manifest,\n media,\n drm,\n hardwareResolution,\n };\n\n const plugins = shaka.Player.supportPlugins_;\n plugins.forEach((value, key) => {\n ret[key] = value();\n });\n\n return ret;\n }\n\n /**\n * Makes a fires an event corresponding to entering a state of the loading\n * process.\n * @param {string} nodeName\n * @private\n */\n makeStateChangeEvent_(nodeName) {\n this.dispatchEvent(shaka.Player.makeEvent_(\n /* name= */ shaka.util.FakeEvent.EventName.OnStateChange,\n /* data= */ (new Map()).set('state', nodeName)));\n }\n\n /**\n * Attaches the player to a media element.\n * If the player was already attached to a media element, first detaches from\n * that media element.\n *\n * @param {!HTMLMediaElement} mediaElement\n * @param {boolean=} initializeMediaSource\n * @return {!Promise}\n * @export\n */\n async attach(mediaElement, initializeMediaSource = true) {\n // Do not allow the player to be used after |destroy| is called.\n if (this.loadMode_ == shaka.Player.LoadMode.DESTROYED) {\n throw this.createAbortLoadError_();\n }\n\n const noop = this.video_ && this.video_ == mediaElement;\n\n if (this.video_ && this.video_ != mediaElement) {\n await this.detach();\n }\n\n if (await this.atomicOperationAcquireMutex_('attach')) {\n return;\n }\n\n try {\n if (!noop) {\n this.makeStateChangeEvent_('attach');\n\n const onError = (error) => this.onVideoError_(error);\n this.attachEventManager_.listen(mediaElement, 'error', onError);\n this.video_ = mediaElement;\n if (this.cmcdManager_) {\n this.cmcdManager_.setMediaElement(mediaElement);\n }\n }\n\n // Only initialize media source if the platform supports it.\n if (initializeMediaSource &&\n shaka.util.Platform.supportsMediaSource() &&\n !this.mediaSourceEngine_) {\n await this.initializeMediaSourceEngineInner_();\n }\n } catch (error) {\n await this.detach();\n throw error;\n } finally {\n this.mutex_.release();\n }\n }\n\n\n /**\n * Calling <code>attachCanvas</code> will tell the player to set canvas\n * element for LCEVC decoding.\n *\n * @param {HTMLCanvasElement} canvas\n * @export\n */\n attachCanvas(canvas) {\n this.lcevcCanvas_ = canvas;\n }\n\n /**\n * Detach the player from the current media element. Leaves the player in a\n * state where it cannot play media, until it has been attached to something\n * else.\n *\n * @param {boolean=} keepAdManager\n *\n * @return {!Promise}\n * @export\n */\n async detach(keepAdManager = false) {\n // Do not allow the player to be used after |destroy| is called.\n if (this.loadMode_ == shaka.Player.LoadMode.DESTROYED) {\n throw this.createAbortLoadError_();\n }\n\n await this.unload(/* initializeMediaSource= */ false, keepAdManager);\n\n if (await this.atomicOperationAcquireMutex_('detach')) {\n return;\n }\n\n try {\n // If we were going from \"detached\" to \"detached\" we wouldn't have\n // a media element to detach from.\n if (this.video_) {\n this.attachEventManager_.removeAll();\n this.video_ = null;\n }\n\n this.makeStateChangeEvent_('detach');\n\n if (this.adManager_ && !keepAdManager) {\n // The ad manager is specific to the video, so detach it too.\n this.adManager_.release();\n }\n } finally {\n this.mutex_.release();\n }\n }\n\n /**\n * Tries to acquire the mutex, and then returns if the operation should end\n * early due to someone else starting a mutex-acquiring operation.\n * Meant for operations that can't be interrupted midway through (e.g.\n * everything but load).\n * @param {string} mutexIdentifier\n * @return {!Promise<boolean>} endEarly If false, the calling context will\n * need to release the mutex.\n * @private\n */\n async atomicOperationAcquireMutex_(mutexIdentifier) {\n const operationId = ++this.operationId_;\n await this.mutex_.acquire(mutexIdentifier);\n if (operationId != this.operationId_) {\n this.mutex_.release();\n return true;\n }\n return false;\n }\n\n /**\n * Unloads the currently playing stream, if any.\n *\n * @param {boolean=} initializeMediaSource\n * @param {boolean=} keepAdManager\n * @return {!Promise}\n * @export\n */\n async unload(initializeMediaSource = true, keepAdManager = false) {\n // Set the load mode to unload right away so that all the public methods\n // will stop using the internal components. We need to make sure that we\n // are not overriding the destroyed state because we will unload when we are\n // destroying the player.\n if (this.loadMode_ != shaka.Player.LoadMode.DESTROYED) {\n this.loadMode_ = shaka.Player.LoadMode.NOT_LOADED;\n }\n\n if (await this.atomicOperationAcquireMutex_('unload')) {\n return;\n }\n\n try {\n this.fullyLoaded_ = false;\n this.makeStateChangeEvent_('unload');\n\n // If LCEVC Decoder exists close it.\n this.closeLcevcDec_();\n\n // Run any general cleanup tasks now. This should be here at the top,\n // right after setting loadMode_, so that internal components still exist\n // as they did when the cleanup tasks were registered in the array.\n const cleanupTasks = this.cleanupOnUnload_.map((cb) => cb());\n this.cleanupOnUnload_ = [];\n await Promise.all(cleanupTasks);\n\n // Dispatch the unloading event.\n this.dispatchEvent(\n shaka.Player.makeEvent_(shaka.util.FakeEvent.EventName.Unloading));\n\n // Release the region timeline, which is created when parsing the\n // manifest.\n if (this.regionTimeline_) {\n this.regionTimeline_.release();\n this.regionTimeline_ = null;\n }\n if (this.metadataRegionTimeline_) {\n this.metadataRegionTimeline_.release();\n this.metadataRegionTimeline_ = null;\n }\n if (this.emsgRegionTimeline_) {\n this.emsgRegionTimeline_.release();\n this.emsgRegionTimeline_ = null;\n }\n\n // In most cases we should have a media element. The one exception would\n // be if there was an error and we, by chance, did not have a media\n // element.\n if (this.video_) {\n this.loadEventManager_.removeAll();\n this.trickPlayEventManager_.removeAll();\n }\n\n // Stop the variant checker timer\n this.checkVariantsTimer_.stop();\n\n // Some observers use some playback components, shutting down the\n // observers first ensures that they don't try to use the playback\n // components mid-destroy.\n if (this.playheadObservers_) {\n this.playheadObservers_.release();\n this.playheadObservers_ = null;\n }\n\n if (this.bufferPoller_) {\n this.bufferPoller_.stop();\n this.bufferPoller_ = null;\n }\n\n // Stop the parser early. Since it is at the start of the pipeline, it\n // should be start early to avoid is pushing new data downstream.\n if (this.parser_) {\n await this.parser_.stop();\n this.parser_ = null;\n this.parserFactory_ = null;\n }\n\n // Abr Manager will tell streaming engine what to do, so we need to stop\n // it before we destroy streaming engine. Unlike with the other\n // components, we do not release the instance, we will reuse it in later\n // loads.\n if (this.abrManager_) {\n await this.abrManager_.stop();\n }\n\n // Streaming engine will push new data to media source engine, so we need\n // to shut it down before destroy media source engine.\n if (this.streamingEngine_) {\n await this.streamingEngine_.destroy();\n this.streamingEngine_ = null;\n }\n\n if (this.playRateController_) {\n this.playRateController_.release();\n this.playRateController_ = null;\n }\n\n // Playhead is used by StreamingEngine, so we can't destroy this until\n // after StreamingEngine has stopped.\n if (this.playhead_) {\n this.playhead_.release();\n this.playhead_ = null;\n }\n\n // EME v0.1b requires the media element to clear the MediaKeys\n if (shaka.drm.DrmUtils.isMediaKeysPolyfilled('webkit') &&\n this.drmEngine_) {\n await this.drmEngine_.destroy();\n this.drmEngine_ = null;\n }\n\n // Media source engine holds onto the media element, and in order to\n // detach the media keys (with drm engine), we need to break the\n // connection between media source engine and the media element.\n if (this.mediaSourceEngine_) {\n await this.mediaSourceEngine_.destroy();\n this.mediaSourceEngine_ = null;\n }\n\n if (this.adManager_ && !keepAdManager) {\n this.adManager_.onAssetUnload();\n }\n\n if (this.preloadDueAdManager_ && !keepAdManager) {\n this.preloadDueAdManager_.destroy();\n this.preloadDueAdManager_ = null;\n }\n\n if (!keepAdManager) {\n this.preloadDueAdManagerTimer_.stop();\n }\n\n if (this.cmcdManager_) {\n this.cmcdManager_.reset();\n }\n\n if (this.cmsdManager_) {\n this.cmsdManager_.reset();\n }\n\n if (this.textDisplayer_) {\n await this.textDisplayer_.destroy();\n this.textDisplayer_ = null;\n }\n\n if (this.video_) {\n // Remove all track nodes\n shaka.util.Dom.removeAllChildren(this.video_);\n\n // In order to unload a media element, we need to remove the src\n // attribute and then load again. When we destroy media source engine,\n // this will be done for us, but for src=, we need to do it here.\n //\n // DrmEngine requires this to be done before we destroy DrmEngine\n // itself.\n if (this.video_.src) {\n this.video_.removeAttribute('src');\n this.video_.load();\n }\n }\n\n if (this.drmEngine_) {\n await this.drmEngine_.destroy();\n this.drmEngine_ = null;\n }\n\n if (this.preloadNextUrl_ &&\n this.assetUri_ != this.preloadNextUrl_.getAssetUri()) {\n if (!this.preloadNextUrl_.isDestroyed()) {\n this.preloadNextUrl_.destroy();\n }\n this.preloadNextUrl_ = null;\n }\n\n this.assetUri_ = null;\n this.mimeType_ = null;\n this.bufferObserver_ = null;\n\n if (this.manifest_) {\n for (const variant of this.manifest_.variants) {\n for (const stream of [variant.audio, variant.video]) {\n if (stream && stream.segmentIndex) {\n stream.segmentIndex.release();\n }\n }\n }\n for (const stream of this.manifest_.textStreams) {\n if (stream.segmentIndex) {\n stream.segmentIndex.release();\n }\n }\n }\n\n // On some devices, cached MediaKeySystemAccess objects may corrupt\n // after several playbacks, and they are not able anymore to properly\n // create MediaKeys objects. To prevent it, clear the cache after\n // each playback.\n if (this.config_ && this.config_.streaming.clearDecodingCache) {\n shaka.util.StreamUtils.clearDecodingConfigCache();\n shaka.drm.DrmUtils.clearMediaKeySystemAccessMap();\n }\n\n this.manifest_ = null;\n this.stats_ = new shaka.util.Stats(); // Replace with a clean object.\n this.lastTextFactory_ = null;\n\n this.targetLatencyReached_ = null;\n this.currentTargetLatency_ = null;\n this.rebufferingCount_ = -1;\n\n this.externalSrcEqualsThumbnailsStreams_ = [];\n\n this.completionPercent_ = -1;\n\n if (this.networkingEngine_) {\n this.networkingEngine_.clearCommonAccessTokenMap();\n }\n\n // Make sure that the app knows of the new buffering state.\n this.updateBufferState_();\n } finally {\n this.mutex_.release();\n }\n\n if (initializeMediaSource && shaka.util.Platform.supportsMediaSource() &&\n !this.mediaSourceEngine_ && this.video_) {\n await this.initializeMediaSourceEngineInner_();\n }\n }\n\n /**\n * Provides a way to update the stream start position during the media loading\n * process. Can for example be called from the <code>manifestparsed</code>\n * event handler to update the start position based on information in the\n * manifest.\n *\n * @param {number} startTime\n * @export\n */\n updateStartTime(startTime) {\n this.startTime_ = startTime;\n }\n\n /**\n * Loads a new stream.\n * If another stream was already playing, first unloads that stream.\n *\n * @param {string|shaka.media.PreloadManager} assetUriOrPreloader\n * @param {?number=} startTime\n * When <code>startTime</code> is <code>null</code> or\n * <code>undefined</code>, playback will start at the default start time (0\n * for VOD and liveEdge for LIVE).\n * @param {?string=} mimeType\n * @return {!Promise}\n * @export\n */\n async load(assetUriOrPreloader, startTime = null, mimeType) {\n // Do not allow the player to be used after |destroy| is called.\n if (this.loadMode_ == shaka.Player.LoadMode.DESTROYED) {\n throw this.createAbortLoadError_();\n }\n\n /** @type {?shaka.media.PreloadManager} */\n let preloadManager = null;\n let assetUri = '';\n if (assetUriOrPreloader instanceof shaka.media.PreloadManager) {\n if (assetUriOrPreloader.isDestroyed()) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.PLAYER,\n shaka.util.Error.Code.PRELOAD_DESTROYED);\n }\n preloadManager = assetUriOrPreloader;\n assetUri = preloadManager.getAssetUri() || '';\n } else {\n assetUri = assetUriOrPreloader || '';\n }\n\n // Quickly acquire the mutex, so this will wait for other top-level\n // operations.\n await this.mutex_.acquire('load');\n this.mutex_.release();\n\n if (!this.video_) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.PLAYER,\n shaka.util.Error.Code.NO_VIDEO_ELEMENT);\n }\n\n if (this.assetUri_) {\n // Note: This is used to avoid the destruction of the nextUrl\n // preloadManager that can be the current one.\n this.assetUri_ = assetUri;\n await this.unload(/* initializeMediaSource= */ false);\n }\n\n // Add a mechanism to detect if the load process has been interrupted by a\n // call to another top-level operation (unload, load, etc).\n const operationId = ++this.operationId_;\n const detectInterruption = async () => {\n if (this.operationId_ != operationId) {\n if (preloadManager) {\n await preloadManager.destroy();\n }\n throw this.createAbortLoadError_();\n }\n };\n\n /**\n * Wraps a given operation with mutex.acquire and mutex.release, along with\n * calls to detectInterruption, to catch any other top-level calls happening\n * while waiting for the mutex.\n * @param {function():!Promise} operation\n * @param {string} mutexIdentifier\n * @return {!Promise}\n */\n const mutexWrapOperation = async (operation, mutexIdentifier) => {\n try {\n await this.mutex_.acquire(mutexIdentifier);\n await detectInterruption();\n await operation();\n await detectInterruption();\n if (preloadManager && this.config_) {\n preloadManager.reconfigure(this.config_);\n }\n } finally {\n this.mutex_.release();\n }\n };\n\n try {\n if (startTime == null && preloadManager) {\n startTime = preloadManager.getStartTime();\n }\n this.startTime_ = startTime;\n this.fullyLoaded_ = false;\n\n // We dispatch the loading event when someone calls |load| because we want\n // to surface the user intent.\n this.dispatchEvent(shaka.Player.makeEvent_(\n shaka.util.FakeEvent.EventName.Loading));\n\n if (preloadManager) {\n mimeType = preloadManager.getMimeType();\n } else if (!mimeType) {\n await mutexWrapOperation(async () => {\n mimeType = await this.guessMimeType_(assetUri);\n }, 'guessMimeType_');\n }\n\n const wasPreloaded = !!preloadManager;\n if (!preloadManager) {\n // For simplicity, if an asset is NOT preloaded, start an internal\n // \"preload\" here without prefetch.\n // That way, both a preload and normal load can follow the same code\n // paths.\n // NOTE: await preloadInner_ can be outside the mutex because it should\n // not mutate \"this\".\n preloadManager = await this.preloadInner_(\n assetUri, startTime, mimeType, /* standardLoad= */ true);\n if (preloadManager) {\n preloadManager.markIsLoad();\n preloadManager.setEventHandoffTarget(this);\n this.stats_ = preloadManager.getStats();\n preloadManager.start();\n // Silence \"uncaught error\" warnings from this. Unless we are\n // interrupted, we will check the result of this process and respond\n // appropriately. If we are interrupted, we can ignore any error\n // there.\n preloadManager.waitForFinish().catch(() => {});\n } else {\n this.stats_ = new shaka.util.Stats();\n }\n } else {\n // Hook up events, so any events emitted by the preloadManager will\n // instead be emitted by the player.\n preloadManager.setEventHandoffTarget(this);\n this.stats_ = preloadManager.getStats();\n }\n // Now, if there is no preload manager, that means that this is a src=\n // asset.\n const shouldUseSrcEquals = !preloadManager;\n\n const startTimeOfLoad = Date.now() / 1000;\n\n // Stats are for a single playback/load session. Stats must be initialized\n // before we allow calls to |updateStateHistory|.\n this.stats_ =\n preloadManager ? preloadManager.getStats() : new shaka.util.Stats();\n\n this.assetUri_ = assetUri;\n this.mimeType_ = mimeType || null;\n\n this.metadataRegionTimeline_ =\n new shaka.media.RegionTimeline(() => this.seekRange());\n\n if (shouldUseSrcEquals) {\n await mutexWrapOperation(async () => {\n goog.asserts.assert(mimeType, 'We should know the mimeType by now!');\n await this.initializeSrcEqualsDrmInner_(mimeType);\n }, 'initializeSrcEqualsDrmInner_');\n await mutexWrapOperation(async () => {\n goog.asserts.assert(mimeType, 'We should know the mimeType by now!');\n await this.srcEqualsInner_(startTimeOfLoad, mimeType);\n }, 'srcEqualsInner_');\n } else {\n this.emsgRegionTimeline_ =\n new shaka.media.RegionTimeline(() => this.seekRange());\n // Wait for the manifest to be parsed.\n await mutexWrapOperation(async () => {\n await preloadManager.waitForManifest();\n // Retrieve the manifest. This is specifically put before the media\n // source engine is initialized, for the benefit of event handlers.\n this.parserFactory_ = preloadManager.getParserFactory();\n this.parser_ = preloadManager.receiveParser();\n this.manifest_ = preloadManager.getManifest();\n }, 'waitForFinish');\n\n if (!this.mediaSourceEngine_) {\n await mutexWrapOperation(async () => {\n await this.initializeMediaSourceEngineInner_();\n }, 'initializeMediaSourceEngineInner_');\n }\n\n if (this.manifest_ && this.manifest_.textStreams.length) {\n if (this.textDisplayer_.enableTextDisplayer) {\n this.textDisplayer_.enableTextDisplayer();\n } else {\n shaka.Deprecate.deprecateFeature(5,\n 'Text displayer w/ enableTextDisplayer',\n 'Text displayer should have a \"enableTextDisplayer\" method!');\n }\n }\n\n // Wait for the preload manager to do all of the loading it can do.\n await mutexWrapOperation(async () => {\n await preloadManager.waitForFinish();\n }, 'waitForFinish');\n\n // Get manifest and associated values from preloader.\n this.config_ = preloadManager.getConfiguration();\n this.manifestFilterer_ = preloadManager.getManifestFilterer();\n if (this.parser_ && this.parser_.setMediaElement && this.video_) {\n this.parser_.setMediaElement(this.video_);\n }\n this.regionTimeline_ = preloadManager.receiveRegionTimeline();\n this.qualityObserver_ = preloadManager.getQualityObserver();\n const currentAdaptationSetCriteria =\n preloadManager.getCurrentAdaptationSetCriteria();\n if (currentAdaptationSetCriteria) {\n this.currentAdaptationSetCriteria_ = currentAdaptationSetCriteria;\n }\n if (wasPreloaded && this.video_ && this.video_.nodeName === 'AUDIO') {\n // Filter the variants to be audio-only after the fact.\n // As, when preloading, we don't know if we are going to be attached\n // to a video or audio element when we load, we have to do the auto\n // audio-only filtering here, post-facto.\n this.makeManifestAudioOnly_();\n // And continue to do so in the future.\n this.configure('manifest.disableVideo', true);\n }\n\n // Init DRM engine if it's not created yet (happens on polyfilled EME).\n if (!preloadManager.getDrmEngine()) {\n await mutexWrapOperation(async () => {\n await preloadManager.initializeDrm(this.video_);\n }, 'drmEngine_.init');\n }\n\n // Get drm engine from preloader, then finalize it.\n this.drmEngine_ = preloadManager.receiveDrmEngine();\n await mutexWrapOperation(async () => {\n await this.drmEngine_.attach(this.video_);\n }, 'drmEngine_.attach');\n\n // Also get the ABR manager, which has special logic related to being\n // received.\n const abrManagerFactory = preloadManager.getAbrManagerFactory();\n if (abrManagerFactory) {\n if (!this.abrManagerFactory_ ||\n this.abrManagerFactory_ != abrManagerFactory) {\n this.abrManager_ = preloadManager.receiveAbrManager();\n this.abrManagerFactory_ = preloadManager.getAbrManagerFactory();\n if (typeof this.abrManager_.setMediaElement != 'function') {\n shaka.Deprecate.deprecateFeature(5,\n 'AbrManager w/o setMediaElement',\n 'Please use an AbrManager with setMediaElement function.');\n this.abrManager_.setMediaElement = () => {};\n }\n if (typeof this.abrManager_.setCmsdManager != 'function') {\n shaka.Deprecate.deprecateFeature(5,\n 'AbrManager w/o setCmsdManager',\n 'Please use an AbrManager with setCmsdManager function.');\n this.abrManager_.setCmsdManager = () => {};\n }\n if (typeof this.abrManager_.trySuggestStreams != 'function') {\n shaka.Deprecate.deprecateFeature(5,\n 'AbrManager w/o trySuggestStreams',\n 'Please use an AbrManager with trySuggestStreams function.');\n this.abrManager_.trySuggestStreams = () => {};\n }\n }\n }\n\n // Load the asset.\n const segmentPrefetchById =\n preloadManager.receiveSegmentPrefetchesById();\n const prefetchedVariant = preloadManager.getPrefetchedVariant();\n await mutexWrapOperation(async () => {\n await this.loadInner_(\n startTimeOfLoad, prefetchedVariant, segmentPrefetchById);\n }, 'loadInner_');\n preloadManager.stopQueuingLatePhaseQueuedOperations();\n\n if (this.mimeType_ && shaka.util.Platform.isApple() &&\n shaka.util.MimeUtils.isHlsType(this.mimeType_)) {\n this.mediaSourceEngine_.addSecondarySource(\n this.assetUri_, this.mimeType_);\n }\n }\n this.dispatchEvent(shaka.Player.makeEvent_(\n shaka.util.FakeEvent.EventName.Loaded));\n } catch (error) {\n if (error && error.code != shaka.util.Error.Code.LOAD_INTERRUPTED) {\n await this.unload(/* initializeMediaSource= */ false);\n }\n throw error;\n } finally {\n if (preloadManager) {\n // This will cause any resources that were generated but not used to be\n // properly destroyed or released.\n await preloadManager.destroy();\n }\n this.preloadNextUrl_ = null;\n }\n }\n\n /**\n * Modifies the current manifest so that it is audio-only.\n * @private\n */\n makeManifestAudioOnly_() {\n for (const variant of this.manifest_.variants) {\n if (variant.video) {\n variant.video.closeSegmentIndex();\n variant.video = null;\n }\n if (variant.audio && variant.audio.bandwidth) {\n variant.bandwidth = variant.audio.bandwidth;\n } else {\n variant.bandwidth = 0;\n }\n }\n this.manifest_.variants = this.manifest_.variants.filter((v) => {\n return v.audio;\n });\n }\n\n /**\n * Unloads the currently playing stream, if any, and returns a PreloadManager\n * that contains the loaded manifest of that asset, if any.\n * Allows for the asset to be re-loaded by this player faster, in the future.\n * When in src= mode, this unloads but does not make a PreloadManager.\n *\n * @param {boolean=} initializeMediaSource\n * @param {boolean=} keepAdManager\n * @return {!Promise<?shaka.media.PreloadManager>}\n * @export\n */\n async unloadAndSavePreload(\n initializeMediaSource = true, keepAdManager = false) {\n const preloadManager = await this.savePreload_();\n await this.unload(initializeMediaSource, keepAdManager);\n return preloadManager;\n }\n\n /**\n * Detach the player from the current media element, if any, and returns a\n * PreloadManager that contains the loaded manifest of that asset, if any.\n * Allows for the asset to be re-loaded by this player faster, in the future.\n * When in src= mode, this detach but does not make a PreloadManager.\n * Leaves the player in a state where it cannot play media, until it has been\n * attached to something else.\n *\n * @param {boolean=} keepAdManager\n * @param {boolean=} saveLivePosition\n * @return {!Promise<?shaka.media.PreloadManager>}\n * @export\n */\n async detachAndSavePreload(keepAdManager = false, saveLivePosition = false) {\n const preloadManager = await this.savePreload_(saveLivePosition);\n await this.detach(keepAdManager);\n return preloadManager;\n }\n\n /**\n * @param {boolean=} saveLivePosition\n * @return {!Promise<?shaka.media.PreloadManager>}\n * @private\n */\n async savePreload_(saveLivePosition = false) {\n let preloadManager = null;\n if (this.manifest_ && this.parser_ && this.parserFactory_ &&\n this.assetUri_) {\n let startTime = this.video_.currentTime;\n if (this.isLive() && !saveLivePosition) {\n startTime = null;\n }\n // We have enough information to make a PreloadManager!\n preloadManager = await this.makePreloadManager_(\n this.assetUri_,\n startTime,\n this.mimeType_,\n /* allowPrefetch= */ true,\n /* disableVideo= */ false,\n /* allowMakeAbrManager= */ false);\n this.createdPreloadManagers_.push(preloadManager);\n if (this.parser_ && this.parser_.setMediaElement) {\n this.parser_.setMediaElement(/* mediaElement= */ null);\n }\n preloadManager.attachManifest(\n this.manifest_, this.parser_, this.parserFactory_);\n preloadManager.attachAbrManager(\n this.abrManager_, this.abrManagerFactory_);\n preloadManager.attachAdaptationSetCriteria(\n this.currentAdaptationSetCriteria_);\n preloadManager.start();\n // Null the manifest and manifestParser, so that they won't be shut down\n // during unload and will continue to live inside the preloadManager.\n this.manifest_ = null;\n this.parser_ = null;\n this.parserFactory_ = null;\n // Null the abrManager and abrManagerFactory, so that they won't be shut\n // down during unload and will continue to live inside the preloadManager.\n this.abrManager_ = null;\n this.abrManagerFactory_ = null;\n }\n return preloadManager;\n }\n\n /**\n * Starts to preload a given asset, and returns a PreloadManager object that\n * represents that preloading process.\n * The PreloadManager will load the manifest for that asset, as well as the\n * initialization segment. It will not preload anything more than that;\n * this feature is intended for reducing start-time latency, not for fully\n * downloading assets before playing them (for that, use\n * |shaka.offline.Storage|).\n * You can pass that PreloadManager object in to the |load| method on this\n * Player instance to finish loading that particular asset, or you can call\n * the |destroy| method on the manager if the preload is no longer necessary.\n * If this returns null rather than a PreloadManager, that indicates that the\n * asset must be played with src=, which cannot be preloaded.\n *\n * @param {string} assetUri\n * @param {?number=} startTime\n * When <code>startTime</code> is <code>null</code> or\n * <code>undefined</code>, playback will start at the default start time (0\n * for VOD and liveEdge for LIVE).\n * @param {?string=} mimeType\n * @return {!Promise<?shaka.media.PreloadManager>}\n * @export\n */\n async preload(assetUri, startTime = null, mimeType) {\n const preloadManager = await this.preloadInner_(\n assetUri, startTime, mimeType);\n if (!preloadManager) {\n this.onError_(new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.PLAYER,\n shaka.util.Error.Code.SRC_EQUALS_PRELOAD_NOT_SUPPORTED));\n } else {\n preloadManager.start();\n }\n return preloadManager;\n }\n\n /**\n * Calls |destroy| on each PreloadManager object this player has created.\n * @export\n */\n async destroyAllPreloads() {\n const preloadManagerDestroys = [];\n for (const preloadManager of this.createdPreloadManagers_) {\n if (!preloadManager.isDestroyed()) {\n preloadManagerDestroys.push(preloadManager.destroy());\n }\n }\n this.createdPreloadManagers_ = [];\n await Promise.all(preloadManagerDestroys);\n }\n\n /**\n * @param {string} assetUri\n * @param {?number} startTime\n * @param {?string=} mimeType\n * @param {boolean=} standardLoad\n * @return {!Promise<?shaka.media.PreloadManager>}\n * @private\n */\n async preloadInner_(assetUri, startTime, mimeType, standardLoad = false) {\n goog.asserts.assert(this.networkingEngine_, 'Should have a net engine!');\n goog.asserts.assert(this.config_, 'Config must not be null!');\n if (!mimeType) {\n mimeType = await this.guessMimeType_(assetUri);\n }\n const shouldUseSrcEquals = this.shouldUseSrcEquals_(assetUri, mimeType);\n if (shouldUseSrcEquals) {\n // We cannot preload src= content.\n return null;\n }\n let disableVideo = false;\n let allowMakeAbrManager = true;\n if (standardLoad) {\n if (this.abrManager_ &&\n this.abrManagerFactory_ == this.config_.abrFactory) {\n // If there's already an abr manager, don't make a new abr manager at\n // all.\n // In standardLoad mode, the abr manager isn't used for anything anyway,\n // so it should only be created to create an abr manager for the player\n // to use... which is unnecessary if we already have one of the right\n // type.\n allowMakeAbrManager = false;\n }\n if (this.video_ && this.video_.nodeName === 'AUDIO') {\n disableVideo = true;\n }\n }\n let preloadManagerPromise = this.makePreloadManager_(\n assetUri, startTime, mimeType || null,\n /* allowPrefetch= */ !standardLoad, disableVideo, allowMakeAbrManager);\n if (!standardLoad) {\n // We only need to track the PreloadManager if it is not part of a\n // standard load. If it is, the load() method will handle destroying it.\n // Adding a standard load PreloadManager to the createdPreloadManagers_\n // array runs the risk that the user will call destroyAllPreloads and\n // destroy that PreloadManager mid-load.\n preloadManagerPromise = preloadManagerPromise.then((preloadManager) => {\n this.createdPreloadManagers_.push(preloadManager);\n return preloadManager;\n });\n } else {\n preloadManagerPromise = preloadManagerPromise.then((preloadManager) => {\n preloadManager.markIsLoad();\n return preloadManager;\n });\n }\n return preloadManagerPromise;\n }\n\n /**\n * @param {string} assetUri\n * @param {?number} startTime\n * @param {?string} mimeType\n * @param {boolean=} allowPrefetch\n * @param {boolean=} disableVideo\n * @param {boolean=} allowMakeAbrManager\n * @return {!Promise<!shaka.media.PreloadManager>}\n * @private\n */\n async makePreloadManager_(assetUri, startTime, mimeType,\n allowPrefetch = true, disableVideo = false, allowMakeAbrManager = true) {\n goog.asserts.assert(this.networkingEngine_, 'Must have net engine');\n /** @type {?shaka.media.PreloadManager} */\n let preloadManager = null;\n\n const config = shaka.util.ObjectUtils.cloneObject(this.config_);\n if (disableVideo) {\n config.manifest.disableVideo = true;\n }\n\n const getPreloadManager = () => {\n goog.asserts.assert(preloadManager, 'Must have preload manager');\n if (preloadManager.hasBeenAttached() && preloadManager.isDestroyed()) {\n return null;\n }\n return preloadManager;\n };\n\n const getConfig = () => {\n if (getPreloadManager()) {\n return getPreloadManager().getConfiguration();\n } else {\n return this.config_;\n }\n };\n\n // Avoid having to detect the resolution again if it has already been\n // detected or set\n if (this.maxHwRes_.width == Infinity &&\n this.maxHwRes_.height == Infinity &&\n !this.config_.ignoreHardwareResolution) {\n const maxResolution =\n await shaka.util.Platform.detectMaxHardwareResolution();\n this.maxHwRes_.width = maxResolution.width;\n this.maxHwRes_.height = maxResolution.height;\n }\n const manifestFilterer = new shaka.media.ManifestFilterer(\n config, this.maxHwRes_, null);\n const manifestPlayerInterface = {\n networkingEngine: this.networkingEngine_,\n filter: async (manifest) => {\n const tracksChanged = await manifestFilterer.filterManifest(manifest);\n if (tracksChanged) {\n // Delay the 'trackschanged' event so StreamingEngine has time to\n // absorb the changes before the user tries to query it.\n const event = shaka.Player.makeEvent_(\n shaka.util.FakeEvent.EventName.TracksChanged);\n await Promise.resolve();\n preloadManager.dispatchEvent(event);\n }\n },\n makeTextStreamsForClosedCaptions: (manifest) => {\n return this.makeTextStreamsForClosedCaptions_(manifest);\n },\n\n // Called when the parser finds a timeline region. This can be called\n // before we start playback or during playback (live/in-progress\n // manifest).\n onTimelineRegionAdded: (region) => {\n preloadManager.getRegionTimeline().addRegion(region);\n },\n\n onEvent: (event) => preloadManager.dispatchEvent(event),\n onError: (error) => preloadManager.onError(error),\n isLowLatencyMode: () => getConfig().streaming.lowLatencyMode,\n updateDuration: () => {\n if (this.streamingEngine_ && preloadManager.hasBeenAttached()) {\n this.streamingEngine_.updateDuration();\n }\n },\n newDrmInfo: (stream) => {\n // We may need to create new sessions for any new init data.\n const drmEngine = preloadManager.getDrmEngine();\n const currentDrmInfo = drmEngine ? drmEngine.getDrmInfo() : null;\n // DrmEngine.newInitData() requires mediaKeys to be available.\n if (currentDrmInfo && drmEngine.getMediaKeys()) {\n manifestFilterer.processDrmInfos(currentDrmInfo.keySystem, stream);\n }\n },\n onManifestUpdated: () => {\n const eventName = shaka.util.FakeEvent.EventName.ManifestUpdated;\n const data = (new Map()).set('isLive', this.isLive());\n preloadManager.dispatchEvent(shaka.Player.makeEvent_(eventName, data));\n\n preloadManager.addQueuedOperation(false, () => {\n if (this.adManager_) {\n this.adManager_.onManifestUpdated(this.isLive());\n }\n });\n },\n getBandwidthEstimate: () => this.abrManager_.getBandwidthEstimate(),\n onMetadata: (type, startTime, endTime, values) => {\n let metadataType = type;\n if (type == 'com.apple.hls.interstitial') {\n metadataType = 'com.apple.quicktime.HLS';\n /** @type {shaka.extern.HLSInterstitial} */\n const interstitial = {\n startTime,\n endTime,\n values,\n };\n if (this.adManager_) {\n goog.asserts.assert(this.video_, 'Must have video');\n this.adManager_.onHLSInterstitialMetadata(\n this, this.video_, interstitial);\n }\n }\n for (const payload of values) {\n if (payload.name == 'ID') {\n continue;\n }\n preloadManager.addQueuedOperation(false, () => {\n this.addMetadataToRegionTimeline_(\n startTime, endTime, metadataType, payload);\n });\n }\n },\n disableStream: (stream) => this.disableStream(\n stream, this.config_.streaming.maxDisabledTime),\n addFont: (name, url) => this.addFont(name, url),\n };\n const regionTimeline =\n new shaka.media.RegionTimeline(() => this.seekRange());\n regionTimeline.addEventListener('regionadd', (event) => {\n /** @type {shaka.extern.TimelineRegionInfo} */\n const region = event['region'];\n this.onRegionEvent_(\n shaka.util.FakeEvent.EventName.TimelineRegionAdded, region,\n preloadManager);\n\n preloadManager.addQueuedOperation(false, () => {\n if (this.adManager_) {\n this.adManager_.onDashTimedMetadata(region);\n goog.asserts.assert(this.video_, 'Must have video');\n this.adManager_.onDASHInterstitialMetadata(\n this, this.video_, region);\n }\n });\n });\n let qualityObserver = null;\n if (config.streaming.observeQualityChanges) {\n qualityObserver = new shaka.media.QualityObserver(\n () => this.getBufferedInfo());\n\n qualityObserver.addEventListener('qualitychange', (event) => {\n /** @type {shaka.extern.MediaQualityInfo} */\n const mediaQualityInfo = event['quality'];\n /** @type {number} */\n const position = event['position'];\n this.onMediaQualityChange_(mediaQualityInfo, position);\n });\n\n qualityObserver.addEventListener('audiotrackchange', (event) => {\n /** @type {shaka.extern.MediaQualityInfo} */\n const mediaQualityInfo = event['quality'];\n /** @type {number} */\n const position = event['position'];\n this.onMediaQualityChange_(mediaQualityInfo, position,\n /* audioTrackChanged= */ true);\n });\n }\n let firstEvent = true;\n const drmPlayerInterface = {\n netEngine: this.networkingEngine_,\n onError: (e) => preloadManager.onError(e),\n onKeyStatus: (map) => {\n preloadManager.addQueuedOperation(true, () => {\n this.onKeyStatus_(map);\n });\n },\n onExpirationUpdated: (id, expiration) => {\n const event = shaka.Player.makeEvent_(\n shaka.util.FakeEvent.EventName.ExpirationUpdated);\n preloadManager.dispatchEvent(event);\n const parser = preloadManager.getParser();\n if (parser && parser.onExpirationUpdated) {\n parser.onExpirationUpdated(id, expiration);\n }\n },\n onEvent: (e) => {\n preloadManager.dispatchEvent(e);\n if (e.type == shaka.util.FakeEvent.EventName.DrmSessionUpdate &&\n firstEvent) {\n firstEvent = false;\n const now = Date.now() / 1000;\n const delta = now - preloadManager.getStartTimeOfDRM();\n const stats = this.stats_ || preloadManager.getStats();\n stats.setDrmTime(delta);\n // LCEVC data by itself is not encrypted in DRM protected streams\n // and can therefore be accessed and decoded as normal. However,\n // the LCEVC decoder needs access to the VideoElement output in\n // order to apply the enhancement. In DRM contexts where the\n // browser CDM restricts access from our decoder, the enhancement\n // cannot be applied and therefore the LCEVC output canvas is\n // hidden accordingly.\n if (this.lcevcDec_) {\n this.lcevcDec_.hideCanvas();\n }\n }\n },\n };\n\n // Sadly, as the network engine creation code must be replaceable by tests,\n // it cannot be made and use the utilities defined in this function.\n const networkingEngine = this.createNetworkingEngine(getPreloadManager);\n this.networkingEngine_.copyFiltersInto(networkingEngine);\n\n /** @return {!shaka.drm.DrmEngine} */\n const createDrmEngine = () => {\n return this.createDrmEngine(drmPlayerInterface);\n };\n /** @type {!shaka.media.PreloadManager.PlayerInterface} */\n const playerInterface = {\n config,\n manifestPlayerInterface,\n regionTimeline,\n qualityObserver,\n createDrmEngine,\n manifestFilterer,\n networkingEngine,\n allowPrefetch,\n allowMakeAbrManager,\n };\n preloadManager = new shaka.media.PreloadManager(\n assetUri, mimeType, startTime, playerInterface);\n return preloadManager;\n }\n\n /**\n * Determines the mimeType of the given asset, if we are not told that inside\n * the loading process.\n *\n * @param {string} assetUri\n * @return {!Promise<?string>} mimeType\n * @private\n */\n async guessMimeType_(assetUri) {\n // If no MIME type is provided, and we can't base it on extension, make a\n // HEAD request to determine it.\n goog.asserts.assert(this.networkingEngine_, 'Should have a net engine!');\n const retryParams = this.config_.manifest.retryParameters;\n let mimeType = await shaka.net.NetworkingUtils.getMimeType(\n assetUri, this.networkingEngine_, retryParams);\n if (mimeType == 'application/x-mpegurl' && shaka.util.Platform.isApple()) {\n mimeType = 'application/vnd.apple.mpegurl';\n }\n return mimeType;\n }\n\n /**\n * Determines if we should use src equals, based on the the mimeType (if\n * known), the URI, and platform information.\n *\n * @param {string} assetUri\n * @param {?string=} mimeType\n * @return {boolean}\n * |true| if the content should be loaded with src=, |false| if the content\n * should be loaded with MediaSource.\n * @private\n */\n shouldUseSrcEquals_(assetUri, mimeType) {\n const Platform = shaka.util.Platform;\n const MimeUtils = shaka.util.MimeUtils;\n\n // If we are using a platform that does not support media source, we will\n // fall back to src= to handle all playback.\n if (!Platform.supportsMediaSource()) {\n return true;\n }\n\n if (mimeType) {\n // If we have a MIME type, check if the browser can play it natively.\n // This will cover both single files and native HLS.\n const mediaElement = this.video_ || Platform.anyMediaElement();\n const canPlayNatively = mediaElement.canPlayType(mimeType) != '';\n\n // If we can't play natively, then src= isn't an option.\n if (!canPlayNatively) {\n return false;\n }\n\n const canPlayMediaSource =\n shaka.media.ManifestParser.isSupported(mimeType);\n\n // If MediaSource isn't an option, the native option is our only chance.\n if (!canPlayMediaSource) {\n return true;\n }\n\n // If we land here, both are feasible.\n goog.asserts.assert(canPlayNatively && canPlayMediaSource,\n 'Both native and MSE playback should be possible!');\n\n // We would prefer MediaSource in some cases, and src= in others. For\n // example, Android has native HLS, but we'd prefer our own MediaSource\n // version there.\n if (MimeUtils.isHlsType(mimeType)) {\n // Native FairPlay HLS can be preferred on Apple platforms.\n if (Platform.isApple() &&\n (this.config_.drm.servers['com.apple.fps'] ||\n this.config_.drm.servers['com.apple.fps.1_0'])) {\n return this.config_.streaming.useNativeHlsForFairPlay;\n }\n\n // Native HLS can be preferred on any platform via this flag:\n return this.config_.streaming.preferNativeHls;\n }\n\n if (MimeUtils.isDashType(mimeType)) {\n // Native DASH can be preferred on any platform via this flag:\n return this.config_.streaming.preferNativeDash;\n }\n\n // In all other cases, we prefer MediaSource.\n return false;\n }\n\n // Unless there are good reasons to use src= (single-file playback or native\n // HLS), we prefer MediaSource. So the final return value for choosing src=\n // is false.\n return false;\n }\n\n /**\n * @private\n */\n createTextDisplayer_() {\n // When changing text visibility we need to update both the text displayer\n // and streaming engine because we don't always stream text. To ensure\n // that the text displayer and streaming engine are always in sync, wait\n // until they are both initialized before setting the initial value.\n const textDisplayerFactory = this.config_.textDisplayFactory;\n if (textDisplayerFactory === this.lastTextFactory_) {\n return;\n }\n this.textDisplayer_ = textDisplayerFactory();\n if (this.textDisplayer_.configure) {\n this.textDisplayer_.configure(this.config_.textDisplayer);\n } else {\n shaka.Deprecate.deprecateFeature(5,\n 'Text displayer w/ configure',\n 'Text displayer should have a \"configure\" method!');\n }\n this.lastTextFactory_ = textDisplayerFactory;\n this.textDisplayer_.setTextVisibility(this.isTextVisible_);\n }\n\n /**\n * Initializes the media source engine.\n *\n * @return {!Promise}\n * @private\n */\n async initializeMediaSourceEngineInner_() {\n goog.asserts.assert(\n shaka.util.Platform.supportsMediaSource(),\n 'We should not be initializing media source on a platform that ' +\n 'does not support media source.');\n goog.asserts.assert(\n this.video_,\n 'We should have a media element when initializing media source.');\n goog.asserts.assert(\n this.mediaSourceEngine_ == null,\n 'We should not have a media source engine yet.');\n\n this.makeStateChangeEvent_('media-source');\n\n // Remove children if we had any, i.e. from previously used src= mode.\n this.video_.removeAttribute('src');\n shaka.util.Dom.removeAllChildren(this.video_);\n\n this.createTextDisplayer_();\n goog.asserts.assert(this.textDisplayer_,\n 'Text displayer should be created already');\n const mediaSourceEngine = this.createMediaSourceEngine(\n this.video_,\n this.textDisplayer_,\n {\n getKeySystem: () => this.keySystem(),\n onMetadata: (metadata, offset, endTime) => {\n this.processTimedMetadataMediaSrc_(metadata, offset, endTime);\n },\n onEmsg: (emsg) => {\n this.addEmsgToRegionTimeline_(emsg);\n },\n onEvent: (event) => this.dispatchEvent(event),\n onManifestUpdate: () => this.onManifestUpdate_(),\n },\n this.lcevcDec_);\n mediaSourceEngine.configure(this.config_.mediaSource);\n const {segmentRelativeVttTiming} = this.config_.manifest;\n mediaSourceEngine.setSegmentRelativeVttTiming(segmentRelativeVttTiming);\n\n // Wait for media source engine to finish opening. This promise should\n // NEVER be rejected as per the media source engine implementation.\n await mediaSourceEngine.open();\n\n // Wait until it is ready to actually store the reference.\n this.mediaSourceEngine_ = mediaSourceEngine;\n }\n\n /**\n * Adds the basic media listeners\n *\n * @param {HTMLMediaElement} mediaElement\n * @param {number} startTimeOfLoad\n * @private\n */\n addBasicMediaListeners_(mediaElement, startTimeOfLoad) {\n const updateStateHistory = () => this.updateStateHistory_();\n const onRateChange = () => this.onRateChange_();\n this.loadEventManager_.listen(mediaElement, 'playing', updateStateHistory);\n this.loadEventManager_.listen(mediaElement, 'pause', updateStateHistory);\n this.loadEventManager_.listen(mediaElement, 'ended', updateStateHistory);\n this.loadEventManager_.listen(mediaElement, 'ratechange', onRateChange);\n if (mediaElement.remote) {\n this.loadEventManager_.listen(mediaElement.remote, 'connect',\n () => this.onTracksChanged_());\n this.loadEventManager_.listen(mediaElement.remote, 'connecting',\n () => this.onTracksChanged_());\n this.loadEventManager_.listen(mediaElement.remote, 'disconnect',\n async () => {\n if (this.streamingEngine_ &&\n mediaElement.remote.state == 'disconnected') {\n await this.streamingEngine_.resetMediaSource();\n }\n this.onTracksChanged_();\n });\n }\n if (mediaElement.audioTracks) {\n this.loadEventManager_.listen(mediaElement.audioTracks, 'addtrack',\n () => this.onTracksChanged_());\n this.loadEventManager_.listen(mediaElement.audioTracks, 'removetrack',\n () => this.onTracksChanged_());\n this.loadEventManager_.listen(mediaElement.audioTracks, 'change',\n () => this.onTracksChanged_());\n }\n\n if (mediaElement.textTracks) {\n this.loadEventManager_.listen(\n mediaElement.textTracks, 'addtrack', (e) => {\n const trackEvent = /** @type {!TrackEvent} */(e);\n if (trackEvent.track) {\n const track = trackEvent.track;\n goog.asserts.assert(\n track instanceof TextTrack, 'Wrong track type!');\n\n switch (track.kind) {\n case 'metadata':\n this.processTimedMetadataSrcEquals_(track);\n break;\n\n case 'chapters':\n this.activateChaptersTrack_(track);\n break;\n\n default:\n this.onTracksChanged_();\n break;\n }\n }\n });\n this.loadEventManager_.listen(mediaElement.textTracks, 'removetrack',\n () => this.onTracksChanged_());\n this.loadEventManager_.listen(mediaElement.textTracks, 'change',\n () => this.onTracksChanged_());\n\n if (this.config_.streaming.crossBoundaryStrategy !==\n shaka.config.CrossBoundaryStrategy.KEEP) {\n const forwardTimeForCrossBoundary = (immediate = false) => {\n if (!this.streamingEngine_) {\n return;\n }\n this.streamingEngine_.forwardTimeForCrossBoundary(immediate);\n };\n this.loadEventManager_.listen(mediaElement, 'waiting',\n () => forwardTimeForCrossBoundary(/* immediate= */ true));\n this.loadEventManager_.listen(mediaElement, 'timeupdate',\n () => forwardTimeForCrossBoundary());\n this.loadEventManager_.listen(mediaElement, 'seeked',\n () => forwardTimeForCrossBoundary());\n }\n }\n\n // Wait for the 'loadedmetadata' event to measure load() latency, but only\n // if preload is set in a way that would result in this event firing\n // automatically.\n // See https://github.com/shaka-project/shaka-player/issues/2483\n if (mediaElement.preload != 'none') {\n this.loadEventManager_.listenOnce(\n mediaElement, 'loadedmetadata', () => {\n const now = Date.now() / 1000;\n const delta = now - startTimeOfLoad;\n this.stats_.setLoadLatency(delta);\n });\n }\n }\n\n /**\n * Starts loading the content described by the parsed manifest.\n *\n * @param {number} startTimeOfLoad\n * @param {?shaka.extern.Variant} prefetchedVariant\n * @param {!Map<number, shaka.media.SegmentPrefetch>} segmentPrefetchById\n * @return {!Promise}\n * @private\n */\n async loadInner_(startTimeOfLoad, prefetchedVariant, segmentPrefetchById) {\n goog.asserts.assert(\n this.video_, 'We should have a media element by now.');\n goog.asserts.assert(\n this.manifest_, 'The manifest should already be parsed.');\n goog.asserts.assert(\n this.assetUri_, 'We should have an asset uri by now.');\n goog.asserts.assert(\n this.abrManager_, 'We should have an abr manager by now.');\n\n this.makeStateChangeEvent_('load');\n\n const mediaElement = this.video_;\n this.playRateController_ = new shaka.media.PlayRateController({\n getRate: () => mediaElement.playbackRate,\n getDefaultRate: () => mediaElement.defaultPlaybackRate,\n setRate: (rate) => { mediaElement.playbackRate = rate; },\n movePlayhead: (delta) => { mediaElement.currentTime += delta; },\n });\n\n // Add all media element listeners.\n this.addBasicMediaListeners_(mediaElement, startTimeOfLoad);\n\n let isLcevcDualTrack = false;\n for (const variant of this.manifest_.variants) {\n const dependencyStream = variant.video && variant.video.dependencyStream;\n if (dependencyStream) {\n isLcevcDualTrack = shaka.lcevc.Dec.isStreamSupported(dependencyStream);\n }\n }\n\n // Check the status of the LCEVC Dec Object. Reset, create, or close\n // depending on the config.\n this.setupLcevc_(this.config_, isLcevcDualTrack);\n\n this.currentTextLanguage_ = this.config_.preferredTextLanguage;\n this.currentTextRole_ = this.config_.preferredTextRole;\n this.currentTextForced_ = this.config_.preferForcedSubs;\n\n shaka.Player.applyPlayRange_(this.manifest_.presentationTimeline,\n this.config_.playRangeStart,\n this.config_.playRangeEnd);\n\n this.abrManager_.init((variant, clearBuffer, safeMargin) => {\n return this.switch_(variant, clearBuffer, safeMargin);\n });\n this.abrManager_.setMediaElement(mediaElement);\n this.abrManager_.setCmsdManager(this.cmsdManager_);\n\n this.streamingEngine_ = this.createStreamingEngine();\n this.streamingEngine_.configure(this.config_.streaming);\n\n // Set the load mode to \"loaded with media source\" as late as possible so\n // that public methods won't try to access internal components until\n // they're all initialized. We MUST switch to loaded before calling\n // \"streaming\" so that they can access internal information.\n this.loadMode_ = shaka.Player.LoadMode.MEDIA_SOURCE;\n\n // The event must be fired after we filter by restrictions but before the\n // active stream is picked to allow those listening for the \"streaming\"\n // event to make changes before streaming starts.\n this.dispatchEvent(shaka.Player.makeEvent_(\n shaka.util.FakeEvent.EventName.Streaming));\n\n // Pick the initial streams to play.\n // Unless the user has already picked a variant, anyway, by calling\n // selectVariantTrack before this loading stage.\n let initialVariant = prefetchedVariant;\n let toLazyLoad;\n let activeVariant;\n do {\n activeVariant = this.streamingEngine_.getCurrentVariant();\n if (!activeVariant && !initialVariant) {\n initialVariant = this.chooseVariant_();\n goog.asserts.assert(initialVariant, 'Must choose an initial variant!');\n }\n\n // Lazy-load the stream, so we will have enough info to make the playhead.\n const createSegmentIndexPromises = [];\n toLazyLoad = activeVariant || initialVariant;\n for (const stream of [toLazyLoad.video, toLazyLoad.audio]) {\n if (stream && !stream.segmentIndex) {\n createSegmentIndexPromises.push(stream.createSegmentIndex());\n if (stream.dependencyStream) {\n createSegmentIndexPromises.push(\n stream.dependencyStream.createSegmentIndex());\n }\n }\n }\n if (createSegmentIndexPromises.length > 0) {\n // eslint-disable-next-line no-await-in-loop\n await Promise.all(createSegmentIndexPromises);\n }\n } while (!toLazyLoad || toLazyLoad.disabledUntilTime != 0);\n\n if (this.parser_ && this.parser_.onInitialVariantChosen) {\n this.parser_.onInitialVariantChosen(toLazyLoad);\n }\n\n if (this.manifest_.isLowLatency) {\n if (this.config_.streaming.lowLatencyMode) {\n this.configure(this.lowLatencyConfig_);\n } else {\n shaka.log.alwaysWarn('Low-latency live stream detected, but ' +\n 'low-latency streaming mode is not enabled in Shaka Player. ' +\n 'Set streaming.lowLatencyMode configuration to true, and see ' +\n 'https://bit.ly/3clctcj for details.');\n }\n }\n\n if (this.cmcdManager_) {\n this.cmcdManager_.setLowLatency(\n this.manifest_.isLowLatency && this.config_.streaming.lowLatencyMode);\n this.cmcdManager_.setStartTimeOfLoad(startTimeOfLoad * 1000);\n }\n\n shaka.Player.applyPlayRange_(this.manifest_.presentationTimeline,\n this.config_.playRangeStart,\n this.config_.playRangeEnd);\n\n this.streamingEngine_.applyPlayRange(\n this.config_.playRangeStart, this.config_.playRangeEnd);\n\n const setupPlayhead = (startTime) => {\n this.playhead_ = this.createPlayhead(startTime);\n this.playheadObservers_ =\n this.createPlayheadObserversForMSE_(startTime);\n\n this.startBufferManagement_(mediaElement, /* srcEquals= */ false);\n };\n\n if (!this.config_.streaming.startAtSegmentBoundary) {\n let startTime = this.startTime_;\n if (startTime == null && this.manifest_.startTime) {\n startTime = this.manifest_.startTime;\n }\n setupPlayhead(startTime);\n }\n\n // Now we can switch to the initial variant.\n if (!activeVariant) {\n goog.asserts.assert(initialVariant,\n 'Must have chosen an initial variant!');\n\n // Now that we have initial streams, we may adjust the start time to\n // align to a segment boundary.\n if (this.config_.streaming.startAtSegmentBoundary) {\n const timeline = this.manifest_.presentationTimeline;\n let initialTime = this.startTime_ || this.video_.currentTime;\n if (this.startTime_ == null && this.manifest_.startTime) {\n initialTime = this.manifest_.startTime;\n }\n const seekRangeStart = timeline.getSeekRangeStart();\n const seekRangeEnd = timeline.getSeekRangeEnd();\n if (initialTime < seekRangeStart) {\n initialTime = seekRangeStart;\n } else if (initialTime > seekRangeEnd) {\n initialTime = seekRangeEnd;\n }\n const startTime = await this.adjustStartTime_(\n initialVariant, initialTime);\n setupPlayhead(startTime);\n }\n\n this.switchVariant_(initialVariant, /* fromAdaptation= */ true,\n /* clearBuffer= */ false, /* safeMargin= */ 0);\n }\n\n this.playhead_.ready();\n\n // Decide if text should be shown automatically.\n // similar to video/audio track, we would skip switch initial text track\n // if user already pick text track (via selectTextTrack api)\n const activeTextTrack = this.getTextTracks().find((t) => t.active);\n\n if (!activeTextTrack) {\n const initialTextStream = this.chooseTextStream_();\n\n if (initialTextStream) {\n this.addTextStreamToSwitchHistory_(\n initialTextStream, /* fromAdaptation= */ true);\n }\n\n if (initialVariant) {\n this.setInitialTextState_(initialVariant, initialTextStream);\n }\n\n // Don't initialize with a text stream unless we should be streaming\n // text.\n if (initialTextStream && this.shouldStreamText_()) {\n this.streamingEngine_.switchTextStream(initialTextStream);\n this.setTextDisplayerLanguage_();\n }\n }\n\n\n // Start streaming content. This will start the flow of content down to\n // media source.\n await this.streamingEngine_.start(segmentPrefetchById);\n\n if (this.config_.abr.enabled) {\n this.abrManager_.enable();\n this.onAbrStatusChanged_();\n }\n\n // Dispatch a 'trackschanged' event now that all initial filtering is\n // done.\n this.onTracksChanged_();\n\n // Now that we've filtered out variants that aren't compatible with the\n // active one, update abr manager with filtered variants.\n // NOTE: This may be unnecessary. We've already chosen one codec in\n // chooseCodecsAndFilterManifest_ before we started streaming. But it\n // doesn't hurt, and this will all change when we start using\n // MediaCapabilities and codec switching.\n // TODO(#1391): Re-evaluate with MediaCapabilities and codec switching.\n this.updateAbrManagerVariants_();\n\n const hasPrimary = this.manifest_.variants.some((v) => v.primary);\n if (!this.config_.preferredAudioLanguage && !hasPrimary) {\n shaka.log.warning('No preferred audio language set. ' +\n 'We have chosen an arbitrary language initially');\n }\n\n const isLive = this.isLive();\n\n if ((isLive && ((this.config_.streaming.liveSync &&\n this.config_.streaming.liveSync.enabled) ||\n this.manifest_.serviceDescription ||\n this.config_.streaming.liveSync.panicMode)) ||\n this.config_.streaming.vodDynamicPlaybackRate) {\n const onTimeUpdate = () => this.onTimeUpdate_();\n this.loadEventManager_.listen(mediaElement, 'timeupdate', onTimeUpdate);\n }\n if (!isLive) {\n const onVideoProgress = () => this.onVideoProgress_();\n this.loadEventManager_.listen(\n mediaElement, 'timeupdate', onVideoProgress);\n this.onVideoProgress_();\n if (this.manifest_.nextUrl) {\n if (this.config_.streaming.preloadNextUrlWindow > 0) {\n const onTimeUpdate = async () => {\n const timeToEnd = this.seekRange().end - this.video_.currentTime;\n if (!isNaN(timeToEnd)) {\n if (timeToEnd <= this.config_.streaming.preloadNextUrlWindow) {\n this.loadEventManager_.unlisten(\n mediaElement, 'timeupdate', onTimeUpdate);\n goog.asserts.assert(this.manifest_.nextUrl,\n 'this.manifest_.nextUrl should be valid.');\n this.preloadNextUrl_ =\n await this.preload(this.manifest_.nextUrl);\n }\n }\n };\n this.loadEventManager_.listen(\n mediaElement, 'timeupdate', onTimeUpdate);\n }\n this.loadEventManager_.listen(mediaElement, 'ended', () => {\n this.load(this.preloadNextUrl_ || this.manifest_.nextUrl);\n });\n }\n }\n\n if (this.adManager_) {\n this.adManager_.onManifestUpdated(isLive);\n }\n\n this.fullyLoaded_ = true;\n }\n\n /**\n * Initializes the DRM engine for use by src equals.\n *\n * @param {string} mimeType\n * @return {!Promise}\n * @private\n */\n async initializeSrcEqualsDrmInner_(mimeType) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n\n goog.asserts.assert(\n this.networkingEngine_,\n '|onInitializeSrcEqualsDrm_| should never be called after |destroy|');\n goog.asserts.assert(\n this.config_,\n '|onInitializeSrcEqualsDrm_| should never be called after |destroy|');\n\n const startTime = Date.now() / 1000;\n let firstEvent = true;\n\n this.drmEngine_ = this.createDrmEngine({\n netEngine: this.networkingEngine_,\n onError: (e) => {\n this.onError_(e);\n },\n onKeyStatus: (map) => {\n // According to this.onKeyStatus_, we can't even use this information\n // in src= mode, so this is just a no-op.\n },\n onExpirationUpdated: (id, expiration) => {\n const event = shaka.Player.makeEvent_(\n shaka.util.FakeEvent.EventName.ExpirationUpdated);\n this.dispatchEvent(event);\n },\n onEvent: (e) => {\n this.dispatchEvent(e);\n if (e.type == shaka.util.FakeEvent.EventName.DrmSessionUpdate &&\n firstEvent) {\n firstEvent = false;\n const now = Date.now() / 1000;\n const delta = now - startTime;\n this.stats_.setDrmTime(delta);\n }\n },\n });\n\n this.drmEngine_.configure(this.config_.drm);\n\n // TODO: Instead of feeding DrmEngine with Variants, we should refactor\n // DrmEngine so that it takes a minimal config derived from Variants. In\n // cases like this one or in removal of stored content, the details are\n // largely unimportant. We should have a saner way to initialize\n // DrmEngine.\n // That would also insulate DrmEngine from manifest changes in the future.\n // For now, that is time-consuming and this synthetic Variant is easy, so\n // I'm putting it off. Since this is only expected to be used for native\n // HLS in Safari, this should be safe. -JCP\n /** @type {shaka.extern.Variant} */\n const variant = {\n id: 0,\n language: 'und',\n disabledUntilTime: 0,\n primary: false,\n audio: null,\n video: null,\n bandwidth: 100,\n allowedByApplication: true,\n allowedByKeySystem: true,\n decodingInfos: [],\n };\n const stream = {\n id: 0,\n originalId: null,\n groupId: null,\n createSegmentIndex: () => Promise.resolve(),\n segmentIndex: null,\n mimeType: mimeType ? shaka.util.MimeUtils.getBasicType(mimeType) : '',\n codecs: mimeType ? shaka.util.MimeUtils.getCodecs(mimeType) : '',\n encrypted: true,\n drmInfos: [], // Filled in by DrmEngine config.\n keyIds: new Set(),\n language: 'und',\n originalLanguage: null,\n label: null,\n type: ContentType.VIDEO,\n primary: false,\n trickModeVideo: null,\n dependencyStream: null,\n emsgSchemeIdUris: null,\n roles: [],\n forced: false,\n channelsCount: null,\n audioSamplingRate: null,\n spatialAudio: false,\n closedCaptions: null,\n accessibilityPurpose: null,\n external: false,\n fastSwitching: false,\n fullMimeTypes: new Set(),\n isAudioMuxedInVideo: false,\n baseOriginalId: null,\n };\n stream.fullMimeTypes.add(shaka.util.MimeUtils.getFullType(\n stream.mimeType, stream.codecs));\n if (mimeType.startsWith('audio/')) {\n stream.type = ContentType.AUDIO;\n variant.audio = stream;\n } else {\n variant.video = stream;\n }\n\n this.drmEngine_.setSrcEquals(/* srcEquals= */ true);\n await this.drmEngine_.initForPlayback(\n [variant], /* offlineSessionIds= */ []);\n await this.drmEngine_.attach(this.video_);\n }\n\n /**\n * Passes the asset URI along to the media element, so it can be played src\n * equals style.\n *\n * @param {number} startTimeOfLoad\n * @param {string} mimeType\n * @return {!Promise}\n *\n * @private\n */\n async srcEqualsInner_(startTimeOfLoad, mimeType) {\n this.makeStateChangeEvent_('src-equals');\n\n goog.asserts.assert(\n this.video_, 'We should have a media element when loading.');\n goog.asserts.assert(\n this.assetUri_, 'We should have a valid uri when loading.');\n\n const mediaElement = this.video_;\n\n this.playhead_ = new shaka.media.SrcEqualsPlayhead(mediaElement);\n\n // This flag is used below in the language preference setup to check if\n // this load was canceled before the necessary awaits completed.\n let unloaded = false;\n this.cleanupOnUnload_.push(() => {\n unloaded = true;\n });\n\n if (this.startTime_ != null) {\n this.playhead_.setStartTime(this.startTime_);\n }\n\n this.playheadObservers_ =\n this.createPlayheadObserversForSrcEquals_(this.startTime_ || 0);\n\n this.playRateController_ = new shaka.media.PlayRateController({\n getRate: () => mediaElement.playbackRate,\n getDefaultRate: () => mediaElement.defaultPlaybackRate,\n setRate: (rate) => { mediaElement.playbackRate = rate; },\n movePlayhead: (delta) => { mediaElement.currentTime += delta; },\n });\n\n this.startBufferManagement_(mediaElement, /* srcEquals= */ true);\n\n if (mediaElement.textTracks) {\n this.createTextDisplayer_();\n const setShowingMode = () => {\n const track = this.getFilteredTextTracks_()\n .find((t) => t.mode !== 'disabled');\n if (track) {\n track.mode = 'showing';\n }\n };\n const setHiddenMode = () => {\n const track = this.getFilteredTextTracks_()\n .find((t) => t.mode !== 'disabled');\n if (track) {\n track.mode = 'hidden';\n }\n };\n this.loadEventManager_.listen(mediaElement, 'enterpictureinpicture',\n () => setShowingMode());\n this.loadEventManager_.listen(mediaElement, 'leavepictureinpicture',\n () => setHiddenMode());\n if (mediaElement.remote) {\n this.loadEventManager_.listen(mediaElement.remote, 'connect',\n () => setHiddenMode());\n this.loadEventManager_.listen(mediaElement.remote, 'connecting',\n () => setHiddenMode());\n this.loadEventManager_.listen(mediaElement.remote, 'disconnect',\n () => setHiddenMode());\n } else if ('webkitCurrentPlaybackTargetIsWireless' in mediaElement) {\n this.loadEventManager_.listen(mediaElement,\n 'webkitcurrentplaybacktargetiswirelesschanged',\n () => setHiddenMode());\n }\n const video = /** @type {HTMLVideoElement} */(mediaElement);\n if (video.webkitSupportsFullscreen) {\n this.loadEventManager_.listen(video, 'webkitpresentationmodechanged',\n () => {\n if (video.webkitPresentationMode != 'inline') {\n setShowingMode();\n } else {\n setHiddenMode();\n }\n });\n }\n }\n // Add all media element listeners.\n this.addBasicMediaListeners_(mediaElement, startTimeOfLoad);\n\n // By setting |src| we are done \"loading\" with src=. We don't need to set\n // the current time because |playhead| will do that for us.\n let playbackUri = this.cmcdManager_.appendSrcData(this.assetUri_, mimeType);\n // Apply temporal clipping using playRangeStart and playRangeEnd based\n // in https://www.w3.org/TR/media-frags/\n if (!playbackUri.includes('#t=') &&\n (this.config_.playRangeStart > 0 ||\n isFinite(this.config_.playRangeEnd))) {\n playbackUri += '#t=';\n if (this.config_.playRangeStart > 0) {\n playbackUri += this.config_.playRangeStart;\n }\n if (isFinite(this.config_.playRangeEnd)) {\n playbackUri += ',' + this.config_.playRangeEnd;\n }\n }\n\n if (this.mediaSourceEngine_ ) {\n await this.mediaSourceEngine_.destroy();\n this.mediaSourceEngine_ = null;\n }\n shaka.util.Dom.removeAllChildren(mediaElement);\n\n mediaElement.src = playbackUri;\n\n // Tizen 3 / WebOS won't load anything unless you call load() explicitly,\n // no matter the value of the preload attribute. This is harmful on some\n // other platforms by triggering unbounded loading of media data, but is\n // necessary here.\n if (shaka.util.Platform.isTizen() || shaka.util.Platform.isWebOS()) {\n mediaElement.load();\n }\n\n // In Safari using HLS won't load anything unless you call load()\n // explicitly, no matter the value of the preload attribute.\n // Note: this only happens when there are not autoplay.\n if (mediaElement.preload != 'none' && !mediaElement.autoplay &&\n shaka.util.MimeUtils.isHlsType(mimeType) &&\n shaka.util.Platform.isApple()) {\n mediaElement.load();\n }\n\n // Set the load mode last so that we know that all our components are\n // initialized.\n this.loadMode_ = shaka.Player.LoadMode.SRC_EQUALS;\n\n // The event doesn't mean as much for src= playback, since we don't\n // control streaming. But we should fire it in this path anyway since\n // some applications may be expecting it as a life-cycle event.\n this.dispatchEvent(shaka.Player.makeEvent_(\n shaka.util.FakeEvent.EventName.Streaming));\n\n // The \"load\" Promise is resolved when we have loaded the metadata. If we\n // wait for the full data, that won't happen on Safari until the play\n // button is hit.\n const fullyLoaded = new shaka.util.PublicPromise();\n shaka.util.MediaReadyState.waitForReadyState(mediaElement,\n HTMLMediaElement.HAVE_METADATA,\n this.loadEventManager_,\n () => {\n this.playhead_.ready();\n fullyLoaded.resolve();\n });\n\n const waitForNativeTracks = () => {\n return new Promise((resolve) => {\n const GRACE_PERIOD = 0.5;\n const timer = new shaka.util.Timer(resolve);\n // Applying the text preference too soon can result in it being\n // reverted. Wait for native HLS to pick something first.\n this.loadEventManager_.listen(mediaElement.textTracks,\n 'change', () => timer.tickAfter(GRACE_PERIOD));\n timer.tickAfter(GRACE_PERIOD);\n });\n };\n\n // We can't switch to preferred languages, though, until the data is\n // loaded.\n shaka.util.MediaReadyState.waitForReadyState(mediaElement,\n HTMLMediaElement.HAVE_CURRENT_DATA,\n this.loadEventManager_,\n async () => {\n await waitForNativeTracks();\n // If we have moved on to another piece of content while waiting for\n // the above event/timer, we should not change tracks here.\n if (unloaded) {\n return;\n }\n\n this.setupPreferredAudioOnSrc_();\n\n const textTracks = this.getFilteredTextTracks_();\n // If Safari native picked one for us, we'll set text visible.\n if (textTracks.some((t) => t.mode === 'showing')) {\n this.isTextVisible_ = true;\n this.textDisplayer_.setTextVisibility(true);\n }\n\n if (textTracks.length) {\n if (this.textDisplayer_.enableTextDisplayer) {\n this.textDisplayer_.enableTextDisplayer();\n } else {\n shaka.Deprecate.deprecateFeature(5,\n 'Text displayer w/ enableTextDisplayer',\n 'Text displayer should have a \"enableTextDisplayer\" method!');\n }\n }\n\n let enabledNativeTrack = false;\n for (const track of textTracks) {\n if (track.mode !== 'disabled') {\n if (!enabledNativeTrack) {\n this.enableNativeTrack_(track);\n enabledNativeTrack = true;\n } else {\n track.mode = 'disabled';\n shaka.log.alwaysWarn(\n 'Found more than one enabled text track, disabling it',\n track);\n }\n }\n }\n\n this.setupPreferredTextOnSrc_();\n });\n\n if (mediaElement.error) {\n // Already failed!\n fullyLoaded.reject(this.videoErrorToShakaError_());\n } else if (mediaElement.preload == 'none') {\n shaka.log.alwaysWarn(\n 'With <video preload=\"none\">, the browser will not load anything ' +\n 'until play() is called. We are unable to measure load latency ' +\n 'in a meaningful way, and we cannot provide track info yet. ' +\n 'Please do not use preload=\"none\" with Shaka Player.');\n // We can't wait for an event load loadedmetadata, since that will be\n // blocked until a user interaction. So resolve the Promise now.\n fullyLoaded.resolve();\n }\n\n this.loadEventManager_.listenOnce(mediaElement, 'error', () => {\n fullyLoaded.reject(this.videoErrorToShakaError_());\n });\n\n await shaka.util.Functional.promiseWithTimeout(\n this.config_.streaming.loadTimeout, fullyLoaded);\n\n const isLive = this.isLive();\n\n if ((isLive && ((this.config_.streaming.liveSync &&\n this.config_.streaming.liveSync.enabled) ||\n this.config_.streaming.liveSync.panicMode)) ||\n this.config_.streaming.vodDynamicPlaybackRate) {\n const onTimeUpdate = () => this.onTimeUpdate_();\n this.loadEventManager_.listen(mediaElement, 'timeupdate', onTimeUpdate);\n }\n if (!isLive) {\n const onVideoProgress = () => this.onVideoProgress_();\n this.loadEventManager_.listen(\n mediaElement, 'timeupdate', onVideoProgress);\n this.onVideoProgress_();\n }\n\n if (this.adManager_) {\n this.adManager_.onManifestUpdated(isLive);\n // There is no good way to detect when the manifest has been updated,\n // so we use seekRange().end so we can tell when it has been updated.\n if (isLive) {\n let prevSeekRangeEnd = this.seekRange().end;\n this.loadEventManager_.listen(mediaElement, 'progress', () => {\n const newSeekRangeEnd = this.seekRange().end;\n if (prevSeekRangeEnd != newSeekRangeEnd) {\n this.adManager_.onManifestUpdated(this.isLive());\n prevSeekRangeEnd = newSeekRangeEnd;\n }\n });\n }\n }\n\n this.fullyLoaded_ = true;\n }\n\n /**\n * This method setup the preferred audio using src=..\n *\n * @private\n */\n setupPreferredAudioOnSrc_() {\n const preferredAudioLanguage = this.config_.preferredAudioLanguage;\n\n // If the user has not selected a preference, the browser preference is\n // left.\n if (preferredAudioLanguage == '') {\n return;\n }\n\n const preferredVariantRole = this.config_.preferredVariantRole;\n this.selectAudioLanguage(preferredAudioLanguage, preferredVariantRole);\n }\n\n /**\n * This method setup the preferred text using src=.\n *\n * @private\n */\n setupPreferredTextOnSrc_() {\n const preferredTextLanguage = this.config_.preferredTextLanguage;\n\n // If the user has not selected a preference, the browser preference is\n // left.\n if (preferredTextLanguage == '') {\n return;\n }\n\n const preferForcedSubs = this.config_.preferForcedSubs;\n const preferredTextRole = this.config_.preferredTextRole;\n\n this.selectTextLanguage(preferredTextLanguage, preferredTextRole,\n preferForcedSubs);\n }\n\n /**\n * We're looking for metadata tracks to process id3 tags. One of the uses is\n * for ad info on LIVE streams\n *\n * @param {!TextTrack} track\n * @private\n */\n processTimedMetadataSrcEquals_(track) {\n if (track.kind != 'metadata') {\n return;\n }\n\n // Hidden mode is required for the cuechange event to launch correctly\n track.mode = 'hidden';\n this.loadEventManager_.listen(track, 'cuechange', () => {\n if (track.activeCues) {\n for (const cue of track.activeCues) {\n this.addMetadataToRegionTimeline_(cue.startTime, cue.endTime,\n cue.type, cue.value);\n\n if (this.adManager_) {\n this.adManager_.onCueMetadataChange(cue.value);\n }\n }\n }\n if (track.cues) {\n /** @type {!Array<shaka.extern.HLSInterstitial>} */\n const interstitials = [];\n\n for (const cue of track.cues) {\n if (cue.type == 'com.apple.quicktime.HLS' && cue.startTime != null) {\n let interstitial = interstitials.find((i) => {\n return i.startTime == cue.startTime && i.endTime == cue.endTime;\n });\n if (!interstitial) {\n interstitial = /** @type {shaka.extern.HLSInterstitial} */ ({\n startTime: cue.startTime,\n endTime: cue.endTime,\n values: [],\n });\n interstitials.push(interstitial);\n }\n interstitial.values.push(cue.value);\n }\n }\n for (const interstitial of interstitials) {\n const isValidInterstitial = interstitial.values.some((value) => {\n return value.key == 'X-ASSET-URI' || value.key == 'X-ASSET-LIST';\n });\n if (!isValidInterstitial) {\n continue;\n }\n if (this.adManager_) {\n const isPreRoll = interstitial.startTime == 0 && !this.isLive();\n // It seems that CUE is natively omitted, by default we use CUE=ONCE\n // to avoid repeating them.\n interstitial.values.push({\n key: 'CUE',\n description: '',\n data: isPreRoll ? 'ONCE,PRE' : 'ONCE',\n mimeType: null,\n pictureType: null,\n });\n goog.asserts.assert(this.video_, 'Must have video');\n this.adManager_.onHLSInterstitialMetadata(\n this, this.video_, interstitial);\n }\n }\n }\n });\n\n // In Safari the initial assignment does not always work, so we schedule\n // this process to be repeated several times to ensure that it has been put\n // in the correct mode.\n const timer = new shaka.util.Timer(() => {\n const textTracks = this.getMetadataTracks_();\n for (const textTrack of textTracks) {\n textTrack.mode = 'hidden';\n }\n }).tickNow().tickAfter(0.5);\n\n this.cleanupOnUnload_.push(() => {\n timer.stop();\n });\n }\n\n\n /**\n * @param {!Array<shaka.extern.ID3Metadata>} metadata\n * @param {number} offset\n * @param {?number} segmentEndTime\n * @private\n */\n processTimedMetadataMediaSrc_(metadata, offset, segmentEndTime) {\n for (const sample of metadata) {\n if (sample.data && typeof(sample.cueTime) == 'number' && sample.frames) {\n const start = sample.cueTime + offset;\n let end = segmentEndTime;\n // This can happen when the ID3 info arrives in a previous segment.\n if (end && start > end) {\n end = start;\n }\n const metadataType = 'org.id3';\n for (const frame of sample.frames) {\n const payload = frame;\n this.addMetadataToRegionTimeline_(start, end, metadataType, payload);\n }\n\n if (this.adManager_) {\n this.adManager_.onHlsTimedMetadata(sample, start);\n }\n }\n }\n }\n\n /**\n * Construct and fire a Player.Metadata event\n *\n * @param {shaka.extern.MetadataTimelineRegionInfo} region\n * @private\n */\n dispatchMetadataEvent_(region) {\n const eventName = shaka.util.FakeEvent.EventName.Metadata;\n const data = new Map()\n .set('startTime', region.startTime)\n .set('endTime', region.endTime)\n .set('metadataType', region.schemeIdUri)\n .set('payload', region.payload);\n this.dispatchEvent(shaka.Player.makeEvent_(eventName, data));\n }\n\n\n /**\n * Add metadata to region timeline\n *\n * @param {number} startTime\n * @param {?number} endTime\n * @param {string} metadataType\n * @param {shaka.extern.MetadataFrame} payload\n * @private\n */\n addMetadataToRegionTimeline_(startTime, endTime, metadataType, payload) {\n if (!this.metadataRegionTimeline_) {\n return;\n }\n goog.asserts.assert(!endTime || startTime <= endTime,\n 'Metadata start time should be less or equal to the end time!');\n /** @type {shaka.extern.MetadataTimelineRegionInfo} */\n const region = {\n schemeIdUri: metadataType,\n startTime,\n endTime: endTime || Infinity,\n id: '',\n payload,\n };\n // JSON stringify produces a good ID in this case.\n region.id = JSON.stringify(region);\n this.metadataRegionTimeline_.addRegion(region);\n }\n\n /**\n * Construct and fire a Player.EMSG event\n *\n * @param {shaka.extern.EmsgTimelineRegionInfo} region\n * @private\n */\n dispatchEmsgEvent_(region) {\n const eventName = shaka.util.FakeEvent.EventName.Emsg;\n const emsg = region.emsg;\n const data = new Map().set('detail', emsg);\n this.dispatchEvent(shaka.Player.makeEvent_(eventName, data));\n }\n\n\n /**\n * Add EMSG to region timeline\n *\n * @param {!shaka.extern.EmsgInfo} emsg\n * @private\n */\n addEmsgToRegionTimeline_(emsg) {\n if (!this.emsgRegionTimeline_) {\n return;\n }\n /** @type {shaka.extern.EmsgTimelineRegionInfo} */\n const region = {\n schemeIdUri: emsg.schemeIdUri,\n startTime: emsg.startTime,\n endTime: emsg.endTime,\n id: String(emsg.id),\n emsg,\n };\n this.emsgRegionTimeline_.addRegion(region);\n }\n\n /**\n * Set the mode on a chapters track so that it loads.\n *\n * @param {?TextTrack} track\n * @private\n */\n activateChaptersTrack_(track) {\n if (!track || track.kind != 'chapters') {\n return;\n }\n\n // Hidden mode is required for the cuechange event to launch correctly and\n // get the cues and the activeCues\n track.mode = 'hidden';\n\n // In Safari the initial assignment does not always work, so we schedule\n // this process to be repeated several times to ensure that it has been put\n // in the correct mode.\n const timer = new shaka.util.Timer(() => {\n track.mode = 'hidden';\n }).tickNow().tickAfter(0.5);\n\n this.cleanupOnUnload_.push(() => {\n timer.stop();\n });\n }\n\n /**\n * Releases all of the mutexes of the player. Meant for use by the tests.\n * @export\n */\n releaseAllMutexes() {\n this.mutex_.releaseAll();\n }\n\n /**\n * Create a new DrmEngine instance. This may be replaced by tests to create\n * fake instances. Configuration and initialization will be handled after\n * |createDrmEngine|.\n *\n * @param {shaka.drm.DrmEngine.PlayerInterface} playerInterface\n * @return {!shaka.drm.DrmEngine}\n */\n createDrmEngine(playerInterface) {\n return new shaka.drm.DrmEngine(playerInterface);\n }\n\n /**\n * Creates a new instance of NetworkingEngine. This can be replaced by tests\n * to create fake instances instead.\n *\n * @param {(function():?shaka.media.PreloadManager)=} getPreloadManager\n * @return {!shaka.net.NetworkingEngine}\n */\n createNetworkingEngine(getPreloadManager) {\n if (!getPreloadManager) {\n getPreloadManager = () => null;\n }\n\n const getAbrManager = () => {\n if (getPreloadManager()) {\n return getPreloadManager().getAbrManager();\n } else {\n return this.abrManager_;\n }\n };\n const getParser = () => {\n if (getPreloadManager()) {\n return getPreloadManager().getParser();\n } else {\n return this.parser_;\n }\n };\n const lateQueue = (fn) => {\n if (getPreloadManager()) {\n getPreloadManager().addQueuedOperation(true, fn);\n } else {\n fn();\n }\n };\n const dispatchEvent = (event) => {\n if (getPreloadManager()) {\n getPreloadManager().dispatchEvent(event);\n } else {\n this.dispatchEvent(event);\n }\n };\n const getStats = () => {\n if (getPreloadManager()) {\n return getPreloadManager().getStats();\n } else {\n return this.stats_;\n }\n };\n /** @type {shaka.net.NetworkingEngine.onProgressUpdated} */\n const onProgressUpdated_ = (deltaTimeMs,\n bytesDownloaded, allowSwitch, request) => {\n // In some situations, such as during offline storage, the abr manager\n // might not yet exist. Therefore, we need to check if abr manager has\n // been initialized before using it.\n const abrManager = getAbrManager();\n if (abrManager) {\n abrManager.segmentDownloaded(deltaTimeMs, bytesDownloaded,\n allowSwitch, request);\n }\n };\n /** @type {shaka.net.NetworkingEngine.OnHeadersReceived} */\n const onHeadersReceived_ = (headers, request, requestType) => {\n // Release a 'downloadheadersreceived' event.\n const name = shaka.util.FakeEvent.EventName.DownloadHeadersReceived;\n const data = new Map()\n .set('headers', headers)\n .set('request', request)\n .set('requestType', requestType);\n dispatchEvent(shaka.Player.makeEvent_(name, data));\n lateQueue(() => {\n if (this.cmsdManager_) {\n this.cmsdManager_.processHeaders(headers);\n }\n });\n };\n /** @type {shaka.net.NetworkingEngine.OnDownloadCompleted} */\n const onDownloadCompleted_ = (request, response) => {\n // Release a 'downloadcompleted' event.\n const name = shaka.util.FakeEvent.EventName.DownloadCompleted;\n const data = new Map()\n .set('request', request)\n .set('response', response);\n dispatchEvent(shaka.Player.makeEvent_(name, data));\n };\n /** @type {shaka.net.NetworkingEngine.OnDownloadFailed} */\n const onDownloadFailed_ = (request, error, httpResponseCode, aborted) => {\n // Release a 'downloadfailed' event.\n const name = shaka.util.FakeEvent.EventName.DownloadFailed;\n const data = new Map()\n .set('request', request)\n .set('error', error)\n .set('httpResponseCode', httpResponseCode)\n .set('aborted', aborted);\n dispatchEvent(shaka.Player.makeEvent_(name, data));\n };\n /** @type {shaka.net.NetworkingEngine.OnRequest} */\n const onRequest_ = (type, request, context) => {\n lateQueue(() => {\n this.cmcdManager_.applyData(type, request, context);\n });\n };\n\n /** @type {shaka.net.NetworkingEngine.OnRetry} */\n const onRetry_ = (type, context, newUrl, oldUrl) => {\n const parser = getParser();\n if (parser && parser.banLocation) {\n parser.banLocation(oldUrl);\n }\n };\n\n /** @type {shaka.net.NetworkingEngine.OnResponse} */\n const onResponse_ = (type, response, context) => {\n if (response.data) {\n const bytesDownloaded = response.data.byteLength;\n const stats = getStats();\n if (stats) {\n stats.addBytesDownloaded(bytesDownloaded);\n if (type === shaka.net.NetworkingEngine.RequestType.MANIFEST) {\n stats.setManifestSize(bytesDownloaded);\n }\n }\n }\n };\n\n return new shaka.net.NetworkingEngine(\n onProgressUpdated_, onHeadersReceived_, onDownloadCompleted_,\n onDownloadFailed_, onRequest_, onRetry_, onResponse_);\n }\n\n /**\n * Creates a new instance of Playhead. This can be replaced by tests to\n * create fake instances instead.\n *\n * @param {?number} startTime\n * @return {!shaka.media.Playhead}\n */\n createPlayhead(startTime) {\n goog.asserts.assert(this.manifest_, 'Must have manifest');\n goog.asserts.assert(this.video_, 'Must have video');\n return new shaka.media.MediaSourcePlayhead(\n this.video_,\n this.manifest_,\n this.config_.streaming,\n startTime,\n () => this.onSeek_(),\n (event) => this.dispatchEvent(event));\n }\n\n /**\n * Create the observers for MSE playback. These observers are responsible for\n * notifying the app and player of specific events during MSE playback.\n *\n * @param {number} startTime\n * @return {!shaka.media.PlayheadObserverManager}\n * @private\n */\n createPlayheadObserversForMSE_(startTime) {\n goog.asserts.assert(this.manifest_, 'Must have manifest');\n goog.asserts.assert(this.regionTimeline_, 'Must have region timeline');\n goog.asserts.assert(this.metadataRegionTimeline_,\n 'Must have metadata region timeline');\n goog.asserts.assert(this.emsgRegionTimeline_,\n 'Must have emsg region timeline');\n goog.asserts.assert(this.video_, 'Must have video element');\n\n const startsPastZero = this.isLive() || startTime > 0;\n\n // Create the region observer. This will allow us to notify the app when we\n // move in and out of timeline regions.\n /** @type {!shaka.media.RegionObserver<shaka.extern.TimelineRegionInfo>} */\n const regionObserver = new shaka.media.RegionObserver(\n this.regionTimeline_, startsPastZero);\n\n regionObserver.addEventListener('enter', (event) => {\n /** @type {shaka.extern.TimelineRegionInfo} */\n const region = event['region'];\n this.onRegionEvent_(\n shaka.util.FakeEvent.EventName.TimelineRegionEnter, region);\n });\n\n regionObserver.addEventListener('exit', (event) => {\n /** @type {shaka.extern.TimelineRegionInfo} */\n const region = event['region'];\n this.onRegionEvent_(\n shaka.util.FakeEvent.EventName.TimelineRegionExit, region);\n });\n\n regionObserver.addEventListener('skip', (event) => {\n /** @type {shaka.extern.TimelineRegionInfo} */\n const region = event['region'];\n /** @type {boolean} */\n const seeking = event['seeking'];\n // If we are seeking, we don't want to surface the enter/exit events since\n // they didn't play through them.\n if (!seeking) {\n this.onRegionEvent_(\n shaka.util.FakeEvent.EventName.TimelineRegionEnter, region);\n this.onRegionEvent_(\n shaka.util.FakeEvent.EventName.TimelineRegionExit, region);\n }\n });\n\n /**\n * @type {!shaka.media.RegionObserver<\n * shaka.extern.MetadataTimelineRegionInfo>}\n */\n const metadataRegionObserver = new shaka.media.RegionObserver(\n this.metadataRegionTimeline_, startsPastZero);\n\n metadataRegionObserver.addEventListener('enter', (event) => {\n /** @type {shaka.extern.MetadataTimelineRegionInfo} */\n const region = event['region'];\n this.dispatchMetadataEvent_(region);\n });\n\n /**\n * @type {!shaka.media.RegionObserver<shaka.extern.EmsgTimelineRegionInfo>}\n */\n const emsgRegionObserver = new shaka.media.RegionObserver(\n this.emsgRegionTimeline_, startsPastZero);\n\n emsgRegionObserver.addEventListener('enter', (event) => {\n /** @type {shaka.extern.EmsgTimelineRegionInfo} */\n const region = event['region'];\n this.dispatchEmsgEvent_(region);\n });\n\n // Now that we have all our observers, create a manager for them.\n const manager = new shaka.media.PlayheadObserverManager(this.video_);\n manager.manage(regionObserver);\n manager.manage(metadataRegionObserver);\n manager.manage(emsgRegionObserver);\n if (this.qualityObserver_) {\n manager.manage(this.qualityObserver_);\n }\n return manager;\n }\n\n /**\n * Create the observers for src equals playback. These observers are\n * responsible for notifying the app and player of specific events during src\n * equals playback.\n *\n * @param {number} startTime\n * @return {!shaka.media.PlayheadObserverManager}\n * @private\n */\n createPlayheadObserversForSrcEquals_(startTime) {\n goog.asserts.assert(this.metadataRegionTimeline_,\n 'Must have metadata region timeline');\n goog.asserts.assert(this.video_, 'Must have video element');\n\n const startsPastZero = startTime > 0;\n\n /**\n * @type {!shaka.media.RegionObserver<\n * shaka.extern.MetadataTimelineRegionInfo>}\n */\n const metadataRegionObserver = new shaka.media.RegionObserver(\n this.metadataRegionTimeline_, startsPastZero);\n\n metadataRegionObserver.addEventListener('enter', (event) => {\n /** @type {shaka.extern.MetadataTimelineRegionInfo} */\n const region = event['region'];\n this.dispatchMetadataEvent_(region);\n });\n\n // Now that we have all our observers, create a manager for them.\n const manager = new shaka.media.PlayheadObserverManager(this.video_);\n manager.manage(metadataRegionObserver);\n return manager;\n }\n\n /**\n * Initialize and start the buffering system (observer and timer) so that we\n * can monitor our buffer lead during playback.\n *\n * @param {!HTMLMediaElement} mediaElement\n * @param {boolean} srcEquals\n * @private\n */\n startBufferManagement_(mediaElement, srcEquals) {\n goog.asserts.assert(\n !this.bufferObserver_,\n 'No buffering observer should exist before initialization.');\n\n goog.asserts.assert(\n !this.bufferPoller_,\n 'No buffer timer should exist before initialization.');\n\n // Give dummy values, will be updated below.\n this.bufferObserver_ = new shaka.media.BufferingObserver(1, 2);\n\n // Force us back to a buffering state. This ensure everything is starting in\n // the same state.\n this.bufferObserver_.setState(shaka.media.BufferingObserver.State.STARVING);\n this.updateBufferingSettings_();\n this.updateBufferState_();\n\n this.bufferPoller_ = new shaka.util.Timer(() => {\n this.pollBufferState_();\n });\n if (this.config_.streaming.rebufferingGoal) {\n this.bufferPoller_.tickEvery(/* seconds= */ 0.25);\n }\n this.loadEventManager_.listen(mediaElement, 'waiting',\n (e) => this.pollBufferState_());\n this.loadEventManager_.listen(mediaElement, 'canplaythrough',\n (e) => this.pollBufferState_());\n this.loadEventManager_.listen(mediaElement, 'playing',\n (e) => this.pollBufferState_());\n this.loadEventManager_.listen(mediaElement, 'seeked',\n (e) => this.pollBufferState_());\n if (srcEquals) {\n this.loadEventManager_.listen(mediaElement, 'stalled',\n (e) => this.pollBufferState_());\n this.loadEventManager_.listen(mediaElement, 'progress',\n (e) => this.pollBufferState_());\n this.loadEventManager_.listen(mediaElement, 'timeupdate',\n (e) => this.pollBufferState_());\n }\n }\n\n /**\n * Updates the buffering thresholds based on the new rebuffering goal.\n *\n * @private\n */\n updateBufferingSettings_() {\n const rebufferingGoal = this.config_.streaming.rebufferingGoal;\n // The threshold to transition back to satisfied when starving.\n const starvingThreshold = rebufferingGoal;\n // The threshold to transition into starving when satisfied.\n // We use a \"typical\" threshold, unless the rebufferingGoal is unusually\n // low.\n // Then we force the value down to half the rebufferingGoal, since\n // starvingThreshold must be strictly larger than satisfiedThreshold for the\n // logic in BufferingObserver to work correctly.\n const satisfiedThreshold = Math.min(\n shaka.Player.TYPICAL_BUFFERING_THRESHOLD_, rebufferingGoal / 2);\n\n this.bufferObserver_.setThresholds(starvingThreshold, satisfiedThreshold);\n }\n\n /**\n * This method is called periodically to check what the buffering observer\n * says so that we can update the rest of the buffering behaviours.\n *\n * @private\n */\n pollBufferState_() {\n goog.asserts.assert(\n this.video_,\n 'Need a media element to update the buffering observer');\n\n goog.asserts.assert(\n this.bufferObserver_,\n 'Need a buffering observer to update');\n\n let bufferedToEnd;\n switch (this.loadMode_) {\n case shaka.Player.LoadMode.SRC_EQUALS:\n bufferedToEnd = this.isBufferedToEndSrc_();\n break;\n case shaka.Player.LoadMode.MEDIA_SOURCE:\n bufferedToEnd = this.isBufferedToEndMS_();\n break;\n default:\n bufferedToEnd = false;\n break;\n }\n\n const bufferLead = shaka.media.TimeRangesUtils.bufferedAheadOf(\n this.video_.buffered,\n this.video_.currentTime);\n\n const stateChanged = this.bufferObserver_.update(bufferLead, bufferedToEnd);\n\n // If the state changed, we need to surface the event.\n if (stateChanged) {\n this.updateBufferState_();\n }\n }\n\n /**\n * Create a new media source engine. This will ONLY be replaced by tests as a\n * way to inject fake media source engine instances.\n *\n * @param {!HTMLMediaElement} mediaElement\n * @param {!shaka.extern.TextDisplayer} textDisplayer\n * @param {!shaka.media.MediaSourceEngine.PlayerInterface} playerInterface\n * @param {shaka.lcevc.Dec} lcevcDec\n *\n * @return {!shaka.media.MediaSourceEngine}\n */\n createMediaSourceEngine(mediaElement, textDisplayer, playerInterface,\n lcevcDec) {\n return new shaka.media.MediaSourceEngine(\n mediaElement,\n textDisplayer,\n playerInterface,\n lcevcDec);\n }\n\n /**\n * Create a new CMCD manager.\n *\n * @private\n */\n createCmcd_() {\n /** @type {shaka.util.CmcdManager.PlayerInterface} */\n const playerInterface = {\n getBandwidthEstimate: () => this.abrManager_ ?\n this.abrManager_.getBandwidthEstimate() : NaN,\n getBufferedInfo: () => this.getBufferedInfo(),\n getCurrentTime: () => this.video_ ? this.video_.currentTime : 0,\n getPlaybackRate: () => this.getPlaybackRate(),\n getNetworkingEngine: () => this.getNetworkingEngine(),\n getVariantTracks: () => this.getVariantTracks(),\n isLive: () => this.isLive(),\n getLiveLatency: () => this.getLiveLatency(),\n };\n\n return new shaka.util.CmcdManager(playerInterface, this.config_.cmcd);\n }\n\n /**\n * Create a new CMSD manager.\n *\n * @private\n */\n createCmsd_() {\n return new shaka.util.CmsdManager(this.config_.cmsd);\n }\n\n /**\n * Creates a new instance of StreamingEngine. This can be replaced by tests\n * to create fake instances instead.\n *\n * @return {!shaka.media.StreamingEngine}\n */\n createStreamingEngine() {\n goog.asserts.assert(\n this.abrManager_ && this.mediaSourceEngine_ && this.manifest_ &&\n this.video_,\n 'Must not be destroyed');\n\n /** @type {shaka.media.StreamingEngine.PlayerInterface} */\n const playerInterface = {\n getPresentationTime: () => this.playhead_ ? this.playhead_.getTime() : 0,\n getBandwidthEstimate: () => this.abrManager_.getBandwidthEstimate(),\n getPlaybackRate: () => this.getPlaybackRate(),\n video: this.video_,\n mediaSourceEngine: this.mediaSourceEngine_,\n netEngine: this.networkingEngine_,\n onError: (error) => this.onError_(error),\n onEvent: (event) => this.dispatchEvent(event),\n onSegmentAppended: (reference, stream, isMuxed) => {\n this.onSegmentAppended_(\n reference.startTime, reference.endTime, stream.type, isMuxed);\n },\n onInitSegmentAppended: (position, initSegment) => {\n const mediaQuality = initSegment.getMediaQuality();\n if (mediaQuality && this.qualityObserver_) {\n this.qualityObserver_.addMediaQualityChange(mediaQuality, position);\n }\n },\n beforeAppendSegment: (contentType, segment) => {\n return this.drmEngine_.parseInbandPssh(contentType, segment);\n },\n disableStream: (stream, time) => this.disableStream(stream, time),\n };\n\n return new shaka.media.StreamingEngine(this.manifest_, playerInterface);\n }\n\n /**\n * Changes configuration settings on the Player. This checks the names of\n * keys and the types of values to avoid coding errors. If there are errors,\n * this logs them to the console and returns false. Correct fields are still\n * applied even if there are other errors. You can pass an explicit\n * <code>undefined</code> value to restore the default value. This has two\n * modes of operation:\n *\n * <p>\n * First, this can be passed a single \"plain\" object. This object should\n * follow the {@link shaka.extern.PlayerConfiguration} object. Not all fields\n * need to be set; unset fields retain their old values.\n *\n * <p>\n * Second, this can be passed two arguments. The first is the name of the key\n * to set. This should be a '.' separated path to the key. For example,\n * <code>'streaming.alwaysStreamText'</code>. The second argument is the\n * value to set.\n *\n * @param {string|!Object} config This should either be a field name or an\n * object.\n * @param {*=} value In the second mode, this is the value to set.\n * @return {boolean} True if the passed config object was valid, false if\n * there were invalid entries.\n * @export\n */\n configure(config, value) {\n const Platform = shaka.util.Platform;\n\n goog.asserts.assert(this.config_, 'Config must not be null!');\n goog.asserts.assert(typeof(config) == 'object' || arguments.length == 2,\n 'String configs should have values!');\n\n // ('fieldName', value) format\n if (arguments.length == 2 && typeof(config) == 'string') {\n config = shaka.util.ConfigUtils.convertToConfigObject(config, value);\n }\n\n goog.asserts.assert(typeof(config) == 'object', 'Should be an object!');\n\n // Deprecate 'streaming.forceTransmuxTS' configuration.\n if (config['streaming'] && 'forceTransmuxTS' in config['streaming']) {\n shaka.Deprecate.deprecateFeature(5,\n 'streaming.forceTransmuxTS configuration',\n 'Please Use mediaSource.forceTransmux instead.');\n config['mediaSource']['mediaSource'] =\n config['streaming']['forceTransmuxTS'];\n delete config['streaming']['forceTransmuxTS'];\n }\n\n // Deprecate 'streaming.forceTransmux' configuration.\n if (config['streaming'] && 'forceTransmux' in config['streaming']) {\n shaka.Deprecate.deprecateFeature(5,\n 'streaming.forceTransmux configuration',\n 'Please Use mediaSource.forceTransmux instead.');\n config['mediaSource']['mediaSource'] =\n config['streaming']['forceTransmux'];\n delete config['streaming']['forceTransmux'];\n }\n\n // Deprecate 'streaming.useNativeHlsOnSafari' configuration.\n if (config['streaming'] && 'useNativeHlsOnSafari' in config['streaming']) {\n shaka.Deprecate.deprecateFeature(5,\n 'streaming.useNativeHlsOnSafari configuration',\n 'Please Use streaming.useNativeHlsForFairPlay or ' +\n 'streaming.preferNativeHls instead.');\n config['streaming']['preferNativeHls'] =\n config['streaming']['useNativeHlsOnSafari'] && Platform.isApple();\n delete config['streaming']['useNativeHlsOnSafari'];\n }\n\n // Deprecate 'streaming.liveSync' boolean configuration.\n if (config['streaming'] &&\n typeof config['streaming']['liveSync'] == 'boolean') {\n shaka.Deprecate.deprecateFeature(5,\n 'streaming.liveSync',\n 'Please Use streaming.liveSync.enabled instead.');\n const liveSyncValue = config['streaming']['liveSync'];\n config['streaming']['liveSync'] = {};\n config['streaming']['liveSync']['enabled'] = liveSyncValue;\n }\n\n // map liveSyncMinLatency and liveSyncMaxLatency to liveSync.targetLatency\n // if liveSync.targetLatency isn't set.\n if (config['streaming'] && (!config['streaming']['liveSync'] ||\n !('targetLatency' in config['streaming']['liveSync'])) &&\n ('liveSyncMinLatency' in config['streaming'] ||\n 'liveSyncMaxLatency' in config['streaming'])) {\n const min = config['streaming']['liveSyncMinLatency'] || 0;\n const max = config['streaming']['liveSyncMaxLatency'] || 1;\n const mid = Math.abs(max - min) / 2;\n config['streaming']['liveSync'] = config['streaming']['liveSync'] || {};\n config['streaming']['liveSync']['targetLatency'] = min + mid;\n config['streaming']['liveSync']['targetLatencyTolerance'] = mid;\n }\n // Deprecate 'streaming.liveSyncMaxLatency' configuration.\n if (config['streaming'] && 'liveSyncMaxLatency' in config['streaming']) {\n shaka.Deprecate.deprecateFeature(5,\n 'streaming.liveSyncMaxLatency',\n 'Please Use streaming.liveSync.targetLatency and ' +\n 'streaming.liveSync.targetLatencyTolerance instead. ' +\n 'Or, set the values in your DASH manifest');\n delete config['streaming']['liveSyncMaxLatency'];\n }\n // Deprecate 'streaming.liveSyncMinLatency' configuration.\n if (config['streaming'] && 'liveSyncMinLatency' in config['streaming']) {\n shaka.Deprecate.deprecateFeature(5,\n 'streaming.liveSyncMinLatency',\n 'Please Use streaming.liveSync.targetLatency and ' +\n 'streaming.liveSync.targetLatencyTolerance instead. ' +\n 'Or, set the values in your DASH manifest');\n delete config['streaming']['liveSyncMinLatency'];\n }\n\n // Deprecate 'streaming.liveSyncTargetLatency' configuration.\n if (config['streaming'] && 'liveSyncTargetLatency' in config['streaming']) {\n shaka.Deprecate.deprecateFeature(5,\n 'streaming.liveSyncTargetLatency',\n 'Please Use streaming.liveSync.targetLatency instead.');\n config['streaming']['liveSync'] = config['streaming']['liveSync'] || {};\n config['streaming']['liveSync']['targetLatency'] =\n config['streaming']['liveSyncTargetLatency'];\n delete config['streaming']['liveSyncTargetLatency'];\n }\n\n // Deprecate 'streaming.liveSyncTargetLatencyTolerance' configuration.\n if (config['streaming'] &&\n 'liveSyncTargetLatencyTolerance' in config['streaming']) {\n shaka.Deprecate.deprecateFeature(5,\n 'streaming.liveSyncTargetLatencyTolerance',\n 'Please Use streaming.liveSync.targetLatencyTolerance instead.');\n config['streaming']['liveSync'] = config['streaming']['liveSync'] || {};\n config['streaming']['liveSync']['targetLatencyTolerance'] =\n config['streaming']['liveSyncTargetLatencyTolerance'];\n delete config['streaming']['liveSyncTargetLatencyTolerance'];\n }\n\n // Deprecate 'streaming.liveSyncPlaybackRate' configuration.\n if (config['streaming'] && 'liveSyncPlaybackRate' in config['streaming']) {\n shaka.Deprecate.deprecateFeature(5,\n 'streaming.liveSyncPlaybackRate',\n 'Please Use streaming.liveSync.maxPlaybackRate instead.');\n config['streaming']['liveSync'] = config['streaming']['liveSync'] || {};\n config['streaming']['liveSync']['maxPlaybackRate'] =\n config['streaming']['liveSyncPlaybackRate'];\n delete config['streaming']['liveSyncPlaybackRate'];\n }\n\n // Deprecate 'streaming.liveSyncMinPlaybackRate' configuration.\n if (config['streaming'] &&\n 'liveSyncMinPlaybackRate' in config['streaming']) {\n shaka.Deprecate.deprecateFeature(5,\n 'streaming.liveSyncMinPlaybackRate',\n 'Please Use streaming.liveSync.minPlaybackRate instead.');\n config['streaming']['liveSync'] = config['streaming']['liveSync'] || {};\n config['streaming']['liveSync']['minPlaybackRate'] =\n config['streaming']['liveSyncMinPlaybackRate'];\n delete config['streaming']['liveSyncMinPlaybackRate'];\n }\n\n // Deprecate 'streaming.liveSyncPanicMode' configuration.\n if (config['streaming'] && 'liveSyncPanicMode' in config['streaming']) {\n shaka.Deprecate.deprecateFeature(5,\n 'streaming.liveSyncPanicMode',\n 'Please Use streaming.liveSync.panicMode instead.');\n config['streaming']['liveSync'] = config['streaming']['liveSync'] || {};\n config['streaming']['liveSync']['panicMode'] =\n config['streaming']['liveSyncPanicMode'];\n delete config['streaming']['liveSyncPanicMode'];\n }\n\n // Deprecate 'streaming.liveSyncPanicThreshold' configuration.\n if (config['streaming'] &&\n 'liveSyncPanicThreshold' in config['streaming']) {\n shaka.Deprecate.deprecateFeature(5,\n 'streaming.liveSyncPanicThreshold',\n 'Please Use streaming.liveSync.panicThreshold instead.');\n config['streaming']['liveSync'] = config['streaming']['liveSync'] || {};\n config['streaming']['liveSync']['panicThreshold'] =\n config['streaming']['liveSyncPanicThreshold'];\n delete config['streaming']['liveSyncPanicThreshold'];\n }\n\n // Deprecate 'mediaSource.sourceBufferExtraFeatures' configuration.\n if (config['mediaSource'] &&\n 'sourceBufferExtraFeatures' in config['mediaSource']) {\n shaka.Deprecate.deprecateFeature(5,\n 'mediaSource.sourceBufferExtraFeatures configuration',\n 'Please Use mediaSource.addExtraFeaturesToSourceBuffer() instead.');\n const sourceBufferExtraFeatures =\n config['mediaSource']['sourceBufferExtraFeatures'];\n config['mediaSource']['addExtraFeaturesToSourceBuffer'] = () => {\n return sourceBufferExtraFeatures;\n };\n delete config['mediaSource']['sourceBufferExtraFeatures'];\n }\n\n // Deprecate 'manifest.hls.useSafariBehaviorForLive' configuration.\n if (config['manifest'] && config['manifest']['hls'] &&\n 'useSafariBehaviorForLive' in config['manifest']['hls']) {\n shaka.Deprecate.deprecateFeature(5,\n 'manifest.hls.useSafariBehaviorForLive configuration',\n 'Please Use liveSync config to keep on live Edge instead.');\n delete config['manifest']['hls']['useSafariBehaviorForLive'];\n }\n\n // Deprecate 'streaming.parsePrftBox' configuration.\n if (config['streaming'] && 'parsePrftBox' in config['streaming']) {\n shaka.Deprecate.deprecateFeature(5,\n 'streaming.parsePrftBox configuration',\n 'Now fired without needing a configuration.');\n delete config['streaming']['parsePrftBox'];\n }\n\n // Deprecate 'manifest.dash.enableAudioGroups' configuration.\n if (config['manifest'] && config['manifest']['dash'] &&\n 'enableAudioGroups' in config['manifest']['dash']) {\n shaka.Deprecate.deprecateFeature(5,\n 'manifest.dash.enableAudioGroups configuration',\n 'It is now enabled by default and cannot be disabled.');\n delete config['manifest']['dash']['enableAudioGroups'];\n }\n\n // Deprecate 'streaming.dispatchAllEmsgBoxes' configuration.\n if (config['streaming'] && 'dispatchAllEmsgBoxes' in config['streaming']) {\n shaka.Deprecate.deprecateFeature(5,\n 'streaming.dispatchAllEmsgBoxes configuration',\n 'Please Use mediaSource.dispatchAllEmsgBoxes instead.');\n config['mediaSource']['dispatchAllEmsgBoxes'] =\n config['streaming']['dispatchAllEmsgBoxes'];\n delete config['streaming']['dispatchAllEmsgBoxes'];\n }\n\n // Deprecate 'streaming.autoLowLatencyMode' configuration.\n if (config['streaming'] && 'autoLowLatencyMode' in config['streaming']) {\n shaka.Deprecate.deprecateFeature(5,\n 'streaming.autoLowLatencyMode configuration',\n 'Please Use streaming.lowLatencyMode instead.');\n config['streaming']['lowLatencyMode'] =\n config['streaming']['autoLowLatencyMode'];\n delete config['streaming']['autoLowLatencyMode'];\n }\n\n // Deprecate 'manifest.dash.ignoreSupplementalCodecs' configuration.\n if (config['manifest'] && config['manifest']['dash'] &&\n 'ignoreSupplementalCodecs' in config['manifest']['dash']) {\n shaka.Deprecate.deprecateFeature(5,\n 'manifest.dash.ignoreSupplementalCodecs configuration',\n 'Please Use manifest.ignoreSupplementalCodecs instead.');\n config['manifest']['ignoreSupplementalCodecs'] =\n config['manifest']['dash']['ignoreSupplementalCodecs'];\n delete config['manifest']['dash']['ignoreSupplementalCodecs'];\n }\n\n // Deprecate 'manifest.hls.ignoreSupplementalCodecs' configuration.\n if (config['manifest'] && config['manifest']['hls'] &&\n 'ignoreSupplementalCodecs' in config['manifest']['hls']) {\n shaka.Deprecate.deprecateFeature(5,\n 'manifest.hls.ignoreSupplementalCodecs configuration',\n 'Please Use manifest.ignoreSupplementalCodecs instead.');\n config['manifest']['ignoreSupplementalCodecs'] =\n config['manifest']['hls']['ignoreSupplementalCodecs'];\n delete config['manifest']['hls']['ignoreSupplementalCodecs'];\n }\n\n // Deprecate 'manifest.dash.updatePeriod' configuration.\n if (config['manifest'] && config['manifest']['dash'] &&\n 'updatePeriod' in config['manifest']['dash']) {\n shaka.Deprecate.deprecateFeature(5,\n 'manifest.dash.updatePeriod configuration',\n 'Please Use manifest.updatePeriod instead.');\n config['manifest']['updatePeriod'] =\n config['manifest']['dash']['updatePeriod'];\n delete config['manifest']['dash']['updatePeriod'];\n }\n\n // Deprecate 'manifest.hls.updatePeriod' configuration.\n if (config['manifest'] && config['manifest']['hls'] &&\n 'updatePeriod' in config['manifest']['hls']) {\n shaka.Deprecate.deprecateFeature(5,\n 'manifest.hls.updatePeriod configuration',\n 'Please Use manifest.updatePeriod instead.');\n config['manifest']['updatePeriod'] =\n config['manifest']['hls']['updatePeriod'];\n delete config['manifest']['hls']['updatePeriod'];\n }\n\n // Deprecate 'manifest.dash.ignoreDrmInfo' configuration.\n if (config['manifest'] && config['manifest']['dash'] &&\n 'ignoreDrmInfo' in config['manifest']['dash']) {\n shaka.Deprecate.deprecateFeature(5,\n 'manifest.dash.ignoreDrmInfo configuration',\n 'Please Use manifest.ignoreDrmInfo instead.');\n config['manifest']['ignoreDrmInfo'] =\n config['manifest']['dash']['ignoreDrmInfo'];\n delete config['manifest']['dash']['ignoreDrmInfo'];\n }\n\n // Deprecate AdvancedDrmConfiguration's videoRobustness and audioRobustness\n // as a string. It's now an array of strings.\n if (config['drm'] && config['drm']['advanced']) {\n let fixedUp = false;\n for (const keySystem in config['drm']['advanced']) {\n const {videoRobustness, audioRobustness} =\n config['drm']['advanced'][keySystem];\n if ('videoRobustness' in config['drm']['advanced'][keySystem] &&\n !Array.isArray(\n config['drm']['advanced'][keySystem]['videoRobustness'])) {\n config['drm']['advanced'][keySystem]['videoRobustness'] =\n [videoRobustness];\n fixedUp = true;\n }\n if ('audioRobustness' in config['drm']['advanced'][keySystem] &&\n !Array.isArray(\n config['drm']['advanced'][keySystem]['audioRobustness'])) {\n config['drm']['advanced'][keySystem]['audioRobustness'] =\n [audioRobustness];\n fixedUp = true;\n }\n }\n\n if (fixedUp) {\n shaka.Deprecate.deprecateFeature(5,\n 'AdvancedDrmConfiguration\\'s videoRobustness and audioRobustness',\n 'These properties are no longer strings but array of strings, ' +\n 'please update your usage of these properties.');\n }\n }\n\n // Enforce inaccurateManifestTolerance: 0 when using crossBoundaryStrategy\n // different from KEEP.\n if (config['streaming'] && 'crossBoundaryStrategy' in config['streaming']) {\n if (config['streaming']['crossBoundaryStrategy'] !=\n shaka.config.CrossBoundaryStrategy.KEEP) {\n config['streaming']['inaccurateManifestTolerance'] = 0;\n }\n }\n\n const ret = shaka.util.PlayerConfiguration.mergeConfigObjects(\n this.config_, config, this.defaultConfig_());\n\n this.applyConfig_();\n return ret;\n }\n\n /**\n * Changes low latency configuration settings on the Player.\n *\n * @param {!Object} config This object should follow the\n * {@link shaka.extern.PlayerConfiguration} object. Not all fields\n * need to be set; unset fields retain their old values.\n * @export\n */\n configurationForLowLatency(config) {\n this.lowLatencyConfig_ = config;\n }\n\n /**\n * Apply config changes.\n * @private\n */\n applyConfig_() {\n this.manifestFilterer_ = new shaka.media.ManifestFilterer(\n this.config_, this.maxHwRes_, this.drmEngine_);\n if (this.parser_) {\n const manifestConfig =\n shaka.util.ObjectUtils.cloneObject(this.config_.manifest);\n // Don't read video segments if the player is attached to an audio element\n if (this.video_ && this.video_.nodeName === 'AUDIO') {\n manifestConfig.disableVideo = true;\n }\n this.parser_.configure(manifestConfig);\n }\n if (this.drmEngine_) {\n this.drmEngine_.configure(this.config_.drm);\n }\n if (this.streamingEngine_) {\n this.streamingEngine_.configure(this.config_.streaming);\n\n // Need to apply the restrictions.\n // this.filterManifestWithRestrictions_() may throw.\n try {\n if (this.loadMode_ != shaka.Player.LoadMode.DESTROYED) {\n if (this.manifestFilterer_.filterManifestWithRestrictions(\n this.manifest_)) {\n this.onTracksChanged_();\n }\n }\n } catch (error) {\n this.onError_(error);\n }\n\n if (this.abrManager_) {\n // Update AbrManager variants to match these new settings.\n this.updateAbrManagerVariants_();\n }\n\n // If the streams we are playing are restricted, we need to switch.\n const activeVariant = this.streamingEngine_.getCurrentVariant();\n if (activeVariant) {\n if (!activeVariant.allowedByApplication ||\n !activeVariant.allowedByKeySystem) {\n shaka.log.debug('Choosing new variant after changing configuration');\n this.chooseVariantAndSwitch_();\n }\n }\n }\n if (this.networkingEngine_) {\n this.networkingEngine_.setForceHTTP(this.config_.streaming.forceHTTP);\n this.networkingEngine_.setForceHTTPS(this.config_.streaming.forceHTTPS);\n this.networkingEngine_.setMinBytesForProgressEvents(\n this.config_.streaming.minBytesForProgressEvents);\n }\n\n if (this.mediaSourceEngine_) {\n this.mediaSourceEngine_.configure(this.config_.mediaSource);\n const {segmentRelativeVttTiming} = this.config_.manifest;\n this.mediaSourceEngine_.setSegmentRelativeVttTiming(\n segmentRelativeVttTiming);\n }\n\n if (this.textDisplayer_) {\n const textDisplayerFactory = this.config_.textDisplayFactory;\n if (this.lastTextFactory_ != textDisplayerFactory) {\n const oldDisplayer = this.textDisplayer_;\n this.textDisplayer_ = textDisplayerFactory();\n if (this.textDisplayer_.configure) {\n this.textDisplayer_.configure(this.config_.textDisplayer);\n } else {\n shaka.Deprecate.deprecateFeature(5,\n 'Text displayer w/ configure',\n 'Text displayer should have a \"configure\" method!');\n }\n if (!this.textDisplayer_.setTextLanguage) {\n shaka.Deprecate.deprecateFeature(5,\n 'Text displayer w/ setTextLanguage',\n 'Text displayer should have a \"setTextLanguage\" method!');\n }\n this.textDisplayer_.setTextVisibility(oldDisplayer.isTextVisible());\n oldDisplayer.destroy();\n if (this.mediaSourceEngine_) {\n this.mediaSourceEngine_.setTextDisplayer(this.textDisplayer_);\n }\n this.lastTextFactory_ = textDisplayerFactory;\n\n if (this.streamingEngine_) {\n // Reload the text stream, so the cues will load again.\n this.streamingEngine_.reloadTextStream();\n }\n } else {\n if (this.textDisplayer_.configure) {\n this.textDisplayer_.configure(this.config_.textDisplayer);\n }\n }\n }\n\n if (this.abrManager_) {\n this.abrManager_.configure(this.config_.abr);\n // Simply enable/disable ABR with each call, since multiple calls to these\n // methods have no effect.\n if (this.config_.abr.enabled) {\n this.abrManager_.enable();\n } else {\n this.abrManager_.disable();\n }\n\n this.onAbrStatusChanged_();\n }\n if (this.bufferObserver_) {\n this.updateBufferingSettings_();\n }\n if (this.bufferPoller_) {\n if (!this.config_.streaming.rebufferingGoal) {\n this.bufferPoller_.stop();\n } else {\n this.bufferPoller_.tickEvery(/* seconds= */ 0.25);\n }\n }\n\n if (this.manifest_) {\n shaka.Player.applyPlayRange_(this.manifest_.presentationTimeline,\n this.config_.playRangeStart,\n this.config_.playRangeEnd);\n }\n if (this.adManager_) {\n this.adManager_.configure(this.config_.ads);\n }\n if (this.cmcdManager_) {\n this.cmcdManager_.configure(this.config_.cmcd);\n }\n if (this.cmsdManager_) {\n this.cmsdManager_.configure(this.config_.cmsd);\n }\n }\n\n /**\n * Return a copy of the current configuration. Modifications of the returned\n * value will not affect the Player's active configuration. You must call\n * <code>player.configure()</code> to make changes.\n *\n * @return {shaka.extern.PlayerConfiguration}\n * @export\n */\n getConfiguration() {\n goog.asserts.assert(this.config_, 'Config must not be null!');\n\n const ret = this.defaultConfig_();\n shaka.util.PlayerConfiguration.mergeConfigObjects(\n ret, this.config_, this.defaultConfig_());\n return ret;\n }\n\n /**\n * Return a copy of the current configuration for low latency.\n *\n * @return {!Object}\n * @export\n */\n getConfigurationForLowLatency() {\n return this.lowLatencyConfig_;\n }\n\n /**\n * Return a copy of the current non default configuration. Modifications of\n * the returned value will not affect the Player's active configuration.\n * You must call <code>player.configure()</code> to make changes.\n *\n * @return {!Object}\n * @export\n */\n getNonDefaultConfiguration() {\n goog.asserts.assert(this.config_, 'Config must not be null!');\n\n const ret = this.defaultConfig_();\n shaka.util.PlayerConfiguration.mergeConfigObjects(\n ret, this.config_, this.defaultConfig_());\n return shaka.util.ConfigUtils.getDifferenceFromConfigObjects(\n this.config_, this.defaultConfig_());\n }\n\n /**\n * Return a reference to the current configuration. Modifications to the\n * returned value will affect the Player's active configuration. This method\n * is not exported as sharing configuration with external objects is not\n * supported.\n *\n * @return {shaka.extern.PlayerConfiguration}\n */\n getSharedConfiguration() {\n goog.asserts.assert(\n this.config_, 'Cannot call getSharedConfiguration after call destroy!');\n return this.config_;\n }\n\n /**\n * Returns the ratio of video length buffered compared to buffering Goal\n * @return {number}\n * @export\n */\n getBufferFullness() {\n if (this.video_) {\n const bufferedLength = this.video_.buffered.length;\n const bufferedEnd =\n bufferedLength ? this.video_.buffered.end(bufferedLength - 1) : 0;\n const bufferingGoal = this.getConfiguration().streaming.bufferingGoal;\n const lengthToBeBuffered = Math.min(this.video_.currentTime +\n bufferingGoal, this.seekRange().end);\n\n if (bufferedEnd >= lengthToBeBuffered) {\n return 1;\n } else if (bufferedEnd <= this.video_.currentTime) {\n return 0;\n } else if (bufferedEnd < lengthToBeBuffered) {\n return ((bufferedEnd - this.video_.currentTime) /\n (lengthToBeBuffered - this.video_.currentTime));\n }\n }\n return 0;\n }\n\n /**\n * Reset configuration to default.\n * @export\n */\n resetConfiguration() {\n goog.asserts.assert(this.config_, 'Cannot be destroyed');\n // Remove the old keys so we remove open-ended dictionaries like drm.servers\n // but keeps the same object reference.\n for (const key in this.config_) {\n delete this.config_[key];\n }\n\n shaka.util.PlayerConfiguration.mergeConfigObjects(\n this.config_, this.defaultConfig_(), this.defaultConfig_());\n this.applyConfig_();\n }\n\n /**\n * Get the current load mode.\n *\n * @return {shaka.Player.LoadMode}\n * @export\n */\n getLoadMode() {\n return this.loadMode_;\n }\n\n /**\n * Get the current manifest type.\n *\n * @return {?string}\n * @export\n */\n getManifestType() {\n if (!this.manifest_) {\n return null;\n }\n return this.manifest_.type;\n }\n\n /**\n * Get the media element that the player is currently using to play loaded\n * content. If the player has not loaded content, this will return\n * <code>null</code>.\n *\n * @return {HTMLMediaElement}\n * @export\n */\n getMediaElement() {\n return this.video_;\n }\n\n /**\n * @return {shaka.net.NetworkingEngine} A reference to the Player's networking\n * engine. Applications may use this to make requests through Shaka's\n * networking plugins.\n * @export\n */\n getNetworkingEngine() {\n return this.networkingEngine_;\n }\n\n /**\n * Get the uri to the asset that the player has loaded. If the player has not\n * loaded content, this will return <code>null</code>.\n *\n * @return {?string}\n * @export\n */\n getAssetUri() {\n return this.assetUri_;\n }\n\n /**\n * Returns a shaka.ads.AdManager instance, responsible for Dynamic\n * Ad Insertion functionality.\n *\n * @return {shaka.extern.IAdManager}\n * @export\n */\n getAdManager() {\n // NOTE: this clause is redundant, but it keeps the compiler from\n // inlining this function. Inlining leads to setting the adManager\n // not taking effect in the compiled build.\n // Closure has a @noinline flag, but apparently not all cases are\n // supported by it, and ours isn't.\n // If they expand support, we might be able to get rid of this\n // clause.\n if (!this.adManager_) {\n return null;\n }\n\n return this.adManager_;\n }\n\n /**\n * Get if the player is playing live content. If the player has not loaded\n * content, this will return <code>false</code>.\n *\n * @return {boolean}\n * @export\n */\n isLive() {\n if (this.manifest_ && !this.isRemotePlayback()) {\n return this.manifest_.presentationTimeline.isLive();\n }\n\n // For native HLS, the duration for live streams seems to be Infinity.\n if (this.video_ && this.video_.src) {\n return this.video_.duration == Infinity;\n }\n\n return false;\n }\n\n /**\n * Get if the player is playing in-progress content. If the player has not\n * loaded content, this will return <code>false</code>.\n *\n * @return {boolean}\n * @export\n */\n isInProgress() {\n return this.manifest_ ?\n this.manifest_.presentationTimeline.isInProgress() :\n false;\n }\n\n /**\n * Check if the manifest contains only audio-only content. If the player has\n * not loaded content, this will return <code>false</code>.\n *\n * <p>\n * The player does not support content that contain more than one type of\n * variants (i.e. mixing audio-only, video-only, audio-video). Content will be\n * filtered to only contain one type of variant.\n *\n * @return {boolean}\n * @export\n */\n isAudioOnly() {\n if (this.manifest_ && !this.isRemotePlayback()) {\n const variants = this.manifest_.variants;\n if (!variants.length) {\n return false;\n }\n\n // Note that if there are some audio-only variants and some audio-video\n // variants, the audio-only variants are removed during filtering.\n // Therefore if the first variant has no video, that's sufficient to say\n // it is audio-only content.\n return !variants[0].video;\n } else if (this.video_ && this.video_.src) {\n // If we have video track info, use that. It will be the least\n // error-prone way with native HLS. In contrast, videoHeight might be\n // unset until the first frame is loaded. Since isAudioOnly is queried\n // by the UI on the 'trackschanged' event, the videoTracks info should be\n // up-to-date.\n if (this.video_.videoTracks) {\n return this.video_.videoTracks.length == 0;\n }\n\n // We cast to the more specific HTMLVideoElement to access videoHeight.\n // This might be an audio element, though, in which case videoHeight will\n // be undefined at runtime. For audio elements, this will always return\n // true.\n const video = /** @type {HTMLVideoElement} */(this.video_);\n return video.videoHeight == 0;\n } else {\n return false;\n }\n }\n\n /**\n * Get the range of time (in seconds) that seeking is allowed. If the player\n * has not loaded content and the manifest is HLS, this will return a range\n * from 0 to 0.\n *\n * @return {{start: number, end: number}}\n * @export\n */\n seekRange() {\n if (this.manifest_ && !this.isRemotePlayback()) {\n // With HLS lazy-loading, there were some situations where the manifest\n // had partially loaded, enough to move onto further load stages, but no\n // segments had been loaded, so the timeline is still unknown.\n // See: https://github.com/shaka-project/shaka-player/pull/4590\n if (!this.fullyLoaded_ &&\n this.manifest_.type == shaka.media.ManifestParser.HLS) {\n return {'start': 0, 'end': 0};\n }\n const timeline = this.manifest_.presentationTimeline;\n\n return {\n 'start': timeline.getSeekRangeStart(),\n 'end': timeline.getSeekRangeEnd(),\n };\n }\n\n // If we have loaded content with src=, we ask the video element for its\n // seekable range. This covers both plain mp4s and native HLS playbacks.\n if (this.video_ && this.video_.src) {\n const seekable = this.video_.seekable;\n if (seekable && seekable.length) {\n const playRangeStart =\n this.config_ ? this.config_.playRangeStart : 0;\n const start = Math.max(seekable.start(0), playRangeStart);\n const playRangeEnd =\n this.config_ ? this.config_.playRangeEnd : Infinity;\n const end = Math.min(seekable.end(seekable.length - 1), playRangeEnd);\n return {\n 'start': start,\n 'end': end,\n };\n }\n }\n\n return {'start': 0, 'end': 0};\n }\n\n /**\n * Go to live in a live stream.\n *\n * @export\n */\n goToLive() {\n if (this.isLive()) {\n this.video_.currentTime = this.seekRange().end;\n } else {\n shaka.log.warning('goToLive is for live streams!');\n }\n }\n\n /**\n * Indicates if the player has fully loaded the stream.\n *\n * @return {boolean}\n * @export\n */\n isFullyLoaded() {\n return this.fullyLoaded_;\n }\n\n /**\n * Get the key system currently used by EME. If EME is not being used, this\n * will return an empty string. If the player has not loaded content, this\n * will return an empty string.\n *\n * @return {string}\n * @export\n */\n keySystem() {\n return shaka.drm.DrmUtils.keySystem(this.drmInfo());\n }\n\n /**\n * Get the drm info used to initialize EME. If EME is not being used, this\n * will return <code>null</code>. If the player is idle or has not initialized\n * EME yet, this will return <code>null</code>.\n *\n * @return {?shaka.extern.DrmInfo}\n * @export\n */\n drmInfo() {\n return this.drmEngine_ ? this.drmEngine_.getDrmInfo() : null;\n }\n\n\n /**\n * Get the drm engine.\n * This method should only be used for testing. Applications SHOULD NOT\n * use this in production.\n *\n * @return {?shaka.drm.DrmEngine}\n */\n getDrmEngine() {\n return this.drmEngine_;\n }\n\n\n /**\n * Get the next known expiration time for any EME session. If the session\n * never expires, this will return <code>Infinity</code>. If there are no EME\n * sessions, this will return <code>Infinity</code>. If the player has not\n * loaded content, this will return <code>Infinity</code>.\n *\n * @return {number}\n * @export\n */\n getExpiration() {\n return this.drmEngine_ ? this.drmEngine_.getExpiration() : Infinity;\n }\n\n /**\n * Returns the active sessions metadata\n *\n * @return {!Array<shaka.extern.DrmSessionMetadata>}\n * @export\n */\n getActiveSessionsMetadata() {\n return this.drmEngine_ ? this.drmEngine_.getActiveSessionsMetadata() : [];\n }\n\n /**\n * Gets a map of EME key ID to the current key status.\n *\n * @return {!Object<string, string>}\n * @export\n */\n getKeyStatuses() {\n return this.drmEngine_ ? this.drmEngine_.getKeyStatuses() : {};\n }\n\n /**\n * Check if the player is currently in a buffering state (has too little\n * content to play smoothly). If the player has not loaded content, this will\n * return <code>false</code>.\n *\n * @return {boolean}\n * @export\n */\n isBuffering() {\n const State = shaka.media.BufferingObserver.State;\n return this.bufferObserver_ ?\n this.bufferObserver_.getState() == State.STARVING :\n false;\n }\n\n /**\n * Get the playback rate of what is playing right now. If we are using trick\n * play, this will return the trick play rate.\n * If no content is playing, this will return 0.\n * If content is buffering, this will return the expected playback rate once\n * the video starts playing.\n *\n * <p>\n * If the player has not loaded content, this will return a playback rate of\n * 0.\n *\n * @return {number}\n * @export\n */\n getPlaybackRate() {\n if (!this.video_) {\n return 0;\n }\n return this.playRateController_ ?\n this.playRateController_.getRealRate() :\n 1;\n }\n\n /**\n * Enable trick play to skip through content without playing by repeatedly\n * seeking. For example, a rate of 2.5 would result in 2.5 seconds of content\n * being skipped every second. A negative rate will result in moving\n * backwards.\n *\n * <p>\n * If the player has not loaded content or is still loading content this will\n * be a no-op. Wait until <code>load</code> has completed before calling.\n *\n * <p>\n * Trick play will be canceled automatically if the playhead hits the\n * beginning or end of the seekable range for the content.\n *\n * @param {number} rate\n * @param {boolean=} useTrickPlayTrack\n * @export\n */\n trickPlay(rate, useTrickPlayTrack = true) {\n // A playbackRate of 0 is used internally when we are in a buffering state,\n // and doesn't make sense for trick play. If you set a rate of 0 for trick\n // play, we will reject it and issue a warning. If it happens during a\n // test, we will fail the test through this assertion.\n goog.asserts.assert(rate != 0, 'Should never set a trick play rate of 0!');\n if (rate == 0) {\n shaka.log.alwaysWarn('A trick play rate of 0 is unsupported!');\n return;\n }\n\n this.playRateController_.set(rate);\n\n if (this.loadMode_ == shaka.Player.LoadMode.MEDIA_SOURCE) {\n this.abrManager_.playbackRateChanged(rate);\n this.streamingEngine_.setTrickPlay(\n useTrickPlayTrack && Math.abs(rate) > 1);\n }\n this.setupTrickPlayEventListeners_(rate);\n }\n\n /**\n * Cancel trick-play. If the player has not loaded content or is still loading\n * content this will be a no-op.\n *\n * @export\n */\n cancelTrickPlay() {\n const defaultPlaybackRate = this.playRateController_.getDefaultRate();\n if (this.loadMode_ == shaka.Player.LoadMode.SRC_EQUALS) {\n this.playRateController_.set(defaultPlaybackRate);\n }\n\n if (this.loadMode_ == shaka.Player.LoadMode.MEDIA_SOURCE) {\n this.playRateController_.set(defaultPlaybackRate);\n this.abrManager_.playbackRateChanged(defaultPlaybackRate);\n this.streamingEngine_.setTrickPlay(false);\n }\n this.trickPlayEventManager_.removeAll();\n }\n\n /**\n * Return a list of variant tracks that can be switched to.\n *\n * <p>\n * If the player has not loaded content, this will return an empty list.\n *\n * @return {!Array<shaka.extern.Track>}\n * @export\n */\n getVariantTracks() {\n if (this.manifest_ && !this.isRemotePlayback()) {\n const currentVariant = this.streamingEngine_ ?\n this.streamingEngine_.getCurrentVariant() : null;\n\n const tracks = [];\n\n let activeTracks = 0;\n\n // Convert each variant to a track.\n for (const variant of this.manifest_.variants) {\n if (!shaka.util.StreamUtils.isPlayable(variant)) {\n continue;\n }\n\n const track = shaka.util.StreamUtils.variantToTrack(variant);\n track.active = variant == currentVariant;\n if (!track.active && activeTracks != 1 && currentVariant != null &&\n variant.video == currentVariant.video &&\n variant.audio == currentVariant.audio) {\n track.active = true;\n }\n\n if (track.active) {\n activeTracks++;\n }\n\n tracks.push(track);\n }\n\n goog.asserts.assert(activeTracks <= 1,\n 'It should only have one active track');\n\n return tracks;\n } else if (this.video_ && this.video_.audioTracks) {\n // Safari's native HLS always shows a single element in videoTracks.\n // You can't use that API to change resolutions. But we can use\n // audioTracks to generate a variant list that is usable for changing\n // languages.\n const audioTracks = Array.from(this.video_.audioTracks);\n return audioTracks.map((audio) =>\n shaka.util.StreamUtils.html5AudioTrackToTrack(audio));\n } else {\n return [];\n }\n }\n\n /**\n * Return a list of text tracks that can be switched to.\n *\n * <p>\n * If the player has not loaded content, this will return an empty list.\n *\n * @return {!Array<shaka.extern.Track>}\n * @export\n */\n getTextTracks() {\n if (this.manifest_ && !this.isRemotePlayback()) {\n const currentTextStream = this.streamingEngine_ ?\n this.streamingEngine_.getCurrentTextStream() : null;\n const tracks = [];\n\n // Convert all selectable text streams to tracks.\n for (const text of this.manifest_.textStreams) {\n const track = shaka.util.StreamUtils.textStreamToTrack(text);\n track.active = text == currentTextStream;\n\n tracks.push(track);\n }\n\n return tracks;\n } else if (this.video_ && this.video_.src && this.video_.textTracks) {\n const textTracks = this.getFilteredTextTracks_();\n const StreamUtils = shaka.util.StreamUtils;\n return textTracks.map((text) => StreamUtils.html5TextTrackToTrack(text));\n } else {\n return [];\n }\n }\n\n /**\n * Return a list of image tracks that can be switched to.\n *\n * If the player has not loaded content, this will return an empty list.\n *\n * @return {!Array<shaka.extern.Track>}\n * @export\n */\n getImageTracks() {\n const StreamUtils = shaka.util.StreamUtils;\n let imageStreams = this.externalSrcEqualsThumbnailsStreams_;\n if (this.manifest_) {\n imageStreams = this.manifest_.imageStreams;\n }\n return imageStreams.map((image) => StreamUtils.imageStreamToTrack(image));\n }\n\n /**\n * Returns Thumbnail objects for each thumbnail.\n *\n * If the player has not loaded content, this will return a null.\n *\n * @param {?number=} trackId\n * @return {!Promise<?Array<!shaka.extern.Thumbnail>>}\n * @export\n */\n async getAllThumbnails(trackId) {\n const imageStream = await this.getBestImageStream_(trackId);\n if (!imageStream) {\n return null;\n }\n const thumbnails = [];\n imageStream.segmentIndex.forEachTopLevelReference((reference) => {\n const dimensions = this.parseTilesLayout_(\n reference.getTilesLayout() || imageStream.tilesLayout);\n if (dimensions) {\n const numThumbnails = dimensions.rows * dimensions.columns;\n const duration = reference.trueEndTime - reference.startTime;\n for (let i = 0; i < numThumbnails; i++) {\n const sampleTime = reference.startTime + duration * i / numThumbnails;\n const thumbnail =\n this.getThumbnailsByStream_(\n /** @type {shaka.extern.Stream} */ (imageStream), sampleTime);\n if (thumbnail) {\n thumbnails.push(thumbnail);\n }\n }\n }\n });\n if (imageStream.closeSegmentIndex) {\n imageStream.closeSegmentIndex();\n }\n return thumbnails;\n }\n\n /**\n * Parses a tiles layout.\n *\n * @param {string|undefined} tilesLayout\n * @return {?{\n * columns: number,\n * rows: number\n * }}\n * @private\n */\n parseTilesLayout_(tilesLayout) {\n if (!tilesLayout) {\n return null;\n }\n // This expression is used to detect one or more numbers (0-9) followed\n // by an x and after one or more numbers (0-9)\n const match = /(\\d+)x(\\d+)/.exec(tilesLayout);\n if (!match) {\n shaka.log.warning('Tiles layout does not contain a valid format ' +\n ' (columns x rows)');\n return null;\n }\n const columns = parseInt(match[1], 10);\n const rows = parseInt(match[2], 10);\n return {columns, rows};\n }\n\n /**\n * Return a Thumbnail object from a time.\n *\n * If the player has not loaded content, this will return a null.\n *\n * @param {?number} trackId\n * @param {number} time\n * @return {!Promise<?shaka.extern.Thumbnail>}\n * @export\n */\n async getThumbnails(trackId, time) {\n const imageStream = await this.getBestImageStream_(trackId);\n if (!imageStream) {\n return null;\n }\n return this.getThumbnailsByStream_(imageStream, time);\n }\n\n /**\n * Return a the best image stream from an optional trackId.\n *\n * If the player has not loaded content, this will return a null.\n *\n * @param {?number=} trackId\n * @return {!Promise<?shaka.extern.Stream>}\n * @private\n */\n async getBestImageStream_(trackId) {\n if (this.loadMode_ != shaka.Player.LoadMode.MEDIA_SOURCE &&\n this.loadMode_ != shaka.Player.LoadMode.SRC_EQUALS) {\n return null;\n }\n let imageStreams = this.externalSrcEqualsThumbnailsStreams_;\n if (this.manifest_) {\n imageStreams = this.manifest_.imageStreams;\n }\n let imageStream = imageStreams[0];\n if (!imageStream) {\n return null;\n }\n if (trackId != null) {\n imageStream = imageStreams.find(\n (stream) => stream.id == trackId);\n }\n if (!imageStream) {\n return null;\n }\n if (!imageStream.segmentIndex) {\n await imageStream.createSegmentIndex();\n }\n return imageStream;\n }\n\n /**\n * Return a Thumbnail object from a image stream and time.\n *\n * @param {shaka.extern.Stream} imageStream\n * @param {number} time\n * @return {?shaka.extern.Thumbnail}\n * @private\n */\n getThumbnailsByStream_(imageStream, time) {\n const referencePosition = imageStream.segmentIndex.find(time);\n if (referencePosition == null) {\n return null;\n }\n const reference = imageStream.segmentIndex.get(referencePosition);\n const dimensions = this.parseTilesLayout_(\n reference.getTilesLayout() || imageStream.tilesLayout);\n if (!dimensions) {\n return null;\n }\n const fullImageWidth = imageStream.width || 0;\n const fullImageHeight = imageStream.height || 0;\n let width = fullImageWidth / dimensions.columns;\n let height = fullImageHeight / dimensions.rows;\n const totalImages = dimensions.columns * dimensions.rows;\n const segmentDuration = reference.trueEndTime - reference.startTime;\n const thumbnailDuration =\n reference.getTileDuration() || (segmentDuration / totalImages);\n let thumbnailTime = reference.startTime;\n let positionX = 0;\n let positionY = 0;\n // If the number of images in the segment is greater than 1, we have to\n // find the correct image. For that we will return to the app the\n // coordinates of the position of the correct image.\n // Image search is always from left to right and top to bottom.\n // Note: The time between images within the segment is always\n // equidistant.\n //\n // Eg: Total images 5, tileLayout 5x1, segmentDuration 5, thumbnailTime 2\n // positionX = 0.4 * fullImageWidth\n // positionY = 0\n if (totalImages > 1) {\n const thumbnailPosition =\n Math.floor((time - reference.startTime) / thumbnailDuration);\n thumbnailTime = reference.startTime +\n (thumbnailPosition * thumbnailDuration);\n positionX = (thumbnailPosition % dimensions.columns) * width;\n positionY = Math.floor(thumbnailPosition / dimensions.columns) * height;\n }\n let sprite = false;\n const thumbnailSprite = reference.getThumbnailSprite();\n if (thumbnailSprite) {\n sprite = true;\n height = thumbnailSprite.height;\n positionX = thumbnailSprite.positionX;\n positionY = thumbnailSprite.positionY;\n width = thumbnailSprite.width;\n }\n return {\n segment: reference,\n imageHeight: fullImageHeight,\n imageWidth: fullImageWidth,\n height: height,\n positionX: positionX,\n positionY: positionY,\n startTime: thumbnailTime,\n duration: thumbnailDuration,\n uris: reference.getUris(),\n width: width,\n sprite: sprite,\n mimeType: reference.mimeType || imageStream.mimeType,\n codecs: reference.codecs || imageStream.codecs,\n };\n }\n\n /**\n * Select a specific text track. <code>track</code> should come from a call to\n * <code>getTextTracks</code>. If the track is not found, this will be a\n * no-op. If the player has not loaded content, this will be a no-op.\n *\n * <p>\n * Note that <code>AdaptationEvents</code> are not fired for manual track\n * selections.\n *\n * @param {shaka.extern.Track} track\n * @export\n */\n selectTextTrack(track) {\n const selectMediaSourceMode = () => {\n const stream = this.manifest_.textStreams.find(\n (stream) => stream.id == track.id);\n\n if (!stream) {\n if (!this.isRemotePlayback()) {\n shaka.log.error('No stream with id', track.id);\n }\n return;\n }\n\n if (stream == this.streamingEngine_.getCurrentTextStream()) {\n shaka.log.debug('Text track already selected.');\n return;\n }\n\n // Add entries to the history.\n this.addTextStreamToSwitchHistory_(stream, /* fromAdaptation= */ false);\n this.streamingEngine_.switchTextStream(stream);\n this.onTextChanged_();\n this.setTextDisplayerLanguage_();\n\n // Workaround for\n // https://github.com/shaka-project/shaka-player/issues/1299\n // When track is selected, back-propagate the language to\n // currentTextLanguage_.\n this.currentTextLanguage_ = stream.language;\n };\n const selectSrcEqualsMode = () => {\n if (this.video_ && this.video_.textTracks) {\n const textTracks = this.getFilteredTextTracks_();\n const oldTrack = textTracks.find((textTrack) =>\n textTrack.mode !== 'disabled');\n const newTrack = textTracks.find((textTrack) =>\n shaka.util.StreamUtils.html5TrackId(textTrack) === track.id);\n if (!newTrack) {\n shaka.log.error('No track with id', track.id);\n return;\n }\n if (oldTrack !== newTrack) {\n if (oldTrack) {\n oldTrack.mode = 'disabled';\n this.loadEventManager_.unlisten(oldTrack, 'cuechange');\n this.textDisplayer_.remove(0, Infinity);\n }\n if (newTrack) {\n this.enableNativeTrack_(newTrack);\n }\n }\n this.onTextChanged_();\n this.setTextDisplayerLanguage_();\n }\n };\n if (this.manifest_ && this.playhead_) {\n selectMediaSourceMode();\n // When using MSE + remote we need to set tracks for both MSE and native\n // apis so that synchronization is maintained.\n if (!this.isRemotePlayback()) {\n return;\n }\n }\n selectSrcEqualsMode();\n }\n\n /**\n * @param {!TextTrack} track\n * @private\n */\n enableNativeTrack_(track) {\n this.loadEventManager_.listen(track, 'cuechange', () => {\n // Always remove cues from the past to avoid memory grow.\n const removeEnd = Math.max(0,\n this.video_.currentTime - this.config_.streaming.bufferBehind);\n this.textDisplayer_.remove(0, removeEnd);\n const time = {\n periodStart: 0,\n segmentStart: 0,\n segmentEnd: this.video_.duration,\n vttOffset: 0,\n };\n /** @type {!Array<shaka.text.Cue>} */\n const allCues = [];\n const nativeCues = Array.from(track.activeCues || []);\n for (const nativeCue of nativeCues) {\n const cue = shaka.text.Utils.mapNativeCueToShakaCue(nativeCue);\n if (cue) {\n const modifyCueCallback = this.config_.mediaSource.modifyCueCallback;\n // Closure compiler removes the call to modifyCueCallback for reasons\n // unknown to us.\n // See https://github.com/shaka-project/shaka-player/pull/8261\n // We'll want to revisit this condition once we migrated to TS.\n // See https://github.com/shaka-project/shaka-player/issues/8262 for TS.\n if (modifyCueCallback) {\n modifyCueCallback(cue, null, time);\n }\n allCues.push(cue);\n }\n }\n this.textDisplayer_.append(allCues);\n });\n track.mode = document.pictureInPictureElement ? 'showing' : 'hidden';\n }\n\n /**\n * Select a specific variant track to play. <code>track</code> should come\n * from a call to <code>getVariantTracks</code>. If <code>track</code> cannot\n * be found, this will be a no-op. If the player has not loaded content, this\n * will be a no-op.\n *\n * <p>\n * Changing variants will take effect once the currently buffered content has\n * been played. To force the change to happen sooner, use\n * <code>clearBuffer</code> with <code>safeMargin</code>. Setting\n * <code>clearBuffer</code> to <code>true</code> will clear all buffered\n * content after <code>safeMargin</code>, allowing the new variant to start\n * playing sooner.\n *\n * <p>\n * Note that <code>AdaptationEvents</code> are not fired for manual track\n * selections.\n *\n * @param {shaka.extern.Track} track\n * @param {boolean=} clearBuffer\n * @param {number=} safeMargin Optional amount of buffer (in seconds) to\n * retain when clearing the buffer. Useful for switching variant quickly\n * without causing a buffering event. Defaults to 0 if not provided. Ignored\n * if clearBuffer is false. Can cause hiccups on some browsers if chosen too\n * small, e.g. The amount of two segments is a fair minimum to consider as\n * safeMargin value.\n * @export\n */\n selectVariantTrack(track, clearBuffer = false, safeMargin = 0) {\n const selectMediaSourceMode = () => {\n const variant = this.manifest_.variants.find(\n (variant) => variant.id == track.id);\n if (!variant) {\n if (!this.isRemotePlayback()) {\n shaka.log.error('No variant with id', track.id);\n }\n return;\n }\n\n // Double check that the track is allowed to be played. The track list\n // should only contain playable variants, but if restrictions change and\n // |selectVariantTrack| is called before the track list is updated, we\n // could get a now-restricted variant.\n if (!shaka.util.StreamUtils.isPlayable(variant)) {\n shaka.log.error('Unable to switch to restricted track', track.id);\n return;\n }\n\n const active = this.streamingEngine_.getCurrentVariant();\n if (this.config_.abr.enabled && (active.video != variant.video ||\n (active.audio && variant.audio &&\n active.audio.language == variant.audio.language &&\n active.audio.channelsCount == variant.audio.channelsCount &&\n active.audio.label == variant.audio.label))) {\n shaka.log.alwaysWarn('Changing tracks while abr manager is enabled ' +\n 'will likely result in the selected track ' +\n 'being overridden. Consider disabling abr ' +\n 'before calling selectVariantTrack().');\n }\n\n if (this.isRemotePlayback()) {\n this.switchVariant_(\n variant, /* fromAdaptation= */ false,\n /* clearBuffer= */ false, /* safeMargin= */ 0);\n } else {\n this.switchVariant_(\n variant, /* fromAdaptation= */ false,\n clearBuffer || false, safeMargin || 0);\n }\n\n // Workaround for\n // https://github.com/shaka-project/shaka-player/issues/1299\n // When track is selected, back-propagate the language to\n // currentAudioLanguage_.\n this.currentAdaptationSetCriteria_.configure({\n language: variant.language,\n role: (variant.audio && variant.audio.roles &&\n variant.audio.roles[0]) || '',\n channelCount: variant.audio && variant.audio.channelsCount ?\n variant.audio.channelsCount : 0,\n hdrLevel: variant.video && variant.video.hdr ? variant.video.hdr : '',\n spatialAudio: variant.audio && variant.audio.spatialAudio ?\n variant.audio.spatialAudio : false,\n videoLayout: variant.video && variant.video.videoLayout ?\n variant.video.videoLayout : '',\n audioLabel: variant.audio && variant.audio.label ?\n variant.audio.label : '',\n videoLabel: '',\n codecSwitchingStrategy: this.config_.mediaSource.codecSwitchingStrategy,\n audioCodec: variant.audio && variant.audio.codecs ?\n variant.audio.codecs : '',\n });\n\n // Update AbrManager variants to match these new settings.\n this.updateAbrManagerVariants_();\n };\n const selectSrcEqualsMode = () => {\n if (this.video_ && this.video_.audioTracks) {\n // Safari's native HLS won't let you choose an explicit variant, though\n // you can choose audio languages this way.\n const audioTracks = Array.from(this.video_.audioTracks);\n for (const audioTrack of audioTracks) {\n if (shaka.util.StreamUtils.html5TrackId(audioTrack) == track.id) {\n // This will reset the \"enabled\" of other tracks to false.\n this.switchHtml5Track_(audioTrack);\n return;\n }\n }\n }\n };\n if (this.manifest_ && this.playhead_) {\n selectMediaSourceMode();\n // When using MSE + remote we need to set tracks for both MSE and native\n // apis so that synchronization is maintained.\n if (!this.isRemotePlayback()) {\n return;\n }\n }\n selectSrcEqualsMode();\n }\n\n /**\n * Select an audio track compatible with the current video track.\n * If the player has not loaded any content, this will be a no-op.\n *\n * @param {shaka.extern.AudioTrack} audioTrack\n * @param {number=} safeMargin Optional amount of buffer (in seconds) to\n * retain when clearing the buffer. Useful for switching quickly\n * without causing a buffering event. Defaults to 0 if not provided. Can\n * cause hiccups on some browsers if chosen too small, e.g. The amount of\n * two segments is a fair minimum to consider as safeMargin value.\n * @export\n */\n selectAudioTrack(audioTrack, safeMargin = 0) {\n const ArrayUtils = shaka.util.ArrayUtils;\n const variants = this.getVariantTracks();\n if (!variants.length) {\n return;\n }\n const active = variants.find((t) => t.active);\n if (!active) {\n return;\n }\n const validVariant = variants.find((t) => {\n return t.videoId === active.videoId &&\n t.language == audioTrack.language &&\n t.label == audioTrack.label &&\n t.audioMimeType == audioTrack.mimeType &&\n t.audioCodec == audioTrack.codecs &&\n t.primary == audioTrack.primary &&\n ArrayUtils.equal(t.audioRoles, audioTrack.roles) &&\n t.accessibilityPurpose == audioTrack.accessibilityPurpose &&\n t.channelsCount == audioTrack.channelsCount &&\n t.audioSamplingRate == audioTrack.audioSamplingRate &&\n t.spatialAudio == audioTrack.spatialAudio;\n });\n if (validVariant && !validVariant.active) {\n this.selectVariantTrack(validVariant,\n /* clearBuffer= */ true, safeMargin);\n }\n }\n\n\n /**\n * Return a list of audio tracks compatible with the current video track.\n *\n * @return {!Array<shaka.extern.AudioTrack>}\n * @export\n */\n getAudioTracks() {\n const variants = this.getVariantTracks();\n if (!variants.length) {\n return [];\n }\n const active = variants.find((t) => t.active);\n if (!active) {\n return [];\n }\n let filteredTracks = variants;\n if (this.loadMode_ == shaka.Player.LoadMode.MEDIA_SOURCE) {\n // Filter by current videoId and has audio.\n filteredTracks = variants.filter((t) => {\n return t.originalVideoId === active.originalVideoId && t.audioCodec;\n });\n }\n if (!filteredTracks.length) {\n return [];\n }\n\n /** @type {!Set<shaka.extern.AudioTrack>} */\n const audioTracksSet = new Set();\n for (const track of filteredTracks) {\n /** @type {shaka.extern.AudioTrack} */\n const audioTrack = {\n active: track.active,\n language: track.language,\n label: track.label,\n mimeType: track.audioMimeType,\n codecs: track.audioCodec,\n primary: track.primary,\n roles: track.audioRoles || [],\n accessibilityPurpose: track.accessibilityPurpose,\n channelsCount: track.channelsCount,\n audioSamplingRate: track.audioSamplingRate,\n spatialAudio: track.spatialAudio,\n originalLanguage: track.originalLanguage,\n };\n audioTracksSet.add(audioTrack);\n }\n if (!audioTracksSet.size) {\n return [];\n }\n return Array.from(audioTracksSet);\n }\n\n /**\n * Return a list of audio language-role combinations available. If the\n * player has not loaded any content, this will return an empty list.\n *\n * <br>\n *\n * This API is deprecated and will be removed in version 5.0, please migrate\n * to using `getAudioTracks` and `selectAudioTrack`.\n *\n * @return {!Array<shaka.extern.LanguageRole>}\n * @deprecated\n * @export\n */\n getAudioLanguagesAndRoles() {\n return shaka.Player.getLanguageAndRolesFrom_(this.getVariantTracks());\n }\n\n /**\n * Return a list of text language-role combinations available. If the player\n * has not loaded any content, this will be return an empty list.\n *\n * @return {!Array<shaka.extern.LanguageRole>}\n * @export\n */\n getTextLanguagesAndRoles() {\n return shaka.Player.getLanguageAndRolesFrom_(this.getTextTracks());\n }\n\n /**\n * Return a list of audio languages available. If the player has not loaded\n * any content, this will return an empty list.\n *\n * <br>\n *\n * This API is deprecated and will be removed in version 5.0, please migrate\n * to using `getAudioTracks` and `selectAudioTrack`.\n *\n * @return {!Array<string>}\n * @deprecated\n * @export\n */\n getAudioLanguages() {\n return Array.from(shaka.Player.getLanguagesFrom_(this.getVariantTracks()));\n }\n\n /**\n * Return a list of text languages available. If the player has not loaded\n * any content, this will return an empty list.\n *\n * @return {!Array<string>}\n * @export\n */\n getTextLanguages() {\n return Array.from(shaka.Player.getLanguagesFrom_(this.getTextTracks()));\n }\n\n /**\n * Sets the current audio language and current variant role to the selected\n * language, role and channel count, and chooses a new variant if need be.\n * If the player has not loaded any content, this will be a no-op.\n *\n * <br>\n *\n * This API is deprecated and will be removed in version 5.0, please migrate\n * to using `getAudioTracks` and `selectAudioTrack`.\n *\n * @param {string} language\n * @param {string=} role\n * @param {number=} channelsCount\n * @param {number=} safeMargin\n * @param {string=} codec\n * @param {boolean=} spatialAudio\n * @param {string=} label\n * @deprecated\n * @export\n */\n selectAudioLanguage(language, role, channelsCount = 0, safeMargin = 0,\n codec = '', spatialAudio = false, label = '') {\n const selectMediaSourceMode = () => {\n this.currentAdaptationSetCriteria_ =\n this.config_.adaptationSetCriteriaFactory();\n this.currentAdaptationSetCriteria_.configure({\n language,\n role: role || '',\n channelCount: channelsCount || 0,\n hdrLevel: '',\n spatialAudio: spatialAudio || false,\n videoLayout: '',\n audioLabel: label || '',\n videoLabel: '',\n codecSwitchingStrategy:\n this.config_.mediaSource.codecSwitchingStrategy,\n audioCodec: codec || '',\n });\n\n const diff = (a, b) => {\n if (!a.video && !b.video) {\n return 0;\n } else if (!a.video || !b.video) {\n return Infinity;\n } else {\n return Math.abs((a.video.height || 0) - (b.video.height || 0)) +\n Math.abs((a.video.width || 0) - (b.video.width || 0));\n }\n };\n // Find the variant whose size is closest to the active variant. This\n // ensures we stay at about the same resolution when just changing the\n // language/role.\n const active = this.streamingEngine_.getCurrentVariant();\n const set =\n this.currentAdaptationSetCriteria_.create(this.manifest_.variants);\n let bestVariant = null;\n for (const curVariant of set.values()) {\n if (!shaka.util.StreamUtils.isPlayable(curVariant)) {\n continue;\n }\n if (!bestVariant ||\n diff(bestVariant, active) > diff(curVariant, active)) {\n bestVariant = curVariant;\n }\n }\n if (bestVariant == active) {\n shaka.log.debug('Audio already selected.');\n return;\n }\n if (bestVariant) {\n const track = shaka.util.StreamUtils.variantToTrack(bestVariant);\n this.selectVariantTrack(\n track, /* clearBuffer= */ true, safeMargin || 0);\n return;\n }\n\n // If we haven't switched yet, just use ABR to find a new track.\n this.chooseVariantAndSwitch_();\n };\n const selectSrcEqualsMode = () => {\n if (this.video_ && this.video_.audioTracks) {\n const track = shaka.util.StreamUtils.filterStreamsByLanguageAndRole(\n this.getVariantTracks(), language, role || '', false)[0];\n if (track) {\n this.selectVariantTrack(track);\n }\n }\n };\n if (this.manifest_ && this.playhead_) {\n selectMediaSourceMode();\n // When using MSE + remote we need to set tracks for both MSE and native\n // apis so that synchronization is maintained.\n if (!this.isRemotePlayback()) {\n return;\n }\n }\n selectSrcEqualsMode();\n }\n\n /**\n * Sets the current text language and current text role to the selected\n * language and role, and chooses a new variant if need be. If the player has\n * not loaded any content, this will be a no-op.\n *\n * @param {string} language\n * @param {string=} role\n * @param {boolean=} forced\n * @export\n */\n selectTextLanguage(language, role, forced = false) {\n const selectMediaSourceMode = () => {\n this.currentTextLanguage_ = language;\n this.currentTextRole_ = role || '';\n this.currentTextForced_ = forced || false;\n\n const chosenText = this.chooseTextStream_();\n if (chosenText) {\n if (chosenText == this.streamingEngine_.getCurrentTextStream()) {\n shaka.log.debug('Text track already selected.');\n return;\n }\n\n this.addTextStreamToSwitchHistory_(\n chosenText, /* fromAdaptation= */ false);\n if (this.shouldStreamText_()) {\n this.streamingEngine_.switchTextStream(chosenText);\n this.onTextChanged_();\n this.setTextDisplayerLanguage_();\n }\n }\n };\n const selectSrcEqualsMode = () => {\n const track = shaka.util.StreamUtils.filterStreamsByLanguageAndRole(\n this.getTextTracks(), language, role || '', forced || false)[0];\n if (track) {\n this.selectTextTrack(track);\n }\n };\n if (this.manifest_ && this.playhead_) {\n selectMediaSourceMode();\n // When using MSE + remote we need to set tracks for both MSE and native\n // apis so that synchronization is maintained.\n if (!this.isRemotePlayback()) {\n return;\n }\n }\n selectSrcEqualsMode();\n }\n\n /**\n * Select variant tracks that have a given label. This assumes the\n * label uniquely identifies an audio stream, so all the variants\n * are expected to have the same variant.audio.\n *\n * This API is deprecated and will be removed in version 5.0, please migrate\n * to using `getAudioTracks` and `selectAudioTrack`.\n *\n * @param {string} label\n * @param {boolean=} clearBuffer Optional clear buffer or not when\n * switch to new variant\n * Defaults to true if not provided\n * @param {number=} safeMargin Optional amount of buffer (in seconds) to\n * retain when clearing the buffer.\n * Defaults to 0 if not provided. Ignored if clearBuffer is false.\n * @deprecated\n * @export\n */\n selectVariantsByLabel(label, clearBuffer = true, safeMargin = 0) {\n const selectMediaSourceMode = () => {\n let firstVariantWithLabel = null;\n for (const variant of this.manifest_.variants) {\n if (variant.audio.label == label) {\n firstVariantWithLabel = variant;\n break;\n }\n }\n\n if (firstVariantWithLabel == null) {\n shaka.log.warning('No variants were found with label: ' +\n label + '. Ignoring the request to switch.');\n\n return;\n }\n\n // Label is a unique identifier of a variant's audio stream.\n // Because of that we assume that all the variants with the same\n // label have the same language.\n this.currentAdaptationSetCriteria_ =\n this.config_.adaptationSetCriteriaFactory();\n this.currentAdaptationSetCriteria_.configure({\n language: firstVariantWithLabel.language,\n role: '',\n channelCount: 0,\n hdrLevel: '',\n spatialAudio: false,\n videoLayout: '',\n videoLabel: '',\n audioLabel: label,\n codecSwitchingStrategy:\n this.config_.mediaSource.codecSwitchingStrategy,\n audioCodec: '',\n });\n\n this.chooseVariantAndSwitch_(clearBuffer, safeMargin);\n };\n const selectSrcEqualsMode = () => {\n if (this.video_ && this.video_.audioTracks) {\n const audioTracks = Array.from(this.video_.audioTracks);\n\n let trackMatch = null;\n\n for (const audioTrack of audioTracks) {\n if (audioTrack.label == label) {\n trackMatch = audioTrack;\n }\n }\n if (trackMatch) {\n this.switchHtml5Track_(trackMatch);\n }\n }\n };\n if (this.manifest_ && this.playhead_) {\n selectMediaSourceMode();\n // When using MSE + remote we need to set tracks for both MSE and native\n // apis so that synchronization is maintained.\n if (!this.isRemotePlayback()) {\n return;\n }\n }\n selectSrcEqualsMode();\n }\n\n /**\n * Check if the text displayer is enabled.\n *\n * @return {boolean}\n * @export\n */\n isTextTrackVisible() {\n const expected = this.isTextVisible_;\n if (this.textDisplayer_) {\n const actual = this.textDisplayer_.isTextVisible();\n goog.asserts.assert(\n actual == expected, 'text visibility has fallen out of sync');\n\n // Always return the actual value so that the app has the most accurate\n // information (in the case that the values come out of sync in prod).\n return actual;\n }\n\n return expected;\n }\n\n /**\n * Return a list of chapters tracks.\n *\n * @return {!Array<shaka.extern.Track>}\n * @export\n */\n getChaptersTracks() {\n if (this.video_ && this.video_.currentSrc && this.video_.textTracks) {\n const textTracks = this.getChaptersTracks_();\n const StreamUtils = shaka.util.StreamUtils;\n return textTracks.map((text) => StreamUtils.html5TextTrackToTrack(text));\n } else {\n return [];\n }\n }\n\n /**\n * This returns the list of chapters.\n *\n * @param {string} language\n * @return {!Array<shaka.extern.Chapter>}\n * @export\n */\n getChapters(language) {\n if (!this.video_ || !this.video_.currentSrc || !this.video_.textTracks) {\n return [];\n }\n const LanguageUtils = shaka.util.LanguageUtils;\n const inputLanguage = LanguageUtils.normalize(language);\n const chaptersTracks = this.getChaptersTracks_();\n const chaptersTracksWithLanguage = chaptersTracks\n .filter((t) => LanguageUtils.normalize(t.language) == inputLanguage);\n if (!chaptersTracksWithLanguage || !chaptersTracksWithLanguage.length) {\n return [];\n }\n const chapters = [];\n const uniqueChapters = new Set();\n for (const chaptersTrack of chaptersTracksWithLanguage) {\n if (chaptersTrack && chaptersTrack.cues) {\n for (const cue of chaptersTrack.cues) {\n let id = cue.id;\n if (!id || id == '') {\n id = cue.startTime + '-' + cue.endTime + '-' + cue.text;\n }\n /** @type {shaka.extern.Chapter} */\n const chapter = {\n id: id,\n title: cue.text,\n startTime: cue.startTime,\n endTime: cue.endTime,\n };\n if (!uniqueChapters.has(id)) {\n chapters.push(chapter);\n uniqueChapters.add(id);\n }\n }\n }\n }\n return chapters;\n }\n\n /**\n * Ignore the TextTracks with the 'metadata' or 'chapters' kind, or the one\n * generated by the SimpleTextDisplayer.\n *\n * @return {!Array<TextTrack>}\n * @private\n */\n getFilteredTextTracks_() {\n goog.asserts.assert(this.video_.textTracks,\n 'TextTracks should be valid.');\n return Array.from(this.video_.textTracks)\n .filter((t) => t.kind != 'metadata' && t.kind != 'chapters' &&\n t.label != shaka.Player.TextTrackLabel);\n }\n\n /**\n * Get the TextTracks with the 'metadata' kind.\n *\n * @return {!Array<TextTrack>}\n * @private\n */\n getMetadataTracks_() {\n goog.asserts.assert(this.video_.textTracks,\n 'TextTracks should be valid.');\n return Array.from(this.video_.textTracks)\n .filter((t) => t.kind == 'metadata');\n }\n\n /**\n * Get the TextTracks with the 'chapters' kind.\n *\n * @return {!Array<TextTrack>}\n * @private\n */\n getChaptersTracks_() {\n goog.asserts.assert(this.video_.textTracks,\n 'TextTracks should be valid.');\n return Array.from(this.video_.textTracks)\n .filter((t) => t.kind == 'chapters');\n }\n\n /**\n * Enable or disable the text displayer. If the player is in an unloaded\n * state, the request will be applied next time content is loaded.\n *\n * @param {boolean} isVisible\n * @export\n */\n setTextTrackVisibility(isVisible) {\n const oldVisibility = this.isTextVisible_;\n // Convert to boolean in case apps pass 0/1 instead false/true.\n const newVisibility = !!isVisible;\n\n if (oldVisibility == newVisibility) {\n return;\n }\n\n this.isTextVisible_ = newVisibility;\n\n // Hold of on setting the text visibility until we have all the components\n // we need. This ensures that they stay in-sync.\n if (this.loadMode_ == shaka.Player.LoadMode.MEDIA_SOURCE) {\n this.textDisplayer_.setTextVisibility(newVisibility);\n\n // When the user wants to see captions, we stream captions. When the user\n // doesn't want to see captions, we don't stream captions. This is to\n // avoid bandwidth consumption by an unused resource. The app developer\n // can override this and configure us to always stream captions.\n if (!this.config_.streaming.alwaysStreamText) {\n if (newVisibility) {\n if (this.streamingEngine_.getCurrentTextStream()) {\n // We already have a selected text stream.\n } else {\n // Find the text stream that best matches the user's preferences.\n const streams =\n shaka.util.StreamUtils.filterStreamsByLanguageAndRole(\n this.manifest_.textStreams,\n this.currentTextLanguage_,\n this.currentTextRole_,\n this.currentTextForced_);\n\n // It is possible that there are no streams to play.\n if (streams.length > 0) {\n this.streamingEngine_.switchTextStream(streams[0]);\n this.onTextChanged_();\n this.setTextDisplayerLanguage_();\n }\n }\n } else {\n this.streamingEngine_.unloadTextStream();\n }\n }\n } else if (this.video_ && this.video_.src && this.video_.textTracks) {\n this.textDisplayer_.setTextVisibility(newVisibility);\n }\n\n // We need to fire the event after we have updated everything so that\n // everything will be in a stable state when the app responds to the\n // event.\n this.onTextTrackVisibility_();\n }\n\n /**\n * Get the current playhead position as a date.\n *\n * @return {Date}\n * @export\n */\n getPlayheadTimeAsDate() {\n let presentationTime = 0;\n if (this.playhead_) {\n presentationTime = this.playhead_.getTime();\n } else if (this.startTime_ == null) {\n // A live stream with no requested start time and no playhead yet. We\n // would start at the live edge, but we don't have that yet, so return\n // the current date & time.\n return new Date();\n } else {\n // A specific start time has been requested. This is what Playhead will\n // use once it is created.\n presentationTime = this.startTime_;\n }\n\n if (this.manifest_ && !this.isRemotePlayback()) {\n const timeline = this.manifest_.presentationTimeline;\n const startTime = timeline.getInitialProgramDateTime() ||\n timeline.getPresentationStartTime();\n return new Date(/* ms= */ (startTime + presentationTime) * 1000);\n } else if (this.video_ && this.video_.getStartDate) {\n // Apple's native HLS gives us getStartDate(), which is only available if\n // EXT-X-PROGRAM-DATETIME is in the playlist.\n const startDate = this.video_.getStartDate();\n if (isNaN(startDate.getTime())) {\n shaka.log.warning(\n 'EXT-X-PROGRAM-DATETIME required to get playhead time as Date!');\n return null;\n }\n return new Date(startDate.getTime() + (presentationTime * 1000));\n } else {\n shaka.log.warning('No way to get playhead time as Date!');\n return null;\n }\n }\n\n /**\n * Get the presentation start time as a date.\n *\n * @return {Date}\n * @export\n */\n getPresentationStartTimeAsDate() {\n if (this.manifest_ && !this.isRemotePlayback()) {\n const timeline = this.manifest_.presentationTimeline;\n const startTime = timeline.getInitialProgramDateTime() ||\n timeline.getPresentationStartTime();\n goog.asserts.assert(startTime != null,\n 'Presentation start time should not be null!');\n return new Date(/* ms= */ startTime * 1000);\n } else if (this.video_ && this.video_.getStartDate) {\n // Apple's native HLS gives us getStartDate(), which is only available if\n // EXT-X-PROGRAM-DATETIME is in the playlist.\n const startDate = this.video_.getStartDate();\n if (isNaN(startDate.getTime())) {\n shaka.log.warning(\n 'EXT-X-PROGRAM-DATETIME required to get presentation start time ' +\n 'as Date!');\n return null;\n }\n return startDate;\n } else {\n shaka.log.warning('No way to get presentation start time as Date!');\n return null;\n }\n }\n\n /**\n * Get the presentation segment availability duration. This should only be\n * called when the player has loaded a live stream. If the player has not\n * loaded a live stream, this will return <code>null</code>.\n *\n * @return {?number}\n * @export\n */\n getSegmentAvailabilityDuration() {\n if (!this.isLive()) {\n shaka.log.warning('getSegmentAvailabilityDuration is for live streams!');\n return null;\n }\n\n if (this.manifest_) {\n const timeline = this.manifest_.presentationTimeline;\n return timeline.getSegmentAvailabilityDuration();\n } else {\n shaka.log.warning('No way to get segment segment availability duration!');\n return null;\n }\n }\n\n /**\n * Get information about what the player has buffered. If the player has not\n * loaded content or is currently loading content, the buffered content will\n * be empty.\n *\n * @return {shaka.extern.BufferedInfo}\n * @export\n */\n getBufferedInfo() {\n if (this.loadMode_ == shaka.Player.LoadMode.MEDIA_SOURCE) {\n return this.mediaSourceEngine_.getBufferedInfo();\n }\n\n const info = {\n total: [],\n audio: [],\n video: [],\n text: [],\n };\n\n if (this.loadMode_ == shaka.Player.LoadMode.SRC_EQUALS) {\n const TimeRangesUtils = shaka.media.TimeRangesUtils;\n info.total = TimeRangesUtils.getBufferedInfo(this.video_.buffered);\n }\n\n return info;\n }\n\n /**\n * Get latency in milliseconds between the live edge and what's currently\n * playing.\n *\n * @return {?number} The latency in milliseconds, or null if nothing\n * is playing.\n */\n getLiveLatency() {\n if (!this.video_ || !this.video_.currentTime) {\n return null;\n }\n const now = this.getPresentationStartTimeAsDate().getTime() +\n this.video_.currentTime * 1000;\n\n return Math.floor(Date.now() - now);\n }\n\n /**\n * Get statistics for the current playback session. If the player is not\n * playing content, this will return an empty stats object.\n *\n * @return {shaka.extern.Stats}\n * @export\n */\n getStats() {\n // If the Player is not in a fully-loaded state, then return an empty stats\n // blob so that this call will never fail.\n const loaded = this.loadMode_ == shaka.Player.LoadMode.MEDIA_SOURCE ||\n this.loadMode_ == shaka.Player.LoadMode.SRC_EQUALS;\n if (!loaded) {\n return shaka.util.Stats.getEmptyBlob();\n }\n\n this.updateStateHistory_();\n\n goog.asserts.assert(this.video_, 'If we have stats, we should have video_');\n const element = /** @type {!HTMLVideoElement} */ (this.video_);\n\n const completionRatio = element.currentTime / element.duration;\n if (!isNaN(completionRatio) && !this.isLive()) {\n this.stats_.setCompletionPercent(Math.round(100 * completionRatio));\n }\n\n if (this.playhead_) {\n this.stats_.setGapsJumped(this.playhead_.getGapsJumped());\n this.stats_.setStallsDetected(this.playhead_.getStallsDetected());\n }\n\n if (element.getVideoPlaybackQuality) {\n const info = element.getVideoPlaybackQuality();\n\n this.stats_.setDroppedFrames(\n Number(info.droppedVideoFrames),\n Number(info.totalVideoFrames));\n this.stats_.setCorruptedFrames(Number(info.corruptedVideoFrames));\n }\n\n const licenseSeconds =\n this.drmEngine_ ? this.drmEngine_.getLicenseTime() : NaN;\n this.stats_.setLicenseTime(licenseSeconds);\n\n if (this.loadMode_ == shaka.Player.LoadMode.MEDIA_SOURCE) {\n // Event through we are loaded, it is still possible that we don't have a\n // variant yet because we set the load mode before we select the first\n // variant to stream.\n const variant = this.streamingEngine_.getCurrentVariant();\n const textStream = this.streamingEngine_.getCurrentTextStream();\n\n if (variant) {\n const rate = this.playRateController_ ?\n this.playRateController_.getRealRate() : 1;\n const variantBandwidth = rate * variant.bandwidth;\n let currentStreamBandwidth = variantBandwidth;\n if (textStream && textStream.bandwidth) {\n currentStreamBandwidth += (rate * textStream.bandwidth);\n }\n this.stats_.setCurrentStreamBandwidth(currentStreamBandwidth);\n }\n\n if (variant && variant.video) {\n this.stats_.setResolution(\n /* width= */ variant.video.width || NaN,\n /* height= */ variant.video.height || NaN);\n }\n\n if (this.isLive()) {\n const latency = this.getLiveLatency() || 0;\n this.stats_.setLiveLatency(latency / 1000);\n }\n\n if (this.manifest_) {\n this.stats_.setManifestPeriodCount(this.manifest_.periodCount);\n this.stats_.setManifestGapCount(this.manifest_.gapCount);\n if (this.manifest_.presentationTimeline) {\n const maxSegmentDuration =\n this.manifest_.presentationTimeline.getMaxSegmentDuration();\n this.stats_.setMaxSegmentDuration(maxSegmentDuration);\n }\n }\n\n const estimate = this.abrManager_.getBandwidthEstimate();\n this.stats_.setBandwidthEstimate(estimate);\n }\n\n if (this.loadMode_ == shaka.Player.LoadMode.SRC_EQUALS) {\n this.stats_.addBytesDownloaded(NaN);\n this.stats_.setResolution(\n /* width= */ element.videoWidth || NaN,\n /* height= */ element.videoHeight || NaN);\n }\n\n return this.stats_.getBlob();\n }\n\n /**\n * Adds the given text track to the loaded manifest. <code>load()</code> must\n * resolve before calling. The presentation must have a duration.\n *\n * This returns the created track, which can immediately be selected by the\n * application. The track will not be automatically selected.\n *\n * @param {string} uri\n * @param {string} language\n * @param {string} kind\n * @param {string=} mimeType\n * @param {string=} codec\n * @param {string=} label\n * @param {boolean=} forced\n * @return {!Promise<shaka.extern.Track>}\n * @export\n */\n async addTextTrackAsync(uri, language, kind, mimeType, codec, label,\n forced = false) {\n if (this.loadMode_ != shaka.Player.LoadMode.MEDIA_SOURCE &&\n this.loadMode_ != shaka.Player.LoadMode.SRC_EQUALS) {\n shaka.log.error(\n 'Must call load() and wait for it to resolve before adding text ' +\n 'tracks.');\n throw new shaka.util.Error(\n shaka.util.Error.Severity.RECOVERABLE,\n shaka.util.Error.Category.PLAYER,\n shaka.util.Error.Code.CONTENT_NOT_LOADED);\n }\n\n if (kind != 'subtitles' && kind != 'captions') {\n shaka.log.alwaysWarn(\n 'Using a kind value different of `subtitles` or `captions` can ' +\n 'cause unwanted issues.');\n }\n\n if (!mimeType) {\n mimeType = await this.getTextMimetype_(uri);\n }\n\n let adCuePoints = [];\n if (this.adManager_) {\n adCuePoints = this.adManager_.getCuePoints();\n }\n\n if (this.loadMode_ == shaka.Player.LoadMode.SRC_EQUALS) {\n if (forced) {\n // See: https://github.com/whatwg/html/issues/4472\n kind = 'forced';\n }\n await this.addSrcTrackElement_(uri, language, kind, mimeType, label || '',\n adCuePoints);\n\n const LanguageUtils = shaka.util.LanguageUtils;\n const languageNormalized = LanguageUtils.normalize(language);\n\n const textTracks = this.getTextTracks();\n const srcTrack = textTracks.find((t) => {\n return LanguageUtils.normalize(t.language) == languageNormalized &&\n t.label == (label || '') &&\n t.kind == kind;\n });\n if (srcTrack) {\n this.onTracksChanged_();\n return srcTrack;\n }\n // This should not happen, but there are browser implementations that may\n // not support the Track element.\n shaka.log.error('Cannot add this text when loaded with src=');\n throw new shaka.util.Error(\n shaka.util.Error.Severity.RECOVERABLE,\n shaka.util.Error.Category.TEXT,\n shaka.util.Error.Code.CANNOT_ADD_EXTERNAL_TEXT_TO_SRC_EQUALS);\n }\n\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n\n const seekRange = this.seekRange();\n let duration = seekRange.end - seekRange.start;\n if (this.manifest_) {\n duration = this.manifest_.presentationTimeline.getDuration();\n }\n if (duration == Infinity) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.RECOVERABLE,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.CANNOT_ADD_EXTERNAL_TEXT_TO_LIVE_STREAM);\n }\n\n if (adCuePoints.length) {\n goog.asserts.assert(\n this.networkingEngine_, 'Need networking engine.');\n const data = await this.getTextData_(uri,\n this.networkingEngine_,\n this.config_.streaming.retryParameters);\n const vvtText = this.convertToWebVTT_(data, mimeType, adCuePoints);\n const blob = new Blob([vvtText], {type: 'text/vtt'});\n uri = shaka.media.MediaSourceEngine.createObjectURL(blob);\n mimeType = 'text/vtt';\n }\n\n /** @type {shaka.extern.Stream} */\n const stream = {\n id: this.nextExternalStreamId_++,\n originalId: null,\n groupId: null,\n createSegmentIndex: () => Promise.resolve(),\n segmentIndex: shaka.media.SegmentIndex.forSingleSegment(\n /* startTime= */ 0,\n /* duration= */ duration,\n /* uris= */ [uri]),\n mimeType: mimeType || '',\n codecs: codec || '',\n kind: kind,\n encrypted: false,\n drmInfos: [],\n keyIds: new Set(),\n language: language,\n originalLanguage: language,\n label: label || null,\n type: ContentType.TEXT,\n primary: false,\n trickModeVideo: null,\n dependencyStream: null,\n emsgSchemeIdUris: null,\n roles: [],\n forced: !!forced,\n channelsCount: null,\n audioSamplingRate: null,\n spatialAudio: false,\n closedCaptions: null,\n accessibilityPurpose: null,\n external: true,\n fastSwitching: false,\n fullMimeTypes: new Set([shaka.util.MimeUtils.getFullType(\n mimeType || '', codec || '')]),\n isAudioMuxedInVideo: false,\n baseOriginalId: null,\n };\n\n const fullMimeType = shaka.util.MimeUtils.getFullType(\n stream.mimeType, stream.codecs);\n const supported = shaka.text.TextEngine.isTypeSupported(fullMimeType);\n if (!supported) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.TEXT,\n shaka.util.Error.Code.MISSING_TEXT_PLUGIN,\n mimeType);\n }\n\n this.manifest_.textStreams.push(stream);\n this.onTracksChanged_();\n return shaka.util.StreamUtils.textStreamToTrack(stream);\n }\n\n /**\n * Adds the given thumbnails track to the loaded manifest.\n * <code>load()</code> must resolve before calling. The presentation must\n * have a duration.\n *\n * This returns the created track, which can immediately be used by the\n * application.\n *\n * @param {string} uri\n * @param {string=} mimeType\n * @return {!Promise<shaka.extern.Track>}\n * @export\n */\n async addThumbnailsTrack(uri, mimeType) {\n if (this.loadMode_ != shaka.Player.LoadMode.MEDIA_SOURCE &&\n this.loadMode_ != shaka.Player.LoadMode.SRC_EQUALS) {\n shaka.log.error(\n 'Must call load() and wait for it to resolve before adding image ' +\n 'tracks.');\n throw new shaka.util.Error(\n shaka.util.Error.Severity.RECOVERABLE,\n shaka.util.Error.Category.PLAYER,\n shaka.util.Error.Code.CONTENT_NOT_LOADED);\n }\n\n if (!mimeType) {\n mimeType = await this.getTextMimetype_(uri);\n }\n\n if (mimeType != 'text/vtt') {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.RECOVERABLE,\n shaka.util.Error.Category.TEXT,\n shaka.util.Error.Code.UNSUPPORTED_EXTERNAL_THUMBNAILS_URI,\n uri);\n }\n\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n const seekRange = this.seekRange();\n let duration = seekRange.end - seekRange.start;\n if (this.manifest_) {\n duration = this.manifest_.presentationTimeline.getDuration();\n }\n if (duration == Infinity) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.RECOVERABLE,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.CANNOT_ADD_EXTERNAL_THUMBNAILS_TO_LIVE_STREAM);\n }\n\n goog.asserts.assert(\n this.networkingEngine_, 'Need networking engine.');\n const buffer = await this.getTextData_(uri,\n this.networkingEngine_,\n this.config_.streaming.retryParameters);\n\n const factory = shaka.text.TextEngine.findParser(mimeType);\n if (!factory) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.TEXT,\n shaka.util.Error.Code.MISSING_TEXT_PLUGIN,\n mimeType);\n }\n const TextParser = factory();\n const time = {\n periodStart: 0,\n segmentStart: 0,\n segmentEnd: duration,\n vttOffset: 0,\n };\n const data = shaka.util.BufferUtils.toUint8(buffer);\n const cues = TextParser.parseMedia(data, time, uri, /* images= */ []);\n\n const references = [];\n for (const cue of cues) {\n let uris = null;\n const getUris = () => {\n if (uris == null) {\n uris = shaka.util.ManifestParserUtils.resolveUris(\n [uri], [cue.payload]);\n }\n return uris || [];\n };\n const reference = new shaka.media.SegmentReference(\n cue.startTime,\n cue.endTime,\n getUris,\n /* startByte= */ 0,\n /* endByte= */ null,\n /* initSegmentReference= */ null,\n /* timestampOffset= */ 0,\n /* appendWindowStart= */ 0,\n /* appendWindowEnd= */ Infinity,\n );\n if (cue.payload.includes('#xywh')) {\n const spriteInfo = cue.payload.split('#xywh=')[1].split(',');\n if (spriteInfo.length === 4) {\n reference.setThumbnailSprite({\n height: parseInt(spriteInfo[3], 10),\n positionX: parseInt(spriteInfo[0], 10),\n positionY: parseInt(spriteInfo[1], 10),\n width: parseInt(spriteInfo[2], 10),\n });\n }\n }\n references.push(reference);\n }\n\n let segmentMimeType = mimeType;\n if (references.length) {\n segmentMimeType = await shaka.net.NetworkingUtils.getMimeType(\n references[0].getUris()[0],\n this.networkingEngine_, this.config_.manifest.retryParameters);\n }\n\n /** @type {shaka.extern.Stream} */\n const stream = {\n id: this.nextExternalStreamId_++,\n originalId: null,\n groupId: null,\n createSegmentIndex: () => Promise.resolve(),\n segmentIndex: new shaka.media.SegmentIndex(references),\n mimeType: segmentMimeType || '',\n codecs: '',\n kind: '',\n encrypted: false,\n drmInfos: [],\n keyIds: new Set(),\n language: 'und',\n originalLanguage: null,\n label: null,\n type: ContentType.IMAGE,\n primary: false,\n trickModeVideo: null,\n dependencyStream: null,\n emsgSchemeIdUris: null,\n roles: [],\n forced: false,\n channelsCount: null,\n audioSamplingRate: null,\n spatialAudio: false,\n closedCaptions: null,\n tilesLayout: '1x1',\n accessibilityPurpose: null,\n external: true,\n fastSwitching: false,\n fullMimeTypes: new Set([shaka.util.MimeUtils.getFullType(\n segmentMimeType || '', '')]),\n isAudioMuxedInVideo: false,\n baseOriginalId: null,\n };\n\n if (this.loadMode_ == shaka.Player.LoadMode.SRC_EQUALS) {\n this.externalSrcEqualsThumbnailsStreams_.push(stream);\n } else {\n this.manifest_.imageStreams.push(stream);\n }\n this.onTracksChanged_();\n return shaka.util.StreamUtils.imageStreamToTrack(stream);\n }\n\n /**\n * Adds the given chapters track to the loaded manifest. <code>load()</code>\n * must resolve before calling. The presentation must have a duration.\n *\n * This returns the created track.\n *\n * @param {string} uri\n * @param {string} language\n * @param {string=} mimeType\n * @return {!Promise<shaka.extern.Track>}\n * @export\n */\n async addChaptersTrack(uri, language, mimeType) {\n if (this.loadMode_ != shaka.Player.LoadMode.MEDIA_SOURCE &&\n this.loadMode_ != shaka.Player.LoadMode.SRC_EQUALS) {\n shaka.log.error(\n 'Must call load() and wait for it to resolve before adding ' +\n 'chapters tracks.');\n throw new shaka.util.Error(\n shaka.util.Error.Severity.RECOVERABLE,\n shaka.util.Error.Category.PLAYER,\n shaka.util.Error.Code.CONTENT_NOT_LOADED);\n }\n\n if (!mimeType) {\n mimeType = await this.getTextMimetype_(uri);\n }\n\n let adCuePoints = [];\n if (this.adManager_) {\n adCuePoints = this.adManager_.getCuePoints();\n }\n\n /** @type {!HTMLTrackElement} */\n const trackElement = await this.addSrcTrackElement_(\n uri, language, /* kind= */ 'chapters', mimeType, /* label= */ '',\n adCuePoints);\n\n const chaptersTracks = this.getChaptersTracks();\n const chaptersTrack = chaptersTracks.find((t) => {\n return t.language == language;\n });\n\n if (chaptersTrack) {\n await new Promise((resolve, reject) => {\n // The chapter data isn't available until the 'load' event fires, and\n // that won't happen until the chapters track is activated by the\n // activateChaptersTrack_ method.\n this.loadEventManager_.listenOnce(trackElement, 'load', resolve);\n this.loadEventManager_.listenOnce(trackElement, 'error', (event) => {\n reject(new shaka.util.Error(\n shaka.util.Error.Severity.RECOVERABLE,\n shaka.util.Error.Category.TEXT,\n shaka.util.Error.Code.CHAPTERS_TRACK_FAILED));\n });\n });\n\n this.onTracksChanged_();\n\n return chaptersTrack;\n }\n\n // This should not happen, but there are browser implementations that may\n // not support the Track element.\n shaka.log.error('Cannot add this text when loaded with src=');\n throw new shaka.util.Error(\n shaka.util.Error.Severity.RECOVERABLE,\n shaka.util.Error.Category.TEXT,\n shaka.util.Error.Code.CANNOT_ADD_EXTERNAL_TEXT_TO_SRC_EQUALS);\n }\n\n /**\n * @param {string} uri\n * @return {!Promise<string>}\n * @private\n */\n async getTextMimetype_(uri) {\n let mimeType;\n try {\n goog.asserts.assert(\n this.networkingEngine_, 'Need networking engine.');\n mimeType = await shaka.net.NetworkingUtils.getMimeType(uri,\n this.networkingEngine_,\n this.config_.streaming.retryParameters);\n } catch (error) {}\n\n if (mimeType) {\n return mimeType;\n }\n\n shaka.log.error(\n 'The mimeType has not been provided and it could not be deduced ' +\n 'from its uri.');\n throw new shaka.util.Error(\n shaka.util.Error.Severity.RECOVERABLE,\n shaka.util.Error.Category.TEXT,\n shaka.util.Error.Code.TEXT_COULD_NOT_GUESS_MIME_TYPE,\n uri);\n }\n\n /**\n * @param {string} uri\n * @param {string} language\n * @param {string} kind\n * @param {string} mimeType\n * @param {string} label\n * @param {!Array<!shaka.extern.AdCuePoint>} adCuePoints\n * @return {!Promise<!HTMLTrackElement>}\n * @private\n */\n async addSrcTrackElement_(uri, language, kind, mimeType, label,\n adCuePoints) {\n if (mimeType != 'text/vtt' || adCuePoints.length) {\n goog.asserts.assert(\n this.networkingEngine_, 'Need networking engine.');\n const data = await this.getTextData_(uri,\n this.networkingEngine_,\n this.config_.streaming.retryParameters);\n const vvtText = this.convertToWebVTT_(data, mimeType, adCuePoints);\n const blob = new Blob([vvtText], {type: 'text/vtt'});\n uri = shaka.media.MediaSourceEngine.createObjectURL(blob);\n mimeType = 'text/vtt';\n }\n\n const trackElement =\n /** @type {!HTMLTrackElement} */(document.createElement('track'));\n trackElement.src = this.cmcdManager_.appendTextTrackData(uri);\n trackElement.label = label;\n trackElement.kind = kind;\n trackElement.srclang = language;\n\n // Because we're pulling in the text track file via Javascript, the\n // same-origin policy applies. If you'd like to have a player served\n // from one domain, but the text track served from another, you'll\n // need to enable CORS in order to do so. In addition to enabling CORS\n // on the server serving the text tracks, you will need to add the\n // crossorigin attribute to the video element itself.\n if (!this.video_.getAttribute('crossorigin')) {\n this.video_.setAttribute('crossorigin', 'anonymous');\n }\n\n this.video_.appendChild(trackElement);\n return trackElement;\n }\n\n /**\n * @param {string} uri\n * @param {!shaka.net.NetworkingEngine} netEngine\n * @param {shaka.extern.RetryParameters} retryParams\n * @return {!Promise<BufferSource>}\n * @private\n */\n async getTextData_(uri, netEngine, retryParams) {\n const type = shaka.net.NetworkingEngine.RequestType.SEGMENT;\n\n const request = shaka.net.NetworkingEngine.makeRequest([uri], retryParams);\n request.method = 'GET';\n\n this.cmcdManager_.applyTextData(request);\n\n const response = await netEngine.request(type, request).promise;\n\n return response.data;\n }\n\n\n /**\n * Converts an input string to a WebVTT format string.\n *\n * @param {BufferSource} buffer\n * @param {string} mimeType\n * @param {!Array<!shaka.extern.AdCuePoint>} adCuePoints\n * @return {string}\n * @private\n */\n convertToWebVTT_(buffer, mimeType, adCuePoints) {\n const factory = shaka.text.TextEngine.findParser(mimeType);\n if (factory) {\n const obj = factory();\n const time = {\n periodStart: 0,\n segmentStart: 0,\n segmentEnd: this.video_.duration,\n vttOffset: 0,\n };\n const data = shaka.util.BufferUtils.toUint8(buffer);\n const cues = obj.parseMedia(\n data, time, /* uri= */ null, /* images= */ []);\n return shaka.text.WebVttGenerator.convert(cues, adCuePoints);\n }\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.TEXT,\n shaka.util.Error.Code.MISSING_TEXT_PLUGIN,\n mimeType);\n }\n\n /**\n * Set the maximum resolution that the platform's hardware can handle.\n *\n * @param {number} width\n * @param {number} height\n * @export\n */\n setMaxHardwareResolution(width, height) {\n this.maxHwRes_.width = width;\n this.maxHwRes_.height = height;\n }\n\n /**\n * Retry streaming after a streaming failure has occurred. When the player has\n * not loaded content or is loading content, this will be a no-op and will\n * return <code>false</code>.\n *\n * <p>\n * If the player has loaded content, and streaming has not seen an error, this\n * will return <code>false</code>.\n *\n * <p>\n * If the player has loaded content, and streaming seen an error, but the\n * could not resume streaming, this will return <code>false</code>.\n *\n * @param {number=} retryDelaySeconds\n * @return {boolean}\n * @export\n */\n retryStreaming(retryDelaySeconds = 0.1) {\n return this.loadMode_ == shaka.Player.LoadMode.MEDIA_SOURCE ?\n this.streamingEngine_.retry(retryDelaySeconds) :\n false;\n }\n\n /**\n * Get the manifest that the player has loaded. If the player has not loaded\n * any content, this will return <code>null</code>.\n *\n * NOTE: This structure is NOT covered by semantic versioning compatibility\n * guarantees. It may change at any time!\n *\n * This is marked as deprecated to warn Closure Compiler users at compile-time\n * to avoid using this method.\n *\n * @return {?shaka.extern.Manifest}\n * @export\n * @deprecated\n */\n getManifest() {\n shaka.log.alwaysWarn(\n 'Shaka Player\\'s internal Manifest structure is NOT covered by ' +\n 'semantic versioning compatibility guarantees. It may change at any ' +\n 'time! Please consider filing a feature request for whatever you ' +\n 'use getManifest() for.');\n return this.manifest_;\n }\n\n /**\n * Get the type of manifest parser that the player is using. If the player has\n * not loaded any content, this will return <code>null</code>.\n *\n * @return {?shaka.extern.ManifestParser.Factory}\n * @export\n */\n getManifestParserFactory() {\n return this.parserFactory_;\n }\n\n /**\n * Gets information about the currently fetched video, audio, and text.\n * In the case of a multi-codec or multi-mimeType manifest, this can let you\n * determine the exact codecs and mimeTypes being fetched at the moment.\n *\n * @return {!shaka.extern.PlaybackInfo}\n * @export\n */\n getFetchedPlaybackInfo() {\n const output = /** @type {!shaka.extern.PlaybackInfo} */ ({\n 'video': null,\n 'audio': null,\n 'text': null,\n });\n if (this.loadMode_ != shaka.Player.LoadMode.MEDIA_SOURCE) {\n return output;\n }\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n const variant = this.streamingEngine_.getCurrentVariant();\n const textStream = this.streamingEngine_.getCurrentTextStream();\n const currentTime = this.video_.currentTime;\n for (const stream of [variant.video, variant.audio, textStream]) {\n if (!stream || !stream.segmentIndex) {\n continue;\n }\n const position = stream.segmentIndex.find(currentTime);\n const reference = stream.segmentIndex.get(position);\n const info = /** @type {!shaka.extern.PlaybackStreamInfo} */ ({\n 'codecs': reference.codecs || stream.codecs,\n 'mimeType': reference.mimeType || stream.mimeType,\n 'bandwidth': reference.bandwidth || stream.bandwidth,\n });\n if (stream.type == ContentType.VIDEO) {\n info['width'] = stream.width;\n info['height'] = stream.height;\n output['video'] = info;\n } else if (stream.type == ContentType.AUDIO) {\n output['audio'] = info;\n } else if (stream.type == ContentType.TEXT) {\n output['text'] = info;\n }\n }\n return output;\n }\n\n /**\n * @param {shaka.extern.Variant} variant\n * @param {boolean} fromAdaptation\n * @private\n */\n addVariantToSwitchHistory_(variant, fromAdaptation) {\n const switchHistory = this.stats_.getSwitchHistory();\n switchHistory.updateCurrentVariant(variant, fromAdaptation);\n }\n\n /**\n * @param {shaka.extern.Stream} textStream\n * @param {boolean} fromAdaptation\n * @private\n */\n addTextStreamToSwitchHistory_(textStream, fromAdaptation) {\n const switchHistory = this.stats_.getSwitchHistory();\n switchHistory.updateCurrentText(textStream, fromAdaptation);\n }\n\n /**\n * @return {shaka.extern.PlayerConfiguration}\n * @private\n */\n defaultConfig_() {\n const config = shaka.util.PlayerConfiguration.createDefault();\n\n config.streaming.failureCallback = (error) => {\n this.defaultStreamingFailureCallback_(error);\n };\n\n // Because this.video_ may not be set when the config is built, the default\n // TextDisplay factory must capture a reference to \"this\".\n config.textDisplayFactory = () => {\n // On iOS where the Fullscreen API is not available we prefer\n // SimpleTextDisplayer because it works with the Fullscreen API of the\n // video element itself.\n const Platform = shaka.util.Platform;\n if (this.videoContainer_ &&\n (!Platform.isApple() || document.fullscreenEnabled)) {\n return new shaka.text.UITextDisplayer(\n this.video_, this.videoContainer_);\n } else {\n // eslint-disable-next-line no-restricted-syntax\n if (HTMLMediaElement.prototype.addTextTrack) {\n return new shaka.text.SimpleTextDisplayer(\n this.video_, shaka.Player.TextTrackLabel);\n } else {\n shaka.log.warning('Text tracks are not supported by the ' +\n 'browser, disabling.');\n return new shaka.text.StubTextDisplayer();\n }\n }\n };\n return config;\n }\n\n /**\n * Set the videoContainer to construct UITextDisplayer.\n * @param {HTMLElement} videoContainer\n * @export\n */\n setVideoContainer(videoContainer) {\n this.videoContainer_ = videoContainer;\n }\n\n /**\n * @param {!shaka.util.Error} error\n * @private\n */\n defaultStreamingFailureCallback_(error) {\n // For live streams, we retry streaming automatically for certain errors.\n // For VOD streams, all streaming failures are fatal.\n if (!this.isLive()) {\n return;\n }\n\n let retryDelaySeconds = null;\n if (error.code == shaka.util.Error.Code.BAD_HTTP_STATUS ||\n error.code == shaka.util.Error.Code.HTTP_ERROR) {\n // These errors can be near-instant, so delay a bit before retrying.\n retryDelaySeconds = 1;\n if (this.config_.streaming.lowLatencyMode) {\n retryDelaySeconds = 0.1;\n }\n } else if (error.code == shaka.util.Error.Code.TIMEOUT) {\n // We already waited for a timeout, so retry quickly.\n retryDelaySeconds = 0.1;\n }\n\n if (retryDelaySeconds != null) {\n error.severity = shaka.util.Error.Severity.RECOVERABLE;\n shaka.log.warning('Live streaming error. Retrying automatically...');\n this.retryStreaming(retryDelaySeconds);\n }\n }\n\n /**\n * For CEA closed captions embedded in the video streams, create dummy text\n * stream. This can be safely called again on existing manifests, for\n * manifest updates.\n * @param {!shaka.extern.Manifest} manifest\n * @private\n */\n makeTextStreamsForClosedCaptions_(manifest) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n const TextStreamKind = shaka.util.ManifestParserUtils.TextStreamKind;\n const CEA608_MIME = shaka.util.MimeUtils.CEA608_CLOSED_CAPTION_MIMETYPE;\n const CEA708_MIME = shaka.util.MimeUtils.CEA708_CLOSED_CAPTION_MIMETYPE;\n\n // A set, to make sure we don't create two text streams for the same video.\n const closedCaptionsSet = new Set();\n for (const textStream of manifest.textStreams) {\n if (textStream.mimeType == CEA608_MIME ||\n textStream.mimeType == CEA708_MIME) {\n // This function might be called on a manifest update, so don't make a\n // new text stream for closed caption streams we have seen before.\n closedCaptionsSet.add(textStream.originalId);\n }\n }\n for (const variant of manifest.variants) {\n const video = variant.video;\n if (video && video.closedCaptions) {\n for (const id of video.closedCaptions.keys()) {\n if (!closedCaptionsSet.has(id)) {\n const mimeType = id.startsWith('CC') ? CEA608_MIME : CEA708_MIME;\n\n // Add an empty segmentIndex, for the benefit of the period combiner\n // in our builtin DASH parser.\n const segmentIndex = new shaka.media.MetaSegmentIndex();\n const language = video.closedCaptions.get(id);\n const textStream = {\n id: this.nextExternalStreamId_++, // A globally unique ID.\n originalId: id, // The CC ID string, like 'CC1', 'CC3', etc.\n groupId: null,\n createSegmentIndex: () => Promise.resolve(),\n segmentIndex,\n mimeType,\n codecs: '',\n kind: TextStreamKind.CLOSED_CAPTION,\n encrypted: false,\n drmInfos: [],\n keyIds: new Set(),\n language,\n originalLanguage: language,\n label: null,\n type: ContentType.TEXT,\n primary: false,\n trickModeVideo: null,\n dependencyStream: null,\n emsgSchemeIdUris: null,\n roles: video.roles,\n forced: false,\n channelsCount: null,\n audioSamplingRate: null,\n spatialAudio: false,\n closedCaptions: null,\n accessibilityPurpose: null,\n external: false,\n fastSwitching: false,\n fullMimeTypes: new Set([shaka.util.MimeUtils.getFullType(\n mimeType, '')]),\n isAudioMuxedInVideo: false,\n baseOriginalId: null,\n };\n manifest.textStreams.push(textStream);\n closedCaptionsSet.add(id);\n }\n }\n }\n }\n }\n\n /**\n * @param {shaka.extern.Variant} initialVariant\n * @param {number} time\n * @return {!Promise<number>}\n * @private\n */\n async adjustStartTime_(initialVariant, time) {\n /** @type {?shaka.extern.Stream} */\n const activeAudio = initialVariant.audio;\n /** @type {?shaka.extern.Stream} */\n const activeVideo = initialVariant.video;\n\n /**\n * @param {?shaka.extern.Stream} stream\n * @param {number} time\n * @return {!Promise<?number>}\n */\n const getAdjustedTime = async (stream, time) => {\n if (!stream) {\n return null;\n }\n\n if (!stream.segmentIndex) {\n await stream.createSegmentIndex();\n }\n const iter = stream.segmentIndex.getIteratorForTime(time);\n const ref = iter ? iter.next().value : null;\n if (!ref) {\n return null;\n }\n\n const refTime = ref.startTime;\n goog.asserts.assert(refTime <= time,\n 'Segment should start before target time!');\n return refTime;\n };\n\n const audioStartTime = await getAdjustedTime(activeAudio, time);\n const videoStartTime = await getAdjustedTime(activeVideo, time);\n\n // If we have both video and audio times, pick the larger one. If we picked\n // the smaller one, that one will download an entire segment to buffer the\n // difference.\n if (videoStartTime != null && audioStartTime != null) {\n return Math.max(videoStartTime, audioStartTime);\n } else if (videoStartTime != null) {\n return videoStartTime;\n } else if (audioStartTime != null) {\n return audioStartTime;\n } else {\n return time;\n }\n }\n\n /**\n * Update the buffering state to be either \"we are buffering\" or \"we are not\n * buffering\", firing events to the app as needed.\n *\n * @private\n */\n updateBufferState_() {\n const isBuffering = this.isBuffering();\n shaka.log.v2('Player changing buffering state to', isBuffering);\n\n // Make sure we have all the components we need before we consider ourselves\n // as being loaded.\n // TODO: Make the check for \"loaded\" simpler.\n const loaded = this.stats_ && this.bufferObserver_ && this.playhead_;\n\n if (loaded) {\n if (this.config_.streaming.rebufferingGoal == 0) {\n // Disable buffer control with playback rate\n this.playRateController_.setBuffering(/* isBuffering= */ false);\n } else {\n this.playRateController_.setBuffering(isBuffering);\n }\n if (this.cmcdManager_) {\n this.cmcdManager_.setBuffering(isBuffering);\n }\n this.updateStateHistory_();\n\n const dynamicTargetLatency =\n this.config_.streaming.liveSync.dynamicTargetLatency.enabled;\n const maxAttempts =\n this.config_.streaming.liveSync.dynamicTargetLatency.maxAttempts;\n\n\n if (dynamicTargetLatency && isBuffering &&\n this.rebufferingCount_ < maxAttempts) {\n const maxLatency =\n this.config_.streaming.liveSync.dynamicTargetLatency.maxLatency;\n\n const targetLatencyTolerance =\n this.config_.streaming.liveSync.targetLatencyTolerance;\n const rebufferIncrement =\n this.config_.streaming.liveSync.dynamicTargetLatency\n .rebufferIncrement;\n if (this.currentTargetLatency_) {\n this.currentTargetLatency_ = Math.min(\n this.currentTargetLatency_ +\n ++this.rebufferingCount_ * rebufferIncrement,\n maxLatency - targetLatencyTolerance);\n }\n }\n }\n\n // Surface the buffering event so that the app knows if/when we are\n // buffering.\n const eventName = shaka.util.FakeEvent.EventName.Buffering;\n const data = (new Map()).set('buffering', isBuffering);\n this.dispatchEvent(shaka.Player.makeEvent_(eventName, data));\n }\n\n /**\n * A callback for when the playback rate changes. We need to watch the\n * playback rate so that if the playback rate on the media element changes\n * (that was not caused by our play rate controller) we can notify the\n * controller so that it can stay in-sync with the change.\n *\n * @private\n */\n onRateChange_() {\n /** @type {number} */\n const newRate = this.video_.playbackRate;\n\n // On Edge, when someone seeks using the native controls, it will set the\n // playback rate to zero until they finish seeking, after which it will\n // return the playback rate.\n //\n // If the playback rate changes while seeking, Edge will cache the playback\n // rate and use it after seeking.\n //\n // https://github.com/shaka-project/shaka-player/issues/951\n if (newRate == 0) {\n return;\n }\n\n if (this.playRateController_) {\n // The playback rate has changed. This could be us or someone else.\n // If this was us, setting the rate again will be a no-op.\n this.playRateController_.set(newRate);\n\n if (this.loadMode_ == shaka.Player.LoadMode.MEDIA_SOURCE) {\n this.abrManager_.playbackRateChanged(newRate);\n }\n this.setupTrickPlayEventListeners_(newRate);\n }\n\n const event = shaka.Player.makeEvent_(\n shaka.util.FakeEvent.EventName.RateChange);\n this.dispatchEvent(event);\n }\n\n /**\n * Configures all the necessary listeners when trick play is being performed.\n *\n * @param {number} rate\n * @private\n */\n setupTrickPlayEventListeners_(rate) {\n this.trickPlayEventManager_.removeAll();\n if (this.isLive()) {\n this.trickPlayEventManager_.listen(this.video_, 'timeupdate', () => {\n const currentTime = this.video_.currentTime;\n const seekRange = this.seekRange();\n const safeSeekOffset = this.config_.streaming.safeSeekOffset;\n\n // Cancel trick play if we hit the beginning or end of the seekable\n // (Sub-second accuracy not required here)\n if (rate > 0) {\n if (Math.floor(currentTime) >= Math.floor(seekRange.end)) {\n this.cancelTrickPlay();\n }\n } else {\n if (Math.floor(currentTime) <=\n Math.floor(seekRange.start + safeSeekOffset)) {\n this.cancelTrickPlay();\n }\n }\n });\n }\n }\n\n /**\n * Try updating the state history. If the player has not finished\n * initializing, this will be a no-op.\n *\n * @private\n */\n updateStateHistory_() {\n // If we have not finish initializing, this will be a no-op.\n if (!this.stats_) {\n return;\n }\n if (!this.bufferObserver_) {\n return;\n }\n\n const State = shaka.media.BufferingObserver.State;\n\n const history = this.stats_.getStateHistory();\n\n let updateState = 'playing';\n if (this.bufferObserver_.getState() == State.STARVING) {\n updateState = 'buffering';\n } else if (this.isEnded()) {\n updateState = 'ended';\n } else if (this.video_.paused) {\n updateState = 'paused';\n }\n const stateChanged = history.update(updateState);\n\n if (stateChanged) {\n const eventName = shaka.util.FakeEvent.EventName.StateChanged;\n const data = (new Map()).set('newstate', updateState);\n this.dispatchEvent(shaka.Player.makeEvent_(eventName, data));\n }\n }\n\n /**\n * Callback for liveSync and vodDynamicPlaybackRate\n *\n * @private\n */\n onTimeUpdate_() {\n const playbackRate = this.video_.playbackRate;\n const isLive = this.isLive();\n\n if (this.config_.streaming.vodDynamicPlaybackRate && !isLive) {\n const minPlaybackRate =\n this.config_.streaming.vodDynamicPlaybackRateLowBufferRate;\n const bufferFullness = this.getBufferFullness();\n const bufferThreshold =\n this.config_.streaming.vodDynamicPlaybackRateBufferRatio;\n\n if (bufferFullness <= bufferThreshold) {\n if (playbackRate != minPlaybackRate) {\n shaka.log.debug('Buffer fullness ratio (' + bufferFullness + ') ' +\n 'is less than the vodDynamicPlaybackRateBufferRatio (' +\n bufferThreshold + '). Updating playbackRate to ' + minPlaybackRate);\n this.trickPlay(minPlaybackRate, /* useTrickPlayTrack= */ false);\n }\n } else if (bufferFullness == 1) {\n if (playbackRate !== this.playRateController_.getDefaultRate()) {\n shaka.log.debug('Buffer is full. Cancel trick play.');\n this.cancelTrickPlay();\n }\n }\n }\n\n // If the live stream has reached its end, do not sync.\n if (!isLive) {\n return;\n }\n\n const seekRange = this.seekRange();\n if (!Number.isFinite(seekRange.end)) {\n return;\n }\n const currentTime = this.video_.currentTime;\n if (currentTime < seekRange.start) {\n // Bad stream?\n return;\n }\n\n // We don't want to block the user from pausing the stream.\n if (this.video_.paused) {\n return;\n }\n\n let targetLatency;\n let maxLatency;\n let maxPlaybackRate;\n let minLatency;\n let minPlaybackRate;\n const targetLatencyTolerance =\n this.config_.streaming.liveSync.targetLatencyTolerance;\n const dynamicTargetLatency =\n this.config_.streaming.liveSync.dynamicTargetLatency.enabled;\n const stabilityThreshold =\n this.config_.streaming.liveSync.dynamicTargetLatency.stabilityThreshold;\n\n if (this.config_.streaming.liveSync &&\n this.config_.streaming.liveSync.enabled) {\n targetLatency = this.config_.streaming.liveSync.targetLatency;\n maxLatency = targetLatency + targetLatencyTolerance;\n minLatency = Math.max(0, targetLatency - targetLatencyTolerance);\n maxPlaybackRate = this.config_.streaming.liveSync.maxPlaybackRate;\n minPlaybackRate = this.config_.streaming.liveSync.minPlaybackRate;\n } else {\n // serviceDescription must override if it is defined in the MPD and\n // liveSync configuration is not set.\n if (this.manifest_ && this.manifest_.serviceDescription) {\n targetLatency = this.manifest_.serviceDescription.targetLatency;\n if (this.manifest_.serviceDescription.targetLatency != null) {\n maxLatency = this.manifest_.serviceDescription.targetLatency +\n targetLatencyTolerance;\n } else if (this.manifest_.serviceDescription.maxLatency != null) {\n maxLatency = this.manifest_.serviceDescription.maxLatency;\n }\n if (this.manifest_.serviceDescription.targetLatency != null) {\n minLatency = Math.max(0,\n this.manifest_.serviceDescription.targetLatency -\n targetLatencyTolerance);\n } else if (this.manifest_.serviceDescription.minLatency != null) {\n minLatency = this.manifest_.serviceDescription.minLatency;\n }\n maxPlaybackRate =\n this.manifest_.serviceDescription.maxPlaybackRate ||\n this.config_.streaming.liveSync.maxPlaybackRate;\n minPlaybackRate =\n this.manifest_.serviceDescription.minPlaybackRate ||\n this.config_.streaming.liveSync.minPlaybackRate;\n }\n }\n\n if (!this.currentTargetLatency_ && typeof targetLatency === 'number') {\n this.currentTargetLatency_ = targetLatency;\n }\n\n const maxAttempts =\n this.config_.streaming.liveSync.dynamicTargetLatency.maxAttempts;\n if (dynamicTargetLatency && this.targetLatencyReached_ &&\n this.currentTargetLatency_ !== null &&\n typeof targetLatency === 'number' &&\n this.rebufferingCount_ < maxAttempts &&\n (Date.now() - this.targetLatencyReached_) > stabilityThreshold * 1000) {\n const dynamicMinLatency =\n this.config_.streaming.liveSync.dynamicTargetLatency.minLatency;\n const latencyIncrement = (targetLatency - dynamicMinLatency) / 2;\n this.currentTargetLatency_ = Math.max(\n this.currentTargetLatency_ - latencyIncrement,\n // current target latency should be within the tolerance of the min\n // latency to not overshoot it\n dynamicMinLatency + targetLatencyTolerance);\n this.targetLatencyReached_ = Date.now();\n }\n if (dynamicTargetLatency && this.currentTargetLatency_ !== null) {\n maxLatency = this.currentTargetLatency_ + targetLatencyTolerance;\n minLatency = this.currentTargetLatency_ - targetLatencyTolerance;\n }\n\n const latency = seekRange.end - this.video_.currentTime;\n let offset = 0;\n // In src= mode, the seek range isn't updated frequently enough, so we need\n // to fudge the latency number with an offset. The playback rate is used\n // as an offset, since that is the amount we catch up 1 second of\n // accelerated playback.\n if (this.loadMode_ == shaka.Player.LoadMode.SRC_EQUALS) {\n const buffered = this.video_.buffered;\n if (buffered.length > 0) {\n const bufferedEnd = buffered.end(buffered.length - 1);\n offset = Math.max(maxPlaybackRate, bufferedEnd - seekRange.end);\n }\n }\n\n const panicMode = this.config_.streaming.liveSync.panicMode;\n const panicThreshold =\n this.config_.streaming.liveSync.panicThreshold * 1000;\n const timeSinceLastRebuffer =\n Date.now() - this.bufferObserver_.getLastRebufferTime();\n if (panicMode && !minPlaybackRate) {\n minPlaybackRate = this.config_.streaming.liveSync.minPlaybackRate;\n }\n\n if (panicMode && minPlaybackRate &&\n timeSinceLastRebuffer <= panicThreshold) {\n if (playbackRate != minPlaybackRate) {\n shaka.log.debug('Time since last rebuffer (' +\n timeSinceLastRebuffer + 's) ' +\n 'is less than the live sync panicThreshold (' + panicThreshold +\n 's). Updating playbackRate to ' + minPlaybackRate);\n this.trickPlay(minPlaybackRate, /* useTrickPlayTrack= */ false);\n }\n } else if (maxLatency != undefined && maxPlaybackRate &&\n (latency - offset) > maxLatency) {\n if (playbackRate != maxPlaybackRate) {\n shaka.log.debug('Latency (' + latency + 's) is greater than ' +\n 'live sync maxLatency (' + maxLatency + 's). ' +\n 'Updating playbackRate to ' + maxPlaybackRate);\n this.trickPlay(maxPlaybackRate, /* useTrickPlayTrack= */ false);\n }\n this.targetLatencyReached_ = null;\n } else if (minLatency != undefined && minPlaybackRate &&\n (latency - offset) < minLatency) {\n if (playbackRate != minPlaybackRate) {\n shaka.log.debug('Latency (' + latency + 's) is smaller than ' +\n 'live sync minLatency (' + minLatency + 's). ' +\n 'Updating playbackRate to ' + minPlaybackRate);\n this.trickPlay(minPlaybackRate, /* useTrickPlayTrack= */ false);\n }\n this.targetLatencyReached_ = null;\n } else if (playbackRate !== this.playRateController_.getDefaultRate()) {\n this.cancelTrickPlay();\n this.targetLatencyReached_ = Date.now();\n }\n }\n\n /**\n * Callback for video progress events\n *\n * @private\n */\n onVideoProgress_() {\n if (!this.video_) {\n return;\n }\n\n const isQuartile = (quartilePercent, currentPercent) => {\n const NumberUtils = shaka.util.NumberUtils;\n\n if ((NumberUtils.isFloatEqual(quartilePercent, currentPercent) ||\n currentPercent > quartilePercent) &&\n this.completionPercent_ < quartilePercent) {\n this.completionPercent_ = quartilePercent;\n return true;\n }\n return false;\n };\n\n const checkEnded = () => {\n if (this.config_ && this.config_.playRangeEnd != Infinity) {\n // Make sure the video stops when we reach the end.\n // This is required when there is a custom playRangeEnd specified.\n if (this.isEnded()) {\n this.video_.pause();\n }\n }\n };\n\n const seekRange = this.seekRange();\n const duration = seekRange.end - seekRange.start;\n const completionRatio =\n duration > 0 ? this.video_.currentTime / duration : 0;\n\n if (isNaN(completionRatio)) {\n return;\n }\n\n const percent = completionRatio * 100;\n\n let event;\n if (isQuartile(0, percent)) {\n event = shaka.Player.makeEvent_(shaka.util.FakeEvent.EventName.Started);\n } else if (isQuartile(25, percent)) {\n event = shaka.Player.makeEvent_(\n shaka.util.FakeEvent.EventName.FirstQuartile);\n } else if (isQuartile(50, percent)) {\n event = shaka.Player.makeEvent_(\n shaka.util.FakeEvent.EventName.Midpoint);\n } else if (isQuartile(75, percent)) {\n event = shaka.Player.makeEvent_(\n shaka.util.FakeEvent.EventName.ThirdQuartile);\n } else if (isQuartile(100, percent)) {\n event = shaka.Player.makeEvent_(\n shaka.util.FakeEvent.EventName.Complete);\n checkEnded();\n } else {\n checkEnded();\n }\n\n if (event) {\n this.dispatchEvent(event);\n }\n }\n\n /**\n * Callback from Playhead.\n *\n * @private\n */\n onSeek_() {\n if (this.playheadObservers_) {\n this.playheadObservers_.notifyOfSeek();\n }\n if (this.streamingEngine_) {\n this.streamingEngine_.seeked();\n }\n if (this.bufferObserver_) {\n // If we seek into an unbuffered range, we should fire a 'buffering' event\n // immediately. If StreamingEngine can buffer fast enough, we may not\n // update our buffering tracking otherwise.\n this.pollBufferState_();\n }\n }\n\n /**\n * Update AbrManager with variants while taking into account restrictions,\n * preferences, and ABR.\n *\n * On error, this dispatches an error event and returns false.\n *\n * @return {boolean} True if successful.\n * @private\n */\n updateAbrManagerVariants_() {\n try {\n goog.asserts.assert(this.manifest_, 'Manifest should exist by now!');\n this.manifestFilterer_.checkRestrictedVariants(this.manifest_);\n } catch (e) {\n this.onError_(e);\n return false;\n }\n\n const playableVariants = shaka.util.StreamUtils.getPlayableVariants(\n this.manifest_.variants);\n\n // Update the abr manager with newly filtered variants.\n const adaptationSet = this.currentAdaptationSetCriteria_.create(\n playableVariants);\n this.abrManager_.setVariants(Array.from(adaptationSet.values()));\n return true;\n }\n\n /**\n * Chooses a variant from all possible variants while taking into account\n * restrictions, preferences, and ABR.\n *\n * On error, this dispatches an error event and returns null.\n *\n * @return {?shaka.extern.Variant}\n * @private\n */\n chooseVariant_() {\n if (this.updateAbrManagerVariants_()) {\n return this.abrManager_.chooseVariant();\n } else {\n return null;\n }\n }\n\n /**\n * Checks to re-enable variants that were temporarily disabled due to network\n * errors. If any variants are enabled this way, a new variant may be chosen\n * for playback.\n * @private\n */\n checkVariants_() {\n goog.asserts.assert(this.manifest_, 'Should have manifest!');\n\n const now = Date.now() / 1000;\n let hasVariantUpdate = false;\n\n /** @type {function(shaka.extern.Variant):string} */\n const streamsAsString = (variant) => {\n let str = '';\n if (variant.video) {\n str += 'video:' + variant.video.id;\n }\n if (variant.audio) {\n str += str ? '&' : '';\n str += 'audio:' + variant.audio.id;\n }\n return str;\n };\n\n let shouldStopTimer = true;\n for (const variant of this.manifest_.variants) {\n if (variant.disabledUntilTime > 0 && variant.disabledUntilTime <= now) {\n variant.disabledUntilTime = 0;\n hasVariantUpdate = true;\n\n shaka.log.v2('Re-enabled variant with ' + streamsAsString(variant));\n }\n if (variant.disabledUntilTime > 0) {\n shouldStopTimer = false;\n }\n }\n\n if (shouldStopTimer) {\n this.checkVariantsTimer_.stop();\n }\n\n if (hasVariantUpdate) {\n // Reconsider re-enabled variant for ABR switching.\n this.chooseVariantAndSwitch_(\n /* clearBuffer= */ false, /* safeMargin= */ undefined,\n /* force= */ false, /* fromAdaptation= */ false);\n }\n }\n\n /**\n * Choose a text stream from all possible text streams while taking into\n * account user preference.\n *\n * @return {?shaka.extern.Stream}\n * @private\n */\n chooseTextStream_() {\n const subset = shaka.util.StreamUtils.filterStreamsByLanguageAndRole(\n this.manifest_.textStreams,\n this.currentTextLanguage_,\n this.currentTextRole_,\n this.currentTextForced_);\n return subset[0] || null;\n }\n\n /**\n * Chooses a new Variant. If the new variant differs from the old one, it\n * adds the new one to the switch history and switches to it.\n *\n * Called after a config change, a key status event, or an explicit language\n * change.\n *\n * @param {boolean=} clearBuffer Optional clear buffer or not when\n * switch to new variant\n * Defaults to true if not provided\n * @param {number=} safeMargin Optional amount of buffer (in seconds) to\n * retain when clearing the buffer.\n * Defaults to 0 if not provided. Ignored if clearBuffer is false.\n * @private\n */\n chooseVariantAndSwitch_(clearBuffer = true, safeMargin = 0, force = false,\n fromAdaptation = true) {\n goog.asserts.assert(this.config_, 'Must not be destroyed');\n\n // Because we're running this after a config change (manual language\n // change) or a key status event, it is always okay to clear the buffer\n // here.\n const chosenVariant = this.chooseVariant_();\n if (chosenVariant) {\n this.switchVariant_(chosenVariant, fromAdaptation,\n clearBuffer, safeMargin, force);\n }\n }\n\n /**\n * @param {shaka.extern.Variant} variant\n * @param {boolean} fromAdaptation\n * @param {boolean} clearBuffer\n * @param {number} safeMargin\n * @param {boolean=} force\n * @private\n */\n switchVariant_(variant, fromAdaptation, clearBuffer, safeMargin,\n force = false) {\n const currentVariant = this.streamingEngine_.getCurrentVariant();\n if (variant == currentVariant) {\n shaka.log.debug('Variant already selected.');\n // If you want to clear the buffer, we force to reselect the same variant.\n // We don't need to reset the timestampOffset since it's the same variant,\n // so 'adaptation' isn't passed here.\n if (clearBuffer) {\n this.streamingEngine_.switchVariant(variant, clearBuffer, safeMargin,\n /* force= */ true);\n }\n return;\n }\n\n // Add entries to the history.\n this.addVariantToSwitchHistory_(variant, fromAdaptation);\n this.streamingEngine_.switchVariant(\n variant, clearBuffer, safeMargin, force,\n /* adaptation= */ fromAdaptation);\n let oldTrack = null;\n if (currentVariant) {\n oldTrack = shaka.util.StreamUtils.variantToTrack(currentVariant);\n }\n const newTrack = shaka.util.StreamUtils.variantToTrack(variant);\n newTrack.active = true;\n\n if (this.lcevcDec_) {\n this.lcevcDec_.updateVariant(variant, this.getManifestType());\n }\n\n if (fromAdaptation) {\n // Dispatch an 'adaptation' event\n this.onAdaptation_(oldTrack, newTrack);\n } else {\n // Dispatch a 'variantchanged' event\n this.onVariantChanged_(oldTrack, newTrack);\n }\n // Dispatch a 'audiotrackschanged' event if necessary\n this.checkAudioTracksChanged_(oldTrack, newTrack);\n }\n\n /**\n * @param {AudioTrack} track\n * @private\n */\n switchHtml5Track_(track) {\n goog.asserts.assert(this.video_ && this.video_.audioTracks,\n 'Video and video.audioTracks should not be null!');\n const audioTracks = Array.from(this.video_.audioTracks);\n const currentTrack = audioTracks.find((t) => t.enabled);\n\n // This will reset the \"enabled\" of other tracks to false.\n track.enabled = true;\n\n if (!currentTrack) {\n return;\n }\n\n // AirPlay does not reset the \"enabled\" of other tracks to false, so\n // it must be changed by hand.\n if (track.id !== currentTrack.id) {\n currentTrack.enabled = false;\n }\n\n const oldTrack =\n shaka.util.StreamUtils.html5AudioTrackToTrack(currentTrack);\n const newTrack =\n shaka.util.StreamUtils.html5AudioTrackToTrack(track);\n // Dispatch a 'variantchanged' event\n this.onVariantChanged_(oldTrack, newTrack);\n\n // Dispatch a 'audiotrackschanged' event if necessary\n this.checkAudioTracksChanged_(oldTrack, newTrack);\n }\n\n /**\n * Decide during startup if text should be streamed/shown.\n * @private\n */\n setInitialTextState_(initialVariant, initialTextStream) {\n // Check if we should show text (based on difference between audio and text\n // languages).\n if (initialTextStream) {\n goog.asserts.assert(this.config_, 'Must not be destroyed');\n if (shaka.util.StreamUtils.shouldInitiallyShowText(\n initialVariant.audio, initialTextStream, this.config_)) {\n this.isTextVisible_ = true;\n }\n if (this.isTextVisible_) {\n // If the cached value says to show text, then update the text displayer\n // since it defaults to not shown.\n this.textDisplayer_.setTextVisibility(true);\n goog.asserts.assert(this.shouldStreamText_(),\n 'Should be streaming text');\n }\n this.onTextTrackVisibility_();\n } else {\n this.isTextVisible_ = false;\n }\n }\n\n /**\n * Callback from StreamingEngine.\n *\n * @private\n */\n onManifestUpdate_() {\n if (this.parser_ && this.parser_.update) {\n this.parser_.update();\n }\n }\n\n /**\n * Callback from StreamingEngine.\n *\n * @param {number} start\n * @param {number} end\n * @param {shaka.util.ManifestParserUtils.ContentType} contentType\n * @param {boolean} isMuxed\n *\n * @private\n */\n onSegmentAppended_(start, end, contentType, isMuxed) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n if (contentType != ContentType.TEXT) {\n // When we append a segment to media source (via streaming engine) we are\n // changing what data we have buffered, so notify the playhead of the\n // change.\n if (this.playhead_) {\n this.playhead_.notifyOfBufferingChange();\n // Skip the initial buffer gap\n const startTime = this.mediaSourceEngine_.bufferStart(contentType);\n if (\n !this.isLive() &&\n // If not paused then GapJumpingController will handle this gap.\n this.video_.paused &&\n !this.video_.seeking &&\n startTime != null &&\n startTime > 0 &&\n this.playhead_.getTime() < startTime\n ) {\n this.playhead_.setStartTime(startTime);\n }\n }\n this.pollBufferState_();\n }\n\n // Dispatch an event for users to consume, too.\n const data = new Map()\n .set('start', start)\n .set('end', end)\n .set('contentType', contentType)\n .set('isMuxed', isMuxed);\n this.dispatchEvent(shaka.Player.makeEvent_(\n shaka.util.FakeEvent.EventName.SegmentAppended, data));\n }\n\n /**\n * Callback from AbrManager.\n *\n * @param {shaka.extern.Variant} variant\n * @param {boolean=} clearBuffer\n * @param {number=} safeMargin Optional amount of buffer (in seconds) to\n * retain when clearing the buffer.\n * Defaults to 0 if not provided. Ignored if clearBuffer is false.\n * @private\n */\n switch_(variant, clearBuffer = false, safeMargin = 0) {\n shaka.log.debug('switch_');\n goog.asserts.assert(this.config_.abr.enabled,\n 'AbrManager should not call switch while disabled!');\n\n if (!this.manifest_) {\n // It could come from a preload manager operation.\n return;\n }\n\n if (!this.streamingEngine_) {\n // There's no way to change it.\n return;\n }\n\n if (variant == this.streamingEngine_.getCurrentVariant()) {\n // This isn't a change.\n return;\n }\n\n this.switchVariant_(variant, /* fromAdaptation= */ true,\n clearBuffer, safeMargin);\n }\n\n /**\n * Dispatches an 'adaptation' event.\n * @param {?shaka.extern.Track} from\n * @param {shaka.extern.Track} to\n * @private\n */\n onAdaptation_(from, to) {\n // Delay the 'adaptation' event so that StreamingEngine has time to absorb\n // the changes before the user tries to query it.\n const data = new Map()\n .set('oldTrack', from)\n .set('newTrack', to);\n const event = shaka.Player.makeEvent_(\n shaka.util.FakeEvent.EventName.Adaptation, data);\n this.delayDispatchEvent_(event);\n }\n\n /**\n * Dispatches a 'trackschanged' event.\n * @private\n */\n onTracksChanged_() {\n // Delay the 'trackschanged' event so StreamingEngine has time to absorb the\n // changes before the user tries to query it.\n const event = shaka.Player.makeEvent_(\n shaka.util.FakeEvent.EventName.TracksChanged);\n this.delayDispatchEvent_(event);\n\n // Also fire 'audiotrackschanged' event.\n this.onAudioTracksChanged_();\n }\n\n /**\n * Dispatches a 'variantchanged' event.\n * @param {?shaka.extern.Track} from\n * @param {shaka.extern.Track} to\n * @private\n */\n onVariantChanged_(from, to) {\n // Delay the 'variantchanged' event so StreamingEngine has time to absorb\n // the changes before the user tries to query it.\n const data = new Map()\n .set('oldTrack', from)\n .set('newTrack', to);\n const event = shaka.Player.makeEvent_(\n shaka.util.FakeEvent.EventName.VariantChanged, data);\n this.delayDispatchEvent_(event);\n }\n\n /**\n * Dispatches a 'audiotrackschanged' event if necessary\n * @param {?shaka.extern.Track} from\n * @param {shaka.extern.Track} to\n * @private\n */\n checkAudioTracksChanged_(from, to) {\n let dispatchEvent = false;\n if (!from || from.audioId != to.audioId ||\n from.audioGroupId != to.audioGroupId) {\n dispatchEvent = true;\n }\n if (dispatchEvent) {\n this.onAudioTracksChanged_();\n }\n }\n\n /** @private */\n onAudioTracksChanged_() {\n // Delay the 'audiotrackschanged' event so StreamingEngine has time to\n // absorb the changes before the user tries to query it.\n const event = shaka.Player.makeEvent_(\n shaka.util.FakeEvent.EventName.AudioTracksChanged);\n this.delayDispatchEvent_(event);\n }\n\n /**\n * Dispatches a 'textchanged' event.\n * @private\n */\n onTextChanged_() {\n // Delay the 'textchanged' event so StreamingEngine time to absorb the\n // changes before the user tries to query it.\n const event = shaka.Player.makeEvent_(\n shaka.util.FakeEvent.EventName.TextChanged);\n this.delayDispatchEvent_(event);\n }\n\n /** @private */\n onTextTrackVisibility_() {\n const event = shaka.Player.makeEvent_(\n shaka.util.FakeEvent.EventName.TextTrackVisibility);\n this.delayDispatchEvent_(event);\n }\n\n /** @private */\n onAbrStatusChanged_() {\n // Restore disabled variants if abr get disabled\n if (!this.config_.abr.enabled) {\n this.restoreDisabledVariants_();\n }\n\n const data = (new Map()).set('newStatus', this.config_.abr.enabled);\n this.delayDispatchEvent_(shaka.Player.makeEvent_(\n shaka.util.FakeEvent.EventName.AbrStatusChanged, data));\n }\n\n /**\n * @private\n */\n setTextDisplayerLanguage_() {\n const activeTextTrack = this.getTextTracks().find((t) => t.active);\n if (activeTextTrack &&\n this.textDisplayer_ && this.textDisplayer_.setTextLanguage) {\n this.textDisplayer_.setTextLanguage(activeTextTrack.language);\n }\n }\n\n /**\n * @param {boolean} updateAbrManager\n * @private\n */\n restoreDisabledVariants_(updateAbrManager=true) {\n if (this.loadMode_ != shaka.Player.LoadMode.MEDIA_SOURCE) {\n return;\n }\n goog.asserts.assert(this.manifest_, 'Should have manifest!');\n\n shaka.log.v2('Restoring all disabled streams...');\n\n this.checkVariantsTimer_.stop();\n\n for (const variant of this.manifest_.variants) {\n variant.disabledUntilTime = 0;\n }\n\n if (updateAbrManager) {\n this.updateAbrManagerVariants_();\n }\n }\n\n /**\n * Temporarily disable all variants containing |stream|\n * @param {shaka.extern.Stream} stream\n * @param {number} disableTime\n * @return {boolean}\n */\n disableStream(stream, disableTime) {\n if (!this.config_.abr.enabled ||\n this.loadMode_ === shaka.Player.LoadMode.DESTROYED) {\n return false;\n }\n\n if (!navigator.onLine) {\n // Don't disable variants if we're completely offline, or else we end up\n // rapidly restricting all of them.\n return false;\n }\n\n if (disableTime == 0) {\n return false;\n }\n\n if (!this.manifest_) {\n return false;\n }\n\n // It only makes sense to disable a stream if we have an alternative else we\n // end up disabling all variants.\n const hasAltStream = this.manifest_.variants.some((variant) => {\n const altStream = variant[stream.type];\n\n if (altStream && altStream.id !== stream.id &&\n !variant.disabledUntilTime) {\n if (shaka.util.StreamUtils.isAudio(stream)) {\n return stream.language === altStream.language;\n }\n return true;\n }\n return false;\n });\n\n if (hasAltStream) {\n let didDisableStream = false;\n\n let isTrickModeVideo = false;\n\n for (const variant of this.manifest_.variants) {\n const candidate = variant[stream.type];\n\n if (!candidate) {\n continue;\n }\n\n if (candidate.id === stream.id) {\n variant.disabledUntilTime = (Date.now() / 1000) + disableTime;\n didDisableStream = true;\n\n shaka.log.v2(\n 'Disabled stream ' + stream.type + ':' + stream.id +\n ' for ' + disableTime + ' seconds...');\n } else if (candidate.trickModeVideo &&\n candidate.trickModeVideo.id == stream.id) {\n isTrickModeVideo = true;\n }\n }\n\n if (!didDisableStream && isTrickModeVideo) {\n return false;\n }\n\n goog.asserts.assert(didDisableStream, 'Must have disabled stream');\n\n this.checkVariantsTimer_.tickEvery(1);\n\n // Get the safeMargin to ensure a seamless playback\n const {video} = this.getBufferedInfo();\n const safeMargin =\n video.reduce((size, {start, end}) => size + end - start, 0);\n\n // Update abr manager variants and switch to recover playback\n this.chooseVariantAndSwitch_(\n /* clearBuffer= */ false, /* safeMargin= */ safeMargin,\n /* force= */ true, /* fromAdaptation= */ false);\n return true;\n }\n\n shaka.log.warning(\n 'No alternate stream found for active ' + stream.type + ' stream. ' +\n 'Will ignore request to disable stream...');\n\n return false;\n }\n\n /**\n * @param {!shaka.util.Error} error\n * @private\n */\n async onError_(error) {\n goog.asserts.assert(error instanceof shaka.util.Error, 'Wrong error type!');\n\n // Errors dispatched after |destroy| is called are not meaningful and should\n // be safe to ignore.\n if (this.loadMode_ == shaka.Player.LoadMode.DESTROYED) {\n return;\n }\n\n if (error.severity === shaka.util.Error.Severity.RECOVERABLE) {\n this.stats_.addNonFatalError();\n }\n\n let fireError = true;\n if (this.fullyLoaded_ && this.manifest_ && this.streamingEngine_ &&\n (error.code == shaka.util.Error.Code.VIDEO_ERROR ||\n error.code == shaka.util.Error.Code.MEDIA_SOURCE_OPERATION_FAILED ||\n error.code == shaka.util.Error.Code.MEDIA_SOURCE_OPERATION_THREW ||\n error.code == shaka.util.Error.Code.TRANSMUXING_FAILED)) {\n try {\n const ret = await this.streamingEngine_.resetMediaSource();\n fireError = !ret;\n if (ret) {\n const event = shaka.Player.makeEvent_(\n shaka.util.FakeEvent.EventName.MediaSourceRecovered);\n this.dispatchEvent(event);\n }\n } catch (e) {\n fireError = true;\n }\n }\n if (!fireError) {\n return;\n }\n\n // Restore disabled variant if the player experienced a critical error.\n if (error.severity === shaka.util.Error.Severity.CRITICAL) {\n this.restoreDisabledVariants_(/* updateAbrManager= */ false);\n }\n\n const eventName = shaka.util.FakeEvent.EventName.Error;\n const event = shaka.Player.makeEvent_(\n eventName, (new Map()).set('detail', error));\n this.dispatchEvent(event);\n if (event.defaultPrevented) {\n error.handled = true;\n }\n }\n\n /**\n * Load a new font on the page. If the font was already loaded, it does\n * nothing.\n *\n * @param {string} name\n * @param {string} url\n * @export\n */\n async addFont(name, url) {\n if ('fonts' in document && 'FontFace' in window ) {\n await document.fonts.ready;\n if (!('entries' in document.fonts)) {\n return;\n }\n const fontFaceSetIteratorToArray = (target) => {\n const iterable = target.entries();\n const results = [];\n let iterator = iterable.next();\n while (iterator.done === false) {\n results.push(iterator.value);\n iterator = iterable.next();\n }\n return results;\n };\n for (const fontFace of fontFaceSetIteratorToArray(document.fonts)) {\n if (fontFace.family == name && fontFace.display == 'swap') {\n // Font already loaded.\n return;\n }\n }\n const fontFace = new FontFace(name, `url(${url})`, {display: 'swap'});\n document.fonts.add(fontFace);\n }\n }\n\n /**\n * When we fire region events, we need to copy the information out of the\n * region to break the connection with the player's internal data. We do the\n * copy here because this is the transition point between the player and the\n * app.\n *\n * @param {!shaka.util.FakeEvent.EventName} eventName\n * @param {shaka.extern.TimelineRegionInfo} region\n * @param {shaka.util.FakeEventTarget=} eventTarget\n *\n * @private\n */\n onRegionEvent_(eventName, region, eventTarget = this) {\n // Always make a copy to avoid exposing our internal data to the app.\n /** @type {shaka.extern.TimelineRegionInfo} */\n const clone = {\n schemeIdUri: region.schemeIdUri,\n value: region.value,\n startTime: region.startTime,\n endTime: region.endTime,\n id: region.id,\n timescale: region.timescale,\n eventElement: region.eventElement,\n eventNode: region.eventNode,\n };\n\n const data = (new Map()).set('detail', clone);\n eventTarget.dispatchEvent(shaka.Player.makeEvent_(eventName, data));\n }\n\n /**\n * When notified of a media quality change we need to emit a\n * MediaQualityChange event to the app.\n *\n * @param {shaka.extern.MediaQualityInfo} mediaQuality\n * @param {number} position\n * @param {boolean} audioTrackChanged This is to specify whether this should\n * trigger a MediaQualityChangedEvent or an AudioTrackChangedEvent. Defaults\n * to false to trigger MediaQualityChangedEvent.\n *\n * @private\n */\n onMediaQualityChange_(mediaQuality, position, audioTrackChanged = false) {\n // Always make a copy to avoid exposing our internal data to the app.\n const clone = {\n bandwidth: mediaQuality.bandwidth,\n audioSamplingRate: mediaQuality.audioSamplingRate,\n codecs: mediaQuality.codecs,\n contentType: mediaQuality.contentType,\n frameRate: mediaQuality.frameRate,\n height: mediaQuality.height,\n mimeType: mediaQuality.mimeType,\n channelsCount: mediaQuality.channelsCount,\n pixelAspectRatio: mediaQuality.pixelAspectRatio,\n width: mediaQuality.width,\n label: mediaQuality.label,\n roles: mediaQuality.roles,\n language: mediaQuality.language,\n };\n\n const data = new Map()\n .set('mediaQuality', clone)\n .set('position', position);\n\n this.dispatchEvent(shaka.Player.makeEvent_(\n audioTrackChanged ?\n shaka.util.FakeEvent.EventName.AudioTrackChanged :\n shaka.util.FakeEvent.EventName.MediaQualityChanged,\n data));\n }\n\n /**\n * Turn the media element's error object into a Shaka Player error object.\n *\n * @param {boolean=} printAllErrors\n * @return {shaka.util.Error}\n * @private\n */\n videoErrorToShakaError_(printAllErrors = true) {\n goog.asserts.assert(this.video_.error,\n 'Video error expected, but missing!');\n if (!this.video_.error) {\n if (printAllErrors) {\n return new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.VIDEO_ERROR);\n }\n return null;\n }\n\n const code = this.video_.error.code;\n if (!printAllErrors && code == 1 /* MEDIA_ERR_ABORTED */) {\n // Ignore this error code, which should only occur when navigating away or\n // deliberately stopping playback of HTTP content.\n return null;\n }\n\n // Extra error information from MS Edge:\n let extended = this.video_.error.msExtendedCode;\n if (extended) {\n // Convert to unsigned:\n if (extended < 0) {\n extended += Math.pow(2, 32);\n }\n // Format as hex:\n extended = extended.toString(16);\n }\n\n // Extra error information from Chrome:\n const message = this.video_.error.message;\n\n return new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.VIDEO_ERROR,\n code, extended, message);\n }\n\n /**\n * @param {!Event} event\n * @private\n */\n onVideoError_(event) {\n const error = this.videoErrorToShakaError_(/* printAllErrors= */ false);\n if (!error) {\n return;\n }\n this.onError_(error);\n }\n\n /**\n * @param {!Object<string, string>} keyStatusMap A map of hex key IDs to\n * statuses.\n * @private\n */\n onKeyStatus_(keyStatusMap) {\n goog.asserts.assert(this.streamingEngine_, 'Cannot be called in src= mode');\n\n const event = shaka.Player.makeEvent_(\n shaka.util.FakeEvent.EventName.KeyStatusChanged);\n this.dispatchEvent(event);\n\n let keyIds = Object.keys(keyStatusMap);\n if (keyIds.length == 0) {\n shaka.log.warning(\n 'Got a key status event without any key statuses, so we don\\'t ' +\n 'know the real key statuses. If we don\\'t have all the keys, ' +\n 'you\\'ll need to set restrictions so we don\\'t select those tracks.');\n }\n\n // Non-standard version of global key status. Modify it to match standard\n // behavior.\n if (keyIds.length == 1 && keyIds[0] == '') {\n keyIds = ['00'];\n keyStatusMap = {'00': keyStatusMap['']};\n }\n\n // If EME is using a synthetic key ID, the only key ID is '00' (a single 0\n // byte). In this case, it is only used to report global success/failure.\n // See note about old platforms in: https://bit.ly/2tpez5Z\n const isGlobalStatus = keyIds.length == 1 && keyIds[0] == '00';\n if (isGlobalStatus) {\n shaka.log.warning(\n 'Got a synthetic key status event, so we don\\'t know the real key ' +\n 'statuses. If we don\\'t have all the keys, you\\'ll need to set ' +\n 'restrictions so we don\\'t select those tracks.');\n }\n\n const restrictedStatuses = shaka.media.ManifestFilterer.restrictedStatuses;\n let tracksChanged = false;\n\n goog.asserts.assert(this.drmEngine_, 'drmEngine should be non-null here.');\n\n // Only filter tracks for keys if we have some key statuses to look at.\n if (keyIds.length) {\n const currentKeySystem = this.keySystem();\n const clearKeys = shaka.util.MapUtils.asMap(this.config_.drm.clearKeys);\n\n for (const variant of this.manifest_.variants) {\n const streams = shaka.util.StreamUtils.getVariantStreams(variant);\n\n for (const stream of streams) {\n const originalAllowed = variant.allowedByKeySystem;\n\n // Only update if we have key IDs for the stream. If the keys aren't\n // all present, then the track should be restricted.\n if (stream.keyIds.size) {\n // If we are not using clearkeys, and the stream has drmInfos we\n // only want to check the keyIds of the keySystem we are using.\n // Other keySystems might have other keyIds that might not be\n // valid in this case. This can happen in HLS if the manifest\n // has Widevine with keyIds and PlayReady without keyIds and we are\n // using PlayReady.\n if (stream.drmInfos.length && !clearKeys.size) {\n for (const drmInfo of stream.drmInfos) {\n if (drmInfo.keyIds.size &&\n drmInfo.keySystem == currentKeySystem) {\n variant.allowedByKeySystem = true;\n\n for (const keyId of drmInfo.keyIds) {\n const keyStatus =\n keyStatusMap[isGlobalStatus ? '00' : keyId];\n if (keyStatus || this.drmEngine_.hasManifestInitData()) {\n variant.allowedByKeySystem =\n variant.allowedByKeySystem &&\n !!keyStatus &&\n !restrictedStatuses.includes(keyStatus);\n } // if (keyStatus || this.drmEngine_.hasManifestInitData())\n } // for (const keyId of drmInfo.keyIds)\n } // if (drmInfo.keyIds.size && ...\n } // for (const drmInfo of stream.drmInfos\n } else {\n variant.allowedByKeySystem = true;\n\n for (const keyId of stream.keyIds) {\n const keyStatus = keyStatusMap[isGlobalStatus ? '00' : keyId];\n if (keyStatus || this.drmEngine_.hasManifestInitData()) {\n variant.allowedByKeySystem = variant.allowedByKeySystem &&\n !!keyStatus && !restrictedStatuses.includes(keyStatus);\n }\n } // for (const keyId of stream.keyIds)\n } // if (stream.drmInfos.length && !clearKeys.size)\n } // if (stream.keyIds.size)\n\n if (originalAllowed != variant.allowedByKeySystem) {\n tracksChanged = true;\n }\n } // for (const stream of streams)\n } // for (const variant of this.manifest_.variants)\n } // if (keyIds.size)\n\n if (tracksChanged) {\n this.onTracksChanged_();\n const variantsUpdated = this.updateAbrManagerVariants_();\n if (!variantsUpdated) {\n return;\n }\n }\n\n const currentVariant = this.streamingEngine_.getCurrentVariant();\n if (currentVariant && !currentVariant.allowedByKeySystem) {\n shaka.log.debug('Choosing new streams after key status changed');\n this.chooseVariantAndSwitch_();\n }\n }\n\n /**\n * @return {boolean} true if we should stream text right now.\n * @private\n */\n shouldStreamText_() {\n return this.config_.streaming.alwaysStreamText || this.isTextTrackVisible();\n }\n\n /**\n * Applies playRangeStart and playRangeEnd to the given timeline. This will\n * only affect non-live content.\n *\n * @param {shaka.media.PresentationTimeline} timeline\n * @param {number} playRangeStart\n * @param {number} playRangeEnd\n *\n * @private\n */\n static applyPlayRange_(timeline, playRangeStart, playRangeEnd) {\n if (playRangeStart > 0) {\n if (timeline.isLive()) {\n shaka.log.warning(\n '|playRangeStart| has been configured for live content. ' +\n 'Ignoring the setting.');\n } else {\n timeline.setUserSeekStart(playRangeStart);\n }\n }\n\n // If the playback has been configured to end before the end of the\n // presentation, update the duration unless it's live content.\n const fullDuration = timeline.getDuration();\n if (playRangeEnd < fullDuration) {\n if (timeline.isLive()) {\n shaka.log.warning(\n '|playRangeEnd| has been configured for live content. ' +\n 'Ignoring the setting.');\n } else {\n timeline.setDuration(playRangeEnd);\n }\n }\n }\n\n /**\n * Fire an event, but wait a little bit so that the immediate execution can\n * complete before the event is handled.\n *\n * @param {!shaka.util.FakeEvent} event\n * @private\n */\n async delayDispatchEvent_(event) {\n // Wait until the next interpreter cycle.\n await Promise.resolve();\n\n // Only dispatch the event if we are still alive.\n if (this.loadMode_ != shaka.Player.LoadMode.DESTROYED) {\n this.dispatchEvent(event);\n }\n }\n\n /**\n * Get the normalized languages for a group of tracks.\n *\n * @param {!Array<?shaka.extern.Track>} tracks\n * @return {!Set<string>}\n * @private\n */\n static getLanguagesFrom_(tracks) {\n const languages = new Set();\n\n for (const track of tracks) {\n if (track.language) {\n languages.add(shaka.util.LanguageUtils.normalize(track.language));\n } else {\n languages.add('und');\n }\n }\n\n return languages;\n }\n\n /**\n * Get all permutations of normalized languages and role for a group of\n * tracks.\n *\n * @param {!Array<?shaka.extern.Track>} tracks\n * @return {!Array<shaka.extern.LanguageRole>}\n * @private\n */\n static getLanguageAndRolesFrom_(tracks) {\n /** @type {!Map<string, !Set>} */\n const languageToRoles = new Map();\n /** @type {!Map<string, !Map<string, string>>} */\n const languageRoleToLabel = new Map();\n\n for (const track of tracks) {\n let language = 'und';\n let roles = [];\n\n if (track.language) {\n language = shaka.util.LanguageUtils.normalize(track.language);\n }\n\n if (track.type == 'variant') {\n roles = track.audioRoles;\n } else {\n roles = track.roles;\n }\n\n if (!roles || !roles.length) {\n // We must have an empty role so that we will still get a language-role\n // entry from our Map.\n roles = [''];\n }\n\n if (!languageToRoles.has(language)) {\n languageToRoles.set(language, new Set());\n }\n\n for (const role of roles) {\n languageToRoles.get(language).add(role);\n if (track.label) {\n if (!languageRoleToLabel.has(language)) {\n languageRoleToLabel.set(language, new Map());\n }\n languageRoleToLabel.get(language).set(role, track.label);\n }\n }\n }\n\n // Flatten our map to an array of language-role pairs.\n const pairings = [];\n languageToRoles.forEach((roles, language) => {\n for (const role of roles) {\n let label = null;\n if (languageRoleToLabel.has(language) &&\n languageRoleToLabel.get(language).has(role)) {\n label = languageRoleToLabel.get(language).get(role);\n }\n pairings.push({language, role, label});\n }\n });\n return pairings;\n }\n\n /**\n * Assuming the player is playing content with media source, check if the\n * player has buffered enough content to make it to the end of the\n * presentation.\n *\n * @return {boolean}\n * @private\n */\n isBufferedToEndMS_() {\n goog.asserts.assert(\n this.video_,\n 'We need a video element to get buffering information');\n goog.asserts.assert(\n this.mediaSourceEngine_,\n 'We need a media source engine to get buffering information');\n goog.asserts.assert(\n this.manifest_,\n 'We need a manifest to get buffering information');\n\n // This is a strong guarantee that we are buffered to the end, because it\n // means the playhead is already at that end.\n if (this.isEnded()) {\n return true;\n }\n\n // This means that MediaSource has buffered the final segment in all\n // SourceBuffers and is no longer accepting additional segments.\n if (this.mediaSourceEngine_.ended()) {\n return true;\n }\n\n // Live streams are \"buffered to the end\" when they have buffered to the\n // live edge or beyond (into the region covered by the presentation delay).\n if (this.manifest_.presentationTimeline.isLive()) {\n const liveEdge =\n this.manifest_.presentationTimeline.getSegmentAvailabilityEnd();\n const bufferEnd =\n shaka.media.TimeRangesUtils.bufferEnd(this.video_.buffered);\n\n if (bufferEnd != null && bufferEnd >= liveEdge) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Assuming the player is playing content with src=, check if the player has\n * buffered enough content to make it to the end of the presentation.\n *\n * @return {boolean}\n * @private\n */\n isBufferedToEndSrc_() {\n goog.asserts.assert(\n this.video_,\n 'We need a video element to get buffering information');\n\n // This is a strong guarantee that we are buffered to the end, because it\n // means the playhead is already at that end.\n if (this.isEnded()) {\n return true;\n }\n\n // If we have buffered to the duration of the content, it means we will have\n // enough content to buffer to the end of the presentation.\n const bufferEnd =\n shaka.media.TimeRangesUtils.bufferEnd(this.video_.buffered);\n\n // Because Safari's native HLS reports slightly inaccurate values for\n // bufferEnd here, we use a fudge factor. Without this, we can end up in a\n // buffering state at the end of the stream. See issue #2117.\n const fudge = 1; // 1000 ms\n return bufferEnd != null && bufferEnd >= this.video_.duration - fudge;\n }\n\n /**\n * Create an error for when we purposely interrupt a load operation.\n *\n * @return {!shaka.util.Error}\n * @private\n */\n createAbortLoadError_() {\n return new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.PLAYER,\n shaka.util.Error.Code.LOAD_INTERRUPTED);\n }\n\n /**\n * Indicate if we are using remote playback.\n *\n * @return {boolean}\n * @export\n */\n isRemotePlayback() {\n if (!this.video_ || !this.video_.remote) {\n return false;\n }\n return this.video_.remote.state != 'disconnected';\n }\n\n /**\n * Indicate if the video has ended.\n *\n * @return {boolean}\n * @export\n */\n isEnded() {\n if (!this.video_ || this.video_.ended) {\n return true;\n }\n return this.fullyLoaded_ && !this.isLive() &&\n this.video_.currentTime >= this.seekRange().end;\n }\n};\n\n/**\n * In order to know what method of loading the player used for some content, we\n * have this enum. It lets us know if content has not been loaded, loaded with\n * media source, or loaded with src equals.\n *\n * This enum has a low resolution, because it is only meant to express the\n * outer limits of the various states that the player is in. For example, when\n * someone calls a public method on player, it should not matter if they have\n * initialized drm engine, it should only matter if they finished loading\n * content.\n *\n * @enum {number}\n * @export\n */\nshaka.Player.LoadMode = {\n 'DESTROYED': 0,\n 'NOT_LOADED': 1,\n 'MEDIA_SOURCE': 2,\n 'SRC_EQUALS': 3,\n};\n\n/**\n * The typical buffering threshold. When we have less than this buffered (in\n * seconds), we enter a buffering state. This specific value is based on manual\n * testing and evaluation across a variety of platforms.\n *\n * To make the buffering logic work in all cases, this \"typical\" threshold will\n * be overridden if the rebufferingGoal configuration is too low.\n *\n * @const {number}\n * @private\n */\nshaka.Player.TYPICAL_BUFFERING_THRESHOLD_ = 0.5;\n\n/**\n * @define {string} A version number taken from git at compile time.\n * @export\n */\n// eslint-disable-next-line no-useless-concat\nshaka.Player.version = 'v4.14.3' + '-uncompiled'; // x-release-please-version\n\n// Initialize the deprecation system using the version string we just set\n// on the player.\nshaka.Deprecate.init(shaka.Player.version);\n\n\n/** @private {!Map<string, function(): *>} */\nshaka.Player.supportPlugins_ = new Map();\n\n\n/** @private {?shaka.extern.IAdManager.Factory} */\nshaka.Player.adManagerFactory_ = null;\n\n\n/**\n * @const {string}\n */\nshaka.Player.TextTrackLabel = 'Shaka Player TextTrack';\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.config.CodecSwitchingStrategy');\n\n/**\n * @enum {string}\n * @export\n */\nshaka.config.CodecSwitchingStrategy = {\n /**\n * Allow codec switching which will always involve reloading\n * the <code<MediaSource</code>.\n */\n 'RELOAD': 'reload',\n /**\n * Allow codec switching; determine if <code>SourceBuffer.changeType</code>\n * is available and attempt to use this first, but fall back to reloading\n * <code>MediaSource</code> if not available.\n * <br>\n * Note: Some devices that support <code>SourceBuffer.changeType</code> can\n * become stuck in a pause state.\n */\n 'SMOOTH': 'smooth',\n};\n","/*! @license\n * Shaka Player\n * Copyright 2023 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.media.ManifestFilterer');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.drm.DrmEngine');\ngoog.require('shaka.util.StreamUtils');\ngoog.require('shaka.util.Error');\n\n/**\n * A class that handles the filtering of manifests.\n * Allows for manifest filtering to be done both by the player and by a\n * preload manager.\n */\nshaka.media.ManifestFilterer = class {\n /**\n * @param {?shaka.extern.PlayerConfiguration} config\n * @param {shaka.extern.Resolution} maxHwRes\n * @param {?shaka.drm.DrmEngine} drmEngine\n */\n constructor(config, maxHwRes, drmEngine) {\n goog.asserts.assert(config, 'Must have config');\n\n /** @private {!shaka.extern.PlayerConfiguration} */\n this.config_ = config;\n\n /** @private {shaka.extern.Resolution} */\n this.maxHwRes_ = maxHwRes;\n\n /** @private {?shaka.drm.DrmEngine} drmEngine */\n this.drmEngine_ = drmEngine;\n }\n\n /** @param {!shaka.drm.DrmEngine} drmEngine */\n setDrmEngine(drmEngine) {\n this.drmEngine_ = drmEngine;\n }\n\n /**\n * Filters a manifest, removing unplayable streams/variants and choosing\n * the codecs.\n *\n * @param {?shaka.extern.Manifest} manifest\n * @return {!Promise<boolean>} tracksChanged\n */\n async filterManifest(manifest) {\n goog.asserts.assert(manifest, 'Manifest should exist!');\n await shaka.util.StreamUtils.filterManifest(this.drmEngine_, manifest,\n this.config_.drm.preferredKeySystems,\n this.config_.drm.keySystemsMapping);\n if (!this.config_.streaming.dontChooseCodecs) {\n shaka.util.StreamUtils.chooseCodecsAndFilterManifest(\n manifest,\n this.config_.preferredVideoCodecs,\n this.config_.preferredAudioCodecs,\n this.config_.preferredDecodingAttributes,\n this.config_.preferredTextFormats);\n }\n this.checkPlayableVariants_(manifest);\n return this.filterManifestWithRestrictions(manifest);\n }\n\n\n /**\n * @param {?shaka.extern.Manifest} manifest\n * @return {boolean} tracksChanged\n */\n applyRestrictions(manifest) {\n return shaka.util.StreamUtils.applyRestrictions(\n manifest.variants, this.config_.restrictions, this.maxHwRes_);\n }\n\n\n /**\n * Apply the restrictions configuration to the manifest, and check if there's\n * a variant that meets the restrictions.\n *\n * @param {?shaka.extern.Manifest} manifest\n * @return {boolean} tracksChanged\n */\n filterManifestWithRestrictions(manifest) {\n const tracksChanged = this.applyRestrictions(manifest);\n\n if (manifest) {\n // We may need to create new sessions for any new init data.\n const currentDrmInfo =\n this.drmEngine_ ? this.drmEngine_.getDrmInfo() : null;\n // DrmEngine.newInitData() requires mediaKeys to be available.\n if (currentDrmInfo && this.drmEngine_.getMediaKeys()) {\n for (const variant of manifest.variants) {\n this.processDrmInfos(currentDrmInfo.keySystem, variant.video);\n this.processDrmInfos(currentDrmInfo.keySystem, variant.audio);\n }\n }\n this.checkRestrictedVariants(manifest);\n }\n\n return tracksChanged;\n }\n\n /**\n * Confirm some variants are playable. Otherwise, throw an exception.\n * @param {!shaka.extern.Manifest} manifest\n * @private\n */\n checkPlayableVariants_(manifest) {\n const valid = manifest.variants.some(shaka.util.StreamUtils.isPlayable);\n\n // If none of the variants are playable, throw\n // CONTENT_UNSUPPORTED_BY_BROWSER.\n if (!valid) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.CONTENT_UNSUPPORTED_BY_BROWSER);\n }\n }\n\n /**\n * @param {string} keySystem\n * @param {?shaka.extern.Stream} stream\n */\n processDrmInfos(keySystem, stream) {\n if (!stream) {\n return;\n }\n\n for (const drmInfo of stream.drmInfos) {\n // Ignore any data for different key systems.\n if (drmInfo.keySystem == keySystem) {\n for (const initData of (drmInfo.initData || [])) {\n this.drmEngine_.newInitData(\n initData.initDataType, initData.initData);\n }\n }\n }\n }\n\n /**\n * Checks if the variants are all restricted, and throw an appropriate\n * exception if so.\n *\n * @param {shaka.extern.Manifest} manifest\n */\n checkRestrictedVariants(manifest) {\n const restrictedStatuses = shaka.media.ManifestFilterer.restrictedStatuses;\n const keyStatusMap =\n this.drmEngine_ ? this.drmEngine_.getKeyStatuses() : {};\n const keyIds = Object.keys(keyStatusMap);\n const isGlobalStatus = keyIds.length && keyIds[0] == '00';\n\n let hasPlayable = false;\n let hasAppRestrictions = false;\n\n /** @type {!Set<string>} */\n const missingKeys = new Set();\n\n /** @type {!Set<string>} */\n const badKeyStatuses = new Set();\n\n for (const variant of manifest.variants) {\n // TODO: Combine with onKeyStatus_.\n const streams = [];\n if (variant.audio) {\n streams.push(variant.audio);\n }\n if (variant.video) {\n streams.push(variant.video);\n }\n\n for (const stream of streams) {\n if (stream.keyIds.size) {\n for (const keyId of stream.keyIds) {\n const keyStatus = keyStatusMap[isGlobalStatus ? '00' : keyId];\n if (!keyStatus) {\n missingKeys.add(keyId);\n } else if (restrictedStatuses.includes(keyStatus)) {\n badKeyStatuses.add(keyStatus);\n }\n }\n } // if (stream.keyIds.size)\n }\n\n if (!variant.allowedByApplication) {\n hasAppRestrictions = true;\n } else if (variant.allowedByKeySystem) {\n hasPlayable = true;\n }\n }\n\n if (!hasPlayable) {\n /** @type {shaka.extern.RestrictionInfo} */\n const data = {\n hasAppRestrictions,\n missingKeys: Array.from(missingKeys),\n restrictedKeyStatuses: Array.from(badKeyStatuses),\n };\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.RESTRICTIONS_CANNOT_BE_MET,\n data);\n }\n }\n};\n\n/**\n * These are the EME key statuses that represent restricted playback.\n * 'usable', 'released', 'output-downscaled', 'status-pending' are statuses\n * of the usable keys. 'expired' status is being handled separately in\n * DrmEngine.\n *\n * @const {!Array<string>}\n */\nshaka.media.ManifestFilterer.restrictedStatuses =\n ['output-restricted', 'internal-error'];\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.media.ManifestParser');\n\ngoog.require('shaka.Deprecate');\ngoog.require('shaka.log');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.Platform');\n\n\n// TODO: revisit this when Closure Compiler supports partially-exported classes.\n/**\n * @summary An interface to register manifest parsers.\n * @export\n */\nshaka.media.ManifestParser = class {\n /**\n * Registers a manifest parser by file extension.\n *\n * @param {string} extension The file extension of the manifest.\n * @param {shaka.extern.ManifestParser.Factory} parserFactory The factory\n * used to create parser instances.\n * @export\n */\n static registerParserByExtension(extension, parserFactory) {\n shaka.Deprecate.deprecateFeature(5,\n 'ManifestParser.registerParserByExtension',\n 'Please use an ManifestParser with registerParserByMime function.');\n }\n\n\n /**\n * Registers a manifest parser by MIME type.\n *\n * @param {string} mimeType The MIME type of the manifest.\n * @param {shaka.extern.ManifestParser.Factory} parserFactory The factory\n * used to create parser instances.\n * @export\n */\n static registerParserByMime(mimeType, parserFactory) {\n shaka.media.ManifestParser.parsersByMime.set(mimeType, parserFactory);\n }\n\n /**\n * Unregisters a manifest parser by MIME type.\n *\n * @param {string} mimeType The MIME type of the manifest.\n * @export\n */\n static unregisterParserByMime(mimeType) {\n shaka.media.ManifestParser.parsersByMime.delete(mimeType);\n }\n\n\n /**\n * Returns a map of manifest support for well-known types.\n *\n * @return {!Object<string, boolean>}\n */\n static probeSupport() {\n const ManifestParser = shaka.media.ManifestParser;\n const support = {};\n\n // Make sure all registered parsers are shown, but only for MSE-enabled\n // platforms where our parsers matter.\n if (shaka.util.Platform.supportsMediaSource()) {\n for (const type of ManifestParser.parsersByMime.keys()) {\n support[type] = true;\n }\n }\n\n // Make sure all well-known types are tested as well, just to show an\n // explicit false for things people might be expecting.\n const testMimeTypes = [\n // DASH\n 'application/dash+xml',\n // HLS\n 'application/x-mpegurl',\n 'application/vnd.apple.mpegurl',\n // SmoothStreaming\n 'application/vnd.ms-sstr+xml',\n ];\n\n for (const type of testMimeTypes) {\n // Only query our parsers for MSE-enabled platforms. Otherwise, query a\n // temporary media element for native support for these types.\n if (shaka.util.Platform.supportsMediaSource()) {\n support[type] = ManifestParser.parsersByMime.has(type);\n } else {\n support[type] = shaka.util.Platform.supportsMediaType(type);\n }\n }\n\n return support;\n }\n\n\n /**\n * Get a factory that can create a manifest parser that should be able to\n * parse the manifest at |uri|.\n *\n * @param {string} uri\n * @param {?string} mimeType\n * @return {shaka.extern.ManifestParser.Factory}\n */\n static getFactory(uri, mimeType) {\n const ManifestParser = shaka.media.ManifestParser;\n\n // Try using the MIME type we were given.\n if (mimeType) {\n const factory = ManifestParser.parsersByMime.get(mimeType.toLowerCase());\n if (factory) {\n return factory;\n }\n\n shaka.log.warning(\n 'Could not determine manifest type using MIME type ', mimeType);\n }\n\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.UNABLE_TO_GUESS_MANIFEST_TYPE,\n uri,\n mimeType);\n }\n\n\n /**\n * Determines whether or not the MIME type is supported by our own\n * manifest parsers on this platform. This takes into account whether or not\n * MediaSource is available, as well as which parsers are registered to the\n * system.\n *\n * @param {string} mimeType\n * @return {boolean}\n */\n static isSupported(mimeType) {\n // Without MediaSource, our own parsers are useless.\n if (!shaka.util.Platform.supportsMediaSource()) {\n return false;\n }\n\n return shaka.media.ManifestParser.parsersByMime.has(mimeType);\n }\n};\n\n\n/**\n * @const {string}\n */\nshaka.media.ManifestParser.HLS = 'HLS';\n\n\n/**\n * @const {string}\n */\nshaka.media.ManifestParser.DASH = 'DASH';\n\n\n/**\n * @const {string}\n */\nshaka.media.ManifestParser.MSS = 'MSS';\n\n\n/**\n * @const {string}\n */\nshaka.media.ManifestParser.UNKNOWN = 'UNKNOWN';\n\n\n/**\n * @enum {string}\n * @export\n */\nshaka.media.ManifestParser.AccessibilityPurpose = {\n VISUALLY_IMPAIRED: 'visually impaired',\n HARD_OF_HEARING: 'hard of hearing',\n};\n\n\n/**\n * Contains the parser factory functions indexed by MIME type.\n *\n * @type {!Map<string, shaka.extern.ManifestParser.Factory>}\n */\nshaka.media.ManifestParser.parsersByMime = new Map();\n\n\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.media.ContentWorkarounds');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.log');\ngoog.require('shaka.util.BufferUtils');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.Lazy');\ngoog.require('shaka.util.Mp4Parser');\ngoog.require('shaka.util.Platform');\ngoog.require('shaka.util.Uint8ArrayUtils');\n\n\n/**\n * @summary\n * A collection of methods to work around content issues on various platforms.\n */\nshaka.media.ContentWorkarounds = class {\n /**\n * Transform the init segment into a new init segment buffer that indicates\n * encryption. If the init segment already indicates encryption, return the\n * original init segment.\n *\n * Should only be called for MP4 init segments, and only on platforms that\n * need this workaround.\n *\n * @param {!BufferSource} initSegmentBuffer\n * @param {?string} uri\n * @return {!Uint8Array}\n * @see https://github.com/shaka-project/shaka-player/issues/2759\n */\n static fakeEncryption(initSegmentBuffer, uri) {\n const ContentWorkarounds = shaka.media.ContentWorkarounds;\n const initSegment = shaka.util.BufferUtils.toUint8(initSegmentBuffer);\n let modifiedInitSegment = initSegment;\n let isEncrypted = false;\n /** @type {shaka.extern.ParsedBox} */\n let stsdBox;\n const ancestorBoxes = [];\n\n const onSimpleAncestorBox = (box) => {\n ancestorBoxes.push(box);\n shaka.util.Mp4Parser.children(box);\n };\n\n const onEncryptionMetadataBox = (box) => {\n isEncrypted = true;\n };\n\n // Multiplexed content could have multiple boxes that we need to modify.\n // Add to this array in order of box offset. This will be important later,\n // when we process the boxes.\n /** @type {!Array<{box: shaka.extern.ParsedBox, newType: number}>} */\n const boxesToModify = [];\n\n const pushEncv = (box) => {\n boxesToModify.push({\n box,\n newType: ContentWorkarounds.BOX_TYPE_ENCV_,\n });\n };\n\n const pushEnca = (box) => {\n boxesToModify.push({\n box,\n newType: ContentWorkarounds.BOX_TYPE_ENCA_,\n });\n };\n\n new shaka.util.Mp4Parser()\n .box('moov', onSimpleAncestorBox)\n .box('trak', onSimpleAncestorBox)\n .box('mdia', onSimpleAncestorBox)\n .box('minf', onSimpleAncestorBox)\n .box('stbl', onSimpleAncestorBox)\n .fullBox('stsd', (box) => {\n stsdBox = box;\n ancestorBoxes.push(box);\n shaka.util.Mp4Parser.sampleDescription(box);\n })\n .fullBox('encv', onEncryptionMetadataBox)\n .fullBox('enca', onEncryptionMetadataBox)\n .fullBox('dvav', pushEncv)\n .fullBox('dva1', pushEncv)\n .fullBox('dvh1', pushEncv)\n .fullBox('dvhe', pushEncv)\n .fullBox('dvc1', pushEncv)\n .fullBox('dvi1', pushEncv)\n .fullBox('hev1', pushEncv)\n .fullBox('hvc1', pushEncv)\n .fullBox('avc1', pushEncv)\n .fullBox('avc3', pushEncv)\n .fullBox('ac-3', pushEnca)\n .fullBox('ec-3', pushEnca)\n .fullBox('ac-4', pushEnca)\n .fullBox('Opus', pushEnca)\n .fullBox('fLaC', pushEnca)\n .fullBox('mp4a', pushEnca)\n .parse(initSegment);\n\n if (isEncrypted) {\n shaka.log.debug('Init segment already indicates encryption.');\n return initSegment;\n }\n\n if (boxesToModify.length == 0 || !stsdBox) {\n shaka.log.error('Failed to find boxes needed to fake encryption!');\n shaka.log.v2('Failed init segment (hex):',\n shaka.util.Uint8ArrayUtils.toHex(initSegment));\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.CONTENT_TRANSFORMATION_FAILED,\n uri);\n }\n\n // Modify boxes in order from largest offset to smallest, so that earlier\n // boxes don't have their offsets changed before we process them.\n boxesToModify.reverse(); // in place!\n for (const workItem of boxesToModify) {\n const insertedBoxType =\n shaka.util.Mp4Parser.typeToString(workItem.newType);\n shaka.log.debug(`Inserting \"${insertedBoxType}\" box into init segment.`);\n modifiedInitSegment = ContentWorkarounds.insertEncryptionMetadata_(\n modifiedInitSegment, stsdBox, workItem.box, ancestorBoxes,\n workItem.newType);\n }\n\n // Edge Windows needs the unmodified init segment to be appended after the\n // patched one, otherwise video element throws following error:\n // CHUNK_DEMUXER_ERROR_APPEND_FAILED: Sample encryption info is not\n // available.\n if (shaka.util.Platform.isEdge() && shaka.util.Platform.isWindows() &&\n !shaka.util.Platform.isXboxOne()) {\n const doubleInitSegment = new Uint8Array(initSegment.byteLength +\n modifiedInitSegment.byteLength);\n doubleInitSegment.set(modifiedInitSegment);\n doubleInitSegment.set(initSegment, modifiedInitSegment.byteLength);\n return doubleInitSegment;\n }\n\n return modifiedInitSegment;\n }\n\n /**\n * Insert an encryption metadata box (\"encv\" or \"enca\" box) into the MP4 init\n * segment, based on the source box (\"mp4a\", \"avc1\", etc). Returns a new\n * buffer containing the modified init segment.\n *\n * @param {!Uint8Array} initSegment\n * @param {shaka.extern.ParsedBox} stsdBox\n * @param {shaka.extern.ParsedBox} sourceBox\n * @param {!Array<shaka.extern.ParsedBox>} ancestorBoxes\n * @param {number} metadataBoxType\n * @return {!Uint8Array}\n * @private\n */\n static insertEncryptionMetadata_(\n initSegment, stsdBox, sourceBox, ancestorBoxes, metadataBoxType) {\n const ContentWorkarounds = shaka.media.ContentWorkarounds;\n const metadataBoxArray = ContentWorkarounds.createEncryptionMetadata_(\n initSegment, sourceBox, metadataBoxType);\n\n // Construct a new init segment array with room for the encryption metadata\n // box we're adding.\n const newInitSegment =\n new Uint8Array(initSegment.byteLength + metadataBoxArray.byteLength);\n\n // For Xbox One & Edge, we cut and insert at the start of the source box.\n // For other platforms, we cut and insert at the end of the source box. It's\n // not clear why this is necessary on Xbox One, but it seems to be evidence\n // of another bug in the firmware implementation of MediaSource & EME.\n const cutPoint =\n (shaka.util.Platform.isXboxOne() || shaka.util.Platform.isEdge()) ?\n sourceBox.start :\n sourceBox.start + sourceBox.size;\n\n // The data before the cut point will be copied to the same location as\n // before. The data after that will be appended after the added metadata\n // box.\n const beforeData = initSegment.subarray(0, cutPoint);\n const afterData = initSegment.subarray(cutPoint);\n\n newInitSegment.set(beforeData);\n newInitSegment.set(metadataBoxArray, cutPoint);\n newInitSegment.set(afterData, cutPoint + metadataBoxArray.byteLength);\n\n // The parents up the chain from the encryption metadata box need their\n // sizes adjusted to account for the added box. These offsets should not be\n // changed, because they should all be within the first section we copy.\n for (const box of ancestorBoxes) {\n goog.asserts.assert(box.start < cutPoint,\n 'Ancestor MP4 box found in the wrong location! ' +\n 'Modified init segment will not make sense!');\n ContentWorkarounds.updateBoxSize_(\n newInitSegment, box.start, box.size + metadataBoxArray.byteLength);\n }\n\n // Add one to the sample entries field of the \"stsd\" box. This is a 4-byte\n // field just past the box header.\n const stsdBoxView = shaka.util.BufferUtils.toDataView(\n newInitSegment, stsdBox.start);\n const stsdBoxHeaderSize = shaka.util.Mp4Parser.headerSize(stsdBox);\n const numEntries = stsdBoxView.getUint32(stsdBoxHeaderSize);\n stsdBoxView.setUint32(stsdBoxHeaderSize, numEntries + 1);\n\n return newInitSegment;\n }\n\n /**\n * Create an encryption metadata box (\"encv\" or \"enca\" box), based on the\n * source box (\"mp4a\", \"avc1\", etc). Returns a new buffer containing the\n * encryption metadata box.\n *\n * @param {!Uint8Array} initSegment\n * @param {shaka.extern.ParsedBox} sourceBox\n * @param {number} metadataBoxType\n * @return {!Uint8Array}\n * @private\n */\n static createEncryptionMetadata_(initSegment, sourceBox, metadataBoxType) {\n const ContentWorkarounds = shaka.media.ContentWorkarounds;\n const sinfBoxArray = ContentWorkarounds.CANNED_SINF_BOX_.value();\n\n // Create a subarray which points to the source box data.\n const sourceBoxArray = initSegment.subarray(\n /* start= */ sourceBox.start,\n /* end= */ sourceBox.start + sourceBox.size);\n\n // Create a view on the source box array.\n const sourceBoxView = shaka.util.BufferUtils.toDataView(sourceBoxArray);\n\n // Create an array to hold the new encryption metadata box, which is based\n // on the source box.\n const metadataBoxArray = new Uint8Array(\n sourceBox.size + sinfBoxArray.byteLength);\n\n // Copy the source box into the new array.\n metadataBoxArray.set(sourceBoxArray, /* targetOffset= */ 0);\n\n // Change the box type.\n const metadataBoxView = shaka.util.BufferUtils.toDataView(metadataBoxArray);\n metadataBoxView.setUint32(\n ContentWorkarounds.BOX_TYPE_OFFSET_, metadataBoxType);\n\n // Append the \"sinf\" box to the encryption metadata box.\n metadataBoxArray.set(sinfBoxArray, /* targetOffset= */ sourceBox.size);\n\n // Update the \"sinf\" box's format field (in the child \"frma\" box) to reflect\n // the format of the original source box.\n const sourceBoxType = sourceBoxView.getUint32(\n ContentWorkarounds.BOX_TYPE_OFFSET_);\n metadataBoxView.setUint32(\n sourceBox.size + ContentWorkarounds.CANNED_SINF_BOX_FORMAT_OFFSET_,\n sourceBoxType);\n\n // Now update the encryption metadata box size.\n ContentWorkarounds.updateBoxSize_(\n metadataBoxArray, /* boxStart= */ 0, metadataBoxArray.byteLength);\n\n return metadataBoxArray;\n }\n\n /**\n * Modify an MP4 box's size field in-place.\n *\n * @param {!Uint8Array} dataArray\n * @param {number} boxStart The start position of the box in dataArray.\n * @param {number} newBoxSize The new size of the box.\n * @private\n */\n static updateBoxSize_(dataArray, boxStart, newBoxSize) {\n const ContentWorkarounds = shaka.media.ContentWorkarounds;\n const boxView = shaka.util.BufferUtils.toDataView(dataArray, boxStart);\n const sizeField = boxView.getUint32(ContentWorkarounds.BOX_SIZE_OFFSET_);\n if (sizeField == 0) { // Means \"the rest of the box\".\n // No adjustment needed for this box.\n } else if (sizeField == 1) { // Means \"use 64-bit size box\".\n // Set the 64-bit int in two 32-bit parts.\n // The high bits should definitely be 0 in practice, but we're being\n // thorough here.\n boxView.setUint32(ContentWorkarounds.BOX_SIZE_64_OFFSET_,\n newBoxSize >> 32);\n boxView.setUint32(ContentWorkarounds.BOX_SIZE_64_OFFSET_ + 4,\n newBoxSize & 0xffffffff);\n } else { // Normal 32-bit size field.\n // Not checking the size of the value here, since a box larger than 4GB is\n // unrealistic.\n boxView.setUint32(ContentWorkarounds.BOX_SIZE_OFFSET_, newBoxSize);\n }\n }\n\n /**\n * Transform the init segment into a new init segment buffer that indicates\n * EC-3 as audio codec instead of AC-3. Even though any EC-3 decoder should\n * be able to decode AC-3 streams, there are platforms that do not accept\n * AC-3 as codec.\n *\n * Should only be called for MP4 init segments, and only on platforms that\n * need this workaround. Returns a new buffer containing the modified init\n * segment.\n *\n * @param {!BufferSource} initSegmentBuffer\n * @return {!Uint8Array}\n */\n static fakeEC3(initSegmentBuffer) {\n const ContentWorkarounds = shaka.media.ContentWorkarounds;\n const initSegment = shaka.util.BufferUtils.toUint8(initSegmentBuffer);\n const ancestorBoxes = [];\n\n const onSimpleAncestorBox = (box) => {\n ancestorBoxes.push({start: box.start, size: box.size});\n shaka.util.Mp4Parser.children(box);\n };\n\n new shaka.util.Mp4Parser()\n .box('moov', onSimpleAncestorBox)\n .box('trak', onSimpleAncestorBox)\n .box('mdia', onSimpleAncestorBox)\n .box('minf', onSimpleAncestorBox)\n .box('stbl', onSimpleAncestorBox)\n .box('stsd', (box) => {\n ancestorBoxes.push({start: box.start, size: box.size});\n const stsdBoxView = shaka.util.BufferUtils.toDataView(\n initSegment, box.start);\n // \"size - 3\" is because we immediately read a uint32.\n for (let i = 0; i < box.size -3; i++) {\n const codecTag = stsdBoxView.getUint32(i);\n if (codecTag == ContentWorkarounds.BOX_TYPE_AC_3_) {\n stsdBoxView.setUint32(i, ContentWorkarounds.BOX_TYPE_EC_3_);\n } else if (codecTag == ContentWorkarounds.BOX_TYPE_DAC3_) {\n stsdBoxView.setUint32(i, ContentWorkarounds.BOX_TYPE_DEC3_);\n }\n }\n }).parse(initSegment);\n\n return initSegment;\n }\n};\n\n/**\n * A canned \"sinf\" box for use when adding fake encryption metadata to init\n * segments.\n *\n * @const {!shaka.util.Lazy.<!Uint8Array>}\n * @private\n * @see https://github.com/shaka-project/shaka-player/issues/2759\n */\nshaka.media.ContentWorkarounds.CANNED_SINF_BOX_ =\n new shaka.util.Lazy(() => new Uint8Array([\n // sinf box\n // Size: 0x50 = 80\n 0x00, 0x00, 0x00, 0x50,\n\n // Type: sinf\n 0x73, 0x69, 0x6e, 0x66,\n\n // Children of sinf...\n\n // frma box\n // Size: 0x0c = 12\n 0x00, 0x00, 0x00, 0x0c,\n\n // Type: frma (child of sinf)\n 0x66, 0x72, 0x6d, 0x61,\n\n // Format: filled in later based on the source box (\"avc1\", \"mp4a\", etc)\n 0x00, 0x00, 0x00, 0x00,\n // end of frma box\n\n // schm box\n // Size: 0x14 = 20\n 0x00, 0x00, 0x00, 0x14,\n\n // Type: schm (child of sinf)\n 0x73, 0x63, 0x68, 0x6d,\n\n // Version: 0, Flags: 0\n 0x00, 0x00, 0x00, 0x00,\n\n // Scheme: cenc\n 0x63, 0x65, 0x6e, 0x63,\n\n // Scheme version: 1.0\n 0x00, 0x01, 0x00, 0x00,\n // end of schm box\n\n // schi box\n // Size: 0x28 = 40\n 0x00, 0x00, 0x00, 0x28,\n\n // Type: schi (child of sinf)\n 0x73, 0x63, 0x68, 0x69,\n\n // Children of schi...\n\n // tenc box\n // Size: 0x20 = 32\n 0x00, 0x00, 0x00, 0x20,\n\n // Type: tenc (child of schi)\n 0x74, 0x65, 0x6e, 0x63,\n\n // Version: 0, Flags: 0\n 0x00, 0x00, 0x00, 0x00,\n\n // Reserved fields\n 0x00, 0x00,\n\n // Default protected: true\n 0x01,\n\n // Default per-sample IV size: 8\n 0x08,\n\n // Default key ID: all zeros (dummy)\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n // end of tenc box\n\n // end of schi box\n\n // end of sinf box\n ]));\n\n/**\n * The location of the format field in the \"frma\" box inside the canned \"sinf\"\n * box above.\n *\n * @const {number}\n * @private\n */\nshaka.media.ContentWorkarounds.CANNED_SINF_BOX_FORMAT_OFFSET_ = 0x10;\n\n/**\n * Offset to a box's size field.\n *\n * @const {number}\n * @private\n */\nshaka.media.ContentWorkarounds.BOX_SIZE_OFFSET_ = 0;\n\n/**\n * Offset to a box's type field.\n *\n * @const {number}\n * @private\n */\nshaka.media.ContentWorkarounds.BOX_TYPE_OFFSET_ = 4;\n\n/**\n * Offset to a box's 64-bit size field, if it has one.\n *\n * @const {number}\n * @private\n */\nshaka.media.ContentWorkarounds.BOX_SIZE_64_OFFSET_ = 8;\n\n/**\n * Box type for \"encv\".\n *\n * @const {number}\n * @private\n */\nshaka.media.ContentWorkarounds.BOX_TYPE_ENCV_ = 0x656e6376;\n\n/**\n * Box type for \"enca\".\n *\n * @const {number}\n * @private\n */\nshaka.media.ContentWorkarounds.BOX_TYPE_ENCA_ = 0x656e6361;\n\n/**\n * Box type for \"ac-3\".\n *\n * @const {number}\n * @private\n */\nshaka.media.ContentWorkarounds.BOX_TYPE_AC_3_ = 0x61632d33;\n\n/**\n * Box type for \"dac3\".\n *\n * @const {number}\n * @private\n */\nshaka.media.ContentWorkarounds.BOX_TYPE_DAC3_ = 0x64616333;\n\n/**\n * Box type for \"ec-3\".\n *\n * @const {number}\n * @private\n */\nshaka.media.ContentWorkarounds.BOX_TYPE_EC_3_ = 0x65632d33;\n\n/**\n * Box type for \"dec3\".\n *\n * @const {number}\n * @private\n */\nshaka.media.ContentWorkarounds.BOX_TYPE_DEC3_ = 0x64656333;\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.media.TimeRangesUtils');\n\n\n/**\n * @summary A set of utility functions for dealing with TimeRanges objects.\n */\nshaka.media.TimeRangesUtils = class {\n /**\n * Returns whether the buffer is small enough to be ignored.\n *\n * @param {TimeRanges} b\n * @return {boolean}\n * @private\n */\n static isBufferNegligible_(b) {\n // Workaround Safari bug: https://bit.ly/2trx6O8\n // Firefox may leave <1e-4s of data in buffer after clearing all content\n return b.length == 1 && b.end(0) - b.start(0) < 1e-4;\n }\n\n /**\n * Gets the first timestamp in the buffer.\n *\n * @param {TimeRanges} b\n * @return {?number} The first buffered timestamp, in seconds, if |buffered|\n * is non-empty; otherwise, return null.\n */\n static bufferStart(b) {\n if (!b) {\n return null;\n }\n if (shaka.media.TimeRangesUtils.isBufferNegligible_(b)) {\n return null;\n }\n // Workaround Edge bug: https://bit.ly/2JYLPeB\n if (b.length == 1 && b.start(0) < 0) {\n return 0;\n }\n return b.length ? b.start(0) : null;\n }\n\n\n /**\n * Gets the last timestamp in the buffer.\n *\n * @param {TimeRanges} b\n * @return {?number} The last buffered timestamp, in seconds, if |buffered|\n * is non-empty; otherwise, return null.\n */\n static bufferEnd(b) {\n if (!b) {\n return null;\n }\n if (shaka.media.TimeRangesUtils.isBufferNegligible_(b)) {\n return null;\n }\n return b.length ? b.end(b.length - 1) : null;\n }\n\n\n /**\n * Determines if the given time is inside a buffered range.\n *\n * @param {TimeRanges} b\n * @param {number} time Playhead time\n * @return {boolean}\n */\n static isBuffered(b, time) {\n if (!b || !b.length) {\n return false;\n }\n if (shaka.media.TimeRangesUtils.isBufferNegligible_(b)) {\n return false;\n }\n\n if (time > b.end(b.length - 1)) {\n return false;\n }\n\n return time >= b.start(0);\n }\n\n\n /**\n * Computes how far ahead of the given timestamp is buffered. To provide\n * smooth playback while jumping gaps, we don't include the gaps when\n * calculating this.\n * This only includes the amount of content that is buffered.\n *\n * @param {TimeRanges} b\n * @param {number} time\n * @return {number} The number of seconds buffered, in seconds, ahead of the\n * given time.\n */\n static bufferedAheadOf(b, time) {\n if (!b || !b.length) {\n return 0;\n }\n if (shaka.media.TimeRangesUtils.isBufferNegligible_(b)) {\n return 0;\n }\n\n // We calculate the buffered amount by ONLY accounting for the content\n // buffered (i.e. we ignore the times of the gaps). We also buffer through\n // all gaps.\n // Therefore, we start at the end and add up all buffers until |time|.\n let result = 0;\n for (const {start, end} of shaka.media.TimeRangesUtils.getBufferedInfo(b)) {\n if (end > time) {\n result += end - Math.max(start, time);\n }\n }\n\n return result;\n }\n\n\n /**\n * Determines if the given time is inside a gap between buffered ranges. If\n * it is, this returns the index of the buffer that is *ahead* of the gap.\n *\n * @param {TimeRanges} b\n * @param {number} time\n * @param {number} threshold\n * @return {?number} The index of the buffer after the gap, or null if not in\n * a gap.\n */\n static getGapIndex(b, time, threshold) {\n const TimeRangesUtils = shaka.media.TimeRangesUtils;\n\n if (!b || !b.length) {\n return null;\n }\n if (shaka.media.TimeRangesUtils.isBufferNegligible_(b)) {\n return null;\n }\n\n const idx = TimeRangesUtils.getBufferedInfo(b).findIndex((item, i, arr) => {\n return item.start > time &&\n (i == 0 || arr[i - 1].end - time <= threshold);\n });\n return idx >= 0 ? idx : null;\n }\n\n\n /**\n * @param {TimeRanges} b\n * @return {!Array<shaka.extern.BufferedRange>}\n */\n static getBufferedInfo(b) {\n if (!b) {\n return [];\n }\n const ret = [];\n for (let i = 0; i < b.length; i++) {\n ret.push({start: b.start(i), end: b.end(i)});\n }\n return ret;\n }\n\n /**\n * This operation can be potentially EXPENSIVE and should only be done in\n * debug builds for debugging purposes.\n *\n * @param {TimeRanges} oldRanges\n * @param {TimeRanges} newRanges\n * @return {?shaka.extern.BufferedRange} The last added range,\n * chronologically by presentation time.\n */\n static computeAddedRange(oldRanges, newRanges) {\n const TimeRangesUtils = shaka.media.TimeRangesUtils;\n\n if (!oldRanges || !oldRanges.length) {\n return null;\n }\n if (!newRanges || !newRanges.length) {\n return TimeRangesUtils.getBufferedInfo(newRanges).pop();\n }\n\n const newRangesReversed =\n TimeRangesUtils.getBufferedInfo(newRanges).reverse();\n const oldRangesReversed =\n TimeRangesUtils.getBufferedInfo(oldRanges).reverse();\n for (const newRange of newRangesReversed) {\n let foundOverlap = false;\n\n for (const oldRange of oldRangesReversed) {\n if (oldRange.end >= newRange.start && oldRange.end <= newRange.end) {\n foundOverlap = true;\n\n // If the new range goes beyond the corresponding old one, the\n // difference is newly-added.\n if (newRange.end > oldRange.end) {\n return {start: oldRange.end, end: newRange.end};\n }\n }\n }\n\n if (!foundOverlap) {\n return newRange;\n }\n }\n\n return null;\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\ngoog.provide('shaka.util.Dom');\n\ngoog.require('goog.asserts');\n\n\n// TODO: revisit this when Closure Compiler supports partially-exported classes.\n/** @export */\nshaka.util.Dom = class {\n /**\n * Creates an element, and cast the type from Element to HTMLElement.\n *\n * @param {string} tagName\n * @return {!HTMLElement}\n */\n static createHTMLElement(tagName) {\n const element =\n /** @type {!HTMLElement} */ (document.createElement(tagName));\n return element;\n }\n\n\n /**\n * Create a \"button\" element with the correct type.\n *\n * The compiler is very picky about the use of the \"disabled\" property on\n * HTMLElement, since it is only defined on certain subclasses of that. This\n * method merely creates a button and casts it to the correct type.\n *\n * @return {!HTMLButtonElement}\n */\n static createButton() {\n const button = document.createElement('button');\n button.setAttribute('type', 'button');\n return /** @type {!HTMLButtonElement} */ (button);\n }\n\n\n /**\n * @param {string} url\n * @param {string=} mimeType\n * @return {!HTMLSourceElement}\n */\n static createSourceElement(url, mimeType = '') {\n const source =\n /** @type {HTMLSourceElement} */ (document.createElement('source'));\n source.src = url;\n source.type = mimeType;\n return source;\n }\n\n\n /**\n * Cast a Node/Element to an HTMLElement\n *\n * @param {!Node|!Element} original\n * @return {!HTMLElement}\n */\n static asHTMLElement(original) {\n return /** @type {!HTMLElement}*/ (original);\n }\n\n\n /**\n * Cast a Node/Element to an HTMLCanvasElement\n *\n * @param {!Node|!Element} original\n * @return {!HTMLCanvasElement}\n */\n static asHTMLCanvasElement(original) {\n return /** @type {!HTMLCanvasElement}*/ (original);\n }\n\n\n /**\n * Cast a Node/Element to an HTMLMediaElement\n *\n * @param {!Node|!Element} original\n * @return {!HTMLMediaElement}\n */\n static asHTMLMediaElement(original) {\n return /** @type {!HTMLMediaElement}*/ (original);\n }\n\n\n /**\n * Returns the element with a given class name.\n * Assumes the class name to be unique for a given parent.\n *\n * @param {string} className\n * @param {!HTMLElement} parent\n * @return {!HTMLElement}\n */\n static getElementByClassName(className, parent) {\n const elements = parent.getElementsByClassName(className);\n goog.asserts.assert(elements.length == 1,\n 'Should only be one element with class name ' + className);\n\n return shaka.util.Dom.asHTMLElement(elements[0]);\n }\n\n /**\n * Remove all of the child nodes of an element.\n * @param {!Element} element\n * @export\n */\n static removeAllChildren(element) {\n while (element.firstChild) {\n element.removeChild(element.firstChild);\n }\n }\n};\n\n","/*! @license\n * Shaka Player\n * Copyright 2022 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.Id3Utils');\n\ngoog.require('shaka.log');\ngoog.require('shaka.util.BufferUtils');\ngoog.require('shaka.util.StringUtils');\n\n\n/**\n * @summary A set of Id3Utils utility functions.\n * @export\n */\nshaka.util.Id3Utils = class {\n /**\n * @param {Uint8Array} data\n * @param {number} offset\n * @return {boolean}\n * @private\n */\n static isHeader_(data, offset) {\n /*\n * http://id3.org/id3v2.3.0\n * [0] = 'I'\n * [1] = 'D'\n * [2] = '3'\n * [3,4] = {Version}\n * [5] = {Flags}\n * [6-9] = {ID3 Size}\n *\n * An ID3v2 tag can be detected with the following pattern:\n * $49 44 33 yy yy xx zz zz zz zz\n * Where yy is less than $FF, xx is the 'flags' byte and zz is less than $80\n */\n if (offset + 10 <= data.length) {\n // look for 'ID3' identifier\n if (data[offset] === 0x49 &&\n data[offset + 1] === 0x44 &&\n data[offset + 2] === 0x33) {\n // check version is within range\n if (data[offset + 3] < 0xff && data[offset + 4] < 0xff) {\n // check size is within range\n if (data[offset + 6] < 0x80 &&\n data[offset + 7] < 0x80 &&\n data[offset + 8] < 0x80 &&\n data[offset + 9] < 0x80) {\n return true;\n }\n }\n }\n }\n\n return false;\n }\n\n /**\n * @param {Uint8Array} data\n * @param {number} offset\n * @return {boolean}\n * @private\n */\n static isFooter_(data, offset) {\n /*\n * The footer is a copy of the header, but with a different identifier\n */\n if (offset + 10 <= data.length) {\n // look for '3DI' identifier\n if (data[offset] === 0x33 &&\n data[offset + 1] === 0x44 &&\n data[offset + 2] === 0x49) {\n // check version is within range\n if (data[offset + 3] < 0xff && data[offset + 4] < 0xff) {\n // check size is within range\n if (data[offset + 6] < 0x80 &&\n data[offset + 7] < 0x80 &&\n data[offset + 8] < 0x80 &&\n data[offset + 9] < 0x80) {\n return true;\n }\n }\n }\n }\n\n return false;\n }\n\n /**\n * @param {Uint8Array} data\n * @param {number} offset\n * @return {number}\n * @private\n */\n static readSize_(data, offset) {\n let size = 0;\n size = (data[offset] & 0x7f) << 21;\n size |= (data[offset + 1] & 0x7f) << 14;\n size |= (data[offset + 2] & 0x7f) << 7;\n size |= data[offset + 3] & 0x7f;\n return size;\n }\n\n /**\n * @param {Uint8Array} data\n * @return {shaka.extern.MetadataRawFrame}\n * @private\n */\n static getFrameData_(data) {\n /*\n * Frame ID $xx xx xx xx (four characters)\n * Size $xx xx xx xx\n * Flags $xx xx\n */\n const type = String.fromCharCode(data[0], data[1], data[2], data[3]);\n const size = shaka.util.Id3Utils.readSize_(data, 4);\n\n // skip frame id, size, and flags\n const offset = 10;\n\n return {\n type,\n size,\n data: data.subarray(offset, offset + size),\n };\n }\n\n /**\n * @param {shaka.extern.MetadataRawFrame} frame\n * @return {?shaka.extern.MetadataFrame}\n * @private\n */\n static decodeFrame_(frame) {\n const BufferUtils = shaka.util.BufferUtils;\n const StringUtils = shaka.util.StringUtils;\n\n const metadataFrame = {\n key: frame.type,\n description: '',\n data: '',\n mimeType: null,\n pictureType: null,\n };\n\n if (frame.type === 'APIC') {\n /*\n * Format:\n * [0] = {Text Encoding}\n * [1 - X] = {MIME Type}\\0\n * [X+1] = {Picture Type}\n * [X+2 - Y] = {Description}\\0\n * [Y - ?] = {Picture Data or Picture URL}\n */\n if (frame.size < 2) {\n return null;\n }\n if (frame.data[0] !== shaka.util.Id3Utils.UTF8_encoding) {\n shaka.log.warning('Ignore frame with unrecognized character ' +\n 'encoding');\n return null;\n }\n\n const mimeTypeEndIndex = frame.data.subarray(1).indexOf(0);\n if (mimeTypeEndIndex === -1) {\n return null;\n }\n const mimeType = StringUtils.fromUTF8(\n BufferUtils.toUint8(frame.data, 1, mimeTypeEndIndex));\n const pictureType = frame.data[2 + mimeTypeEndIndex];\n const descriptionEndIndex = frame.data.subarray(3 + mimeTypeEndIndex)\n .indexOf(0);\n if (descriptionEndIndex === -1) {\n return null;\n }\n const description = StringUtils.fromUTF8(\n BufferUtils.toUint8(frame.data, 3 + mimeTypeEndIndex,\n descriptionEndIndex));\n let data;\n if (mimeType === '-->') {\n data = StringUtils.fromUTF8(\n BufferUtils.toUint8(\n frame.data, 4 + mimeTypeEndIndex + descriptionEndIndex));\n } else {\n data = BufferUtils.toArrayBuffer(\n frame.data.subarray(4 + mimeTypeEndIndex + descriptionEndIndex));\n }\n metadataFrame.mimeType = mimeType;\n metadataFrame.pictureType = pictureType;\n metadataFrame.description = description;\n metadataFrame.data = data;\n return metadataFrame;\n } else if (frame.type === 'TXXX') {\n /*\n * Format:\n * [0] = {Text Encoding}\n * [1-?] = {Description}\\0{Value}\n */\n if (frame.size < 2) {\n return null;\n }\n if (frame.data[0] !== shaka.util.Id3Utils.UTF8_encoding) {\n shaka.log.warning('Ignore frame with unrecognized character ' +\n 'encoding');\n return null;\n }\n const descriptionEndIndex = frame.data.subarray(1).indexOf(0);\n\n if (descriptionEndIndex === -1) {\n return null;\n }\n const description = StringUtils.fromUTF8(\n BufferUtils.toUint8(frame.data, 1, descriptionEndIndex));\n const data = StringUtils.fromUTF8(\n BufferUtils.toUint8(frame.data, 2 + descriptionEndIndex))\n .replace(/\\0*$/, '');\n\n metadataFrame.description = description;\n metadataFrame.data = data;\n return metadataFrame;\n } else if (frame.type === 'WXXX') {\n /*\n * Format:\n * [0] = {Text Encoding}\n * [1-?] = {Description}\\0{URL}\n */\n if (frame.size < 2) {\n return null;\n }\n if (frame.data[0] !== shaka.util.Id3Utils.UTF8_encoding) {\n shaka.log.warning('Ignore frame with unrecognized character ' +\n 'encoding');\n return null;\n }\n const descriptionEndIndex = frame.data.subarray(1).indexOf(0);\n\n if (descriptionEndIndex === -1) {\n return null;\n }\n const description = StringUtils.fromUTF8(\n BufferUtils.toUint8(frame.data, 1, descriptionEndIndex));\n const data = StringUtils.fromUTF8(\n BufferUtils.toUint8(frame.data, 2 + descriptionEndIndex))\n .replace(/\\0*$/, '');\n\n metadataFrame.description = description;\n metadataFrame.data = data;\n return metadataFrame;\n } else if (frame.type === 'PRIV') {\n /*\n * Format: <text string>\\0<binary data>\n */\n if (frame.size < 2) {\n return null;\n }\n const textEndIndex = frame.data.indexOf(0);\n if (textEndIndex === -1) {\n return null;\n }\n const text = StringUtils.fromUTF8(\n BufferUtils.toUint8(frame.data, 0, textEndIndex));\n metadataFrame.description = text;\n if (text == 'com.apple.streaming.transportStreamTimestamp') {\n const data = frame.data.subarray(text.length + 1);\n // timestamp is 33 bit expressed as a big-endian eight-octet number,\n // with the upper 31 bits set to zero.\n const pts33Bit = data[3] & 0x1;\n let timestamp =\n (data[4] << 23) + (data[5] << 15) + (data[6] << 7) + data[7];\n timestamp /= 45;\n\n if (pts33Bit) {\n timestamp += 47721858.84;\n } // 2^32 / 90\n\n metadataFrame.data = timestamp;\n } else {\n const data = BufferUtils.toArrayBuffer(\n frame.data.subarray(text.length + 1));\n metadataFrame.data = data;\n }\n return metadataFrame;\n } else if (frame.type[0] === 'T') {\n /*\n * Format:\n * [0] = {Text Encoding}\n * [1-?] = {Value}\n */\n if (frame.size < 2) {\n return null;\n }\n if (frame.data[0] !== shaka.util.Id3Utils.UTF8_encoding) {\n shaka.log.warning('Ignore frame with unrecognized character ' +\n 'encoding');\n return null;\n }\n const text = StringUtils.fromUTF8(frame.data.subarray(1))\n .replace(/\\0*$/, '');\n metadataFrame.data = text;\n return metadataFrame;\n } else if (frame.type[0] === 'W') {\n /*\n * Format:\n * [0-?] = {URL}\n */\n const url = StringUtils.fromUTF8(frame.data)\n .replace(/\\0*$/, '');\n metadataFrame.data = url;\n return metadataFrame;\n } else if (frame.data) {\n shaka.log.warning('Unrecognized ID3 frame type:', frame.type);\n metadataFrame.data = BufferUtils.toArrayBuffer(frame.data);\n return metadataFrame;\n }\n\n return null;\n }\n\n /**\n * Returns an array of ID3 frames found in all the ID3 tags in the id3Data\n * @param {Uint8Array} id3Data - The ID3 data containing one or more ID3 tags\n * @return {!Array<shaka.extern.MetadataFrame>}\n * @export\n */\n static getID3Frames(id3Data) {\n const Id3Utils = shaka.util.Id3Utils;\n let offset = 0;\n const frames = [];\n while (Id3Utils.isHeader_(id3Data, offset)) {\n const size = Id3Utils.readSize_(id3Data, offset + 6);\n\n if ((id3Data[offset + 5] >> 6) & 1) {\n // skip extended header\n offset += 10;\n }\n // skip past ID3 header\n offset += 10;\n\n const end = offset + size;\n // loop through frames in the ID3 tag\n while (offset + 10 < end) {\n const frameData = Id3Utils.getFrameData_(id3Data.subarray(offset));\n const frame = Id3Utils.decodeFrame_(frameData);\n if (frame) {\n frames.push(frame);\n }\n\n // skip frame header and frame data\n offset += frameData.size + 10;\n }\n\n if (Id3Utils.isFooter_(id3Data, offset)) {\n offset += 10;\n }\n }\n return frames;\n }\n\n /**\n * Returns any adjacent ID3 tags found in data starting at offset, as one\n * block of data\n * @param {Uint8Array} id3Data - The ID3 data containing one or more ID3 tags\n * @param {number=} offset - The offset at which to start searching\n * @return {!Uint8Array}\n * @export\n */\n static getID3Data(id3Data, offset = 0) {\n const Id3Utils = shaka.util.Id3Utils;\n const front = offset;\n let length = 0;\n\n while (Id3Utils.isHeader_(id3Data, offset)) {\n if ((id3Data[offset + 5] >> 6) & 1) {\n // skip extended header\n length += 10;\n }\n // skip past ID3 header\n length += 10;\n\n const size = Id3Utils.readSize_(id3Data, offset + 6);\n length += size;\n\n if (Id3Utils.isFooter_(id3Data, offset + 10)) {\n // ID3 footer is 10 bytes\n length += 10;\n }\n offset += length;\n }\n\n if (length > 0) {\n return id3Data.subarray(front, front + length);\n }\n return new Uint8Array([]);\n }\n};\n\n/**\n * UTF8 encoding byte\n * @const {number}\n */\nshaka.util.Id3Utils.UTF8_encoding = 0x03;\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.Mp4BoxParsers');\n\ngoog.require('shaka.util.DataViewReader');\ngoog.require('shaka.util.Mp4Parser');\ngoog.require('shaka.util.Uint8ArrayUtils');\n\nshaka.util.Mp4BoxParsers = class {\n /**\n * Parses a TFHD Box.\n * @param {!shaka.util.DataViewReader} reader\n * @param {number} flags\n * @return {!shaka.util.ParsedTFHDBox}\n */\n static parseTFHD(reader, flags) {\n let defaultSampleDuration = null;\n let defaultSampleSize = null;\n let baseDataOffset = null;\n\n const trackId = reader.readUint32(); // Read \"track_ID\"\n\n // Skip \"base_data_offset\" if present.\n if (flags & 0x000001) {\n baseDataOffset = reader.readUint64();\n }\n\n // Skip \"sample_description_index\" if present.\n if (flags & 0x000002) {\n reader.skip(4);\n }\n\n // Read \"default_sample_duration\" if present.\n if (flags & 0x000008) {\n defaultSampleDuration = reader.readUint32();\n }\n\n // Read \"default_sample_size\" if present.\n if (flags & 0x000010) {\n defaultSampleSize = reader.readUint32();\n }\n\n return {\n trackId,\n defaultSampleDuration,\n defaultSampleSize,\n baseDataOffset,\n };\n }\n\n /**\n * Parses a TFDT Box.\n * @param {!shaka.util.DataViewReader} reader\n * @param {number} version\n * @return {!shaka.util.ParsedTFDTBox}\n */\n static parseTFDT(reader, version) {\n const baseMediaDecodeTime = version == 1 ?\n reader.readUint64() : reader.readUint32();\n\n return {\n baseMediaDecodeTime,\n };\n }\n\n /**\n * Parses a TFDT Box, with a loss of precision beyond 53 bits.\n * Use only when exact integers are not required, e.g. when\n * dividing by the timescale.\n *\n * @param {!shaka.util.DataViewReader} reader\n * @param {number} version\n * @return {!shaka.util.ParsedTFDTBox}\n */\n static parseTFDTInaccurate(reader, version) {\n if (version == 1) {\n const high = reader.readUint32();\n const low = reader.readUint32();\n return {\n baseMediaDecodeTime: (high * Math.pow(2, 32)) + low,\n };\n } else {\n return {\n baseMediaDecodeTime: reader.readUint32(),\n };\n }\n }\n\n /**\n * Parses a PRFT Box, with a loss of precision beyond 53 bits.\n * Use only when exact integers are not required, e.g. when\n * dividing by the timescale.\n *\n * @param {!shaka.util.DataViewReader} reader\n * @param {number} version\n * @return {!shaka.util.ParsedPRFTBox}\n */\n static parsePRFTInaccurate(reader, version) {\n reader.readUint32(); // Ignore referenceTrackId\n const ntpTimestampSec = reader.readUint32();\n const ntpTimestampFrac = reader.readUint32();\n const ntpTimestamp = ntpTimestampSec * 1000 +\n ntpTimestampFrac / 2**32 * 1000;\n\n let mediaTime;\n if (version === 0) {\n mediaTime = reader.readUint32();\n } else {\n const high = reader.readUint32();\n const low = reader.readUint32();\n mediaTime = (high * Math.pow(2, 32)) + low;\n }\n return {\n mediaTime,\n ntpTimestamp,\n };\n }\n\n /**\n * Parses a MDHD Box.\n * @param {!shaka.util.DataViewReader} reader\n * @param {number} version\n * @return {!shaka.util.ParsedMDHDBox}\n */\n static parseMDHD(reader, version) {\n if (version == 1) {\n reader.skip(8); // Skip \"creation_time\"\n reader.skip(8); // Skip \"modification_time\"\n } else {\n reader.skip(4); // Skip \"creation_time\"\n reader.skip(4); // Skip \"modification_time\"\n }\n\n const timescale = reader.readUint32();\n\n reader.skip(4); // Skip \"duration\"\n\n const language = reader.readUint16();\n\n // language is stored as an ISO-639-2/T code in an array of three\n // 5-bit fields each field is the packed difference between its ASCII\n // value and 0x60\n const languageString =\n String.fromCharCode((language >> 10) + 0x60) +\n String.fromCharCode(((language & 0x03c0) >> 5) + 0x60) +\n String.fromCharCode((language & 0x1f) + 0x60);\n\n return {\n timescale,\n language: languageString,\n };\n }\n\n /**\n * Parses a TREX Box.\n * @param {!shaka.util.DataViewReader} reader\n * @return {!shaka.util.ParsedTREXBox}\n */\n static parseTREX(reader) {\n reader.skip(4); // Skip \"track_ID\"\n reader.skip(4); // Skip \"default_sample_description_index\"\n const defaultSampleDuration = reader.readUint32();\n const defaultSampleSize = reader.readUint32();\n\n return {\n defaultSampleDuration,\n defaultSampleSize,\n };\n }\n\n /**\n * Parses a TRUN Box.\n * @param {!shaka.util.DataViewReader} reader\n * @param {number} version\n * @param {number} flags\n * @return {!shaka.util.ParsedTRUNBox}\n */\n static parseTRUN(reader, version, flags) {\n const sampleCount = reader.readUint32();\n const sampleData = [];\n let dataOffset = null;\n\n // \"data_offset\"\n if (flags & 0x000001) {\n dataOffset = reader.readUint32();\n }\n\n // Skip \"first_sample_flags\" if present.\n if (flags & 0x000004) {\n reader.skip(4);\n }\n\n for (let i = 0; i < sampleCount; i++) {\n /** @type {shaka.util.ParsedTRUNSample} */\n const sample = {\n sampleDuration: null,\n sampleSize: null,\n sampleCompositionTimeOffset: null,\n };\n\n // Read \"sample duration\" if present.\n if (flags & 0x000100) {\n sample.sampleDuration = reader.readUint32();\n }\n\n // Read \"sample_size\" if present.\n if (flags & 0x000200) {\n sample.sampleSize = reader.readUint32();\n }\n\n // Skip \"sample_flags\" if present.\n if (flags & 0x000400) {\n reader.skip(4);\n }\n\n // Read \"sample_time_offset\" if present.\n if (flags & 0x000800) {\n sample.sampleCompositionTimeOffset = version == 0 ?\n reader.readUint32() :\n reader.readInt32();\n }\n\n sampleData.push(sample);\n }\n\n return {\n sampleCount,\n sampleData,\n dataOffset,\n };\n }\n\n /**\n * Parses a TKHD Box.\n * @param {!shaka.util.DataViewReader} reader\n * @param {number} version\n * @return {!shaka.util.ParsedTKHDBox}\n */\n static parseTKHD(reader, version) {\n if (version == 1) {\n reader.skip(8); // Skip \"creation_time\"\n reader.skip(8); // Skip \"modification_time\"\n } else {\n reader.skip(4); // Skip \"creation_time\"\n reader.skip(4); // Skip \"modification_time\"\n }\n\n const trackId = reader.readUint32();\n\n if (version == 1) {\n reader.skip(8); // Skip \"reserved\"\n } else {\n reader.skip(4); // Skip \"reserved\"\n }\n reader.skip(4); // Skip \"duration\"\n reader.skip(8); // Skip \"reserved\"\n reader.skip(2); // Skip \"layer\"\n reader.skip(2); // Skip \"alternate_group\"\n reader.skip(2); // Skip \"volume\"\n reader.skip(2); // Skip \"reserved\"\n reader.skip(36); // Skip \"matrix_structure\"\n\n const width = reader.readUint16() + (reader.readUint16() / 16);\n const height = reader.readUint16() + (reader.readUint16() / 16);\n\n return {\n trackId,\n width,\n height,\n };\n }\n\n\n /**\n * Parses an visual sample entry box.\n * @param {!shaka.util.DataViewReader} reader\n * @return {!shaka.util.ParsedVisualSampleEntryBox}\n */\n static visualSampleEntry(reader) {\n // Skip 6 reserved bytes.\n // Skip 2-byte data reference index.\n // Skip 16 more reserved bytes.\n reader.skip(24);\n // 4 bytes for width/height.\n const width = reader.readUint16();\n const height = reader.readUint16();\n // Skip 8 bytes for horizontal/vertical resolution.\n // Skip 4 more reserved bytes (0)\n // Skip 2-byte frame count.\n // Skip 32-byte compressor name (length byte, then name, then 0-padding).\n // Skip 2-byte depth.\n // Skip 2 more reserved bytes (0xff)\n reader.skip(50);\n\n return {\n width: width,\n height: height,\n };\n }\n\n\n /**\n * Parses an audio sample entry box.\n * @param {!shaka.util.DataViewReader} reader\n * @return {!shaka.util.ParsedAudioSampleEntryBox}\n */\n static audioSampleEntry(reader) {\n reader.skip(6); // Skip \"reserved\"\n reader.skip(2); // Skip \"data_reference_index\"\n reader.skip(8); // Skip \"reserved\"\n const channelCount = reader.readUint16();\n reader.skip(2); // Skip \"sample_size\"\n reader.skip(2); // Skip \"pre_defined\"\n reader.skip(2); // Skip \"reserved\"\n const sampleRate = reader.readUint16() + (reader.readUint16() / 65536);\n\n return {\n channelCount,\n sampleRate,\n };\n }\n\n /**\n * Parses a ESDS box.\n * @param {!shaka.util.DataViewReader} reader\n * @return {!shaka.util.ParsedESDSBox}\n */\n static parseESDS(reader) {\n let codec = 'mp4a';\n let tag;\n let oti;\n while (reader.hasMoreData()) {\n tag = reader.readUint8();\n let byteRead = reader.readUint8();\n while (byteRead & 0x80) {\n byteRead = reader.readUint8();\n }\n if (tag == 0x03) {\n reader.readUint16();\n const flags = reader.readUint8();\n if (flags & 0x80) {\n reader.readUint16();\n }\n if (flags & 0x40) {\n reader.skip(reader.readUint8());\n }\n if (flags & 0x20) {\n reader.readUint16();\n }\n } else if (tag == 0x04) {\n oti = reader.readUint8();\n reader.skip(12);\n } else if (tag == 0x05) {\n break;\n }\n }\n if (oti) {\n codec += '.' + shaka.util.Mp4BoxParsers.toHex_(oti);\n if (tag == 0x05 && reader.hasMoreData()) {\n const firstData = reader.readUint8();\n let audioObjectType = (firstData & 0xF8) >> 3;\n if (audioObjectType === 31 && reader.hasMoreData()) {\n audioObjectType = 32 + ((firstData & 0x7) << 3) +\n ((reader.readUint8() & 0xE0) >> 5);\n }\n codec += '.' + audioObjectType;\n }\n }\n return {codec};\n }\n\n /**\n * Parses a AVCC box.\n * @param {string} codecBase\n * @param {!shaka.util.DataViewReader} reader\n * @param {string} boxName\n * @return {!shaka.util.ParsedAVCCBox}\n */\n static parseAVCC(codecBase, reader, boxName) {\n const Mp4BoxParsers = shaka.util.Mp4BoxParsers;\n reader.skip(1); // Skip \"configurationVersion\"\n const codec = codecBase + '.' +\n Mp4BoxParsers.toHex_(reader.readUint8()) +\n Mp4BoxParsers.toHex_(reader.readUint8()) +\n Mp4BoxParsers.toHex_(reader.readUint8());\n return {codec};\n }\n\n /**\n * Parses a HVCC box.\n * @param {string} codecBase\n * @param {!shaka.util.DataViewReader} reader\n * @param {string} boxName\n * @return {!shaka.util.ParsedHVCCBox}\n */\n static parseHVCC(codecBase, reader, boxName) {\n const Mp4BoxParsers = shaka.util.Mp4BoxParsers;\n reader.skip(1); // Skip \"configurationVersion\"\n const profileByte = reader.readUint8();\n const profileSpace = ['', 'A', 'B', 'C'][profileByte >> 6];\n const generalProfileIdc = profileByte & 0x1f;\n const profileCompat = reader.readUint32();\n const tierFlag = (profileByte & 0x20) >> 5 ? 'H' : 'L';\n const constraintIndicator = [\n reader.readUint8(),\n reader.readUint8(),\n reader.readUint8(),\n reader.readUint8(),\n reader.readUint8(),\n reader.readUint8(),\n ];\n const levelIDC = reader.readUint8();\n let codec = codecBase;\n codec += '.' + profileSpace + generalProfileIdc;\n codec += '.' + Mp4BoxParsers.toHex_(\n Mp4BoxParsers.reverseBits_(profileCompat),\n /* removeInitialZero= */ true);\n codec += '.' + tierFlag + levelIDC;\n let constraintString = '';\n for (let i = constraintIndicator.length; i--; ) {\n const byte = constraintIndicator[i];\n if (byte || constraintString) {\n const encodedByte = byte.toString(16).toUpperCase();\n constraintString = '.' + encodedByte + constraintString;\n }\n }\n codec += constraintString;\n\n return {codec};\n }\n\n /**\n * Parses a DVCC box.\n * @param {string} codecBase\n * @param {!shaka.util.DataViewReader} reader\n * @param {string} boxName\n * @return {!shaka.util.ParsedDVCCBox}\n */\n static parseDVCC(codecBase, reader, boxName) {\n const Mp4BoxParsers = shaka.util.Mp4BoxParsers;\n reader.skip(2); // Skip \"dv_version_major\" and \"dv_version_minor\"\n const thirdByte = reader.readUint8();\n const fourthByte = reader.readUint8();\n const profile = (thirdByte >> 1) & 0x7f;\n const level = ((thirdByte << 5) & 0x20) | ((fourthByte >> 3) & 0x1f);\n const codec = codecBase + '.' +\n Mp4BoxParsers.addLeadingZero_(profile) + '.' +\n Mp4BoxParsers.addLeadingZero_(level);\n\n return {codec};\n }\n\n /**\n * Parses a DVVC box.\n * @param {string} codecBase\n * @param {!shaka.util.DataViewReader} reader\n * @param {string} boxName\n * @return {!shaka.util.ParsedDVVCBox}\n */\n static parseDVVC(codecBase, reader, boxName) {\n const Mp4BoxParsers = shaka.util.Mp4BoxParsers;\n reader.skip(2); // Skip \"dv_version_major\" and \"dv_version_minor\"\n const thirdByte = reader.readUint8();\n const fourthByte = reader.readUint8();\n const profile = (thirdByte >> 1) & 0x7f;\n const level = ((thirdByte << 5) & 0x20) | ((fourthByte >> 3) & 0x1f);\n const codec = codecBase + '.' +\n Mp4BoxParsers.addLeadingZero_(profile) + '.' +\n Mp4BoxParsers.addLeadingZero_(level);\n\n return {codec};\n }\n\n /**\n * Parses a VPCC box.\n * @param {string} codecBase\n * @param {!shaka.util.DataViewReader} reader\n * @param {string} boxName\n * @return {!shaka.util.ParsedVPCCBox}\n */\n static parseVPCC(codecBase, reader, boxName) {\n const Mp4BoxParsers = shaka.util.Mp4BoxParsers;\n const profile = reader.readUint8();\n const level = reader.readUint8();\n const bitDepth = (reader.readUint8() >> 4) & 0x0f;\n const codec = codecBase + '.' +\n Mp4BoxParsers.addLeadingZero_(profile) + '.' +\n Mp4BoxParsers.addLeadingZero_(level) + '.' +\n Mp4BoxParsers.addLeadingZero_(bitDepth);\n\n return {codec};\n }\n\n /**\n * Parses a AV1C box.\n * @param {string} codecBase\n * @param {!shaka.util.DataViewReader} reader\n * @param {string} boxName\n * @return {!shaka.util.ParsedAV1CBox}\n */\n static parseAV1C(codecBase, reader, boxName) {\n const Mp4BoxParsers = shaka.util.Mp4BoxParsers;\n // More info https://aomediacodec.github.io/av1-isobmff/#av1codecconfigurationbox-syntax\n reader.skip(1); // Skip \"marker\" and \"version\"\n const secondByte = reader.readUint8();\n const thirdByte = reader.readUint8();\n const profile = secondByte >>> 5;\n const level = secondByte & 0x1f;\n const tierFlag = thirdByte >>> 7 ? 'H' : 'M';\n const highBitDepth = (thirdByte & 0x40) >> 6;\n const twelveBit = (thirdByte & 0x20) >> 5;\n const bitDepth = profile === 2 && highBitDepth ?\n (twelveBit ? 12 : 10) : (highBitDepth ? 10 : 8);\n const monochrome = (thirdByte & 0x10) >> 4;\n const chromaSubsamplingX = (thirdByte & 0x08) >> 3;\n const chromaSubsamplingY = (thirdByte & 0x04) >> 2;\n const chromaSamplePosition = thirdByte & 0x03;\n // TODO: parse color_description_present_flag\n // default it to BT.709/limited range for now\n const colorPrimaries = 1;\n const transferCharacteristics = 1;\n const matrixCoefficients = 1;\n const videoFullRangeFlag = 0;\n const codec = codecBase + '.' + profile +\n '.' + Mp4BoxParsers.addLeadingZero_(level) + tierFlag +\n '.' + Mp4BoxParsers.addLeadingZero_(bitDepth) +\n '.' + monochrome +\n '.' + chromaSubsamplingX + chromaSubsamplingY + chromaSamplePosition +\n '.' + Mp4BoxParsers.addLeadingZero_(colorPrimaries) +\n '.' + Mp4BoxParsers.addLeadingZero_(transferCharacteristics) +\n '.' + Mp4BoxParsers.addLeadingZero_(matrixCoefficients) +\n '.' + videoFullRangeFlag;\n\n return {codec};\n }\n\n /**\n * Parses a FRMA box.\n * @param {!shaka.util.DataViewReader} reader\n * @return {!shaka.util.ParsedFRMABox}\n */\n static parseFRMA(reader) {\n const fourcc = reader.readUint32();\n const codec = shaka.util.Mp4Parser.typeToString(fourcc);\n return {codec};\n }\n\n /**\n * Parses a TENC box.\n * @param {!shaka.util.DataViewReader} reader\n * @return {!shaka.util.ParsedTENCBox}\n */\n static parseTENC(reader) {\n const Uint8ArrayUtils = shaka.util.Uint8ArrayUtils;\n reader.readUint8(); // reserved\n reader.readUint8();\n reader.readUint8(); // default_isProtected\n reader.readUint8(); // default_Per_Sample_IV_Size\n const defaultKID = Uint8ArrayUtils.toHex(reader.readBytes(16));\n return {defaultKID};\n }\n\n /**\n * Parses a HDLR box.\n * @param {!shaka.util.DataViewReader} reader\n * @return {!shaka.util.ParsedHDLRBox}\n */\n static parseHDLR(reader) {\n reader.skip(8); // Skip \"pre_defined\"\n\n const handlerType = reader.readTerminatedString();\n return {handlerType};\n }\n\n /**\n * Parses a PRJI box.\n * @param {!shaka.util.DataViewReader} reader\n * @return {!shaka.util.ParsedPRJIBox}\n */\n static parsePRJI(reader) {\n const projection = reader.readTerminatedString();\n return {projection};\n }\n\n /**\n * Parses a HFOV box.\n * @param {!shaka.util.DataViewReader} reader\n * @return {!shaka.util.ParsedHFOVBox}\n */\n static parseHFOV(reader) {\n const millidegrees = reader.readUint32();\n\n return {\n hfov: millidegrees / 1000,\n };\n }\n\n /**\n * Parses a COLR box.\n * @param {!shaka.util.DataViewReader} reader\n * @return {!shaka.util.ParsedCOLRBox}\n */\n static parseCOLR(reader) {\n let colorGamut = null;\n let videoRange = null;\n const data = reader.readBytes(4);\n let colorType = '';\n colorType += String.fromCharCode(data[0]);\n colorType += String.fromCharCode(data[1]);\n colorType += String.fromCharCode(data[2]);\n colorType += String.fromCharCode(data[3]);\n if (colorType === 'nclx') {\n const colorPrimaries = reader.readUint16();\n switch (colorPrimaries) {\n case 1:\n case 5:\n case 6:\n case 7:\n colorGamut = 'srgb';\n break;\n case 9:\n colorGamut = 'rec2020';\n break;\n case 11:\n case 12:\n colorGamut = 'p3';\n break;\n }\n const transferCharacteristics = reader.readUint16();\n reader.readUint16(); // matrix_coefficients\n switch (transferCharacteristics) {\n case 1:\n case 6:\n case 13:\n case 14:\n case 15:\n videoRange = 'SDR';\n break;\n case 16:\n videoRange = 'PQ';\n break;\n case 18:\n videoRange = 'HLG';\n break;\n }\n }\n return {\n colorGamut,\n videoRange,\n };\n }\n\n /**\n * Parses AV1 codec string with COLR box information.\n *\n * AV1 codec info: https://aomediacodec.github.io/av1-isobmff/#codecsparam\n *\n * @param {string} codec\n * @param {!shaka.util.DataViewReader} reader\n * @return {string}\n */\n static updateAV1CodecWithCOLRBox(codec, reader) {\n const Mp4BoxParsers = shaka.util.Mp4BoxParsers;\n const initialPosition = reader.getPosition();\n const data = reader.readBytes(4);\n let colorType = '';\n colorType += String.fromCharCode(data[0]);\n colorType += String.fromCharCode(data[1]);\n colorType += String.fromCharCode(data[2]);\n colorType += String.fromCharCode(data[3]);\n if (colorType === 'nclx') {\n const colorPrimaries = reader.readUint16();\n const transferCharacteristics = reader.readUint16();\n const matrixCoefficients = reader.readUint16();\n const videoFullRangeFlag = reader.readUint8() >> 7;\n const codecParts = codec.split('.');\n if (codecParts.length == 10) {\n codecParts[6] = Mp4BoxParsers.addLeadingZero_(colorPrimaries);\n codecParts[7] = Mp4BoxParsers.addLeadingZero_(transferCharacteristics);\n codecParts[8] = Mp4BoxParsers.addLeadingZero_(matrixCoefficients);\n codecParts[9] = String(videoFullRangeFlag);\n codec = codecParts.join('.');\n }\n }\n reader.seek(initialPosition);\n return codec;\n }\n\n /**\n * Convert a number to hex\n * @param {number} x\n * @param {boolean=} removeInitialZero\n * @return {string}\n * @private\n */\n static toHex_(x, removeInitialZero = false) {\n const value = x.toString(16).toUpperCase();\n if (removeInitialZero) {\n return value;\n }\n return ('0' + value).slice(-2);\n }\n\n /**\n * Reverse a number bit to bit\n * @param {number} x\n * @return {number}\n * @private\n */\n static reverseBits_(x) {\n let val = x;\n let reversed = 0;\n for (let i = 0; i < 32; i++) {\n reversed |= val & 1;\n if (i == 31) {\n break;\n }\n reversed <<= 1;\n val >>= 1;\n }\n return reversed;\n }\n\n /**\n *\n * @param {number} x\n * @return {string}\n * @private\n */\n static addLeadingZero_(x) {\n return (x < 10 ? '0' : '') + x;\n }\n};\n\n\n/**\n * @typedef {{\n * trackId: number,\n * defaultSampleDuration: ?number,\n * defaultSampleSize: ?number,\n * baseDataOffset: ?number\n * }}\n *\n * @property {number} trackId\n * As per the spec: an integer that uniquely identifies this\n * track over the entire life‐time of this presentation\n * @property {?number} defaultSampleDuration\n * If specified via flags, this overrides the default sample\n * duration in the Track Extends Box for this fragment\n * @property {?number} defaultSampleSize\n * If specified via flags, this overrides the default sample\n * size in the Track Extends Box for this fragment\n * @property {?number} baseDataOffset\n * If specified via flags, this indicate the base data offset\n *\n * @exportDoc\n */\nshaka.util.ParsedTFHDBox;\n\n/**\n * @typedef {{\n * baseMediaDecodeTime: number\n * }}\n *\n * @property {number} baseMediaDecodeTime\n * As per the spec: the absolute decode time, measured on the media\n * timeline, of the first sample in decode order in the track fragment\n *\n * @exportDoc\n */\nshaka.util.ParsedTFDTBox;\n\n/**\n * @typedef {{\n * mediaTime: number,\n * ntpTimestamp: number\n * }}\n *\n * @exportDoc\n */\nshaka.util.ParsedPRFTBox;\n\n/**\n * @typedef {{\n * timescale: number,\n * language: string\n * }}\n *\n * @property {number} timescale\n * As per the spec: an integer that specifies the time‐scale for this media;\n * this is the number of time units that pass in one second\n * @property {string} language\n * Language code for this media\n *\n * @exportDoc\n */\nshaka.util.ParsedMDHDBox;\n\n/**\n * @typedef {{\n * defaultSampleDuration: number,\n * defaultSampleSize: number\n * }}\n *\n * @property {number} defaultSampleDuration\n * The default sample duration to be used in track fragments\n * @property {number} defaultSampleSize\n * The default sample size to be used in track fragments\n *\n * @exportDoc\n */\nshaka.util.ParsedTREXBox;\n\n/**\n * @typedef {{\n * sampleCount: number,\n * sampleData: !Array<shaka.util.ParsedTRUNSample>,\n * dataOffset: ?number\n * }}\n *\n * @property {number} sampleCount\n * As per the spec: the number of samples being added in this run;\n * @property {!Array<shaka.util.ParsedTRUNSample>} sampleData\n * An array of size <sampleCount> containing data for each sample\n * @property {?number} dataOffset\n * If specified via flags, this indicate the offset of the sample in bytes.\n *\n * @exportDoc\n */\nshaka.util.ParsedTRUNBox;\n\n/**\n * @typedef {{\n * sampleDuration: ?number,\n * sampleSize: ?number,\n * sampleCompositionTimeOffset: ?number\n * }}\n *\n * @property {?number} sampleDuration\n * The length of the sample in timescale units.\n * @property {?number} sampleSize\n * The size of the sample in bytes.\n * @property {?number} sampleCompositionTimeOffset\n * The time since the start of the sample in timescale units. Time\n * offset is based of the start of the sample. If this value is\n * missing, the accumulated durations preceding this time sample will\n * be used to create the start time.\n *\n * @exportDoc\n */\nshaka.util.ParsedTRUNSample;\n\n/**\n * @typedef {{\n * trackId: number,\n * width: number,\n * height: number\n * }}\n *\n * @property {number} trackId\n * Unique ID indicative of this track\n * @property {number} width\n * Width of this track in pixels\n * @property {number} height\n * Height of this track in pixels.\n *\n * @exportDoc\n */\nshaka.util.ParsedTKHDBox;\n\n/**\n * @typedef {{\n * codec: string\n * }}\n *\n * @property {string} codec\n * A fourcc for a codec\n *\n * @exportDoc\n */\nshaka.util.ParsedFRMABox;\n\n/**\n * @typedef {{\n * defaultKID: string\n * }}\n *\n * @property {string} defaultKID\n *\n * @exportDoc\n */\nshaka.util.ParsedTENCBox;\n\n/**\n * @typedef {{\n * width: number,\n * height: number\n * }}\n *\n * @property {number} width\n * @property {number} height\n *\n * @exportDoc\n */\nshaka.util.ParsedVisualSampleEntryBox;\n\n/**\n * @typedef {{\n * channelCount: number,\n * sampleRate: number\n * }}\n *\n * @property {number} channelCount\n * @property {number} sampleRate\n *\n * @exportDoc\n */\nshaka.util.ParsedAudioSampleEntryBox;\n\n/**\n * @typedef {{\n * codec: string\n * }}\n *\n * @property {string} codec\n *\n * @exportDoc\n */\nshaka.util.ParsedESDSBox;\n\n/**\n * @typedef {{\n * codec: string\n * }}\n *\n * @property {string} codec\n *\n * @exportDoc\n */\nshaka.util.ParsedAVCCBox;\n\n/**\n * @typedef {{\n * codec: string\n * }}\n *\n * @property {string} codec\n *\n * @exportDoc\n */\nshaka.util.ParsedHVCCBox;\n\n/**\n * @typedef {{\n * codec: string\n * }}\n *\n * @property {string} codec\n *\n * @exportDoc\n */\nshaka.util.ParsedDVCCBox;\n\n/**\n * @typedef {{\n * codec: string\n * }}\n *\n * @property {string} codec\n *\n * @exportDoc\n */\nshaka.util.ParsedDVVCBox;\n\n/**\n * @typedef {{\n * codec: string\n * }}\n *\n * @property {string} codec\n *\n * @exportDoc\n */\nshaka.util.ParsedVPCCBox;\n\n/**\n * @typedef {{\n * codec: string\n * }}\n *\n * @property {string} codec\n *\n * @exportDoc\n */\nshaka.util.ParsedAV1CBox;\n\n/**\n * @typedef {{\n * handlerType: string\n * }}\n *\n * @property {string} handlerType\n * A four-character code that identifies the type of the media handler or\n * data handler. For media handlers, this field defines the type of\n * data—for example, 'vide' for video data, 'soun' for sound data.\n *\n * @exportDoc\n */\nshaka.util.ParsedHDLRBox;\n\n/**\n * @typedef {{\n * projection: string\n * }}\n *\n * @property {string} projection\n * A four-character code that identifies the type of the projection.\n * Possible values:\n * - Rectangular: ‘rect’\n * - Half equirectangular: ‘hequ’\n * - Equirectangular: ?\n * - Fisheye: ‘fish’\n *\n * @exportDoc\n */\nshaka.util.ParsedPRJIBox;\n\n/**\n * @typedef {{\n * hfov: number\n * }}\n *\n * @property {number} hfov\n *\n * @exportDoc\n */\nshaka.util.ParsedHFOVBox;\n\n/**\n * @typedef {{\n * colorGamut: ?string,\n * videoRange: ?string\n * }}\n *\n * @property {?string} colorGamut\n * @property {?string} videoRange\n *\n * @exportDoc\n */\nshaka.util.ParsedCOLRBox;\n","/**\n * @license\n * Copyright Brightcove, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\ngoog.provide('shaka.util.ExpGolomb');\n\ngoog.require('shaka.util.BufferUtils');\ngoog.require('shaka.util.DataViewReader');\n\n\n/**\n * @summary\n * Parser for exponential Golomb codes, a variable-bit width number encoding\n * scheme used by h264.\n * Based on https://github.com/videojs/mux.js/blob/main/lib/utils/exp-golomb.js\n *\n * @export\n */\nshaka.util.ExpGolomb = class {\n /**\n * @param {!Uint8Array} data\n * @param {boolean=} convertEbsp2rbsp\n */\n constructor(data, convertEbsp2rbsp = false) {\n /** @private {!Uint8Array} */\n this.data_ = data;\n if (convertEbsp2rbsp) {\n this.data_ = this.ebsp2rbsp_(data);\n }\n\n /** @private {number} */\n this.workingBytesAvailable_ = this.data_.byteLength;\n\n // the current word being examined\n /** @private {number} */\n this.workingWord_ = 0;\n\n // the number of bits left to examine in the current word\n /** @private {number} */\n this.workingBitsAvailable_ = 0;\n }\n\n /**\n * @param {!Uint8Array} data\n * @return {!Uint8Array}\n * @private\n */\n ebsp2rbsp_(data) {\n const ret = new Uint8Array(data.byteLength);\n let retIndex = 0;\n\n for (let i = 0; i < data.byteLength; i++) {\n if (i >= 2) {\n // Unescape: Skip 0x03 after 00 00\n if (data[i] == 0x03 && data[i - 1] == 0x00 && data[i - 2] == 0x00) {\n continue;\n }\n }\n ret[retIndex] = data[i];\n retIndex++;\n }\n\n return shaka.util.BufferUtils.toUint8(ret, 0, retIndex);\n }\n\n /**\n * Load the next word\n *\n * @private\n */\n loadWord_() {\n const position = this.data_.byteLength - this.workingBytesAvailable_;\n const bytes = new Uint8Array(4);\n const availableBytes = Math.min(4, this.workingBytesAvailable_);\n\n if (availableBytes === 0) {\n return;\n }\n\n bytes.set(this.data_.subarray(position, position + availableBytes));\n const dataView = new shaka.util.DataViewReader(\n bytes, shaka.util.DataViewReader.Endianness.BIG_ENDIAN);\n this.workingWord_ = dataView.readUint32();\n\n // track the amount of data that has been processed\n this.workingBitsAvailable_ = availableBytes * 8;\n this.workingBytesAvailable_ -= availableBytes;\n }\n\n /**\n * Skip n bits\n *\n * @param {number} count\n */\n skipBits(count) {\n if (this.workingBitsAvailable_ <= count) {\n count -= this.workingBitsAvailable_;\n const skipBytes = Math.floor(count / 8);\n count -= (skipBytes * 8);\n this.workingBitsAvailable_ -= skipBytes;\n this.loadWord_();\n }\n this.workingWord_ <<= count;\n this.workingBitsAvailable_ -= count;\n }\n\n /**\n * Read n bits\n *\n * @param {number} size\n * @return {number}\n */\n readBits(size) {\n let bits = Math.min(this.workingBitsAvailable_, size);\n const valu = this.workingWord_ >>> (32 - bits);\n this.workingBitsAvailable_ -= bits;\n if (this.workingBitsAvailable_ > 0) {\n this.workingWord_ <<= bits;\n } else if (this.workingBytesAvailable_ > 0) {\n this.loadWord_();\n }\n bits = size - bits;\n if (bits > 0) {\n return (valu << bits) | this.readBits(bits);\n }\n return valu;\n }\n\n /**\n * Return the number of skip leading zeros\n *\n * @return {number}\n * @private\n */\n skipLeadingZeros_() {\n let i;\n for (i = 0; i < this.workingBitsAvailable_; ++i) {\n if ((this.workingWord_ & (0x80000000 >>> i)) !== 0) {\n // the first bit of working word is 1\n this.workingWord_ <<= i;\n this.workingBitsAvailable_ -= i;\n return i;\n }\n }\n\n // we exhausted workingWord and still have not found a 1\n this.loadWord_();\n return i + this.skipLeadingZeros_();\n }\n\n /**\n * Skip exponential Golomb\n */\n skipExpGolomb() {\n this.skipBits(1 + this.skipLeadingZeros_());\n }\n\n /**\n * Return unsigned exponential Golomb\n *\n * @return {number}\n */\n readUnsignedExpGolomb() {\n const clz = this.skipLeadingZeros_();\n return this.readBits(clz + 1) - 1;\n }\n\n /**\n * Return exponential Golomb\n *\n * @return {number}\n */\n readExpGolomb() {\n const valu = this.readUnsignedExpGolomb();\n if (0x01 & valu) {\n // the number is odd if the low order bit is set\n // add 1 to make it even, and divide by 2\n return (1 + valu) >>> 1;\n }\n // divide by two then make it negative\n return -1 * (valu >>> 1);\n }\n\n /**\n * Read 1 bit as boolean\n *\n * @return {boolean}\n */\n readBoolean() {\n return this.readBits(1) === 1;\n }\n\n /**\n * Read 8 bits\n *\n * @return {number}\n */\n readUnsignedByte() {\n return this.readBits(8);\n }\n\n /**\n * The scaling list is optionally transmitted as part of a Sequence Parameter\n * Set (SPS).\n *\n * @param {number} count the number of entries in this scaling list\n * @see Recommendation ITU-T H.264, Section 7.3.2.1.1.1\n */\n skipScalingList(count) {\n let lastScale = 8;\n let nextScale = 8;\n\n for (let j = 0; j < count; j++) {\n if (nextScale !== 0) {\n const deltaScale = this.readExpGolomb();\n nextScale = (lastScale + deltaScale + 256) % 256;\n }\n lastScale = (nextScale === 0) ? lastScale : nextScale;\n }\n }\n\n /**\n * Return the slice type\n *\n * @return {number}\n */\n readSliceType() {\n // skip Nalu type\n this.readUnsignedByte();\n // discard first_mb_in_slice\n this.readUnsignedExpGolomb();\n // return slice_type\n return this.readUnsignedExpGolomb();\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.TsParser');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.Deprecate');\ngoog.require('shaka.log');\ngoog.require('shaka.util.ExpGolomb');\ngoog.require('shaka.util.Id3Utils');\ngoog.require('shaka.util.StringUtils');\ngoog.require('shaka.util.Uint8ArrayUtils');\n\n\n/**\n * @see https://en.wikipedia.org/wiki/MPEG_transport_stream\n * @export\n */\nshaka.util.TsParser = class {\n /** */\n constructor() {\n /** @private {?number} */\n this.pmtId_ = null;\n\n /** @private {boolean} */\n this.pmtParsed_ = false;\n\n /** @private {?number} */\n this.videoPid_ = null;\n\n /** @private {?string} */\n this.videoCodec_ = null;\n\n /** @private {!Array<!Array<Uint8Array>>} */\n this.videoData_ = [];\n\n /** @private {!Array<shaka.extern.MPEG_PES>} */\n this.videoPes_ = [];\n\n /** @private {?number} */\n this.audioPid_ = null;\n\n /** @private {?string} */\n this.audioCodec_ = null;\n\n /** @private {!Array<!Array<Uint8Array>>} */\n this.audioData_ = [];\n\n /** @private {!Array<shaka.extern.MPEG_PES>} */\n this.audioPes_ = [];\n\n /** @private {?number} */\n this.id3Pid_ = null;\n\n /** @private {!Array<!Array<Uint8Array>>} */\n this.id3Data_ = [];\n\n /** @private {?number} */\n this.referencePts_ = null;\n\n /** @private {?number} */\n this.referenceDts_ = null;\n\n /** @private {?shaka.util.TsParser.OpusMetadata} */\n this.opusMetadata_ = null;\n }\n\n /**\n * Clear previous data\n *\n * @export\n */\n clearData() {\n this.videoData_ = [];\n this.videoPes_ = [];\n this.audioData_ = [];\n this.audioPes_ = [];\n this.id3Data_ = [];\n }\n\n /**\n * Parse the given data\n *\n * @param {Uint8Array} data\n * @return {!shaka.util.TsParser}\n * @export\n */\n parse(data) {\n const packetLength = shaka.util.TsParser.PacketLength_;\n\n // A TS fragment should contain at least 3 TS packets, a PAT, a PMT, and\n // one PID.\n if (data.length < 3 * packetLength) {\n return this;\n }\n const syncOffset = Math.max(0, shaka.util.TsParser.syncOffset(data));\n\n const length = data.length - (data.length + syncOffset) % packetLength;\n\n let unknownPIDs = false;\n\n // loop through TS packets\n for (let start = syncOffset; start < length; start += packetLength) {\n if (data[start] == 0x47) {\n const payloadUnitStartIndicator = !!(data[start + 1] & 0x40);\n // pid is a 13-bit field starting at the last 5 bits of TS[1]\n const pid = ((data[start + 1] & 0x1f) << 8) + data[start + 2];\n const adaptationFieldControl = (data[start + 3] & 0x30) >> 4;\n\n // if an adaption field is present, its length is specified by the\n // fifth byte of the TS packet header.\n let offset;\n if (adaptationFieldControl > 1) {\n offset = start + 5 + data[start + 4];\n // continue if there is only adaptation field\n if (offset == start + packetLength) {\n continue;\n }\n } else {\n offset = start + 4;\n }\n switch (pid) {\n case 0:\n if (payloadUnitStartIndicator) {\n offset += data[offset] + 1;\n }\n\n this.pmtId_ = this.getPmtId_(data, offset);\n break;\n case 17:\n case 0x1fff:\n break;\n case this.pmtId_: {\n if (payloadUnitStartIndicator) {\n offset += data[offset] + 1;\n }\n\n const parsedPIDs = this.parsePMT_(data, offset);\n\n // only update track id if track PID found while parsing PMT\n // this is to avoid resetting the PID to -1 in case\n // track PID transiently disappears from the stream\n // this could happen in case of transient missing audio samples\n // for example\n // NOTE this is only the PID of the track as found in TS,\n // but we are not using this for MP4 track IDs.\n if (parsedPIDs.video != -1) {\n this.videoPid_ = parsedPIDs.video;\n this.videoCodec_ = parsedPIDs.videoCodec;\n }\n if (parsedPIDs.audio != -1) {\n this.audioPid_ = parsedPIDs.audio;\n this.audioCodec_ = parsedPIDs.audioCodec;\n }\n if (parsedPIDs.id3 != -1) {\n this.id3Pid_ = parsedPIDs.id3;\n }\n\n if (unknownPIDs && !this.pmtParsed_) {\n shaka.log.debug('reparse from beginning');\n unknownPIDs = false;\n // we set it to -188, the += 188 in the for loop will reset\n // start to 0\n start = syncOffset - packetLength;\n }\n this.pmtParsed_ = true;\n break;\n }\n case this.videoPid_: {\n const videoData = data.subarray(offset, start + packetLength);\n if (payloadUnitStartIndicator) {\n this.videoData_.push([videoData]);\n } else if (this.videoData_.length) {\n const prevVideoData = this.videoData_[this.videoData_.length - 1];\n if (prevVideoData) {\n this.videoData_[this.videoData_.length - 1].push(videoData);\n }\n }\n break;\n }\n case this.audioPid_: {\n const audioData = data.subarray(offset, start + packetLength);\n if (payloadUnitStartIndicator) {\n this.audioData_.push([audioData]);\n } else if (this.audioData_.length) {\n const prevAudioData = this.audioData_[this.audioData_.length - 1];\n if (prevAudioData) {\n this.audioData_[this.audioData_.length - 1].push(audioData);\n }\n }\n break;\n }\n case this.id3Pid_: {\n const id3Data = data.subarray(offset, start + packetLength);\n if (payloadUnitStartIndicator) {\n this.id3Data_.push([id3Data]);\n } else if (this.id3Data_.length) {\n const prevId3Data = this.id3Data_[this.id3Data_.length - 1];\n if (prevId3Data) {\n this.id3Data_[this.id3Data_.length - 1].push(id3Data);\n }\n }\n break;\n }\n default:\n unknownPIDs = true;\n break;\n }\n } else {\n shaka.log.warning('Found TS packet that do not start with 0x47');\n }\n }\n return this;\n }\n\n /**\n * Get the PMT ID from the PAT\n *\n * @param {Uint8Array} data\n * @param {number} offset\n * @return {number}\n * @private\n */\n getPmtId_(data, offset) {\n // skip the PSI header and parse the first PMT entry\n return ((data[offset + 10] & 0x1f) << 8) | data[offset + 11];\n }\n\n /**\n * Parse PMT\n *\n * @param {Uint8Array} data\n * @param {number} offset\n * @return {!shaka.util.TsParser.PMT}\n * @private\n */\n parsePMT_(data, offset) {\n const StringUtils = shaka.util.StringUtils;\n const result = {\n audio: -1,\n video: -1,\n id3: -1,\n audioCodec: '',\n videoCodec: '',\n };\n const sectionLength = ((data[offset + 1] & 0x0f) << 8) | data[offset + 2];\n const tableEnd = offset + 3 + sectionLength - 4;\n // to determine where the table is, we have to figure out how\n // long the program info descriptors are\n const programInfoLength =\n ((data[offset + 10] & 0x0f) << 8) | data[offset + 11];\n // advance the offset to the first entry in the mapping table\n offset += 12 + programInfoLength;\n while (offset < tableEnd) {\n const pid = ((data[offset + 1] & 0x1f) << 8) | data[offset + 2];\n const esInfoLength = ((data[offset + 3] & 0x0f) << 8) | data[offset + 4];\n switch (data[offset]) {\n case 0x06:\n // stream_type 6 can mean a lot of different things in case of DVB.\n // We need to look at the descriptors. Right now, we're only\n // interested in a few audio and video formats,.\n if (esInfoLength > 0) {\n let parsePos = offset + 5;\n let remaining = esInfoLength;\n // Descriptor info: https://www.streamguru.de/mpeg-analyzer/supported-descriptor-list/\n while (remaining > 2) {\n const descriptorId = data[parsePos];\n const descriptorLen = data[parsePos + 1] + 2;\n switch (descriptorId) {\n // Registration descriptor\n case 0x05: {\n const registrationData =\n data.subarray(parsePos + 2, parsePos + descriptorLen);\n const registration =\n StringUtils.fromCharCode(registrationData);\n if (result.audio == -1 && registration === 'Opus') {\n result.audio = pid;\n result.audioCodec = 'opus';\n } else if (result.video == -1 && registration === 'AV01') {\n result.video = pid;\n result.videoCodec = 'av1';\n }\n break;\n }\n // DVB Descriptor for AC-3\n case 0x6a:\n if (result.audio == -1) {\n result.audio = pid;\n result.audioCodec = 'ac3';\n }\n break;\n // DVB Descriptor for EC-3\n case 0x7a:\n if (result.audio == -1) {\n result.audio = pid;\n result.audioCodec = 'ec3';\n }\n break;\n // DVB Descriptor for AAC\n case 0x7c:\n if (result.audio == -1) {\n result.audio = pid;\n result.audioCodec = 'aac';\n }\n break;\n // DVB extension descriptor\n case 0x7f:\n if (result.audioCodec == 'opus') {\n const extensionDescriptorId = data[parsePos + 2];\n let channelConfigCode = null;\n // User defined (provisional Opus)\n if (extensionDescriptorId === 0x80) {\n channelConfigCode = data[parsePos + 3];\n }\n\n if (channelConfigCode == null) {\n // Not Supported Opus channel count.\n break;\n }\n const channelCount = (channelConfigCode & 0x0F) === 0 ?\n 2 : (channelConfigCode & 0x0F);\n this.opusMetadata_ = {\n channelCount,\n channelConfigCode,\n sampleRate: 48000,\n };\n }\n break;\n }\n parsePos += descriptorLen;\n remaining -= descriptorLen;\n }\n }\n break;\n // SAMPLE-AES AAC\n case 0xcf:\n break;\n // ISO/IEC 13818-7 ADTS AAC (MPEG-2 lower bit-rate audio)\n case 0x0f:\n if (result.audio == -1) {\n result.audio = pid;\n result.audioCodec = 'aac';\n }\n break;\n // LOAS/LATM AAC\n case 0x11:\n if (result.audio == -1) {\n result.audio = pid;\n result.audioCodec = 'aac-loas';\n }\n break;\n // Packetized metadata (ID3)\n case 0x15:\n if (result.id3 == -1) {\n result.id3 = pid;\n }\n break;\n // SAMPLE-AES AVC\n case 0xdb:\n break;\n // ITU-T Rec. H.264 and ISO/IEC 14496-10 (lower bit-rate video)\n case 0x1b:\n if (result.video == -1) {\n result.video = pid;\n result.videoCodec = 'avc';\n }\n break;\n // ISO/IEC 11172-3 (MPEG-1 audio)\n // or ISO/IEC 13818-3 (MPEG-2 halved sample rate audio)\n case 0x03:\n case 0x04:\n if (result.audio == -1) {\n result.audio = pid;\n result.audioCodec = 'mp3';\n }\n break;\n // HEVC\n case 0x24:\n if (result.video == -1) {\n result.video = pid;\n result.videoCodec = 'hvc';\n }\n break;\n // AC-3\n case 0x81:\n if (result.audio == -1) {\n result.audio = pid;\n result.audioCodec = 'ac3';\n }\n break;\n // EC-3\n case 0x84:\n case 0x87:\n if (result.audio == -1) {\n result.audio = pid;\n result.audioCodec = 'ec3';\n }\n break;\n default:\n // shaka.log.warning('Unknown stream type:', data[offset]);\n break;\n }\n // move to the next table entry\n // skip past the elementary stream descriptors, if present\n offset += esInfoLength + 5;\n }\n return result;\n }\n\n /**\n * Parse PES\n *\n * @param {Uint8Array} data\n * @return {?shaka.extern.MPEG_PES}\n * @private\n */\n parsePES_(data) {\n const startPrefix = (data[0] << 16) | (data[1] << 8) | data[2];\n // In certain live streams, the start of a TS fragment has ts packets\n // that are frame data that is continuing from the previous fragment. This\n // is to check that the pes data is the start of a new pes data\n if (startPrefix !== 1) {\n return null;\n }\n /** @type {shaka.extern.MPEG_PES} */\n const pes = {\n data: new Uint8Array(0),\n // get the packet length, this will be 0 for video\n packetLength: ((data[4] << 8) | data[5]),\n pts: null,\n dts: null,\n nalus: [],\n };\n\n // if PES parsed length is not zero and greater than total received length,\n // stop parsing. PES might be truncated. minus 6 : PES header size\n if (pes.packetLength && pes.packetLength > data.byteLength - 6) {\n return null;\n }\n\n // PES packets may be annotated with a PTS value, or a PTS value\n // and a DTS value. Determine what combination of values is\n // available to work with.\n const ptsDtsFlags = data[7];\n\n // PTS and DTS are normally stored as a 33-bit number. Javascript\n // performs all bitwise operations on 32-bit integers but javascript\n // supports a much greater range (52-bits) of integer using standard\n // mathematical operations.\n // We construct a 31-bit value using bitwise operators over the 31\n // most significant bits and then multiply by 4 (equal to a left-shift\n // of 2) before we add the final 2 least significant bits of the\n // timestamp (equal to an OR.)\n if (ptsDtsFlags & 0xC0) {\n // the PTS and DTS are not written out directly. For information\n // on how they are encoded, see\n // http://dvd.sourceforge.net/dvdinfo/pes-hdr.html\n const pts =\n (data[9] & 0x0e) * 536870912 + // 1 << 29\n (data[10] & 0xff) * 4194304 + // 1 << 22\n (data[11] & 0xfe) * 16384 + // 1 << 14\n (data[12] & 0xff) * 128 + // 1 << 7\n (data[13] & 0xfe) / 2;\n\n if (this.referencePts_ == null) {\n this.referencePts_ = pts;\n }\n\n pes.pts = this.handleRollover_(pts, this.referencePts_);\n this.referencePts_ = pes.pts;\n\n pes.dts = pes.pts;\n if (ptsDtsFlags & 0x40) {\n const dts =\n (data[14] & 0x0e) * 536870912 + // 1 << 29\n (data[15] & 0xff) * 4194304 + // 1 << 22\n (data[16] & 0xfe) * 16384 + // 1 << 14\n (data[17] & 0xff) * 128 + // 1 << 7\n (data[18] & 0xfe) / 2;\n\n if (this.referenceDts_ == null) {\n this.referenceDts_ = dts;\n }\n\n pes.dts = this.handleRollover_(dts, this.referenceDts_);\n }\n this.referenceDts_ = pes.dts;\n }\n\n const pesHdrLen = data[8];\n // 9 bytes : 6 bytes for PES header + 3 bytes for PES extension\n const payloadStartOffset = pesHdrLen + 9;\n if (data.byteLength <= payloadStartOffset) {\n return null;\n }\n\n pes.data = data.subarray(payloadStartOffset);\n\n return pes;\n }\n\n /**\n * Parse AVC Nalus\n *\n * The code is based on hls.js\n * Credit to https://github.com/video-dev/hls.js/blob/master/src/demux/tsdemuxer.ts\n *\n * @param {shaka.extern.MPEG_PES} pes\n * @param {?shaka.extern.MPEG_PES=} nextPes\n * @return {!Array<shaka.extern.VideoNalu>}\n * @export\n */\n parseAvcNalus(pes, nextPes) {\n shaka.Deprecate.deprecateFeature(5,\n 'TsParser.parseAvcNalus',\n 'Please use parseNalus function instead.');\n const lastInfo = {\n nalu: null,\n state: null,\n };\n return this.parseNalus(pes, lastInfo);\n }\n\n /**\n * Parse AVC and HVC Nalus\n *\n * The code is based on hls.js\n * Credit to https://github.com/video-dev/hls.js/blob/master/src/demux/tsdemuxer.ts\n *\n * @param {shaka.extern.MPEG_PES} pes\n * @param {{nalu: ?shaka.extern.VideoNalu, state: ?number}} lastInfo\n * @return {!Array<shaka.extern.VideoNalu>}\n * @export\n */\n parseNalus(pes, lastInfo) {\n const timescale = shaka.util.TsParser.Timescale;\n const time = pes.pts ? pes.pts / timescale : null;\n const data = pes.data;\n const len = data.byteLength;\n\n let naluHeaderSize = 1;\n if (this.videoCodec_ == 'hvc') {\n naluHeaderSize = 2;\n }\n\n // A NALU does not contain is its size.\n // The Annex B specification solves this by requiring ‘Start Codes’ to\n // precede each NALU. A start code is 2 or 3 0x00 bytes followed with a\n // 0x01 byte. e.g. 0x000001 or 0x00000001.\n // More info in: https://stackoverflow.com/questions/24884827/possible-locations-for-sequence-picture-parameter-sets-for-h-264-stream/24890903#24890903\n let numZeros = lastInfo.state || 0;\n\n const initialNumZeros = numZeros;\n\n /** @type {number} */\n let i = 0;\n\n /** @type {!Array<shaka.extern.VideoNalu>} */\n const nalus = [];\n\n // Start position includes the first byte where we read the type.\n // The data we extract begins at the next byte.\n let lastNaluStart = -1;\n // Extracted from the first byte.\n let lastNaluType = 0;\n\n const getNaluType = (offset) => {\n if (this.videoCodec_ == 'hvc') {\n return (data[offset] >> 1) & 0x3f;\n } else {\n return data[offset] & 0x1f;\n }\n };\n\n const getLastNalu = () => {\n if (nalus.length) {\n return nalus[nalus.length - 1];\n }\n return lastInfo.nalu;\n };\n\n if (numZeros == -1) {\n // special use case where we found 3 or 4-byte start codes exactly at the\n // end of previous PES packet\n lastNaluStart = 0;\n // NALu type is value read from offset 0\n lastNaluType = getNaluType(0);\n numZeros = 0;\n i = 1;\n }\n\n while (i < len) {\n const value = data[i++];\n // Optimization. numZeros 0 and 1 are the predominant case.\n if (!numZeros) {\n numZeros = value ? 0 : 1;\n continue;\n }\n if (numZeros === 1) {\n numZeros = value ? 0 : 2;\n continue;\n }\n if (!value) {\n numZeros = 3;\n } else if (value == 1) {\n const overflow = i - numZeros - 1;\n if (lastNaluStart >= 0) {\n /** @type {shaka.extern.VideoNalu} */\n const nalu = {\n data: data.subarray(lastNaluStart + naluHeaderSize, overflow),\n fullData: data.subarray(lastNaluStart, overflow),\n type: lastNaluType,\n time: time,\n state: null,\n };\n nalus.push(nalu);\n } else {\n const lastNalu = getLastNalu();\n if (lastNalu) {\n if (initialNumZeros && i <= 4 - initialNumZeros) {\n // Start delimiter overlapping between PES packets\n // strip start delimiter bytes from the end of last NAL unit\n // check if lastNalu had a state different from zero\n if (lastNalu.state) {\n // strip last bytes\n lastNalu.data = lastNalu.data.subarray(\n 0, lastNalu.data.byteLength - initialNumZeros);\n lastNalu.fullData = lastNalu.fullData.subarray(\n 0, lastNalu.fullData.byteLength - initialNumZeros);\n }\n }\n // If NAL units are not starting right at the beginning of the PES\n // packet, push preceding data into previous NAL unit.\n if (overflow > 0) {\n const prevData = data.subarray(0, overflow);\n lastNalu.data = shaka.util.Uint8ArrayUtils.concat(\n lastNalu.data, prevData);\n lastNalu.fullData = shaka.util.Uint8ArrayUtils.concat(\n lastNalu.fullData, prevData);\n lastNalu.state = 0;\n }\n }\n }\n\n // Check if we can read unit type\n if (i < len) {\n lastNaluType = getNaluType(i);\n lastNaluStart = i;\n numZeros = 0;\n } else {\n // Not enough byte to read unit type.\n // Let's read it on next PES parsing.\n numZeros = -1;\n }\n } else {\n numZeros = 0;\n }\n }\n\n if (lastNaluStart >= 0 && numZeros >= 0) {\n const nalu = {\n data: data.subarray(lastNaluStart + naluHeaderSize, len),\n fullData: data.subarray(lastNaluStart, len),\n type: lastNaluType,\n time: time,\n state: numZeros,\n };\n nalus.push(nalu);\n }\n if (!nalus.length && lastInfo.nalu) {\n const lastNalu = getLastNalu();\n if (lastNalu) {\n lastNalu.data = shaka.util.Uint8ArrayUtils.concat(\n lastNalu.data, data);\n lastNalu.fullData = shaka.util.Uint8ArrayUtils.concat(\n lastNalu.fullData, data);\n }\n }\n lastInfo.state = numZeros;\n return nalus;\n }\n\n /**\n * Return the ID3 metadata\n *\n * @return {!Array<shaka.extern.ID3Metadata>}\n * @export\n */\n getMetadata() {\n const timescale = shaka.util.TsParser.Timescale;\n const metadata = [];\n for (const id3DataArray of this.id3Data_) {\n const id3Data = shaka.util.Uint8ArrayUtils.concat(...id3DataArray);\n const pes = this.parsePES_(id3Data);\n if (pes) {\n metadata.push({\n cueTime: pes.pts ? pes.pts / timescale : null,\n data: pes.data,\n frames: shaka.util.Id3Utils.getID3Frames(pes.data),\n dts: pes.dts,\n pts: pes.pts,\n });\n }\n }\n return metadata;\n }\n\n /**\n * Return the audio data\n *\n * @return {!Array<shaka.extern.MPEG_PES>}\n * @export\n */\n getAudioData() {\n if (this.audioData_.length && !this.audioPes_.length) {\n let sort = false;\n for (const audioDataArray of this.audioData_) {\n const audioData = shaka.util.Uint8ArrayUtils.concat(...audioDataArray);\n const pes = this.parsePES_(audioData);\n let previousPes = this.audioPes_.length ?\n this.audioPes_[this.audioPes_.length - 1] : null;\n if (pes && pes.pts != null && pes.dts != null && (!previousPes ||\n (previousPes.pts != pes.pts && previousPes.dts != pes.dts))) {\n if (this.audioPes_.length && pes.dts < (previousPes.dts || 0)) {\n sort = true;\n }\n this.audioPes_.push(pes);\n } else if (this.audioPes_.length) {\n const data = pes ? pes.data : audioData;\n if (!data) {\n continue;\n }\n previousPes = this.audioPes_.pop();\n previousPes.data =\n shaka.util.Uint8ArrayUtils.concat(previousPes.data, data);\n this.audioPes_.push(previousPes);\n }\n }\n if (sort) {\n this.audioPes_ = this.audioPes_.sort((a, b) => {\n const deltaDts = (a.dts || 0) - (b.dts || 0);\n const deltaPts = (a.pts || 0) - (b.pts || 0);\n return deltaDts || deltaPts;\n });\n }\n }\n return this.audioPes_;\n }\n\n /**\n * Return the video data\n *\n * @param {boolean=} naluProcessing\n * @return {!Array<shaka.extern.MPEG_PES>}\n * @export\n */\n getVideoData(naluProcessing = true) {\n if (this.videoData_.length && !this.videoPes_.length) {\n let sort = false;\n for (const videoDataArray of this.videoData_) {\n const videoData = shaka.util.Uint8ArrayUtils.concat(...videoDataArray);\n const pes = this.parsePES_(videoData);\n let previousPes = this.videoPes_.length ?\n this.videoPes_[this.videoPes_.length - 1] : null;\n if (pes && pes.pts != null && pes.dts != null && (!previousPes ||\n (previousPes.pts != pes.pts && previousPes.dts != pes.dts))) {\n if (this.videoPes_.length && pes.dts < (previousPes.dts || 0)) {\n sort = true;\n }\n this.videoPes_.push(pes);\n } else if (this.videoPes_.length) {\n const data = pes ? pes.data : videoData;\n if (!data) {\n continue;\n }\n previousPes = this.videoPes_.pop();\n previousPes.data =\n shaka.util.Uint8ArrayUtils.concat(previousPes.data, data);\n this.videoPes_.push(previousPes);\n }\n }\n if (naluProcessing) {\n const lastInfo = {\n nalu: null,\n state: null,\n };\n const pesWithLength = [];\n for (const pes of this.videoPes_) {\n pes.nalus = this.parseNalus(pes, lastInfo);\n if (pes.nalus.length) {\n pesWithLength.push(pes);\n lastInfo.nalu = pes.nalus[pes.nalus.length - 1];\n }\n }\n this.videoPes_ = pesWithLength;\n }\n if (sort) {\n this.videoPes_ = this.videoPes_.sort((a, b) => {\n const deltaDts = (a.dts || 0) - (b.dts || 0);\n const deltaPts = (a.pts || 0) - (b.pts || 0);\n return deltaDts || deltaPts;\n });\n }\n }\n if (!naluProcessing) {\n const prevVideoPes = this.videoPes_;\n this.videoPes_ = [];\n return prevVideoPes;\n }\n return this.videoPes_;\n }\n\n /**\n * Return the start time for the audio and video\n *\n * @param {string} contentType\n * @return {?number}\n * @export\n */\n getStartTime(contentType) {\n const timescale = shaka.util.TsParser.Timescale;\n if (contentType == 'audio') {\n let audioStartTime = null;\n const audioData = this.getAudioData();\n if (audioData.length) {\n const pes = audioData[0];\n audioStartTime = Math.min(pes.dts, pes.pts) / timescale;\n }\n return audioStartTime;\n } else if (contentType == 'video') {\n let videoStartTime = null;\n const videoData = this.getVideoData(/* naluProcessing= */ false);\n if (videoData.length) {\n const pes = videoData[0];\n videoStartTime = Math.min(pes.dts, pes.pts) / timescale;\n }\n return videoStartTime;\n }\n return null;\n }\n\n /**\n * Return the audio and video codecs\n *\n * @return {{audio: ?string, video: ?string}}\n * @export\n */\n getCodecs() {\n return {\n audio: this.audioCodec_,\n video: this.videoCodec_,\n };\n }\n\n /**\n * Return the video data\n *\n * @return {!Array<shaka.extern.VideoNalu>}\n * @export\n */\n getVideoNalus() {\n const nalus = [];\n for (const pes of this.getVideoData()) {\n nalus.push(...pes.nalus);\n }\n return nalus;\n }\n\n /**\n * Return the video resolution\n *\n * @return {{height: ?string, width: ?string}}\n * @export\n */\n getVideoResolution() {\n shaka.Deprecate.deprecateFeature(5,\n 'TsParser.getVideoResolution',\n 'Please use getVideoInfo function instead.');\n const videoInfo = this.getVideoInfo();\n return {\n height: videoInfo.height,\n width: videoInfo.width,\n };\n }\n\n /**\n * Return the video information\n *\n * @return {{height: ?string, width: ?string, codec: ?string,\n * frameRate: ?string}}\n * @export\n */\n getVideoInfo() {\n if (this.videoCodec_ == 'hvc') {\n return this.getHvcInfo_();\n }\n return this.getAvcInfo_();\n }\n\n /**\n * @return {?string}\n * @private\n */\n getFrameRate_() {\n const timescale = shaka.util.TsParser.Timescale;\n const videoData = this.getVideoData();\n if (videoData.length > 1) {\n const firstPts = videoData[0].pts;\n goog.asserts.assert(typeof(firstPts) == 'number',\n 'Should be an number!');\n const secondPts = videoData[1].pts;\n goog.asserts.assert(typeof(secondPts) == 'number',\n 'Should be an number!');\n if (!isNaN(secondPts - firstPts)) {\n return String(1 / (secondPts - firstPts) * timescale);\n }\n }\n return null;\n }\n\n /**\n * Return the video information for AVC\n *\n * @return {{height: ?string, width: ?string, codec: ?string,\n * frameRate: ?string}}\n * @private\n */\n getAvcInfo_() {\n const TsParser = shaka.util.TsParser;\n const videoInfo = {\n height: null,\n width: null,\n codec: null,\n frameRate: null,\n };\n const videoNalus = this.getVideoNalus();\n if (!videoNalus.length) {\n return videoInfo;\n }\n const spsNalu = videoNalus.find((nalu) => {\n return nalu.type == TsParser.H264_NALU_TYPE_SPS_;\n });\n if (!spsNalu) {\n return videoInfo;\n }\n\n const expGolombDecoder = new shaka.util.ExpGolomb(spsNalu.data);\n // profile_idc\n const profileIdc = expGolombDecoder.readUnsignedByte();\n // constraint_set[0-5]_flag\n const profileCompatibility = expGolombDecoder.readUnsignedByte();\n // level_idc u(8)\n const levelIdc = expGolombDecoder.readUnsignedByte();\n // seq_parameter_set_id\n expGolombDecoder.skipExpGolomb();\n\n // some profiles have more optional data we don't need\n if (TsParser.PROFILES_WITH_OPTIONAL_SPS_DATA_.includes(profileIdc)) {\n const chromaFormatIdc = expGolombDecoder.readUnsignedExpGolomb();\n if (chromaFormatIdc === 3) {\n // separate_colour_plane_flag\n expGolombDecoder.skipBits(1);\n }\n // bit_depth_luma_minus8\n expGolombDecoder.skipExpGolomb();\n // bit_depth_chroma_minus8\n expGolombDecoder.skipExpGolomb();\n // qpprime_y_zero_transform_bypass_flag\n expGolombDecoder.skipBits(1);\n // seq_scaling_matrix_present_flag\n if (expGolombDecoder.readBoolean()) {\n const scalingListCount = (chromaFormatIdc !== 3) ? 8 : 12;\n for (let i = 0; i < scalingListCount; i++) {\n // seq_scaling_list_present_flag[ i ]\n if (expGolombDecoder.readBoolean()) {\n if (i < 6) {\n expGolombDecoder.skipScalingList(16);\n } else {\n expGolombDecoder.skipScalingList(64);\n }\n }\n }\n }\n }\n\n // log2_max_frame_num_minus4\n expGolombDecoder.skipExpGolomb();\n const picOrderCntType = expGolombDecoder.readUnsignedExpGolomb();\n\n if (picOrderCntType === 0) {\n // log2_max_pic_order_cnt_lsb_minus4\n expGolombDecoder.readUnsignedExpGolomb();\n } else if (picOrderCntType === 1) {\n // delta_pic_order_always_zero_flag\n expGolombDecoder.skipBits(1);\n // offset_for_non_ref_pic\n expGolombDecoder.skipExpGolomb();\n // offset_for_top_to_bottom_field\n expGolombDecoder.skipExpGolomb();\n const numRefFramesInPicOrderCntCycle =\n expGolombDecoder.readUnsignedExpGolomb();\n for (let i = 0; i < numRefFramesInPicOrderCntCycle; i++) {\n // offset_for_ref_frame[ i ]\n expGolombDecoder.skipExpGolomb();\n }\n }\n\n // max_num_ref_frames\n expGolombDecoder.skipExpGolomb();\n // gaps_in_frame_num_value_allowed_flag\n expGolombDecoder.skipBits(1);\n\n const picWidthInMbsMinus1 =\n expGolombDecoder.readUnsignedExpGolomb();\n const picHeightInMapUnitsMinus1 =\n expGolombDecoder.readUnsignedExpGolomb();\n\n const frameMbsOnlyFlag = expGolombDecoder.readBits(1);\n if (frameMbsOnlyFlag === 0) {\n // mb_adaptive_frame_field_flag\n expGolombDecoder.skipBits(1);\n }\n // direct_8x8_inference_flag\n expGolombDecoder.skipBits(1);\n\n let frameCropLeftOffset = 0;\n let frameCropRightOffset = 0;\n let frameCropTopOffset = 0;\n let frameCropBottomOffset = 0;\n\n // frame_cropping_flag\n if (expGolombDecoder.readBoolean()) {\n frameCropLeftOffset = expGolombDecoder.readUnsignedExpGolomb();\n frameCropRightOffset = expGolombDecoder.readUnsignedExpGolomb();\n frameCropTopOffset = expGolombDecoder.readUnsignedExpGolomb();\n frameCropBottomOffset = expGolombDecoder.readUnsignedExpGolomb();\n }\n\n videoInfo.height = String(((2 - frameMbsOnlyFlag) *\n (picHeightInMapUnitsMinus1 + 1) * 16) - (frameCropTopOffset * 2) -\n (frameCropBottomOffset * 2));\n videoInfo.width = String(((picWidthInMbsMinus1 + 1) * 16) -\n frameCropLeftOffset * 2 - frameCropRightOffset * 2);\n videoInfo.codec = 'avc1.' + this.byteToHex_(profileIdc) +\n this.byteToHex_(profileCompatibility) + this.byteToHex_(levelIdc);\n videoInfo.frameRate = this.getFrameRate_();\n\n return videoInfo;\n }\n\n /**\n * Return the video information for HVC\n *\n * @return {{height: ?string, width: ?string, codec: ?string,\n * frameRate: ?string}}\n * @private\n */\n getHvcInfo_() {\n const TsParser = shaka.util.TsParser;\n const videoInfo = {\n height: null,\n width: null,\n codec: null,\n frameRate: null,\n };\n const videoNalus = this.getVideoNalus();\n if (!videoNalus.length) {\n return videoInfo;\n }\n const spsNalu = videoNalus.find((nalu) => {\n return nalu.type == TsParser.H265_NALU_TYPE_SPS_;\n });\n if (!spsNalu) {\n return videoInfo;\n }\n\n const gb = new shaka.util.ExpGolomb(\n spsNalu.fullData, /* convertEbsp2rbsp= */ true);\n\n // remove NALu Header\n gb.readUnsignedByte();\n gb.readUnsignedByte();\n\n // SPS\n gb.readBits(4); // video_parameter_set_id\n const maxSubLayersMinus1 = gb.readBits(3);\n gb.readBoolean(); // temporal_id_nesting_flag\n\n // profile_tier_level begin\n const generalProfileSpace = gb.readBits(2);\n const generalTierFlag = gb.readBits(1);\n const generalProfileIdc = gb.readBits(5);\n const generalProfileCompatibilityFlags = gb.readBits(32);\n const generalConstraintIndicatorFlags1 = gb.readUnsignedByte();\n const generalConstraintIndicatorFlags2 = gb.readUnsignedByte();\n const generalConstraintIndicatorFlags3 = gb.readUnsignedByte();\n const generalConstraintIndicatorFlags4 = gb.readUnsignedByte();\n const generalConstraintIndicatorFlags5 = gb.readUnsignedByte();\n const generalConstraintIndicatorFlags6 = gb.readUnsignedByte();\n const generalLevelIdc = gb.readUnsignedByte();\n const subLayerProfilePresentFlag = [];\n const subLayerLevelPresentFlag = [];\n for (let i = 0; i < maxSubLayersMinus1; i++) {\n subLayerProfilePresentFlag.push(gb.readBoolean());\n subLayerLevelPresentFlag.push(gb.readBoolean());\n }\n if (maxSubLayersMinus1 > 0) {\n for (let i = maxSubLayersMinus1; i < 8; i++) {\n gb.readBits(2);\n }\n }\n for (let i = 0; i < maxSubLayersMinus1; i++) {\n if (subLayerProfilePresentFlag[i]) {\n gb.readBits(88);\n }\n if (subLayerLevelPresentFlag[i]) {\n gb.readUnsignedByte();\n }\n }\n // profile_tier_level end\n\n gb.readUnsignedExpGolomb(); // seq_parameter_set_id\n const chromaFormatIdc = gb.readUnsignedExpGolomb();\n if (chromaFormatIdc == 3) {\n gb.readBits(1); // separate_colour_plane_flag\n }\n const picWidthInLumaSamples = gb.readUnsignedExpGolomb();\n const picHeightInLumaSamples = gb.readUnsignedExpGolomb();\n let leftOffset = 0;\n let rightOffset = 0;\n let topOffset = 0;\n let bottomOffset = 0;\n const conformanceWindowFlag = gb.readBoolean();\n if (conformanceWindowFlag) {\n leftOffset += gb.readUnsignedExpGolomb();\n rightOffset += gb.readUnsignedExpGolomb();\n topOffset += gb.readUnsignedExpGolomb();\n bottomOffset += gb.readUnsignedExpGolomb();\n }\n\n const subWc = chromaFormatIdc === 1 || chromaFormatIdc === 2 ? 2 : 1;\n const subHc = chromaFormatIdc === 1 ? 2 : 1;\n videoInfo.width =\n String(picWidthInLumaSamples - (leftOffset + rightOffset) * subWc);\n videoInfo.height =\n String(picHeightInLumaSamples - (topOffset + bottomOffset) * subHc);\n\n const reverseBits = (integer) => {\n let result = 0;\n for (let i = 0; i < 32; i++) {\n result |= ((integer >> i) & 1) << (31 - i);\n }\n return result >>> 0;\n };\n\n const profileSpace = ['', 'A', 'B', 'C'][generalProfileSpace];\n const profileCompatibility = reverseBits(generalProfileCompatibilityFlags);\n const tierFlag = generalTierFlag == 1 ? 'H' : 'L';\n\n let codec = 'hvc1';\n codec += '.' + profileSpace + generalProfileIdc;\n codec += '.' + profileCompatibility.toString(16).toUpperCase();\n codec += '.' + tierFlag + generalLevelIdc;\n if (generalConstraintIndicatorFlags6) {\n codec += '.' +\n generalConstraintIndicatorFlags6.toString(16).toUpperCase();\n }\n if (generalConstraintIndicatorFlags5) {\n codec += '.' +\n generalConstraintIndicatorFlags5.toString(16).toUpperCase();\n }\n if (generalConstraintIndicatorFlags4) {\n codec += '.' +\n generalConstraintIndicatorFlags4.toString(16).toUpperCase();\n }\n if (generalConstraintIndicatorFlags3) {\n codec += '.' +\n generalConstraintIndicatorFlags3.toString(16).toUpperCase();\n }\n if (generalConstraintIndicatorFlags2) {\n codec += '.' +\n generalConstraintIndicatorFlags2.toString(16).toUpperCase();\n }\n if (generalConstraintIndicatorFlags1) {\n codec += '.' +\n generalConstraintIndicatorFlags1.toString(16).toUpperCase();\n }\n videoInfo.codec = codec;\n videoInfo.frameRate = this.getFrameRate_();\n\n return videoInfo;\n }\n\n /**\n * Return the Opus metadata\n *\n * @return {?shaka.util.TsParser.OpusMetadata}\n */\n getOpusMetadata() {\n return this.opusMetadata_;\n }\n\n /**\n * Convert a byte to 2 digits of hex. (Only handles values 0-255.)\n *\n * @param {number} x\n * @return {string}\n * @private\n */\n byteToHex_(x) {\n return ('0' + x.toString(16).toUpperCase()).slice(-2);\n }\n\n /**\n * @param {number} value\n * @param {number} reference\n * @return {number}\n * @private\n */\n handleRollover_(value, reference) {\n const MAX_TS = 8589934592;\n const RO_THRESH = 4294967296;\n\n let direction = 1;\n\n if (value > reference) {\n // If the current timestamp value is greater than our reference timestamp\n // and we detect a timestamp rollover, this means the roll over is\n // happening in the opposite direction.\n // Example scenario: Enter a long stream/video just after a rollover\n // occurred. The reference point will be set to a small number, e.g. 1.\n // The user then seeks backwards over the rollover point. In loading this\n // segment, the timestamp values will be very large, e.g. 2^33 - 1. Since\n // this comes before the data we loaded previously, we want to adjust the\n // time stamp to be `value - 2^33`.\n direction = -1;\n }\n\n // Note: A seek forwards or back that is greater than the RO_THRESH\n // (2^32, ~13 hours) will cause an incorrect adjustment.\n while (Math.abs(reference - value) > RO_THRESH) {\n value += (direction * MAX_TS);\n }\n\n return value;\n }\n\n /**\n * Check if the passed data corresponds to an MPEG2-TS\n *\n * @param {Uint8Array} data\n * @return {boolean}\n * @export\n */\n static probe(data) {\n const syncOffset = shaka.util.TsParser.syncOffset(data);\n if (syncOffset < 0) {\n return false;\n } else {\n if (syncOffset > 0) {\n shaka.log.warning('MPEG2-TS detected but first sync word found @ ' +\n 'offset ' + syncOffset + ', junk ahead ?');\n }\n return true;\n }\n }\n\n /**\n * Returns the synchronization offset\n *\n * @param {Uint8Array} data\n * @return {number}\n * @export\n */\n static syncOffset(data) {\n const packetLength = shaka.util.TsParser.PacketLength_;\n // scan 1000 first bytes\n const scanWindow = Math.min(1000, data.length - 3 * packetLength);\n let i = 0;\n while (i < scanWindow) {\n // a TS fragment should contain at least 3 TS packets, a PAT, a PMT, and\n // one PID, each starting with 0x47\n if (data[i] == 0x47 &&\n data[i + packetLength] == 0x47 &&\n data[i + 2 * packetLength] == 0x47) {\n return i;\n } else {\n i++;\n }\n }\n return -1;\n }\n};\n\n\n/**\n * @const {number}\n * @export\n */\nshaka.util.TsParser.Timescale = 90000;\n\n\n/**\n * @const {number}\n * @private\n */\nshaka.util.TsParser.PacketLength_ = 188;\n\n\n/**\n * NALU type for Sequence Parameter Set (SPS) for H.264.\n * @const {number}\n * @private\n */\nshaka.util.TsParser.H264_NALU_TYPE_SPS_ = 0x07;\n\n\n/**\n * NALU type for Sequence Parameter Set (SPS) for H.265.\n * @const {number}\n * @private\n */\nshaka.util.TsParser.H265_NALU_TYPE_SPS_ = 0x21;\n\n\n/**\n * Values of profile_idc that indicate additional fields are included in the\n * SPS.\n * see Recommendation ITU-T H.264 (4/2013)\n * 7.3.2.1.1 Sequence parameter set data syntax\n *\n * @const {!Array<number>}\n * @private\n */\nshaka.util.TsParser.PROFILES_WITH_OPTIONAL_SPS_DATA_ =\n [100, 110, 122, 244, 44, 83, 86, 118, 128, 138, 139, 134];\n\n\n/**\n * @typedef {{\n * audio: number,\n * video: number,\n * id3: number,\n * audioCodec: string,\n * videoCodec: string\n * }}\n *\n * @summary PMT.\n * @property {number} audio\n * Audio PID\n * @property {number} video\n * Video PID\n * @property {number} id3\n * ID3 PID\n * @property {string} audioCodec\n * Audio codec\n * @property {string} videoCodec\n * Video codec\n */\nshaka.util.TsParser.PMT;\n\n\n/**\n * @typedef {{\n * channelCount: number,\n * channelConfigCode: number,\n * sampleRate: number\n * }}\n *\n * @summary PMT.\n * @property {number} channelCount\n * @property {number} channelConfigCode\n * @property {number} sampleRate\n */\nshaka.util.TsParser.OpusMetadata;\n\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.media.MediaSourceEngine');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.log');\ngoog.require('shaka.config.CodecSwitchingStrategy');\ngoog.require('shaka.media.Capabilities');\ngoog.require('shaka.media.ContentWorkarounds');\ngoog.require('shaka.media.ClosedCaptionParser');\ngoog.require('shaka.media.IClosedCaptionParser');\ngoog.require('shaka.media.ManifestParser');\ngoog.require('shaka.media.SegmentReference');\ngoog.require('shaka.media.TimeRangesUtils');\ngoog.require('shaka.text.TextEngine');\ngoog.require('shaka.transmuxer.TransmuxerEngine');\ngoog.require('shaka.util.BufferUtils');\ngoog.require('shaka.util.Destroyer');\ngoog.require('shaka.util.Dom');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.EventManager');\ngoog.require('shaka.util.FakeEvent');\ngoog.require('shaka.util.Functional');\ngoog.require('shaka.util.IDestroyable');\ngoog.require('shaka.util.Id3Utils');\ngoog.require('shaka.util.ManifestParserUtils');\ngoog.require('shaka.util.MimeUtils');\ngoog.require('shaka.util.Mp4BoxParsers');\ngoog.require('shaka.util.Mp4Parser');\ngoog.require('shaka.util.Platform');\ngoog.require('shaka.util.PublicPromise');\ngoog.require('shaka.util.StreamUtils');\ngoog.require('shaka.util.TsParser');\ngoog.require('shaka.lcevc.Dec');\n\n\n/**\n * @summary\n * MediaSourceEngine wraps all operations on MediaSource and SourceBuffers.\n * All asynchronous operations return a Promise, and all operations are\n * internally synchronized and serialized as needed. Operations that can\n * be done in parallel will be done in parallel.\n *\n * @implements {shaka.util.IDestroyable}\n */\nshaka.media.MediaSourceEngine = class {\n /**\n * @param {HTMLMediaElement} video The video element, whose source is tied to\n * MediaSource during the lifetime of the MediaSourceEngine.\n * @param {!shaka.extern.TextDisplayer} textDisplayer\n * The text displayer that will be used with the text engine.\n * MediaSourceEngine takes ownership of the displayer. When\n * MediaSourceEngine is destroyed, it will destroy the displayer.\n * @param {!shaka.media.MediaSourceEngine.PlayerInterface} playerInterface\n * Interface for common player methods.\n * @param {?shaka.lcevc.Dec} [lcevcDec] Optional - LCEVC Decoder Object\n */\n constructor(video, textDisplayer, playerInterface, lcevcDec) {\n /** @private {HTMLMediaElement} */\n this.video_ = video;\n\n /** @private {?shaka.media.MediaSourceEngine.PlayerInterface} */\n this.playerInterface_ = playerInterface;\n\n /** @private {?shaka.extern.MediaSourceConfiguration} */\n this.config_ = null;\n\n /** @private {shaka.extern.TextDisplayer} */\n this.textDisplayer_ = textDisplayer;\n\n /**\n * @private {!Map<shaka.util.ManifestParserUtils.ContentType, SourceBuffer>}\n */\n this.sourceBuffers_ = new Map();\n\n /**\n * @private {!Map<shaka.util.ManifestParserUtils.ContentType, string>}\n */\n this.sourceBufferTypes_ = new Map();\n\n\n /**\n * @private {!Map<shaka.util.ManifestParserUtils.ContentType,\n * boolean>}\n */\n this.expectedEncryption_ = new Map();\n\n /** @private {shaka.text.TextEngine} */\n this.textEngine_ = null;\n\n /** @private {boolean} */\n this.segmentRelativeVttTiming_ = false;\n\n /** @private {?shaka.lcevc.Dec} */\n this.lcevcDec_ = lcevcDec || null;\n\n /**\n * @private {!Map<string, !Array<shaka.media.MediaSourceEngine.Operation>>}\n */\n this.queues_ = new Map();\n\n /** @private {shaka.util.EventManager} */\n this.eventManager_ = new shaka.util.EventManager();\n\n /**\n * @private {!Map<shaka.util.ManifestParserUtils.ContentType,\n !shaka.extern.Transmuxer>} */\n this.transmuxers_ = new Map();\n\n /** @private {?shaka.media.IClosedCaptionParser} */\n this.captionParser_ = null;\n\n /** @private {!shaka.util.PublicPromise} */\n this.mediaSourceOpen_ = new shaka.util.PublicPromise();\n\n /** @private {string} */\n this.url_ = '';\n\n /** @private {boolean} */\n this.playbackHasBegun_ = false;\n\n /** @private {boolean} */\n this.streamingAllowed_ = true;\n\n /** @private {boolean} */\n this.usingRemotePlayback_ = false;\n\n /** @private {HTMLSourceElement} */\n this.source_ = null;\n\n /**\n * Fallback source element with direct media URI, used for casting\n * purposes.\n * @private {HTMLSourceElement}\n */\n this.secondarySource_ = null;\n\n /** @private {MediaSource} */\n this.mediaSource_ = this.createMediaSource(this.mediaSourceOpen_);\n\n /** @private {boolean} */\n this.reloadingMediaSource_ = false;\n\n /** @type {!shaka.util.Destroyer} */\n this.destroyer_ = new shaka.util.Destroyer(() => this.doDestroy_());\n\n /** @private {boolean} */\n this.sequenceMode_ = false;\n\n /** @private {string} */\n this.manifestType_ = shaka.media.ManifestParser.UNKNOWN;\n\n /** @private {boolean} */\n this.ignoreManifestTimestampsInSegmentsMode_ = false;\n\n /** @private {boolean} */\n this.attemptTimestampOffsetCalculation_ = false;\n\n /** @private {!shaka.util.PublicPromise<number>} */\n this.textSequenceModeOffset_ = new shaka.util.PublicPromise();\n\n /** @private {boolean} */\n this.needSplitMuxedContent_ = false;\n\n /** @private {?number} */\n this.lastDuration_ = null;\n\n /**\n * @private {!Map<shaka.util.ManifestParserUtils.ContentType,\n * !shaka.util.TsParser>}\n */\n this.tsParsers_ = new Map();\n\n /** @private {?number} */\n this.firstVideoTimestamp_ = null;\n\n /** @private {?number} */\n this.firstVideoReferenceStartTime_ = null;\n\n /** @private {?number} */\n this.firstAudioTimestamp_ = null;\n\n /** @private {?number} */\n this.firstAudioReferenceStartTime_ = null;\n\n /** @private {!shaka.util.PublicPromise<number>} */\n this.audioCompensation_ = new shaka.util.PublicPromise();\n\n if (this.video_.remote) {\n this.usingRemotePlayback_ = this.video_.remote.state != 'disconnected';\n\n this.eventManager_.listen(this.video_.remote, 'connect', () => {\n this.usingRemotePlayback_ = this.video_.remote.state != 'disconnected';\n });\n\n this.eventManager_.listen(this.video_.remote, 'connecting', () => {\n this.usingRemotePlayback_ = this.video_.remote.state != 'disconnected';\n });\n\n this.eventManager_.listen(this.video_.remote, 'disconnect', () => {\n this.usingRemotePlayback_ = this.video_.remote.state != 'disconnected';\n });\n }\n }\n\n /**\n * Create a MediaSource object, attach it to the video element, and return it.\n * Resolves the given promise when the MediaSource is ready.\n *\n * Replaced by unit tests.\n *\n * @param {!shaka.util.PublicPromise} p\n * @return {!MediaSource}\n */\n createMediaSource(p) {\n this.streamingAllowed_ = true;\n\n /** @type {!MediaSource} */\n let mediaSource;\n\n if (window.ManagedMediaSource) {\n if (!this.secondarySource_) {\n this.video_.disableRemotePlayback = true;\n }\n\n mediaSource = new ManagedMediaSource();\n\n this.eventManager_.listen(\n mediaSource, 'startstreaming', () => {\n shaka.log.info('MMS startstreaming');\n this.streamingAllowed_ = true;\n });\n\n this.eventManager_.listen(\n mediaSource, 'endstreaming', () => {\n shaka.log.info('MMS endstreaming');\n this.streamingAllowed_ = false;\n });\n } else {\n mediaSource = new MediaSource();\n }\n\n // Set up MediaSource on the video element.\n this.eventManager_.listenOnce(\n mediaSource, 'sourceopen', () => this.onSourceOpen_(p));\n\n // Correctly set when playback has begun.\n this.eventManager_.listenOnce(this.video_, 'playing', () => {\n this.playbackHasBegun_ = true;\n });\n\n // Store the object URL for releasing it later.\n this.url_ = shaka.media.MediaSourceEngine.createObjectURL(mediaSource);\n\n this.video_.removeAttribute('src');\n if (this.source_) {\n this.video_.removeChild(this.source_);\n }\n if (this.secondarySource_) {\n this.video_.removeChild(this.secondarySource_);\n }\n this.source_ = shaka.util.Dom.createSourceElement(this.url_);\n this.video_.appendChild(this.source_);\n if (this.secondarySource_) {\n this.video_.appendChild(this.secondarySource_);\n }\n this.video_.load();\n\n return mediaSource;\n }\n\n /**\n * @param {string} uri\n * @param {string} mimeType\n */\n addSecondarySource(uri, mimeType) {\n if (!this.video_ || !window.ManagedMediaSource || !this.mediaSource_) {\n shaka.log.warning(\n 'Secondary source is used only with ManagedMediaSource');\n return;\n }\n if (this.secondarySource_) {\n this.video_.removeChild(this.secondarySource_);\n }\n this.secondarySource_ = shaka.util.Dom.createSourceElement(uri, mimeType);\n this.video_.appendChild(this.secondarySource_);\n this.video_.disableRemotePlayback = false;\n }\n\n /**\n * @param {shaka.util.PublicPromise} p\n * @private\n */\n onSourceOpen_(p) {\n goog.asserts.assert(this.url_, 'Must have object URL');\n\n // Release the object URL that was previously created, to prevent memory\n // leak.\n // createObjectURL creates a strong reference to the MediaSource object\n // inside the browser. Setting the src of the video then creates another\n // reference within the video element. revokeObjectURL will remove the\n // strong reference to the MediaSource object, and allow it to be\n // garbage-collected later.\n URL.revokeObjectURL(this.url_);\n p.resolve();\n }\n\n /**\n * Checks if a certain type is supported.\n *\n * @param {shaka.extern.Stream} stream\n * @param {shaka.util.ManifestParserUtils.ContentType} contentType\n * @return {!Promise<boolean>}\n */\n static async isStreamSupported(stream, contentType) {\n if (stream.createSegmentIndex) {\n await stream.createSegmentIndex();\n }\n if (!stream.segmentIndex) {\n return false;\n }\n if (stream.segmentIndex.isEmpty()) {\n return true;\n }\n const MimeUtils = shaka.util.MimeUtils;\n const TransmuxerEngine = shaka.transmuxer.TransmuxerEngine;\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n const StreamUtils = shaka.util.StreamUtils;\n const seenCombos = new Set();\n // Check each combination of mimeType and codecs within the segment index.\n // Unfortunately we cannot use fullMimeTypes, as we ALSO need to check the\n // getFullTypeWithAllCodecs (for the sake of the transmuxer) and we have no\n // way of going from a full mimeType to a full mimeType with all codecs.\n // As this function is only called in debug mode, a little inefficiency is\n // acceptable.\n for (const ref of stream.segmentIndex) {\n const mimeType = ref.mimeType || stream.mimeType || '';\n let codecs = ref.codecs || stream.codecs || '';\n // Optimization for the case where the codecs and mimetype of the stream\n // match the reference.\n if (mimeType == stream.mimeType && codecs == stream.codecs) {\n continue;\n }\n // Don't check the same combination of mimetype + codecs twice.\n const combo = mimeType + ':' + codecs;\n if (seenCombos.has(combo)) {\n continue;\n }\n seenCombos.add(combo);\n if (contentType == ContentType.TEXT) {\n const fullMimeType = MimeUtils.getFullType(mimeType, codecs);\n if (!shaka.text.TextEngine.isTypeSupported(fullMimeType)) {\n return false;\n }\n } else {\n if (contentType == ContentType.VIDEO) {\n codecs = StreamUtils.getCorrectVideoCodecs(codecs);\n } else if (contentType == ContentType.AUDIO) {\n codecs = StreamUtils.getCorrectAudioCodecs(codecs, mimeType);\n }\n const extendedMimeType = MimeUtils.getExtendedType(\n stream, mimeType, codecs);\n const fullMimeType = MimeUtils.getFullTypeWithAllCodecs(\n mimeType, codecs);\n if (!shaka.media.Capabilities.isTypeSupported(extendedMimeType) &&\n !TransmuxerEngine.isSupported(fullMimeType, stream.type)) {\n return false;\n }\n }\n }\n return true;\n }\n\n /**\n * Returns a map of MediaSource support for well-known types.\n *\n * @return {!Object<string, boolean>}\n */\n static probeSupport() {\n const testMimeTypes = [\n // MP4 types\n 'video/mp4; codecs=\"avc1.42E01E\"',\n 'video/mp4; codecs=\"avc3.42E01E\"',\n 'video/mp4; codecs=\"hev1.1.6.L93.90\"',\n 'video/mp4; codecs=\"hvc1.1.6.L93.90\"',\n 'video/mp4; codecs=\"hev1.2.4.L153.B0\"; eotf=\"smpte2084\"', // HDR HEVC\n 'video/mp4; codecs=\"hvc1.2.4.L153.B0\"; eotf=\"smpte2084\"', // HDR HEVC\n 'video/mp4; codecs=\"vp9\"',\n 'video/mp4; codecs=\"vp09.00.10.08\"',\n 'video/mp4; codecs=\"av01.0.01M.08\"',\n 'video/mp4; codecs=\"dvh1.05.01\"',\n 'video/mp4; codecs=\"dvh1.20.01\"',\n 'audio/mp4; codecs=\"mp4a.40.2\"',\n 'audio/mp4; codecs=\"ac-3\"',\n 'audio/mp4; codecs=\"ec-3\"',\n 'audio/mp4; codecs=\"ac-4.02.01.01\"',\n 'audio/mp4; codecs=\"opus\"',\n 'audio/mp4; codecs=\"flac\"',\n 'audio/mp4; codecs=\"dtsc\"', // DTS Digital Surround\n 'audio/mp4; codecs=\"dtse\"', // DTS Express\n 'audio/mp4; codecs=\"dtsx\"', // DTS:X\n // WebM types\n 'video/webm; codecs=\"vp8\"',\n 'video/webm; codecs=\"vp9\"',\n 'video/webm; codecs=\"vp09.00.10.08\"',\n 'audio/webm; codecs=\"vorbis\"',\n 'audio/webm; codecs=\"opus\"',\n // MPEG2 TS types (video/ is also used for audio: https://bit.ly/TsMse)\n 'video/mp2t; codecs=\"avc1.42E01E\"',\n 'video/mp2t; codecs=\"avc3.42E01E\"',\n 'video/mp2t; codecs=\"hvc1.1.6.L93.90\"',\n 'video/mp2t; codecs=\"mp4a.40.2\"',\n 'video/mp2t; codecs=\"ac-3\"',\n 'video/mp2t; codecs=\"ec-3\"',\n // WebVTT types\n 'text/vtt',\n 'application/mp4; codecs=\"wvtt\"',\n // TTML types\n 'application/ttml+xml',\n 'application/mp4; codecs=\"stpp\"',\n // Containerless types\n ...shaka.util.MimeUtils.RAW_FORMATS,\n ];\n\n const support = {};\n for (const type of testMimeTypes) {\n if (shaka.text.TextEngine.isTypeSupported(type)) {\n support[type] = true;\n } else if (shaka.util.Platform.supportsMediaSource()) {\n support[type] = shaka.media.Capabilities.isTypeSupported(type) ||\n shaka.transmuxer.TransmuxerEngine.isSupported(type);\n } else {\n support[type] = shaka.util.Platform.supportsMediaType(type);\n }\n\n const basicType = type.split(';')[0];\n support[basicType] = support[basicType] || support[type];\n }\n\n return support;\n }\n\n /** @override */\n destroy() {\n return this.destroyer_.destroy();\n }\n\n /** @private */\n async doDestroy_() {\n const Functional = shaka.util.Functional;\n\n const cleanup = [];\n\n for (const [key, q] of this.queues_) {\n // Make a local copy of the queue and the first item.\n const inProgress = q[0];\n\n const contentType = /** @type {string} */(key);\n\n // Drop everything else out of the original queue.\n this.queues_.set(contentType, q.slice(0, 1));\n\n // We will wait for this item to complete/fail.\n if (inProgress) {\n cleanup.push(inProgress.p.catch(Functional.noop));\n }\n\n // The rest will be rejected silently if possible.\n for (const item of q.slice(1)) {\n item.p.reject(shaka.util.Destroyer.destroyedError());\n }\n }\n\n if (this.textEngine_) {\n cleanup.push(this.textEngine_.destroy());\n }\n\n await Promise.all(cleanup);\n\n for (const transmuxer of this.transmuxers_.values()) {\n transmuxer.destroy();\n }\n\n if (this.eventManager_) {\n this.eventManager_.release();\n this.eventManager_ = null;\n }\n\n if (this.video_ && this.secondarySource_) {\n this.video_.removeChild(this.secondarySource_);\n }\n if (this.video_ && this.source_) {\n // \"unload\" the video element.\n this.video_.removeChild(this.source_);\n this.video_.load();\n this.video_.disableRemotePlayback = false;\n }\n\n this.video_ = null;\n this.source_ = null;\n this.secondarySource_ = null;\n this.config_ = null;\n this.mediaSource_ = null;\n this.textEngine_ = null;\n this.textDisplayer_ = null;\n this.sourceBuffers_.clear();\n this.expectedEncryption_.clear();\n this.transmuxers_.clear();\n this.captionParser_ = null;\n if (goog.DEBUG) {\n for (const [contentType, q] of this.queues_) {\n goog.asserts.assert(\n q.length == 0,\n contentType + ' queue should be empty after destroy!');\n }\n }\n this.queues_.clear();\n\n // This object is owned by Player\n this.lcevcDec_ = null;\n\n this.tsParsers_.clear();\n this.playerInterface_ = null;\n }\n\n /**\n * @return {!Promise} Resolved when MediaSource is open and attached to the\n * media element. This process is actually initiated by the constructor.\n */\n open() {\n return this.mediaSourceOpen_;\n }\n\n /**\n * Initialize MediaSourceEngine.\n *\n * Note that it is not valid to call this multiple times, except to add or\n * reinitialize text streams.\n *\n * @param {!Map<shaka.util.ManifestParserUtils.ContentType,\n * shaka.extern.Stream>} streamsByType\n * A map of content types to streams. All streams must be supported\n * according to MediaSourceEngine.isStreamSupported.\n * @param {boolean=} sequenceMode\n * If true, the media segments are appended to the SourceBuffer in strict\n * sequence.\n * @param {string=} manifestType\n * Indicates the type of the manifest.\n * @param {boolean=} ignoreManifestTimestampsInSegmentsMode\n * If true, don't adjust the timestamp offset to account for manifest\n * segment durations being out of sync with segment durations. In other\n * words, assume that there are no gaps in the segments when appending\n * to the SourceBuffer, even if the manifest and segment times disagree.\n * Indicates if the manifest has text streams.\n *\n * @return {!Promise}\n */\n async init(streamsByType, sequenceMode=false,\n manifestType=shaka.media.ManifestParser.UNKNOWN,\n ignoreManifestTimestampsInSegmentsMode=false) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n\n await this.mediaSourceOpen_;\n if (this.ended() || this.closed()) {\n shaka.log.alwaysError('Expected MediaSource to be open during init(); ' +\n 'reopening the media source.');\n this.mediaSourceOpen_ = new shaka.util.PublicPromise();\n this.mediaSource_ = this.createMediaSource(this.mediaSourceOpen_);\n await this.mediaSourceOpen_;\n }\n\n this.sequenceMode_ = sequenceMode;\n this.manifestType_ = manifestType;\n this.ignoreManifestTimestampsInSegmentsMode_ =\n ignoreManifestTimestampsInSegmentsMode;\n\n this.attemptTimestampOffsetCalculation_ = !this.sequenceMode_ &&\n this.manifestType_ == shaka.media.ManifestParser.HLS &&\n !this.ignoreManifestTimestampsInSegmentsMode_;\n\n this.tsParsers_.clear();\n this.firstVideoTimestamp_ = null;\n this.firstVideoReferenceStartTime_ = null;\n this.firstAudioTimestamp_ = null;\n this.firstAudioReferenceStartTime_ = null;\n this.audioCompensation_ = new shaka.util.PublicPromise();\n\n for (const contentType of streamsByType.keys()) {\n const stream = streamsByType.get(contentType);\n // eslint-disable-next-line no-await-in-loop\n await this.initSourceBuffer_(contentType, stream, stream.codecs);\n if (this.needSplitMuxedContent_) {\n this.queues_.set(ContentType.AUDIO, []);\n this.queues_.set(ContentType.VIDEO, []);\n } else {\n this.queues_.set(contentType, []);\n }\n }\n const audio = streamsByType.get(ContentType.AUDIO);\n if (audio && audio.isAudioMuxedInVideo) {\n this.needSplitMuxedContent_ = true;\n }\n }\n\n /**\n * Initialize a specific SourceBuffer.\n *\n * @param {shaka.util.ManifestParserUtils.ContentType} contentType\n * @param {shaka.extern.Stream} stream\n * @param {string} codecs\n * @return {!Promise}\n * @private\n */\n async initSourceBuffer_(contentType, stream, codecs) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n\n goog.asserts.assert(\n await shaka.media.MediaSourceEngine.isStreamSupported(\n stream, contentType),\n 'Type negotiation should happen before MediaSourceEngine.init!');\n\n if (contentType == ContentType.AUDIO && codecs) {\n codecs = shaka.util.StreamUtils.getCorrectAudioCodecs(\n codecs, stream.mimeType);\n }\n\n let mimeType = shaka.util.MimeUtils.getFullType(\n stream.mimeType, codecs);\n if (contentType == ContentType.TEXT) {\n this.reinitText(mimeType, this.sequenceMode_, stream.external);\n } else {\n let needTransmux = this.config_.forceTransmux;\n if (!shaka.media.Capabilities.isTypeSupported(mimeType) ||\n (!this.sequenceMode_ &&\n shaka.util.MimeUtils.RAW_FORMATS.includes(mimeType))) {\n needTransmux = true;\n }\n const mimeTypeWithAllCodecs =\n shaka.util.MimeUtils.getFullTypeWithAllCodecs(\n stream.mimeType, codecs);\n if (needTransmux) {\n const audioCodec = shaka.util.ManifestParserUtils.guessCodecsSafe(\n ContentType.AUDIO, (codecs || '').split(','));\n const videoCodec = shaka.util.ManifestParserUtils.guessCodecsSafe(\n ContentType.VIDEO, (codecs || '').split(','));\n if (audioCodec && videoCodec) {\n this.needSplitMuxedContent_ = true;\n await this.initSourceBuffer_(ContentType.AUDIO, stream, audioCodec);\n await this.initSourceBuffer_(ContentType.VIDEO, stream, videoCodec);\n return;\n }\n const transmuxerPlugin = shaka.transmuxer.TransmuxerEngine\n .findTransmuxer(mimeTypeWithAllCodecs);\n if (transmuxerPlugin) {\n const transmuxer = transmuxerPlugin();\n this.transmuxers_.set(contentType, transmuxer);\n mimeType =\n transmuxer.convertCodecs(contentType, mimeTypeWithAllCodecs);\n }\n }\n const type = this.addExtraFeaturesToMimeType_(mimeType);\n\n this.destroyer_.ensureNotDestroyed();\n\n let sourceBuffer;\n\n try {\n sourceBuffer = this.mediaSource_.addSourceBuffer(type);\n } catch (exception) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.MEDIA_SOURCE_OPERATION_THREW,\n exception,\n 'The mediaSource_ status was ' + this.mediaSource_.readyState +\n ' expected \\'open\\'',\n null);\n }\n\n if (this.sequenceMode_) {\n sourceBuffer.mode =\n shaka.media.MediaSourceEngine.SourceBufferMode_.SEQUENCE;\n }\n\n this.eventManager_.listen(\n sourceBuffer, 'error',\n () => this.onError_(contentType));\n this.eventManager_.listen(\n sourceBuffer, 'updateend',\n () => this.onUpdateEnd_(contentType));\n this.sourceBuffers_.set(contentType, sourceBuffer);\n this.sourceBufferTypes_.set(contentType, mimeType);\n this.expectedEncryption_.set(contentType, !!stream.drmInfos.length);\n }\n }\n\n /**\n * Called by the Player to provide an updated configuration any time it\n * changes. Must be called at least once before init().\n *\n * @param {shaka.extern.MediaSourceConfiguration} config\n */\n configure(config) {\n this.config_ = config;\n if (this.textEngine_) {\n this.textEngine_.setModifyCueCallback(config.modifyCueCallback);\n }\n }\n\n /**\n * Indicate if the streaming is allowed by MediaSourceEngine.\n * If we using MediaSource we always returns true.\n *\n * @return {boolean}\n */\n isStreamingAllowed() {\n return this.streamingAllowed_ && !this.usingRemotePlayback_ &&\n !this.reloadingMediaSource_;\n }\n\n /**\n * Reinitialize the TextEngine for a new text type.\n * @param {string} mimeType\n * @param {boolean} sequenceMode\n * @param {boolean} external\n */\n reinitText(mimeType, sequenceMode, external) {\n if (!this.textEngine_) {\n this.textEngine_ = new shaka.text.TextEngine(this.textDisplayer_);\n if (this.textEngine_) {\n this.textEngine_.setModifyCueCallback(this.config_.modifyCueCallback);\n }\n }\n this.textEngine_.initParser(mimeType, sequenceMode,\n external || this.segmentRelativeVttTiming_, this.manifestType_);\n }\n\n /**\n * @return {boolean} True if the MediaSource is in an \"ended\" state, or if the\n * object has been destroyed.\n */\n ended() {\n if (this.reloadingMediaSource_) {\n return false;\n }\n return this.mediaSource_ ? this.mediaSource_.readyState == 'ended' : true;\n }\n\n /**\n * @return {boolean} True if the MediaSource is in an \"closed\" state, or if\n * the object has been destroyed.\n */\n closed() {\n if (this.reloadingMediaSource_) {\n return false;\n }\n return this.mediaSource_ ? this.mediaSource_.readyState == 'closed' : true;\n }\n\n /**\n * Gets the first timestamp in buffer for the given content type.\n *\n * @param {shaka.util.ManifestParserUtils.ContentType} contentType\n * @return {?number} The timestamp in seconds, or null if nothing is buffered.\n */\n bufferStart(contentType) {\n if (!this.sourceBuffers_.size) {\n return null;\n }\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n if (contentType == ContentType.TEXT) {\n return this.textEngine_.bufferStart();\n }\n return shaka.media.TimeRangesUtils.bufferStart(\n this.getBuffered_(contentType));\n }\n\n /**\n * Gets the last timestamp in buffer for the given content type.\n *\n * @param {shaka.util.ManifestParserUtils.ContentType} contentType\n * @return {?number} The timestamp in seconds, or null if nothing is buffered.\n */\n bufferEnd(contentType) {\n if (!this.sourceBuffers_.size) {\n return null;\n }\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n if (contentType == ContentType.TEXT) {\n return this.textEngine_.bufferEnd();\n }\n return shaka.media.TimeRangesUtils.bufferEnd(\n this.getBuffered_(contentType));\n }\n\n /**\n * Determines if the given time is inside the buffered range of the given\n * content type.\n *\n * @param {shaka.util.ManifestParserUtils.ContentType} contentType\n * @param {number} time Playhead time\n * @return {boolean}\n */\n isBuffered(contentType, time) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n if (contentType == ContentType.TEXT) {\n return this.textEngine_.isBuffered(time);\n } else {\n const buffered = this.getBuffered_(contentType);\n return shaka.media.TimeRangesUtils.isBuffered(buffered, time);\n }\n }\n\n /**\n * Computes how far ahead of the given timestamp is buffered for the given\n * content type.\n *\n * @param {shaka.util.ManifestParserUtils.ContentType} contentType\n * @param {number} time\n * @return {number} The amount of time buffered ahead in seconds.\n */\n bufferedAheadOf(contentType, time) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n if (contentType == ContentType.TEXT) {\n return this.textEngine_.bufferedAheadOf(time);\n } else {\n const buffered = this.getBuffered_(contentType);\n return shaka.media.TimeRangesUtils.bufferedAheadOf(buffered, time);\n }\n }\n\n /**\n * Returns info about what is currently buffered.\n * @return {shaka.extern.BufferedInfo}\n */\n getBufferedInfo() {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n const TimeRangesUtils = shaka.media.TimeRangesUtils;\n\n const info = {\n total: this.reloadingMediaSource_ ? [] :\n TimeRangesUtils.getBufferedInfo(this.video_.buffered),\n audio:\n TimeRangesUtils.getBufferedInfo(this.getBuffered_(ContentType.AUDIO)),\n video:\n TimeRangesUtils.getBufferedInfo(this.getBuffered_(ContentType.VIDEO)),\n text: [],\n };\n\n if (this.textEngine_) {\n const start = this.textEngine_.bufferStart();\n const end = this.textEngine_.bufferEnd();\n\n if (start != null && end != null) {\n info.text.push({start: start, end: end});\n }\n }\n return info;\n }\n\n /**\n * @param {shaka.util.ManifestParserUtils.ContentType} contentType\n * @return {TimeRanges} The buffered ranges for the given content type, or\n * null if the buffered ranges could not be obtained.\n * @private\n */\n getBuffered_(contentType) {\n if (this.reloadingMediaSource_ || this.usingRemotePlayback_) {\n return null;\n }\n try {\n return this.sourceBuffers_.get(contentType).buffered;\n } catch (exception) {\n if (this.sourceBuffers_.has(contentType)) {\n // Note: previous MediaSource errors may cause access to |buffered| to\n // throw.\n shaka.log.error('failed to get buffered range for ' + contentType,\n exception);\n }\n return null;\n }\n }\n\n /**\n * Create a new closed caption parser. This will ONLY be replaced by tests as\n * a way to inject fake closed caption parser instances.\n *\n * @param {string} mimeType\n * @return {!shaka.media.IClosedCaptionParser}\n */\n getCaptionParser(mimeType) {\n return new shaka.media.ClosedCaptionParser(mimeType);\n }\n\n /**\n * This method is only public for testing.\n *\n * @param {shaka.util.ManifestParserUtils.ContentType} contentType\n * @param {!BufferSource} data\n * @param {!shaka.media.SegmentReference} reference The segment reference\n * we are appending\n * @param {shaka.extern.Stream} stream\n * @param {!string} mimeType\n * @return {{timestamp: ?number, metadata: !Array<shaka.extern.ID3Metadata>}}\n */\n getTimestampAndDispatchMetadata(contentType, data, reference, stream,\n mimeType) {\n let timestamp = null;\n let metadata = [];\n\n const uint8ArrayData = shaka.util.BufferUtils.toUint8(data);\n if (shaka.util.MimeUtils.RAW_FORMATS.includes(mimeType)) {\n const frames = shaka.util.Id3Utils.getID3Frames(uint8ArrayData);\n if (frames.length && reference) {\n const metadataTimestamp = frames.find((frame) => {\n return frame.description ===\n 'com.apple.streaming.transportStreamTimestamp';\n });\n if (metadataTimestamp) {\n timestamp = Math.round(metadataTimestamp.data) / 1000;\n }\n /** @private {shaka.extern.ID3Metadata} */\n const id3Metadata = {\n cueTime: reference.startTime,\n data: uint8ArrayData,\n frames: frames,\n dts: reference.startTime,\n pts: reference.startTime,\n };\n this.playerInterface_.onMetadata(\n [id3Metadata], /* offset= */ 0, reference.endTime);\n }\n } else if (mimeType.includes('/mp4') &&\n reference &&\n reference.initSegmentReference &&\n reference.initSegmentReference.timescale) {\n const timescale = reference.initSegmentReference.timescale;\n if (!isNaN(timescale)) {\n const hasEmsg = ((stream.emsgSchemeIdUris != null &&\n stream.emsgSchemeIdUris.length > 0) ||\n this.config_.dispatchAllEmsgBoxes);\n const Mp4Parser = shaka.util.Mp4Parser;\n let startTime = 0;\n let parsedMedia = false;\n const parser = new Mp4Parser();\n if (hasEmsg) {\n parser.fullBox('emsg', (box) =>\n this.parseEMSG_(reference, stream.emsgSchemeIdUris, box));\n }\n parser.fullBox('prft', (box) => this.parsePrft_(timescale, box))\n .box('moof', Mp4Parser.children)\n .box('traf', Mp4Parser.children)\n .fullBox('tfdt', (box) => {\n if (!parsedMedia) {\n goog.asserts.assert(\n box.version == 0 || box.version == 1,\n 'TFDT version can only be 0 or 1');\n const parsed = shaka.util.Mp4BoxParsers.parseTFDTInaccurate(\n box.reader, box.version);\n startTime = parsed.baseMediaDecodeTime / timescale;\n parsedMedia = true;\n if (!hasEmsg) {\n box.parser.stop();\n }\n }\n }).parse(data, /* partialOkay= */ true);\n if (parsedMedia && reference.timestampOffset == 0) {\n timestamp = startTime;\n }\n }\n } else if (!mimeType.includes('/mp4') && !mimeType.includes('/webm') &&\n shaka.util.TsParser.probe(uint8ArrayData)) {\n if (!this.tsParsers_.has(contentType)) {\n this.tsParsers_.set(contentType, new shaka.util.TsParser());\n } else {\n this.tsParsers_.get(contentType).clearData();\n }\n const tsParser = this.tsParsers_.get(contentType).parse(uint8ArrayData);\n const startTime = tsParser.getStartTime(contentType);\n if (startTime != null) {\n timestamp = startTime;\n }\n metadata = tsParser.getMetadata();\n }\n return {timestamp, metadata};\n }\n\n\n /**\n * Parse the EMSG box from a MP4 container.\n *\n * @param {!shaka.media.SegmentReference} reference\n * @param {?Array<string>} emsgSchemeIdUris Array of emsg\n * scheme_id_uri for which emsg boxes should be parsed.\n * @param {!shaka.extern.ParsedBox} box\n * @private\n * https://dashif-documents.azurewebsites.net/Events/master/event.html#emsg-format\n * aligned(8) class DASHEventMessageBox\n * extends FullBox(‘emsg’, version, flags = 0){\n * if (version==0) {\n * string scheme_id_uri;\n * string value;\n * unsigned int(32) timescale;\n * unsigned int(32) presentation_time_delta;\n * unsigned int(32) event_duration;\n * unsigned int(32) id;\n * } else if (version==1) {\n * unsigned int(32) timescale;\n * unsigned int(64) presentation_time;\n * unsigned int(32) event_duration;\n * unsigned int(32) id;\n * string scheme_id_uri;\n * string value;\n * }\n * unsigned int(8) message_data[];\n */\n parseEMSG_(reference, emsgSchemeIdUris, box) {\n let timescale;\n let id;\n let eventDuration;\n let schemeId;\n let startTime;\n let presentationTimeDelta;\n let value;\n\n if (box.version === 0) {\n schemeId = box.reader.readTerminatedString();\n value = box.reader.readTerminatedString();\n timescale = box.reader.readUint32();\n presentationTimeDelta = box.reader.readUint32();\n eventDuration = box.reader.readUint32();\n id = box.reader.readUint32();\n startTime = reference.startTime + (presentationTimeDelta / timescale);\n } else {\n timescale = box.reader.readUint32();\n const pts = box.reader.readUint64();\n startTime = (pts / timescale) + reference.timestampOffset;\n presentationTimeDelta = startTime - reference.startTime;\n eventDuration = box.reader.readUint32();\n id = box.reader.readUint32();\n schemeId = box.reader.readTerminatedString();\n value = box.reader.readTerminatedString();\n }\n const messageData = box.reader.readBytes(\n box.reader.getLength() - box.reader.getPosition());\n\n // See DASH sec. 5.10.3.3.1\n // If a DASH client detects an event message box with a scheme that is not\n // defined in MPD, the client is expected to ignore it.\n if ((emsgSchemeIdUris && emsgSchemeIdUris.includes(schemeId)) ||\n this.config_.dispatchAllEmsgBoxes) {\n // See DASH sec. 5.10.4.1\n // A special scheme in DASH used to signal manifest updates.\n if (schemeId == 'urn:mpeg:dash:event:2012') {\n this.playerInterface_.onManifestUpdate();\n } else {\n // All other schemes are dispatched as a general 'emsg' event.\n const endTime = startTime + (eventDuration / timescale);\n /** @type {shaka.extern.EmsgInfo} */\n const emsg = {\n startTime: startTime,\n endTime: endTime,\n schemeIdUri: schemeId,\n value: value,\n timescale: timescale,\n presentationTimeDelta: presentationTimeDelta,\n eventDuration: eventDuration,\n id: id,\n messageData: messageData,\n };\n\n // Dispatch an event to notify the application about the emsg box.\n const eventName = shaka.util.FakeEvent.EventName.Emsg;\n const data = (new Map()).set('detail', emsg);\n const event = new shaka.util.FakeEvent(eventName, data);\n // A user can call preventDefault() on a cancelable event.\n event.cancelable = true;\n\n this.playerInterface_.onEmsg(emsg);\n\n // Additionally, ID3 events generate a 'metadata' event. This is a\n // pre-parsed version of the metadata blob already dispatched in the\n // 'emsg' event.\n if (schemeId == 'https://aomedia.org/emsg/ID3' ||\n schemeId == 'https://developer.apple.com/streaming/emsg-id3') {\n // See https://aomediacodec.github.io/id3-emsg/\n const frames = shaka.util.Id3Utils.getID3Frames(messageData);\n if (frames.length) {\n /** @private {shaka.extern.ID3Metadata} */\n const metadata = {\n cueTime: startTime,\n data: messageData,\n frames: frames,\n dts: startTime,\n pts: startTime,\n };\n this.playerInterface_.onMetadata(\n [metadata], /* offset= */ 0, endTime);\n }\n }\n }\n }\n }\n\n /**\n * Parse PRFT box.\n * @param {number} timescale\n * @param {!shaka.extern.ParsedBox} box\n * @private\n */\n parsePrft_(timescale, box) {\n goog.asserts.assert(\n box.version == 0 || box.version == 1,\n 'PRFT version can only be 0 or 1');\n const parsed = shaka.util.Mp4BoxParsers.parsePRFTInaccurate(\n box.reader, box.version);\n\n const wallClockTime = this.convertNtp_(parsed.ntpTimestamp);\n const programStartDate = new Date(wallClockTime -\n (parsed.mediaTime / timescale) * 1000);\n /** @type {shaka.extern.ProducerReferenceTime} */\n const prftInfo = {\n wallClockTime,\n programStartDate,\n };\n\n const eventName = shaka.util.FakeEvent.EventName.Prft;\n const data = (new Map()).set('detail', prftInfo);\n const event = new shaka.util.FakeEvent(\n eventName, data);\n this.playerInterface_.onEvent(event);\n }\n\n\n /**\n * Convert Ntp ntpTimeStamp to UTC Time\n *\n * @param {number} ntpTimeStamp\n * @return {number} utcTime\n * @private\n */\n convertNtp_(ntpTimeStamp) {\n const start = new Date(Date.UTC(1900, 0, 1, 0, 0, 0));\n return new Date(start.getTime() + ntpTimeStamp).getTime();\n }\n\n /**\n * Enqueue an operation to append data to the SourceBuffer.\n * Start and end times are needed for TextEngine, but not for MediaSource.\n * Start and end times may be null for initialization segments; if present\n * they are relative to the presentation timeline.\n *\n * @param {shaka.util.ManifestParserUtils.ContentType} contentType\n * @param {!BufferSource} data\n * @param {?shaka.media.SegmentReference} reference The segment reference\n * we are appending, or null for init segments\n * @param {shaka.extern.Stream} stream\n * @param {?boolean} hasClosedCaptions True if the buffer contains CEA closed\n * captions\n * @param {boolean=} seeked True if we just seeked\n * @param {boolean=} adaptation True if we just automatically switched active\n * variant(s).\n * @param {boolean=} isChunkedData True if we add to the buffer from the\n * partial read of the segment.\n * @return {!Promise}\n */\n async appendBuffer(\n contentType, data, reference, stream, hasClosedCaptions, seeked = false,\n adaptation = false, isChunkedData = false, fromSplit = false) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n\n if (contentType == ContentType.TEXT) {\n if (this.manifestType_ == shaka.media.ManifestParser.HLS) {\n // This won't be known until the first video segment is appended.\n const offset = await this.textSequenceModeOffset_;\n this.textEngine_.setTimestampOffset(offset);\n }\n await this.textEngine_.appendBuffer(\n data,\n reference ? reference.startTime : null,\n reference ? reference.endTime : null,\n reference ? reference.getUris()[0] : null);\n return;\n }\n\n if (!fromSplit && this.needSplitMuxedContent_) {\n await this.appendBuffer(ContentType.AUDIO, data, reference, stream,\n hasClosedCaptions, seeked, adaptation, isChunkedData,\n /* fromSplit= */ true);\n await this.appendBuffer(ContentType.VIDEO, data, reference, stream,\n hasClosedCaptions, seeked, adaptation, isChunkedData,\n /* fromSplit= */ true);\n return;\n }\n\n if (!this.sourceBuffers_.has(contentType)) {\n shaka.log.warning('Attempted to restore a non-existent source buffer');\n return;\n }\n\n let timestampOffset = this.sourceBuffers_.get(contentType).timestampOffset;\n\n let mimeType = this.sourceBufferTypes_.get(contentType);\n if (this.transmuxers_.has(contentType)) {\n mimeType = this.transmuxers_.get(contentType).getOriginalMimeType();\n }\n if (reference) {\n const {timestamp, metadata} = this.getTimestampAndDispatchMetadata(\n contentType, data, reference, stream, mimeType);\n if (timestamp != null) {\n if (this.firstVideoTimestamp_ == null &&\n contentType == ContentType.VIDEO) {\n this.firstVideoTimestamp_ = timestamp;\n this.firstVideoReferenceStartTime_ = reference.startTime;\n if (this.firstAudioTimestamp_ != null) {\n let compensation = 0;\n // Only apply compensation if video and audio segment startTime\n // match, to avoid introducing sync issues.\n if (this.firstVideoReferenceStartTime_ ==\n this.firstAudioReferenceStartTime_) {\n compensation =\n this.firstVideoTimestamp_ - this.firstAudioTimestamp_;\n }\n this.audioCompensation_.resolve(compensation);\n }\n }\n if (this.firstAudioTimestamp_ == null &&\n contentType == ContentType.AUDIO) {\n this.firstAudioTimestamp_ = timestamp;\n this.firstAudioReferenceStartTime_ = reference.startTime;\n if (this.firstVideoTimestamp_ != null) {\n let compensation = 0;\n // Only apply compensation if video and audio segment startTime\n // match, to avoid introducing sync issues.\n if (this.firstVideoReferenceStartTime_ ==\n this.firstAudioReferenceStartTime_) {\n compensation =\n this.firstVideoTimestamp_ - this.firstAudioTimestamp_;\n }\n this.audioCompensation_.resolve(compensation);\n }\n }\n let realTimestamp = timestamp;\n const RAW_FORMATS = shaka.util.MimeUtils.RAW_FORMATS;\n // For formats without containers and using segments mode, we need to\n // adjust TimestampOffset relative to 0 because segments do not have\n // any timestamp information.\n if (!this.sequenceMode_ &&\n RAW_FORMATS.includes(this.sourceBufferTypes_.get(contentType))) {\n realTimestamp = 0;\n }\n const calculatedTimestampOffset = reference.startTime - realTimestamp;\n const timestampOffsetDifference =\n Math.abs(timestampOffset - calculatedTimestampOffset);\n if ((timestampOffsetDifference >= 0.001 || seeked || adaptation) &&\n (!isChunkedData || calculatedTimestampOffset > 0 ||\n !timestampOffset)) {\n timestampOffset = calculatedTimestampOffset;\n if (this.attemptTimestampOffsetCalculation_) {\n this.enqueueOperation_(\n contentType,\n () => this.abort_(contentType),\n null);\n this.enqueueOperation_(\n contentType,\n () => this.setTimestampOffset_(contentType, timestampOffset),\n null);\n }\n }\n // Timestamps can only be reliably extracted from video, not audio.\n // Packed audio formats do not have internal timestamps at all.\n // Prefer video for this when available.\n const isBestSourceBufferForTimestamps =\n contentType == ContentType.VIDEO ||\n !(this.sourceBuffers_.has(ContentType.VIDEO));\n if (isBestSourceBufferForTimestamps) {\n this.textSequenceModeOffset_.resolve(timestampOffset);\n }\n }\n if (metadata.length) {\n this.playerInterface_.onMetadata(metadata, timestampOffset,\n reference ? reference.endTime : null);\n }\n }\n if (hasClosedCaptions && contentType == ContentType.VIDEO) {\n if (!this.textEngine_) {\n this.reinitText(shaka.util.MimeUtils.CEA608_CLOSED_CAPTION_MIMETYPE,\n this.sequenceMode_, /* external= */ false);\n }\n if (!this.captionParser_) {\n const basicType = mimeType.split(';', 1)[0];\n this.captionParser_ = this.getCaptionParser(basicType);\n }\n // If it is the init segment for closed captions, initialize the closed\n // caption parser.\n if (!reference) {\n this.captionParser_.init(data, adaptation);\n } else {\n const closedCaptions = this.captionParser_.parseFrom(data);\n if (closedCaptions.length) {\n this.textEngine_.storeAndAppendClosedCaptions(\n closedCaptions,\n reference.startTime,\n reference.endTime,\n timestampOffset);\n }\n }\n }\n\n if (this.transmuxers_.has(contentType)) {\n data = await this.transmuxers_.get(contentType).transmux(\n data, stream, reference, this.mediaSource_.duration, contentType);\n }\n\n data = this.workAroundBrokenPlatforms_(\n data, reference ? reference.startTime : null, contentType,\n reference ? reference.getUris()[0] : null);\n\n if (reference && this.sequenceMode_ && contentType != ContentType.TEXT) {\n // In sequence mode, for non-text streams, if we just cleared the buffer\n // and are either performing an unbuffered seek or handling an automatic\n // adaptation, we need to set a new timestampOffset on the sourceBuffer.\n if (seeked || adaptation) {\n let timestampOffset = reference.startTime;\n // Audio and video may not be aligned, so we will compensate for audio\n // if necessary.\n if (this.manifestType_ == shaka.media.ManifestParser.HLS &&\n !this.needSplitMuxedContent_ &&\n contentType == ContentType.AUDIO &&\n this.sourceBuffers_.has(ContentType.VIDEO)) {\n const compensation = await this.audioCompensation_;\n // Only apply compensation if the difference is greater than 150ms\n if (Math.abs(compensation) > 0.15) {\n timestampOffset -= compensation;\n }\n }\n // The logic to call abort() before setting the timestampOffset is\n // extended during unbuffered seeks or automatic adaptations; it is\n // possible for the append state to be PARSING_MEDIA_SEGMENT from the\n // previous SourceBuffer#appendBuffer() call.\n this.enqueueOperation_(\n contentType,\n () => this.abort_(contentType),\n null);\n this.enqueueOperation_(\n contentType,\n () => this.setTimestampOffset_(contentType, timestampOffset),\n null);\n }\n }\n\n let bufferedBefore = null;\n\n await this.enqueueOperation_(contentType, () => {\n if (goog.DEBUG && reference && !reference.isPreload() && !isChunkedData) {\n bufferedBefore = this.getBuffered_(contentType);\n }\n this.append_(contentType, data, timestampOffset, stream);\n }, reference ? reference.getUris()[0] : null);\n\n if (goog.DEBUG && reference && !reference.isPreload() && !isChunkedData) {\n const bufferedAfter = this.getBuffered_(contentType);\n const newBuffered = shaka.media.TimeRangesUtils.computeAddedRange(\n bufferedBefore, bufferedAfter);\n if (newBuffered) {\n const segmentDuration = reference.endTime - reference.startTime;\n const timeAdded = newBuffered.end - newBuffered.start;\n // Check end times instead of start times. We may be overwriting a\n // buffer and only the end changes, and that would be fine.\n // Also, exclude tiny segments. Sometimes alignment segments as small\n // as 33ms are seen in Google DAI content. For such tiny segments,\n // half a segment duration would be no issue.\n const offset = Math.abs(newBuffered.end - reference.endTime);\n if (segmentDuration > 0.100 && (offset > segmentDuration / 2 ||\n Math.abs(segmentDuration - timeAdded) > 0.030)) {\n shaka.log.error('Possible encoding problem detected!',\n 'Unexpected buffered range for reference', reference,\n 'from URIs', reference.getUris(),\n 'should be', {start: reference.startTime, end: reference.endTime},\n 'but got', newBuffered);\n }\n }\n }\n }\n\n /**\n * Set the selected closed captions Id and language.\n *\n * @param {string} id\n */\n setSelectedClosedCaptionId(id) {\n const VIDEO = shaka.util.ManifestParserUtils.ContentType.VIDEO;\n const videoBufferEndTime = this.bufferEnd(VIDEO) || 0;\n this.textEngine_.setSelectedClosedCaptionId(id, videoBufferEndTime);\n }\n\n /** Disable embedded closed captions. */\n clearSelectedClosedCaptionId() {\n if (this.textEngine_) {\n this.textEngine_.setSelectedClosedCaptionId('', 0);\n }\n }\n\n /**\n * Enqueue an operation to remove data from the SourceBuffer.\n *\n * @param {shaka.util.ManifestParserUtils.ContentType} contentType\n * @param {number} startTime relative to the start of the presentation\n * @param {number} endTime relative to the start of the presentation\n * @return {!Promise}\n */\n async remove(contentType, startTime, endTime) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n if (contentType == ContentType.TEXT) {\n await this.textEngine_.remove(startTime, endTime);\n } else if (endTime > startTime) {\n await this.enqueueOperation_(\n contentType,\n () => this.remove_(contentType, startTime, endTime),\n null);\n if (this.needSplitMuxedContent_) {\n await this.enqueueOperation_(\n ContentType.AUDIO,\n () => this.remove_(ContentType.AUDIO, startTime, endTime),\n null);\n }\n }\n }\n\n /**\n * Enqueue an operation to clear the SourceBuffer.\n *\n * @param {shaka.util.ManifestParserUtils.ContentType} contentType\n * @return {!Promise}\n */\n async clear(contentType) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n if (contentType == ContentType.TEXT) {\n if (!this.textEngine_) {\n return;\n }\n await this.textEngine_.remove(0, Infinity);\n } else {\n // Note that not all platforms allow clearing to Infinity.\n await this.enqueueOperation_(\n contentType,\n () => this.remove_(contentType, 0, this.mediaSource_.duration),\n null);\n if (this.needSplitMuxedContent_) {\n await this.enqueueOperation_(\n ContentType.AUDIO,\n () => this.remove_(\n ContentType.AUDIO, 0, this.mediaSource_.duration),\n null);\n }\n }\n }\n\n /**\n * Fully reset the state of the caption parser owned by MediaSourceEngine.\n */\n resetCaptionParser() {\n if (this.captionParser_) {\n this.captionParser_.reset();\n }\n }\n\n /**\n * Enqueue an operation to flush the SourceBuffer.\n * This is a workaround for what we believe is a Chromecast bug.\n *\n * @param {shaka.util.ManifestParserUtils.ContentType} contentType\n * @return {!Promise}\n */\n async flush(contentType) {\n // Flush the pipeline. Necessary on Chromecast, even though we have removed\n // everything.\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n if (contentType == ContentType.TEXT) {\n // Nothing to flush for text.\n return;\n }\n await this.enqueueOperation_(\n contentType,\n () => this.flush_(contentType),\n null);\n if (this.needSplitMuxedContent_) {\n await this.enqueueOperation_(\n ContentType.AUDIO,\n () => this.flush_(ContentType.AUDIO),\n null);\n }\n }\n\n /**\n * Sets the timestamp offset and append window end for the given content type.\n *\n * @param {shaka.util.ManifestParserUtils.ContentType} contentType\n * @param {number} timestampOffset The timestamp offset. Segments which start\n * at time t will be inserted at time t + timestampOffset instead. This\n * value does not affect segments which have already been inserted.\n * @param {number} appendWindowStart The timestamp to set the append window\n * start to. For future appends, frames/samples with timestamps less than\n * this value will be dropped.\n * @param {number} appendWindowEnd The timestamp to set the append window end\n * to. For future appends, frames/samples with timestamps greater than this\n * value will be dropped.\n * @param {boolean} ignoreTimestampOffset If true, the timestampOffset will\n * not be applied in this step.\n * @param {string} mimeType\n * @param {string} codecs\n * @param {!Map<shaka.util.ManifestParserUtils.ContentType,\n * shaka.extern.Stream>} streamsByType\n * A map of content types to streams. All streams must be supported\n * according to MediaSourceEngine.isStreamSupported.\n *\n * @return {!Promise}\n */\n async setStreamProperties(\n contentType, timestampOffset, appendWindowStart, appendWindowEnd,\n ignoreTimestampOffset, mimeType, codecs, streamsByType) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n if (contentType == ContentType.TEXT) {\n if (!ignoreTimestampOffset) {\n this.textEngine_.setTimestampOffset(timestampOffset);\n }\n this.textEngine_.setAppendWindow(appendWindowStart, appendWindowEnd);\n return;\n }\n const operations = [];\n\n const hasChangedCodecs = await this.codecSwitchIfNecessary_(\n contentType, mimeType, codecs, streamsByType);\n\n if (!hasChangedCodecs) {\n // Queue an abort() to help MSE splice together overlapping segments.\n // We set appendWindowEnd when we change periods in DASH content, and the\n // period transition may result in overlap.\n //\n // An abort() also helps with MPEG2-TS. When we append a TS segment, we\n // always enter a PARSING_MEDIA_SEGMENT state and we can't change the\n // timestamp offset. By calling abort(), we reset the state so we can\n // set it.\n operations.push(this.enqueueOperation_(\n contentType,\n () => this.abort_(contentType),\n null));\n if (this.needSplitMuxedContent_) {\n operations.push(this.enqueueOperation_(\n ContentType.AUDIO,\n () => this.abort_(ContentType.AUDIO),\n null));\n }\n }\n if (!ignoreTimestampOffset) {\n operations.push(this.enqueueOperation_(\n contentType,\n () => this.setTimestampOffset_(contentType, timestampOffset),\n null));\n if (this.needSplitMuxedContent_) {\n operations.push(this.enqueueOperation_(\n ContentType.AUDIO,\n () => this.setTimestampOffset_(\n ContentType.AUDIO, timestampOffset),\n null));\n }\n }\n if (appendWindowStart != 0 || appendWindowEnd != Infinity) {\n operations.push(this.enqueueOperation_(\n contentType,\n () => this.setAppendWindow_(\n contentType, appendWindowStart, appendWindowEnd),\n null));\n if (this.needSplitMuxedContent_) {\n operations.push(this.enqueueOperation_(\n ContentType.AUDIO,\n () => this.setAppendWindow_(\n ContentType.AUDIO, appendWindowStart, appendWindowEnd),\n null));\n }\n }\n\n if (operations.length) {\n await Promise.all(operations);\n }\n }\n\n /**\n * Adjust timestamp offset to maintain AV sync across discontinuities.\n *\n * @param {shaka.util.ManifestParserUtils.ContentType} contentType\n * @param {number} timestampOffset\n * @return {!Promise}\n */\n async resync(contentType, timestampOffset) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n\n if (contentType == ContentType.TEXT) {\n // This operation is for audio and video only.\n return;\n }\n\n // Reset the promise in case the timestamp offset changed during\n // a period/discontinuity transition.\n if (contentType == ContentType.VIDEO) {\n this.textSequenceModeOffset_ = new shaka.util.PublicPromise();\n }\n\n if (!this.sequenceMode_) {\n return;\n }\n\n // Avoid changing timestampOffset when the difference is less than 100 ms\n // from the end of the current buffer.\n const bufferEnd = this.bufferEnd(contentType);\n if (bufferEnd && Math.abs(bufferEnd - timestampOffset) < 0.1) {\n return;\n }\n\n // Queue an abort() to help MSE splice together overlapping segments.\n // We set appendWindowEnd when we change periods in DASH content, and the\n // period transition may result in overlap.\n //\n // An abort() also helps with MPEG2-TS. When we append a TS segment, we\n // always enter a PARSING_MEDIA_SEGMENT state and we can't change the\n // timestamp offset. By calling abort(), we reset the state so we can\n // set it.\n this.enqueueOperation_(\n contentType,\n () => this.abort_(contentType),\n null);\n if (this.needSplitMuxedContent_) {\n this.enqueueOperation_(\n ContentType.AUDIO,\n () => this.abort_(ContentType.AUDIO),\n null);\n }\n await this.enqueueOperation_(\n contentType,\n () => this.setTimestampOffset_(contentType, timestampOffset),\n null);\n if (this.needSplitMuxedContent_) {\n await this.enqueueOperation_(\n ContentType.AUDIO,\n () => this.setTimestampOffset_(ContentType.AUDIO, timestampOffset),\n null);\n }\n }\n\n /**\n * @param {string=} reason Valid reasons are 'network' and 'decode'.\n * @return {!Promise}\n * @see http://w3c.github.io/media-source/#idl-def-EndOfStreamError\n */\n async endOfStream(reason) {\n await this.enqueueBlockingOperation_(() => {\n // If endOfStream() has already been called on the media source,\n // don't call it again. Also do not call if readyState is\n // 'closed' (not attached to video element) since it is not a\n // valid operation.\n if (this.ended() || this.closed()) {\n return;\n }\n // Tizen won't let us pass undefined, but it will let us omit the\n // argument.\n if (reason) {\n this.mediaSource_.endOfStream(reason);\n } else {\n this.mediaSource_.endOfStream();\n }\n });\n }\n\n /**\n * @param {number} duration\n * @return {!Promise}\n */\n async setDuration(duration) {\n await this.enqueueBlockingOperation_(() => {\n // Reducing the duration causes the MSE removal algorithm to run, which\n // triggers an 'updateend' event to fire. To handle this scenario, we\n // have to insert a dummy operation into the beginning of each queue,\n // which the 'updateend' handler will remove.\n if (duration < this.mediaSource_.duration) {\n for (const contentType of this.sourceBuffers_.keys()) {\n const dummyOperation = {\n start: () => {},\n p: new shaka.util.PublicPromise(),\n uri: null,\n };\n this.queues_.get(contentType).unshift(dummyOperation);\n }\n }\n\n this.mediaSource_.duration = duration;\n this.lastDuration_ = duration;\n });\n }\n\n /**\n * Get the current MediaSource duration.\n *\n * @return {number}\n */\n getDuration() {\n return this.mediaSource_.duration;\n }\n\n /**\n * Updates the live seekable range.\n *\n * @param {number} startTime\n * @param {number} endTime\n */\n async setLiveSeekableRange(startTime, endTime) {\n goog.asserts.assert('setLiveSeekableRange' in this.mediaSource_,\n 'Using setLiveSeekableRange on not supported platform');\n if (this.ended() || this.closed()) {\n return;\n }\n await this.enqueueBlockingOperation_(() => {\n if (this.ended() || this.closed()) {\n return;\n }\n this.mediaSource_.setLiveSeekableRange(startTime, endTime);\n });\n }\n\n /**\n * Clear the current live seekable range.\n */\n async clearLiveSeekableRange() {\n goog.asserts.assert('clearLiveSeekableRange' in this.mediaSource_,\n 'Using clearLiveSeekableRange on not supported platform');\n if (this.ended() || this.closed()) {\n return;\n }\n await this.enqueueBlockingOperation_(() => {\n if (this.ended() || this.closed()) {\n return;\n }\n this.mediaSource_.clearLiveSeekableRange();\n });\n }\n\n /**\n * Append dependency data.\n * @param {BufferSource} data\n * @param {number} timestampOffset\n * @param {shaka.extern.Stream} stream\n */\n appendDependency(data, timestampOffset, stream) {\n if (this.lcevcDec_) {\n // Append buffers to the LCEVC Dec for parsing and storing\n // of LCEVC data.\n this.lcevcDec_.appendBuffer(data, timestampOffset, stream);\n }\n }\n\n /**\n * Append data to the SourceBuffer.\n * @param {shaka.util.ManifestParserUtils.ContentType} contentType\n * @param {BufferSource} data\n * @param {number} timestampOffset\n * @param {shaka.extern.Stream} stream\n * @private\n */\n append_(contentType, data, timestampOffset, stream) {\n this.appendDependency(data, timestampOffset, stream);\n\n // This will trigger an 'updateend' event.\n this.sourceBuffers_.get(contentType).appendBuffer(data);\n }\n\n /**\n * Remove data from the SourceBuffer.\n * @param {shaka.util.ManifestParserUtils.ContentType} contentType\n * @param {number} startTime relative to the start of the presentation\n * @param {number} endTime relative to the start of the presentation\n * @private\n */\n remove_(contentType, startTime, endTime) {\n if (endTime <= startTime) {\n // Ignore removal of inverted or empty ranges.\n // Fake 'updateend' event to resolve the operation.\n this.onUpdateEnd_(contentType);\n return;\n }\n\n // This will trigger an 'updateend' event.\n this.sourceBuffers_.get(contentType).remove(startTime, endTime);\n }\n\n /**\n * Call abort() on the SourceBuffer.\n * This resets MSE's last_decode_timestamp on all track buffers, which should\n * trigger the splicing logic for overlapping segments.\n * @param {shaka.util.ManifestParserUtils.ContentType} contentType\n * @private\n */\n abort_(contentType) {\n const sourceBuffer = this.sourceBuffers_.get(contentType);\n // Save the append window, which is reset on abort().\n const appendWindowStart = sourceBuffer.appendWindowStart;\n const appendWindowEnd = sourceBuffer.appendWindowEnd;\n\n // This will not trigger an 'updateend' event, since nothing is happening.\n // This is only to reset MSE internals, not to abort an actual operation.\n sourceBuffer.abort();\n\n // Restore the append window.\n sourceBuffer.appendWindowStart = appendWindowStart;\n sourceBuffer.appendWindowEnd = appendWindowEnd;\n\n // Fake an 'updateend' event to resolve the operation.\n this.onUpdateEnd_(contentType);\n }\n\n /**\n * Nudge the playhead to force the media pipeline to be flushed.\n * This seems to be necessary on Chromecast to get new content to replace old\n * content.\n * @param {shaka.util.ManifestParserUtils.ContentType} contentType\n * @private\n */\n flush_(contentType) {\n // Never use flush_ if there's data. It causes a hiccup in playback.\n goog.asserts.assert(\n this.video_.buffered.length == 0, 'MediaSourceEngine.flush_ should ' +\n 'only be used after clearing all data!');\n\n // Seeking forces the pipeline to be flushed.\n this.video_.currentTime -= 0.001;\n\n // Fake an 'updateend' event to resolve the operation.\n this.onUpdateEnd_(contentType);\n }\n\n /**\n * Set the SourceBuffer's timestamp offset.\n * @param {shaka.util.ManifestParserUtils.ContentType} contentType\n * @param {number} timestampOffset\n * @private\n */\n setTimestampOffset_(contentType, timestampOffset) {\n // Work around for\n // https://github.com/shaka-project/shaka-player/issues/1281:\n // TODO(https://bit.ly/2ttKiBU): follow up when this is fixed in Edge\n if (timestampOffset < 0) {\n // Try to prevent rounding errors in Edge from removing the first\n // keyframe.\n timestampOffset += 0.001;\n }\n\n\n let shouldChangeTimestampOffset = true;\n if (this.manifestType_ == shaka.media.ManifestParser.HLS) {\n // Avoid changing timestampOffset when the difference is less than 150 ms\n // from the end of the current buffer when using sequenceMode\n const bufferEnd = this.bufferEnd(contentType);\n if (!bufferEnd || Math.abs(bufferEnd - timestampOffset) > 0.15) {\n shouldChangeTimestampOffset = true;\n } else {\n shouldChangeTimestampOffset = false;\n }\n }\n if (shouldChangeTimestampOffset) {\n this.sourceBuffers_.get(contentType).timestampOffset = timestampOffset;\n }\n\n // Fake an 'updateend' event to resolve the operation.\n this.onUpdateEnd_(contentType);\n }\n\n /**\n * Set the SourceBuffer's append window end.\n * @param {shaka.util.ManifestParserUtils.ContentType} contentType\n * @param {number} appendWindowStart\n * @param {number} appendWindowEnd\n * @private\n */\n setAppendWindow_(contentType, appendWindowStart, appendWindowEnd) {\n const sourceBuffer = this.sourceBuffers_.get(contentType);\n // You can't set start > end, so first set start to 0, then set the new\n // end, then set the new start. That way, there are no intermediate\n // states which are invalid.\n sourceBuffer.appendWindowStart = 0;\n sourceBuffer.appendWindowEnd = appendWindowEnd;\n sourceBuffer.appendWindowStart = appendWindowStart;\n\n // Fake an 'updateend' event to resolve the operation.\n this.onUpdateEnd_(contentType);\n }\n\n /**\n * @param {shaka.util.ManifestParserUtils.ContentType} contentType\n * @private\n */\n onError_(contentType) {\n const operation = this.queues_.get(contentType)[0];\n goog.asserts.assert(operation, 'Spurious error event!');\n goog.asserts.assert(!this.sourceBuffers_.get(contentType).updating,\n 'SourceBuffer should not be updating on error!');\n const code = this.video_.error ? this.video_.error.code : 0;\n operation.p.reject(new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.MEDIA_SOURCE_OPERATION_FAILED,\n code, operation.uri));\n // Do not pop from queue. An 'updateend' event will fire next, and to\n // avoid synchronizing these two event handlers, we will allow that one to\n // pop from the queue as normal. Note that because the operation has\n // already been rejected, the call to resolve() in the 'updateend' handler\n // will have no effect.\n }\n\n /**\n * @param {shaka.util.ManifestParserUtils.ContentType} contentType\n * @private\n */\n onUpdateEnd_(contentType) {\n if (this.reloadingMediaSource_) {\n return;\n }\n const operation = this.queues_.get(contentType)[0];\n goog.asserts.assert(operation, 'Spurious updateend event!');\n if (!operation) {\n return;\n }\n goog.asserts.assert(!this.sourceBuffers_.get(contentType).updating,\n 'SourceBuffer should not be updating on updateend!');\n operation.p.resolve();\n this.popFromQueue_(contentType);\n }\n\n /**\n * Enqueue an operation and start it if appropriate.\n *\n * @param {shaka.util.ManifestParserUtils.ContentType} contentType\n * @param {function()} start\n * @param {?string} uri\n * @return {!Promise}\n * @private\n */\n enqueueOperation_(contentType, start, uri) {\n this.destroyer_.ensureNotDestroyed();\n const operation = {\n start: start,\n p: new shaka.util.PublicPromise(),\n uri,\n };\n this.queues_.get(contentType).push(operation);\n\n if (this.queues_.get(contentType).length == 1) {\n this.startOperation_(contentType);\n }\n return operation.p;\n }\n\n /**\n * Enqueue an operation which must block all other operations on all\n * SourceBuffers.\n *\n * @param {function():(Promise|undefined)} run\n * @return {!Promise}\n * @private\n */\n async enqueueBlockingOperation_(run) {\n this.destroyer_.ensureNotDestroyed();\n\n /** @type {!Array<!shaka.util.PublicPromise>} */\n const allWaiters = [];\n /** @type {!Array<!shaka.util.ManifestParserUtils.ContentType>} */\n const contentTypes = Array.from(this.sourceBuffers_.keys());\n\n // Enqueue a 'wait' operation onto each queue.\n // This operation signals its readiness when it starts.\n // When all wait operations are ready, the real operation takes place.\n for (const contentType of contentTypes) {\n const ready = new shaka.util.PublicPromise();\n const operation = {\n start: () => ready.resolve(),\n p: ready,\n uri: null,\n };\n\n const queue = this.queues_.get(contentType);\n\n queue.push(operation);\n allWaiters.push(ready);\n\n if (queue.length == 1) {\n operation.start();\n }\n }\n\n // Return a Promise to the real operation, which waits to begin until\n // there are no other in-progress operations on any SourceBuffers.\n try {\n await Promise.all(allWaiters);\n } catch (error) {\n // One of the waiters failed, which means we've been destroyed.\n goog.asserts.assert(\n this.destroyer_.destroyed(), 'Should be destroyed by now');\n // We haven't popped from the queue. Canceled waiters have been removed\n // by destroy. What's left now should just be resolved waiters. In\n // uncompiled mode, we will maintain good hygiene and make sure the\n // assert at the end of destroy passes. In compiled mode, the queues\n // are wiped in destroy.\n if (goog.DEBUG) {\n for (const contentType of contentTypes) {\n const queue = this.queues_.get(contentType);\n if (queue.length) {\n goog.asserts.assert(queue.length == 1,\n 'Should be at most one item in queue!');\n goog.asserts.assert(allWaiters.includes(queue[0].p),\n 'The item in queue should be one of our waiters!');\n queue.shift();\n }\n }\n }\n throw error;\n }\n\n if (goog.DEBUG) {\n // If we did it correctly, nothing is updating.\n for (const contentType of contentTypes) {\n goog.asserts.assert(\n this.sourceBuffers_.get(contentType).updating == false,\n 'SourceBuffers should not be updating after a blocking op!');\n }\n }\n\n // Run the real operation, which can be asynchronous.\n try {\n await run();\n } catch (exception) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.MEDIA_SOURCE_OPERATION_THREW,\n exception,\n this.video_.error || 'No error in the media element',\n null);\n } finally {\n // Unblock the queues.\n for (const contentType of contentTypes) {\n this.popFromQueue_(contentType);\n }\n }\n }\n\n /**\n * Pop from the front of the queue and start a new operation.\n * @param {shaka.util.ManifestParserUtils.ContentType} contentType\n * @private\n */\n popFromQueue_(contentType) {\n goog.asserts.assert(this.queues_.has(contentType), 'Queue should exist');\n // Remove the in-progress operation, which is now complete.\n this.queues_.get(contentType).shift();\n this.startOperation_(contentType);\n }\n\n /**\n * Starts the next operation in the queue.\n * @param {shaka.util.ManifestParserUtils.ContentType} contentType\n * @private\n */\n startOperation_(contentType) {\n // Retrieve the next operation, if any, from the queue and start it.\n const next = this.queues_.get(contentType)[0];\n if (next) {\n try {\n next.start();\n } catch (exception) {\n if (exception.name == 'QuotaExceededError') {\n next.p.reject(new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.QUOTA_EXCEEDED_ERROR,\n contentType));\n } else if (!this.isStreamingAllowed()) {\n next.p.reject(new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.STREAMING_NOT_ALLOWED,\n contentType));\n } else {\n next.p.reject(new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.MEDIA_SOURCE_OPERATION_THREW,\n exception,\n this.video_.error || 'No error in the media element',\n next.uri));\n }\n this.popFromQueue_(contentType);\n }\n }\n }\n\n /**\n * @return {!shaka.extern.TextDisplayer}\n */\n getTextDisplayer() {\n goog.asserts.assert(\n this.textDisplayer_,\n 'TextDisplayer should only be null when this is destroyed');\n\n return this.textDisplayer_;\n }\n\n /**\n * @param {!shaka.extern.TextDisplayer} textDisplayer\n */\n setTextDisplayer(textDisplayer) {\n this.textDisplayer_ = textDisplayer;\n if (this.textEngine_) {\n this.textEngine_.setDisplayer(textDisplayer);\n }\n }\n\n /**\n * @param {boolean} segmentRelativeVttTiming\n */\n setSegmentRelativeVttTiming(segmentRelativeVttTiming) {\n this.segmentRelativeVttTiming_ = segmentRelativeVttTiming;\n }\n\n /**\n * Apply platform-specific transformations to this segment to work around\n * issues in the platform.\n *\n * @param {!BufferSource} segment\n * @param {?number} startTime\n * @param {shaka.util.ManifestParserUtils.ContentType} contentType\n * @param {?string} uri\n * @return {!BufferSource}\n * @private\n */\n workAroundBrokenPlatforms_(segment, startTime, contentType, uri) {\n const Platform = shaka.util.Platform;\n\n const isInitSegment = startTime == null;\n const encryptionExpected = this.expectedEncryption_.get(contentType);\n const keySystem = this.playerInterface_.getKeySystem();\n\n // If:\n // 1. the configuration tells to insert fake encryption,\n // 2. and this is an init segment,\n // 3. and encryption is expected,\n // 4. and the platform requires encryption in all init segments,\n // 5. and the content is MP4 (mimeType == \"video/mp4\" or \"audio/mp4\"),\n // then insert fake encryption metadata for init segments that lack it.\n // The MP4 requirement is because we can currently only do this\n // transformation on MP4 containers.\n // See: https://github.com/shaka-project/shaka-player/issues/2759\n if (this.config_.insertFakeEncryptionInInit &&\n isInitSegment &&\n encryptionExpected &&\n Platform.requiresEncryptionInfoInAllInitSegments(keySystem) &&\n shaka.util.MimeUtils.getContainerType(\n this.sourceBufferTypes_.get(contentType)) == 'mp4') {\n shaka.log.debug('Forcing fake encryption information in init segment.');\n segment = shaka.media.ContentWorkarounds.fakeEncryption(segment, uri);\n }\n\n if (isInitSegment &&\n Platform.requiresEC3InitSegments() &&\n shaka.util.MimeUtils.getContainerType(\n this.sourceBufferTypes_.get(contentType)) == 'mp4') {\n shaka.log.debug('Forcing fake EC-3 information in init segment.');\n segment = shaka.media.ContentWorkarounds.fakeEC3(segment);\n }\n\n return segment;\n }\n\n /**\n * Prepare the SourceBuffer to parse a potentially new type or codec.\n *\n * @param {shaka.util.ManifestParserUtils.ContentType} contentType\n * @param {string} mimeType\n * @param {?shaka.extern.Transmuxer} transmuxer\n * @private\n */\n change_(contentType, mimeType, transmuxer) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n if (contentType === ContentType.TEXT) {\n shaka.log.debug(`Change not supported for ${contentType}`);\n return;\n }\n const sourceBuffer = this.sourceBufferTypes_.get(contentType);\n shaka.log.debug(\n `Change Type: ${sourceBuffer} -> ${mimeType}`);\n if (shaka.media.Capabilities.isChangeTypeSupported()) {\n if (this.transmuxers_.has(contentType)) {\n this.transmuxers_.get(contentType).destroy();\n this.transmuxers_.delete(contentType);\n }\n if (transmuxer) {\n this.transmuxers_.set(contentType, transmuxer);\n }\n const type = this.addExtraFeaturesToMimeType_(mimeType);\n this.sourceBuffers_.get(contentType).changeType(type);\n this.sourceBufferTypes_.set(contentType, mimeType);\n } else {\n shaka.log.debug('Change Type not supported');\n }\n\n // Fake an 'updateend' event to resolve the operation.\n this.onUpdateEnd_(contentType);\n }\n\n /**\n * Enqueue an operation to prepare the SourceBuffer to parse a potentially new\n * type or codec.\n *\n * @param {shaka.util.ManifestParserUtils.ContentType} contentType\n * @param {string} mimeType\n * @param {?shaka.extern.Transmuxer} transmuxer\n * @return {!Promise}\n */\n changeType(contentType, mimeType, transmuxer) {\n return this.enqueueOperation_(\n contentType,\n () => this.change_(contentType, mimeType, transmuxer),\n null);\n }\n\n /**\n * Resets the MediaSource and re-adds source buffers due to codec mismatch\n *\n * @param {!Map<shaka.util.ManifestParserUtils.ContentType,\n * shaka.extern.Stream>} streamsByType\n * @private\n */\n async reset_(streamsByType) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n this.reloadingMediaSource_ = true;\n this.needSplitMuxedContent_ = false;\n const currentTime = this.video_.currentTime;\n\n // When codec switching if the user is currently paused we don't want\n // to trigger a play when switching codec.\n // Playing can also end up in a paused state after a codec switch\n // so we need to remember the current states.\n const previousAutoPlayState = this.video_.autoplay;\n const previousPausedState = this.video_.paused;\n if (this.playbackHasBegun_) {\n // Only set autoplay to false if the video playback has already begun.\n // When a codec switch happens before playback has begun this can cause\n // autoplay not to work as expected.\n this.video_.autoplay = false;\n }\n\n try {\n this.eventManager_.removeAll();\n\n for (const transmuxer of this.transmuxers_.values()) {\n transmuxer.destroy();\n }\n for (const sourceBuffer of this.sourceBuffers_.values()) {\n try {\n this.mediaSource_.removeSourceBuffer(sourceBuffer);\n } catch (e) {\n shaka.log.debug('Exception on removeSourceBuffer', e);\n }\n }\n this.transmuxers_.clear();\n this.sourceBuffers_.clear();\n\n const previousDuration = this.mediaSource_.duration;\n this.mediaSourceOpen_ = new shaka.util.PublicPromise();\n this.mediaSource_ = this.createMediaSource(this.mediaSourceOpen_);\n await this.mediaSourceOpen_;\n if (!isNaN(previousDuration) && previousDuration) {\n this.mediaSource_.duration = previousDuration;\n } else if (!isNaN(this.lastDuration_) && this.lastDuration_) {\n this.mediaSource_.duration = this.lastDuration_;\n }\n\n const sourceBufferAdded = new shaka.util.PublicPromise();\n const sourceBuffers =\n /** @type {EventTarget} */(this.mediaSource_.sourceBuffers);\n\n const totalOfBuffers = streamsByType.size;\n let numberOfSourceBufferAdded = 0;\n const onSourceBufferAdded = () => {\n numberOfSourceBufferAdded++;\n if (numberOfSourceBufferAdded === totalOfBuffers) {\n sourceBufferAdded.resolve();\n this.eventManager_.unlisten(sourceBuffers, 'addsourcebuffer',\n onSourceBufferAdded);\n }\n };\n\n this.eventManager_.listen(sourceBuffers, 'addsourcebuffer',\n onSourceBufferAdded);\n\n for (const contentType of streamsByType.keys()) {\n const stream = streamsByType.get(contentType);\n // eslint-disable-next-line no-await-in-loop\n await this.initSourceBuffer_(contentType, stream, stream.codecs);\n }\n const audio = streamsByType.get(ContentType.AUDIO);\n if (audio && audio.isAudioMuxedInVideo) {\n this.needSplitMuxedContent_ = true;\n }\n if (this.needSplitMuxedContent_ && !this.queues_.has(ContentType.AUDIO)) {\n this.queues_.set(ContentType.AUDIO, []);\n }\n\n // Fake a seek to catchup the playhead.\n this.video_.currentTime = currentTime;\n\n await sourceBufferAdded;\n } finally {\n this.reloadingMediaSource_ = false;\n\n this.destroyer_.ensureNotDestroyed();\n\n this.eventManager_.listenOnce(this.video_, 'canplaythrough', () => {\n // Don't use ensureNotDestroyed() from this event listener, because\n // that results in an uncaught exception. Instead, just check the\n // flag.\n if (this.destroyer_.destroyed()) {\n return;\n }\n\n this.video_.autoplay = previousAutoPlayState;\n if (!previousPausedState) {\n this.video_.play();\n }\n });\n }\n }\n\n /**\n * Resets the Media Source\n * @param {!Map<shaka.util.ManifestParserUtils.ContentType,\n * shaka.extern.Stream>} streamsByType\n * @return {!Promise}\n */\n reset(streamsByType) {\n return this.enqueueBlockingOperation_(\n () => this.reset_(streamsByType));\n }\n\n /**\n * @param {shaka.util.ManifestParserUtils.ContentType} contentType\n * @param {string} mimeType\n * @param {string} codecs\n * @return {{transmuxer: ?shaka.extern.Transmuxer,\n * transmuxerMuxed: boolean, basicType: string, codec: string,\n * mimeType: string}}\n * @private\n */\n getRealInfo_(contentType, mimeType, codecs) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n const MimeUtils = shaka.util.MimeUtils;\n /** @type {?shaka.extern.Transmuxer} */\n let transmuxer;\n let transmuxerMuxed = false;\n const audioCodec = shaka.util.ManifestParserUtils.guessCodecsSafe(\n ContentType.AUDIO, (codecs || '').split(','));\n const videoCodec = shaka.util.ManifestParserUtils.guessCodecsSafe(\n ContentType.VIDEO, (codecs || '').split(','));\n let codec = videoCodec;\n if (contentType == ContentType.AUDIO) {\n codec = audioCodec;\n }\n if (!codec) {\n codec = codecs;\n }\n let newMimeType = shaka.util.MimeUtils.getFullType(mimeType, codec);\n let needTransmux = this.config_.forceTransmux;\n if (!shaka.media.Capabilities.isTypeSupported(newMimeType) ||\n (!this.sequenceMode_ &&\n shaka.util.MimeUtils.RAW_FORMATS.includes(newMimeType))) {\n needTransmux = true;\n }\n const TransmuxerEngine = shaka.transmuxer.TransmuxerEngine;\n if (needTransmux) {\n const newMimeTypeWithAllCodecs =\n shaka.util.MimeUtils.getFullTypeWithAllCodecs(mimeType, codec);\n const transmuxerPlugin =\n TransmuxerEngine.findTransmuxer(newMimeTypeWithAllCodecs);\n if (transmuxerPlugin) {\n transmuxer = transmuxerPlugin();\n if (audioCodec && videoCodec) {\n transmuxerMuxed = true;\n }\n newMimeType =\n transmuxer.convertCodecs(contentType, newMimeTypeWithAllCodecs);\n }\n }\n\n const newCodec = MimeUtils.getNormalizedCodec(\n MimeUtils.getCodecs(newMimeType));\n const newBasicType = MimeUtils.getBasicType(newMimeType);\n return {\n transmuxer,\n transmuxerMuxed,\n basicType: newBasicType,\n codec: newCodec,\n mimeType: newMimeType,\n };\n }\n\n /**\n * Codec switch if necessary, this will not resolve until the codec\n * switch is over.\n * @param {shaka.util.ManifestParserUtils.ContentType} contentType\n * @param {string} mimeType\n * @param {string} codecs\n * @param {!Map<shaka.util.ManifestParserUtils.ContentType,\n * shaka.extern.Stream>} streamsByType\n * @return {!Promise<boolean>} true if there was a codec switch,\n * false otherwise.\n * @private\n */\n async codecSwitchIfNecessary_(contentType, mimeType, codecs, streamsByType) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n if (contentType == ContentType.TEXT) {\n return false;\n }\n const MimeUtils = shaka.util.MimeUtils;\n const currentCodec = MimeUtils.getNormalizedCodec(\n MimeUtils.getCodecs(this.sourceBufferTypes_.get(contentType)));\n const currentBasicType = MimeUtils.getBasicType(\n this.sourceBufferTypes_.get(contentType));\n\n const realInfo = this.getRealInfo_(contentType, mimeType, codecs);\n const transmuxer = realInfo.transmuxer;\n const transmuxerMuxed = realInfo.transmuxerMuxed;\n const newBasicType = realInfo.basicType;\n const newCodec = realInfo.codec;\n const newMimeType = realInfo.mimeType;\n\n let muxedContentCheck = true;\n if (transmuxerMuxed &&\n this.sourceBufferTypes_.has(ContentType.AUDIO)) {\n const muxedRealInfo =\n this.getRealInfo_(ContentType.AUDIO, mimeType, codecs);\n const muxedCurrentCodec = MimeUtils.getNormalizedCodec(\n MimeUtils.getCodecs(this.sourceBufferTypes_.get(ContentType.AUDIO)));\n const muxedCurrentBasicType = MimeUtils.getBasicType(\n this.sourceBufferTypes_.get(ContentType.AUDIO));\n muxedContentCheck = muxedCurrentCodec == muxedRealInfo.codec &&\n muxedCurrentBasicType == muxedRealInfo.basicType;\n if (muxedRealInfo.transmuxer) {\n muxedRealInfo.transmuxer.destroy();\n }\n }\n\n // Current/new codecs base and basic type match then no need to switch\n if (currentCodec === newCodec && currentBasicType === newBasicType &&\n muxedContentCheck) {\n if (this.transmuxers_.has(contentType) && !transmuxer) {\n this.transmuxers_.get(contentType).destroy();\n this.transmuxers_.delete(contentType);\n } else if (!this.transmuxers_.has(contentType) && transmuxer) {\n this.transmuxers_.set(contentType, transmuxer);\n } else if (transmuxer) {\n // Compare if the transmuxer is different\n if (this.transmuxers_.has(contentType) &&\n this.transmuxers_.get(contentType).transmux !=\n transmuxer.transmux) {\n this.transmuxers_.get(contentType).destroy();\n this.transmuxers_.delete(contentType);\n this.transmuxers_.set(contentType, transmuxer);\n } else {\n transmuxer.destroy();\n }\n }\n return false;\n }\n\n let allowChangeType = true;\n if (this.needSplitMuxedContent_ || (transmuxerMuxed &&\n transmuxer && !this.transmuxers_.has(contentType))) {\n allowChangeType = false;\n }\n\n if (allowChangeType && this.config_.codecSwitchingStrategy ===\n shaka.config.CodecSwitchingStrategy.SMOOTH &&\n shaka.media.Capabilities.isChangeTypeSupported()) {\n await this.changeType(contentType, newMimeType, transmuxer);\n } else {\n if (transmuxer) {\n transmuxer.destroy();\n }\n await this.reset(streamsByType);\n }\n return true;\n }\n\n /**\n * Returns true if it's necessary codec switch to load the new stream.\n *\n * @param {shaka.util.ManifestParserUtils.ContentType} contentType\n * @param {string} refMimeType\n * @param {string} refCodecs\n * @return {boolean}\n * @private\n */\n isCodecSwitchNecessary_(contentType, refMimeType, refCodecs) {\n if (contentType == shaka.util.ManifestParserUtils.ContentType.TEXT) {\n return false;\n }\n const MimeUtils = shaka.util.MimeUtils;\n const currentCodec = MimeUtils.getNormalizedCodec(\n MimeUtils.getCodecs(this.sourceBufferTypes_.get(contentType)));\n const currentBasicType = MimeUtils.getBasicType(\n this.sourceBufferTypes_.get(contentType));\n\n let newMimeType = shaka.util.MimeUtils.getFullType(refMimeType, refCodecs);\n let needTransmux = this.config_.forceTransmux;\n if (!shaka.media.Capabilities.isTypeSupported(newMimeType) ||\n (!this.sequenceMode_ &&\n shaka.util.MimeUtils.RAW_FORMATS.includes(newMimeType))) {\n needTransmux = true;\n }\n const newMimeTypeWithAllCodecs =\n shaka.util.MimeUtils.getFullTypeWithAllCodecs(\n refMimeType, refCodecs);\n const TransmuxerEngine = shaka.transmuxer.TransmuxerEngine;\n if (needTransmux) {\n const transmuxerPlugin =\n TransmuxerEngine.findTransmuxer(newMimeTypeWithAllCodecs);\n if (transmuxerPlugin) {\n const transmuxer = transmuxerPlugin();\n newMimeType =\n transmuxer.convertCodecs(contentType, newMimeTypeWithAllCodecs);\n transmuxer.destroy();\n }\n }\n\n const newCodec = MimeUtils.getNormalizedCodec(\n MimeUtils.getCodecs(newMimeType));\n const newBasicType = MimeUtils.getBasicType(newMimeType);\n\n return currentCodec !== newCodec || currentBasicType !== newBasicType;\n }\n\n /**\n * Returns true if it's necessary reset the media source to load the\n * new stream.\n *\n * @param {shaka.util.ManifestParserUtils.ContentType} contentType\n * @param {string} mimeType\n * @param {string} codecs\n * @return {boolean}\n */\n isResetMediaSourceNecessary(contentType, mimeType, codecs) {\n if (!this.isCodecSwitchNecessary_(contentType, mimeType, codecs)) {\n return false;\n }\n\n return this.config_.codecSwitchingStrategy !==\n shaka.config.CodecSwitchingStrategy.SMOOTH ||\n !shaka.media.Capabilities.isChangeTypeSupported() ||\n this.needSplitMuxedContent_;\n }\n\n /**\n * Update LCEVC Decoder object when ready for LCEVC Decode.\n * @param {?shaka.lcevc.Dec} lcevcDec\n */\n updateLcevcDec(lcevcDec) {\n this.lcevcDec_ = lcevcDec;\n }\n\n /**\n * @param {string} mimeType\n * @return {string}\n * @private\n */\n addExtraFeaturesToMimeType_(mimeType) {\n const extraFeatures = this.config_.addExtraFeaturesToSourceBuffer(mimeType);\n const extendedType = mimeType + extraFeatures;\n shaka.log.debug('Using full mime type', extendedType);\n\n return extendedType;\n }\n};\n\n\n/**\n * Internal reference to window.URL.createObjectURL function to avoid\n * compatibility issues with other libraries and frameworks such as React\n * Native. For use in unit tests only, not meant for external use.\n *\n * @type {function(?):string}\n */\nshaka.media.MediaSourceEngine.createObjectURL = window.URL.createObjectURL;\n\n\n/**\n * @typedef {{\n * start: function(),\n * p: !shaka.util.PublicPromise,\n * uri: ?string\n * }}\n *\n * @summary An operation in queue.\n * @property {function()} start\n * The function which starts the operation.\n * @property {!shaka.util.PublicPromise} p\n * The PublicPromise which is associated with this operation.\n * @property {?string} uri\n * A segment URI (if any) associated with this operation.\n */\nshaka.media.MediaSourceEngine.Operation;\n\n\n/**\n * @enum {string}\n * @private\n */\nshaka.media.MediaSourceEngine.SourceBufferMode_ = {\n SEQUENCE: 'sequence',\n SEGMENTS: 'segments',\n};\n\n\n/**\n * @typedef {{\n * getKeySystem: function():?string,\n * onMetadata: function(!Array<shaka.extern.ID3Metadata>, number, ?number),\n * onEmsg: function(!shaka.extern.EmsgInfo),\n * onEvent: function(!Event),\n * onManifestUpdate: function()\n * }}\n *\n * @summary Player interface\n * @property {function():?string} getKeySystem\n * Gets currently used key system or null if not used.\n * @property {function(\n * !Array<shaka.extern.ID3Metadata>, number, ?number)} onMetadata\n * Callback to use when metadata arrives.\n * @property {function(!shaka.extern.EmsgInfo)} onEmsg\n * Callback to use when EMSG arrives.\n * @property {function(!Event)} onEvent\n * Called when an event occurs that should be sent to the app.\n * @property {function()} onManifestUpdate\n * Called when an embedded 'emsg' box should trigger a manifest update.\n */\nshaka.media.MediaSourceEngine.PlayerInterface;\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.media.MetaSegmentIndex');\ngoog.provide('shaka.media.SegmentIndex');\ngoog.provide('shaka.media.SegmentIterator');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.log');\ngoog.require('shaka.media.SegmentReference');\ngoog.require('shaka.util.IReleasable');\ngoog.require('shaka.util.Timer');\n\n\n/**\n * SegmentIndex.\n *\n * @implements {shaka.extern.SegmentIndex}\n * @implements {shaka.util.IReleasable}\n * @implements {Iterable<!shaka.media.SegmentReference>}\n * @export\n */\nshaka.media.SegmentIndex = class {\n /**\n * @param {!Array<!shaka.media.SegmentReference>} references The list of\n * SegmentReferences, which must be sorted first by their start times\n * (ascending) and second by their end times (ascending).\n */\n constructor(references) {\n if (goog.DEBUG) {\n shaka.media.SegmentIndex.assertCorrectReferences_(references);\n }\n\n /** @protected {!Array<!shaka.media.SegmentReference>} */\n this.references = references;\n\n /** @private {shaka.util.Timer} */\n this.timer_ = null;\n\n /**\n * The number of references that have been removed from the front of the\n * array. Used to create stable positions in the find/get APIs.\n *\n * @protected {number}\n */\n this.numEvicted_ = 0;\n\n /** @private {boolean} */\n this.immutable_ = false;\n }\n\n /**\n * Get immutability\n *\n * @return {boolean}\n */\n getIsImmutable() {\n return this.immutable_;\n }\n\n /**\n * @override\n * @export\n */\n getNumReferences() {\n return this.references.length;\n }\n\n /**\n * @override\n * @export\n */\n getNumEvicted() {\n return this.numEvicted_;\n }\n\n /**\n * @override\n * @export\n */\n release() {\n if (this.immutable_) {\n return;\n }\n\n this.references = [];\n\n if (this.timer_) {\n this.timer_.stop();\n }\n this.timer_ = null;\n }\n\n\n /**\n * Marks the index as immutable. Segments cannot be added or removed after\n * this point. This doesn't affect the references themselves. This also\n * makes the destroy/release methods do nothing.\n *\n * This is mainly for testing.\n *\n * @export\n */\n markImmutable() {\n this.immutable_ = true;\n }\n\n\n /**\n * Iterates over all top-level segment references in this segment index.\n * @param {function(!shaka.media.SegmentReference)} fn\n */\n forEachTopLevelReference(fn) {\n for (const reference of this.references) {\n fn(reference);\n }\n }\n\n\n /**\n * Return the earliest reference, or null if empty.\n * @return {shaka.media.SegmentReference}\n */\n earliestReference() {\n return this.references[0] || null;\n }\n\n\n /**\n * Drop the first N references.\n * Used in early HLS synchronization, and does not count as eviction.\n * @param {number} n\n */\n dropFirstReferences(n) {\n this.references.splice(0, n);\n }\n\n\n /**\n * @override\n * @export\n */\n find(time) {\n // For live streams, searching from the end is faster. For VOD, it balances\n // out either way. In both cases, references.length is small enough that\n // the difference isn't huge.\n const lastReferenceIndex = this.references.length - 1;\n for (let i = lastReferenceIndex; i >= 0; --i) {\n const r = this.references[i];\n const start = r.startTime;\n // A rounding error can cause /time/ to equal e.endTime or fall in between\n // the references by a fraction of a second. To account for this, we use\n // the start of the next segment as /end/, unless this is the last\n // reference, in which case we use its end time as /end/.\n const end = i < lastReferenceIndex ?\n this.references[i + 1].startTime : r.endTime;\n // Note that a segment ends immediately before the end time.\n if ((time >= start) && (time < end)) {\n return i + this.numEvicted_;\n }\n }\n if (this.references.length && time < this.references[0].startTime) {\n return this.numEvicted_;\n }\n\n return null;\n }\n\n\n /**\n * @override\n * @export\n */\n get(position) {\n if (this.references.length == 0) {\n return null;\n }\n\n const index = position - this.numEvicted_;\n if (index < 0 || index >= this.references.length) {\n return null;\n }\n\n return this.references[index];\n }\n\n\n /**\n * Offset all segment references by a fixed amount.\n *\n * @param {number} offset The amount to add to each segment's start and end\n * times.\n * @export\n */\n offset(offset) {\n if (!this.immutable_) {\n for (const ref of this.references) {\n ref.offset(offset);\n }\n }\n }\n\n\n /**\n * Merges the given SegmentReferences. Supports extending the original\n * references only. Will replace old references with equivalent new ones, and\n * keep any unique old ones.\n *\n * Used, for example, by the DASH and HLS parser, where manifests may not list\n * all available references, so we must keep available references in memory to\n * fill the availability window.\n *\n * @param {!Array<!shaka.media.SegmentReference>} references The list of\n * SegmentReferences, which must be sorted first by their start times\n * (ascending) and second by their end times (ascending).\n */\n merge(references) {\n if (goog.DEBUG) {\n shaka.media.SegmentIndex.assertCorrectReferences_(references);\n }\n if (this.immutable_) {\n return;\n }\n\n if (!references.length) {\n return;\n }\n\n // Partial segments are used for live edge, and should be removed when they\n // get older. Remove the old SegmentReferences after the first new\n // reference's start time.\n // Use times rounded to the millisecond for filtering purposes, so that\n // tiny rounding errors will not result in duplicate segments in the index.\n const firstStartTime = Math.round(references[0].startTime * 1000) / 1000;\n this.references = this.references.filter((r) => {\n return (Math.round(r.startTime * 1000) / 1000) < firstStartTime;\n });\n\n this.references.push(...references);\n\n if (goog.DEBUG) {\n shaka.media.SegmentIndex.assertCorrectReferences_(this.references);\n }\n }\n\n /**\n * Merges the given SegmentReferences and evicts the ones that end before the\n * given time. Supports extending the original references only.\n * Will not replace old references or interleave new ones.\n * Used, for example, by the DASH and HLS parser, where manifests may not list\n * all available references, so we must keep available references in memory to\n * fill the availability window.\n *\n * @param {!Array<!shaka.media.SegmentReference>} references The list of\n * SegmentReferences, which must be sorted first by their start times\n * (ascending) and second by their end times (ascending).\n * @param {number} windowStart The start of the availability window to filter\n * out the references that are no longer available.\n * @export\n */\n mergeAndEvict(references, windowStart) {\n // Filter out the references that are no longer available to avoid\n // repeatedly evicting them and messing up eviction count.\n references = references.filter((r) => {\n return r.endTime > windowStart &&\n (this.references.length == 0 ||\n r.endTime > this.references[0].startTime);\n });\n\n const oldFirstRef = this.references[0];\n this.merge(references);\n const newFirstRef = this.references[0];\n\n if (oldFirstRef) {\n // We don't compare the actual ref, since the object could legitimately be\n // replaced with an equivalent. Even the URIs could change due to\n // load-balancing actions taken by the server. However, if the time\n // changes, its not an equivalent reference.\n goog.asserts.assert(oldFirstRef.startTime == newFirstRef.startTime,\n 'SegmentIndex.merge should not change the first reference time!');\n }\n\n this.evict(windowStart);\n }\n\n /**\n * Removes all SegmentReferences that end before the given time.\n *\n * @param {number} time The time in seconds.\n * @export\n */\n evict(time) {\n if (this.immutable_) {\n return;\n }\n\n const oldSize = this.references.length;\n\n this.references = this.references.filter((ref) => ref.endTime > time);\n\n const newSize = this.references.length;\n const diff = oldSize - newSize;\n // Tracking the number of evicted refs will keep their \"positions\" stable\n // for the caller.\n this.numEvicted_ += diff;\n }\n\n\n /**\n * Drops references that start after windowEnd, or end before windowStart,\n * and contracts the last reference so that it ends at windowEnd.\n *\n * Do not call on the last period of a live presentation (unknown duration).\n * It is okay to call on the other periods of a live presentation, where the\n * duration is known and another period has been added.\n *\n * @param {number} windowStart\n * @param {?number} windowEnd\n * @param {boolean=} isNew Whether this is a new SegmentIndex and we shouldn't\n * update the number of evicted elements.\n * @export\n */\n fit(windowStart, windowEnd, isNew = false) {\n goog.asserts.assert(windowEnd != null,\n 'Content duration must be known for static content!');\n goog.asserts.assert(windowEnd != Infinity,\n 'Content duration must be finite for static content!');\n if (this.immutable_) {\n return;\n }\n\n // Trim out references we will never use.\n while (this.references.length) {\n const lastReference = this.references[this.references.length - 1];\n if (lastReference.startTime >= windowEnd) {\n this.references.pop();\n } else {\n break;\n }\n }\n\n while (this.references.length) {\n const firstReference = this.references[0];\n if (firstReference.endTime <= windowStart) {\n this.references.shift();\n if (!isNew) {\n this.numEvicted_++;\n }\n } else {\n break;\n }\n }\n\n if (this.references.length == 0) {\n return;\n }\n\n // Adjust the last SegmentReference.\n const lastReference = this.references[this.references.length - 1];\n const newReference = new shaka.media.SegmentReference(\n lastReference.startTime,\n /* endTime= */ windowEnd,\n lastReference.getUrisInner,\n lastReference.startByte,\n lastReference.endByte,\n lastReference.initSegmentReference,\n lastReference.timestampOffset,\n lastReference.appendWindowStart,\n lastReference.appendWindowEnd,\n lastReference.partialReferences,\n lastReference.tilesLayout,\n lastReference.tileDuration,\n lastReference.syncTime,\n lastReference.status,\n lastReference.aesKey,\n );\n newReference.mimeType = lastReference.mimeType;\n newReference.codecs = lastReference.codecs;\n newReference.discontinuitySequence = lastReference.discontinuitySequence;\n this.references[this.references.length - 1] = newReference;\n }\n\n\n /**\n * Updates the references every so often. Stops when the references list\n * returned by the callback is null.\n *\n * @param {number} interval The interval in seconds.\n * @param {function(): Array<shaka.media.SegmentReference>} updateCallback\n * @export\n */\n updateEvery(interval, updateCallback) {\n goog.asserts.assert(!this.timer_, 'SegmentIndex timer already started!');\n if (this.immutable_) {\n return;\n }\n if (this.timer_) {\n this.timer_.stop();\n }\n\n this.timer_ = new shaka.util.Timer(() => {\n const references = updateCallback();\n if (references) {\n this.references.push(...references);\n } else {\n this.timer_.stop();\n this.timer_ = null;\n }\n });\n this.timer_.tickEvery(interval);\n }\n\n\n /** @return {!shaka.media.SegmentIterator} */\n [Symbol.iterator]() {\n const iter = this.getIteratorForTime(0);\n goog.asserts.assert(iter != null, 'Iterator for 0 should never be null!');\n return iter;\n }\n\n /**\n * Returns a new iterator that initially points to the segment that contains\n * the given time, or the nearest independent segment before it.\n *\n * Like the normal iterator, next() must be called first to get to the first\n * element. Returns null if we do not find a segment at the\n * requested time.\n *\n * The first segment returned by the iterator _MUST_ be an independent\n * segment. Assumes that only partial references can be dependent, based on\n * RFC 8216 rev 13, section 8.1: \"Each (non-Partial) Media Segment in a Media\n * Playlist will contain at least one independent frame.\"\n *\n * @param {number} time\n * @param {boolean=} allowNonIndependent\n * @param {boolean=} reverse\n * @return {?shaka.media.SegmentIterator}\n * @export\n */\n getIteratorForTime(time, allowNonIndependent = false, reverse = false) {\n let index = this.find(time);\n if (index == null) {\n return null;\n }\n\n const ref = this.get(index);\n\n // Adjust index to point to previous or next index (if reversed), so first\n // next() call will traverse in proper direction.\n if (!reverse) {\n index--;\n } else {\n index++;\n }\n\n let partialSegmentIndex = -1;\n if (ref && ref.hasPartialSegments()) {\n // Look for a partial SegmentReference.\n for (let i = ref.partialReferences.length - 1; i >= 0; --i) {\n let r = ref.partialReferences[i];\n // Note that a segment ends immediately before the end time.\n if ((time >= r.startTime) && (time < r.endTime)) {\n if (!allowNonIndependent) {\n // Find an independent partial segment by moving backwards.\n while (i && (!r.isIndependent())) {\n i--;\n r = ref.partialReferences[i];\n }\n if (!r.isIndependent()) {\n shaka.log.alwaysError('No independent partial segment found!');\n return null;\n }\n }\n // Call to next() should move the partial segment, not the full\n // segment.\n if (reverse) {\n index--;\n } else {\n index++;\n }\n partialSegmentIndex = i - 1;\n break;\n }\n }\n }\n return new shaka.media.SegmentIterator(\n this, index, partialSegmentIndex, reverse);\n }\n\n /**\n * @return {boolean}\n */\n isEmpty() {\n return this.getNumReferences() == 0;\n }\n\n /**\n * Create a SegmentIndex for a single segment of the given start time and\n * duration at the given URIs.\n *\n * @param {number} startTime\n * @param {number} duration\n * @param {!Array<string>} uris\n * @return {!shaka.media.SegmentIndex}\n * @export\n */\n static forSingleSegment(startTime, duration, uris) {\n const reference = new shaka.media.SegmentReference(\n /* startTime= */ startTime,\n /* endTime= */ startTime + duration,\n /* getUris= */ () => uris,\n /* startByte= */ 0,\n /* endByte= */ null,\n /* initSegmentReference= */ null,\n /* presentationTimeOffset= */ startTime,\n /* appendWindowStart= */ startTime,\n /* appendWindowEnd= */ startTime + duration);\n return new shaka.media.SegmentIndex([reference]);\n }\n};\n\n\nif (goog.DEBUG) {\n /**\n * Asserts that the given SegmentReferences are sorted.\n *\n * @param {!Array<shaka.media.SegmentReference>} references\n * @private\n */\n shaka.media.SegmentIndex.assertCorrectReferences_ = (references) => {\n goog.asserts.assert(references.every((r2, i) => {\n if (i == 0) {\n return true;\n }\n const r1 = references[i - 1];\n if (r1.startTime < r2.startTime) {\n return true;\n } else if (r1.startTime > r2.startTime) {\n return false;\n } else {\n if (r1.endTime <= r2.endTime) {\n return true;\n } else {\n return false;\n }\n }\n }), 'SegmentReferences are incorrect');\n };\n}\n\n\n/**\n * An iterator over a SegmentIndex's references.\n *\n * @implements {Iterator<shaka.media.SegmentReference>}\n * @export\n */\nshaka.media.SegmentIterator = class {\n /**\n * @param {shaka.media.SegmentIndex} segmentIndex\n * @param {number} index\n * @param {number} partialSegmentIndex\n * @param {boolean} reverse\n */\n constructor(segmentIndex, index, partialSegmentIndex, reverse) {\n /** @private {shaka.media.SegmentIndex} */\n this.segmentIndex_ = segmentIndex;\n\n /** @private {number} */\n this.currentPosition_ = index;\n\n /** @private {number} */\n this.currentPartialPosition_ = partialSegmentIndex;\n\n /** @private {boolean} */\n this.reverse = reverse;\n }\n\n /**\n * @param {boolean} reverse\n * @export\n */\n setReverse(reverse) {\n this.reverse = reverse;\n }\n\n /**\n * @return {number}\n * @export\n */\n currentPosition() {\n return this.currentPosition_;\n }\n\n /**\n * @return {shaka.media.SegmentReference}\n * @export\n */\n current() {\n let ref = this.segmentIndex_.get(this.currentPosition_);\n\n // When we advance past the end of partial references in next(), then add\n // new references in merge(), the pointers may not make sense any more.\n // This adjusts the invalid pointer values to point to the next newly added\n // segment or partial segment.\n if (ref && ref.hasPartialSegments() && ref.hasAllPartialSegments() &&\n this.currentPartialPosition_ >= ref.partialReferences.length) {\n this.currentPosition_++;\n this.currentPartialPosition_ = 0;\n ref = this.segmentIndex_.get(this.currentPosition_);\n }\n\n // If the regular segment contains partial segments, get the current\n // partial SegmentReference.\n if (ref && ref.hasPartialSegments()) {\n const partial = ref.partialReferences[this.currentPartialPosition_];\n return partial;\n }\n return ref;\n }\n\n /**\n * @override\n * @export\n */\n next() {\n const ref = this.segmentIndex_.get(this.currentPosition_);\n\n if (!this.reverse) {\n if (ref && ref.hasPartialSegments()) {\n // If the regular segment contains partial segments, move to the next\n // partial SegmentReference.\n this.currentPartialPosition_++;\n // If the current regular segment has been published completely, and\n // we've reached the end of its partial segments list, move to the next\n // regular segment.\n // If the Partial Segments list is still on the fly, do not move to\n // the next regular segment.\n if (ref.hasAllPartialSegments() &&\n this.currentPartialPosition_ == ref.partialReferences.length) {\n this.currentPosition_++;\n this.currentPartialPosition_ = 0;\n }\n } else {\n // If the regular segment doesn't contain partial segments, move to the\n // next regular segment.\n this.currentPosition_++;\n this.currentPartialPosition_ = 0;\n }\n } else {\n if (ref && ref.hasPartialSegments()) {\n // If the regular segment contains partial segments, move to the\n // previous partial SegmentReference.\n this.currentPartialPosition_--;\n if (this.currentPartialPosition_ < 0) {\n this.currentPosition_--;\n const prevRef = this.segmentIndex_.get(this.currentPosition_);\n if (prevRef && prevRef.hasPartialSegments()) {\n this.currentPartialPosition_ = prevRef.partialReferences.length - 1;\n } else {\n this.currentPartialPosition_ = 0;\n }\n }\n } else {\n // If the regular segment doesn't contain partial segments, move to the\n // previous regular segment.\n this.currentPosition_--;\n this.currentPartialPosition_ = 0;\n }\n }\n\n const res = this.current();\n\n return {\n 'value': res,\n 'done': !res,\n };\n }\n\n /**\n * @export\n */\n resetToLastIndependent() {\n const current = this.current();\n if (current.isPartial() && !current.isIndependent()) {\n const ref = this.segmentIndex_.get(this.currentPosition_);\n if (ref && ref.hasPartialSegments()) {\n let partial = ref.partialReferences[this.currentPartialPosition_];\n while (partial.isIndependent()) {\n if (this.currentPartialPosition_ <= 0) {\n break;\n }\n this.currentPartialPosition_--;\n partial = ref.partialReferences[this.currentPartialPosition_];\n }\n }\n }\n }\n};\n\n\n/**\n * A meta-SegmentIndex composed of multiple other SegmentIndexes.\n * Used in constructing multi-Period Streams for DASH.\n *\n * @extends shaka.media.SegmentIndex\n * @implements {shaka.util.IReleasable}\n * @implements {Iterable<!shaka.media.SegmentReference>}\n * @export\n */\nshaka.media.MetaSegmentIndex = class extends shaka.media.SegmentIndex {\n /** */\n constructor() {\n super([]);\n\n /** @private {!Array<!shaka.media.SegmentIndex>} */\n this.indexes_ = [];\n }\n\n /** Evicts all old SegmentIndexes in this MetaSegmentIndex that are empty. */\n evictEmpty() {\n while (this.indexes_.length > 1 && this.indexes_[0].isEmpty()) {\n const index = this.indexes_.shift();\n // In the case of this class, this.numEvicted_ represents the evicted\n // segments that were in indexes that were entirely evicted.\n this.numEvicted_ += index.getNumEvicted();\n index.release();\n }\n }\n\n /**\n * Append a SegmentIndex to this MetaSegmentIndex. This effectively stitches\n * the underlying Stream onto the end of the multi-Period Stream represented\n * by this MetaSegmentIndex.\n *\n * @param {!shaka.media.SegmentIndex} segmentIndex\n */\n appendSegmentIndex(segmentIndex) {\n goog.asserts.assert(\n this.indexes_.length == 0 || segmentIndex.getNumEvicted() == 0,\n 'Should not append a new segment index with already-evicted segments');\n this.indexes_.push(segmentIndex);\n }\n\n /**\n * Create a clone of this MetaSegmentIndex containing all the same indexes.\n *\n * @return {!shaka.media.MetaSegmentIndex}\n */\n clone() {\n const clone = new shaka.media.MetaSegmentIndex();\n // Be careful to clone the Array. We don't want to share the reference with\n // our clone and affect each other accidentally.\n clone.indexes_ = this.indexes_.slice();\n clone.numEvicted_ = this.numEvicted_;\n return clone;\n }\n\n /**\n * @override\n * @export\n */\n release() {\n for (const index of this.indexes_) {\n index.release();\n }\n\n this.indexes_ = [];\n }\n\n /**\n * @override\n * @export\n */\n forEachTopLevelReference(fn) {\n for (const index of this.indexes_) {\n index.forEachTopLevelReference(fn);\n }\n }\n\n /**\n * @override\n * @export\n */\n find(time) {\n let numPassedInEarlierIndexes = this.numEvicted_;\n\n for (const index of this.indexes_) {\n const position = index.find(time);\n\n if (position != null) {\n return position + numPassedInEarlierIndexes;\n }\n\n numPassedInEarlierIndexes += index.getNumEvicted() +\n index.getNumReferences();\n }\n\n return null;\n }\n\n /**\n * @override\n * @export\n */\n get(position) {\n let numPassedInEarlierIndexes = this.numEvicted_;\n let sawSegments = false;\n\n for (const index of this.indexes_) {\n goog.asserts.assert(\n !sawSegments || index.getNumEvicted() == 0,\n 'Should not see evicted segments after available segments');\n const reference = index.get(position - numPassedInEarlierIndexes);\n\n if (reference) {\n return reference;\n }\n\n const num = index.getNumReferences();\n numPassedInEarlierIndexes += index.getNumEvicted() + num;\n sawSegments = sawSegments || num != 0;\n }\n\n return null;\n }\n\n /**\n * @override\n * @export\n */\n offset(offset) {\n // offset() is only used by HLS, and MetaSegmentIndex is only used for DASH.\n goog.asserts.assert(\n false, 'offset() should not be used in MetaSegmentIndex!');\n }\n\n /**\n * @override\n * @export\n */\n merge(references) {\n // merge() is only used internally by the DASH and HLS parser on\n // SegmentIndexes, but never on MetaSegmentIndex.\n goog.asserts.assert(\n false, 'merge() should not be used in MetaSegmentIndex!');\n }\n\n /**\n * @override\n * @export\n */\n evict(time) {\n for (const index of this.indexes_) {\n index.evict(time);\n }\n this.evictEmpty();\n }\n\n /**\n * @override\n * @export\n */\n mergeAndEvict(references, windowStart) {\n // mergeAndEvict() is only used internally by the DASH and HLS parser on\n // SegmentIndexes, but never on MetaSegmentIndex.\n goog.asserts.assert(\n false, 'mergeAndEvict() should not be used in MetaSegmentIndex!');\n }\n\n /**\n * @override\n * @export\n */\n fit(windowStart, windowEnd) {\n // fit() is only used internally by manifest parsers on SegmentIndexes, but\n // never on MetaSegmentIndex.\n goog.asserts.assert(false, 'fit() should not be used in MetaSegmentIndex!');\n }\n\n /**\n * @override\n * @export\n */\n updateEvery(interval, updateCallback) {\n // updateEvery() is only used internally by the DASH parser on\n // SegmentIndexes, but never on MetaSegmentIndex.\n goog.asserts.assert(\n false, 'updateEvery() should not be used in MetaSegmentIndex!');\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.media.PresentationTimeline');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.log');\ngoog.require('shaka.media.SegmentReference');\n\n\n/**\n * PresentationTimeline.\n * @export\n */\nshaka.media.PresentationTimeline = class {\n /**\n * @param {?number} presentationStartTime The wall-clock time, in seconds,\n * when the presentation started or will start. Only required for live.\n * @param {number} presentationDelay The delay to give the presentation, in\n * seconds. Only required for live.\n * @param {boolean=} autoCorrectDrift Whether to account for drift when\n * determining the availability window.\n *\n * @see {shaka.extern.Manifest}\n * @see {@tutorial architecture}\n */\n constructor(presentationStartTime, presentationDelay,\n autoCorrectDrift = true) {\n /** @private {?number} */\n this.presentationStartTime_ = presentationStartTime;\n\n /** @private {number} */\n this.presentationDelay_ = presentationDelay;\n\n /** @private {number} */\n this.duration_ = Infinity;\n\n /** @private {number} */\n this.segmentAvailabilityDuration_ = Infinity;\n\n /**\n * The maximum segment duration (in seconds). Can be based on explicitly-\n * known segments or on signalling in the manifest.\n *\n * @private {number}\n */\n this.maxSegmentDuration_ = 1;\n\n /**\n * The minimum segment start time (in seconds, in the presentation timeline)\n * for segments we explicitly know about.\n *\n * This is null if we have no explicit descriptions of segments, such as in\n * DASH when using SegmentTemplate w/ duration.\n *\n * @private {?number}\n */\n this.minSegmentStartTime_ = null;\n\n /**\n * The maximum segment end time (in seconds, in the presentation timeline)\n * for segments we explicitly know about.\n *\n * This is null if we have no explicit descriptions of segments, such as in\n * DASH when using SegmentTemplate w/ duration. When this is non-null, the\n * presentation start time is calculated from the segment end times.\n *\n * @private {?number}\n */\n this.maxSegmentEndTime_ = null;\n\n /** @private {number} */\n this.clockOffset_ = 0;\n\n /** @private {boolean} */\n this.static_ = true;\n\n /** @private {boolean} */\n this.isLive2VodTransition_ = false;\n\n /** @private {number} */\n this.userSeekStart_ = 0;\n\n /** @private {boolean} */\n this.autoCorrectDrift_ = autoCorrectDrift;\n\n /**\n * For low latency Dash, availabilityTimeOffset indicates a segment is\n * available for download earlier than its availability start time.\n * This field is the minimum availabilityTimeOffset value among the\n * segments. We reduce the distance from live edge by this value.\n *\n * @private {number}\n */\n this.availabilityTimeOffset_ = 0;\n\n /** @private {boolean} */\n this.startTimeLocked_ = false;\n\n /** @private {?number} */\n this.initialProgramDateTime_ = presentationStartTime;\n }\n\n\n /**\n * @return {number} The presentation's duration in seconds.\n * Infinity indicates that the presentation continues indefinitely.\n * @export\n */\n getDuration() {\n return this.duration_;\n }\n\n\n /**\n * @return {number} The presentation's max segment duration in seconds.\n * @export\n */\n getMaxSegmentDuration() {\n return this.maxSegmentDuration_;\n }\n\n\n /**\n * Sets the presentation's start time.\n *\n * @param {number} presentationStartTime The wall-clock time, in seconds,\n * when the presentation started or will start. Only required for live.\n * @export\n */\n setPresentationStartTime(presentationStartTime) {\n goog.asserts.assert(presentationStartTime >= 0,\n 'presentationStartTime must be >= 0');\n this.presentationStartTime_ = presentationStartTime;\n }\n\n\n /**\n * Sets the presentation's duration.\n *\n * @param {number} duration The presentation's duration in seconds.\n * Infinity indicates that the presentation continues indefinitely.\n * @export\n */\n setDuration(duration) {\n goog.asserts.assert(duration > 0, 'duration must be > 0');\n this.duration_ = duration;\n }\n\n\n /**\n * @return {?number} The presentation's start time in seconds.\n * @export\n */\n getPresentationStartTime() {\n return this.presentationStartTime_;\n }\n\n\n /**\n * Sets the clock offset, which is the difference between the client's clock\n * and the server's clock, in milliseconds (i.e., serverTime = Date.now() +\n * clockOffset).\n *\n * @param {number} offset The clock offset, in ms.\n * @export\n */\n setClockOffset(offset) {\n this.clockOffset_ = offset;\n }\n\n\n /**\n * Sets the presentation's static flag.\n *\n * @param {boolean} isStatic If true, the presentation is static, meaning all\n * segments are available at once.\n * @export\n */\n setStatic(isStatic) {\n // NOTE: the argument name is not \"static\" because that's a keyword in ES6\n if (isStatic && !this.static_) {\n this.isLive2VodTransition_ = true;\n }\n this.static_ = isStatic;\n }\n\n\n /**\n * Sets the presentation's segment availability duration. The segment\n * availability duration should only be set for live.\n *\n * @param {number} segmentAvailabilityDuration The presentation's new segment\n * availability duration in seconds.\n * @export\n */\n setSegmentAvailabilityDuration(segmentAvailabilityDuration) {\n goog.asserts.assert(segmentAvailabilityDuration >= 0,\n 'segmentAvailabilityDuration must be >= 0');\n this.segmentAvailabilityDuration_ = segmentAvailabilityDuration;\n }\n\n\n /**\n * Gets the presentation's segment availability duration.\n *\n * @return {number}\n * @export\n */\n getSegmentAvailabilityDuration() {\n return this.segmentAvailabilityDuration_;\n }\n\n\n /**\n * Sets the presentation delay in seconds.\n *\n * @param {number} delay\n * @export\n */\n setDelay(delay) {\n // NOTE: This is no longer used internally, but is exported.\n // So we cannot remove it without deprecating it and waiting one release\n // cycle, or else we risk breaking custom manifest parsers.\n goog.asserts.assert(delay >= 0, 'delay must be >= 0');\n this.presentationDelay_ = delay;\n }\n\n\n /**\n * Gets the presentation delay in seconds.\n * @return {number}\n * @export\n */\n getDelay() {\n return this.presentationDelay_;\n }\n\n /**\n * Gives PresentationTimeline a Stream's timeline so it can size and position\n * the segment availability window, and account for missing segment\n * information.\n *\n * @param {!Array<shaka.media.PresentationTimeline.TimeRange>} timeline\n * @param {number} startOffset\n * @export\n */\n notifyTimeRange(timeline, startOffset) {\n if (timeline.length == 0) {\n return;\n }\n\n // Date.now() is in milliseconds, from which we compute \"now\" in seconds.\n const now = (Date.now() + this.clockOffset_) / 1000.0;\n // Exclude time ranges that are in the \"future\".\n const timelineForStart = timeline.filter((timeRange) =>\n timeRange.start + startOffset < now);\n if (timelineForStart.length == 0) {\n return;\n }\n\n const firstStartTime = timelineForStart[0].start + startOffset;\n const lastEndTime = timelineForStart[timelineForStart.length - 1].end +\n startOffset;\n\n this.notifyMinSegmentStartTime(firstStartTime);\n\n this.maxSegmentDuration_ = timelineForStart.reduce(\n (max, r) => { return Math.max(max, r.end - r.start); },\n this.maxSegmentDuration_);\n\n this.maxSegmentEndTime_ =\n Math.max(this.maxSegmentEndTime_, lastEndTime);\n\n if (this.presentationStartTime_ != null && this.autoCorrectDrift_ &&\n !this.startTimeLocked_) {\n // Since we have explicit segment end times, calculate a presentation\n // start based on them. This start time accounts for drift.\n this.presentationStartTime_ =\n now - this.maxSegmentEndTime_ - this.maxSegmentDuration_;\n }\n\n shaka.log.v1('notifySegments:',\n 'maxSegmentDuration=' + this.maxSegmentDuration_);\n }\n\n\n /**\n * Gives PresentationTimeline an array of segments so it can size and position\n * the segment availability window, and account for missing segment\n * information. These segments do not necessarily need to all be from the\n * same stream.\n *\n * @param {!Array<!shaka.media.SegmentReference>} references\n * @export\n */\n notifySegments(references) {\n if (references.length == 0) {\n return;\n }\n\n let firstReferenceStartTime = references[0].startTime;\n let lastReferenceEndTime = references[0].endTime;\n\n // Date.now() is in milliseconds, from which we compute \"now\" in seconds.\n const now = (Date.now() + this.clockOffset_) / 1000.0;\n\n for (const reference of references) {\n // Exclude segments that are in the \"future\".\n if (now < reference.startTime) {\n continue;\n }\n\n firstReferenceStartTime = Math.min(\n firstReferenceStartTime, reference.startTime);\n lastReferenceEndTime = Math.max(lastReferenceEndTime, reference.endTime);\n this.maxSegmentDuration_ = Math.max(\n this.maxSegmentDuration_, reference.endTime - reference.startTime);\n }\n this.notifyMinSegmentStartTime(firstReferenceStartTime);\n this.maxSegmentEndTime_ =\n Math.max(this.maxSegmentEndTime_, lastReferenceEndTime);\n\n if (this.presentationStartTime_ != null && this.autoCorrectDrift_ &&\n !this.startTimeLocked_) {\n // Since we have explicit segment end times, calculate a presentation\n // start based on them. This start time accounts for drift.\n this.presentationStartTime_ =\n now - this.maxSegmentEndTime_ - this.maxSegmentDuration_;\n }\n\n shaka.log.v1('notifySegments:',\n 'maxSegmentDuration=' + this.maxSegmentDuration_);\n }\n\n\n /**\n * Gives PresentationTimeline an startTime and endTime of the period.\n * This should be only set for Dash.\n *\n * @param {number} startTime\n * @param {number} endTime\n * @export\n */\n notifyPeriodDuration(startTime, endTime) {\n this.notifyMinSegmentStartTime(startTime);\n if (endTime != Infinity && !this.isLive()) {\n this.maxSegmentEndTime_ = Math.max(this.maxSegmentEndTime_, endTime);\n }\n }\n\n\n /**\n * Gets the end time of the last available segment.\n *\n * @return {?number}\n * @export\n */\n getMaxSegmentEndTime() {\n return this.maxSegmentEndTime_;\n }\n\n\n /**\n * Lock the presentation timeline's start time. After this is called, no\n * further adjustments to presentationStartTime_ will be permitted.\n *\n * This should be called after all Periods have been parsed, and all calls to\n * notifySegments() from the initial manifest parse have been made.\n *\n * Without this, we can get assertion failures in SegmentIndex for certain\n * DAI content. If DAI adds ad segments to the manifest faster than\n * real-time, adjustments to presentationStartTime_ can cause availability\n * windows to jump around on updates.\n *\n * @export\n */\n lockStartTime() {\n this.startTimeLocked_ = true;\n }\n\n\n /**\n * Returns if the presentation timeline's start time is locked.\n *\n * @return {boolean}\n * @export\n */\n isStartTimeLocked() {\n return this.startTimeLocked_;\n }\n\n\n /**\n * Sets the initial program date time.\n *\n * @param {number} initialProgramDateTime\n * @export\n */\n setInitialProgramDateTime(initialProgramDateTime) {\n this.initialProgramDateTime_ = initialProgramDateTime;\n }\n\n\n /**\n * @return {?number} The initial program date time in seconds.\n * @export\n */\n getInitialProgramDateTime() {\n return this.initialProgramDateTime_;\n }\n\n\n /**\n * Gives PresentationTimeline a Stream's minimum segment start time.\n *\n * @param {number} startTime\n * @export\n */\n notifyMinSegmentStartTime(startTime) {\n if (this.minSegmentStartTime_ == null) {\n // No data yet, and Math.min(null, startTime) is always 0. So just store\n // startTime.\n this.minSegmentStartTime_ = startTime;\n } else if (!this.isLive2VodTransition_) {\n this.minSegmentStartTime_ =\n Math.min(this.minSegmentStartTime_, startTime);\n }\n }\n\n\n /**\n * Gives PresentationTimeline a Stream's maximum segment duration so it can\n * size and position the segment availability window. This function should be\n * called once for each Stream (no more, no less), but does not have to be\n * called if notifySegments() is called instead for a particular stream.\n *\n * @param {number} maxSegmentDuration The maximum segment duration for a\n * particular stream.\n * @export\n */\n notifyMaxSegmentDuration(maxSegmentDuration) {\n this.maxSegmentDuration_ = Math.max(\n this.maxSegmentDuration_, maxSegmentDuration);\n\n shaka.log.v1('notifyNewSegmentDuration:',\n 'maxSegmentDuration=' + this.maxSegmentDuration_);\n }\n\n\n /**\n * Offsets the segment times by the given amount.\n *\n * @param {number} offset The number of seconds to offset by. A positive\n * number adjusts the segment times forward.\n * @export\n */\n offset(offset) {\n if (this.minSegmentStartTime_ != null) {\n this.minSegmentStartTime_ += offset;\n }\n if (this.maxSegmentEndTime_ != null) {\n this.maxSegmentEndTime_ += offset;\n }\n }\n\n\n /**\n * @return {boolean} True if the presentation is live; otherwise, return\n * false.\n * @export\n */\n isLive() {\n return this.duration_ == Infinity &&\n !this.static_;\n }\n\n\n /**\n * @return {boolean} True if the presentation is in progress (meaning not\n * live, but also not completely available); otherwise, return false.\n * @export\n */\n isInProgress() {\n return this.duration_ != Infinity &&\n !this.static_;\n }\n\n\n /**\n * Gets the presentation's current segment availability start time. Segments\n * ending at or before this time should be assumed to be unavailable.\n *\n * @return {number} The current segment availability start time, in seconds,\n * relative to the start of the presentation.\n * @export\n */\n getSegmentAvailabilityStart() {\n goog.asserts.assert(this.segmentAvailabilityDuration_ >= 0,\n 'The availability duration should be positive');\n\n const end = this.getSegmentAvailabilityEnd();\n const start = end - this.segmentAvailabilityDuration_;\n return Math.max(this.userSeekStart_, start);\n }\n\n\n /**\n * Sets the start time of the user-defined seek range. This is only used for\n * VOD content.\n *\n * @param {number} time\n * @export\n */\n setUserSeekStart(time) {\n this.userSeekStart_ = time;\n }\n\n\n /**\n * Gets the presentation's current segment availability end time. Segments\n * starting after this time should be assumed to be unavailable.\n *\n * @return {number} The current segment availability end time, in seconds,\n * relative to the start of the presentation. For VOD, the availability\n * end time is the content's duration. If the Player's playRangeEnd\n * configuration is used, this can override the duration.\n * @export\n */\n getSegmentAvailabilityEnd() {\n if (!this.isLive() && !this.isInProgress()) {\n // It's a static manifest (can also be a dynamic->static conversion)\n if (this.maxSegmentEndTime_) {\n // If we know segment times, use the min of that and duration.\n // Note that the playRangeEnd configuration changes this.duration_.\n // See https://github.com/shaka-project/shaka-player/issues/4026\n return Math.min(this.maxSegmentEndTime_, this.duration_);\n } else {\n // If we don't have segment times, use duration.\n return this.duration_;\n }\n }\n // Can be either live or \"in-progress recording\" (live with known duration)\n return Math.min(this.getLiveEdge_() + this.availabilityTimeOffset_,\n this.duration_);\n }\n\n\n /**\n * Gets the seek range start time, offset by the given amount. This is used\n * to ensure that we don't \"fall\" back out of the seek window while we are\n * buffering.\n *\n * @param {number} offset The offset to add to the start time for live\n * streams.\n * @return {number} The current seek start time, in seconds, relative to the\n * start of the presentation.\n * @export\n */\n getSafeSeekRangeStart(offset) {\n // The earliest known segment time, ignoring segment availability duration.\n const earliestSegmentTime =\n Math.max(this.minSegmentStartTime_, this.userSeekStart_);\n\n // For VOD, the offset and end time are ignored, and we just return the\n // earliest segment time. All segments are \"safe\" in VOD. However, we\n // should round up to the nearest millisecond to avoid issues like\n // https://github.com/shaka-project/shaka-player/issues/2831, in which we\n // tried to seek repeatedly to catch up to the seek range, and never\n // actually \"arrived\" within it. The video's currentTime is not as\n // accurate as the JS number representing the earliest segment time for\n // some content.\n if (this.segmentAvailabilityDuration_ == Infinity) {\n return Math.ceil(earliestSegmentTime * 1e3) / 1e3;\n }\n\n // AKA the live edge for live streams.\n const availabilityEnd = this.getSegmentAvailabilityEnd();\n\n // The ideal availability start, not considering known segments.\n const availabilityStart =\n availabilityEnd - this.segmentAvailabilityDuration_;\n\n // Add the offset to the availability start to ensure that we don't fall\n // outside the availability window while we buffer; we don't need to add the\n // offset to earliestSegmentTime since that won't change over time.\n // Also see: https://github.com/shaka-project/shaka-player/issues/692\n const desiredStart =\n Math.min(availabilityStart + offset, this.getSeekRangeEnd());\n return Math.max(earliestSegmentTime, desiredStart);\n }\n\n\n /**\n * Gets the seek range start time.\n *\n * @return {number}\n * @export\n */\n getSeekRangeStart() {\n return this.getSafeSeekRangeStart(/* offset= */ 0);\n }\n\n\n /**\n * Gets the seek range end.\n *\n * @return {number}\n * @export\n */\n getSeekRangeEnd() {\n const useDelay = this.isLive() || this.isInProgress();\n const delay = useDelay ? this.presentationDelay_ : 0;\n return Math.max(0, this.getSegmentAvailabilityEnd() - delay);\n }\n\n\n /**\n * True if the presentation start time is being used to calculate the live\n * edge.\n * Using the presentation start time means that the stream may be subject to\n * encoder drift. At runtime, we will avoid using the presentation start time\n * whenever possible.\n *\n * @return {boolean}\n * @export\n */\n usingPresentationStartTime() {\n // If it's VOD, IPR, or an HLS \"event\", we are not using the presentation\n // start time.\n if (this.presentationStartTime_ == null) {\n return false;\n }\n\n // If we have explicit segment times, we're not using the presentation\n // start time.\n if (this.maxSegmentEndTime_ != null && this.autoCorrectDrift_) {\n return false;\n }\n\n return true;\n }\n\n\n /**\n * @return {number} The current presentation time in seconds.\n * @private\n */\n getLiveEdge_() {\n goog.asserts.assert(this.presentationStartTime_ != null,\n 'Cannot compute timeline live edge without start time');\n // Date.now() is in milliseconds, from which we compute \"now\" in seconds.\n const now = (Date.now() + this.clockOffset_) / 1000.0;\n return Math.max(\n 0, now - this.maxSegmentDuration_ - this.presentationStartTime_);\n }\n\n /**\n * Sets the presentation's segment availability time offset. This should be\n * only set for Low Latency Dash.\n * The segments are available earlier for download than the availability start\n * time, so we can move closer to the live edge.\n *\n * @param {number} offset\n * @export\n */\n setAvailabilityTimeOffset(offset) {\n this.availabilityTimeOffset_ = offset;\n }\n\n\n /**\n * Gets the presentation's segment availability time offset. This should be\n * only configured for Low Latency Dash.\n *\n * @return {number} availabilityTimeOffset parameter\n * @export\n */\n getAvailabilityTimeOffset() {\n return this.availabilityTimeOffset_;\n }\n\n\n /**\n * Debug only: assert that the timeline parameters make sense for the type\n * of presentation (VOD, IPR, live).\n */\n assertIsValid() {\n if (goog.DEBUG) {\n if (this.isLive()) {\n // Implied by isLive(): infinite and dynamic.\n // Live streams should have a start time.\n goog.asserts.assert(this.presentationStartTime_ != null,\n 'Detected as live stream, but does not match our model of live!');\n } else if (this.isInProgress()) {\n // Implied by isInProgress(): finite and dynamic.\n // IPR streams should have a start time, and segments should not expire.\n goog.asserts.assert(this.presentationStartTime_ != null &&\n this.segmentAvailabilityDuration_ == Infinity,\n 'Detected as IPR stream, but does not match our model of IPR!');\n } else { // VOD\n // VOD segments should not expire and the presentation should be finite\n // and static.\n goog.asserts.assert(this.segmentAvailabilityDuration_ == Infinity &&\n this.duration_ != Infinity &&\n this.static_,\n 'Detected as VOD stream, but does not match our model of VOD!');\n }\n }\n }\n};\n\n\n/**\n * @typedef {{\n * start: number,\n * unscaledStart: number,\n * end: number,\n * partialSegments: number,\n * segmentPosition: number\n * }}\n *\n * @description\n * Defines a time range of a media segment. Times are in seconds.\n *\n * @property {number} start\n * The start time of the range.\n * @property {number} unscaledStart\n * The start time of the range in representation timescale units.\n * @property {number} end\n * The end time (exclusive) of the range.\n * @property {number} partialSegments\n * The number of partial segments\n * @property {number} segmentPosition\n * The segment position of the timeline entry as it appears in the manifest\n *\n * @export\n */\nshaka.media.PresentationTimeline.TimeRange;\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.media.GapJumpingController');\ngoog.provide('shaka.media.StallDetector');\ngoog.provide('shaka.media.StallDetector.Implementation');\ngoog.provide('shaka.media.StallDetector.MediaElementImplementation');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.log');\ngoog.require('shaka.media.PresentationTimeline');\ngoog.require('shaka.media.TimeRangesUtils');\ngoog.require('shaka.util.EventManager');\ngoog.require('shaka.util.FakeEvent');\ngoog.require('shaka.util.IReleasable');\ngoog.require('shaka.util.Timer');\n\n\n/**\n * GapJumpingController handles jumping gaps that appear within the content.\n * This will only jump gaps between two buffered ranges, so we should not have\n * to worry about the availability window.\n *\n * @implements {shaka.util.IReleasable}\n */\nshaka.media.GapJumpingController = class {\n /**\n * @param {!HTMLMediaElement} video\n * @param {!shaka.media.PresentationTimeline} timeline\n * @param {shaka.extern.StreamingConfiguration} config\n * @param {function(!Event)} onEvent\n * Called when an event is raised to be sent to the application.\n */\n constructor(video, timeline, config, onEvent) {\n /** @private {?function(!Event)} */\n this.onEvent_ = onEvent;\n\n /** @private {HTMLMediaElement} */\n this.video_ = video;\n\n /** @private {?shaka.media.PresentationTimeline} */\n this.timeline_ = timeline;\n\n /** @private {?shaka.extern.StreamingConfiguration} */\n this.config_ = config;\n\n /** @private {shaka.util.EventManager} */\n this.eventManager_ = new shaka.util.EventManager();\n\n /** @private {boolean} */\n this.started_ = false;\n\n /** @private {boolean} */\n this.seekingEventReceived_ = false;\n\n /** @private {number} */\n this.prevReadyState_ = video.readyState;\n\n /** @private {number} */\n this.startTime_ = 0;\n\n /** @private {number} */\n this.gapsJumped_ = 0;\n\n /** @private {number} */\n this.stallsDetected_ = 0;\n\n /**\n * The stall detector tries to keep the playhead moving forward. It is\n * managed by the gap-jumping controller to avoid conflicts. On some\n * platforms, the stall detector is not wanted, so it may be null.\n *\n * @private {shaka.media.StallDetector}\n */\n this.stallDetector_ = this.createStallDetector_();\n\n /** @private {boolean} */\n this.hadSegmentAppended_ = false;\n\n this.eventManager_.listen(video, 'waiting', () => this.onPollGapJump_());\n\n /**\n * We can't trust |readyState| or 'waiting' events on all platforms. To make\n * up for this, we poll the current time. If we think we are in a gap, jump\n * out of it.\n *\n * See: https://bit.ly/2McuXxm and https://bit.ly/2K5xmJO\n *\n * @private {?shaka.util.Timer}\n */\n this.gapJumpTimer_ = new shaka.util.Timer(() => {\n this.onPollGapJump_();\n }).tickEvery(this.config_.gapJumpTimerTime);\n }\n\n\n /** @override */\n release() {\n if (this.eventManager_) {\n this.eventManager_.release();\n this.eventManager_ = null;\n }\n\n if (this.gapJumpTimer_ != null) {\n this.gapJumpTimer_.stop();\n this.gapJumpTimer_ = null;\n }\n\n if (this.stallDetector_) {\n this.stallDetector_.release();\n this.stallDetector_ = null;\n }\n\n this.onEvent_ = null;\n this.timeline_ = null;\n this.video_ = null;\n }\n\n\n /**\n * Called when a segment is appended by StreamingEngine, but not when a clear\n * is pending. This means StreamingEngine will continue buffering forward from\n * what is buffered. So we know about any gaps before the start.\n */\n onSegmentAppended() {\n this.hadSegmentAppended_ = true;\n if (this.gapJumpTimer_) {\n this.gapJumpTimer_.tickEvery(this.config_.gapJumpTimerTime);\n }\n this.onPollGapJump_();\n }\n\n /**\n * Called when playback has started and the video element is\n * listening for seeks.\n *\n * @param {number} startTime\n */\n onStarted(startTime) {\n if (this.video_.seeking && !this.seekingEventReceived_) {\n this.seekingEventReceived_ = true;\n this.startTime_ = startTime;\n }\n if (this.gapJumpTimer_) {\n this.gapJumpTimer_.tickEvery(this.config_.gapJumpTimerTime);\n }\n this.onPollGapJump_();\n }\n\n /** Called when a seek has started. */\n onSeeking() {\n this.seekingEventReceived_ = true;\n this.hadSegmentAppended_ = false;\n if (this.gapJumpTimer_) {\n this.gapJumpTimer_.tickEvery(this.config_.gapJumpTimerTime);\n }\n this.onPollGapJump_();\n }\n\n\n /**\n * Returns the total number of playback gaps jumped.\n * @return {number}\n */\n getGapsJumped() {\n return this.gapsJumped_;\n }\n\n\n /**\n * Returns the number of playback stalls detected.\n * @return {number}\n */\n getStallsDetected() {\n return this.stallsDetected_;\n }\n\n\n /**\n * Called on a recurring timer to check for gaps in the media. This is also\n * called in a 'waiting' event.\n *\n * @private\n */\n onPollGapJump_() {\n // Don't gap jump before the video is ready to play.\n if (this.video_.readyState == 0) {\n return;\n }\n // Do not gap jump if seeking has begun, but the seeking event has not\n // yet fired for this particular seek.\n if (this.video_.seeking) {\n if (!this.seekingEventReceived_) {\n return;\n }\n } else {\n this.seekingEventReceived_ = false;\n }\n // Don't gap jump while paused, so that you don't constantly jump ahead\n // while paused on a livestream. We make an exception for time 0, since we\n // may be _required_ to seek on startup before play can begin, but only if\n // autoplay is enabled.\n if (this.video_.paused && (this.video_.currentTime != this.startTime_ ||\n (!this.video_.autoplay && this.video_.currentTime == this.startTime_))) {\n return;\n }\n\n\n // When the ready state changes, we have moved on, so we should fire the\n // large gap event if we see one.\n if (this.video_.readyState != this.prevReadyState_) {\n this.prevReadyState_ = this.video_.readyState;\n }\n\n if (this.stallDetector_ && this.stallDetector_.poll()) {\n // Some action was taken by StallDetector, so don't do anything yet.\n return;\n }\n\n\n const currentTime = this.video_.currentTime;\n const buffered = this.video_.buffered;\n const gapDetectionThreshold = this.config_.gapDetectionThreshold;\n\n const gapIndex = shaka.media.TimeRangesUtils.getGapIndex(\n buffered, currentTime, gapDetectionThreshold);\n\n // The current time is unbuffered or is too far from a gap.\n if (gapIndex == null) {\n return;\n }\n\n // If we are before the first buffered range, this could be an unbuffered\n // seek. So wait until a segment is appended so we are sure it is a gap.\n if (gapIndex == 0 && !this.hadSegmentAppended_) {\n return;\n }\n\n // StreamingEngine can buffer past the seek end, but still don't allow\n // seeking past it.\n let jumpTo = buffered.start(gapIndex);\n const gapPadding = this.config_.gapPadding;\n // Workaround for some platforms. On theses platforms video element\n // often rounds value we want to set as currentTime and we are not able\n // to jump over the gap.\n if (gapPadding) {\n jumpTo = Math.ceil((jumpTo + gapPadding) * 100) / 100;\n }\n const seekEnd = this.timeline_.getSeekRangeEnd();\n if (jumpTo >= seekEnd) {\n return;\n }\n\n const jumpSize = jumpTo - currentTime;\n\n // If we jump to exactly the gap start, we may detect a small gap due to\n // rounding errors or browser bugs. We can ignore these extremely small\n // gaps since the browser should play through them for us.\n if (jumpSize < shaka.media.GapJumpingController.BROWSER_GAP_TOLERANCE) {\n return;\n }\n\n if (gapIndex == 0) {\n shaka.log.info(\n 'Jumping forward', jumpSize,\n 'seconds because of gap before start time of', jumpTo);\n } else {\n shaka.log.info(\n 'Jumping forward', jumpSize, 'seconds because of gap starting at',\n buffered.end(gapIndex - 1), 'and ending at', jumpTo);\n }\n\n this.video_.currentTime = jumpTo;\n // This accounts for the possibility that we jump a gap at the start\n // position but we jump _into_ another gap. By setting the start\n // position to the new jumpTo we ensure that the check above will\n // pass even though the video is still paused.\n if (currentTime == this.startTime_) {\n this.startTime_ = jumpTo;\n }\n this.gapsJumped_++;\n this.onEvent_(\n new shaka.util.FakeEvent(shaka.util.FakeEvent.EventName.GapJumped));\n }\n\n /**\n * Create and configure a stall detector using the player's streaming\n * configuration settings. If the player is configured to have no stall\n * detector, this will return |null|.\n * @return {shaka.media.StallDetector}\n * @private\n */\n createStallDetector_() {\n if (!this.config_.stallEnabled) {\n return null;\n }\n goog.asserts.assert(this.video_, 'Must have video');\n\n // Cache the values from the config so that changes to the config won't\n // change the initialized behaviour.\n const threshold = this.config_.stallThreshold;\n const skip = this.config_.stallSkip;\n\n const onStall = (at, duration) => {\n goog.asserts.assert(this.video_, 'Must have video');\n shaka.log.debug(`Stall detected at ${at} for ${duration} seconds.`);\n\n if (skip) {\n shaka.log.debug(`Seeking forward ${skip} seconds to break stall.`);\n this.video_.currentTime += skip;\n } else {\n shaka.log.debug('Pausing and unpausing to break stall.');\n this.video_.pause();\n this.video_.play();\n }\n this.stallsDetected_++;\n this.onEvent_(new shaka.util.FakeEvent(\n shaka.util.FakeEvent.EventName.StallDetected));\n };\n\n // When we see a stall, we will try to \"jump-start\" playback by moving the\n // playhead forward.\n const detector = new shaka.media.StallDetector(\n new shaka.media.StallDetector.MediaElementImplementation(this.video_),\n threshold, onStall);\n\n return detector;\n }\n};\n\n\n/**\n * The limit, in seconds, for the gap size that we will assume the browser will\n * handle for us.\n * @const\n */\nshaka.media.GapJumpingController.BROWSER_GAP_TOLERANCE = 0.001;\n\n\n/**\n * Some platforms/browsers can get stuck in the middle of a buffered range (e.g.\n * when seeking in a background tab). Detect when we get stuck so that the\n * player can respond.\n *\n * @implements {shaka.util.IReleasable}\n * @final\n */\nshaka.media.StallDetector = class {\n /**\n * @param {shaka.media.StallDetector.Implementation} implementation\n * @param {number} stallThresholdSeconds\n * @param {function(number, number)} onStall\n * Callback that should be called when a stall is detected.\n */\n constructor(implementation, stallThresholdSeconds, onStall) {\n /** @private {shaka.media.StallDetector.Implementation} */\n this.implementation_ = implementation;\n /** @private {boolean} */\n this.wasMakingProgress_ = implementation.shouldBeMakingProgress();\n /** @private {number} */\n this.value_ = implementation.getPresentationSeconds();\n /** @private {number} */\n this.lastUpdateSeconds_ = implementation.getWallSeconds();\n /** @private {boolean} */\n this.didJump_ = false;\n\n /**\n * The amount of time in seconds that we must have the same value of\n * |value_| before we declare it as a stall.\n *\n * @private {number}\n */\n this.stallThresholdSeconds_ = stallThresholdSeconds;\n\n /** @private {?function(number, number)} */\n this.onStall_ = onStall;\n }\n\n /** @override */\n release() {\n // Drop external references to make things easier on the GC.\n this.implementation_ = null;\n this.onStall_ = null;\n }\n\n /**\n * Have the detector update itself and fire the \"on stall\" callback if a stall\n * was detected.\n *\n * @return {boolean} True if action was taken.\n */\n poll() {\n const impl = this.implementation_;\n\n const shouldBeMakingProgress = impl.shouldBeMakingProgress();\n const value = impl.getPresentationSeconds();\n const wallTimeSeconds = impl.getWallSeconds();\n\n const acceptUpdate = this.value_ != value ||\n this.wasMakingProgress_ != shouldBeMakingProgress;\n\n if (acceptUpdate) {\n this.lastUpdateSeconds_ = wallTimeSeconds;\n this.value_ = value;\n this.wasMakingProgress_ = shouldBeMakingProgress;\n this.didJump_ = false;\n }\n\n const stallSeconds = wallTimeSeconds - this.lastUpdateSeconds_;\n\n const triggerCallback = stallSeconds >= this.stallThresholdSeconds_ &&\n shouldBeMakingProgress && !this.didJump_;\n\n if (triggerCallback) {\n if (this.onStall_) {\n this.onStall_(this.value_, stallSeconds);\n }\n this.didJump_ = true;\n // If the onStall_ method updated the current time, update our stored\n // value so we don't think that was an update.\n this.value_ = impl.getPresentationSeconds();\n }\n\n return triggerCallback;\n }\n};\n\n/**\n * @interface\n */\nshaka.media.StallDetector.Implementation = class {\n /**\n * Check if the presentation time should be changing. This will return |true|\n * when we expect the presentation time to change.\n *\n * @return {boolean}\n */\n shouldBeMakingProgress() {}\n\n /**\n * Get the presentation time in seconds.\n *\n * @return {number}\n */\n getPresentationSeconds() {}\n\n /**\n * Get the time wall time in seconds.\n *\n * @return {number}\n */\n getWallSeconds() {}\n};\n\n\n/**\n * Some platforms/browsers can get stuck in the middle of a buffered range (e.g.\n * when seeking in a background tab). Force a seek to help get it going again.\n *\n * @implements {shaka.media.StallDetector.Implementation}\n * @final\n */\nshaka.media.StallDetector.MediaElementImplementation = class {\n /**\n * @param {!HTMLMediaElement} mediaElement\n */\n constructor(mediaElement) {\n /** @private {!HTMLMediaElement} */\n this.mediaElement_ = mediaElement;\n }\n\n /** @override */\n shouldBeMakingProgress() {\n // If we are not trying to play, the lack of change could be misidentified\n // as a stall.\n if (this.mediaElement_.paused) {\n return false;\n }\n if (this.mediaElement_.playbackRate == 0) {\n return false;\n }\n\n // If we have don't have enough content, we are not stalled, we are\n // buffering.\n if (this.mediaElement_.buffered.length == 0) {\n return false;\n }\n\n return this.hasContentFor_(this.mediaElement_.buffered,\n /* timeInSeconds= */ this.mediaElement_.currentTime);\n }\n\n /** @override */\n getPresentationSeconds() {\n return this.mediaElement_.currentTime;\n }\n\n /** @override */\n getWallSeconds() {\n return Date.now() / 1000;\n }\n\n /**\n * Check if we have buffered enough content to play at |timeInSeconds|. Ignore\n * the end of the buffered range since it may not play any more on all\n * platforms.\n *\n * @param {!TimeRanges} buffered\n * @param {number} timeInSeconds\n * @return {boolean}\n * @private\n */\n hasContentFor_(buffered, timeInSeconds) {\n const TimeRangesUtils = shaka.media.TimeRangesUtils;\n for (const {start, end} of TimeRangesUtils.getBufferedInfo(buffered)) {\n // Can be as much as 100ms before the range\n if (timeInSeconds < start - 0.1) {\n continue;\n }\n // Must be at least 500ms inside the range\n if (timeInSeconds > end - 0.5) {\n continue;\n }\n\n return true;\n }\n\n return false;\n }\n};\n\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.MediaReadyState');\n\ngoog.require('shaka.util.EventManager');\ngoog.require('shaka.util.Lazy');\n\n\nshaka.util.MediaReadyState = class {\n /**\n * @param {!HTMLMediaElement} mediaElement\n * @param {number} readyState\n * @param {shaka.util.EventManager} eventManager\n * @param {function()} callback\n */\n static waitForReadyState(mediaElement, readyState, eventManager, callback) {\n if (readyState == HTMLMediaElement.HAVE_NOTHING ||\n mediaElement.readyState >= readyState) {\n callback();\n } else {\n const MediaReadyState = shaka.util.MediaReadyState;\n const eventName =\n MediaReadyState.READY_STATES_TO_EVENT_NAMES_.value().get(readyState);\n eventManager.listenOnce(mediaElement, eventName, callback);\n }\n }\n};\n\n/**\n * @const {!shaka.util.Lazy.<!Map<number, string>>}\n * @private\n */\nshaka.util.MediaReadyState.READY_STATES_TO_EVENT_NAMES_ =\n new shaka.util.Lazy(() => new Map([\n [HTMLMediaElement.HAVE_METADATA, 'loadedmetadata'],\n [HTMLMediaElement.HAVE_CURRENT_DATA, 'loadeddata'],\n [HTMLMediaElement.HAVE_FUTURE_DATA, 'canplay'],\n [HTMLMediaElement.HAVE_ENOUGH_DATA, 'canplaythrough'],\n ]));\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.media.VideoWrapper');\ngoog.provide('shaka.media.VideoWrapper.PlayheadMover');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.log');\ngoog.require('shaka.util.EventManager');\ngoog.require('shaka.util.IReleasable');\ngoog.require('shaka.util.MediaReadyState');\ngoog.require('shaka.util.Timer');\n\n\n/**\n * Creates a new VideoWrapper that manages setting current time and playback\n * rate. This handles seeks before content is loaded and ensuring the video\n * time is set properly. This doesn't handle repositioning within the\n * presentation window.\n *\n * @implements {shaka.util.IReleasable}\n */\nshaka.media.VideoWrapper = class {\n /**\n * @param {!HTMLMediaElement} video\n * @param {function()} onSeek Called when the video seeks.\n * @param {function(number)} onStarted Called when the video has started.\n * @param {function():number} getStartTime Called to get the time to start at.\n */\n constructor(video, onSeek, onStarted, getStartTime) {\n /** @private {HTMLMediaElement} */\n this.video_ = video;\n\n /** @private {function()} */\n this.onSeek_ = onSeek;\n\n /** @private {function(number)} */\n this.onStarted_ = onStarted;\n\n /** @private {?number} */\n this.startTime_ = null;\n\n /** @private {function():number} */\n this.getStartTime_ = () => {\n if (this.startTime_ == null) {\n this.startTime_ = getStartTime();\n }\n return this.startTime_;\n };\n\n /** @private {boolean} */\n this.started_ = false;\n\n /** @private {shaka.util.EventManager} */\n this.eventManager_ = new shaka.util.EventManager();\n\n /** @private {shaka.media.VideoWrapper.PlayheadMover} */\n this.mover_ = new shaka.media.VideoWrapper.PlayheadMover(\n /* mediaElement= */ video,\n /* maxAttempts= */ 10);\n\n // Before we can set the start time, we must check if the video element is\n // ready. If the video element is not ready, we cannot set the time. To work\n // around this, we will wait for the \"loadedmetadata\" event which tells us\n // that the media element is now ready.\n shaka.util.MediaReadyState.waitForReadyState(this.video_,\n HTMLMediaElement.HAVE_METADATA,\n this.eventManager_,\n () => {\n this.setStartTime_(this.getStartTime_());\n });\n }\n\n\n /** @override */\n release() {\n if (this.eventManager_) {\n this.eventManager_.release();\n this.eventManager_ = null;\n }\n\n if (this.mover_ != null) {\n this.mover_.release();\n this.mover_ = null;\n }\n\n this.onSeek_ = () => {};\n this.video_ = null;\n }\n\n\n /**\n * Gets the video's current (logical) position.\n *\n * @return {number}\n */\n getTime() {\n return this.started_ ? this.video_.currentTime : this.getStartTime_();\n }\n\n\n /**\n * Sets the current time of the video.\n *\n * @param {number} time\n */\n setTime(time) {\n if (this.video_.readyState > 0) {\n this.mover_.moveTo(time);\n } else {\n shaka.util.MediaReadyState.waitForReadyState(this.video_,\n HTMLMediaElement.HAVE_METADATA,\n this.eventManager_,\n () => {\n this.setStartTime_(this.getStartTime_());\n });\n }\n }\n\n\n /**\n * Set the start time for the content. The given start time will be ignored if\n * the content does not start at 0.\n *\n * @param {number} startTime\n * @private\n */\n setStartTime_(startTime) {\n // If we start close enough to our intended start time, then we won't do\n // anything special.\n if (Math.abs(this.video_.currentTime - startTime) < 0.001) {\n this.startListeningToSeeks_();\n return;\n }\n\n // We will need to delay adding our normal seeking listener until we have\n // seen the first seek event. We will force the first seek event later in\n // this method.\n this.eventManager_.listenOnce(this.video_, 'seeking', () => {\n this.startListeningToSeeks_();\n });\n\n // If the currentTime != 0, it indicates that the user has seeked after\n // calling |Player.load|, meaning that |currentTime| is more meaningful than\n // |startTime|.\n //\n // Seeking to the current time is a work around for Issue 1298 and 4888.\n // If we don't do this, the video may get stuck and not play.\n //\n // TODO: Need further investigation why it happens. Before and after\n // setting the current time, video.readyState is 1, video.paused is true,\n // and video.buffered's TimeRanges length is 0.\n // See: https://github.com/shaka-project/shaka-player/issues/1298\n this.mover_.moveTo(\n (!this.video_.currentTime || this.video_.currentTime == 0) ?\n startTime :\n this.video_.currentTime);\n }\n\n\n /**\n * Add the listener for seek-events. This will call the externally-provided\n * |onSeek| callback whenever the media element seeks.\n *\n * @private\n */\n startListeningToSeeks_() {\n goog.asserts.assert(\n this.video_.readyState > 0,\n 'The media element should be ready before we listen for seeking.');\n\n // Now that any startup seeking is complete, we can trust the video element\n // for currentTime.\n this.started_ = true;\n\n this.eventManager_.listen(this.video_, 'seeking', () => this.onSeek_());\n this.onStarted_(this.video_.currentTime);\n }\n};\n\n/**\n * A class used to move the playhead away from its current time. Sometimes,\n * legacy Edge ignores re-seeks. After changing the current time, check every\n * 100ms, retrying if the change was not accepted.\n *\n * Delay stats over 100 runs of a re-seeking integration test:\n * Edge - 0ms - 2%\n * Edge - 100ms - 40%\n * Edge - 200ms - 32%\n * Edge - 300ms - 24%\n * Edge - 400ms - 2%\n * Chrome - 0ms - 100%\n *\n * Unfortunately, legacy Edge is not receiving updates anymore, but it still\n * must be supported as it is used for web browsers on XBox.\n *\n * @implements {shaka.util.IReleasable}\n * @final\n */\nshaka.media.VideoWrapper.PlayheadMover = class {\n /**\n * @param {!HTMLMediaElement} mediaElement\n * The media element that the mover can manipulate.\n *\n * @param {number} maxAttempts\n * To prevent us from infinitely trying to change the current time, the\n * mover accepts a max attempts value. At most, the mover will check if the\n * video moved |maxAttempts| times. If this is zero of negative, no\n * attempts will be made.\n */\n constructor(mediaElement, maxAttempts) {\n /** @private {HTMLMediaElement} */\n this.mediaElement_ = mediaElement;\n\n /** @private {number} */\n this.maxAttempts_ = maxAttempts;\n\n /** @private {number} */\n this.remainingAttempts_ = 0;\n\n /** @private {number} */\n this.originTime_ = 0;\n\n /** @private {number} */\n this.targetTime_ = 0;\n\n /** @private {shaka.util.Timer} */\n this.timer_ = new shaka.util.Timer(() => this.onTick_());\n }\n\n /** @override */\n release() {\n if (this.timer_) {\n this.timer_.stop();\n this.timer_ = null;\n }\n\n this.mediaElement_ = null;\n }\n\n /**\n * Try forcing the media element to move to |timeInSeconds|. If a previous\n * call to |moveTo| is still in progress, this will override it.\n *\n * @param {number} timeInSeconds\n */\n moveTo(timeInSeconds) {\n this.originTime_ = this.mediaElement_.currentTime;\n this.targetTime_ = timeInSeconds;\n\n this.remainingAttempts_ = this.maxAttempts_;\n\n // Set the time and then start the timer. The timer will check if the set\n // was successful, and retry if not.\n this.mediaElement_.currentTime = timeInSeconds;\n this.timer_.tickEvery(/* seconds= */ 0.1);\n }\n\n /**\n * @private\n */\n onTick_() {\n // Sigh... We ran out of retries...\n if (this.remainingAttempts_ <= 0) {\n shaka.log.warning([\n 'Failed to move playhead from', this.originTime_,\n 'to', this.targetTime_,\n ].join(' '));\n\n this.timer_.stop();\n return;\n }\n\n // Yay! We were successful.\n if (this.mediaElement_.currentTime != this.originTime_ ||\n this.mediaElement_.currentTime === this.targetTime_) {\n this.timer_.stop();\n return;\n }\n\n // Sigh... Try again...\n this.mediaElement_.currentTime = this.targetTime_;\n this.remainingAttempts_--;\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.media.MediaSourcePlayhead');\ngoog.provide('shaka.media.Playhead');\ngoog.provide('shaka.media.SrcEqualsPlayhead');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.log');\ngoog.require('shaka.media.Capabilities');\ngoog.require('shaka.media.GapJumpingController');\ngoog.require('shaka.media.TimeRangesUtils');\ngoog.require('shaka.media.VideoWrapper');\ngoog.require('shaka.util.EventManager');\ngoog.require('shaka.util.IReleasable');\ngoog.require('shaka.util.MediaReadyState');\ngoog.require('shaka.util.Platform');\ngoog.require('shaka.util.Timer');\ngoog.requireType('shaka.media.PresentationTimeline');\n\n\n/**\n * Creates a Playhead, which manages the video's current time.\n *\n * The Playhead provides mechanisms for setting the presentation's start time,\n * restricting seeking to valid time ranges, and stopping playback for startup\n * and re-buffering.\n *\n * @extends {shaka.util.IReleasable}\n * @interface\n */\nshaka.media.Playhead = class {\n /**\n * Called when the Player is ready to begin playback. Anything that depends\n * on setStartTime() should be done here, not in the constructor.\n *\n * @see https://github.com/shaka-project/shaka-player/issues/4244\n */\n ready() {}\n\n /**\n * Set the start time. If the content has already started playback, this will\n * be ignored.\n *\n * @param {number} startTime\n */\n setStartTime(startTime) {}\n\n /**\n * Get the number of playback stalls detected by the StallDetector.\n *\n * @return {number}\n */\n getStallsDetected() {}\n\n /**\n * Get the number of playback gaps jumped by the GapJumpingController.\n *\n * @return {number}\n */\n getGapsJumped() {}\n\n /**\n * Get the current playhead position. The position will be restricted to valid\n * time ranges.\n *\n * @return {number}\n */\n getTime() {}\n\n /**\n * Notify the playhead that the buffered ranges have changed.\n */\n notifyOfBufferingChange() {}\n};\n\n\n/**\n * A playhead implementation that only relies on the media element.\n *\n * @implements {shaka.media.Playhead}\n * @final\n */\nshaka.media.SrcEqualsPlayhead = class {\n /**\n * @param {!HTMLMediaElement} mediaElement\n */\n constructor(mediaElement) {\n /** @private {HTMLMediaElement} */\n this.mediaElement_ = mediaElement;\n /** @private {boolean} */\n this.started_ = false;\n /** @private {?number} */\n this.startTime_ = null;\n\n /** @private {shaka.util.EventManager} */\n this.eventManager_ = new shaka.util.EventManager();\n }\n\n /** @override */\n ready() {\n goog.asserts.assert(\n this.mediaElement_ != null,\n 'Playhead should not be released before calling ready()',\n );\n\n // We listen for the loaded-data-event so that we know when we can\n // interact with |currentTime|.\n const onLoaded = () => {\n if (this.startTime_ == null ||\n (this.startTime_ == 0 && this.mediaElement_.duration != Infinity)) {\n this.started_ = true;\n } else {\n const currentTime = this.mediaElement_.currentTime;\n let newTime = this.startTime_;\n // Using the currentTime allows using a negative number in Live HLS\n if (this.startTime_ < 0) {\n newTime = Math.max(0, currentTime + this.startTime_);\n }\n if (currentTime != newTime) {\n // Startup is complete only when the video element acknowledges the\n // seek.\n this.eventManager_.listenOnce(this.mediaElement_, 'seeking', () => {\n this.started_ = true;\n });\n this.mediaElement_.currentTime = newTime;\n } else {\n this.started_ = true;\n }\n }\n };\n\n shaka.util.MediaReadyState.waitForReadyState(this.mediaElement_,\n HTMLMediaElement.HAVE_CURRENT_DATA,\n this.eventManager_, () => {\n onLoaded();\n });\n }\n\n /** @override */\n release() {\n if (this.eventManager_) {\n this.eventManager_.release();\n this.eventManager_ = null;\n }\n\n this.mediaElement_ = null;\n }\n\n /** @override */\n setStartTime(startTime) {\n // If we have already started playback, ignore updates to the start time.\n // This is just to make things consistent.\n this.startTime_ = this.started_ ? this.startTime_ : startTime;\n }\n\n /** @override */\n getTime() {\n // If we have not started playback yet, return the start time. However once\n // we start playback we assume that we can always return the current time.\n const time = this.started_ ?\n this.mediaElement_.currentTime :\n this.startTime_;\n\n // In the case that we have not started playback, but the start time was\n // never set, we don't know what the start time should be. To ensure we\n // always return a number, we will default back to 0.\n return time || 0;\n }\n\n /** @override */\n getStallsDetected() {\n return 0;\n }\n\n /** @override */\n getGapsJumped() {\n return 0;\n }\n\n /** @override */\n notifyOfBufferingChange() {}\n};\n\n\n/**\n * A playhead implementation that relies on the media element and a manifest.\n * When provided with a manifest, we can provide more accurate control than\n * the SrcEqualsPlayhead.\n *\n * TODO: Clean up and simplify Playhead. There are too many layers of, methods\n * for, and conditions on timestamp adjustment.\n *\n * @implements {shaka.media.Playhead}\n * @final\n */\nshaka.media.MediaSourcePlayhead = class {\n /**\n * @param {!HTMLMediaElement} mediaElement\n * @param {shaka.extern.Manifest} manifest\n * @param {shaka.extern.StreamingConfiguration} config\n * @param {?number} startTime\n * The playhead's initial position in seconds. If null, defaults to the\n * start of the presentation for VOD and the live-edge for live.\n * @param {function()} onSeek\n * Called when the user agent seeks to a time within the presentation\n * timeline.\n * @param {function(!Event)} onEvent\n * Called when an event is raised to be sent to the application.\n */\n constructor(mediaElement, manifest, config, startTime, onSeek, onEvent) {\n /**\n * The seek range must be at least this number of seconds long. If it is\n * smaller than this, change it to be this big so we don't repeatedly seek\n * to keep within a zero-width window.\n *\n * This is 3s long, to account for the weaker hardware on platforms like\n * Chromecast.\n *\n * @private {number}\n */\n this.minSeekRange_ = 3.0;\n\n /** @private {HTMLMediaElement} */\n this.mediaElement_ = mediaElement;\n\n /** @private {shaka.media.PresentationTimeline} */\n this.timeline_ = manifest.presentationTimeline;\n\n /** @private {?shaka.extern.StreamingConfiguration} */\n this.config_ = config;\n\n /** @private {function()} */\n this.onSeek_ = onSeek;\n\n /** @private {?number} */\n this.lastCorrectiveSeek_ = null;\n\n /** @private {shaka.media.GapJumpingController} */\n this.gapController_ = new shaka.media.GapJumpingController(\n mediaElement,\n manifest.presentationTimeline,\n config,\n onEvent);\n\n /** @private {shaka.media.VideoWrapper} */\n this.videoWrapper_ = new shaka.media.VideoWrapper(\n mediaElement,\n () => this.onSeeking_(),\n (realStartTime) => this.onStarted_(realStartTime),\n () => this.getStartTime_(startTime));\n\n /** @type {shaka.util.Timer} */\n this.checkWindowTimer_ = new shaka.util.Timer(() => {\n this.onPollWindow_();\n });\n }\n\n /** @override */\n ready() {\n this.checkWindowTimer_.tickEvery(/* seconds= */ 0.25);\n }\n\n /** @override */\n release() {\n if (this.videoWrapper_) {\n this.videoWrapper_.release();\n this.videoWrapper_ = null;\n }\n\n if (this.gapController_) {\n this.gapController_.release();\n this.gapController_= null;\n }\n\n if (this.checkWindowTimer_) {\n this.checkWindowTimer_.stop();\n this.checkWindowTimer_ = null;\n }\n\n this.config_ = null;\n this.timeline_ = null;\n this.videoWrapper_ = null;\n this.mediaElement_ = null;\n\n this.onSeek_ = () => {};\n }\n\n /** @override */\n setStartTime(startTime) {\n this.videoWrapper_.setTime(startTime);\n }\n\n /** @override */\n getTime() {\n const time = this.videoWrapper_.getTime();\n\n // Although we restrict the video's currentTime elsewhere, clamp it here to\n // ensure timing issues don't cause us to return a time outside the segment\n // availability window. E.g., the user agent seeks and calls this function\n // before we receive the 'seeking' event.\n //\n // We don't buffer when the livestream video is paused and the playhead time\n // is out of the seek range; thus, we do not clamp the current time when the\n // video is paused.\n // https://github.com/shaka-project/shaka-player/issues/1121\n if (this.mediaElement_.readyState > 0 && !this.mediaElement_.paused) {\n return this.clampTime_(time);\n }\n\n return time;\n }\n\n /** @override */\n getStallsDetected() {\n return this.gapController_.getStallsDetected();\n }\n\n /** @override */\n getGapsJumped() {\n return this.gapController_.getGapsJumped();\n }\n\n /**\n * Gets the playhead's initial position in seconds.\n *\n * @param {?number} startTime\n * @return {number}\n * @private\n */\n getStartTime_(startTime) {\n if (startTime == null) {\n if (this.timeline_.getDuration() < Infinity) {\n // If the presentation is VOD, or if the presentation is live but has\n // finished broadcasting, then start from the beginning.\n startTime = this.timeline_.getSeekRangeStart();\n } else {\n // Otherwise, start near the live-edge.\n startTime = this.timeline_.getSeekRangeEnd();\n }\n } else if (startTime < 0) {\n // For live streams, if the startTime is negative, start from a certain\n // offset time from the live edge. If the offset from the live edge is\n // not available, start from the current available segment start point\n // instead, handled by clampTime_().\n startTime = this.timeline_.getSeekRangeEnd() + startTime;\n }\n\n return this.clampSeekToDuration_(this.clampTime_(startTime));\n }\n\n /** @override */\n notifyOfBufferingChange() {\n this.gapController_.onSegmentAppended();\n }\n\n /**\n * Called on a recurring timer to keep the playhead from falling outside the\n * availability window.\n *\n * @private\n */\n onPollWindow_() {\n // Don't catch up to the seek range when we are paused or empty.\n // The definition of \"seeking\" says that we are seeking until the buffered\n // data intersects with the playhead. If we fall outside of the seek range,\n // it doesn't matter if we are in a \"seeking\" state. We can and should go\n // ahead and catch up while seeking.\n if (this.mediaElement_.readyState == 0 || this.mediaElement_.paused) {\n return;\n }\n\n const currentTime = this.videoWrapper_.getTime();\n let seekStart = this.timeline_.getSeekRangeStart();\n const seekEnd = this.timeline_.getSeekRangeEnd();\n\n if (seekEnd - seekStart < this.minSeekRange_) {\n seekStart = seekEnd - this.minSeekRange_;\n }\n\n if (currentTime < seekStart) {\n // The seek range has moved past the playhead. Move ahead to catch up.\n const targetTime = this.reposition_(currentTime);\n shaka.log.info('Jumping forward ' + (targetTime - currentTime) +\n ' seconds to catch up with the seek range.');\n this.mediaElement_.currentTime = targetTime;\n }\n }\n\n /**\n * Called when the video element has started up and is listening for new seeks\n *\n * @param {number} startTime\n * @private\n */\n onStarted_(startTime) {\n this.gapController_.onStarted(startTime);\n }\n\n /**\n * Handles when a seek happens on the video.\n *\n * @private\n */\n onSeeking_() {\n this.gapController_.onSeeking();\n const currentTime = this.videoWrapper_.getTime();\n const targetTime = this.reposition_(currentTime);\n\n const gapLimit = shaka.media.GapJumpingController.BROWSER_GAP_TOLERANCE;\n\n // We don't need to perform corrective seeks for the playhead range when\n // MediaSource's setLiveSeekableRange() can handle it for us.\n const mightNeedCorrectiveSeek =\n !shaka.media.Capabilities.isInfiniteLiveStreamDurationSupported();\n\n if (mightNeedCorrectiveSeek &&\n Math.abs(targetTime - currentTime) > gapLimit) {\n let canCorrectiveSeek = false;\n if (shaka.util.Platform.isSeekingSlow()) {\n // You can only seek like this every so often. This is to prevent an\n // infinite loop on systems where changing currentTime takes a\n // significant amount of time (e.g. Chromecast).\n const time = Date.now() / 1000;\n const seekDelay = shaka.util.Platform.isFuchsiaCastDevice() ? 3 : 1;\n if (!this.lastCorrectiveSeek_ ||\n this.lastCorrectiveSeek_ < time - seekDelay) {\n this.lastCorrectiveSeek_ = time;\n canCorrectiveSeek = true;\n }\n } else {\n canCorrectiveSeek = true;\n }\n if (canCorrectiveSeek) {\n this.videoWrapper_.setTime(targetTime);\n return;\n }\n }\n\n shaka.log.v1('Seek to ' + currentTime);\n this.onSeek_();\n }\n\n /**\n * Clamp seek times and playback start times so that we never seek to the\n * presentation duration. Seeking to or starting at duration does not work\n * consistently across browsers.\n *\n * @see https://github.com/shaka-project/shaka-player/issues/979\n * @param {number} time\n * @return {number} The adjusted seek time.\n * @private\n */\n clampSeekToDuration_(time) {\n const duration = this.timeline_.getDuration();\n if (time >= duration) {\n goog.asserts.assert(this.config_.durationBackoff >= 0,\n 'Duration backoff must be non-negative!');\n return duration - this.config_.durationBackoff;\n }\n return time;\n }\n\n /**\n * Computes a new playhead position that's within the presentation timeline.\n *\n * @param {number} currentTime\n * @return {number} The time to reposition the playhead to.\n * @private\n */\n reposition_(currentTime) {\n goog.asserts.assert(\n this.config_,\n 'Cannot reposition playhead when it has been destroyed');\n\n /** @type {function(number)} */\n const isBuffered = (playheadTime) => shaka.media.TimeRangesUtils.isBuffered(\n this.mediaElement_.buffered, playheadTime);\n\n const rebufferingGoal = this.config_.rebufferingGoal;\n const safeSeekOffset = this.config_.safeSeekOffset;\n\n let start = this.timeline_.getSeekRangeStart();\n const end = this.timeline_.getSeekRangeEnd();\n const duration = this.timeline_.getDuration();\n\n if (end - start < this.minSeekRange_) {\n start = end - this.minSeekRange_;\n }\n\n // With live content, the beginning of the availability window is moving\n // forward. This means we cannot seek to it since we will \"fall\" outside\n // the window while we buffer. So we define a \"safe\" region that is far\n // enough away. For VOD, |safe == start|.\n const safe = this.timeline_.getSafeSeekRangeStart(rebufferingGoal);\n\n // These are the times to seek to rather than the exact destinations. When\n // we seek, we will get another event (after a slight delay) and these steps\n // will run again. So if we seeked directly to |start|, |start| would move\n // on the next call and we would loop forever.\n const seekStart = this.timeline_.getSafeSeekRangeStart(safeSeekOffset);\n const seekSafe = this.timeline_.getSafeSeekRangeStart(\n rebufferingGoal + safeSeekOffset);\n\n if (currentTime >= duration) {\n shaka.log.v1('Playhead past duration.');\n return this.clampSeekToDuration_(currentTime);\n }\n\n if (currentTime > end) {\n shaka.log.v1('Playhead past end.');\n // We remove the safeSeekEndOffset of the seek end to avoid the player\n // to be block at the edge in a live stream\n return end - this.config_.safeSeekEndOffset;\n }\n\n if (currentTime < start) {\n if (isBuffered(seekStart)) {\n shaka.log.v1('Playhead before start & start is buffered');\n return seekStart;\n } else {\n shaka.log.v1('Playhead before start & start is unbuffered');\n return seekSafe;\n }\n }\n\n if (currentTime >= safe || isBuffered(currentTime)) {\n shaka.log.v1('Playhead in safe region or in buffered region.');\n return currentTime;\n } else {\n shaka.log.v1('Playhead outside safe region & in unbuffered region.');\n return seekSafe;\n }\n }\n\n /**\n * Clamps the given time to the seek range.\n *\n * @param {number} time The time in seconds.\n * @return {number} The clamped time in seconds.\n * @private\n */\n clampTime_(time) {\n const start = this.timeline_.getSeekRangeStart();\n if (time < start) {\n return start;\n }\n\n const end = this.timeline_.getSeekRangeEnd();\n if (time > end) {\n return end;\n }\n\n return time;\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.media.PlayRateController');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.log');\ngoog.require('shaka.util.IReleasable');\ngoog.require('shaka.util.Timer');\n\n/**\n * The play rate controller controls the playback rate on the media element.\n * This provides some missing functionality (e.g. negative playback rate). If\n * the playback rate on the media element can change outside of the controller,\n * the playback controller will need to be updated to stay in-sync.\n *\n * @implements {shaka.util.IReleasable}\n * @final\n */\nshaka.media.PlayRateController = class {\n /**\n * @param {shaka.media.PlayRateController.Harness} harness\n */\n constructor(harness) {\n /** @private {?shaka.media.PlayRateController.Harness} */\n this.harness_ = harness;\n\n /** @private {boolean} */\n this.isBuffering_ = false;\n\n /** @private {number} */\n this.rate_ = this.harness_.getRate();\n\n /** @private {number} */\n this.pollRate_ = 0.25;\n\n /** @private {shaka.util.Timer} */\n this.timer_ = new shaka.util.Timer(() => {\n this.harness_.movePlayhead(this.rate_ * this.pollRate_);\n });\n }\n\n /** @override */\n release() {\n this.set(this.getDefaultRate());\n if (this.timer_) {\n this.timer_.stop();\n this.timer_ = null;\n }\n\n this.harness_ = null;\n }\n\n /**\n * Sets the buffering flag, which controls the effective playback rate.\n *\n * @param {boolean} isBuffering If true, forces playback rate to 0 internally.\n */\n setBuffering(isBuffering) {\n this.isBuffering_ = isBuffering;\n this.apply_();\n }\n\n /**\n * Set the playback rate. This rate will only be used as provided when the\n * player is not buffering. You should never set the rate to 0.\n *\n * @param {number} rate\n */\n set(rate) {\n goog.asserts.assert(rate != 0, 'Should never set rate of 0 explicitly!');\n this.rate_ = rate;\n this.apply_();\n }\n\n /**\n * Get the real rate of the playback. This means that if we are using trick\n * play, this will report the trick play rate. If playback is occurring as\n * normal, this will report 1.\n *\n * @return {number}\n */\n getRealRate() {\n return this.rate_;\n }\n\n /**\n * Get the default play rate of the playback.\n *\n * @return {number}\n */\n getDefaultRate() {\n return this.harness_.getDefaultRate();\n }\n\n /**\n * Reapply the effects of |this.rate_| and |this.active_| to the media\n * element. This will only update the rate via the harness if the desired rate\n * has changed.\n *\n * @private\n */\n apply_() {\n // Always stop the timer. We may not start it again.\n this.timer_.stop();\n\n /** @type {number} */\n const rate = this.calculateCurrentRate_();\n\n shaka.log.v1('Changing effective playback rate to', rate);\n\n if (rate >= 0) {\n try {\n this.applyRate_(rate);\n return;\n } catch (e) {\n // Fall through to the next clause.\n //\n // Fast forward is accomplished through setting video.playbackRate.\n // If the play rate value is not supported by the browser (too big),\n // the browsers will throw.\n // Use this as a cue to fall back to fast forward through repeated\n // seeking, which is what we do for rewind as well.\n }\n }\n\n // When moving backwards or forwards in large steps,\n // set the playback rate to 0 so that we can manually\n // seek backwards with out fighting the playhead.\n this.timer_.tickEvery(this.pollRate_);\n this.applyRate_(0);\n }\n\n /**\n * Calculate the rate that the controller wants the media element to have\n * based on the current state of the controller.\n *\n * @return {number}\n * @private\n */\n calculateCurrentRate_() {\n return this.isBuffering_ ? 0 : this.rate_;\n }\n\n /**\n * If the new rate is different than the media element's playback rate, this\n * will change the playback rate. If the rate does not need to change, it will\n * not be set. This will avoid unnecessary ratechange events.\n *\n * @param {number} newRate\n * @return {boolean}\n * @private\n */\n applyRate_(newRate) {\n const oldRate = this.harness_.getRate();\n\n if (oldRate != newRate) {\n this.harness_.setRate(newRate);\n }\n\n return oldRate != newRate;\n }\n};\n\n\n/**\n * @typedef {{\n * getRate: function():number,\n * getDefaultRate: function():number,\n * setRate: function(number),\n * movePlayhead: function(number)\n * }}\n *\n * @description\n * A layer of abstraction between the controller and what it is controlling.\n * In tests this will be implemented with spies. In production this will be\n * implemented using a media element.\n *\n * @property {function():number} getRate\n * Get the current playback rate being seen by the user.\n *\n * @property {function():number} getDefaultRate\n * Get the default playback rate that the user should see.\n *\n * @property {function(number)} setRate\n * Set the playback rate that the user should see.\n *\n * @property {function(number)} movePlayhead\n * Move the playhead N seconds. If N is positive, the playhead will move\n * forward abs(N) seconds. If N is negative, the playhead will move backwards\n * abs(N) seconds.\n */\nshaka.media.PlayRateController.Harness;\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.media.IPlayheadObserver');\ngoog.provide('shaka.media.PlayheadObserverManager');\n\ngoog.require('shaka.util.EventManager');\ngoog.require('shaka.util.IReleasable');\ngoog.require('shaka.util.Timer');\n\n\n/**\n * A playhead observer is a system that watches for meaningful changes in state\n * that are dependent on playhead information. The observer is responsible for\n * managing its own listeners.\n *\n * @extends {shaka.util.IReleasable}\n * @interface\n */\nshaka.media.IPlayheadObserver = class {\n /**\n * Check again (using an update playhead summary) if an event should be fired.\n * If an event should be fired, fire it.\n *\n * @param {number} positionInSeconds\n * @param {boolean} wasSeeking\n */\n poll(positionInSeconds, wasSeeking) {}\n};\n\n\n/**\n * The playhead observer manager is responsible for owning playhead observer\n * instances and polling them when needed. Destroying the manager will destroy\n * all observers managed by the manager.\n *\n * @implements {shaka.util.IReleasable}\n * @final\n */\nshaka.media.PlayheadObserverManager = class {\n /**\n * @param {!HTMLMediaElement} mediaElement\n */\n constructor(mediaElement) {\n /** @private {HTMLMediaElement} */\n this.mediaElement_ = mediaElement;\n\n /** @private {shaka.util.EventManager} */\n this.eventManager_ = new shaka.util.EventManager();\n\n /**\n * The set of all observers that this manager is responsible for updating.\n * We are using a set to ensure that we don't double update an observer if\n * it is accidentally added twice.\n *\n * @private {!Set<shaka.media.IPlayheadObserver>}\n */\n this.observers_ = new Set();\n\n /**\n * To fire events semi-accurately, poll the observers 4 times a second. This\n * should be frequent enough to trigger an event close enough to its actual\n * occurrence without the user noticing a delay.\n *\n * @private {shaka.util.Timer}\n */\n this.pollingLoop_ = new shaka.util.Timer(() => {\n this.pollAllObservers_(/* seeking= */ false);\n }).tickNow();\n\n if (!mediaElement.paused) {\n this.pollingLoop_.tickEvery(/* seconds= */ 0.25);\n }\n\n this.eventManager_.listen(mediaElement, 'playing', () => {\n this.pollingLoop_.tickNow().tickEvery(/* seconds= */ 0.25);\n });\n this.eventManager_.listen(mediaElement, 'pause', () => {\n this.pollingLoop_.stop();\n });\n }\n\n /** @override */\n release() {\n if (this.eventManager_) {\n this.eventManager_.release();\n this.eventManager_ = null;\n }\n\n // We need to stop the loop or else we may try to use a released resource.\n this.pollingLoop_.stop();\n\n for (const observer of this.observers_) {\n observer.release();\n }\n\n this.observers_.clear();\n }\n\n /**\n * Have the playhead observer manager manage a new observer. This will ensure\n * that observers are only tracked once within the manager. After this call,\n * the manager will be responsible for the life cycle of |observer|.\n *\n * @param {!shaka.media.IPlayheadObserver} observer\n */\n manage(observer) {\n this.observers_.add(observer);\n }\n\n /**\n * Notify all the observers that we just seeked.\n */\n notifyOfSeek() {\n this.pollAllObservers_(/* seeking= */ true);\n }\n\n /**\n * @param {boolean} seeking\n * @private\n */\n pollAllObservers_(seeking) {\n const currentTime = this.mediaElement_.currentTime;\n for (const observer of this.observers_) {\n observer.poll(currentTime, seeking);\n }\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.media.QualityObserver');\n\ngoog.require('shaka.media.IPlayheadObserver');\ngoog.require('shaka.log');\ngoog.require('shaka.util.ArrayUtils');\ngoog.require('shaka.util.FakeEvent');\ngoog.require('shaka.util.FakeEventTarget');\ngoog.require('shaka.util.ManifestParserUtils');\n\n/**\n * Monitors the quality of content being appended to the source buffers and\n * fires 'qualitychange' events when the media quality at the playhead changes.\n *\n * @implements {shaka.media.IPlayheadObserver}\n * @final\n */\nshaka.media.QualityObserver = class extends shaka.util.FakeEventTarget {\n /**\n * Creates a new QualityObserver.\n *\n * @param {!function():!shaka.extern.BufferedInfo} getBufferedInfo\n * Buffered info is needed to purge QualityChanges that are no\n * longer relevant.\n */\n constructor(getBufferedInfo) {\n super();\n\n /**\n * @private {!Map<string, !shaka.media.QualityObserver.ContentTypeState>}\n */\n this.contentTypeStates_ = new Map();\n\n /** @private function():!shaka.extern.BufferedInfo */\n this.getBufferedInfo_ = getBufferedInfo;\n }\n\n /** @override */\n release() {\n this.contentTypeStates_.clear();\n super.release();\n }\n\n /**\n * Get the ContentTypeState for a contentType, creating a new\n * one if necessary.\n *\n * @param {!string} contentType\n * The contend type e.g. \"video\" or \"audio\".\n * @return {!shaka.media.QualityObserver.ContentTypeState}\n * @private\n */\n getContentTypeState_(contentType) {\n let contentTypeState = this.contentTypeStates_.get(contentType);\n if (!contentTypeState) {\n contentTypeState = {\n qualityChangePositions: [],\n currentQuality: null,\n contentType: contentType,\n };\n this.contentTypeStates_.set(contentType, contentTypeState);\n }\n return contentTypeState;\n }\n\n /**\n * Adds a QualityChangePosition for the contentType identified by\n * the mediaQuality.contentType.\n *\n * @param {!shaka.extern.MediaQualityInfo} mediaQuality\n * @param {!number} position\n * Position in seconds of the quality change.\n */\n addMediaQualityChange(mediaQuality, position) {\n const contentTypeState =\n this.getContentTypeState_(mediaQuality.contentType);\n\n // Remove unneeded QualityChangePosition(s) before adding the new one\n this.purgeQualityChangePositions_(contentTypeState);\n\n const newChangePosition = {\n mediaQuality: mediaQuality,\n position: position,\n };\n\n const changePositions = contentTypeState.qualityChangePositions;\n const insertBeforeIndex = changePositions.findIndex(\n (qualityChange) => (qualityChange.position >= position));\n\n if (insertBeforeIndex >= 0) {\n const duplicatePositions =\n (changePositions[insertBeforeIndex].position == position) ? 1 : 0;\n changePositions.splice(\n insertBeforeIndex, duplicatePositions, newChangePosition);\n } else {\n changePositions.push(newChangePosition);\n }\n }\n\n /**\n * Determines the media quality at a specific position in the source buffer.\n *\n * @param {!number} position\n * Position in seconds\n * @param {!shaka.media.QualityObserver.ContentTypeState} contentTypeState\n * @return {?shaka.extern.MediaQualityInfo}\n * @private\n */\n static getMediaQualityAtPosition_(position, contentTypeState) {\n // The qualityChangePositions must be ordered by position ascending\n // Find the last QualityChangePosition prior to the position\n const changePositions = contentTypeState.qualityChangePositions;\n for (let i = changePositions.length - 1; i >= 0; i--) {\n const qualityChange = changePositions[i];\n if (qualityChange.position <= position) {\n return qualityChange.mediaQuality;\n }\n }\n return null;\n }\n\n /**\n * Determines if two MediaQualityInfo objects are the same or not.\n *\n * @param {?shaka.extern.MediaQualityInfo} mq1\n * @param {?shaka.extern.MediaQualityInfo} mq2\n * @return {boolean}\n * @private\n */\n static mediaQualitiesAreTheSame_(mq1, mq2) {\n if (mq1 === mq2) {\n return true;\n }\n if (!mq1 || !mq2) {\n return false;\n }\n return (mq1.bandwidth == mq2.bandwidth) &&\n (mq1.audioSamplingRate == mq2.audioSamplingRate) &&\n (mq1.codecs == mq2.codecs) &&\n (mq1.contentType == mq2.contentType) &&\n (mq1.frameRate == mq2.frameRate) &&\n (mq1.height == mq2.height) &&\n (mq1.mimeType == mq2.mimeType) &&\n (mq1.channelsCount == mq2.channelsCount) &&\n (mq1.pixelAspectRatio == mq2.pixelAspectRatio) &&\n (mq1.width == mq2.width);\n }\n\n /** @override */\n poll(positionInSeconds, wasSeeking) {\n for (const contentTypeState of this.contentTypeStates_.values()) {\n const currentQuality = contentTypeState.currentQuality;\n const qualityAtPosition =\n shaka.media.QualityObserver.getMediaQualityAtPosition_(\n positionInSeconds, contentTypeState);\n\n const differentQualities = qualityAtPosition &&\n !shaka.media.QualityObserver.mediaQualitiesAreTheSame_(\n currentQuality, qualityAtPosition);\n const differentLabel = qualityAtPosition && currentQuality &&\n qualityAtPosition.label && currentQuality.label &&\n currentQuality.label !== qualityAtPosition.label;\n const differentLanguage = qualityAtPosition && currentQuality &&\n qualityAtPosition.language && currentQuality.language &&\n currentQuality.language !== qualityAtPosition.language;\n const differentRoles = qualityAtPosition && currentQuality &&\n qualityAtPosition.roles && currentQuality.roles &&\n !shaka.util.ArrayUtils.equal(currentQuality.roles,\n qualityAtPosition.roles);\n\n if (differentLabel || differentLanguage || differentRoles) {\n if (this.positionIsBuffered_(\n positionInSeconds, qualityAtPosition.contentType)) {\n contentTypeState.currentQuality = qualityAtPosition;\n\n const event = new shaka.util.FakeEvent('audiotrackchange', new Map([\n ['quality', qualityAtPosition],\n ['position', positionInSeconds],\n ]));\n this.dispatchEvent(event);\n }\n }\n\n if (differentQualities) {\n if (this.positionIsBuffered_(\n positionInSeconds, qualityAtPosition.contentType)) {\n contentTypeState.currentQuality = qualityAtPosition;\n\n shaka.log.debug('Media quality changed at position ' +\n positionInSeconds + ' ' + JSON.stringify(qualityAtPosition));\n\n const event = new shaka.util.FakeEvent('qualitychange', new Map([\n ['quality', qualityAtPosition],\n ['position', positionInSeconds],\n ]));\n this.dispatchEvent(event);\n }\n }\n }\n }\n\n /**\n * Determine if a position is buffered for a given content type.\n *\n * @param {!number} position\n * @param {!string} contentType\n * @private\n */\n positionIsBuffered_(position, contentType) {\n const bufferedInfo = this.getBufferedInfo_();\n const bufferedRanges = bufferedInfo[contentType];\n if (bufferedRanges && bufferedRanges.length > 0) {\n const bufferStart = bufferedRanges[0].start;\n const bufferEnd = bufferedRanges[bufferedRanges.length - 1].end;\n if (position >= bufferStart && position < bufferEnd) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Removes the QualityChangePosition(s) that are not relevant to the buffered\n * content of the specified contentType. Note that this function is\n * invoked just before adding the quality change info associated with\n * the next media segment to be appended.\n *\n * @param {!shaka.media.QualityObserver.ContentTypeState} contentTypeState\n * @private\n */\n purgeQualityChangePositions_(contentTypeState) {\n const bufferedInfo = this.getBufferedInfo_();\n const bufferedRanges = bufferedInfo[contentTypeState.contentType];\n\n if (bufferedRanges && bufferedRanges.length > 0) {\n const bufferStart = bufferedRanges[0].start;\n const bufferEnd = bufferedRanges[bufferedRanges.length - 1].end;\n const oldChangePositions = contentTypeState.qualityChangePositions;\n contentTypeState.qualityChangePositions =\n oldChangePositions.filter(\n (qualityChange, index) => {\n // Remove all but last quality change before bufferStart.\n if ((qualityChange.position <= bufferStart) &&\n (index + 1 < oldChangePositions.length) &&\n (oldChangePositions[index + 1].position <= bufferStart)) {\n return false;\n }\n // Remove all quality changes after bufferEnd.\n if (qualityChange.position >= bufferEnd) {\n return false;\n }\n return true;\n });\n } else {\n // Nothing is buffered; so remove all quality changes.\n contentTypeState.qualityChangePositions = [];\n }\n }\n\n /**\n * Create a MediaQualityInfo object from a stream object.\n *\n * @param {!shaka.extern.Stream} stream\n * @return {!shaka.extern.MediaQualityInfo}\n */\n static createQualityInfo(stream) {\n const basicQuality = {\n bandwidth: stream.bandwidth || 0,\n audioSamplingRate: null,\n codecs: stream.codecs,\n contentType: stream.type,\n frameRate: null,\n height: null,\n mimeType: stream.mimeType,\n channelsCount: null,\n pixelAspectRatio: null,\n width: null,\n label: null,\n roles: stream.roles,\n language: null,\n };\n if (stream.type == shaka.util.ManifestParserUtils.ContentType.VIDEO) {\n basicQuality.frameRate = stream.frameRate || null;\n basicQuality.height = stream.height || null;\n basicQuality.pixelAspectRatio = stream.pixelAspectRatio || null;\n basicQuality.width = stream.width || null;\n }\n if (stream.type == shaka.util.ManifestParserUtils.ContentType.AUDIO) {\n basicQuality.audioSamplingRate = stream.audioSamplingRate;\n basicQuality.channelsCount = stream.channelsCount;\n basicQuality.label = stream.label || null;\n basicQuality.language = stream.language;\n }\n return basicQuality;\n }\n};\n\n/**\n * @typedef {{\n * mediaQuality: !shaka.extern.MediaQualityInfo,\n * position: !number\n * }}\n *\n * @description\n * Identifies the position of a media quality change in the\n * source buffer.\n *\n * @property {!shaka.extern.MediaQualityInfo} mediaQuality\n * The new media quality for content after position in the source buffer.\n * @property {!number} position\n * A position in seconds in the source buffer\n */\nshaka.media.QualityObserver.QualityChangePosition;\n\n/**\n * @typedef {{\n * qualityChangePositions:\n * !Array<shaka.media.QualityObserver.QualityChangePosition>,\n * currentQuality: ?shaka.extern.MediaQualityInfo,\n * contentType: !string\n * }}\n *\n * @description\n * Contains media quality information for a specific content type\n * e.g. video or audio.\n *\n * @property {!Array<shaka.media.QualityObserver.QualityChangePosition>\n * } qualityChangePositions\n * Quality changes ordered by position ascending.\n * @property {?shaka.media.MediaQualityInfo} currentMediaQuality\n * The media quality at the playhead position.\n * @property {string} contentType\n * The contentType e.g. 'video' or 'audio'\n */\nshaka.media.QualityObserver.ContentTypeState;\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.media.RegionTimeline');\n\ngoog.require('shaka.util.FakeEvent');\ngoog.require('shaka.util.FakeEventTarget');\ngoog.require('shaka.util.IReleasable');\ngoog.require('shaka.util.Timer');\n\n\n/**\n * The region timeline is a set of unique timeline region info entries. When\n * a new entry is added, the 'regionadd' event will be fired. When an entry is\n * deleted, the 'regionremove' event will be fired.\n *\n * @implements {shaka.util.IReleasable}\n * @template T\n * @final\n */\nshaka.media.RegionTimeline = class extends shaka.util.FakeEventTarget {\n /**\n * @param {!function():{start: number, end: number}} getSeekRange\n */\n constructor(getSeekRange) {\n super();\n\n /** @private {!Map<string, T>} */\n this.regions_ = new Map();\n\n /** @private {!function():{start: number, end: number}} */\n this.getSeekRange_ = getSeekRange;\n\n /**\n * Make sure all of the regions we're tracking are within the\n * seek range or further in the future. We don't want to store\n * regions that fall before the start of the seek range.\n *\n * @private {shaka.util.Timer}\n */\n this.filterTimer_ = null;\n }\n\n /** @override */\n release() {\n this.regions_.clear();\n this.releaseTimer_();\n super.release();\n }\n\n /**\n * @param {T} region\n */\n addRegion(region) {\n const key = this.generateKey_(region);\n\n // Make sure we don't add duplicate regions. We keep track of this here\n // instead of making the parser track it.\n if (!this.regions_.has(key)) {\n this.regions_.set(key, region);\n const event = new shaka.util.FakeEvent('regionadd', new Map([\n ['region', region],\n ]));\n this.dispatchEvent(event);\n this.setupTimer_();\n }\n }\n\n /**\n * @private\n */\n filterBySeekRange_() {\n const seekRange = this.getSeekRange_();\n for (const [key, region] of this.regions_) {\n // Only consider the seek range start here.\n // Future regions might become relevant eventually,\n // but regions that are in the past and can't ever be\n // seeked to will never come up again, and there's no\n // reason to store or process them.\n if (region.endTime < seekRange.start) {\n this.regions_.delete(key);\n const event = new shaka.util.FakeEvent('regionremove', new Map([\n ['region', region],\n ]));\n this.dispatchEvent(event);\n }\n }\n if (!this.regions_.size) {\n this.releaseTimer_();\n }\n }\n\n /** @private */\n setupTimer_() {\n if (this.filterTimer_) {\n return;\n }\n this.filterTimer_ = new shaka.util.Timer(() => {\n this.filterBySeekRange_();\n }).tickEvery(\n /* seconds= */ shaka.media.RegionTimeline.REGION_FILTER_INTERVAL);\n }\n\n /** @private */\n releaseTimer_() {\n if (this.filterTimer_) {\n this.filterTimer_.stop();\n this.filterTimer_ = null;\n }\n }\n\n /**\n * Get an iterable for all the regions in the timeline. This will allow\n * others to see what regions are in the timeline while not being able to\n * change the collection.\n *\n * @return {!Iterable<T>}\n */\n regions() {\n return this.regions_.values();\n }\n\n /**\n * @param {T} region\n * @return {string}\n * @private\n */\n generateKey_(region) {\n return `${region.schemeIdUri}_${region.id}_` +\n `${region.startTime.toFixed(1)}_${region.endTime.toFixed(1)}`;\n }\n};\n\n/** @const {number} */\nshaka.media.RegionTimeline.REGION_FILTER_INTERVAL = 2; // in seconds\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.media.SegmentPrefetch');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.log');\ngoog.require('shaka.media.InitSegmentReference');\ngoog.require('shaka.media.SegmentIterator');\ngoog.require('shaka.media.SegmentReference');\ngoog.require('shaka.net.NetworkingEngine');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.Uint8ArrayUtils');\n\n\n/**\n * @summary\n * This class manages segment prefetch operations.\n * Called by StreamingEngine to prefetch next N segments\n * ahead of playhead, to reduce the chances of rebuffering.\n */\nshaka.media.SegmentPrefetch = class {\n /**\n * @param {number} prefetchLimit\n * @param {shaka.extern.Stream} stream\n * @param {shaka.media.SegmentPrefetch.FetchDispatcher} fetchDispatcher\n * @param {boolean} reverse\n */\n constructor(prefetchLimit, stream, fetchDispatcher, reverse) {\n /** @private {number} */\n this.prefetchLimit_ = prefetchLimit;\n\n /** @private {shaka.extern.Stream} */\n this.stream_ = stream;\n\n /** @private {shaka.media.SegmentPrefetch.FetchDispatcher} */\n this.fetchDispatcher_ = fetchDispatcher;\n\n /**\n * @private {!Map<\n * !shaka.media.SegmentReference,\n * !shaka.media.SegmentPrefetchOperation>}\n */\n this.segmentPrefetchMap_ = new Map();\n\n /**\n * @private {!Map<\n * !shaka.media.InitSegmentReference,\n * !shaka.media.SegmentPrefetchOperation>}\n */\n this.initSegmentPrefetchMap_ = new Map();\n\n /** @private {?shaka.media.SegmentIterator} */\n this.iterator_ = null;\n\n /** @private {boolean} */\n this.reverse_ = reverse;\n }\n\n /**\n * @param {shaka.media.SegmentPrefetch.FetchDispatcher} fetchDispatcher\n */\n replaceFetchDispatcher(fetchDispatcher) {\n this.fetchDispatcher_ = fetchDispatcher;\n for (const operation of this.segmentPrefetchMap_.values()) {\n operation.replaceFetchDispatcher(fetchDispatcher);\n }\n }\n\n /**\n * Fetch next segments ahead of current time.\n *\n * @param {number} currTime\n * @param {boolean=} skipFirst\n * @return {!Promise}\n * @public\n */\n prefetchSegmentsByTime(currTime, skipFirst = false) {\n goog.asserts.assert(this.prefetchLimit_ > 0,\n 'SegmentPrefetch can not be used when prefetchLimit <= 0.');\n\n const logPrefix = shaka.media.SegmentPrefetch.logPrefix_(this.stream_);\n if (!this.stream_.segmentIndex) {\n shaka.log.debug(logPrefix, 'missing segmentIndex');\n return Promise.resolve();\n }\n if (!this.iterator_) {\n this.iterator_ = this.stream_.segmentIndex.getIteratorForTime(\n currTime, /* allowNonIndependent= */ true, this.reverse_);\n }\n if (!this.iterator_) {\n shaka.log.debug(logPrefix, 'missing iterator');\n return Promise.resolve();\n }\n if (skipFirst) {\n this.iterator_.next();\n }\n const promises = [];\n while (this.segmentPrefetchMap_.size < this.prefetchLimit_) {\n const reference = this.iterator_.next().value;\n if (!reference) {\n break;\n }\n // By default doesn't prefetch preload partial segments when using\n // byterange\n let prefetchAllowed = true;\n if (reference.isPreload() && reference.endByte != null) {\n prefetchAllowed = false;\n }\n if (reference.getStatus() ==\n shaka.media.SegmentReference.Status.MISSING) {\n prefetchAllowed = false;\n }\n if (reference.getSegmentData()) {\n prefetchAllowed = false;\n }\n if (prefetchAllowed && reference.initSegmentReference) {\n promises.push(this.prefetchInitSegment(\n reference.initSegmentReference));\n }\n if (prefetchAllowed && !this.segmentPrefetchMap_.has(reference)) {\n const segmentPrefetchOperation =\n new shaka.media.SegmentPrefetchOperation(this.fetchDispatcher_);\n promises.push(segmentPrefetchOperation.dispatchFetch(\n reference, this.stream_));\n this.segmentPrefetchMap_.set(reference, segmentPrefetchOperation);\n }\n }\n this.clearInitSegments_();\n return Promise.all(promises);\n }\n\n /**\n * Fetch init segment.\n *\n * @param {!shaka.media.InitSegmentReference} initSegmentReference\n * @return {!Promise}\n */\n prefetchInitSegment(initSegmentReference) {\n goog.asserts.assert(this.prefetchLimit_ > 0,\n 'SegmentPrefetch can not be used when prefetchLimit <= 0.');\n\n const logPrefix = shaka.media.SegmentPrefetch.logPrefix_(this.stream_);\n if (!this.stream_.segmentIndex) {\n shaka.log.debug(logPrefix, 'missing segmentIndex');\n return Promise.resolve();\n }\n\n if (initSegmentReference.getSegmentData()) {\n return Promise.resolve();\n }\n\n // init segments are ignored from the prefetch limit\n const initSegments = Array.from(this.initSegmentPrefetchMap_.keys());\n const someReference = initSegments.some((reference) => {\n return shaka.media.InitSegmentReference.equal(\n reference, initSegmentReference);\n });\n if (someReference) {\n return Promise.resolve();\n }\n const segmentPrefetchOperation = new shaka.media.SegmentPrefetchOperation(\n this.fetchDispatcher_);\n const promise = segmentPrefetchOperation.dispatchFetch(\n initSegmentReference, this.stream_);\n this.initSegmentPrefetchMap_.set(\n initSegmentReference, segmentPrefetchOperation);\n return promise;\n }\n\n /**\n * Get the result of prefetched segment if already exists.\n * @param {!(shaka.media.SegmentReference|\n * shaka.media.InitSegmentReference)} reference\n * @param {?function(BufferSource):!Promise=} streamDataCallback\n * @return {?shaka.net.NetworkingEngine.PendingRequest} op\n * @public\n */\n getPrefetchedSegment(reference, streamDataCallback) {\n goog.asserts.assert(this.prefetchLimit_ > 0,\n 'SegmentPrefetch can not be used when prefetchLimit <= 0.');\n\n const logPrefix = shaka.media.SegmentPrefetch.logPrefix_(this.stream_);\n\n let prefetchMap = this.segmentPrefetchMap_;\n if (reference instanceof shaka.media.InitSegmentReference) {\n prefetchMap = this.initSegmentPrefetchMap_;\n }\n\n if (prefetchMap.has(reference)) {\n const segmentPrefetchOperation = prefetchMap.get(reference);\n if (streamDataCallback) {\n segmentPrefetchOperation.setStreamDataCallback(streamDataCallback);\n }\n if (reference instanceof shaka.media.SegmentReference) {\n shaka.log.debug(\n logPrefix,\n 'reused prefetched segment at time:', reference.startTime,\n 'mapSize', prefetchMap.size);\n } else {\n shaka.log.debug(\n logPrefix,\n 'reused prefetched init segment at time, mapSize',\n prefetchMap.size);\n }\n return segmentPrefetchOperation.getOperation();\n } else {\n if (reference instanceof shaka.media.SegmentReference) {\n shaka.log.debug(\n logPrefix,\n 'missed segment at time:', reference.startTime,\n 'mapSize', prefetchMap.size);\n } else {\n shaka.log.debug(\n logPrefix,\n 'missed init segment at time, mapSize',\n prefetchMap.size);\n }\n return null;\n }\n }\n\n /**\n * Clear All Helper\n * @param {!Map<T,\n * !shaka.media.SegmentPrefetchOperation>} map\n * @template T SegmentReference or InitSegmentReference\n * @private\n */\n clearMap_(map) {\n for (const reference of map.keys()) {\n if (reference) {\n this.abortPrefetchedSegment_(reference);\n }\n }\n }\n\n /** */\n resetPosition() {\n this.iterator_ = null;\n }\n\n /**\n * Clear all segment data.\n * @public\n */\n clearAll() {\n this.clearMap_(this.segmentPrefetchMap_);\n this.clearMap_(this.initSegmentPrefetchMap_);\n this.resetPosition();\n const logPrefix = shaka.media.SegmentPrefetch.logPrefix_(this.stream_);\n shaka.log.debug(logPrefix, 'cleared all');\n }\n\n /**\n * Remove a reference of prefetched segment if already exists.\n * @param {!shaka.media.SegmentReference} reference\n * @public\n */\n removeReference(reference) {\n this.abortPrefetchedSegment_(reference);\n }\n\n /**\n * @param {number} time\n * @param {boolean=} clearInitSegments\n */\n evict(time, clearInitSegments = false) {\n for (const ref of this.segmentPrefetchMap_.keys()) {\n if (time > ref.endTime) {\n this.abortPrefetchedSegment_(ref);\n }\n }\n if (clearInitSegments) {\n this.clearInitSegments_();\n }\n }\n\n /**\n * @param {boolean} reverse\n */\n setReverse(reverse) {\n this.reverse_ = reverse;\n if (this.iterator_) {\n this.iterator_.setReverse(reverse);\n }\n }\n\n /**\n * Remove all init segments that don't have associated segments in\n * the segment prefetch map.\n * By default, with delete on get, the init segments should get removed as\n * they are used. With deleteOnGet set to false, we need to clear them\n * every so often once the segments that are associated with each init segment\n * is no longer prefetched.\n * @private\n */\n clearInitSegments_() {\n const segmentReferences = Array.from(this.segmentPrefetchMap_.keys());\n for (const initSegmentReference of this.initSegmentPrefetchMap_.keys()) {\n // if no segment references this init segment, we should remove it.\n const someReference = segmentReferences.some((segmentReference) => {\n return shaka.media.InitSegmentReference.equal(\n segmentReference.initSegmentReference, initSegmentReference);\n });\n if (!someReference) {\n this.abortPrefetchedSegment_(initSegmentReference);\n }\n }\n }\n\n /**\n * Reset the prefetchLimit and clear all internal states.\n * Called by StreamingEngine when configure() was called.\n * @param {number} newPrefetchLimit\n * @public\n */\n resetLimit(newPrefetchLimit) {\n goog.asserts.assert(newPrefetchLimit >= 0,\n 'The new prefetch limit must be >= 0.');\n\n const logPrefix = shaka.media.SegmentPrefetch.logPrefix_(this.stream_);\n shaka.log.debug(logPrefix, 'resetting prefetch limit to', newPrefetchLimit);\n this.prefetchLimit_ = newPrefetchLimit;\n const keyArr = Array.from(this.segmentPrefetchMap_.keys());\n while (keyArr.length > newPrefetchLimit) {\n const reference = keyArr.pop();\n if (reference) {\n this.abortPrefetchedSegment_(reference);\n }\n }\n this.clearInitSegments_();\n }\n\n /**\n * Called by Streaming Engine when switching variant.\n * @param {shaka.extern.Stream} stream\n * @public\n */\n switchStream(stream) {\n if (stream && stream !== this.stream_) {\n this.clearAll();\n this.stream_ = stream;\n }\n }\n\n /**\n * Get the current stream.\n * @public\n * @return {shaka.extern.Stream}\n */\n getStream() {\n return this.stream_;\n }\n\n /**\n * Remove a segment from prefetch map and abort it.\n * @param {!(shaka.media.SegmentReference|\n * shaka.media.InitSegmentReference)} reference\n * @private\n */\n abortPrefetchedSegment_(reference) {\n const logPrefix = shaka.media.SegmentPrefetch.logPrefix_(this.stream_);\n\n let prefetchMap = this.segmentPrefetchMap_;\n if (reference instanceof shaka.media.InitSegmentReference) {\n prefetchMap = this.initSegmentPrefetchMap_;\n }\n\n const segmentPrefetchOperation = prefetchMap.get(reference);\n prefetchMap.delete(reference);\n\n if (segmentPrefetchOperation) {\n segmentPrefetchOperation.abort();\n if (reference instanceof shaka.media.SegmentReference) {\n shaka.log.debug(\n logPrefix,\n 'pop and abort prefetched segment at time:', reference.startTime);\n } else {\n shaka.log.debug(logPrefix, 'pop and abort prefetched init segment');\n }\n }\n }\n\n /**\n * The prefix of the logs that are created in this class.\n * @param {shaka.extern.Stream} stream\n * @return {string}\n * @private\n */\n static logPrefix_(stream) {\n return 'SegmentPrefetch(' + stream.type + ':' + stream.id + ')';\n }\n};\n\n/**\n * @summary\n * This class manages a segment prefetch operation.\n */\nshaka.media.SegmentPrefetchOperation = class {\n /**\n * @param {shaka.media.SegmentPrefetch.FetchDispatcher} fetchDispatcher\n */\n constructor(fetchDispatcher) {\n /** @private {shaka.media.SegmentPrefetch.FetchDispatcher} */\n this.fetchDispatcher_ = fetchDispatcher;\n\n /** @private {?function(BufferSource):!Promise} */\n this.streamDataCallback_ = null;\n\n /** @private {?shaka.net.NetworkingEngine.PendingRequest} */\n this.operation_ = null;\n }\n\n /**\n * @param {shaka.media.SegmentPrefetch.FetchDispatcher} fetchDispatcher\n */\n replaceFetchDispatcher(fetchDispatcher) {\n this.fetchDispatcher_ = fetchDispatcher;\n }\n\n /**\n * Fetch segments\n *\n * @param {!(shaka.media.SegmentReference|\n * shaka.media.InitSegmentReference)} reference\n * @param {!shaka.extern.Stream} stream\n * @return {!Promise}\n * @public\n */\n dispatchFetch(reference, stream) {\n // We need to store the data, because streamDataCallback_ might not be\n // available when you start getting the first data.\n let buffered = new Uint8Array(0);\n this.operation_ = this.fetchDispatcher_(\n reference, stream, async (data) => {\n if (buffered.byteLength > 0) {\n buffered = shaka.util.Uint8ArrayUtils.concat(buffered, data);\n } else {\n buffered = data;\n }\n if (this.streamDataCallback_) {\n await this.streamDataCallback_(buffered);\n buffered = new Uint8Array(0);\n }\n });\n return this.operation_.promise.catch((e) => {\n // Ignore OPERATION_ABORTED errors.\n if (e instanceof shaka.util.Error &&\n e.code == shaka.util.Error.Code.OPERATION_ABORTED) {\n return Promise.resolve();\n }\n // Continue to surface other errors.\n return Promise.reject(e);\n });\n }\n\n /**\n * Get the operation of prefetched segment if already exists.\n *\n * @return {?shaka.net.NetworkingEngine.PendingRequest} op\n * @public\n */\n getOperation() {\n return this.operation_;\n }\n\n /**\n * @param {?function(BufferSource):!Promise} streamDataCallback\n * @public\n */\n setStreamDataCallback(streamDataCallback) {\n this.streamDataCallback_ = streamDataCallback;\n }\n\n /**\n * Abort the current operation if exists.\n */\n abort() {\n if (this.operation_) {\n this.operation_.abort();\n }\n }\n};\n\n/**\n * @typedef {function(\n * !(shaka.media.InitSegmentReference|shaka.media.SegmentReference),\n * shaka.extern.Stream,\n * ?function(BufferSource):!Promise=\n * ):!shaka.net.NetworkingEngine.PendingRequest}\n *\n * @description\n * A callback function that fetches a segment.\n * @export\n */\nshaka.media.SegmentPrefetch.FetchDispatcher;\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.media.SegmentUtils');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.log');\ngoog.require('shaka.media.Capabilities');\ngoog.require('shaka.media.ClosedCaptionParser');\ngoog.require('shaka.util.BufferUtils');\ngoog.require('shaka.util.ManifestParserUtils');\ngoog.require('shaka.util.MimeUtils');\ngoog.require('shaka.util.Mp4BoxParsers');\ngoog.require('shaka.util.Mp4Parser');\ngoog.require('shaka.util.TsParser');\n\n\n/**\n * @summary Utility functions for segment parsing.\n */\nshaka.media.SegmentUtils = class {\n /**\n * @param {string} mimeType\n * @return {shaka.media.SegmentUtils.BasicInfo}\n */\n static getBasicInfoFromMimeType(mimeType) {\n const baseMimeType = shaka.util.MimeUtils.getBasicType(mimeType);\n const type = baseMimeType.split('/')[0];\n const codecs = shaka.util.MimeUtils.getCodecs(mimeType);\n return {\n type: type,\n mimeType: baseMimeType,\n codecs: codecs,\n language: null,\n height: null,\n width: null,\n channelCount: null,\n sampleRate: null,\n closedCaptions: new Map(),\n videoRange: null,\n colorGamut: null,\n frameRate: null,\n };\n }\n\n /**\n * @param {!BufferSource} data\n * @param {boolean} disableAudio\n * @param {boolean} disableVideo\n * @param {boolean} disableText\n * @return {?shaka.media.SegmentUtils.BasicInfo}\n */\n static getBasicInfoFromTs(data, disableAudio, disableVideo, disableText) {\n const uint8ArrayData = shaka.util.BufferUtils.toUint8(data);\n const tsParser = new shaka.util.TsParser().parse(uint8ArrayData);\n const tsCodecs = tsParser.getCodecs();\n const videoInfo = tsParser.getVideoInfo();\n const codecs = [];\n let hasAudio = false;\n let hasVideo = false;\n if (!disableAudio) {\n switch (tsCodecs.audio) {\n case 'aac':\n case 'aac-loas':\n if (tsParser.getAudioData().length) {\n codecs.push('mp4a.40.2');\n hasAudio = true;\n }\n break;\n case 'mp3':\n if (tsParser.getAudioData().length) {\n codecs.push('mp4a.40.34');\n hasAudio = true;\n }\n break;\n case 'ac3':\n if (tsParser.getAudioData().length) {\n codecs.push('ac-3');\n hasAudio = true;\n }\n break;\n case 'ec3':\n if (tsParser.getAudioData().length) {\n codecs.push('ec-3');\n hasAudio = true;\n }\n break;\n case 'opus':\n if (tsParser.getAudioData().length) {\n codecs.push('opus');\n hasAudio = true;\n }\n break;\n }\n }\n if (!disableVideo) {\n switch (tsCodecs.video) {\n case 'avc':\n if (videoInfo.codec) {\n codecs.push(videoInfo.codec);\n } else {\n codecs.push('avc1.42E01E');\n }\n hasVideo = true;\n break;\n case 'hvc':\n if (videoInfo.codec) {\n codecs.push(videoInfo.codec);\n } else {\n codecs.push('hvc1.1.6.L93.90');\n }\n hasVideo = true;\n break;\n case 'av1':\n codecs.push('av01.0.01M.08');\n hasVideo = true;\n break;\n }\n }\n if (!codecs.length) {\n return null;\n }\n const onlyAudio = hasAudio && !hasVideo;\n const closedCaptions = new Map();\n if (hasVideo && !disableText) {\n const captionParser = new shaka.media.ClosedCaptionParser('video/mp2t');\n captionParser.parseFrom(data);\n for (const stream of captionParser.getStreams()) {\n closedCaptions.set(stream, stream);\n }\n captionParser.reset();\n }\n return {\n type: onlyAudio ? 'audio' : 'video',\n mimeType: 'video/mp2t',\n codecs: codecs.join(', '),\n language: null,\n height: videoInfo.height,\n width: videoInfo.width,\n channelCount: null,\n sampleRate: null,\n closedCaptions: closedCaptions,\n videoRange: null,\n colorGamut: null,\n frameRate: videoInfo.frameRate,\n };\n }\n\n /**\n * @param {?BufferSource} initData\n * @param {!BufferSource} data\n * @param {boolean} disableText\n * @return {?shaka.media.SegmentUtils.BasicInfo}\n */\n static getBasicInfoFromMp4(initData, data, disableText) {\n const Mp4Parser = shaka.util.Mp4Parser;\n const SegmentUtils = shaka.media.SegmentUtils;\n\n const audioCodecs = [];\n let videoCodecs = [];\n\n let hasAudio = false;\n let hasVideo = false;\n\n const addCodec = (codec) => {\n const codecLC = codec.toLowerCase();\n switch (codecLC) {\n case 'avc1':\n case 'avc3':\n videoCodecs.push(codecLC + '.42E01E');\n hasVideo = true;\n break;\n case 'hev1':\n case 'hvc1':\n videoCodecs.push(codecLC + '.1.6.L93.90');\n hasVideo = true;\n break;\n case 'dvh1':\n case 'dvhe':\n videoCodecs.push(codecLC + '.05.04');\n hasVideo = true;\n break;\n case 'vp09':\n videoCodecs.push(codecLC + '.00.10.08');\n hasVideo = true;\n break;\n case 'av01':\n videoCodecs.push(codecLC + '.0.01M.08');\n hasVideo = true;\n break;\n case 'mp4a':\n // We assume AAC, but this can be wrong since mp4a supports\n // others codecs\n audioCodecs.push('mp4a.40.2');\n hasAudio = true;\n break;\n case 'ac-3':\n case 'ec-3':\n case 'ac-4':\n case 'opus':\n case 'flac':\n audioCodecs.push(codecLC);\n hasAudio = true;\n break;\n }\n };\n\n const codecBoxParser = (box) => addCodec(box.name);\n\n /** @type {?string} */\n let language = null;\n /** @type {?string} */\n let height = null;\n /** @type {?string} */\n let width = null;\n /** @type {?number} */\n let channelCount = null;\n /** @type {?number} */\n let sampleRate = null;\n /** @type {?string} */\n let realVideoRange = null;\n /** @type {?string} */\n let realColorGamut = null;\n /** @type {?string} */\n const realFrameRate = null;\n\n /** @type {?string} */\n let baseBox;\n\n const genericAudioBox = (box) => {\n const parsedAudioSampleEntryBox =\n shaka.util.Mp4BoxParsers.audioSampleEntry(box.reader);\n channelCount = parsedAudioSampleEntryBox.channelCount;\n sampleRate = parsedAudioSampleEntryBox.sampleRate;\n codecBoxParser(box);\n };\n\n const genericVideoBox = (box) => {\n baseBox = box.name;\n const parsedVisualSampleEntryBox =\n shaka.util.Mp4BoxParsers.visualSampleEntry(box.reader);\n width = String(parsedVisualSampleEntryBox.width);\n height = String(parsedVisualSampleEntryBox.height);\n if (box.reader.hasMoreData()) {\n Mp4Parser.children(box);\n }\n };\n\n new Mp4Parser()\n .box('moov', Mp4Parser.children)\n .box('trak', Mp4Parser.children)\n .box('mdia', Mp4Parser.children)\n .fullBox('mdhd', (box) => {\n goog.asserts.assert(\n box.version != null,\n 'MDHD is a full box and should have a valid version.');\n const parsedMDHDBox = shaka.util.Mp4BoxParsers.parseMDHD(\n box.reader, box.version);\n language = parsedMDHDBox.language;\n })\n .box('minf', Mp4Parser.children)\n .box('stbl', Mp4Parser.children)\n .fullBox('stsd', Mp4Parser.sampleDescription)\n\n // AUDIO\n // These are the various boxes that signal a codec.\n .box('mp4a', (box) => {\n const parsedAudioSampleEntryBox =\n shaka.util.Mp4BoxParsers.audioSampleEntry(box.reader);\n channelCount = parsedAudioSampleEntryBox.channelCount;\n sampleRate = parsedAudioSampleEntryBox.sampleRate;\n if (box.reader.hasMoreData()) {\n Mp4Parser.children(box);\n } else {\n codecBoxParser(box);\n }\n })\n .box('esds', (box) => {\n const parsedESDSBox = shaka.util.Mp4BoxParsers.parseESDS(box.reader);\n audioCodecs.push(parsedESDSBox.codec);\n hasAudio = true;\n })\n .box('ac-3', genericAudioBox)\n .box('ec-3', genericAudioBox)\n .box('ac-4', genericAudioBox)\n .box('Opus', genericAudioBox)\n .box('fLaC', genericAudioBox)\n\n // VIDEO\n // These are the various boxes that signal a codec.\n .box('avc1', genericVideoBox)\n .box('avc3', genericVideoBox)\n .box('hev1', genericVideoBox)\n .box('hvc1', genericVideoBox)\n .box('dva1', genericVideoBox)\n .box('dvav', genericVideoBox)\n .box('dvh1', genericVideoBox)\n .box('dvhe', genericVideoBox)\n .box('vp09', genericVideoBox)\n .box('av01', genericVideoBox)\n .box('avcC', (box) => {\n let codecBase = baseBox || '';\n switch (baseBox) {\n case 'dvav':\n codecBase = 'avc3';\n break;\n case 'dva1':\n codecBase = 'avc1';\n break;\n }\n const parsedAVCCBox = shaka.util.Mp4BoxParsers.parseAVCC(\n codecBase, box.reader, box.name);\n videoCodecs.push(parsedAVCCBox.codec);\n hasVideo = true;\n })\n .box('hvcC', (box) => {\n let codecBase = baseBox || '';\n switch (baseBox) {\n case 'dvh1':\n codecBase = 'hvc1';\n break;\n case 'dvhe':\n codecBase = 'hev1';\n break;\n }\n const parsedHVCCBox = shaka.util.Mp4BoxParsers.parseHVCC(\n codecBase, box.reader, box.name);\n videoCodecs.push(parsedHVCCBox.codec);\n hasVideo = true;\n })\n .box('dvcC', (box) => {\n let codecBase = baseBox || '';\n switch (baseBox) {\n case 'hvc1':\n codecBase = 'dvh1';\n break;\n case 'hev1':\n codecBase = 'dvhe';\n break;\n case 'avc1':\n codecBase = 'dva1';\n break;\n case 'avc3':\n codecBase = 'dvav';\n break;\n case 'av01':\n codecBase = 'dav1';\n break;\n }\n const parsedDVCCBox = shaka.util.Mp4BoxParsers.parseDVCC(\n codecBase, box.reader, box.name);\n videoCodecs.push(parsedDVCCBox.codec);\n hasVideo = true;\n })\n .box('dvvC', (box) => {\n let codecBase = baseBox || '';\n switch (baseBox) {\n case 'hvc1':\n codecBase = 'dvh1';\n break;\n case 'hev1':\n codecBase = 'dvhe';\n break;\n case 'avc1':\n codecBase = 'dva1';\n break;\n case 'avc3':\n codecBase = 'dvav';\n break;\n case 'av01':\n codecBase = 'dav1';\n break;\n }\n const parsedDVCCBox = shaka.util.Mp4BoxParsers.parseDVVC(\n codecBase, box.reader, box.name);\n videoCodecs.push(parsedDVCCBox.codec);\n hasVideo = true;\n })\n .fullBox('vpcC', (box) => {\n const codecBase = baseBox || '';\n const parsedVPCCBox = shaka.util.Mp4BoxParsers.parseVPCC(\n codecBase, box.reader, box.name);\n videoCodecs.push(parsedVPCCBox.codec);\n hasVideo = true;\n })\n .box('av1C', (box) => {\n let codecBase = baseBox || '';\n switch (baseBox) {\n case 'dav1':\n codecBase = 'av01';\n break;\n }\n const parsedAV1CBox = shaka.util.Mp4BoxParsers.parseAV1C(\n codecBase, box.reader, box.name);\n videoCodecs.push(parsedAV1CBox.codec);\n hasVideo = true;\n })\n\n // This signals an encrypted sample, which we can go inside of to\n // find the codec used.\n // Note: If encrypted, you can only have audio or video, not both.\n .box('enca', Mp4Parser.audioSampleEntry)\n .box('encv', Mp4Parser.visualSampleEntry)\n .box('sinf', Mp4Parser.children)\n .box('frma', (box) => {\n const {codec} = shaka.util.Mp4BoxParsers.parseFRMA(box.reader);\n addCodec(codec);\n })\n\n .box('colr', (box) => {\n videoCodecs = videoCodecs.map((codec) => {\n if (codec.startsWith('av01.')) {\n return shaka.util.Mp4BoxParsers.updateAV1CodecWithCOLRBox(\n codec, box.reader);\n }\n return codec;\n });\n const {videoRange, colorGamut} =\n shaka.util.Mp4BoxParsers.parseCOLR(box.reader);\n realVideoRange = videoRange;\n realColorGamut = colorGamut;\n })\n\n .parse(initData || data, /* partialOkay= */ true);\n if (!audioCodecs.length && !videoCodecs.length) {\n return null;\n }\n const onlyAudio = hasAudio && !hasVideo;\n const closedCaptions = new Map();\n if (hasVideo && !disableText) {\n const captionParser = new shaka.media.ClosedCaptionParser('video/mp4');\n if (initData) {\n captionParser.init(initData);\n }\n try {\n captionParser.parseFrom(data);\n for (const stream of captionParser.getStreams()) {\n closedCaptions.set(stream, stream);\n }\n } catch (e) {\n shaka.log.debug('Error detecting CC streams', e);\n }\n captionParser.reset();\n }\n const codecs = audioCodecs.concat(videoCodecs);\n return {\n type: onlyAudio ? 'audio' : 'video',\n mimeType: onlyAudio ? 'audio/mp4' : 'video/mp4',\n codecs: SegmentUtils.codecsFiltering(codecs).join(', '),\n language: language,\n height: height,\n width: width,\n channelCount: channelCount,\n sampleRate: sampleRate,\n closedCaptions: closedCaptions,\n videoRange: realVideoRange,\n colorGamut: realColorGamut,\n frameRate: realFrameRate,\n };\n }\n\n /**\n * @param {!Array<string>} codecs\n * @return {!Array<string>} codecs\n */\n static codecsFiltering(codecs) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n const ManifestParserUtils = shaka.util.ManifestParserUtils;\n const SegmentUtils = shaka.media.SegmentUtils;\n const allCodecs = SegmentUtils.filterDuplicateCodecs_(codecs);\n const audioCodecs =\n ManifestParserUtils.guessAllCodecsSafe(ContentType.AUDIO, allCodecs);\n const videoCodecs =\n ManifestParserUtils.guessAllCodecsSafe(ContentType.VIDEO, allCodecs);\n const textCodecs =\n ManifestParserUtils.guessAllCodecsSafe(ContentType.TEXT, allCodecs);\n const validVideoCodecs = SegmentUtils.chooseBetterCodecs_(videoCodecs);\n const finalCodecs =\n audioCodecs.concat(validVideoCodecs).concat(textCodecs);\n if (allCodecs.length && !finalCodecs.length) {\n return allCodecs;\n }\n return finalCodecs;\n }\n\n /**\n * @param {!Array<string>} codecs\n * @return {!Array<string>} codecs\n * @private\n */\n static filterDuplicateCodecs_(codecs) {\n // Filter out duplicate codecs.\n const seen = new Set();\n const ret = [];\n for (const codec of codecs) {\n const shortCodec = shaka.util.MimeUtils.getCodecBase(codec);\n if (!seen.has(shortCodec)) {\n ret.push(codec);\n seen.add(shortCodec);\n } else {\n shaka.log.debug('Ignoring duplicate codec');\n }\n }\n return ret;\n }\n\n /**\n * Prioritizes Dolby Vision if supported. This is necessary because with\n * Dolby Vision we could have hvcC and dvcC boxes at the same time.\n *\n * @param {!Array<string>} codecs\n * @return {!Array<string>} codecs\n * @private\n */\n static chooseBetterCodecs_(codecs) {\n if (codecs.length <= 1) {\n return codecs;\n }\n const dolbyVision = codecs.find((codec) => {\n return codec.startsWith('dvav.') ||\n codec.startsWith('dva1.') ||\n codec.startsWith('dvh1.') ||\n codec.startsWith('dvhe.') ||\n codec.startsWith('dav1.') ||\n codec.startsWith('dvc1.') ||\n codec.startsWith('dvi1.');\n });\n if (!dolbyVision) {\n return codecs;\n }\n const type = `video/mp4; codecs=\"${dolbyVision}\"`;\n if (shaka.media.Capabilities.isTypeSupported(type)) {\n return [dolbyVision];\n }\n return codecs.filter((codec) => codec != dolbyVision);\n }\n\n /**\n * @param {!BufferSource} data\n * @return {?string}\n */\n static getDefaultKID(data) {\n const Mp4Parser = shaka.util.Mp4Parser;\n\n let defaultKID = null;\n new Mp4Parser()\n .box('moov', Mp4Parser.children)\n .box('trak', Mp4Parser.children)\n .box('mdia', Mp4Parser.children)\n .box('minf', Mp4Parser.children)\n .box('stbl', Mp4Parser.children)\n .fullBox('stsd', Mp4Parser.sampleDescription)\n .box('encv', Mp4Parser.visualSampleEntry)\n .box('enca', Mp4Parser.audioSampleEntry)\n .box('sinf', Mp4Parser.children)\n .box('schi', Mp4Parser.children)\n .fullBox('tenc', (box) => {\n const parsedTENCBox = shaka.util.Mp4BoxParsers.parseTENC(box.reader);\n defaultKID = parsedTENCBox.defaultKID;\n })\n\n .parse(data, /* partialOkay= */ true);\n return defaultKID;\n }\n\n /**\n * @param {!BufferSource} rawResult\n * @param {shaka.extern.aesKey} aesKey\n * @param {number} position\n * @return {!Promise<!BufferSource>}\n */\n static async aesDecrypt(rawResult, aesKey, position) {\n const key = aesKey;\n if (!key.cryptoKey) {\n goog.asserts.assert(key.fetchKey, 'If AES cryptoKey was not ' +\n 'preloaded, fetchKey function should be provided');\n await key.fetchKey();\n goog.asserts.assert(key.cryptoKey, 'AES cryptoKey should now be set');\n }\n let iv = key.iv;\n if (!iv) {\n iv = shaka.util.BufferUtils.toUint8(new ArrayBuffer(16));\n let sequence = key.firstMediaSequenceNumber + position;\n for (let i = iv.byteLength - 1; i >= 0; i--) {\n iv[i] = sequence & 0xff;\n sequence >>= 8;\n }\n }\n let algorithm;\n if (aesKey.blockCipherMode == 'CBC') {\n algorithm = {\n name: 'AES-CBC',\n iv,\n };\n } else {\n algorithm = {\n name: 'AES-CTR',\n counter: iv,\n // NIST SP800-38A standard suggests that the counter should occupy half\n // of the counter block\n length: 64,\n };\n }\n return window.crypto.subtle.decrypt(algorithm, key.cryptoKey, rawResult);\n }\n};\n\n\n/**\n * @typedef {{\n * type: string,\n * mimeType: string,\n * codecs: string,\n * language: ?string,\n * height: ?string,\n * width: ?string,\n * channelCount: ?number,\n * sampleRate: ?number,\n * closedCaptions: Map<string, string>,\n * videoRange: ?string,\n * colorGamut: ?string,\n * frameRate: ?string\n * }}\n *\n * @property {string} type\n * @property {string} mimeType\n * @property {string} codecs\n * @property {?string} language\n * @property {?string} height\n * @property {?string} width\n * @property {?number} channelCount\n * @property {?number} sampleRate\n * @property {Map<string, string>} closedCaptions\n * @property {?string} videoRange\n * @property {?string} colorGamut\n * @property {?string} frameRate\n */\nshaka.media.SegmentUtils.BasicInfo;\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.Networking');\n\ngoog.require('shaka.net.NetworkingEngine');\n\n\n/**\n * A collection of shared utilities that bridge the gap between our networking\n * code and the other parts of our code base. This is to allow\n * |shaka.net.NetworkingEngine| to remain general.\n *\n * @final\n */\nshaka.util.Networking = class {\n /**\n * Create a request message for a segment. Providing |start| and |end|\n * will set the byte range. A non-zero start must be provided for |end| to\n * be used.\n *\n * @param {!Array<string>} uris\n * @param {?number} start\n * @param {?number} end\n * @param {shaka.extern.RetryParameters} retryParameters\n * @param {?function(BufferSource):!Promise=} streamDataCallback\n * @return {shaka.extern.Request}\n */\n static createSegmentRequest(uris, start, end, retryParameters,\n streamDataCallback) {\n const request = shaka.net.NetworkingEngine.makeRequest(\n uris, retryParameters, streamDataCallback);\n\n if (start == 0 && end == null) {\n // This is a request for the entire segment. The Range header is not\n // required. Note that some web servers don't accept Range headers, so\n // don't set one if it's not strictly required.\n } else {\n if (end) {\n request.headers['Range'] = 'bytes=' + start + '-' + end;\n } else {\n request.headers['Range'] = 'bytes=' + start + '-';\n }\n }\n\n return request;\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview\n */\n\ngoog.provide('shaka.media.StreamingEngine');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.config.CrossBoundaryStrategy');\ngoog.require('shaka.log');\ngoog.require('shaka.media.Capabilities');\ngoog.require('shaka.media.InitSegmentReference');\ngoog.require('shaka.media.ManifestParser');\ngoog.require('shaka.media.MediaSourceEngine');\ngoog.require('shaka.media.MetaSegmentIndex');\ngoog.require('shaka.media.SegmentIterator');\ngoog.require('shaka.media.SegmentReference');\ngoog.require('shaka.media.SegmentPrefetch');\ngoog.require('shaka.media.SegmentUtils');\ngoog.require('shaka.net.Backoff');\ngoog.require('shaka.net.NetworkingEngine');\ngoog.require('shaka.util.DelayedTick');\ngoog.require('shaka.util.Destroyer');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.FakeEvent');\ngoog.require('shaka.util.IDestroyable');\ngoog.require('shaka.util.LanguageUtils');\ngoog.require('shaka.util.ManifestParserUtils');\ngoog.require('shaka.util.MimeUtils');\ngoog.require('shaka.util.Mp4BoxParsers');\ngoog.require('shaka.util.Mp4Parser');\ngoog.require('shaka.util.Networking');\ngoog.require('shaka.util.Timer');\n\n\n/**\n * @summary Creates a Streaming Engine.\n * The StreamingEngine is responsible for setting up the Manifest's Streams\n * (i.e., for calling each Stream's createSegmentIndex() function), for\n * downloading segments, for co-ordinating audio, video, and text buffering.\n * The StreamingEngine provides an interface to switch between Streams, but it\n * does not choose which Streams to switch to.\n *\n * The StreamingEngine does not need to be notified about changes to the\n * Manifest's SegmentIndexes; however, it does need to be notified when new\n * Variants are added to the Manifest.\n *\n * To start the StreamingEngine the owner must first call configure(), followed\n * by one call to switchVariant(), one optional call to switchTextStream(), and\n * finally a call to start(). After start() resolves, switch*() can be used\n * freely.\n *\n * The owner must call seeked() each time the playhead moves to a new location\n * within the presentation timeline; however, the owner may forego calling\n * seeked() when the playhead moves outside the presentation timeline.\n *\n * @implements {shaka.util.IDestroyable}\n */\nshaka.media.StreamingEngine = class {\n /**\n * @param {shaka.extern.Manifest} manifest\n * @param {shaka.media.StreamingEngine.PlayerInterface} playerInterface\n */\n constructor(manifest, playerInterface) {\n /** @private {?shaka.media.StreamingEngine.PlayerInterface} */\n this.playerInterface_ = playerInterface;\n\n /** @private {?shaka.extern.Manifest} */\n this.manifest_ = manifest;\n\n /** @private {?shaka.extern.StreamingConfiguration} */\n this.config_ = null;\n\n /**\n * Retains a reference to the function used to close SegmentIndex objects\n * for streams which were switched away from during an ongoing update_().\n * @private {!Map<string, !function()>}\n */\n this.deferredCloseSegmentIndex_ = new Map();\n\n /** @private {number} */\n this.bufferingScale_ = 1;\n\n /** @private {?shaka.extern.Variant} */\n this.currentVariant_ = null;\n\n /** @private {?shaka.extern.Stream} */\n this.currentTextStream_ = null;\n\n /** @private {number} */\n this.textStreamSequenceId_ = 0;\n\n /**\n * Maps a content type, e.g., 'audio', 'video', or 'text', to a MediaState.\n *\n * @private {!Map<shaka.util.ManifestParserUtils.ContentType,\n * !shaka.media.StreamingEngine.MediaState_>}\n */\n this.mediaStates_ = new Map();\n\n /**\n * Set to true once the initial media states have been created.\n *\n * @private {boolean}\n */\n this.startupComplete_ = false;\n\n /**\n * Used for delay and backoff of failure callbacks, so that apps do not\n * retry instantly.\n *\n * @private {shaka.net.Backoff}\n */\n this.failureCallbackBackoff_ = null;\n\n /**\n * Set to true on fatal error. Interrupts fetchAndAppend_().\n *\n * @private {boolean}\n */\n this.fatalError_ = false;\n\n /** @private {!shaka.util.Destroyer} */\n this.destroyer_ = new shaka.util.Destroyer(() => this.doDestroy_());\n\n /** @private {number} */\n this.lastMediaSourceReset_ = Date.now() / 1000;\n\n /**\n * @private {!Map<shaka.extern.Stream, !shaka.media.SegmentPrefetch>}\n */\n this.audioPrefetchMap_ = new Map();\n\n /** @private {!shaka.extern.SpatialVideoInfo} */\n this.spatialVideoInfo_ = {\n projection: null,\n hfov: null,\n };\n\n /** @private {number} */\n this.playRangeStart_ = 0;\n\n /** @private {number} */\n this.playRangeEnd_ = Infinity;\n\n /** @private {?shaka.media.StreamingEngine.MediaState_} */\n this.lastTextMediaStateBeforeUnload_ = null;\n\n /** @private {?shaka.util.Timer} */\n this.updateLiveSeekableRangeTime_ = new shaka.util.Timer(() => {\n if (!this.manifest_ || !this.playerInterface_) {\n return;\n }\n if (!this.manifest_.presentationTimeline.isLive()) {\n this.playerInterface_.mediaSourceEngine.clearLiveSeekableRange();\n if (this.updateLiveSeekableRangeTime_) {\n this.updateLiveSeekableRangeTime_.stop();\n }\n return;\n }\n const startTime = this.manifest_.presentationTimeline.getSeekRangeStart();\n const endTime = this.manifest_.presentationTimeline.getSeekRangeEnd();\n // Some older devices require the range to be greater than 1 or exceptions\n // are thrown, due to an old and buggy implementation.\n if (endTime - startTime > 1) {\n this.playerInterface_.mediaSourceEngine.setLiveSeekableRange(\n startTime, endTime);\n } else {\n this.playerInterface_.mediaSourceEngine.clearLiveSeekableRange();\n }\n });\n\n /** @private {?number} */\n this.boundaryTime_ = null;\n\n /** @private {?shaka.util.Timer} */\n this.crossBoundaryTimer_ = new shaka.util.Timer(() => {\n const video = this.playerInterface_.video;\n if (video.ended) {\n return;\n }\n if (this.boundaryTime_) {\n shaka.log.info('Crossing boundary at', this.boundaryTime_);\n video.currentTime = this.boundaryTime_;\n this.boundaryTime_ = null;\n }\n });\n }\n\n /** @override */\n destroy() {\n return this.destroyer_.destroy();\n }\n\n /**\n * @return {!Promise}\n * @private\n */\n async doDestroy_() {\n const aborts = [];\n\n for (const state of this.mediaStates_.values()) {\n this.cancelUpdate_(state);\n aborts.push(this.abortOperations_(state));\n if (state.segmentPrefetch) {\n state.segmentPrefetch.clearAll();\n state.segmentPrefetch = null;\n }\n }\n for (const prefetch of this.audioPrefetchMap_.values()) {\n prefetch.clearAll();\n }\n\n await Promise.all(aborts);\n\n this.mediaStates_.clear();\n this.audioPrefetchMap_.clear();\n\n this.playerInterface_ = null;\n this.manifest_ = null;\n this.config_ = null;\n if (this.updateLiveSeekableRangeTime_) {\n this.updateLiveSeekableRangeTime_.stop();\n }\n this.updateLiveSeekableRangeTime_ = null;\n if (this.crossBoundaryTimer_) {\n this.crossBoundaryTimer_.stop();\n }\n this.crossBoundaryTimer_ = null;\n }\n\n /**\n * Called by the Player to provide an updated configuration any time it\n * changes. Must be called at least once before start().\n *\n * @param {shaka.extern.StreamingConfiguration} config\n */\n configure(config) {\n this.config_ = config;\n\n // Create separate parameters for backoff during streaming failure.\n\n /** @type {shaka.extern.RetryParameters} */\n const failureRetryParams = {\n // The term \"attempts\" includes the initial attempt, plus all retries.\n // In order to see a delay, there would have to be at least 2 attempts.\n maxAttempts: Math.max(config.retryParameters.maxAttempts, 2),\n baseDelay: config.retryParameters.baseDelay,\n backoffFactor: config.retryParameters.backoffFactor,\n fuzzFactor: config.retryParameters.fuzzFactor,\n timeout: 0, // irrelevant\n stallTimeout: 0, // irrelevant\n connectionTimeout: 0, // irrelevant\n };\n\n // We don't want to ever run out of attempts. The application should be\n // allowed to retry streaming infinitely if it wishes.\n const autoReset = true;\n this.failureCallbackBackoff_ =\n new shaka.net.Backoff(failureRetryParams, autoReset);\n\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n\n // disable audio segment prefetch if this is now set\n if (config.disableAudioPrefetch) {\n const state = this.mediaStates_.get(ContentType.AUDIO);\n if (state && state.segmentPrefetch) {\n state.segmentPrefetch.clearAll();\n state.segmentPrefetch = null;\n }\n\n for (const stream of this.audioPrefetchMap_.keys()) {\n const prefetch = this.audioPrefetchMap_.get(stream);\n prefetch.clearAll();\n this.audioPrefetchMap_.delete(stream);\n }\n }\n // disable text segment prefetch if this is now set\n if (config.disableTextPrefetch) {\n const state = this.mediaStates_.get(ContentType.TEXT);\n if (state && state.segmentPrefetch) {\n state.segmentPrefetch.clearAll();\n state.segmentPrefetch = null;\n }\n }\n\n // disable video segment prefetch if this is now set\n if (config.disableVideoPrefetch) {\n const state = this.mediaStates_.get(ContentType.VIDEO);\n if (state && state.segmentPrefetch) {\n state.segmentPrefetch.clearAll();\n state.segmentPrefetch = null;\n }\n }\n\n // Allow configuring the segment prefetch in middle of the playback.\n for (const type of this.mediaStates_.keys()) {\n const state = this.mediaStates_.get(type);\n if (state.segmentPrefetch) {\n state.segmentPrefetch.resetLimit(config.segmentPrefetchLimit);\n if (!(config.segmentPrefetchLimit > 0)) {\n // ResetLimit is still needed in this case,\n // to abort existing prefetch operations.\n state.segmentPrefetch.clearAll();\n state.segmentPrefetch = null;\n }\n } else if (config.segmentPrefetchLimit > 0) {\n state.segmentPrefetch = this.createSegmentPrefetch_(state.stream);\n }\n }\n\n if (!config.disableAudioPrefetch) {\n this.updatePrefetchMapForAudio_();\n }\n }\n\n\n /**\n * Applies a playback range. This will only affect non-live content.\n *\n * @param {number} playRangeStart\n * @param {number} playRangeEnd\n */\n applyPlayRange(playRangeStart, playRangeEnd) {\n if (!this.manifest_.presentationTimeline.isLive()) {\n this.playRangeStart_ = playRangeStart;\n this.playRangeEnd_ = playRangeEnd;\n }\n }\n\n\n /**\n * Initialize and start streaming.\n *\n * By calling this method, StreamingEngine will start streaming the variant\n * chosen by a prior call to switchVariant(), and optionally, the text stream\n * chosen by a prior call to switchTextStream(). Once the Promise resolves,\n * switch*() may be called freely.\n *\n * @param {!Map<number, shaka.media.SegmentPrefetch>=} segmentPrefetchById\n * If provided, segments prefetched for these streams will be used as needed\n * during playback.\n * @return {!Promise}\n */\n async start(segmentPrefetchById) {\n goog.asserts.assert(this.config_,\n 'StreamingEngine configure() must be called before init()!');\n\n // Setup the initial set of Streams and then begin each update cycle.\n await this.initStreams_(segmentPrefetchById || (new Map()));\n this.destroyer_.ensureNotDestroyed();\n\n shaka.log.debug('init: completed initial Stream setup');\n this.startupComplete_ = true;\n }\n\n /**\n * Get the current variant we are streaming. Returns null if nothing is\n * streaming.\n * @return {?shaka.extern.Variant}\n */\n getCurrentVariant() {\n return this.currentVariant_;\n }\n\n /**\n * Get the text stream we are streaming. Returns null if there is no text\n * streaming.\n * @return {?shaka.extern.Stream}\n */\n getCurrentTextStream() {\n return this.currentTextStream_;\n }\n\n /**\n * Start streaming text, creating a new media state.\n *\n * @param {shaka.extern.Stream} stream\n * @return {!Promise}\n * @private\n */\n async loadNewTextStream_(stream) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n goog.asserts.assert(!this.mediaStates_.has(ContentType.TEXT),\n 'Should not call loadNewTextStream_ while streaming text!');\n this.textStreamSequenceId_++;\n const currentSequenceId = this.textStreamSequenceId_;\n\n try {\n // Clear MediaSource's buffered text, so that the new text stream will\n // properly replace the old buffered text.\n // TODO: Should this happen in unloadTextStream() instead?\n await this.playerInterface_.mediaSourceEngine.clear(ContentType.TEXT);\n } catch (error) {\n if (this.playerInterface_) {\n this.playerInterface_.onError(error);\n }\n }\n\n const mimeType = shaka.util.MimeUtils.getFullType(\n stream.mimeType, stream.codecs);\n this.playerInterface_.mediaSourceEngine.reinitText(\n mimeType, this.manifest_.sequenceMode, stream.external);\n\n const textDisplayer =\n this.playerInterface_.mediaSourceEngine.getTextDisplayer();\n const streamText =\n textDisplayer.isTextVisible() || this.config_.alwaysStreamText;\n\n if (streamText && (this.textStreamSequenceId_ == currentSequenceId)) {\n const state = this.createMediaState_(stream);\n this.mediaStates_.set(ContentType.TEXT, state);\n this.scheduleUpdate_(state, 0);\n }\n }\n\n\n /**\n * Stop fetching text stream when the user chooses to hide the captions.\n */\n unloadTextStream() {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n\n const state = this.mediaStates_.get(ContentType.TEXT);\n if (state) {\n this.cancelUpdate_(state);\n this.abortOperations_(state).catch(() => {});\n this.lastTextMediaStateBeforeUnload_ =\n this.mediaStates_.get(ContentType.TEXT);\n this.mediaStates_.delete(ContentType.TEXT);\n }\n this.currentTextStream_ = null;\n }\n\n /**\n * Set trick play on or off.\n * If trick play is on, related trick play streams will be used when possible.\n * @param {boolean} on\n */\n setTrickPlay(on) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n\n this.updateSegmentIteratorReverse_();\n\n const mediaState = this.mediaStates_.get(ContentType.VIDEO);\n if (!mediaState) {\n return;\n }\n\n const stream = mediaState.stream;\n if (!stream) {\n return;\n }\n\n shaka.log.debug('setTrickPlay', on);\n if (on) {\n const trickModeVideo = stream.trickModeVideo;\n if (!trickModeVideo) {\n return; // Can't engage trick play.\n }\n\n const normalVideo = mediaState.restoreStreamAfterTrickPlay;\n if (normalVideo) {\n return; // Already in trick play.\n }\n\n shaka.log.debug('Engaging trick mode stream', trickModeVideo);\n this.switchInternal_(trickModeVideo, /* clearBuffer= */ false,\n /* safeMargin= */ 0, /* force= */ false);\n\n mediaState.restoreStreamAfterTrickPlay = stream;\n } else {\n const normalVideo = mediaState.restoreStreamAfterTrickPlay;\n if (!normalVideo) {\n return;\n }\n\n shaka.log.debug('Restoring non-trick-mode stream', normalVideo);\n mediaState.restoreStreamAfterTrickPlay = null;\n this.switchInternal_(normalVideo, /* clearBuffer= */ true,\n /* safeMargin= */ 0, /* force= */ false);\n }\n }\n\n\n /**\n * @param {shaka.extern.Variant} variant\n * @param {boolean=} clearBuffer\n * @param {number=} safeMargin\n * @param {boolean=} force\n * If true, reload the variant even if it did not change.\n * @param {boolean=} adaptation\n * If true, update the media state to indicate MediaSourceEngine should\n * reset the timestamp offset to ensure the new track segments are correctly\n * placed on the timeline.\n */\n switchVariant(\n variant, clearBuffer = false, safeMargin = 0, force = false,\n adaptation = false) {\n this.currentVariant_ = variant;\n\n if (!this.startupComplete_) {\n // The selected variant will be used in start().\n return;\n }\n\n if (variant.video) {\n this.switchInternal_(\n variant.video, /* clearBuffer= */ clearBuffer,\n /* safeMargin= */ safeMargin, /* force= */ force,\n /* adaptation= */ adaptation);\n }\n if (variant.audio) {\n this.switchInternal_(\n variant.audio, /* clearBuffer= */ clearBuffer,\n /* safeMargin= */ safeMargin, /* force= */ force,\n /* adaptation= */ adaptation);\n }\n }\n\n\n /**\n * @param {shaka.extern.Stream} textStream\n */\n async switchTextStream(textStream) {\n this.lastTextMediaStateBeforeUnload_ = null;\n this.currentTextStream_ = textStream;\n\n if (!this.startupComplete_) {\n // The selected text stream will be used in start().\n return;\n }\n\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n goog.asserts.assert(textStream && textStream.type == ContentType.TEXT,\n 'Wrong stream type passed to switchTextStream!');\n\n // In HLS it is possible that the mimetype changes when the media\n // playlist is downloaded, so it is necessary to have the updated data\n // here.\n if (!textStream.segmentIndex) {\n await textStream.createSegmentIndex();\n }\n\n this.switchInternal_(\n textStream, /* clearBuffer= */ true,\n /* safeMargin= */ 0, /* force= */ false);\n }\n\n\n /** Reload the current text stream. */\n reloadTextStream() {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n const mediaState = this.mediaStates_.get(ContentType.TEXT);\n if (mediaState) { // Don't reload if there's no text to begin with.\n this.switchInternal_(\n mediaState.stream, /* clearBuffer= */ true,\n /* safeMargin= */ 0, /* force= */ true);\n }\n }\n\n\n /**\n * Handles deferred releases of old SegmentIndexes for the mediaState's\n * content type from a previous update.\n * @param {!shaka.media.StreamingEngine.MediaState_} mediaState\n * @private\n */\n handleDeferredCloseSegmentIndexes_(mediaState) {\n for (const [key, value] of this.deferredCloseSegmentIndex_.entries()) {\n const streamId = /** @type {string} */ (key);\n const closeSegmentIndex = /** @type {!function()} */ (value);\n if (streamId.includes(mediaState.type)) {\n closeSegmentIndex();\n this.deferredCloseSegmentIndex_.delete(streamId);\n }\n }\n }\n\n\n /**\n * Switches to the given Stream. |stream| may be from any Variant.\n *\n * @param {shaka.extern.Stream} stream\n * @param {boolean} clearBuffer\n * @param {number} safeMargin\n * @param {boolean} force\n * If true, reload the text stream even if it did not change.\n * @param {boolean=} adaptation\n * If true, update the media state to indicate MediaSourceEngine should\n * reset the timestamp offset to ensure the new track segments are correctly\n * placed on the timeline.\n * @private\n */\n switchInternal_(stream, clearBuffer, safeMargin, force, adaptation) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n const type = /** @type {!ContentType} */(stream.type);\n const mediaState = this.mediaStates_.get(type);\n\n if (!mediaState && stream.type == ContentType.TEXT) {\n this.loadNewTextStream_(stream);\n return;\n }\n\n goog.asserts.assert(mediaState, 'switch: expected mediaState to exist');\n if (!mediaState) {\n return;\n }\n\n if (mediaState.restoreStreamAfterTrickPlay) {\n shaka.log.debug('switch during trick play mode', stream);\n\n // Already in trick play mode, so stick with trick mode tracks if\n // possible.\n if (stream.trickModeVideo) {\n // Use the trick mode stream, but revert to the new selection later.\n mediaState.restoreStreamAfterTrickPlay = stream;\n stream = stream.trickModeVideo;\n shaka.log.debug('switch found trick play stream', stream);\n } else {\n // There is no special trick mode video for this stream!\n mediaState.restoreStreamAfterTrickPlay = null;\n shaka.log.debug('switch found no special trick play stream');\n }\n }\n\n if (mediaState.stream == stream && !force) {\n const streamTag = shaka.media.StreamingEngine.logPrefix_(mediaState);\n shaka.log.debug('switch: Stream ' + streamTag + ' already active');\n return;\n }\n\n if (this.audioPrefetchMap_.has(stream)) {\n mediaState.segmentPrefetch = this.audioPrefetchMap_.get(stream);\n } else if (mediaState.segmentPrefetch) {\n mediaState.segmentPrefetch.switchStream(stream);\n }\n\n if (stream.type == ContentType.TEXT) {\n // Mime types are allowed to change for text streams.\n // Reinitialize the text parser, but only if we are going to fetch the\n // init segment again.\n const fullMimeType = shaka.util.MimeUtils.getFullType(\n stream.mimeType, stream.codecs);\n this.playerInterface_.mediaSourceEngine.reinitText(\n fullMimeType, this.manifest_.sequenceMode, stream.external);\n }\n\n // Releases the segmentIndex of the old stream.\n // Do not close segment indexes we are prefetching.\n if (!this.audioPrefetchMap_.has(mediaState.stream)) {\n if (mediaState.stream.closeSegmentIndex) {\n if (mediaState.performingUpdate) {\n const oldStreamTag =\n shaka.media.StreamingEngine.logPrefix_(mediaState);\n if (!this.deferredCloseSegmentIndex_.has(oldStreamTag)) {\n // The ongoing update is still using the old stream's segment\n // reference information.\n // If we close the old stream now, the update will not complete\n // correctly.\n // The next onUpdate_() for this content type will resume the\n // closeSegmentIndex() operation for the old stream once the ongoing\n // update has finished, then immediately create a new segment index.\n this.deferredCloseSegmentIndex_.set(\n oldStreamTag, mediaState.stream.closeSegmentIndex);\n }\n } else {\n mediaState.stream.closeSegmentIndex();\n }\n }\n }\n\n const shouldResetMediaSource =\n mediaState.stream.isAudioMuxedInVideo != stream.isAudioMuxedInVideo;\n\n mediaState.stream = stream;\n mediaState.segmentIterator = null;\n mediaState.adaptation = !!adaptation;\n if (stream.dependencyStream) {\n mediaState.dependencyMediaState =\n this.createMediaState_(stream.dependencyStream);\n } else {\n mediaState.dependencyMediaState = null;\n }\n\n const streamTag = shaka.media.StreamingEngine.logPrefix_(mediaState);\n shaka.log.debug('switch: switching to Stream ' + streamTag);\n\n if (shouldResetMediaSource) {\n this.resetMediaSource(/* force= */ true, /* clearBuffer= */ false);\n return;\n }\n\n if (clearBuffer) {\n if (mediaState.clearingBuffer) {\n // We are already going to clear the buffer, but make sure it is also\n // flushed.\n mediaState.waitingToFlushBuffer = true;\n } else if (mediaState.performingUpdate) {\n // We are performing an update, so we have to wait until it's finished.\n // onUpdate_() will call clearBuffer_() when the update has finished.\n // We need to save the safe margin because its value will be needed when\n // clearing the buffer after the update.\n mediaState.waitingToClearBuffer = true;\n mediaState.clearBufferSafeMargin = safeMargin;\n mediaState.waitingToFlushBuffer = true;\n } else {\n // Cancel the update timer, if any.\n this.cancelUpdate_(mediaState);\n // Clear right away.\n this.clearBuffer_(mediaState, /* flush= */ true, safeMargin)\n .catch((error) => {\n if (this.playerInterface_) {\n goog.asserts.assert(error instanceof shaka.util.Error,\n 'Wrong error type!');\n this.playerInterface_.onError(error);\n }\n });\n }\n } else {\n if (!mediaState.performingUpdate && !mediaState.updateTimer) {\n this.scheduleUpdate_(mediaState, 0);\n }\n }\n\n this.makeAbortDecision_(mediaState).catch((error) => {\n if (this.playerInterface_) {\n goog.asserts.assert(error instanceof shaka.util.Error,\n 'Wrong error type!');\n this.playerInterface_.onError(error);\n }\n });\n }\n\n\n /**\n * Decide if it makes sense to abort the current operation, and abort it if\n * so.\n *\n * @param {!shaka.media.StreamingEngine.MediaState_} mediaState\n * @private\n */\n async makeAbortDecision_(mediaState) {\n // If the operation is completed, it will be set to null, and there's no\n // need to abort the request.\n if (!mediaState.operation) {\n return;\n }\n\n const originalStream = mediaState.stream;\n const originalOperation = mediaState.operation;\n\n if (!originalStream.segmentIndex) {\n // Create the new segment index so the time taken is accounted for when\n // deciding whether to abort.\n await originalStream.createSegmentIndex();\n }\n\n if (mediaState.operation != originalOperation) {\n // The original operation completed while we were getting a segment index,\n // so there's nothing to do now.\n return;\n }\n\n if (mediaState.stream != originalStream) {\n // The stream changed again while we were getting a segment index. We\n // can't carry out this check, since another one might be in progress by\n // now.\n return;\n }\n\n goog.asserts.assert(mediaState.stream.segmentIndex,\n 'Segment index should exist by now!');\n\n if (this.shouldAbortCurrentRequest_(mediaState)) {\n shaka.log.info('Aborting current segment request.');\n mediaState.operation.abort();\n }\n }\n\n /**\n * Returns whether we should abort the current request.\n *\n * @param {!shaka.media.StreamingEngine.MediaState_} mediaState\n * @return {boolean}\n * @private\n */\n shouldAbortCurrentRequest_(mediaState) {\n goog.asserts.assert(mediaState.operation,\n 'Abort logic requires an ongoing operation!');\n goog.asserts.assert(mediaState.stream && mediaState.stream.segmentIndex,\n 'Abort logic requires a segment index');\n\n const presentationTime = this.playerInterface_.getPresentationTime();\n const bufferEnd =\n this.playerInterface_.mediaSourceEngine.bufferEnd(mediaState.type);\n\n // The next segment to append from the current stream. This doesn't\n // account for a pending network request and will likely be different from\n // that since we just switched.\n const timeNeeded = this.getTimeNeeded_(mediaState, presentationTime);\n const index = mediaState.stream.segmentIndex.find(timeNeeded);\n const newSegment =\n index == null ? null : mediaState.stream.segmentIndex.get(index);\n\n let newSegmentSize = newSegment ? newSegment.getSize() : null;\n if (newSegment && !newSegmentSize) {\n // compute approximate segment size using stream bandwidth\n const duration = newSegment.getEndTime() - newSegment.getStartTime();\n const bandwidth = mediaState.stream.bandwidth || 0;\n // bandwidth is in bits per second, and the size is in bytes\n newSegmentSize = duration * bandwidth / 8;\n }\n\n if (!newSegmentSize) {\n return false;\n }\n\n // When switching, we'll need to download the init segment.\n const init = newSegment.initSegmentReference;\n if (init) {\n newSegmentSize += init.getSize() || 0;\n }\n\n const bandwidthEstimate = this.playerInterface_.getBandwidthEstimate();\n\n // The estimate is in bits per second, and the size is in bytes. The time\n // remaining is in seconds after this calculation.\n const timeToFetchNewSegment = (newSegmentSize * 8) / bandwidthEstimate;\n\n // If the new segment can be finished in time without risking a buffer\n // underflow, we should abort the old one and switch.\n const bufferedAhead = (bufferEnd || 0) - presentationTime;\n const safetyBuffer = this.config_.rebufferingGoal;\n const safeBufferedAhead = bufferedAhead - safetyBuffer;\n if (timeToFetchNewSegment < safeBufferedAhead) {\n return true;\n }\n\n // If the thing we want to switch to will be done more quickly than what\n // we've got in progress, we should abort the old one and switch.\n const bytesRemaining = mediaState.operation.getBytesRemaining();\n if (bytesRemaining > newSegmentSize) {\n return true;\n }\n\n // Otherwise, complete the operation in progress.\n return false;\n }\n\n\n /**\n * Notifies the StreamingEngine that the playhead has moved to a valid time\n * within the presentation timeline.\n */\n seeked() {\n if (!this.playerInterface_) {\n // Already destroyed.\n return;\n }\n\n const presentationTime = this.playerInterface_.getPresentationTime();\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n const newTimeIsBuffered = (type) => {\n return this.playerInterface_.mediaSourceEngine.isBuffered(\n type, presentationTime);\n };\n\n let streamCleared = false;\n for (const type of this.mediaStates_.keys()) {\n const mediaState = this.mediaStates_.get(type);\n const logPrefix = shaka.media.StreamingEngine.logPrefix_(mediaState);\n\n if (!newTimeIsBuffered(type)) {\n if (mediaState.segmentPrefetch) {\n mediaState.segmentPrefetch.resetPosition();\n }\n if (mediaState.type === ContentType.AUDIO) {\n for (const prefetch of this.audioPrefetchMap_.values()) {\n prefetch.resetPosition();\n }\n }\n mediaState.segmentIterator = null;\n const bufferEnd =\n this.playerInterface_.mediaSourceEngine.bufferEnd(type);\n const somethingBuffered = bufferEnd != null;\n\n // Don't clear the buffer unless something is buffered. This extra\n // check prevents extra, useless calls to clear the buffer.\n if (somethingBuffered || mediaState.performingUpdate) {\n this.forceClearBuffer_(mediaState);\n streamCleared = true;\n }\n\n // If there is an operation in progress, stop it now.\n if (mediaState.operation) {\n mediaState.operation.abort();\n shaka.log.debug(logPrefix, 'Aborting operation due to seek');\n mediaState.operation = null;\n }\n\n // The pts has shifted from the seek, invalidating captions currently\n // in the text buffer. Thus, clear and reset the caption parser.\n if (type === ContentType.TEXT) {\n this.playerInterface_.mediaSourceEngine.resetCaptionParser();\n }\n\n // Mark the media state as having seeked, so that the new buffers know\n // that they will need to be at a new position (for sequence mode).\n mediaState.seeked = true;\n }\n }\n\n if (!streamCleared) {\n shaka.log.debug(\n '(all): seeked: buffered seek: presentationTime=' + presentationTime);\n }\n }\n\n\n /**\n * Clear the buffer for a given stream. Unlike clearBuffer_, this will handle\n * cases where a MediaState is performing an update. After this runs, the\n * MediaState will have a pending update.\n * @param {!shaka.media.StreamingEngine.MediaState_} mediaState\n * @private\n */\n forceClearBuffer_(mediaState) {\n const logPrefix = shaka.media.StreamingEngine.logPrefix_(mediaState);\n\n if (mediaState.clearingBuffer) {\n // We're already clearing the buffer, so we don't need to clear the\n // buffer again.\n shaka.log.debug(logPrefix, 'clear: already clearing the buffer');\n return;\n }\n\n if (mediaState.waitingToClearBuffer) {\n // May not be performing an update, but an update will still happen.\n // See: https://github.com/shaka-project/shaka-player/issues/334\n shaka.log.debug(logPrefix, 'clear: already waiting');\n return;\n }\n\n if (mediaState.performingUpdate) {\n // We are performing an update, so we have to wait until it's finished.\n // onUpdate_() will call clearBuffer_() when the update has finished.\n shaka.log.debug(logPrefix, 'clear: currently updating');\n mediaState.waitingToClearBuffer = true;\n // We can set the offset to zero to remember that this was a call to\n // clearAllBuffers.\n mediaState.clearBufferSafeMargin = 0;\n return;\n }\n\n const type = mediaState.type;\n if (this.playerInterface_.mediaSourceEngine.bufferStart(type) == null) {\n // Nothing buffered.\n shaka.log.debug(logPrefix, 'clear: nothing buffered');\n if (mediaState.updateTimer == null) {\n // Note: an update cycle stops when we buffer to the end of the\n // presentation, or when we raise an error.\n this.scheduleUpdate_(mediaState, 0);\n }\n return;\n }\n\n // An update may be scheduled, but we can just cancel it and clear the\n // buffer right away. Note: clearBuffer_() will schedule the next update.\n shaka.log.debug(logPrefix, 'clear: handling right now');\n this.cancelUpdate_(mediaState);\n this.clearBuffer_(mediaState, /* flush= */ false, 0).catch((error) => {\n if (this.playerInterface_) {\n goog.asserts.assert(error instanceof shaka.util.Error,\n 'Wrong error type!');\n this.playerInterface_.onError(error);\n }\n });\n }\n\n\n /**\n * Initializes the initial streams and media states. This will schedule\n * updates for the given types.\n *\n * @param {!Map<number, shaka.media.SegmentPrefetch>} segmentPrefetchById\n * @return {!Promise}\n * @private\n */\n async initStreams_(segmentPrefetchById) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n\n goog.asserts.assert(this.config_,\n 'StreamingEngine configure() must be called before init()!');\n\n if (!this.currentVariant_) {\n shaka.log.error('init: no Streams chosen');\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.STREAMING,\n shaka.util.Error.Code.STREAMING_ENGINE_STARTUP_INVALID_STATE);\n }\n\n /**\n * @type {!Map<shaka.util.ManifestParserUtils.ContentType,\n * shaka.extern.Stream>}\n */\n const streamsByType = new Map();\n /** @type {!Set<shaka.extern.Stream>} */\n const streams = new Set();\n\n if (this.currentVariant_.audio) {\n streamsByType.set(ContentType.AUDIO, this.currentVariant_.audio);\n streams.add(this.currentVariant_.audio);\n }\n\n if (this.currentVariant_.video) {\n streamsByType.set(ContentType.VIDEO, this.currentVariant_.video);\n streams.add(this.currentVariant_.video);\n }\n\n if (this.currentTextStream_) {\n streamsByType.set(ContentType.TEXT, this.currentTextStream_);\n streams.add(this.currentTextStream_);\n }\n\n // Init MediaSourceEngine.\n const mediaSourceEngine = this.playerInterface_.mediaSourceEngine;\n\n await mediaSourceEngine.init(streamsByType,\n this.manifest_.sequenceMode,\n this.manifest_.type,\n this.manifest_.ignoreManifestTimestampsInSegmentsMode,\n );\n this.destroyer_.ensureNotDestroyed();\n\n this.updateDuration();\n\n for (const type of streamsByType.keys()) {\n const stream = streamsByType.get(type);\n if (!this.mediaStates_.has(type)) {\n const mediaState = this.createMediaState_(stream);\n if (segmentPrefetchById.has(stream.id)) {\n const segmentPrefetch = segmentPrefetchById.get(stream.id);\n segmentPrefetch.replaceFetchDispatcher(\n (reference, stream, streamDataCallback) => {\n return this.dispatchFetch_(\n reference, stream, streamDataCallback);\n });\n mediaState.segmentPrefetch = segmentPrefetch;\n }\n this.mediaStates_.set(type, mediaState);\n this.scheduleUpdate_(mediaState, 0);\n }\n }\n }\n\n\n /**\n * Creates a media state.\n *\n * @param {shaka.extern.Stream} stream\n * @return {shaka.media.StreamingEngine.MediaState_}\n * @private\n */\n createMediaState_(stream) {\n /** @type {!shaka.media.StreamingEngine.MediaState_} */\n const mediaState = {\n stream,\n type: /** @type {shaka.util.ManifestParserUtils.ContentType} */(\n stream.type),\n segmentIterator: null,\n segmentPrefetch: this.createSegmentPrefetch_(stream),\n lastSegmentReference: null,\n lastInitSegmentReference: null,\n lastTimestampOffset: null,\n lastAppendWindowStart: null,\n lastAppendWindowEnd: null,\n lastCodecs: null,\n lastMimeType: null,\n restoreStreamAfterTrickPlay: null,\n endOfStream: false,\n performingUpdate: false,\n updateTimer: null,\n waitingToClearBuffer: false,\n clearBufferSafeMargin: 0,\n waitingToFlushBuffer: false,\n clearingBuffer: false,\n // The playhead might be seeking on startup, if a start time is set, so\n // start \"seeked\" as true.\n seeked: true,\n adaptation: false,\n recovering: false,\n hasError: false,\n operation: null,\n dependencyMediaState: null,\n };\n if (stream.dependencyStream) {\n mediaState.dependencyMediaState =\n this.createMediaState_(stream.dependencyStream);\n }\n return mediaState;\n }\n\n /**\n * Creates a media state.\n *\n * @param {shaka.extern.Stream} stream\n * @return {shaka.media.SegmentPrefetch | null}\n * @private\n */\n createSegmentPrefetch_(stream) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n if (stream.type === ContentType.VIDEO &&\n this.config_.disableVideoPrefetch) {\n return null;\n }\n if (stream.type === ContentType.AUDIO &&\n this.config_.disableAudioPrefetch) {\n return null;\n }\n const MimeUtils = shaka.util.MimeUtils;\n const CEA608_MIME = MimeUtils.CEA608_CLOSED_CAPTION_MIMETYPE;\n const CEA708_MIME = MimeUtils.CEA708_CLOSED_CAPTION_MIMETYPE;\n if (stream.type === ContentType.TEXT &&\n (stream.mimeType == CEA608_MIME || stream.mimeType == CEA708_MIME)) {\n return null;\n }\n if (stream.type === ContentType.TEXT &&\n this.config_.disableTextPrefetch) {\n return null;\n }\n if (this.audioPrefetchMap_.has(stream)) {\n return this.audioPrefetchMap_.get(stream);\n }\n const type = /** @type {!shaka.util.ManifestParserUtils.ContentType} */\n (stream.type);\n const mediaState = this.mediaStates_.get(type);\n const currentSegmentPrefetch = mediaState && mediaState.segmentPrefetch;\n if (currentSegmentPrefetch &&\n stream === currentSegmentPrefetch.getStream()) {\n return currentSegmentPrefetch;\n }\n if (this.config_.segmentPrefetchLimit > 0) {\n const reverse = this.playerInterface_.getPlaybackRate() < 0;\n return new shaka.media.SegmentPrefetch(\n this.config_.segmentPrefetchLimit,\n stream,\n (reference, stream, streamDataCallback) => {\n return this.dispatchFetch_(reference, stream, streamDataCallback);\n },\n reverse);\n }\n return null;\n }\n\n /**\n * Populates the prefetch map depending on the configuration\n * @private\n */\n updatePrefetchMapForAudio_() {\n const prefetchLimit = this.config_.segmentPrefetchLimit;\n const prefetchLanguages = this.config_.prefetchAudioLanguages;\n const LanguageUtils = shaka.util.LanguageUtils;\n\n for (const variant of this.manifest_.variants) {\n if (!variant.audio) {\n continue;\n }\n\n if (this.audioPrefetchMap_.has(variant.audio)) {\n // if we already have a segment prefetch,\n // update it's prefetch limit and if the new limit isn't positive,\n // remove the segment prefetch from our prefetch map.\n const prefetch = this.audioPrefetchMap_.get(variant.audio);\n prefetch.resetLimit(prefetchLimit);\n if (!(prefetchLimit > 0) ||\n !prefetchLanguages.some(\n (lang) => LanguageUtils.areLanguageCompatible(\n variant.audio.language, lang))\n ) {\n const type = /** @type {!shaka.util.ManifestParserUtils.ContentType}*/\n (variant.audio.type);\n const mediaState = this.mediaStates_.get(type);\n const currentSegmentPrefetch = mediaState &&\n mediaState.segmentPrefetch;\n // if this prefetch isn't the current one, we want to clear it\n if (prefetch !== currentSegmentPrefetch) {\n prefetch.clearAll();\n }\n this.audioPrefetchMap_.delete(variant.audio);\n }\n continue;\n }\n\n // don't try to create a new segment prefetch if the limit isn't positive.\n if (prefetchLimit <= 0) {\n continue;\n }\n\n // only create a segment prefetch if its language is configured\n // to be prefetched\n if (!prefetchLanguages.some(\n (lang) => LanguageUtils.areLanguageCompatible(\n variant.audio.language, lang))) {\n continue;\n }\n\n // use the helper to create a segment prefetch to ensure that existing\n // objects are reused.\n const segmentPrefetch = this.createSegmentPrefetch_(variant.audio);\n\n // if a segment prefetch wasn't created, skip the rest\n if (!segmentPrefetch) {\n continue;\n }\n\n if (!variant.audio.segmentIndex) {\n variant.audio.createSegmentIndex();\n }\n\n this.audioPrefetchMap_.set(variant.audio, segmentPrefetch);\n }\n }\n\n /**\n * Sets the MediaSource's duration.\n */\n updateDuration() {\n const isInfiniteLiveStreamDurationSupported =\n shaka.media.Capabilities.isInfiniteLiveStreamDurationSupported();\n const duration = this.manifest_.presentationTimeline.getDuration();\n if (duration < Infinity) {\n if (isInfiniteLiveStreamDurationSupported) {\n if (this.updateLiveSeekableRangeTime_) {\n this.updateLiveSeekableRangeTime_.stop();\n }\n this.playerInterface_.mediaSourceEngine.clearLiveSeekableRange();\n }\n this.playerInterface_.mediaSourceEngine.setDuration(duration);\n } else {\n // Set the media source live duration as Infinity if the platform supports\n // it.\n if (isInfiniteLiveStreamDurationSupported) {\n if (this.updateLiveSeekableRangeTime_) {\n this.updateLiveSeekableRangeTime_.tickEvery(/* seconds= */ 0.5);\n }\n this.playerInterface_.mediaSourceEngine.setDuration(Infinity);\n } else {\n // Not all platforms support infinite durations, so set a finite\n // duration so we can append segments and so the user agent can seek.\n this.playerInterface_.mediaSourceEngine.setDuration(Math.pow(2, 32));\n }\n }\n }\n\n\n /**\n * Called when |mediaState|'s update timer has expired.\n *\n * @param {!shaka.media.StreamingEngine.MediaState_} mediaState\n * @suppress {suspiciousCode} The compiler assumes that updateTimer can't\n * change during the await, and so complains about the null check.\n * @private\n */\n async onUpdate_(mediaState) {\n this.destroyer_.ensureNotDestroyed();\n\n const logPrefix = shaka.media.StreamingEngine.logPrefix_(mediaState);\n\n // Sanity check.\n goog.asserts.assert(\n !mediaState.performingUpdate && (mediaState.updateTimer != null),\n logPrefix + ' unexpected call to onUpdate_()');\n if (mediaState.performingUpdate || (mediaState.updateTimer == null)) {\n return;\n }\n\n goog.asserts.assert(\n !mediaState.clearingBuffer, logPrefix +\n ' onUpdate_() should not be called when clearing the buffer');\n if (mediaState.clearingBuffer) {\n return;\n }\n\n mediaState.updateTimer = null;\n\n // Handle pending buffer clears.\n if (mediaState.waitingToClearBuffer) {\n // Note: clearBuffer_() will schedule the next update.\n shaka.log.debug(logPrefix, 'skipping update and clearing the buffer');\n await this.clearBuffer_(\n mediaState, mediaState.waitingToFlushBuffer,\n mediaState.clearBufferSafeMargin);\n return;\n }\n\n // If stream switches happened during the previous update_() for this\n // content type, close out the old streams that were switched away from.\n // Even if we had switched away from the active stream 'A' during the\n // update_(), e.g. (A -> B -> A), closing 'A' is permissible here since we\n // will immediately re-create it in the logic below.\n this.handleDeferredCloseSegmentIndexes_(mediaState);\n\n // Make sure the segment index exists. If not, create the segment index.\n if (!mediaState.stream.segmentIndex) {\n const thisStream = mediaState.stream;\n\n try {\n await mediaState.stream.createSegmentIndex();\n } catch (error) {\n await this.handleStreamingError_(mediaState, error);\n return;\n }\n\n if (thisStream != mediaState.stream) {\n // We switched streams while in the middle of this async call to\n // createSegmentIndex. Abandon this update and schedule a new one if\n // there's not already one pending.\n // Releases the segmentIndex of the old stream.\n if (thisStream.closeSegmentIndex) {\n goog.asserts.assert(!mediaState.stream.segmentIndex,\n 'mediaState.stream should not have segmentIndex yet.');\n thisStream.closeSegmentIndex();\n }\n if (!mediaState.performingUpdate && !mediaState.updateTimer) {\n this.scheduleUpdate_(mediaState, 0);\n }\n return;\n }\n }\n\n // Update the MediaState.\n try {\n const delay = this.update_(mediaState);\n if (delay != null) {\n this.scheduleUpdate_(mediaState, delay);\n mediaState.hasError = false;\n }\n } catch (error) {\n await this.handleStreamingError_(mediaState, error);\n return;\n }\n\n const mediaStates = Array.from(this.mediaStates_.values());\n\n // Check if we've buffered to the end of the presentation. We delay adding\n // the audio and video media states, so it is possible for the text stream\n // to be the only state and buffer to the end. So we need to wait until we\n // have completed startup to determine if we have reached the end.\n if (this.startupComplete_ &&\n mediaStates.every((ms) => ms.endOfStream)) {\n shaka.log.v1(logPrefix, 'calling endOfStream()...');\n await this.playerInterface_.mediaSourceEngine.endOfStream();\n this.destroyer_.ensureNotDestroyed();\n\n // If the media segments don't reach the end, then we need to update the\n // timeline duration to match the final media duration to avoid\n // buffering forever at the end.\n // We should only do this if the duration needs to shrink.\n // Growing it by less than 1ms can actually cause buffering on\n // replay, as in https://github.com/shaka-project/shaka-player/issues/979\n // On some platforms, this can spuriously be 0, so ignore this case.\n // https://github.com/shaka-project/shaka-player/issues/1967,\n const duration = this.playerInterface_.mediaSourceEngine.getDuration();\n if (duration != 0 &&\n duration < this.manifest_.presentationTimeline.getDuration()) {\n this.manifest_.presentationTimeline.setDuration(duration);\n }\n }\n }\n\n\n /**\n * Updates the given MediaState.\n *\n * @param {shaka.media.StreamingEngine.MediaState_} mediaState\n * @return {?number} The number of seconds to wait until updating again or\n * null if another update does not need to be scheduled.\n * @private\n */\n update_(mediaState) {\n goog.asserts.assert(this.manifest_, 'manifest_ should not be null');\n goog.asserts.assert(this.config_, 'config_ should not be null');\n\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n\n // Do not schedule update for closed captions text mediaState, since closed\n // captions are embedded in video streams.\n if (shaka.media.StreamingEngine.isEmbeddedText_(mediaState)) {\n this.playerInterface_.mediaSourceEngine.setSelectedClosedCaptionId(\n mediaState.stream.originalId || '');\n return null;\n } else if (mediaState.type == ContentType.TEXT) {\n // Disable embedded captions if not desired (e.g. if transitioning from\n // embedded to not-embedded captions).\n this.playerInterface_.mediaSourceEngine.clearSelectedClosedCaptionId();\n }\n\n if (mediaState.stream.isAudioMuxedInVideo) {\n return null;\n }\n\n // Update updateIntervalSeconds according to our current playbackrate,\n // and always considering a minimum of 1.\n const updateIntervalSeconds = this.config_.updateIntervalSeconds /\n Math.max(1, Math.abs(this.playerInterface_.getPlaybackRate()));\n\n if (!this.playerInterface_.mediaSourceEngine.isStreamingAllowed() &&\n mediaState.type != ContentType.TEXT) {\n // It is not allowed to add segments yet, so we schedule an update to\n // check again later. So any prediction we make now could be terribly\n // invalid soon.\n return updateIntervalSeconds / 2;\n }\n\n const logPrefix = shaka.media.StreamingEngine.logPrefix_(mediaState);\n\n // Compute how far we've buffered ahead of the playhead.\n const presentationTime = this.playerInterface_.getPresentationTime();\n\n if (mediaState.type === ContentType.AUDIO) {\n // evict all prefetched segments that are before the presentationTime\n for (const stream of this.audioPrefetchMap_.keys()) {\n const prefetch = this.audioPrefetchMap_.get(stream);\n prefetch.evict(presentationTime, /* clearInitSegments= */ true);\n prefetch.prefetchSegmentsByTime(presentationTime);\n }\n }\n\n // Get the next timestamp we need.\n const timeNeeded = this.getTimeNeeded_(mediaState, presentationTime);\n shaka.log.v2(logPrefix, 'timeNeeded=' + timeNeeded);\n\n // Get the amount of content we have buffered, accounting for drift. This\n // is only used to determine if we have meet the buffering goal. This\n // should be the same method that PlayheadObserver uses.\n const bufferedAhead =\n this.playerInterface_.mediaSourceEngine.bufferedAheadOf(\n mediaState.type, presentationTime);\n\n shaka.log.v2(logPrefix,\n 'update_:',\n 'presentationTime=' + presentationTime,\n 'bufferedAhead=' + bufferedAhead);\n\n const unscaledBufferingGoal = Math.max(\n this.config_.rebufferingGoal, this.config_.bufferingGoal);\n\n const scaledBufferingGoal = Math.max(1,\n unscaledBufferingGoal * this.bufferingScale_);\n\n // Check if we've buffered to the end of the presentation.\n const timeUntilEnd =\n this.manifest_.presentationTimeline.getDuration() - timeNeeded;\n const oneMicrosecond = 1e-6;\n\n const bufferEnd =\n this.playerInterface_.mediaSourceEngine.bufferEnd(mediaState.type);\n\n if (timeUntilEnd < oneMicrosecond && !!bufferEnd) {\n // We shouldn't rebuffer if the playhead is close to the end of the\n // presentation.\n shaka.log.debug(logPrefix, 'buffered to end of presentation');\n mediaState.endOfStream = true;\n\n if (mediaState.type == ContentType.VIDEO) {\n // Since the text stream of CEA closed captions doesn't have update\n // timer, we have to set the text endOfStream based on the video\n // stream's endOfStream state.\n const textState = this.mediaStates_.get(ContentType.TEXT);\n if (textState &&\n shaka.media.StreamingEngine.isEmbeddedText_(textState)) {\n textState.endOfStream = true;\n }\n }\n return null;\n }\n mediaState.endOfStream = false;\n\n // If we've buffered to the buffering goal then schedule an update.\n if (bufferedAhead >= scaledBufferingGoal) {\n shaka.log.v2(logPrefix, 'buffering goal met');\n\n // Do not try to predict the next update. Just poll according to\n // configuration (seconds).\n return updateIntervalSeconds / 2;\n }\n\n // Lack of segment iterator is the best indicator stream has changed.\n const streamChanged = !mediaState.segmentIterator;\n const reference = this.getSegmentReferenceNeeded_(\n mediaState, presentationTime, bufferEnd);\n if (!reference) {\n // The segment could not be found, does not exist, or is not available.\n // In any case just try again... if the manifest is incomplete or is not\n // being updated then we'll idle forever; otherwise, we'll end up getting\n // a SegmentReference eventually.\n return updateIntervalSeconds;\n }\n // Get media state adaptation and reset this value. By guarding it during\n // actual stream change we ensure it won't be cleaned by accident on regular\n // append.\n let adaptation = false;\n if (streamChanged && mediaState.adaptation) {\n adaptation = true;\n mediaState.adaptation = false;\n }\n\n // Do not let any one stream get far ahead of any other.\n let minTimeNeeded = Infinity;\n const mediaStates = Array.from(this.mediaStates_.values());\n for (const otherState of mediaStates) {\n // Do not consider embedded captions in this calculation. It could lead\n // to hangs in streaming.\n if (shaka.media.StreamingEngine.isEmbeddedText_(otherState)) {\n continue;\n }\n // If there is no next segment, ignore this stream. This happens with\n // text when there's a Period with no text in it.\n if (otherState.segmentIterator && !otherState.segmentIterator.current()) {\n continue;\n }\n\n const timeNeeded = this.getTimeNeeded_(otherState, presentationTime);\n minTimeNeeded = Math.min(minTimeNeeded, timeNeeded);\n }\n\n const maxSegmentDuration =\n this.manifest_.presentationTimeline.getMaxSegmentDuration();\n const maxRunAhead = maxSegmentDuration *\n shaka.media.StreamingEngine.MAX_RUN_AHEAD_SEGMENTS_;\n if (timeNeeded >= minTimeNeeded + maxRunAhead) {\n // Wait and give other media types time to catch up to this one.\n // For example, let video buffering catch up to audio buffering before\n // fetching another audio segment.\n shaka.log.v2(logPrefix, 'waiting for other streams to buffer');\n return updateIntervalSeconds;\n }\n\n const CrossBoundaryStrategy = shaka.config.CrossBoundaryStrategy;\n if (this.config_.crossBoundaryStrategy !== CrossBoundaryStrategy.KEEP &&\n this.discardReferenceByBoundary_(mediaState, reference)) {\n // Return null as we do not want to fetch and append segments outside\n // of the current boundary.\n return null;\n }\n\n if (mediaState.segmentPrefetch && mediaState.segmentIterator &&\n !this.audioPrefetchMap_.has(mediaState.stream)) {\n mediaState.segmentPrefetch.evict(reference.startTime);\n mediaState.segmentPrefetch.prefetchSegmentsByTime(reference.startTime)\n // We're treating this call as sync here, so ignore async errors\n // to not propagate them further.\n .catch(() => {});\n }\n\n const p = this.fetchAndAppend_(mediaState, presentationTime, reference,\n adaptation);\n p.catch(() => {}); // TODO(#1993): Handle asynchronous errors.\n if (mediaState.dependencyMediaState) {\n this.fetchAndAppendDependency_(\n mediaState.dependencyMediaState, presentationTime);\n }\n return null;\n }\n\n\n /**\n * Gets the next timestamp needed. Returns the playhead's position if the\n * buffer is empty; otherwise, returns the time at which the last segment\n * appended ends.\n *\n * @param {shaka.media.StreamingEngine.MediaState_} mediaState\n * @param {number} presentationTime\n * @return {number} The next timestamp needed.\n * @private\n */\n getTimeNeeded_(mediaState, presentationTime) {\n // Get the next timestamp we need. We must use |lastSegmentReference|\n // to determine this and not the actual buffer for two reasons:\n // 1. Actual segments end slightly before their advertised end times, so\n // the next timestamp we need is actually larger than |bufferEnd|.\n // 2. There may be drift (the timestamps in the segments are ahead/behind\n // of the timestamps in the manifest), but we need drift-free times\n // when comparing times against the presentation timeline.\n if (!mediaState.lastSegmentReference) {\n return presentationTime;\n }\n\n return mediaState.lastSegmentReference.endTime;\n }\n\n\n /**\n * Gets the SegmentReference of the next segment needed.\n *\n * @param {shaka.media.StreamingEngine.MediaState_} mediaState\n * @param {number} presentationTime\n * @param {?number} bufferEnd\n * @return {shaka.media.SegmentReference} The SegmentReference of the\n * next segment needed. Returns null if a segment could not be found, does\n * not exist, or is not available.\n * @private\n */\n getSegmentReferenceNeeded_(mediaState, presentationTime, bufferEnd) {\n const logPrefix = shaka.media.StreamingEngine.logPrefix_(mediaState);\n goog.asserts.assert(\n mediaState.stream.segmentIndex,\n 'segment index should have been generated already');\n\n if (mediaState.segmentIterator) {\n // Something is buffered from the same Stream. Use the current position\n // in the segment index. This is updated via next() after each segment is\n // appended.\n let ref = mediaState.segmentIterator.current();\n if (ref && mediaState.lastSegmentReference) {\n // In HLS sometimes the segment iterator adds or removes segments very\n // quickly, so we have to be sure that we do not add the last segment\n // again, tolerating a difference of 1ms.\n const isDiffNegligible = (a, b) => Math.abs(a - b) < 0.001;\n const lastStartTime = mediaState.lastSegmentReference.startTime;\n if (isDiffNegligible(lastStartTime, ref.startTime)) {\n ref = mediaState.segmentIterator.next().value;\n }\n }\n return ref;\n } else if (mediaState.lastSegmentReference || bufferEnd) {\n // Something is buffered from another Stream.\n const time = mediaState.lastSegmentReference ?\n mediaState.lastSegmentReference.endTime :\n bufferEnd;\n goog.asserts.assert(time != null, 'Should have a time to search');\n shaka.log.v1(\n logPrefix, 'looking up segment from new stream endTime:', time);\n\n const reverse = this.playerInterface_.getPlaybackRate() < 0;\n if (mediaState.stream.segmentIndex) {\n mediaState.segmentIterator =\n mediaState.stream.segmentIndex.getIteratorForTime(\n time, /* allowNonIndependent= */ false, reverse);\n }\n const ref = mediaState.segmentIterator &&\n mediaState.segmentIterator.next().value;\n if (ref == null) {\n shaka.log.warning(logPrefix, 'cannot find segment', 'endTime:', time);\n }\n return ref;\n } else {\n // Nothing is buffered. Start at the playhead time.\n\n // If there's positive drift then we need to adjust the lookup time, and\n // may wind up requesting the previous segment to be safe.\n // inaccurateManifestTolerance should be 0 for low latency streaming.\n const inaccurateTolerance = this.manifest_.sequenceMode ?\n 0 : this.config_.inaccurateManifestTolerance;\n const lookupTime = Math.max(presentationTime - inaccurateTolerance, 0);\n\n shaka.log.v1(logPrefix, 'looking up segment',\n 'lookupTime:', lookupTime,\n 'presentationTime:', presentationTime);\n\n const reverse = this.playerInterface_.getPlaybackRate() < 0;\n let ref = null;\n if (inaccurateTolerance) {\n if (mediaState.stream.segmentIndex) {\n mediaState.segmentIterator =\n mediaState.stream.segmentIndex.getIteratorForTime(\n lookupTime, /* allowNonIndependent= */ false, reverse);\n }\n ref = mediaState.segmentIterator &&\n mediaState.segmentIterator.next().value;\n }\n if (!ref) {\n // If we can't find a valid segment with the drifted time, look for a\n // segment with the presentation time.\n if (mediaState.stream.segmentIndex) {\n mediaState.segmentIterator =\n mediaState.stream.segmentIndex.getIteratorForTime(\n presentationTime, /* allowNonIndependent= */ false, reverse);\n }\n ref = mediaState.segmentIterator &&\n mediaState.segmentIterator.next().value;\n }\n if (ref == null) {\n shaka.log.warning(logPrefix, 'cannot find segment',\n 'lookupTime:', lookupTime,\n 'presentationTime:', presentationTime);\n }\n return ref;\n }\n }\n\n\n /**\n * Fetches and appends the given segment. Sets up the given MediaState's\n * associated SourceBuffer and evicts segments if either are required\n * beforehand. Schedules another update after completing successfully.\n *\n * @param {!shaka.media.StreamingEngine.MediaState_} mediaState\n * @param {number} presentationTime\n * @param {!shaka.media.SegmentReference} reference\n * @param {boolean} adaptation\n * @private\n */\n async fetchAndAppend_(mediaState, presentationTime, reference, adaptation) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n const StreamingEngine = shaka.media.StreamingEngine;\n const logPrefix = StreamingEngine.logPrefix_(mediaState);\n\n shaka.log.v1(logPrefix,\n 'fetchAndAppend_:',\n 'presentationTime=' + presentationTime,\n 'reference.startTime=' + reference.startTime,\n 'reference.endTime=' + reference.endTime);\n\n // Subtlety: The playhead may move while asynchronous update operations are\n // in progress, so we should avoid calling playhead.getTime() in any\n // callbacks. Furthermore, switch() or seeked() may be called at any time,\n // so we store the old iterator. This allows the mediaState to change and\n // we'll update the old iterator.\n const stream = mediaState.stream;\n const iter = mediaState.segmentIterator;\n\n mediaState.performingUpdate = true;\n\n try {\n if (reference.getStatus() ==\n shaka.media.SegmentReference.Status.MISSING) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.RECOVERABLE,\n shaka.util.Error.Category.NETWORK,\n shaka.util.Error.Code.SEGMENT_MISSING);\n }\n await this.initSourceBuffer_(mediaState, reference, adaptation);\n this.destroyer_.ensureNotDestroyed();\n if (this.fatalError_) {\n return;\n }\n\n shaka.log.v2(logPrefix, 'fetching segment');\n const isMP4 = stream.mimeType == 'video/mp4' ||\n stream.mimeType == 'audio/mp4';\n const isReadableStreamSupported = window.ReadableStream;\n const lowLatencyMode = this.config_.lowLatencyMode &&\n this.manifest_.isLowLatency;\n // Enable MP4 low latency streaming with ReadableStream chunked data.\n // And only for DASH and HLS with byterange optimization.\n if (lowLatencyMode && isReadableStreamSupported && isMP4 &&\n (this.manifest_.type != shaka.media.ManifestParser.HLS ||\n reference.hasByterangeOptimization())) {\n let remaining = new Uint8Array(0);\n let processingResult = false;\n let callbackCalled = false;\n let streamDataCallbackError;\n const streamDataCallback = async (data) => {\n if (processingResult) {\n // If the fallback result processing was triggered, don't also\n // append the buffer here. In theory this should never happen,\n // but it does on some older TVs.\n return;\n }\n callbackCalled = true;\n this.destroyer_.ensureNotDestroyed();\n if (this.fatalError_) {\n return;\n }\n try {\n // Append the data with complete boxes.\n // Every time streamDataCallback gets called, append the new data\n // to the remaining data.\n // Find the last fully completed Mdat box, and slice the data into\n // two parts: the first part with completed Mdat boxes, and the\n // second part with an incomplete box.\n // Append the first part, and save the second part as remaining\n // data, and handle it with the next streamDataCallback call.\n remaining = this.concatArray_(remaining, data);\n let sawMDAT = false;\n let offset = 0;\n new shaka.util.Mp4Parser()\n .box('mdat', (box) => {\n offset = box.size + box.start;\n sawMDAT = true;\n })\n .parse(remaining, /* partialOkay= */ false,\n /* isChunkedData= */ true);\n if (sawMDAT) {\n const dataToAppend = remaining.subarray(0, offset);\n remaining = remaining.subarray(offset);\n await this.append_(\n mediaState, presentationTime, stream, reference, dataToAppend,\n /* isChunkedData= */ true, adaptation);\n\n if (mediaState.segmentPrefetch && mediaState.segmentIterator) {\n mediaState.segmentPrefetch.prefetchSegmentsByTime(\n reference.startTime, /* skipFirst= */ true);\n }\n }\n } catch (error) {\n streamDataCallbackError = error;\n }\n };\n\n const result =\n await this.fetch_(mediaState, reference, streamDataCallback);\n if (streamDataCallbackError) {\n throw streamDataCallbackError;\n }\n if (!callbackCalled) {\n // In some environments, we might be forced to use network plugins\n // that don't support streamDataCallback. In those cases, as a\n // fallback, append the buffer here.\n processingResult = true;\n this.destroyer_.ensureNotDestroyed();\n if (this.fatalError_) {\n return;\n }\n\n // If the text stream gets switched between fetch_() and append_(),\n // the new text parser is initialized, but the new init segment is\n // not fetched yet. That would cause an error in\n // TextParser.parseMedia().\n // See http://b/168253400\n if (mediaState.waitingToClearBuffer) {\n shaka.log.info(logPrefix, 'waitingToClearBuffer, skip append');\n mediaState.performingUpdate = false;\n this.scheduleUpdate_(mediaState, 0);\n return;\n }\n\n await this.append_(mediaState, presentationTime, stream, reference,\n result, /* chunkedData= */ false, adaptation);\n }\n\n if (mediaState.segmentPrefetch && mediaState.segmentIterator) {\n mediaState.segmentPrefetch.prefetchSegmentsByTime(\n reference.startTime, /* skipFirst= */ true);\n }\n } else {\n if (lowLatencyMode && !isReadableStreamSupported) {\n shaka.log.warning('Low latency streaming mode is enabled, but ' +\n 'ReadableStream is not supported by the browser.');\n }\n const fetchSegment = this.fetch_(mediaState, reference);\n const result = await fetchSegment;\n this.destroyer_.ensureNotDestroyed();\n if (this.fatalError_) {\n return;\n }\n this.destroyer_.ensureNotDestroyed();\n\n // If the text stream gets switched between fetch_() and append_(), the\n // new text parser is initialized, but the new init segment is not\n // fetched yet. That would cause an error in TextParser.parseMedia().\n // See http://b/168253400\n if (mediaState.waitingToClearBuffer) {\n shaka.log.info(logPrefix, 'waitingToClearBuffer, skip append');\n mediaState.performingUpdate = false;\n this.scheduleUpdate_(mediaState, 0);\n return;\n }\n\n await this.append_(mediaState, presentationTime, stream, reference,\n result, /* chunkedData= */ false, adaptation);\n }\n\n this.destroyer_.ensureNotDestroyed();\n if (this.fatalError_) {\n return;\n }\n // move to next segment after appending the current segment.\n mediaState.lastSegmentReference = reference;\n const newRef = iter.next().value;\n shaka.log.v2(logPrefix, 'advancing to next segment', newRef);\n\n mediaState.performingUpdate = false;\n mediaState.recovering = false;\n\n const info = this.playerInterface_.mediaSourceEngine.getBufferedInfo();\n const buffered = info[mediaState.type];\n // Convert the buffered object to a string capture its properties on\n // WebOS.\n shaka.log.v1(logPrefix, 'finished fetch and append',\n JSON.stringify(buffered));\n\n if (!mediaState.waitingToClearBuffer) {\n let otherState = null;\n if (mediaState.type === ContentType.VIDEO) {\n otherState = this.mediaStates_.get(ContentType.AUDIO);\n } else if (mediaState.type === ContentType.AUDIO) {\n otherState = this.mediaStates_.get(ContentType.VIDEO);\n }\n if (otherState && otherState.type == ContentType.AUDIO) {\n this.playerInterface_.onSegmentAppended(reference, mediaState.stream,\n otherState.stream.isAudioMuxedInVideo);\n } else {\n this.playerInterface_.onSegmentAppended(reference, mediaState.stream,\n mediaState.stream.codecs.includes(','));\n }\n }\n\n // Update right away.\n this.scheduleUpdate_(mediaState, 0);\n } catch (error) {\n this.destroyer_.ensureNotDestroyed(error);\n if (this.fatalError_) {\n return;\n }\n goog.asserts.assert(error instanceof shaka.util.Error,\n 'Should only receive a Shaka error');\n\n mediaState.performingUpdate = false;\n\n if (error.code == shaka.util.Error.Code.OPERATION_ABORTED) {\n // If the network slows down, abort the current fetch request and start\n // a new one, and ignore the error message.\n mediaState.performingUpdate = false;\n this.cancelUpdate_(mediaState);\n this.scheduleUpdate_(mediaState, 0);\n } else if (mediaState.type == ContentType.TEXT &&\n this.config_.ignoreTextStreamFailures) {\n if (error.code == shaka.util.Error.Code.BAD_HTTP_STATUS) {\n shaka.log.warning(logPrefix,\n 'Text stream failed to download. Proceeding without it.');\n } else {\n shaka.log.warning(logPrefix,\n 'Text stream failed to parse. Proceeding without it.');\n }\n this.mediaStates_.delete(ContentType.TEXT);\n } else if (error.code == shaka.util.Error.Code.QUOTA_EXCEEDED_ERROR) {\n await this.handleQuotaExceeded_(mediaState, error);\n } else {\n shaka.log.error(logPrefix, 'failed fetch and append: code=' +\n error.code);\n mediaState.hasError = true;\n\n if (error.category == shaka.util.Error.Category.NETWORK &&\n mediaState.segmentPrefetch) {\n mediaState.segmentPrefetch.removeReference(reference);\n }\n\n error.severity = shaka.util.Error.Severity.CRITICAL;\n await this.handleStreamingError_(mediaState, error);\n }\n }\n }\n\n\n /**\n * Fetches and appends a dependency media state\n *\n * @param {!shaka.media.StreamingEngine.MediaState_} mediaState\n * @param {number} presentationTime\n * @private\n */\n async fetchAndAppendDependency_(mediaState, presentationTime) {\n const dependencyStream = mediaState.stream;\n const iterator =\n dependencyStream.segmentIndex.getIteratorForTime(presentationTime);\n const reference = iterator && iterator.next().value;\n if (reference) {\n const initSegmentReference = reference.initSegmentReference;\n if (initSegmentReference && !shaka.media.InitSegmentReference.equal(\n initSegmentReference, mediaState.lastInitSegmentReference)) {\n mediaState.lastInitSegmentReference = initSegmentReference;\n try {\n const init = await this.fetch_(mediaState, initSegmentReference);\n this.playerInterface_.mediaSourceEngine.appendDependency(\n init, 0, dependencyStream);\n } catch (e) {\n mediaState.lastInitSegmentReference = null;\n throw e;\n }\n }\n if (!mediaState.lastSegmentReference ||\n mediaState.lastSegmentReference != reference) {\n mediaState.lastSegmentReference = reference;\n try {\n const result = await this.fetch_(mediaState, reference);\n this.playerInterface_.mediaSourceEngine.appendDependency(\n result, 0, dependencyStream);\n } catch (e) {\n mediaState.lastSegmentReference = null;\n throw e;\n }\n }\n }\n }\n\n\n /**\n * Clear per-stream error states and retry any failed streams.\n * @param {number} delaySeconds\n * @return {boolean} False if unable to retry.\n */\n retry(delaySeconds) {\n if (this.destroyer_.destroyed()) {\n shaka.log.error('Unable to retry after StreamingEngine is destroyed!');\n return false;\n }\n\n if (this.fatalError_) {\n shaka.log.error('Unable to retry after StreamingEngine encountered a ' +\n 'fatal error!');\n return false;\n }\n\n for (const mediaState of this.mediaStates_.values()) {\n const logPrefix = shaka.media.StreamingEngine.logPrefix_(mediaState);\n // Only schedule an update if it has an error, but it's not mid-update\n // and there is not already an update scheduled.\n if (mediaState.hasError && !mediaState.performingUpdate &&\n !mediaState.updateTimer) {\n shaka.log.info(logPrefix, 'Retrying after failure...');\n mediaState.hasError = false;\n this.scheduleUpdate_(mediaState, delaySeconds);\n }\n }\n\n return true;\n }\n\n\n /**\n * Append the data to the remaining data.\n * @param {!Uint8Array} remaining\n * @param {!Uint8Array} data\n * @return {!Uint8Array}\n * @private\n */\n concatArray_(remaining, data) {\n const result = new Uint8Array(remaining.length + data.length);\n result.set(remaining);\n result.set(data, remaining.length);\n return result;\n }\n\n\n /**\n * Handles a QUOTA_EXCEEDED_ERROR.\n *\n * @param {shaka.media.StreamingEngine.MediaState_} mediaState\n * @param {!shaka.util.Error} error\n * @return {!Promise}\n * @private\n */\n async handleQuotaExceeded_(mediaState, error) {\n const logPrefix = shaka.media.StreamingEngine.logPrefix_(mediaState);\n\n // The segment cannot fit into the SourceBuffer. Ideally, MediaSource would\n // have evicted old data to accommodate the segment; however, it may have\n // failed to do this if the segment is very large, or if it could not find\n // a suitable time range to remove.\n //\n // We can overcome the latter by trying to append the segment again;\n // however, to avoid continuous QuotaExceededErrors we must reduce the size\n // of the buffer going forward.\n //\n // If we've recently reduced the buffering goals, wait until the stream\n // which caused the first QuotaExceededError recovers. Doing this ensures\n // we don't reduce the buffering goals too quickly.\n\n const mediaStates = Array.from(this.mediaStates_.values());\n const waitingForAnotherStreamToRecover = mediaStates.some((ms) => {\n return ms != mediaState && ms.recovering;\n });\n\n if (!waitingForAnotherStreamToRecover) {\n const maxDisabledTime = this.getDisabledTime_(error);\n if (maxDisabledTime) {\n shaka.log.debug(logPrefix, 'Disabling stream due to quota', error);\n }\n const handled = this.playerInterface_.disableStream(\n mediaState.stream, maxDisabledTime);\n if (handled) {\n return;\n }\n if (this.config_.avoidEvictionOnQuotaExceededError) {\n // QuotaExceededError gets thrown if eviction didn't help to make room\n // for a segment. We want to wait for a while (4 seconds is just an\n // arbitrary number) before updating to give the playhead a chance to\n // advance, so we don't immediately throw again.\n this.scheduleUpdate_(mediaState, 4);\n return;\n }\n // Reduction schedule: 80%, 60%, 40%, 20%, 16%, 12%, 8%, 4%, fail.\n // Note: percentages are used for comparisons to avoid rounding errors.\n const percentBefore = Math.round(100 * this.bufferingScale_);\n if (percentBefore > 20) {\n this.bufferingScale_ -= 0.2;\n } else if (percentBefore > 4) {\n this.bufferingScale_ -= 0.04;\n } else {\n shaka.log.error(\n logPrefix, 'MediaSource threw QuotaExceededError too many times');\n mediaState.hasError = true;\n this.fatalError_ = true;\n this.playerInterface_.onError(error);\n return;\n }\n const percentAfter = Math.round(100 * this.bufferingScale_);\n shaka.log.warning(\n logPrefix,\n 'MediaSource threw QuotaExceededError:',\n 'reducing buffering goals by ' + (100 - percentAfter) + '%');\n mediaState.recovering = true;\n const presentationTime = this.playerInterface_.getPresentationTime();\n await this.evict_(mediaState, presentationTime);\n } else {\n shaka.log.debug(\n logPrefix,\n 'MediaSource threw QuotaExceededError:',\n 'waiting for another stream to recover...');\n }\n\n // QuotaExceededError gets thrown if eviction didn't help to make room\n // for a segment. We want to wait for a while (4 seconds is just an\n // arbitrary number) before updating to give the playhead a chance to\n // advance, so we don't immediately throw again.\n this.scheduleUpdate_(mediaState, 4);\n }\n\n\n /**\n * Sets the given MediaState's associated SourceBuffer's timestamp offset,\n * append window, and init segment if they have changed. If an error occurs\n * then neither the timestamp offset or init segment are unset, since another\n * call to switch() will end up superseding them.\n *\n * @param {shaka.media.StreamingEngine.MediaState_} mediaState\n * @param {!shaka.media.SegmentReference} reference\n * @param {boolean} adaptation\n * @return {!Promise}\n * @private\n */\n async initSourceBuffer_(mediaState, reference, adaptation) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n const MimeUtils = shaka.util.MimeUtils;\n const StreamingEngine = shaka.media.StreamingEngine;\n const logPrefix = StreamingEngine.logPrefix_(mediaState);\n const nullLastReferences = mediaState.lastSegmentReference == null;\n\n /** @type {!Array<!Promise>} */\n const operations = [];\n\n // Rounding issues can cause us to remove the first frame of a Period, so\n // reduce the window start time slightly.\n const appendWindowStart = Math.max(0,\n Math.max(reference.appendWindowStart, this.playRangeStart_) -\n StreamingEngine.APPEND_WINDOW_START_FUDGE_);\n const appendWindowEnd =\n Math.min(reference.appendWindowEnd, this.playRangeEnd_) +\n StreamingEngine.APPEND_WINDOW_END_FUDGE_;\n\n goog.asserts.assert(\n reference.startTime <= appendWindowEnd,\n logPrefix + ' segment should start before append window end');\n\n const fullCodecs = (reference.codecs || mediaState.stream.codecs);\n const codecs = MimeUtils.getCodecBase(fullCodecs);\n const mimeType = MimeUtils.getBasicType(\n reference.mimeType || mediaState.stream.mimeType);\n const timestampOffset = reference.timestampOffset;\n if (timestampOffset != mediaState.lastTimestampOffset ||\n appendWindowStart != mediaState.lastAppendWindowStart ||\n appendWindowEnd != mediaState.lastAppendWindowEnd ||\n codecs != mediaState.lastCodecs ||\n mimeType != mediaState.lastMimeType) {\n shaka.log.v1(logPrefix, 'setting timestamp offset to ' + timestampOffset);\n shaka.log.v1(logPrefix,\n 'setting append window start to ' + appendWindowStart);\n shaka.log.v1(logPrefix,\n 'setting append window end to ' + appendWindowEnd);\n\n const isResetMediaSourceNecessary =\n mediaState.lastCodecs && mediaState.lastMimeType &&\n this.playerInterface_.mediaSourceEngine.isResetMediaSourceNecessary(\n mediaState.type, mimeType, fullCodecs);\n if (isResetMediaSourceNecessary) {\n let otherState = null;\n if (mediaState.type === ContentType.VIDEO) {\n otherState = this.mediaStates_.get(ContentType.AUDIO);\n } else if (mediaState.type === ContentType.AUDIO) {\n otherState = this.mediaStates_.get(ContentType.VIDEO);\n }\n if (otherState) {\n // First, abort all operations in progress on the other stream.\n await this.abortOperations_(otherState).catch(() => {});\n // Then clear our cache of the last init segment, since MSE will be\n // reloaded and no init segment will be there post-reload.\n otherState.lastInitSegmentReference = null;\n // Clear cache of append window start and end, since they will need\n // to be reapplied post-reload by streaming engine.\n otherState.lastAppendWindowStart = null;\n otherState.lastAppendWindowEnd = null;\n // Now force the existing buffer to be cleared. It is not necessary\n // to perform the MSE clear operation, but this has the side-effect\n // that our state for that stream will then match MSE's post-reload\n // state.\n this.forceClearBuffer_(otherState);\n }\n }\n\n // Dispatching init asynchronously causes the sourceBuffers in\n // the MediaSourceEngine to become detached do to race conditions\n // with mediaSource and sourceBuffers being created simultaneously.\n await this.setProperties_(mediaState, timestampOffset, appendWindowStart,\n appendWindowEnd, reference, codecs, mimeType);\n }\n\n if (!shaka.media.InitSegmentReference.equal(\n reference.initSegmentReference, mediaState.lastInitSegmentReference)) {\n mediaState.lastInitSegmentReference = reference.initSegmentReference;\n\n if (reference.isIndependent() && reference.initSegmentReference) {\n shaka.log.v1(logPrefix, 'fetching init segment');\n\n const fetchInit =\n this.fetch_(mediaState, reference.initSegmentReference);\n const append = async () => {\n try {\n const initSegment = await fetchInit;\n this.destroyer_.ensureNotDestroyed();\n\n let lastTimescale = null;\n const timescaleMap = new Map();\n\n /** @type {!shaka.extern.SpatialVideoInfo} */\n const spatialVideoInfo = {\n projection: null,\n hfov: null,\n };\n\n const parser = new shaka.util.Mp4Parser();\n const Mp4Parser = shaka.util.Mp4Parser;\n const Mp4BoxParsers = shaka.util.Mp4BoxParsers;\n parser.box('moov', Mp4Parser.children)\n .box('trak', Mp4Parser.children)\n .box('mdia', Mp4Parser.children)\n .fullBox('mdhd', (box) => {\n goog.asserts.assert(\n box.version != null,\n 'MDHD is a full box and should have a valid version.');\n const parsedMDHDBox = Mp4BoxParsers.parseMDHD(\n box.reader, box.version);\n lastTimescale = parsedMDHDBox.timescale;\n })\n .box('hdlr', (box) => {\n const parsedHDLR = Mp4BoxParsers.parseHDLR(box.reader);\n switch (parsedHDLR.handlerType) {\n case 'soun':\n timescaleMap.set(ContentType.AUDIO, lastTimescale);\n break;\n case 'vide':\n timescaleMap.set(ContentType.VIDEO, lastTimescale);\n break;\n }\n lastTimescale = null;\n })\n .box('minf', Mp4Parser.children)\n .box('stbl', Mp4Parser.children)\n .fullBox('stsd', Mp4Parser.sampleDescription)\n .box('encv', Mp4Parser.visualSampleEntry)\n .box('avc1', Mp4Parser.visualSampleEntry)\n .box('avc3', Mp4Parser.visualSampleEntry)\n .box('hev1', Mp4Parser.visualSampleEntry)\n .box('hvc1', Mp4Parser.visualSampleEntry)\n .box('dvav', Mp4Parser.visualSampleEntry)\n .box('dva1', Mp4Parser.visualSampleEntry)\n .box('dvh1', Mp4Parser.visualSampleEntry)\n .box('dvhe', Mp4Parser.visualSampleEntry)\n .box('dvc1', Mp4Parser.visualSampleEntry)\n .box('dvi1', Mp4Parser.visualSampleEntry)\n .box('vexu', Mp4Parser.children)\n .box('proj', Mp4Parser.children)\n .fullBox('prji', (box) => {\n const parsedPRJIBox = Mp4BoxParsers.parsePRJI(box.reader);\n spatialVideoInfo.projection = parsedPRJIBox.projection;\n })\n .box('hfov', (box) => {\n const parsedHFOVBox = Mp4BoxParsers.parseHFOV(box.reader);\n spatialVideoInfo.hfov = parsedHFOVBox.hfov;\n })\n .parse(initSegment);\n\n if (mediaState.type === ContentType.VIDEO) {\n this.updateSpatialVideoInfo_(spatialVideoInfo);\n }\n\n if (timescaleMap.has(mediaState.type)) {\n reference.initSegmentReference.timescale =\n timescaleMap.get(mediaState.type);\n } else if (lastTimescale != null) {\n // Fallback for segments without HDLR box\n reference.initSegmentReference.timescale = lastTimescale;\n }\n\n shaka.log.v1(logPrefix, 'appending init segment');\n const hasClosedCaptions = mediaState.stream.closedCaptions &&\n mediaState.stream.closedCaptions.size > 0;\n await this.playerInterface_.beforeAppendSegment(\n mediaState.type, initSegment);\n await this.playerInterface_.mediaSourceEngine.appendBuffer(\n mediaState.type, initSegment, /* reference= */ null,\n mediaState.stream, hasClosedCaptions, mediaState.seeked,\n adaptation);\n } catch (error) {\n mediaState.lastInitSegmentReference = null;\n throw error;\n }\n };\n let initSegmentTime = reference.startTime;\n if (nullLastReferences) {\n const bufferEnd =\n this.playerInterface_.mediaSourceEngine.bufferEnd(mediaState.type);\n if (bufferEnd != null) {\n // Adjust init segment append time if we have something in\n // a buffer, i.e. due to running switchVariant() with non zero\n // safe margin value.\n initSegmentTime = bufferEnd;\n }\n }\n this.playerInterface_.onInitSegmentAppended(\n initSegmentTime, reference.initSegmentReference);\n operations.push(append());\n }\n }\n\n const lastDiscontinuitySequence =\n mediaState.lastSegmentReference ?\n mediaState.lastSegmentReference.discontinuitySequence : null;\n // Across discontinuity bounds, we should resync timestamps. The next\n // segment appended should land at its theoretical timestamp from the\n // segment index.\n if (reference.discontinuitySequence != lastDiscontinuitySequence) {\n operations.push(this.playerInterface_.mediaSourceEngine.resync(\n mediaState.type, reference.startTime));\n }\n\n await Promise.all(operations);\n }\n\n /**\n *\n * @param {!shaka.media.StreamingEngine.MediaState_} mediaState\n * @param {number} timestampOffset\n * @param {number} appendWindowStart\n * @param {number} appendWindowEnd\n * @param {!shaka.media.SegmentReference} reference\n * @param {?string=} codecs\n * @param {?string=} mimeType\n * @private\n */\n async setProperties_(mediaState, timestampOffset, appendWindowStart,\n appendWindowEnd, reference, codecs, mimeType) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n\n /**\n * @type {!Map<shaka.util.ManifestParserUtils.ContentType,\n * shaka.extern.Stream>}\n */\n const streamsByType = new Map();\n if (this.currentVariant_.audio) {\n streamsByType.set(ContentType.AUDIO, this.currentVariant_.audio);\n }\n if (this.currentVariant_.video) {\n streamsByType.set(ContentType.VIDEO, this.currentVariant_.video);\n }\n try {\n mediaState.lastAppendWindowStart = appendWindowStart;\n mediaState.lastAppendWindowEnd = appendWindowEnd;\n if (codecs) {\n mediaState.lastCodecs = codecs;\n }\n if (mimeType) {\n mediaState.lastMimeType = mimeType;\n }\n mediaState.lastTimestampOffset = timestampOffset;\n\n const ignoreTimestampOffset = this.manifest_.sequenceMode ||\n this.manifest_.type == shaka.media.ManifestParser.HLS;\n\n await this.playerInterface_.mediaSourceEngine.setStreamProperties(\n mediaState.type, timestampOffset, appendWindowStart,\n appendWindowEnd, ignoreTimestampOffset,\n reference.mimeType || mediaState.stream.mimeType,\n reference.codecs || mediaState.stream.codecs, streamsByType);\n } catch (error) {\n mediaState.lastAppendWindowStart = null;\n mediaState.lastAppendWindowEnd = null;\n mediaState.lastCodecs = null;\n mediaState.lastMimeType = null;\n mediaState.lastTimestampOffset = null;\n\n throw error;\n }\n }\n\n\n /**\n * Appends the given segment and evicts content if required to append.\n *\n * @param {!shaka.media.StreamingEngine.MediaState_} mediaState\n * @param {number} presentationTime\n * @param {shaka.extern.Stream} stream\n * @param {!shaka.media.SegmentReference} reference\n * @param {BufferSource} segment\n * @param {boolean=} isChunkedData\n * @param {boolean=} adaptation\n * @return {!Promise}\n * @private\n */\n async append_(mediaState, presentationTime, stream, reference, segment,\n isChunkedData = false, adaptation = false) {\n const logPrefix = shaka.media.StreamingEngine.logPrefix_(mediaState);\n\n const hasClosedCaptions = stream.closedCaptions &&\n stream.closedCaptions.size > 0;\n\n if (this.config_.shouldFixTimestampOffset) {\n let parser;\n\n const isMP4 = stream.mimeType == 'video/mp4' ||\n stream.mimeType == 'audio/mp4';\n let timescale = null;\n if (reference.initSegmentReference) {\n timescale = reference.initSegmentReference.timescale;\n }\n const shouldFixTimestampOffset = isMP4 && timescale &&\n stream.type === shaka.util.ManifestParserUtils.ContentType.VIDEO &&\n this.manifest_.type == shaka.media.ManifestParser.DASH;\n\n if (shouldFixTimestampOffset) {\n parser = new shaka.util.Mp4Parser();\n }\n\n if (shouldFixTimestampOffset) {\n parser\n .box('moof', shaka.util.Mp4Parser.children)\n .box('traf', shaka.util.Mp4Parser.children)\n .fullBox('tfdt', async (box) => {\n goog.asserts.assert(\n box.version != null,\n 'TFDT is a full box and should have a valid version.');\n\n const parsedTFDT = shaka.util.Mp4BoxParsers.parseTFDTInaccurate(\n box.reader, box.version);\n\n const baseMediaDecodeTime = parsedTFDT.baseMediaDecodeTime;\n\n // In case the time is 0, it is not updated\n if (!baseMediaDecodeTime) {\n return;\n }\n goog.asserts.assert(typeof(timescale) == 'number',\n 'Should be an number!');\n\n const scaledMediaDecodeTime = -baseMediaDecodeTime / timescale;\n\n const comparison1 = Number(mediaState.lastTimestampOffset) || 0;\n\n if (comparison1 < scaledMediaDecodeTime) {\n const lastAppendWindowStart = mediaState.lastAppendWindowStart;\n const lastAppendWindowEnd = mediaState.lastAppendWindowEnd;\n goog.asserts.assert(typeof(lastAppendWindowStart) == 'number',\n 'Should be an number!');\n goog.asserts.assert(typeof(lastAppendWindowEnd) == 'number',\n 'Should be an number!');\n await this.setProperties_(mediaState, scaledMediaDecodeTime,\n lastAppendWindowStart, lastAppendWindowEnd, reference);\n }\n });\n }\n\n if (shouldFixTimestampOffset) {\n parser.parse(segment, /* partialOkay= */ false, isChunkedData);\n }\n }\n\n await this.evict_(mediaState, presentationTime);\n this.destroyer_.ensureNotDestroyed();\n\n // 'seeked' or 'adaptation' triggered logic applies only to this\n // appendBuffer() call.\n const seeked = mediaState.seeked;\n mediaState.seeked = false;\n\n await this.playerInterface_.beforeAppendSegment(mediaState.type, segment);\n await this.playerInterface_.mediaSourceEngine.appendBuffer(\n mediaState.type,\n segment,\n reference,\n stream,\n hasClosedCaptions,\n seeked,\n adaptation,\n isChunkedData);\n this.destroyer_.ensureNotDestroyed();\n shaka.log.v2(logPrefix, 'appended media segment');\n }\n\n /**\n * Evicts media to meet the max buffer behind limit.\n *\n * @param {shaka.media.StreamingEngine.MediaState_} mediaState\n * @param {number} presentationTime\n * @private\n */\n async evict_(mediaState, presentationTime) {\n const segmentIndex = mediaState.stream.segmentIndex;\n if (segmentIndex instanceof shaka.media.MetaSegmentIndex) {\n segmentIndex.evict(\n this.manifest_.presentationTimeline.getSegmentAvailabilityStart());\n }\n\n const logPrefix = shaka.media.StreamingEngine.logPrefix_(mediaState);\n shaka.log.v2(logPrefix, 'checking buffer length');\n\n // Use the max segment duration, if it is longer than the bufferBehind, to\n // avoid accidentally clearing too much data when dealing with a manifest\n // with a long keyframe interval.\n const bufferBehind = Math.max(\n this.config_.bufferBehind * this.bufferingScale_,\n this.manifest_.presentationTimeline.getMaxSegmentDuration());\n\n const startTime =\n this.playerInterface_.mediaSourceEngine.bufferStart(mediaState.type);\n if (startTime == null) {\n if (this.lastTextMediaStateBeforeUnload_ == mediaState) {\n this.lastTextMediaStateBeforeUnload_ = null;\n }\n shaka.log.v2(logPrefix,\n 'buffer behind okay because nothing buffered:',\n 'presentationTime=' + presentationTime,\n 'bufferBehind=' + bufferBehind);\n return;\n }\n const bufferedBehind = presentationTime - startTime;\n\n const evictionGoal = this.config_.evictionGoal;\n\n const seekRangeStart =\n this.manifest_.presentationTimeline.getSeekRangeStart();\n const seekRangeEnd =\n this.manifest_.presentationTimeline.getSeekRangeEnd();\n\n let overflow = bufferedBehind - bufferBehind;\n if (seekRangeEnd - seekRangeStart > evictionGoal) {\n overflow = Math.max(bufferedBehind - bufferBehind,\n seekRangeStart - evictionGoal - startTime);\n }\n // See: https://github.com/shaka-project/shaka-player/issues/6240\n if (overflow <= evictionGoal) {\n shaka.log.v2(logPrefix,\n 'buffer behind okay:',\n 'presentationTime=' + presentationTime,\n 'bufferedBehind=' + bufferedBehind,\n 'bufferBehind=' + bufferBehind,\n 'evictionGoal=' + evictionGoal,\n 'underflow=' + Math.abs(overflow));\n return;\n }\n\n shaka.log.v1(logPrefix,\n 'buffer behind too large:',\n 'presentationTime=' + presentationTime,\n 'bufferedBehind=' + bufferedBehind,\n 'bufferBehind=' + bufferBehind,\n 'evictionGoal=' + evictionGoal,\n 'overflow=' + overflow);\n\n await this.playerInterface_.mediaSourceEngine.remove(mediaState.type,\n startTime, startTime + overflow);\n\n this.destroyer_.ensureNotDestroyed();\n shaka.log.v1(logPrefix, 'evicted ' + overflow + ' seconds');\n\n if (this.lastTextMediaStateBeforeUnload_) {\n await this.evict_(this.lastTextMediaStateBeforeUnload_, presentationTime);\n this.destroyer_.ensureNotDestroyed();\n }\n }\n\n\n /**\n * @param {shaka.media.StreamingEngine.MediaState_} mediaState\n * @return {boolean}\n * @private\n */\n static isEmbeddedText_(mediaState) {\n const MimeUtils = shaka.util.MimeUtils;\n const CEA608_MIME = MimeUtils.CEA608_CLOSED_CAPTION_MIMETYPE;\n const CEA708_MIME = MimeUtils.CEA708_CLOSED_CAPTION_MIMETYPE;\n return mediaState &&\n mediaState.type == shaka.util.ManifestParserUtils.ContentType.TEXT &&\n (mediaState.stream.mimeType == CEA608_MIME ||\n mediaState.stream.mimeType == CEA708_MIME);\n }\n\n\n /**\n * Fetches the given segment.\n *\n * @param {!shaka.media.StreamingEngine.MediaState_} mediaState\n * @param {(!shaka.media.InitSegmentReference|\n * !shaka.media.SegmentReference)} reference\n * @param {?function(BufferSource):!Promise=} streamDataCallback\n *\n * @return {!Promise<BufferSource>}\n * @private\n */\n async fetch_(mediaState, reference, streamDataCallback) {\n const segmentData = reference.getSegmentData();\n if (segmentData) {\n return segmentData;\n }\n let op = null;\n if (mediaState.segmentPrefetch) {\n op = mediaState.segmentPrefetch.getPrefetchedSegment(\n reference, streamDataCallback);\n }\n if (!op) {\n op = this.dispatchFetch_(\n reference, mediaState.stream, streamDataCallback);\n }\n\n let position = 0;\n if (mediaState.segmentIterator) {\n position = mediaState.segmentIterator.currentPosition();\n }\n\n mediaState.operation = op;\n const response = await op.promise;\n mediaState.operation = null;\n let result = response.data;\n if (reference.aesKey) {\n result = await shaka.media.SegmentUtils.aesDecrypt(\n result, reference.aesKey, position);\n }\n return result;\n }\n\n /**\n * Fetches the given segment.\n *\n * @param {(!shaka.media.InitSegmentReference|\n * !shaka.media.SegmentReference)} reference\n * @param {!shaka.extern.Stream} stream\n * @param {?function(BufferSource):!Promise=} streamDataCallback\n * @param {boolean=} isPreload\n *\n * @return {!shaka.net.NetworkingEngine.PendingRequest}\n * @private\n */\n dispatchFetch_(reference, stream, streamDataCallback, isPreload = false) {\n goog.asserts.assert(\n this.playerInterface_.netEngine, 'Must have net engine');\n return shaka.media.StreamingEngine.dispatchFetch(\n reference, stream, streamDataCallback || null,\n this.config_.retryParameters, this.playerInterface_.netEngine);\n }\n\n /**\n * Fetches the given segment.\n *\n * @param {(!shaka.media.InitSegmentReference|\n * !shaka.media.SegmentReference)} reference\n * @param {!shaka.extern.Stream} stream\n * @param {?function(BufferSource):!Promise} streamDataCallback\n * @param {shaka.extern.RetryParameters} retryParameters\n * @param {!shaka.net.NetworkingEngine} netEngine\n * @param {boolean=} isPreload\n *\n * @return {!shaka.net.NetworkingEngine.PendingRequest}\n */\n static dispatchFetch(\n reference, stream, streamDataCallback, retryParameters, netEngine,\n isPreload = false) {\n const requestType = shaka.net.NetworkingEngine.RequestType.SEGMENT;\n const segment = reference instanceof shaka.media.SegmentReference ?\n reference : undefined;\n const type = segment ?\n shaka.net.NetworkingEngine.AdvancedRequestType.MEDIA_SEGMENT :\n shaka.net.NetworkingEngine.AdvancedRequestType.INIT_SEGMENT;\n const request = shaka.util.Networking.createSegmentRequest(\n reference.getUris(),\n reference.startByte,\n reference.endByte,\n retryParameters,\n streamDataCallback);\n request.contentType = stream.type;\n\n shaka.log.v2('fetching: reference=', reference);\n\n return netEngine.request(\n requestType, request, {type, stream, segment, isPreload});\n }\n\n /**\n * Clears the buffer and schedules another update.\n * The optional parameter safeMargin allows to retain a certain amount\n * of buffer, which can help avoiding rebuffering events.\n * The value of the safe margin should be provided by the ABR manager.\n *\n * @param {!shaka.media.StreamingEngine.MediaState_} mediaState\n * @param {boolean} flush\n * @param {number} safeMargin\n * @private\n */\n async clearBuffer_(mediaState, flush, safeMargin) {\n const logPrefix = shaka.media.StreamingEngine.logPrefix_(mediaState);\n\n goog.asserts.assert(\n !mediaState.performingUpdate && (mediaState.updateTimer == null),\n logPrefix + ' unexpected call to clearBuffer_()');\n\n mediaState.waitingToClearBuffer = false;\n mediaState.waitingToFlushBuffer = false;\n mediaState.clearBufferSafeMargin = 0;\n mediaState.clearingBuffer = true;\n mediaState.lastSegmentReference = null;\n mediaState.segmentIterator = null;\n\n shaka.log.debug(logPrefix, 'clearing buffer');\n if (mediaState.segmentPrefetch &&\n !this.audioPrefetchMap_.has(mediaState.stream)) {\n mediaState.segmentPrefetch.clearAll();\n }\n\n if (safeMargin) {\n const presentationTime = this.playerInterface_.getPresentationTime();\n const duration = this.playerInterface_.mediaSourceEngine.getDuration();\n await this.playerInterface_.mediaSourceEngine.remove(\n mediaState.type, presentationTime + safeMargin, duration);\n } else {\n await this.playerInterface_.mediaSourceEngine.clear(mediaState.type);\n this.destroyer_.ensureNotDestroyed();\n\n if (flush) {\n await this.playerInterface_.mediaSourceEngine.flush(\n mediaState.type);\n }\n }\n\n this.destroyer_.ensureNotDestroyed();\n\n shaka.log.debug(logPrefix, 'cleared buffer');\n mediaState.clearingBuffer = false;\n mediaState.endOfStream = false;\n // Since the clear operation was async, check to make sure we're not doing\n // another update and we don't have one scheduled yet.\n if (!mediaState.performingUpdate && !mediaState.updateTimer) {\n this.scheduleUpdate_(mediaState, 0);\n }\n }\n\n\n /**\n * Schedules |mediaState|'s next update.\n *\n * @param {!shaka.media.StreamingEngine.MediaState_} mediaState\n * @param {number} delay The delay in seconds.\n * @private\n */\n scheduleUpdate_(mediaState, delay) {\n const logPrefix = shaka.media.StreamingEngine.logPrefix_(mediaState);\n\n // If the text's update is canceled and its mediaState is deleted, stop\n // scheduling another update.\n const type = mediaState.type;\n if (type == shaka.util.ManifestParserUtils.ContentType.TEXT &&\n !this.mediaStates_.has(type)) {\n shaka.log.v1(logPrefix, 'Text stream is unloaded. No update is needed.');\n return;\n }\n\n shaka.log.v2(logPrefix, 'updating in ' + delay + ' seconds');\n goog.asserts.assert(mediaState.updateTimer == null,\n logPrefix + ' did not expect update to be scheduled');\n\n mediaState.updateTimer = new shaka.util.DelayedTick(async () => {\n try {\n await this.onUpdate_(mediaState);\n } catch (error) {\n if (this.playerInterface_) {\n this.playerInterface_.onError(error);\n }\n }\n }).tickAfter(delay);\n }\n\n\n /**\n * If |mediaState| is scheduled to update, stop it.\n *\n * @param {shaka.media.StreamingEngine.MediaState_} mediaState\n * @private\n */\n cancelUpdate_(mediaState) {\n if (mediaState.updateTimer == null) {\n return;\n }\n\n mediaState.updateTimer.stop();\n mediaState.updateTimer = null;\n }\n\n\n /**\n * If |mediaState| holds any in-progress operations, abort them.\n *\n * @return {!Promise}\n * @private\n */\n async abortOperations_(mediaState) {\n if (mediaState.operation) {\n await mediaState.operation.abort();\n }\n }\n\n /**\n * Handle streaming errors by delaying, then notifying the application by\n * error callback and by streaming failure callback.\n *\n * @param {shaka.media.StreamingEngine.MediaState_} mediaState\n * @param {!shaka.util.Error} error\n * @return {!Promise}\n * @private\n */\n async handleStreamingError_(mediaState, error) {\n const logPrefix = shaka.media.StreamingEngine.logPrefix_(mediaState);\n\n if (error.code == shaka.util.Error.Code.STREAMING_NOT_ALLOWED) {\n mediaState.performingUpdate = false;\n this.cancelUpdate_(mediaState);\n this.scheduleUpdate_(mediaState, 0);\n return;\n }\n\n // If we invoke the callback right away, the application could trigger a\n // rapid retry cycle that could be very unkind to the server. Instead,\n // use the backoff system to delay and backoff the error handling.\n await this.failureCallbackBackoff_.attempt();\n this.destroyer_.ensureNotDestroyed();\n\n // Try to recover from network errors, but not timeouts.\n // See https://github.com/shaka-project/shaka-player/issues/7368\n if (error.category === shaka.util.Error.Category.NETWORK &&\n error.code != shaka.util.Error.Code.TIMEOUT) {\n if (mediaState.restoreStreamAfterTrickPlay) {\n this.setTrickPlay(/* on= */ false);\n return;\n }\n const maxDisabledTime = this.getDisabledTime_(error);\n if (maxDisabledTime) {\n shaka.log.debug(logPrefix, 'Disabling stream due to error', error);\n }\n error.handled = this.playerInterface_.disableStream(\n mediaState.stream, maxDisabledTime);\n\n // Decrease the error severity to recoverable\n if (error.handled) {\n error.severity = shaka.util.Error.Severity.RECOVERABLE;\n }\n }\n\n // First fire an error event.\n if (!error.handled ||\n error.code != shaka.util.Error.Code.SEGMENT_MISSING) {\n this.playerInterface_.onError(error);\n }\n\n // If the error was not handled by the application, call the failure\n // callback.\n if (!error.handled) {\n this.config_.failureCallback(error);\n }\n }\n\n /**\n * @param {!shaka.util.Error} error\n * @return {number}\n * @private\n */\n getDisabledTime_(error) {\n if (this.config_.maxDisabledTime === 0 &&\n error.code == shaka.util.Error.Code.SEGMENT_MISSING) {\n // Spec: https://datatracker.ietf.org/doc/html/draft-pantos-hls-rfc8216bis#section-6.3.3\n // The client SHOULD NOT attempt to load Media Segments that have been\n // marked with an EXT-X-GAP tag, or to load Partial Segments with a\n // GAP=YES attribute. Instead, clients are encouraged to look for\n // another Variant Stream of the same Rendition which does not have the\n // same gap, and play that instead.\n return 1;\n }\n\n return this.config_.maxDisabledTime;\n }\n\n /**\n * Reset Media Source\n *\n * @param {boolean=} force\n * @return {!Promise<boolean>}\n */\n async resetMediaSource(force = false, clearBuffer = true) {\n const now = (Date.now() / 1000);\n const minTimeBetweenRecoveries = this.config_.minTimeBetweenRecoveries;\n if (!force) {\n if (!this.config_.allowMediaSourceRecoveries ||\n (now - this.lastMediaSourceReset_) < minTimeBetweenRecoveries) {\n return false;\n }\n this.lastMediaSourceReset_ = now;\n }\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n const audioMediaState = this.mediaStates_.get(ContentType.AUDIO);\n if (audioMediaState) {\n audioMediaState.lastInitSegmentReference = null;\n audioMediaState.lastAppendWindowStart = null;\n audioMediaState.lastAppendWindowEnd = null;\n if (clearBuffer) {\n this.forceClearBuffer_(audioMediaState);\n }\n this.abortOperations_(audioMediaState).catch(() => {});\n if (audioMediaState.segmentIterator) {\n audioMediaState.segmentIterator.resetToLastIndependent();\n }\n }\n const videoMediaState = this.mediaStates_.get(ContentType.VIDEO);\n if (videoMediaState) {\n videoMediaState.lastInitSegmentReference = null;\n videoMediaState.lastAppendWindowStart = null;\n videoMediaState.lastAppendWindowEnd = null;\n if (clearBuffer) {\n this.forceClearBuffer_(videoMediaState);\n }\n this.abortOperations_(videoMediaState).catch(() => {});\n if (videoMediaState.segmentIterator) {\n videoMediaState.segmentIterator.resetToLastIndependent();\n }\n }\n /**\n * @type {!Map<shaka.util.ManifestParserUtils.ContentType,\n * shaka.extern.Stream>}\n */\n const streamsByType = new Map();\n if (this.currentVariant_.audio) {\n streamsByType.set(ContentType.AUDIO, this.currentVariant_.audio);\n }\n if (this.currentVariant_.video) {\n streamsByType.set(ContentType.VIDEO, this.currentVariant_.video);\n }\n await this.playerInterface_.mediaSourceEngine.reset(streamsByType);\n if (videoMediaState &&\n !videoMediaState.performingUpdate && !videoMediaState.updateTimer) {\n this.scheduleUpdate_(videoMediaState, 0);\n }\n if (audioMediaState &&\n !audioMediaState.performingUpdate && !audioMediaState.updateTimer) {\n this.scheduleUpdate_(audioMediaState, 0);\n }\n return true;\n }\n\n /**\n * Update the spatial video info and notify to the app.\n *\n * @param {shaka.extern.SpatialVideoInfo} info\n * @private\n */\n updateSpatialVideoInfo_(info) {\n if (this.spatialVideoInfo_.projection != info.projection ||\n this.spatialVideoInfo_.hfov != info.hfov) {\n const EventName = shaka.util.FakeEvent.EventName;\n let event;\n if (info.projection != null || info.hfov != null) {\n const eventName = EventName.SpatialVideoInfoEvent;\n const data = (new Map()).set('detail', info);\n event = new shaka.util.FakeEvent(eventName, data);\n } else {\n const eventName = EventName.NoSpatialVideoInfoEvent;\n event = new shaka.util.FakeEvent(eventName);\n }\n event.cancelable = true;\n this.playerInterface_.onEvent(event);\n this.spatialVideoInfo_ = info;\n }\n }\n\n /**\n * Update the segment iterator direction.\n *\n * @private\n */\n updateSegmentIteratorReverse_() {\n const reverse = this.playerInterface_.getPlaybackRate() < 0;\n for (const mediaState of this.mediaStates_.values()) {\n if (mediaState.segmentIterator) {\n mediaState.segmentIterator.setReverse(reverse);\n }\n if (mediaState.segmentPrefetch) {\n mediaState.segmentPrefetch.setReverse(reverse);\n }\n }\n for (const prefetch of this.audioPrefetchMap_.values()) {\n prefetch.setReverse(reverse);\n }\n }\n\n /**\n * Checks if need to push time forward to cross a boundary. If so,\n * an MSE reset will happen. If the strategy is KEEP, this logic is skipped.\n * Called on timeupdate to schedule a theoretical, future, offset or on\n * waiting, which is another indicator we might need to cross a boundary.\n * @param {boolean=} immediate\n */\n forwardTimeForCrossBoundary(immediate = false) {\n if (this.config_.crossBoundaryStrategy ===\n shaka.config.CrossBoundaryStrategy.KEEP) {\n // When crossBoundaryStrategy changed to keep mid stream, we can bail\n // out early.\n return;\n }\n const video = this.playerInterface_.video;\n if (video.seeking) {\n // When seeking, close to a boundary, we can reset too early due to\n // a subsequent waiting event. Schedule a theoretical delay.\n immediate = false;\n }\n\n // Stop timer first, in case someone seeked back during the time a timer\n // was scheduled.\n this.crossBoundaryTimer_.stop();\n\n const presentationTime = this.playerInterface_.getPresentationTime();\n\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n const mediaState = this.mediaStates_.get(ContentType.VIDEO) ||\n this.mediaStates_.get(ContentType.AUDIO);\n\n if (!mediaState || !mediaState.lastAppendWindowEnd ||\n mediaState.clearingBuffer) {\n return;\n }\n\n const threshold = shaka.media.StreamingEngine.CROSS_BOUNDARY_END_THRESHOLD_;\n const fromEnd = mediaState.lastAppendWindowEnd - presentationTime;\n // Check if greater than 0 to eliminate a backwards seek.\n if (fromEnd > 0 && fromEnd < threshold) {\n // Set the intended time to seek to in order to cross the boundary.\n this.boundaryTime_ = mediaState.lastAppendWindowEnd;\n\n if (immediate) {\n this.crossBoundaryTimer_.tickNow();\n } else {\n // When not immediate, we schedule a time tick when the boundary\n // theoretically should be reached, else we'd be stalled when\n // a waiting event doesn't come (due to segment misalignment).\n this.crossBoundaryTimer_.tickAfter(fromEnd);\n }\n }\n }\n\n /**\n * Returns whether the reference should be discarded. If the segment crosses\n * a boundary, we'll discard it based on the crossBoundaryStrategy.\n *\n * @param {!shaka.media.StreamingEngine.MediaState_} mediaState\n * @param {!shaka.media.SegmentReference} reference\n * @private\n */\n discardReferenceByBoundary_(mediaState, reference) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n if (mediaState.type === ContentType.TEXT) {\n return false;\n }\n\n const lastInitRef = mediaState.lastInitSegmentReference;\n if (!lastInitRef) {\n return false;\n }\n\n const CrossBoundaryStrategy = shaka.config.CrossBoundaryStrategy;\n const logPrefix = shaka.media.StreamingEngine.logPrefix_(mediaState);\n\n const initRef = reference.initSegmentReference;\n let discard = lastInitRef.boundaryEnd !== initRef.boundaryEnd;\n // Some devices can play plain data when initialized with an encrypted\n // init segment. We can keep the MediaSource in this case.\n if (this.config_.crossBoundaryStrategy ===\n CrossBoundaryStrategy.RESET_TO_ENCRYPTED) {\n if (!lastInitRef.encrypted && !initRef.encrypted) {\n // We're crossing a plain to plain boundary, allow the reference.\n discard = false;\n }\n if (lastInitRef.encrypted) {\n // We initialized MediaSource with an encrypted init segment, from\n // now on, we can keep the buffer.\n shaka.log.debug(logPrefix, 'stream is encrypted, ' +\n 'discard crossBoundaryStrategy');\n this.config_.crossBoundaryStrategy = CrossBoundaryStrategy.KEEP;\n }\n }\n // If discarded & seeked across a boundary, reset MediaSource.\n if (discard && mediaState.seeked) {\n shaka.log.debug(logPrefix, 'reset mediaSource',\n 'from=', mediaState.lastInitSegmentReference,\n 'to=', reference.initSegmentReference);\n\n this.resetMediaSource(/* force= */ true).then(() => {\n const eventName = shaka.util.FakeEvent.EventName.BoundaryCrossed;\n this.playerInterface_.onEvent(new shaka.util.FakeEvent(eventName));\n });\n }\n return discard;\n }\n\n /**\n * @param {shaka.media.StreamingEngine.MediaState_} mediaState\n * @return {string} A log prefix of the form ($CONTENT_TYPE:$STREAM_ID), e.g.,\n * \"(audio:5)\" or \"(video:hd)\".\n * @private\n */\n static logPrefix_(mediaState) {\n return '(' + mediaState.type + ':' + mediaState.stream.id + ')';\n }\n};\n\n\n/**\n * @typedef {{\n * getPresentationTime: function():number,\n * getBandwidthEstimate: function():number,\n * getPlaybackRate: function():number,\n * video: !HTMLMediaElement,\n * mediaSourceEngine: !shaka.media.MediaSourceEngine,\n * netEngine: shaka.net.NetworkingEngine,\n * onError: function(!shaka.util.Error),\n * onEvent: function(!Event),\n * onSegmentAppended: function(!shaka.media.SegmentReference,\n * !shaka.extern.Stream, boolean),\n * onInitSegmentAppended: function(!number,!shaka.media.InitSegmentReference),\n * beforeAppendSegment: function(\n * shaka.util.ManifestParserUtils.ContentType,!BufferSource):Promise,\n * disableStream: function(!shaka.extern.Stream, number):boolean\n * }}\n *\n * @property {function():number} getPresentationTime\n * Get the position in the presentation (in seconds) of the content that the\n * viewer is seeing on screen right now.\n * @property {function():number} getBandwidthEstimate\n * Get the estimated bandwidth in bits per second.\n * @property {function():number} getPlaybackRate\n * Get the playback rate.\n * @property {!HTMLVideoElement} video\n * Get the video element.\n * @property {!shaka.media.MediaSourceEngine} mediaSourceEngine\n * The MediaSourceEngine. The caller retains ownership.\n * @property {shaka.net.NetworkingEngine} netEngine\n * The NetworkingEngine instance to use. The caller retains ownership.\n * @property {function(!shaka.util.Error)} onError\n * Called when an error occurs. If the error is recoverable (see\n * {@link shaka.util.Error}) then the caller may invoke either\n * StreamingEngine.switch*() or StreamingEngine.seeked() to attempt recovery.\n * @property {function(!Event)} onEvent\n * Called when an event occurs that should be sent to the app.\n * @property {function(!shaka.media.SegmentReference,\n * !shaka.extern.Stream, boolean)} onSegmentAppended\n * Called after a segment is successfully appended to a MediaSource.\n * @property {function(!number,\n * !shaka.media.InitSegmentReference)} onInitSegmentAppended\n * Called when an init segment is appended to a MediaSource.\n * @property {!function(shaka.util.ManifestParserUtils.ContentType,\n * !BufferSource):Promise} beforeAppendSegment\n * A function called just before appending to the source buffer.\n * @property {function(!shaka.extern.Stream, number):boolean} disableStream\n * Called to temporarily disable a stream i.e. disabling all variant\n * containing said stream.\n */\nshaka.media.StreamingEngine.PlayerInterface;\n\n\n/**\n * @typedef {{\n * type: shaka.util.ManifestParserUtils.ContentType,\n * stream: shaka.extern.Stream,\n * segmentIterator: shaka.media.SegmentIterator,\n * lastSegmentReference: shaka.media.SegmentReference,\n * lastInitSegmentReference: shaka.media.InitSegmentReference,\n * lastTimestampOffset: ?number,\n * lastAppendWindowStart: ?number,\n * lastAppendWindowEnd: ?number,\n * lastCodecs: ?string,\n * lastMimeType: ?string,\n * restoreStreamAfterTrickPlay: ?shaka.extern.Stream,\n * endOfStream: boolean,\n * performingUpdate: boolean,\n * updateTimer: shaka.util.DelayedTick,\n * waitingToClearBuffer: boolean,\n * waitingToFlushBuffer: boolean,\n * clearBufferSafeMargin: number,\n * clearingBuffer: boolean,\n * seeked: boolean,\n * adaptation: boolean,\n * recovering: boolean,\n * hasError: boolean,\n * operation: shaka.net.NetworkingEngine.PendingRequest,\n * segmentPrefetch: shaka.media.SegmentPrefetch,\n * dependencyMediaState: ?shaka.media.StreamingEngine.MediaState_\n * }}\n *\n * @description\n * Contains the state of a logical stream, i.e., a sequence of segmented data\n * for a particular content type. At any given time there is a Stream object\n * associated with the state of the logical stream.\n *\n * @property {shaka.util.ManifestParserUtils.ContentType} type\n * The stream's content type, e.g., 'audio', 'video', or 'text'.\n * @property {shaka.extern.Stream} stream\n * The current Stream.\n * @property {shaka.media.SegmentIndexIterator} segmentIterator\n * An iterator through the segments of |stream|.\n * @property {shaka.media.SegmentReference} lastSegmentReference\n * The SegmentReference of the last segment that was appended.\n * @property {shaka.media.InitSegmentReference} lastInitSegmentReference\n * The InitSegmentReference of the last init segment that was appended.\n * @property {?number} lastTimestampOffset\n * The last timestamp offset given to MediaSourceEngine for this type.\n * @property {?number} lastAppendWindowStart\n * The last append window start given to MediaSourceEngine for this type.\n * @property {?number} lastAppendWindowEnd\n * The last append window end given to MediaSourceEngine for this type.\n * @property {?string} lastCodecs\n * The last append codecs given to MediaSourceEngine for this type.\n * @property {?string} lastMimeType\n * The last append mime type given to MediaSourceEngine for this type.\n * @property {?shaka.extern.Stream} restoreStreamAfterTrickPlay\n * The Stream to restore after trick play mode is turned off.\n * @property {boolean} endOfStream\n * True indicates that the end of the buffer has hit the end of the\n * presentation.\n * @property {boolean} performingUpdate\n * True indicates that an update is in progress.\n * @property {shaka.util.DelayedTick} updateTimer\n * A timer used to update the media state.\n * @property {boolean} waitingToClearBuffer\n * True indicates that the buffer must be cleared after the current update\n * finishes.\n * @property {boolean} waitingToFlushBuffer\n * True indicates that the buffer must be flushed after it is cleared.\n * @property {number} clearBufferSafeMargin\n * The amount of buffer to retain when clearing the buffer after the update.\n * @property {boolean} clearingBuffer\n * True indicates that the buffer is being cleared.\n * @property {boolean} seeked\n * True indicates that the presentation just seeked.\n * @property {boolean} adaptation\n * True indicates that the presentation just automatically switched variants.\n * @property {boolean} recovering\n * True indicates that the last segment was not appended because it could not\n * fit in the buffer.\n * @property {boolean} hasError\n * True indicates that the stream has encountered an error and has stopped\n * updating.\n * @property {shaka.net.NetworkingEngine.PendingRequest} operation\n * Operation with the number of bytes to be downloaded.\n * @property {?shaka.media.SegmentPrefetch} segmentPrefetch\n * A prefetch object for managing prefetching. Null if unneeded\n * (if prefetching is disabled, etc).\n * @property {?shaka.media.StreamingEngine.MediaState_} dependencyMediaState\n * A dependency media state.\n */\nshaka.media.StreamingEngine.MediaState_;\n\n\n/**\n * The fudge factor for appendWindowStart. By adjusting the window backward, we\n * avoid rounding errors that could cause us to remove the keyframe at the start\n * of the Period.\n *\n * NOTE: This was increased as part of the solution to\n * https://github.com/shaka-project/shaka-player/issues/1281\n *\n * @const {number}\n * @private\n */\nshaka.media.StreamingEngine.APPEND_WINDOW_START_FUDGE_ = 0.1;\n\n\n/**\n * The fudge factor for appendWindowEnd. By adjusting the window backward, we\n * avoid rounding errors that could cause us to remove the last few samples of\n * the Period. This rounding error could then create an artificial gap and a\n * stutter when the gap-jumping logic takes over.\n *\n * https://github.com/shaka-project/shaka-player/issues/1597\n *\n * @const {number}\n * @private\n */\nshaka.media.StreamingEngine.APPEND_WINDOW_END_FUDGE_ = 0.01;\n\n\n/**\n * The maximum number of segments by which a stream can get ahead of other\n * streams.\n *\n * Introduced to keep StreamingEngine from letting one media type get too far\n * ahead of another. For example, audio segments are typically much smaller\n * than video segments, so in the time it takes to fetch one video segment, we\n * could fetch many audio segments. This doesn't help with buffering, though,\n * since the intersection of the two buffered ranges is what counts.\n *\n * @const {number}\n * @private\n */\nshaka.media.StreamingEngine.MAX_RUN_AHEAD_SEGMENTS_ = 1;\n\n\n/**\n * The threshold to decide if we're close to a boundary. If presentation time\n * is before this offset, boundary crossing logic will be skipped.\n *\n * @const {number}\n * @private\n */\nshaka.media.StreamingEngine.CROSS_BOUNDARY_END_THRESHOLD_ = 1;\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.ConfigUtils');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.log');\ngoog.require('shaka.util.ArrayUtils');\ngoog.require('shaka.util.ObjectUtils');\n\n\n/** @export */\nshaka.util.ConfigUtils = class {\n /**\n * @param {!Object} destination\n * @param {!Object} source\n * @param {!Object} template supplies default values\n * @param {!Object} overrides\n * Supplies override type checking. When the current path matches\n * the key in this object, each sub-value must match the type in this\n * object. If this contains an Object, it is used as the template.\n * @param {string} path to this part of the config\n * @return {boolean}\n * @export\n */\n static mergeConfigObjects(destination, source, template, overrides, path) {\n goog.asserts.assert(destination, 'Destination config must not be null!');\n\n // If true, override the template.\n const overrideTemplate = path in overrides;\n\n // If true, treat the source as a generic object to be copied without\n // descending more deeply.\n let genericObject = false;\n if (overrideTemplate) {\n genericObject = template.constructor == Object &&\n Object.keys(overrides).length == 0;\n } else {\n genericObject = template.constructor == Object &&\n Object.keys(template).length == 0;\n }\n\n // If true, don't validate the keys in the next level.\n const ignoreKeys = overrideTemplate || genericObject;\n\n let isValid = true;\n\n for (const k in source) {\n const subPath = path + '.' + k;\n const subTemplate = overrideTemplate ? overrides[path] : template[k];\n\n // The order of these checks is important.\n if (!ignoreKeys && !(k in template)) {\n shaka.log.alwaysError('Invalid config, unrecognized key ' + subPath);\n isValid = false;\n } else if (source[k] === undefined) {\n // An explicit 'undefined' value causes the key to be deleted from the\n // destination config and replaced with a default from the template if\n // possible.\n if (subTemplate === undefined || ignoreKeys) {\n // There is nothing in the template, so delete.\n delete destination[k];\n } else {\n // There is something in the template, so go back to that.\n destination[k] = shaka.util.ObjectUtils.cloneObject(subTemplate);\n }\n } else if (genericObject) {\n // Copy the fields of a generic object directly without a template and\n // without descending any deeper.\n destination[k] = source[k];\n } else if (subTemplate.constructor == Object &&\n source[k] &&\n source[k].constructor == Object) {\n // These are plain Objects with no other constructor.\n\n if (!destination[k]) {\n // Initialize the destination with the template so that normal\n // merging and type-checking can happen.\n destination[k] = shaka.util.ObjectUtils.cloneObject(subTemplate);\n }\n\n const subMergeValid = shaka.util.ConfigUtils.mergeConfigObjects(\n destination[k], source[k], subTemplate, overrides, subPath);\n isValid = isValid && subMergeValid;\n } else if (typeof source[k] != typeof subTemplate ||\n source[k] == null ||\n // Function constructors are not informative, and differ\n // between sync and async functions. So don't look at\n // constructor for function types.\n (typeof source[k] != 'function' &&\n source[k].constructor != subTemplate.constructor)) {\n // The source is the wrong type. This check allows objects to be\n // nulled, but does not allow null for any non-object fields.\n shaka.log.alwaysError('Invalid config, wrong type for ' + subPath);\n isValid = false;\n } else if (typeof template[k] == 'function' &&\n template[k].length != source[k].length) {\n shaka.log.alwaysWarn(\n 'Unexpected number of arguments for ' + subPath);\n destination[k] = source[k];\n } else {\n destination[k] = source[k];\n }\n }\n\n return isValid;\n }\n\n\n /**\n * Convert config from ('fieldName', value) format to a partial config object.\n *\n * E. g. from ('manifest.retryParameters.maxAttempts', 1) to\n * { manifest: { retryParameters: { maxAttempts: 1 }}}.\n *\n * @param {string} fieldName\n * @param {*} value\n * @return {!Object}\n * @export\n */\n static convertToConfigObject(fieldName, value) {\n const configObject = {};\n let last = configObject;\n let searchIndex = 0;\n let nameStart = 0;\n while (true) {\n const idx = fieldName.indexOf('.', searchIndex);\n if (idx < 0) {\n break;\n }\n if (idx == 0 || fieldName[idx - 1] != '\\\\') {\n const part = fieldName.substring(nameStart, idx).replace(/\\\\\\./g, '.');\n last[part] = {};\n last = last[part];\n nameStart = idx + 1;\n }\n searchIndex = idx + 1;\n }\n\n last[fieldName.substring(nameStart).replace(/\\\\\\./g, '.')] = value;\n return configObject;\n }\n\n /**\n * Reference the input parameters so the compiler doesn't remove them from\n * the calling function. Return whatever value is specified.\n *\n * This allows an empty or default implementation of a config callback that\n * still bears the complete function signature even in compiled mode.\n *\n * The caller should look something like this:\n *\n * const callback = (a, b, c, d) => {\n * return referenceParametersAndReturn(\n [a, b, c, d],\n a); // Can be anything, doesn't need to be one of the parameters\n * };\n *\n * @param {!Array<?>} parameters\n * @param {T} returnValue\n * @return {T}\n * @template T\n * @noinline\n */\n static referenceParametersAndReturn(parameters, returnValue) {\n return parameters && returnValue;\n }\n\n /**\n * @param {!Object} object\n * @param {!Object} base\n * @return {!Object}\n * @export\n */\n static getDifferenceFromConfigObjects(object, base) {\n const isObject = (obj) => {\n return obj && typeof obj === 'object' && !Array.isArray(obj);\n };\n\n const isArrayEmpty = (array) => {\n return Array.isArray(array) && array.length === 0;\n };\n\n const changes = (object, base) => {\n return Object.keys(object).reduce((acc, key) => {\n const value = object[key];\n // eslint-disable-next-line no-prototype-builtins\n if (!base.hasOwnProperty(key)) {\n acc[key] = value;\n } else if (value instanceof HTMLElement &&\n base[key] instanceof HTMLElement) {\n if (!value.isEqualNode(base[key])) {\n acc[key] = value;\n }\n } else if (isObject(value) && isObject(base[key])) {\n const diff = changes(value, base[key]);\n if (Object.keys(diff).length > 0 || !isObject(diff)) {\n acc[key] = diff;\n }\n } else if (Array.isArray(value) && Array.isArray(base[key])) {\n if (!shaka.util.ArrayUtils.hasSameElements(value, base[key])) {\n acc[key] = value;\n }\n } else if (Number.isNaN(value) && Number.isNaN(base[key])) {\n // Do nothing if both are NaN\n } else if (value !== base[key]) {\n acc[key] = value;\n }\n return acc;\n }, {});\n };\n\n const diff = changes(object, base);\n\n const removeEmpty = (obj) => {\n for (const key of Object.keys(obj)) {\n if (obj[key] instanceof HTMLElement) {\n // Do nothing if it's a HTMLElement\n } else if (isObject(obj[key]) && Object.keys(obj[key]).length === 0) {\n delete obj[key];\n } else if (isArrayEmpty(obj[key])) {\n delete obj[key];\n } else if (typeof obj[key] == 'function') {\n delete obj[key];\n } else if (isObject(obj[key])) {\n removeEmpty(obj[key]);\n if (Object.keys(obj[key]).length === 0) {\n delete obj[key];\n }\n }\n }\n };\n\n removeEmpty(diff);\n return diff;\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.drm.FairPlay');\n\ngoog.require('goog.Uri');\ngoog.require('goog.asserts');\ngoog.require('shaka.drm.DrmUtils');\ngoog.require('shaka.net.NetworkingEngine');\ngoog.require('shaka.util.BufferUtils');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.StringUtils');\ngoog.require('shaka.util.Uint8ArrayUtils');\n\n\n/**\n * @summary A set of FairPlay utility functions.\n * @export\n */\nshaka.drm.FairPlay = class {\n /**\n * Check if FairPlay is supported.\n *\n * @return {!Promise<boolean>}\n * @export\n */\n static async isFairPlaySupported() {\n const config = {\n initDataTypes: ['cenc', 'sinf', 'skd'],\n videoCapabilities: [\n {\n contentType: 'video/mp4; codecs=\"avc1.42E01E\"',\n },\n ],\n };\n try {\n await navigator.requestMediaKeySystemAccess('com.apple.fps', [config]);\n return true;\n } catch (err) {\n return false;\n }\n }\n\n /**\n * Using the default method, extract a content ID from the init data. This is\n * based on the FairPlay example documentation.\n *\n * @param {!BufferSource} initData\n * @return {string}\n * @export\n */\n static defaultGetContentId(initData) {\n const uriString = shaka.util.StringUtils.fromBytesAutoDetect(initData);\n\n // The domain of that URI is the content ID according to Apple's FPS\n // sample.\n const uri = new goog.Uri(uriString);\n return uri.getDomain();\n }\n\n /**\n * Transforms the init data buffer using the given data. The format is:\n *\n * <pre>\n * [4 bytes] initDataSize\n * [initDataSize bytes] initData\n * [4 bytes] contentIdSize\n * [contentIdSize bytes] contentId\n * [4 bytes] certSize\n * [certSize bytes] cert\n * </pre>\n *\n * @param {!BufferSource} initData\n * @param {!BufferSource|string} contentId\n * @param {?BufferSource} cert The server certificate; this will throw if not\n * provided.\n * @return {!Uint8Array}\n * @export\n */\n static initDataTransform(initData, contentId, cert) {\n if (!cert || !cert.byteLength) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.DRM,\n shaka.util.Error.Code.SERVER_CERTIFICATE_REQUIRED);\n }\n\n // From that, we build a new init data to use in the session. This is\n // composed of several parts. First, the init data as a UTF-16 sdk:// URL.\n // Second, a 4-byte LE length followed by the content ID in UTF-16-LE.\n // Third, a 4-byte LE length followed by the certificate.\n /** @type {BufferSource} */\n let contentIdArray;\n if (typeof contentId == 'string') {\n contentIdArray =\n shaka.util.StringUtils.toUTF16(contentId, /* littleEndian= */ true);\n } else {\n contentIdArray = contentId;\n }\n\n // The init data we get is a UTF-8 string; convert that to a UTF-16 string.\n const sdkUri = shaka.util.StringUtils.fromBytesAutoDetect(initData);\n const utf16 =\n shaka.util.StringUtils.toUTF16(sdkUri, /* littleEndian= */ true);\n\n const rebuiltInitData = new Uint8Array(\n 12 + utf16.byteLength + contentIdArray.byteLength + cert.byteLength);\n\n let offset = 0;\n /** @param {BufferSource} array */\n const append = (array) => {\n rebuiltInitData.set(shaka.util.BufferUtils.toUint8(array), offset);\n offset += array.byteLength;\n };\n /** @param {BufferSource} array */\n const appendWithLength = (array) => {\n const view = shaka.util.BufferUtils.toDataView(rebuiltInitData);\n const value = array.byteLength;\n view.setUint32(offset, value, /* littleEndian= */ true);\n offset += 4;\n append(array);\n };\n\n appendWithLength(utf16);\n appendWithLength(contentIdArray);\n appendWithLength(cert);\n\n goog.asserts.assert(\n offset == rebuiltInitData.length, 'Inconsistent init data length');\n return rebuiltInitData;\n }\n\n /**\n * Basic initDataTransform configuration.\n *\n * @param {!Uint8Array} initData\n * @param {string} initDataType\n * @param {?shaka.extern.DrmInfo} drmInfo\n * @return {!Uint8Array}\n * @private\n */\n static basicInitDataTransform_(initData, initDataType, drmInfo) {\n if (initDataType !== 'skd') {\n return initData;\n }\n const StringUtils = shaka.util.StringUtils;\n const cert = drmInfo.serverCertificate;\n const initDataAsString = StringUtils.fromBytesAutoDetect(initData);\n const contentId = initDataAsString.split('skd://').pop();\n return shaka.drm.FairPlay.initDataTransform(initData, contentId, cert);\n }\n\n /**\n * Verimatrix initDataTransform configuration.\n *\n * @param {!Uint8Array} initData\n * @param {string} initDataType\n * @param {?shaka.extern.DrmInfo} drmInfo\n * @return {!Uint8Array}\n * @export\n */\n static verimatrixInitDataTransform(initData, initDataType, drmInfo) {\n return shaka.drm.FairPlay.basicInitDataTransform_(\n initData, initDataType, drmInfo);\n }\n\n /**\n * EZDRM initDataTransform configuration.\n *\n * @param {!Uint8Array} initData\n * @param {string} initDataType\n * @param {?shaka.extern.DrmInfo} drmInfo\n * @return {!Uint8Array}\n * @export\n */\n static ezdrmInitDataTransform(initData, initDataType, drmInfo) {\n if (initDataType !== 'skd') {\n return initData;\n }\n const StringUtils = shaka.util.StringUtils;\n const cert = drmInfo.serverCertificate;\n const initDataAsString = StringUtils.fromBytesAutoDetect(initData);\n const contentId = initDataAsString.split(';').pop();\n return shaka.drm.FairPlay.initDataTransform(initData, contentId, cert);\n }\n\n /**\n * Conax initDataTransform configuration.\n *\n * @param {!Uint8Array} initData\n * @param {string} initDataType\n * @param {?shaka.extern.DrmInfo} drmInfo\n * @return {!Uint8Array}\n * @export\n */\n static conaxInitDataTransform(initData, initDataType, drmInfo) {\n if (initDataType !== 'skd') {\n return initData;\n }\n const StringUtils = shaka.util.StringUtils;\n const cert = drmInfo.serverCertificate;\n const initDataAsString = StringUtils.fromBytesAutoDetect(initData);\n const skdValue = initDataAsString.split('skd://').pop().split('?').shift();\n const stringToArray = (string) => {\n // 2 bytes for each char\n const buffer = new ArrayBuffer(string.length * 2);\n const array = shaka.util.BufferUtils.toUint16(buffer);\n for (let i = 0, strLen = string.length; i < strLen; i++) {\n array[i] = string.charCodeAt(i);\n }\n return array;\n };\n const contentId = stringToArray(window.atob(skdValue));\n return shaka.drm.FairPlay.initDataTransform(initData, contentId, cert);\n }\n\n /**\n * ExpressPlay initDataTransform configuration.\n *\n * @param {!Uint8Array} initData\n * @param {string} initDataType\n * @param {?shaka.extern.DrmInfo} drmInfo\n * @return {!Uint8Array}\n * @export\n */\n static expressplayInitDataTransform(initData, initDataType, drmInfo) {\n return shaka.drm.FairPlay.basicInitDataTransform_(\n initData, initDataType, drmInfo);\n }\n\n /**\n * Mux initDataTransform configuration.\n *\n * @param {!Uint8Array} initData\n * @param {string} initDataType\n * @param {?shaka.extern.DrmInfo} drmInfo\n * @return {!Uint8Array}\n * @export\n */\n static muxInitDataTransform(initData, initDataType, drmInfo) {\n return shaka.drm.FairPlay.basicInitDataTransform_(\n initData, initDataType, drmInfo);\n }\n\n /**\n * Verimatrix FairPlay request.\n *\n * @param {shaka.net.NetworkingEngine.RequestType} type\n * @param {shaka.extern.Request} request\n * @param {shaka.extern.RequestContext=} context\n * @export\n */\n static verimatrixFairPlayRequest(type, request, context) {\n if (type !== shaka.net.NetworkingEngine.RequestType.LICENSE) {\n return;\n }\n\n const drmInfo = request.drmInfo;\n if (!drmInfo ||\n !shaka.drm.DrmUtils.isFairPlayKeySystem(drmInfo.keySystem)) {\n return;\n }\n\n const body = /** @type {!(ArrayBuffer|ArrayBufferView)} */(request.body);\n const originalPayload = shaka.util.BufferUtils.toUint8(body);\n const base64Payload = shaka.util.Uint8ArrayUtils.toBase64(originalPayload);\n request.headers['Content-Type'] = 'application/x-www-form-urlencoded';\n request.body = shaka.util.StringUtils.toUTF8('spc=' + base64Payload);\n }\n\n /**\n * Set content-type to application/octet-stream in a FairPlay request.\n *\n * @param {shaka.net.NetworkingEngine.RequestType} type\n * @param {shaka.extern.Request} request\n * @param {shaka.extern.RequestContext=} context\n * @private\n */\n static octetStreamFairPlayRequest_(type, request, context) {\n if (type !== shaka.net.NetworkingEngine.RequestType.LICENSE) {\n return;\n }\n\n const drmInfo = request.drmInfo;\n if (!drmInfo ||\n !shaka.drm.DrmUtils.isFairPlayKeySystem(drmInfo.keySystem)) {\n return;\n }\n\n request.headers['Content-Type'] = 'application/octet-stream';\n }\n\n /**\n * EZDRM FairPlay request.\n *\n * @param {shaka.net.NetworkingEngine.RequestType} type\n * @param {shaka.extern.Request} request\n * @param {shaka.extern.RequestContext=} context\n * @export\n */\n static ezdrmFairPlayRequest(type, request, context) {\n shaka.drm.FairPlay.octetStreamFairPlayRequest_(type, request);\n }\n\n /**\n * Conax FairPlay request.\n *\n * @param {shaka.net.NetworkingEngine.RequestType} type\n * @param {shaka.extern.Request} request\n * @param {shaka.extern.RequestContext=} context\n * @export\n */\n static conaxFairPlayRequest(type, request, context) {\n shaka.drm.FairPlay.octetStreamFairPlayRequest_(type, request);\n }\n\n /**\n * ExpressPlay FairPlay request.\n *\n * @param {shaka.net.NetworkingEngine.RequestType} type\n * @param {shaka.extern.Request} request\n * @param {shaka.extern.RequestContext=} context\n * @export\n */\n static expressplayFairPlayRequest(type, request, context) {\n if (type !== shaka.net.NetworkingEngine.RequestType.LICENSE) {\n return;\n }\n\n const drmInfo = request.drmInfo;\n if (!drmInfo ||\n !shaka.drm.DrmUtils.isFairPlayKeySystem(drmInfo.keySystem)) {\n return;\n }\n\n shaka.drm.FairPlay.octetStreamFairPlayRequest_(type, request);\n }\n\n /**\n * Mux FairPlay request.\n *\n * @param {shaka.net.NetworkingEngine.RequestType} type\n * @param {shaka.extern.Request} request\n * @param {shaka.extern.RequestContext=} context\n * @export\n */\n static muxFairPlayRequest(type, request, context) {\n shaka.drm.FairPlay.octetStreamFairPlayRequest_(type, request);\n }\n\n /**\n * Common FairPlay response transform for some DRMs providers.\n *\n * @param {shaka.net.NetworkingEngine.RequestType} type\n * @param {shaka.extern.Response} response\n * @param {shaka.extern.RequestContext=} context\n * @export\n */\n static commonFairPlayResponse(type, response, context) {\n if (type !== shaka.net.NetworkingEngine.RequestType.LICENSE) {\n return;\n }\n\n const drmInfo = response.originalRequest.drmInfo;\n if (!drmInfo ||\n !shaka.drm.DrmUtils.isFairPlayKeySystem(drmInfo.keySystem)) {\n return;\n }\n\n // In Apple's docs, responses can be of the form:\n // '\\n<ckc>base64encoded</ckc>\\n' or 'base64encoded'\n // We have also seen responses in JSON format from some of our partners.\n // In all of these text-based formats, the CKC data is base64-encoded.\n\n let responseText;\n try {\n // Convert it to text for further processing.\n responseText = shaka.util.StringUtils.fromUTF8(response.data);\n } catch (error) {\n // Assume it's not a text format of any kind and leave it alone.\n return;\n }\n\n let licenseProcessing = false;\n\n // Trim whitespace.\n responseText = responseText.trim();\n\n // Look for <ckc> wrapper and remove it.\n if (responseText.substr(0, 5) === '<ckc>' &&\n responseText.substr(-6) === '</ckc>') {\n responseText = responseText.slice(5, -6);\n licenseProcessing = true;\n }\n\n if (!licenseProcessing) {\n // Look for a JSON wrapper and remove it.\n try {\n const responseObject = /** @type {!Object} */(JSON.parse(responseText));\n if (responseObject['ckc']) {\n responseText = responseObject['ckc'];\n licenseProcessing = true;\n }\n if (responseObject['CkcMessage']) {\n responseText = responseObject['CkcMessage'];\n licenseProcessing = true;\n }\n if (responseObject['License']) {\n responseText = responseObject['License'];\n licenseProcessing = true;\n }\n } catch (err) {\n // It wasn't JSON. Fall through with other transformations.\n }\n }\n\n if (licenseProcessing) {\n // Decode the base64-encoded data into the format the browser expects.\n // It's not clear why FairPlay license servers don't just serve this\n // directly.\n response.data = shaka.util.BufferUtils.toArrayBuffer(\n shaka.util.Uint8ArrayUtils.fromBase64(responseText));\n }\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.media.PreferenceBasedCriteria');\n\ngoog.require('shaka.config.CodecSwitchingStrategy');\ngoog.require('shaka.log');\ngoog.require('shaka.media.AdaptationSet');\ngoog.require('shaka.media.AdaptationSetCriteria');\ngoog.require('shaka.media.Capabilities');\ngoog.require('shaka.util.LanguageUtils');\n\n\n/**\n * @implements {shaka.media.AdaptationSetCriteria}\n * @final\n */\nshaka.media.PreferenceBasedCriteria = class {\n /** */\n constructor() {\n /** @private {?shaka.media.AdaptationSetCriteria.Configuration} */\n this.config_ = null;\n }\n\n /**\n * @override\n */\n configure(config) {\n this.config_ = config;\n }\n\n /**\n * @override\n */\n create(variants) {\n const Class = shaka.media.PreferenceBasedCriteria;\n\n let current;\n\n if (this.config_.language) {\n const byLanguage = Class.filterByLanguage_(\n variants, this.config_.language);\n if (byLanguage.length) {\n current = byLanguage;\n }\n }\n if (!current) {\n const byPrimary = variants.filter((variant) => variant.primary);\n if (byPrimary.length) {\n current = byPrimary;\n } else {\n current = variants;\n }\n }\n\n // Now refine the choice based on role preference. Even the empty string\n // works here, and will match variants without any roles.\n const byRole = Class.filterVariantsByRole_(current, this.config_.role);\n if (byRole.length) {\n current = byRole;\n } else {\n shaka.log.warning('No exact match for variant role could be found.');\n }\n\n if (this.config_.videoLayout) {\n const byVideoLayout = Class.filterVariantsByVideoLayout_(\n current, this.config_.videoLayout);\n if (byVideoLayout.length) {\n current = byVideoLayout;\n } else {\n shaka.log.warning(\n 'No exact match for the video layout could be found.');\n }\n }\n\n if (this.config_.hdrLevel) {\n const byHdrLevel = Class.filterVariantsByHDRLevel_(\n current, this.config_.hdrLevel);\n if (byHdrLevel.length) {\n current = byHdrLevel;\n } else {\n shaka.log.warning(\n 'No exact match for the hdr level could be found.');\n }\n }\n\n if (this.config_.channelCount) {\n const byChannel = Class.filterVariantsByAudioChannelCount_(\n current, this.config_.channelCount);\n if (byChannel.length) {\n current = byChannel;\n } else {\n shaka.log.warning(\n 'No exact match for the channel count could be found.');\n }\n }\n\n if (this.config_.audioLabel) {\n const byLabel = Class.filterVariantsByAudioLabel_(\n current, this.config_.audioLabel);\n if (byLabel.length) {\n current = byLabel;\n } else {\n shaka.log.warning('No exact match for audio label could be found.');\n }\n }\n\n if (this.config_.videoLabel) {\n const byLabel = Class.filterVariantsByVideoLabel_(\n current, this.config_.videoLabel);\n if (byLabel.length) {\n current = byLabel;\n } else {\n shaka.log.warning('No exact match for video label could be found.');\n }\n }\n\n const bySpatialAudio = Class.filterVariantsBySpatialAudio_(\n current, this.config_.spatialAudio);\n if (bySpatialAudio.length) {\n current = bySpatialAudio;\n } else {\n shaka.log.warning('No exact match for spatial audio could be found.');\n }\n\n if (this.config_.audioCodec) {\n const byAudioCodec = Class.filterVariantsByAudioCodec_(\n current, this.config_.audioCodec);\n if (byAudioCodec.length) {\n current = byAudioCodec;\n } else {\n shaka.log.warning('No exact match for audio codec could be found.');\n }\n }\n\n const supportsSmoothCodecTransitions =\n this.config_.codecSwitchingStrategy ==\n shaka.config.CodecSwitchingStrategy.SMOOTH &&\n shaka.media.Capabilities.isChangeTypeSupported();\n\n return new shaka.media.AdaptationSet(current[0], current,\n !supportsSmoothCodecTransitions);\n }\n\n /**\n * @param {!Array<shaka.extern.Variant>} variants\n * @param {string} preferredLanguage\n * @return {!Array<shaka.extern.Variant>}\n * @private\n */\n static filterByLanguage_(variants, preferredLanguage) {\n const LanguageUtils = shaka.util.LanguageUtils;\n\n /** @type {string} */\n const preferredLocale = LanguageUtils.normalize(preferredLanguage);\n\n /** @type {?string} */\n const closestLocale = LanguageUtils.findClosestLocale(\n preferredLocale,\n variants.map((variant) => LanguageUtils.getLocaleForVariant(variant)));\n\n // There were no locales close to what we preferred.\n if (!closestLocale) {\n return [];\n }\n\n // Find the variants that use the closest variant.\n return variants.filter((variant) => {\n return closestLocale == LanguageUtils.getLocaleForVariant(variant);\n });\n }\n\n /**\n * Filter Variants by role.\n *\n * @param {!Array<shaka.extern.Variant>} variants\n * @param {string} preferredRole\n * @return {!Array<shaka.extern.Variant>}\n * @private\n */\n static filterVariantsByRole_(variants, preferredRole) {\n return variants.filter((variant) => {\n if (!variant.audio) {\n return false;\n }\n\n if (preferredRole) {\n return variant.audio.roles.includes(preferredRole);\n } else {\n return variant.audio.roles.length == 0;\n }\n });\n }\n\n /**\n * Filter Variants by audio label.\n *\n * @param {!Array<shaka.extern.Variant>} variants\n * @param {string} preferredLabel\n * @return {!Array<shaka.extern.Variant>}\n * @private\n */\n static filterVariantsByAudioLabel_(variants, preferredLabel) {\n return variants.filter((variant) => {\n if (!variant.audio || !variant.audio.label) {\n return false;\n }\n\n const label1 = variant.audio.label.toLowerCase();\n const label2 = preferredLabel.toLowerCase();\n return label1 == label2;\n });\n }\n\n /**\n * Filter Variants by video label.\n *\n * @param {!Array<shaka.extern.Variant>} variants\n * @param {string} preferredLabel\n * @return {!Array<shaka.extern.Variant>}\n * @private\n */\n static filterVariantsByVideoLabel_(variants, preferredLabel) {\n return variants.filter((variant) => {\n if (!variant.video || !variant.video.label) {\n return false;\n }\n\n const label1 = variant.video.label.toLowerCase();\n const label2 = preferredLabel.toLowerCase();\n return label1 == label2;\n });\n }\n\n /**\n * Filter Variants by channelCount.\n *\n * @param {!Array<shaka.extern.Variant>} variants\n * @param {number} channelCount\n * @return {!Array<shaka.extern.Variant>}\n * @private\n */\n static filterVariantsByAudioChannelCount_(variants, channelCount) {\n return variants.filter((variant) => {\n // Filter variants with channel count less than or equal to desired value.\n if (variant.audio && variant.audio.channelsCount &&\n variant.audio.channelsCount > channelCount) {\n return false;\n }\n return true;\n }).sort((v1, v2) => {\n // We need to sort variants list by channels count, so the most close one\n // to desired value will be first on the list. It's important for the call\n // to shaka.media.AdaptationSet, which will base set of variants based on\n // first variant.\n if (!v1.audio && !v2.audio) {\n return 0;\n }\n if (!v1.audio) {\n return -1;\n }\n if (!v2.audio) {\n return 1;\n }\n return (v2.audio.channelsCount || 0) - (v1.audio.channelsCount || 0);\n });\n }\n\n /**\n * Filters variants according to the given hdr level config.\n *\n * @param {!Array<shaka.extern.Variant>} variants\n * @param {string} hdrLevel\n * @private\n */\n static filterVariantsByHDRLevel_(variants, hdrLevel) {\n if (hdrLevel == 'AUTO') {\n // Auto detect the ideal HDR level.\n if (window.matchMedia('(color-gamut: p3)').matches) {\n const someHLG = variants.some((variant) => {\n if (variant.video && variant.video.hdr &&\n variant.video.hdr == 'HLG') {\n return true;\n }\n return false;\n });\n hdrLevel = someHLG ? 'HLG' : 'PQ';\n } else {\n hdrLevel = 'SDR';\n }\n }\n return variants.filter((variant) => {\n if (variant.video && variant.video.hdr && variant.video.hdr != hdrLevel) {\n return false;\n }\n return true;\n });\n }\n\n\n /**\n * Filters variants according to the given video layout config.\n *\n * @param {!Array<shaka.extern.Variant>} variants\n * @param {string} videoLayout\n * @private\n */\n static filterVariantsByVideoLayout_(variants, videoLayout) {\n return variants.filter((variant) => {\n if (variant.video && variant.video.videoLayout &&\n variant.video.videoLayout != videoLayout) {\n return false;\n }\n return true;\n });\n }\n\n\n /**\n * Filters variants according to the given spatial audio config.\n *\n * @param {!Array<shaka.extern.Variant>} variants\n * @param {boolean} spatialAudio\n * @private\n */\n static filterVariantsBySpatialAudio_(variants, spatialAudio) {\n return variants.filter((variant) => {\n if (variant.audio && variant.audio.spatialAudio != spatialAudio) {\n return false;\n }\n return true;\n });\n }\n\n\n /**\n * Filters variants according to the given audio codec.\n *\n * @param {!Array<shaka.extern.Variant>} variants\n * @param {string} audioCodec\n * @private\n */\n static filterVariantsByAudioCodec_(variants, audioCodec) {\n return variants.filter((variant) => {\n if (variant.audio && variant.audio.codecs != audioCodec) {\n return false;\n }\n return true;\n });\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.PlayerConfiguration');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.abr.SimpleAbrManager');\ngoog.require('shaka.config.AutoShowText');\ngoog.require('shaka.config.CodecSwitchingStrategy');\ngoog.require('shaka.config.CrossBoundaryStrategy');\ngoog.require('shaka.drm.DrmUtils');\ngoog.require('shaka.drm.FairPlay');\ngoog.require('shaka.log');\ngoog.require('shaka.media.Capabilities');\ngoog.require('shaka.media.PreferenceBasedCriteria');\ngoog.require('shaka.net.NetworkingEngine');\ngoog.require('shaka.util.ConfigUtils');\ngoog.require('shaka.util.LanguageUtils');\ngoog.require('shaka.util.ManifestParserUtils');\ngoog.require('shaka.util.Platform');\n\n\n/**\n * @final\n * @export\n */\nshaka.util.PlayerConfiguration = class {\n /**\n * @return {shaka.extern.PlayerConfiguration}\n * @export\n */\n static createDefault() {\n // This is a relatively safe default in the absence of clues from the\n // browser. For slower connections, the default estimate may be too high.\n const bandwidthEstimate = 1e6; // 1Mbps\n const minBytes = 16e3;\n\n let abrMaxHeight = Infinity;\n\n // Some browsers implement the Network Information API, which allows\n // retrieving information about a user's network connection.\n if (navigator.connection) {\n // If the user has checked a box in the browser to ask it to use less\n // data, the browser will expose this intent via connection.saveData.\n // When that is true, we will default the max ABR height to 360p. Apps\n // can override this if they wish.\n //\n // The decision to use 360p was somewhat arbitrary. We needed a default\n // limit, and rather than restrict to a certain bandwidth, we decided to\n // restrict resolution. This will implicitly restrict bandwidth and\n // therefore save data. We (Shaka+Chrome) judged that:\n // - HD would be inappropriate\n // - If a user is asking their browser to save data, 360p it reasonable\n // - 360p would not look terrible on small mobile device screen\n // We also found that:\n // - YouTube's website on mobile defaults to 360p (as of 2018)\n // - iPhone 6, in portrait mode, has a physical resolution big enough\n // for 360p widescreen, but a little smaller than 480p widescreen\n // (https://apple.co/2yze4es)\n // If the content's lowest resolution is above 360p, AbrManager will use\n // the lowest resolution.\n if (navigator.connection.saveData) {\n abrMaxHeight = 360;\n }\n }\n\n const drm = {\n retryParameters: shaka.net.NetworkingEngine.defaultRetryParameters(),\n // These will all be verified by special cases in mergeConfigObjects_():\n servers: {}, // key is arbitrary key system ID, value must be string\n clearKeys: {}, // key is arbitrary key system ID, value must be string\n advanced: {}, // key is arbitrary key system ID, value is a record type\n delayLicenseRequestUntilPlayed: false,\n persistentSessionOnlinePlayback: false,\n persistentSessionsMetadata: [],\n initDataTransform: (initData, initDataType, drmInfo) => {\n if (shaka.drm.DrmUtils.isMediaKeysPolyfilled('apple') &&\n initDataType == 'skd') {\n const cert = drmInfo.serverCertificate;\n const contentId =\n shaka.drm.FairPlay.defaultGetContentId(initData);\n initData = shaka.drm.FairPlay.initDataTransform(\n initData, contentId, cert);\n }\n return initData;\n },\n logLicenseExchange: false,\n updateExpirationTime: 1,\n preferredKeySystems: [],\n keySystemsMapping: {},\n // The Xbox One browser does not detect DRM key changes signalled by a\n // change in the PSSH in media segments. We need to parse PSSH from media\n // segments to detect key changes.\n parseInbandPsshEnabled: shaka.util.Platform.isXboxOne(),\n minHdcpVersion: '',\n ignoreDuplicateInitData: !shaka.util.Platform.isTizen2(),\n defaultAudioRobustnessForWidevine: 'SW_SECURE_CRYPTO',\n defaultVideoRobustnessForWidevine: 'SW_SECURE_DECODE',\n };\n\n // The Xbox One and PS4 only support the Playready DRM, so they should\n // prefer that key system by default to improve startup performance.\n if (shaka.util.Platform.isXboxOne() ||\n shaka.util.Platform.isPS4()) {\n drm.preferredKeySystems.push('com.microsoft.playready');\n }\n\n let codecSwitchingStrategy = shaka.config.CodecSwitchingStrategy.RELOAD;\n let multiTypeVariantsAllowed = false;\n if (shaka.media.Capabilities.isChangeTypeSupported() &&\n shaka.util.Platform.supportsSmoothCodecSwitching()) {\n codecSwitchingStrategy = shaka.config.CodecSwitchingStrategy.SMOOTH;\n multiTypeVariantsAllowed = true;\n }\n\n const manifest = {\n retryParameters: shaka.net.NetworkingEngine.defaultRetryParameters(),\n availabilityWindowOverride: NaN,\n disableAudio: false,\n disableVideo: false,\n disableText: false,\n disableThumbnails: false,\n disableIFrames: false,\n defaultPresentationDelay: 0,\n segmentRelativeVttTiming: false,\n raiseFatalErrorOnManifestUpdateRequestFailure: false,\n continueLoadingWhenPaused: true,\n ignoreSupplementalCodecs: false,\n updatePeriod: -1,\n ignoreDrmInfo: false,\n dash: {\n clockSyncUri: '',\n disableXlinkProcessing: true,\n xlinkFailGracefully: false,\n ignoreMinBufferTime: false,\n autoCorrectDrift: true,\n initialSegmentLimit: 1000,\n ignoreSuggestedPresentationDelay: false,\n ignoreEmptyAdaptationSet: false,\n ignoreMaxSegmentDuration: false,\n keySystemsByURI: {\n 'urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b':\n 'org.w3.clearkey',\n 'urn:uuid:e2719d58-a985-b3c9-781a-b030af78d30e':\n 'org.w3.clearkey',\n 'urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed':\n 'com.widevine.alpha',\n 'urn:uuid:9a04f079-9840-4286-ab92-e65be0885f95':\n 'com.microsoft.playready',\n 'urn:uuid:79f0049a-4098-8642-ab92-e65be0885f95':\n 'com.microsoft.playready',\n 'urn:uuid:94ce86fb-07ff-4f43-adb8-93d2fa968ca2':\n 'com.apple.fps',\n 'urn:uuid:3d5e6d35-9b9a-41e8-b843-dd3c6e72c42c':\n 'com.huawei.wiseplay',\n },\n manifestPreprocessor:\n shaka.util.PlayerConfiguration.defaultManifestPreprocessor,\n manifestPreprocessorTXml:\n shaka.util.PlayerConfiguration.defaultManifestPreprocessorTXml,\n sequenceMode: false,\n multiTypeVariantsAllowed,\n useStreamOnceInPeriodFlattening: false,\n enableFastSwitching: true,\n },\n hls: {\n ignoreTextStreamFailures: false,\n ignoreImageStreamFailures: false,\n defaultAudioCodec: 'mp4a.40.2',\n defaultVideoCodec: 'avc1.42E01E',\n ignoreManifestProgramDateTime: false,\n ignoreManifestProgramDateTimeForTypes: [],\n mediaPlaylistFullMimeType:\n 'video/mp2t; codecs=\"avc1.42E01E, mp4a.40.2\"',\n liveSegmentsDelay: 3,\n sequenceMode: shaka.util.Platform.supportsSequenceMode(),\n ignoreManifestTimestampsInSegmentsMode: false,\n disableCodecGuessing: false,\n disableClosedCaptionsDetection: false,\n allowLowLatencyByteRangeOptimization: true,\n allowRangeRequestsToGuessMimeType: false,\n },\n mss: {\n manifestPreprocessor:\n shaka.util.PlayerConfiguration.defaultManifestPreprocessor,\n manifestPreprocessorTXml:\n shaka.util.PlayerConfiguration.defaultManifestPreprocessorTXml,\n sequenceMode: false,\n keySystemsBySystemId: {\n '9a04f079-9840-4286-ab92-e65be0885f95':\n 'com.microsoft.playready',\n '79f0049a-4098-8642-ab92-e65be0885f95':\n 'com.microsoft.playready',\n },\n },\n };\n\n const streaming = {\n retryParameters: shaka.net.NetworkingEngine.defaultRetryParameters(),\n // Need some operation in the callback or else closure may remove calls\n // to the function as it would be a no-op. The operation can't just be a\n // log message, because those are stripped in the compiled build.\n failureCallback: (error) => {\n shaka.log.error('Unhandled streaming error', error);\n return shaka.util.ConfigUtils.referenceParametersAndReturn(\n [error],\n undefined);\n },\n rebufferingGoal: 0,\n bufferingGoal: 10,\n bufferBehind: 30,\n evictionGoal: 1,\n ignoreTextStreamFailures: false,\n alwaysStreamText: false,\n startAtSegmentBoundary: false,\n gapDetectionThreshold: 0.5,\n gapPadding: 0,\n gapJumpTimerTime: 0.25 /* seconds */,\n durationBackoff: 1,\n // Offset by 5 seconds since Chromecast takes a few seconds to start\n // playing after a seek, even when buffered.\n safeSeekOffset: 5,\n safeSeekEndOffset: 0,\n stallEnabled: true,\n stallThreshold: 1 /* seconds */,\n stallSkip: 0.1 /* seconds */,\n useNativeHlsForFairPlay: true,\n // If we are within 2 seconds of the start of a live segment, fetch the\n // previous one. This allows for segment drift, but won't download an\n // extra segment if we aren't close to the start.\n // When low latency streaming is enabled, inaccurateManifestTolerance\n // will default to 0 if not specified.\n inaccurateManifestTolerance: 2,\n lowLatencyMode: false,\n forceHTTP: false,\n forceHTTPS: false,\n minBytesForProgressEvents: minBytes,\n preferNativeDash: false,\n preferNativeHls: false,\n updateIntervalSeconds: 1,\n observeQualityChanges: false,\n maxDisabledTime: 30,\n // When low latency streaming is enabled, segmentPrefetchLimit will\n // default to 2 if not specified.\n segmentPrefetchLimit: 1,\n prefetchAudioLanguages: [],\n disableAudioPrefetch: false,\n disableTextPrefetch: false,\n disableVideoPrefetch: false,\n liveSync: {\n enabled: false,\n targetLatency: 0.5,\n targetLatencyTolerance: 0.5,\n maxPlaybackRate: 1.1,\n minPlaybackRate: 0.95,\n panicMode: false,\n panicThreshold: 60,\n dynamicTargetLatency: {\n enabled: false,\n stabilityThreshold: 60,\n rebufferIncrement: 0.5,\n maxAttempts: 10,\n maxLatency: 4,\n minLatency: 1,\n },\n },\n allowMediaSourceRecoveries: true,\n minTimeBetweenRecoveries: 5,\n vodDynamicPlaybackRate: false,\n vodDynamicPlaybackRateLowBufferRate: 0.95,\n vodDynamicPlaybackRateBufferRatio: 0.5,\n preloadNextUrlWindow: 30,\n loadTimeout: 30,\n clearDecodingCache: shaka.util.Platform.isPS4() ||\n shaka.util.Platform.isPS5(),\n dontChooseCodecs: false,\n shouldFixTimestampOffset: shaka.util.Platform.isWebOS() ||\n shaka.util.Platform.isTizen(),\n avoidEvictionOnQuotaExceededError: false,\n crossBoundaryStrategy: shaka.config.CrossBoundaryStrategy.KEEP,\n };\n\n // WebOS, Tizen, Chromecast and Hisense have long hardware pipelines\n // that respond slowly to seeking.\n // Therefore we should not seek when we detect a stall\n // on one of these platforms. Instead, default stallSkip to 0 to force the\n // stall detector to pause and play instead.\n if (shaka.util.Platform.isWebOS() ||\n shaka.util.Platform.isTizen() ||\n shaka.util.Platform.isChromecast() ||\n shaka.util.Platform.isHisense()) {\n streaming.stallSkip = 0;\n }\n\n if (shaka.util.Platform.isLegacyEdge() ||\n shaka.util.Platform.isXboxOne()) {\n streaming.gapPadding = 0.01;\n }\n\n if (shaka.util.Platform.isTizen()) {\n streaming.gapPadding = 2;\n }\n\n if (shaka.util.Platform.isWebOS3()) {\n streaming.crossBoundaryStrategy =\n shaka.config.CrossBoundaryStrategy.RESET;\n }\n\n if (shaka.util.Platform.isTizen3()) {\n streaming.crossBoundaryStrategy =\n shaka.config.CrossBoundaryStrategy.RESET_TO_ENCRYPTED;\n }\n\n const offline = {\n // We need to set this to a throw-away implementation for now as our\n // default implementation will need to reference other fields in the\n // config. We will set it to our intended implementation after we have\n // the top-level object created.\n // eslint-disable-next-line require-await\n trackSelectionCallback: async (tracks) => tracks,\n\n downloadSizeCallback: async (sizeEstimate) => {\n if (navigator.storage && navigator.storage.estimate) {\n const estimate = await navigator.storage.estimate();\n // Limit to 95% of quota.\n return estimate.usage + sizeEstimate < estimate.quota * 0.95;\n } else {\n return true;\n }\n },\n\n // Need some operation in the callback or else closure may remove calls\n // to the function as it would be a no-op. The operation can't just be a\n // log message, because those are stripped in the compiled build.\n progressCallback: (content, progress) => {\n return shaka.util.ConfigUtils.referenceParametersAndReturn(\n [content, progress],\n undefined);\n },\n\n // By default we use persistent licenses as forces errors to surface if\n // a platform does not support offline licenses rather than causing\n // unexpected behaviours when someone tries to plays downloaded content\n // without a persistent license.\n usePersistentLicense: true,\n\n numberOfParallelDownloads: 5,\n };\n\n const abr = {\n enabled: true,\n useNetworkInformation: true,\n defaultBandwidthEstimate: bandwidthEstimate,\n switchInterval: 8,\n bandwidthUpgradeTarget: 0.85,\n bandwidthDowngradeTarget: 0.95,\n restrictions: {\n minWidth: 0,\n maxWidth: Infinity,\n minHeight: 0,\n maxHeight: abrMaxHeight,\n minPixels: 0,\n maxPixels: Infinity,\n minFrameRate: 0,\n maxFrameRate: Infinity,\n minBandwidth: 0,\n maxBandwidth: Infinity,\n minChannelsCount: 0,\n maxChannelsCount: Infinity,\n },\n advanced: {\n minTotalBytes: 128e3,\n minBytes,\n fastHalfLife: 2,\n slowHalfLife: 5,\n },\n restrictToElementSize: false,\n restrictToScreenSize: false,\n ignoreDevicePixelRatio: false,\n clearBufferSwitch: false,\n safeMarginSwitch: 0,\n cacheLoadThreshold: 20,\n minTimeToSwitch: shaka.util.Platform.isApple() ? 0.5 : 0,\n preferNetworkInformationBandwidth: false,\n };\n\n const cmcd = {\n enabled: false,\n sessionId: '',\n contentId: '',\n rtpSafetyFactor: 5,\n useHeaders: false,\n includeKeys: [],\n version: 1,\n };\n\n const cmsd = {\n enabled: true,\n applyMaximumSuggestedBitrate: true,\n estimatedThroughputWeightRatio: 0.5,\n };\n\n const lcevc = {\n enabled: false,\n dynamicPerformanceScaling: true,\n logLevel: 0,\n drawLogo: false,\n };\n\n const mediaSource = {\n codecSwitchingStrategy: codecSwitchingStrategy,\n addExtraFeaturesToSourceBuffer: (mimeType) => {\n return shaka.util.ConfigUtils.referenceParametersAndReturn(\n [mimeType],\n '');\n },\n forceTransmux: false,\n insertFakeEncryptionInInit: true,\n modifyCueCallback: (cue, uri) => {\n return shaka.util.ConfigUtils.referenceParametersAndReturn(\n [cue, uri],\n undefined);\n },\n dispatchAllEmsgBoxes: false,\n };\n\n let customPlayheadTracker = false;\n let skipPlayDetection = false;\n let supportsMultipleMediaElements = true;\n if (shaka.util.Platform.isSmartTV()) {\n customPlayheadTracker = true;\n skipPlayDetection = true;\n supportsMultipleMediaElements = false;\n }\n\n const ads = {\n customPlayheadTracker,\n skipPlayDetection,\n supportsMultipleMediaElements,\n disableHLSInterstitial: false,\n disableDASHInterstitial: false,\n allowPreloadOnDomElements: true,\n };\n\n const textDisplayer = {\n captionsUpdatePeriod: 0.25,\n fontScaleFactor: 1,\n };\n\n const AutoShowText = shaka.config.AutoShowText;\n\n /** @type {shaka.extern.PlayerConfiguration} */\n const config = {\n drm: drm,\n manifest: manifest,\n streaming: streaming,\n mediaSource: mediaSource,\n offline: offline,\n abrFactory: () => new shaka.abr.SimpleAbrManager(),\n adaptationSetCriteriaFactory:\n (...args) => new shaka.media.PreferenceBasedCriteria(...args),\n abr: abr,\n autoShowText: AutoShowText.IF_SUBTITLES_MAY_BE_NEEDED,\n preferredAudioLanguage: '',\n preferredAudioLabel: '',\n preferredTextLanguage: '',\n preferredVariantRole: '',\n preferredTextRole: '',\n preferredAudioChannelCount: 2,\n preferredVideoHdrLevel: 'AUTO',\n preferredVideoLayout: '',\n preferredVideoLabel: '',\n preferredVideoCodecs: [],\n preferredAudioCodecs: [],\n preferredTextFormats: [],\n preferForcedSubs: false,\n preferSpatialAudio: false,\n preferredDecodingAttributes: [],\n restrictions: {\n minWidth: 0,\n maxWidth: Infinity,\n minHeight: 0,\n maxHeight: Infinity,\n minPixels: 0,\n maxPixels: Infinity,\n minFrameRate: 0,\n maxFrameRate: Infinity,\n minBandwidth: 0,\n maxBandwidth: Infinity,\n minChannelsCount: 0,\n maxChannelsCount: Infinity,\n },\n playRangeStart: 0,\n playRangeEnd: Infinity,\n textDisplayer: textDisplayer,\n textDisplayFactory: () => null,\n cmcd: cmcd,\n cmsd: cmsd,\n lcevc: lcevc,\n ads: ads,\n ignoreHardwareResolution: false,\n };\n\n // Add this callback so that we can reference the preferred audio language\n // through the config object so that if it gets updated, we have the\n // updated value.\n // eslint-disable-next-line require-await\n offline.trackSelectionCallback = async (tracks) => {\n return shaka.util.PlayerConfiguration.defaultTrackSelect(\n tracks, config.preferredAudioLanguage,\n config.preferredVideoHdrLevel);\n };\n\n return config;\n }\n\n /**\n * @return {!Object}\n * @export\n */\n static createDefaultForLL() {\n return {\n streaming: {\n inaccurateManifestTolerance: 0,\n segmentPrefetchLimit: 2,\n updateIntervalSeconds: 0.1,\n maxDisabledTime: 1,\n retryParameters: {\n baseDelay: 100,\n },\n },\n manifest: {\n dash: {\n autoCorrectDrift: false,\n },\n retryParameters: {\n baseDelay: 100,\n },\n },\n drm: {\n retryParameters: {\n baseDelay: 100,\n },\n },\n };\n }\n\n /**\n * Merges the given configuration changes into the given destination. This\n * uses the default Player configurations as the template.\n *\n * @param {shaka.extern.PlayerConfiguration} destination\n * @param {!Object} updates\n * @param {shaka.extern.PlayerConfiguration=} template\n * @return {boolean}\n * @export\n */\n static mergeConfigObjects(destination, updates, template) {\n const overrides = {\n '.drm.keySystemsMapping': '',\n '.drm.servers': '',\n '.drm.clearKeys': '',\n '.drm.advanced': {\n distinctiveIdentifierRequired: false,\n persistentStateRequired: false,\n videoRobustness: [],\n audioRobustness: [],\n sessionType: '',\n serverCertificate: new Uint8Array(0),\n serverCertificateUri: '',\n individualizationServer: '',\n headers: {},\n },\n };\n return shaka.util.ConfigUtils.mergeConfigObjects(\n destination, updates,\n template || shaka.util.PlayerConfiguration.createDefault(), overrides,\n '');\n }\n\n /**\n * @param {!Array<shaka.extern.Track>} tracks\n * @param {string} preferredAudioLanguage\n * @param {string} preferredVideoHdrLevel\n * @return {!Array<shaka.extern.Track>}\n */\n static defaultTrackSelect(\n tracks, preferredAudioLanguage, preferredVideoHdrLevel) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n const LanguageUtils = shaka.util.LanguageUtils;\n\n let hdrLevel = preferredVideoHdrLevel;\n if (hdrLevel == 'AUTO') {\n // Auto detect the ideal HDR level.\n if (window.matchMedia('(color-gamut: p3)').matches) {\n const someHLG = tracks.some((track) => {\n if (track.hdr && track.hdr == 'HLG') {\n return true;\n }\n return false;\n });\n hdrLevel = someHLG ? 'HLG' : 'PQ';\n } else {\n hdrLevel = 'SDR';\n }\n }\n\n /** @type {!Array<shaka.extern.Track>} */\n const allVariants = tracks.filter((track) => {\n if (track.type != 'variant') {\n return false;\n }\n if (track.hdr && track.hdr != hdrLevel) {\n return false;\n }\n return true;\n });\n\n /** @type {!Array<shaka.extern.Track>} */\n let selectedVariants = [];\n\n // Find the locale that best matches our preferred audio locale.\n const closestLocale = LanguageUtils.findClosestLocale(\n preferredAudioLanguage,\n allVariants.map((variant) => variant.language));\n // If we found a locale that was close to our preference, then only use\n // variants that use that locale.\n if (closestLocale) {\n selectedVariants = allVariants.filter((variant) => {\n const locale = LanguageUtils.normalize(variant.language);\n return locale == closestLocale;\n });\n }\n\n // If we failed to get a language match, go with primary.\n if (selectedVariants.length == 0) {\n selectedVariants = allVariants.filter((variant) => {\n return variant.primary;\n });\n }\n\n // Otherwise, there is no good way to choose the language, so we don't\n // choose a language at all.\n if (selectedVariants.length == 0) {\n // Issue a warning, but only if the content has multiple languages.\n // Otherwise, this warning would just be noise.\n const languages = new Set(allVariants.map((track) => {\n return track.language;\n }));\n\n if (languages.size > 1) {\n shaka.log.warning('Could not choose a good audio track based on ' +\n 'language preferences or primary tracks. An ' +\n 'arbitrary language will be stored!');\n }\n\n // Default back to all variants.\n selectedVariants = allVariants;\n }\n\n // From previously selected variants, choose the SD ones (height <= 480).\n const tracksByHeight = selectedVariants.filter((track) => {\n return track.height && track.height <= 480;\n });\n\n // If variants don't have video or no video with height <= 480 was\n // found, proceed with the previously selected tracks.\n if (tracksByHeight.length) {\n // Sort by resolution, then select all variants which match the height\n // of the highest SD res. There may be multiple audio bitrates for the\n // same video resolution.\n tracksByHeight.sort((a, b) => {\n // The items in this list have already been screened for height, but the\n // compiler doesn't know that.\n goog.asserts.assert(a.height != null, 'Null height');\n goog.asserts.assert(b.height != null, 'Null height');\n\n return b.height - a.height;\n });\n selectedVariants = tracksByHeight.filter((track) => {\n return track.height == tracksByHeight[0].height;\n });\n }\n\n /** @type {!Array<shaka.extern.Track>} */\n const selectedTracks = [];\n\n // If there are multiple matches at different audio bitrates, select the\n // middle bandwidth one.\n if (selectedVariants.length) {\n const middleIndex = Math.floor(selectedVariants.length / 2);\n selectedVariants.sort((a, b) => a.bandwidth - b.bandwidth);\n selectedTracks.push(selectedVariants[middleIndex]);\n }\n\n // Since this default callback is used primarily by our own demo app and by\n // app developers who haven't thought about which tracks they want, we\n // should select all image/text tracks, regardless of language. This makes\n // for a better demo for us, and does not rely on user preferences for the\n // unconfigured app.\n for (const track of tracks) {\n if (track.type == ContentType.TEXT || track.type == ContentType.IMAGE) {\n selectedTracks.push(track);\n }\n }\n\n return selectedTracks;\n }\n\n /**\n * @param {!Element} element\n * @return {!Element}\n */\n static defaultManifestPreprocessor(element) {\n return shaka.util.ConfigUtils.referenceParametersAndReturn(\n [element],\n element);\n }\n\n /**\n * @param {!shaka.extern.xml.Node} element\n * @return {!shaka.extern.xml.Node}\n */\n static defaultManifestPreprocessorTXml(element) {\n return shaka.util.ConfigUtils.referenceParametersAndReturn(\n [element],\n element);\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.StateHistory');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.log');\n\n\n/**\n * This class is used to track the time spent in arbitrary states. When told of\n * a state, it will assume that state was active until a new state is provided.\n * When provided with identical states back-to-back, the existing entry will be\n * updated.\n *\n * @final\n */\nshaka.util.StateHistory = class {\n /** */\n constructor() {\n /**\n * The state that we think is still the current change. It is \"open\" for\n * updating.\n *\n * @private {?shaka.extern.StateChange}\n */\n this.open_ = null;\n\n /**\n * The stats that are \"closed\" for updating. The \"open\" state becomes closed\n * once we move to a new state.\n *\n * @private {!Array<shaka.extern.StateChange>}\n */\n this.closed_ = [];\n }\n\n /**\n * @param {string} state\n * @return {boolean} True if this changed the state\n */\n update(state) {\n // |open_| will only be |null| when we first call |update|.\n if (this.open_ == null) {\n this.start_(state);\n return true;\n } else {\n return this.update_(state);\n }\n }\n\n /**\n * Go through all entries in the history and count how much time was spend in\n * the given state.\n *\n * @param {string} state\n * @return {number}\n */\n getTimeSpentIn(state) {\n let sum = 0;\n\n if (this.open_ && this.open_.state == state) {\n sum += this.open_.duration;\n }\n\n for (const entry of this.closed_) {\n sum += entry.state == state ? entry.duration : 0;\n }\n\n return sum;\n }\n\n /**\n * Get a copy of each state change entry in the history. A copy of each entry\n * is created to break the reference to the internal data.\n *\n * @return {!Array<shaka.extern.StateChange>}\n */\n getCopy() {\n const clone = (entry) => {\n return {\n timestamp: entry.timestamp,\n state: entry.state,\n duration: entry.duration,\n };\n };\n\n const copy = [];\n for (const entry of this.closed_) {\n copy.push(clone(entry));\n }\n if (this.open_) {\n copy.push(clone(this.open_));\n }\n\n return copy;\n }\n\n /**\n * @param {string} state\n * @private\n */\n start_(state) {\n goog.asserts.assert(\n this.open_ == null,\n 'There must be no open entry in order when we start');\n shaka.log.v1('Changing Player state to', state);\n\n this.open_ = {\n timestamp: this.getNowInSeconds_(),\n state: state,\n duration: 0,\n };\n }\n\n /**\n * @param {string} state\n * @return {boolean} True if this changed the state\n * @private\n */\n update_(state) {\n goog.asserts.assert(\n this.open_,\n 'There must be an open entry in order to update it');\n\n const currentTimeSeconds = this.getNowInSeconds_();\n\n // Always update the duration so that it can always be as accurate as\n // possible.\n this.open_.duration = currentTimeSeconds - this.open_.timestamp;\n\n // If the state has not changed, there is no need to add a new entry.\n if (this.open_.state == state) {\n return false;\n }\n\n // We have changed states, so \"close\" the open state.\n shaka.log.v1('Changing Player state to', state);\n this.closed_.push(this.open_);\n this.open_ = {\n timestamp: currentTimeSeconds,\n state: state,\n duration: 0,\n };\n return true;\n }\n\n /**\n * Get the system time in seconds.\n *\n * @return {number}\n * @private\n */\n getNowInSeconds_() {\n return Date.now() / 1000;\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.SwitchHistory');\n\n\n/**\n * This class is used to track changes in variant and text selections. This\n * class will make sure that redundant switches are not recorded in the history.\n *\n * @final\n */\nshaka.util.SwitchHistory = class {\n /** */\n constructor() {\n /** @private {?shaka.extern.Variant} */\n this.currentVariant_ = null;\n\n /** @private {?shaka.extern.Stream} */\n this.currentText_ = null;\n\n /** @private {!Array<shaka.extern.TrackChoice>} */\n this.history_ = [];\n }\n\n /**\n * Update the history to show that we are currently playing |newVariant|. If\n * we are already playing |newVariant|, this update will be ignored.\n *\n * @param {shaka.extern.Variant} newVariant\n * @param {boolean} fromAdaptation\n */\n updateCurrentVariant(newVariant, fromAdaptation) {\n if (this.currentVariant_ == newVariant) {\n return;\n }\n\n this.currentVariant_ = newVariant;\n this.history_.push({\n timestamp: this.getNowInSeconds_(),\n id: newVariant.id,\n type: 'variant',\n fromAdaptation: fromAdaptation,\n bandwidth: newVariant.bandwidth,\n });\n }\n\n /**\n * Update the history to show that we are currently playing |newText|. If we\n * are already playing |newText|, this update will be ignored.\n *\n * @param {shaka.extern.Stream} newText\n * @param {boolean} fromAdaptation\n */\n updateCurrentText(newText, fromAdaptation) {\n if (this.currentText_ == newText) {\n return;\n }\n\n this.currentText_ = newText;\n this.history_.push({\n timestamp: this.getNowInSeconds_(),\n id: newText.id,\n type: 'text',\n fromAdaptation: fromAdaptation,\n bandwidth: null,\n });\n }\n\n /**\n * Get a copy of the switch history. This will make sure to expose no internal\n * references.\n *\n * @return {!Array<shaka.extern.TrackChoice>}\n */\n getCopy() {\n const copy = [];\n\n for (const entry of this.history_) {\n copy.push(this.clone_(entry));\n }\n\n return copy;\n }\n\n /**\n * Get the system time in seconds.\n *\n * @return {number}\n * @private\n */\n getNowInSeconds_() {\n return Date.now() / 1000;\n }\n\n /**\n * @param {shaka.extern.TrackChoice} entry\n * @return {shaka.extern.TrackChoice}\n * @private\n */\n clone_(entry) {\n return {\n timestamp: entry.timestamp,\n id: entry.id,\n type: entry.type,\n fromAdaptation: entry.fromAdaptation,\n bandwidth: entry.bandwidth,\n };\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.Stats');\n\ngoog.require('shaka.util.StateHistory');\ngoog.require('shaka.util.SwitchHistory');\n\n\n/**\n * This class tracks all the various components (some optional) that are used to\n * populate |shaka.extern.Stats| which is passed to the app.\n *\n * @final\n */\nshaka.util.Stats = class {\n /** */\n constructor() {\n /** @private {number} */\n this.width_ = NaN;\n /** @private {number} */\n this.height_ = NaN;\n\n /** @private {number} */\n this.totalDroppedFrames_ = NaN;\n /** @private {number} */\n this.totalDecodedFrames_ = NaN;\n /** @private {number} */\n this.totalCorruptedFrames_ = NaN;\n\n /** @private {number} */\n this.totalStallsDetected_ = NaN;\n /** @private {number} */\n this.totalGapsJumped_ = NaN;\n\n /** @private {number} */\n this.completionPercent_ = NaN;\n\n /** @private {number} */\n this.loadLatencySeconds_ = NaN;\n\n /** @private {number} */\n this.manifestTimeSeconds_ = NaN;\n\n /** @private {number} */\n this.drmTimeSeconds_ = NaN;\n\n /** @private {number} */\n this.licenseTimeSeconds_ = NaN;\n\n /** @private {number} */\n this.liveLatencySeconds_ = NaN;\n\n /** @private {number} */\n this.maxSegmentDurationSeconds_ = NaN;\n\n /** @private {number} */\n this.currentStreamBandwidth_ = NaN;\n /** @private {number} */\n this.bandwidthEstimate_ = NaN;\n\n /** @private {number} */\n this.manifestSizeBytes_ = NaN;\n /** @private {number} */\n this.bytesDownloaded_ = NaN;\n\n /** @private {number} */\n this.nonFatalErrorCount_ = 0;\n /** @private {number} */\n this.manifestPeriodCount_ = NaN;\n /** @private {number} */\n this.manifestGapCount_ = NaN;\n\n /** @private {!shaka.util.StateHistory} */\n this.stateHistory_ = new shaka.util.StateHistory();\n\n /** @private {!shaka.util.SwitchHistory} */\n this.switchHistory_ = new shaka.util.SwitchHistory();\n }\n\n /**\n * Update the ratio of dropped frames to total frames. This will replace the\n * previous values.\n *\n * @param {number} dropped\n * @param {number} decoded\n */\n setDroppedFrames(dropped, decoded) {\n this.totalDroppedFrames_ = dropped;\n this.totalDecodedFrames_ = decoded;\n }\n\n /**\n * Update corrupted frames. This will replace the previous values.\n *\n * @param {number} corrupted\n */\n setCorruptedFrames(corrupted) {\n this.totalCorruptedFrames_ = corrupted;\n }\n\n /**\n * Update number of stalls detected. This will replace the previous value.\n *\n * @param {number} stallsDetected\n */\n setStallsDetected(stallsDetected) {\n this.totalStallsDetected_ = stallsDetected;\n }\n\n /**\n * Update number of playback gaps jumped over. This will replace the previous\n * value.\n *\n * @param {number} gapsJumped\n */\n setGapsJumped(gapsJumped) {\n this.totalGapsJumped_ = gapsJumped;\n }\n\n /**\n * Set the width and height of the video we are currently playing.\n *\n * @param {number} width\n * @param {number} height\n */\n setResolution(width, height) {\n this.width_ = width;\n this.height_ = height;\n }\n\n /**\n * Record the time it took between the user signalling \"I want to play this\"\n * to \"I am now seeing this\".\n *\n * @param {number} seconds\n */\n setLoadLatency(seconds) {\n this.loadLatencySeconds_ = seconds;\n }\n\n /**\n * Record the time it took to download and parse the manifest.\n *\n * @param {number} seconds\n */\n setManifestTime(seconds) {\n this.manifestTimeSeconds_ = seconds;\n }\n\n /**\n * Record the current completion percent. This is the \"high water mark\", so it\n * will store the highest provided completion percent.\n *\n * @param {number} percent\n */\n setCompletionPercent(percent) {\n if (isNaN(this.completionPercent_)) {\n this.completionPercent_ = percent;\n } else {\n this.completionPercent_ = Math.max(this.completionPercent_, percent);\n }\n }\n\n /**\n * Record the time it took to download the first drm key.\n *\n * @param {number} seconds\n */\n setDrmTime(seconds) {\n this.drmTimeSeconds_ = seconds;\n }\n\n /**\n * Record the cumulative time spent on license requests during this session.\n *\n * @param {number} seconds\n */\n setLicenseTime(seconds) {\n this.licenseTimeSeconds_ = seconds;\n }\n\n /**\n * Record the latency in live streams.\n *\n * @param {number} seconds\n */\n setLiveLatency(seconds) {\n this.liveLatencySeconds_ = seconds;\n }\n\n /**\n * Record the presentation's max segment duration.\n *\n * @param {number} seconds\n */\n setMaxSegmentDuration(seconds) {\n this.maxSegmentDurationSeconds_ = seconds;\n }\n\n /**\n * @param {number} bandwidth\n */\n setCurrentStreamBandwidth(bandwidth) {\n this.currentStreamBandwidth_ = bandwidth;\n }\n\n /**\n * @param {number} bandwidth\n */\n setBandwidthEstimate(bandwidth) {\n this.bandwidthEstimate_ = bandwidth;\n }\n\n /**\n * @param {number} size\n */\n setManifestSize(size) {\n this.manifestSizeBytes_ = size;\n }\n\n /**\n * @param {number} bytesDownloaded\n */\n addBytesDownloaded(bytesDownloaded) {\n if (isNaN(this.bytesDownloaded_)) {\n this.bytesDownloaded_ = bytesDownloaded;\n } else {\n this.bytesDownloaded_ += bytesDownloaded;\n }\n }\n\n /** */\n addNonFatalError() {\n this.nonFatalErrorCount_++;\n }\n\n /**\n * @param {number} count\n */\n setManifestPeriodCount(count) {\n this.manifestPeriodCount_ = count;\n }\n\n /**\n * @param {number} count\n */\n setManifestGapCount(count) {\n this.manifestGapCount_ = count;\n }\n\n /**\n * @return {!shaka.util.StateHistory}\n */\n getStateHistory() {\n return this.stateHistory_;\n }\n\n /**\n * @return {!shaka.util.SwitchHistory}\n */\n getSwitchHistory() {\n return this.switchHistory_;\n }\n\n /**\n * Create a stats blob that we can pass up to the app. This blob will not\n * reference any internal data.\n *\n * @return {shaka.extern.Stats}\n */\n getBlob() {\n return {\n width: this.width_,\n height: this.height_,\n streamBandwidth: this.currentStreamBandwidth_,\n decodedFrames: this.totalDecodedFrames_,\n droppedFrames: this.totalDroppedFrames_,\n corruptedFrames: this.totalCorruptedFrames_,\n stallsDetected: this.totalStallsDetected_,\n gapsJumped: this.totalGapsJumped_,\n estimatedBandwidth: this.bandwidthEstimate_,\n completionPercent: this.completionPercent_,\n loadLatency: this.loadLatencySeconds_,\n manifestTimeSeconds: this.manifestTimeSeconds_,\n drmTimeSeconds: this.drmTimeSeconds_,\n playTime: this.stateHistory_.getTimeSpentIn('playing'),\n pauseTime: this.stateHistory_.getTimeSpentIn('paused'),\n bufferingTime: this.stateHistory_.getTimeSpentIn('buffering'),\n licenseTime: this.licenseTimeSeconds_,\n liveLatency: this.liveLatencySeconds_,\n maxSegmentDuration: this.maxSegmentDurationSeconds_,\n manifestSizeBytes: this.manifestSizeBytes_,\n bytesDownloaded: this.bytesDownloaded_,\n nonFatalErrorCount: this.nonFatalErrorCount_,\n manifestPeriodCount: this.manifestPeriodCount_,\n manifestGapCount: this.manifestGapCount_,\n stateHistory: this.stateHistory_.getCopy(),\n switchHistory: this.switchHistory_.getCopy(),\n };\n }\n\n /**\n * Create an empty stats blob. This resembles the stats when we are not\n * playing any content.\n *\n * @return {shaka.extern.Stats}\n */\n static getEmptyBlob() {\n return {\n width: NaN,\n height: NaN,\n streamBandwidth: NaN,\n decodedFrames: NaN,\n droppedFrames: NaN,\n corruptedFrames: NaN,\n stallsDetected: NaN,\n gapsJumped: NaN,\n estimatedBandwidth: NaN,\n completionPercent: NaN,\n loadLatency: NaN,\n manifestTimeSeconds: NaN,\n drmTimeSeconds: NaN,\n playTime: NaN,\n pauseTime: NaN,\n bufferingTime: NaN,\n licenseTime: NaN,\n liveLatency: NaN,\n maxSegmentDuration: NaN,\n manifestSizeBytes: NaN,\n bytesDownloaded: NaN,\n nonFatalErrorCount: NaN,\n manifestPeriodCount: NaN,\n manifestGapCount: NaN,\n switchHistory: [],\n stateHistory: [],\n };\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2023 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.media.PreloadManager');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.drm.DrmEngine');\ngoog.require('shaka.drm.DrmUtils');\ngoog.require('shaka.log');\ngoog.require('shaka.media.AdaptationSetCriteria');\ngoog.require('shaka.media.ManifestFilterer');\ngoog.require('shaka.media.ManifestParser');\ngoog.require('shaka.media.QualityObserver');\ngoog.require('shaka.media.RegionTimeline');\ngoog.require('shaka.media.SegmentPrefetch');\ngoog.require('shaka.media.StreamingEngine');\ngoog.require('shaka.net.NetworkingEngine');\ngoog.require('shaka.util.ConfigUtils');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.FakeEvent');\ngoog.require('shaka.util.FakeEventTarget');\ngoog.require('shaka.util.IDestroyable');\ngoog.require('shaka.util.ObjectUtils');\ngoog.require('shaka.util.PlayerConfiguration');\ngoog.require('shaka.util.PublicPromise');\ngoog.require('shaka.util.Stats');\ngoog.require('shaka.util.StreamUtils');\n\n/**\n * @implements {shaka.util.IDestroyable}\n * @export\n */\nshaka.media.PreloadManager = class extends shaka.util.FakeEventTarget {\n /**\n * @param {string} assetUri\n * @param {?string} mimeType\n * @param {?number} startTime\n * @param {*} playerInterface\n */\n constructor(assetUri, mimeType, startTime, playerInterface) {\n super();\n\n // Making the playerInterface a * and casting it to the right type allows\n // for the PlayerInterface for this class to not be exported.\n // Unfortunately, the constructor is exported by default.\n const typedPlayerInterface =\n /** @type {!shaka.media.PreloadManager.PlayerInterface} */ (\n playerInterface);\n\n /** @private {string} */\n this.assetUri_ = assetUri;\n\n /** @private {?string} */\n this.mimeType_ = mimeType;\n\n /** @private {!shaka.net.NetworkingEngine} */\n this.networkingEngine_ = typedPlayerInterface.networkingEngine;\n\n /** @private {?number} */\n this.startTime_ = startTime;\n\n /** @private {?shaka.media.AdaptationSetCriteria} */\n this.currentAdaptationSetCriteria_ = null;\n\n /** @private {number} */\n this.startTimeOfDrm_ = 0;\n\n /** @private {function():!shaka.drm.DrmEngine} */\n this.createDrmEngine_ = typedPlayerInterface.createDrmEngine;\n\n /** @private {!shaka.media.ManifestFilterer} */\n this.manifestFilterer_ = typedPlayerInterface.manifestFilterer;\n\n /** @private {!shaka.extern.ManifestParser.PlayerInterface} */\n this.manifestPlayerInterface_ =\n typedPlayerInterface.manifestPlayerInterface;\n\n /** @private {!shaka.extern.PlayerConfiguration} */\n this.config_ = typedPlayerInterface.config;\n\n /** @private {?shaka.extern.Manifest} */\n this.manifest_ = null;\n\n /** @private {?shaka.extern.ManifestParser.Factory} */\n this.parserFactory_ = null;\n\n /** @private {?shaka.extern.ManifestParser} */\n this.parser_ = null;\n\n /** @private {boolean} */\n this.parserEntrusted_ = false;\n\n /**\n * @private {!shaka.media.RegionTimeline<\n * shaka.extern.TimelineRegionInfo>}\n */\n this.regionTimeline_ = typedPlayerInterface.regionTimeline;\n\n /** @private {boolean} */\n this.regionTimelineEntrusted_ = false;\n\n /** @private {?shaka.drm.DrmEngine} */\n this.drmEngine_ = null;\n\n /** @private {boolean} */\n this.drmEngineEntrusted_ = false;\n\n /** @private {?shaka.extern.AbrManager.Factory} */\n this.abrManagerFactory_ = null;\n\n /** @private {shaka.extern.AbrManager} */\n this.abrManager_ = null;\n\n /** @private {boolean} */\n this.abrManagerEntrusted_ = false;\n\n /** @private {!Map<number, shaka.media.SegmentPrefetch>} */\n this.segmentPrefetchById_ = new Map();\n\n /** @private {boolean} */\n this.segmentPrefetchEntrusted_ = false;\n\n /** @private {?shaka.media.QualityObserver} */\n this.qualityObserver_ = typedPlayerInterface.qualityObserver;\n\n /** @private {!shaka.util.Stats} */\n this.stats_ = new shaka.util.Stats();\n\n /** @private {!shaka.util.PublicPromise} */\n this.manifestPromise_ = new shaka.util.PublicPromise();\n\n /** @private {!shaka.util.PublicPromise} */\n this.successPromise_ = new shaka.util.PublicPromise();\n\n /** @private {?shaka.util.FakeEventTarget} */\n this.eventHandoffTarget_ = null;\n\n /** @private {boolean} */\n this.destroyed_ = false;\n\n /** @private {boolean} */\n this.allowPrefetch_ = typedPlayerInterface.allowPrefetch;\n\n /** @private {?shaka.extern.Variant} */\n this.prefetchedVariant_ = null;\n\n /** @private {?shaka.extern.Stream} */\n this.prefetchedTextStream_ = null;\n\n /** @private {boolean} */\n this.allowMakeAbrManager_ = typedPlayerInterface.allowMakeAbrManager;\n\n /** @private {boolean} */\n this.hasBeenAttached_ = false;\n\n /** @private {?Array<function()>} */\n this.queuedOperations_ = [];\n\n /** @private {?Array<function()>} */\n this.latePhaseQueuedOperations_ = [];\n\n /** @private {boolean} */\n this.isPreload_ = true;\n }\n\n /**\n * Makes it so that net requests launched from this load will no longer be\n * marked as \"isPreload\"\n */\n markIsLoad() {\n this.isPreload_ = false;\n }\n\n /**\n * @param {boolean} latePhase\n * @param {function()} callback\n */\n addQueuedOperation(latePhase, callback) {\n const queue =\n latePhase ? this.latePhaseQueuedOperations_ : this.queuedOperations_;\n if (queue) {\n queue.push(callback);\n } else {\n callback();\n }\n }\n\n /** Calls all late phase queued operations, and stops queueing them. */\n stopQueuingLatePhaseQueuedOperations() {\n if (this.latePhaseQueuedOperations_) {\n for (const callback of this.latePhaseQueuedOperations_) {\n callback();\n }\n }\n this.latePhaseQueuedOperations_ = null;\n }\n\n /** @param {!shaka.util.FakeEventTarget} eventHandoffTarget */\n setEventHandoffTarget(eventHandoffTarget) {\n this.eventHandoffTarget_ = eventHandoffTarget;\n this.hasBeenAttached_ = true;\n // Also call all queued operations, and stop queuing them in the future.\n if (this.queuedOperations_) {\n for (const callback of this.queuedOperations_) {\n callback();\n }\n }\n this.queuedOperations_ = null;\n }\n\n /** @param {number} offset */\n setOffsetToStartTime(offset) {\n if (this.startTime_ && offset) {\n this.startTime_ += offset;\n }\n }\n\n /** @return {?number} */\n getStartTime() {\n return this.startTime_;\n }\n\n /** @return {number} */\n getStartTimeOfDRM() {\n return this.startTimeOfDrm_;\n }\n\n /** @return {?string} */\n getMimeType() {\n return this.mimeType_;\n }\n\n /** @return {string} */\n getAssetUri() {\n return this.assetUri_;\n }\n\n /** @return {?shaka.extern.Manifest} */\n getManifest() {\n return this.manifest_;\n }\n\n /** @return {?shaka.extern.ManifestParser.Factory} */\n getParserFactory() {\n return this.parserFactory_;\n }\n\n /** @return {?shaka.media.AdaptationSetCriteria} */\n getCurrentAdaptationSetCriteria() {\n return this.currentAdaptationSetCriteria_;\n }\n\n /** @return {?shaka.extern.AbrManager.Factory} */\n getAbrManagerFactory() {\n return this.abrManagerFactory_;\n }\n\n /**\n * Gets the abr manager, if it exists. Also marks that the abr manager should\n * not be stopped if this manager is destroyed.\n * @return {?shaka.extern.AbrManager}\n */\n receiveAbrManager() {\n this.abrManagerEntrusted_ = true;\n return this.abrManager_;\n }\n\n /**\n * @return {?shaka.extern.AbrManager}\n */\n getAbrManager() {\n return this.abrManager_;\n }\n\n /**\n * Gets the parser, if it exists. Also marks that the parser should not be\n * stopped if this manager is destroyed.\n * @return {?shaka.extern.ManifestParser}\n */\n receiveParser() {\n this.parserEntrusted_ = true;\n return this.parser_;\n }\n\n /**\n * @return {?shaka.extern.ManifestParser}\n */\n getParser() {\n return this.parser_;\n }\n\n /**\n * Gets the region timeline, if it exists. Also marks that the timeline should\n * not be released if this manager is destroyed.\n * @return {?shaka.media.RegionTimeline<shaka.extern.TimelineRegionInfo>}\n */\n receiveRegionTimeline() {\n this.regionTimelineEntrusted_ = true;\n return this.regionTimeline_;\n }\n\n /**\n * @return {?shaka.media.RegionTimeline<shaka.extern.TimelineRegionInfo>}\n */\n getRegionTimeline() {\n return this.regionTimeline_;\n }\n\n /** @return {?shaka.media.QualityObserver} */\n getQualityObserver() {\n return this.qualityObserver_;\n }\n\n /** @return {!shaka.util.Stats} */\n getStats() {\n return this.stats_;\n }\n\n /** @return {!shaka.media.ManifestFilterer} */\n getManifestFilterer() {\n return this.manifestFilterer_;\n }\n\n /**\n * Gets the drm engine, if it exists. Also marks that the drm engine should\n * not be destroyed if this manager is destroyed.\n * @return {?shaka.drm.DrmEngine}\n */\n receiveDrmEngine() {\n this.drmEngineEntrusted_ = true;\n return this.drmEngine_;\n }\n\n /**\n * @return {?shaka.drm.DrmEngine}\n */\n getDrmEngine() {\n return this.drmEngine_;\n }\n\n /**\n * @return {?shaka.extern.Variant}\n */\n getPrefetchedVariant() {\n return this.prefetchedVariant_;\n }\n\n /**\n * Gets the preloaded variant track if it exists.\n *\n * @return {?shaka.extern.Track}\n * @export\n */\n getPrefetchedVariantTrack() {\n if (!this.prefetchedVariant_) {\n return null;\n }\n return shaka.util.StreamUtils.variantToTrack(this.prefetchedVariant_);\n }\n\n /**\n * Gets the preloaded text track if it exists.\n *\n * @return {?shaka.extern.Track}\n * @export\n */\n getPrefetchedTextTrack() {\n if (!this.prefetchedTextStream_) {\n return null;\n }\n return shaka.util.StreamUtils.textStreamToTrack(this.prefetchedTextStream_);\n }\n\n /**\n * Gets the SegmentPrefetch objects for the initial stream ids. Also marks\n * that those objects should not be aborted if this manager is destroyed.\n * @return {!Map<number, shaka.media.SegmentPrefetch>}\n */\n receiveSegmentPrefetchesById() {\n this.segmentPrefetchEntrusted_ = true;\n return this.segmentPrefetchById_;\n }\n\n /**\n * @param {?shaka.extern.AbrManager} abrManager\n * @param {?shaka.extern.AbrManager.Factory} abrFactory\n */\n attachAbrManager(abrManager, abrFactory) {\n this.abrManager_ = abrManager;\n this.abrManagerFactory_ = abrFactory;\n }\n\n /**\n * @param {?shaka.media.AdaptationSetCriteria} adaptationSetCriteria\n */\n attachAdaptationSetCriteria(adaptationSetCriteria) {\n this.currentAdaptationSetCriteria_ = adaptationSetCriteria;\n }\n\n /**\n * @param {!shaka.extern.Manifest} manifest\n * @param {!shaka.extern.ManifestParser} parser\n * @param {!shaka.extern.ManifestParser.Factory} parserFactory\n */\n attachManifest(manifest, parser, parserFactory) {\n this.manifest_ = manifest;\n this.parser_ = parser;\n this.parserFactory_ = parserFactory;\n }\n\n /**\n * Starts the process of loading the asset.\n * Success or failure will be measured through waitForFinish()\n */\n start() {\n (async () => {\n // Force a context switch, to give the player a chance to hook up events\n // immediately if desired.\n await Promise.resolve();\n\n // Perform the preloading process.\n try {\n await this.parseManifestInner_();\n this.throwIfDestroyed_();\n\n if (!shaka.drm.DrmUtils.isMediaKeysPolyfilled('webkit')) {\n await this.initializeDrm();\n this.throwIfDestroyed_();\n }\n\n await this.chooseInitialVariantAndPrefetchInner_();\n this.throwIfDestroyed_();\n\n // We don't need the drm keys to load completely for the initial variant\n // to be chosen, but we won't mark the load as a success until it has\n // been loaded. So wait for it here, not inside initializeDrmInner_.\n if (this.allowPrefetch_ && this.drmEngine_) {\n await this.drmEngine_.waitForActiveRequests();\n this.throwIfDestroyed_();\n }\n\n this.successPromise_.resolve();\n } catch (error) {\n // Ignore OPERATION_ABORTED and OBJECT_DESTROYED errors.\n if (!(error instanceof shaka.util.Error) ||\n (error.code != shaka.util.Error.Code.OPERATION_ABORTED &&\n error.code != shaka.util.Error.Code.OBJECT_DESTROYED)) {\n this.successPromise_.reject(error);\n }\n }\n })();\n }\n\n /**\n * @param {!Event} event\n * @return {boolean}\n * @override\n */\n dispatchEvent(event) {\n if (this.eventHandoffTarget_) {\n return this.eventHandoffTarget_.dispatchEvent(event);\n } else {\n return super.dispatchEvent(event);\n }\n }\n\n /**\n * @param {!shaka.util.Error} error\n */\n onError(error) {\n if (error.severity === shaka.util.Error.Severity.CRITICAL) {\n // Cancel the loading process.\n this.successPromise_.reject(error);\n this.destroy();\n }\n\n const eventName = shaka.util.FakeEvent.EventName.Error;\n const event = this.makeEvent_(eventName, (new Map()).set('detail', error));\n this.dispatchEvent(event);\n if (event.defaultPrevented) {\n error.handled = true;\n }\n }\n\n /**\n * Throw if destroyed, to interrupt processes with a recognizable error.\n *\n * @private\n */\n throwIfDestroyed_() {\n if (this.isDestroyed()) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.PLAYER,\n shaka.util.Error.Code.OBJECT_DESTROYED);\n }\n }\n\n /**\n * Makes a fires an event corresponding to entering a state of the loading\n * process.\n * @param {string} nodeName\n * @private\n */\n makeStateChangeEvent_(nodeName) {\n this.dispatchEvent(new shaka.util.FakeEvent(\n /* name= */ shaka.util.FakeEvent.EventName.OnStateChange,\n /* data= */ (new Map()).set('state', nodeName)));\n }\n\n /**\n * @param {!shaka.util.FakeEvent.EventName} name\n * @param {Map<string, Object>=} data\n * @return {!shaka.util.FakeEvent}\n * @private\n */\n makeEvent_(name, data) {\n return new shaka.util.FakeEvent(name, data);\n }\n\n /**\n * Pick and initialize a manifest parser, then have it download and parse the\n * manifest.\n *\n * @return {!Promise}\n * @private\n */\n async parseManifestInner_() {\n this.makeStateChangeEvent_('manifest-parser');\n\n if (!this.parser_) {\n // Create the parser that we will use to parse the manifest.\n this.parserFactory_ = shaka.media.ManifestParser.getFactory(\n this.assetUri_, this.mimeType_);\n goog.asserts.assert(this.parserFactory_, 'Must have manifest parser');\n this.parser_ = this.parserFactory_();\n\n this.parser_.configure(this.config_.manifest, () => this.isPreload_);\n }\n\n const startTime = Date.now() / 1000;\n\n this.makeStateChangeEvent_('manifest');\n\n if (!this.manifest_) {\n this.manifest_ = await this.parser_.start(\n this.assetUri_, this.manifestPlayerInterface_);\n\n if (this.manifest_.variants.length == 1) {\n const createSegmentIndexPromises = [];\n const variant = this.manifest_.variants[0];\n for (const stream of [variant.video, variant.audio]) {\n if (stream && !stream.segmentIndex) {\n createSegmentIndexPromises.push(stream.createSegmentIndex());\n }\n }\n if (createSegmentIndexPromises.length > 0) {\n await Promise.all(createSegmentIndexPromises);\n }\n }\n }\n\n this.manifestPromise_.resolve();\n\n // This event is fired after the manifest is parsed, but before any\n // filtering takes place.\n const event =\n this.makeEvent_(shaka.util.FakeEvent.EventName.ManifestParsed);\n // Delay event to ensure manifest has been properly propagated\n // to the player.\n await Promise.resolve();\n this.dispatchEvent(event);\n\n // We require all manifests to have at least one variant.\n if (this.manifest_.variants.length == 0) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.NO_VARIANTS);\n }\n\n // Make sure that all variants are either: audio-only, video-only, or\n // audio-video.\n shaka.media.PreloadManager.filterForAVVariants_(this.manifest_);\n\n const now = Date.now() / 1000;\n const delta = now - startTime;\n this.stats_.setManifestTime(delta);\n }\n\n /**\n * Initializes the DRM engine.\n * @param {?HTMLMediaElement=} media\n * @return {!Promise}\n */\n async initializeDrm(media) {\n if (!this.manifest_ || this.drmEngine_) {\n return;\n }\n\n this.makeStateChangeEvent_('drm-engine');\n\n this.startTimeOfDrm_ = Date.now() / 1000;\n\n this.drmEngine_ = this.createDrmEngine_();\n this.manifestFilterer_.setDrmEngine(this.drmEngine_);\n\n this.drmEngine_.configure(this.config_.drm, () => this.isPreload_);\n\n const tracksChangedInitial = this.manifestFilterer_.applyRestrictions(\n this.manifest_);\n if (tracksChangedInitial) {\n const event = this.makeEvent_(\n shaka.util.FakeEvent.EventName.TracksChanged);\n await Promise.resolve();\n this.throwIfDestroyed_();\n this.dispatchEvent(event);\n }\n\n const playableVariants = shaka.util.StreamUtils.getPlayableVariants(\n this.manifest_.variants);\n let isLive = true;\n // In HLS we need to parse the media playlist to know if it is Live or not.\n // So at this point we don't know yet. By default we assume it is Live.\n if (this.manifest_ && this.manifest_.presentationTimeline &&\n this.manifest_.type != shaka.media.ManifestParser.HLS) {\n isLive = this.manifest_.presentationTimeline.isLive();\n }\n await this.drmEngine_.initForPlayback(\n playableVariants,\n this.manifest_.offlineSessionIds,\n isLive);\n this.throwIfDestroyed_();\n if (media) {\n await this.drmEngine_.attach(media);\n this.throwIfDestroyed_();\n }\n\n // Now that we have drm information, filter the manifest (again) so that\n // we can ensure we only use variants with the selected key system.\n const tracksChangedAfter = await this.manifestFilterer_.filterManifest(\n this.manifest_);\n if (tracksChangedAfter) {\n const event = this.makeEvent_(\n shaka.util.FakeEvent.EventName.TracksChanged);\n await Promise.resolve();\n this.dispatchEvent(event);\n }\n }\n\n /** @param {!shaka.extern.PlayerConfiguration} config */\n reconfigure(config) {\n this.config_ = config;\n }\n\n /**\n * @param {string} name\n * @param {*=} value\n */\n configure(name, value) {\n const config = shaka.util.ConfigUtils.convertToConfigObject(name, value);\n shaka.util.PlayerConfiguration.mergeConfigObjects(this.config_, config);\n }\n\n /**\n * Return a copy of the current configuration.\n *\n * @return {shaka.extern.PlayerConfiguration}\n */\n getConfiguration() {\n return shaka.util.ObjectUtils.cloneObject(this.config_);\n }\n\n /**\n * Performs a final filtering of the manifest, and chooses the initial\n * variant. Also prefetches segments.\n *\n * @return {!Promise}\n * @private\n */\n async chooseInitialVariantAndPrefetchInner_() {\n goog.asserts.assert(\n this.manifest_, 'The manifest should already be parsed.');\n\n // This step does not have any associated events, as it is only part of the\n // \"load\" state in the old state graph.\n\n if (!this.currentAdaptationSetCriteria_) {\n // Copy preferred languages from the config again, in case the config was\n // changed between construction and playback.\n this.currentAdaptationSetCriteria_ =\n this.config_.adaptationSetCriteriaFactory();\n this.currentAdaptationSetCriteria_.configure({\n language: this.config_.preferredAudioLanguage,\n role: this.config_.preferredVariantRole,\n channelCount: this.config_.preferredAudioChannelCount,\n hdrLevel: this.config_.preferredVideoHdrLevel,\n spatialAudio: this.config_.preferSpatialAudio,\n videoLayout: this.config_.preferredVideoLayout,\n audioLabel: this.config_.preferredAudioLabel,\n videoLabel: this.config_.preferredVideoLabel,\n codecSwitchingStrategy:\n this.config_.mediaSource.codecSwitchingStrategy,\n audioCodec: '',\n });\n }\n\n // Make the ABR manager.\n if (this.allowMakeAbrManager_) {\n const abrFactory = this.config_.abrFactory;\n this.abrManagerFactory_ = abrFactory;\n this.abrManager_ = abrFactory();\n this.abrManager_.configure(this.config_.abr);\n }\n\n if (this.allowPrefetch_) {\n const isLive = this.manifest_.presentationTimeline.isLive();\n // Prefetch segments for the predicted first variant.\n // We start these here, but don't wait for them; it's okay to start the\n // full load process while the segments are being prefetched.\n const playableVariants = shaka.util.StreamUtils.getPlayableVariants(\n this.manifest_.variants);\n const adaptationSet = this.currentAdaptationSetCriteria_.create(\n playableVariants);\n // Guess what the first variant will be, based on a SimpleAbrManager.\n this.abrManager_.configure(this.config_.abr);\n this.abrManager_.setVariants(Array.from(adaptationSet.values()));\n const variant = this.abrManager_.chooseVariant();\n if (variant) {\n const promises = [];\n this.prefetchedVariant_ = variant;\n if (variant.video) {\n promises.push(this.prefetchStream_(variant.video, isLive));\n }\n if (variant.audio) {\n promises.push(this.prefetchStream_(variant.audio, isLive));\n }\n const textStream = this.chooseTextStream_();\n if (textStream && shaka.util.StreamUtils.shouldInitiallyShowText(\n variant.audio, textStream, this.config_)) {\n promises.push(this.prefetchStream_(textStream, isLive));\n this.prefetchedTextStream_ = textStream;\n }\n\n await Promise.all(promises);\n }\n }\n }\n\n /**\n * @return {?shaka.extern.Stream}\n * @private\n */\n chooseTextStream_() {\n const subset = shaka.util.StreamUtils.filterStreamsByLanguageAndRole(\n this.manifest_.textStreams,\n this.config_.preferredTextLanguage,\n this.config_.preferredTextRole,\n this.config_.preferForcedSubs);\n return subset[0] || null;\n }\n\n /**\n * @param {!shaka.extern.Stream} stream\n * @param {boolean} isLive\n * @return {!Promise}\n * @private\n */\n async prefetchStream_(stream, isLive) {\n // Use the prefetch limit from the config if this is set, otherwise use 2.\n const prefetchLimit = this.config_.streaming.segmentPrefetchLimit || 2;\n const prefetch = new shaka.media.SegmentPrefetch(\n prefetchLimit, stream, (reference, stream, streamDataCallback) => {\n return shaka.media.StreamingEngine.dispatchFetch(\n reference, stream, streamDataCallback || null,\n this.config_.streaming.retryParameters, this.networkingEngine_,\n this.isPreload_);\n }, /* reverse= */ false);\n this.segmentPrefetchById_.set(stream.id, prefetch);\n\n // Start prefetching a bit.\n if (!stream.segmentIndex) {\n await stream.createSegmentIndex();\n }\n const startTime = this.startTime_ || 0;\n const prefetchSegmentIterator =\n stream.segmentIndex.getIteratorForTime(startTime);\n let prefetchSegment =\n prefetchSegmentIterator ? prefetchSegmentIterator.current() : null;\n if (!prefetchSegment) {\n // If we can't get a segment at the desired spot, at least get a segment,\n // so we can get the init segment.\n prefetchSegment = stream.segmentIndex.earliestReference();\n }\n if (prefetchSegment) {\n if (isLive) {\n // Preload only the init segment for Live\n if (prefetchSegment.initSegmentReference) {\n await prefetch.prefetchInitSegment(\n prefetchSegment.initSegmentReference);\n }\n } else {\n // Preload a segment, too... either the first segment, or the segment\n // that corresponds with this.startTime_, as appropriate.\n // Note: this method also preload the init segment\n await prefetch.prefetchSegmentsByTime(prefetchSegment.startTime);\n }\n }\n }\n\n /**\n * Waits for the loading to be finished (or to fail with an error).\n * @return {!Promise}\n * @export\n */\n waitForFinish() {\n return this.successPromise_;\n }\n\n /**\n * Waits for the manifest to be loaded (or to fail with an error).\n * @return {!Promise}\n */\n waitForManifest() {\n const promises = [\n this.manifestPromise_,\n this.successPromise_,\n ];\n return Promise.race(promises);\n }\n\n /**\n * Releases or stops all non-entrusted resources.\n *\n * @override\n * @export\n */\n async destroy() {\n this.destroyed_ = true;\n if (this.parser_ && !this.parserEntrusted_) {\n await this.parser_.stop();\n }\n if (this.abrManager_ && !this.abrManagerEntrusted_) {\n await this.abrManager_.stop();\n }\n if (this.regionTimeline_ && !this.regionTimelineEntrusted_) {\n this.regionTimeline_.release();\n }\n if (this.drmEngine_ && !this.drmEngineEntrusted_) {\n await this.drmEngine_.destroy();\n }\n if (this.segmentPrefetchById_.size > 0 && !this.segmentPrefetchEntrusted_) {\n for (const segmentPrefetch of this.segmentPrefetchById_.values()) {\n segmentPrefetch.clearAll();\n }\n }\n // this.eventHandoffTarget_ is not unset, so that events and errors fired\n // after the preload manager is destroyed will still be routed to the\n // player, if it was once linked up.\n }\n\n /** @return {boolean} */\n isDestroyed() {\n return this.destroyed_;\n }\n\n /** @return {boolean} */\n hasBeenAttached() {\n return this.hasBeenAttached_;\n }\n\n /**\n * Take a series of variants and ensure that they only contain one type of\n * variant. The different options are:\n * 1. Audio-Video\n * 2. Audio-Only\n * 3. Video-Only\n *\n * A manifest can only contain a single type because once we initialize media\n * source to expect specific streams, it must always have content for those\n * streams. If we were to start with audio+video and switch to an audio-only\n * variant, media source would block waiting for video content.\n *\n * @param {shaka.extern.Manifest} manifest\n * @private\n */\n static filterForAVVariants_(manifest) {\n const isAVVariant = (variant) => {\n // Audio-video variants may include both streams separately or may be\n // single multiplexed streams with multiple codecs.\n return (variant.video && variant.audio) ||\n (variant.video && variant.video.codecs.includes(','));\n };\n if (manifest.variants.some(isAVVariant)) {\n shaka.log.debug('Found variant with audio and video content, ' +\n 'so filtering out audio-only content.');\n manifest.variants = manifest.variants.filter(isAVVariant);\n }\n }\n};\n\n/**\n * @typedef {{\n * config: !shaka.extern.PlayerConfiguration,\n * manifestPlayerInterface: !shaka.extern.ManifestParser.PlayerInterface,\n * regionTimeline: !shaka.media.RegionTimeline<\n * shaka.extern.TimelineRegionInfo>,\n * qualityObserver: ?shaka.media.QualityObserver,\n * createDrmEngine: function():!shaka.drm.DrmEngine,\n * networkingEngine: !shaka.net.NetworkingEngine,\n * manifestFilterer: !shaka.media.ManifestFilterer,\n * allowPrefetch: boolean,\n * allowMakeAbrManager: boolean\n * }}\n *\n * @property {!shaka.extern.PlayerConfiguration} config\n * @property {!shaka.extern.ManifestParser.PlayerInterface\n * } manifestPlayerInterface\n * @property {!shaka.media.RegionTimeline<shaka.extern.TimelineRegionInfo>\n * } regionTimeline\n * @property {?shaka.media.QualityObserver} qualityObserver\n * @property {function():!shaka.drm.DrmEngine} createDrmEngine\n * @property {!shaka.net.NetworkingEngine} networkingEngine\n * @property {!shaka.media.ManifestFilterer} manifestFilterer\n * @property {boolean} allowPrefetch\n * @property {boolean} allowMakeAbrManager\n */\nshaka.media.PreloadManager.PlayerInterface;\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.media.RegionObserver');\n\ngoog.require('shaka.media.IPlayheadObserver');\ngoog.require('shaka.media.RegionTimeline');\ngoog.require('shaka.util.EventManager');\ngoog.require('shaka.util.FakeEvent');\ngoog.require('shaka.util.FakeEventTarget');\n\n\n/**\n * The region observer watches a region timeline and playhead, and fires events\n * ('enter', 'exit', 'skip') as the playhead moves.\n *\n * @implements {shaka.media.IPlayheadObserver}\n * @template T\n * @final\n */\nshaka.media.RegionObserver = class extends shaka.util.FakeEventTarget {\n /**\n * Create a region observer for the given timeline. The observer does not\n * own the timeline, only uses it. This means that the observer should NOT\n * destroy the timeline.\n *\n * @param {!shaka.media.RegionTimeline<T>} timeline\n * @param {boolean} startsPastZero\n */\n constructor(timeline, startsPastZero) {\n super();\n\n /** @private {shaka.media.RegionTimeline<T>} */\n this.timeline_ = timeline;\n\n /**\n * Whether the asset is expected to start at a time beyond 0 seconds.\n * For example, if the asset is a live stream.\n * If true, we will not start polling for regions until the playhead has\n * moved past 0 seconds, to avoid bad behaviors where the current time is\n * briefly 0 before we have enough data to play.\n * @private {boolean}\n */\n this.startsPastZero_ = startsPastZero;\n\n /**\n * A mapping between a region and where we previously were relative to it.\n * When the value here differs from what we calculate, it means we moved and\n * should fire an event.\n *\n * @private {!Map<T, shaka.media.RegionObserver.RelativePosition_>}\n */\n this.oldPosition_ = new Map();\n\n // To make the rules easier to read, alias all the relative positions.\n const RelativePosition = shaka.media.RegionObserver.RelativePosition_;\n const BEFORE_THE_REGION = RelativePosition.BEFORE_THE_REGION;\n const IN_THE_REGION = RelativePosition.IN_THE_REGION;\n const AFTER_THE_REGION = RelativePosition.AFTER_THE_REGION;\n\n /**\n * A read-only collection of rules for what to do when we change position\n * relative to a region.\n *\n * @private {!Iterable<shaka.media.RegionObserver.Rule_>}\n */\n this.rules_ = [\n {\n weWere: null,\n weAre: IN_THE_REGION,\n invoke: (region, seeking) => this.onEvent_('enter', region, seeking),\n },\n {\n weWere: BEFORE_THE_REGION,\n weAre: IN_THE_REGION,\n invoke: (region, seeking) => this.onEvent_('enter', region, seeking),\n },\n {\n weWere: AFTER_THE_REGION,\n weAre: IN_THE_REGION,\n invoke: (region, seeking) => this.onEvent_('enter', region, seeking),\n },\n {\n weWere: IN_THE_REGION,\n weAre: BEFORE_THE_REGION,\n invoke: (region, seeking) => this.onEvent_('exit', region, seeking),\n },\n {\n weWere: IN_THE_REGION,\n weAre: AFTER_THE_REGION,\n invoke: (region, seeking) => this.onEvent_('exit', region, seeking),\n },\n {\n weWere: BEFORE_THE_REGION,\n weAre: AFTER_THE_REGION,\n invoke: (region, seeking) => {\n if (seeking) {\n this.onEvent_('skip', region, seeking);\n } else {\n // This is the case of regions whose duration is smaller than the\n // resolution of our polling.\n this.onEvent_('enter', region, seeking);\n this.onEvent_('exit', region, seeking);\n }\n },\n },\n {\n weWere: AFTER_THE_REGION,\n weAre: BEFORE_THE_REGION,\n invoke: (region, seeking) => this.onEvent_('skip', region, seeking),\n },\n ];\n\n /** @private {shaka.util.EventManager} */\n this.eventManager_ = new shaka.util.EventManager();\n\n this.eventManager_.listen(this.timeline_, 'regionremove', (event) => {\n /** @type {T} */\n const region = event['region'];\n this.oldPosition_.delete(region);\n });\n }\n\n /** @override */\n release() {\n this.timeline_ = null;\n\n // Clear our maps so that we are not holding onto any more information than\n // needed.\n this.oldPosition_.clear();\n\n this.eventManager_.release();\n this.eventManager_ = null;\n\n super.release();\n }\n\n /** @override */\n poll(positionInSeconds, wasSeeking) {\n const RegionObserver = shaka.media.RegionObserver;\n if (this.startsPastZero_ && positionInSeconds == 0) {\n // Don't start checking regions until the timeline has begun moving.\n return;\n }\n // Now that we have seen the playhead go past 0, it's okay if it goes\n // back there (e.g. seeking back to the start).\n this.startsPastZero_ = false;\n\n for (const region of this.timeline_.regions()) {\n const previousPosition = this.oldPosition_.get(region);\n const currentPosition = RegionObserver.determinePositionRelativeTo_(\n region, positionInSeconds);\n\n // We will only use |previousPosition| and |currentPosition|, so we can\n // update our state now.\n this.oldPosition_.set(region, currentPosition);\n\n for (const rule of this.rules_) {\n if (rule.weWere == previousPosition && rule.weAre == currentPosition) {\n rule.invoke(region, wasSeeking);\n }\n }\n }\n }\n\n /**\n * Dispatch events of the given type. All event types in this class have the\n * same parameters: region and seeking.\n *\n * @param {string} eventType\n * @param {T} region\n * @param {boolean} seeking\n * @private\n */\n onEvent_(eventType, region, seeking) {\n const event = new shaka.util.FakeEvent(eventType, new Map([\n ['region', region],\n ['seeking', seeking],\n ]));\n this.dispatchEvent(event);\n }\n\n /**\n * Get the relative position of the playhead to |region| when the playhead is\n * at |seconds|. We treat the region's start and end times as inclusive\n * bounds.\n *\n * @template T\n * @param {T} region\n * @param {number} seconds\n * @return {shaka.media.RegionObserver.RelativePosition_}\n * @private\n */\n static determinePositionRelativeTo_(region, seconds) {\n const RelativePosition = shaka.media.RegionObserver.RelativePosition_;\n\n if (seconds < region.startTime) {\n return RelativePosition.BEFORE_THE_REGION;\n }\n\n if (seconds > region.endTime) {\n return RelativePosition.AFTER_THE_REGION;\n }\n\n return RelativePosition.IN_THE_REGION;\n }\n};\n\n/**\n * An enum of relative positions between the playhead and a region. Each is\n * phrased so that it works in \"The playhead is X\" where \"X\" is any value in\n * the enum.\n *\n * @enum {number}\n * @private\n */\nshaka.media.RegionObserver.RelativePosition_ = {\n BEFORE_THE_REGION: 1,\n IN_THE_REGION: 2,\n AFTER_THE_REGION: 3,\n};\n\n/**\n * All region observer events (onEnter, onExit, and onSkip) will be passed the\n * region that the playhead is interacting with and whether or not the playhead\n * moving is part of a seek event.\n *\n * @typedef {function(?, boolean)}\n */\nshaka.media.RegionObserver.EventListener;\n\n/**\n * @typedef {{\n * weWere: ?shaka.media.RegionObserver.RelativePosition_,\n * weAre: ?shaka.media.RegionObserver.RelativePosition_,\n * invoke: shaka.media.RegionObserver.EventListener\n * }}\n *\n * @private\n */\nshaka.media.RegionObserver.Rule_;\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.net.NetworkingUtils');\n\ngoog.require('goog.Uri');\ngoog.require('shaka.net.NetworkingEngine');\ngoog.require('shaka.util.Error');\n\n\n/**\n * @summary Networking utility functions.\n */\nshaka.net.NetworkingUtils = class {\n /**\n * @param {string} uri\n * @param {!shaka.net.NetworkingEngine} netEngine\n * @param {shaka.extern.RetryParameters} retryParams\n * @return {!Promise<string>}\n */\n static async getMimeType(uri, netEngine, retryParams) {\n const extension = shaka.net.NetworkingUtils.getExtension_(uri);\n let mimeType =\n shaka.net.NetworkingUtils.EXTENSIONS_TO_MIME_TYPES_.get(extension);\n if (mimeType) {\n return mimeType;\n }\n const type = shaka.net.NetworkingEngine.RequestType.MANIFEST;\n\n const request = shaka.net.NetworkingEngine.makeRequest([uri], retryParams);\n\n try {\n request.method = 'HEAD';\n const response = await netEngine.request(type, request).promise;\n mimeType = response.headers['content-type'];\n } catch (error) {\n if (error &&\n (error.code == shaka.util.Error.Code.HTTP_ERROR ||\n error.code == shaka.util.Error.Code.BAD_HTTP_STATUS)) {\n request.method = 'GET';\n const response = await netEngine.request(type, request).promise;\n mimeType = response.headers['content-type'];\n }\n }\n\n // https://bit.ly/2K9s9kf says this header should always be available,\n // but just to be safe:\n return mimeType ? mimeType.toLowerCase().split(';').shift() : '';\n }\n\n\n /**\n * @param {string} uri\n * @return {string}\n * @private\n */\n static getExtension_(uri) {\n const uriObj = new goog.Uri(uri);\n const uriPieces = uriObj.getPath().split('/');\n const uriFilename = uriPieces.pop();\n const filenamePieces = uriFilename.split('.');\n\n // Only one piece means there is no extension.\n if (filenamePieces.length == 1) {\n return '';\n }\n\n return filenamePieces.pop().toLowerCase();\n }\n};\n\n/**\n * @const {!Map<string, string>}\n * @private\n */\nshaka.net.NetworkingUtils.EXTENSIONS_TO_MIME_TYPES_ = new Map()\n .set('mp4', 'video/mp4')\n .set('m4v', 'video/mp4')\n .set('m4a', 'audio/mp4')\n .set('webm', 'video/webm')\n .set('weba', 'audio/webm')\n .set('mkv', 'video/webm') // Chromium browsers supports it.\n .set('ts', 'video/mp2t')\n .set('ogv', 'video/ogg')\n .set('ogg', 'audio/ogg')\n .set('mpg', 'video/mpeg')\n .set('mpeg', 'video/mpeg')\n .set('mov', 'video/quicktime')\n .set('m3u8', 'application/x-mpegurl')\n .set('mpd', 'application/dash+xml')\n .set('ism', 'application/vnd.ms-sstr+xml')\n .set('mp3', 'audio/mpeg')\n .set('aac', 'audio/aac')\n .set('flac', 'audio/flac')\n .set('wav', 'audio/wav')\n .set('sbv', 'text/x-subviewer')\n .set('srt', 'text/srt')\n .set('vtt', 'text/vtt')\n .set('webvtt', 'text/vtt')\n .set('ttml', 'application/ttml+xml')\n .set('lrc', 'application/x-subtitle-lrc')\n .set('ssa', 'text/x-ssa')\n .set('ass', 'text/x-ssa')\n .set('jpeg', 'image/jpeg')\n .set('jpg', 'image/jpeg')\n .set('png', 'image/png')\n .set('svg', 'image/svg+xml')\n .set('webp', 'image/webp')\n .set('avif', 'image/avif')\n .set('html', 'text/html')\n .set('htm', 'text/html');\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.text.Utils');\n\ngoog.require('shaka.log');\ngoog.require('shaka.text.Cue');\ngoog.require('shaka.text.CueRegion');\n\n\nshaka.text.Utils = class {\n /**\n * Flatten nested cue payloads recursively. If a cue has nested cues,\n * their contents should be combined and replace the payload of the parent.\n *\n * @param {!shaka.text.Cue} cue\n * @param {?shaka.text.Cue=} parentCue\n * @return {string}\n * @private\n */\n static flattenPayload_(cue, parentCue) {\n if (cue.lineBreak) {\n // This is a vertical lineBreak, so insert a newline.\n return '\\n';\n }\n if (cue.nestedCues.length) {\n return cue.nestedCues.map((nested) => {\n return shaka.text.Utils.flattenPayload_(nested, cue);\n }).join('');\n }\n\n if (!cue.payload) {\n return cue.payload;\n }\n\n // Handle bold, italics and underline\n const openStyleTags = [];\n const bold = cue.fontWeight >= shaka.text.Cue.fontWeight.BOLD;\n const italics = cue.fontStyle == shaka.text.Cue.fontStyle.ITALIC;\n const underline = cue.textDecoration.includes(\n shaka.text.Cue.textDecoration.UNDERLINE);\n if (bold) {\n openStyleTags.push(['b']);\n }\n if (italics) {\n openStyleTags.push(['i']);\n }\n if (underline) {\n openStyleTags.push(['u']);\n }\n // Handle color classes, if the value consists of letters\n let color = cue.color;\n if (color == '' && parentCue) {\n color = parentCue.color;\n }\n let classes = '';\n const colorName = shaka.text.Utils.getColorName_(color);\n if (colorName) {\n classes += `.${colorName}`;\n }\n let bgColor = cue.backgroundColor;\n if (bgColor == '' && parentCue) {\n bgColor = parentCue.backgroundColor;\n }\n const bgColorName = shaka.text.Utils.getColorName_(bgColor);\n if (bgColorName) {\n classes += `.bg_${bgColorName}`;\n }\n if (classes) {\n openStyleTags.push(['c', classes]);\n }\n\n return openStyleTags.reduceRight((acc, [tag, classes = '']) => {\n return `<${tag}${classes}>${acc}</${tag}>`;\n }, cue.payload);\n }\n\n /**\n * Gets the color name from a color string.\n *\n * @param {string} string\n * @return {?string}\n * @private\n */\n static getColorName_(string) {\n let colorString = string.toLowerCase();\n const rgb = colorString.replace(/\\s/g, '')\n .match(/^rgba?\\((\\d+),(\\d+),(\\d+),?([^,\\s)]+)?/i);\n if (rgb) {\n colorString = '#' +\n (parseInt(rgb[1], 10) | (1 << 8)).toString(16).slice(1) +\n (parseInt(rgb[2], 10) | (1 << 8)).toString(16).slice(1) +\n (parseInt(rgb[3], 10) | (1 << 8)).toString(16).slice(1);\n } else if (colorString.startsWith('#') && colorString.length > 7) {\n // With this we lose the alpha of the color, but it is better than having\n // no color.\n colorString = colorString.slice(0, 7);\n }\n switch (colorString) {\n case 'white':\n case '#fff':\n case '#ffffff':\n return 'white';\n case 'lime':\n case '#0f0':\n case '#00ff00':\n return 'lime';\n case 'cyan':\n case '#0ff':\n case '#00ffff':\n return 'cyan';\n case 'red':\n case '#f00':\n case '#ff0000':\n return 'red';\n case 'yellow':\n case '#ff0':\n case '#ffff00':\n return 'yellow';\n case 'magenta':\n case '#f0f':\n case '#ff00ff':\n return 'magenta';\n case 'blue':\n case '#00f':\n case '#0000ff':\n return 'blue';\n case 'black':\n case '#000':\n case '#000000':\n return 'black';\n }\n // No color name\n return null;\n }\n\n /**\n * We don't want to modify the array or objects passed in, since we don't\n * technically own them. So we build a new array and replace certain items\n * in it if they need to be flattened.\n * We also don't want to flatten the text payloads starting at a container\n * element; otherwise, for containers encapsulating multiple caption lines,\n * the lines would merge into a single cue. This is undesirable when a\n * subset of the captions are outside of the append time window. To fix\n * this, we only call flattenPayload() starting at elements marked as\n * isContainer = false.\n *\n * @param {!Array<!shaka.text.Cue>} cues\n * @param {?shaka.text.Cue=} parentCue\n * @return {!Array<!shaka.text.Cue>}\n */\n static getCuesToFlatten(cues, parentCue) {\n const result = [];\n for (const cue of shaka.text.Utils.removeDuplicates(cues)) {\n if (cue.isContainer) {\n // Recurse to find the actual text payload cues.\n result.push(...shaka.text.Utils.getCuesToFlatten(cue.nestedCues, cue));\n } else {\n // Flatten the payload.\n const flatCue = cue.clone();\n flatCue.nestedCues = [];\n flatCue.payload = shaka.text.Utils.flattenPayload_(cue, parentCue);\n result.push(flatCue);\n }\n }\n return result;\n }\n\n /**\n * @param {!Array<!shaka.text.Cue>} cues\n * @return {!Array<!shaka.text.Cue>}\n */\n static removeDuplicates(cues) {\n const uniqueCues = [];\n for (const cue of cues) {\n const isValid = !uniqueCues.some(\n (existingCue) => shaka.text.Cue.equal(cue, existingCue));\n if (isValid) {\n uniqueCues.push(cue);\n }\n }\n return uniqueCues;\n }\n\n /**\n * @param {!shaka.text.Cue} shakaCue\n * @return {TextTrackCue}\n */\n static mapShakaCueToNativeCue(shakaCue) {\n if (shakaCue.startTime >= shakaCue.endTime) {\n // Edge will throw in this case.\n // See issue #501\n shaka.log.warning('Invalid cue times: ' + shakaCue.startTime +\n ' - ' + shakaCue.endTime);\n return null;\n }\n\n const Cue = shaka.text.Cue;\n /** @type {VTTCue} */\n const vttCue = new VTTCue(\n shakaCue.startTime,\n shakaCue.endTime,\n shakaCue.payload);\n\n const hash = (text) => {\n let hash = 5381;\n let i = text.length;\n while (i) {\n hash = (hash * 33) ^ text.charCodeAt(--i);\n }\n return (hash >>> 0).toString();\n };\n\n vttCue.id = hash(shakaCue.startTime.toString()) +\n hash(shakaCue.endTime.toString()) +\n hash(shakaCue.payload);\n\n // NOTE: positionAlign and lineAlign settings are not supported by Chrome\n // at the moment, so setting them will have no effect.\n // The bug on chromium to implement them:\n // https://bugs.chromium.org/p/chromium/issues/detail?id=633690\n\n vttCue.lineAlign = shakaCue.lineAlign;\n vttCue.positionAlign = shakaCue.positionAlign;\n if (shakaCue.size) {\n vttCue.size = shakaCue.size;\n }\n\n try {\n // Safari 10 seems to throw on align='center'.\n vttCue.align = shakaCue.textAlign;\n } catch (exception) {}\n\n if (shakaCue.textAlign == 'center' && vttCue.align != 'center') {\n // We want vttCue.position = 'auto'. By default, |position| is set to\n // \"auto\". If we set it to \"auto\" safari will throw an exception, so we\n // must rely on the default value.\n vttCue.align = 'middle';\n }\n\n if (shakaCue.writingMode ==\n Cue.writingMode.VERTICAL_LEFT_TO_RIGHT) {\n vttCue.vertical = 'lr';\n } else if (shakaCue.writingMode ==\n Cue.writingMode.VERTICAL_RIGHT_TO_LEFT) {\n vttCue.vertical = 'rl';\n }\n\n // snapToLines flag is true by default\n if (shakaCue.lineInterpretation == Cue.lineInterpretation.PERCENTAGE) {\n vttCue.snapToLines = false;\n }\n\n if (shakaCue.line != null) {\n vttCue.line = shakaCue.line;\n }\n\n if (shakaCue.position != null) {\n vttCue.position = shakaCue.position;\n }\n\n return vttCue;\n }\n\n /**\n * @param {!VTTCue} vttCue\n * @return {?shaka.text.Cue}\n */\n static mapNativeCueToShakaCue(vttCue) {\n if (vttCue.endTime === Infinity || vttCue.endTime < vttCue.startTime) {\n return null;\n }\n const cue = new shaka.text.Cue(vttCue.startTime, vttCue.endTime,\n vttCue.text);\n cue.line = typeof vttCue.line === 'number' ? vttCue.line : null;\n if (vttCue.lineAlign) {\n cue.lineAlign = /** @type {shaka.text.Cue.lineAlign} */\n (vttCue.lineAlign);\n }\n cue.lineInterpretation = vttCue.snapToLines ?\n shaka.text.Cue.lineInterpretation.LINE_NUMBER :\n shaka.text.Cue.lineInterpretation.PERCENTAGE;\n cue.position = typeof vttCue.position === 'number' ?\n vttCue.position : null;\n if (vttCue.positionAlign) {\n cue.positionAlign = /** @type {shaka.text.Cue.positionAlign} */\n (vttCue.positionAlign);\n }\n cue.size = vttCue.size;\n cue.textAlign = /** @type {shaka.text.Cue.textAlign} */ (vttCue.align);\n if (vttCue.vertical === 'lr') {\n cue.writingMode = shaka.text.Cue.writingMode.VERTICAL_LEFT_TO_RIGHT;\n } else if (vttCue.vertical === 'rl') {\n cue.writingMode = shaka.text.Cue.writingMode.VERTICAL_RIGHT_TO_LEFT;\n }\n if (vttCue.region) {\n cue.region.id = vttCue.region.id;\n cue.region.height = vttCue.region.lines;\n cue.region.heightUnits = shaka.text.CueRegion.units.LINES;\n cue.region.regionAnchorX = vttCue.region.regionAnchorX;\n cue.region.regionAnchorY = vttCue.region.regionAnchorY;\n cue.region.scroll = /** @type {shaka.text.CueRegion.scrollMode} */\n (vttCue.region.scroll);\n cue.region.viewportAnchorX = vttCue.region.viewportAnchorX;\n cue.region.viewportAnchorY = vttCue.region.viewportAnchorY;\n cue.region.viewportAnchorUnits = shaka.text.CueRegion.units.PERCENTAGE;\n cue.region.width = vttCue.region.width;\n cue.region.widthUnits = shaka.text.CueRegion.units.PERCENTAGE;\n }\n shaka.text.Cue.parseCuePayload(cue);\n\n return cue;\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview\n */\n\ngoog.provide('shaka.text.SimpleTextDisplayer');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.text.Utils');\n\n\n/**\n * A text displayer plugin using the browser's native VTTCue interface.\n *\n * @implements {shaka.extern.TextDisplayer}\n * @export\n */\nshaka.text.SimpleTextDisplayer = class {\n /**\n * @param {HTMLMediaElement} video\n * @param {string} label\n */\n constructor(video, label) {\n /** @private {HTMLMediaElement} */\n this.video_ = video;\n\n /** @private {string} */\n this.textTrackLabel_ = label;\n\n /** @private {TextTrack} */\n this.textTrack_ = null;\n\n // TODO: Test that in all cases, the built-in CC controls in the video\n // element are toggling our TextTrack.\n\n // If the video element has TextTracks, disable them. If we see one that\n // was created by a previous instance of Shaka Player, reuse it.\n for (const track of Array.from(this.video_.textTracks)) {\n if (track.kind === 'metadata' || track.kind === 'chapters') {\n continue;\n }\n // NOTE: There is no API available to remove a TextTrack from a video\n // element.\n track.mode = 'disabled';\n\n if (track.label == this.textTrackLabel_) {\n this.textTrack_ = track;\n }\n }\n if (this.textTrack_) {\n this.textTrack_.mode = 'hidden';\n }\n }\n\n\n /**\n * @override\n * @export\n */\n configure(config) {\n // Unused.\n }\n\n /**\n * @override\n * @export\n */\n remove(start, end) {\n // Check that the displayer hasn't been destroyed.\n if (!this.textTrack_) {\n return false;\n }\n\n const removeInRange = (cue) => {\n const inside = cue.startTime < end && cue.endTime > start;\n return inside;\n };\n\n shaka.text.SimpleTextDisplayer.removeWhere_(this.textTrack_, removeInRange);\n\n return true;\n }\n\n /**\n * @override\n * @export\n */\n append(cues) {\n if (!this.textTrack_) {\n return;\n }\n const flattenedCues = shaka.text.Utils.getCuesToFlatten(cues);\n\n // Convert cues.\n const textTrackCues = [];\n const cuesInTextTrack = this.textTrack_.cues ?\n Array.from(this.textTrack_.cues) : [];\n\n for (const inCue of flattenedCues) {\n // When a VTT cue spans a segment boundary, the cue will be duplicated\n // into two segments.\n // To avoid displaying duplicate cues, if the current textTrack cues\n // list already contains the cue, skip it.\n const containsCue = cuesInTextTrack.some((cueInTextTrack) => {\n if (cueInTextTrack.startTime == inCue.startTime &&\n cueInTextTrack.endTime == inCue.endTime &&\n cueInTextTrack.text == inCue.payload) {\n return true;\n }\n return false;\n });\n\n if (!containsCue && inCue.payload) {\n const cue =\n shaka.text.Utils.mapShakaCueToNativeCue(inCue);\n if (cue) {\n textTrackCues.push(cue);\n }\n }\n }\n\n // Sort the cues based on start/end times. Make a copy of the array so\n // we can get the index in the original ordering. Out of order cues are\n // rejected by Edge. See https://bit.ly/2K9VX3s\n const sortedCues = textTrackCues.slice().sort((a, b) => {\n if (a.startTime != b.startTime) {\n return a.startTime - b.startTime;\n } else if (a.endTime != b.endTime) {\n return a.endTime - b.startTime;\n } else {\n // The browser will display cues with identical time ranges from the\n // bottom up. Reversing the order of equal cues means the first one\n // parsed will be at the top, as you would expect.\n // See https://github.com/shaka-project/shaka-player/issues/848 for\n // more info.\n // However, this ordering behavior is part of VTTCue's \"line\" field.\n // Some platforms don't have a real VTTCue and use a polyfill instead.\n // When VTTCue is polyfilled or does not support \"line\", we should _not_\n // reverse the order. This occurs on legacy Edge.\n // eslint-disable-next-line no-restricted-syntax\n if ('line' in VTTCue.prototype) {\n // Native VTTCue\n return textTrackCues.indexOf(b) - textTrackCues.indexOf(a);\n } else {\n // Polyfilled VTTCue\n return textTrackCues.indexOf(a) - textTrackCues.indexOf(b);\n }\n }\n });\n\n for (const cue of sortedCues) {\n this.textTrack_.addCue(cue);\n }\n }\n\n /**\n * @override\n * @export\n */\n destroy() {\n if (this.textTrack_) {\n const removeIt = (cue) => true;\n shaka.text.SimpleTextDisplayer.removeWhere_(this.textTrack_, removeIt);\n\n // NOTE: There is no API available to remove a TextTrack from a video\n // element.\n this.textTrack_.mode = 'disabled';\n }\n\n this.video_ = null;\n this.textTrack_ = null;\n return Promise.resolve();\n }\n\n /**\n * @override\n * @export\n */\n isTextVisible() {\n if (!this.textTrack_) {\n return false;\n }\n return this.textTrack_.mode == 'showing';\n }\n\n /**\n * @override\n * @export\n */\n setTextVisibility(on) {\n if (on && !this.textTrack_) {\n this.createTextTrack_();\n }\n if (this.textTrack_) {\n this.textTrack_.mode = on ? 'showing' : 'hidden';\n }\n }\n\n /**\n * @override\n * @export\n */\n setTextLanguage(language) {\n }\n\n /**\n * @override\n * @export\n */\n enableTextDisplayer() {\n this.createTextTrack_();\n }\n\n /**\n * @private\n */\n createTextTrack_() {\n if (this.video_ && !this.textTrack_) {\n // As far as I can tell, there is no observable difference between setting\n // kind to 'subtitles' or 'captions' when creating the TextTrack object.\n // The individual text tracks from the manifest will still have their own\n // kinds which can be displayed in the app's UI.\n this.textTrack_ =\n this.video_.addTextTrack('subtitles', this.textTrackLabel_);\n this.textTrack_.mode = 'hidden';\n }\n }\n\n /**\n * Iterate over all the cues in a text track and remove all those for which\n * |predicate(cue)| returns true.\n *\n * @param {!TextTrack} track\n * @param {function(!TextTrackCue):boolean} predicate\n * @private\n */\n static removeWhere_(track, predicate) {\n // Since |track.cues| can be null if |track.mode| is \"disabled\", force it to\n // something other than \"disabled\".\n //\n // If the track is already showing, then we should keep it as showing. But\n // if it something else, we will use hidden so that we don't \"flash\" cues on\n // the screen.\n const oldState = track.mode;\n const tempState = oldState == 'showing' ? 'showing' : 'hidden';\n\n track.mode = tempState;\n\n goog.asserts.assert(\n track.cues,\n 'Cues should be accessible when mode is set to \"' + tempState + '\".');\n\n // Create a copy of the list to avoid errors while iterating.\n for (const cue of Array.from(track.cues)) {\n if (cue && predicate(cue)) {\n track.removeCue(cue);\n }\n }\n\n track.mode = oldState;\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2023 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.text.StubTextDisplayer');\n\n/**\n * A stub text displayer plugin that does nothing\n *\n * @implements {shaka.extern.TextDisplayer}\n * @export\n */\nshaka.text.StubTextDisplayer = class {\n /**\n * @override\n * @export\n */\n configure(config) {\n }\n\n /**\n * @override\n * @export\n */\n remove(start, end) {\n }\n\n /**\n * @override\n * @export\n */\n append(cues) {\n }\n\n /**\n * @override\n * @export\n */\n destroy() {\n }\n\n /**\n * @override\n * @export\n */\n isTextVisible() {\n return false;\n }\n\n /**\n * @override\n * @export\n */\n setTextVisibility(on) {\n }\n\n /**\n * @override\n * @export\n */\n setTextLanguage(language) {\n }\n\n /**\n * @override\n * @export\n */\n enableTextDisplayer() {\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\ngoog.provide('shaka.text.UITextDisplayer');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.log');\ngoog.require('shaka.text.Cue');\ngoog.require('shaka.text.CueRegion');\ngoog.require('shaka.text.Utils');\ngoog.require('shaka.util.Dom');\ngoog.require('shaka.util.EventManager');\ngoog.require('shaka.util.Timer');\n\n\n/**\n * The text displayer plugin for the Shaka Player UI. Can also be used directly\n * by providing an appropriate container element.\n *\n * @implements {shaka.extern.TextDisplayer}\n * @final\n * @export\n */\nshaka.text.UITextDisplayer = class {\n /**\n * Constructor.\n * @param {HTMLMediaElement} video\n * @param {HTMLElement} videoContainer\n */\n constructor(video, videoContainer) {\n goog.asserts.assert(videoContainer, 'videoContainer should be valid.');\n\n if (!document.fullscreenEnabled) {\n shaka.log.alwaysWarn('Using UITextDisplayer in a browser without ' +\n 'Fullscreen API support causes subtitles to not be rendered in ' +\n 'fullscreen');\n }\n\n /** @private {boolean} */\n this.isTextVisible_ = false;\n\n /** @private {!Array<!shaka.text.Cue>} */\n this.cues_ = [];\n\n /** @private {HTMLMediaElement} */\n this.video_ = video;\n\n /** @private {HTMLElement} */\n this.videoContainer_ = videoContainer;\n\n /** @private {?number} */\n this.aspectRatio_ = null;\n\n /** @private {?shaka.extern.TextDisplayerConfiguration} */\n this.config_ = null;\n\n /** @type {HTMLElement} */\n this.textContainer_ = shaka.util.Dom.createHTMLElement('div');\n this.textContainer_.classList.add('shaka-text-container');\n\n // Set the subtitles text-centered by default.\n this.textContainer_.style.textAlign = 'center';\n\n // Set the captions in the middle horizontally by default.\n this.textContainer_.style.display = 'flex';\n this.textContainer_.style.flexDirection = 'column';\n this.textContainer_.style.alignItems = 'center';\n\n // Set the captions at the bottom by default.\n this.textContainer_.style.justifyContent = 'flex-end';\n\n this.videoContainer_.appendChild(this.textContainer_);\n\n /** @private {shaka.util.Timer} */\n this.captionsTimer_ = new shaka.util.Timer(() => {\n if (!this.video_.paused) {\n this.updateCaptions_();\n }\n });\n this.configureCaptionsTimer_();\n\n /**\n * Maps cues to cue elements. Specifically points out the wrapper element of\n * the cue (e.g. the HTML element to put nested cues inside).\n * @private {Map<!shaka.text.Cue, !{\n * cueElement: !HTMLElement,\n * regionElement: HTMLElement,\n * wrapper: !HTMLElement\n * }>}\n */\n this.currentCuesMap_ = new Map();\n\n /** @private {shaka.util.EventManager} */\n this.eventManager_ = new shaka.util.EventManager();\n\n this.eventManager_.listen(document, 'fullscreenchange', () => {\n this.updateCaptions_(/* forceUpdate= */ true);\n });\n\n this.eventManager_.listen(this.video_, 'seeking', () => {\n this.updateCaptions_(/* forceUpdate= */ true);\n });\n\n this.eventManager_.listen(this.video_, 'ratechange', () => {\n this.configureCaptionsTimer_();\n });\n\n // From: https://html.spec.whatwg.org/multipage/media.html#dom-video-videowidth\n // Whenever the natural width or natural height of the video changes\n // (including, for example, because the selected video track was changed),\n // if the element's readyState attribute is not HAVE_NOTHING, the user\n // agent must queue a media element task given the media element to fire an\n // event named resize at the media element.\n this.eventManager_.listen(this.video_, 'resize', () => {\n const element = /** @type {!HTMLVideoElement} */ (this.video_);\n const width = element.videoWidth;\n const height = element.videoHeight;\n if (width && height) {\n this.aspectRatio_ = width / height;\n } else {\n this.aspectRatio_ = null;\n }\n });\n\n /** @private {ResizeObserver} */\n this.resizeObserver_ = null;\n if ('ResizeObserver' in window) {\n this.resizeObserver_ = new ResizeObserver(() => {\n this.updateCaptions_(/* forceUpdate= */ true);\n });\n this.resizeObserver_.observe(this.textContainer_);\n }\n\n /** @private {Map<string, !HTMLElement>} */\n this.regionElements_ = new Map();\n }\n\n\n /**\n * @override\n * @export\n */\n configure(config) {\n this.config_ = config;\n this.configureCaptionsTimer_();\n this.updateCaptions_(/* forceUpdate= */ true);\n }\n\n\n /**\n * @override\n * @export\n */\n append(cues) {\n // Clone the cues list for performance optimization. We can avoid the cues\n // list growing during the comparisons for duplicate cues.\n // See: https://github.com/shaka-project/shaka-player/issues/3018\n const cuesList = [...this.cues_];\n for (const cue of shaka.text.Utils.removeDuplicates(cues)) {\n // When a VTT cue spans a segment boundary, the cue will be duplicated\n // into two segments.\n // To avoid displaying duplicate cues, if the current cue list already\n // contains the cue, skip it.\n const containsCue = cuesList.some(\n (cueInList) => shaka.text.Cue.equal(cueInList, cue));\n if (!containsCue) {\n this.cues_.push(cue);\n }\n }\n if (this.cues_.length) {\n this.configureCaptionsTimer_();\n }\n\n this.updateCaptions_();\n }\n\n\n /**\n * @override\n * @export\n */\n destroy() {\n // Return resolved promise if destroy() has been called.\n if (!this.textContainer_) {\n return Promise.resolve();\n }\n\n // Remove the text container element from the UI.\n this.videoContainer_.removeChild(this.textContainer_);\n this.textContainer_ = null;\n\n this.isTextVisible_ = false;\n this.cues_ = [];\n if (this.captionsTimer_) {\n this.captionsTimer_.stop();\n this.captionsTimer_ = null;\n }\n\n this.currentCuesMap_.clear();\n\n // Tear-down the event manager to ensure messages stop moving around.\n if (this.eventManager_) {\n this.eventManager_.release();\n this.eventManager_ = null;\n }\n\n if (this.resizeObserver_) {\n this.resizeObserver_.disconnect();\n this.resizeObserver_ = null;\n }\n\n return Promise.resolve();\n }\n\n\n /**\n * @override\n * @export\n */\n remove(start, end) {\n // Return false if destroy() has been called.\n if (!this.textContainer_) {\n return false;\n }\n\n // Remove the cues out of the time range.\n const oldNumCues = this.cues_.length;\n this.cues_ = this.cues_.filter(\n (cue) => cue.startTime < start || cue.endTime >= end);\n // If anything was actually removed in this process, force the captions to\n // update. This makes sure that the currently-displayed cues will stop\n // displaying if removed (say, due to the user changing languages).\n const forceUpdate = oldNumCues > this.cues_.length;\n this.updateCaptions_(forceUpdate);\n if (!this.cues_.length) {\n this.configureCaptionsTimer_();\n }\n\n return true;\n }\n\n\n /**\n * @override\n * @export\n */\n isTextVisible() {\n return this.isTextVisible_;\n }\n\n /**\n * @override\n * @export\n */\n setTextVisibility(on) {\n this.isTextVisible_ = on;\n this.updateCaptions_(/* forceUpdate= */ true);\n }\n\n /**\n * @override\n * @export\n */\n setTextLanguage(language) {\n if (language && language != 'und') {\n this.textContainer_.setAttribute('lang', language);\n } else {\n this.textContainer_.setAttribute('lang', '');\n }\n }\n\n /**\n * @override\n * @export\n */\n enableTextDisplayer() {\n }\n\n /**\n * @private\n */\n configureCaptionsTimer_() {\n if (this.captionsTimer_) {\n if (this.cues_.length) {\n const captionsUpdatePeriod = this.config_ ?\n this.config_.captionsUpdatePeriod : 0.25;\n const updateTime = captionsUpdatePeriod /\n Math.max(1, Math.abs(this.video_.playbackRate));\n this.captionsTimer_.tickEvery(updateTime);\n } else {\n this.captionsTimer_.stop();\n }\n }\n }\n\n /**\n * @private\n */\n isElementUnderTextContainer_(elemToCheck) {\n while (elemToCheck != null) {\n if (elemToCheck == this.textContainer_) {\n return true;\n }\n elemToCheck = elemToCheck.parentElement;\n }\n return false;\n }\n\n /**\n * @param {!Array<!shaka.text.Cue>} cues\n * @param {!HTMLElement} container\n * @param {number} currentTime\n * @param {!Array<!shaka.text.Cue>} parents\n * @private\n */\n updateCuesRecursive_(cues, container, currentTime, parents) {\n // Set to true if the cues have changed in some way, which will require\n // DOM changes. E.g. if a cue was added or removed.\n let updateDOM = false;\n /**\n * The elements to remove from the DOM.\n * Some of these elements may be added back again, if their corresponding\n * cue is in toPlant.\n * These elements are only removed if updateDOM is true.\n * @type {!Array<!HTMLElement>}\n */\n const toUproot = [];\n /**\n * The cues whose corresponding elements should be in the DOM.\n * Some of these might be new, some might have been displayed beforehand.\n * These will only be added if updateDOM is true.\n * @type {!Array<!shaka.text.Cue>}\n */\n const toPlant = [];\n for (const cue of cues) {\n parents.push(cue);\n\n let cueRegistry = this.currentCuesMap_.get(cue);\n const shouldBeDisplayed =\n cue.startTime <= currentTime && cue.endTime > currentTime;\n let wrapper = cueRegistry ? cueRegistry.wrapper : null;\n\n if (cueRegistry) {\n // If the cues are replanted, all existing cues should be uprooted,\n // even ones which are going to be planted again.\n toUproot.push(cueRegistry.cueElement);\n\n // Also uproot all displayed region elements.\n if (cueRegistry.regionElement) {\n toUproot.push(cueRegistry.regionElement);\n }\n\n // If the cue should not be displayed, remove it entirely.\n if (!shouldBeDisplayed) {\n // Since something has to be removed, we will need to update the DOM.\n updateDOM = true;\n this.currentCuesMap_.delete(cue);\n cueRegistry = null;\n }\n }\n\n if (shouldBeDisplayed) {\n toPlant.push(cue);\n if (!cueRegistry) {\n // The cue has to be made!\n this.createCue_(cue, parents);\n cueRegistry = this.currentCuesMap_.get(cue);\n wrapper = cueRegistry.wrapper;\n updateDOM = true;\n } else if (!this.isElementUnderTextContainer_(wrapper)) {\n // We found that the wrapper needs to be in the DOM\n updateDOM = true;\n }\n }\n\n // Recursively check the nested cues, to see if they need to be added or\n // removed.\n // If wrapper is null, that means that the cue is not only not being\n // displayed currently, it also was not removed this tick. So it's\n // guaranteed that the children will neither need to be added nor removed.\n if (cue.nestedCues.length > 0 && wrapper) {\n this.updateCuesRecursive_(\n cue.nestedCues, wrapper, currentTime, parents);\n }\n\n const topCue = parents.pop();\n goog.asserts.assert(topCue == cue, 'Parent cues should be kept in order');\n }\n\n if (updateDOM) {\n for (const element of toUproot) {\n // NOTE: Because we uproot shared region elements, too, we might hit an\n // element here that has no parent because we've already processed it.\n if (element.parentElement) {\n element.parentElement.removeChild(element);\n }\n }\n toPlant.sort((a, b) => {\n if (a.startTime != b.startTime) {\n return a.startTime - b.startTime;\n } else {\n return a.endTime - b.endTime;\n }\n });\n for (const cue of toPlant) {\n const cueRegistry = this.currentCuesMap_.get(cue);\n goog.asserts.assert(cueRegistry, 'cueRegistry should exist.');\n if (cueRegistry.regionElement) {\n if (cueRegistry.regionElement.contains(container)) {\n cueRegistry.regionElement.removeChild(container);\n }\n container.appendChild(cueRegistry.regionElement);\n cueRegistry.regionElement.appendChild(cueRegistry.cueElement);\n } else {\n container.appendChild(cueRegistry.cueElement);\n }\n }\n }\n }\n\n /**\n * Display the current captions.\n * @param {boolean=} forceUpdate\n * @private\n */\n updateCaptions_(forceUpdate = false) {\n if (!this.textContainer_) {\n return;\n }\n\n const currentTime = this.video_.currentTime;\n if (!this.isTextVisible_ || forceUpdate) {\n // Remove child elements from all regions.\n for (const regionElement of this.regionElements_.values()) {\n shaka.util.Dom.removeAllChildren(regionElement);\n }\n // Remove all top-level elements in the text container.\n shaka.util.Dom.removeAllChildren(this.textContainer_);\n // Clear the element maps.\n this.currentCuesMap_.clear();\n this.regionElements_.clear();\n }\n if (this.isTextVisible_) {\n // Log currently attached cue elements for verification, later.\n const previousCuesMap = new Map();\n if (goog.DEBUG) {\n for (const cue of this.currentCuesMap_.keys()) {\n previousCuesMap.set(cue, this.currentCuesMap_.get(cue));\n }\n }\n\n // Update the cues.\n this.updateCuesRecursive_(\n this.cues_, this.textContainer_, currentTime, /* parents= */ []);\n\n if (goog.DEBUG) {\n // Previously, we had an issue (#2076) where cues sometimes were not\n // properly removed from the DOM. It is not clear if this issue still\n // happens, so the previous fix for it has been changed to an assert.\n for (const cue of previousCuesMap.keys()) {\n if (!this.currentCuesMap_.has(cue)) {\n // TODO: If the problem does not appear again, then we should remove\n // this assert (and the previousCuesMap code) in Shaka v4.\n const cueElement = previousCuesMap.get(cue).cueElement;\n goog.asserts.assert(\n !cueElement.parentNode, 'Cue was not properly removed!');\n }\n }\n }\n }\n }\n\n /**\n * Compute a unique internal id:\n * Regions can reuse the id but have different dimensions, we need to\n * consider those differences\n * @param {shaka.text.CueRegion} region\n * @private\n */\n generateRegionId_(region) {\n const percentageUnit = shaka.text.CueRegion.units.PERCENTAGE;\n const heightUnit = region.heightUnits == percentageUnit ? '%' : 'px';\n const viewportAnchorUnit =\n region.viewportAnchorUnits == percentageUnit ? '%' : 'px';\n const uniqueRegionId = `${region.id}_${\n region.width}x${region.height}${heightUnit}-${\n region.viewportAnchorX}x${region.viewportAnchorY}${viewportAnchorUnit}`;\n\n return uniqueRegionId;\n }\n\n /**\n * Get or create a region element corresponding to the cue region. These are\n * cached by ID.\n *\n * @param {!shaka.text.Cue} cue\n * @return {!HTMLElement}\n * @private\n */\n getRegionElement_(cue) {\n const region = cue.region;\n // from https://dvcs.w3.org/hg/text-tracks/raw-file/default/608toVTT/608toVTT.html#caption-window-size\n // if aspect ratio is 4/3, use that value, otherwise, use the 16:9 value\n const lineWidthMultiple = this.aspectRatio_ === 4/3 ? 2.5 : 1.9;\n const lineHeightMultiple = 5.33;\n\n const regionId = this.generateRegionId_(region);\n if (this.regionElements_.has(regionId)) {\n return this.regionElements_.get(regionId);\n }\n\n const regionElement = shaka.util.Dom.createHTMLElement('span');\n\n const linesUnit = shaka.text.CueRegion.units.LINES;\n const percentageUnit = shaka.text.CueRegion.units.PERCENTAGE;\n const pixelUnit = shaka.text.CueRegion.units.PX;\n let heightUnit = region.heightUnits == percentageUnit ? '%' : 'px';\n let widthUnit = region.widthUnits == percentageUnit ? '%' : 'px';\n const viewportAnchorUnit =\n region.viewportAnchorUnits == percentageUnit ? '%' : 'px';\n\n regionElement.id = 'shaka-text-region---' + regionId;\n regionElement.classList.add('shaka-text-region');\n\n regionElement.style.position = 'absolute';\n\n let regionHeight = region.height;\n let regionWidth = region.width;\n\n if (region.heightUnits === linesUnit) {\n regionHeight = region.height * lineHeightMultiple;\n heightUnit = '%';\n }\n if (region.widthUnits === linesUnit) {\n regionWidth = region.width * lineWidthMultiple;\n widthUnit = '%';\n }\n regionElement.style.height = regionHeight + heightUnit;\n regionElement.style.width = regionWidth + widthUnit;\n\n if (region.viewportAnchorUnits === linesUnit) {\n // from https://dvcs.w3.org/hg/text-tracks/raw-file/default/608toVTT/608toVTT.html#positioning-in-cea-708\n let top = region.viewportAnchorY / 75 * 100;\n const windowWidth = this.aspectRatio_ === 4/3 ? 160 : 210;\n let left = region.viewportAnchorX / windowWidth * 100;\n // adjust top and left values based on the region anchor and window size\n top -= region.regionAnchorY * regionHeight / 100;\n left -= region.regionAnchorX * regionWidth / 100;\n regionElement.style.top = top + '%';\n regionElement.style.left = left + '%';\n } else {\n regionElement.style.top = region.viewportAnchorY -\n region.regionAnchorY * regionHeight / 100 + viewportAnchorUnit;\n regionElement.style.left = region.viewportAnchorX -\n region.regionAnchorX * regionWidth / 100 + viewportAnchorUnit;\n }\n if (region.heightUnits !== pixelUnit &&\n region.widthUnits !== pixelUnit &&\n region.viewportAnchorUnits !== pixelUnit) {\n // Clip region\n const top = parseInt(regionElement.style.top.slice(0, -1), 10) || 0;\n const left = parseInt(regionElement.style.left.slice(0, -1), 10) || 0;\n const height = parseInt(regionElement.style.height.slice(0, -1), 10) || 0;\n const width = parseInt(regionElement.style.width.slice(0, -1), 10) || 0;\n const realTop = Math.max(0, Math.min(100 - height, top));\n const realLeft = Math.max(0, Math.min(100 - width, left));\n regionElement.style.top = realTop + '%';\n regionElement.style.left = realLeft + '%';\n }\n\n regionElement.style.display = 'flex';\n regionElement.style.flexDirection = 'column';\n regionElement.style.alignItems = 'center';\n\n if (cue.displayAlign == shaka.text.Cue.displayAlign.BEFORE) {\n regionElement.style.justifyContent = 'flex-start';\n } else if (cue.displayAlign == shaka.text.Cue.displayAlign.CENTER) {\n regionElement.style.justifyContent = 'center';\n } else {\n regionElement.style.justifyContent = 'flex-end';\n }\n\n this.regionElements_.set(regionId, regionElement);\n return regionElement;\n }\n\n /**\n * Creates the object for a cue.\n *\n * @param {!shaka.text.Cue} cue\n * @param {!Array<!shaka.text.Cue>} parents\n * @private\n */\n createCue_(cue, parents) {\n const isNested = parents.length > 1;\n let type = isNested ? 'span' : 'div';\n if (cue.lineBreak) {\n type = 'br';\n }\n if (cue.rubyTag) {\n type = cue.rubyTag;\n }\n\n const needWrapper = !isNested && cue.nestedCues.length > 0;\n\n // Nested cues are inline elements. Top-level cues are block elements.\n const cueElement = shaka.util.Dom.createHTMLElement(type);\n if (type != 'br') {\n this.setCaptionStyles_(cueElement, cue, parents, needWrapper);\n }\n\n let regionElement = null;\n if (cue.region && cue.region.id) {\n regionElement = this.getRegionElement_(cue);\n }\n\n let wrapper = cueElement;\n if (needWrapper) {\n // Create a wrapper element which will serve to contain all children into\n // a single item. This ensures that nested span elements appear\n // horizontally and br elements occupy no vertical space.\n wrapper = shaka.util.Dom.createHTMLElement('span');\n wrapper.classList.add('shaka-text-wrapper');\n wrapper.style.backgroundColor = cue.backgroundColor;\n wrapper.style.lineHeight = 'normal';\n cueElement.appendChild(wrapper);\n }\n\n this.currentCuesMap_.set(cue, {cueElement, wrapper, regionElement});\n }\n\n /**\n * Compute cue position alignment\n * See https://www.w3.org/TR/webvtt1/#webvtt-cue-position-alignment\n *\n * @param {!shaka.text.Cue} cue\n * @private\n */\n computeCuePositionAlignment_(cue) {\n const Cue = shaka.text.Cue;\n const {direction, positionAlign, textAlign} = cue;\n\n if (positionAlign !== Cue.positionAlign.AUTO) {\n // Position align is not AUTO: use it\n return positionAlign;\n }\n\n // Position align is AUTO: use text align to compute its value\n\n if (textAlign === Cue.textAlign.LEFT ||\n (textAlign === Cue.textAlign.START &&\n direction === Cue.direction.HORIZONTAL_LEFT_TO_RIGHT) ||\n (textAlign === Cue.textAlign.END &&\n direction === Cue.direction.HORIZONTAL_RIGHT_TO_LEFT)) {\n return Cue.positionAlign.LEFT;\n }\n\n if (textAlign === Cue.textAlign.RIGHT ||\n (textAlign === Cue.textAlign.START &&\n direction === Cue.direction.HORIZONTAL_RIGHT_TO_LEFT) ||\n (textAlign === Cue.textAlign.END &&\n direction === Cue.direction.HORIZONTAL_LEFT_TO_RIGHT)) {\n return Cue.positionAlign.RIGHT;\n }\n\n return Cue.positionAlign.CENTER;\n }\n\n /**\n * @param {!HTMLElement} cueElement\n * @param {!shaka.text.Cue} cue\n * @param {!Array<!shaka.text.Cue>} parents\n * @param {boolean} hasWrapper\n * @private\n */\n setCaptionStyles_(cueElement, cue, parents, hasWrapper) {\n const Cue = shaka.text.Cue;\n const inherit =\n (cb) => shaka.text.UITextDisplayer.inheritProperty_(parents, cb);\n const style = cueElement.style;\n const isLeaf = cue.nestedCues.length == 0;\n const isNested = parents.length > 1;\n\n // TODO: wrapLine is not yet supported. Lines always wrap.\n\n // White space should be preserved if emitted by the text parser. It's the\n // job of the parser to omit any whitespace that should not be displayed.\n // Using 'pre-wrap' means that whitespace is preserved even at the end of\n // the text, but that lines which overflow can still be broken.\n style.whiteSpace = 'pre-wrap';\n\n // Using 'break-spaces' would be better, as it would preserve even trailing\n // spaces, but that only shipped in Chrome 76. As of July 2020, Safari\n // still has not implemented break-spaces, and the original Chromecast will\n // never have this feature since it no longer gets firmware updates.\n // So we need to replace trailing spaces with non-breaking spaces.\n const text = cue.payload.replace(/\\s+$/g, (match) => {\n const nonBreakingSpace = '\\xa0';\n return nonBreakingSpace.repeat(match.length);\n });\n\n style.webkitTextStrokeColor = cue.textStrokeColor;\n style.webkitTextStrokeWidth = cue.textStrokeWidth;\n style.color = cue.color;\n style.direction = cue.direction;\n style.opacity = cue.opacity;\n style.paddingLeft = shaka.text.UITextDisplayer.convertLengthValue_(\n cue.linePadding, cue, this.videoContainer_);\n style.paddingRight =\n shaka.text.UITextDisplayer.convertLengthValue_(\n cue.linePadding, cue, this.videoContainer_);\n style.textCombineUpright = cue.textCombineUpright;\n style.textShadow = cue.textShadow;\n\n if (cue.backgroundImage) {\n style.backgroundImage = 'url(\\'' + cue.backgroundImage + '\\')';\n style.backgroundRepeat = 'no-repeat';\n style.backgroundSize = 'contain';\n style.backgroundPosition = 'center';\n\n if (cue.backgroundColor) {\n style.backgroundColor = cue.backgroundColor;\n }\n\n // Quoting https://www.w3.org/TR/ttml-imsc1.2/:\n // \"The width and height (in pixels) of the image resource referenced by\n // smpte:backgroundImage SHALL be equal to the width and height expressed\n // by the tts:extent attribute of the region in which the div element is\n // presented\".\n style.width = '100%';\n style.height = '100%';\n } else {\n // If we have both text and nested cues, then style everything; otherwise\n // place the text in its own <span> so the background doesn't fill the\n // whole region.\n let elem;\n if (cue.nestedCues.length) {\n elem = cueElement;\n } else {\n elem = shaka.util.Dom.createHTMLElement('span');\n cueElement.appendChild(elem);\n }\n\n if (cue.border) {\n elem.style.border = cue.border;\n }\n if (!hasWrapper) {\n const bgColor = inherit((c) => c.backgroundColor);\n if (bgColor) {\n elem.style.backgroundColor = bgColor;\n } else if (text) {\n // If there is no background, default to a semi-transparent black.\n // Only do this for the text itself.\n elem.style.backgroundColor = 'rgba(0, 0, 0, 0.8)';\n }\n }\n if (text) {\n elem.textContent = text;\n }\n }\n\n // The displayAlign attribute specifies the vertical alignment of the\n // captions inside the text container. Before means at the top of the\n // text container, and after means at the bottom.\n if (isNested && !parents[parents.length - 1].isContainer) {\n style.display = 'inline';\n } else {\n style.display = 'flex';\n style.flexDirection = 'column';\n style.alignItems = 'center';\n if (cue.textAlign == Cue.textAlign.LEFT ||\n cue.textAlign == Cue.textAlign.START) {\n style.width = '100%';\n style.alignItems = 'start';\n } else if (cue.textAlign == Cue.textAlign.RIGHT ||\n cue.textAlign == Cue.textAlign.END) {\n style.width = '100%';\n style.alignItems = 'end';\n }\n\n if (cue.displayAlign == Cue.displayAlign.BEFORE) {\n style.justifyContent = 'flex-start';\n } else if (cue.displayAlign == Cue.displayAlign.CENTER) {\n style.justifyContent = 'center';\n } else {\n style.justifyContent = 'flex-end';\n }\n }\n\n if (!isLeaf) {\n style.margin = '0';\n }\n\n style.fontFamily = cue.fontFamily;\n style.fontWeight = cue.fontWeight.toString();\n style.fontStyle = cue.fontStyle;\n style.letterSpacing = cue.letterSpacing;\n const fontScaleFactor = this.config_ ? this.config_.fontScaleFactor : 1;\n style.fontSize = shaka.text.UITextDisplayer.convertLengthValue_(\n cue.fontSize, cue, this.videoContainer_, fontScaleFactor);\n\n // The line attribute defines the positioning of the text container inside\n // the video container.\n // - The line offsets the text container from the top, the right or left of\n // the video viewport as defined by the writing direction.\n // - The value of the line is either as a number of lines, or a percentage\n // of the video viewport height or width.\n // The lineAlign is an alignment for the text container's line.\n // - The Start alignment means the text container’s top side (for horizontal\n // cues), left side (for vertical growing right), or right side (for\n // vertical growing left) is aligned at the line.\n // - The Center alignment means the text container is centered at the line\n // (to be implemented).\n // - The End Alignment means The text container’s bottom side (for\n // horizontal cues), right side (for vertical growing right), or left side\n // (for vertical growing left) is aligned at the line.\n // TODO: Implement line alignment with line number.\n // TODO: Implement lineAlignment of 'CENTER'.\n let line = cue.line;\n if (line != null) {\n let lineInterpretation = cue.lineInterpretation;\n // HACK: the current implementation of UITextDisplayer only handled\n // PERCENTAGE, so we need convert LINE_NUMBER to PERCENTAGE\n if (lineInterpretation == Cue.lineInterpretation.LINE_NUMBER) {\n lineInterpretation = Cue.lineInterpretation.PERCENTAGE;\n let maxLines = 16;\n // The maximum number of lines is different if it is a vertical video.\n if (this.aspectRatio_ && this.aspectRatio_ < 1) {\n maxLines = 32;\n }\n if (line < 0) {\n line = 100 + line / maxLines * 100;\n } else {\n line = line / maxLines * 100;\n }\n }\n if (lineInterpretation == Cue.lineInterpretation.PERCENTAGE) {\n style.position = 'absolute';\n if (cue.writingMode == Cue.writingMode.HORIZONTAL_TOP_TO_BOTTOM) {\n style.width = '100%';\n if (cue.lineAlign == Cue.lineAlign.START) {\n style.top = line + '%';\n } else if (cue.lineAlign == Cue.lineAlign.END) {\n style.bottom = (100 - line) + '%';\n }\n } else if (cue.writingMode == Cue.writingMode.VERTICAL_LEFT_TO_RIGHT) {\n style.height = '100%';\n if (cue.lineAlign == Cue.lineAlign.START) {\n style.left = line + '%';\n } else if (cue.lineAlign == Cue.lineAlign.END) {\n style.right = (100 - line) + '%';\n }\n } else {\n style.height = '100%';\n if (cue.lineAlign == Cue.lineAlign.START) {\n style.right = line + '%';\n } else if (cue.lineAlign == Cue.lineAlign.END) {\n style.left = (100 - line) + '%';\n }\n }\n }\n }\n\n style.lineHeight = cue.lineHeight;\n\n // The positionAlign attribute is an alignment for the text container in\n // the dimension of the writing direction.\n const computedPositionAlign = this.computeCuePositionAlignment_(cue);\n if (computedPositionAlign == Cue.positionAlign.LEFT) {\n style.cssFloat = 'left';\n if (cue.position !== null) {\n style.position = 'absolute';\n if (cue.writingMode == Cue.writingMode.HORIZONTAL_TOP_TO_BOTTOM) {\n style.left = cue.position + '%';\n style.width = 'auto';\n } else {\n style.top = cue.position + '%';\n }\n }\n } else if (computedPositionAlign == Cue.positionAlign.RIGHT) {\n style.cssFloat = 'right';\n if (cue.position !== null) {\n style.position = 'absolute';\n if (cue.writingMode == Cue.writingMode.HORIZONTAL_TOP_TO_BOTTOM) {\n style.right = (100 - cue.position) + '%';\n style.width = 'auto';\n } else {\n style.bottom = cue.position + '%';\n }\n }\n } else {\n if (cue.position !== null && cue.position != 50) {\n style.position = 'absolute';\n if (cue.writingMode == Cue.writingMode.HORIZONTAL_TOP_TO_BOTTOM) {\n style.left = cue.position + '%';\n style.width = 'auto';\n } else {\n style.top = cue.position + '%';\n }\n }\n }\n\n style.textAlign = cue.textAlign;\n style.textDecoration = cue.textDecoration.join(' ');\n style.writingMode = cue.writingMode;\n\n // Old versions of Chromium, which may be found in certain versions of Tizen\n // and WebOS, may require the prefixed version: webkitWritingMode.\n // https://caniuse.com/css-writing-mode\n // However, testing shows that Tizen 3, at least, has a 'writingMode'\n // property, but the setter for it does nothing. Therefore we need to\n // detect that and fall back to the prefixed version in this case, too.\n if (!('writingMode' in document.documentElement.style) ||\n style.writingMode != cue.writingMode) {\n // Note that here we do not bother to check for webkitWritingMode support\n // explicitly. We try the unprefixed version, then fall back to the\n // prefixed version unconditionally.\n style.webkitWritingMode = cue.writingMode;\n }\n\n // The size is a number giving the size of the text container, to be\n // interpreted as a percentage of the video, as defined by the writing\n // direction.\n if (cue.size) {\n if (cue.writingMode == Cue.writingMode.HORIZONTAL_TOP_TO_BOTTOM) {\n style.width = cue.size + '%';\n } else {\n style.height = cue.size + '%';\n }\n }\n }\n\n /**\n * Returns info about provided lengthValue\n * @example 100px => { value: 100, unit: 'px' }\n * @param {?string} lengthValue\n *\n * @return {?{ value: number, unit: string }}\n * @private\n */\n static getLengthValueInfo_(lengthValue) {\n const matches = new RegExp(/(\\d*\\.?\\d+)([a-z]+|%+)/).exec(lengthValue);\n\n if (!matches) {\n return null;\n }\n\n return {\n value: Number(matches[1]),\n unit: matches[2],\n };\n }\n\n /**\n * Converts length value to an absolute value in pixels.\n * If lengthValue is already an absolute value it will not\n * be modified. Relative lengthValue will be converted to an\n * absolute value in pixels based on Computed Cell Size\n *\n * @param {string} lengthValue\n * @param {!shaka.text.Cue} cue\n * @param {HTMLElement} videoContainer\n * @param {number=} scaleFactor\n * @return {string}\n * @private\n */\n static convertLengthValue_(lengthValue, cue, videoContainer,\n scaleFactor = 1) {\n const lengthValueInfo =\n shaka.text.UITextDisplayer.getLengthValueInfo_(lengthValue);\n\n if (!lengthValueInfo) {\n return lengthValue;\n }\n\n const {unit, value} = lengthValueInfo;\n\n const realValue = value * scaleFactor;\n\n switch (unit) {\n case '%':\n return shaka.text.UITextDisplayer.getAbsoluteLengthInPixels_(\n realValue / 100, cue, videoContainer);\n case 'c':\n return shaka.text.UITextDisplayer.getAbsoluteLengthInPixels_(\n realValue, cue, videoContainer);\n default:\n return realValue + unit;\n }\n }\n\n /**\n * Returns computed absolute length value in pixels based on cell\n * and a video container size\n * @param {number} value\n * @param {!shaka.text.Cue} cue\n * @param {HTMLElement} videoContainer\n * @return {string}\n *\n * @private\n */\n static getAbsoluteLengthInPixels_(value, cue, videoContainer) {\n const containerHeight = videoContainer.clientHeight;\n\n return (containerHeight * value / cue.cellResolution.rows) + 'px';\n }\n\n /**\n * Inherits a property from the parent Cue elements. If the value is falsy,\n * it is assumed to be inherited from the parent. This returns null if the\n * value isn't found.\n *\n * @param {!Array<!shaka.text.Cue>} parents\n * @param {function(!shaka.text.Cue):?T} cb\n * @return {?T}\n * @template T\n * @private\n */\n static inheritProperty_(parents, cb) {\n for (let i = parents.length - 1; i >= 0; i--) {\n const val = cb(parents[i]);\n if (val || val === 0) {\n return val;\n }\n }\n return null;\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.CmcdManager');\n\ngoog.require('goog.Uri');\ngoog.require('shaka.log');\ngoog.require('shaka.net.NetworkingEngine');\ngoog.require('shaka.util.ArrayUtils');\ngoog.require('shaka.util.EventManager');\n\ngoog.requireType('shaka.media.SegmentReference');\n\n/**\n * @summary\n * A CmcdManager maintains CMCD state as well as a collection of utility\n * functions.\n */\nshaka.util.CmcdManager = class {\n /**\n * @param {shaka.util.CmcdManager.PlayerInterface} playerInterface\n * @param {shaka.extern.CmcdConfiguration} config\n */\n constructor(playerInterface, config) {\n /** @private {shaka.util.CmcdManager.PlayerInterface} */\n this.playerInterface_ = playerInterface;\n\n /** @private {?shaka.extern.CmcdConfiguration} */\n this.config_ = config;\n\n /**\n * Streaming format\n *\n * @private {(shaka.util.CmcdManager.StreamingFormat|undefined)}\n */\n this.sf_ = undefined;\n\n /**\n * @private {boolean}\n */\n this.playbackStarted_ = false;\n\n /**\n * @private {boolean}\n */\n this.buffering_ = true;\n\n /**\n * @private {boolean}\n */\n this.starved_ = false;\n\n /**\n * @private {boolean}\n */\n this.lowLatency_ = false;\n\n /**\n * @private {number|undefined}\n */\n this.playbackPlayTime_ = undefined;\n\n /**\n * @private {number|undefined}\n */\n this.playbackPlayingTime_ = undefined;\n\n /**\n * @private {number}\n */\n this.startTimeOfLoad_ = 0;\n\n /**\n * @private {boolean}\n */\n this.msdSent_ = false;\n\n /**\n * @private {shaka.util.EventManager}\n */\n this.eventManager_ = new shaka.util.EventManager();\n\n /** @private {HTMLMediaElement} */\n this.video_ = null;\n }\n\n\n /**\n * Set media element and setup event listeners\n * @param {HTMLMediaElement} mediaElement The video element\n */\n setMediaElement(mediaElement) {\n this.video_ = mediaElement;\n this.setupMSDEventListeners_();\n }\n\n /**\n * Called by the Player to provide an updated configuration any time it\n * changes.\n *\n * @param {shaka.extern.CmcdConfiguration} config\n */\n configure(config) {\n this.config_ = config;\n }\n\n\n /**\n * Resets the CmcdManager.\n */\n reset() {\n this.playbackStarted_ = false;\n this.buffering_ = true;\n this.starved_ = false;\n this.lowLatency_ = false;\n this.playbackPlayTime_ = 0;\n this.playbackPlayingTime_ = 0;\n this.startTimeOfLoad_ = 0;\n this.msdSent_ = false;\n this.video_ = null;\n this.eventManager_.removeAll();\n }\n\n /**\n * Set the buffering state\n *\n * @param {boolean} buffering\n */\n setBuffering(buffering) {\n if (!buffering && !this.playbackStarted_) {\n this.playbackStarted_ = true;\n }\n\n if (this.playbackStarted_ && buffering) {\n this.starved_ = true;\n }\n\n this.buffering_ = buffering;\n }\n\n /**\n * Set the low latency\n *\n * @param {boolean} lowLatency\n */\n setLowLatency(lowLatency) {\n this.lowLatency_ = lowLatency;\n\n const StreamingFormat = shaka.util.CmcdManager.StreamingFormat;\n if (this.lowLatency_) {\n if (this.sf_ == StreamingFormat.DASH) {\n this.sf_ = StreamingFormat.LOW_LATENCY_DASH;\n } else if (this.sf_ == StreamingFormat.HLS) {\n this.sf_ = StreamingFormat.LOW_LATENCY_HLS;\n }\n } else {\n if (this.sf_ == StreamingFormat.LOW_LATENCY_DASH) {\n this.sf_ = StreamingFormat.DASH;\n } else if (this.sf_ == StreamingFormat.LOW_LATENCY_HLS) {\n this.sf_ = StreamingFormat.HLS;\n }\n }\n }\n\n /**\n * Set start time of load if autoplay is enabled\n *\n * @param {number} startTimeOfLoad\n */\n setStartTimeOfLoad(startTimeOfLoad) {\n if (!this.config_ || !this.config_.enabled ||\n this.config_.version != shaka.util.CmcdManager.Version.VERSION_2) {\n return;\n }\n if (this.video_ && this.video_.autoplay) {\n const playResult = this.video_.play();\n if (playResult) {\n playResult.then(() => {\n this.startTimeOfLoad_ = startTimeOfLoad;\n }).catch((e) => {\n this.startTimeOfLoad_ = 0;\n });\n }\n }\n }\n\n /**\n * Apply CMCD data to a request.\n *\n * @param {!shaka.net.NetworkingEngine.RequestType} type\n * The request type\n * @param {!shaka.extern.Request} request\n * The request to apply CMCD data to\n * @param {shaka.extern.RequestContext=} context\n * The request context\n */\n applyData(type, request, context = {}) {\n if (!this.config_.enabled) {\n return;\n }\n\n if (request.method === 'HEAD') {\n this.apply_(request);\n return;\n }\n\n const RequestType = shaka.net.NetworkingEngine.RequestType;\n const ObjectType = shaka.util.CmcdManager.ObjectType;\n\n switch (type) {\n case RequestType.MANIFEST:\n this.applyManifestData(request, context);\n break;\n\n case RequestType.SEGMENT:\n this.applySegmentData(request, context);\n break;\n\n case RequestType.LICENSE:\n case RequestType.SERVER_CERTIFICATE:\n case RequestType.KEY:\n this.apply_(request, {ot: ObjectType.KEY});\n break;\n\n case RequestType.TIMING:\n this.apply_(request, {ot: ObjectType.OTHER});\n break;\n }\n }\n\n /**\n * Apply CMCD data to a manifest request.\n *\n * @param {!shaka.extern.Request} request\n * The request to apply CMCD data to\n * @param {shaka.extern.RequestContext} context\n * The request context\n */\n applyManifestData(request, context) {\n try {\n if (!this.config_.enabled) {\n return;\n }\n\n if (context.type) {\n this.sf_ = this.getStreamFormat_(context.type);\n }\n\n this.apply_(request, {\n ot: shaka.util.CmcdManager.ObjectType.MANIFEST,\n su: !this.playbackStarted_,\n });\n } catch (error) {\n shaka.log.warnOnce('CMCD_MANIFEST_ERROR',\n 'Could not generate manifest CMCD data.', error);\n }\n }\n\n /**\n * Apply CMCD data to a segment request\n *\n * @param {!shaka.extern.Request} request\n * @param {shaka.extern.RequestContext} context\n * The request context\n */\n applySegmentData(request, context) {\n try {\n if (!this.config_.enabled) {\n return;\n }\n\n const segment = context.segment;\n\n let duration = 0;\n if (segment) {\n duration = segment.endTime - segment.startTime;\n }\n\n const data = {\n d: duration * 1000,\n st: this.getStreamType_(),\n };\n\n data.ot = this.getObjectType_(context);\n\n const ObjectType = shaka.util.CmcdManager.ObjectType;\n const isMedia = data.ot === ObjectType.VIDEO ||\n data.ot === ObjectType.AUDIO ||\n data.ot === ObjectType.MUXED ||\n data.ot === ObjectType.TIMED_TEXT;\n\n const stream = context.stream;\n if (stream) {\n const playbackRate = this.playerInterface_.getPlaybackRate();\n if (isMedia) {\n data.bl = this.getBufferLength_(stream.type);\n if (data.ot !== ObjectType.TIMED_TEXT) {\n const remainingBufferLength =\n this.getRemainingBufferLength_(stream.type);\n if (playbackRate) {\n data.dl = remainingBufferLength / Math.abs(playbackRate);\n } else {\n data.dl = remainingBufferLength;\n }\n }\n }\n\n if (stream.bandwidth) {\n data.br = stream.bandwidth / 1000;\n }\n\n if (stream.segmentIndex && segment) {\n const reverse = playbackRate < 0;\n const iterator = stream.segmentIndex.getIteratorForTime(\n segment.endTime, /* allowNonIndependent= */ true, reverse);\n if (iterator) {\n const nextSegment = iterator.next().value;\n if (nextSegment && nextSegment != segment) {\n if (!shaka.util.ArrayUtils.equal(\n segment.getUris(), nextSegment.getUris())) {\n data.nor = this.urlToRelativePath_(\n nextSegment.getUris()[0], request.uris[0]);\n }\n if ((nextSegment.startByte || nextSegment.endByte) &&\n (segment.startByte != nextSegment.startByte ||\n segment.endByte != nextSegment.endByte)) {\n let range = nextSegment.startByte + '-';\n if (nextSegment.endByte) {\n range += nextSegment.endByte;\n }\n data.nrr = range;\n }\n }\n }\n const rtp = this.calculateRtp_(stream, segment);\n if (!isNaN(rtp)) {\n data.rtp = rtp;\n }\n }\n }\n\n if (isMedia && data.ot !== ObjectType.TIMED_TEXT) {\n data.tb = this.getTopBandwidth_(data.ot) / 1000;\n }\n\n this.apply_(request, data);\n } catch (error) {\n shaka.log.warnOnce('CMCD_SEGMENT_ERROR',\n 'Could not generate segment CMCD data.', error);\n }\n }\n\n /**\n * Apply CMCD data to a text request\n *\n * @param {!shaka.extern.Request} request\n */\n applyTextData(request) {\n try {\n if (!this.config_.enabled) {\n return;\n }\n\n this.apply_(request, {\n ot: shaka.util.CmcdManager.ObjectType.CAPTION,\n su: true,\n });\n } catch (error) {\n shaka.log.warnOnce('CMCD_TEXT_ERROR',\n 'Could not generate text CMCD data.', error);\n }\n }\n\n /**\n * Apply CMCD data to streams loaded via src=.\n *\n * @param {string} uri\n * @param {string} mimeType\n * @return {string}\n */\n appendSrcData(uri, mimeType) {\n try {\n if (!this.config_.enabled) {\n return uri;\n }\n\n const data = this.createData_();\n data.ot = this.getObjectTypeFromMimeType_(mimeType);\n data.su = true;\n\n const query = shaka.util.CmcdManager.toQuery(data);\n\n return shaka.util.CmcdManager.appendQueryToUri(uri, query);\n } catch (error) {\n shaka.log.warnOnce('CMCD_SRC_ERROR',\n 'Could not generate src CMCD data.', error);\n return uri;\n }\n }\n\n /**\n * Apply CMCD data to side car text track uri.\n *\n * @param {string} uri\n * @return {string}\n */\n appendTextTrackData(uri) {\n try {\n if (!this.config_.enabled) {\n return uri;\n }\n\n const data = this.createData_();\n data.ot = shaka.util.CmcdManager.ObjectType.CAPTION;\n data.su = true;\n\n const query = shaka.util.CmcdManager.toQuery(data);\n\n return shaka.util.CmcdManager.appendQueryToUri(uri, query);\n } catch (error) {\n shaka.log.warnOnce('CMCD_TEXT_TRACK_ERROR',\n 'Could not generate text track CMCD data.', error);\n return uri;\n }\n }\n\n /**\n * Set playbackPlayTime_ when the play event is triggered\n * @private\n */\n onPlaybackPlay_() {\n if (!this.playbackPlayTime_) {\n this.playbackPlayTime_ = Date.now();\n }\n }\n\n /**\n * Set playbackPlayingTime_\n * @private\n */\n onPlaybackPlaying_() {\n if (!this.playbackPlayingTime_) {\n this.playbackPlayingTime_ = Date.now();\n }\n }\n\n /**\n * Setup event listeners for msd calculation\n * @private\n */\n setupMSDEventListeners_() {\n const onPlaybackPlay = () => this.onPlaybackPlay_();\n this.eventManager_.listenOnce(\n this.video_, 'play', onPlaybackPlay);\n\n const onPlaybackPlaying = () => this.onPlaybackPlaying_();\n this.eventManager_.listenOnce(\n this.video_, 'playing', onPlaybackPlaying);\n }\n\n /**\n * Create baseline CMCD data\n *\n * @return {CmcdData}\n * @private\n */\n createData_() {\n if (!this.config_.sessionId) {\n this.config_.sessionId = window.crypto.randomUUID();\n }\n return {\n v: this.config_.version,\n sf: this.sf_,\n sid: this.config_.sessionId,\n cid: this.config_.contentId,\n mtp: this.playerInterface_.getBandwidthEstimate() / 1000,\n };\n }\n\n /**\n * Apply CMCD data to a request.\n *\n * @param {!shaka.extern.Request} request The request to apply CMCD data to\n * @param {!CmcdData} data The data object\n * @param {boolean} useHeaders Send data via request headers\n * @private\n */\n apply_(request, data = {}, useHeaders = this.config_.useHeaders) {\n if (!this.config_.enabled) {\n return;\n }\n\n // apply baseline data\n Object.assign(data, this.createData_());\n\n data.pr = this.playerInterface_.getPlaybackRate();\n\n const isVideo = data.ot === shaka.util.CmcdManager.ObjectType.VIDEO ||\n data.ot === shaka.util.CmcdManager.ObjectType.MUXED;\n\n if (this.starved_ && isVideo) {\n data.bs = true;\n data.su = true;\n this.starved_ = false;\n }\n\n if (data.su == null) {\n data.su = this.buffering_;\n }\n\n if (data.v === shaka.util.CmcdManager.Version.VERSION_2) {\n if (this.playerInterface_.isLive()) {\n data.ltc = this.playerInterface_.getLiveLatency();\n }\n\n const msd = this.calculateMSD_();\n if (msd != undefined) {\n data.msd = msd;\n this.msdSent_ = true;\n }\n }\n\n const output = this.filterKeys_(data);\n\n if (useHeaders) {\n const headers = shaka.util.CmcdManager.toHeaders(output);\n if (!Object.keys(headers).length) {\n return;\n }\n\n Object.assign(request.headers, headers);\n } else {\n const query = shaka.util.CmcdManager.toQuery(output);\n if (!query) {\n return;\n }\n\n request.uris = request.uris.map((uri) => {\n return shaka.util.CmcdManager.appendQueryToUri(uri, query);\n });\n }\n }\n\n /**\n * Filter the CMCD data object to include only the keys specified in the\n * configuration.\n *\n * @param {CmcdData} data\n * @return {CmcdData}\n * @private\n */\n filterKeys_(data) {\n const includeKeys = this.config_.includeKeys;\n\n if (!includeKeys.length) {\n return data;\n }\n\n return Object.keys(data).reduce((acc, key) => {\n if (includeKeys.includes(key)) {\n acc[key] = data[key];\n }\n return acc;\n }, {});\n }\n\n /**\n * The CMCD object type.\n *\n * @param {shaka.extern.RequestContext} context\n * The request context\n * @return {shaka.util.CmcdManager.ObjectType|undefined}\n * @private\n */\n getObjectType_(context) {\n if (context.type ===\n shaka.net.NetworkingEngine.AdvancedRequestType.INIT_SEGMENT) {\n return shaka.util.CmcdManager.ObjectType.INIT;\n }\n\n const stream = context.stream;\n\n if (!stream) {\n return undefined;\n }\n\n const type = stream.type;\n\n if (type == 'video') {\n if (stream.codecs && stream.codecs.includes(',')) {\n return shaka.util.CmcdManager.ObjectType.MUXED;\n }\n return shaka.util.CmcdManager.ObjectType.VIDEO;\n }\n\n if (type == 'audio') {\n return shaka.util.CmcdManager.ObjectType.AUDIO;\n }\n\n if (type == 'text') {\n if (stream.mimeType === 'application/mp4') {\n return shaka.util.CmcdManager.ObjectType.TIMED_TEXT;\n }\n return shaka.util.CmcdManager.ObjectType.CAPTION;\n }\n\n return undefined;\n }\n\n /**\n * The CMCD object type from mimeType.\n *\n * @param {!string} mimeType\n * @return {(shaka.util.CmcdManager.ObjectType|undefined)}\n * @private\n */\n getObjectTypeFromMimeType_(mimeType) {\n switch (mimeType.toLowerCase()) {\n case 'audio/mp4':\n case 'audio/webm':\n case 'audio/ogg':\n case 'audio/mpeg':\n case 'audio/aac':\n case 'audio/flac':\n case 'audio/wav':\n return shaka.util.CmcdManager.ObjectType.AUDIO;\n\n case 'video/webm':\n case 'video/mp4':\n case 'video/mpeg':\n case 'video/mp2t':\n return shaka.util.CmcdManager.ObjectType.MUXED;\n\n case 'application/x-mpegurl':\n case 'application/vnd.apple.mpegurl':\n case 'application/dash+xml':\n case 'video/vnd.mpeg.dash.mpd':\n case 'application/vnd.ms-sstr+xml':\n return shaka.util.CmcdManager.ObjectType.MANIFEST;\n\n default:\n return undefined;\n }\n }\n\n /**\n * Get the buffer length for a media type in milliseconds\n *\n * @param {string} type\n * @return {number}\n * @private\n */\n getBufferLength_(type) {\n const ranges = this.playerInterface_.getBufferedInfo()[type];\n\n if (!ranges.length) {\n return NaN;\n }\n\n const start = this.playerInterface_.getCurrentTime();\n const range = ranges.find((r) => r.start <= start && r.end >= start);\n\n if (!range) {\n return NaN;\n }\n\n return (range.end - start) * 1000;\n }\n\n /**\n * Get the remaining buffer length for a media type in milliseconds\n *\n * @param {string} type\n * @return {number}\n * @private\n */\n getRemainingBufferLength_(type) {\n const ranges = this.playerInterface_.getBufferedInfo()[type];\n\n if (!ranges.length) {\n return 0;\n }\n\n const start = this.playerInterface_.getCurrentTime();\n const range = ranges.find((r) => r.start <= start && r.end >= start);\n\n if (!range) {\n return 0;\n }\n\n return (range.end - start) * 1000;\n }\n\n /**\n * Constructs a relative path from a URL\n *\n * @param {string} url\n * @param {string} base\n * @return {string}\n * @private\n */\n urlToRelativePath_(url, base) {\n const to = new URL(url);\n const from = new URL(base);\n\n if (to.origin !== from.origin) {\n return url;\n }\n\n const toPath = to.pathname.split('/').slice(1);\n const fromPath = from.pathname.split('/').slice(1, -1);\n\n // remove common parents\n while (toPath[0] === fromPath[0]) {\n toPath.shift();\n fromPath.shift();\n }\n\n // add back paths\n while (fromPath.length) {\n fromPath.shift();\n toPath.unshift('..');\n }\n\n return toPath.join('/');\n }\n\n /**\n * Calculate measured start delay\n *\n * @return {number|undefined}\n * @private\n */\n calculateMSD_() {\n if (!this.msdSent_ &&\n this.playbackPlayingTime_ &&\n this.playbackPlayTime_) {\n const startTime = this.startTimeOfLoad_ || this.playbackPlayTime_;\n return this.playbackPlayingTime_ - startTime;\n }\n return undefined;\n }\n\n\n /**\n * Calculate requested maximum throughput\n *\n * @param {shaka.extern.Stream} stream\n * @param {shaka.media.SegmentReference} segment\n * @return {number}\n * @private\n */\n calculateRtp_(stream, segment) {\n const playbackRate = this.playerInterface_.getPlaybackRate() || 1;\n const currentBufferLevel =\n this.getRemainingBufferLength_(stream.type) || 500;\n const bandwidth = stream.bandwidth;\n if (!bandwidth) {\n return NaN;\n }\n const segmentDuration = segment.endTime - segment.startTime;\n // Calculate file size in kilobits\n const segmentSize = bandwidth * segmentDuration / 1000;\n // Calculate time available to load file in seconds\n const timeToLoad = (currentBufferLevel / playbackRate) / 1000;\n // Calculate the exact bandwidth required\n const minBandwidth = segmentSize / timeToLoad;\n // Include a safety buffer\n return minBandwidth * this.config_.rtpSafetyFactor;\n }\n\n /**\n * Get the stream format\n *\n * @param {shaka.net.NetworkingEngine.AdvancedRequestType} type\n * The request's advanced type\n * @return {(shaka.util.CmcdManager.StreamingFormat|undefined)}\n * @private\n */\n getStreamFormat_(type) {\n const AdvancedRequestType = shaka.net.NetworkingEngine.AdvancedRequestType;\n\n switch (type) {\n case AdvancedRequestType.MPD:\n if (this.lowLatency_) {\n return shaka.util.CmcdManager.StreamingFormat.LOW_LATENCY_DASH;\n }\n return shaka.util.CmcdManager.StreamingFormat.DASH;\n\n case AdvancedRequestType.MASTER_PLAYLIST:\n case AdvancedRequestType.MEDIA_PLAYLIST:\n if (this.lowLatency_) {\n return shaka.util.CmcdManager.StreamingFormat.LOW_LATENCY_HLS;\n }\n return shaka.util.CmcdManager.StreamingFormat.HLS;\n\n case AdvancedRequestType.MSS:\n return shaka.util.CmcdManager.StreamingFormat.SMOOTH;\n }\n\n return undefined;\n }\n\n /**\n * Get the stream type\n *\n * @return {shaka.util.CmcdManager.StreamType}\n * @private\n */\n getStreamType_() {\n const isLive = this.playerInterface_.isLive();\n if (isLive) {\n return shaka.util.CmcdManager.StreamType.LIVE;\n } else {\n return shaka.util.CmcdManager.StreamType.VOD;\n }\n }\n\n /**\n * Get the highest bandwidth for a given type.\n *\n * @param {shaka.util.CmcdManager.ObjectType|undefined} type\n * @return {number}\n * @private\n */\n getTopBandwidth_(type) {\n const variants = this.playerInterface_.getVariantTracks();\n if (!variants.length) {\n return NaN;\n }\n\n let top = variants[0];\n\n for (const variant of variants) {\n if (variant.type === 'variant' && variant.bandwidth > top.bandwidth) {\n top = variant;\n }\n }\n\n const ObjectType = shaka.util.CmcdManager.ObjectType;\n\n switch (type) {\n case ObjectType.VIDEO:\n return top.videoBandwidth || NaN;\n\n case ObjectType.AUDIO:\n return top.audioBandwidth || NaN;\n\n default:\n return top.bandwidth;\n }\n }\n\n /**\n * Serialize a CMCD data object according to the rules defined in the\n * section 3.2 of\n * [CTA-5004](https://cdn.cta.tech/cta/media/media/resources/standards/pdfs/cta-5004-final.pdf).\n *\n * @param {CmcdData} data The CMCD data object\n * @return {string}\n */\n static serialize(data) {\n const results = [];\n const isValid = (value) =>\n !Number.isNaN(value) && value != null && value !== '' && value !== false;\n const toRounded = (value) => Math.round(value);\n const toHundred = (value) => toRounded(value / 100) * 100;\n const toUrlSafe = (value) => encodeURIComponent(value);\n const formatters = {\n br: toRounded,\n d: toRounded,\n bl: toHundred,\n dl: toHundred,\n mtp: toHundred,\n nor: toUrlSafe,\n rtp: toHundred,\n tb: toRounded,\n };\n\n const keys = Object.keys(data || {}).sort();\n\n for (const key of keys) {\n let value = data[key];\n\n // ignore invalid values\n if (!isValid(value)) {\n continue;\n }\n\n // Version should only be reported if not equal to 1.\n if (key === 'v' && value === 1) {\n continue;\n }\n\n // Playback rate should only be sent if not equal to 1.\n if (key == 'pr' && value === 1) {\n continue;\n }\n\n // Certain values require special formatting\n const formatter = formatters[key];\n if (formatter) {\n value = formatter(value);\n }\n\n // Serialize the key/value pair\n const type = typeof value;\n let result;\n\n if (type === 'string' && key !== 'ot' && key !== 'sf' && key !== 'st') {\n result = `${key}=${JSON.stringify(value)}`;\n } else if (type === 'boolean') {\n result = key;\n } else if (type === 'symbol') {\n result = `${key}=${value.description}`;\n } else {\n result = `${key}=${value}`;\n }\n\n results.push(result);\n }\n\n return results.join(',');\n }\n\n /**\n * Convert a CMCD data object to request headers according to the rules\n * defined in the section 2.1 and 3.2 of\n * [CTA-5004](https://cdn.cta.tech/cta/media/media/resources/standards/pdfs/cta-5004-final.pdf).\n *\n * @param {CmcdData} data The CMCD data object\n * @return {!Object}\n */\n static toHeaders(data) {\n const keys = Object.keys(data);\n const headers = {};\n const headerNames = ['Object', 'Request', 'Session', 'Status'];\n const headerGroups = [{}, {}, {}, {}];\n const headerMap = {\n br: 0, d: 0, ot: 0, tb: 0,\n bl: 1, dl: 1, mtp: 1, nor: 1, nrr: 1, su: 1, ltc: 1,\n cid: 2, pr: 2, sf: 2, sid: 2, st: 2, v: 2, msd: 2,\n bs: 3, rtp: 3,\n };\n\n for (const key of keys) {\n // Unmapped fields are mapped to the Request header\n const index = (headerMap[key] != null) ? headerMap[key] : 1;\n headerGroups[index][key] = data[key];\n }\n\n for (let i = 0; i < headerGroups.length; i++) {\n const value = shaka.util.CmcdManager.serialize(headerGroups[i]);\n if (value) {\n headers[`CMCD-${headerNames[i]}`] = value;\n }\n }\n\n return headers;\n }\n\n /**\n * Convert a CMCD data object to query args according to the rules\n * defined in the section 2.2 and 3.2 of\n * [CTA-5004](https://cdn.cta.tech/cta/media/media/resources/standards/pdfs/cta-5004-final.pdf).\n *\n * @param {CmcdData} data The CMCD data object\n * @return {string}\n */\n static toQuery(data) {\n return shaka.util.CmcdManager.serialize(data);\n }\n\n /**\n * Append query args to a uri.\n *\n * @param {string} uri\n * @param {string} query\n * @return {string}\n */\n static appendQueryToUri(uri, query) {\n if (!query) {\n return uri;\n }\n\n if (uri.includes('offline:')) {\n return uri;\n }\n\n const url = new goog.Uri(uri);\n url.getQueryData().set('CMCD', query);\n return url.toString();\n }\n};\n\n\n/**\n * @typedef {{\n * getBandwidthEstimate: function():number,\n * getBufferedInfo: function():shaka.extern.BufferedInfo,\n * getCurrentTime: function():number,\n * getPlaybackRate: function():number,\n * getVariantTracks: function():Array<shaka.extern.Track>,\n * isLive: function():boolean,\n * getLiveLatency: function():number\n * }}\n *\n * @property {function():number} getBandwidthEstimate\n * Get the estimated bandwidth in bits per second.\n * @property {function():shaka.extern.BufferedInfo} getBufferedInfo\n * Get information about what the player has buffered.\n * @property {function():number} getCurrentTime\n * Get the current time\n * @property {function():number} getPlaybackRate\n * Get the playback rate\n * @property {function():Array<shaka.extern.Track>} getVariantTracks\n * Get the variant tracks\n * @property {function():boolean} isLive\n * Get if the player is playing live content.\n * @property {function():number} getLiveLatency\n * Get latency in milliseconds between the live edge and what's currently\n * playing.\n */\nshaka.util.CmcdManager.PlayerInterface;\n\n\n/**\n * @enum {string}\n */\nshaka.util.CmcdManager.ObjectType = {\n MANIFEST: 'm',\n AUDIO: 'a',\n VIDEO: 'v',\n MUXED: 'av',\n INIT: 'i',\n CAPTION: 'c',\n TIMED_TEXT: 'tt',\n KEY: 'k',\n OTHER: 'o',\n};\n\n/**\n * @enum {number}\n */\nshaka.util.CmcdManager.Version = {\n VERSION_1: 1,\n VERSION_2: 2,\n};\n\n/**\n * @enum {string}\n */\nshaka.util.CmcdManager.StreamType = {\n VOD: 'v',\n LIVE: 'l',\n};\n\n\n/**\n * @enum {string}\n * @export\n */\nshaka.util.CmcdManager.StreamingFormat = {\n DASH: 'd',\n LOW_LATENCY_DASH: 'ld',\n HLS: 'h',\n LOW_LATENCY_HLS: 'lh',\n SMOOTH: 's',\n OTHER: 'o',\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.text.WebVttGenerator');\n\ngoog.require('shaka.text.Cue');\ngoog.require('shaka.text.Utils');\n\n\n/**\n * @summary Manage the conversion to WebVTT.\n * @export\n */\nshaka.text.WebVttGenerator = class {\n /**\n * @param {!Array<!shaka.text.Cue>} cues\n * @param {!Array<!shaka.extern.AdCuePoint>} adCuePoints\n * @return {string}\n */\n static convert(cues, adCuePoints) {\n const webvttTimeString = (time) => {\n let newTime = time;\n for (const adCuePoint of adCuePoints) {\n if (adCuePoint.end && adCuePoint.start < time) {\n const offset = adCuePoint.end - adCuePoint.start;\n newTime += offset;\n }\n }\n const hours = Math.floor(newTime / 3600);\n const minutes = Math.floor(newTime / 60 % 60);\n const seconds = Math.floor(newTime % 60);\n const milliseconds = Math.floor(newTime * 1000 % 1000);\n return (hours < 10 ? '0' : '') + hours + ':' +\n (minutes < 10 ? '0' : '') + minutes + ':' +\n (seconds < 10 ? '0' : '') + seconds + '.' +\n (milliseconds < 100 ? (milliseconds < 10 ? '00' : '0') : '') +\n milliseconds;\n };\n\n const flattenedCues = shaka.text.Utils.getCuesToFlatten(cues);\n\n let webvttString = 'WEBVTT\\n\\n';\n for (const cue of flattenedCues) {\n const webvttSettings = (cue) => {\n const settings = [];\n const Cue = shaka.text.Cue;\n switch (cue.textAlign) {\n case Cue.textAlign.LEFT:\n settings.push('align:left');\n break;\n case Cue.textAlign.RIGHT:\n settings.push('align:right');\n break;\n case Cue.textAlign.CENTER:\n settings.push('align:middle');\n break;\n case Cue.textAlign.START:\n settings.push('align:start');\n break;\n case Cue.textAlign.END:\n settings.push('align:end');\n break;\n }\n switch (cue.writingMode) {\n case Cue.writingMode.VERTICAL_LEFT_TO_RIGHT:\n settings.push('vertical:lr');\n break;\n case Cue.writingMode.VERTICAL_RIGHT_TO_LEFT:\n settings.push('vertical:rl');\n break;\n }\n\n if (settings.length) {\n return ' ' + settings.join(' ');\n }\n return '';\n };\n webvttString += webvttTimeString(cue.startTime) + ' --> ' +\n webvttTimeString(cue.endTime) + webvttSettings(cue) + '\\n';\n webvttString += cue.payload + '\\n\\n';\n }\n return webvttString;\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.CmsdManager');\n\ngoog.require('shaka.log');\n\n\n/**\n * @summary\n * A CmsdManager maintains CMSD state as well as a collection of utility\n * functions.\n * @export\n */\nshaka.util.CmsdManager = class {\n /**\n * @param {shaka.extern.CmsdConfiguration} config\n */\n constructor(config) {\n /** @private {shaka.extern.CmsdConfiguration} */\n this.config_ = config;\n\n /** @private {?Map<string, (boolean | number | string)>} */\n this.staticParams_ = null;\n\n /** @private {?Map<string, (boolean | number | string)>} */\n this.dynamicParams_ = null;\n }\n\n /**\n * Called by the Player to provide an updated configuration any time it\n * changes.\n *\n * @param {shaka.extern.CmsdConfiguration} config\n */\n configure(config) {\n this.config_ = config;\n }\n\n\n /**\n * Resets the CmsdManager.\n */\n reset() {\n this.staticParams_ = null;\n this.dynamicParams_ = null;\n }\n\n /**\n * Called by the Player to provide the headers of the latest request.\n *\n * @param {!Object<string, string>} headers\n */\n processHeaders(headers) {\n if (!this.config_.enabled) {\n return;\n }\n const CmsdManager = shaka.util.CmsdManager;\n const cmsdStatic = headers[CmsdManager.CMSD_STATIC_HEADER_NAME_];\n if (cmsdStatic) {\n const staticParams = this.parseCMSDStatic_(cmsdStatic);\n if (staticParams) {\n this.staticParams_ = staticParams;\n }\n }\n const cmsdDynamic = headers[CmsdManager.CMSD_DYNAMIC_HEADER_NAME_];\n if (cmsdDynamic) {\n const dynamicParams = this.parseCMSDDynamic_(cmsdDynamic);\n if (dynamicParams) {\n this.dynamicParams_ = dynamicParams;\n }\n }\n }\n\n /**\n * Returns the max bitrate in bits per second. If there is no max bitrate or\n * it's not enabled, it returns null.\n *\n * @return {?number}\n * @export\n */\n getMaxBitrate() {\n const key = shaka.util.CmsdManager.KEYS_.MAX_SUGGESTED_BITRATE;\n if (!this.config_.enabled || !this.config_.applyMaximumSuggestedBitrate ||\n !this.dynamicParams_ || !this.dynamicParams_.has(key)) {\n return null;\n }\n return /** @type {number} */(this.dynamicParams_.get(key)) * 1000;\n }\n\n /**\n * Returns the estimated throughput in bits per second. If there is no\n * estimated throughput or it's not enabled, it returns null.\n *\n * @return {?number}\n * @export\n */\n getEstimatedThroughput() {\n const key = shaka.util.CmsdManager.KEYS_.ESTIMATED_THROUGHPUT;\n if (!this.config_.enabled || !this.dynamicParams_ ||\n !this.dynamicParams_.has(key)) {\n return null;\n }\n return /** @type {number} */(this.dynamicParams_.get(key)) * 1000;\n }\n\n /**\n * Returns the response delay in milliseconds. If there is no response delay\n * or it's not enabled, it returns null.\n *\n * @return {?number}\n * @export\n */\n getResponseDelay() {\n const key = shaka.util.CmsdManager.KEYS_.RESPONSE_DELAY;\n if (!this.config_.enabled || !this.dynamicParams_ ||\n !this.dynamicParams_.has(key)) {\n return null;\n }\n return /** @type {number} */(this.dynamicParams_.get(key));\n }\n\n /**\n * Returns the RTT in milliseconds. If there is no RTT or it's not enabled,\n * it returns null.\n *\n * @return {?number}\n * @export\n */\n getRoundTripTime() {\n const key = shaka.util.CmsdManager.KEYS_.ROUND_TRIP_TIME;\n if (!this.config_.enabled || !this.dynamicParams_ ||\n !this.dynamicParams_.has(key)) {\n return null;\n }\n return /** @type {number} */(this.dynamicParams_.get(key));\n }\n\n /**\n * Gets the current bandwidth estimate.\n *\n * @param {number} defaultEstimate\n * @return {number} The bandwidth estimate in bits per second.\n * @export\n */\n getBandwidthEstimate(defaultEstimate) {\n const estimatedThroughput = this.getEstimatedThroughput();\n if (!estimatedThroughput) {\n return defaultEstimate;\n }\n const etpWeightRatio = this.config_.estimatedThroughputWeightRatio;\n if (etpWeightRatio > 0 && etpWeightRatio <= 1) {\n return (defaultEstimate * (1 - etpWeightRatio)) +\n (estimatedThroughput * etpWeightRatio);\n }\n return defaultEstimate;\n }\n\n /**\n * @param {string} headerValue\n * @return {?Map<string, (boolean | number | string)>}\n * @private\n */\n parseCMSDStatic_(headerValue) {\n try {\n const params = new Map();\n const items = headerValue.split(',');\n for (let i = 0; i < items.length; i++) {\n // <key>=<value>\n const substrings = items[i].split('=');\n const key = substrings[0];\n const value = this.parseParameterValue_(substrings[1]);\n params.set(key, value);\n }\n return params;\n } catch (e) {\n shaka.log.warning(\n 'Failed to parse CMSD-Static response header value:', e);\n return null;\n }\n }\n\n /**\n * @param {string} headerValue\n * @return {?Map<string, (boolean | number | string)>}\n * @private\n */\n parseCMSDDynamic_(headerValue) {\n try {\n const params = new Map();\n const items = headerValue.split(';');\n // Server identifier as 1st item\n for (let i = 1; i < items.length; i++) {\n // <key>=<value>\n const substrings = items[i].split('=');\n const key = substrings[0];\n const value = this.parseParameterValue_(substrings[1]);\n params.set(key, value);\n }\n return params;\n } catch (e) {\n shaka.log.warning(\n 'Failed to parse CMSD-Dynamic response header value:', e);\n return null;\n }\n }\n\n /**\n * @param {string} value\n * @return {(boolean|number|string)}\n * @private\n */\n parseParameterValue_(value) {\n // If the value type is BOOLEAN and the value is TRUE, then the equals\n // sign and the value are omitted\n if (!value) {\n return true;\n }\n // Check if boolean 'false'\n if (value.toLowerCase() === 'false') {\n return false;\n }\n // Check if a number\n if (/^[-0-9]/.test(value)) {\n return parseInt(value, 10);\n }\n // Value is a string, remove double quotes from string value\n return value.replace(/[\"]+/g, '');\n }\n};\n\n/**\n * @const {string}\n * @private\n */\nshaka.util.CmsdManager.CMSD_STATIC_HEADER_NAME_ = 'cmsd-static';\n\n/**\n * @const {string}\n * @private\n */\nshaka.util.CmsdManager.CMSD_DYNAMIC_HEADER_NAME_ = 'cmsd-dynamic';\n\n/**\n * @enum {string}\n * @private\n */\nshaka.util.CmsdManager.KEYS_ = {\n AVAILABILITY_TIME: 'at',\n DURESS: 'du',\n ENCODED_BITRATE: 'br',\n ESTIMATED_THROUGHPUT: 'etp',\n HELD_TIME: 'ht',\n INTERMEDIARY_IDENTIFIER: 'n',\n MAX_SUGGESTED_BITRATE: 'mb',\n NEXT_OBJECT_RESPONSE: 'nor',\n NEXT_RANGE_RESPONSE: 'nrr',\n OBJECT_DURATION: 'd',\n OBJECT_TYPE: 'ot',\n RESPONSE_DELAY: 'rd',\n ROUND_TRIP_TIME: 'rtt',\n STARTUP: 'su',\n STREAM_TYPE: 'st',\n STREAMING_FORMAT: 'sf',\n VERSION: 'v',\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.Mutex');\n\ngoog.require('shaka.log');\n\n\n/**\n * @summary A simple mutex.\n */\nshaka.util.Mutex = class {\n /** Constructs the mutex. */\n constructor() {\n /** @private {?string} */\n this.acquiredIdentifier = null;\n\n /** @private {!Array<function()>} */\n this.unlockQueue = [];\n }\n\n /**\n * Acquires the mutex, as soon as possible.\n * @param {string} identifier\n * @return {!Promise}\n */\n async acquire(identifier) {\n shaka.log.v2(identifier + ' has requested mutex');\n if (this.acquiredIdentifier) {\n await new Promise((resolve) => this.unlockQueue.push(resolve));\n }\n this.acquiredIdentifier = identifier;\n shaka.log.v2(identifier + ' has acquired mutex');\n }\n\n /**\n * Releases your hold on the mutex.\n */\n release() {\n shaka.log.v2(this.acquiredIdentifier + ' has released mutex');\n if (this.unlockQueue.length > 0) {\n this.unlockQueue.shift()();\n } else {\n this.acquiredIdentifier = null;\n }\n }\n\n /**\n * Completely releases the mutex. Meant for use by the tests.\n */\n releaseAll() {\n while (this.acquiredIdentifier) {\n this.release();\n }\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.NumberUtils');\n\n\nshaka.util.NumberUtils = class {\n /**\n * Compare two float numbers, taking a configurable tolerance margin into\n * account.\n *\n * @param {number} a\n * @param {number} b\n * @param {number=} tolerance\n * @return {boolean}\n */\n static isFloatEqual(a, b, tolerance = Number.EPSILON) {\n if (a === b) {\n return true;\n }\n\n const error = Math.abs(a - b);\n\n if (error <= tolerance) {\n return true;\n }\n\n if (tolerance !== Number.EPSILON) {\n return Math.abs(error - tolerance) <= Number.EPSILON;\n }\n\n return false;\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.ads.AdsStats');\n\n\n/**\n * This class tracks all the various components (some optional) that are used to\n * populate |shaka.extern.AdsStats| which is passed to the app.\n *\n * @final\n */\nshaka.ads.AdsStats = class {\n /** */\n constructor() {\n /** @private {!Array<number>} */\n this.loadTimes_ = [];\n /** @private {number} */\n this.started_ = 0;\n /** @private {number} */\n this.overlayAds_ = 0;\n /** @private {number} */\n this.playedCompletely_ = 0;\n /** @private {number} */\n this.skipped_ = 0;\n /** @private {number} */\n this.errors_ = 0;\n }\n\n /**\n * Record the time it took to get the final manifest.\n *\n * @param {number} seconds\n */\n addLoadTime(seconds) {\n this.loadTimes_.push(seconds);\n }\n\n /**\n * Increase the number of ads started by one.\n */\n incrementStarted() {\n this.started_++;\n }\n\n /**\n * Increase the number of overlay ads started by one.\n */\n incrementOverlayAds() {\n this.overlayAds_++;\n }\n\n /**\n * Increase the number of ads played completely by one.\n */\n incrementPlayedCompletely() {\n this.playedCompletely_++;\n }\n\n /**\n * Increase the number of ads skipped by one.\n */\n incrementSkipped() {\n this.skipped_++;\n }\n\n /**\n * Increase the number of ads with error by one.\n */\n incrementErrors() {\n this.errors_++;\n }\n\n /**\n * @return {number}\n * @private\n */\n getAverageLoadTime_() {\n if (!this.loadTimes_.length) {\n return 0;\n }\n const sum = this.loadTimes_.reduce(\n (accumulator, currentValue) => accumulator + currentValue, 0);\n return sum / this.loadTimes_.length;\n }\n\n /**\n * Create a stats blob that we can pass up to the app. This blob will not\n * reference any internal data.\n *\n * @return {shaka.extern.AdsStats}\n */\n getBlob() {\n return {\n loadTimes: this.loadTimes_,\n averageLoadTime: this.getAverageLoadTime_(),\n started: this.started_,\n overlayAds: this.overlayAds_,\n playedCompletely: this.playedCompletely_,\n skipped: this.skipped_,\n errors: this.errors_,\n };\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\ngoog.provide('shaka.ads.ClientSideAd');\n\ngoog.require('shaka.util.EventManager');\n\n\n/**\n * @implements {shaka.extern.IAd}\n * @export\n */\nshaka.ads.ClientSideAd = class {\n /**\n * @param {!google.ima.Ad} imaAd\n * @param {!google.ima.AdsManager} imaAdManager\n * @param {HTMLMediaElement} video\n */\n constructor(imaAd, imaAdManager, video) {\n /** @private {google.ima.Ad} */\n this.ad_ = imaAd;\n\n /** @private {google.ima.AdsManager} */\n this.manager_ = imaAdManager;\n\n /** @private {HTMLMediaElement} */\n this.video_ = video;\n\n /** @private {boolean} */\n this.isPaused_ = false;\n\n /** @private {number} */\n this.volume_ = this.manager_.getVolume();\n\n /** @private {shaka.util.EventManager} */\n this.eventManager_ = new shaka.util.EventManager();\n\n this.eventManager_.listen(this.manager_,\n google.ima.AdEvent.Type.PAUSED, () => {\n this.isPaused_ = true;\n });\n\n this.eventManager_.listen(this.manager_,\n google.ima.AdEvent.Type.RESUMED, () => {\n this.isPaused_ = false;\n });\n }\n\n /**\n * @override\n * @export\n */\n needsSkipUI() {\n return false;\n }\n\n /**\n * @override\n * @export\n */\n isClientRendering() {\n return true;\n }\n\n /**\n * @override\n * @export\n */\n hasCustomClick() {\n return true;\n }\n\n /**\n * @override\n * @export\n */\n isUsingAnotherMediaElement() {\n return true;\n }\n\n /**\n * @override\n * @export\n */\n getDuration() {\n return this.ad_.getDuration();\n }\n\n /**\n * @override\n * @export\n */\n getMinSuggestedDuration() {\n return this.ad_.getMinSuggestedDuration();\n }\n\n /**\n * @override\n * @export\n */\n getRemainingTime() {\n return this.manager_.getRemainingTime();\n }\n\n /**\n * @override\n * @export\n */\n isPaused() {\n return this.isPaused_;\n }\n\n /**\n * @override\n * @export\n */\n isSkippable() {\n // IMA returns -1 for non-skippable ads. Any positive number is a genuine\n // skip offset, meaning the ad is skippable.\n return this.ad_.getSkipTimeOffset() >= 0;\n }\n\n /**\n * @override\n * @export\n */\n getTimeUntilSkippable() {\n const skipOffset = this.ad_.getSkipTimeOffset();\n const canSkipIn = this.getRemainingTime() - skipOffset;\n return Math.max(canSkipIn, 0);\n }\n\n /**\n * @override\n * @export\n */\n canSkipNow() {\n return this.manager_.getAdSkippableState();\n }\n\n /**\n * @override\n * @export\n */\n skip() {\n return this.manager_.skip();\n }\n\n /**\n * @param {boolean} paused\n */\n setPaused(paused) {\n this.isPaused_ = paused;\n }\n\n /**\n * @override\n * @export\n */\n pause() {\n return this.manager_.pause();\n }\n\n /**\n * @override\n * @export\n */\n play() {\n return this.manager_.resume();\n }\n\n\n /**\n * @override\n * @export\n */\n getVolume() {\n return this.manager_.getVolume();\n }\n\n /**\n * @override\n * @export\n */\n setVolume(volume) {\n this.video_.volume = volume;\n return this.manager_.setVolume(volume);\n }\n\n /**\n * @override\n * @export\n */\n isMuted() {\n return this.manager_.getVolume() == 0;\n }\n\n /**\n * @override\n * @export\n */\n isLinear() {\n return this.ad_.isLinear();\n }\n\n\n /**\n * @override\n * @export\n */\n resize(width, height) {\n let isInFullscreen = false;\n const video = /** @type {HTMLVideoElement} */(this.video_);\n if (document.fullscreenEnabled) {\n isInFullscreen = !!document.fullscreenElement;\n } else if (video.webkitSupportsFullscreen) {\n isInFullscreen = video.webkitDisplayingFullscreen;\n }\n const viewMode = isInFullscreen ?\n google.ima.ViewMode.FULLSCREEN : google.ima.ViewMode.NORMAL;\n this.manager_.resize(width, height, viewMode);\n }\n\n /**\n * @override\n * @export\n */\n setMuted(muted) {\n this.video_.muted = muted;\n // Emulate the \"mute\" functionality, where current, pre-mute\n // volume is saved and can be restored on unmute.\n if (muted) {\n this.volume_ = this.getVolume();\n this.manager_.setVolume(0);\n } else {\n this.manager_.setVolume(this.volume_);\n }\n }\n\n /**\n * It's required for a muted ad to start when autoplaying.\n *\n * @param {number} videoVolume\n */\n setInitialMuted(videoVolume) {\n this.volume_ = videoVolume;\n this.manager_.setVolume(0);\n }\n\n /**\n * @override\n * @export\n */\n getSequenceLength() {\n const podInfo = this.ad_.getAdPodInfo();\n if (podInfo == null) {\n // No pod, just one ad.\n return 1;\n }\n\n return podInfo.getTotalAds();\n }\n\n /**\n * @override\n * @export\n */\n getPositionInSequence() {\n const podInfo = this.ad_.getAdPodInfo();\n if (podInfo == null) {\n // No pod, just one ad.\n return 1;\n }\n\n return podInfo.getAdPosition();\n }\n\n /**\n * @override\n * @export\n */\n getTitle() {\n return this.ad_.getTitle();\n }\n\n /**\n * @override\n * @export\n */\n getDescription() {\n return this.ad_.getDescription();\n }\n\n /**\n * @override\n * @export\n */\n getVastMediaBitrate() {\n return this.ad_.getVastMediaBitrate();\n }\n\n /**\n * @override\n * @export\n */\n getVastMediaHeight() {\n return this.ad_.getVastMediaHeight();\n }\n\n /**\n * @override\n * @export\n */\n getVastMediaWidth() {\n return this.ad_.getVastMediaWidth();\n }\n\n /**\n * @override\n * @export\n */\n getAdId() {\n return this.ad_.getAdId();\n }\n\n /**\n * @override\n * @export\n */\n getCreativeAdId() {\n return this.ad_.getCreativeAdId();\n }\n\n /**\n * @override\n * @export\n */\n getAdvertiserName() {\n return this.ad_.getAdvertiserName();\n }\n\n /**\n * @override\n * @export\n */\n getMediaUrl() {\n return this.ad_.getMediaUrl();\n }\n\n /**\n * @override\n * @export\n */\n getTimeOffset() {\n const podInfo = this.ad_.getAdPodInfo();\n if (podInfo == null) {\n // Defaults to 0 if this ad is not part of a pod, or the pod is not part\n // of an ad playlist.\n return 0;\n }\n\n return podInfo.getTimeOffset();\n }\n\n /**\n * @override\n * @export\n */\n getPodIndex() {\n const podInfo = this.ad_.getAdPodInfo();\n if (podInfo == null) {\n // Defaults to 0 if this ad is not part of a pod, or the pod is not part\n // of an ad playlist.\n return 0;\n }\n\n return podInfo.getPodIndex();\n }\n\n /**\n * @override\n * @export\n */\n release() {\n this.ad_ = null;\n this.manager_ = null;\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\ngoog.provide('shaka.ads.Utils');\n\ngoog.require('shaka.util.TextParser');\ngoog.require('shaka.util.TXml');\n\n\n/**\n * A class responsible for ad utils.\n * @export\n */\nshaka.ads.Utils = class {\n /**\n * @param {!shaka.extern.xml.Node} vast\n * @param {?number} currentTime\n * @return {!Array<shaka.extern.AdInterstitial>}\n */\n static parseVastToInterstitials(vast, currentTime) {\n const TXml = shaka.util.TXml;\n /** @type {!Array<shaka.extern.AdInterstitial>} */\n const interstitials = [];\n\n for (const ad of TXml.findChildren(vast, 'Ad')) {\n const inline = TXml.findChild(ad, 'InLine');\n if (!inline) {\n continue;\n }\n const creatives = TXml.findChild(inline, 'Creatives');\n if (!creatives) {\n continue;\n }\n for (const creative of TXml.findChildren(creatives, 'Creative')) {\n const linear = TXml.findChild(creative, 'Linear');\n if (linear) {\n shaka.ads.Utils.processLinearAd_(\n interstitials, currentTime, linear);\n }\n const nonLinearAds = TXml.findChild(creative, 'NonLinearAds');\n if (nonLinearAds) {\n const nonLinears = TXml.findChildren(nonLinearAds, 'NonLinear');\n for (const nonLinear of nonLinears) {\n shaka.ads.Utils.processNonLinearAd_(\n interstitials, currentTime, nonLinear);\n }\n }\n }\n }\n return interstitials;\n }\n\n /**\n * @param {!Array<shaka.extern.AdInterstitial>} interstitials\n * @param {?number} currentTime\n * @param {!shaka.extern.xml.Node} linear\n * @private\n */\n static processLinearAd_(interstitials, currentTime, linear) {\n const TXml = shaka.util.TXml;\n let startTime = 0;\n if (currentTime != null) {\n startTime = currentTime;\n }\n let skipOffset = null;\n if (linear.attributes['skipoffset']) {\n skipOffset = shaka.util.TextParser.parseTime(\n linear.attributes['skipoffset']);\n if (isNaN(skipOffset)) {\n skipOffset = null;\n }\n }\n const mediaFiles = TXml.findChild(linear, 'MediaFiles');\n if (!mediaFiles) {\n return;\n }\n const medias = TXml.findChildren(mediaFiles, 'MediaFile');\n let checkMedias = medias;\n const streamingMedias = medias.filter((media) => {\n return media.attributes['delivery'] == 'streaming';\n });\n if (streamingMedias.length) {\n checkMedias = streamingMedias;\n }\n const sortedMedias = checkMedias.sort((a, b) => {\n const aHeight = parseInt(a.attributes['height'], 10) || 0;\n const bHeight = parseInt(b.attributes['height'], 10) || 0;\n return bHeight - aHeight;\n });\n for (const media of sortedMedias) {\n if (media.attributes['apiFramework']) {\n continue;\n }\n const adUrl = TXml.getContents(media);\n if (!adUrl) {\n continue;\n }\n interstitials.push({\n id: null,\n groupId: null,\n startTime: startTime,\n endTime: null,\n uri: adUrl,\n mimeType: media.attributes['type'] || null,\n isSkippable: skipOffset != null,\n skipOffset,\n skipFor: null,\n canJump: false,\n resumeOffset: 0,\n playoutLimit: null,\n once: true,\n pre: currentTime == null,\n post: currentTime == Infinity,\n timelineRange: false,\n loop: false,\n overlay: null,\n displayOnBackground: false,\n currentVideo: null,\n background: null,\n });\n break;\n }\n }\n\n /**\n * @param {!Array<shaka.extern.AdInterstitial>} interstitials\n * @param {?number} currentTime\n * @param {!shaka.extern.xml.Node} nonLinear\n * @private\n */\n static processNonLinearAd_(interstitials, currentTime, nonLinear) {\n const TXml = shaka.util.TXml;\n let mimeType = null;\n let resource = TXml.findChild(nonLinear, 'StaticResource');\n if (resource) {\n mimeType = resource.attributes['creativeType'];\n } else {\n resource = TXml.findChild(nonLinear, 'HTMLResource');\n if (!resource) {\n return;\n }\n mimeType = 'text/html';\n }\n let adUrl = TXml.getContents(resource);\n if (!adUrl) {\n return;\n }\n if (mimeType === 'text/html') {\n adUrl = 'data:text/html;charset=UTF-8,' + encodeURIComponent(adUrl);\n }\n const width = TXml.parseAttr(nonLinear, 'width', TXml.parseInt) ||\n TXml.parseAttr(nonLinear, 'expandedWidth', TXml.parseInt);\n const height = TXml.parseAttr(nonLinear, 'height', TXml.parseInt) ||\n TXml.parseAttr(nonLinear, 'expandedHeight', TXml.parseInt);\n if (!width && !height) {\n return;\n }\n let playoutLimit = null;\n const minSuggestedDuration =\n nonLinear.attributes['minSuggestedDuration'];\n if (minSuggestedDuration) {\n playoutLimit = shaka.util.TextParser.parseTime(minSuggestedDuration);\n }\n let startTime = 0;\n if (currentTime != null) {\n startTime = currentTime;\n }\n interstitials.push({\n id: null,\n groupId: null,\n startTime: startTime,\n endTime: null,\n uri: adUrl,\n mimeType,\n isSkippable: false,\n skipOffset: null,\n skipFor: null,\n canJump: false,\n resumeOffset: 0,\n playoutLimit,\n once: true,\n pre: currentTime == null,\n post: currentTime == Infinity,\n timelineRange: false,\n loop: false,\n overlay: {\n viewport: {\n x: 0,\n y: 0,\n },\n topLeft: {\n x: 0,\n y: 0,\n },\n size: {\n x: width || 0,\n y: height || 0,\n },\n },\n displayOnBackground: false,\n currentVideo: null,\n background: null,\n });\n }\n\n /**\n * @param {!shaka.extern.xml.Node} vmap\n * @return {!Array<{time: ?number, uri: string}>}\n */\n static parseVMAP(vmap) {\n const TXml = shaka.util.TXml;\n /** @type {!Array<{time: ?number, uri: string}>} */\n const ads = [];\n for (const adBreak of TXml.findChildren(vmap, 'vmap:AdBreak')) {\n const timeOffset = adBreak.attributes['timeOffset'];\n if (!timeOffset) {\n continue;\n }\n let time = null;\n if (timeOffset == 'start') {\n time = 0;\n } else if (timeOffset == 'end') {\n time = Infinity;\n } else {\n time = shaka.util.TextParser.parseTime(timeOffset);\n }\n const adSource = TXml.findChild(adBreak, 'vmap:AdSource');\n if (!adSource) {\n continue;\n }\n const adTagURI = TXml.findChild(adSource, 'vmap:AdTagURI');\n if (!adTagURI) {\n continue;\n }\n const uri = TXml.getTextContents(adTagURI);\n if (!uri) {\n continue;\n }\n ads.push({\n time,\n uri,\n });\n }\n return ads;\n }\n};\n\n/**\n * The event name for when a sequence of ads has been loaded.\n *\n * @const {string}\n * @export\n */\nshaka.ads.Utils.ADS_LOADED = 'ads-loaded';\n\n/**\n * The event name for when an ad has started playing.\n *\n * @const {string}\n * @export\n */\nshaka.ads.Utils.AD_STARTED = 'ad-started';\n\n\n/**\n * The event name for when an ad playhead crosses first quartile.\n *\n * @const {string}\n * @export\n */\nshaka.ads.Utils.AD_FIRST_QUARTILE = 'ad-first-quartile';\n\n\n/**\n * The event name for when an ad playhead crosses midpoint.\n *\n * @const {string}\n * @export\n */\nshaka.ads.Utils.AD_MIDPOINT = 'ad-midpoint';\n\n\n/**\n * The event name for when an ad playhead crosses third quartile.\n *\n * @const {string}\n * @export\n */\nshaka.ads.Utils.AD_THIRD_QUARTILE = 'ad-third-quartile';\n\n\n/**\n * The event name for when an ad has completed playing.\n *\n * @const {string}\n * @export\n */\nshaka.ads.Utils.AD_COMPLETE = 'ad-complete';\n\n\n/**\n * The event name for when an ad has finished playing\n * (played all the way through, was skipped, or was unable to proceed\n * due to an error).\n *\n * @const {string}\n * @export\n */\nshaka.ads.Utils.AD_STOPPED = 'ad-stopped';\n\n\n/**\n * The event name for when an ad is skipped by the user..\n *\n * @const {string}\n * @export\n */\nshaka.ads.Utils.AD_SKIPPED = 'ad-skipped';\n\n\n/**\n * The event name for when the ad volume has changed.\n *\n * @const {string}\n * @export\n */\nshaka.ads.Utils.AD_VOLUME_CHANGED = 'ad-volume-changed';\n\n\n/**\n * The event name for when the ad was muted.\n *\n * @const {string}\n * @export\n */\nshaka.ads.Utils.AD_MUTED = 'ad-muted';\n\n\n/**\n * The event name for when the ad was paused.\n *\n * @const {string}\n * @export\n */\nshaka.ads.Utils.AD_PAUSED = 'ad-paused';\n\n\n/**\n * The event name for when the ad was resumed after a pause.\n *\n * @const {string}\n * @export\n */\nshaka.ads.Utils.AD_RESUMED = 'ad-resumed';\n\n\n/**\n * The event name for when the ad's skip status changes\n * (usually it becomes skippable when it wasn't before).\n *\n * @const {string}\n * @export\n */\nshaka.ads.Utils.AD_SKIP_STATE_CHANGED = 'ad-skip-state-changed';\n\n\n/**\n * The event name for when the ad's cue points (start/end markers)\n * have changed.\n *\n * @const {string}\n * @export\n */\nshaka.ads.Utils.CUEPOINTS_CHANGED = 'ad-cue-points-changed';\n\n\n/**\n * The event name for when the native IMA ad manager object has\n * loaded and become available.\n *\n * @const {string}\n * @export\n */\nshaka.ads.Utils.IMA_AD_MANAGER_LOADED = 'ima-ad-manager-loaded';\n\n\n/**\n * The event name for when the native IMA stream manager object has\n * loaded and become available.\n *\n * @const {string}\n * @export\n */\nshaka.ads.Utils.IMA_STREAM_MANAGER_LOADED = 'ima-stream-manager-loaded';\n\n\n/**\n * The event name for when the ad was clicked.\n *\n * @const {string}\n * @export\n */\nshaka.ads.Utils.AD_CLICKED = 'ad-clicked';\n\n\n/**\n * The event name for when there is an update to the current ad's progress.\n *\n * @const {string}\n * @export\n */\nshaka.ads.Utils.AD_PROGRESS = 'ad-progress';\n\n\n/**\n * The event name for when the ad is buffering.\n *\n * @const {string}\n * @export\n */\nshaka.ads.Utils.AD_BUFFERING = 'ad-buffering';\n\n\n/**\n * The event name for when the ad's URL was hit.\n *\n * @const {string}\n * @export\n */\nshaka.ads.Utils.AD_IMPRESSION = 'ad-impression';\n\n\n/**\n * The event name for when the ad's duration changed.\n *\n * @const {string}\n * @export\n */\nshaka.ads.Utils.AD_DURATION_CHANGED = 'ad-duration-changed';\n\n\n/**\n * The event name for when the ad was closed by the user.\n *\n * @const {string}\n * @export\n */\nshaka.ads.Utils.AD_CLOSED = 'ad-closed';\n\n\n/**\n * The event name for when the ad data becomes available.\n *\n * @const {string}\n * @export\n */\nshaka.ads.Utils.AD_LOADED = 'ad-loaded';\n\n\n/**\n * The event name for when all the ads were completed.\n *\n * @const {string}\n * @export\n */\nshaka.ads.Utils.ALL_ADS_COMPLETED = 'all-ads-completed';\n\n\n/**\n * The event name for when the ad changes from or to linear.\n *\n * @const {string}\n * @export\n */\nshaka.ads.Utils.AD_LINEAR_CHANGED = 'ad-linear-changed';\n\n\n/**\n * The event name for when the ad's metadata becomes available.\n *\n * @const {string}\n * @export\n */\nshaka.ads.Utils.AD_METADATA = 'ad-metadata';\n\n\n/**\n * The event name for when the ad display encountered a recoverable\n * error.\n *\n * @const {string}\n * @export\n */\nshaka.ads.Utils.AD_RECOVERABLE_ERROR = 'ad-recoverable-error';\n\n/**\n * The event name for when the ad manager dispatch errors.\n *\n * @const {string}\n * @export\n */\nshaka.ads.Utils.AD_ERROR = 'ad-error';\n\n/**\n * The event name for when the client side SDK signalled its readiness\n * to play a VPAID ad or an ad rule.\n *\n * @const {string}\n * @export\n */\nshaka.ads.Utils.AD_BREAK_READY = 'ad-break-ready';\n\n\n/**\n * The event name for when the interaction callback for the ad was\n * triggered.\n *\n * @const {string}\n * @export\n */\nshaka.ads.Utils.AD_INTERACTION = 'ad-interaction';\n\n\n/**\n * The name of the event for when an ad requires the main content to be paused.\n * Fired when the platform does not support multiple media elements.\n *\n * @const {string}\n * @export\n */\nshaka.ads.Utils.AD_CONTENT_PAUSE_REQUESTED = 'ad-content-pause-requested';\n\n\n/**\n * The name of the event for when an ad requires the main content to be resumed.\n * Fired when the platform does not support multiple media elements.\n *\n * @const {string}\n * @export\n */\nshaka.ads.Utils.AD_CONTENT_RESUME_REQUESTED = 'ad-content-resume-requested';\n\n\n/**\n * The name of the event for when an ad requires the video of the main content\n * to be attached.\n *\n * @const {string}\n * @export\n */\nshaka.ads.Utils.AD_CONTENT_ATTACH_REQUESTED = 'ad-content-attach-requested';\n\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\ngoog.provide('shaka.ads.ClientSideAdManager');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.Player');\ngoog.require('shaka.ads.ClientSideAd');\ngoog.require('shaka.ads.Utils');\ngoog.require('shaka.log');\ngoog.require('shaka.util.Dom');\ngoog.require('shaka.util.EventManager');\ngoog.require('shaka.util.FakeEvent');\ngoog.require('shaka.util.IReleasable');\n\n/**\n * A class responsible for client-side ad interactions.\n * @implements {shaka.util.IReleasable}\n */\nshaka.ads.ClientSideAdManager = class {\n /**\n * @param {HTMLElement} adContainer\n * @param {HTMLMediaElement} video\n * @param {string} locale\n * @param {?google.ima.AdsRenderingSettings} adsRenderingSettings\n * @param {function(!shaka.util.FakeEvent)} onEvent\n */\n constructor(adContainer, video, locale, adsRenderingSettings, onEvent) {\n /** @private {HTMLElement} */\n this.adContainer_ = adContainer;\n\n /** @private {HTMLMediaElement} */\n this.video_ = video;\n\n /** @private {boolean} */\n this.videoPlayed_ = false;\n\n /** @private {?shaka.extern.AdsConfiguration} */\n this.config_ = null;\n\n /** @private {ResizeObserver} */\n this.resizeObserver_ = null;\n\n /** @private {number} */\n this.requestAdsStartTime_ = NaN;\n\n /** @private {function(!shaka.util.FakeEvent)} */\n this.onEvent_ = onEvent;\n\n /** @private {shaka.ads.ClientSideAd} */\n this.ad_ = null;\n\n /** @private {shaka.util.EventManager} */\n this.eventManager_ = new shaka.util.EventManager();\n\n google.ima.settings.setLocale(locale);\n\n google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true);\n\n /** @private {!google.ima.AdDisplayContainer} */\n this.adDisplayContainer_ = new google.ima.AdDisplayContainer(\n this.adContainer_,\n this.video_);\n\n // TODO: IMA: Must be done as the result of a user action on mobile\n this.adDisplayContainer_.initialize();\n\n // IMA: This instance should be re-used for the entire lifecycle of\n // the page.\n this.adsLoader_ = new google.ima.AdsLoader(this.adDisplayContainer_);\n\n this.adsLoader_.getSettings().setPlayerType('shaka-player');\n this.adsLoader_.getSettings().setPlayerVersion(shaka.Player.version);\n\n /** @private {google.ima.AdsManager} */\n this.imaAdsManager_ = null;\n\n /** @private {!google.ima.AdsRenderingSettings} */\n this.adsRenderingSettings_ =\n adsRenderingSettings || new google.ima.AdsRenderingSettings();\n\n this.eventManager_.listen(this.adsLoader_,\n google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, (e) => {\n this.onAdsManagerLoaded_(\n /** @type {!google.ima.AdsManagerLoadedEvent} */ (e));\n });\n\n this.eventManager_.listen(this.adsLoader_,\n google.ima.AdErrorEvent.Type.AD_ERROR, (e) => {\n this.onAdError_( /** @type {!google.ima.AdErrorEvent} */ (e));\n });\n\n // Notify the SDK when the video has ended, so it can play post-roll ads.\n this.eventManager_.listen(this.video_, 'ended', () => {\n this.adsLoader_.contentComplete();\n });\n\n this.eventManager_.listenOnce(this.video_, 'play', () => {\n this.videoPlayed_ = true;\n });\n }\n\n /**\n * Called by the AdManager to provide an updated configuration any time it\n * changes.\n *\n * @param {shaka.extern.AdsConfiguration} config\n */\n configure(config) {\n this.config_ = config;\n }\n\n /**\n * @param {!google.ima.AdsRequest} imaRequest\n */\n requestAds(imaRequest) {\n goog.asserts.assert(\n imaRequest.adTagUrl || imaRequest.adsResponse,\n 'The ad tag needs to be set up before requesting ads, ' +\n 'or adsResponse must be filled.');\n // Destroy the current AdsManager, in case the tag you requested previously\n // contains post-rolls (don't play those now).\n if (this.imaAdsManager_) {\n this.imaAdsManager_.destroy();\n }\n // Your AdsLoader will be set up on page-load. You should re-use the same\n // AdsLoader for every request.\n if (this.adsLoader_) {\n // Reset the IMA SDK.\n this.adsLoader_.contentComplete();\n }\n this.requestAdsStartTime_ = Date.now() / 1000;\n this.adsLoader_.requestAds(imaRequest);\n }\n\n /**\n * @param {!google.ima.AdsRenderingSettings} adsRenderingSettings\n */\n updateAdsRenderingSettings(adsRenderingSettings) {\n this.adsRenderingSettings_ = adsRenderingSettings;\n if (this.imaAdsManager_) {\n this.imaAdsManager_.updateAdsRenderingSettings(\n this.adsRenderingSettings_);\n }\n }\n\n /**\n * Stop all currently playing ads.\n */\n stop() {\n // this.imaAdsManager_ might not be set yet... if, for example, an ad\n // blocker prevented the ads from ever loading.\n if (this.imaAdsManager_) {\n this.imaAdsManager_.stop();\n }\n if (this.adContainer_) {\n shaka.util.Dom.removeAllChildren(this.adContainer_);\n }\n }\n\n /** @override */\n release() {\n this.stop();\n if (this.resizeObserver_) {\n this.resizeObserver_.disconnect();\n }\n if (this.eventManager_) {\n this.eventManager_.release();\n }\n if (this.imaAdsManager_) {\n this.imaAdsManager_.destroy();\n }\n this.adsLoader_.destroy();\n this.adDisplayContainer_.destroy();\n }\n\n /**\n * @param {!google.ima.AdErrorEvent} e\n * @private\n */\n onAdError_(e) {\n shaka.log.warning(\n 'There was an ad error from the IMA SDK: ' + e.getError());\n shaka.log.warning('Resuming playback.');\n\n const data = (new Map()).set('originalEvent', e);\n this.onEvent_(new shaka.util.FakeEvent(shaka.ads.Utils.AD_ERROR, data));\n\n this.onAdComplete_(/* adEvent= */ null);\n // Remove ad breaks from the timeline\n this.onEvent_(\n new shaka.util.FakeEvent(shaka.ads.Utils.CUEPOINTS_CHANGED,\n (new Map()).set('cuepoints', [])));\n }\n\n\n /**\n * @param {!google.ima.AdsManagerLoadedEvent} e\n * @private\n */\n onAdsManagerLoaded_(e) {\n goog.asserts.assert(this.video_ != null, 'Video should not be null!');\n\n const now = Date.now() / 1000;\n const loadTime = now - this.requestAdsStartTime_;\n this.onEvent_(new shaka.util.FakeEvent(shaka.ads.Utils.ADS_LOADED,\n (new Map()).set('loadTime', loadTime)));\n\n if (!this.config_.customPlayheadTracker) {\n this.imaAdsManager_ = e.getAdsManager(this.video_,\n this.adsRenderingSettings_);\n } else {\n const videoPlayHead = {\n currentTime: this.video_.currentTime,\n };\n\n this.imaAdsManager_ = e.getAdsManager(videoPlayHead,\n this.adsRenderingSettings_);\n\n if (this.video_.muted) {\n this.imaAdsManager_.setVolume(0);\n } else {\n this.imaAdsManager_.setVolume(this.video_.volume);\n }\n\n this.eventManager_.listen(this.video_, 'timeupdate', () => {\n if (!this.video_.duration) {\n return;\n }\n videoPlayHead.currentTime = this.video_.currentTime;\n });\n this.eventManager_.listen(this.video_, 'volumechange', () => {\n if (!this.ad_) {\n return;\n }\n this.ad_.setVolume(this.video_.volume);\n if (this.video_.muted) {\n this.ad_.setMuted(true);\n }\n });\n }\n\n this.onEvent_(new shaka.util.FakeEvent(\n shaka.ads.Utils.IMA_AD_MANAGER_LOADED,\n (new Map()).set('imaAdManager', this.imaAdsManager_)));\n\n const cuePointStarts = this.imaAdsManager_.getCuePoints();\n if (cuePointStarts.length) {\n /** @type {!Array<!shaka.extern.AdCuePoint>} */\n const cuePoints = [];\n for (const start of cuePointStarts) {\n /** @type {shaka.extern.AdCuePoint} */\n const shakaCuePoint = {\n start: start,\n end: null,\n };\n cuePoints.push(shakaCuePoint);\n }\n\n this.onEvent_(new shaka.util.FakeEvent(\n shaka.ads.Utils.CUEPOINTS_CHANGED,\n (new Map()).set('cuepoints', cuePoints)));\n }\n\n this.addImaEventListeners_();\n\n try {\n const viewMode = this.isFullScreenEnabled_() ?\n google.ima.ViewMode.FULLSCREEN : google.ima.ViewMode.NORMAL;\n\n this.imaAdsManager_.init(this.video_.offsetWidth,\n this.video_.offsetHeight, viewMode);\n\n // Wait on the 'loadeddata' event rather than the 'loadedmetadata' event\n // because 'loadedmetadata' is sometimes called before the video resizes\n // on some platforms (e.g. Safari).\n this.eventManager_.listen(this.video_, 'loadeddata', () => {\n const viewMode = this.isFullScreenEnabled_() ?\n google.ima.ViewMode.FULLSCREEN : google.ima.ViewMode.NORMAL;\n this.imaAdsManager_.resize(this.video_.offsetWidth,\n this.video_.offsetHeight, viewMode);\n });\n\n if ('ResizeObserver' in window) {\n this.resizeObserver_ = new ResizeObserver(() => {\n const viewMode = this.isFullScreenEnabled_() ?\n google.ima.ViewMode.FULLSCREEN : google.ima.ViewMode.NORMAL;\n this.imaAdsManager_.resize(this.video_.offsetWidth,\n this.video_.offsetHeight, viewMode);\n });\n this.resizeObserver_.observe(this.video_);\n } else {\n this.eventManager_.listen(document, 'fullscreenchange', () => {\n const viewMode = this.isFullScreenEnabled_() ?\n google.ima.ViewMode.FULLSCREEN : google.ima.ViewMode.NORMAL;\n this.imaAdsManager_.resize(this.video_.offsetWidth,\n this.video_.offsetHeight, viewMode);\n });\n }\n\n // Single video and overlay ads will start at this time\n // TODO (ismena): Need a better understanding of what this does.\n // The docs say it's called to 'start playing the ads,' but I haven't\n // seen the ads actually play until requestAds() is called.\n // Note: We listen for a play event to avoid autoplay issues that might\n // crash IMA.\n if (this.videoPlayed_ || this.config_.skipPlayDetection) {\n this.imaAdsManager_.start();\n } else {\n this.eventManager_.listenOnce(this.video_, 'play', () => {\n this.videoPlayed_ = true;\n this.imaAdsManager_.start();\n });\n }\n } catch (adError) {\n // If there was a problem with the VAST response,\n // we we won't be getting an ad. Hide ad UI if we showed it already\n // and get back to the presentation.\n this.onAdComplete_(/* adEvent= */ null);\n }\n }\n\n\n /**\n * @return {boolean}\n * @private\n */\n isFullScreenEnabled_() {\n if (document.fullscreenEnabled) {\n return !!document.fullscreenElement;\n } else {\n const video = /** @type {HTMLVideoElement} */(this.video_);\n if (video.webkitSupportsFullscreen) {\n return video.webkitDisplayingFullscreen;\n }\n }\n return false;\n }\n\n\n /**\n * @private\n */\n addImaEventListeners_() {\n /**\n * @param {!Event} e\n * @param {string} type\n */\n const convertEventAndSend = (e, type) => {\n const data = (new Map()).set('originalEvent', e);\n this.onEvent_(new shaka.util.FakeEvent(type, data));\n };\n\n this.eventManager_.listen(this.imaAdsManager_,\n google.ima.AdErrorEvent.Type.AD_ERROR, (error) => {\n this.onAdError_(/** @type {!google.ima.AdErrorEvent} */ (error));\n });\n\n this.eventManager_.listen(this.imaAdsManager_,\n google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, (e) => {\n this.onAdStart_(/** @type {!google.ima.AdEvent} */ (e));\n });\n\n this.eventManager_.listen(this.imaAdsManager_,\n google.ima.AdEvent.Type.STARTED, (e) => {\n this.onAdStart_(/** @type {!google.ima.AdEvent} */ (e));\n });\n\n this.eventManager_.listen(this.imaAdsManager_,\n google.ima.AdEvent.Type.FIRST_QUARTILE, (e) => {\n convertEventAndSend(e, shaka.ads.Utils.AD_FIRST_QUARTILE);\n });\n\n this.eventManager_.listen(this.imaAdsManager_,\n google.ima.AdEvent.Type.MIDPOINT, (e) => {\n convertEventAndSend(e, shaka.ads.Utils.AD_MIDPOINT);\n });\n\n this.eventManager_.listen(this.imaAdsManager_,\n google.ima.AdEvent.Type.THIRD_QUARTILE, (e) => {\n convertEventAndSend(e, shaka.ads.Utils.AD_THIRD_QUARTILE);\n });\n\n this.eventManager_.listen(this.imaAdsManager_,\n google.ima.AdEvent.Type.COMPLETE, (e) => {\n convertEventAndSend(e, shaka.ads.Utils.AD_COMPLETE);\n });\n\n this.eventManager_.listen(this.imaAdsManager_,\n google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, (e) => {\n this.onAdComplete_(/** @type {!google.ima.AdEvent} */ (e));\n });\n\n this.eventManager_.listen(this.imaAdsManager_,\n google.ima.AdEvent.Type.ALL_ADS_COMPLETED, (e) => {\n this.onAdComplete_(/** @type {!google.ima.AdEvent} */ (e));\n });\n\n this.eventManager_.listen(this.imaAdsManager_,\n google.ima.AdEvent.Type.SKIPPED, (e) => {\n convertEventAndSend(e, shaka.ads.Utils.AD_SKIPPED);\n });\n\n this.eventManager_.listen(this.imaAdsManager_,\n google.ima.AdEvent.Type.VOLUME_CHANGED, (e) => {\n convertEventAndSend(e, shaka.ads.Utils.AD_VOLUME_CHANGED);\n });\n\n this.eventManager_.listen(this.imaAdsManager_,\n google.ima.AdEvent.Type.VOLUME_MUTED, (e) => {\n convertEventAndSend(e, shaka.ads.Utils.AD_MUTED);\n });\n\n this.eventManager_.listen(this.imaAdsManager_,\n google.ima.AdEvent.Type.PAUSED, (e) => {\n if (this.ad_) {\n this.ad_.setPaused(true);\n convertEventAndSend(e, shaka.ads.Utils.AD_PAUSED);\n }\n });\n\n this.eventManager_.listen(this.imaAdsManager_,\n google.ima.AdEvent.Type.RESUMED, (e) => {\n if (this.ad_) {\n this.ad_.setPaused(false);\n convertEventAndSend(e, shaka.ads.Utils.AD_RESUMED);\n }\n });\n\n this.eventManager_.listen(this.imaAdsManager_,\n google.ima.AdEvent.Type.SKIPPABLE_STATE_CHANGED, (e) => {\n if (this.ad_) {\n convertEventAndSend(e, shaka.ads.Utils.AD_SKIP_STATE_CHANGED);\n }\n });\n\n this.eventManager_.listen(this.imaAdsManager_,\n google.ima.AdEvent.Type.CLICK, (e) => {\n convertEventAndSend(e, shaka.ads.Utils.AD_CLICKED);\n });\n\n this.eventManager_.listen(this.imaAdsManager_,\n google.ima.AdEvent.Type.AD_PROGRESS, (e) => {\n convertEventAndSend(e, shaka.ads.Utils.AD_PROGRESS);\n });\n\n this.eventManager_.listen(this.imaAdsManager_,\n google.ima.AdEvent.Type.AD_BUFFERING, (e) => {\n convertEventAndSend(e, shaka.ads.Utils.AD_BUFFERING);\n });\n\n this.eventManager_.listen(this.imaAdsManager_,\n google.ima.AdEvent.Type.IMPRESSION, (e) => {\n convertEventAndSend(e, shaka.ads.Utils.AD_IMPRESSION);\n });\n\n this.eventManager_.listen(this.imaAdsManager_,\n google.ima.AdEvent.Type.DURATION_CHANGE, (e) => {\n convertEventAndSend(e, shaka.ads.Utils.AD_DURATION_CHANGED);\n });\n\n this.eventManager_.listen(this.imaAdsManager_,\n google.ima.AdEvent.Type.USER_CLOSE, (e) => {\n convertEventAndSend(e, shaka.ads.Utils.AD_CLOSED);\n });\n\n this.eventManager_.listen(this.imaAdsManager_,\n google.ima.AdEvent.Type.LOADED, (e) => {\n convertEventAndSend(e, shaka.ads.Utils.AD_LOADED);\n });\n\n this.eventManager_.listen(this.imaAdsManager_,\n google.ima.AdEvent.Type.ALL_ADS_COMPLETED, (e) => {\n convertEventAndSend(e, shaka.ads.Utils.ALL_ADS_COMPLETED);\n });\n\n this.eventManager_.listen(this.imaAdsManager_,\n google.ima.AdEvent.Type.LINEAR_CHANGED, (e) => {\n convertEventAndSend(e, shaka.ads.Utils.AD_LINEAR_CHANGED);\n });\n\n this.eventManager_.listen(this.imaAdsManager_,\n google.ima.AdEvent.Type.AD_METADATA, (e) => {\n convertEventAndSend(e, shaka.ads.Utils.AD_METADATA);\n });\n\n this.eventManager_.listen(this.imaAdsManager_,\n google.ima.AdEvent.Type.LOG, (e) => {\n convertEventAndSend(e, shaka.ads.Utils.AD_RECOVERABLE_ERROR);\n });\n\n this.eventManager_.listen(this.imaAdsManager_,\n google.ima.AdEvent.Type.AD_BREAK_READY, (e) => {\n convertEventAndSend(e, shaka.ads.Utils.AD_BREAK_READY);\n });\n\n this.eventManager_.listen(this.imaAdsManager_,\n google.ima.AdEvent.Type.INTERACTION, (e) => {\n convertEventAndSend(e, shaka.ads.Utils.AD_INTERACTION);\n });\n }\n\n /**\n * @param {!google.ima.AdEvent} e\n * @private\n */\n onAdStart_(e) {\n goog.asserts.assert(this.imaAdsManager_,\n 'Should have an ads manager at this point!');\n\n const imaAd = e.getAd();\n if (!imaAd) {\n // Sometimes the IMA SDK will fire a CONTENT_PAUSE_REQUESTED or STARTED\n // event with no associated ad object.\n // We can't really play an ad in that situation, so just ignore the event.\n shaka.log.alwaysWarn(\n 'The IMA SDK fired a ' + e.type + ' event with no associated ad. ' +\n 'Unable to play ad!');\n return;\n }\n\n this.ad_ = new shaka.ads.ClientSideAd(imaAd,\n this.imaAdsManager_, this.video_);\n if (e.type == google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED &&\n !this.config_.supportsMultipleMediaElements ) {\n this.onEvent_(new shaka.util.FakeEvent(\n shaka.ads.Utils.AD_CONTENT_PAUSE_REQUESTED));\n }\n const data = new Map()\n .set('ad', this.ad_)\n .set('sdkAdObject', imaAd)\n .set('originalEvent', e);\n this.onEvent_(new shaka.util.FakeEvent(\n shaka.ads.Utils.AD_STARTED, data));\n if (this.ad_.isLinear()) {\n this.adContainer_.setAttribute('ad-active', 'true');\n if (!this.config_.customPlayheadTracker) {\n this.video_.pause();\n }\n if (this.video_.muted) {\n this.ad_.setInitialMuted(this.video_.volume);\n } else {\n this.ad_.setVolume(this.video_.volume);\n }\n }\n }\n\n /**\n * @param {?google.ima.AdEvent} e\n * @private\n */\n onAdComplete_(e) {\n if (e && e.type == google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED &&\n !this.config_.supportsMultipleMediaElements) {\n this.onEvent_(new shaka.util.FakeEvent(\n shaka.ads.Utils.AD_CONTENT_RESUME_REQUESTED));\n }\n this.onEvent_(new shaka.util.FakeEvent(shaka.ads.Utils.AD_STOPPED,\n (new Map()).set('originalEvent', e)));\n if (this.ad_ && this.ad_.isLinear()) {\n this.adContainer_.removeAttribute('ad-active');\n if (!this.config_.customPlayheadTracker && !this.video_.ended) {\n this.video_.play();\n }\n }\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\ngoog.provide('shaka.ads.InterstitialAd');\n\n/**\n * @implements {shaka.extern.IAd}\n * @export\n */\nshaka.ads.InterstitialAd = class {\n /**\n * @param {HTMLMediaElement} video\n * @param {shaka.extern.AdInterstitial} interstitial\n * @param {function()} onSkip\n * @param {number} sequenceLength\n * @param {number} adPosition\n * @param {boolean} isUsingAnotherMediaElement\n */\n constructor(video, interstitial, onSkip, sequenceLength, adPosition,\n isUsingAnotherMediaElement) {\n /** @private {HTMLMediaElement} */\n this.video_ = video;\n\n /** @private {shaka.extern.AdInterstitial} */\n this.interstitial_ = interstitial;\n\n /** @private {boolean} */\n this.isSkippable_ = interstitial.isSkippable;\n\n /** @private {?number} */\n this.skipOffset_ = interstitial.isSkippable ?\n interstitial.skipOffset || 0 : interstitial.skipOffset;\n\n /** @private {?number} */\n this.skipFor_ = interstitial.skipFor;\n\n /** @private {function()} */\n this.onSkip_ = onSkip;\n\n /** @private {number} */\n this.sequenceLength_ = sequenceLength;\n\n /** @private {number} */\n this.adPosition_ = adPosition;\n\n /** @private {boolean} */\n this.isUsingAnotherMediaElement_ = isUsingAnotherMediaElement;\n\n /** @private {?shaka.extern.AdPositionInfo} */\n this.overlay_ = interstitial.overlay;\n }\n\n /**\n * @override\n * @export\n */\n needsSkipUI() {\n return true;\n }\n\n /**\n * @override\n * @export\n */\n isClientRendering() {\n return true;\n }\n\n /**\n * @override\n * @export\n */\n hasCustomClick() {\n return false;\n }\n\n /**\n * @override\n * @export\n */\n isUsingAnotherMediaElement() {\n return this.isUsingAnotherMediaElement_;\n }\n\n /**\n * @override\n * @export\n */\n getDuration() {\n const duration = this.video_.duration;\n if (isNaN(duration)) {\n return -1;\n }\n return duration;\n }\n\n /**\n * @override\n * @export\n */\n getMinSuggestedDuration() {\n return this.getDuration();\n }\n\n /**\n * @override\n * @export\n */\n getRemainingTime() {\n const duration = this.video_.duration;\n if (isNaN(duration)) {\n return -1;\n }\n return duration - this.video_.currentTime;\n }\n\n /**\n * @override\n * @export\n */\n isPaused() {\n return this.video_.paused;\n }\n\n /**\n * @override\n * @export\n */\n isSkippable() {\n if (this.isSkippable_ && this.skipFor_ != null) {\n const position = this.getDuration() - this.getRemainingTime();\n const maxTime = this.skipOffset_ + this.skipFor_;\n return position < maxTime;\n }\n return this.isSkippable_;\n }\n\n /**\n * @override\n * @export\n */\n getTimeUntilSkippable() {\n if (this.isSkippable()) {\n const canSkipIn =\n this.getRemainingTime() + this.skipOffset_ - this.getDuration();\n return Math.max(canSkipIn, 0);\n }\n return Math.max(this.getRemainingTime(), 0);\n }\n\n /**\n * @override\n * @export\n */\n canSkipNow() {\n return this.isSkippable_ && this.getTimeUntilSkippable() == 0;\n }\n\n /**\n * @override\n * @export\n */\n skip() {\n if (this.canSkipNow()) {\n this.onSkip_();\n }\n }\n\n /**\n * @override\n * @export\n */\n pause() {\n return this.video_.pause();\n }\n\n /**\n * @override\n * @export\n */\n play() {\n return this.video_.play();\n }\n\n\n /**\n * @override\n * @export\n */\n getVolume() {\n return this.video_.volume;\n }\n\n /**\n * @override\n * @export\n */\n setVolume(volume) {\n this.video_.volume = volume;\n }\n\n /**\n * @override\n * @export\n */\n isMuted() {\n return this.video_.muted;\n }\n\n /**\n * @override\n * @export\n */\n isLinear() {\n return this.overlay_ == null;\n }\n\n /**\n * @override\n * @export\n */\n resize(width, height) {\n // Nothing\n }\n\n /**\n * @override\n * @export\n */\n setMuted(muted) {\n this.video_.muted = muted;\n }\n\n\n /**\n * @override\n * @export\n */\n getSequenceLength() {\n return this.sequenceLength_;\n }\n\n /**\n * @override\n * @export\n */\n getPositionInSequence() {\n return this.adPosition_;\n }\n\n /**\n * @override\n * @export\n */\n getTitle() {\n return '';\n }\n\n /**\n * @override\n * @export\n */\n getDescription() {\n return '';\n }\n\n /**\n * @override\n * @export\n */\n getVastMediaBitrate() {\n return 0;\n }\n\n /**\n * @override\n * @export\n */\n getVastMediaHeight() {\n return 0;\n }\n\n /**\n * @override\n * @export\n */\n getVastMediaWidth() {\n return 0;\n }\n\n /**\n * @override\n * @export\n */\n getAdId() {\n return this.interstitial_.id || '';\n }\n\n /**\n * @override\n * @export\n */\n getCreativeAdId() {\n return '';\n }\n\n /**\n * @override\n * @export\n */\n getAdvertiserName() {\n return '';\n }\n\n /**\n * @override\n * @export\n */\n getMediaUrl() {\n return this.interstitial_.uri;\n }\n\n /**\n * @override\n * @export\n */\n getTimeOffset() {\n return 0;\n }\n\n /**\n * @override\n * @export\n */\n getPodIndex() {\n return 0;\n }\n\n /**\n * @override\n * @export\n */\n release() {\n this.video_ = null;\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\ngoog.provide('shaka.ads.InterstitialStaticAd');\n\n/**\n * @implements {shaka.extern.IAd}\n * @export\n */\nshaka.ads.InterstitialStaticAd = class {\n /**\n * @param {shaka.extern.AdInterstitial} interstitial\n * @param {number} sequenceLength\n * @param {number} adPosition\n */\n constructor(interstitial, sequenceLength, adPosition) {\n /** @private {shaka.extern.AdInterstitial} */\n this.interstitial_ = interstitial;\n\n /** @private {number} */\n this.sequenceLength_ = sequenceLength;\n\n /** @private {number} */\n this.adPosition_ = adPosition;\n\n /** @private {boolean} */\n this.isLinear_ = interstitial.overlay == null;\n }\n\n /**\n * @override\n * @export\n */\n needsSkipUI() {\n return true;\n }\n\n /**\n * @override\n * @export\n */\n isClientRendering() {\n return true;\n }\n\n /**\n * @override\n * @export\n */\n hasCustomClick() {\n return false;\n }\n\n /**\n * @override\n * @export\n */\n isUsingAnotherMediaElement() {\n return false;\n }\n\n /**\n * @override\n * @export\n */\n getDuration() {\n return -1;\n }\n\n /**\n * @override\n * @export\n */\n getMinSuggestedDuration() {\n return this.getDuration();\n }\n\n /**\n * @override\n * @export\n */\n getRemainingTime() {\n return -1;\n }\n\n /**\n * @override\n * @export\n */\n isPaused() {\n return false;\n }\n\n /**\n * @override\n * @export\n */\n isSkippable() {\n return false;\n }\n\n /**\n * @override\n * @export\n */\n getTimeUntilSkippable() {\n return 0;\n }\n\n /**\n * @override\n * @export\n */\n canSkipNow() {\n return false;\n }\n\n /**\n * @override\n * @export\n */\n skip() {\n // Nothing\n }\n\n /**\n * @override\n * @export\n */\n pause() {\n // Nothing\n }\n\n /**\n * @override\n * @export\n */\n play() {\n // Nothing\n }\n\n\n /**\n * @override\n * @export\n */\n getVolume() {\n return 1;\n }\n\n /**\n * @override\n * @export\n */\n setVolume(volume) {\n // Nothing\n }\n\n /**\n * @override\n * @export\n */\n isMuted() {\n return false;\n }\n\n /**\n * @override\n * @export\n */\n isLinear() {\n return this.isLinear_;\n }\n\n /**\n * @override\n * @export\n */\n resize(width, height) {\n // Nothing\n }\n\n /**\n * @override\n * @export\n */\n setMuted(muted) {\n // Nothing\n }\n\n\n /**\n * @override\n * @export\n */\n getSequenceLength() {\n return this.sequenceLength_;\n }\n\n /**\n * @override\n * @export\n */\n getPositionInSequence() {\n return this.adPosition_;\n }\n\n /**\n * @override\n * @export\n */\n getTitle() {\n return '';\n }\n\n /**\n * @override\n * @export\n */\n getDescription() {\n return '';\n }\n\n /**\n * @override\n * @export\n */\n getVastMediaBitrate() {\n return 0;\n }\n\n /**\n * @override\n * @export\n */\n getVastMediaHeight() {\n return 0;\n }\n\n /**\n * @override\n * @export\n */\n getVastMediaWidth() {\n return 0;\n }\n\n /**\n * @override\n * @export\n */\n getAdId() {\n return this.interstitial_.id || '';\n }\n\n /**\n * @override\n * @export\n */\n getCreativeAdId() {\n return '';\n }\n\n /**\n * @override\n * @export\n */\n getAdvertiserName() {\n return '';\n }\n\n /**\n * @override\n * @export\n */\n getMediaUrl() {\n return this.interstitial_.uri;\n }\n\n /**\n * @override\n * @export\n */\n getTimeOffset() {\n return 0;\n }\n\n /**\n * @override\n * @export\n */\n getPodIndex() {\n return 0;\n }\n\n /**\n * @override\n * @export\n */\n release() {\n // Nothing\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\ngoog.provide('shaka.ads.InterstitialAdManager');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.Player');\ngoog.require('shaka.ads.InterstitialAd');\ngoog.require('shaka.ads.InterstitialStaticAd');\ngoog.require('shaka.ads.Utils');\ngoog.require('shaka.log');\ngoog.require('shaka.media.PreloadManager');\ngoog.require('shaka.net.NetworkingEngine');\ngoog.require('shaka.net.NetworkingUtils');\ngoog.require('shaka.util.Dom');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.EventManager');\ngoog.require('shaka.util.FakeEvent');\ngoog.require('shaka.util.IReleasable');\ngoog.require('shaka.util.Platform');\ngoog.require('shaka.util.PublicPromise');\ngoog.require('shaka.util.StringUtils');\ngoog.require('shaka.util.Timer');\ngoog.require('shaka.util.TXml');\n\n\n/**\n * A class responsible for Interstitial ad interactions.\n *\n * @implements {shaka.util.IReleasable}\n */\nshaka.ads.InterstitialAdManager = class {\n /**\n * @param {HTMLElement} adContainer\n * @param {shaka.Player} basePlayer\n * @param {HTMLMediaElement} baseVideo\n * @param {function(!shaka.util.FakeEvent)} onEvent\n */\n constructor(adContainer, basePlayer, baseVideo, onEvent) {\n /** @private {?shaka.extern.AdsConfiguration} */\n this.config_ = null;\n\n /** @private {HTMLElement} */\n this.adContainer_ = adContainer;\n\n /** @private {shaka.Player} */\n this.basePlayer_ = basePlayer;\n\n /** @private {HTMLMediaElement} */\n this.baseVideo_ = baseVideo;\n\n /** @private {?HTMLMediaElement} */\n this.adVideo_ = null;\n\n /** @private {boolean} */\n this.usingBaseVideo_ = true;\n\n /** @private {HTMLMediaElement} */\n this.video_ = this.baseVideo_;\n\n /** @private {function(!shaka.util.FakeEvent)} */\n this.onEvent_ = onEvent;\n\n /** @private {!Set<string>} */\n this.interstitialIds_ = new Set();\n\n /** @private {!Set<shaka.extern.AdInterstitial>} */\n this.interstitials_ = new Set();\n\n /**\n * @private {!Map<shaka.extern.AdInterstitial,\n * Promise<?shaka.media.PreloadManager>>}\n */\n this.preloadManagerInterstitials_ = new Map();\n\n /**\n * @private {!Map<shaka.extern.AdInterstitial, !Array<!HTMLLinkElement>>}\n */\n this.preloadOnDomElements_ = new Map();\n\n /** @private {shaka.Player} */\n this.player_ = new shaka.Player();\n\n this.updatePlayerConfig_();\n\n /** @private {shaka.util.EventManager} */\n this.eventManager_ = new shaka.util.EventManager();\n\n /** @private {shaka.util.EventManager} */\n this.adEventManager_ = new shaka.util.EventManager();\n\n /** @private {boolean} */\n this.playingAd_ = false;\n\n /** @private {?number} */\n this.lastTime_ = null;\n\n /** @private {?shaka.extern.AdInterstitial} */\n this.lastPlayedAd_ = null;\n\n /** @private {?shaka.util.Timer} */\n this.playoutLimitTimer_ = null;\n\n /** @private {?function()} */\n this.lastOnSkip_ = null;\n\n /** @private {boolean} */\n this.usingListeners_ = false;\n\n /** @private {number} */\n this.videoCallbackId_ = -1;\n\n // Note: checkForInterstitials_ and onTimeUpdate_ are defined here because\n // we use it on listener callback, and for unlisten is necessary use the\n // same callback.\n\n /** @private {function()} */\n this.checkForInterstitials_ = () => {\n if (this.playingAd_ || !this.lastTime_ ||\n this.basePlayer_.isRemotePlayback()) {\n return;\n }\n this.lastTime_ = this.baseVideo_.currentTime;\n // Remove last played add when the new time is before to the ad time.\n if (this.lastPlayedAd_ &&\n !this.lastPlayedAd_.pre && !this.lastPlayedAd_.post &&\n this.lastTime_ < this.lastPlayedAd_.startTime) {\n this.lastPlayedAd_ = null;\n }\n const currentInterstitial = this.getCurrentInterstitial_();\n if (currentInterstitial) {\n this.setupAd_(currentInterstitial, /* sequenceLength= */ 1,\n /* adPosition= */ 1, /* initialTime= */ Date.now());\n }\n };\n\n /** @private {function()} */\n this.onTimeUpdate_ = () => {\n if (this.playingAd_ || this.lastTime_ ||\n this.basePlayer_.isRemotePlayback()) {\n return;\n }\n this.lastTime_ = this.baseVideo_.currentTime;\n const currentInterstitial = this.getCurrentInterstitial_(\n /* needPreRoll= */ true);\n if (currentInterstitial) {\n this.setupAd_(currentInterstitial, /* sequenceLength= */ 1,\n /* adPosition= */ 1, /* initialTime= */ Date.now());\n }\n };\n\n /** @private {shaka.util.Timer} */\n this.timeUpdateTimer_ = new shaka.util.Timer(this.checkForInterstitials_);\n\n\n /** @private {shaka.util.Timer} */\n this.pollTimer_ = new shaka.util.Timer(async () => {\n if (this.interstitials_.size && this.lastTime_ != null) {\n const currentLoadMode = this.basePlayer_.getLoadMode();\n if (currentLoadMode == shaka.Player.LoadMode.DESTROYED ||\n currentLoadMode == shaka.Player.LoadMode.NOT_LOADED) {\n return;\n }\n let cuepointsChanged = false;\n const interstitials = Array.from(this.interstitials_);\n const seekRange = this.basePlayer_.seekRange();\n for (const interstitial of interstitials) {\n if (interstitial == this.lastPlayedAd_) {\n continue;\n }\n const comparisonTime = interstitial.endTime || interstitial.startTime;\n if ((seekRange.start - comparisonTime) >= 1) {\n if (this.preloadManagerInterstitials_.has(interstitial)) {\n const preloadManager =\n // eslint-disable-next-line no-await-in-loop\n await this.preloadManagerInterstitials_.get(interstitial);\n if (preloadManager) {\n preloadManager.destroy();\n }\n this.preloadManagerInterstitials_.delete(interstitial);\n }\n this.removePreloadOnDomElements_(interstitial);\n const interstitialId = JSON.stringify(interstitial);\n if (this.interstitialIds_.has(interstitialId)) {\n this.interstitialIds_.delete(interstitialId);\n }\n this.interstitials_.delete(interstitial);\n this.removeEventListeners_();\n if (!interstitial.overlay) {\n cuepointsChanged = true;\n }\n } else {\n const difference = interstitial.startTime - this.lastTime_;\n if (difference > 0 && difference <= 10) {\n if (!this.preloadManagerInterstitials_.has(interstitial) &&\n this.isPreloadAllowed_(interstitial)) {\n this.preloadManagerInterstitials_.set(\n interstitial, this.player_.preload(\n interstitial.uri,\n /* startTime= */ null,\n interstitial.mimeType || undefined));\n }\n this.checkPreloadOnDomElements_(interstitial);\n }\n }\n }\n if (cuepointsChanged) {\n this.cuepointsChanged_();\n }\n }\n });\n }\n\n /**\n * Called by the AdManager to provide an updated configuration any time it\n * changes.\n *\n * @param {shaka.extern.AdsConfiguration} config\n */\n configure(config) {\n this.config_ = config;\n this.determineIfUsingBaseVideo_();\n }\n\n /**\n * @private\n */\n addEventListeners_() {\n if (this.usingListeners_ || !this.interstitials_.size) {\n return;\n }\n this.eventManager_.listen(\n this.baseVideo_, 'playing', this.onTimeUpdate_);\n this.eventManager_.listen(\n this.baseVideo_, 'timeupdate', this.onTimeUpdate_);\n this.eventManager_.listen(\n this.baseVideo_, 'ended', this.checkForInterstitials_);\n if ('requestVideoFrameCallback' in this.baseVideo_ &&\n !shaka.util.Platform.isSmartTV()) {\n const baseVideo = /** @type {!HTMLVideoElement} */ (this.baseVideo_);\n const videoFrameCallback = (now, metadata) => {\n if (this.videoCallbackId_ == -1) {\n return;\n }\n this.checkForInterstitials_();\n // It is necessary to check this again because this callback can be\n // executed in another thread by the browser and we have to be sure\n // again here that we have not cancelled it in the middle of an\n // execution.\n if (this.videoCallbackId_ == -1) {\n return;\n }\n this.videoCallbackId_ =\n baseVideo.requestVideoFrameCallback(videoFrameCallback);\n };\n this.videoCallbackId_ =\n baseVideo.requestVideoFrameCallback(videoFrameCallback);\n } else {\n this.timeUpdateTimer_.tickEvery(/* seconds= */ 0.025);\n }\n\n if (this.pollTimer_) {\n this.pollTimer_.tickEvery(/* seconds= */ 1); ;\n }\n this.usingListeners_ = true;\n }\n\n /**\n * @private\n */\n removeEventListeners_() {\n if (!this.usingListeners_ || this.interstitials_.size) {\n return;\n }\n this.eventManager_.unlisten(\n this.baseVideo_, 'playing', this.onTimeUpdate_);\n this.eventManager_.unlisten(\n this.baseVideo_, 'timeupdate', this.onTimeUpdate_);\n this.eventManager_.unlisten(\n this.baseVideo_, 'ended', this.checkForInterstitials_);\n if (this.videoCallbackId_ != -1) {\n const baseVideo = /** @type {!HTMLVideoElement} */ (this.baseVideo_);\n baseVideo.cancelVideoFrameCallback(this.videoCallbackId_);\n this.videoCallbackId_ = -1;\n }\n if (this.timeUpdateTimer_) {\n this.timeUpdateTimer_.stop();\n }\n if (this.pollTimer_) {\n this.pollTimer_.stop();\n }\n this.usingListeners_ = false;\n }\n\n /**\n * @private\n */\n determineIfUsingBaseVideo_() {\n if (!this.adContainer_ || !this.config_ || this.playingAd_) {\n return;\n }\n let supportsMultipleMediaElements =\n this.config_.supportsMultipleMediaElements;\n const video = /** @type {HTMLVideoElement} */(this.baseVideo_);\n if (video.webkitSupportsFullscreen && video.webkitDisplayingFullscreen) {\n supportsMultipleMediaElements = false;\n }\n if (this.usingBaseVideo_ != supportsMultipleMediaElements) {\n return;\n }\n this.usingBaseVideo_ = !supportsMultipleMediaElements;\n if (this.usingBaseVideo_) {\n this.video_ = this.baseVideo_;\n if (this.adVideo_) {\n if (this.adVideo_.parentElement) {\n this.adContainer_.removeChild(this.adVideo_);\n }\n this.adVideo_ = null;\n }\n } else {\n if (!this.adVideo_) {\n this.adVideo_ = this.createMediaElement_();\n }\n this.video_ = this.adVideo_;\n }\n }\n\n\n /**\n * Resets the Interstitial manager and removes any continuous polling.\n */\n stop() {\n if (this.adEventManager_) {\n this.adEventManager_.removeAll();\n }\n this.interstitialIds_.clear();\n this.interstitials_.clear();\n this.player_.destroyAllPreloads();\n if (this.preloadManagerInterstitials_.size) {\n const values = Array.from(this.preloadManagerInterstitials_.values());\n for (const value of values) {\n if (value) {\n value.then((preloadManager) => {\n if (preloadManager) {\n preloadManager.destroy();\n }\n });\n }\n };\n }\n this.preloadManagerInterstitials_.clear();\n if (this.preloadOnDomElements_.size) {\n const interstitials = Array.from(this.preloadOnDomElements_.keys());\n for (const interstitial of interstitials) {\n this.removePreloadOnDomElements_(interstitial);\n }\n }\n this.preloadOnDomElements_.clear();\n this.player_.detach();\n this.playingAd_ = false;\n this.lastTime_ = null;\n this.lastPlayedAd_ = null;\n this.usingBaseVideo_ = true;\n this.video_ = this.baseVideo_;\n this.adVideo_ = null;\n this.removeBaseStyles_();\n this.removeEventListeners_();\n if (this.adContainer_) {\n shaka.util.Dom.removeAllChildren(this.adContainer_);\n }\n if (this.playoutLimitTimer_) {\n this.playoutLimitTimer_.stop();\n this.playoutLimitTimer_ = null;\n }\n }\n\n /** @override */\n release() {\n this.stop();\n if (this.eventManager_) {\n this.eventManager_.release();\n }\n if (this.adEventManager_) {\n this.adEventManager_.release();\n }\n if (this.timeUpdateTimer_) {\n this.timeUpdateTimer_.stop();\n this.timeUpdateTimer_ = null;\n }\n if (this.pollTimer_) {\n this.pollTimer_.stop();\n this.pollTimer_ = null;\n }\n this.player_.destroy();\n }\n\n /**\n * @return {shaka.Player}\n */\n getPlayer() {\n return this.player_;\n }\n\n /**\n * @param {shaka.extern.HLSInterstitial} hlsInterstitial\n */\n async addMetadata(hlsInterstitial) {\n this.updatePlayerConfig_();\n const adInterstitials = await this.getInterstitialsInfo_(hlsInterstitial);\n if (adInterstitials.length) {\n this.addInterstitials(adInterstitials);\n } else {\n shaka.log.alwaysWarn('Unsupported HLS interstitial', hlsInterstitial);\n }\n }\n\n /**\n * @param {shaka.extern.TimelineRegionInfo} region\n */\n addRegion(region) {\n const TXml = shaka.util.TXml;\n const isReplace =\n region.schemeIdUri == 'urn:mpeg:dash:event:alternativeMPD:replace:2025';\n const isInsert =\n region.schemeIdUri == 'urn:mpeg:dash:event:alternativeMPD:insert:2025';\n if (!isReplace && !isInsert) {\n shaka.log.warning('Unsupported alternative media presentation', region);\n return;\n }\n\n const startTime = region.startTime;\n let endTime = region.endTime;\n let playoutLimit = null;\n let resumeOffset = 0;\n let interstitialUri;\n for (const node of region.eventNode.children) {\n if (node.tagName == 'AlternativeMPD') {\n const uri = node.attributes['uri'];\n if (uri) {\n interstitialUri = uri;\n break;\n }\n } else if (node.tagName == 'InsertPresentation' ||\n node.tagName == 'ReplacePresentation') {\n const url = node.attributes['url'];\n if (url) {\n interstitialUri = url;\n const unscaledMaxDuration =\n TXml.parseAttr(node, 'maxDuration', TXml.parseInt);\n if (unscaledMaxDuration) {\n playoutLimit = unscaledMaxDuration / region.timescale;\n }\n const unscaledReturnOffset =\n TXml.parseAttr(node, 'returnOffset', TXml.parseInt);\n if (unscaledReturnOffset) {\n resumeOffset = unscaledReturnOffset / region.timescale;\n }\n if (isReplace && resumeOffset) {\n endTime = startTime + resumeOffset;\n }\n break;\n }\n }\n }\n if (!interstitialUri) {\n shaka.log.warning('Unsupported alternative media presentation', region);\n return;\n }\n\n /** @type {!shaka.extern.AdInterstitial} */\n const interstitial = {\n id: region.id,\n groupId: null,\n startTime,\n endTime,\n uri: interstitialUri,\n mimeType: null,\n isSkippable: false,\n skipOffset: null,\n skipFor: null,\n canJump: true,\n resumeOffset: isInsert ? resumeOffset : null,\n playoutLimit,\n once: false,\n pre: false,\n post: false,\n timelineRange: isReplace && !isInsert,\n loop: false,\n overlay: null,\n displayOnBackground: false,\n currentVideo: null,\n background: null,\n };\n this.addInterstitials([interstitial]);\n }\n\n /**\n * @param {shaka.extern.TimelineRegionInfo} region\n */\n addOverlayRegion(region) {\n const TXml = shaka.util.TXml;\n\n goog.asserts.assert(region.eventNode, 'Need a region eventNode');\n const overlayEvent = TXml.findChild(region.eventNode, 'OverlayEvent');\n const uri = overlayEvent.attributes['uri'];\n const mimeType = overlayEvent.attributes['mimeType'];\n const loop = overlayEvent.attributes['loop'] == 'true';\n const z = TXml.parseAttr(overlayEvent, 'z', TXml.parseInt);\n if (!uri || z == 0) {\n shaka.log.warning('Unsupported OverlayEvent', region);\n return;\n }\n\n /** @type {!shaka.extern.AdPositionInfo} */\n let overlay = {\n viewport: {\n x: 1920,\n y: 1080,\n },\n topLeft: {\n x: 0,\n y: 0,\n },\n size: {\n x: 1920,\n y: 1080,\n },\n };\n\n const viewport = TXml.findChild(overlayEvent, 'Viewport');\n const topLeft = TXml.findChild(overlayEvent, 'TopLeft');\n const size = TXml.findChild(overlayEvent, 'Size');\n if (viewport && topLeft && size) {\n const viewportX = TXml.parseAttr(viewport, 'x', TXml.parseInt);\n if (viewportX == null) {\n shaka.log.warning('Unsupported OverlayEvent', region);\n return;\n }\n const viewportY = TXml.parseAttr(viewport, 'y', TXml.parseInt);\n if (viewportY == null) {\n shaka.log.warning('Unsupported OverlayEvent', region);\n return;\n }\n const topLeftX = TXml.parseAttr(topLeft, 'x', TXml.parseInt);\n if (topLeftX == null) {\n shaka.log.warning('Unsupported OverlayEvent', region);\n return;\n }\n const topLeftY = TXml.parseAttr(topLeft, 'y', TXml.parseInt);\n if (topLeftY == null) {\n shaka.log.warning('Unsupported OverlayEvent', region);\n return;\n }\n const sizeX = TXml.parseAttr(size, 'x', TXml.parseInt);\n if (sizeX == null) {\n shaka.log.warning('Unsupported OverlayEvent', region);\n return;\n }\n const sizeY = TXml.parseAttr(size, 'y', TXml.parseInt);\n if (sizeY == null) {\n shaka.log.warning('Unsupported OverlayEvent', region);\n return;\n }\n overlay = {\n viewport: {\n x: viewportX,\n y: viewportY,\n },\n topLeft: {\n x: topLeftX,\n y: topLeftY,\n },\n size: {\n x: sizeX,\n y: sizeY,\n },\n };\n }\n const squeezeCurrent = TXml.findChild(overlayEvent, 'SqueezeCurrent');\n let currentVideo = null;\n if (squeezeCurrent) {\n const percentage =\n TXml.parseAttr(squeezeCurrent, 'percentage', TXml.parseFloat);\n if (percentage) {\n currentVideo = {\n viewport: {\n x: 1920,\n y: 1080,\n },\n topLeft: {\n x: 0,\n y: 0,\n },\n size: {\n x: 1920 * percentage,\n y: 1080 * percentage,\n },\n };\n }\n }\n\n /** @type {!shaka.extern.AdInterstitial} */\n const interstitial = {\n id: region.id,\n groupId: null,\n startTime: region.startTime,\n endTime: region.endTime,\n uri,\n mimeType,\n isSkippable: false,\n skipOffset: null,\n skipFor: null,\n canJump: true,\n resumeOffset: null,\n playoutLimit: null,\n once: false,\n pre: false,\n post: false,\n timelineRange: true,\n loop,\n overlay,\n displayOnBackground: z == -1,\n currentVideo,\n background: null,\n };\n this.addInterstitials([interstitial]);\n }\n\n /**\n * @param {string} url\n * @return {!Promise}\n */\n async addAdUrlInterstitial(url) {\n const NetworkingEngine = shaka.net.NetworkingEngine;\n const context = {\n type: NetworkingEngine.AdvancedRequestType.INTERSTITIAL_AD_URL,\n };\n const responseData = await this.makeAdRequest_(url, context);\n const data = shaka.util.TXml.parseXml(responseData, 'VAST,vmap:VMAP');\n if (!data) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.ADS,\n shaka.util.Error.Code.VAST_INVALID_XML);\n }\n let interstitials = [];\n if (data.tagName == 'VAST') {\n interstitials = shaka.ads.Utils.parseVastToInterstitials(\n data, this.lastTime_);\n } else if (data.tagName == 'vmap:VMAP') {\n for (const ad of shaka.ads.Utils.parseVMAP(data)) {\n // eslint-disable-next-line no-await-in-loop\n const vastResponseData = await this.makeAdRequest_(ad.uri, context);\n const vast = shaka.util.TXml.parseXml(vastResponseData, 'VAST');\n if (!vast) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.ADS,\n shaka.util.Error.Code.VAST_INVALID_XML);\n }\n interstitials.push(...shaka.ads.Utils.parseVastToInterstitials(\n vast, ad.time));\n }\n }\n this.addInterstitials(interstitials);\n }\n\n\n /**\n * @param {!Array<shaka.extern.AdInterstitial>} interstitials\n */\n async addInterstitials(interstitials) {\n let cuepointsChanged = false;\n for (const interstitial of interstitials) {\n if (!interstitial.uri) {\n shaka.log.alwaysWarn('Missing URL in interstitial', interstitial);\n continue;\n }\n if (!interstitial.mimeType) {\n try {\n const netEngine = this.player_.getNetworkingEngine();\n goog.asserts.assert(netEngine, 'Need networking engine');\n // eslint-disable-next-line no-await-in-loop\n interstitial.mimeType = await shaka.net.NetworkingUtils.getMimeType(\n interstitial.uri, netEngine,\n this.basePlayer_.getConfiguration().streaming.retryParameters);\n } catch (error) {}\n }\n const interstitialId = interstitial.id || JSON.stringify(interstitial);\n if (this.interstitialIds_.has(interstitialId)) {\n continue;\n }\n if (interstitial.loop && !interstitial.overlay) {\n shaka.log.alwaysWarn('Loop is only supported in overlay interstitials',\n interstitial);\n }\n if (!interstitial.overlay) {\n cuepointsChanged = true;\n }\n this.interstitialIds_.add(interstitialId);\n this.interstitials_.add(interstitial);\n let shouldPreload = false;\n if (interstitial.pre && this.lastTime_ == null) {\n shouldPreload = true;\n } else if (interstitial.startTime == 0 && !interstitial.canJump) {\n shouldPreload = true;\n } else if (this.lastTime_ != null) {\n const difference = interstitial.startTime - this.lastTime_;\n if (difference > 0 && difference <= 10) {\n shouldPreload = true;\n }\n }\n if (shouldPreload) {\n if (!this.preloadManagerInterstitials_.has(interstitial) &&\n this.isPreloadAllowed_(interstitial)) {\n this.preloadManagerInterstitials_.set(\n interstitial, this.player_.preload(\n interstitial.uri,\n /* startTime= */ null,\n interstitial.mimeType || undefined));\n }\n this.checkPreloadOnDomElements_(interstitial);\n }\n }\n if (cuepointsChanged) {\n this.cuepointsChanged_();\n }\n this.addEventListeners_();\n }\n\n /**\n * @return {!HTMLMediaElement}\n * @private\n */\n createMediaElement_() {\n const video = /** @type {!HTMLMediaElement} */(\n document.createElement(this.baseVideo_.tagName));\n video.autoplay = true;\n video.style.position = 'absolute';\n video.style.top = '0';\n video.style.left = '0';\n video.style.width = '100%';\n video.style.height = '100%';\n video.style.display = 'none';\n video.setAttribute('playsinline', '');\n return video;\n }\n\n\n /**\n * @param {boolean=} needPreRoll\n * @param {?number=} numberToSkip\n * @return {?shaka.extern.AdInterstitial}\n * @private\n */\n getCurrentInterstitial_(needPreRoll = false, numberToSkip = null) {\n let skipped = 0;\n let currentInterstitial = null;\n if (this.interstitials_.size && this.lastTime_ != null) {\n const isEnded = this.baseVideo_.ended;\n const interstitials = Array.from(this.interstitials_).sort((a, b) => {\n return b.startTime - a.startTime;\n });\n const roundDecimals = (number) => {\n return Math.round(number * 1000) / 1000;\n };\n let interstitialsToCheck = interstitials;\n if (needPreRoll) {\n interstitialsToCheck = interstitials.filter((i) => i.pre);\n } else if (isEnded) {\n interstitialsToCheck = interstitials.filter((i) => i.post);\n } else {\n interstitialsToCheck = interstitials.filter((i) => !i.pre && !i.post);\n }\n for (const interstitial of interstitialsToCheck) {\n let isValid = false;\n if (needPreRoll) {\n isValid = interstitial.pre;\n } else if (isEnded) {\n isValid = interstitial.post;\n } else if (!interstitial.pre && !interstitial.post) {\n const difference =\n this.lastTime_ - roundDecimals(interstitial.startTime);\n if (difference > 0 &&\n (difference <= 1 || !interstitial.canJump)) {\n if (numberToSkip == null && this.lastPlayedAd_ &&\n !this.lastPlayedAd_.pre && !this.lastPlayedAd_.post &&\n this.lastPlayedAd_.startTime >= interstitial.startTime) {\n isValid = false;\n } else {\n isValid = true;\n }\n }\n }\n if (isValid && (!this.lastPlayedAd_ ||\n interstitial.startTime >= this.lastPlayedAd_.startTime)) {\n if (skipped == (numberToSkip || 0)) {\n currentInterstitial = interstitial;\n } else if (currentInterstitial && !interstitial.canJump) {\n const currentStartTime =\n roundDecimals(currentInterstitial.startTime);\n const newStartTime =\n roundDecimals(interstitial.startTime);\n if (newStartTime - currentStartTime > 0.001) {\n currentInterstitial = interstitial;\n skipped = 0;\n }\n }\n skipped++;\n }\n }\n }\n return currentInterstitial;\n }\n\n\n /**\n * @param {shaka.extern.AdInterstitial} interstitial\n * @param {number} sequenceLength\n * @param {number} adPosition\n * @param {number} initialTime the clock time the ad started at\n * @param {number=} oncePlayed\n * @private\n */\n setupAd_(interstitial, sequenceLength, adPosition, initialTime,\n oncePlayed = 0) {\n shaka.log.info('Starting interstitial',\n interstitial.startTime, 'at', this.lastTime_);\n\n this.lastPlayedAd_ = interstitial;\n\n this.determineIfUsingBaseVideo_();\n goog.asserts.assert(this.video_, 'Must have video');\n\n if (!this.video_.parentElement && this.adContainer_) {\n this.adContainer_.appendChild(this.video_);\n }\n\n if (adPosition == 1 && sequenceLength == 1) {\n sequenceLength = Array.from(this.interstitials_).filter((i) => {\n if (interstitial.pre) {\n return i.pre == interstitial.pre;\n } else if (interstitial.post) {\n return i.post == interstitial.post;\n }\n return Math.abs(i.startTime - interstitial.startTime) < 0.001;\n }).length;\n }\n\n if (interstitial.once) {\n oncePlayed++;\n this.interstitials_.delete(interstitial);\n this.removeEventListeners_();\n if (!interstitial.overlay) {\n this.cuepointsChanged_();\n }\n }\n\n if (interstitial.mimeType) {\n if (interstitial.mimeType.startsWith('image/') ||\n interstitial.mimeType === 'text/html') {\n if (!interstitial.overlay) {\n shaka.log.alwaysWarn('Unsupported interstitial', interstitial);\n return;\n }\n this.setupStaticAd_(interstitial, sequenceLength, adPosition,\n oncePlayed);\n return;\n }\n }\n if (this.usingBaseVideo_ && interstitial.overlay) {\n shaka.log.alwaysWarn('Unsupported interstitial', interstitial);\n return;\n }\n this.setupVideoAd_(interstitial, sequenceLength, adPosition, initialTime,\n oncePlayed);\n }\n\n\n /**\n * @param {shaka.extern.AdInterstitial} interstitial\n * @param {number} sequenceLength\n * @param {number} adPosition\n * @param {number} oncePlayed\n * @private\n */\n setupStaticAd_(interstitial, sequenceLength, adPosition, oncePlayed) {\n const overlay = interstitial.overlay;\n goog.asserts.assert(overlay, 'Must have overlay');\n\n const tagName = interstitial.mimeType == 'text/html' ? 'iframe' : 'img';\n\n const htmlElement = /** @type {!(HTMLImageElement|HTMLIFrameElement)} */ (\n document.createElement(tagName));\n htmlElement.style.objectFit = 'contain';\n htmlElement.style.position = 'absolute';\n htmlElement.style.border = 'none';\n\n this.setBaseStyles_(interstitial);\n\n const basicTask = () => {\n if (this.playoutLimitTimer_) {\n this.playoutLimitTimer_.stop();\n this.playoutLimitTimer_ = null;\n }\n this.adContainer_.removeChild(htmlElement);\n this.removeBaseStyles_(interstitial);\n this.onEvent_(\n new shaka.util.FakeEvent(shaka.ads.Utils.AD_STOPPED));\n const nextCurrentInterstitial = this.getCurrentInterstitial_(\n interstitial.pre, adPosition - oncePlayed);\n if (nextCurrentInterstitial) {\n this.adEventManager_.removeAll();\n this.setupAd_(nextCurrentInterstitial, sequenceLength,\n ++adPosition, /* initialTime= */ Date.now(), oncePlayed);\n } else {\n this.playingAd_ = false;\n }\n };\n\n const ad = new shaka.ads.InterstitialStaticAd(\n interstitial, sequenceLength, adPosition);\n\n this.onEvent_(\n new shaka.util.FakeEvent(shaka.ads.Utils.AD_STARTED,\n (new Map()).set('ad', ad)));\n\n if (tagName == 'iframe') {\n htmlElement.src = interstitial.uri;\n } else {\n htmlElement.src = interstitial.uri;\n htmlElement.onerror = (e) => {\n this.onEvent_(new shaka.util.FakeEvent(shaka.ads.Utils.AD_ERROR,\n (new Map()).set('originalEvent', e)));\n basicTask();\n };\n }\n\n const viewport = overlay.viewport;\n const topLeft = overlay.topLeft;\n const size = overlay.size;\n // Special case for VAST non-linear ads\n if (viewport.x == 0 && viewport.y == 0) {\n htmlElement.width = interstitial.overlay.size.x;\n htmlElement.height = interstitial.overlay.size.y;\n htmlElement.style.bottom = '10%';\n htmlElement.style.left = '0';\n htmlElement.style.right = '0';\n htmlElement.style.width = '100%';\n if (!interstitial.overlay.size.y && tagName == 'iframe') {\n htmlElement.style.height = 'auto';\n }\n } else {\n htmlElement.style.height = (size.y / viewport.y * 100) + '%';\n htmlElement.style.left = (topLeft.x / viewport.x * 100) + '%';\n htmlElement.style.top = (topLeft.y / viewport.y * 100) + '%';\n htmlElement.style.width = (size.x / viewport.x * 100) + '%';\n }\n this.adContainer_.appendChild(htmlElement);\n\n const startTime = Date.now();\n if (this.playoutLimitTimer_) {\n this.playoutLimitTimer_.stop();\n }\n this.playoutLimitTimer_ = new shaka.util.Timer(() => {\n if (interstitial.playoutLimit &&\n (Date.now() - startTime) / 1000 > interstitial.playoutLimit) {\n this.onEvent_(\n new shaka.util.FakeEvent(shaka.ads.Utils.AD_COMPLETE));\n basicTask();\n } else if (interstitial.endTime &&\n this.baseVideo_.currentTime > interstitial.endTime) {\n this.onEvent_(\n new shaka.util.FakeEvent(shaka.ads.Utils.AD_COMPLETE));\n basicTask();\n } else if (this.baseVideo_.currentTime < interstitial.startTime) {\n this.onEvent_(\n new shaka.util.FakeEvent(shaka.ads.Utils.AD_SKIPPED));\n basicTask();\n }\n });\n if (interstitial.playoutLimit && !interstitial.endTime) {\n this.playoutLimitTimer_.tickAfter(interstitial.playoutLimit);\n } else if (interstitial.endTime) {\n this.playoutLimitTimer_.tickEvery(/* seconds= */ 0.025);\n }\n this.adEventManager_.listen(this.baseVideo_, 'seeked', () => {\n const currentTime = this.baseVideo_.currentTime;\n if (currentTime < interstitial.startTime ||\n (interstitial.endTime && currentTime > interstitial.endTime)) {\n if (this.playoutLimitTimer_) {\n this.playoutLimitTimer_.stop();\n }\n this.onEvent_(\n new shaka.util.FakeEvent(shaka.ads.Utils.AD_SKIPPED));\n basicTask();\n }\n });\n }\n\n\n /**\n * @param {shaka.extern.AdInterstitial} interstitial\n * @param {number} sequenceLength\n * @param {number} adPosition\n * @param {number} initialTime the clock time the ad started at\n * @param {number} oncePlayed\n * @private\n */\n async setupVideoAd_(interstitial, sequenceLength, adPosition, initialTime,\n oncePlayed) {\n goog.asserts.assert(this.video_, 'Must have video');\n const startTime = Date.now();\n\n this.playingAd_ = true;\n\n if (this.usingBaseVideo_ && adPosition == 1) {\n this.onEvent_(new shaka.util.FakeEvent(\n shaka.ads.Utils.AD_CONTENT_PAUSE_REQUESTED,\n (new Map()).set('saveLivePosition', true)));\n const detachBasePlayerPromise = new shaka.util.PublicPromise();\n const checkState = async (e) => {\n if (e['state'] == 'detach') {\n if (shaka.util.Platform.isSmartTV()) {\n await new Promise(\n (resolve) => new shaka.util.Timer(resolve).tickAfter(0.1));\n }\n detachBasePlayerPromise.resolve();\n this.adEventManager_.unlisten(\n this.basePlayer_, 'onstatechange', checkState);\n }\n };\n this.adEventManager_.listen(\n this.basePlayer_, 'onstatechange', checkState);\n await detachBasePlayerPromise;\n }\n this.setBaseStyles_(interstitial);\n if (!this.usingBaseVideo_) {\n this.video_.style.display = '';\n if (interstitial.overlay) {\n this.video_.loop = interstitial.loop;\n const viewport = interstitial.overlay.viewport;\n const topLeft = interstitial.overlay.topLeft;\n const size = interstitial.overlay.size;\n this.video_.style.height = (size.y / viewport.y * 100) + '%';\n this.video_.style.left = (topLeft.x / viewport.x * 100) + '%';\n this.video_.style.top = (topLeft.y / viewport.y * 100) + '%';\n this.video_.style.width = (size.x / viewport.x * 100) + '%';\n } else {\n this.baseVideo_.pause();\n if (interstitial.resumeOffset != null &&\n interstitial.resumeOffset != 0) {\n this.baseVideo_.currentTime += interstitial.resumeOffset;\n }\n this.video_.loop = false;\n this.video_.style.height = '100%';\n this.video_.style.left = '0';\n this.video_.style.top = '0';\n this.video_.style.width = '100%';\n }\n }\n\n let unloadingInterstitial = false;\n\n const updateBaseVideoTime = () => {\n if (!this.usingBaseVideo_ && !interstitial.overlay) {\n if (interstitial.resumeOffset == null) {\n if (interstitial.timelineRange && interstitial.endTime &&\n interstitial.endTime != Infinity) {\n if (this.baseVideo_.currentTime != interstitial.endTime) {\n this.baseVideo_.currentTime = interstitial.endTime;\n }\n } else {\n const now = Date.now();\n this.baseVideo_.currentTime += (now - initialTime) / 1000;\n initialTime = now;\n }\n }\n }\n };\n\n const basicTask = async (isSkip) => {\n updateBaseVideoTime();\n // Optimization to avoid returning to main content when there is another\n // interstitial below.\n let nextCurrentInterstitial = this.getCurrentInterstitial_(\n interstitial.pre, adPosition - oncePlayed);\n if (isSkip && interstitial.groupId) {\n while (nextCurrentInterstitial &&\n nextCurrentInterstitial.groupId == interstitial.groupId) {\n adPosition++;\n nextCurrentInterstitial = this.getCurrentInterstitial_(\n interstitial.pre, adPosition - oncePlayed);\n }\n }\n if (this.playoutLimitTimer_ && (!interstitial.groupId ||\n (nextCurrentInterstitial &&\n nextCurrentInterstitial.groupId != interstitial.groupId))) {\n this.playoutLimitTimer_.stop();\n this.playoutLimitTimer_ = null;\n }\n this.removeBaseStyles_(interstitial);\n if (!nextCurrentInterstitial || nextCurrentInterstitial.overlay) {\n if (interstitial.post) {\n this.lastTime_ = null;\n this.lastPlayedAd_ = null;\n }\n if (this.usingBaseVideo_) {\n await this.player_.detach();\n } else {\n await this.player_.unload();\n }\n if (this.usingBaseVideo_) {\n let offset = interstitial.resumeOffset;\n if (offset == null) {\n if (interstitial.timelineRange && interstitial.endTime &&\n interstitial.endTime != Infinity) {\n offset = interstitial.endTime - (this.lastTime_ || 0);\n } else {\n offset = (Date.now() - initialTime) / 1000;\n }\n }\n this.onEvent_(new shaka.util.FakeEvent(\n shaka.ads.Utils.AD_CONTENT_RESUME_REQUESTED,\n (new Map()).set('offset', offset)));\n }\n this.onEvent_(\n new shaka.util.FakeEvent(shaka.ads.Utils.AD_STOPPED));\n this.adEventManager_.removeAll();\n this.playingAd_ = false;\n if (!this.usingBaseVideo_) {\n this.video_.style.display = 'none';\n updateBaseVideoTime();\n if (!this.baseVideo_.ended) {\n this.baseVideo_.play();\n }\n } else {\n this.cuepointsChanged_();\n }\n }\n this.determineIfUsingBaseVideo_();\n if (nextCurrentInterstitial) {\n this.onEvent_(\n new shaka.util.FakeEvent(shaka.ads.Utils.AD_STOPPED));\n this.adEventManager_.removeAll();\n this.setupAd_(nextCurrentInterstitial, sequenceLength,\n ++adPosition, initialTime, oncePlayed);\n }\n };\n const error = async (e) => {\n if (unloadingInterstitial) {\n return;\n }\n unloadingInterstitial = true;\n this.onEvent_(new shaka.util.FakeEvent(shaka.ads.Utils.AD_ERROR,\n (new Map()).set('originalEvent', e)));\n await basicTask(/* isSkip= */ false);\n };\n const complete = async () => {\n if (unloadingInterstitial) {\n return;\n }\n unloadingInterstitial = true;\n await basicTask(/* isSkip= */ false);\n this.onEvent_(\n new shaka.util.FakeEvent(shaka.ads.Utils.AD_COMPLETE));\n };\n this.lastOnSkip_ = async () => {\n if (unloadingInterstitial) {\n return;\n }\n unloadingInterstitial = true;\n this.onEvent_(new shaka.util.FakeEvent(shaka.ads.Utils.AD_SKIPPED));\n await basicTask(/* isSkip= */ true);\n };\n\n const ad = new shaka.ads.InterstitialAd(this.video_,\n interstitial, this.lastOnSkip_, sequenceLength, adPosition,\n !this.usingBaseVideo_);\n if (!this.usingBaseVideo_) {\n ad.setMuted(this.baseVideo_.muted);\n ad.setVolume(this.baseVideo_.volume);\n }\n\n this.onEvent_(\n new shaka.util.FakeEvent(shaka.ads.Utils.AD_STARTED,\n (new Map()).set('ad', ad)));\n\n let prevCanSkipNow = ad.canSkipNow();\n if (prevCanSkipNow) {\n this.onEvent_(new shaka.util.FakeEvent(\n shaka.ads.Utils.AD_SKIP_STATE_CHANGED));\n }\n this.adEventManager_.listenOnce(this.player_, 'error', error);\n this.adEventManager_.listen(this.video_, 'timeupdate', () => {\n const duration = this.video_.duration;\n if (!duration) {\n return;\n }\n const currentCanSkipNow = ad.canSkipNow();\n if (prevCanSkipNow != currentCanSkipNow &&\n ad.getRemainingTime() > 0 && ad.getDuration() > 0) {\n this.onEvent_(\n new shaka.util.FakeEvent(shaka.ads.Utils.AD_SKIP_STATE_CHANGED));\n }\n prevCanSkipNow = currentCanSkipNow;\n });\n this.adEventManager_.listenOnce(this.player_, 'firstquartile', () => {\n updateBaseVideoTime();\n this.onEvent_(\n new shaka.util.FakeEvent(shaka.ads.Utils.AD_FIRST_QUARTILE));\n });\n this.adEventManager_.listenOnce(this.player_, 'midpoint', () => {\n updateBaseVideoTime();\n this.onEvent_(\n new shaka.util.FakeEvent(shaka.ads.Utils.AD_MIDPOINT));\n });\n this.adEventManager_.listenOnce(this.player_, 'thirdquartile', () => {\n updateBaseVideoTime();\n this.onEvent_(\n new shaka.util.FakeEvent(shaka.ads.Utils.AD_THIRD_QUARTILE));\n });\n this.adEventManager_.listenOnce(this.player_, 'complete', complete);\n this.adEventManager_.listen(this.video_, 'play', () => {\n this.onEvent_(\n new shaka.util.FakeEvent(shaka.ads.Utils.AD_RESUMED));\n });\n this.adEventManager_.listen(this.video_, 'pause', () => {\n // playRangeEnd in src= causes the ended event not to be fired when that\n // position is reached, instead pause event is fired.\n const currentConfig = this.player_.getConfiguration();\n if (this.video_.currentTime >= currentConfig.playRangeEnd) {\n complete();\n return;\n }\n this.onEvent_(\n new shaka.util.FakeEvent(shaka.ads.Utils.AD_PAUSED));\n });\n this.adEventManager_.listen(this.video_, 'volumechange', () => {\n if (this.video_.muted) {\n this.onEvent_(\n new shaka.util.FakeEvent(shaka.ads.Utils.AD_MUTED));\n } else {\n this.onEvent_(\n new shaka.util.FakeEvent(shaka.ads.Utils.AD_VOLUME_CHANGED));\n }\n });\n try {\n this.updatePlayerConfig_();\n if (interstitial.startTime && interstitial.endTime &&\n interstitial.endTime != Infinity &&\n interstitial.startTime != interstitial.endTime) {\n const duration = interstitial.endTime - interstitial.startTime;\n if (duration > 0) {\n this.player_.configure('playRangeEnd', duration);\n }\n }\n if (interstitial.playoutLimit && !this.playoutLimitTimer_) {\n this.playoutLimitTimer_ = new shaka.util.Timer(() => {\n this.lastOnSkip_();\n }).tickAfter(interstitial.playoutLimit);\n this.player_.configure('playRangeEnd', interstitial.playoutLimit);\n }\n await this.player_.attach(this.video_);\n if (this.preloadManagerInterstitials_.has(interstitial)) {\n const preloadManager =\n await this.preloadManagerInterstitials_.get(interstitial);\n this.preloadManagerInterstitials_.delete(interstitial);\n if (preloadManager) {\n await this.player_.load(preloadManager);\n } else {\n await this.player_.load(\n interstitial.uri,\n /* startTime= */ null,\n interstitial.mimeType || undefined);\n }\n } else {\n await this.player_.load(\n interstitial.uri,\n /* startTime= */ null,\n interstitial.mimeType || undefined);\n }\n this.video_.play();\n const loadTime = (Date.now() - startTime) / 1000;\n this.onEvent_(new shaka.util.FakeEvent(shaka.ads.Utils.ADS_LOADED,\n (new Map()).set('loadTime', loadTime)));\n if (this.usingBaseVideo_) {\n this.baseVideo_.play();\n }\n if (interstitial.overlay) {\n this.adEventManager_.listen(this.baseVideo_, 'seeking', () => {\n const newPosition =\n this.baseVideo_.currentTime - interstitial.startTime;\n if (Math.abs(newPosition - this.video_.currentTime) > 0.1) {\n this.video_.currentTime = newPosition;\n }\n });\n this.adEventManager_.listen(this.baseVideo_, 'seeked', () => {\n const currentTime = this.baseVideo_.currentTime;\n if (currentTime < interstitial.startTime ||\n (interstitial.endTime && currentTime > interstitial.endTime)) {\n this.lastOnSkip_();\n }\n });\n }\n } catch (e) {\n if (!this.playingAd_) {\n return;\n }\n error(e);\n }\n }\n\n /**\n * @param {shaka.extern.AdInterstitial} interstitial\n * @private\n */\n setBaseStyles_(interstitial) {\n if (interstitial.displayOnBackground) {\n this.baseVideo_.style.zIndex = '1';\n }\n if (interstitial.currentVideo != null) {\n const currentVideo = interstitial.currentVideo;\n this.baseVideo_.style.transformOrigin = 'top left';\n let addTransition = true;\n const transforms = [];\n const translateX = currentVideo.topLeft.x / currentVideo.viewport.x * 100;\n if (translateX > 0 && translateX <= 100) {\n transforms.push(`translateX(${translateX}%)`);\n // In the case of double box ads we do not want transitions.\n addTransition = false;\n }\n const translateY = currentVideo.topLeft.y / currentVideo.viewport.y * 100;\n if (translateY > 0 && translateY <= 100) {\n transforms.push(`translateY(${translateY}%)`);\n // In the case of double box ads we do not want transitions.\n addTransition = false;\n }\n const scaleX = currentVideo.size.x / currentVideo.viewport.x;\n if (scaleX < 1) {\n transforms.push(`scaleX(${scaleX})`);\n }\n const scaleY = currentVideo.size.y / currentVideo.viewport.y;\n if (scaleX < 1) {\n transforms.push(`scaleY(${scaleY})`);\n }\n if (transforms.length) {\n this.baseVideo_.style.transform = transforms.join(' ');\n }\n if (addTransition) {\n this.baseVideo_.style.transition = 'transform 250ms';\n }\n }\n if (this.adContainer_) {\n this.adContainer_.style.pointerEvents = 'none';\n if (interstitial.background) {\n this.adContainer_.style.background = interstitial.background;\n }\n }\n if (this.adVideo_) {\n if (interstitial.overlay) {\n this.adVideo_.style.background = '';\n } else {\n this.adVideo_.style.background = 'rgb(0, 0, 0)';\n }\n }\n }\n\n /**\n * @param {?shaka.extern.AdInterstitial=} interstitial\n * @private\n */\n removeBaseStyles_(interstitial) {\n if (!interstitial || interstitial.displayOnBackground) {\n this.baseVideo_.style.zIndex = '';\n }\n if (!interstitial || interstitial.currentVideo != null) {\n this.baseVideo_.style.transformOrigin = '';\n this.baseVideo_.style.transition = '';\n this.baseVideo_.style.transform = '';\n }\n if (this.adContainer_) {\n this.adContainer_.style.pointerEvents = '';\n if (!interstitial || interstitial.background) {\n this.adContainer_.style.background = '';\n }\n }\n if (this.adVideo_) {\n this.adVideo_.style.background = '';\n }\n }\n\n /**\n * @param {shaka.extern.HLSInterstitial} hlsInterstitial\n * @return {!Promise<!Array<shaka.extern.AdInterstitial>>}\n * @private\n */\n async getInterstitialsInfo_(hlsInterstitial) {\n const interstitialsAd = [];\n if (!hlsInterstitial) {\n return interstitialsAd;\n }\n const assetUri = hlsInterstitial.values.find((v) => v.key == 'X-ASSET-URI');\n const assetList =\n hlsInterstitial.values.find((v) => v.key == 'X-ASSET-LIST');\n if (!assetUri && !assetList) {\n return interstitialsAd;\n }\n let id = null;\n const hlsInterstitialId = hlsInterstitial.values.find((v) => v.key == 'ID');\n if (hlsInterstitialId) {\n id = /** @type {string} */(hlsInterstitialId.data);\n }\n const startTime = id == null ?\n Math.floor(hlsInterstitial.startTime * 10) / 10:\n hlsInterstitial.startTime;\n let endTime = hlsInterstitial.endTime;\n if (hlsInterstitial.endTime && hlsInterstitial.endTime != Infinity &&\n typeof(hlsInterstitial.endTime) == 'number') {\n endTime = id == null ?\n Math.floor(hlsInterstitial.endTime * 10) / 10:\n hlsInterstitial.endTime;\n }\n const restrict = hlsInterstitial.values.find((v) => v.key == 'X-RESTRICT');\n let isSkippable = true;\n let canJump = true;\n if (restrict && restrict.data) {\n const data = /** @type {string} */(restrict.data);\n isSkippable = !data.includes('SKIP');\n canJump = !data.includes('JUMP');\n }\n let skipOffset = isSkippable ? 0 : null;\n const enableSkipAfter =\n hlsInterstitial.values.find((v) => v.key == 'X-ENABLE-SKIP-AFTER');\n if (enableSkipAfter) {\n const enableSkipAfterString = /** @type {string} */(enableSkipAfter.data);\n skipOffset = parseFloat(enableSkipAfterString);\n if (isNaN(skipOffset)) {\n skipOffset = isSkippable ? 0 : null;\n }\n }\n let skipFor = null;\n const enableSkipFor =\n hlsInterstitial.values.find((v) => v.key == 'X-ENABLE-SKIP-FOR');\n if (enableSkipFor) {\n const enableSkipForString = /** @type {string} */(enableSkipFor.data);\n skipFor = parseFloat(enableSkipForString);\n if (isNaN(skipOffset)) {\n skipFor = null;\n }\n }\n let resumeOffset = null;\n const resume =\n hlsInterstitial.values.find((v) => v.key == 'X-RESUME-OFFSET');\n if (resume) {\n const resumeOffsetString = /** @type {string} */(resume.data);\n resumeOffset = parseFloat(resumeOffsetString);\n if (isNaN(resumeOffset)) {\n resumeOffset = null;\n }\n }\n let playoutLimit = null;\n const playout =\n hlsInterstitial.values.find((v) => v.key == 'X-PLAYOUT-LIMIT');\n if (playout) {\n const playoutLimitString = /** @type {string} */(playout.data);\n playoutLimit = parseFloat(playoutLimitString);\n if (isNaN(playoutLimit)) {\n playoutLimit = null;\n }\n }\n let once = false;\n let pre = false;\n let post = false;\n const cue = hlsInterstitial.values.find((v) => v.key == 'CUE');\n if (cue) {\n const data = /** @type {string} */(cue.data);\n once = data.includes('ONCE');\n pre = data.includes('PRE');\n post = data.includes('POST');\n }\n let timelineRange = false;\n const timelineOccupies =\n hlsInterstitial.values.find((v) => v.key == 'X-TIMELINE-OCCUPIES');\n if (timelineOccupies) {\n const data = /** @type {string} */(timelineOccupies.data);\n timelineRange = data.includes('RANGE');\n } else if (!resume && this.basePlayer_.isLive()) {\n timelineRange = !pre && !post;\n }\n if (assetUri) {\n const uri = /** @type {string} */(assetUri.data);\n if (!uri) {\n return interstitialsAd;\n }\n interstitialsAd.push({\n id,\n groupId: null,\n startTime,\n endTime,\n uri,\n mimeType: null,\n isSkippable,\n skipOffset,\n skipFor,\n canJump,\n resumeOffset,\n playoutLimit,\n once,\n pre,\n post,\n timelineRange,\n loop: false,\n overlay: null,\n displayOnBackground: false,\n currentVideo: null,\n background: null,\n });\n } else if (assetList) {\n const uri = /** @type {string} */(assetList.data);\n if (!uri) {\n return interstitialsAd;\n }\n try {\n const NetworkingEngine = shaka.net.NetworkingEngine;\n const context = {\n type: NetworkingEngine.AdvancedRequestType.INTERSTITIAL_ASSET_LIST,\n };\n const responseData = await this.makeAdRequest_(uri, context);\n const data = shaka.util.StringUtils.fromUTF8(responseData);\n const dataAsJson =\n /** @type {!shaka.ads.InterstitialAdManager.AssetsList} */ (\n JSON.parse(data));\n const skipControl = dataAsJson['SKIP-CONTROL'];\n if (skipControl) {\n const enableSkipAfterValue = skipControl['ENABLE-SKIP-AFTER'];\n if ((typeof enableSkipAfterValue) == 'number') {\n skipOffset = parseFloat(enableSkipAfterValue);\n if (isNaN(enableSkipAfterValue)) {\n skipOffset = isSkippable ? 0 : null;\n }\n }\n const enableSkipForValue = skipControl['ENABLE-SKIP-FOR'];\n if ((typeof enableSkipForValue) == 'number') {\n skipFor = parseFloat(enableSkipForValue);\n if (isNaN(enableSkipForValue)) {\n skipFor = null;\n }\n }\n }\n for (let i = 0; i < dataAsJson['ASSETS'].length; i++) {\n const asset = dataAsJson['ASSETS'][i];\n if (asset['URI']) {\n interstitialsAd.push({\n id: id + '_shaka_asset_' + i,\n groupId: id,\n startTime,\n endTime,\n uri: asset['URI'],\n mimeType: null,\n isSkippable,\n skipOffset,\n skipFor,\n canJump,\n resumeOffset,\n playoutLimit,\n once,\n pre,\n post,\n timelineRange,\n loop: false,\n overlay: null,\n displayOnBackground: false,\n currentVideo: null,\n background: null,\n });\n }\n }\n } catch (e) {\n // Ignore errors\n }\n }\n return interstitialsAd;\n }\n\n\n /**\n * @private\n */\n cuepointsChanged_() {\n /** @type {!Array<!shaka.extern.AdCuePoint>} */\n const cuePoints = [];\n for (const interstitial of this.interstitials_) {\n if (interstitial.overlay) {\n continue;\n }\n /** @type {shaka.extern.AdCuePoint} */\n const shakaCuePoint = {\n start: interstitial.startTime,\n end: null,\n };\n if (interstitial.pre) {\n shakaCuePoint.start = 0;\n shakaCuePoint.end = null;\n } else if (interstitial.post) {\n shakaCuePoint.start = -1;\n shakaCuePoint.end = null;\n } else if (interstitial.timelineRange) {\n shakaCuePoint.end = interstitial.endTime;\n }\n const isValid = !cuePoints.find((c) => {\n return shakaCuePoint.start == c.start && shakaCuePoint.end == c.end;\n });\n if (isValid) {\n cuePoints.push(shakaCuePoint);\n }\n }\n\n this.onEvent_(new shaka.util.FakeEvent(\n shaka.ads.Utils.CUEPOINTS_CHANGED,\n (new Map()).set('cuepoints', cuePoints)));\n }\n\n\n /**\n * @private\n */\n updatePlayerConfig_() {\n goog.asserts.assert(this.player_, 'Must have player');\n goog.asserts.assert(this.basePlayer_, 'Must have base player');\n this.player_.configure(this.basePlayer_.getNonDefaultConfiguration());\n this.player_.configure('ads.disableHLSInterstitial', true);\n this.player_.configure('ads.disableDASHInterstitial', true);\n this.player_.configure('playRangeEnd', Infinity);\n const netEngine = this.player_.getNetworkingEngine();\n goog.asserts.assert(netEngine, 'Need networking engine');\n this.basePlayer_.getNetworkingEngine().copyFiltersInto(netEngine);\n }\n\n /**\n * @param {string} url\n * @param {shaka.extern.RequestContext=} context\n * @return {!Promise<BufferSource>}\n * @private\n */\n async makeAdRequest_(url, context) {\n const type = shaka.net.NetworkingEngine.RequestType.ADS;\n const request = shaka.net.NetworkingEngine.makeRequest(\n [url],\n shaka.net.NetworkingEngine.defaultRetryParameters());\n const op = this.basePlayer_.getNetworkingEngine()\n .request(type, request, context);\n const response = await op.promise;\n return response.data;\n }\n\n /**\n * @param {!shaka.extern.AdInterstitial} interstitial\n * @return {boolean}\n * @private\n */\n isPreloadAllowed_(interstitial) {\n const interstitialMimeType = interstitial.mimeType;\n if (!interstitialMimeType) {\n return true;\n }\n return !interstitialMimeType.startsWith('image/') &&\n interstitialMimeType !== 'text/html';\n }\n\n\n /**\n * Only for testing\n *\n * @return {!Array<shaka.extern.AdInterstitial>}\n */\n getInterstitials() {\n return Array.from(this.interstitials_);\n }\n\n\n /**\n * @param {!shaka.extern.AdInterstitial} interstitial\n * @private\n */\n checkPreloadOnDomElements_(interstitial) {\n if (this.preloadOnDomElements_.has(interstitial) ||\n (this.config_ && !this.config_.allowPreloadOnDomElements)) {\n return;\n }\n const createAndAddLink = (url) => {\n const link = /** @type {HTMLLinkElement} */(\n document.createElement('link'));\n link.rel = 'preload';\n link.href = url;\n link.as = 'image';\n document.head.appendChild(link);\n return link;\n };\n const links = [];\n if (interstitial.background) {\n const urlRegExp = /url\\(('|\")?([^'\"()]+)('|\")\\)?/;\n const match = interstitial.background.match(urlRegExp);\n if (match) {\n links.push(createAndAddLink(match[2]));\n }\n }\n if (interstitial.mimeType.startsWith('image/')) {\n links.push(createAndAddLink(interstitial.uri));\n }\n this.preloadOnDomElements_.set(interstitial, links);\n }\n\n\n /**\n * @param {!shaka.extern.AdInterstitial} interstitial\n * @private\n */\n removePreloadOnDomElements_(interstitial) {\n if (!this.preloadOnDomElements_.has(interstitial)) {\n return;\n }\n const links = this.preloadOnDomElements_.get(interstitial);\n for (const link of links) {\n link.parentNode.removeChild(link);\n }\n this.preloadOnDomElements_.delete(interstitial);\n }\n};\n\n\n/**\n * @typedef {{\n * ASSETS: !Array<shaka.ads.InterstitialAdManager.Asset>,\n * SKIP-CONTROL: ?shaka.ads.InterstitialAdManager.SkipControl\n * }}\n *\n * @property {!Array<shaka.ads.InterstitialAdManager.Asset>} ASSETS\n * @property {shaka.ads.InterstitialAdManager.SkipControl} SKIP-CONTROL\n */\nshaka.ads.InterstitialAdManager.AssetsList;\n\n\n/**\n * @typedef {{\n * URI: string\n * }}\n *\n * @property {string} URI\n */\nshaka.ads.InterstitialAdManager.Asset;\n\n\n/**\n * @typedef {{\n * ENABLE-SKIP-AFTER: number,\n * ENABLE-SKIP-FOR: number\n * }}\n *\n * @property {number} ENABLE-SKIP-AFTER\n * @property {number} ENABLE-SKIP-FOR\n */\nshaka.ads.InterstitialAdManager.SkipControl;\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\ngoog.provide('shaka.ads.MediaTailorAd');\n\ngoog.require('shaka.util.TextParser');\n\n/**\n * @implements {shaka.extern.IAd}\n * @export\n */\nshaka.ads.MediaTailorAd = class {\n /**\n * @param {mediaTailor.Ad} mediaTailorAd\n * @param {number} adPosition\n * @param {number} totalAds\n * @param {boolean} isLinear\n * @param {HTMLMediaElement} video\n */\n constructor(mediaTailorAd, adPosition, totalAds, isLinear, video) {\n /** @private {?mediaTailor.Ad} */\n this.ad_ = mediaTailorAd;\n\n /** @private {?number} */\n this.skipOffset_ = shaka.util.TextParser.parseTime(this.ad_.skipOffset);\n\n /** @private {HTMLMediaElement} */\n this.video_ = video;\n\n /** @private {?number} */\n this.adPosition_ = adPosition;\n\n /** @private {?number} */\n this.totalAds_ = totalAds;\n\n /** @private {boolean} */\n this.isLinear_ = isLinear;\n\n /** @private {boolean} */\n this.isSkipped_ = false;\n }\n\n /**\n * @override\n * @export\n */\n needsSkipUI() {\n return true;\n }\n\n /**\n * @override\n * @export\n */\n isClientRendering() {\n return false;\n }\n\n /**\n * @override\n * @export\n */\n hasCustomClick() {\n return false;\n }\n\n /**\n * @override\n * @export\n */\n isUsingAnotherMediaElement() {\n return false;\n }\n\n /**\n * @override\n * @export\n */\n getDuration() {\n return this.ad_.durationInSeconds;\n }\n\n /**\n * @override\n * @export\n */\n getMinSuggestedDuration() {\n return this.getDuration();\n }\n\n /**\n * @override\n * @export\n */\n getRemainingTime() {\n const endTime = this.ad_.startTimeInSeconds + this.ad_.durationInSeconds;\n return endTime - this.video_.currentTime;\n }\n\n /**\n * @override\n * @export\n */\n isPaused() {\n return this.video_.paused;\n }\n\n /**\n * @override\n * @export\n */\n isSkippable() {\n if (typeof this.skipOffset_ == 'number') {\n return true;\n }\n return false;\n }\n\n /**\n * @override\n * @export\n */\n getTimeUntilSkippable() {\n if (typeof this.skipOffset_ != 'number') {\n return this.getRemainingTime();\n }\n const canSkipIn =\n this.getRemainingTime() + this.skipOffset_ - this.getDuration();\n return Math.max(canSkipIn, 0);\n }\n\n /**\n * @override\n * @export\n */\n canSkipNow() {\n return this.getTimeUntilSkippable() == 0;\n }\n\n /**\n * @override\n * @export\n */\n skip() {\n this.isSkipped_ = true;\n this.video_.currentTime += this.getRemainingTime();\n }\n\n /**\n * @override\n * @export\n */\n pause() {\n return this.video_.pause();\n }\n\n /**\n * @override\n * @export\n */\n play() {\n return this.video_.play();\n }\n\n\n /**\n * @override\n * @export\n */\n getVolume() {\n return this.video_.volume;\n }\n\n /**\n * @override\n * @export\n */\n setVolume(volume) {\n this.video_.volume = volume;\n }\n\n /**\n * @override\n * @export\n */\n isMuted() {\n return this.video_.muted;\n }\n\n /**\n * @override\n * @export\n */\n isLinear() {\n return this.isLinear_;\n }\n\n /**\n * @override\n * @export\n */\n resize(width, height) {\n // Nothing\n }\n\n /**\n * @override\n * @export\n */\n setMuted(muted) {\n this.video_.muted = muted;\n }\n\n\n /**\n * @override\n * @export\n */\n getSequenceLength() {\n if (!this.totalAds_) {\n return 1;\n }\n return this.totalAds_;\n }\n\n /**\n * @override\n * @export\n */\n getPositionInSequence() {\n if (!this.adPosition_) {\n return 1;\n }\n return this.adPosition_;\n }\n\n /**\n * @override\n * @export\n */\n getTitle() {\n return this.ad_.adTitle;\n }\n\n /**\n * @override\n * @export\n */\n getDescription() {\n return '';\n }\n\n /**\n * @override\n * @export\n */\n getVastMediaBitrate() {\n return 0;\n }\n\n /**\n * @override\n * @export\n */\n getVastMediaHeight() {\n return 0;\n }\n\n /**\n * @override\n * @export\n */\n getVastMediaWidth() {\n return 0;\n }\n\n /**\n * @override\n * @export\n */\n getAdId() {\n return this.ad_.adId;\n }\n\n /**\n * @override\n * @export\n */\n getCreativeAdId() {\n return this.ad_.creativeId;\n }\n\n /**\n * @override\n * @export\n */\n getAdvertiserName() {\n return '';\n }\n\n /**\n * @override\n * @export\n */\n getMediaUrl() {\n return null;\n }\n\n /**\n * @override\n * @export\n */\n getTimeOffset() {\n return 0;\n }\n\n /**\n * @override\n * @export\n */\n getPodIndex() {\n return 0;\n }\n\n /**\n * @override\n * @export\n */\n release() {\n this.ad_ = null;\n this.video_ = null;\n this.adPosition_ = null;\n this.totalAds_ = null;\n }\n\n /**\n * @return {boolean}\n */\n isSkipped() {\n return this.isSkipped_;\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\ngoog.provide('shaka.ads.MediaTailorAdManager');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.ads.MediaTailorAd');\ngoog.require('shaka.ads.Utils');\ngoog.require('shaka.log');\ngoog.require('shaka.net.NetworkingEngine');\ngoog.require('goog.Uri');\ngoog.require('shaka.util.EventManager');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.FakeEvent');\ngoog.require('shaka.util.IReleasable');\ngoog.require('shaka.util.PublicPromise');\ngoog.require('shaka.util.StringUtils');\n\n\n/**\n * A class responsible for MediaTailor ad interactions.\n *\n * @implements {shaka.util.IReleasable}\n */\nshaka.ads.MediaTailorAdManager = class {\n /**\n * @param {HTMLElement} adContainer\n * @param {shaka.net.NetworkingEngine} networkingEngine\n * @param {HTMLMediaElement} video\n * @param {function(!shaka.util.FakeEvent)} onEvent\n */\n constructor(adContainer, networkingEngine, video, onEvent) {\n /** @private {HTMLElement} */\n this.adContainer_ = adContainer;\n\n /** @private {shaka.net.NetworkingEngine} */\n this.networkingEngine_ = networkingEngine;\n\n /** @private {HTMLMediaElement} */\n this.video_ = video;\n\n /** @private {?shaka.util.PublicPromise<string>} */\n this.streamPromise_ = null;\n\n /** @private {number} */\n this.streamRequestStartTime_ = NaN;\n\n /** @private {function(!shaka.util.FakeEvent)} */\n this.onEvent_ = onEvent;\n\n /** @private {boolean} */\n this.isLive_ = false;\n\n /**\n * Time to seek to after an ad if that ad was played as the result of\n * snapback.\n * @private {?number}\n */\n this.snapForwardTime_ = null;\n\n /** @private {!Array<!mediaTailor.AdBreak>} */\n this.adBreaks_ = [];\n\n /** @private {!Array<string>} */\n this.playedAds_ = [];\n\n /** @private {?shaka.ads.MediaTailorAd} */\n this.ad_ = null;\n\n /** @private {?mediaTailor.Ad} */\n this.mediaTailorAd_ = null;\n\n /** @private {?mediaTailor.AdBreak} */\n this.mediaTailorAdBreak_ = null;\n\n /** @private {!Map<string, !Array<mediaTailorExternalResource.App>>} */\n this.staticResources_ = new Map();\n\n /**\n * @private {!Array<{target: EventTarget, type: string,\n * listener: shaka.util.EventManager.ListenerType}>}\n */\n this.adListeners_ = [];\n\n /** @private {!Array<string>} */\n this.eventsSent = [];\n\n /** @private {string} */\n this.trackingUrl_ = '';\n\n /** @private {boolean} */\n this.firstTrackingRequest_ = true;\n\n /** @private {string} */\n this.backupUrl_ = '';\n\n /** @private {!Array<!shaka.extern.AdCuePoint>} */\n this.currentCuePoints_ = [];\n\n /** @private {shaka.util.EventManager} */\n this.eventManager_ = new shaka.util.EventManager();\n }\n\n /**\n * @param {string} url\n * @param {Object} adsParams\n * @param {string} backupUrl\n * @return {!Promise<string>}\n */\n streamRequest(url, adsParams, backupUrl) {\n if (this.streamPromise_) {\n return Promise.reject(new shaka.util.Error(\n shaka.util.Error.Severity.RECOVERABLE,\n shaka.util.Error.Category.ADS,\n shaka.util.Error.Code.CURRENT_DAI_REQUEST_NOT_FINISHED));\n }\n\n this.streamPromise_ = new shaka.util.PublicPromise();\n this.requestSessionInfo_(url, adsParams);\n this.backupUrl_ = backupUrl || '';\n\n this.streamRequestStartTime_ = Date.now() / 1000;\n\n return this.streamPromise_;\n }\n\n /**\n * @param {string} url\n */\n addTrackingUrl(url) {\n this.trackingUrl_ = url;\n this.onEvent_(new shaka.util.FakeEvent(shaka.ads.Utils.ADS_LOADED,\n (new Map()).set('loadTime', 0)));\n }\n\n /**\n * Resets the MediaTailor manager and removes any continuous polling.\n */\n stop() {\n for (const listener of this.adListeners_) {\n this.eventManager_.unlisten(\n listener.target, listener.type, listener.listener);\n }\n this.onEnded_();\n this.adListeners_ = [];\n this.eventsSent = [];\n this.trackingUrl_ = '';\n this.firstTrackingRequest_ = true;\n this.backupUrl_ = '';\n this.snapForwardTime_ = null;\n this.adBreaks_ = [];\n this.playedAds_ = [];\n this.staticResources_.clear();\n }\n\n /** @override */\n release() {\n this.stop();\n if (this.eventManager_) {\n this.eventManager_.release();\n }\n }\n\n /**\n * Fired when the manifest is updated\n *\n * @param {boolean} isLive\n */\n onManifestUpdated(isLive) {\n this.isLive_ = isLive;\n if (this.trackingUrl_ != '') {\n this.requestTrackingInfo_(\n this.trackingUrl_, this.firstTrackingRequest_);\n this.firstTrackingRequest_ = false;\n }\n }\n\n /**\n * @return {!Array<!shaka.extern.AdCuePoint>}\n */\n getCuePoints() {\n const cuePoints = [];\n for (const adBreak of this.adBreaks_) {\n for (const ad of adBreak.ads) {\n /** @type {!shaka.extern.AdCuePoint} */\n const cuePoint = {\n start: ad.startTimeInSeconds,\n end: ad.startTimeInSeconds + ad.durationInSeconds,\n };\n cuePoints.push(cuePoint);\n }\n }\n return cuePoints;\n }\n\n /**\n * @param {string} url\n * @param {Object} adsParams\n * @private\n */\n async requestSessionInfo_(url, adsParams) {\n const NetworkingEngine = shaka.net.NetworkingEngine;\n const type = NetworkingEngine.RequestType.ADS;\n const context = {\n type: NetworkingEngine.AdvancedRequestType.MEDIATAILOR_SESSION_INFO,\n };\n const request = NetworkingEngine.makeRequest(\n [url],\n NetworkingEngine.defaultRetryParameters());\n request.method = 'POST';\n if (adsParams) {\n const body = JSON.stringify(adsParams);\n request.body = shaka.util.StringUtils.toUTF8(body);\n }\n\n const op = this.networkingEngine_.request(type, request, context);\n try {\n const response = await op.promise;\n const data = shaka.util.StringUtils.fromUTF8(response.data);\n const dataAsJson =\n /** @type {!mediaTailor.SessionResponse} */ (JSON.parse(data));\n if (dataAsJson.manifestUrl && dataAsJson.trackingUrl) {\n const baseUri = new goog.Uri(url);\n const relativeTrackingUri = new goog.Uri(dataAsJson.trackingUrl);\n this.trackingUrl_ = baseUri.resolve(relativeTrackingUri).toString();\n const now = Date.now() / 1000;\n const loadTime = now - this.streamRequestStartTime_;\n this.onEvent_(new shaka.util.FakeEvent(shaka.ads.Utils.ADS_LOADED,\n (new Map()).set('loadTime', loadTime)));\n const relativeManifestUri = new goog.Uri(dataAsJson.manifestUrl);\n this.streamPromise_.resolve(\n baseUri.resolve(relativeManifestUri).toString());\n this.streamPromise_ = null;\n } else {\n throw new Error('Insufficient data from MediaTailor.');\n }\n } catch (e) {\n if (!this.backupUrl_.length) {\n this.streamPromise_.reject('MediaTailor request returned an error ' +\n 'and there was no backup asset uri provided.');\n this.streamPromise_ = null;\n return;\n }\n\n shaka.log.warning('MediaTailor request returned an error. ' +\n 'Falling back to the backup asset uri.');\n this.streamPromise_.resolve(this.backupUrl_);\n this.streamPromise_ = null;\n }\n }\n\n /**\n * @param {string} trackingUrl\n * @param {boolean} firstRequest\n * @private\n */\n async requestTrackingInfo_(trackingUrl, firstRequest) {\n const NetworkingEngine = shaka.net.NetworkingEngine;\n const type = NetworkingEngine.RequestType.ADS;\n const context = {\n type: NetworkingEngine.AdvancedRequestType.MEDIATAILOR_TRACKING_INFO,\n };\n const request = NetworkingEngine.makeRequest(\n [trackingUrl],\n NetworkingEngine.defaultRetryParameters());\n\n const op = this.networkingEngine_.request(type, request, context);\n try {\n const response = await op.promise;\n let cuepoints = [];\n const data = shaka.util.StringUtils.fromUTF8(response.data);\n const dataAsJson =\n /** @type {!mediaTailor.TrackingResponse} */ (JSON.parse(data));\n if (dataAsJson.avails.length > 0) {\n if (JSON.stringify(this.adBreaks_) !=\n JSON.stringify(dataAsJson.avails)) {\n this.adBreaks_ = dataAsJson.avails;\n for (const adBreak of this.adBreaks_) {\n for (const nonLinearAd of adBreak.nonLinearAdsList) {\n for (const nonLinearAdResource of nonLinearAd.nonLinearAdList) {\n this.requestStaticResource_(nonLinearAdResource);\n }\n }\n }\n cuepoints = this.getCuePoints();\n this.onEvent_(new shaka.util.FakeEvent(\n shaka.ads.Utils.CUEPOINTS_CHANGED,\n (new Map()).set('cuepoints', cuepoints)));\n }\n } else {\n if (this.adBreaks_.length) {\n this.onEvent_(new shaka.util.FakeEvent(\n shaka.ads.Utils.CUEPOINTS_CHANGED,\n (new Map()).set('cuepoints', cuepoints)));\n }\n this.onEnded_();\n this.adBreaks_ = [];\n }\n if (firstRequest && (this.isLive_ || cuepoints.length > 0)) {\n this.setupAdBreakListeners_();\n }\n } catch (e) {}\n }\n\n /**\n * @param {mediaTailor.NonLinearAd} nonLinearAd\n * @private\n */\n async requestStaticResource_(nonLinearAd) {\n if (!nonLinearAd.staticResource) {\n return;\n }\n const cacheKey = this.getCacheKeyForNonLinear_(nonLinearAd);\n const staticResource = this.staticResources_.get(cacheKey);\n if (staticResource) {\n return;\n }\n\n const NetworkingEngine = shaka.net.NetworkingEngine;\n const type = NetworkingEngine.RequestType.ADS;\n const context = {\n type: NetworkingEngine.AdvancedRequestType.MEDIATAILOR_STATIC_RESOURCE,\n };\n const request = NetworkingEngine.makeRequest(\n [nonLinearAd.staticResource],\n NetworkingEngine.defaultRetryParameters());\n\n const op = this.networkingEngine_.request(type, request, context);\n try {\n this.staticResources_.set(cacheKey, []);\n const response = await op.promise;\n const data = shaka.util.StringUtils.fromUTF8(response.data);\n const dataAsJson =\n /** @type {!mediaTailorExternalResource.Response} */ (JSON.parse(data));\n const apps = dataAsJson.apps;\n this.staticResources_.set(cacheKey, apps);\n } catch (e) {\n this.staticResources_.delete(cacheKey);\n }\n }\n\n /**\n * @param {mediaTailor.NonLinearAd} nonLinearAd\n * @return {string}\n * @private\n */\n getCacheKeyForNonLinear_(nonLinearAd) {\n return [\n nonLinearAd.adId,\n nonLinearAd.adParameters,\n nonLinearAd.adSystem,\n nonLinearAd.adTitle,\n nonLinearAd.creativeAdId,\n nonLinearAd.creativeId,\n nonLinearAd.creativeSequence,\n nonLinearAd.height,\n nonLinearAd.width,\n nonLinearAd.staticResource,\n ].join('');\n }\n\n /**\n * Setup Ad Break listeners\n *\n * @private\n */\n setupAdBreakListeners_() {\n this.onTimeupdate_();\n if (!this.isLive_) {\n this.checkForSnapback_();\n this.eventManager_.listen(this.video_, 'seeked', () => {\n this.checkForSnapback_();\n });\n this.eventManager_.listen(this.video_, 'ended', () => {\n this.onEnded_();\n });\n }\n this.eventManager_.listen(this.video_, 'timeupdate', () => {\n this.onTimeupdate_();\n });\n }\n\n /**\n * If a seek jumped over the ad break, return to the start of the\n * ad break, then complete the seek after the ad played through.\n *\n * @private\n */\n checkForSnapback_() {\n const currentTime = this.video_.currentTime;\n if (currentTime == 0 || this.snapForwardTime_ != null) {\n return;\n }\n\n let previousAdBreak;\n let previousAd;\n for (const adBreak of this.adBreaks_) {\n for (const ad of adBreak.ads) {\n if (!previousAd) {\n if (ad.startTimeInSeconds < currentTime) {\n previousAd = ad;\n previousAdBreak = adBreak;\n }\n } else if (ad.startTimeInSeconds < currentTime &&\n ad.startTimeInSeconds >\n (previousAd.startTimeInSeconds + previousAd.durationInSeconds)) {\n previousAd = ad;\n previousAdBreak = adBreak;\n break;\n }\n }\n }\n\n // The cue point gets marked as 'played' as soon as the playhead hits it\n // (at the start of an ad), so when we come back to this method as a result\n // of seeking back to the user-selected time, the 'played' flag will be set.\n if (previousAdBreak && previousAd &&\n !this.playedAds_.includes(previousAd.adId)) {\n shaka.log.info('Seeking back to the start of the ad break at ' +\n previousAdBreak.startTimeInSeconds +\n ' and will return to ' + currentTime);\n this.snapForwardTime_ = currentTime;\n this.video_.currentTime = previousAdBreak.startTimeInSeconds;\n }\n }\n\n /**\n * @private\n */\n onAdBreakEnded_() {\n const currentTime = this.video_.currentTime;\n // If the ad break was a result of snapping back (a user seeked over\n // an ad break and was returned to it), seek forward to the point,\n // originally chosen by the user.\n if (this.snapForwardTime_ && this.snapForwardTime_ > currentTime) {\n this.video_.currentTime = this.snapForwardTime_;\n }\n this.snapForwardTime_ = null;\n }\n\n /**\n * @private\n */\n onTimeupdate_() {\n if (!this.video_.duration) {\n // Can't play yet. Ignore.\n return;\n }\n if (!this.ad_ && !this.adBreaks_.length) {\n // No ads\n return;\n }\n const currentTime = this.video_.currentTime;\n let previousAd = false;\n if (this.ad_) {\n previousAd = true;\n goog.asserts.assert(this.mediaTailorAd_, 'Ad should be defined');\n this.sendInProgressEvents_(currentTime, this.mediaTailorAd_);\n const remainingTime = this.ad_.getRemainingTime();\n const duration = this.ad_.getDuration();\n if (this.ad_.canSkipNow() && remainingTime > 0 && duration > 0) {\n this.sendTrackingEvent_(\n shaka.ads.MediaTailorAdManager.SKIP_STATE_CHANGED_);\n }\n if (duration > 0 && (remainingTime <= 0 || remainingTime > duration)) {\n this.onEnded_();\n }\n }\n if (!this.ad_ || !this.ad_.isLinear()) {\n this.checkLinearAds_(currentTime);\n if (!this.ad_) {\n this.checkNonLinearAds_(currentTime);\n }\n if (previousAd && !this.ad_) {\n this.onAdBreakEnded_();\n }\n }\n }\n\n /**\n * @param {number} currentTime\n * @param {mediaTailor.Ad} ad\n * @private\n */\n sendInProgressEvents_(currentTime, ad) {\n const MediaTailorAdManager = shaka.ads.MediaTailorAdManager;\n const firstQuartileTime = ad.startTimeInSeconds +\n 0.25 * ad.durationInSeconds;\n const midpointTime = ad.startTimeInSeconds +\n 0.5 * ad.durationInSeconds;\n const thirdQuartileTime = ad.startTimeInSeconds +\n 0.75 * ad.durationInSeconds;\n if (currentTime >= firstQuartileTime &&\n !this.eventsSent.includes(MediaTailorAdManager.FIRSTQUARTILE_)) {\n this.eventsSent.push(MediaTailorAdManager.FIRSTQUARTILE_);\n this.sendTrackingEvent_(MediaTailorAdManager.FIRSTQUARTILE_);\n } else if (currentTime >= midpointTime &&\n !this.eventsSent.includes(MediaTailorAdManager.MIDPOINT_)) {\n this.eventsSent.push(MediaTailorAdManager.MIDPOINT_);\n this.sendTrackingEvent_(MediaTailorAdManager.MIDPOINT_);\n } else if (currentTime >= thirdQuartileTime &&\n !this.eventsSent.includes(MediaTailorAdManager.THIRDQUARTILE_)) {\n this.eventsSent.push(MediaTailorAdManager.THIRDQUARTILE_);\n this.sendTrackingEvent_(MediaTailorAdManager.THIRDQUARTILE_);\n }\n }\n\n /**\n * @param {number} currentTime\n * @private\n */\n checkLinearAds_(currentTime) {\n const MediaTailorAdManager = shaka.ads.MediaTailorAdManager;\n for (const adBreak of this.adBreaks_) {\n if (this.ad_ && this.ad_.isLinear()) {\n break;\n }\n for (let i = 0; i < adBreak.ads.length; i++) {\n const ad = adBreak.ads[i];\n const startTime = ad.startTimeInSeconds;\n const endTime = ad.startTimeInSeconds + ad.durationInSeconds;\n if (startTime <= currentTime && endTime > currentTime) {\n if (this.playedAds_.includes(ad.adId)) {\n if (this.video_.ended) {\n continue;\n }\n this.video_.currentTime = endTime;\n return;\n }\n this.onEnded_();\n this.mediaTailorAdBreak_ = adBreak;\n this.ad_ = new shaka.ads.MediaTailorAd(\n ad,\n /* adPosition= */ i + 1,\n /* totalAds= */ adBreak.ads.length,\n /* isLinear= */ true,\n this.video_);\n this.mediaTailorAd_ = ad;\n if (i === 0) {\n this.sendTrackingEvent_(MediaTailorAdManager.BREAK_START_);\n }\n this.setupCurrentAdListeners_();\n break;\n }\n }\n }\n }\n\n /**\n * @param {number} currentTime\n * @private\n */\n checkNonLinearAds_(currentTime) {\n const MediaTailorAdManager = shaka.ads.MediaTailorAdManager;\n for (const adBreak of this.adBreaks_) {\n if (this.ad_) {\n break;\n }\n for (let i = 0; i < adBreak.nonLinearAdsList.length; i++) {\n const ad = adBreak.nonLinearAdsList[i];\n if (!ad.nonLinearAdList.length) {\n continue;\n }\n const startTime = adBreak.startTimeInSeconds;\n const cacheKey = this.getCacheKeyForNonLinear_(ad.nonLinearAdList[0]);\n const staticResource = this.staticResources_.get(cacheKey);\n if (startTime <= currentTime &&\n staticResource && staticResource.length) {\n this.onEnded_();\n this.displayNonLinearAd_(staticResource);\n this.mediaTailorAdBreak_ = adBreak;\n this.ad_ = new shaka.ads.MediaTailorAd(\n ad,\n /* adPosition= */ i + 1,\n /* totalAds= */ adBreak.ads.length,\n /* isLinear= */ false,\n this.video_);\n this.mediaTailorAd_ = ad;\n if (i === 0) {\n this.sendTrackingEvent_(MediaTailorAdManager.BREAK_START_);\n }\n this.setupCurrentAdListeners_();\n break;\n }\n }\n }\n }\n\n /**\n * @param {!Array<mediaTailorExternalResource.App>} apps\n * @private\n */\n displayNonLinearAd_(apps) {\n for (const app of apps) {\n if (!app.data.source.length) {\n continue;\n }\n const imageElement = /** @type {!HTMLImageElement} */ (\n document.createElement('img'));\n imageElement.src = app.data.source[0].url;\n imageElement.style.top = (app.placeholder.top || 0) + '%';\n imageElement.style.height = (100 - (app.placeholder.top || 0)) + '%';\n imageElement.style.left = (app.placeholder.left || 0) + '%';\n imageElement.style.maxWidth = (100 - (app.placeholder.left || 0)) + '%';\n imageElement.style.objectFit = 'contain';\n imageElement.style.position = 'absolute';\n this.adContainer_.appendChild(imageElement);\n }\n }\n\n /**\n * @private\n */\n onEnded_() {\n if (this.ad_) {\n // Remove all child nodes\n while (this.adContainer_.lastChild) {\n this.adContainer_.removeChild(this.adContainer_.firstChild);\n }\n if (!this.isLive_) {\n this.playedAds_.push(this.mediaTailorAd_.adId);\n }\n this.removeCurrentAdListeners_(this.ad_.isSkipped());\n const position = this.ad_.getPositionInSequence();\n const totalAdsInBreak = this.ad_.getSequenceLength();\n if (position === totalAdsInBreak) {\n this.sendTrackingEvent_(shaka.ads.MediaTailorAdManager.BREAK_END_);\n }\n this.ad_ = null;\n this.mediaTailorAd_ = null;\n this.mediaTailorAdBreak_ = null;\n }\n }\n\n /**\n * @private\n */\n setupCurrentAdListeners_() {\n const MediaTailorAdManager = shaka.ads.MediaTailorAdManager;\n let needFirstEvents = false;\n if (!this.video_.paused) {\n this.sendTrackingEvent_(MediaTailorAdManager.IMPRESSION_);\n this.sendTrackingEvent_(MediaTailorAdManager.START_);\n } else {\n needFirstEvents = true;\n }\n this.adListeners_.push({\n target: this.video_,\n type: 'volumechange',\n listener: () => {\n if (this.video_.muted) {\n this.sendTrackingEvent_(MediaTailorAdManager.MUTE_);\n }\n },\n });\n this.adListeners_.push({\n target: this.video_,\n type: 'volumechange',\n listener: () => {\n if (!this.video_.muted) {\n this.sendTrackingEvent_(MediaTailorAdManager.UNMUTE_);\n }\n },\n });\n this.adListeners_.push({\n target: this.video_,\n type: 'play',\n listener: () => {\n if (needFirstEvents) {\n this.sendTrackingEvent_(MediaTailorAdManager.IMPRESSION_);\n this.sendTrackingEvent_(MediaTailorAdManager.START_);\n needFirstEvents = false;\n } else {\n this.sendTrackingEvent_(MediaTailorAdManager.RESUME_);\n }\n },\n });\n this.adListeners_.push({\n target: this.video_,\n type: 'pause',\n listener: () => {\n this.sendTrackingEvent_(MediaTailorAdManager.PAUSE_);\n },\n });\n for (const listener of this.adListeners_) {\n this.eventManager_.listen(\n listener.target, listener.type, listener.listener);\n }\n }\n\n /**\n * @param {boolean=} skipped\n * @private\n */\n removeCurrentAdListeners_(skipped = false) {\n if (skipped) {\n this.sendTrackingEvent_(shaka.ads.MediaTailorAdManager.SKIPPED_);\n } else {\n this.sendTrackingEvent_(shaka.ads.MediaTailorAdManager.COMPLETE_);\n }\n for (const listener of this.adListeners_) {\n this.eventManager_.unlisten(\n listener.target, listener.type, listener.listener);\n }\n this.adListeners_ = [];\n this.eventsSent = [];\n }\n\n /**\n * @param {string} eventType\n * @private\n */\n sendTrackingEvent_(eventType) {\n let trackingEvent = this.mediaTailorAd_.trackingEvents.find(\n (event) => event.eventType == eventType);\n if (!trackingEvent) {\n trackingEvent = this.mediaTailorAdBreak_.adBreakTrackingEvents.find(\n (event) => event.eventType == eventType);\n }\n if (trackingEvent) {\n const NetworkingEngine = shaka.net.NetworkingEngine;\n const type = NetworkingEngine.RequestType.ADS;\n const context = {\n type: NetworkingEngine.AdvancedRequestType.MEDIATAILOR_TRACKING_EVENT,\n };\n for (const beaconUrl of trackingEvent.beaconUrls) {\n if (!beaconUrl || beaconUrl == '') {\n continue;\n }\n const request = NetworkingEngine.makeRequest(\n [beaconUrl],\n NetworkingEngine.defaultRetryParameters());\n request.method = 'POST';\n this.networkingEngine_.request(type, request, context);\n }\n }\n switch (eventType) {\n case shaka.ads.MediaTailorAdManager.IMPRESSION_:\n this.onEvent_(\n new shaka.util.FakeEvent(shaka.ads.Utils.AD_IMPRESSION));\n break;\n case shaka.ads.MediaTailorAdManager.START_:\n this.onEvent_(\n new shaka.util.FakeEvent(shaka.ads.Utils.AD_STARTED,\n (new Map()).set('ad', this.ad_)));\n break;\n case shaka.ads.MediaTailorAdManager.MUTE_:\n this.onEvent_(\n new shaka.util.FakeEvent(shaka.ads.Utils.AD_MUTED));\n break;\n case shaka.ads.MediaTailorAdManager.UNMUTE_:\n this.onEvent_(\n new shaka.util.FakeEvent(shaka.ads.Utils.AD_VOLUME_CHANGED));\n break;\n case shaka.ads.MediaTailorAdManager.RESUME_:\n this.onEvent_(\n new shaka.util.FakeEvent(shaka.ads.Utils.AD_RESUMED));\n break;\n case shaka.ads.MediaTailorAdManager.PAUSE_:\n this.onEvent_(\n new shaka.util.FakeEvent(shaka.ads.Utils.AD_PAUSED));\n break;\n case shaka.ads.MediaTailorAdManager.FIRSTQUARTILE_:\n this.onEvent_(\n new shaka.util.FakeEvent(shaka.ads.Utils.AD_FIRST_QUARTILE));\n break;\n case shaka.ads.MediaTailorAdManager.MIDPOINT_:\n this.onEvent_(\n new shaka.util.FakeEvent(shaka.ads.Utils.AD_MIDPOINT));\n break;\n case shaka.ads.MediaTailorAdManager.THIRDQUARTILE_:\n this.onEvent_(\n new shaka.util.FakeEvent(shaka.ads.Utils.AD_THIRD_QUARTILE));\n break;\n case shaka.ads.MediaTailorAdManager.COMPLETE_:\n this.onEvent_(\n new shaka.util.FakeEvent(shaka.ads.Utils.AD_COMPLETE));\n this.onEvent_(\n new shaka.util.FakeEvent(shaka.ads.Utils.AD_STOPPED));\n break;\n case shaka.ads.MediaTailorAdManager.SKIPPED_:\n this.onEvent_(\n new shaka.util.FakeEvent(shaka.ads.Utils.AD_SKIPPED));\n this.onEvent_(\n new shaka.util.FakeEvent(shaka.ads.Utils.AD_STOPPED));\n break;\n case shaka.ads.MediaTailorAdManager.BREAK_START_:\n this.adContainer_.setAttribute('ad-active', 'true');\n break;\n case shaka.ads.MediaTailorAdManager.BREAK_END_:\n this.adContainer_.removeAttribute('ad-active');\n break;\n case shaka.ads.MediaTailorAdManager.SKIP_STATE_CHANGED_:\n this.onEvent_(\n new shaka.util.FakeEvent(\n shaka.ads.Utils.AD_SKIP_STATE_CHANGED));\n break;\n }\n }\n};\n\n\n/**\n * @const {string}\n * @private\n */\nshaka.ads.MediaTailorAdManager.IMPRESSION_ = 'impression';\n\n\n/**\n * @const {string}\n * @private\n */\nshaka.ads.MediaTailorAdManager.START_ = 'start';\n\n\n/**\n * @const {string}\n * @private\n */\nshaka.ads.MediaTailorAdManager.MUTE_ = 'mute';\n\n\n/**\n * @const {string}\n * @private\n */\nshaka.ads.MediaTailorAdManager.UNMUTE_ = 'unmute';\n\n\n/**\n * @const {string}\n * @private\n */\nshaka.ads.MediaTailorAdManager.RESUME_ = 'resume';\n\n\n/**\n * @const {string}\n * @private\n */\nshaka.ads.MediaTailorAdManager.PAUSE_ = 'pause';\n\n\n/**\n * @const {string}\n * @private\n */\nshaka.ads.MediaTailorAdManager.FIRSTQUARTILE_ = 'firstQuartile';\n\n\n/**\n * @const {string}\n * @private\n */\nshaka.ads.MediaTailorAdManager.MIDPOINT_ = 'midpoint';\n\n\n/**\n * @const {string}\n * @private\n */\nshaka.ads.MediaTailorAdManager.THIRDQUARTILE_ = 'thirdQuartile';\n\n\n/**\n * @const {string}\n * @private\n */\nshaka.ads.MediaTailorAdManager.COMPLETE_ = 'complete';\n\n\n/**\n * @const {string}\n * @private\n */\nshaka.ads.MediaTailorAdManager.SKIPPED_ = 'skip';\n\n\n/**\n * @const {string}\n * @private\n */\nshaka.ads.MediaTailorAdManager.BREAK_START_ = 'breakStart';\n\n\n/**\n * @const {string}\n * @private\n */\nshaka.ads.MediaTailorAdManager.BREAK_END_ = 'breakEnd';\n\n\n/**\n * @const {string}\n * @private\n */\nshaka.ads.MediaTailorAdManager.SKIP_STATE_CHANGED_ = 'skipStateChanged';\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\ngoog.provide('shaka.ads.ServerSideAd');\n\n/**\n * @implements {shaka.extern.IAd}\n * @export\n */\nshaka.ads.ServerSideAd = class {\n /**\n * @param {google.ima.dai.api.Ad} imaAd\n * @param {HTMLMediaElement} video\n */\n constructor(imaAd, video) {\n /** @private {google.ima.dai.api.Ad} */\n this.ad_ = imaAd;\n\n /** @private {?google.ima.dai.api.AdProgressData} */\n this.adProgressData_ = null;\n\n /** @private {HTMLMediaElement} */\n this.video_ = video;\n }\n\n\n /**\n * @param {google.ima.dai.api.AdProgressData} data\n */\n setProgressData(data) {\n this.adProgressData_ = data;\n }\n\n /**\n * @override\n * @export\n */\n needsSkipUI() {\n return true;\n }\n\n /**\n * @override\n * @export\n */\n isClientRendering() {\n return false;\n }\n\n /**\n * @override\n * @export\n */\n hasCustomClick() {\n return true;\n }\n\n /**\n * @override\n * @export\n */\n isUsingAnotherMediaElement() {\n return false;\n }\n\n /**\n * @override\n * @export\n */\n getDuration() {\n if (!this.adProgressData_) {\n // Unknown yet\n return -1;\n }\n return this.adProgressData_.duration;\n }\n\n /**\n * @override\n * @export\n */\n getMinSuggestedDuration() {\n return this.getDuration();\n }\n\n /**\n * @override\n * @export\n */\n getRemainingTime() {\n if (!this.adProgressData_) {\n // Unknown yet\n return -1;\n }\n\n return this.adProgressData_.duration - this.adProgressData_.currentTime;\n }\n\n /**\n * @override\n * @export\n */\n isPaused() {\n return this.video_.paused;\n }\n\n /**\n * @override\n * @export\n */\n isSkippable() {\n return this.ad_.isSkippable();\n }\n\n /**\n * @override\n * @export\n */\n getTimeUntilSkippable() {\n const skipOffset = this.ad_.getSkipTimeOffset();\n const canSkipIn = this.getRemainingTime() - skipOffset;\n return Math.max(canSkipIn, 0);\n }\n\n /**\n * @override\n * @export\n */\n canSkipNow() {\n return this.getTimeUntilSkippable() == 0;\n }\n\n /**\n * @override\n * @export\n */\n skip() {\n this.video_.currentTime += this.getRemainingTime();\n }\n\n /**\n * @override\n * @export\n */\n pause() {\n return this.video_.pause();\n }\n\n /**\n * @override\n * @export\n */\n play() {\n return this.video_.play();\n }\n\n\n /**\n * @override\n * @export\n */\n getVolume() {\n return this.video_.volume;\n }\n\n /**\n * @override\n * @export\n */\n setVolume(volume) {\n this.video_.volume = volume;\n }\n\n /**\n * @override\n * @export\n */\n isMuted() {\n return this.video_.muted;\n }\n\n /**\n * @override\n * @export\n */\n isLinear() {\n return true;\n }\n\n /**\n * @override\n * @export\n */\n resize(width, height) {\n // Nothing\n }\n\n /**\n * @override\n * @export\n */\n setMuted(muted) {\n this.video_.muted = muted;\n }\n\n\n /**\n * @override\n * @export\n */\n getSequenceLength() {\n const podInfo = this.ad_.getAdPodInfo();\n if (podInfo == null) {\n // No pod, just one ad.\n return 1;\n }\n\n return podInfo.getTotalAds();\n }\n\n /**\n * @override\n * @export\n */\n getPositionInSequence() {\n const podInfo = this.ad_.getAdPodInfo();\n if (podInfo == null) {\n // No pod, just one ad.\n return 1;\n }\n\n return podInfo.getAdPosition();\n }\n\n /**\n * @override\n * @export\n */\n getTitle() {\n return this.ad_.getTitle();\n }\n\n /**\n * @override\n * @export\n */\n getDescription() {\n return this.ad_.getDescription();\n }\n\n /**\n * @override\n * @export\n */\n getVastMediaBitrate() {\n return 0;\n }\n\n /**\n * @override\n * @export\n */\n getVastMediaHeight() {\n return this.ad_.getVastMediaHeight();\n }\n\n /**\n * @override\n * @export\n */\n getVastMediaWidth() {\n return this.ad_.getVastMediaWidth();\n }\n\n /**\n * @override\n * @export\n */\n getAdId() {\n return this.ad_.getAdId();\n }\n\n /**\n * @override\n * @export\n */\n getCreativeAdId() {\n return this.ad_.getCreativeAdId();\n }\n\n /**\n * @override\n * @export\n */\n getAdvertiserName() {\n return this.ad_.getAdvertiserName();\n }\n\n /**\n * @override\n * @export\n */\n getMediaUrl() {\n return null;\n }\n\n /**\n * @override\n * @export\n */\n getTimeOffset() {\n const podInfo = this.ad_.getAdPodInfo();\n if (podInfo == null) {\n // Defaults to 0 if this ad is not part of a pod, or the pod is not part\n // of an ad playlist.\n return 0;\n }\n\n return podInfo.getTimeOffset();\n }\n\n /**\n * @override\n * @export\n */\n getPodIndex() {\n const podInfo = this.ad_.getAdPodInfo();\n if (podInfo == null) {\n // Defaults to 0 if this ad is not part of a pod, or the pod is not part\n // of an ad playlist.\n return 0;\n }\n\n return podInfo.getPodIndex();\n }\n\n /**\n * @override\n * @export\n */\n release() {\n this.ad_ = null;\n this.adProgressData_ = null;\n this.video_ = null;\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\ngoog.provide('shaka.ads.ServerSideAdManager');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.ads.Utils');\ngoog.require('shaka.ads.ServerSideAd');\ngoog.require('shaka.log');\ngoog.require('shaka.util.EventManager');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.FakeEvent');\ngoog.require('shaka.util.IReleasable');\ngoog.require('shaka.util.PublicPromise');\n\n\n/**\n * A class responsible for server-side ad interactions.\n * @implements {shaka.util.IReleasable}\n */\nshaka.ads.ServerSideAdManager = class {\n /**\n * @param {HTMLElement} adContainer\n * @param {HTMLMediaElement} video\n * @param {string} locale\n * @param {function(!shaka.util.FakeEvent)} onEvent\n */\n constructor(adContainer, video, locale, onEvent) {\n /** @private {HTMLElement} */\n this.adContainer_ = adContainer;\n\n /** @private {HTMLMediaElement} */\n this.video_ = video;\n\n /** @private {?shaka.extern.AdsConfiguration} */\n this.config_ = null;\n\n /**\n * @private {?shaka.util.PublicPromise<string>}\n */\n this.streamPromise_ = null;\n\n /** @private {number} */\n this.streamRequestStartTime_ = NaN;\n\n /** @private {function(!shaka.util.FakeEvent)} */\n this.onEvent_ = onEvent;\n\n /** @private {boolean} */\n this.isLiveContent_ = false;\n\n /**\n * Time to seek to after an ad if that ad was played as the result of\n * snapback.\n * @private {?number}\n */\n this.snapForwardTime_ = null;\n\n /** @private {shaka.ads.ServerSideAd} */\n this.ad_ = null;\n\n /** @private {?google.ima.dai.api.AdProgressData} */\n this.adProgressData_ = null;\n\n /** @private {string} */\n this.backupUrl_ = '';\n\n /** @private {!Array<!shaka.extern.AdCuePoint>} */\n this.currentCuePoints_ = [];\n\n /** @private {shaka.util.EventManager} */\n this.eventManager_ = new shaka.util.EventManager();\n\n /** @private {google.ima.dai.api.UiSettings} */\n const uiSettings = new google.ima.dai.api.UiSettings();\n uiSettings.setLocale(locale);\n\n /** @private {google.ima.dai.api.StreamManager} */\n this.streamManager_ = new google.ima.dai.api.StreamManager(\n this.video_, this.adContainer_, uiSettings);\n\n this.onEvent_(new shaka.util.FakeEvent(\n shaka.ads.Utils.IMA_STREAM_MANAGER_LOADED,\n (new Map()).set('imaStreamManager', this.streamManager_)));\n\n // Events\n this.eventManager_.listen(this.streamManager_,\n google.ima.dai.api.StreamEvent.Type.LOADED, (e) => {\n shaka.log.info('Ad SS Loaded');\n this.onLoaded_(\n /** @type {!google.ima.dai.api.StreamEvent} */ (e));\n });\n\n this.eventManager_.listen(this.streamManager_,\n google.ima.dai.api.StreamEvent.Type.ERROR, () => {\n shaka.log.info('Ad SS Error');\n this.onError_();\n });\n\n this.eventManager_.listen(this.streamManager_,\n google.ima.dai.api.StreamEvent.Type.AD_BREAK_STARTED, () => {\n shaka.log.info('Ad Break Started');\n });\n\n this.eventManager_.listen(this.streamManager_,\n google.ima.dai.api.StreamEvent.Type.STARTED, (e) => {\n shaka.log.info('Ad Started');\n this.onAdStart_(/** @type {!google.ima.dai.api.StreamEvent} */ (e));\n });\n\n this.eventManager_.listen(this.streamManager_,\n google.ima.dai.api.StreamEvent.Type.AD_BREAK_ENDED, () => {\n shaka.log.info('Ad Break Ended');\n this.onAdBreakEnded_();\n });\n\n this.eventManager_.listen(this.streamManager_,\n google.ima.dai.api.StreamEvent.Type.AD_PROGRESS, (e) => {\n this.onAdProgress_(\n /** @type {!google.ima.dai.api.StreamEvent} */ (e));\n });\n\n this.eventManager_.listen(this.streamManager_,\n google.ima.dai.api.StreamEvent.Type.FIRST_QUARTILE, () => {\n shaka.log.info('Ad event: First Quartile');\n this.onEvent_(\n new shaka.util.FakeEvent(shaka.ads.Utils.AD_FIRST_QUARTILE));\n });\n\n this.eventManager_.listen(this.streamManager_,\n google.ima.dai.api.StreamEvent.Type.MIDPOINT, () => {\n shaka.log.info('Ad event: Midpoint');\n this.onEvent_(\n new shaka.util.FakeEvent(shaka.ads.Utils.AD_MIDPOINT));\n });\n\n this.eventManager_.listen(this.streamManager_,\n google.ima.dai.api.StreamEvent.Type.THIRD_QUARTILE, () => {\n shaka.log.info('Ad event: Third Quartile');\n this.onEvent_(\n new shaka.util.FakeEvent(shaka.ads.Utils.AD_THIRD_QUARTILE));\n });\n\n this.eventManager_.listen(this.streamManager_,\n google.ima.dai.api.StreamEvent.Type.COMPLETE, () => {\n shaka.log.info('Ad event: Complete');\n this.onEvent_(\n new shaka.util.FakeEvent(shaka.ads.Utils.AD_COMPLETE));\n this.onEvent_(\n new shaka.util.FakeEvent(shaka.ads.Utils.AD_STOPPED));\n this.adContainer_.removeAttribute('ad-active');\n this.ad_ = null;\n });\n\n this.eventManager_.listen(this.streamManager_,\n google.ima.dai.api.StreamEvent.Type.SKIPPED, () => {\n shaka.log.info('Ad event: Skipped');\n this.onEvent_(\n new shaka.util.FakeEvent(shaka.ads.Utils.AD_SKIPPED));\n this.onEvent_(\n new shaka.util.FakeEvent(shaka.ads.Utils.AD_STOPPED));\n });\n\n this.eventManager_.listen(this.streamManager_,\n google.ima.dai.api.StreamEvent.Type.CUEPOINTS_CHANGED, (e) => {\n shaka.log.info('Ad event: Cue points changed');\n this.onCuePointsChanged_(\n /** @type {!google.ima.dai.api.StreamEvent} */ (e));\n });\n }\n\n /**\n * Called by the AdManager to provide an updated configuration any time it\n * changes.\n *\n * @param {shaka.extern.AdsConfiguration} config\n */\n configure(config) {\n this.config_ = config;\n }\n\n /**\n * @param {!google.ima.dai.api.StreamRequest} streamRequest\n * @param {string=} backupUrl\n * @return {!Promise<string>}\n */\n streamRequest(streamRequest, backupUrl) {\n if (this.streamPromise_) {\n return Promise.reject(new shaka.util.Error(\n shaka.util.Error.Severity.RECOVERABLE,\n shaka.util.Error.Category.ADS,\n shaka.util.Error.Code.CURRENT_DAI_REQUEST_NOT_FINISHED));\n }\n if (streamRequest instanceof google.ima.dai.api.LiveStreamRequest) {\n this.isLiveContent_ = true;\n }\n\n this.streamPromise_ = new shaka.util.PublicPromise();\n this.streamManager_.requestStream(streamRequest);\n this.backupUrl_ = backupUrl || '';\n\n this.streamRequestStartTime_ = Date.now() / 1000;\n\n return this.streamPromise_;\n }\n\n /**\n * @param {Object} adTagParameters\n */\n replaceAdTagParameters(adTagParameters) {\n this.streamManager_.replaceAdTagParameters(adTagParameters);\n }\n\n /**\n * Resets the stream manager and removes any continuous polling.\n */\n stop() {\n // TODO:\n // For SS DAI streams, if a different asset gets unloaded as\n // part of the process\n // of loading a DAI asset, stream manager state gets reset and we\n // don't get any ad events.\n // We need to figure out if it makes sense to stop the SS\n // manager on unload, and, if it does, find\n // a way to do it safely.\n // this.streamManager_.reset();\n this.backupUrl_ = '';\n this.snapForwardTime_ = null;\n this.currentCuePoints_ = [];\n }\n\n /** @override */\n release() {\n this.stop();\n if (this.eventManager_) {\n this.eventManager_.release();\n }\n }\n\n /**\n * @param {string} type\n * @param {Uint8Array|string} data\n * Comes as string in DASH and as Uint8Array in HLS.\n * @param {number} timestamp (in seconds)\n */\n onTimedMetadata(type, data, timestamp) {\n this.streamManager_.processMetadata(type, data, timestamp);\n }\n\n /**\n * @param {shaka.extern.MetadataFrame} value\n */\n onCueMetadataChange(value) {\n // Native HLS over Safari/iOS/iPadOS\n // For live event streams, the stream needs some way of informing the SDK\n // that an ad break is coming up or ending. In the IMA DAI SDK, this is\n // done through timed metadata. Timed metadata is carried as part of the\n // DAI stream content and carries ad break timing information used by the\n // SDK to track ad breaks.\n if (value.key && value.data) {\n const metadata = {};\n metadata[value.key] = value.data;\n this.streamManager_.onTimedMetadata(metadata);\n }\n }\n\n /**\n * @return {!Array<!shaka.extern.AdCuePoint>}\n */\n getCuePoints() {\n return this.currentCuePoints_;\n }\n\n /**\n * If a seek jumped over the ad break, return to the start of the\n * ad break, then complete the seek after the ad played through.\n * @private\n */\n checkForSnapback_() {\n const currentTime = this.video_.currentTime;\n if (currentTime == 0) {\n return;\n }\n\n this.streamManager_.streamTimeForContentTime(currentTime);\n const previousCuePoint =\n this.streamManager_.previousCuePointForStreamTime(currentTime);\n // The cue point gets marked as 'played' as soon as the playhead hits it\n // (at the start of an ad), so when we come back to this method as a result\n // of seeking back to the user-selected time, the 'played' flag will be set.\n if (previousCuePoint && !previousCuePoint.played) {\n shaka.log.info('Seeking back to the start of the ad break at ' +\n previousCuePoint.start + ' and will return to ' + currentTime);\n this.snapForwardTime_ = currentTime;\n this.video_.currentTime = previousCuePoint.start;\n }\n }\n\n /**\n * @param {!google.ima.dai.api.StreamEvent} e\n * @private\n */\n onAdStart_(e) {\n goog.asserts.assert(this.streamManager_,\n 'Should have a stream manager at this point!');\n\n const imaAd = e.getAd();\n this.ad_ = new shaka.ads.ServerSideAd(imaAd, this.video_);\n\n // Ad object and ad progress data come from two different IMA events.\n // It's a race, and we don't know, which one will fire first - the\n // event that contains an ad object (AD_STARTED) or the one that\n // contains ad progress info (AD_PROGRESS).\n // If the progress event fired first, we must've saved the progress\n // info and can now add it to the ad object.\n if (this.adProgressData_) {\n this.ad_.setProgressData(this.adProgressData_);\n }\n\n this.onEvent_(new shaka.util.FakeEvent(shaka.ads.Utils.AD_STARTED,\n (new Map()).set('ad', this.ad_)));\n this.adContainer_.setAttribute('ad-active', 'true');\n }\n\n /**\n * @private\n */\n onAdBreakEnded_() {\n this.adContainer_.removeAttribute('ad-active');\n const currentTime = this.video_.currentTime;\n // If the ad break was a result of snapping back (a user seeked over\n // an ad break and was returned to it), seek forward to the point,\n // originally chosen by the user.\n if (this.snapForwardTime_ && this.snapForwardTime_ > currentTime) {\n this.video_.currentTime = this.snapForwardTime_;\n this.snapForwardTime_ = null;\n }\n }\n\n /**\n * @param {!google.ima.dai.api.StreamEvent} e\n * @private\n */\n onLoaded_(e) {\n const now = Date.now() / 1000;\n const loadTime = now - this.streamRequestStartTime_;\n this.onEvent_(new shaka.util.FakeEvent(shaka.ads.Utils.ADS_LOADED,\n (new Map()).set('loadTime', loadTime)));\n\n const streamData = e.getStreamData();\n const url = streamData.url;\n this.streamPromise_.resolve(url);\n this.streamPromise_ = null;\n\n if (!this.isLiveContent_) {\n this.eventManager_.listen(this.video_, 'seeked', () => {\n this.checkForSnapback_();\n });\n }\n }\n\n /**\n * @private\n */\n onError_() {\n if (!this.backupUrl_.length) {\n this.streamPromise_.reject('IMA Stream request returned an error ' +\n 'and there was no backup asset uri provided.');\n this.streamPromise_ = null;\n return;\n }\n\n shaka.log.warning('IMA stream request returned an error. ' +\n 'Falling back to the backup asset uri.');\n this.streamPromise_.resolve(this.backupUrl_);\n this.streamPromise_ = null;\n }\n\n\n /**\n * @param {!google.ima.dai.api.StreamEvent} e\n * @private\n */\n onAdProgress_(e) {\n const streamData = e.getStreamData();\n const adProgressData = streamData.adProgressData;\n this.adProgressData_ = adProgressData;\n if (this.ad_) {\n this.ad_.setProgressData(this.adProgressData_);\n }\n }\n\n\n /**\n * @param {!google.ima.dai.api.StreamEvent} e\n * @private\n */\n onCuePointsChanged_(e) {\n const streamData = e.getStreamData();\n\n /** @type {!Array<!shaka.extern.AdCuePoint>} */\n const cuePoints = [];\n for (const point of streamData.cuepoints) {\n /** @type {shaka.extern.AdCuePoint} */\n const shakaCuePoint = {\n start: point.start,\n end: point.end,\n };\n cuePoints.push(shakaCuePoint);\n }\n\n this.currentCuePoints_ = cuePoints;\n\n this.onEvent_(new shaka.util.FakeEvent(\n shaka.ads.Utils.CUEPOINTS_CHANGED,\n (new Map()).set('cuepoints', cuePoints)));\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\ngoog.provide('shaka.ads.AdManager');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.Deprecate');\ngoog.require('shaka.Player');\ngoog.require('shaka.ads.AdsStats');\ngoog.require('shaka.ads.ClientSideAdManager');\ngoog.require('shaka.ads.InterstitialAdManager');\ngoog.require('shaka.ads.MediaTailorAdManager');\ngoog.require('shaka.ads.Utils');\ngoog.require('shaka.ads.ServerSideAdManager');\ngoog.require('shaka.log');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.FakeEvent');\ngoog.require('shaka.util.FakeEventTarget');\ngoog.require('shaka.util.IReleasable');\ngoog.require('shaka.util.TXml');\n\n\n/**\n * @event shaka.ads.AdManager.AdsLoadedEvent\n * @description Fired when a sequence of ads has been loaded.\n * @property {string} type\n * 'ads-loaded'\n * @property {number} loadTime\n * The time it takes to load ads.\n * @exportDoc\n */\n\n/**\n * @event shaka.ads.AdManager.AdStartedEvent\n * @description Fired when an ad has started playing.\n * @property {string} type\n * 'ad-started'\n * @property {!shaka.extern.IAd} ad\n * The ad that has started playing.\n * @property {Object} sdkAdObject\n * The ad object in the SDK format, if there is one.\n * @property {Object} originalEvent\n * The native SDK event, if available.\n * @exportDoc\n */\n\n\n/**\n * @event shaka.ads.AdManager.AdCompleteEvent\n * @description Fired when an ad has played through.\n * @property {string} type\n * 'ad-complete'\n * @property {Object} originalEvent\n * The native SDK event, if available.\n * @exportDoc\n */\n\n\n/**\n * @event shaka.ads.AdManager.AdSkippedEvent\n * @description Fired when an ad has been skipped.\n * @property {string} type\n * 'ad-skipped'\n * @property {Object} originalEvent\n * The native SDK event, if available.\n * @exportDoc\n */\n\n\n/**\n * @event shaka.ads.AdManager.AdFirstQuartileEvent\n * @description Fired when an ad has played through the first 1/4.\n * @property {string} type\n * 'ad-first-quartile'\n * @property {Object} originalEvent\n * The native SDK event, if available.\n * @exportDoc\n */\n\n\n/**\n * @event shaka.ads.AdManager.AdMidpointEvent\n * @description Fired when an ad has played through its midpoint.\n * @property {string} type\n * 'ad-midpoint'\n * @property {Object} originalEvent\n * The native SDK event, if available.\n * @exportDoc\n */\n\n\n/**\n * @event shaka.ads.AdManager.AdThirdQuartileEvent\n * @description Fired when an ad has played through the third quartile.\n * @property {string} type\n * 'ad-third-quartile'\n * @property {Object} originalEvent\n * The native SDK event, if available.\n * @exportDoc\n */\n\n\n/**\n * @event shaka.ads.AdManager.AdStoppedEvent\n * @description Fired when an ad has stopped playing, was skipped,\n * or was unable to proceed due to an error.\n * @property {string} type\n * 'ad-stopped'\n * @property {Object} originalEvent\n * The native SDK event, if available.\n * @exportDoc\n */\n\n\n/**\n * @event shaka.ads.AdManager.AdVolumeChangedEvent\n * @description Fired when an ad's volume changed.\n * @property {string} type\n * 'ad-volume-changed'\n * @property {Object} originalEvent\n * The native SDK event, if available.\n * @exportDoc\n */\n\n\n/**\n * @event shaka.ads.AdManager.AdMutedEvent\n * @description Fired when an ad was muted.\n * @property {string} type\n * 'ad-muted'\n * @property {Object} originalEvent\n * The native SDK event, if available.\n * @exportDoc\n */\n\n\n/**\n * @event shaka.ads.AdManager.AdPausedEvent\n * @description Fired when an ad was paused.\n * @property {string} type\n * 'ad-paused'\n * @property {Object} originalEvent\n * The native SDK event, if available.\n * @exportDoc\n */\n\n\n/**\n * @event shaka.ads.AdManager.AdResumedEvent\n * @description Fired when an ad was resumed after a pause.\n * @property {string} type\n * 'ad-resumed'\n * @property {Object} originalEvent\n * The native SDK event, if available.\n * @exportDoc\n */\n\n\n/**\n * @event shaka.ads.AdManager.AdSkipStateChangedEvent\n * @description Fired when an ad's skip state changes (for example, when\n * it becomes possible to skip the ad).\n * @property {string} type\n * 'ad-skip-state-changed'\n * @property {Object} originalEvent\n * The native SDK event, if available.\n * @exportDoc\n */\n\n\n/**\n * @event shaka.ads.AdManager.AdCuePointsChangedEvent\n * @description Fired when the ad cue points change, signalling ad breaks\n * change.\n * @property {string} type\n * 'ad-cue-points-changed'\n * @property {!Array<!shaka.extern.AdCuePoint>} cuepoints\n * The ad cue points, if available.\n * @exportDoc\n */\n\n\n/**\n * @event shaka.ads.AdManager.AdProgressEvent\n * @description Fired when there is an update to the current ad's progress.\n * @property {string} type\n * 'ad-progress'\n * @property {Object} originalEvent\n * The native SDK event, if available.\n * @exportDoc\n */\n\n\n/**\n * @event shaka.ads.AdManager.AdBufferingEvent\n * @description Fired when the ad has stalled playback to buffer.\n * @property {string} type\n * 'ad-buffering'\n * @property {Object} originalEvent\n * The native SDK event, if available.\n * @exportDoc\n */\n\n\n/**\n * @event shaka.ads.AdManager.AdImpressionEvent\n * @description Fired when the impression URL has been pinged.\n * @property {string} type\n * 'ad-impression'\n * @property {Object} originalEvent\n * The native SDK event, if available.\n * @exportDoc\n */\n\n\n/**\n * @event shaka.ads.AdManager.AdClickEvent\n * @description Fired when the ad was clicked.\n * @property {string} type\n * 'ad-clicked'\n * @property {Object} originalEvent\n * The native SDK event, if available.\n * @exportDoc\n */\n\n\n/**\n * @event shaka.ads.AdManager.AdDurationChangedEvent\n * @description Fired when the ad's duration changes.\n * @property {string} type\n * 'ad-duration-changed'\n * @property {Object} originalEvent\n * The native SDK event, if available.\n * @exportDoc\n */\n\n\n/**\n * @event shaka.ads.AdManager.AdClosedEvent\n * @description Fired when the ad was closed by the user.\n * @property {string} type\n * 'ad-closed'\n * @property {Object} originalEvent\n * The native SDK event, if available.\n * @exportDoc\n */\n\n\n/**\n * @event shaka.ads.AdManager.AdLoadedEvent\n * @description Fired when the ad data becomes available.\n * @property {string} type\n * 'ad-loaded'\n * @property {Object} originalEvent\n * The native SDK event, if available.\n * @exportDoc\n */\n\n\n/**\n * @event shaka.ads.AdManager.AllAdsCompletedEvent\n * @description Fired when the ads manager is done playing all the ads.\n * @property {string} type\n * 'all-ads-completed'\n * @property {Object} originalEvent\n * The native SDK event, if available.\n * @exportDoc\n */\n\n\n/**\n * @event shaka.ads.AdManager.AdLinearChangedEvent\n * @description Fired when the displayed ad changes from\n * linear to nonlinear, or vice versa.\n * @property {string} type\n * 'ad-linear-changed'\n * @property {Object} originalEvent\n * The native SDK event, if available.\n * @exportDoc\n */\n\n\n/**\n * @event shaka.ads.AdManager.AdMetadataEvent\n * @description Fired when the ad's metadata becomes available.\n * @property {string} type\n * 'ad-metadata'\n * @property {Object} originalEvent\n * The native SDK event, if available.\n * @exportDoc\n */\n\n\n/**\n * @event shaka.ads.AdManager#AdBreakReadyEvent\n * @description Fired when the client-side SDK is ready to play a\n * VPAID ad or an ad rule.\n * @property {string} type\n * 'ad-break-ready'\n * @property {Object} originalEvent\n * The native SDK event, if available.\n * @exportDoc\n */\n\n\n/**\n * @event shaka.ads.AdManager.AdRecoverableErrorEvent\n * @description Fired when the a non-fatal error was encountered.\n * The presentation will continue with the same or next ad playback\n * depending on the error situation.\n * @property {string} type\n * 'ad-recoverable-error'\n * @property {Object} originalEvent\n * The native SDK event, if available.\n * @exportDoc\n */\n\n\n/**\n * @event shaka.ads.Utils.AD_ERROR\n * @description Fired when a fatal error is encountered.\n * @property {string} type\n * 'ad-error'\n * @property {Object} originalEvent\n * The native SDK event, if available.\n * @exportDoc\n */\n\n\n/**\n * @event shaka.ads.AdManager.AdInteractionEvent\n * @description Fired when an ad triggers the interaction callback.\n * @property {string} type\n * 'ad-interaction'\n * @property {Object} originalEvent\n * The native SDK event, if available.\n * @exportDoc\n */\n\n\n/**\n * @event shaka.ads.AdManager#ImaAdManagerLoadedEvent\n * @description Fired when the native IMA ad manager becomes available.\n * @property {string} type\n * 'ima-ad-manager-loaded'\n * @property {!Object} imaAdManager\n * The native IMA ad manager.\n * @exportDoc\n */\n\n\n/**\n * @event shaka.ads.AdManager#ImaStreamManagerLoadedEvent\n * @description Fired when the native IMA stream manager becomes available.\n * @property {string} type\n * 'ima-stream-manager-loaded'\n * @property {!Object} imaStreamManager\n * The native IMA stream manager.\n * @exportDoc\n */\n\n\n/**\n * @event shaka.ads.AdManager.AdClickedEvent\n * @description Fired when the ad was clicked.\n * @property {string} type\n * 'ad-clicked'\n * @exportDoc\n */\n\n\n/**\n * @event shaka.ads.AdManager.AdContentPauseRequestedEvent\n * @description Fired when the ad requires the main content to be paused.\n * Fired when the platform does not support multiple media elements.\n * @property {string} type\n * 'ad-content-pause-requested'\n * @property {?boolean} saveLivePosition\n * Indicates whether the live position has to be saved or not.\n * @exportDoc\n */\n\n\n/**\n * @event shaka.ads.AdManager.AdContentResumeRequestedEvent\n * @description Fired when the ad requires the main content to be resumed.\n * Fired when the platform does not support multiple media elements.\n * @property {string} type\n * 'ad-content-resume-requested'\n * @property {?number} offset\n * Indicates the offset that should be applied to the previously saved time.\n * @exportDoc\n */\n\n\n/**\n * @event shaka.ads.AdManager.AdContentResumeRequestedEvent\n * @description Fired when the ad requires the video of the main content to be\n * attached.\n * @property {string} type\n * 'ad-content-attach-requested'\n * @exportDoc\n */\n\n\n/**\n * A class responsible for ad-related interactions.\n * @implements {shaka.extern.IAdManager}\n * @implements {shaka.util.IReleasable}\n * @export\n */\nshaka.ads.AdManager = class extends shaka.util.FakeEventTarget {\n /** */\n constructor() {\n super();\n /** @private {shaka.ads.InterstitialAdManager} */\n this.interstitialAdManager_ = null;\n /** @private {shaka.ads.ClientSideAdManager} */\n this.csAdManager_ = null;\n /** @private {shaka.ads.MediaTailorAdManager} */\n this.mtAdManager_ = null;\n /** @private {shaka.ads.ServerSideAdManager} */\n this.ssAdManager_ = null;\n /** @private {shaka.ads.AdsStats} */\n this.stats_ = new shaka.ads.AdsStats();\n /** @private {string} locale */\n this.locale_ = navigator.language;\n /** @private {?shaka.extern.AdsConfiguration} */\n this.config_ = null;\n }\n\n\n /**\n * @override\n * @export\n */\n setLocale(locale) {\n this.locale_ = locale;\n }\n\n\n /**\n * @override\n * @export\n */\n configure(config) {\n this.config_ = config;\n if (this.interstitialAdManager_) {\n this.interstitialAdManager_.configure(this.config_);\n }\n if (this.csAdManager_) {\n this.csAdManager_.configure(this.config_);\n }\n if (this.ssAdManager_) {\n this.ssAdManager_.configure(this.config_);\n }\n }\n\n\n /**\n * @override\n * @export\n */\n initInterstitial(adContainer, basePlayer, baseVideo) {\n if (!adContainer) {\n shaka.log.info('Initializing interstitials without ad container');\n }\n if (this.interstitialAdManager_) {\n this.interstitialAdManager_.release();\n }\n this.interstitialAdManager_ = new shaka.ads.InterstitialAdManager(\n adContainer, basePlayer, baseVideo,\n (e) => this.processAndDispatchEvent_(e));\n\n goog.asserts.assert(this.config_, 'Config must not be null!');\n this.interstitialAdManager_.configure(this.config_);\n }\n\n\n /**\n * @override\n * @export\n */\n initClientSide(adContainer, video, adsRenderingSettings) {\n // Check that Client Side IMA SDK has been included\n // NOTE: (window['google'] && google.ima) check for any\n // IMA SDK, including SDK for Server Side ads.\n // The 3rd check insures we have the right SDK:\n // {google.ima.AdsLoader} is an object that's part of CS IMA SDK\n // but not SS SDK.\n if (!window['google'] || !google.ima || !google.ima.AdsLoader) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.ADS,\n shaka.util.Error.Code.CS_IMA_SDK_MISSING);\n }\n\n if (this.csAdManager_) {\n this.csAdManager_.release();\n }\n\n this.csAdManager_ = new shaka.ads.ClientSideAdManager(\n adContainer, video, this.locale_, adsRenderingSettings,\n (e) => this.processAndDispatchEvent_(e));\n\n goog.asserts.assert(this.config_, 'Config must not be null!');\n this.csAdManager_.configure(this.config_);\n }\n\n\n /**\n * @override\n * @export\n */\n release() {\n if (this.interstitialAdManager_) {\n this.interstitialAdManager_.release();\n this.interstitialAdManager_ = null;\n }\n if (this.csAdManager_) {\n this.csAdManager_.release();\n this.csAdManager_ = null;\n }\n if (this.mtAdManager_) {\n this.mtAdManager_.release();\n this.mtAdManager_ = null;\n }\n if (this.ssAdManager_) {\n this.ssAdManager_.release();\n this.ssAdManager_ = null;\n }\n super.release();\n }\n\n\n /**\n * @override\n * @export\n */\n onAssetUnload() {\n if (this.interstitialAdManager_) {\n this.interstitialAdManager_.stop();\n }\n if (this.csAdManager_) {\n this.csAdManager_.stop();\n }\n if (this.mtAdManager_) {\n this.mtAdManager_.stop();\n }\n if (this.ssAdManager_) {\n this.ssAdManager_.stop();\n }\n\n this.dispatchEvent(\n new shaka.util.FakeEvent(shaka.ads.Utils.AD_STOPPED));\n this.dispatchEvent(new shaka.util.FakeEvent(\n shaka.ads.Utils.AD_CONTENT_ATTACH_REQUESTED));\n\n this.stats_ = new shaka.ads.AdsStats();\n }\n\n\n /**\n * @override\n * @export\n */\n requestClientSideAds(imaRequest) {\n if (!this.csAdManager_) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.RECOVERABLE,\n shaka.util.Error.Category.ADS,\n shaka.util.Error.Code.CS_AD_MANAGER_NOT_INITIALIZED);\n }\n\n this.csAdManager_.requestAds(imaRequest);\n }\n\n\n /**\n * @override\n * @export\n */\n updateClientSideAdsRenderingSettings(adsRenderingSettings) {\n if (!this.csAdManager_) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.RECOVERABLE,\n shaka.util.Error.Category.ADS,\n shaka.util.Error.Code.CS_AD_MANAGER_NOT_INITIALIZED);\n }\n\n this.csAdManager_.updateAdsRenderingSettings(adsRenderingSettings);\n }\n\n\n /**\n * @override\n * @export\n */\n initMediaTailor(adContainer, networkingEngine, video) {\n if (this.mtAdManager_) {\n this.mtAdManager_.release();\n }\n\n this.mtAdManager_ = new shaka.ads.MediaTailorAdManager(\n adContainer, networkingEngine, video,\n (e) => this.processAndDispatchEvent_(e));\n }\n\n\n /**\n * @param {string} url\n * @param {Object} adsParams\n * @param {string=} backupUrl\n * @return {!Promise<string>}\n * @override\n * @export\n */\n requestMediaTailorStream(url, adsParams, backupUrl = '') {\n if (!this.mtAdManager_) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.RECOVERABLE,\n shaka.util.Error.Category.ADS,\n shaka.util.Error.Code.MT_AD_MANAGER_NOT_INITIALIZED);\n }\n\n return this.mtAdManager_.streamRequest(url, adsParams, backupUrl);\n }\n\n\n /**\n * @param {string} url\n * @override\n * @export\n */\n addMediaTailorTrackingUrl(url) {\n if (!this.mtAdManager_) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.RECOVERABLE,\n shaka.util.Error.Category.ADS,\n shaka.util.Error.Code.MT_AD_MANAGER_NOT_INITIALIZED);\n }\n\n this.mtAdManager_.addTrackingUrl(url);\n }\n\n\n /**\n * @override\n * @export\n */\n initServerSide(adContainer, video) {\n // Check that Client Side IMA SDK has been included\n // NOTE: (window['google'] && google.ima) check for any\n // IMA SDK, including SDK for Server Side ads.\n // The 3rd check insures we have the right SDK:\n // {google.ima.dai} is an object that's part of DAI IMA SDK\n // but not SS SDK.\n if (!window['google'] || !google.ima || !google.ima.dai) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.ADS,\n shaka.util.Error.Code.SS_IMA_SDK_MISSING);\n }\n\n if (this.ssAdManager_) {\n this.ssAdManager_.release();\n }\n\n this.ssAdManager_ = new shaka.ads.ServerSideAdManager(\n adContainer, video, this.locale_,\n (e) => this.processAndDispatchEvent_(e));\n\n goog.asserts.assert(this.config_, 'Config must not be null!');\n this.ssAdManager_.configure(this.config_);\n }\n\n\n /**\n * @param {!google.ima.dai.api.StreamRequest} imaRequest\n * @param {string=} backupUrl\n * @return {!Promise<string>}\n * @override\n * @export\n */\n requestServerSideStream(imaRequest, backupUrl = '') {\n if (!this.ssAdManager_) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.RECOVERABLE,\n shaka.util.Error.Category.ADS,\n shaka.util.Error.Code.SS_AD_MANAGER_NOT_INITIALIZED);\n }\n\n if (!imaRequest.adTagParameters) {\n imaRequest.adTagParameters = {};\n }\n const adTagParams = imaRequest.adTagParameters;\n\n if (adTagParams['mpt'] || adTagParams['mpv']) {\n shaka.log.alwaysWarn('You have attempted to set \"mpt\" and/or \"mpv\" ' +\n 'parameters of the ad tag. Please note that those parameters are ' +\n 'used for Shaka adoption tracking and will be overridden.');\n }\n\n // Set player and version parameters for tracking\n imaRequest.adTagParameters['mpt'] = 'shaka-player';\n imaRequest.adTagParameters['mpv'] = shaka.Player.version;\n return this.ssAdManager_.streamRequest(imaRequest, backupUrl);\n }\n\n\n /**\n * @override\n * @export\n */\n replaceServerSideAdTagParameters(adTagParameters) {\n if (!this.ssAdManager_) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.RECOVERABLE,\n shaka.util.Error.Category.ADS,\n shaka.util.Error.Code.SS_AD_MANAGER_NOT_INITIALIZED);\n }\n\n if (adTagParameters['mpt'] || adTagParameters['mpv']) {\n shaka.log.alwaysWarn('You have attempted to set \"mpt\" and/or \"mpv\" ' +\n 'parameters of the ad tag. Please note that those parameters are ' +\n 'used for Shaka adoption tracking and will be overridden.');\n }\n\n adTagParameters['mpt'] = 'Shaka Player';\n adTagParameters['mpv'] = shaka.Player.version;\n\n this.ssAdManager_.replaceAdTagParameters(adTagParameters);\n }\n\n\n /**\n * @return {!Array<!shaka.extern.AdCuePoint>}\n * @override\n * @export\n */\n getServerSideCuePoints() {\n shaka.Deprecate.deprecateFeature(5,\n 'AdManager.getServerSideCuePoints',\n 'Please use getCuePoints function.');\n return this.getCuePoints();\n }\n\n\n /**\n * @return {!Array<!shaka.extern.AdCuePoint>}\n * @override\n * @export\n */\n getCuePoints() {\n let cuepoints = [];\n if (this.ssAdManager_) {\n cuepoints = cuepoints.concat(this.ssAdManager_.getCuePoints());\n }\n if (this.mtAdManager_) {\n cuepoints = cuepoints.concat(this.mtAdManager_.getCuePoints());\n }\n return cuepoints;\n }\n\n\n /**\n * @return {shaka.extern.AdsStats}\n * @override\n * @export\n */\n getStats() {\n return this.stats_.getBlob();\n }\n\n /**\n * @override\n * @export\n */\n onManifestUpdated(isLive) {\n if (this.mtAdManager_) {\n this.mtAdManager_.onManifestUpdated(isLive);\n }\n }\n\n /**\n * @override\n * @export\n */\n onDashTimedMetadata(region) {\n if (this.ssAdManager_ && region.schemeIdUri == 'urn:google:dai:2018') {\n const type = region.schemeIdUri;\n const data = region.eventNode ?\n region.eventNode.attributes['messageData'] : null;\n const timestamp = region.startTime;\n this.ssAdManager_.onTimedMetadata(type, data, timestamp);\n }\n }\n\n /**\n * @override\n * @export\n */\n onHlsTimedMetadata(metadata, timestamp) {\n if (this.ssAdManager_) {\n this.ssAdManager_.onTimedMetadata('ID3', metadata['data'], timestamp);\n }\n }\n\n /**\n * @override\n * @export\n */\n onCueMetadataChange(value) {\n if (this.ssAdManager_) {\n this.ssAdManager_.onCueMetadataChange(value);\n }\n }\n\n /**\n * @override\n * @export\n */\n onHLSInterstitialMetadata(basePlayer, baseVideo, interstitial) {\n if (this.config_ && this.config_.disableHLSInterstitial) {\n return;\n }\n if (!this.interstitialAdManager_) {\n this.initInterstitial(/* adContainer= */ null, basePlayer, baseVideo);\n }\n if (this.interstitialAdManager_) {\n this.interstitialAdManager_.addMetadata(interstitial);\n }\n }\n\n /**\n * @override\n * @export\n */\n onDASHInterstitialMetadata(basePlayer, baseVideo, region) {\n if (this.config_ && this.config_.disableDASHInterstitial) {\n return;\n }\n const schemeIdUri = region.schemeIdUri;\n if (schemeIdUri == 'urn:mpeg:dash:event:alternativeMPD:insert:2025' ||\n schemeIdUri == 'urn:mpeg:dash:event:alternativeMPD:replace:2025') {\n if (!this.interstitialAdManager_) {\n this.initInterstitial(/* adContainer= */ null, basePlayer, baseVideo);\n }\n if (this.interstitialAdManager_) {\n this.interstitialAdManager_.addRegion(region);\n }\n } else if ((schemeIdUri == 'urn:mpeg:dash:event:2012' ||\n schemeIdUri == 'urn:scte:dash:scte214-events') &&\n region.eventNode &&\n shaka.util.TXml.findChild(region.eventNode, 'OverlayEvent')) {\n if (!this.interstitialAdManager_) {\n this.initInterstitial(/* adContainer= */ null, basePlayer, baseVideo);\n }\n if (this.interstitialAdManager_) {\n this.interstitialAdManager_.addOverlayRegion(region);\n }\n }\n }\n\n /**\n * @override\n * @export\n */\n addCustomInterstitial(interstitial) {\n if (!this.interstitialAdManager_) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.RECOVERABLE,\n shaka.util.Error.Category.ADS,\n shaka.util.Error.Code.INTERSTITIAL_AD_MANAGER_NOT_INITIALIZED);\n }\n this.interstitialAdManager_.addInterstitials([interstitial]);\n }\n\n /**\n * @override\n * @export\n */\n addAdUrlInterstitial(url) {\n if (!this.interstitialAdManager_) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.RECOVERABLE,\n shaka.util.Error.Category.ADS,\n shaka.util.Error.Code.INTERSTITIAL_AD_MANAGER_NOT_INITIALIZED);\n }\n return this.interstitialAdManager_.addAdUrlInterstitial(url);\n }\n\n /**\n * @override\n * @export\n */\n getInterstitialPlayer() {\n if (!this.interstitialAdManager_) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.RECOVERABLE,\n shaka.util.Error.Category.ADS,\n shaka.util.Error.Code.INTERSTITIAL_AD_MANAGER_NOT_INITIALIZED);\n }\n return this.interstitialAdManager_.getPlayer();\n }\n\n /**\n * @param {!shaka.util.FakeEvent} event\n * @private\n */\n processAndDispatchEvent_(event) {\n if (event && event.type) {\n switch (event.type) {\n case shaka.ads.Utils.ADS_LOADED: {\n const loadTime = (/** @type {!Object} */ (event))['loadTime'];\n this.stats_.addLoadTime(loadTime);\n break;\n }\n case shaka.ads.Utils.AD_STARTED: {\n this.stats_.incrementStarted();\n const ad = (/** @type {!Object} */ (event))['ad'];\n if (ad && !ad.isLinear()) {\n this.stats_.incrementOverlayAds();\n }\n break;\n }\n case shaka.ads.Utils.AD_COMPLETE:\n this.stats_.incrementPlayedCompletely();\n break;\n case shaka.ads.Utils.AD_SKIPPED:\n this.stats_.incrementSkipped();\n break;\n case shaka.ads.Utils.AD_ERROR:\n this.stats_.incrementErrors();\n break;\n }\n }\n this.dispatchEvent(event);\n }\n};\n\n/**\n * The event name for when a sequence of ads has been loaded.\n *\n * Deprecated, please use {@link shaka.ads.Utils}\n *\n * @const {string}\n * @export\n * @deprecated\n */\nshaka.ads.AdManager.ADS_LOADED = 'ads-loaded';\n\n/**\n * The event name for when an ad has started playing.\n *\n * Deprecated, please use {@link shaka.ads.Utils}\n *\n * @const {string}\n * @export\n * @deprecated\n */\nshaka.ads.AdManager.AD_STARTED = 'ad-started';\n\n\n/**\n * The event name for when an ad playhead crosses first quartile.\n *\n * Deprecated, please use {@link shaka.ads.Utils}\n *\n * @const {string}\n * @export\n * @deprecated\n */\nshaka.ads.AdManager.AD_FIRST_QUARTILE = 'ad-first-quartile';\n\n\n/**\n * The event name for when an ad playhead crosses midpoint.\n *\n * Deprecated, please use {@link shaka.ads.Utils}\n *\n * @const {string}\n * @export\n * @deprecated\n */\nshaka.ads.AdManager.AD_MIDPOINT = 'ad-midpoint';\n\n\n/**\n * The event name for when an ad playhead crosses third quartile.\n *\n * Deprecated, please use {@link shaka.ads.Utils}\n *\n * @const {string}\n * @export\n * @deprecated\n */\nshaka.ads.AdManager.AD_THIRD_QUARTILE = 'ad-third-quartile';\n\n\n/**\n * The event name for when an ad has completed playing.\n *\n * Deprecated, please use {@link shaka.ads.Utils}\n *\n * @const {string}\n * @export\n * @deprecated\n */\nshaka.ads.AdManager.AD_COMPLETE = 'ad-complete';\n\n\n/**\n * The event name for when an ad has finished playing\n * (played all the way through, was skipped, or was unable to proceed\n * due to an error).\n *\n * Deprecated, please use {@link shaka.ads.Utils}\n *\n * @const {string}\n * @export\n * @deprecated\n */\nshaka.ads.AdManager.AD_STOPPED = 'ad-stopped';\n\n\n/**\n * The event name for when an ad is skipped by the user.\n *\n * Deprecated, please use {@link shaka.ads.Utils}\n *\n * @const {string}\n * @export\n * @deprecated\n */\nshaka.ads.AdManager.AD_SKIPPED = 'ad-skipped';\n\n\n/**\n * The event name for when the ad volume has changed.\n *\n * Deprecated, please use {@link shaka.ads.Utils}\n *\n * @const {string}\n * @export\n * @deprecated\n */\nshaka.ads.AdManager.AD_VOLUME_CHANGED = 'ad-volume-changed';\n\n\n/**\n * The event name for when the ad was muted.\n *\n * Deprecated, please use {@link shaka.ads.Utils}\n *\n * @const {string}\n * @export\n * @deprecated\n */\nshaka.ads.AdManager.AD_MUTED = 'ad-muted';\n\n\n/**\n * The event name for when the ad was paused.\n *\n * Deprecated, please use {@link shaka.ads.Utils}\n *\n * @const {string}\n * @export\n * @deprecated\n */\nshaka.ads.AdManager.AD_PAUSED = 'ad-paused';\n\n\n/**\n * The event name for when the ad was resumed after a pause.\n *\n * Deprecated, please use {@link shaka.ads.Utils}\n *\n * @const {string}\n * @export\n * @deprecated\n */\nshaka.ads.AdManager.AD_RESUMED = 'ad-resumed';\n\n\n/**\n * The event name for when the ad's skip status changes\n * (usually it becomes skippable when it wasn't before).\n *\n * Deprecated, please use {@link shaka.ads.Utils}\n *\n * @const {string}\n * @export\n * @deprecated\n */\nshaka.ads.AdManager.AD_SKIP_STATE_CHANGED = 'ad-skip-state-changed';\n\n\n/**\n * The event name for when the ad's cue points (start/end markers)\n * have changed.\n *\n * Deprecated, please use {@link shaka.ads.Utils}\n *\n * @const {string}\n * @export\n * @deprecated\n */\nshaka.ads.AdManager.CUEPOINTS_CHANGED = 'ad-cue-points-changed';\n\n\n/**\n * The event name for when the native IMA ad manager object has\n * loaded and become available.\n *\n * Deprecated, please use {@link shaka.ads.Utils}\n *\n * @const {string}\n * @export\n * @deprecated\n */\nshaka.ads.AdManager.IMA_AD_MANAGER_LOADED = 'ima-ad-manager-loaded';\n\n\n/**\n * The event name for when the native IMA stream manager object has\n * loaded and become available.\n *\n * Deprecated, please use {@link shaka.ads.Utils}\n *\n * @const {string}\n * @export\n * @deprecated\n */\nshaka.ads.AdManager.IMA_STREAM_MANAGER_LOADED = 'ima-stream-manager-loaded';\n\n\n/**\n * The event name for when the ad was clicked.\n *\n * Deprecated, please use {@link shaka.ads.Utils}\n *\n * @const {string}\n * @export\n * @deprecated\n */\nshaka.ads.AdManager.AD_CLICKED = 'ad-clicked';\n\n\n/**\n * The event name for when there is an update to the current ad's progress.\n *\n * Deprecated, please use {@link shaka.ads.Utils}\n *\n * @const {string}\n * @export\n * @deprecated\n */\nshaka.ads.AdManager.AD_PROGRESS = 'ad-progress';\n\n\n/**\n * The event name for when the ad is buffering.\n *\n * Deprecated, please use {@link shaka.ads.Utils}\n *\n * @const {string}\n * @export\n * @deprecated\n */\nshaka.ads.AdManager.AD_BUFFERING = 'ad-buffering';\n\n\n/**\n * The event name for when the ad's URL was hit.\n *\n * Deprecated, please use {@link shaka.ads.Utils}\n *\n * @const {string}\n * @export\n * @deprecated\n */\nshaka.ads.AdManager.AD_IMPRESSION = 'ad-impression';\n\n\n/**\n * The event name for when the ad's duration changed.\n *\n * Deprecated, please use {@link shaka.ads.Utils}\n *\n * @const {string}\n * @export\n * @deprecated\n */\nshaka.ads.AdManager.AD_DURATION_CHANGED = 'ad-duration-changed';\n\n\n/**\n * The event name for when the ad was closed by the user.\n *\n * Deprecated, please use {@link shaka.ads.Utils}\n *\n * @const {string}\n * @export\n * @deprecated\n */\nshaka.ads.AdManager.AD_CLOSED = 'ad-closed';\n\n\n/**\n * The event name for when the ad data becomes available.\n *\n * Deprecated, please use {@link shaka.ads.Utils}\n *\n * @const {string}\n * @export\n * @deprecated\n */\nshaka.ads.AdManager.AD_LOADED = 'ad-loaded';\n\n\n/**\n * The event name for when all the ads were completed.\n *\n * Deprecated, please use {@link shaka.ads.Utils}\n *\n * @const {string}\n * @export\n * @deprecated\n */\nshaka.ads.AdManager.ALL_ADS_COMPLETED = 'all-ads-completed';\n\n\n/**\n * The event name for when the ad changes from or to linear.\n *\n * Deprecated, please use {@link shaka.ads.Utils}\n *\n * @const {string}\n * @export\n * @deprecated\n */\nshaka.ads.AdManager.AD_LINEAR_CHANGED = 'ad-linear-changed';\n\n\n/**\n * The event name for when the ad's metadata becomes available.\n *\n * Deprecated, please use {@link shaka.ads.Utils}\n *\n * @const {string}\n * @export\n * @deprecated\n */\nshaka.ads.AdManager.AD_METADATA = 'ad-metadata';\n\n\n/**\n * The event name for when the ad display encountered a recoverable\n * error.\n *\n * Deprecated, please use {@link shaka.ads.Utils}\n *\n * @const {string}\n * @export\n * @deprecated\n */\nshaka.ads.AdManager.AD_RECOVERABLE_ERROR = 'ad-recoverable-error';\n\n/**\n * The event name for when the ad manager dispatch errors.\n *\n * Deprecated, please use {@link shaka.ads.Utils}\n *\n * @const {string}\n * @export\n * @deprecated\n */\nshaka.ads.AdManager.AD_ERROR = 'ad-error';\n\n/**\n * The event name for when the client side SDK signalled its readiness\n * to play a VPAID ad or an ad rule.\n *\n * Deprecated, please use {@link shaka.ads.Utils}\n *\n * @const {string}\n * @export\n * @deprecated\n */\nshaka.ads.AdManager.AD_BREAK_READY = 'ad-break-ready';\n\n\n/**\n * The event name for when the interaction callback for the ad was\n * triggered.\n *\n * Deprecated, please use {@link shaka.ads.Utils}\n *\n * @const {string}\n * @export\n * @deprecated\n */\nshaka.ads.AdManager.AD_INTERACTION = 'ad-interaction';\n\n\n/**\n * The name of the event for when an ad requires the main content to be paused.\n * Fired when the platform does not support multiple media elements.\n *\n * Deprecated, please use {@link shaka.ads.Utils}\n *\n * @const {string}\n * @export\n * @deprecated\n */\nshaka.ads.AdManager.AD_CONTENT_PAUSE_REQUESTED = 'ad-content-pause-requested';\n\n\n/**\n * The name of the event for when an ad requires the main content to be resumed.\n * Fired when the platform does not support multiple media elements.\n *\n * Deprecated, please use {@link shaka.ads.Utils}\n *\n * @const {string}\n * @export\n * @deprecated\n */\nshaka.ads.AdManager.AD_CONTENT_RESUME_REQUESTED = 'ad-content-resume-requested';\n\n\n/**\n * The name of the event for when an ad requires the video of the main content\n * to be attached.\n *\n * Deprecated, please use {@link shaka.ads.Utils}\n *\n * @const {string}\n * @export\n * @deprecated\n */\nshaka.ads.AdManager.AD_CONTENT_ATTACH_REQUESTED = 'ad-content-attach-requested';\n\n\n/**\n * Set this is a default ad manager for the player.\n * Apps can also set their own ad manager, if they'd like.\n */\nshaka.Player.setAdManagerFactory(() => new shaka.ads.AdManager());\n\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.cast.CastUtils');\n\ngoog.require('shaka.media.TimeRangesUtils');\ngoog.require('shaka.util.FakeEvent');\n\n\n/**\n * @summary A set of cast utility functions and variables shared between sender\n * and receiver.\n */\nshaka.cast.CastUtils = class {\n /**\n * Serialize as JSON, but specially encode things JSON will not otherwise\n * represent.\n * @param {?} thing\n * @return {string}\n */\n static serialize(thing) {\n return JSON.stringify(thing, (key, value) => {\n if (typeof value == 'function') {\n // Functions can't be (safely) serialized.\n return undefined;\n }\n\n if (value instanceof Event || value instanceof shaka.util.FakeEvent) {\n // Events don't serialize to JSON well because of the DOM objects\n // and other complex objects they contain, so we strip these out.\n // Note that using Object.keys or JSON.stringify directly on the event\n // will not capture its properties. We must use a for loop.\n const simpleEvent = {};\n for (const eventKey in value) {\n const eventValue = value[eventKey];\n if (eventValue && typeof eventValue == 'object') {\n if (eventKey == 'detail') {\n // Keep the detail value, because it contains important\n // information for diagnosing errors.\n simpleEvent[eventKey] = eventValue;\n }\n // Strip out non-null object types because they are complex and we\n // don't need them.\n } else if (eventKey in Event) {\n // Strip out keys that are found on Event itself because they are\n // class-level constants we don't need, like Event.MOUSEMOVE == 16.\n } else {\n simpleEvent[eventKey] = eventValue;\n }\n }\n return simpleEvent;\n }\n\n if (value instanceof Error) {\n // Errors don't serialize to JSON well, either. TypeError, for example,\n // turns in \"{}\", leading to messages like \"Error UNKNOWN.UNKNOWN\" when\n // deserialized on the sender and displayed in the demo app.\n return shaka.cast.CastUtils.unpackError_(value);\n }\n\n if (value instanceof TimeRanges) {\n // TimeRanges must be unpacked into plain data for serialization.\n return shaka.cast.CastUtils.unpackTimeRanges_(value);\n }\n\n if (ArrayBuffer.isView(value) &&\n /** @type {TypedArray} */(value).BYTES_PER_ELEMENT === 1) {\n // Some of our code cares about Uint8Arrays actually being Uint8Arrays,\n // so this gives them special treatment.\n return shaka.cast.CastUtils.unpackUint8Array_(\n /** @type {!Uint8Array} */(value));\n }\n\n if (typeof value == 'number') {\n // NaN and infinity cannot be represented directly in JSON.\n if (isNaN(value)) {\n return 'NaN';\n }\n if (isFinite(value)) {\n return value;\n }\n if (value < 0) {\n return '-Infinity';\n }\n return 'Infinity';\n }\n\n return value;\n });\n }\n\n\n /**\n * Deserialize JSON using our special encodings.\n * @param {string} str\n * @return {?}\n */\n static deserialize(str) {\n return JSON.parse(str, (key, value) => {\n if (value == 'NaN') {\n return NaN;\n } else if (value == '-Infinity') {\n return -Infinity;\n } else if (value == 'Infinity') {\n return Infinity;\n } else if (value && typeof value == 'object' &&\n value['__type__'] == 'TimeRanges') {\n // TimeRanges objects have been unpacked and sent as plain data.\n // Simulate the original TimeRanges object.\n return shaka.cast.CastUtils.simulateTimeRanges_(value);\n } else if (value && typeof value == 'object' &&\n value['__type__'] == 'Uint8Array') {\n return shaka.cast.CastUtils.makeUint8Array_(value);\n } else if (value && typeof value == 'object' &&\n value['__type__'] == 'Error') {\n return shaka.cast.CastUtils.makeError_(value);\n }\n return value;\n });\n }\n\n\n /**\n * @param {!TimeRanges} ranges\n * @return {!Object}\n * @private\n */\n static unpackTimeRanges_(ranges) {\n const obj = {\n '__type__': 'TimeRanges', // a signal to deserialize\n 'length': ranges.length,\n 'start': [],\n 'end': [],\n };\n\n const TimeRangesUtils = shaka.media.TimeRangesUtils;\n for (const {start, end} of TimeRangesUtils.getBufferedInfo(ranges)) {\n obj['start'].push(start);\n obj['end'].push(end);\n }\n\n return obj;\n }\n\n\n /**\n * Creates a simulated TimeRanges object from data sent by the cast receiver.\n * @param {?} obj\n * @return {{\n * length: number,\n * start: function(number): number,\n * end: function(number): number\n * }}\n * @private\n */\n static simulateTimeRanges_(obj) {\n return {\n length: obj.length,\n // NOTE: a more complete simulation would throw when |i| was out of range,\n // but for simplicity we will assume a well-behaved application that uses\n // length instead of catch to stop iterating.\n start: (i) => { return obj.start[i]; },\n end: (i) => { return obj.end[i]; },\n };\n }\n\n\n /**\n * @param {!Uint8Array} array\n * @return {!Object}\n * @private\n */\n static unpackUint8Array_(array) {\n return {\n '__type__': 'Uint8Array', // a signal to deserialize\n 'entries': Array.from(array),\n };\n }\n\n\n /**\n * Creates a Uint8Array object from data sent by the cast receiver.\n * @param {?} obj\n * @return {!Uint8Array}\n * @private\n */\n static makeUint8Array_(obj) {\n return new Uint8Array(/** @type {!Array<number>} */ (obj['entries']));\n }\n\n\n /**\n * @param {!Error} error\n * @return {!Object}\n * @private\n */\n static unpackError_(error) {\n // None of the properties in TypeError are enumerable, but there are some\n // common Error properties we expect. We also enumerate any enumerable\n // properties and \"own\" properties of the type, in case there is an Error\n // subtype with additional properties we don't know about in advance.\n const properties = new Set(['name', 'message', 'stack']);\n for (const key in error) {\n properties.add(key);\n }\n for (const key of Object.getOwnPropertyNames(error)) {\n properties.add(key);\n }\n\n const contents = {};\n for (const key of properties) {\n contents[key] = error[key];\n }\n\n return {\n '__type__': 'Error', // a signal to deserialize\n 'contents': contents,\n };\n }\n\n\n /**\n * Creates an Error object from data sent by the cast receiver.\n * @param {?} obj\n * @return {!Error}\n * @private\n */\n static makeError_(obj) {\n const contents = obj['contents'];\n const error = new Error(contents['message']);\n for (const key in contents) {\n error[key] = contents[key];\n }\n return error;\n }\n};\n\n/**\n * HTMLMediaElement events that are proxied while casting.\n * @const {!Array<string>}\n */\nshaka.cast.CastUtils.VideoEvents = [\n 'ended',\n 'play',\n 'playing',\n 'pause',\n 'pausing',\n 'ratechange',\n 'seeked',\n 'seeking',\n 'timeupdate',\n 'volumechange',\n];\n\n\n/**\n * HTMLMediaElement attributes that are proxied while casting.\n * @const {!Array<string>}\n */\nshaka.cast.CastUtils.VideoAttributes = [\n 'buffered',\n 'currentTime',\n 'duration',\n 'ended',\n 'loop',\n 'muted',\n 'paused',\n 'playbackRate',\n 'seeking',\n 'videoHeight',\n 'videoWidth',\n 'volume',\n];\n\n\n/**\n * HTMLMediaElement attributes that are transferred when casting begins.\n * @const {!Array<string>}\n */\nshaka.cast.CastUtils.VideoInitStateAttributes = [\n 'loop',\n 'playbackRate',\n];\n\n\n/**\n * HTMLMediaElement methods with no return value that are proxied while casting.\n * @const {!Array<string>}\n */\nshaka.cast.CastUtils.VideoVoidMethods = [\n 'pause',\n 'play',\n];\n\n\n/**\n * Player getter methods that are proxied while casting.\n * The key is the method, the value is the frequency of updates.\n * Frequency 1 translates to every update; frequency 2 to every 2 updates, etc.\n * @const {!Map<string, number>}\n */\nshaka.cast.CastUtils.PlayerGetterMethods = new Map()\n // NOTE: The 'drmInfo' property is not proxied, as it is very large.\n .set('getAssetUri', 2)\n .set('getAudioLanguages', 4)\n .set('getAudioLanguagesAndRoles', 4)\n .set('getBufferFullness', 1)\n .set('getBufferedInfo', 2)\n .set('getExpiration', 2)\n .set('getKeyStatuses', 2)\n // NOTE: The 'getManifest' property is not proxied, as it is very large.\n // NOTE: The 'getManifestParserFactory' property is not proxied, as it would\n // not serialize.\n .set('getPlaybackRate', 2)\n .set('getTextLanguages', 4)\n .set('getTextLanguagesAndRoles', 4)\n .set('getImageTracks', 2)\n .set('getThumbnails', 2)\n .set('isAudioOnly', 10)\n .set('isBuffering', 1)\n .set('isInProgress', 1)\n .set('isLive', 10)\n .set('isTextTrackVisible', 1)\n .set('keySystem', 10)\n .set('seekRange', 1)\n .set('getLoadMode', 10)\n .set('getManifestType', 10)\n .set('isFullyLoaded', 1)\n .set('isEnded', 1);\n\n\n/**\n * Player getter methods with data large enough to be sent in their own update\n * messages, to reduce the size of each message. The format of this is\n * identical to PlayerGetterMethods.\n * @const {!Map<string, number>}\n */\nshaka.cast.CastUtils.LargePlayerGetterMethods = new Map()\n // NOTE: The 'getSharedConfiguration' property is not proxied as it would\n // not be possible to share a reference.\n .set('getConfiguration', 4)\n .set('getConfigurationForLowLatency', 4)\n .set('getStats', 5)\n .set('getAudioTracks', 2)\n .set('getTextTracks', 2)\n .set('getVariantTracks', 2);\n\n\n/**\n * Player getter methods that are proxied while casting, but only when casting\n * a livestream.\n * The key is the method, the value is the frequency of updates.\n * Frequency 1 translates to every update; frequency 2 to every 2 updates, etc.\n * @const {!Map<string, number>}\n */\nshaka.cast.CastUtils.PlayerGetterMethodsThatRequireLive = new Map()\n .set('getPlayheadTimeAsDate', 1)\n .set('getPresentationStartTimeAsDate', 20)\n .set('getSegmentAvailabilityDuration', 20);\n\n\n/**\n * Player getter and setter methods that are used to transfer state when casting\n * begins.\n * @const {!Array<!Array<string>>}\n */\nshaka.cast.CastUtils.PlayerInitState = [\n [\n 'getConfiguration',\n 'configure',\n 'getConfigurationForLowLatency',\n 'configurationForLowLatency',\n ],\n];\n\n\n/**\n * Player getter and setter methods that are used to transfer state after\n * load() is resolved.\n * @const {!Array<!Array<string>>}\n */\nshaka.cast.CastUtils.PlayerInitAfterLoadState = [\n ['isTextTrackVisible', 'setTextTrackVisibility'],\n];\n\n\n/**\n * Player methods with no return value that are proxied while casting.\n * @const {!Array<string>}\n */\nshaka.cast.CastUtils.PlayerVoidMethods = [\n 'addChaptersTrack',\n 'addTextTrackAsync',\n 'addThumbnailsTrack',\n 'cancelTrickPlay',\n 'configure',\n 'configurationForLowLatency',\n 'getChapters',\n 'getChaptersTracks',\n 'resetConfiguration',\n 'retryStreaming',\n 'selectAudioLanguage',\n 'selectAudioTrack',\n 'selectTextLanguage',\n 'selectTextTrack',\n 'selectVariantTrack',\n 'selectVariantsByLabel',\n 'setTextTrackVisibility',\n 'trickPlay',\n 'updateStartTime',\n 'goToLive',\n];\n\n\n/**\n * Player methods returning a Promise that are proxied while casting.\n * @const {!Array<string>}\n */\nshaka.cast.CastUtils.PlayerPromiseMethods = [\n 'attach',\n 'attachCanvas',\n 'detach',\n // The manifestFactory parameter of load is not supported.\n 'load',\n 'unload',\n];\n\n\n/**\n * @typedef {{\n * video: Object,\n * player: Object,\n * manifest: ?string,\n * startTime: ?number\n * }}\n * @property {Object} video\n * Dictionary of video properties to be set.\n * @property {Object} player\n * Dictionary of player setters to be called.\n * @property {?string} manifest\n * The currently-selected manifest, if present.\n * @property {?number} startTime\n * The playback start time, if currently playing.\n */\nshaka.cast.CastUtils.InitStateType;\n\n\n/**\n * The namespace for Shaka messages on the cast bus.\n * @const {string}\n */\nshaka.cast.CastUtils.SHAKA_MESSAGE_NAMESPACE = 'urn:x-cast:com.google.shaka.v2';\n\n\n/**\n * The namespace for generic messages on the cast bus.\n * @const {string}\n */\nshaka.cast.CastUtils.GENERIC_MESSAGE_NAMESPACE =\n 'urn:x-cast:com.google.cast.media';\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.cast.CastSender');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.cast.CastUtils');\ngoog.require('shaka.log');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.FakeEvent');\ngoog.require('shaka.util.IDestroyable');\ngoog.require('shaka.util.PublicPromise');\ngoog.require('shaka.util.Timer');\n\n\n/**\n * @implements {shaka.util.IDestroyable}\n */\nshaka.cast.CastSender = class {\n /**\n * @param {string} receiverAppId The ID of the cast receiver application.\n * @param {function()} onStatusChanged A callback invoked when the cast status\n * changes.\n * @param {function()} onFirstCastStateUpdate A callback invoked when an\n * \"update\" event has been received for the first time.\n * @param {function(string, !shaka.util.FakeEvent)} onRemoteEvent A callback\n * invoked with target name and event when a remote event is received.\n * @param {function()} onResumeLocal A callback invoked when the local player\n * should resume playback. Called before the cached remote state is wiped.\n * @param {function()} onInitStateRequired A callback to get local player's.\n * state. Invoked when casting is initiated from Chrome's cast button.\n * @param {boolean} androidReceiverCompatible Indicates if the app is\n * compatible with an Android Receiver.\n */\n constructor(receiverAppId, onStatusChanged, onFirstCastStateUpdate,\n onRemoteEvent, onResumeLocal, onInitStateRequired,\n androidReceiverCompatible) {\n /** @private {string} */\n this.receiverAppId_ = receiverAppId;\n\n /** @private {boolean} */\n this.androidReceiverCompatible_ = androidReceiverCompatible;\n\n /** @private {shaka.util.Timer} */\n this.statusChangeTimer_ = new shaka.util.Timer(onStatusChanged);\n\n /** @private {?function()} */\n this.onFirstCastStateUpdate_ = onFirstCastStateUpdate;\n\n /** @private {boolean} */\n this.hasJoinedExistingSession_ = false;\n\n /** @private {?function(string, !shaka.util.FakeEvent)} */\n this.onRemoteEvent_ = onRemoteEvent;\n\n /** @private {?function()} */\n this.onResumeLocal_ = onResumeLocal;\n\n /** @private {?function()} */\n this.onInitStateRequired_ = onInitStateRequired;\n\n /** @private {boolean} */\n this.apiReady_ = false;\n\n /** @private {boolean} */\n this.isCasting_ = false;\n\n /** @private {string} */\n this.receiverName_ = '';\n\n /** @private {Object} */\n this.appData_ = null;\n\n /** @private {?function()} */\n this.onConnectionStatusChangedBound_ =\n () => this.onConnectionStatusChanged_();\n\n /** @private {?function(string, string)} */\n this.onMessageReceivedBound_ = (namespace, serialized) =>\n this.onMessageReceived_(namespace, serialized);\n\n /** @private {Object} */\n this.cachedProperties_ = {\n 'video': {},\n 'player': {},\n };\n\n /** @private {number} */\n this.nextAsyncCallId_ = 0;\n\n /** @private {Map<string, !shaka.util.PublicPromise>} */\n this.asyncCallPromises_ = new Map();\n\n /** @private {shaka.util.PublicPromise} */\n this.castPromise_ = null;\n\n shaka.cast.CastSender.instances_.add(this);\n }\n\n\n /** @override */\n destroy() {\n shaka.cast.CastSender.instances_.delete(this);\n\n this.rejectAllPromises_();\n if (shaka.cast.CastSender.session_) {\n this.removeListeners_();\n // Don't leave the session, so that this session can be re-used later if\n // necessary.\n }\n\n if (this.statusChangeTimer_) {\n this.statusChangeTimer_.stop();\n this.statusChangeTimer_ = null;\n }\n\n this.onRemoteEvent_ = null;\n this.onResumeLocal_ = null;\n this.apiReady_ = false;\n this.isCasting_ = false;\n this.appData_ = null;\n this.cachedProperties_ = null;\n this.asyncCallPromises_ = null;\n this.castPromise_ = null;\n this.onConnectionStatusChangedBound_ = null;\n this.onMessageReceivedBound_ = null;\n\n return Promise.resolve();\n }\n\n\n /**\n * @return {boolean} True if the cast API is available.\n */\n apiReady() {\n return this.apiReady_;\n }\n\n\n /**\n * @return {boolean} True if there are receivers.\n */\n hasReceivers() {\n return shaka.cast.CastSender.hasReceivers_;\n }\n\n\n /**\n * @return {boolean} True if we are currently casting.\n */\n isCasting() {\n return this.isCasting_;\n }\n\n\n /**\n * @return {string} The name of the Cast receiver device, if isCasting().\n */\n receiverName() {\n return this.receiverName_;\n }\n\n\n /**\n * @return {boolean} True if we have a cache of remote properties from the\n * receiver.\n */\n hasRemoteProperties() {\n return Object.keys(this.cachedProperties_['video']).length != 0;\n }\n\n\n /** Initialize the Cast API. */\n init() {\n const CastSender = shaka.cast.CastSender;\n\n if (!this.receiverAppId_.length) {\n // Return if no cast receiver id has been provided.\n // Nothing will be initialized, no global hooks will be installed.\n // If the receiver ID changes before this instance dies, init will be\n // called again.\n return;\n }\n\n // Check for the cast API.\n if (!window.chrome || !chrome.cast || !chrome.cast.isAvailable) {\n // If the API is not available on this platform or is not ready yet,\n // install a hook to be notified when it becomes available.\n // If the API becomes available before this instance dies, init will be\n // called again.\n\n // Check if our callback is already installed.\n if (window.__onGCastApiAvailable !== CastSender.onGCastApiAvailable_) {\n // Save pre-existing __onGCastApiAvailable in order to restore later.\n CastSender.__onGCastApiAvailable_ =\n window.__onGCastApiAvailable || null;\n window.__onGCastApiAvailable = CastSender.onGCastApiAvailable_;\n }\n\n return;\n }\n\n // The API is now available.\n this.apiReady_ = true;\n this.statusChangeTimer_.tickNow();\n\n // Use static versions of the API callbacks, since the ChromeCast API is\n // static. If we used local versions, we might end up retaining references\n // to destroyed players here.\n const sessionRequest = new chrome.cast.SessionRequest(this.receiverAppId_,\n /* capabilities= */ [],\n /* timeout= */ null,\n this.androidReceiverCompatible_,\n /* credentialsData= */null);\n const apiConfig = new chrome.cast.ApiConfig(sessionRequest,\n (session) => CastSender.onExistingSessionJoined_(session),\n (availability) => CastSender.onReceiverStatusChanged_(availability),\n 'origin_scoped');\n\n // TODO: Have never seen this fail. When would it and how should we react?\n chrome.cast.initialize(apiConfig,\n () => { shaka.log.debug('CastSender: init'); },\n (error) => { shaka.log.error('CastSender: init error', error); });\n if (shaka.cast.CastSender.hasReceivers_) {\n // Fire a fake cast status change, to simulate the update that\n // would be fired normally.\n // This is after a brief delay, to give users a chance to add event\n // listeners.\n this.statusChangeTimer_.tickAfter(shaka.cast.CastSender.STATUS_DELAY);\n }\n\n const oldSession = shaka.cast.CastSender.session_;\n if (oldSession && oldSession.status != chrome.cast.SessionStatus.STOPPED) {\n // The old session still exists, so re-use it.\n shaka.log.debug('CastSender: re-using existing connection');\n this.onExistingSessionJoined_(oldSession);\n } else {\n // The session has been canceled in the meantime, so ignore it.\n shaka.cast.CastSender.session_ = null;\n }\n }\n\n\n /**\n * Set application-specific data.\n *\n * @param {Object} appData Application-specific data to relay to the receiver.\n */\n setAppData(appData) {\n this.appData_ = appData;\n if (this.isCasting_) {\n this.sendMessage_({\n 'type': 'appData',\n 'appData': this.appData_,\n });\n }\n }\n\n\n /**\n * @return {!Promise} Resolved when connected to a receiver. Rejected if the\n * connection fails or is canceled by the user.\n */\n async cast() {\n if (!this.apiReady_) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.RECOVERABLE,\n shaka.util.Error.Category.CAST,\n shaka.util.Error.Code.CAST_API_UNAVAILABLE);\n }\n if (!shaka.cast.CastSender.hasReceivers_) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.RECOVERABLE,\n shaka.util.Error.Category.CAST,\n shaka.util.Error.Code.NO_CAST_RECEIVERS);\n }\n if (this.isCasting_) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.RECOVERABLE,\n shaka.util.Error.Category.CAST,\n shaka.util.Error.Code.ALREADY_CASTING);\n }\n\n this.castPromise_ = new shaka.util.PublicPromise();\n chrome.cast.requestSession(\n (session) => this.onSessionInitiated_(session),\n (error) => this.onConnectionError_(error));\n await this.castPromise_;\n }\n\n\n /**\n * Shows user a cast dialog where they can choose to stop\n * casting. Relies on Chrome to perform disconnect if they do.\n * Doesn't do anything if not connected.\n */\n showDisconnectDialog() {\n if (!this.isCasting_) {\n return;\n }\n\n chrome.cast.requestSession(\n (session) => this.onSessionInitiated_(session),\n (error) => this.onConnectionError_(error));\n }\n\n\n /**\n * Forces the receiver app to shut down by disconnecting. Does nothing if not\n * connected.\n */\n forceDisconnect() {\n if (!this.isCasting_) {\n return;\n }\n\n this.rejectAllPromises_();\n\n if (shaka.cast.CastSender.session_) {\n this.removeListeners_();\n\n // This can throw if we've already been disconnected somehow.\n try {\n shaka.cast.CastSender.session_.stop(() => {}, () => {});\n } catch (error) {}\n\n shaka.cast.CastSender.session_ = null;\n }\n\n // Update casting status.\n this.onConnectionStatusChanged_();\n }\n\n\n /**\n * Getter for properties of remote objects.\n * @param {string} targetName\n * @param {string} property\n * @return {?}\n */\n get(targetName, property) {\n goog.asserts.assert(targetName == 'video' || targetName == 'player',\n 'Unexpected target name');\n const CastUtils = shaka.cast.CastUtils;\n if (targetName == 'video') {\n if (CastUtils.VideoVoidMethods.includes(property)) {\n return (...args) => this.remoteCall_(targetName, property, ...args);\n }\n } else if (targetName == 'player') {\n if (CastUtils.PlayerGetterMethodsThatRequireLive.has(property)) {\n const isLive = this.get('player', 'isLive')();\n goog.asserts.assert(isLive,\n property + ' should be called on a live stream!');\n // If the property shouldn't exist, return a fake function so that the\n // user doesn't call an undefined function and get a second error.\n if (!isLive) {\n return () => undefined;\n }\n }\n if (CastUtils.PlayerVoidMethods.includes(property)) {\n return (...args) => this.remoteCall_(targetName, property, ...args);\n }\n if (CastUtils.PlayerPromiseMethods.includes(property)) {\n return (...args) =>\n this.remoteAsyncCall_(targetName, property, ...args);\n }\n if (CastUtils.PlayerGetterMethods.has(property) ||\n CastUtils.LargePlayerGetterMethods.has(property)) {\n return () => this.propertyGetter_(targetName, property);\n }\n }\n\n return this.propertyGetter_(targetName, property);\n }\n\n\n /**\n * Setter for properties of remote objects.\n * @param {string} targetName\n * @param {string} property\n * @param {?} value\n */\n set(targetName, property, value) {\n goog.asserts.assert(targetName == 'video' || targetName == 'player',\n 'Unexpected target name');\n\n this.cachedProperties_[targetName][property] = value;\n this.sendMessage_({\n 'type': 'set',\n 'targetName': targetName,\n 'property': property,\n 'value': value,\n });\n }\n\n\n /**\n * @param {chrome.cast.Session} session\n * @private\n */\n onSessionInitiated_(session) {\n shaka.log.debug('CastSender: onSessionInitiated');\n\n const initState = this.onInitStateRequired_();\n\n this.onSessionCreated_(session);\n\n this.sendMessage_({\n 'type': 'init',\n 'initState': initState,\n 'appData': this.appData_,\n });\n\n this.castPromise_.resolve();\n }\n\n\n /**\n * @param {chrome.cast.Error} error\n * @private\n */\n onConnectionError_(error) {\n // Default error code:\n let code = shaka.util.Error.Code.UNEXPECTED_CAST_ERROR;\n\n switch (error.code) {\n case 'cancel':\n code = shaka.util.Error.Code.CAST_CANCELED_BY_USER;\n break;\n case 'timeout':\n code = shaka.util.Error.Code.CAST_CONNECTION_TIMED_OUT;\n break;\n case 'receiver_unavailable':\n code = shaka.util.Error.Code.CAST_RECEIVER_APP_UNAVAILABLE;\n break;\n }\n\n this.castPromise_.reject(new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.CAST,\n code,\n error));\n }\n\n\n /**\n * @param {string} targetName\n * @param {string} property\n * @return {?}\n * @private\n */\n propertyGetter_(targetName, property) {\n goog.asserts.assert(targetName == 'video' || targetName == 'player',\n 'Unexpected target name');\n return this.cachedProperties_[targetName][property];\n }\n\n\n /**\n * @param {string} targetName\n * @param {string} methodName\n * @param {...*} varArgs\n * @private\n */\n remoteCall_(targetName, methodName, ...varArgs) {\n goog.asserts.assert(targetName == 'video' || targetName == 'player',\n 'Unexpected target name');\n this.sendMessage_({\n 'type': 'call',\n 'targetName': targetName,\n 'methodName': methodName,\n 'args': varArgs,\n });\n }\n\n\n /**\n * @param {string} targetName\n * @param {string} methodName\n * @param {...*} varArgs\n * @return {!Promise}\n * @private\n */\n remoteAsyncCall_(targetName, methodName, ...varArgs) {\n goog.asserts.assert(targetName == 'video' || targetName == 'player',\n 'Unexpected target name');\n\n const p = new shaka.util.PublicPromise();\n const id = this.nextAsyncCallId_.toString();\n this.nextAsyncCallId_++;\n this.asyncCallPromises_.set(id, p);\n\n try {\n this.sendMessage_({\n 'type': 'asyncCall',\n 'targetName': targetName,\n 'methodName': methodName,\n 'args': varArgs,\n 'id': id,\n });\n } catch (error) {\n p.reject(error);\n }\n return p;\n }\n\n\n /**\n * A static version of onExistingSessionJoined_, that calls that method for\n * each known instance.\n * @param {chrome.cast.Session} session\n * @private\n */\n static onExistingSessionJoined_(session) {\n for (const instance of shaka.cast.CastSender.instances_) {\n instance.onExistingSessionJoined_(session);\n }\n }\n\n\n /**\n * @param {chrome.cast.Session} session\n * @private\n */\n onExistingSessionJoined_(session) {\n shaka.log.debug('CastSender: onExistingSessionJoined');\n\n this.castPromise_ = new shaka.util.PublicPromise();\n this.hasJoinedExistingSession_ = true;\n\n this.onSessionInitiated_(session);\n }\n\n\n /**\n * A static version of onReceiverStatusChanged_, that calls that method for\n * each known instance.\n * @param {string} availability\n * @private\n */\n static onReceiverStatusChanged_(availability) {\n for (const instance of shaka.cast.CastSender.instances_) {\n instance.onReceiverStatusChanged_(availability);\n }\n }\n\n\n /**\n * @param {string} availability\n * @private\n */\n onReceiverStatusChanged_(availability) {\n // The cast API is telling us whether there are any cast receiver devices\n // available.\n shaka.log.debug('CastSender: receiver status', availability);\n shaka.cast.CastSender.hasReceivers_ = availability == 'available';\n this.statusChangeTimer_.tickNow();\n }\n\n\n /**\n * @param {chrome.cast.Session} session\n * @private\n */\n onSessionCreated_(session) {\n shaka.cast.CastSender.session_ = session;\n session.addUpdateListener(this.onConnectionStatusChangedBound_);\n session.addMessageListener(shaka.cast.CastUtils.SHAKA_MESSAGE_NAMESPACE,\n this.onMessageReceivedBound_);\n this.onConnectionStatusChanged_();\n }\n\n\n /**\n * @private\n */\n removeListeners_() {\n const session = shaka.cast.CastSender.session_;\n session.removeUpdateListener(this.onConnectionStatusChangedBound_);\n session.removeMessageListener(shaka.cast.CastUtils.SHAKA_MESSAGE_NAMESPACE,\n this.onMessageReceivedBound_);\n }\n\n\n /**\n * @private\n */\n onConnectionStatusChanged_() {\n const connected = shaka.cast.CastSender.session_ ?\n shaka.cast.CastSender.session_.status == 'connected' :\n false;\n shaka.log.debug('CastSender: connection status', connected);\n if (this.isCasting_ && !connected) {\n // Tell CastProxy to transfer state back to local player.\n this.onResumeLocal_();\n\n // Clear whatever we have cached.\n for (const targetName in this.cachedProperties_) {\n this.cachedProperties_[targetName] = {};\n }\n\n this.rejectAllPromises_();\n }\n\n this.isCasting_ = connected;\n this.receiverName_ = connected ?\n shaka.cast.CastSender.session_.receiver.friendlyName :\n '';\n this.statusChangeTimer_.tickNow();\n }\n\n\n /**\n * Reject any async call promises that are still pending.\n * @private\n */\n rejectAllPromises_() {\n if (!this.asyncCallPromises_) {\n return;\n }\n for (const id of this.asyncCallPromises_.keys()) {\n const p = this.asyncCallPromises_.get(id);\n this.asyncCallPromises_.delete(id);\n\n // Reject pending async operations as if they were interrupted.\n // At the moment, load() is the only async operation we are worried about.\n p.reject(new shaka.util.Error(\n shaka.util.Error.Severity.RECOVERABLE,\n shaka.util.Error.Category.PLAYER,\n shaka.util.Error.Code.LOAD_INTERRUPTED));\n }\n }\n\n\n /**\n * @param {string} namespace\n * @param {string} serialized\n * @private\n */\n onMessageReceived_(namespace, serialized) {\n // Since this method is in the compiled library, make sure all messages\n // passed in here were created with quoted property names.\n\n const message = shaka.cast.CastUtils.deserialize(serialized);\n shaka.log.v2('CastSender: message', message);\n\n switch (message['type']) {\n case 'event': {\n const targetName = message['targetName'];\n const event = message['event'];\n const fakeEvent = shaka.util.FakeEvent.fromRealEvent(event);\n this.onRemoteEvent_(targetName, fakeEvent);\n break;\n }\n case 'update': {\n const update = message['update'];\n for (const targetName in update) {\n const target = this.cachedProperties_[targetName] || {};\n for (const property in update[targetName]) {\n target[property] = update[targetName][property];\n }\n }\n if (this.hasJoinedExistingSession_) {\n this.onFirstCastStateUpdate_();\n this.hasJoinedExistingSession_ = false;\n }\n break;\n }\n case 'asyncComplete': {\n const id = message['id'];\n const error = message['error'];\n const p = this.asyncCallPromises_.get(id);\n this.asyncCallPromises_.delete(id);\n\n goog.asserts.assert(p, 'Unexpected async id');\n if (!p) {\n break;\n }\n\n if (error) {\n // This is a hacky way to reconstruct the serialized error.\n const reconstructedError = new shaka.util.Error(\n error.severity, error.category, error.code);\n for (const k in error) {\n (/** @type {Object} */(reconstructedError))[k] = error[k];\n }\n p.reject(reconstructedError);\n } else {\n p.resolve();\n }\n break;\n }\n }\n }\n\n\n /**\n * @param {!Object} message\n * @private\n */\n sendMessage_(message) {\n // Since this method is in the compiled library, make sure all messages\n // passed in here were created with quoted property names.\n\n const serialized = shaka.cast.CastUtils.serialize(message);\n const session = shaka.cast.CastSender.session_;\n\n // NOTE: This takes an error callback that we have not seen fire. We don't\n // know if it would fire synchronously or asynchronously. Until we know how\n // it works, we just log from that callback. But we _have_ seen\n // sendMessage() throw synchronously, so we handle that.\n try {\n session.sendMessage(shaka.cast.CastUtils.SHAKA_MESSAGE_NAMESPACE,\n serialized,\n () => {}, // success callback\n shaka.log.error); // error callback\n } catch (error) {\n shaka.log.error('Cast session sendMessage threw', error);\n\n // Translate the error\n const shakaError = new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.CAST,\n shaka.util.Error.Code.CAST_CONNECTION_TIMED_OUT,\n error);\n\n // Dispatch it through the Player proxy\n const fakeEvent = new shaka.util.FakeEvent(\n 'error', (new Map()).set('detail', shakaError));\n this.onRemoteEvent_('player', fakeEvent);\n\n // Force this session to disconnect and transfer playback to the local\n // device\n this.forceDisconnect();\n\n // Throw the translated error from this getter/setter/method to the UI/app\n throw shakaError;\n }\n }\n};\n\n/** @type {number} */\nshaka.cast.CastSender.STATUS_DELAY = 0.02;\n\n/** @private {boolean} */\nshaka.cast.CastSender.hasReceivers_ = false;\n\n/** @private {chrome.cast.Session} */\nshaka.cast.CastSender.session_ = null;\n\n/** @private {?function(boolean)} */\nshaka.cast.CastSender.__onGCastApiAvailable_ = null;\n\n/**\n * A set of all living CastSender instances. The constructor and destroy\n * methods will add and remove instances from this set.\n *\n * This is used to deal with delayed initialization of the Cast SDK. When the\n * SDK becomes available, instances will be reinitialized.\n *\n * @private {!Set<shaka.cast.CastSender>}\n */\nshaka.cast.CastSender.instances_ = new Set();\n\n/**\n * If the cast SDK is not available yet, it will invoke this callback once it\n * becomes available.\n *\n * @param {boolean} loaded\n * @private\n */\nshaka.cast.CastSender.onSdkLoaded_ = (loaded) => {\n if (loaded) {\n // Any living instances of CastSender should have their init methods called\n // again now that the API is available.\n for (const sender of shaka.cast.CastSender.instances_) {\n sender.init();\n }\n }\n};\n\n/**\n * @param {boolean} available\n * @private\n */\nshaka.cast.CastSender.onGCastApiAvailable_ = (available) => {\n // Restore callback from saved.\n if (shaka.cast.CastSender.__onGCastApiAvailable_) {\n window.__onGCastApiAvailable =\n shaka.cast.CastSender.__onGCastApiAvailable_;\n } else {\n delete window.__onGCastApiAvailable;\n }\n shaka.cast.CastSender.__onGCastApiAvailable_ = null;\n\n // A note about this value: In our testing environment, we load both\n // uncompiled and compiled code. This global callback in uncompiled mode\n // can be overwritten by the same in compiled mode. The two versions will\n // each have their own instances_ map. Therefore the callback must have a\n // name, as opposed to being anonymous. This way, the CastSender tests\n // can invoke the named static method instead of using a global that could\n // be overwritten.\n shaka.cast.CastSender.onSdkLoaded_(available);\n\n // call restored callback (if any)\n if (typeof window.__onGCastApiAvailable === 'function') {\n window.__onGCastApiAvailable(available);\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.cast.CastProxy');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.Player');\ngoog.require('shaka.cast.CastSender');\ngoog.require('shaka.cast.CastUtils');\ngoog.require('shaka.log');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.EventManager');\ngoog.require('shaka.util.FakeEvent');\ngoog.require('shaka.util.FakeEventTarget');\ngoog.require('shaka.util.IDestroyable');\n\n\n/**\n * @event shaka.cast.CastProxy.CastStatusChangedEvent\n * @description Fired when cast status changes. The status change will be\n * reflected in canCast() and isCasting().\n * @property {string} type\n * 'caststatuschanged'\n * @exportDoc\n */\n\n\n/**\n * @summary A proxy to switch between local and remote playback for Chromecast\n * in a way that is transparent to the app's controls.\n *\n * @implements {shaka.util.IDestroyable}\n * @export\n */\nshaka.cast.CastProxy = class extends shaka.util.FakeEventTarget {\n /**\n * @param {!HTMLMediaElement} video The local video element associated with\n * the local Player instance.\n * @param {!shaka.Player} player A local Player instance.\n * @param {string} receiverAppId The ID of the cast receiver application.\n * If blank, casting will not be available, but the proxy will still\n * function otherwise.\n * @param {boolean} androidReceiverCompatible Indicates if the app is\n * compatible with an Android Receiver.\n */\n constructor(video, player, receiverAppId,\n androidReceiverCompatible = false) {\n super();\n\n /** @private {HTMLMediaElement} */\n this.localVideo_ = video;\n\n /** @private {shaka.Player} */\n this.localPlayer_ = player;\n\n /** @private {Object} */\n this.videoProxy_ = null;\n\n /** @private {Object} */\n this.playerProxy_ = null;\n\n /** @private {shaka.util.FakeEventTarget} */\n this.videoEventTarget_ = null;\n\n /** @private {shaka.util.FakeEventTarget} */\n this.playerEventTarget_ = null;\n\n /** @private {shaka.util.EventManager} */\n this.eventManager_ = null;\n\n /** @private {string} */\n this.receiverAppId_ = receiverAppId;\n\n /** @private {boolean} */\n this.androidReceiverCompatible_ = androidReceiverCompatible;\n\n /** @private {!Map} */\n this.compiledToExternNames_ = new Map();\n\n /** @private {shaka.cast.CastSender} */\n this.sender_ = null;\n\n if (window.chrome) {\n this.sender_ = new shaka.cast.CastSender(\n receiverAppId,\n () => this.onCastStatusChanged_(),\n () => this.onFirstCastStateUpdate_(),\n (targetName, event) => this.onRemoteEvent_(targetName, event),\n () => this.onResumeLocal_(),\n () => this.getInitState_(),\n androidReceiverCompatible);\n this.init_();\n } else {\n this.initWithoutSender_();\n }\n }\n\n /**\n * Destroys the proxy and the underlying local Player.\n *\n * @param {boolean=} forceDisconnect If true, force the receiver app to shut\n * down by disconnecting. Does nothing if not connected.\n * @override\n * @export\n */\n destroy(forceDisconnect) {\n if (this.sender_ && forceDisconnect) {\n this.sender_.forceDisconnect();\n }\n\n if (this.eventManager_) {\n this.eventManager_.release();\n this.eventManager_ = null;\n }\n\n const waitFor = [];\n if (this.localPlayer_) {\n waitFor.push(this.localPlayer_.destroy());\n this.localPlayer_ = null;\n }\n\n if (this.sender_) {\n waitFor.push(this.sender_.destroy());\n this.sender_ = null;\n }\n\n this.localVideo_ = null;\n this.videoProxy_ = null;\n this.playerProxy_ = null;\n\n // FakeEventTarget implements IReleasable\n super.release();\n\n return Promise.all(waitFor);\n }\n\n /**\n * Get a proxy for the video element that delegates to local and remote video\n * elements as appropriate.\n *\n * @suppress {invalidCasts} to cast proxy Objects to unrelated types\n * @return {!HTMLMediaElement}\n * @export\n */\n getVideo() {\n return /** @type {!HTMLMediaElement} */(this.videoProxy_);\n }\n\n /**\n * Get a proxy for the Player that delegates to local and remote Player\n * objects as appropriate.\n *\n * @suppress {invalidCasts} to cast proxy Objects to unrelated types\n * @return {!shaka.Player}\n * @export\n */\n getPlayer() {\n return /** @type {!shaka.Player} */(this.playerProxy_);\n }\n\n /**\n * @return {boolean} True if the cast API is available and there are\n * receivers.\n * @export\n */\n canCast() {\n if (!this.sender_) {\n return false;\n }\n return this.sender_.apiReady() && this.sender_.hasReceivers();\n }\n\n /**\n * @return {boolean} True if we are currently casting.\n * @export\n */\n isCasting() {\n if (!this.sender_) {\n return false;\n }\n return this.sender_.isCasting();\n }\n\n /**\n * @return {string} The name of the Cast receiver device, if isCasting().\n * @export\n */\n receiverName() {\n if (!this.sender_) {\n return '';\n }\n return this.sender_.receiverName();\n }\n\n /**\n * @return {!Promise} Resolved when connected to a receiver. Rejected if the\n * connection fails or is canceled by the user.\n * @export\n */\n async cast() {\n if (!this.sender_) {\n return;\n }\n // TODO: transfer manually-selected tracks?\n // TODO: transfer side-loaded text tracks?\n\n await this.sender_.cast();\n if (!this.localPlayer_) {\n // We've already been destroyed.\n return;\n }\n\n // Unload the local manifest when casting succeeds.\n await this.localPlayer_.unload();\n }\n\n /**\n * Set application-specific data.\n *\n * @param {Object} appData Application-specific data to relay to the receiver.\n * @export\n */\n setAppData(appData) {\n if (!this.sender_) {\n return;\n }\n this.sender_.setAppData(appData);\n }\n\n /**\n * Show a dialog where user can choose to disconnect from the cast connection.\n * @export\n */\n suggestDisconnect() {\n if (!this.sender_) {\n return;\n }\n this.sender_.showDisconnectDialog();\n }\n\n /**\n * Force the receiver app to shut down by disconnecting.\n * @export\n */\n forceDisconnect() {\n if (!this.sender_) {\n return;\n }\n this.sender_.forceDisconnect();\n }\n\n\n /**\n * @param {string} newAppId\n * @param {boolean=} newCastAndroidReceiver\n * @export\n */\n async changeReceiverId(newAppId, newCastAndroidReceiver = false) {\n if (newAppId == this.receiverAppId_ &&\n newCastAndroidReceiver == this.androidReceiverCompatible_) {\n // Nothing to change\n return;\n }\n\n this.receiverAppId_ = newAppId;\n this.androidReceiverCompatible_ = newCastAndroidReceiver;\n\n if (!this.sender_) {\n return;\n }\n\n // Destroy the old sender\n this.sender_.forceDisconnect();\n await this.sender_.destroy();\n this.sender_ = null;\n\n\n // Create the new one\n this.sender_ = new shaka.cast.CastSender(\n newAppId,\n () => this.onCastStatusChanged_(),\n () => this.onFirstCastStateUpdate_(),\n (targetName, event) => this.onRemoteEvent_(targetName, event),\n () => this.onResumeLocal_(),\n () => this.getInitState_(),\n newCastAndroidReceiver);\n\n this.sender_.init();\n }\n\n /**\n * Initialize the Proxies without Cast sender.\n * @private\n */\n initWithoutSender_() {\n this.videoProxy_ = /** @type {Object} */(this.localVideo_);\n this.playerProxy_ = /** @type {Object} */(this.localPlayer_);\n }\n\n /**\n * Initialize the Proxies and the Cast sender.\n * @private\n */\n init_() {\n this.sender_.init();\n\n this.eventManager_ = new shaka.util.EventManager();\n\n for (const name of shaka.cast.CastUtils.VideoEvents) {\n this.eventManager_.listen(this.localVideo_, name,\n (event) => this.videoProxyLocalEvent_(event));\n }\n\n for (const key in shaka.util.FakeEvent.EventName) {\n const name = shaka.util.FakeEvent.EventName[key];\n this.eventManager_.listen(this.localPlayer_, name,\n (event) => this.playerProxyLocalEvent_(event));\n }\n\n // We would like to use Proxy here, but it is not supported on Safari.\n this.videoProxy_ = {};\n for (const k in this.localVideo_) {\n Object.defineProperty(this.videoProxy_, k, {\n configurable: false,\n enumerable: true,\n get: () => this.videoProxyGet_(k),\n set: (value) => { this.videoProxySet_(k, value); },\n });\n }\n\n this.playerProxy_ = {};\n this.iterateOverPlayerMethods_((name, method) => {\n goog.asserts.assert(this.playerProxy_, 'Must have player proxy!');\n Object.defineProperty(this.playerProxy_, name, {\n configurable: false,\n enumerable: true,\n get: () => this.playerProxyGet_(name),\n });\n });\n\n if (COMPILED) {\n this.mapCompiledToUncompiledPlayerMethodNames_();\n }\n\n this.videoEventTarget_ = new shaka.util.FakeEventTarget();\n this.videoEventTarget_.dispatchTarget =\n /** @type {EventTarget} */(this.videoProxy_);\n\n this.playerEventTarget_ = new shaka.util.FakeEventTarget();\n this.playerEventTarget_.dispatchTarget =\n /** @type {EventTarget} */(this.playerProxy_);\n }\n\n\n /**\n * Maps compiled to uncompiled player names so we can figure out\n * which method to call in compiled build, while casting.\n * @private\n */\n mapCompiledToUncompiledPlayerMethodNames_() {\n // In compiled mode, UI tries to access player methods by their internal\n // renamed names, but the proxy object doesn't know about those. See\n // https://github.com/shaka-project/shaka-player/issues/2130 for details.\n const methodsToNames = new Map();\n this.iterateOverPlayerMethods_((name, method) => {\n if (methodsToNames.has(method)) {\n // If two method names, point to the same method, add them to the\n // map as aliases of each other.\n const name2 = methodsToNames.get(method);\n // Assumes that the compiled name is shorter\n if (name.length < name2.length) {\n this.compiledToExternNames_.set(name, name2);\n } else {\n this.compiledToExternNames_.set(name2, name);\n }\n } else {\n methodsToNames.set(method, name);\n }\n });\n }\n\n /**\n * Iterates over all of the methods of the player, including inherited methods\n * from FakeEventTarget.\n * @param {function(string, function())} operation\n * @private\n */\n iterateOverPlayerMethods_(operation) {\n goog.asserts.assert(this.localPlayer_, 'Must have player!');\n const player = /** @type {!Object} */ (this.localPlayer_);\n // Avoid accessing any over-written methods in the prototype chain.\n const seenNames = new Set();\n\n /**\n * @param {string} name\n * @return {boolean}\n */\n function shouldAddToTheMap(name) {\n if (name == 'constructor') {\n // Don't proxy the constructor.\n return false;\n }\n\n const method = /** @type {Object} */(player)[name];\n if (typeof method != 'function') {\n // Don't proxy non-methods.\n return false;\n }\n\n // Add if the map does not already have it\n return !seenNames.has(name);\n }\n\n // First, look at the methods on the object itself, so this can properly\n // proxy any methods not on the prototype (for example, in the mock player).\n for (const key in player) {\n if (shouldAddToTheMap(key)) {\n seenNames.add(key);\n operation(key, player[key]);\n }\n }\n\n // The exact length of the prototype chain might vary; for resiliency, this\n // will just look at the entire chain, rather than assuming a set length.\n let proto = /** @type {!Object} */ (Object.getPrototypeOf(player));\n const objProto = /** @type {!Object} */ (Object.getPrototypeOf({}));\n while (proto && proto != objProto) { // Don't proxy Object methods.\n for (const name of Object.getOwnPropertyNames(proto)) {\n if (shouldAddToTheMap(name)) {\n seenNames.add(name);\n operation(name, (player)[name]);\n }\n }\n proto = /** @type {!Object} */ (Object.getPrototypeOf(proto));\n }\n }\n\n /**\n * @return {shaka.cast.CastUtils.InitStateType} initState Video and player\n * state to be sent to the receiver.\n * @private\n */\n getInitState_() {\n const initState = {\n 'video': {},\n 'player': {},\n 'playerAfterLoad': {},\n 'manifest': this.localPlayer_.getAssetUri(),\n 'startTime': null,\n };\n\n // Pause local playback before capturing state.\n this.localVideo_.pause();\n\n for (const name of shaka.cast.CastUtils.VideoInitStateAttributes) {\n initState['video'][name] = this.localVideo_[name];\n }\n\n // If the video is still playing, set the startTime.\n // Has no effect if nothing is loaded.\n if (!this.localVideo_.ended) {\n initState['startTime'] = this.localVideo_.currentTime;\n }\n\n for (const pair of shaka.cast.CastUtils.PlayerInitState) {\n const getter = pair[0];\n const setter = pair[1];\n const value = /** @type {Object} */(this.localPlayer_)[getter]();\n\n initState['player'][setter] = value;\n }\n\n for (const pair of shaka.cast.CastUtils.PlayerInitAfterLoadState) {\n const getter = pair[0];\n const setter = pair[1];\n const value = /** @type {Object} */(this.localPlayer_)[getter]();\n\n initState['playerAfterLoad'][setter] = value;\n }\n\n return initState;\n }\n\n /**\n * Dispatch an event to notify the app that the status has changed.\n * @private\n */\n onCastStatusChanged_() {\n const event = new shaka.util.FakeEvent('caststatuschanged');\n this.dispatchEvent(event);\n }\n\n /**\n * Dispatch a synthetic play or pause event to ensure that the app correctly\n * knows that the player is playing, if joining an existing receiver.\n * @private\n */\n onFirstCastStateUpdate_() {\n const type = this.videoProxy_['paused'] ? 'pause' : 'play';\n const fakeEvent = new shaka.util.FakeEvent(type);\n this.videoEventTarget_.dispatchEvent(fakeEvent);\n }\n\n /**\n * Transfer remote state back and resume local playback.\n * @private\n */\n onResumeLocal_() {\n // Transfer back the player state.\n for (const pair of shaka.cast.CastUtils.PlayerInitState) {\n const getter = pair[0];\n const setter = pair[1];\n const value = this.sender_.get('player', getter)();\n /** @type {Object} */(this.localPlayer_)[setter](value);\n }\n\n // Get the most recent manifest URI and ended state.\n const assetUri = this.sender_.get('player', 'getAssetUri')();\n const ended = this.sender_.get('video', 'ended');\n\n let manifestReady = Promise.resolve();\n const autoplay = this.localVideo_.autoplay;\n\n let startTime = null;\n\n // If the video is still playing, set the startTime.\n // Has no effect if nothing is loaded.\n if (!ended) {\n startTime = this.sender_.get('video', 'currentTime');\n }\n\n let activeTextTrack;\n const textTracks = this.sender_.get('player', 'getTextTracks')();\n\n if (textTracks && textTracks.length) {\n activeTextTrack = textTracks.find((t) => t.active);\n }\n\n const isTextTrackVisible =\n this.sender_.get('player', 'isTextTrackVisible')();\n\n // Now load the manifest, if present.\n if (assetUri) {\n // Don't autoplay the content until we finish setting up initial state.\n this.localVideo_.autoplay = false;\n manifestReady = this.localPlayer_.load(assetUri, startTime);\n }\n\n // Get the video state into a temp variable since we will apply it async.\n const videoState = {};\n for (const name of shaka.cast.CastUtils.VideoInitStateAttributes) {\n videoState[name] = this.sender_.get('video', name);\n }\n\n // Finally, take on video state and player's \"after load\" state.\n manifestReady.then(() => {\n if (!this.localVideo_) {\n // We've already been destroyed.\n return;\n }\n\n for (const name of shaka.cast.CastUtils.VideoInitStateAttributes) {\n this.localVideo_[name] = videoState[name];\n }\n\n for (const pair of shaka.cast.CastUtils.PlayerInitAfterLoadState) {\n const getter = pair[0];\n const setter = pair[1];\n const value = this.sender_.get('player', getter)();\n /** @type {Object} */(this.localPlayer_)[setter](value);\n }\n\n this.localPlayer_.setTextTrackVisibility(isTextTrackVisible);\n if (activeTextTrack) {\n this.localPlayer_.selectTextLanguage(\n activeTextTrack.language,\n activeTextTrack.roles,\n activeTextTrack.forced);\n }\n\n // Restore the original autoplay setting.\n this.localVideo_.autoplay = autoplay;\n if (assetUri) {\n // Resume playback with transferred state.\n this.localVideo_.play();\n }\n }, (error) => {\n // Pass any errors through to the app.\n goog.asserts.assert(error instanceof shaka.util.Error,\n 'Wrong error type!');\n const eventType = shaka.util.FakeEvent.EventName.Error;\n const data = (new Map()).set('detail', error);\n const event = new shaka.util.FakeEvent(eventType, data);\n this.localPlayer_.dispatchEvent(event);\n });\n }\n\n /**\n * @param {string} name\n * @return {?}\n * @private\n */\n videoProxyGet_(name) {\n if (name == 'addEventListener') {\n return (type, listener, options) => {\n return this.videoEventTarget_.addEventListener(type, listener, options);\n };\n }\n if (name == 'removeEventListener') {\n return (type, listener, options) => {\n return this.videoEventTarget_.removeEventListener(\n type, listener, options);\n };\n }\n\n // If we are casting, but the first update has not come in yet, use local\n // values, but not local methods.\n if (this.sender_.isCasting() && !this.sender_.hasRemoteProperties()) {\n const value = this.localVideo_[name];\n if (typeof value != 'function') {\n return value;\n }\n }\n\n // Use local values and methods if we are not casting.\n if (!this.sender_.isCasting()) {\n let value = this.localVideo_[name];\n if (typeof value == 'function') {\n // eslint-disable-next-line no-restricted-syntax\n value = value.bind(this.localVideo_);\n }\n return value;\n }\n\n return this.sender_.get('video', name);\n }\n\n /**\n * @param {string} name\n * @param {?} value\n * @private\n */\n videoProxySet_(name, value) {\n if (!this.sender_.isCasting()) {\n this.localVideo_[name] = value;\n return;\n }\n\n this.sender_.set('video', name, value);\n }\n\n /**\n * @param {!Event} event\n * @private\n */\n videoProxyLocalEvent_(event) {\n if (this.sender_.isCasting()) {\n // Ignore any unexpected local events while casting. Events can still be\n // fired by the local video and Player when we unload() after the Cast\n // connection is complete.\n return;\n }\n\n // Convert this real Event into a FakeEvent for dispatch from our\n // FakeEventListener.\n const fakeEvent = shaka.util.FakeEvent.fromRealEvent(event);\n this.videoEventTarget_.dispatchEvent(fakeEvent);\n }\n\n /**\n * @param {string} name\n * @return {?}\n * @private\n */\n playerProxyGet_(name) {\n // If name is a shortened compiled name, get the original version\n // from our map.\n if (this.compiledToExternNames_.has(name)) {\n name = this.compiledToExternNames_.get(name);\n }\n\n if (name == 'addEventListener') {\n return (type, listener, options) => {\n return this.playerEventTarget_.addEventListener(\n type, listener, options);\n };\n }\n if (name == 'removeEventListener') {\n return (type, listener, options) => {\n return this.playerEventTarget_.removeEventListener(\n type, listener, options);\n };\n }\n\n if (name == 'getMediaElement') {\n return () => this.videoProxy_;\n }\n\n if (name == 'getSharedConfiguration') {\n shaka.log.warning(\n 'Can\\'t share configuration across a network. Returning copy.');\n return this.sender_.get('player', 'getConfiguration');\n }\n\n if (name == 'getNetworkingEngine') {\n // Always returns a local instance, in case you need to make a request.\n // Issues a warning, in case you think you are making a remote request\n // or affecting remote filters.\n if (this.sender_.isCasting()) {\n shaka.log.warning('NOTE: getNetworkingEngine() is always local!');\n }\n return () => this.localPlayer_.getNetworkingEngine();\n }\n\n if (name == 'getDrmEngine') {\n // Always returns a local instance.\n if (this.sender_.isCasting()) {\n shaka.log.warning('NOTE: getDrmEngine() is always local!');\n }\n return () => this.localPlayer_.getDrmEngine();\n }\n\n if (name == 'getAdManager') {\n // Always returns a local instance.\n if (this.sender_.isCasting()) {\n shaka.log.warning('NOTE: getAdManager() is always local!');\n }\n return () => this.localPlayer_.getAdManager();\n }\n\n if (name == 'setVideoContainer') {\n // Always returns a local instance.\n if (this.sender_.isCasting()) {\n shaka.log.warning('NOTE: setVideoContainer() is always local!');\n }\n return (container) => this.localPlayer_.setVideoContainer(container);\n }\n\n if (this.sender_.isCasting()) {\n // These methods are unavailable or otherwise stubbed during casting.\n if (name == 'getManifest' || name == 'drmInfo') {\n return () => {\n shaka.log.alwaysWarn(name + '() does not work while casting!');\n return null;\n };\n }\n\n if (name == 'attach' || name == 'detach') {\n return () => {\n shaka.log.alwaysWarn(name + '() does not work while casting!');\n return Promise.resolve();\n };\n }\n } // if (this.sender_.isCasting())\n\n // If we are casting, but the first update has not come in yet, use local\n // getters, but not local methods.\n if (this.sender_.isCasting() && !this.sender_.hasRemoteProperties()) {\n if (shaka.cast.CastUtils.PlayerGetterMethods.has(name) ||\n shaka.cast.CastUtils.LargePlayerGetterMethods.has(name)) {\n const value = /** @type {Object} */(this.localPlayer_)[name];\n goog.asserts.assert(typeof value == 'function',\n 'only methods on Player');\n // eslint-disable-next-line no-restricted-syntax\n return value.bind(this.localPlayer_);\n }\n }\n\n // Use local getters and methods if we are not casting.\n if (!this.sender_.isCasting()) {\n const value = /** @type {Object} */(this.localPlayer_)[name];\n goog.asserts.assert(typeof value == 'function',\n 'only methods on Player');\n // eslint-disable-next-line no-restricted-syntax\n return value.bind(this.localPlayer_);\n }\n\n return this.sender_.get('player', name);\n }\n\n /**\n * @param {!Event} event\n * @private\n */\n playerProxyLocalEvent_(event) {\n if (this.sender_.isCasting()) {\n // Ignore any unexpected local events while casting.\n return;\n }\n\n this.playerEventTarget_.dispatchEvent(event);\n }\n\n /**\n * @param {string} targetName\n * @param {!shaka.util.FakeEvent} event\n * @private\n */\n onRemoteEvent_(targetName, event) {\n goog.asserts.assert(this.sender_.isCasting(),\n 'Should only receive remote events while casting');\n if (!this.sender_.isCasting()) {\n // Ignore any unexpected remote events.\n return;\n }\n\n if (targetName == 'video') {\n this.videoEventTarget_.dispatchEvent(event);\n } else if (targetName == 'player') {\n this.playerEventTarget_.dispatchEvent(event);\n }\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.cast.CastReceiver');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.Player');\ngoog.require('shaka.cast.CastUtils');\ngoog.require('shaka.log');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.EventManager');\ngoog.require('shaka.util.FakeEvent');\ngoog.require('shaka.util.FakeEventTarget');\ngoog.require('shaka.util.IDestroyable');\ngoog.require('shaka.util.Platform');\ngoog.require('shaka.util.Timer');\n\n\n/**\n * A receiver to communicate between the Chromecast-hosted player and the\n * sender application.\n *\n * @implements {shaka.util.IDestroyable}\n * @export\n */\nshaka.cast.CastReceiver = class extends shaka.util.FakeEventTarget {\n /**\n * @param {!HTMLMediaElement} video The local video element associated with\n * the local Player instance.\n * @param {!shaka.Player} player A local Player instance.\n * @param {function(Object)=} appDataCallback A callback to handle\n * application-specific data passed from the sender. This can come either\n * from a Shaka-based sender through CastProxy.setAppData, or from a\n * sender using the customData field of the LOAD message of the standard\n * Cast message namespace. It can also be null if no such data is sent.\n * @param {function(string):string=} contentIdCallback A callback to\n * retrieve manifest URI from the provided content id.\n */\n constructor(video, player, appDataCallback, contentIdCallback) {\n super();\n\n /** @private {HTMLMediaElement} */\n this.video_ = video;\n\n /** @private {shaka.Player} */\n this.player_ = player;\n\n /** @private {shaka.util.EventManager} */\n this.eventManager_ = new shaka.util.EventManager();\n\n /** @private {Object} */\n this.targets_ = {\n 'video': video,\n 'player': player,\n };\n\n /** @private {?function(Object)} */\n this.appDataCallback_ = appDataCallback || (() => {});\n\n /** @private {?function(string):string} */\n this.contentIdCallback_ = contentIdCallback ||\n /**\n * @param {string} contentId\n * @return {string}\n */\n ((contentId) => contentId);\n\n /**\n * A Cast metadata object, one of:\n * - https://developers.google.com/cast/docs/reference/messages#GenericMediaMetadata\n * - https://developers.google.com/cast/docs/reference/messages#MovieMediaMetadata\n * - https://developers.google.com/cast/docs/reference/messages#TvShowMediaMetadata\n * - https://developers.google.com/cast/docs/reference/messages#MusicTrackMediaMetadata\n * @private {Object}\n */\n this.metadata_ = null;\n\n /** @private {boolean} */\n this.isConnected_ = false;\n\n /** @private {boolean} */\n this.isIdle_ = true;\n\n /** @private {number} */\n this.updateNumber_ = 0;\n\n /** @private {boolean} */\n this.startUpdatingUpdateNumber_ = false;\n\n /** @private {boolean} */\n this.initialStatusUpdatePending_ = true;\n\n /** @private {cast.receiver.CastMessageBus} */\n this.shakaBus_ = null;\n\n /** @private {cast.receiver.CastMessageBus} */\n this.genericBus_ = null;\n\n /** @private {shaka.util.Timer} */\n this.pollTimer_ = new shaka.util.Timer(() => {\n this.pollAttributes_();\n });\n\n this.init_();\n }\n\n /**\n * @return {boolean} True if the cast API is available and there are\n * receivers.\n * @export\n */\n isConnected() {\n return this.isConnected_;\n }\n\n /**\n * @return {boolean} True if the receiver is not currently doing loading or\n * playing anything.\n * @export\n */\n isIdle() {\n return this.isIdle_;\n }\n\n /**\n * Set all Cast content metadata, as defined by the Cast SDK.\n * Should be called from an appDataCallback.\n *\n * For a simpler way to set basic metadata, see:\n * - setContentTitle()\n * - setContentImage()\n * - setContentArtist()\n *\n * @param {Object} metadata\n * A Cast metadata object, one of:\n * - https://developers.google.com/cast/docs/reference/messages#GenericMediaMetadata\n * - https://developers.google.com/cast/docs/reference/messages#MovieMediaMetadata\n * - https://developers.google.com/cast/docs/reference/messages#TvShowMediaMetadata\n * - https://developers.google.com/cast/docs/reference/messages#MusicTrackMediaMetadata\n * @export\n */\n setContentMetadata(metadata) {\n this.metadata_ = metadata;\n }\n\n /**\n * Clear all Cast content metadata.\n * Should be called from an appDataCallback.\n *\n * @export\n */\n clearContentMetadata() {\n this.metadata_ = null;\n }\n\n /**\n * Set the Cast content's title.\n * Should be called from an appDataCallback.\n *\n * @param {string} title\n * @export\n */\n setContentTitle(title) {\n if (!this.metadata_) {\n this.metadata_ = {\n 'metadataType': cast.receiver.media.MetadataType.GENERIC,\n };\n }\n this.metadata_['title'] = title;\n }\n\n /**\n * Set the Cast content's thumbnail image.\n * Should be called from an appDataCallback.\n *\n * @param {string} imageUrl\n * @export\n */\n setContentImage(imageUrl) {\n if (!this.metadata_) {\n this.metadata_ = {\n 'metadataType': cast.receiver.media.MetadataType.GENERIC,\n };\n }\n this.metadata_['images'] = [\n {\n 'url': imageUrl,\n },\n ];\n }\n\n /**\n * Set the Cast content's artist.\n * Also sets the metadata type to music.\n * Should be called from an appDataCallback.\n *\n * @param {string} artist\n * @export\n */\n setContentArtist(artist) {\n if (!this.metadata_) {\n this.metadata_ = {};\n }\n this.metadata_['artist'] = artist;\n this.metadata_['metadataType'] =\n cast.receiver.media.MetadataType.MUSIC_TRACK;\n }\n\n /**\n * Destroys the underlying Player, then terminates the cast receiver app.\n *\n * @override\n * @export\n */\n async destroy() {\n if (this.eventManager_) {\n this.eventManager_.release();\n this.eventManager_ = null;\n }\n\n const waitFor = [];\n if (this.player_) {\n waitFor.push(this.player_.destroy());\n this.player_ = null;\n }\n\n if (this.pollTimer_) {\n this.pollTimer_.stop();\n this.pollTimer_ = null;\n }\n\n this.video_ = null;\n this.targets_ = null;\n this.appDataCallback_ = null;\n this.isConnected_ = false;\n this.isIdle_ = true;\n this.shakaBus_ = null;\n this.genericBus_ = null;\n\n // FakeEventTarget implements IReleasable\n super.release();\n\n await Promise.all(waitFor);\n\n const manager = cast.receiver.CastReceiverManager.getInstance();\n manager.stop();\n }\n\n /** @private */\n init_() {\n const manager = cast.receiver.CastReceiverManager.getInstance();\n manager.onSenderConnected = () => this.onSendersChanged_();\n manager.onSenderDisconnected = () => this.onSendersChanged_();\n manager.onSystemVolumeChanged = () => this.fakeVolumeChangeEvent_();\n\n this.genericBus_ = manager.getCastMessageBus(\n shaka.cast.CastUtils.GENERIC_MESSAGE_NAMESPACE);\n this.genericBus_.onMessage = (event) => this.onGenericMessage_(event);\n\n this.shakaBus_ = manager.getCastMessageBus(\n shaka.cast.CastUtils.SHAKA_MESSAGE_NAMESPACE);\n this.shakaBus_.onMessage = (event) => this.onShakaMessage_(event);\n\n if (goog.DEBUG) {\n // Sometimes it is useful to load the receiver app in Chrome to work on\n // the UI. To avoid log spam caused by the SDK trying to connect to web\n // sockets that don't exist, in uncompiled mode we check if the hosting\n // browser is a Chromecast before starting the receiver manager. We\n // wouldn't do browser detection except for debugging, so only do this in\n // uncompiled mode.\n if (shaka.util.Platform.isChromecast()) {\n manager.start();\n }\n } else {\n manager.start();\n }\n\n for (const name of shaka.cast.CastUtils.VideoEvents) {\n this.eventManager_.listen(\n this.video_, name, (event) => this.proxyEvent_('video', event));\n }\n\n for (const key in shaka.util.FakeEvent.EventName) {\n const name = shaka.util.FakeEvent.EventName[key];\n this.eventManager_.listen(\n this.player_, name, (event) => this.proxyEvent_('player', event));\n }\n\n // Do not start excluding values from update messages until the video is\n // fully loaded.\n this.eventManager_.listen(this.video_, 'loadeddata', () => {\n this.startUpdatingUpdateNumber_ = true;\n });\n\n // Maintain idle state.\n this.eventManager_.listen(this.player_, 'loading', () => {\n // No longer idle once loading. This allows us to show the spinner during\n // the initial buffering phase.\n this.isIdle_ = false;\n this.onCastStatusChanged_();\n });\n this.eventManager_.listen(this.video_, 'playing', () => {\n // No longer idle once playing. This allows us to replay a video without\n // reloading.\n this.isIdle_ = false;\n this.onCastStatusChanged_();\n });\n this.eventManager_.listen(this.video_, 'pause', () => {\n this.onCastStatusChanged_();\n });\n this.eventManager_.listen(this.player_, 'unloading', () => {\n // Go idle when unloading content.\n this.isIdle_ = true;\n this.onCastStatusChanged_();\n });\n this.eventManager_.listen(this.video_, 'ended', () => {\n // Go idle 5 seconds after 'ended', assuming we haven't started again or\n // been destroyed.\n const timer = new shaka.util.Timer(() => {\n if (this.video_ && this.video_.ended) {\n this.isIdle_ = true;\n this.onCastStatusChanged_();\n }\n });\n\n timer.tickAfter(shaka.cast.CastReceiver.IDLE_INTERVAL);\n });\n\n // Do not start polling until after the sender's 'init' message is handled.\n }\n\n /** @private */\n onSendersChanged_() {\n // Reset update message frequency values, to make sure whomever joined\n // will get a full update message.\n this.updateNumber_ = 0;\n // Don't reset startUpdatingUpdateNumber_, because this operation does not\n // result in new data being loaded.\n this.initialStatusUpdatePending_ = true;\n\n const manager = cast.receiver.CastReceiverManager.getInstance();\n this.isConnected_ = manager.getSenders().length != 0;\n this.onCastStatusChanged_();\n }\n\n /**\n * Dispatch an event to notify the receiver app that the status has changed.\n * @private\n */\n async onCastStatusChanged_() {\n // Do this asynchronously so that synchronous changes to idle state (such as\n // Player calling unload() as part of load()) are coalesced before the event\n // goes out.\n await Promise.resolve();\n if (!this.player_) {\n // We've already been destroyed.\n return;\n }\n\n const event = new shaka.util.FakeEvent('caststatuschanged');\n this.dispatchEvent(event);\n // Send a media status message, with a media info message if appropriate.\n if (!this.maybeSendMediaInfoMessage_()) {\n this.sendMediaStatus_();\n }\n }\n\n /**\n * Take on initial state from the sender.\n * @param {shaka.cast.CastUtils.InitStateType} initState\n * @param {Object} appData\n * @private\n */\n async initState_(initState, appData) {\n // Take on player state first.\n for (const k in initState['player']) {\n const v = initState['player'][k];\n // All player state vars are setters to be called.\n /** @type {Object} */(this.player_)[k](v);\n }\n\n // Now process custom app data, which may add additional player configs:\n this.appDataCallback_(appData);\n\n const autoplay = this.video_.autoplay;\n\n // Now load the manifest, if present.\n if (initState['manifest']) {\n // Don't autoplay the content until we finish setting up initial state.\n this.video_.autoplay = false;\n try {\n await this.player_.load(initState['manifest'], initState['startTime']);\n } catch (error) {\n // Pass any errors through to the app.\n goog.asserts.assert(error instanceof shaka.util.Error,\n 'Wrong error type! Error: ' + error);\n const eventType = shaka.util.FakeEvent.EventName.Error;\n const data = (new Map()).set('detail', error);\n const event = new shaka.util.FakeEvent(eventType, data);\n // Only dispatch the event if the player still exists.\n if (this.player_) {\n this.player_.dispatchEvent(event);\n }\n return;\n }\n } else {\n // Ensure the below happens async.\n await Promise.resolve();\n }\n\n if (!this.player_) {\n // We've already been destroyed.\n return;\n }\n\n // Finally, take on video state and player's \"after load\" state.\n for (const k in initState['video']) {\n const v = initState['video'][k];\n this.video_[k] = v;\n }\n\n for (const k in initState['playerAfterLoad']) {\n const v = initState['playerAfterLoad'][k];\n // All player state vars are setters to be called.\n /** @type {Object} */(this.player_)[k](v);\n }\n\n // Restore original autoplay setting.\n this.video_.autoplay = autoplay;\n if (initState['manifest']) {\n // Resume playback with transferred state.\n this.video_.play();\n // Notify generic controllers of the state change.\n this.sendMediaStatus_();\n }\n }\n\n /**\n * @param {string} targetName\n * @param {!Event} event\n * @private\n */\n proxyEvent_(targetName, event) {\n if (!this.player_) {\n // The receiver is destroyed, so it should ignore further events.\n return;\n }\n\n // Poll and send an update right before we send the event. Some events\n // indicate an attribute change, so that change should be visible when the\n // event is handled.\n this.pollAttributes_();\n\n this.sendMessage_({\n 'type': 'event',\n 'targetName': targetName,\n 'event': event,\n }, this.shakaBus_);\n }\n\n /** @private */\n pollAttributes_() {\n // The poll timer may have been pre-empted by an event (e.g. timeupdate).\n // Calling |start| will cancel any pending calls and therefore will avoid us\n // polling too often.\n this.pollTimer_.tickAfter(shaka.cast.CastReceiver.POLL_INTERVAL);\n\n const update = {\n 'video': {},\n 'player': {},\n };\n\n for (const name of shaka.cast.CastUtils.VideoAttributes) {\n update['video'][name] = this.video_[name];\n }\n\n // TODO: Instead of this variable frequency update system, instead cache the\n // previous player state and only send over changed values, with complete\n // updates every ~20 updates to account for dropped messages.\n\n if (this.player_.isLive()) {\n const PlayerGetterMethodsThatRequireLive =\n shaka.cast.CastUtils.PlayerGetterMethodsThatRequireLive;\n PlayerGetterMethodsThatRequireLive.forEach((frequency, name) => {\n if (this.updateNumber_ % frequency == 0) {\n update['player'][name] = /** @type {Object} */ (this.player_)[name]();\n }\n });\n }\n shaka.cast.CastUtils.PlayerGetterMethods.forEach((frequency, name) => {\n if (this.updateNumber_ % frequency == 0) {\n update['player'][name] = /** @type {Object} */ (this.player_)[name]();\n }\n });\n\n // Volume attributes are tied to the system volume.\n const manager = cast.receiver.CastReceiverManager.getInstance();\n const systemVolume = manager.getSystemVolume();\n if (systemVolume) {\n update['video']['volume'] = systemVolume.level;\n update['video']['muted'] = systemVolume.muted;\n }\n\n this.sendMessage_({\n 'type': 'update',\n 'update': update,\n }, this.shakaBus_);\n\n // Getters with large outputs each get sent in their own update message.\n shaka.cast.CastUtils.LargePlayerGetterMethods.forEach((frequency, name) => {\n if (this.updateNumber_ % frequency == 0) {\n const update = {'player': {}};\n update['player'][name] = /** @type {Object} */ (this.player_)[name]();\n\n this.sendMessage_({\n 'type': 'update',\n 'update': update,\n }, this.shakaBus_);\n }\n });\n\n // Only start progressing the update number once data is loaded,\n // just in case any of the \"rarely changing\" properties with less frequent\n // update messages changes significantly during the loading process.\n if (this.startUpdatingUpdateNumber_) {\n this.updateNumber_ += 1;\n }\n\n this.maybeSendMediaInfoMessage_();\n }\n\n /**\n * Composes and sends a mediaStatus message if appropriate.\n * @return {boolean}\n * @private\n */\n maybeSendMediaInfoMessage_() {\n if (this.initialStatusUpdatePending_ &&\n (this.video_.duration || this.player_.isLive())) {\n // Send over a media status message to set the duration of the cast\n // dialogue.\n this.sendMediaInfoMessage_();\n this.initialStatusUpdatePending_ = false;\n return true;\n }\n return false;\n }\n\n /**\n * Composes and sends a mediaStatus message with a mediaInfo component.\n *\n * @param {number=} requestId\n * @private\n */\n sendMediaInfoMessage_(requestId = 0) {\n const media = {\n 'contentId': this.player_.getAssetUri(),\n 'streamType': this.player_.isLive() ? 'LIVE' : 'BUFFERED',\n // Sending an empty string for now since it's a mandatory field.\n // We don't have this info, and it doesn't seem to be useful, anyway.\n 'contentType': '',\n };\n if (!this.player_.isLive()) {\n // Optional, and only sent when the duration is known.\n media['duration'] = this.video_.duration;\n }\n if (this.metadata_) {\n media['metadata'] = this.metadata_;\n }\n this.sendMediaStatus_(requestId, media);\n }\n\n /**\n * Dispatch a fake 'volumechange' event to mimic the video element, since\n * volume changes are routed to the system volume on the receiver.\n * @private\n */\n fakeVolumeChangeEvent_() {\n // Volume attributes are tied to the system volume.\n const manager = cast.receiver.CastReceiverManager.getInstance();\n const systemVolume = manager.getSystemVolume();\n goog.asserts.assert(systemVolume, 'System volume should not be null!');\n\n if (systemVolume) {\n // Send an update message with just the latest volume level and muted\n // state.\n this.sendMessage_({\n 'type': 'update',\n 'update': {\n 'video': {\n 'volume': systemVolume.level,\n 'muted': systemVolume.muted,\n },\n },\n }, this.shakaBus_);\n }\n\n // Send another message with a 'volumechange' event to update the sender's\n // UI.\n this.sendMessage_({\n 'type': 'event',\n 'targetName': 'video',\n 'event': {'type': 'volumechange'},\n }, this.shakaBus_);\n }\n\n /**\n * Since this method is in the compiled library, make sure all messages are\n * read with quoted properties.\n * @param {!cast.receiver.CastMessageBus.Event} event\n * @private\n */\n onShakaMessage_(event) {\n const message = shaka.cast.CastUtils.deserialize(event.data);\n shaka.log.debug('CastReceiver: message', message);\n\n switch (message['type']) {\n case 'init':\n // Reset update message frequency values after initialization.\n this.updateNumber_ = 0;\n this.startUpdatingUpdateNumber_ = false;\n this.initialStatusUpdatePending_ = true;\n\n this.initState_(message['initState'], message['appData']);\n // The sender is supposed to reflect the cast system volume after\n // connecting. Using fakeVolumeChangeEvent_() would create a race on\n // the sender side, since it would have volume properties, but no\n // others.\n // This would lead to hasRemoteProperties() being true, even though a\n // complete set had never been sent.\n // Now that we have init state, this is a good time for the first update\n // message anyway.\n this.pollAttributes_();\n break;\n case 'appData':\n this.appDataCallback_(message['appData']);\n break;\n case 'set': {\n const targetName = message['targetName'];\n const property = message['property'];\n const value = message['value'];\n\n if (targetName == 'video') {\n // Volume attributes must be rerouted to the system.\n const manager = cast.receiver.CastReceiverManager.getInstance();\n if (property == 'volume') {\n manager.setSystemVolumeLevel(value);\n break;\n } else if (property == 'muted') {\n manager.setSystemVolumeMuted(value);\n break;\n }\n }\n\n this.targets_[targetName][property] = value;\n break;\n }\n case 'call': {\n const targetName = message['targetName'];\n const methodName = message['methodName'];\n const args = message['args'];\n const target = this.targets_[targetName];\n // eslint-disable-next-line prefer-spread\n target[methodName].apply(target, args);\n break;\n }\n case 'asyncCall': {\n const targetName = message['targetName'];\n const methodName = message['methodName'];\n if (targetName == 'player' && methodName == 'load') {\n // Reset update message frequency values after a load.\n this.updateNumber_ = 0;\n this.startUpdatingUpdateNumber_ = false;\n }\n const args = message['args'];\n const id = message['id'];\n const senderId = event.senderId;\n const target = this.targets_[targetName];\n // eslint-disable-next-line prefer-spread\n let p = target[methodName].apply(target, args);\n if (targetName == 'player' && methodName == 'load') {\n // Wait until the manifest has actually loaded to send another media\n // info message, so on a new load it doesn't send the old info over.\n p = p.then(() => {\n this.initialStatusUpdatePending_ = true;\n });\n }\n // Replies must go back to the specific sender who initiated, so that we\n // don't have to deal with conflicting IDs between senders.\n p.then(\n () => this.sendAsyncComplete_(senderId, id, /* error= */ null),\n (error) => this.sendAsyncComplete_(senderId, id, error));\n break;\n }\n }\n }\n\n /**\n * @param {!cast.receiver.CastMessageBus.Event} event\n * @private\n */\n onGenericMessage_(event) {\n const message = shaka.cast.CastUtils.deserialize(event.data);\n shaka.log.debug('CastReceiver: message', message);\n // TODO(ismena): error message on duplicate request id from the same sender\n switch (message['type']) {\n case 'PLAY':\n this.video_.play();\n // Notify generic controllers that the player state changed.\n // requestId=0 (the parameter) means that the message was not\n // triggered by a GET_STATUS request.\n this.sendMediaStatus_();\n break;\n case 'PAUSE':\n this.video_.pause();\n this.sendMediaStatus_();\n break;\n case 'SEEK': {\n const currentTime = message['currentTime'];\n const resumeState = message['resumeState'];\n if (currentTime != null) {\n this.video_.currentTime = Number(currentTime);\n }\n if (resumeState && resumeState == 'PLAYBACK_START') {\n this.video_.play();\n this.sendMediaStatus_();\n } else if (resumeState && resumeState == 'PLAYBACK_PAUSE') {\n this.video_.pause();\n this.sendMediaStatus_();\n }\n break;\n }\n case 'STOP':\n this.player_.unload().then(() => {\n if (!this.player_) {\n // We've already been destroyed.\n return;\n }\n\n this.sendMediaStatus_();\n });\n break;\n case 'GET_STATUS':\n // TODO(ismena): According to the SDK this is supposed to be a\n // unicast message to the sender that requested the status,\n // but it doesn't appear to be working.\n // Look into what's going on there and change this to be a\n // unicast.\n this.sendMediaInfoMessage_(Number(message['requestId']));\n break;\n case 'VOLUME': {\n const volumeObject = message['volume'];\n const level = volumeObject['level'];\n const muted = volumeObject['muted'];\n const oldVolumeLevel = this.video_.volume;\n const oldVolumeMuted = this.video_.muted;\n if (level != null) {\n this.video_.volume = Number(level);\n }\n if (muted != null) {\n this.video_.muted = muted;\n }\n // Notify generic controllers if the volume changed.\n if (oldVolumeLevel != this.video_.volume ||\n oldVolumeMuted != this.video_.muted) {\n this.sendMediaStatus_();\n }\n break;\n }\n case 'LOAD': {\n // Reset update message frequency values after a load.\n this.updateNumber_ = 0;\n this.startUpdatingUpdateNumber_ = false;\n // This already sends an update.\n this.initialStatusUpdatePending_ = false;\n\n const mediaInfo = message['media'];\n const contentId = mediaInfo['contentId'];\n const currentTime = message['currentTime'];\n const assetUri = this.contentIdCallback_(contentId);\n const autoplay = message['autoplay'] || true;\n const customData = mediaInfo['customData'];\n\n this.appDataCallback_(customData);\n\n if (autoplay) {\n this.video_.autoplay = true;\n }\n this.player_.load(assetUri, currentTime).then(() => {\n if (!this.player_) {\n // We've already been destroyed.\n return;\n }\n\n // Notify generic controllers that the media has changed.\n this.sendMediaInfoMessage_();\n }).catch((error) => {\n goog.asserts.assert(error instanceof shaka.util.Error,\n 'Wrong error type!');\n\n // Load failed. Dispatch the error message to the sender.\n let type = 'LOAD_FAILED';\n if (error.category == shaka.util.Error.Category.PLAYER &&\n error.code == shaka.util.Error.Code.LOAD_INTERRUPTED) {\n type = 'LOAD_CANCELLED';\n }\n\n this.sendMessage_({\n 'requestId': Number(message['requestId']),\n 'type': type,\n }, this.genericBus_);\n });\n break;\n }\n default:\n shaka.log.warning(\n 'Unrecognized message type from the generic Chromecast controller!',\n message['type']);\n // Dispatch an error to the sender.\n this.sendMessage_({\n 'requestId': Number(message['requestId']),\n 'type': 'INVALID_REQUEST',\n 'reason': 'INVALID_COMMAND',\n }, this.genericBus_);\n break;\n }\n }\n\n /**\n * Tell the sender that the async operation is complete.\n * @param {string} senderId\n * @param {string} id\n * @param {shaka.util.Error} error\n * @private\n */\n sendAsyncComplete_(senderId, id, error) {\n if (!this.player_) {\n // We've already been destroyed.\n return;\n }\n\n this.sendMessage_({\n 'type': 'asyncComplete',\n 'id': id,\n 'error': error,\n }, this.shakaBus_, senderId);\n }\n\n /**\n * Since this method is in the compiled library, make sure all messages passed\n * in here were created with quoted property names.\n * @param {!Object} message\n * @param {cast.receiver.CastMessageBus} bus\n * @param {string=} senderId\n * @private\n */\n sendMessage_(message, bus, senderId) {\n // Cuts log spam when debugging the receiver UI in Chrome.\n if (!this.isConnected_) {\n return;\n }\n\n const serialized = shaka.cast.CastUtils.serialize(message);\n if (senderId) {\n bus.getCastChannel(senderId).send(serialized);\n } else {\n bus.broadcast(serialized);\n }\n }\n\n /**\n * @return {string}\n * @private\n */\n getPlayState_() {\n const playState = shaka.cast.CastReceiver.PLAY_STATE;\n if (this.isIdle_) {\n return playState.IDLE;\n } else if (this.player_.isBuffering()) {\n return playState.BUFFERING;\n } else if (this.video_.paused) {\n return playState.PAUSED;\n } else {\n return playState.PLAYING;\n }\n }\n\n /**\n * @param {number=} requestId\n * @param {Object=} media\n * @private\n */\n sendMediaStatus_(requestId = 0, media = null) {\n const mediaStatus = {\n // mediaSessionId is a unique ID for the playback of this specific\n // session.\n // It's used to identify a specific instance of a playback.\n // We don't support multiple playbacks, so just return 0.\n 'mediaSessionId': 0,\n 'playbackRate': this.video_.playbackRate,\n 'playerState': this.getPlayState_(),\n 'currentTime': this.video_.currentTime,\n // supportedMediaCommands is a sum of all the flags of commands that the\n // player supports.\n // The list of commands with respective flags is:\n // 1 - Pause\n // 2 - Seek\n // 4 - Stream volume\n // 8 - Stream mute\n // 16 - Skip forward\n // 32 - Skip backward\n // We support all of them, and their sum is 63.\n 'supportedMediaCommands': 63,\n 'volume': {\n 'level': this.video_.volume,\n 'muted': this.video_.muted,\n },\n };\n\n if (media) {\n mediaStatus['media'] = media;\n }\n\n const ret = {\n 'requestId': requestId,\n 'type': 'MEDIA_STATUS',\n 'status': [mediaStatus],\n };\n\n this.sendMessage_(ret, this.genericBus_);\n }\n};\n\n/** @type {number} The interval, in seconds, to poll for changes. */\nshaka.cast.CastReceiver.POLL_INTERVAL = 0.5;\n\n/** @type {number} The interval, in seconds, to go \"idle\". */\nshaka.cast.CastReceiver.IDLE_INTERVAL = 5;\n\n/**\n * @enum {string}\n */\nshaka.cast.CastReceiver.PLAY_STATE = {\n IDLE: 'IDLE',\n PLAYING: 'PLAYING',\n BUFFERING: 'BUFFERING',\n PAUSED: 'PAUSED',\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.cea.CeaUtils');\ngoog.provide('shaka.cea.CeaUtils.StyledChar');\n\ngoog.require('shaka.text.Cue');\n\n\nshaka.cea.CeaUtils = class {\n /**\n * Emits a closed caption based on the state of the buffer.\n * @param {!shaka.text.Cue} topLevelCue\n * @param {string} stream\n * @param {!Array<!Array<?shaka.cea.CeaUtils.StyledChar>>} memory\n * @param {number} startTime Start time of the cue.\n * @param {number} endTime End time of the cue.\n * @return {?shaka.extern.ICaptionDecoder.ClosedCaption}\n */\n static getParsedCaption(topLevelCue, stream, memory, startTime, endTime) {\n if (startTime >= endTime) {\n return null;\n }\n\n // Find the first and last row that contains characters.\n let firstNonEmptyRow = -1;\n let lastNonEmptyRow = -1;\n\n for (let i = 0; i < memory.length; i++) {\n if (memory[i].some((e) => e != null && e.getChar().trim() != '')) {\n firstNonEmptyRow = i;\n break;\n }\n }\n\n for (let i = memory.length - 1; i >= 0; i--) {\n if (memory[i].some((e) => e != null && e.getChar().trim() != '')) {\n lastNonEmptyRow = i;\n break;\n }\n }\n\n // Exit early if no non-empty row was found.\n if (firstNonEmptyRow === -1 || lastNonEmptyRow === -1) {\n return null;\n }\n\n // Keeps track of the current styles for a cue being emitted.\n let currentUnderline = false;\n let currentItalics = false;\n let currentTextColor = shaka.cea.CeaUtils.DEFAULT_TXT_COLOR;\n let currentBackgroundColor = shaka.cea.CeaUtils.DEFAULT_BG_COLOR;\n\n // Create first cue that will be nested in top level cue. Default styles.\n let currentCue = shaka.cea.CeaUtils.createStyledCue(\n startTime, endTime, currentUnderline, currentItalics,\n currentTextColor, currentBackgroundColor);\n\n // Logic: Reduce rows into a single top level cue containing nested cues.\n // Each nested cue corresponds either a style change or a line break.\n\n for (let i = firstNonEmptyRow; i <= lastNonEmptyRow; i++) {\n // Find the first and last non-empty characters in this row. We do this so\n // no styles creep in before/after the first and last non-empty chars.\n const row = memory[i];\n let firstNonEmptyCol = -1;\n let lastNonEmptyCol = -1;\n\n for (let j = 0; j < row.length; j++) {\n if (row[j] != null && row[j].getChar().trim() !== '') {\n firstNonEmptyCol = j;\n break;\n }\n }\n\n for (let j = row.length - 1; j >= 0; j--) {\n if (row[j] != null && row[j].getChar().trim() !== '') {\n lastNonEmptyCol = j;\n break;\n }\n }\n\n // If no non-empty char. was found in this row, it must be a linebreak.\n if (firstNonEmptyCol === -1 || lastNonEmptyCol === -1) {\n const linebreakCue = shaka.cea.CeaUtils\n .createLineBreakCue(startTime, endTime);\n topLevelCue.nestedCues.push(linebreakCue);\n continue;\n }\n\n for (let j = firstNonEmptyCol; j <= lastNonEmptyCol; j++) {\n const styledChar = row[j];\n\n // A null between non-empty cells in a row is handled as a space.\n if (!styledChar) {\n currentCue.payload += ' ';\n continue;\n }\n const underline = styledChar.isUnderlined();\n const italics = styledChar.isItalicized();\n const textColor = styledChar.getTextColor();\n const backgroundColor = styledChar.getBackgroundColor();\n\n // If any style properties have changed, we need to open a new cue.\n if (underline != currentUnderline || italics != currentItalics ||\n textColor != currentTextColor ||\n backgroundColor != currentBackgroundColor) {\n // Push the currently built cue and start a new cue, with new styles.\n if (currentCue.payload) {\n topLevelCue.nestedCues.push(currentCue);\n }\n currentCue = shaka.cea.CeaUtils.createStyledCue(\n startTime, endTime, underline,\n italics, textColor, backgroundColor);\n\n currentUnderline = underline;\n currentItalics = italics;\n currentTextColor = textColor;\n currentBackgroundColor = backgroundColor;\n }\n\n currentCue.payload += styledChar.getChar();\n }\n if (currentCue.payload) {\n topLevelCue.nestedCues.push(currentCue);\n }\n\n // Add a linebreak since the row just ended.\n if (i !== lastNonEmptyRow) {\n const linebreakCue = shaka.cea.CeaUtils\n .createLineBreakCue(startTime, endTime);\n topLevelCue.nestedCues.push(linebreakCue);\n }\n\n // Create a new cue.\n currentCue = shaka.cea.CeaUtils.createStyledCue(\n startTime, endTime, currentUnderline, currentItalics,\n currentTextColor, currentBackgroundColor);\n }\n\n if (topLevelCue.nestedCues.length) {\n return {\n cue: topLevelCue,\n stream,\n };\n }\n\n return null;\n }\n\n /**\n * @param {number} startTime\n * @param {number} endTime\n * @param {boolean} underline\n * @param {boolean} italics\n * @param {string} txtColor\n * @param {string} bgColor\n * @return {!shaka.text.Cue}\n */\n static createStyledCue(startTime, endTime, underline,\n italics, txtColor, bgColor) {\n const cue = new shaka.text.Cue(startTime, endTime, /* payload= */ '');\n if (underline) {\n cue.textDecoration.push(shaka.text.Cue.textDecoration.UNDERLINE);\n }\n if (italics) {\n cue.fontStyle = shaka.text.Cue.fontStyle.ITALIC;\n }\n cue.color = txtColor;\n cue.backgroundColor = bgColor;\n return cue;\n }\n\n /**\n * @param {number} startTime\n * @param {number} endTime\n * @return {!shaka.text.Cue}\n */\n static createLineBreakCue(startTime, endTime) {\n const linebreakCue = new shaka.text.Cue(\n startTime, endTime, /* payload= */ '');\n linebreakCue.lineBreak = true;\n return linebreakCue;\n }\n};\n\nshaka.cea.CeaUtils.StyledChar = class {\n /**\n * @param {string} character\n * @param {boolean} underline\n * @param {boolean} italics\n * @param {string} backgroundColor\n * @param {string} textColor\n */\n constructor(character, underline, italics, backgroundColor, textColor) {\n /**\n * @private {string}\n */\n this.character_ = character;\n\n /**\n * @private {boolean}\n */\n this.underline_ = underline;\n\n /**\n * @private {boolean}\n */\n this.italics_ = italics;\n\n /**\n * @private {string}\n */\n this.backgroundColor_ = backgroundColor;\n\n /**\n * @private {string}\n */\n this.textColor_ = textColor;\n }\n\n /**\n * @return {string}\n */\n getChar() {\n return this.character_;\n }\n\n /**\n * @return {boolean}\n */\n isUnderlined() {\n return this.underline_;\n }\n\n /**\n * @return {boolean}\n */\n isItalicized() {\n return this.italics_;\n }\n\n /**\n * @return {string}\n */\n getBackgroundColor() {\n return this.backgroundColor_;\n }\n\n /**\n * @return {string}\n */\n getTextColor() {\n return this.textColor_;\n }\n};\n\n/**\n * Default background color for text.\n * @const {string}\n */\nshaka.cea.CeaUtils.DEFAULT_BG_COLOR = 'black';\n\n/**\n * Default text color.\n * @const {string}\n */\nshaka.cea.CeaUtils.DEFAULT_TXT_COLOR = 'white';\n\n/**\n * NALU type for Supplemental Enhancement Information (SEI) for H.264.\n * @const {number}\n */\nshaka.cea.CeaUtils.H264_NALU_TYPE_SEI = 0x06;\n\n/**\n * NALU type for Supplemental Enhancement Information (SEI) for H.265.\n * @const {number}\n */\nshaka.cea.CeaUtils.H265_PREFIX_NALU_TYPE_SEI = 0x27;\n\n/**\n * NALU type for Supplemental Enhancement Information (SEI) for H.265.\n * @const {number}\n */\nshaka.cea.CeaUtils.H265_SUFFIX_NALU_TYPE_SEI = 0x28;\n\n/**\n * NALU type for Supplemental Enhancement Information (SEI) for H.266.\n * @const {number}\n */\nshaka.cea.CeaUtils.H266_PREFIX_NALU_TYPE_SEI = 0x17;\n\n/**\n * NALU type for Supplemental Enhancement Information (SEI) for H.266.\n * @const {number}\n */\nshaka.cea.CeaUtils.H266_SUFFIX_NALU_TYPE_SEI = 0x18;\n\n/**\n * Default timescale value for a track.\n * @const {number}\n */\nshaka.cea.CeaUtils.DEFAULT_TIMESCALE_VALUE = 90000;\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.cea.Cea608Memory');\n\ngoog.require('shaka.cea.CeaUtils');\ngoog.require('shaka.text.Cue');\n\n\n/**\n * CEA-608 captions memory/buffer.\n */\nshaka.cea.Cea608Memory = class {\n /**\n * @param {number} fieldNum Field number.\n * @param {number} channelNum Channel number.\n */\n constructor(fieldNum, channelNum) {\n /**\n * Buffer for storing decoded characters.\n * @private @const {!Array<!Array<!shaka.cea.CeaUtils.StyledChar>>}\n */\n this.rows_ = [];\n\n /**\n * Current row.\n * @private {number}\n */\n this.row_ = 1;\n\n /**\n * Number of rows in the scroll window. Used for rollup mode.\n * @private {number}\n */\n this.scrollRows_ = 0;\n\n /**\n * Field number.\n * @private {number}\n */\n this.fieldNum_ = fieldNum;\n\n /**\n * Channel number.\n * @private {number}\n */\n this.channelNum_ = channelNum;\n\n /**\n * @private {boolean}\n */\n this.underline_ = false;\n\n /**\n * @private {boolean}\n */\n this.italics_ = false;\n\n /**\n * @private {string}\n */\n this.textColor_ = shaka.cea.CeaUtils.DEFAULT_TXT_COLOR;\n\n /**\n * @private {string}\n */\n this.backgroundColor_ = shaka.cea.CeaUtils.DEFAULT_BG_COLOR;\n\n /**\n * @private {?number}\n */\n this.offset_ = null;\n\n /**\n * @private {?number}\n */\n this.indent_ = null;\n\n this.reset();\n }\n\n /**\n * Emits a closed caption based on the state of the buffer.\n * @param {number} startTime Start time of the cue.\n * @param {number} endTime End time of the cue.\n * @return {?shaka.extern.ICaptionDecoder.ClosedCaption}\n */\n forceEmit(startTime, endTime) {\n const Cea608Memory = shaka.cea.Cea608Memory;\n const stream = `CC${((this.fieldNum_<< 1) | this.channelNum_) + 1}`;\n const topLevelCue = new shaka.text.Cue(\n startTime, endTime, /* payload= */ '');\n topLevelCue.lineInterpretation =\n shaka.text.Cue.lineInterpretation.PERCENTAGE;\n let line = Cea608Memory.ROW_TO_LINE_CONVERSION_.get(this.row_);\n if (line) {\n topLevelCue.line = line;\n }\n if (this.indent_ != null && this.offset_ != null) {\n topLevelCue.position = 10 + Math.min(70, this.indent_ * 10) +\n this.offset_ * 2.5;\n }\n const ret = shaka.cea.CeaUtils.getParsedCaption(\n topLevelCue, stream, this.rows_, startTime, endTime);\n // If the text and its lines are larger than what we can show on the\n // screen, we move the lines up so that the text does not come out of the\n // video.\n if (ret && (this.row_ + ret.cue.nestedCues.length - 3) > 15) {\n const newLinePosition = this.row_ + 3 - ret.cue.nestedCues.length;\n line = Cea608Memory.ROW_TO_LINE_CONVERSION_.get(newLinePosition);\n if (line) {\n topLevelCue.line = line;\n }\n }\n return ret;\n }\n\n /**\n * Resets the memory buffer.\n */\n reset() {\n this.resetAllRows();\n this.row_ = 1;\n }\n\n /**\n * @return {number}\n */\n getRow() {\n return this.row_;\n }\n\n /**\n * @param {number} row\n */\n setRow(row) {\n this.row_ = row;\n }\n\n /**\n * @return {number}\n */\n getScrollSize() {\n return this.scrollRows_;\n }\n\n /**\n * @param {number} scrollRows\n */\n setScrollSize(scrollRows) {\n this.scrollRows_ = scrollRows;\n }\n\n /**\n * Adds a character to the buffer.\n * @param {!shaka.cea.Cea608Memory.CharSet} set Character set.\n * @param {number} b CC byte to add.\n */\n addChar(set, b) {\n // Valid chars are in the range [0x20, 0x7f]\n if (b < 0x20 || b > 0x7f) {\n return;\n }\n\n let char = '';\n switch (set) {\n case shaka.cea.Cea608Memory.CharSet.BASIC_NORTH_AMERICAN:\n if (shaka.cea.Cea608Memory.CharSet.BasicNorthAmericanChars.has(b)) {\n char =\n shaka.cea.Cea608Memory.CharSet.BasicNorthAmericanChars.get(b);\n } else {\n // Regular ASCII\n char = String.fromCharCode(b);\n }\n break;\n case shaka.cea.Cea608Memory.CharSet.SPECIAL_NORTH_AMERICAN:\n char =\n shaka.cea.Cea608Memory.CharSet.SpecialNorthAmericanChars.get(b);\n break;\n case shaka.cea.Cea608Memory.CharSet.SPANISH_FRENCH:\n // Extended charset does a BS over preceding char, 6.4.2 EIA-608-B.\n this.eraseChar();\n char =\n shaka.cea.Cea608Memory.CharSet.ExtendedSpanishFrench.get(b);\n break;\n case shaka.cea.Cea608Memory.CharSet.PORTUGUESE_GERMAN:\n this.eraseChar();\n char =\n shaka.cea.Cea608Memory.CharSet.ExtendedPortugueseGerman.get(b);\n break;\n }\n\n if (char) {\n const styledChar = new shaka.cea.CeaUtils.StyledChar(\n char, this.underline_, this.italics_,\n this.backgroundColor_, this.textColor_);\n this.rows_[this.row_].push(styledChar);\n }\n }\n\n /**\n * Erases a character from the buffer.\n */\n eraseChar() {\n this.rows_[this.row_].pop();\n }\n\n /**\n * Moves rows of characters.\n * @param {number} dst Destination row index.\n * @param {number} src Source row index.\n * @param {number} count Count of rows to move.\n */\n moveRows(dst, src, count) {\n if (src < 0 || dst < 0) {\n return;\n }\n\n if (dst >= src) {\n for (let i = count-1; i >= 0; i--) {\n this.rows_[dst + i] = this.rows_[src + i].map((e) => e);\n }\n } else {\n for (let i = 0; i < count; i++) {\n this.rows_[dst + i] = this.rows_[src + i].map((e) => e);\n }\n }\n }\n\n /**\n * Resets rows of characters.\n * @param {number} idx Starting index.\n * @param {number} count Count of rows to reset.\n */\n resetRows(idx, count) {\n for (let i = 0; i <= count; i++) {\n this.rows_[idx + i] = [];\n }\n }\n\n /**\n * Resets the entire memory buffer.\n */\n resetAllRows() {\n this.resetRows(0, shaka.cea.Cea608Memory.CC_ROWS);\n }\n\n /**\n * Erases entire memory buffer.\n * Doesn't change scroll state or number of rows.\n */\n eraseBuffer() {\n this.row_ = (this.scrollRows_ > 0) ? this.scrollRows_ : 0;\n this.resetAllRows();\n }\n\n /**\n * @param {boolean} underline\n */\n setUnderline(underline) {\n this.underline_ = underline;\n }\n\n /**\n * @param {boolean} italics\n */\n setItalics(italics) {\n this.italics_ = italics;\n }\n\n /**\n * @param {string} color\n */\n setTextColor(color) {\n this.textColor_ = color;\n }\n\n /**\n * @param {string} color\n */\n setBackgroundColor(color) {\n this.backgroundColor_ = color;\n }\n\n /**\n * @param {number} offset\n */\n setOffset(offset) {\n this.offset_ = offset;\n }\n\n /**\n * @param {?number} indent\n */\n setIndent(indent) {\n this.indent_ = indent;\n }\n};\n\n/**\n * Maximum number of rows in the buffer.\n * @const {number}\n */\nshaka.cea.Cea608Memory.CC_ROWS = 15;\n\n/**\n * Characters sets.\n * @const @enum {number}\n */\nshaka.cea.Cea608Memory.CharSet = {\n BASIC_NORTH_AMERICAN: 0,\n SPECIAL_NORTH_AMERICAN: 1,\n SPANISH_FRENCH: 2,\n PORTUGUESE_GERMAN: 3,\n};\n\n/**\n * Basic North American char set deviates from ASCII with these exceptions.\n * @private @const {!Map<number, string>}\n */\nshaka.cea.Cea608Memory.CharSet.BasicNorthAmericanChars = new Map([\n [0x27, '’'], [0x2a, 'á'], [0x5c, 'é'], [0x5c, 'é'], [0x5e, 'í'], [0x5f, 'ó'],\n [0x60, 'ú'], [0x7b, 'ç'], [0x7c, '÷'], [0x7d, 'Ñ'], [0x7e, 'ñ'], [0x7f, '█'],\n]);\n\n/**\n * Special North American char set.\n * Note: Transparent Space is currently implemented as a regular space.\n * @private @const {!Map<number, string>}\n */\nshaka.cea.Cea608Memory.CharSet.SpecialNorthAmericanChars = new Map([\n [0x30, '®'], [0x31, '°'], [0x32, '½'], [0x33, '¿'], [0x34, '™'], [0x35, '¢'],\n [0x36, '£'], [0x37, '♪'], [0x38, 'à'], [0x39, ' '], [0x3a, 'è'], [0x3b, 'â'],\n [0x3c, 'ê'], [0x3d, 'î'], [0x3e, 'ô'], [0x3f, 'û'],\n]);\n\n/**\n * Extended Spanish/Misc/French char set.\n * @private @const {!Map<number, string>}\n */\nshaka.cea.Cea608Memory.CharSet.ExtendedSpanishFrench = new Map([\n [0x20, 'Á'], [0x21, 'É'], [0x22, 'Ó'], [0x23, 'Ú'], [0x24, 'Ü'], [0x25, 'ü'],\n [0x26, '‘'], [0x27, '¡'], [0x28, '*'], [0x29, '\\''], [0x2a, '─'], [0x2b, '©'],\n [0x2c, '℠'], [0x2d, '·'], [0x2e, '“'], [0x2f, '”'], [0x30, 'À'], [0x31, 'Â'],\n [0x32, 'Ç'], [0x33, 'È'], [0x34, 'Ê'], [0x35, 'Ë'], [0x36, 'ë'], [0x37, 'Î'],\n [0x38, 'Ï'], [0x39, 'ï'], [0x3a, 'Ô'], [0x3b, 'Ù'], [0x3c, 'ù'], [0x3d, 'Û'],\n [0x3e, '«'], [0x3f, '»'],\n]);\n\n/**\n * Extended Portuguese/German/Danish char set.\n * @private @const {!Map<number, string>}\n */\nshaka.cea.Cea608Memory.CharSet.ExtendedPortugueseGerman = new Map([\n [0x20, 'Ã'], [0x21, 'ã'], [0x22, 'Í'], [0x23, 'Ì'], [0x24, 'ì'], [0x25, 'Ò'],\n [0x26, 'ò'], [0x27, 'Õ'], [0x28, 'õ'], [0x29, '{'], [0x2a, '}'], [0x2b, '\\\\'],\n [0x2c, '^'], [0x2d, '_'], [0x2e, '|'], [0x2f, '~'], [0x30, 'Ä'], [0x31, 'ä'],\n [0x32, 'Ö'], [0x33, 'ö'], [0x34, 'ß'], [0x35, '¥'], [0x36, '¤'], [0x37, '│'],\n [0x38, 'Å'], [0x39, 'å'], [0x3a, 'Ø'], [0x3b, 'ø'], [0x3c, '┌'], [0x3d, '┐'],\n [0x3e, '└'], [0x3f, '┘'],\n]);\n\n/**\n * @private @const {!Map<number, number>}\n */\nshaka.cea.Cea608Memory.ROW_TO_LINE_CONVERSION_ = new Map([\n [1, 10], [2, 15.33], [3, 20.66], [4, 26], [5, 31.33], [6, 36.66], [7, 42],\n [8, 47.33], [9, 52.66], [10, 58], [11, 63.33], [12, 68.66], [13, 74],\n [14, 79.33], [15, 84.66],\n]);\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.cea.Cea608DataChannel');\n\ngoog.require('shaka.cea.Cea608Memory');\ngoog.require('shaka.cea.CeaUtils');\ngoog.require('shaka.log');\n\n\n/**\n * 608 closed captions channel.\n */\nshaka.cea.Cea608DataChannel = class {\n /**\n * @param {number} fieldNum Field number.\n * @param {number} channelNum Channel number.\n */\n constructor(fieldNum, channelNum) {\n /**\n * Current Caption Type.\n * @public {!shaka.cea.Cea608DataChannel.CaptionType}\n */\n this.type_ = shaka.cea.Cea608DataChannel.CaptionType.NONE;\n\n /**\n * Text buffer for CEA-608 \"text mode\". Although, we don't emit text mode.\n * So, this buffer serves as a no-op placeholder, just in case we receive\n * captions that toggle text mode.\n * @private @const {!shaka.cea.Cea608Memory}\n */\n this.text_ =\n new shaka.cea.Cea608Memory(fieldNum, channelNum);\n\n /**\n * Displayed memory.\n * @private {!shaka.cea.Cea608Memory}\n */\n this.displayedMemory_ =\n new shaka.cea.Cea608Memory(fieldNum, channelNum);\n\n /**\n * Non-displayed memory.\n * @private {!shaka.cea.Cea608Memory}\n */\n this.nonDisplayedMemory_ =\n new shaka.cea.Cea608Memory(fieldNum, channelNum);\n\n /**\n * Points to current buffer.\n * @private {!shaka.cea.Cea608Memory}\n */\n this.curBuf_ = this.nonDisplayedMemory_;\n\n /**\n * End time of the previous caption, serves as start time of next caption.\n * @private {number}\n */\n this.prevEndTime_ = 0;\n\n /**\n * Last control pair, 16 bits representing byte 1 and byte 2\n * @private {?number}\n */\n this.lastCp_ = null;\n }\n\n /**\n * Resets channel state.\n */\n reset() {\n this.type_ = shaka.cea.Cea608DataChannel.CaptionType.NONE;\n this.curBuf_ = this.nonDisplayedMemory_;\n this.lastCp_ = null;\n this.displayedMemory_.reset();\n this.nonDisplayedMemory_.reset();\n this.text_.reset();\n }\n\n /**\n * Set the initial PTS, which may not be 0 if we start decoding at a later\n * point in the stream. Without this, the first cue's startTime can be way\n * off.\n *\n * @param {number} pts\n */\n firstPts(pts) {\n this.prevEndTime_ = pts;\n }\n\n /**\n * Gets the row index from a Preamble Address Code byte pair.\n * @param {number} b1 Byte 1.\n * @param {number} b2 Byte 2.\n * @return {number} Row index.\n * @private\n */\n pacToRow_(b1, b2) {\n const ccRowTab = [\n 11, 11, // 0x00 or 0x01\n 1, 2, // 0x02 -> 0x03\n 3, 4, // 0x04 -> 0x05\n 12, 13, // 0x06 -> 0x07\n 14, 15, // 0x08 -> 0x09\n 5, 6, // 0x0A -> 0x0B\n 7, 8, // 0x0C -> 0x0D\n 9, 10, // 0x0E -> 0x0F\n ];\n return ccRowTab[((b1 & 0x07) << 1) | ((b2 >> 5) & 0x01)];\n }\n\n /**\n * PAC - Preamble Address Code.\n * b1 is of the form |P|0|0|1|C|0|ROW|\n * b2 is of the form |P|1|N|ATTRIBUTE|U|\n * @param {number} b1 Byte 1.\n * @param {number} b2 Byte 2.\n * @private\n */\n controlPac_(b1, b2) {\n const row = this.pacToRow_(b1, b2);\n\n // Set up the defaults.\n let textColor = shaka.cea.CeaUtils.DEFAULT_TXT_COLOR;\n let italics = false;\n let indent = null;\n\n // Get PAC index;\n let pacIndex;\n if (b2 > 0x5f) {\n pacIndex = b2 - 0x60;\n } else {\n pacIndex = b2 - 0x40;\n }\n\n if (pacIndex <= 0xd) {\n const colorIndex = Math.floor(pacIndex / 2);\n textColor = shaka.cea.Cea608DataChannel.TEXT_COLORS[colorIndex];\n } else if (pacIndex <= 0xf) {\n italics = true; // color stays white\n } else {\n indent = Math.floor((pacIndex - 0x10) / 2);\n }\n\n // PACs toggle underline on the last bit of b2.\n const underline = (b2 & 0x01) === 0x01;\n\n if (this.type_ === shaka.cea.Cea608DataChannel.CaptionType.TEXT) {\n // Don't execute the PAC if in text mode.\n return;\n }\n\n // Execute the PAC.\n const buf = this.curBuf_;\n\n // Move entire scroll window to a new base in rollup mode.\n if (this.type_ === shaka.cea.Cea608DataChannel.CaptionType.ROLLUP &&\n row !== buf.getRow()) {\n const oldTopRow = 1 + buf.getRow() - buf.getScrollSize();\n const newTopRow = 1 + row - buf.getScrollSize();\n\n // Shift up the scroll window.\n buf.moveRows(newTopRow, oldTopRow, buf.getScrollSize());\n\n // Clear everything outside of the new scroll window.\n buf.resetRows(0, newTopRow - 1);\n buf.resetRows(row + 1,\n shaka.cea.Cea608Memory.CC_ROWS - row);\n }\n buf.setRow(row);\n\n buf.setUnderline(underline);\n buf.setItalics(italics);\n buf.setTextColor(textColor);\n buf.setIndent(indent);\n\n // Clear the background color, since new row (PAC) should reset ALL styles.\n buf.setBackgroundColor(shaka.cea.CeaUtils.DEFAULT_BG_COLOR);\n }\n\n /**\n * Mid-Row control code handler.\n * @param {number} b2 Byte #2.\n * @private\n */\n controlMidrow_(b2) {\n // Clear all pre-existing midrow style attributes.\n this.curBuf_.setUnderline(false);\n this.curBuf_.setItalics(false);\n this.curBuf_.setTextColor(shaka.cea.CeaUtils.DEFAULT_TXT_COLOR);\n\n // Mid-row attrs use a space.\n this.curBuf_.addChar(\n shaka.cea.Cea608Memory.CharSet.BASIC_NORTH_AMERICAN, ' '.charCodeAt(0));\n\n let textColor = shaka.cea.CeaUtils.DEFAULT_TXT_COLOR;\n let italics = false;\n\n // Midrow codes set underline on last (LSB) bit.\n const underline = (b2 & 0x01) === 0x01;\n\n // b2 has the form |P|0|1|0|STYLE|U|\n textColor = shaka.cea.Cea608DataChannel.TEXT_COLORS[(b2 & 0xe) >> 1];\n if (textColor === 'white_italics') {\n textColor = 'white';\n italics = true;\n }\n\n this.curBuf_.setUnderline(underline);\n this.curBuf_.setItalics(italics);\n this.curBuf_.setTextColor(textColor);\n }\n\n /**\n * Background attribute control code handler.\n * @param {number} b1 Byte #1\n * @param {number} b2 Byte #2.\n * @private\n */\n controlBackgroundAttribute_(b1, b2) {\n let backgroundColor = shaka.cea.CeaUtils.DEFAULT_BG_COLOR;\n if ((b1 & 0x07) === 0x0) {\n // If background provided, last 3 bits of b1 are |0|0|0|. Color is in b2.\n backgroundColor = shaka.cea.Cea608DataChannel.BG_COLORS[(b2 & 0xe) >> 1];\n }\n this.curBuf_.setBackgroundColor(backgroundColor);\n }\n\n /**\n * The Cea608DataChannel control methods implement all CC control operations.\n * @param {!shaka.cea.Cea608DataChannel.Cea608Packet} ccPacket\n * @return {?shaka.extern.ICaptionDecoder.ClosedCaption}\n * @private\n */\n controlMiscellaneous_(ccPacket) {\n const MiscCmd = shaka.cea.Cea608DataChannel.MiscCmd_;\n const b2 = ccPacket.ccData2;\n const pts = ccPacket.pts;\n let parsedClosedCaption = null;\n\n switch (b2) {\n case MiscCmd.RCL:\n this.controlRcl_();\n break;\n case MiscCmd.BS:\n this.controlBs_();\n break;\n // unused (alarm off and alarm on)\n case MiscCmd.AOD:\n case MiscCmd.AON:\n break;\n case MiscCmd.DER:\n // Delete to End of Row. Not implemented since position not supported.\n break;\n case MiscCmd.RU2:\n parsedClosedCaption = this.controlRu_(2, pts);\n break;\n case MiscCmd.RU3:\n parsedClosedCaption = this.controlRu_(3, pts);\n break;\n case MiscCmd.RU4:\n parsedClosedCaption = this.controlRu_(4, pts);\n break;\n case MiscCmd.FON:\n this.controlFon_();\n break;\n case MiscCmd.RDC:\n this.controlRdc_(pts);\n break;\n case MiscCmd.TR:\n this.controlTr_();\n break;\n case MiscCmd.RTD:\n this.controlRtd_();\n break;\n case MiscCmd.EDM:\n parsedClosedCaption = this.controlEdm_(pts);\n break;\n case MiscCmd.CR:\n parsedClosedCaption = this.controlCr_(pts);\n break;\n case MiscCmd.ENM:\n this.controlEnm_();\n break;\n case MiscCmd.EOC:\n parsedClosedCaption = this.controlEoc_(pts);\n break;\n }\n return parsedClosedCaption;\n }\n\n /**\n * Handles CR - Carriage Return (Start new row).\n * CR only affects scroll windows (Rollup and Text modes).\n * Any currently buffered line needs to be emitted, along\n * with a window scroll action.\n * @param {number} pts in seconds.\n * @return {?shaka.extern.ICaptionDecoder.ClosedCaption}\n * @private\n */\n controlCr_(pts) {\n const buf = this.curBuf_;\n // Only rollup and text mode is affected, but we don't emit text mode.\n if (this.type_ !== shaka.cea.Cea608DataChannel.CaptionType.ROLLUP) {\n return null;\n }\n // Force out the scroll window since the top row will cleared.\n const parsedClosedCaption = buf.forceEmit(this.prevEndTime_, pts);\n\n // Calculate the top of the scroll window.\n const topRow = (buf.getRow() - buf.getScrollSize()) + 1;\n\n // Shift up the window one row higher.\n buf.moveRows(topRow - 1, topRow, buf.getScrollSize());\n\n // Clear out anything that's outside of our current scroll window.\n buf.resetRows(0, topRow - 1);\n buf.resetRows(buf.getRow(), shaka.cea.Cea608Memory.CC_ROWS - buf.getRow());\n\n // Update the end time so the next caption emits starting at this time.\n this.prevEndTime_ = pts;\n return parsedClosedCaption;\n }\n\n /**\n * Handles RU2, RU3, RU4 - Roll-Up, N rows.\n * If in TEXT, POPON or PAINTON, any displayed captions are erased.\n * This means must force emit entire display buffer.\n * @param {number} scrollSize New scroll window size.\n * @param {number} pts\n * @return {?shaka.extern.ICaptionDecoder.ClosedCaption}\n * @private\n */\n controlRu_(scrollSize, pts) {\n this.curBuf_ = this.displayedMemory_; // Point to displayed memory\n const buf = this.curBuf_;\n let parsedClosedCaption = null;\n\n // For any type except rollup and text mode, it should be emitted,\n // and memories cleared.\n if (this.type_ !== shaka.cea.Cea608DataChannel.CaptionType.ROLLUP &&\n this.type_ !== shaka.cea.Cea608DataChannel.CaptionType.TEXT) {\n parsedClosedCaption = buf.forceEmit(this.prevEndTime_, pts);\n\n // Clear both memories.\n this.displayedMemory_.eraseBuffer();\n this.nonDisplayedMemory_.eraseBuffer();\n\n // Rollup base row defaults to the last row (15).\n buf.setRow(shaka.cea.Cea608Memory.CC_ROWS);\n }\n this.type_ = shaka.cea.Cea608DataChannel.CaptionType.ROLLUP;\n\n // Set the new rollup window size.\n buf.setScrollSize(scrollSize);\n return parsedClosedCaption;\n }\n\n /**\n * Handles flash on.\n * @private\n */\n controlFon_() {\n this.curBuf_.addChar(\n shaka.cea.Cea608Memory.CharSet.BASIC_NORTH_AMERICAN,\n ' '.charCodeAt(0));\n }\n\n\n /**\n * Handles EDM - Erase Displayed Mem\n * Mode check:\n * EDM affects all captioning modes (but not Text mode);\n * @param {number} pts\n * @return {?shaka.extern.ICaptionDecoder.ClosedCaption}\n * @private\n */\n controlEdm_(pts) {\n const buf = this.displayedMemory_;\n let parsedClosedCaption = null;\n if (this.type_ !== shaka.cea.Cea608DataChannel.CaptionType.TEXT) {\n // Clearing displayed memory means we now know how long\n // its contents were displayed, so force it out.\n parsedClosedCaption = buf.forceEmit(this.prevEndTime_, pts);\n }\n buf.resetAllRows();\n return parsedClosedCaption;\n }\n\n /**\n * Handles RDC - Resume Direct Captions. Initiates Paint-On captioning mode.\n * RDC does not affect current display, so nothing needs to be forced out yet.\n * @param {number} pts in seconds\n * @private\n */\n controlRdc_(pts) {\n this.type_ = shaka.cea.Cea608DataChannel.CaptionType.PAINTON;\n // Point to displayed memory.\n this.curBuf_ = this.displayedMemory_;\n\n // No scroll window now.\n this.curBuf_.setScrollSize(0);\n\n // The next paint-on caption needs this time as the start time.\n this.prevEndTime_ = pts;\n }\n\n\n /**\n * Handles ENM - Erase Nondisplayed Mem\n * @private\n */\n controlEnm_() {\n this.nonDisplayedMemory_.resetAllRows();\n }\n\n /**\n * Handles EOC - End Of Caption (flip mem)\n * This forces Pop-On mode, and swaps the displayed and nondisplayed memories.\n * @private\n * @param {number} pts\n * @return {?shaka.extern.ICaptionDecoder.ClosedCaption}\n */\n controlEoc_(pts) {\n let parsedClosedCaption = null;\n if (this.type_ !== shaka.cea.Cea608DataChannel.CaptionType.TEXT) {\n parsedClosedCaption =\n this.displayedMemory_.forceEmit(this.prevEndTime_, pts);\n }\n // Swap memories\n const buf = this.nonDisplayedMemory_;\n this.nonDisplayedMemory_ = this.displayedMemory_; // Swap buffers\n this.displayedMemory_ = buf;\n\n // Enter Pop-On mode.\n this.controlRcl_();\n\n // The caption ended, and so the previous end time should be updated.\n this.prevEndTime_ = pts;\n return parsedClosedCaption;\n }\n\n /**\n * Handles RCL - Resume Caption Loading\n * Initiates Pop-On style captioning. No need to force anything out upon\n * entering Pop-On mode because it does not affect the current display.\n * @private\n */\n controlRcl_() {\n this.type_ = shaka.cea.Cea608DataChannel.CaptionType.POPON;\n this.curBuf_ = this.nonDisplayedMemory_;\n // No scroll window now\n this.curBuf_.setScrollSize(0);\n }\n\n\n /**\n * Handles BS - BackSpace.\n * @private\n */\n controlBs_() {\n this.curBuf_.eraseChar();\n }\n\n /**\n * Handles TR - Text Restart.\n * Clears text buffer and resumes Text Mode.\n * @private\n */\n controlTr_() {\n this.text_.reset();\n this.controlRtd_(); // Put into text mode.\n }\n\n /**\n * Handles RTD - Resume Text Display.\n * Resumes text mode. No need to force anything out, because Text Mode doesn't\n * affect current display. Also, this decoder does not emit Text Mode anyway.\n * @private\n */\n controlRtd_() {\n shaka.log.warnOnce('Cea608DataChannel',\n 'CEA-608 text mode entered, but is unsupported');\n this.curBuf_ = this.text_;\n this.type_ = shaka.cea.Cea608DataChannel.CaptionType.TEXT;\n }\n\n /**\n * Handles a Basic North American byte pair.\n * @param {number} b1 Byte 1.\n * @param {number} b2 Byte 2.\n */\n handleBasicNorthAmericanChar(b1, b2) {\n this.curBuf_.addChar(\n shaka.cea.Cea608Memory.CharSet.BASIC_NORTH_AMERICAN, b1);\n this.curBuf_.addChar(\n shaka.cea.Cea608Memory.CharSet.BASIC_NORTH_AMERICAN, b2);\n }\n\n /**\n * Handles an Extended Western European byte pair.\n * @param {number} b1 Byte 1.\n * @param {number} b2 Byte 2.\n * @private\n */\n handleExtendedWesternEuropeanChar_(b1, b2) {\n // Get the char set from the LSB, which is the char set toggle bit.\n const charSet = b1 & 0x01 ?\n shaka.cea.Cea608Memory.CharSet.PORTUGUESE_GERMAN:\n shaka.cea.Cea608Memory.CharSet.SPANISH_FRENCH;\n\n this.curBuf_.addChar(charSet, b2);\n }\n\n /**\n * Handles a tab offset.\n *\n * @param {number} offset\n * @private\n */\n handleOffset_(offset) {\n this.curBuf_.setOffset(offset);\n }\n\n /**\n * Decodes control code.\n * Three types of control codes:\n * Preamble Address Codes, Mid-Row Codes, and Miscellaneous Control Codes.\n * @param {!shaka.cea.Cea608DataChannel.Cea608Packet} ccPacket\n * @return {?shaka.extern.ICaptionDecoder.ClosedCaption}\n */\n handleControlCode(ccPacket) {\n const b1 = ccPacket.ccData1;\n const b2 = ccPacket.ccData2;\n\n // FCC wants control codes transmitted twice, and that will often be\n // seen in broadcast captures. If the very next frame has a duplicate\n // control code, that duplicate is ignored. Note that this only applies\n // to the very next frame, and only for one match.\n if (this.lastCp_ === ((b1 << 8) | b2)) {\n this.lastCp_ = null;\n return null;\n }\n\n // Remember valid control code for checking in next frame!\n this.lastCp_ = (b1 << 8) | b2;\n\n if (this.isPAC_(b1, b2)) {\n this.controlPac_(b1, b2);\n } else if (this.isMidrowStyleChange_(b1, b2)) {\n this.controlMidrow_(b2);\n } else if (this.isBackgroundAttribute_(b1, b2)) {\n this.controlBackgroundAttribute_(b1, b2);\n } else if (this.isSpecialNorthAmericanChar_(b1, b2)) {\n this.curBuf_.addChar(\n shaka.cea.Cea608Memory.CharSet.SPECIAL_NORTH_AMERICAN, b2);\n } else if (this.isExtendedWesternEuropeanChar_(b1, b2)) {\n this.handleExtendedWesternEuropeanChar_(b1, b2);\n } else if (this.isMiscellaneous_(b1, b2)) {\n return this.controlMiscellaneous_(ccPacket);\n } else if (this.isOffset_(b1, b2)) {\n const offset = b2 - 0x20;\n this.handleOffset_(offset);\n }\n return null;\n }\n\n /**\n * Checks if this is a Miscellaneous control code.\n * @param {number} b1 Byte 1.\n * @param {number} b2 Byte 2.\n * @return {boolean}\n * @private\n */\n isMiscellaneous_(b1, b2) {\n // For Miscellaneous Control Codes, the bytes take the following form:\n // b1 -> |0|0|0|1|C|1|0|F|\n // b2 -> |0|0|1|0|X|X|X|X|\n return ((b1 & 0xf6) === 0x14) && ((b2 & 0xf0) === 0x20);\n }\n\n /**\n * Checks if this is a offset control code.\n * @param {number} b1 Byte 1.\n * @param {number} b2 Byte 2.\n * @return {boolean}\n * @private\n */\n isOffset_(b1, b2) {\n return (b1 == 0x17 || b1 == 0x1f) && b2 >= 0x21 && b2 <= 0x23;\n }\n\n /**\n * Checks if this is a PAC control code.\n * @param {number} b1 Byte 1.\n * @param {number} b2 Byte 2.\n * @return {boolean}\n * @private\n */\n isPAC_(b1, b2) {\n // For Preamble Address Codes, the bytes take the following form:\n // b1 -> |0|0|0|1|X|X|X|X|\n // b2 -> |0|1|X|X|X|X|X|X|\n return ((b1 & 0xf0) === 0x10) && ((b2 & 0xc0) === 0x40);\n }\n\n /**\n * Checks if this is a Midrow style change control code.\n * @param {number} b1 Byte 1.\n * @param {number} b2 Byte 2.\n * @return {boolean}\n * @private\n */\n isMidrowStyleChange_(b1, b2) {\n // For Midrow Control Codes, the bytes take the following form:\n // b1 -> |0|0|0|1|C|0|0|1|\n // b2 -> |0|0|1|0|X|X|X|X|\n return ((b1 & 0xf7) === 0x11) && ((b2 & 0xf0) === 0x20);\n }\n\n /**\n * Checks if this is a background attribute control code.\n * @param {number} b1 Byte 1.\n * @param {number} b2 Byte 2.\n * @return {boolean}\n * @private\n */\n isBackgroundAttribute_(b1, b2) {\n // For Background Attribute Codes, the bytes take the following form:\n // Bg provided: b1 -> |0|0|0|1|C|0|0|0| b2 -> |0|0|1|0|COLOR|T|\n // No Bg: b1 -> |0|0|0|1|C|1|1|1| b2 -> |0|0|1|0|1|1|0|1|\n return (((b1 & 0xf7) === 0x10) && ((b2 & 0xf0) === 0x20)) ||\n (((b1 & 0xf7) === 0x17) && ((b2 & 0xff) === 0x2D));\n }\n\n /**\n * Checks if the character is in the Special North American char. set.\n * @param {number} b1 Byte 1.\n * @param {number} b2 Byte 2.\n * @return {boolean}\n * @private\n */\n isSpecialNorthAmericanChar_(b1, b2) {\n // The bytes take the following form:\n // b1 -> |0|0|0|1|C|0|0|1|\n // b2 -> |0|0|1|1| CHAR |\n return ((b1 & 0xf7) === 0x11) && ((b2 & 0xf0) === 0x30);\n }\n\n /**\n * Checks if the character is in the Extended Western European char. set.\n * @param {number} b1 Byte 1.\n * @param {number} b2 Byte 2.\n * @return {boolean}\n * @private\n */\n isExtendedWesternEuropeanChar_(b1, b2) {\n // The bytes take the following form:\n // b1 -> |0|0|0|1|C|0|1|S|\n // b2 -> |0|0|1|CHARACTER|\n return ((b1 & 0xf6) === 0x12) && ((b2 & 0xe0) === 0x20);\n }\n\n /**\n * Checks if the data contains a control code.\n * @param {number} b1 Byte 1.\n * @return {boolean}\n */\n static isControlCode(b1) {\n // For control codes, the first byte takes the following form:\n // b1 -> |P|0|0|1|X|X|X|X|\n return (b1 & 0x70) === 0x10;\n }\n\n /**\n * Checks if the data contains a XDS control code.\n * @param {number} b1 Byte 1.\n * @return {boolean}\n */\n static isXdsControlCode(b1) {\n return b1 >= 0x01 && b1 <= 0x0F;\n }\n};\n\n/**\n * Command codes.\n * @enum {number}\n * @private\n */\nshaka.cea.Cea608DataChannel.MiscCmd_ = {\n // \"RCL - Resume Caption Loading\"\n RCL: 0x20,\n\n // \"BS - BackSpace\"\n BS: 0x21,\n\n // \"AOD - Unused (alarm off)\"\n AOD: 0x22,\n\n // \"AON - Unused (alarm on)\"\n AON: 0x23,\n\n // \"DER - Delete to End of Row\"\n DER: 0x24,\n\n // \"RU2 - Roll-Up, 2 rows\"\n RU2: 0x25,\n\n // \"RU3 - Roll-Up, 3 rows\"\n RU3: 0x26,\n\n // \"RU4 - Roll-Up, 4 rows\"\n RU4: 0x27,\n\n // \"FON - Flash On\"\n FON: 0x28,\n\n // \"RDC - Resume Direct Captions\"\n RDC: 0x29,\n\n // \"TR - Text Restart\"\n TR: 0x2a,\n\n // \"RTD - Resume Text Display\"\n RTD: 0x2b,\n\n // \"EDM - Erase Displayed Mem\"\n EDM: 0x2c,\n\n // \"CR - Carriage return\"\n CR: 0x2d,\n\n // \"ENM - Erase Nondisplayed Mem\"\n ENM: 0x2e,\n\n // \"EOC - End Of Caption (flip mem)\"\n EOC: 0x2f,\n};\n\n/**\n * Caption type.\n * @private @const @enum {number}\n */\nshaka.cea.Cea608DataChannel.CaptionType = {\n NONE: 0,\n POPON: 1,\n PAINTON: 2,\n ROLLUP: 3,\n TEXT: 4,\n};\n\n/**\n * @const {!Array<string>}\n */\nshaka.cea.Cea608DataChannel.BG_COLORS = [\n 'black',\n 'green',\n 'blue',\n 'cyan',\n 'red',\n 'yellow',\n 'magenta',\n 'black',\n];\n\n/**\n * @const {!Array<string>}\n */\nshaka.cea.Cea608DataChannel.TEXT_COLORS = [\n 'white',\n 'green',\n 'blue',\n 'cyan',\n 'red',\n 'yellow',\n 'magenta',\n 'white_italics',\n];\n\n/**\n * Style associated with a cue.\n * @typedef {{\n * textColor: ?string,\n * backgroundColor: ?string,\n * italics: ?boolean,\n * underline: ?boolean\n * }}\n */\nshaka.cea.Cea608DataChannel.Style;\n\n/**\n * CEA closed captions packet.\n * @typedef {{\n * pts: number,\n * type: number,\n * ccData1: number,\n * ccData2: number,\n * order: number\n * }}\n *\n * @property {number} pts\n * Presentation timestamp (in second) at which this packet was received.\n * @property {number} type\n * Type of the packet. Either 0 or 1, representing the CEA-608 field.\n * @property {number} ccData1 CEA-608 byte 1.\n * @property {number} ccData2 CEA-608 byte 2.\n * @property {number} order\n * A number indicating the order this packet was received in a sequence\n * of packets. Used to break ties in a stable sorting algorithm\n */\nshaka.cea.Cea608DataChannel.Cea608Packet;\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.cea.Cea708Window');\n\ngoog.require('shaka.cea.CeaUtils');\ngoog.require('shaka.cea.CeaUtils.StyledChar');\ngoog.require('shaka.text.Cue');\ngoog.require('shaka.text.CueRegion');\n\n\n/**\n * CEA-708 Window. Each CEA-708 service owns 8 of these.\n */\nshaka.cea.Cea708Window = class {\n /**\n * @param {number} windowNum\n * @param {number} parentService\n */\n constructor(windowNum, parentService) {\n /**\n * Number for the parent service (1 - 63).\n * @private {number}\n */\n this.parentService_ = parentService;\n\n /**\n * A number from 0 - 7 indicating the window number in the\n * service that owns this window.\n * @private {number}\n */\n this.windowNum_ = windowNum;\n\n /**\n * Indicates whether this window is visible.\n * @private {boolean}\n */\n this.visible_ = false;\n\n /**\n * Indicates whether the horizontal and vertical anchors coordinates specify\n * a percentage of the screen, or physical coordinates on the screen.\n * @private {boolean}\n */\n this.relativeToggle_ = false;\n\n /**\n * Horizontal anchor. Loosely corresponds to a WebVTT viewport X anchor.\n * @private {number}\n */\n this.horizontalAnchor_ = 0;\n\n /**\n * Vertical anchor. Loosely corresponds to a WebVTT viewport Y anchor.\n * @private {number}\n */\n this.verticalAnchor_ = 0;\n\n /**\n * If valid, ranges from 0 to 8, specifying one of 9 locations on window:\n * 0________1________2\n * | | |\n * 3________4________5\n * | | |\n * 6________7________8\n * Diagram is valid as per CEA-708-E section 8.4.4.\n * Each of these locations corresponds to a WebVTT region's \"region anchor\".\n * @private {number}\n */\n this.anchorId_ = 0;\n\n /**\n * Indicates the number of rows in this window's buffer/memory.\n * @private {number}\n */\n this.rowCount_ = 0;\n\n /**\n * Indicates the number of columns in this window's buffer/memory.\n * @private {number}\n */\n this.colCount_ = 0;\n\n /**\n * Center by default.\n * @private {!shaka.cea.Cea708Window.TextJustification}\n */\n this.justification_ = shaka.cea.Cea708Window.TextJustification.CENTER;\n\n /**\n * An array of rows of styled characters, representing the\n * current text and styling of text in this window.\n * @private {!Array<!Array<?shaka.cea.CeaUtils.StyledChar>>}\n */\n this.memory_ = [];\n\n /**\n * @private {number}\n */\n this.startTime_ = 0;\n\n /**\n * Row that the current pen is pointing at.\n * @private {number}\n */\n this.row_ = 0;\n\n /**\n * Column that the current pen is pointing at.\n * @private {number}\n */\n this.col_ = 0;\n\n /**\n * Indicates whether the current pen position is italicized.\n * @private {boolean}\n */\n this.italics_ = false;\n\n /**\n * Indicates whether the current pen position is underlined.\n * @private {boolean}\n */\n this.underline_ = false;\n\n /**\n * Indicates the text color at the current pen position.\n * @private {string}\n */\n this.textColor_ = shaka.cea.CeaUtils.DEFAULT_TXT_COLOR;\n\n /**\n * Indicates the background color at the current pen position.\n * @private {string}\n */\n this.backgroundColor_ = shaka.cea.CeaUtils.DEFAULT_BG_COLOR;\n\n this.resetMemory();\n }\n\n /**\n * @param {boolean} visible\n * @param {number} verticalAnchor\n * @param {number} horizontalAnchor\n * @param {number} anchorId\n * @param {boolean} relativeToggle\n * @param {number} rowCount\n * @param {number} colCount\n */\n defineWindow(visible, verticalAnchor, horizontalAnchor, anchorId,\n relativeToggle, rowCount, colCount) {\n this.visible_ = visible;\n this.verticalAnchor_ = verticalAnchor;\n this.horizontalAnchor_ = horizontalAnchor;\n this.anchorId_ = anchorId;\n this.relativeToggle_ = relativeToggle;\n this.rowCount_ = rowCount;\n this.colCount_ = colCount;\n }\n\n /**\n * Resets the memory buffer.\n */\n resetMemory() {\n this.memory_ = [];\n for (let i = 0; i < shaka.cea.Cea708Window.MAX_ROWS; i++) {\n this.memory_.push(this.createNewRow_());\n }\n }\n\n /**\n * Allocates and returns a new row.\n * @return {!Array<?shaka.cea.CeaUtils.StyledChar>}\n * @private\n */\n createNewRow_() {\n const row = [];\n for (let j = 0; j < shaka.cea.Cea708Window.MAX_COLS; j++) {\n row.push(null);\n }\n return row;\n }\n\n /**\n * Sets the unicode value for a char at the current pen location.\n * @param {string} char\n */\n setCharacter(char) {\n // Check if the pen is out of bounds.\n if (!this.isPenInBounds_()) {\n return;\n }\n\n const cea708Char = new shaka.cea.CeaUtils.StyledChar(\n char, this.underline_, this.italics_,\n this.backgroundColor_, this.textColor_);\n this.memory_[this.row_][this.col_] = cea708Char;\n\n // Increment column\n this.col_ ++;\n }\n\n /**\n * Erases a character from the buffer and moves the pen back.\n */\n backspace() {\n if (!this.isPenInBounds_()) {\n return;\n }\n\n // Check if a backspace can be done.\n if (this.col_ <= 0 && this.row_ <= 0) {\n return;\n }\n\n if (this.col_ <= 0) {\n // Move pen back a row.\n this.col_ = this.colCount_ - 1;\n this.row_--;\n } else {\n // Move pen back a column.\n this.col_--;\n }\n\n // Erase the character occupied at that position.\n this.memory_[this.row_][this.col_] = null;\n }\n\n /**\n * @return {boolean}\n * @private\n */\n isPenInBounds_() {\n const inRowBounds = this.row_ < this.rowCount_ && this.row_ >= 0;\n const inColBounds = this.col_ < this.colCount_ && this.col_ >= 0;\n return inRowBounds && inColBounds;\n }\n\n /**\n * @return {boolean}\n */\n isVisible() {\n return this.visible_;\n }\n\n /**\n * Moves up <count> rows in the buffer.\n * @param {number} count\n * @private\n */\n moveUpRows_(count) {\n let dst = 0; // Row each row should be moved to.\n\n // Move existing rows up by <count>.\n for (let i = count; i < shaka.cea.Cea708Window.MAX_ROWS; i++, dst++) {\n this.memory_[dst] = this.memory_[i];\n }\n\n // Create <count> new rows at the bottom.\n for (let i = 0; i < count; i++, dst++) {\n this.memory_[dst] = this.createNewRow_();\n }\n }\n\n /**\n * Handles CR. Increments row - if last row, \"roll up\" all rows by one.\n */\n carriageReturn() {\n if (this.row_ + 1 >= this.rowCount_) {\n this.moveUpRows_(1);\n this.col_ = 0;\n return;\n }\n\n this.row_++;\n this.col_ = 0;\n }\n\n /**\n * Handles HCR. Moves the pen to the beginning of the cur. row and clears it.\n */\n horizontalCarriageReturn() {\n this.memory_[this.row_] = this.createNewRow_();\n this.col_ = 0;\n }\n\n /**\n * @param {number} endTime\n * @param {number} serviceNumber Number of the service emitting this caption.\n * @return {?shaka.extern.ICaptionDecoder.ClosedCaption}\n */\n forceEmit(endTime, serviceNumber) {\n const stream = `svc${serviceNumber}`;\n const TextJustification = shaka.cea.Cea708Window.TextJustification;\n const topLevelCue = new shaka.text.Cue(\n this.startTime_, endTime, /* payload= */ '');\n\n if (this.justification_ === TextJustification.LEFT) {\n // LEFT justified.\n topLevelCue.textAlign = shaka.text.Cue.textAlign.LEFT;\n } else if (this.justification_ === TextJustification.RIGHT) {\n // RIGHT justified.\n topLevelCue.textAlign = shaka.text.Cue.textAlign.RIGHT;\n } else {\n // CENTER justified. Both FULL and CENTER are handled as CENTER justified.\n topLevelCue.textAlign = shaka.text.Cue.textAlign.CENTER;\n }\n\n this.adjustRegion_(topLevelCue.region);\n\n const caption = shaka.cea.CeaUtils.getParsedCaption(\n topLevelCue, stream, this.memory_, this.startTime_, endTime);\n if (caption) {\n // If a caption is being emitted, then the next caption's start time\n // should be no less than this caption's end time.\n this.setStartTime(endTime);\n }\n return caption;\n }\n\n /**\n * @param {number} row\n * @param {number} col\n */\n setPenLocation(row, col) {\n this.row_ = row;\n this.col_ = col;\n }\n\n /**\n * @param {string} backgroundColor\n */\n setPenBackgroundColor(backgroundColor) {\n this.backgroundColor_ = backgroundColor;\n }\n\n /**\n * @param {string} textColor\n */\n setPenTextColor(textColor) {\n this.textColor_ = textColor;\n }\n\n /**\n * @param {boolean} underline\n */\n setPenUnderline(underline) {\n this.underline_ = underline;\n }\n\n /**\n * @param {boolean} italics\n */\n setPenItalics(italics) {\n this.italics_ = italics;\n }\n\n /** Reset the pen to 0,0 with default styling. */\n resetPen() {\n this.row_ = 0;\n this.col_ = 0;\n this.underline_ = false;\n this.italics_ = false;\n this.textColor_ = shaka.cea.CeaUtils.DEFAULT_TXT_COLOR;\n this.backgroundColor_ = shaka.cea.CeaUtils.DEFAULT_BG_COLOR;\n }\n\n /**\n * @param {!shaka.cea.Cea708Window.TextJustification} justification\n */\n setJustification(justification) {\n this.justification_ = justification;\n }\n\n /**\n * Sets the window to visible.\n */\n display() {\n this.visible_ = true;\n }\n\n /**\n * Sets the window to invisible.\n */\n hide() {\n this.visible_ = false;\n }\n\n /**\n * Toggles the visibility of the window.\n */\n toggle() {\n this.visible_ = !this.visible_;\n }\n\n /**\n * Sets the start time for the cue to be emitted.\n * @param {number} pts\n */\n setStartTime(pts) {\n this.startTime_ = pts;\n }\n\n /**\n * Support window positioning by mapping anchor related values to CueRegion.\n * https://dvcs.w3.org/hg/text-tracks/raw-file/default/608toVTT/608toVTT.html#positioning-in-cea-708\n * @param {shaka.text.CueRegion} region\n * @private\n */\n adjustRegion_(region) {\n if (this.parentService_) {\n region.id += 'svc' + this.parentService_;\n }\n region.id += 'win' + this.windowNum_;\n\n region.height = this.rowCount_;\n region.width = this.colCount_;\n region.heightUnits = shaka.text.CueRegion.units.LINES;\n region.widthUnits = shaka.text.CueRegion.units.LINES;\n\n region.viewportAnchorX = this.horizontalAnchor_;\n region.viewportAnchorY = this.verticalAnchor_;\n // WebVTT's region viewport anchors are technically always in percentages.\n // However, we don't know the aspect ratio of the video at this point,\n // which determines how we interpret the horizontal anchor.\n // So, we expose the additional flag to reflect whether these viewport\n // anchor values can be used as is or should be converted\n // to percentages.\n region.viewportAnchorUnits = this.relativeToggle_ ?\n shaka.text.CueRegion.units.PERCENTAGE : shaka.text.CueRegion.units.LINES;\n\n const AnchorId = shaka.cea.Cea708Window.AnchorId;\n\n switch (this.anchorId_) {\n case AnchorId.UPPER_LEFT:\n region.regionAnchorX = 0;\n region.regionAnchorY = 0;\n break;\n case AnchorId.UPPER_CENTER:\n region.regionAnchorX = 50;\n region.regionAnchorY = 0;\n break;\n case AnchorId.UPPER_RIGHT:\n region.regionAnchorX = 100;\n region.regionAnchorY = 0;\n break;\n case AnchorId.MIDDLE_LEFT:\n region.regionAnchorX = 0;\n region.regionAnchorY = 50;\n break;\n case AnchorId.MIDDLE_CENTER:\n region.regionAnchorX = 50;\n region.regionAnchorY = 50;\n break;\n case AnchorId.MIDDLE_RIGHT:\n region.regionAnchorX = 100;\n region.regionAnchorY = 50;\n break;\n case AnchorId.LOWER_LEFT:\n region.regionAnchorX = 0;\n region.regionAnchorY = 100;\n break;\n case AnchorId.LOWER_CENTER:\n region.regionAnchorX = 50;\n region.regionAnchorY = 100;\n break;\n case AnchorId.LOWER_RIGHT:\n region.regionAnchorX = 100;\n region.regionAnchorY = 100;\n break;\n }\n }\n};\n\n/**\n * Caption type.\n * @const @enum {number}\n */\nshaka.cea.Cea708Window.TextJustification = {\n LEFT: 0,\n RIGHT: 1,\n CENTER: 2,\n FULL: 3,\n};\n\n/**\n * Possible AnchorId values.\n * @const @enum {number}\n */\nshaka.cea.Cea708Window.AnchorId = {\n UPPER_LEFT: 0,\n UPPER_CENTER: 1,\n UPPER_RIGHT: 2,\n MIDDLE_LEFT: 3,\n MIDDLE_CENTER: 4,\n MIDDLE_RIGHT: 5,\n LOWER_LEFT: 6,\n LOWER_CENTER: 7,\n LOWER_RIGHT: 8,\n};\n\n/**\n * Can be indexed 0-31 for 4:3 format, and 0-41 for 16:9 formats.\n * Thus the absolute maximum is 42 columns for the 16:9 format.\n * @private @const {number}\n */\nshaka.cea.Cea708Window.MAX_COLS = 42;\n\n/**\n * Maximum of 16 rows that can be indexed from 0 to 15.\n * @private @const {number}\n */\nshaka.cea.Cea708Window.MAX_ROWS = 16;\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.cea.DtvccPacketBuilder');\ngoog.provide('shaka.cea.DtvccPacket');\ngoog.require('shaka.util.Error');\ngoog.requireType('shaka.cea.Cea708Service');\n\n\n/**\n * CEA-708 DTVCC Packet Builder.\n * Builds packets based on Figure 5 CCP State Table in 5.2 of CEA-708-E.\n * Initially, there is no packet. When a DTVCC_PACKET_START payload is received,\n * a packet begins construction. The packet is considered \"built\" once all bytes\n * indicated in the header are read, and ignored if a new packet starts building\n * before the current packet is finished being built.\n */\nshaka.cea.DtvccPacketBuilder = class {\n /** */\n constructor() {\n /**\n * An array containing built DTVCC packets that are ready to be processed.\n * @private {!Array<!shaka.cea.DtvccPacket>}\n */\n this.builtPackets_ = [];\n\n /**\n * Stores the packet data for the current packet being processed, if any.\n * @private {?Array<!shaka.cea.Cea708Service.Cea708Byte>}\n */\n this.currentPacketBeingBuilt_ = null;\n\n /**\n * Keeps track of the number of bytes left to add in the current packet.\n * @private {number}\n */\n this.bytesLeftToAddInCurrentPacket_ = 0;\n }\n\n /**\n * @param {!shaka.cea.Cea708Service.Cea708Byte} cea708Byte\n */\n addByte(cea708Byte) {\n if (cea708Byte.type === shaka.cea.DtvccPacketBuilder.DTVCC_PACKET_START) {\n // If there was a packet being built that finished, it would have\n // already been added to the built packets when it finished. So if\n // there's an open packet at this point, it must be unfinished. As\n // per the spec, we don't deal with unfinished packets. So we ignore them.\n\n // A new packet should be opened.\n const packetSize = cea708Byte.value & 0x3f;\n\n // As per spec, number of packet data bytes to follow is packetSize*2-1.\n this.bytesLeftToAddInCurrentPacket_ = packetSize * 2 - 1;\n this.currentPacketBeingBuilt_ = [];\n return;\n }\n\n if (!this.currentPacketBeingBuilt_) {\n // There is no packet open. Then an incoming byte should not\n // have come in at all. Ignore it.\n return;\n }\n\n if (this.bytesLeftToAddInCurrentPacket_ > 0) {\n this.currentPacketBeingBuilt_.push(cea708Byte);\n this.bytesLeftToAddInCurrentPacket_--;\n }\n\n if (this.bytesLeftToAddInCurrentPacket_ === 0) {\n // Current packet is complete and ready for processing.\n const packet = new shaka.cea.DtvccPacket(this.currentPacketBeingBuilt_);\n this.builtPackets_.push(packet);\n this.currentPacketBeingBuilt_ = null;\n this.bytesLeftToAddInCurrentPacket_ = 0;\n }\n }\n\n /**\n * @return {!Array<!shaka.cea.DtvccPacket>}\n */\n getBuiltPackets() {\n return this.builtPackets_;\n }\n\n /** Clear built packets. */\n clearBuiltPackets() {\n this.builtPackets_ = [];\n }\n\n /** Clear built packets and packets in progress. */\n clear() {\n this.builtPackets_ = [];\n this.currentPacketBeingBuilt_ = [];\n this.bytesLeftToAddInCurrentPacket_ = 0;\n }\n};\n\n\nshaka.cea.DtvccPacket = class {\n /**\n * @param {!Array<!shaka.cea.Cea708Service.Cea708Byte>} packetData\n */\n constructor(packetData) {\n /**\n * Keeps track of the position to read the next byte from in the packet.\n * @private {number}\n */\n this.pos_ = 0;\n\n /**\n * Bytes that represent the data in the DTVCC packet.\n * @private {!Array<!shaka.cea.Cea708Service.Cea708Byte>}\n */\n this.packetData_ = packetData;\n }\n\n /**\n * @return {boolean}\n */\n hasMoreData() {\n return this.pos_ < this.packetData_.length;\n }\n\n /**\n * @return {number}\n */\n getPosition() {\n return this.pos_;\n }\n\n /**\n * Reads a byte from the packet. TODO CONSIDER RENAMING THIS TO BLOCK\n * @return {!shaka.cea.Cea708Service.Cea708Byte}\n * @throws {!shaka.util.Error}\n */\n readByte() {\n if (!this.hasMoreData()) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.TEXT,\n shaka.util.Error.Code.BUFFER_READ_OUT_OF_BOUNDS);\n }\n return this.packetData_[this.pos_++];\n }\n\n /**\n * Skips the provided number of blocks in the buffer.\n * @param {number} numBlocks\n * @throws {!shaka.util.Error}\n */\n skip(numBlocks) {\n if (this.pos_ + numBlocks > this.packetData_.length) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.TEXT,\n shaka.util.Error.Code.BUFFER_READ_OUT_OF_BOUNDS);\n }\n this.pos_ += numBlocks;\n }\n\n /**\n * Rewinds the provided number of blocks in the buffer.\n * @param {number} numBlocks\n * @throws {!shaka.util.Error}\n */\n rewind(numBlocks) {\n if (this.pos_ - numBlocks < 0) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.TEXT,\n shaka.util.Error.Code.BUFFER_READ_OUT_OF_BOUNDS);\n }\n this.pos_ -= numBlocks;\n }\n};\n\n/**\n * @const {number}\n */\nshaka.cea.DtvccPacketBuilder.DTVCC_PACKET_DATA = 2;\n\n/**\n * @const {number}\n */\nshaka.cea.DtvccPacketBuilder.DTVCC_PACKET_START = 3;\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// cspell:ignore PNSTY\n\ngoog.provide('shaka.cea.Cea708Service');\n\ngoog.require('shaka.cea.Cea708Window');\ngoog.require('shaka.cea.DtvccPacket');\n\n\n/**\n * CEA-708 closed captions service as defined by CEA-708-E. A decoder can own up\n * to 63 services. Each service owns eight windows.\n */\nshaka.cea.Cea708Service = class {\n /**\n * @param {number} serviceNumber\n */\n constructor(serviceNumber) {\n /**\n * Number for this specific service (1 - 63).\n * @private {number}\n */\n this.serviceNumber_ = serviceNumber;\n\n /**\n * Eight Cea708 Windows, as defined by the spec.\n * @private {!Array<?shaka.cea.Cea708Window>}\n */\n this.windows_ = [\n null, null, null, null, null, null, null, null,\n ];\n\n /**\n * The current window for which window command operate on.\n * @private {?shaka.cea.Cea708Window}\n */\n this.currentWindow_ = null;\n }\n\n /**\n * Processes a CEA-708 control code.\n * @param {!shaka.cea.DtvccPacket} dtvccPacket\n * @return {!Array<shaka.extern.ICaptionDecoder.ClosedCaption>}\n * @throws {!shaka.util.Error}\n */\n handleCea708ControlCode(dtvccPacket) {\n const blockData = dtvccPacket.readByte();\n let controlCode = blockData.value;\n const pts = blockData.pts;\n\n // Read extended control code if needed.\n if (controlCode === shaka.cea.Cea708Service.EXT_CEA708_CTRL_CODE_BYTE1) {\n const extendedControlCodeBlock = dtvccPacket.readByte();\n controlCode = (controlCode << 16) | extendedControlCodeBlock.value;\n }\n\n // Control codes are in 1 of 4 logical groups:\n // CL (C0, C2), CR (C1, C3), GL (G0, G2), GR (G1, G2).\n if (controlCode >= 0x00 && controlCode <= 0x1f) {\n return this.handleC0_(dtvccPacket, controlCode, pts);\n } else if (controlCode >= 0x80 && controlCode <= 0x9f) {\n return this.handleC1_(dtvccPacket, controlCode, pts);\n } else if (controlCode >= 0x1000 && controlCode <= 0x101f) {\n this.handleC2_(dtvccPacket, controlCode & 0xff);\n } else if (controlCode >= 0x1080 && controlCode <= 0x109f) {\n this.handleC3_(dtvccPacket, controlCode & 0xff);\n } else if (controlCode >= 0x20 && controlCode <= 0x7f) {\n this.handleG0_(controlCode);\n } else if (controlCode >= 0xa0 && controlCode <= 0xff) {\n this.handleG1_(controlCode);\n } else if (controlCode >= 0x1020 && controlCode <= 0x107f) {\n this.handleG2_(controlCode & 0xff);\n } else if (controlCode >= 0x10a0 && controlCode <= 0x10ff) {\n this.handleG3_(controlCode & 0xff);\n }\n\n return [];\n }\n\n /**\n * Handles G0 group data.\n * @param {number} controlCode\n * @private\n */\n handleG0_(controlCode) {\n if (!this.currentWindow_) {\n return;\n }\n // G0 contains ASCII from 0x20 to 0x7f, with the exception that 0x7f\n // is replaced by a musical note.\n if (controlCode === 0x7f) {\n this.currentWindow_.setCharacter('♪');\n return;\n }\n this.currentWindow_.setCharacter(String.fromCharCode(controlCode));\n }\n\n /**\n * Handles G1 group data.\n * @param {number} controlCode\n * @private\n */\n handleG1_(controlCode) {\n if (!this.currentWindow_) {\n return;\n }\n // G1 is the Latin-1 Character Set from 0xa0 to 0xff.\n this.currentWindow_.setCharacter(String.fromCharCode(controlCode));\n }\n\n /**\n * Handles G2 group data.\n * @param {number} controlCode\n * @private\n */\n handleG2_(controlCode) {\n if (!this.currentWindow_) {\n return;\n }\n if (!shaka.cea.Cea708Service.G2Charset.has(controlCode)) {\n // If the character is unsupported, the spec says to put an underline.\n this.currentWindow_.setCharacter('_');\n return;\n }\n\n const char = shaka.cea.Cea708Service.G2Charset.get(controlCode);\n this.currentWindow_.setCharacter(char);\n }\n\n /**\n * Handles G3 group data.\n * @param {number} controlCode\n * @private\n */\n handleG3_(controlCode) {\n if (!this.currentWindow_) {\n return;\n }\n\n // As of CEA-708-E, the G3 group only contains 1 character. It's a\n // [CC] character which has no unicode value on 0xa0.\n if (controlCode != 0xa0) {\n // Similar to G2, the spec decrees an underline if char is unsupported.\n this.currentWindow_.setCharacter('_');\n return;\n }\n\n this.currentWindow_.setCharacter('[CC]');\n }\n\n /**\n * Handles C0 group data.\n * @param {!shaka.cea.DtvccPacket} dtvccPacket\n * @param {number} controlCode\n * @param {number} pts\n * @return {!Array<shaka.extern.ICaptionDecoder.ClosedCaption>}\n * @private\n */\n handleC0_(dtvccPacket, controlCode, pts) {\n // All these commands pertain to the current window, so ensure it exists.\n if (!this.currentWindow_) {\n return [];\n }\n\n if (controlCode == 0x18) {\n const firstByte = dtvccPacket.readByte().value;\n const secondByte = dtvccPacket.readByte().value;\n\n const toHexString = (byteArray) => {\n return byteArray.map((byte) => {\n return ('0' + (byte & 0xFF).toString(16)).slice(-2);\n }).join('');\n };\n const unicode = toHexString([firstByte, secondByte]);\n // Takes a unicode hex string and creates a single character.\n const char = String.fromCharCode(parseInt(unicode, 16));\n this.currentWindow_.setCharacter(char);\n return [];\n }\n\n const window = this.currentWindow_;\n let parsedClosedCaption = null;\n\n // Note: This decoder ignores the \"ETX\" (end of text) control code. Since\n // this is JavaScript, a '\\0' is not needed to terminate a string.\n switch (controlCode) {\n case shaka.cea.Cea708Service.ASCII_BACKSPACE:\n window.backspace();\n break;\n case shaka.cea.Cea708Service.ASCII_CARRIAGE_RETURN:\n // Force out the buffer, since the top row could be lost.\n if (window.isVisible()) {\n parsedClosedCaption = window.forceEmit(pts, this.serviceNumber_);\n }\n window.carriageReturn();\n break;\n case shaka.cea.Cea708Service.ASCII_HOR_CARRIAGE_RETURN:\n // Force out the buffer, a row will be erased.\n if (window.isVisible()) {\n parsedClosedCaption = window.forceEmit(pts, this.serviceNumber_);\n }\n window.horizontalCarriageReturn();\n break;\n case shaka.cea.Cea708Service.ASCII_FORM_FEED:\n // Clear window and move pen to (0,0).\n // Force emit if the window is visible.\n if (window.isVisible()) {\n parsedClosedCaption = window.forceEmit(pts, this.serviceNumber_);\n }\n window.resetMemory();\n window.setPenLocation(0, 0);\n break;\n }\n return parsedClosedCaption ? [parsedClosedCaption] : [];\n }\n\n /**\n * Processes C1 group data.\n * These are caption commands.\n * @param {!shaka.cea.DtvccPacket} dtvccPacket\n * @param {number} captionCommand\n * @param {number} pts in seconds\n * @return {!Array<shaka.extern.ICaptionDecoder.ClosedCaption>}\n * @throws {!shaka.util.Error} a possible out-of-range buffer read.\n * @private\n */\n handleC1_(dtvccPacket, captionCommand, pts) {\n // Note: This decoder ignores delay and delayCancel control codes in the C1.\n // group. These control codes delay processing of data for a set amount of\n // time, however this decoder processes that data immediately.\n\n if (captionCommand >= 0x80 && captionCommand <= 0x87) {\n const windowNum = captionCommand & 0x07;\n this.setCurrentWindow_(windowNum);\n } else if (captionCommand === 0x88) {\n const bitmap = dtvccPacket.readByte().value;\n return this.clearWindows_(bitmap, pts);\n } else if (captionCommand === 0x89) {\n const bitmap = dtvccPacket.readByte().value;\n this.displayWindows_(bitmap, pts);\n } else if (captionCommand === 0x8a) {\n const bitmap = dtvccPacket.readByte().value;\n return this.hideWindows_(bitmap, pts);\n } else if (captionCommand === 0x8b) {\n const bitmap = dtvccPacket.readByte().value;\n return this.toggleWindows_(bitmap, pts);\n } else if (captionCommand === 0x8c) {\n const bitmap = dtvccPacket.readByte().value;\n return this.deleteWindows_(bitmap, pts);\n } else if (captionCommand === 0x8f) {\n return this.reset_(pts);\n } else if (captionCommand === 0x90) {\n this.setPenAttributes_(dtvccPacket);\n } else if (captionCommand === 0x91) {\n this.setPenColor_(dtvccPacket);\n } else if (captionCommand === 0x92) {\n this.setPenLocation_(dtvccPacket);\n } else if (captionCommand === 0x97) {\n this.setWindowAttributes_(dtvccPacket);\n } else if (captionCommand >= 0x98 && captionCommand <= 0x9f) {\n const windowNum = (captionCommand & 0x0f) - 8;\n this.defineWindow_(dtvccPacket, windowNum, pts);\n }\n return [];\n }\n\n /**\n * Handles C2 group data.\n * @param {!shaka.cea.DtvccPacket} dtvccPacket\n * @param {number} controlCode\n * @private\n */\n handleC2_(dtvccPacket, controlCode) {\n // As of the CEA-708-E spec there are no commands on the C2 table, but if\n // seen, then the appropriate number of bytes must be skipped as per spec.\n if (controlCode >= 0x08 && controlCode <= 0x0f) {\n dtvccPacket.skip(1);\n } else if (controlCode >= 0x10 && controlCode <= 0x17) {\n dtvccPacket.skip(2);\n } else if (controlCode >= 0x18 && controlCode <= 0x1f) {\n dtvccPacket.skip(3);\n }\n }\n\n /**\n * Handles C3 group data.\n * @param {!shaka.cea.DtvccPacket} dtvccPacket\n * @param {number} controlCode\n * @private\n */\n handleC3_(dtvccPacket, controlCode) {\n // As of the CEA-708-E spec there are no commands on the C3 table, but if\n // seen, then the appropriate number of bytes must be skipped as per spec.\n if (controlCode >= 0x80 && controlCode <= 0x87) {\n dtvccPacket.skip(4);\n } else if (controlCode >= 0x88 && controlCode <= 0x8f) {\n dtvccPacket.skip(5);\n }\n }\n\n /**\n * @param {number} windowNum\n * @private\n */\n setCurrentWindow_(windowNum) {\n // If the window isn't created, ignore the command.\n if (!this.windows_[windowNum]) {\n return;\n }\n this.currentWindow_ = this.windows_[windowNum];\n }\n\n /**\n * Yields each non-null window specified in the 8-bit bitmap.\n * @param {number} bitmap 8 bits corresponding to each of the 8 windows.\n * @return {!Array<number>}\n * @private\n */\n getSpecifiedWindowIds_(bitmap) {\n const ids = [];\n for (let i = 0; i < 8; i++) {\n const windowSpecified = (bitmap & 0x01) === 0x01;\n if (windowSpecified && this.windows_[i]) {\n ids.push(i);\n }\n bitmap >>= 1;\n }\n return ids;\n }\n\n /**\n * @param {number} windowsBitmap\n * @param {number} pts\n * @return {!Array<shaka.extern.ICaptionDecoder.ClosedCaption>}\n * @private\n */\n clearWindows_(windowsBitmap, pts) {\n const parsedClosedCaptions = [];\n\n // Clears windows from the 8 bit bitmap.\n for (const windowId of this.getSpecifiedWindowIds_(windowsBitmap)) {\n // If window visible and being cleared, emit buffer and reset start time!\n const window = this.windows_[windowId];\n if (window.isVisible()) {\n const newParsedClosedCaption =\n window.forceEmit(pts, this.serviceNumber_);\n if (newParsedClosedCaption) {\n parsedClosedCaptions.push(newParsedClosedCaption);\n }\n }\n window.resetMemory();\n }\n return parsedClosedCaptions;\n }\n\n /**\n * @param {number} windowsBitmap\n * @param {number} pts\n * @private\n */\n displayWindows_(windowsBitmap, pts) {\n // Displays windows from the 8 bit bitmap.\n for (const windowId of this.getSpecifiedWindowIds_(windowsBitmap)) {\n const window = this.windows_[windowId];\n if (!window.isVisible()) {\n // We are turning on the visibility, set the start time.\n window.setStartTime(pts);\n }\n window.display();\n }\n }\n\n /**\n * @param {number} windowsBitmap\n * @param {number} pts\n * @return {!Array<shaka.extern.ICaptionDecoder.ClosedCaption>}\n * @private\n */\n hideWindows_(windowsBitmap, pts) {\n let parsedClosedCaption = null;\n\n // Hides windows from the 8 bit bitmap.\n for (const windowId of this.getSpecifiedWindowIds_(windowsBitmap)) {\n const window = this.windows_[windowId];\n if (window.isVisible()) {\n // We are turning off the visibility, emit!\n parsedClosedCaption = window.forceEmit(pts, this.serviceNumber_);\n }\n window.hide();\n }\n return parsedClosedCaption ? [parsedClosedCaption] : [];\n }\n\n /**\n * @param {number} windowsBitmap\n * @param {number} pts\n * @return {!Array<shaka.extern.ICaptionDecoder.ClosedCaption>}\n * @private\n */\n toggleWindows_(windowsBitmap, pts) {\n let parsedClosedCaption = null;\n\n // Toggles windows from the 8 bit bitmap.\n for (const windowId of this.getSpecifiedWindowIds_(windowsBitmap)) {\n const window = this.windows_[windowId];\n if (window.isVisible()) {\n // We are turning off the visibility, emit!\n parsedClosedCaption = window.forceEmit(pts, this.serviceNumber_);\n } else {\n // We are turning on visibility, set the start time.\n window.setStartTime(pts);\n }\n\n window.toggle();\n }\n return parsedClosedCaption ? [parsedClosedCaption] : [];\n }\n\n /**\n * @param {number} windowsBitmap\n * @param {number} pts\n * @return {!Array<shaka.extern.ICaptionDecoder.ClosedCaption>}\n * @private\n */\n deleteWindows_(windowsBitmap, pts) {\n const parsedClosedCaptions = [];\n // Deletes windows from the 8 bit bitmap.\n for (const windowId of this.getSpecifiedWindowIds_(windowsBitmap)) {\n const window = this.windows_[windowId];\n if (window.isVisible()) {\n // We are turning off the visibility, emit!\n const newParsedClosedCaption =\n window.forceEmit(pts, this.serviceNumber_);\n if (newParsedClosedCaption) {\n parsedClosedCaptions.push(newParsedClosedCaption);\n }\n }\n // Delete the window from the list of windows\n this.windows_[windowId] = null;\n }\n return parsedClosedCaptions;\n }\n\n /**\n * Emits anything currently present in any of the windows, and then\n * deletes all windows, cancels all delays, reinitializes the service.\n * @param {number} pts\n * @return {!Array<shaka.extern.ICaptionDecoder.ClosedCaption>}\n * @private\n */\n reset_(pts) {\n const allWindowsBitmap = 0xff; // All windows should be deleted.\n const captions = this.deleteWindows_(allWindowsBitmap, pts);\n this.clear();\n return captions;\n }\n\n /**\n * Clears the state of the service completely.\n */\n clear() {\n this.currentWindow_ = null;\n this.windows_ = [null, null, null, null, null, null, null, null];\n }\n\n /**\n * @param {!shaka.cea.DtvccPacket} dtvccPacket\n * @throws {!shaka.util.Error}\n * @private\n */\n setPenAttributes_(dtvccPacket) {\n // Two bytes follow. For the purpose of this decoder, we are only concerned\n // with byte 2, which is of the form |I|U|EDTYP|FNTAG|.\n\n // I (1 bit): Italics toggle.\n // U (1 bit): Underline toggle.\n // EDTYP (3 bits): Edge type (unused in this decoder).\n // FNTAG (3 bits): Font tag (unused in this decoder).\n // More info at https://en.wikipedia.org/wiki/CEA-708#SetPenAttributes_(0x90_+_2_bytes)\n\n dtvccPacket.skip(1); // Skip first byte\n const attrByte2 = dtvccPacket.readByte().value;\n\n if (!this.currentWindow_) {\n return;\n }\n\n const italics = (attrByte2 & 0x80) > 0;\n const underline = (attrByte2 & 0x40) > 0;\n\n this.currentWindow_.setPenItalics(italics);\n this.currentWindow_.setPenUnderline(underline);\n }\n\n /**\n * @param {!shaka.cea.DtvccPacket} dtvccPacket\n * @throws {!shaka.util.Error}\n * @private\n */\n setPenColor_(dtvccPacket) {\n // Read foreground and background properties.\n const foregroundByte = dtvccPacket.readByte().value;\n const backgroundByte = dtvccPacket.readByte().value;\n dtvccPacket.skip(1); // Edge color not supported, skip it.\n\n if (!this.currentWindow_) {\n return;\n }\n\n // Byte semantics are described at the following link:\n // https://en.wikipedia.org/wiki/CEA-708#SetPenColor_(0x91_+_3_bytes)\n\n // Foreground color properties: |FOP|F_R|F_G|F_B|.\n const foregroundBlue = foregroundByte & 0x03;\n const foregroundGreen = (foregroundByte & 0x0c) >> 2;\n const foregroundRed = (foregroundByte & 0x30) >> 4;\n\n // Background color properties: |BOP|B_R|B_G|B_B|.\n const backgroundBlue = backgroundByte & 0x03;\n const backgroundGreen = (backgroundByte & 0x0c) >> 2;\n const backgroundRed = (backgroundByte & 0x30) >> 4;\n\n const foregroundColor = this.rgbColorToHex_(\n foregroundRed, foregroundGreen, foregroundBlue);\n\n const backgroundColor = this.rgbColorToHex_(\n backgroundRed, backgroundGreen, backgroundBlue);\n\n this.currentWindow_.setPenTextColor(foregroundColor);\n this.currentWindow_.setPenBackgroundColor(backgroundColor);\n }\n\n /**\n * @param {!shaka.cea.DtvccPacket} dtvccPacket\n * @throws {!shaka.util.Error}\n * @private\n */\n setPenLocation_(dtvccPacket) {\n // Following 2 bytes take the following form:\n // b1 = |0|0|0|0|ROW| and b2 = |0|0|COLUMN|\n const locationByte1 = dtvccPacket.readByte().value;\n const locationByte2 = dtvccPacket.readByte().value;\n\n if (!this.currentWindow_) {\n return;\n }\n\n const row = locationByte1 & 0x0f;\n const col = locationByte2 & 0x3f;\n this.currentWindow_.setPenLocation(row, col);\n }\n\n /**\n * @param {!shaka.cea.DtvccPacket} dtvccPacket\n * @throws {!shaka.util.Error}\n * @private\n */\n setWindowAttributes_(dtvccPacket) {\n // 4 bytes follow, with the following form:\n // Byte 1 contains fill-color information. Unused in this decoder.\n // Byte 2 contains border color information. Unused in this decoder.\n // Byte 3 contains justification information. In this decoder, we only use\n // the last 2 bits, which specifies text justification on the screen.\n // Byte 4 is special effects. Unused in this decoder.\n // More info at https://en.wikipedia.org/wiki/CEA-708#SetWindowAttributes_(0x97_+_4_bytes)\n dtvccPacket.skip(1); // Fill color not supported, skip.\n dtvccPacket.skip(1); // Border colors not supported, skip.\n const b3 = dtvccPacket.readByte().value;\n dtvccPacket.skip(1); // Effects not supported, skip.\n\n if (!this.currentWindow_) {\n return;\n }\n\n // Word wrap is outdated as of CEA-708-E, so we ignore those bits.\n // Extract the text justification and set it on the window.\n const justification =\n /** @type {!shaka.cea.Cea708Window.TextJustification} */ (b3 & 0x03);\n this.currentWindow_.setJustification(justification);\n }\n\n /**\n * @param {!shaka.cea.DtvccPacket} dtvccPacket\n * @param {number} windowNum\n * @param {number} pts\n * @throws {!shaka.util.Error}\n * @private\n */\n defineWindow_(dtvccPacket, windowNum, pts) {\n // Create the window if it doesn't exist.\n const windowAlreadyExists = this.windows_[windowNum] !== null;\n if (!windowAlreadyExists) {\n const window = new shaka.cea.Cea708Window(windowNum, this.serviceNumber_);\n window.setStartTime(pts);\n this.windows_[windowNum] = window;\n }\n\n // 6 Bytes follow, with the following form:\n // b1 = |0|0|V|R|C|PRIOR| , b2 = |P|VERT_ANCHOR| , b3 = |HOR_ANCHOR|\n // b4 = |ANC_ID|ROW_CNT| , b5 = |0|0|COL_COUNT| , b6 = |0|0|WNSTY|PNSTY|\n // Semantics of these bytes at https://en.wikipedia.org/wiki/CEA-708#DefineWindow07_(0x98-0x9F,_+_6_bytes)\n const b1 = dtvccPacket.readByte().value;\n const b2 = dtvccPacket.readByte().value;\n const b3 = dtvccPacket.readByte().value;\n const b4 = dtvccPacket.readByte().value;\n const b5 = dtvccPacket.readByte().value;\n const b6 = dtvccPacket.readByte().value;\n\n // As per 8.4.7 of CEA-708-E, row locks and column locks are to be ignored.\n // So this decoder will ignore these values.\n\n const visible = (b1 & 0x20) > 0;\n const verticalAnchor = b2 & 0x7f;\n const relativeToggle = (b2 & 0x80) > 0;\n const horAnchor = b3;\n const rowCount = (b4 & 0x0f) + 1; // Spec says to add 1.\n const anchorId = (b4 & 0xf0) >> 4;\n const colCount = (b5 & 0x3f) + 1; // Spec says to add 1.\n\n // If pen style = 0 AND window previously existed, keep its pen style.\n // Otherwise, change the pen style (For now, just reset to the default pen).\n // TODO add support for predefined pen styles and fonts.\n const penStyle = b6 & 0x07;\n if (!windowAlreadyExists || penStyle !== 0) {\n this.windows_[windowNum].resetPen();\n }\n\n this.windows_[windowNum].defineWindow(visible, verticalAnchor,\n horAnchor, anchorId, relativeToggle, rowCount, colCount);\n\n // Set the current window to the newly defined window.\n this.currentWindow_ = this.windows_[windowNum];\n }\n\n /**\n * Maps 64 possible CEA-708 colors to 8 CSS colors.\n * @param {number} red value from 0-3\n * @param {number} green value from 0-3\n * @param {number} blue value from 0-3\n * @return {string}\n * @private\n */\n rgbColorToHex_(red, green, blue) {\n // Rather than supporting 64 colors, this decoder supports 8 colors and\n // gets the closest color, as per 9.19 of CEA-708-E. This is because some\n // colors on television such as white, are often sent with lower intensity\n // and often appear dull/greyish on the browser, making them hard to read.\n\n // As per CEA-708-E 9.19, these mappings will map 64 colors to 8 colors.\n const colorMapping = {0: 0, 1: 0, 2: 1, 3: 1};\n red = colorMapping[red];\n green = colorMapping[green];\n blue = colorMapping[blue];\n\n const colorCode = (red << 2) | (green << 1) | blue;\n return shaka.cea.Cea708Service.Colors[colorCode];\n }\n};\n\n/**\n * @private @const {number}\n */\nshaka.cea.Cea708Service.ASCII_BACKSPACE = 0x08;\n\n/**\n * @private @const {number}\n */\nshaka.cea.Cea708Service.ASCII_FORM_FEED = 0x0c;\n\n/**\n * @private @const {number}\n */\nshaka.cea.Cea708Service.ASCII_CARRIAGE_RETURN = 0x0d;\n\n/**\n * @private @const {number}\n */\nshaka.cea.Cea708Service.ASCII_HOR_CARRIAGE_RETURN = 0x0e;\n\n/**\n * For extended control codes in block_data on CEA-708, byte 1 is 0x10.\n * @private @const {number}\n */\nshaka.cea.Cea708Service.EXT_CEA708_CTRL_CODE_BYTE1 = 0x10;\n\n/**\n * Holds characters mapping for bytes that are G2 control codes.\n * @private @const {!Map<number, string>}\n */\nshaka.cea.Cea708Service.G2Charset = new Map([\n [0x20, ' '], [0x21, '\\xa0'], [0x25, '…'], [0x2a, 'Š'], [0x2c, 'Œ'],\n [0x30, '█'], [0x31, '‘'], [0x32, '’'], [0x33, '“'], [0x34, '”'],\n [0x35, '•'], [0x39, '™'], [0x3a, 'š'], [0x3c, 'œ'], [0x3d, '℠'],\n [0x3f, 'Ÿ'], [0x76, '⅛'], [0x77, '⅜'], [0x78, '⅝'], [0x79, '⅞'],\n [0x7a, '│'], [0x7b, '┐'], [0x7c, '└'], [0x7d, '─'], [0x7e, '┘'], [0x7f, '┌'],\n]);\n\n/**\n * An array of 8 colors that 64 colors can be quantized to. Order here matters.\n * @private @const {!Array<string>}\n */\nshaka.cea.Cea708Service.Colors = [\n 'black', 'blue', 'green', 'cyan',\n 'red', 'magenta', 'yellow', 'white',\n];\n\n/**\n * CEA-708 closed captions byte.\n * @typedef {{\n * pts: number,\n * type: number,\n * value: number,\n * order: number\n * }}\n *\n * @property {number} pts\n * Presentation timestamp (in second) at which this packet was received.\n * @property {number} type\n * Type of the byte. Either 2 or 3, DTVCC Packet Data or a DTVCC Packet Start.\n * @property {number} value The byte containing data relevant to the packet.\n * @property {number} order\n * A number indicating the order this packet was received in a sequence\n * of packets. Used to break ties in a stable sorting algorithm\n */\nshaka.cea.Cea708Service.Cea708Byte;\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.cea.CeaDecoder');\n\ngoog.require('shaka.cea.Cea608DataChannel');\ngoog.require('shaka.cea.Cea708Service');\ngoog.require('shaka.cea.DtvccPacketBuilder');\ngoog.require('shaka.log');\ngoog.require('shaka.media.ClosedCaptionParser');\ngoog.require('shaka.util.DataViewReader');\ngoog.require('shaka.util.Error');\ngoog.requireType('shaka.cea.DtvccPacket');\n\n\n/**\n * CEA-X08 captions decoder.\n * @implements {shaka.extern.ICaptionDecoder}\n * @export\n */\nshaka.cea.CeaDecoder = class {\n /** */\n constructor() {\n /**\n * An array of CEA-608 closed caption data extracted for decoding.\n * @private {!Array<!shaka.cea.Cea608DataChannel.Cea608Packet>}\n */\n this.cea608DataArray_ = [];\n\n /**\n * An array of CEA-708 closed caption data extracted for decoding.\n * @private {!Array<!shaka.cea.Cea708Service.Cea708Byte>}\n */\n this.cea708DataArray_ = [];\n\n /**\n * A DTVCC Packet builder for CEA-708 data.\n * @private {!shaka.cea.DtvccPacketBuilder}\n */\n this.dtvccPacketBuilder_ = new shaka.cea.DtvccPacketBuilder();\n\n /**\n * Number of consecutive bad frames decoded on CEA-608.\n * @private {number}\n */\n this.badFrames_ = 0;\n\n /**\n * A map containing the stream for each mode.\n * @private {!Map<string, !shaka.cea.Cea608DataChannel>}\n */\n this.cea608ModeToStream_ = new Map([\n ['CC1', new shaka.cea.Cea608DataChannel(0, 0)], // F1 + C1 -> CC1\n ['CC2', new shaka.cea.Cea608DataChannel(0, 1)], // F1 + C2 -> CC2\n ['CC3', new shaka.cea.Cea608DataChannel(1, 0)], // F2 + C1 -> CC3\n ['CC4', new shaka.cea.Cea608DataChannel(1, 1)], // F2 + C2 -> CC4\n ]);\n\n /**\n * The current channel that is active on CEA-608 field 1.\n * @private {number}\n */\n this.currentField1Channel_ = 0;\n\n /**\n * The current channel that is active on CEA-608 field 2.\n * @private {number}\n */\n this.currentField2Channel_ = 0;\n\n /**\n * Map of service number to CEA-708 services, initially empty. Since there\n * can be up to 63 services, they are created dynamically only when needed.\n * @private {!Map<number, shaka.cea.Cea708Service>}\n */\n this.serviceNumberToService_ = new Map();\n\n /**\n * @private {boolean}\n */\n this.waitingForFirstPacket_ = true;\n\n /**\n * Set used to track available streams.\n * @private {!Set<string>}\n */\n this.streams_ = new Set();\n\n this.reset();\n }\n\n /**\n * Clears the decoder.\n * @override\n */\n clear() {\n shaka.log.debug('Clearing CEA decoder');\n this.badFrames_ = 0;\n this.cea608DataArray_ = [];\n this.cea708DataArray_ = [];\n this.dtvccPacketBuilder_.clear();\n this.reset();\n\n // Clear all the CEA-708 services.\n for (const service of this.serviceNumberToService_.values()) {\n service.clear();\n }\n }\n\n /**\n * Resets the decoder.\n */\n reset() {\n shaka.log.debug('Resetting CEA decoder');\n this.currentField1Channel_ = 0;\n this.currentField2Channel_ = 0;\n for (const stream of this.cea608ModeToStream_.values()) {\n stream.reset();\n }\n this.waitingForFirstPacket_ = true;\n }\n\n /**\n * Extracts closed caption bytes from CEA-X08 packets from the stream based on\n * ANSI/SCTE 128 and A/53, Part 4.\n * @override\n */\n extract(userDataSeiMessage, pts) {\n if (this.waitingForFirstPacket_) {\n shaka.log.debug('Setting first pts value to', pts);\n for (const stream of this.cea608ModeToStream_.values()) {\n stream.firstPts(pts);\n }\n this.waitingForFirstPacket_ = false;\n }\n\n const reader = new shaka.util.DataViewReader(\n userDataSeiMessage, shaka.util.DataViewReader.Endianness.BIG_ENDIAN);\n\n if (reader.getLength() < shaka.cea.CeaDecoder.MIN_LENGTH) {\n return;\n }\n if (reader.readUint8() !== shaka.cea.CeaDecoder.USA_COUNTRY_CODE) {\n return;\n }\n if (reader.readUint16() !== shaka.cea.CeaDecoder.ATSC_PROVIDER_CODE) {\n return;\n }\n if (reader.readUint32() !== shaka.cea.CeaDecoder.ATSC1_USER_IDENTIFIER) {\n return;\n }\n\n // user_data_type_code: 0x03 - cc_data()\n if (reader.readUint8() !== 0x03) {\n return;\n }\n\n // 1 bit reserved\n // 1 bit process_cc_data_flag\n // 1 bit zero_bit\n // 5 bits cc_count\n const captionData = reader.readUint8();\n // If process_cc_data_flag is not set, do not process this data.\n if ((captionData & 0x40) === 0) {\n return;\n }\n\n const count = captionData & 0x1f;\n\n // 8 bits reserved\n reader.skip(1);\n\n for (let i = 0; i < count; i++) {\n const cc = reader.readUint8();\n // When ccValid is 0, the next two bytes should be discarded.\n const ccValid = (cc & 0x04) >> 2;\n const ccData1 = reader.readUint8();\n const ccData2 = reader.readUint8();\n\n if (ccValid) {\n const ccType = cc & 0x03;\n // Send the packet to the appropriate data array (CEA-608 or CEA-708).\n if (ccType === shaka.cea.CeaDecoder.NTSC_CC_FIELD_1 ||\n ccType === shaka.cea.CeaDecoder.NTSC_CC_FIELD_2) {\n // CEA-608 NTSC (Line 21) Data.\n this.cea608DataArray_.push({\n pts,\n type: ccType,\n ccData1,\n ccData2,\n order: this.cea608DataArray_.length,\n });\n } else {\n // CEA-708 DTVCC Data.\n this.cea708DataArray_.push({\n pts,\n type: ccType,\n value: ccData1,\n order: this.cea708DataArray_.length,\n });\n\n // The second byte should always be labelled as DTVCC packet data.\n // Even if this pair was a DTVCC packet start, only the first byte\n // contains header info, and the second byte is just packet data.\n this.cea708DataArray_.push({\n pts,\n type: shaka.cea.DtvccPacketBuilder.DTVCC_PACKET_DATA,\n value: ccData2,\n order: this.cea708DataArray_.length,\n });\n }\n }\n }\n }\n\n /**\n * Decodes extracted closed caption data.\n * @override\n */\n decode() {\n /** @type {!Array<!shaka.extern.ICaptionDecoder.ClosedCaption>} */\n const parsedClosedCaptions = [];\n\n // In some versions of Chrome, and other browsers, the default sorting\n // algorithm isn't stable. This comparator sorts on presentation\n // timestamp, and breaks ties on receive order (position in array).\n const stableComparator =\n (p1, p2) => (p1.pts - p2.pts) || (p1.order - p2.order);\n\n this.cea608DataArray_.sort(stableComparator);\n this.cea708DataArray_.sort(stableComparator);\n\n // CEA-608 packets are just byte pairs. Decode all of them.\n for (const cea608Packet of this.cea608DataArray_) {\n const parsedClosedCaption = this.decodeCea608_(cea608Packet);\n if (parsedClosedCaption) {\n parsedClosedCaptions.push(parsedClosedCaption);\n }\n }\n\n // CEA-708 packets are DTVCC packets composed of many byte pairs. Add all\n // byte pairs to the packet builder, and process + clear any ready packets.\n for (const cea708Byte of this.cea708DataArray_) {\n this.dtvccPacketBuilder_.addByte(cea708Byte);\n }\n const dtvccPackets = this.dtvccPacketBuilder_.getBuiltPackets();\n for (const dtvccPacket of dtvccPackets) {\n const closedCaptions = this.decodeCea708_(dtvccPacket);\n parsedClosedCaptions.push(...closedCaptions);\n }\n\n // Clear all processed data.\n this.dtvccPacketBuilder_.clearBuiltPackets();\n this.cea608DataArray_ = [];\n this.cea708DataArray_ = [];\n\n return parsedClosedCaptions;\n }\n\n /**\n * Decodes a CEA-608 closed caption packet based on ANSI/CEA-608.\n * @param {shaka.cea.Cea608DataChannel.Cea608Packet} ccPacket\n * @return {?shaka.extern.ICaptionDecoder.ClosedCaption}\n * @private\n */\n decodeCea608_(ccPacket) {\n const fieldNum = ccPacket.type;\n\n // If this packet is a control code, then it also sets the channel.\n // For control codes, cc_data_1 has the form |P|0|0|1|C|X|X|X|.\n // \"C\" is the channel bit. It indicates whether to set C2 active.\n if (shaka.cea.Cea608DataChannel.isControlCode(ccPacket.ccData1)) {\n const channelNum = (ccPacket.ccData1 >> 3) & 0x01; // Get channel bit.\n\n // Change the stream based on the field, and the new channel\n if (fieldNum === 0) {\n this.currentField1Channel_ = channelNum;\n } else {\n this.currentField2Channel_ = channelNum;\n }\n }\n\n // Get the correct stream for this caption packet (CC1, ..., CC4)\n const selectedChannel = fieldNum ?\n this.currentField2Channel_ : this.currentField1Channel_;\n const selectedMode = `CC${((fieldNum << 1) | selectedChannel) + 1}`;\n const selectedStream = this.cea608ModeToStream_.get(selectedMode);\n\n // Check for bad frames (bad pairs). This can be two 0xff, two 0x00, or any\n // byte of even parity. ccData1 and ccData2 should be uint8 of odd parity.\n if ((ccPacket.ccData1 === 0xff && ccPacket.ccData2 === 0xff) ||\n (!ccPacket.ccData1 && !ccPacket.ccData2) ||\n !this.isOddParity_(ccPacket.ccData1) ||\n !this.isOddParity_(ccPacket.ccData2)) {\n // Per CEA-608-B C.21, reset the memory after 45 consecutive bad frames.\n if (++this.badFrames_ >= 45) {\n this.reset();\n }\n return null;\n }\n this.badFrames_ = 0;\n\n // Remove the MSB (parity bit).\n ccPacket.ccData1 &= 0x7f;\n ccPacket.ccData2 &= 0x7f;\n\n // Ignore XDS\n if (shaka.cea.Cea608DataChannel.isXdsControlCode(ccPacket.ccData1)) {\n return null;\n }\n\n // Check for empty captions and skip them.\n if (!ccPacket.ccData1 && !ccPacket.ccData2) {\n return null;\n }\n\n // Process the clean CC data pair.\n let parsedClosedCaption = null;\n if (shaka.cea.Cea608DataChannel.isControlCode(ccPacket.ccData1)) {\n this.streams_.add(selectedMode);\n parsedClosedCaption = selectedStream.handleControlCode(ccPacket);\n } else {\n // Handle as a Basic North American Character.\n selectedStream.handleBasicNorthAmericanChar(\n ccPacket.ccData1, ccPacket.ccData2);\n }\n\n return parsedClosedCaption;\n }\n\n /**\n * Decodes a CEA-708 DTVCC packet based on ANSI/CTA-708-E.\n * @param {shaka.cea.DtvccPacket} dtvccPacket\n * @return {!Array<!shaka.extern.ICaptionDecoder.ClosedCaption>}\n * @private\n */\n decodeCea708_(dtvccPacket) {\n const parsedClosedCaptions = [];\n try {\n while (dtvccPacket.hasMoreData()) {\n // Process a service block.\n const serviceBlockHeader = dtvccPacket.readByte().value;\n\n // First 3 bits are service number, next 5 are block size,\n // representing the number of bytes coming in this block\n // (excluding a possible extended service block header byte)\n let serviceNumber = (serviceBlockHeader & 0xe0) >> 5;\n const blockSize = serviceBlockHeader & 0x1f;\n\n if (serviceNumber === /* 0b111 */ 0x07 && blockSize != 0) {\n // 2 bits null padding, 6 bits extended service number\n const extendedServiceBlockHeader = dtvccPacket.readByte().value;\n serviceNumber = extendedServiceBlockHeader & 0x3f;\n }\n\n // As per CEA-708-E, service number 0 is invalid, and should be ignored.\n if (serviceNumber != 0) {\n this.streams_.add('svc'+ serviceNumber);\n // If the service doesn't already exist, create it.\n if (!this.serviceNumberToService_.has(serviceNumber)) {\n const service = new shaka.cea.Cea708Service(serviceNumber);\n this.serviceNumberToService_.set(serviceNumber, service);\n }\n const service = this.serviceNumberToService_.get(serviceNumber);\n\n // Process all control codes.\n const startPos = dtvccPacket.getPosition();\n\n // Execute this loop `blockSize` times, to decode the control codes.\n while (dtvccPacket.getPosition() - startPos < blockSize) {\n const closedCaptions = service.handleCea708ControlCode(dtvccPacket);\n parsedClosedCaptions.push(...closedCaptions);\n } // position < end of block\n } // serviceNumber != 0\n } // hasMoreData\n } catch (error) {\n if (error instanceof shaka.util.Error &&\n error.code === shaka.util.Error.Code.BUFFER_READ_OUT_OF_BOUNDS) {\n shaka.log.warnOnce('CEA708_INVALID_DATA',\n 'Buffer read out of bounds / invalid CEA-708 Data.');\n } else {\n // This is an unexpected error, and should be rethrown.\n throw error;\n }\n }\n return parsedClosedCaptions;\n }\n\n /**\n * Checks if a byte has odd parity (Odd number of 1s in binary).\n * @param {number} byte\n * @return {boolean} True if the byte has odd parity.\n * @private\n */\n isOddParity_(byte) {\n let parity = 0;\n while (byte) {\n parity ^= (byte & 1); // toggle parity if low bit is 1\n byte >>= 1; // shift away the low bit\n }\n return parity === 1;\n }\n\n /**\n * Returns the streams that the CEA decoder found.\n *\n * @override\n */\n getStreams() {\n return Array.from(this.streams_);\n }\n};\n\n/**\n * itu_t_35_provider_code for ATSC user_data\n * @private @const {number}\n */\nshaka.cea.CeaDecoder.ATSC_PROVIDER_CODE = 0x0031;\n\n/**\n * When provider is ATSC user data, the ATSC_user_identifier code\n * for ATSC1_data is \"GA94\" (0x47413934)\n * @private @const {number}\n */\nshaka.cea.CeaDecoder.ATSC1_USER_IDENTIFIER = 0x47413934;\n\n/**\n * @private @const {number}\n */\nshaka.cea.CeaDecoder.NTSC_CC_FIELD_1 = 0;\n\n/**\n * @private @const {number}\n */\nshaka.cea.CeaDecoder.NTSC_CC_FIELD_2 = 1;\n\n/**\n * 0xB5 is USA's code (Rec. ITU-T T.35)\n * @private @const {number}\n */\nshaka.cea.CeaDecoder.USA_COUNTRY_CODE = 0xb5;\n\n/**\n * Caption packet min length\n * Country Code + ATSC_PROVIDER_CODE + ATSC_1_USER_IDENTIFIER + USER_DATA_TYPE\n * @private @const {number}\n */\nshaka.cea.CeaDecoder.MIN_LENGTH = 8;\n\nshaka.media.ClosedCaptionParser.registerDecoder(\n () => new shaka.cea.CeaDecoder());\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.cea.SeiProcessor');\n\n\n/**\n * H.264 SEI NALU Parser used for extracting 708 closed caption packets.\n */\nshaka.cea.SeiProcessor = class {\n /**\n * Processes supplemental enhancement information data.\n * @param {!Uint8Array} naluData NALU from which SEI data is to be processed.\n * @return {!Array<!Uint8Array>}\n */\n process(naluData) {\n const seiPayloads = [];\n const naluClone = this.removeEmu(naluData);\n\n // The following is an implementation of section 7.3.2.3.1\n // in Rec. ITU-T H.264 (06/2019), the H.264 spec.\n let offset = 0;\n\n while (offset < naluClone.length) {\n let payloadType = 0; // SEI payload type as defined by H.264 spec\n while (naluClone[offset] == 0xFF) {\n payloadType += 255;\n offset++;\n }\n payloadType += naluClone[offset++];\n\n let payloadSize = 0; // SEI payload size as defined by H.264 spec\n while (naluClone[offset] == 0xFF) {\n payloadSize += 255;\n offset++;\n }\n payloadSize += naluClone[offset++];\n\n // Payload type 4 is user_data_registered_itu_t_t35, as per the H.264\n // spec. This payload type contains caption data.\n if (payloadType == 0x04) {\n seiPayloads.push(naluClone.subarray(offset, offset + payloadSize));\n }\n offset += payloadSize;\n }\n\n return seiPayloads;\n }\n\n\n /**\n * Removes H.264 emulation prevention bytes from the byte array.\n *\n * Note: Remove bytes by shifting will cause Chromium (VDA) to complain\n * about conformance. Recreating a new array solves it.\n *\n * @param {!Uint8Array} naluData NALU from which EMUs should be removed.\n * @return {!Uint8Array} The NALU with the emulation prevention byte removed.\n */\n removeEmu(naluData) {\n let naluClone = naluData;\n let zeroCount = 0;\n let src = 0;\n while (src < naluClone.length) {\n if (zeroCount == 2 && naluClone[src] == 0x03) {\n // 0x00, 0x00, 0x03 pattern detected\n zeroCount = 0;\n\n // Splice the array and recreate a new one, instead of shifting bytes\n const newArr = [...naluClone];\n newArr.splice(src, 1);\n naluClone = new Uint8Array(newArr);\n } else {\n if (naluClone[src] == 0x00) {\n zeroCount++;\n } else {\n zeroCount = 0;\n }\n }\n src++;\n }\n return naluClone;\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.cea.Mp4CeaParser');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.cea.CeaUtils');\ngoog.require('shaka.cea.SeiProcessor');\ngoog.require('shaka.log');\ngoog.require('shaka.media.ClosedCaptionParser');\ngoog.require('shaka.util.DataViewReader');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.Mp4Parser');\ngoog.require('shaka.util.Mp4BoxParsers');\n\n/**\n * MPEG4 stream parser used for extracting 708 closed captions data.\n * @implements {shaka.extern.ICeaParser}\n * @export\n */\nshaka.cea.Mp4CeaParser = class {\n /** */\n constructor() {\n /**\n * SEI data processor.\n * @private\n * @const {!shaka.cea.SeiProcessor}\n */\n this.seiProcessor_ = new shaka.cea.SeiProcessor();\n\n /**\n * Map of track id to corresponding timescale.\n * @private {!Map<number, number>}\n */\n this.trackIdToTimescale_ = new Map();\n\n /**\n * Default sample duration, as specified by the TREX box.\n * @private {number}\n */\n this.defaultSampleDuration_ = 0;\n\n /**\n * Default sample size, as specified by the TREX box.\n * @private {number}\n */\n this.defaultSampleSize_ = 0;\n\n /**\n * @private {shaka.cea.Mp4CeaParser.BitstreamFormat}\n */\n this.bitstreamFormat_ = shaka.cea.Mp4CeaParser.BitstreamFormat.UNKNOWN;\n }\n\n /**\n * Parses the init segment. Gets Default Sample Duration and Size from the\n * TREX box, and constructs a map of Track IDs to timescales. Each TRAK box\n * contains a track header (TKHD) containing track ID, and a media header box\n * (MDHD) containing the timescale for the track\n * @override\n */\n init(initSegment) {\n const Mp4Parser = shaka.util.Mp4Parser;\n const BitstreamFormat = shaka.cea.Mp4CeaParser.BitstreamFormat;\n const trackIds = [];\n const timescales = [];\n\n const codecBoxParser = (box) => this.setBitstreamFormat_(box.name);\n\n new Mp4Parser()\n .box('moov', Mp4Parser.children)\n .box('mvex', Mp4Parser.children)\n .fullBox('trex', (box) => {\n const parsedTREXBox = shaka.util.Mp4BoxParsers.parseTREX(\n box.reader);\n\n this.defaultSampleDuration_ = parsedTREXBox.defaultSampleDuration;\n this.defaultSampleSize_ = parsedTREXBox.defaultSampleSize;\n })\n .box('trak', Mp4Parser.children)\n .fullBox('tkhd', (box) => {\n goog.asserts.assert(\n box.version != null,\n 'TKHD is a full box and should have a valid version.');\n const parsedTKHDBox = shaka.util.Mp4BoxParsers.parseTKHD(\n box.reader, box.version);\n trackIds.push(parsedTKHDBox.trackId);\n })\n .box('mdia', Mp4Parser.children)\n .fullBox('mdhd', (box) => {\n goog.asserts.assert(\n box.version != null,\n 'MDHD is a full box and should have a valid version.');\n const parsedMDHDBox = shaka.util.Mp4BoxParsers.parseMDHD(\n box.reader, box.version);\n timescales.push(parsedMDHDBox.timescale);\n })\n .box('minf', Mp4Parser.children)\n .box('stbl', Mp4Parser.children)\n .fullBox('stsd', Mp4Parser.sampleDescription)\n\n // These are the various boxes that signal a codec.\n .box('avc1', codecBoxParser)\n .box('avc3', codecBoxParser)\n .box('dvav', codecBoxParser)\n .box('dva1', codecBoxParser)\n .box('hev1', codecBoxParser)\n .box('hvc1', codecBoxParser)\n .box('dvh1', codecBoxParser)\n .box('dvhe', codecBoxParser)\n .box('vvc1', codecBoxParser)\n .box('vvi1', codecBoxParser)\n .box('dvc1', codecBoxParser)\n .box('dvi1', codecBoxParser)\n\n // This signals an encrypted sample, which we can go inside of to find\n // the codec used.\n .box('encv', Mp4Parser.visualSampleEntry)\n .box('sinf', Mp4Parser.children)\n .box('frma', (box) => {\n const {codec} = shaka.util.Mp4BoxParsers.parseFRMA(box.reader);\n this.setBitstreamFormat_(codec);\n })\n\n .parse(initSegment, /* partialOkay= */ true);\n\n // At least one track should exist, and each track should have a\n // corresponding Id in TKHD box, and timescale in its MDHD box\n if (!trackIds.length|| !timescales.length ||\n trackIds.length != timescales.length) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.TEXT,\n shaka.util.Error.Code.INVALID_MP4_CEA);\n }\n\n if (this.bitstreamFormat_ == BitstreamFormat.UNKNOWN) {\n shaka.log.alwaysWarn(\n 'Unable to determine bitstream format for CEA parsing!');\n }\n\n // Populate the map from track Id to timescale\n trackIds.forEach((trackId, idx) => {\n this.trackIdToTimescale_.set(trackId, timescales[idx]);\n });\n }\n\n /**\n * Parses each video segment. In fragmented MP4s, MOOF and MDAT come in\n * pairs. The following logic gets the necessary info from MOOFs to parse\n * MDATs (base media decode time, sample sizes/offsets/durations, etc),\n * and then parses the MDAT boxes for CEA-708 packets using this information.\n * CEA-708 packets are returned in the callback.\n * @override\n */\n parse(mediaSegment) {\n const Mp4Parser = shaka.util.Mp4Parser;\n const BitstreamFormat = shaka.cea.Mp4CeaParser.BitstreamFormat;\n\n if (this.bitstreamFormat_ == BitstreamFormat.UNKNOWN) {\n // We don't know how to extract SEI from this.\n return [];\n }\n\n /** @type {!Array<!shaka.extern.ICeaParser.CaptionPacket>} **/\n const captionPackets = [];\n\n let moofOffset = 0;\n\n /** @type {!Array<!shaka.cea.Mp4CeaParser.ParsedTRAF>} */\n let parsedTRAFs = [];\n\n new Mp4Parser()\n .box('moof', (box) => {\n moofOffset = box.start;\n // traf box parsing is reset on each moof.\n parsedTRAFs = [];\n Mp4Parser.children(box);\n })\n .box('traf', (box) => {\n parsedTRAFs.push({\n baseMediaDecodeTime: null,\n defaultSampleDuration: this.defaultSampleDuration_,\n defaultSampleSize: this.defaultSampleSize_,\n parsedTRUNs: [],\n timescale: shaka.cea.CeaUtils.DEFAULT_TIMESCALE_VALUE,\n });\n Mp4Parser.children(box);\n })\n .fullBox('trun', (box) => {\n goog.asserts.assert(\n box.version != null && box.flags != null,\n 'TRUN is a full box and should have a valid version & flags.');\n\n const lastTRAF = parsedTRAFs[parsedTRAFs.length - 1];\n\n const parsedTRUN = shaka.util.Mp4BoxParsers.parseTRUN(\n box.reader, box.version, box.flags);\n lastTRAF.parsedTRUNs.push(parsedTRUN);\n })\n .fullBox('tfhd', (box) => {\n goog.asserts.assert(\n box.flags != null,\n 'TFHD is a full box and should have valid flags.');\n\n const lastTRAF = parsedTRAFs[parsedTRAFs.length - 1];\n\n const parsedTFHD = shaka.util.Mp4BoxParsers.parseTFHD(\n box.reader, box.flags);\n\n // If specified, defaultSampleDuration and defaultSampleSize\n // override the ones specified in the TREX box\n lastTRAF.defaultSampleDuration = parsedTFHD.defaultSampleDuration ||\n this.defaultSampleDuration_;\n\n lastTRAF.defaultSampleSize = parsedTFHD.defaultSampleSize ||\n this.defaultSampleSize_;\n\n const trackId = parsedTFHD.trackId;\n\n // Get the timescale from the track Id\n if (this.trackIdToTimescale_.has(trackId)) {\n lastTRAF.timescale = this.trackIdToTimescale_.get(trackId);\n }\n })\n .fullBox('tfdt', (box) => {\n goog.asserts.assert(\n box.version != null,\n 'TFDT is a full box and should have a valid version.');\n\n const lastTRAF = parsedTRAFs[parsedTRAFs.length - 1];\n\n const parsedTFDT = shaka.util.Mp4BoxParsers.parseTFDTInaccurate(\n box.reader, box.version);\n\n lastTRAF.baseMediaDecodeTime = parsedTFDT.baseMediaDecodeTime;\n })\n .box('mdat', (box) => {\n const offset = moofOffset - box.start - 8;\n const initialPosition = box.reader.getPosition();\n for (const parsedTRAF of parsedTRAFs) {\n if (parsedTRAF.baseMediaDecodeTime === null) {\n // This field should have been populated by the Base Media Decode\n // Time in the tfdt box.\n shaka.log.alwaysWarn(\n 'Unable to find base media decode time for CEA captions!');\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.TEXT,\n shaka.util.Error.Code.INVALID_MP4_CEA);\n }\n box.reader.seek(initialPosition);\n this.parseMdat_(box.reader,\n parsedTRAF.baseMediaDecodeTime,\n parsedTRAF.timescale,\n parsedTRAF.defaultSampleDuration,\n parsedTRAF.defaultSampleSize,\n offset,\n parsedTRAF.parsedTRUNs,\n captionPackets);\n }\n })\n .parse(mediaSegment, /* partialOkay= */ false);\n\n return captionPackets;\n }\n\n /**\n * Parse MDAT box.\n * @param {!shaka.util.DataViewReader} reader\n * @param {number} time\n * @param {number} timescale\n * @param {number} defaultSampleDuration\n * @param {number} defaultSampleSize\n * @param {number} offset\n * @param {!Array<shaka.util.ParsedTRUNBox>} parsedTRUNs\n * @param {!Array<!shaka.extern.ICeaParser.CaptionPacket>} captionPackets\n * @private\n */\n parseMdat_(reader, time, timescale, defaultSampleDuration,\n defaultSampleSize, offset, parsedTRUNs, captionPackets) {\n const BitstreamFormat = shaka.cea.Mp4CeaParser.BitstreamFormat;\n const CeaUtils = shaka.cea.CeaUtils;\n let sampleIndex = 0;\n\n // The fields in each ParsedTRUNSample contained in the sampleData\n // array are nullable. In the case of sample data and sample duration,\n // we use the defaults provided by the TREX/TFHD boxes. For sample\n // composition time offset, we default to 0.\n let sampleSize = defaultSampleSize;\n\n // Combine all sample data. This assumes that the samples described across\n // multiple trun boxes are still continuous in the mdat box.\n const sampleDatas = parsedTRUNs.map((t) => t.sampleData);\n const sampleData = [].concat(...sampleDatas);\n\n if (sampleData.length) {\n sampleSize = sampleData[0].sampleSize || defaultSampleSize;\n }\n\n reader.skip(offset + parsedTRUNs[0].dataOffset);\n\n while (reader.hasMoreData()) {\n const naluSize = reader.readUint32();\n const naluHeader = reader.readUint8();\n let naluType = null;\n let isSeiMessage = false;\n let naluHeaderSize = 1;\n\n goog.asserts.assert(this.bitstreamFormat_ != BitstreamFormat.UNKNOWN,\n 'Bitstream format should have been checked before now!');\n switch (this.bitstreamFormat_) {\n case BitstreamFormat.H264:\n naluType = naluHeader & 0x1f;\n isSeiMessage = naluType == CeaUtils.H264_NALU_TYPE_SEI;\n break;\n\n case BitstreamFormat.H265:\n naluHeaderSize = 2;\n reader.skip(1);\n naluType = (naluHeader >> 1) & 0x3f;\n isSeiMessage =\n naluType == CeaUtils.H265_PREFIX_NALU_TYPE_SEI ||\n naluType == CeaUtils.H265_SUFFIX_NALU_TYPE_SEI;\n break;\n\n case BitstreamFormat.H266:\n naluHeaderSize = 2;\n reader.skip(1);\n naluType = (naluHeader >> 1) & 0x3f;\n isSeiMessage =\n naluType == CeaUtils.H266_PREFIX_NALU_TYPE_SEI ||\n naluType == CeaUtils.H266_SUFFIX_NALU_TYPE_SEI;\n break;\n\n default:\n return;\n }\n\n if (isSeiMessage) {\n let timeOffset = 0;\n\n if (sampleIndex < sampleData.length) {\n timeOffset = sampleData[sampleIndex].sampleCompositionTimeOffset || 0;\n }\n\n const pts = (time + timeOffset) / timescale;\n for (const packet of this.seiProcessor_\n .process(reader.readBytes(naluSize - naluHeaderSize))) {\n captionPackets.push({\n packet,\n pts,\n });\n }\n } else {\n try {\n reader.skip(naluSize - naluHeaderSize);\n } catch (e) {\n // It is necessary to ignore this error because it can break the start\n // of playback even if the user does not want to see the subtitles.\n break;\n }\n }\n sampleSize -= (naluSize + 4);\n if (sampleSize == 0) {\n if (sampleIndex < sampleData.length) {\n time += sampleData[sampleIndex].sampleDuration ||\n defaultSampleDuration;\n } else {\n time += defaultSampleDuration;\n }\n\n sampleIndex++;\n\n if (sampleIndex < sampleData.length) {\n sampleSize = sampleData[sampleIndex].sampleSize || defaultSampleSize;\n } else {\n sampleSize = defaultSampleSize;\n }\n }\n }\n }\n\n /**\n * @param {string} codec A fourcc for a codec.\n * @private\n */\n setBitstreamFormat_(codec) {\n if (shaka.cea.Mp4CeaParser.CodecBitstreamMap_.has(codec)) {\n this.bitstreamFormat_ =\n shaka.cea.Mp4CeaParser.CodecBitstreamMap_.get(codec);\n }\n }\n};\n\n/** @enum {number} */\nshaka.cea.Mp4CeaParser.BitstreamFormat = {\n UNKNOWN: 0,\n H264: 1,\n H265: 2,\n H266: 3,\n};\n\n/** @private {Map<string, shaka.cea.Mp4CeaParser.BitstreamFormat>} */\nshaka.cea.Mp4CeaParser.CodecBitstreamMap_ = new Map()\n // AVC\n .set('avc1', shaka.cea.Mp4CeaParser.BitstreamFormat.H264)\n .set('avc3', shaka.cea.Mp4CeaParser.BitstreamFormat.H264)\n // Dolby Vision based in AVC\n .set('dvav', shaka.cea.Mp4CeaParser.BitstreamFormat.H264)\n .set('dva1', shaka.cea.Mp4CeaParser.BitstreamFormat.H264)\n // HEVC\n .set('hev1', shaka.cea.Mp4CeaParser.BitstreamFormat.H265)\n .set('hvc1', shaka.cea.Mp4CeaParser.BitstreamFormat.H265)\n // Dolby Vision based in HEVC\n .set('dvh1', shaka.cea.Mp4CeaParser.BitstreamFormat.H265)\n .set('dvhe', shaka.cea.Mp4CeaParser.BitstreamFormat.H265)\n // VVC\n .set('vvc1', shaka.cea.Mp4CeaParser.BitstreamFormat.H266)\n .set('vvi1', shaka.cea.Mp4CeaParser.BitstreamFormat.H266)\n // Dolby Vision based in VVC\n .set('dvc1', shaka.cea.Mp4CeaParser.BitstreamFormat.H266)\n .set('dvi1', shaka.cea.Mp4CeaParser.BitstreamFormat.H266);\n\n/**\n * @typedef {{\n * baseMediaDecodeTime: ?number,\n * defaultSampleDuration: number,\n * defaultSampleSize: number,\n * parsedTRUNs: !Array<shaka.util.ParsedTRUNBox>,\n * timescale: number\n * }}\n *\n * @property {?number} baseMediaDecodeTime\n * @property {number} defaultSampleDuration\n * @property {number} defaultSampleSize\n * @property {!Array<shaka.util.ParsedTRUNBox>} parsedTRUNs\n * @property {?number} timescale\n */\nshaka.cea.Mp4CeaParser.ParsedTRAF;\n\nshaka.media.ClosedCaptionParser.registerParser('video/mp4',\n () => new shaka.cea.Mp4CeaParser());\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.cea.TsCeaParser');\n\ngoog.require('shaka.cea.CeaUtils');\ngoog.require('shaka.cea.SeiProcessor');\ngoog.require('shaka.media.ClosedCaptionParser');\ngoog.require('shaka.util.BufferUtils');\ngoog.require('shaka.util.TsParser');\n\n/**\n * MPEG TS CEA parser.\n * @implements {shaka.extern.ICeaParser}\n * @export\n */\nshaka.cea.TsCeaParser = class {\n /** */\n constructor() {\n /**\n * SEI data processor.\n * @private\n * @const {!shaka.cea.SeiProcessor}\n */\n this.seiProcessor_ = new shaka.cea.SeiProcessor();\n\n /** @private {?shaka.util.TsParser} */\n this.tsParser_ = null;\n }\n\n /**\n * @override\n */\n init(initSegment) {\n // TS hasn't init segment\n }\n\n /**\n * @override\n */\n parse(mediaSegment) {\n const CeaUtils = shaka.cea.CeaUtils;\n\n if (!this.tsParser_) {\n this.tsParser_ = new shaka.util.TsParser();\n } else {\n this.tsParser_.clearData();\n }\n\n /** @type {!Array<!shaka.extern.ICeaParser.CaptionPacket>} **/\n const captionPackets = [];\n\n const uint8ArrayData = shaka.util.BufferUtils.toUint8(mediaSegment);\n if (!shaka.util.TsParser.probe(uint8ArrayData)) {\n return captionPackets;\n }\n const tsParser = this.tsParser_.parse(uint8ArrayData);\n const codecs = tsParser.getCodecs();\n const videoNalus = tsParser.getVideoNalus();\n const validNaluTypes = [];\n switch (codecs.video) {\n case 'avc':\n validNaluTypes.push(CeaUtils.H264_NALU_TYPE_SEI);\n break;\n case 'hvc':\n validNaluTypes.push(CeaUtils.H265_PREFIX_NALU_TYPE_SEI);\n validNaluTypes.push(CeaUtils.H265_SUFFIX_NALU_TYPE_SEI);\n break;\n }\n if (!validNaluTypes.length) {\n return captionPackets;\n }\n for (const nalu of videoNalus) {\n if (validNaluTypes.includes(nalu.type) && nalu.time != null) {\n for (const packet of this.seiProcessor_.process(nalu.data)) {\n captionPackets.push({\n packet: packet,\n pts: nalu.time,\n });\n }\n }\n }\n return captionPackets;\n }\n};\n\nshaka.media.ClosedCaptionParser.registerParser('video/mp2t',\n () => new shaka.cea.TsCeaParser());\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.drm.PlayReady');\n\ngoog.require('shaka.log');\ngoog.require('shaka.util.BufferUtils');\ngoog.require('shaka.util.StringUtils');\ngoog.require('shaka.util.TXml');\ngoog.require('shaka.util.Uint8ArrayUtils');\n\n\n/**\n * @summary A set of functions for parsing Microsoft Playready Objects.\n */\nshaka.drm.PlayReady = class {\n /**\n * Parses an Array buffer starting at byteOffset for PlayReady Object Records.\n * Each PRO Record is preceded by its PlayReady Record type and length in\n * bytes.\n *\n * PlayReady Object Record format: https://goo.gl/FTcu46\n *\n * @param {!DataView} view\n * @param {number} byteOffset\n * @return {!Array<shaka.drm.PlayReady.PlayReadyRecord>}\n * @private\n */\n static parseMsProRecords_(view, byteOffset) {\n const records = [];\n\n while (byteOffset < view.byteLength - 1) {\n const type = view.getUint16(byteOffset, true);\n byteOffset += 2;\n\n const byteLength = view.getUint16(byteOffset, true);\n byteOffset += 2;\n\n if ((byteLength & 1) != 0 || byteLength + byteOffset > view.byteLength) {\n shaka.log.warning('Malformed MS PRO object');\n return [];\n }\n\n const recordValue = shaka.util.BufferUtils.toUint8(\n view, byteOffset, byteLength);\n records.push({\n type: type,\n value: recordValue,\n });\n\n byteOffset += byteLength;\n }\n\n return records;\n }\n\n /**\n * Parses a buffer for PlayReady Objects. The data\n * should contain a 32-bit integer indicating the length of\n * the PRO in bytes. Following that, a 16-bit integer for\n * the number of PlayReady Object Records in the PRO. Lastly,\n * a byte array of the PRO Records themselves.\n *\n * PlayReady Object format: https://goo.gl/W8yAN4\n *\n * @param {BufferSource} data\n * @return {!Array<shaka.drm.PlayReady.PlayReadyRecord>}\n * @private\n */\n static parseMsPro_(data) {\n let byteOffset = 0;\n const view = shaka.util.BufferUtils.toDataView(data);\n\n // First 4 bytes is the PRO length (DWORD)\n const byteLength = view.getUint32(byteOffset, /* littleEndian= */ true);\n byteOffset += 4;\n\n if (byteLength != data.byteLength) {\n // Malformed PRO\n shaka.log.warning('PlayReady Object with invalid length encountered.');\n return [];\n }\n\n // Skip PRO Record count (WORD)\n byteOffset += 2;\n\n // Rest of the data contains the PRO Records\n return shaka.drm.PlayReady.parseMsProRecords_(view, byteOffset);\n }\n\n /**\n * PlayReady Header format: https://goo.gl/dBzxNA\n *\n * @param {!shaka.extern.xml.Node} xml\n * @return {string}\n * @private\n */\n static getLaurl_(xml) {\n const TXml = shaka.util.TXml;\n // LA_URL element is optional and no more than one is\n // allowed inside the DATA element. Only absolute URLs are allowed.\n // If the LA_URL element exists, it must not be empty.\n for (const elem of TXml.getElementsByTagName(xml, 'DATA')) {\n if (elem.children) {\n for (const child of elem.children) {\n if (child.tagName == 'LA_URL') {\n return /** @type {string} */(\n shaka.util.TXml.getTextContents(child));\n }\n }\n }\n }\n\n // Not found\n return '';\n }\n\n /**\n * Gets a PlayReady Header Object\n *\n * @param {!shaka.extern.xml.Node} element\n * @return {?shaka.extern.xml.Node}\n * @private\n */\n static getPlayReadyHeaderObject_(element) {\n const PLAYREADY_RECORD_TYPES = shaka.drm.PlayReady.PLAYREADY_RECORD_TYPES;\n\n const bytes = shaka.util.Uint8ArrayUtils.fromBase64(\n /** @type {string} */ (shaka.util.TXml.getTextContents(element)));\n const records = shaka.drm.PlayReady.parseMsPro_(bytes);\n const record = records.filter((record) => {\n return record.type === PLAYREADY_RECORD_TYPES.RIGHTS_MANAGEMENT;\n })[0];\n\n if (!record) {\n return null;\n }\n\n const xml = shaka.util.StringUtils.fromUTF16(record.value, true);\n const rootElement = shaka.util.TXml.parseXmlString(xml, 'WRMHEADER');\n if (!rootElement) {\n return null;\n }\n return rootElement;\n }\n\n /**\n * Gets a PlayReady license URL from a PlayReady Header Object\n *\n * @param {!shaka.extern.xml.Node} element\n * @return {string}\n */\n static getLicenseUrl(element) {\n try {\n const headerObject =\n shaka.drm.PlayReady.getPlayReadyHeaderObject_(element);\n if (!headerObject) {\n return '';\n }\n\n return shaka.drm.PlayReady.getLaurl_(headerObject);\n } catch (e) {\n return '';\n }\n }\n\n /**\n * Gets a PlayReady KID from a protection element containing a\n * PlayReady Header Object\n *\n * @param {!shaka.extern.xml.Node} element\n * @return {?string}\n */\n static getPlayReadyKID(element) {\n const rootElement = shaka.drm.PlayReady.getPlayReadyHeaderObject_(element);\n if (!rootElement) {\n return null;\n }\n\n const TXml = shaka.util.TXml;\n // KID element is optional and no more than one is\n // allowed inside the DATA element.\n for (const elem of TXml.getElementsByTagName(rootElement, 'DATA')) {\n const kid = TXml.findChild(elem, 'KID');\n if (kid) {\n // GUID: [DWORD, WORD, WORD, 8-BYTE]\n const guidBytes =\n shaka.util.Uint8ArrayUtils.fromBase64(\n /** @type {string} */ (shaka.util.TXml.getTextContents(kid)));\n // Reverse byte order from little-endian to big-endian\n const kidBytes = new Uint8Array([\n guidBytes[3], guidBytes[2], guidBytes[1], guidBytes[0],\n guidBytes[5], guidBytes[4],\n guidBytes[7], guidBytes[6],\n ...guidBytes.slice(8),\n ]);\n return shaka.util.Uint8ArrayUtils.toHex(kidBytes);\n }\n }\n\n // Not found\n return null;\n }\n};\n\n/**\n * @typedef {{\n * type: number,\n * value: !Uint8Array\n * }}\n *\n * @description\n * The parsed result of a PlayReady object record.\n *\n * @property {number} type\n * Type of data stored in the record.\n * @property {!Uint8Array} value\n * Record content.\n */\nshaka.drm.PlayReady.PlayReadyRecord;\n\n/**\n * Enum for PlayReady record types.\n * @enum {number}\n */\nshaka.drm.PlayReady.PLAYREADY_RECORD_TYPES = {\n RIGHTS_MANAGEMENT: 0x001,\n RESERVED: 0x002,\n EMBEDDED_LICENSE: 0x003,\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.dash.ContentProtection');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.log');\ngoog.require('shaka.drm.DrmUtils');\ngoog.require('shaka.drm.PlayReady');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.ManifestParserUtils');\ngoog.require('shaka.util.Pssh');\ngoog.require('shaka.util.StringUtils');\ngoog.require('shaka.util.TXml');\ngoog.require('shaka.util.Uint8ArrayUtils');\n\n\n/**\n * @summary A set of functions for parsing and interpreting ContentProtection\n * elements.\n */\nshaka.dash.ContentProtection = class {\n /**\n * Parses info from the ContentProtection elements at the AdaptationSet level.\n *\n * @param {!Array<!shaka.extern.xml.Node>} elements\n * @param {boolean} ignoreDrmInfo\n * @param {!Object<string, string>} keySystemsByURI\n * @return {shaka.dash.ContentProtection.Context}\n */\n static parseFromAdaptationSet(elements, ignoreDrmInfo, keySystemsByURI) {\n const ContentProtection = shaka.dash.ContentProtection;\n const ManifestParserUtils = shaka.util.ManifestParserUtils;\n const parsed = ContentProtection.parseElements_(elements);\n /** @type {Array<shaka.extern.InitDataOverride>} */\n let defaultInit = null;\n /** @type {!Array<shaka.extern.DrmInfo>} */\n let drmInfos = [];\n let parsedNonCenc = [];\n /** @type {?shaka.dash.ContentProtection.Aes128Info} */\n let aes128Info = null;\n\n // Get the default key ID; if there are multiple, they must all match.\n const keyIds = new Set(parsed.map((element) => element.keyId));\n // Remove any possible null value (elements may have no key ids).\n keyIds.delete(null);\n\n let encryptionScheme = 'cenc';\n\n if (keyIds.size > 1) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.DASH_CONFLICTING_KEY_IDS);\n }\n\n if (!ignoreDrmInfo) {\n const aes128Elements = parsed.filter((elem) => {\n return elem.schemeUri == ContentProtection.Aes128Protection_;\n });\n\n if (aes128Elements.length > 1) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.DASH_CONFLICTING_AES_128);\n }\n\n if (aes128Elements.length) {\n aes128Info = ContentProtection.parseAes128_(aes128Elements[0]);\n }\n\n const mp4ProtectionParsed = parsed.find((elem) => {\n return elem.schemeUri == ContentProtection.MP4Protection_;\n });\n\n if (mp4ProtectionParsed && mp4ProtectionParsed.encryptionScheme) {\n encryptionScheme = mp4ProtectionParsed.encryptionScheme;\n }\n\n // Find the default key ID and init data. Create a new array of all the\n // non-CENC elements.\n parsedNonCenc = parsed.filter((elem) => {\n if (elem.schemeUri == ContentProtection.MP4Protection_) {\n goog.asserts.assert(!elem.init || elem.init.length,\n 'Init data must be null or non-empty.');\n defaultInit = elem.init || defaultInit;\n return false;\n } else {\n return elem.schemeUri != ContentProtection.Aes128Protection_;\n }\n });\n\n if (parsedNonCenc.length) {\n drmInfos = ContentProtection.convertElements_(defaultInit,\n encryptionScheme, parsedNonCenc, keySystemsByURI, keyIds);\n\n // If there are no drmInfos after parsing, then add a dummy entry.\n // This may be removed in parseKeyIds.\n if (drmInfos.length == 0) {\n drmInfos = [ManifestParserUtils.createDrmInfo(\n '', encryptionScheme, defaultInit)];\n }\n }\n }\n\n // If there are only CENC element(s) or ignoreDrmInfo flag is set, assume\n // all key-systems are supported.\n if (parsed.length && !aes128Info &&\n (ignoreDrmInfo || !parsedNonCenc.length)) {\n drmInfos = [];\n\n for (const keySystem of Object.values(keySystemsByURI)) {\n // If the manifest doesn't specify any key systems, we shouldn't\n // put clearkey in this list. Otherwise, it may be triggered when\n // a real key system should be used instead.\n if (keySystem != 'org.w3.clearkey') {\n const info = ManifestParserUtils.createDrmInfo(\n keySystem, encryptionScheme, defaultInit);\n drmInfos.push(info);\n }\n }\n }\n\n // If we have a default key id, apply it to every initData.\n const defaultKeyId = Array.from(keyIds)[0] || null;\n\n if (defaultKeyId) {\n for (const info of drmInfos) {\n for (const initData of info.initData) {\n initData.keyId = defaultKeyId;\n }\n }\n }\n\n return {\n defaultKeyId: defaultKeyId,\n defaultInit: defaultInit,\n drmInfos: drmInfos,\n aes128Info: aes128Info,\n firstRepresentation: true,\n };\n }\n\n /**\n * Parses the given ContentProtection elements found at the Representation\n * level. This may update the |context|.\n *\n * @param {!Array<!shaka.extern.xml.Node>} elements\n * @param {shaka.dash.ContentProtection.Context} context\n * @param {boolean} ignoreDrmInfo\n * @param {!Object<string, string>} keySystemsByURI\n * @return {?string} The parsed key ID\n */\n static parseFromRepresentation(\n elements, context, ignoreDrmInfo, keySystemsByURI) {\n const ContentProtection = shaka.dash.ContentProtection;\n const repContext = ContentProtection.parseFromAdaptationSet(\n elements, ignoreDrmInfo, keySystemsByURI);\n\n if (context.firstRepresentation) {\n const asUnknown = context.drmInfos.length == 1 &&\n !context.drmInfos[0].keySystem;\n const asUnencrypted = context.drmInfos.length == 0;\n const repUnencrypted = repContext.drmInfos.length == 0;\n\n // There are two cases where we need to replace the |drmInfos| in the\n // context with those in the Representation:\n // 1. The AdaptationSet does not list any ContentProtection.\n // 2. The AdaptationSet only lists unknown key-systems.\n if (asUnencrypted || (asUnknown && !repUnencrypted)) {\n context.drmInfos = repContext.drmInfos;\n }\n context.firstRepresentation = false;\n } else if (repContext.drmInfos.length > 0) {\n // If this is not the first Representation, then we need to remove entries\n // from the context that do not appear in this Representation.\n context.drmInfos = context.drmInfos.filter((asInfo) => {\n return repContext.drmInfos.some((repInfo) => {\n return repInfo.keySystem == asInfo.keySystem;\n });\n });\n // If we have filtered out all key-systems, throw an error.\n if (context.drmInfos.length == 0) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.DASH_NO_COMMON_KEY_SYSTEM);\n }\n }\n\n return repContext.defaultKeyId || context.defaultKeyId;\n }\n\n /**\n * Gets a FairPlay license URL from a content protection element\n * containing a 'dashif:Laurl' element\n *\n * @param {shaka.dash.ContentProtection.Element} element\n * @return {string}\n */\n static getFairPlayLicenseUrl(element) {\n if (shaka.drm.DrmUtils.isMediaKeysPolyfilled('apple')) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code\n .DASH_MSE_ENCRYPTED_LEGACY_APPLE_MEDIA_KEYS_NOT_SUPPORTED);\n }\n const dashIfLaurlNode = shaka.util.TXml.findChildNS(\n element.node, shaka.dash.ContentProtection.DashIfNamespaceUri_,\n 'Laurl',\n );\n if (dashIfLaurlNode) {\n const textContents = shaka.util.TXml.getTextContents(dashIfLaurlNode);\n if (textContents) {\n return textContents;\n }\n }\n return '';\n }\n\n /**\n * Gets a Widevine license URL from a content protection element\n * containing a custom `ms:laurl` or 'dashif:Laurl' elements\n *\n * @param {shaka.dash.ContentProtection.Element} element\n * @return {string}\n */\n static getWidevineLicenseUrl(element) {\n const StringUtils = shaka.util.StringUtils;\n const dashIfLaurlNode = shaka.util.TXml.findChildNS(\n element.node, shaka.dash.ContentProtection.DashIfNamespaceUri_,\n 'Laurl',\n );\n if (dashIfLaurlNode) {\n const textContents = shaka.util.TXml.getTextContents(dashIfLaurlNode);\n if (textContents) {\n return textContents;\n }\n }\n const msLaUrlNode = shaka.util.TXml.findChildNS(\n element.node, 'urn:microsoft', 'laurl');\n if (msLaUrlNode) {\n return StringUtils.htmlUnescape(\n msLaUrlNode.attributes['licenseUrl']) || '';\n }\n return '';\n }\n\n /**\n * Gets a ClearKey license URL from a content protection element\n * containing a custom `clearkey::Laurl` or 'dashif:Laurl' elements\n *\n * @param {shaka.dash.ContentProtection.Element} element\n * @return {string}\n */\n static getClearKeyLicenseUrl(element) {\n const dashIfLaurlNode = shaka.util.TXml.findChildNS(\n element.node, shaka.dash.ContentProtection.DashIfNamespaceUri_,\n 'Laurl',\n );\n if (dashIfLaurlNode) {\n const textContents = shaka.util.TXml.getTextContents(dashIfLaurlNode);\n if (textContents) {\n return textContents;\n }\n }\n const clearKeyLaurlNode = shaka.util.TXml.findChildNS(\n element.node, shaka.dash.ContentProtection.ClearKeyNamespaceUri_,\n 'Laurl',\n );\n if (clearKeyLaurlNode &&\n clearKeyLaurlNode.attributes['Lic_type'] === 'EME-1.0') {\n if (clearKeyLaurlNode) {\n const textContents = shaka.util.TXml.getTextContents(clearKeyLaurlNode);\n if (textContents) {\n return textContents;\n }\n }\n }\n return '';\n }\n\n /**\n * Gets a PlayReady license URL from a content protection element\n * containing a PlayReady Header Object\n *\n * @param {shaka.dash.ContentProtection.Element} element\n * @return {string}\n */\n static getPlayReadyLicenseUrl(element) {\n const TXml = shaka.util.TXml;\n const dashIfLaurlNode = TXml.findChildNS(\n element.node, shaka.dash.ContentProtection.DashIfNamespaceUri_,\n 'Laurl',\n );\n if (dashIfLaurlNode) {\n const textContents = TXml.getTextContents(dashIfLaurlNode);\n if (textContents) {\n return textContents;\n }\n }\n\n const proNode = TXml.findChildNS(\n element.node, 'urn:microsoft:playready', 'pro');\n if (proNode) {\n const textContents = TXml.getTextContents(proNode);\n if (textContents) {\n return shaka.drm.PlayReady.getLicenseUrl(proNode);\n }\n }\n\n const psshNode = TXml.findChildNS(\n element.node, shaka.dash.ContentProtection.CencNamespaceUri_, 'pssh');\n if (psshNode) {\n const textContents = TXml.getTextContents(psshNode);\n if (textContents) {\n const proData = shaka.util.Pssh.getPsshData(\n shaka.util.Uint8ArrayUtils.fromBase64(textContents));\n const proString = shaka.util.Uint8ArrayUtils.toStandardBase64(proData);\n const reBuildProNode =\n TXml.parseXmlString('<pro>' + proString + '</pro>');\n goog.asserts.assert(reBuildProNode, 'Must have pro node');\n return shaka.drm.PlayReady.getLicenseUrl(reBuildProNode);\n }\n }\n\n return '';\n }\n\n /**\n * Gets a PlayReady initData from a content protection element\n * containing a PlayReady Pro Object\n *\n * @param {shaka.dash.ContentProtection.Element} element\n * @return {?Array<shaka.extern.InitDataOverride>}\n * @private\n */\n static getInitDataFromPro_(element) {\n const proNode = shaka.util.TXml.findChildNS(\n element.node, 'urn:microsoft:playready', 'pro');\n if (!proNode || !shaka.util.TXml.getTextContents(proNode)) {\n return null;\n }\n\n const Uint8ArrayUtils = shaka.util.Uint8ArrayUtils;\n const textContent =\n /** @type {string} */ (shaka.util.TXml.getTextContents(proNode));\n const data = Uint8ArrayUtils.fromBase64(textContent);\n const systemId = new Uint8Array([\n 0x9a, 0x04, 0xf0, 0x79, 0x98, 0x40, 0x42, 0x86,\n 0xab, 0x92, 0xe6, 0x5b, 0xe0, 0x88, 0x5f, 0x95,\n ]);\n const keyIds = new Set();\n const psshVersion = 0;\n const pssh =\n shaka.util.Pssh.createPssh(data, systemId, keyIds, psshVersion);\n return [\n {\n initData: pssh,\n initDataType: 'cenc',\n keyId: element.keyId,\n },\n ];\n }\n\n /**\n * Creates ClearKey initData from Default_KID value retrieved from previously\n * parsed ContentProtection tag.\n * @param {shaka.dash.ContentProtection.Element} element\n * @param {!Set<string>} keyIds\n * @return {?Array<shaka.extern.InitDataOverride>}\n * @private\n */\n static getInitDataClearKey_(element, keyIds) {\n if (keyIds.size == 0) {\n return null;\n }\n\n const systemId = new Uint8Array([\n 0x10, 0x77, 0xef, 0xec, 0xc0, 0xb2, 0x4d, 0x02,\n 0xac, 0xe3, 0x3c, 0x1e, 0x52, 0xe2, 0xfb, 0x4b,\n ]);\n const data = new Uint8Array([]);\n const psshVersion = 1;\n const pssh =\n shaka.util.Pssh.createPssh(data, systemId, keyIds, psshVersion);\n\n return [\n {\n initData: pssh,\n initDataType: 'cenc',\n keyId: element.keyId,\n },\n ];\n }\n\n /**\n * Creates DrmInfo objects from the given element.\n *\n * @param {Array<shaka.extern.InitDataOverride>} defaultInit\n * @param {string} encryptionScheme\n * @param {!Array<shaka.dash.ContentProtection.Element>} elements\n * @param {!Object<string, string>} keySystemsByURI\n * @param {!Set<string>} keyIds\n * @return {!Array<shaka.extern.DrmInfo>}\n * @private\n */\n static convertElements_(defaultInit, encryptionScheme, elements,\n keySystemsByURI, keyIds) {\n const ContentProtection = shaka.dash.ContentProtection;\n const ManifestParserUtils = shaka.util.ManifestParserUtils;\n const licenseUrlParsers = ContentProtection.licenseUrlParsers_;\n\n /** @type {!Array<shaka.extern.DrmInfo>} */\n const out = [];\n\n for (const element of elements) {\n const keySystem = keySystemsByURI[element.schemeUri];\n if (keySystem) {\n goog.asserts.assert(\n !element.init || element.init.length,\n 'Init data must be null or non-empty.');\n\n const proInitData = ContentProtection.getInitDataFromPro_(element);\n let clearKeyInitData = null;\n if (element.schemeUri ===\n shaka.dash.ContentProtection.ClearKeySchemeUri_) {\n clearKeyInitData =\n ContentProtection.getInitDataClearKey_(element, keyIds);\n }\n const initData = element.init || defaultInit || proInitData ||\n clearKeyInitData;\n const info = ManifestParserUtils.createDrmInfo(\n keySystem, encryptionScheme, initData);\n const licenseParser = licenseUrlParsers.get(keySystem);\n if (licenseParser) {\n info.licenseServerUri = licenseParser(element);\n }\n\n out.push(info);\n }\n }\n\n return out;\n }\n\n /**\n * Parses the given ContentProtection elements. If there is an error, it\n * removes those elements.\n *\n * @param {!Array<!shaka.extern.xml.Node>} elements\n * @return {!Array<shaka.dash.ContentProtection.Element>}\n * @private\n */\n static parseElements_(elements) {\n /** @type {!Array<shaka.dash.ContentProtection.Element>} */\n const out = [];\n\n for (const element of elements) {\n const parsed = shaka.dash.ContentProtection.parseElement_(element);\n if (parsed) {\n out.push(parsed);\n }\n }\n\n return out;\n }\n\n /**\n * Parses the given ContentProtection element.\n *\n * @param {!shaka.extern.xml.Node} elem\n * @return {?shaka.dash.ContentProtection.Element}\n * @private\n */\n static parseElement_(elem) {\n const NS = shaka.dash.ContentProtection.CencNamespaceUri_;\n const TXml = shaka.util.TXml;\n\n /** @type {?string} */\n let schemeUri = elem.attributes['schemeIdUri'];\n /** @type {?string} */\n let keyId = TXml.getAttributeNS(elem, NS, 'default_KID');\n /** @type {!Array<string>} */\n const psshs = TXml.findChildrenNS(elem, NS, 'pssh')\n .map(TXml.getContents);\n\n const encryptionScheme = elem.attributes['value'];\n\n if (!schemeUri) {\n shaka.log.error('Missing required schemeIdUri attribute on',\n 'ContentProtection element', elem);\n return null;\n }\n\n schemeUri = schemeUri.toLowerCase();\n if (keyId) {\n keyId = keyId.replace(/-/g, '').toLowerCase();\n if (keyId.includes(' ')) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.DASH_MULTIPLE_KEY_IDS_NOT_SUPPORTED);\n }\n }\n\n /** @type {!Array<shaka.extern.InitDataOverride>} */\n let init = [];\n try {\n // Try parsing PSSH data.\n init = psshs.map((pssh) => {\n return {\n initDataType: 'cenc',\n initData: shaka.util.Uint8ArrayUtils.fromBase64(pssh),\n keyId: null,\n };\n });\n } catch (e) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.DASH_PSSH_BAD_ENCODING);\n }\n\n return {\n node: elem,\n schemeUri,\n keyId,\n init: (init.length > 0 ? init : null),\n encryptionScheme,\n };\n }\n\n /**\n * Parses the given AES-128 ContentProtection element.\n *\n * @param {shaka.dash.ContentProtection.Element} element\n * @return {?shaka.dash.ContentProtection.Aes128Info}\n * @private\n */\n static parseAes128_(element) {\n // Check if the Web Crypto API is available.\n if (!window.crypto || !window.crypto.subtle) {\n shaka.log.alwaysWarn('Web Crypto API is not available to decrypt ' +\n 'AES-128. (Web Crypto only exists in secure origins like https)');\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.NO_WEB_CRYPTO_API);\n }\n\n const namespace = 'urn:mpeg:dash:schema:sea:2012';\n const segmentEncryption = shaka.util.TXml.findChildNS(\n element.node, namespace, 'SegmentEncryption');\n\n if (!segmentEncryption) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.DASH_UNSUPPORTED_AES_128);\n }\n\n const aesSchemeIdUri = 'urn:mpeg:dash:sea:aes128-cbc:2013';\n const segmentEncryptionSchemeIdUri =\n segmentEncryption.attributes['schemeIdUri'];\n if (segmentEncryptionSchemeIdUri != aesSchemeIdUri) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.DASH_UNSUPPORTED_AES_128);\n }\n\n const cryptoPeriod = shaka.util.TXml.findChildNS(\n element.node, namespace, 'CryptoPeriod');\n\n if (!cryptoPeriod) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.DASH_UNSUPPORTED_AES_128);\n }\n\n const ivHex = cryptoPeriod.attributes['IV'];\n const keyUri = shaka.util.StringUtils.htmlUnescape(\n cryptoPeriod.attributes['keyUriTemplate']);\n if (!ivHex || !keyUri) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.DASH_UNSUPPORTED_AES_128);\n }\n\n // Exclude 0x at the start of string.\n const iv = shaka.util.Uint8ArrayUtils.fromHex(ivHex.substr(2));\n if (iv.byteLength != 16) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.AES_128_INVALID_IV_LENGTH);\n }\n\n return {\n keyUri,\n iv,\n };\n }\n};\n\n/**\n * @typedef {{\n * defaultKeyId: ?string,\n * defaultInit: Array<shaka.extern.InitDataOverride>,\n * drmInfos: !Array<shaka.extern.DrmInfo>,\n * aes128Info: ?shaka.dash.ContentProtection.Aes128Info,\n * firstRepresentation: boolean\n * }}\n *\n * @description\n * Contains information about the ContentProtection elements found at the\n * AdaptationSet level.\n *\n * @property {?string} defaultKeyId\n * The default key ID to use. This is used by parseKeyIds as a default. This\n * can be null to indicate that there is no default.\n * @property {Array<shaka.extern.InitDataOverride>} defaultInit\n * The default init data override. This can be null to indicate that there\n * is no default.\n * @property {!Array<shaka.extern.DrmInfo>} drmInfos\n * The DrmInfo objects.\n * @property {?shaka.dash.ContentProtection.Aes128Info} aes128Info\n * The AES-128 key info.\n * @property {boolean} firstRepresentation\n * True when first parsed; changed to false after the first call to\n * parseKeyIds. This is used to determine if a dummy key-system should be\n * overwritten; namely that the first representation can replace the dummy\n * from the AdaptationSet.\n */\nshaka.dash.ContentProtection.Context;\n\n/**\n * @typedef {{\n * keyUri: string,\n * iv: !Uint8Array\n * }}\n *\n * @description\n * Contains information about the AES-128 keyUri and IV found at the\n * AdaptationSet level.\n *\n * @property {string} method\n * The keyUri in the manifest.\n * @property {!Uint8Array} iv\n * The IV in the manifest.\n */\nshaka.dash.ContentProtection.Aes128Info;\n\n/**\n * @typedef {{\n * node: !shaka.extern.xml.Node,\n * schemeUri: string,\n * keyId: ?string,\n * init: Array<shaka.extern.InitDataOverride>,\n * encryptionScheme: ?string\n * }}\n *\n * @description\n * The parsed result of a single ContentProtection element.\n *\n * @property {!shaka.extern.xml.Node} node\n * The ContentProtection XML element.\n * @property {string} schemeUri\n * The scheme URI.\n * @property {?string} keyId\n * The default key ID, if present.\n * @property {Array<shaka.extern.InitDataOverride>} init\n * The init data, if present. If there is no init data, it will be null. If\n * this is non-null, there is at least one element.\n * @property {?string} encryptionScheme\n * The encryption scheme, if present.\n */\nshaka.dash.ContentProtection.Element;\n\n/**\n * A map of key system name to license server url parser.\n *\n * @const {!Map<string, function(shaka.dash.ContentProtection.Element)>}\n * @private\n */\nshaka.dash.ContentProtection.licenseUrlParsers_ = new Map()\n .set('com.apple.fps',\n shaka.dash.ContentProtection.getFairPlayLicenseUrl)\n .set('com.widevine.alpha',\n shaka.dash.ContentProtection.getWidevineLicenseUrl)\n .set('com.microsoft.playready',\n shaka.dash.ContentProtection.getPlayReadyLicenseUrl)\n .set('com.microsoft.playready.recommendation',\n shaka.dash.ContentProtection.getPlayReadyLicenseUrl)\n .set('com.microsoft.playready.software',\n shaka.dash.ContentProtection.getPlayReadyLicenseUrl)\n .set('com.microsoft.playready.hardware',\n shaka.dash.ContentProtection.getPlayReadyLicenseUrl)\n .set('org.w3.clearkey',\n shaka.dash.ContentProtection.getClearKeyLicenseUrl);\n\n/**\n * @const {string}\n * @private\n */\nshaka.dash.ContentProtection.MP4Protection_ =\n 'urn:mpeg:dash:mp4protection:2011';\n\n/**\n * @const {string}\n * @private\n */\nshaka.dash.ContentProtection.Aes128Protection_ =\n 'urn:mpeg:dash:sea:2012';\n\n\n/**\n * @const {string}\n * @private\n */\nshaka.dash.ContentProtection.CencNamespaceUri_ = 'urn:mpeg:cenc:2013';\n\n/**\n * @const {string}\n * @private\n */\nshaka.dash.ContentProtection.ClearKeyNamespaceUri_ =\n 'http://dashif.org/guidelines/clearKey';\n\n\n/**\n * @const {string}\n * @private\n */\nshaka.dash.ContentProtection.ClearKeySchemeUri_ =\n 'urn:uuid:e2719d58-a985-b3c9-781a-b030af78d30e';\n\n\n/**\n * @const {string}\n * @private\n */\nshaka.dash.ContentProtection.DashIfNamespaceUri_ =\n 'https://dashif.org/CPS';\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.dash.MpdUtils');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.log');\ngoog.require('shaka.net.NetworkingEngine');\ngoog.require('shaka.util.AbortableOperation');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.Functional');\ngoog.require('shaka.util.ManifestParserUtils');\ngoog.require('shaka.util.TXml');\ngoog.requireType('shaka.dash.DashParser');\ngoog.requireType('shaka.media.PresentationTimeline');\n\n\n/**\n * @summary MPD processing utility functions.\n */\nshaka.dash.MpdUtils = class {\n /**\n * Fills a SegmentTemplate URI template. This function does not validate the\n * resulting URI.\n *\n * @param {string} uriTemplate\n * @param {?string} representationId\n * @param {?number} number\n * @param {?number} subNumber\n * @param {?number} bandwidth\n * @param {?(number|bigint)} time\n * @return {string} A URI string.\n * @see ISO/IEC 23009-1:2014 section 5.3.9.4.4\n */\n static fillUriTemplate(\n uriTemplate, representationId, number, subNumber, bandwidth, time) {\n /** @type {!Map<string, ?number | ?string>} */\n const valueTable = new Map()\n .set('RepresentationID', representationId)\n .set('Number', number)\n .set('SubNumber', subNumber)\n .set('Bandwidth', bandwidth)\n .set('Time', time);\n\n // cspell: disable-next-line\n const re = /\\$(RepresentationID|Number|SubNumber|Bandwidth|Time)?(?:%0([0-9]+)([diouxX]))?\\$/g; // eslint-disable-line @stylistic/max-len\n const uri = uriTemplate.replace(re, (match, name, widthStr, format) => {\n if (match == '$$') {\n return '$';\n }\n\n let value = valueTable.get(name);\n goog.asserts.assert(value !== undefined, 'Unrecognized identifier');\n\n // Note that |value| may be 0 or ''.\n if (value == null) {\n shaka.log.warning(\n 'URL template does not have an available substitution for ',\n 'identifier \"' + name + '\":',\n uriTemplate);\n return match;\n }\n\n if (name == 'RepresentationID' && widthStr) {\n shaka.log.warning(\n 'URL template should not contain a width specifier for identifier',\n '\"RepresentationID\":',\n uriTemplate);\n widthStr = undefined;\n }\n\n if (name == 'Time') {\n if (typeof value != 'bigint') {\n goog.asserts.assert(typeof value == 'number',\n 'Time value should be a number or bigint!');\n if (Math.abs(value - Math.round(value)) >= 0.2) {\n shaka.log.alwaysWarn(\n 'Calculated $Time$ values must be close to integers');\n }\n value = Math.round(value);\n }\n }\n\n /** @type {string} */\n let valueString;\n switch (format) {\n case undefined: // Happens if there is no format specifier.\n case 'd':\n case 'i':\n case 'u':\n valueString = value.toString();\n break;\n case 'o':\n valueString = value.toString(8);\n break;\n case 'x':\n valueString = value.toString(16);\n break;\n case 'X':\n valueString = value.toString(16).toUpperCase();\n break;\n default:\n goog.asserts.assert(false, 'Unhandled format specifier');\n valueString = value.toString();\n break;\n }\n\n // Create a padding string.\n const width = window.parseInt(widthStr, 10) || 1;\n const paddingSize = Math.max(0, width - valueString.length);\n const padding = (new Array(paddingSize + 1)).join('0');\n\n return padding + valueString;\n });\n\n return uri;\n }\n\n /**\n * Expands a SegmentTimeline into an array-based timeline. The results are in\n * seconds.\n *\n * @param {Array<!shaka.extern.xml.Node>} timePoints\n * @param {number} timescale\n * @param {number} unscaledPresentationTimeOffset\n * @param {number} periodDuration The Period's duration in seconds.\n * Infinity indicates that the Period continues indefinitely.\n * @param {number} startNumber\n * @return {!Array<shaka.media.PresentationTimeline.TimeRange>}\n */\n static createTimeline(\n timePoints, timescale, unscaledPresentationTimeOffset,\n periodDuration, startNumber) {\n goog.asserts.assert(\n timescale > 0 && timescale < Infinity,\n 'timescale must be a positive, finite integer');\n goog.asserts.assert(\n periodDuration > 0, 'period duration must be a positive integer');\n\n // Alias.\n const TXml = shaka.util.TXml;\n\n /** @type {!Array<shaka.media.PresentationTimeline.TimeRange>} */\n const timeline = [];\n let lastEndTime = -unscaledPresentationTimeOffset;\n\n for (let i = 0; i < timePoints.length; ++i) {\n const timePoint = timePoints[i];\n const next = timePoints[i + 1];\n let t = TXml.parseAttr(timePoint, 't', TXml.parseNonNegativeInt);\n const d =\n TXml.parseAttr(timePoint, 'd', TXml.parseNonNegativeInt);\n const r = TXml.parseAttr(timePoint, 'r', TXml.parseInt);\n\n const k = TXml.parseAttr(timePoint, 'k', TXml.parseInt);\n\n const partialSegments = k || 0;\n\n // Adjust the start time to account for the presentation time offset.\n if (t != null) {\n t -= unscaledPresentationTimeOffset;\n }\n\n if (!d) {\n shaka.log.warning(\n '\"S\" element must have a duration: ignoring this element.',\n timePoint);\n continue;\n }\n\n let startTime = t != null ? t : lastEndTime;\n\n let repeat = r || 0;\n if (repeat < 0) {\n if (next) {\n const nextStartTime =\n TXml.parseAttr(next, 't', TXml.parseNonNegativeInt);\n if (nextStartTime == null) {\n shaka.log.warning(\n 'An \"S\" element cannot have a negative repeat',\n 'if the next \"S\" element does not have a valid start time:',\n 'ignoring the remaining \"S\" elements.', timePoint);\n return timeline;\n } else if (startTime >= nextStartTime) {\n shaka.log.warning(\n 'An \"S\" element cannot have a negative repeat if its start ',\n 'time exceeds the next \"S\" element\\'s start time:',\n 'ignoring the remaining \"S\" elements.', timePoint);\n return timeline;\n }\n repeat = Math.ceil((nextStartTime - startTime) / d) - 1;\n } else {\n if (periodDuration == Infinity) {\n // The DASH spec. actually allows the last \"S\" element to have a\n // negative repeat value even when the Period has an infinite\n // duration. No one uses this feature and no one ever should,\n // ever.\n shaka.log.warning(\n 'The last \"S\" element cannot have a negative repeat',\n 'if the Period has an infinite duration:',\n 'ignoring the last \"S\" element.', timePoint);\n return timeline;\n } else if (startTime / timescale >= periodDuration) {\n shaka.log.warning(\n 'The last \"S\" element cannot have a negative repeat',\n 'if its start time exceeds the Period\\'s duration:',\n 'ignoring the last \"S\" element.', timePoint);\n return timeline;\n }\n repeat = Math.ceil((periodDuration * timescale - startTime) / d) - 1;\n }\n }\n\n // The end of the last segment may be before the start of the current\n // segment (a gap) or after the start of the current segment (an\n // overlap). If there is a gap/overlap then stretch/compress the end of\n // the last segment to the start of the current segment.\n //\n // Note: it is possible to move the start of the current segment to the\n // end of the last segment, but this would complicate the computation of\n // the $Time$ placeholder later on.\n if ((timeline.length > 0) && (startTime != lastEndTime)) {\n const delta = startTime - lastEndTime;\n\n if (Math.abs(delta / timescale) >=\n shaka.util.ManifestParserUtils.GAP_OVERLAP_TOLERANCE_SECONDS) {\n shaka.log.warning(\n 'SegmentTimeline contains a large gap/overlap:',\n 'the content may have errors in it.', timePoint);\n }\n\n timeline[timeline.length - 1].end = startTime / timescale;\n }\n\n for (let j = 0; j <= repeat; ++j) {\n const endTime = startTime + d;\n const item = {\n start: startTime / timescale,\n end: endTime / timescale,\n unscaledStart: startTime,\n partialSegments: partialSegments,\n segmentPosition: timeline.length + startNumber,\n };\n timeline.push(item);\n\n startTime = endTime;\n lastEndTime = endTime;\n }\n }\n\n return timeline;\n }\n\n /**\n * Parses common segment info for SegmentList and SegmentTemplate.\n *\n * @param {shaka.dash.DashParser.Context} context\n * @param {function(?shaka.dash.DashParser.InheritanceFrame):\n * ?shaka.extern.xml.Node} callback\n * Gets the element that contains the segment info.\n * @return {shaka.dash.MpdUtils.SegmentInfo}\n */\n static parseSegmentInfo(context, callback) {\n goog.asserts.assert(\n callback(context.representation),\n 'There must be at least one element of the given type.');\n const MpdUtils = shaka.dash.MpdUtils;\n const TXml = shaka.util.TXml;\n\n const timescaleStr =\n MpdUtils.inheritAttribute(context, callback, 'timescale');\n let timescale = 1;\n if (timescaleStr) {\n timescale = TXml.parsePositiveInt(timescaleStr) || 1;\n }\n\n const durationStr =\n MpdUtils.inheritAttribute(context, callback, 'duration');\n const unscaledSegmentDuration = TXml.parsePositiveInt(durationStr || '');\n const segmentDuration = unscaledSegmentDuration ?\n unscaledSegmentDuration / timescale : null;\n\n const startNumberStr =\n MpdUtils.inheritAttribute(context, callback, 'startNumber');\n const unscaledPresentationTimeOffset =\n Number(MpdUtils.inheritAttribute(context, callback,\n 'presentationTimeOffset')) || 0;\n let startNumber = TXml.parseNonNegativeInt(startNumberStr || '');\n if (startNumberStr == null || startNumber == null) {\n startNumber = 1;\n }\n\n /** @type {Array<shaka.media.PresentationTimeline.TimeRange>} */\n let timeline = null;\n const timelineNode =\n MpdUtils.inheritChild(context, callback, 'SegmentTimeline');\n if (timelineNode) {\n const timePoints = TXml.findChildren(timelineNode, 'S');\n timeline = MpdUtils.createTimeline(\n timePoints, timescale, unscaledPresentationTimeOffset,\n context.periodInfo.duration || Infinity, startNumber);\n }\n\n const scaledPresentationTimeOffset =\n (unscaledPresentationTimeOffset / timescale) || 0;\n return {\n timescale: timescale,\n unscaledSegmentDuration: unscaledSegmentDuration,\n segmentDuration: segmentDuration,\n startNumber: startNumber,\n scaledPresentationTimeOffset: scaledPresentationTimeOffset,\n unscaledPresentationTimeOffset: unscaledPresentationTimeOffset,\n timeline: timeline,\n };\n }\n\n /**\n * Parses common attributes for Representation, AdaptationSet, and Period.\n * @param {shaka.dash.DashParser.Context} context\n * @param {function(?shaka.dash.DashParser.InheritanceFrame):\n * ?shaka.extern.xml.Node} callback\n * @return {!Array<!shaka.extern.xml.Node>}\n */\n static getNodes(context, callback) {\n const Functional = shaka.util.Functional;\n goog.asserts.assert(\n callback(context.representation),\n 'There must be at least one element of the given type.',\n );\n\n return [\n callback(context.representation),\n callback(context.adaptationSet),\n callback(context.period),\n ].filter(Functional.isNotNull);\n }\n\n /**\n * Searches the inheritance for a Segment* with the given attribute.\n *\n * @param {shaka.dash.DashParser.Context} context\n * @param {function(?shaka.dash.DashParser.InheritanceFrame):\n * ?shaka.extern.xml.Node} callback\n * Gets the Element that contains the attribute to inherit.\n * @param {string} attribute\n * @return {?string}\n */\n static inheritAttribute(context, callback, attribute) {\n const MpdUtils = shaka.dash.MpdUtils;\n const nodes = MpdUtils.getNodes(context, callback);\n\n let result = null;\n for (const node of nodes) {\n result = node.attributes[attribute];\n if (result) {\n break;\n }\n }\n return result;\n }\n\n /**\n * Searches the inheritance for a Segment* with the given child.\n *\n * @param {shaka.dash.DashParser.Context} context\n * @param {function(?shaka.dash.DashParser.InheritanceFrame):\n * ?shaka.extern.xml.Node} callback\n * Gets the Element that contains the child to inherit.\n * @param {string} child\n * @return {?shaka.extern.xml.Node}\n */\n static inheritChild(context, callback, child) {\n const MpdUtils = shaka.dash.MpdUtils;\n const nodes = MpdUtils.getNodes(context, callback);\n\n const TXml = shaka.util.TXml;\n let result = null;\n for (const node of nodes) {\n result = TXml.findChild(node, child);\n if (result) {\n break;\n }\n }\n return result;\n }\n\n /**\n * Follow the xlink link contained in the given element.\n * It also strips the xlink properties off of the element,\n * even if the process fails.\n *\n * @param {!shaka.extern.xml.Node} element\n * @param {!shaka.extern.RetryParameters} retryParameters\n * @param {boolean} failGracefully\n * @param {string} baseUri\n * @param {!shaka.net.NetworkingEngine} networkingEngine\n * @param {number} linkDepth\n * @return {!shaka.util.AbortableOperation.<!shaka.extern.xml.Node>}\n * @private\n */\n static handleXlinkInElement_(\n element, retryParameters, failGracefully, baseUri, networkingEngine,\n linkDepth) {\n const MpdUtils = shaka.dash.MpdUtils;\n const TXml = shaka.util.TXml;\n const Error = shaka.util.Error;\n const ManifestParserUtils = shaka.util.ManifestParserUtils;\n const NS = MpdUtils.XlinkNamespaceUri_;\n\n const xlinkHref = TXml.getAttributeNS(element, NS, 'href');\n const xlinkActuate =\n TXml.getAttributeNS(element, NS, 'actuate') || 'onRequest';\n\n // Remove the xlink properties, so it won't download again\n // when re-processed.\n for (const key of Object.keys(element.attributes)) {\n const segments = key.split(':');\n const namespace = shaka.util.TXml.getKnownNameSpace(NS);\n if (segments[0] == namespace) {\n delete element.attributes[key];\n }\n }\n\n if (linkDepth >= 5) {\n return shaka.util.AbortableOperation.failed(new Error(\n Error.Severity.CRITICAL, Error.Category.MANIFEST,\n Error.Code.DASH_XLINK_DEPTH_LIMIT));\n }\n\n if (xlinkActuate != 'onLoad') {\n // Only xlink:actuate=\"onLoad\" is supported.\n // When no value is specified, the assumed value is \"onRequest\".\n return shaka.util.AbortableOperation.failed(new Error(\n Error.Severity.CRITICAL, Error.Category.MANIFEST,\n Error.Code.DASH_UNSUPPORTED_XLINK_ACTUATE));\n }\n\n // Resolve the xlink href, in case it's a relative URL.\n const uris = ManifestParserUtils.resolveUris([baseUri], [xlinkHref]);\n\n // Load in the linked elements.\n const requestType = shaka.net.NetworkingEngine.RequestType.MANIFEST;\n const request =\n shaka.net.NetworkingEngine.makeRequest(uris, retryParameters);\n\n const requestOperation = networkingEngine.request(requestType, request);\n // The interface is abstract, but we know it was implemented with the\n // more capable internal class.\n goog.asserts.assert(\n requestOperation instanceof shaka.util.AbortableOperation,\n 'Unexpected implementation of IAbortableOperation!');\n // Satisfy the compiler with a cast.\n const networkOperation =\n /** @type {!shaka.util.AbortableOperation.<shaka.extern.Response>} */ (\n requestOperation);\n\n // Chain onto that operation.\n return networkOperation.chain(\n (response) => {\n // This only supports the case where the loaded xml has a single\n // top-level element. If there are multiple roots, it will be\n // rejected.\n const rootElem =\n TXml.parseXml(response.data, element.tagName);\n if (!rootElem) {\n // It was not valid XML.\n return shaka.util.AbortableOperation.failed(new Error(\n Error.Severity.CRITICAL, Error.Category.MANIFEST,\n Error.Code.DASH_INVALID_XML, xlinkHref));\n }\n\n // Now that there is no other possibility of the process erroring,\n // the element can be changed further.\n\n // Remove the current contents of the node.\n element.children = [];\n\n // Move the children of the loaded xml into the current element.\n while (rootElem.children.length) {\n const child = rootElem.children.shift();\n element.children.push(child);\n }\n\n // Move the attributes of the loaded xml into the current element.\n for (const key of Object.keys(rootElem.attributes)) {\n element.attributes[key] = rootElem.attributes[key];\n }\n\n return shaka.dash.MpdUtils.processXlinks(\n element, retryParameters, failGracefully, uris[0],\n networkingEngine, linkDepth + 1);\n });\n }\n\n /**\n * Filter the contents of a node recursively, replacing xlink links\n * with their associated online data.\n *\n * @param {!shaka.extern.xml.Node} element\n * @param {!shaka.extern.RetryParameters} retryParameters\n * @param {boolean} failGracefully\n * @param {string} baseUri\n * @param {!shaka.net.NetworkingEngine} networkingEngine\n * @param {number=} linkDepth default set to 0\n * @return {!shaka.util.AbortableOperation.<!shaka.extern.xml.Node>}\n */\n static processXlinks(\n element, retryParameters,\n failGracefully, baseUri, networkingEngine,\n linkDepth = 0) {\n const MpdUtils = shaka.dash.MpdUtils;\n const TXml = shaka.util.TXml;\n const NS = MpdUtils.XlinkNamespaceUri_;\n\n if (TXml.getAttributeNS(element, NS, 'href')) {\n let handled = MpdUtils.handleXlinkInElement_(\n element, retryParameters, failGracefully,\n baseUri, networkingEngine, linkDepth);\n if (failGracefully) {\n // Catch any error and go on.\n handled = handled.chain(undefined, (error) => {\n // handleXlinkInElement_ strips the xlink properties off of the\n // element even if it fails, so calling processXlinks again will\n // handle whatever contents the element natively has.\n return MpdUtils.processXlinks(\n element, retryParameters, failGracefully, baseUri,\n networkingEngine, linkDepth);\n });\n }\n return handled;\n }\n\n const childOperations = [];\n for (const child of shaka.util.TXml.getChildNodes(element)) {\n const resolveToZeroString = 'urn:mpeg:dash:resolve-to-zero:2013';\n if (TXml.getAttributeNS(child, NS, 'href') == resolveToZeroString) {\n // This is a 'resolve to zero' code; it means the element should\n // be removed, as specified by the mpeg-dash rules for xlink.\n element.children = element.children.filter(\n (elem) => elem !== child);\n } else if (child.tagName != 'SegmentTimeline') {\n // Don't recurse into a SegmentTimeline since xlink attributes\n // aren't valid in there and looking at each segment can take a long\n // time with larger manifests.\n\n // Replace the child with its processed form.\n childOperations.push(shaka.dash.MpdUtils.processXlinks(\n /** @type {!shaka.extern.xml.Node} */ (child),\n retryParameters, failGracefully,\n baseUri, networkingEngine, linkDepth));\n }\n }\n\n return shaka.util.AbortableOperation.all(childOperations).chain(() => {\n return element;\n });\n }\n};\n\n\n/**\n * @typedef {{\n * timescale: number,\n * unscaledSegmentDuration: ?number,\n * segmentDuration: ?number,\n * startNumber: number,\n * scaledPresentationTimeOffset: number,\n * unscaledPresentationTimeOffset: number,\n * timeline: Array<shaka.media.PresentationTimeline.TimeRange>\n * }}\n *\n * @description\n * Contains common information between SegmentList and SegmentTemplate items.\n *\n * @property {number} timescale\n * The time-scale of the representation.\n * @property {?number} unscaledSegmentDuration\n * The duration of the segments in timescale units, if given.\n * @property {?number} segmentDuration\n * The duration of the segments in seconds, if given.\n * @property {number} startNumber\n * The start number of the segments; 1 or greater.\n * @property {number} scaledPresentationTimeOffset\n * The presentation time offset of the representation, in seconds.\n * @property {number} unscaledPresentationTimeOffset\n * The presentation time offset of the representation, in timescale units.\n * @property {Array<shaka.media.PresentationTimeline.TimeRange>} timeline\n * The timeline of the representation, if given. Times in seconds.\n */\nshaka.dash.MpdUtils.SegmentInfo;\n\n\n/**\n * @const {string}\n * @private\n */\nshaka.dash.MpdUtils.XlinkNamespaceUri_ = 'http://www.w3.org/1999/xlink';\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.dash.Mp4SegmentIndexParser');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.log');\ngoog.require('shaka.media.InitSegmentReference');\ngoog.require('shaka.media.SegmentReference');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.Mp4Parser');\n\n\nshaka.dash.Mp4SegmentIndexParser = class {\n /**\n * Parses SegmentReferences from an ISO BMFF SIDX structure.\n * @param {BufferSource} sidxData The MP4's container's SIDX.\n * @param {number} sidxOffset The SIDX's offset, in bytes, from the start of\n * the MP4 container.\n * @param {!Array<string>} uris The possible locations of the MP4 file that\n * contains the segments.\n * @param {shaka.media.InitSegmentReference} initSegmentReference\n * @param {number} timestampOffset\n * @param {number} appendWindowStart\n * @param {number} appendWindowEnd\n * @return {!Array<!shaka.media.SegmentReference>}\n */\n static parse(\n sidxData, sidxOffset, uris, initSegmentReference, timestampOffset,\n appendWindowStart, appendWindowEnd) {\n const Mp4SegmentIndexParser = shaka.dash.Mp4SegmentIndexParser;\n\n let references;\n\n const parser = new shaka.util.Mp4Parser()\n .fullBox('sidx', (box) => {\n references = Mp4SegmentIndexParser.parseSIDX_(\n sidxOffset,\n initSegmentReference,\n timestampOffset,\n appendWindowStart,\n appendWindowEnd,\n uris,\n box);\n });\n\n if (sidxData) {\n parser.parse(sidxData);\n }\n\n if (references) {\n return references;\n } else {\n shaka.log.error('Invalid box type, expected \"sidx\".');\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.MP4_SIDX_WRONG_BOX_TYPE);\n }\n }\n\n\n /**\n * Parse a SIDX box from the given reader.\n *\n * @param {number} sidxOffset\n * @param {shaka.media.InitSegmentReference} initSegmentReference\n * @param {number} timestampOffset\n * @param {number} appendWindowStart\n * @param {number} appendWindowEnd\n * @param {!Array<string>} uris The possible locations of the MP4 file that\n * contains the segments.\n * @param {!shaka.extern.ParsedBox} box\n * @return {!Array<!shaka.media.SegmentReference>}\n * @private\n */\n static parseSIDX_(\n sidxOffset, initSegmentReference, timestampOffset, appendWindowStart,\n appendWindowEnd, uris, box) {\n goog.asserts.assert(\n box.version != null,\n 'SIDX is a full box and should have a valid version.');\n\n const references = [];\n\n // Parse the SIDX structure.\n // Skip reference_ID (32 bits).\n box.reader.skip(4);\n\n const timescale = box.reader.readUint32();\n\n if (timescale == 0) {\n shaka.log.error('Invalid timescale.');\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.MP4_SIDX_INVALID_TIMESCALE);\n }\n\n let earliestPresentationTime;\n let firstOffset;\n\n if (box.version == 0) {\n earliestPresentationTime = box.reader.readUint32();\n firstOffset = box.reader.readUint32();\n } else {\n earliestPresentationTime = box.reader.readUint64();\n firstOffset = box.reader.readUint64();\n }\n\n // Skip reserved (16 bits).\n box.reader.skip(2);\n\n // Add references.\n const referenceCount = box.reader.readUint16();\n\n // Subtract the presentation time offset\n let unscaledStartTime = earliestPresentationTime;\n let startByte = sidxOffset + box.size + firstOffset;\n\n for (let i = 0; i < referenceCount; i++) {\n // |chunk| is 1 bit for |referenceType|, and 31 bits for |referenceSize|.\n const chunk = box.reader.readUint32();\n const referenceType = (chunk & 0x80000000) >>> 31;\n const referenceSize = chunk & 0x7FFFFFFF;\n\n const subsegmentDuration = box.reader.readUint32();\n\n // Skipping 1 bit for |startsWithSap|, 3 bits for |sapType|, and 28 bits\n // for |sapDelta|.\n box.reader.skip(4);\n\n // If |referenceType| is 1 then the reference is to another SIDX.\n // We do not support this.\n if (referenceType == 1) {\n shaka.log.error('Hierarchical SIDXs are not supported.');\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.MP4_SIDX_TYPE_NOT_SUPPORTED);\n }\n\n // The media timestamps inside the container.\n const nativeStartTime = unscaledStartTime / timescale;\n const nativeEndTime =\n (unscaledStartTime + subsegmentDuration) / timescale;\n\n references.push(\n new shaka.media.SegmentReference(\n nativeStartTime + timestampOffset,\n nativeEndTime + timestampOffset,\n (() => { return uris; }),\n startByte,\n startByte + referenceSize - 1,\n initSegmentReference,\n timestampOffset,\n appendWindowStart,\n appendWindowEnd));\n\n unscaledStartTime += subsegmentDuration;\n startByte += referenceSize;\n }\n\n box.parser.stop();\n return references;\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.EbmlElement');\ngoog.provide('shaka.dash.EbmlParser');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.util.BufferUtils');\ngoog.require('shaka.util.DataViewReader');\ngoog.require('shaka.util.Error');\n\n\n/**\n * @summary\n * Extensible Binary Markup Language (EBML) parser.\n */\nshaka.dash.EbmlParser = class {\n /**\n * @param {BufferSource} data\n */\n constructor(data) {\n /** @private {!DataView} */\n this.dataView_ = shaka.util.BufferUtils.toDataView(data);\n\n /** @private {!shaka.util.DataViewReader} */\n this.reader_ = new shaka.util.DataViewReader(\n this.dataView_, shaka.util.DataViewReader.Endianness.BIG_ENDIAN);\n }\n\n\n /**\n * @return {boolean} True if the parser has more data, false otherwise.\n */\n hasMoreData() {\n return this.reader_.hasMoreData();\n }\n\n\n /**\n * Parses an EBML element from the parser's current position, and advances\n * the parser.\n * @return {!shaka.util.EbmlElement} The EBML element.\n * @see http://matroska.org/technical/specs/rfc/index.html\n */\n parseElement() {\n const id = this.parseId_();\n\n // Parse the element's size.\n const vint = this.parseVint_();\n let size;\n if (shaka.dash.EbmlParser.isDynamicSizeValue_(vint)) {\n // If this has an unknown size, assume that it takes up the rest of the\n // data.\n size = this.dataView_.byteLength - this.reader_.getPosition();\n } else {\n size = shaka.dash.EbmlParser.getVintValue_(vint);\n }\n\n // Note that if the element's size is larger than the buffer then we are\n // parsing a \"partial element\". This may occur if for example we are\n // parsing the beginning of some WebM container data, but our buffer does\n // not contain the entire WebM container data.\n const elementSize =\n this.reader_.getPosition() + size <= this.dataView_.byteLength ?\n size :\n this.dataView_.byteLength - this.reader_.getPosition();\n\n const dataView = shaka.util.BufferUtils.toDataView(\n this.dataView_, this.reader_.getPosition(), elementSize);\n\n this.reader_.skip(elementSize);\n\n return new shaka.util.EbmlElement(id, dataView);\n }\n\n\n /**\n * Parses an EBML ID from the parser's current position, and advances the\n * parser.\n * @return {number} The EBML ID.\n * @private\n */\n parseId_() {\n const vint = this.parseVint_();\n\n if (vint.length > 7) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.EBML_OVERFLOW);\n }\n\n let id = 0;\n for (const /* byte */ b of vint) {\n // Note that we cannot use << since |value| may exceed 32 bits.\n id = (256 * id) + b;\n }\n\n return id;\n }\n\n\n /**\n * Parses a variable sized integer from the parser's current position, and\n * advances the parser.\n * For example:\n * 1 byte wide: 1xxx xxxx\n * 2 bytes wide: 01xx xxxx xxxx xxxx\n * 3 bytes wide: 001x xxxx xxxx xxxx xxxx xxxx\n * @return {!Uint8Array} The variable sized integer.\n * @private\n */\n parseVint_() {\n const position = this.reader_.getPosition();\n const firstByte = this.reader_.readUint8();\n if (firstByte == 0) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.EBML_OVERFLOW);\n }\n\n // Determine the index of the highest bit set.\n const index = Math.floor(Math.log2(firstByte));\n const numBytes = 8 - index;\n goog.asserts.assert(numBytes <= 8 && numBytes >= 1, 'Incorrect log2 value');\n this.reader_.skip(numBytes - 1);\n return shaka.util.BufferUtils.toUint8(this.dataView_, position, numBytes);\n }\n\n\n /**\n * Gets the value of a variable sized integer.\n * For example, the x's below are part of the vint's value.\n * 7-bit value: 1xxx xxxx\n * 14-bit value: 01xx xxxx xxxx xxxx\n * 21-bit value: 001x xxxx xxxx xxxx xxxx xxxx\n * @param {!Uint8Array} vint The variable sized integer.\n * @return {number} The value of the variable sized integer.\n * @private\n */\n static getVintValue_(vint) {\n // If |vint| is 8 bytes wide then we must ensure that it does not have more\n // than 53 meaningful bits. For example, assume |vint| is 8 bytes wide,\n // so it has the following structure,\n // 0000 0001 | xxxx xxxx ...\n // Thus, the first 3 bits following the first byte of |vint| must be 0.\n if ((vint.length == 8) && (vint[1] & 0xe0)) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.JS_INTEGER_OVERFLOW);\n }\n\n let value = 0;\n for (let i = 0; i < vint.length; i++) {\n const item = vint[i];\n if (i == 0) {\n // Mask out the first few bits of |vint|'s first byte to get the most\n // significant bits of |vint|'s value. If |vint| is 8 bytes wide then\n // |value| will be set to 0.\n const mask = 0x1 << (8 - vint.length);\n value = item & (mask - 1);\n } else {\n // Note that we cannot use << since |value| may exceed 32 bits.\n value = (256 * value) + item;\n }\n }\n\n return value;\n }\n\n\n /**\n * Checks if the given variable sized integer represents a dynamic size value.\n * @param {!Uint8Array} vint The variable sized integer.\n * @return {boolean} true if |vint| represents a dynamic size value,\n * false otherwise.\n * @private\n */\n static isDynamicSizeValue_(vint) {\n const EbmlParser = shaka.dash.EbmlParser;\n const BufferUtils = shaka.util.BufferUtils;\n\n for (const dynamicSizeConst of EbmlParser.DYNAMIC_SIZES) {\n if (BufferUtils.equal(vint, new Uint8Array(dynamicSizeConst))) {\n return true;\n }\n }\n\n return false;\n }\n};\n\n\n/**\n * A list of EBML dynamic size constants.\n * @const {!Array<!Array<number>>}\n */\nshaka.dash.EbmlParser.DYNAMIC_SIZES = [\n [0xff],\n [0x7f, 0xff],\n [0x3f, 0xff, 0xff],\n [0x1f, 0xff, 0xff, 0xff],\n [0x0f, 0xff, 0xff, 0xff, 0xff],\n [0x07, 0xff, 0xff, 0xff, 0xff, 0xff],\n [0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff],\n [0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff],\n];\n\n\nshaka.util.EbmlElement = class {\n /**\n * @param {number} id The ID.\n * @param {!DataView} dataView The DataView.\n */\n constructor(id, dataView) {\n /** @type {number} */\n this.id = id;\n\n /** @private {!DataView} */\n this.dataView_ = dataView;\n }\n\n\n /**\n * Gets the element's offset from the beginning of the buffer.\n * @return {number}\n */\n getOffset() {\n return this.dataView_.byteOffset;\n }\n\n\n /**\n * Interpret the element's data as a list of sub-elements.\n * @return {!shaka.dash.EbmlParser} A parser over the sub-elements.\n */\n createParser() {\n return new shaka.dash.EbmlParser(this.dataView_);\n }\n\n\n /**\n * Interpret the element's data as an unsigned integer.\n * @return {number}\n */\n getUint() {\n if (this.dataView_.byteLength > 8) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.EBML_OVERFLOW);\n }\n\n // Ensure we have at most 53 meaningful bits.\n if ((this.dataView_.byteLength == 8) &&\n (this.dataView_.getUint8(0) & 0xe0)) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.JS_INTEGER_OVERFLOW);\n }\n\n let value = 0;\n\n for (let i = 0; i < this.dataView_.byteLength; i++) {\n const chunk = this.dataView_.getUint8(i);\n value = (256 * value) + chunk;\n }\n\n return value;\n }\n\n\n /**\n * Interpret the element's data as a floating point number\n * (32 bits or 64 bits). 80-bit floating point numbers are not supported.\n * @return {number}\n */\n getFloat() {\n if (this.dataView_.byteLength == 4) {\n return this.dataView_.getFloat32(0);\n } else if (this.dataView_.byteLength == 8) {\n return this.dataView_.getFloat64(0);\n } else {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.EBML_BAD_FLOATING_POINT_SIZE);\n }\n }\n};\n\n\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.dash.WebmSegmentIndexParser');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.log');\ngoog.require('shaka.media.InitSegmentReference');\ngoog.require('shaka.media.SegmentReference');\ngoog.require('shaka.util.EbmlElement');\ngoog.require('shaka.dash.EbmlParser');\ngoog.require('shaka.util.Error');\n\n\nshaka.dash.WebmSegmentIndexParser = class {\n /**\n * Parses SegmentReferences from a WebM container.\n * @param {BufferSource} cuesData The WebM container's \"Cueing Data\" section.\n * @param {BufferSource} initData The WebM container's headers.\n * @param {!Array<string>} uris The possible locations of the WebM file that\n * contains the segments.\n * @param {shaka.media.InitSegmentReference} initSegmentReference\n * @param {number} timestampOffset\n * @param {number} appendWindowStart\n * @param {number} appendWindowEnd\n * @return {!Array<!shaka.media.SegmentReference>}\n * @see http://www.matroska.org/technical/specs/index.html\n * @see http://www.webmproject.org/docs/container/\n */\n static parse(\n cuesData, initData, uris, initSegmentReference, timestampOffset,\n appendWindowStart, appendWindowEnd) {\n const tuple =\n shaka.dash.WebmSegmentIndexParser.parseWebmContainer_(initData);\n const parser = new shaka.dash.EbmlParser(cuesData);\n const cuesElement = parser.parseElement();\n if (cuesElement.id != shaka.dash.WebmSegmentIndexParser.CUES_ID) {\n shaka.log.error('Not a Cues element.');\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.WEBM_CUES_ELEMENT_MISSING);\n }\n\n return shaka.dash.WebmSegmentIndexParser.parseCues_(\n cuesElement, tuple.segmentOffset, tuple.timecodeScale, tuple.duration,\n uris, initSegmentReference, timestampOffset, appendWindowStart,\n appendWindowEnd);\n }\n\n\n /**\n * Parses a WebM container to get the segment's offset, timecode scale, and\n * duration.\n *\n * @param {BufferSource} initData\n * @return {{segmentOffset: number, timecodeScale: number, duration: number}}\n * The segment's offset in bytes, the segment's timecode scale in seconds,\n * and the duration in seconds.\n * @private\n */\n static parseWebmContainer_(initData) {\n const parser = new shaka.dash.EbmlParser(initData);\n\n // Check that the WebM container data starts with the EBML header, but\n // skip its contents.\n const ebmlElement = parser.parseElement();\n if (ebmlElement.id != shaka.dash.WebmSegmentIndexParser.EBML_ID) {\n shaka.log.error('Not an EBML element.');\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.WEBM_EBML_HEADER_ELEMENT_MISSING);\n }\n\n const segmentElement = parser.parseElement();\n if (segmentElement.id != shaka.dash.WebmSegmentIndexParser.SEGMENT_ID) {\n shaka.log.error('Not a Segment element.');\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.WEBM_SEGMENT_ELEMENT_MISSING);\n }\n\n // This value is used as the initial offset to the first referenced segment.\n const segmentOffset = segmentElement.getOffset();\n\n // Parse the Segment element to get the segment info.\n const segmentInfo = shaka.dash.WebmSegmentIndexParser.parseSegment_(\n segmentElement);\n return {\n segmentOffset: segmentOffset,\n timecodeScale: segmentInfo.timecodeScale,\n duration: segmentInfo.duration,\n };\n }\n\n\n /**\n * Parses a WebM Info element to get the segment's timecode scale and\n * duration.\n * @param {!shaka.util.EbmlElement} segmentElement\n * @return {{timecodeScale: number, duration: number}} The segment's timecode\n * scale in seconds and duration in seconds.\n * @private\n */\n static parseSegment_(segmentElement) {\n const parser = segmentElement.createParser();\n\n // Find the Info element.\n let infoElement = null;\n while (parser.hasMoreData()) {\n const elem = parser.parseElement();\n if (elem.id != shaka.dash.WebmSegmentIndexParser.INFO_ID) {\n continue;\n }\n\n infoElement = elem;\n\n break;\n }\n\n if (!infoElement) {\n shaka.log.error('Not an Info element.');\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.WEBM_INFO_ELEMENT_MISSING);\n }\n\n return shaka.dash.WebmSegmentIndexParser.parseInfo_(infoElement);\n }\n\n\n /**\n * Parses a WebM Info element to get the segment's timecode scale and\n * duration.\n * @param {!shaka.util.EbmlElement} infoElement\n * @return {{timecodeScale: number, duration: number}} The segment's timecode\n * scale in seconds and duration in seconds.\n * @private\n */\n static parseInfo_(infoElement) {\n const parser = infoElement.createParser();\n\n // The timecode scale factor in units of [nanoseconds / T], where [T] are\n // the units used to express all other time values in the WebM container.\n // By default it's assumed that [T] == [milliseconds].\n let timecodeScaleNanoseconds = 1000000;\n /** @type {?number} */\n let durationScale = null;\n\n while (parser.hasMoreData()) {\n const elem = parser.parseElement();\n if (elem.id == shaka.dash.WebmSegmentIndexParser.TIMECODE_SCALE_ID) {\n timecodeScaleNanoseconds = elem.getUint();\n } else if (elem.id == shaka.dash.WebmSegmentIndexParser.DURATION_ID) {\n durationScale = elem.getFloat();\n }\n }\n if (durationScale == null) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.WEBM_DURATION_ELEMENT_MISSING);\n }\n\n // The timecode scale factor in units of [seconds / T].\n const timecodeScale = timecodeScaleNanoseconds / 1000000000;\n // The duration is stored in units of [T]\n const durationSeconds = durationScale * timecodeScale;\n\n return {timecodeScale: timecodeScale, duration: durationSeconds};\n }\n\n\n /**\n * Parses a WebM CuesElement.\n * @param {!shaka.util.EbmlElement} cuesElement\n * @param {number} segmentOffset\n * @param {number} timecodeScale\n * @param {number} duration\n * @param {!Array<string>} uris\n * @param {shaka.media.InitSegmentReference} initSegmentReference\n * @param {number} timestampOffset\n * @param {number} appendWindowStart\n * @param {number} appendWindowEnd\n * @return {!Array<!shaka.media.SegmentReference>}\n * @private\n */\n static parseCues_(cuesElement, segmentOffset, timecodeScale, duration,\n uris, initSegmentReference, timestampOffset, appendWindowStart,\n appendWindowEnd) {\n const references = [];\n const getUris = () => uris;\n\n const parser = cuesElement.createParser();\n\n let lastTime = null;\n let lastOffset = null;\n\n while (parser.hasMoreData()) {\n const elem = parser.parseElement();\n if (elem.id != shaka.dash.WebmSegmentIndexParser.CUE_POINT_ID) {\n continue;\n }\n\n const tuple = shaka.dash.WebmSegmentIndexParser.parseCuePoint_(elem);\n if (!tuple) {\n continue;\n }\n\n // Subtract the presentation time offset from the unscaled time\n const currentTime = timecodeScale * tuple.unscaledTime;\n const currentOffset = segmentOffset + tuple.relativeOffset;\n\n if (lastTime != null) {\n goog.asserts.assert(lastOffset != null, 'last offset cannot be null');\n\n references.push(\n new shaka.media.SegmentReference(\n lastTime + timestampOffset,\n currentTime + timestampOffset,\n getUris,\n /* startByte= */ lastOffset, /* endByte= */ currentOffset - 1,\n initSegmentReference,\n timestampOffset,\n appendWindowStart,\n appendWindowEnd));\n }\n\n lastTime = currentTime;\n lastOffset = currentOffset;\n }\n\n if (lastTime != null) {\n goog.asserts.assert(lastOffset != null, 'last offset cannot be null');\n\n references.push(\n new shaka.media.SegmentReference(\n lastTime + timestampOffset,\n duration + timestampOffset,\n getUris,\n /* startByte= */ lastOffset, /* endByte= */ null,\n initSegmentReference,\n timestampOffset,\n appendWindowStart,\n appendWindowEnd));\n }\n\n return references;\n }\n\n\n /**\n * Parses a WebM CuePointElement to get an \"unadjusted\" segment reference.\n * @param {shaka.util.EbmlElement} cuePointElement\n * @return {{unscaledTime: number, relativeOffset: number}} The referenced\n * segment's start time in units of [T] (see parseInfo_()), and the\n * referenced segment's offset in bytes, relative to a WebM Segment\n * element.\n * @private\n */\n static parseCuePoint_(cuePointElement) {\n const parser = cuePointElement.createParser();\n\n // Parse CueTime element.\n const cueTimeElement = parser.parseElement();\n if (cueTimeElement.id != shaka.dash.WebmSegmentIndexParser.CUE_TIME_ID) {\n shaka.log.warning('Not a CueTime element.');\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.WEBM_CUE_TIME_ELEMENT_MISSING);\n }\n const unscaledTime = cueTimeElement.getUint();\n\n // Parse CueTrackPositions element.\n const cueTrackPositionsElement = parser.parseElement();\n if (cueTrackPositionsElement.id !=\n shaka.dash.WebmSegmentIndexParser.CUE_TRACK_POSITIONS_ID) {\n shaka.log.warning('Not a CueTrackPositions element.');\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.WEBM_CUE_TRACK_POSITIONS_ELEMENT_MISSING);\n }\n\n const cueTrackParser = cueTrackPositionsElement.createParser();\n let relativeOffset = 0;\n\n while (cueTrackParser.hasMoreData()) {\n const elem = cueTrackParser.parseElement();\n if (elem.id != shaka.dash.WebmSegmentIndexParser.CUE_CLUSTER_POSITION) {\n continue;\n }\n\n relativeOffset = elem.getUint();\n break;\n }\n\n return {unscaledTime: unscaledTime, relativeOffset: relativeOffset};\n }\n};\n\n\n/** @const {number} */\nshaka.dash.WebmSegmentIndexParser.EBML_ID = 0x1a45dfa3;\n\n\n/** @const {number} */\nshaka.dash.WebmSegmentIndexParser.SEGMENT_ID = 0x18538067;\n\n\n/** @const {number} */\nshaka.dash.WebmSegmentIndexParser.INFO_ID = 0x1549a966;\n\n\n/** @const {number} */\nshaka.dash.WebmSegmentIndexParser.TIMECODE_SCALE_ID = 0x2ad7b1;\n\n\n/** @const {number} */\nshaka.dash.WebmSegmentIndexParser.DURATION_ID = 0x4489;\n\n\n/** @const {number} */\nshaka.dash.WebmSegmentIndexParser.CUES_ID = 0x1c53bb6b;\n\n\n/** @const {number} */\nshaka.dash.WebmSegmentIndexParser.CUE_POINT_ID = 0xbb;\n\n\n/** @const {number} */\nshaka.dash.WebmSegmentIndexParser.CUE_TIME_ID = 0xb3;\n\n\n/** @const {number} */\nshaka.dash.WebmSegmentIndexParser.CUE_TRACK_POSITIONS_ID = 0xb7;\n\n\n/** @const {number} */\nshaka.dash.WebmSegmentIndexParser.CUE_CLUSTER_POSITION = 0xf1;\n\n\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.dash.SegmentBase');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.dash.Mp4SegmentIndexParser');\ngoog.require('shaka.dash.MpdUtils');\ngoog.require('shaka.dash.WebmSegmentIndexParser');\ngoog.require('shaka.log');\ngoog.require('shaka.media.InitSegmentReference');\ngoog.require('shaka.media.SegmentIndex');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.ManifestParserUtils');\ngoog.require('shaka.util.ObjectUtils');\ngoog.require('shaka.util.StringUtils');\ngoog.require('shaka.util.TXml');\ngoog.requireType('shaka.dash.DashParser');\ngoog.requireType('shaka.media.PresentationTimeline');\ngoog.requireType('shaka.media.SegmentReference');\n\n\n/**\n * @summary A set of functions for parsing SegmentBase elements.\n */\nshaka.dash.SegmentBase = class {\n /**\n * Creates an init segment reference from a Context object.\n *\n * @param {shaka.dash.DashParser.Context} context\n * @param {function(?shaka.dash.DashParser.InheritanceFrame):\n * ?shaka.extern.xml.Node} callback\n * @param {shaka.extern.aesKey|undefined} aesKey\n * @return {shaka.media.InitSegmentReference}\n */\n static createInitSegment(context, callback, aesKey) {\n const MpdUtils = shaka.dash.MpdUtils;\n const TXml = shaka.util.TXml;\n const ManifestParserUtils = shaka.util.ManifestParserUtils;\n const StringUtils = shaka.util.StringUtils;\n\n const initialization =\n MpdUtils.inheritChild(context, callback, 'Initialization');\n if (!initialization) {\n return null;\n }\n\n let resolvedUris = context.representation.getBaseUris();\n const uri = initialization.attributes['sourceURL'];\n if (uri) {\n resolvedUris = ManifestParserUtils.resolveUris(resolvedUris, [\n StringUtils.htmlUnescape(uri),\n ], context.urlParams());\n }\n\n let startByte = 0;\n let endByte = null;\n const range = TXml.parseAttr(initialization, 'range', TXml.parseRange);\n if (range) {\n startByte = range.start;\n endByte = range.end;\n }\n\n const getUris = () => resolvedUris;\n const qualityInfo = shaka.dash.SegmentBase.createQualityInfo(context);\n const encrypted = context.adaptationSet.encrypted;\n const ref = new shaka.media.InitSegmentReference(\n getUris,\n startByte,\n endByte,\n qualityInfo,\n /* timescale= */ null,\n /* segmentData= */ null,\n aesKey,\n encrypted);\n ref.codecs = context.representation.codecs;\n ref.mimeType = context.representation.mimeType;\n if (context.periodInfo) {\n ref.boundaryEnd = context.periodInfo.start + context.periodInfo.duration;\n }\n return ref;\n }\n\n /**\n * Creates a new StreamInfo object.\n *\n * @param {shaka.dash.DashParser.Context} context\n * @param {shaka.dash.DashParser.RequestSegmentCallback} requestSegment\n * @param {shaka.extern.aesKey|undefined} aesKey\n * @return {shaka.dash.DashParser.StreamInfo}\n */\n static createStreamInfo(context, requestSegment, aesKey) {\n goog.asserts.assert(context.representation.segmentBase,\n 'Should only be called with SegmentBase');\n // Since SegmentBase does not need updates, simply treat any call as\n // the initial parse.\n const MpdUtils = shaka.dash.MpdUtils;\n const SegmentBase = shaka.dash.SegmentBase;\n const TXml = shaka.util.TXml;\n\n const unscaledPresentationTimeOffset = Number(MpdUtils.inheritAttribute(\n context, SegmentBase.fromInheritance_, 'presentationTimeOffset')) || 0;\n\n const timescaleStr = MpdUtils.inheritAttribute(\n context, SegmentBase.fromInheritance_, 'timescale');\n let timescale = 1;\n if (timescaleStr) {\n timescale = TXml.parsePositiveInt(timescaleStr) || 1;\n }\n\n const scaledPresentationTimeOffset =\n (unscaledPresentationTimeOffset / timescale) || 0;\n\n const initSegmentReference = SegmentBase.createInitSegment(\n context, SegmentBase.fromInheritance_, aesKey);\n\n // Throws an immediate error if the format is unsupported.\n SegmentBase.checkSegmentIndexRangeSupport_(context, initSegmentReference);\n\n // Direct fields of context will be reassigned by the parser before\n // generateSegmentIndex is called. So we must make a shallow copy first,\n // and use that in the generateSegmentIndex callbacks.\n const shallowCopyOfContext =\n shaka.util.ObjectUtils.shallowCloneObject(context);\n\n return {\n generateSegmentIndex: () => {\n return SegmentBase.generateSegmentIndex_(\n shallowCopyOfContext, requestSegment, initSegmentReference,\n scaledPresentationTimeOffset);\n },\n };\n }\n\n /**\n * Creates a SegmentIndex for the given URIs and context.\n *\n * @param {shaka.dash.DashParser.Context} context\n * @param {shaka.dash.DashParser.RequestSegmentCallback} requestSegment\n * @param {shaka.media.InitSegmentReference} initSegmentReference\n * @param {!Array<string>} uris\n * @param {number} startByte\n * @param {?number} endByte\n * @param {number} scaledPresentationTimeOffset\n * @return {!Promise<shaka.media.SegmentIndex>}\n */\n static async generateSegmentIndexFromUris(\n context, requestSegment, initSegmentReference, uris, startByte,\n endByte, scaledPresentationTimeOffset) {\n // Unpack context right away, before we start an async process.\n // This immunizes us against changes to the context object later.\n /** @type {shaka.media.PresentationTimeline} */\n const presentationTimeline = context.presentationTimeline;\n const fitLast = !context.dynamic || !context.periodInfo.isLastPeriod;\n const periodStart = context.periodInfo.start;\n const periodDuration = context.periodInfo.duration;\n const containerType = context.representation.mimeType.split('/')[1];\n\n // Create a local variable to bind to so we can set to null to help the GC.\n let localRequest = requestSegment;\n let segmentIndex = null;\n\n const responses = [\n localRequest(uris, startByte, endByte, /* isInit= */ false),\n containerType == 'webm' ?\n localRequest(\n initSegmentReference.getUris(),\n initSegmentReference.startByte,\n initSegmentReference.endByte,\n /* isInit= */ true) :\n null,\n ];\n\n localRequest = null;\n const results = await Promise.all(responses);\n const indexData = results[0];\n const initData = results[1] || null;\n /** @type {Array<!shaka.media.SegmentReference>} */\n let references = null;\n\n const timestampOffset = periodStart - scaledPresentationTimeOffset;\n const appendWindowStart = periodStart;\n const appendWindowEnd = periodDuration ?\n periodStart + periodDuration : Infinity;\n\n if (containerType == 'mp4') {\n references = shaka.dash.Mp4SegmentIndexParser.parse(\n indexData, startByte, uris, initSegmentReference, timestampOffset,\n appendWindowStart, appendWindowEnd);\n } else {\n goog.asserts.assert(initData, 'WebM requires init data');\n references = shaka.dash.WebmSegmentIndexParser.parse(\n indexData, initData, uris, initSegmentReference, timestampOffset,\n appendWindowStart, appendWindowEnd);\n }\n for (const ref of references) {\n ref.codecs = context.representation.codecs;\n ref.mimeType = context.representation.mimeType;\n ref.bandwidth = context.bandwidth;\n }\n\n presentationTimeline.notifySegments(references);\n\n // Since containers are never updated, we don't need to store the\n // segmentIndex in the map.\n goog.asserts.assert(!segmentIndex,\n 'Should not call generateSegmentIndex twice');\n\n segmentIndex = new shaka.media.SegmentIndex(references);\n if (fitLast) {\n segmentIndex.fit(appendWindowStart, appendWindowEnd, /* isNew= */ true);\n }\n return segmentIndex;\n }\n\n /**\n * @param {?shaka.dash.DashParser.InheritanceFrame} frame\n * @return {?shaka.extern.xml.Node}\n * @private\n */\n static fromInheritance_(frame) {\n return frame.segmentBase;\n }\n\n /**\n * Compute the byte range of the segment index from the container.\n *\n * @param {shaka.dash.DashParser.Context} context\n * @return {?{start: number, end: number}}\n * @private\n */\n static computeIndexRange_(context) {\n const MpdUtils = shaka.dash.MpdUtils;\n const SegmentBase = shaka.dash.SegmentBase;\n const TXml = shaka.util.TXml;\n\n const representationIndex = MpdUtils.inheritChild(\n context, SegmentBase.fromInheritance_, 'RepresentationIndex');\n const indexRangeElem = MpdUtils.inheritAttribute(\n context, SegmentBase.fromInheritance_, 'indexRange');\n\n let indexRange = TXml.parseRange(indexRangeElem || '');\n if (representationIndex) {\n indexRange = TXml.parseAttr(\n representationIndex, 'range', TXml.parseRange, indexRange);\n }\n return indexRange;\n }\n\n /**\n * Compute the URIs of the segment index from the container.\n *\n * @param {shaka.dash.DashParser.Context} context\n * @return {!Array<string>}\n * @private\n */\n static computeIndexUris_(context) {\n const ManifestParserUtils = shaka.util.ManifestParserUtils;\n const MpdUtils = shaka.dash.MpdUtils;\n const SegmentBase = shaka.dash.SegmentBase;\n const StringUtils = shaka.util.StringUtils;\n\n const representationIndex = MpdUtils.inheritChild(\n context, SegmentBase.fromInheritance_, 'RepresentationIndex');\n\n let indexUris = context.representation.getBaseUris();\n if (representationIndex) {\n const representationUri =\n StringUtils.htmlUnescape(representationIndex.attributes['sourceURL']);\n if (representationUri) {\n indexUris = ManifestParserUtils.resolveUris(\n indexUris, [representationUri], context.urlParams());\n }\n }\n\n return indexUris;\n }\n\n /**\n * Check if this type of segment index is supported. This allows for\n * immediate errors during parsing, as opposed to an async error from\n * createSegmentIndex().\n *\n * Also checks for a valid byte range, which is not required for callers from\n * SegmentTemplate.\n *\n * @param {shaka.dash.DashParser.Context} context\n * @param {shaka.media.InitSegmentReference} initSegmentReference\n * @private\n */\n static checkSegmentIndexRangeSupport_(context, initSegmentReference) {\n const SegmentBase = shaka.dash.SegmentBase;\n\n SegmentBase.checkSegmentIndexSupport(context, initSegmentReference);\n\n const indexRange = SegmentBase.computeIndexRange_(context);\n if (!indexRange) {\n shaka.log.error(\n 'SegmentBase does not contain sufficient segment information:',\n 'the SegmentBase does not contain @indexRange',\n 'or a RepresentationIndex element.',\n context.representation);\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.DASH_NO_SEGMENT_INFO);\n }\n }\n\n /**\n * Check if this type of segment index is supported. This allows for\n * immediate errors during parsing, as opposed to an async error from\n * createSegmentIndex().\n *\n * @param {shaka.dash.DashParser.Context} context\n * @param {shaka.media.InitSegmentReference} initSegmentReference\n */\n static checkSegmentIndexSupport(context, initSegmentReference) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n\n const contentType = context.representation.contentType;\n const containerType = context.representation.mimeType.split('/')[1];\n\n if (contentType != ContentType.TEXT && containerType != 'mp4' &&\n containerType != 'webm') {\n shaka.log.error(\n 'SegmentBase specifies an unsupported container type.',\n context.representation);\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.DASH_UNSUPPORTED_CONTAINER);\n }\n\n if ((containerType == 'webm') && !initSegmentReference) {\n shaka.log.error(\n 'SegmentBase does not contain sufficient segment information:',\n 'the SegmentBase uses a WebM container,',\n 'but does not contain an Initialization element.',\n context.representation);\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.DASH_WEBM_MISSING_INIT);\n }\n }\n\n /**\n * Generate a SegmentIndex from a Context object.\n *\n * @param {shaka.dash.DashParser.Context} context\n * @param {shaka.dash.DashParser.RequestSegmentCallback} requestSegment\n * @param {shaka.media.InitSegmentReference} initSegmentReference\n * @param {number} scaledPresentationTimeOffset\n * @return {!Promise<shaka.media.SegmentIndex>}\n * @private\n */\n static generateSegmentIndex_(\n context, requestSegment, initSegmentReference,\n scaledPresentationTimeOffset) {\n const SegmentBase = shaka.dash.SegmentBase;\n\n const indexUris = SegmentBase.computeIndexUris_(context);\n const indexRange = SegmentBase.computeIndexRange_(context);\n goog.asserts.assert(indexRange, 'Index range should not be null!');\n\n return shaka.dash.SegmentBase.generateSegmentIndexFromUris(\n context, requestSegment, initSegmentReference, indexUris,\n indexRange.start, indexRange.end,\n scaledPresentationTimeOffset);\n }\n\n /**\n * Create a MediaQualityInfo object from a Context object.\n *\n * @param {!shaka.dash.DashParser.Context} context\n * @return {!shaka.extern.MediaQualityInfo}\n */\n static createQualityInfo(context) {\n const representation = context.representation;\n return {\n bandwidth: context.bandwidth,\n audioSamplingRate: representation.audioSamplingRate,\n codecs: representation.codecs,\n contentType: representation.contentType,\n frameRate: representation.frameRate || null,\n height: representation.height || null,\n mimeType: representation.mimeType,\n channelsCount: representation.numChannels,\n pixelAspectRatio: representation.pixelAspectRatio || null,\n width: representation.width || null,\n label: context.adaptationSet.label || null,\n roles: context.roles || null,\n language: context.adaptationSet.language || null,\n };\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.dash.SegmentList');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.dash.MpdUtils');\ngoog.require('shaka.dash.SegmentBase');\ngoog.require('shaka.log');\ngoog.require('shaka.media.InitSegmentReference');\ngoog.require('shaka.media.SegmentIndex');\ngoog.require('shaka.media.SegmentReference');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.Functional');\ngoog.require('shaka.util.ManifestParserUtils');\ngoog.require('shaka.util.StringUtils');\ngoog.require('shaka.util.TXml');\ngoog.requireType('shaka.dash.DashParser');\ngoog.requireType('shaka.media.PresentationTimeline');\n\n\n/**\n * @summary A set of functions for parsing SegmentList elements.\n */\nshaka.dash.SegmentList = class {\n /**\n * Creates a new StreamInfo object.\n * Updates the existing SegmentIndex, if any.\n *\n * @param {shaka.dash.DashParser.Context} context\n * @param {!Map<string, !shaka.extern.Stream>} streamMap\n * @param {shaka.extern.aesKey|undefined} aesKey\n * @return {shaka.dash.DashParser.StreamInfo}\n */\n static createStreamInfo(context, streamMap, aesKey) {\n goog.asserts.assert(context.representation.segmentList,\n 'Should only be called with SegmentList');\n const SegmentList = shaka.dash.SegmentList;\n\n const initSegmentReference = shaka.dash.SegmentBase.createInitSegment(\n context, SegmentList.fromInheritance_, aesKey);\n const info = SegmentList.parseSegmentListInfo_(context);\n\n SegmentList.checkSegmentListInfo_(context, info);\n\n /** @type {shaka.media.SegmentIndex} */\n let segmentIndex = null;\n let stream = null;\n if (context.period.id && context.representation.id) {\n // Only check/store the index if period and representation IDs are set.\n const id = context.period.id + ',' + context.representation.id;\n stream = streamMap.get(id);\n if (stream) {\n segmentIndex = stream.segmentIndex;\n }\n }\n\n const references = SegmentList.createSegmentReferences_(\n context.periodInfo.start, context.periodInfo.duration,\n info.startNumber, context.representation.getBaseUris, info,\n initSegmentReference, aesKey, context.representation.mimeType,\n context.representation.codecs, context.bandwidth, context.urlParams);\n\n const isNew = !segmentIndex;\n if (segmentIndex) {\n const start = context.presentationTimeline.getSegmentAvailabilityStart();\n segmentIndex.mergeAndEvict(references, start);\n } else {\n segmentIndex = new shaka.media.SegmentIndex(references);\n }\n context.presentationTimeline.notifySegments(references);\n\n if (!context.dynamic || !context.periodInfo.isLastPeriod) {\n const periodStart = context.periodInfo.start;\n const periodEnd = context.periodInfo.duration ?\n context.periodInfo.start + context.periodInfo.duration : Infinity;\n segmentIndex.fit(periodStart, periodEnd, isNew);\n }\n\n if (stream) {\n stream.segmentIndex = segmentIndex;\n }\n\n return {\n generateSegmentIndex: () => {\n if (!segmentIndex || segmentIndex.isEmpty()) {\n segmentIndex.merge(references);\n }\n return Promise.resolve(segmentIndex);\n },\n };\n }\n\n /**\n * @param {?shaka.dash.DashParser.InheritanceFrame} frame\n * @return {?shaka.extern.xml.Node}\n * @private\n */\n static fromInheritance_(frame) {\n return frame.segmentList;\n }\n\n /**\n * Parses the SegmentList items to create an info object.\n *\n * @param {shaka.dash.DashParser.Context} context\n * @return {shaka.dash.SegmentList.SegmentListInfo}\n * @private\n */\n static parseSegmentListInfo_(context) {\n const SegmentList = shaka.dash.SegmentList;\n const MpdUtils = shaka.dash.MpdUtils;\n\n const mediaSegments = SegmentList.parseMediaSegments_(context);\n const segmentInfo =\n MpdUtils.parseSegmentInfo(context, SegmentList.fromInheritance_);\n\n let startNumber = segmentInfo.startNumber;\n if (startNumber == 0) {\n shaka.log.warning('SegmentList@startNumber must be > 0');\n startNumber = 1;\n }\n\n let startTime = 0;\n if (segmentInfo.segmentDuration) {\n // See DASH sec. 5.3.9.5.3\n // Don't use presentationTimeOffset for @duration.\n startTime = segmentInfo.segmentDuration * (startNumber - 1);\n } else if (segmentInfo.timeline && segmentInfo.timeline.length > 0) {\n // The presentationTimeOffset was considered in timeline creation.\n startTime = segmentInfo.timeline[0].start;\n }\n\n return {\n segmentDuration: segmentInfo.segmentDuration,\n startTime: startTime,\n startNumber: startNumber,\n scaledPresentationTimeOffset: segmentInfo.scaledPresentationTimeOffset,\n timeline: segmentInfo.timeline,\n mediaSegments: mediaSegments,\n };\n }\n\n /**\n * Checks whether a SegmentListInfo object is valid.\n *\n * @param {shaka.dash.DashParser.Context} context\n * @param {shaka.dash.SegmentList.SegmentListInfo} info\n * @private\n */\n static checkSegmentListInfo_(context, info) {\n if (!info.segmentDuration && !info.timeline &&\n info.mediaSegments.length > 1) {\n shaka.log.warning(\n 'SegmentList does not contain sufficient segment information:',\n 'the SegmentList specifies multiple segments,',\n 'but does not specify a segment duration or timeline.',\n context.representation);\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.DASH_NO_SEGMENT_INFO);\n }\n\n if (!info.segmentDuration && !context.periodInfo.duration &&\n !info.timeline && info.mediaSegments.length == 1) {\n shaka.log.warning(\n 'SegmentList does not contain sufficient segment information:',\n 'the SegmentList specifies one segment,',\n 'but does not specify a segment duration, period duration,',\n 'or timeline.',\n context.representation);\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.DASH_NO_SEGMENT_INFO);\n }\n\n if (info.timeline && info.timeline.length == 0) {\n shaka.log.warning(\n 'SegmentList does not contain sufficient segment information:',\n 'the SegmentList has an empty timeline.',\n context.representation);\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.DASH_NO_SEGMENT_INFO);\n }\n }\n\n /**\n * Creates an array of segment references for the given data.\n *\n * @param {number} periodStart in seconds.\n * @param {?number} periodDuration in seconds.\n * @param {number} startNumber\n * @param {function(): !Array<string>} getBaseUris\n * @param {shaka.dash.SegmentList.SegmentListInfo} info\n * @param {shaka.media.InitSegmentReference} initSegmentReference\n * @param {shaka.extern.aesKey|undefined} aesKey\n * @param {string} mimeType\n * @param {string} codecs\n * @param {number} bandwidth\n * @param {function():string} urlParams\n * @return {!Array<!shaka.media.SegmentReference>}\n * @private\n */\n static createSegmentReferences_(\n periodStart, periodDuration, startNumber, getBaseUris, info,\n initSegmentReference, aesKey, mimeType, codecs, bandwidth, urlParams) {\n const ManifestParserUtils = shaka.util.ManifestParserUtils;\n\n let max = info.mediaSegments.length;\n if (info.timeline && info.timeline.length != info.mediaSegments.length) {\n max = Math.min(info.timeline.length, info.mediaSegments.length);\n shaka.log.warning(\n 'The number of items in the segment timeline and the number of ',\n 'segment URLs do not match, truncating', info.mediaSegments.length,\n 'to', max);\n }\n\n const timestampOffset = periodStart - info.scaledPresentationTimeOffset;\n const appendWindowStart = periodStart;\n const appendWindowEnd = periodDuration ?\n periodStart + periodDuration : Infinity;\n\n /** @type {!Array<!shaka.media.SegmentReference>} */\n const references = [];\n let prevEndTime = info.startTime;\n for (let i = 0; i < max; i++) {\n const segment = info.mediaSegments[i];\n const startTime = prevEndTime;\n let endTime;\n\n if (info.segmentDuration != null) {\n endTime = startTime + info.segmentDuration;\n } else if (info.timeline) {\n // Ignore the timepoint start since they are continuous.\n endTime = info.timeline[i].end;\n } else {\n // If segmentDuration and timeline are null then there must\n // be exactly one segment.\n goog.asserts.assert(\n info.mediaSegments.length == 1 && periodDuration,\n 'There should be exactly one segment with a Period duration.');\n endTime = startTime + periodDuration;\n }\n\n let uris = null;\n const getUris = () => {\n if (uris == null) {\n uris = ManifestParserUtils.resolveUris(\n getBaseUris(), [segment.mediaUri], urlParams());\n }\n return uris;\n };\n\n const ref = new shaka.media.SegmentReference(\n periodStart + startTime,\n periodStart + endTime,\n getUris,\n segment.start,\n segment.end,\n initSegmentReference,\n timestampOffset,\n appendWindowStart, appendWindowEnd,\n /* partialReferences= */ [],\n /* tilesLayout= */ '',\n /* tileDuration= */ null,\n /* syncTime= */ null,\n shaka.media.SegmentReference.Status.AVAILABLE,\n aesKey);\n ref.codecs = codecs;\n ref.mimeType = mimeType;\n ref.bandwidth = bandwidth;\n references.push(ref);\n prevEndTime = endTime;\n }\n\n return references;\n }\n\n /**\n * Parses the media URIs from the context.\n *\n * @param {shaka.dash.DashParser.Context} context\n * @return {!Array<shaka.dash.SegmentList.MediaSegment>}\n * @private\n */\n static parseMediaSegments_(context) {\n const Functional = shaka.util.Functional;\n /** @type {!Array<!shaka.extern.xml.Node>} */\n const segmentLists = [\n context.representation.segmentList,\n context.adaptationSet.segmentList,\n context.period.segmentList,\n ].filter(Functional.isNotNull);\n\n const TXml = shaka.util.TXml;\n const StringUtils = shaka.util.StringUtils;\n // Search each SegmentList for one with at least one SegmentURL element,\n // select the first one, and convert each SegmentURL element to a tuple.\n return segmentLists\n .map((node) => { return TXml.findChildren(node, 'SegmentURL'); })\n .reduce((all, part) => { return all.length > 0 ? all : part; })\n .map((urlNode) => {\n if (urlNode.attributes['indexRange'] &&\n !context.indexRangeWarningGiven) {\n context.indexRangeWarningGiven = true;\n shaka.log.warning(\n 'We do not support the SegmentURL@indexRange attribute on ' +\n 'SegmentList. We only use the SegmentList@duration ' +\n 'attribute or SegmentTimeline, which must be accurate.');\n }\n\n const uri = StringUtils.htmlUnescape(urlNode.attributes['media']);\n const range = TXml.parseAttr(\n urlNode, 'mediaRange', TXml.parseRange,\n {start: 0, end: null});\n return {mediaUri: uri, start: range.start, end: range.end};\n });\n }\n};\n\n/**\n * @typedef {{\n * mediaUri: string,\n * start: number,\n * end: ?number\n * }}\n *\n * @property {string} mediaUri\n * The URI of the segment.\n * @property {number} start\n * The start byte of the segment.\n * @property {?number} end\n * The end byte of the segment, or null.\n */\nshaka.dash.SegmentList.MediaSegment;\n\n/**\n * @typedef {{\n * segmentDuration: ?number,\n * startTime: number,\n * startNumber: number,\n * scaledPresentationTimeOffset: number,\n * timeline: Array<shaka.media.PresentationTimeline.TimeRange>,\n * mediaSegments: !Array<shaka.dash.SegmentList.MediaSegment>\n * }}\n * @private\n *\n * @description\n * Contains information about a SegmentList.\n *\n * @property {?number} segmentDuration\n * The duration of the segments, if given.\n * @property {number} startTime\n * The start time of the first segment, in seconds.\n * @property {number} startNumber\n * The start number of the segments; 1 or greater.\n * @property {number} scaledPresentationTimeOffset\n * The scaledPresentationTimeOffset of the representation, in seconds.\n * @property {Array<shaka.media.PresentationTimeline.TimeRange>} timeline\n * The timeline of the representation, if given. Times in seconds.\n * @property {!Array<shaka.dash.SegmentList.MediaSegment>} mediaSegments\n * The URI and byte-ranges of the media segments.\n */\nshaka.dash.SegmentList.SegmentListInfo;\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.dash.SegmentTemplate');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.dash.MpdUtils');\ngoog.require('shaka.dash.SegmentBase');\ngoog.require('shaka.log');\ngoog.require('shaka.media.InitSegmentReference');\ngoog.require('shaka.media.SegmentIndex');\ngoog.require('shaka.media.SegmentReference');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.IReleasable');\ngoog.require('shaka.util.ManifestParserUtils');\ngoog.require('shaka.util.ObjectUtils');\ngoog.require('shaka.util.StringUtils');\ngoog.require('shaka.util.TXml');\ngoog.requireType('shaka.dash.DashParser');\ngoog.requireType('shaka.media.PresentationTimeline');\n\n\n/**\n * @summary A set of functions for parsing SegmentTemplate elements.\n */\nshaka.dash.SegmentTemplate = class {\n /**\n * Creates a new StreamInfo object.\n * Updates the existing SegmentIndex, if any.\n *\n * @param {shaka.dash.DashParser.Context} context\n * @param {shaka.dash.DashParser.RequestSegmentCallback} requestSegment\n * @param {!Map<string, !shaka.extern.Stream>} streamMap\n * @param {boolean} isUpdate True if the manifest is being updated.\n * @param {number} segmentLimit The maximum number of segments to generate for\n * a SegmentTemplate with fixed duration.\n * @param {!Map<string, number>} periodDurationMap\n * @param {shaka.extern.aesKey|undefined} aesKey\n * @param {?number} lastSegmentNumber\n * @param {boolean} isPatchUpdate\n * @return {shaka.dash.DashParser.StreamInfo}\n */\n static createStreamInfo(\n context, requestSegment, streamMap, isUpdate, segmentLimit,\n periodDurationMap, aesKey, lastSegmentNumber, isPatchUpdate) {\n goog.asserts.assert(context.representation.segmentTemplate,\n 'Should only be called with SegmentTemplate ' +\n 'or segment info defined');\n const MpdUtils = shaka.dash.MpdUtils;\n const SegmentTemplate = shaka.dash.SegmentTemplate;\n const TimelineSegmentIndex = shaka.dash.TimelineSegmentIndex;\n\n if (!isPatchUpdate && !context.representation.initialization) {\n context.representation.initialization =\n MpdUtils.inheritAttribute(\n context, SegmentTemplate.fromInheritance_, 'initialization');\n }\n\n const initSegmentReference = context.representation.initialization ?\n SegmentTemplate.createInitSegment_(context, aesKey) : null;\n\n /** @type {shaka.dash.SegmentTemplate.SegmentTemplateInfo} */\n const info = SegmentTemplate.parseSegmentTemplateInfo_(context);\n\n SegmentTemplate.checkSegmentTemplateInfo_(context, info);\n\n // Direct fields of context will be reassigned by the parser before\n // generateSegmentIndex is called. So we must make a shallow copy first,\n // and use that in the generateSegmentIndex callbacks.\n const shallowCopyOfContext =\n shaka.util.ObjectUtils.shallowCloneObject(context);\n\n if (info.indexTemplate) {\n shaka.dash.SegmentBase.checkSegmentIndexSupport(\n context, initSegmentReference);\n\n return {\n generateSegmentIndex: () => {\n return SegmentTemplate.generateSegmentIndexFromIndexTemplate_(\n shallowCopyOfContext, requestSegment, initSegmentReference,\n info);\n },\n };\n } else if (info.segmentDuration) {\n if (!isUpdate &&\n context.adaptationSet.contentType !== 'image' &&\n context.adaptationSet.contentType !== 'text') {\n const periodStart = context.periodInfo.start;\n const periodId = context.period.id;\n const initialPeriodDuration = context.periodInfo.duration;\n const periodDuration =\n (periodId != null && periodDurationMap.get(periodId)) ||\n initialPeriodDuration;\n const periodEnd = periodDuration ?\n (periodStart + periodDuration) : Infinity;\n\n context.presentationTimeline.notifyMaxSegmentDuration(\n info.segmentDuration);\n context.presentationTimeline.notifyPeriodDuration(\n periodStart, periodEnd);\n }\n\n return {\n generateSegmentIndex: () => {\n return SegmentTemplate.generateSegmentIndexFromDuration_(\n shallowCopyOfContext, info, segmentLimit, initSegmentReference,\n periodDurationMap, aesKey, lastSegmentNumber,\n context.representation.segmentSequenceCadence);\n },\n };\n } else {\n /** @type {shaka.media.SegmentIndex} */\n let segmentIndex = null;\n let id = null;\n let stream = null;\n if (context.period.id && context.representation.id) {\n // Only check/store the index if period and representation IDs are set.\n id = context.period.id + ',' + context.representation.id;\n stream = streamMap.get(id);\n if (stream) {\n segmentIndex = stream.segmentIndex;\n }\n }\n\n const periodStart = context.periodInfo.start;\n const periodEnd = context.periodInfo.duration ? periodStart +\n context.periodInfo.duration : Infinity;\n\n shaka.log.debug(`New manifest ${periodStart} - ${periodEnd}`);\n\n if (!segmentIndex) {\n shaka.log.debug(`Creating TSI with end ${periodEnd}`);\n segmentIndex = new TimelineSegmentIndex(\n info,\n context.representation.originalId,\n context.bandwidth,\n context.representation.getBaseUris,\n context.urlParams,\n periodStart,\n periodEnd,\n initSegmentReference,\n aesKey,\n context.representation.segmentSequenceCadence,\n );\n } else {\n const tsi = /** @type {!TimelineSegmentIndex} */(segmentIndex);\n tsi.appendTemplateInfo(\n info, periodStart, periodEnd, initSegmentReference);\n\n const availabilityStart =\n context.presentationTimeline.getSegmentAvailabilityStart();\n tsi.evict(availabilityStart);\n }\n\n if (info.timeline &&\n context.adaptationSet.contentType !== 'image' &&\n context.adaptationSet.contentType !== 'text') {\n const tsi = /** @type {!TimelineSegmentIndex} */(segmentIndex);\n // getTimeline is the info.timeline but fitted to the period.\n const timeline = tsi.getTimeline();\n context.presentationTimeline.notifyTimeRange(\n timeline,\n periodStart);\n }\n\n if (stream && context.dynamic) {\n stream.segmentIndex = segmentIndex;\n }\n\n return {\n generateSegmentIndex: () => {\n // If segmentIndex is deleted, or segmentIndex's references are\n // released by closeSegmentIndex(), we should set the value of\n // segmentIndex again.\n if (segmentIndex instanceof shaka.dash.TimelineSegmentIndex &&\n segmentIndex.isEmpty()) {\n segmentIndex.appendTemplateInfo(info, periodStart,\n periodEnd, initSegmentReference);\n }\n return Promise.resolve(segmentIndex);\n },\n };\n }\n }\n\n /**\n * Ingests Patch MPD segments into timeline.\n *\n * @param {!shaka.dash.DashParser.Context} context\n * @param {shaka.extern.xml.Node} patchNode\n */\n static modifyTimepoints(context, patchNode) {\n const MpdUtils = shaka.dash.MpdUtils;\n const SegmentTemplate = shaka.dash.SegmentTemplate;\n const TXml = shaka.util.TXml;\n\n const timelineNode = MpdUtils.inheritChild(context,\n SegmentTemplate.fromInheritance_, 'SegmentTimeline');\n goog.asserts.assert(timelineNode, 'timeline node not found');\n const timepoints = TXml.findChildren(timelineNode, 'S');\n\n goog.asserts.assert(timepoints, 'timepoints should exist');\n TXml.modifyNodes(timepoints, patchNode);\n timelineNode.children = timepoints;\n }\n\n /**\n * Removes all segments from timeline.\n *\n * @param {!shaka.dash.DashParser.Context} context\n */\n static removeTimepoints(context) {\n const MpdUtils = shaka.dash.MpdUtils;\n const SegmentTemplate = shaka.dash.SegmentTemplate;\n\n const timelineNode = MpdUtils.inheritChild(context,\n SegmentTemplate.fromInheritance_, 'SegmentTimeline');\n goog.asserts.assert(timelineNode, 'timeline node not found');\n timelineNode.children = [];\n }\n\n /**\n * @param {?shaka.dash.DashParser.InheritanceFrame} frame\n * @return {?shaka.extern.xml.Node}\n * @private\n */\n static fromInheritance_(frame) {\n return frame.segmentTemplate;\n }\n\n /**\n * Parses a SegmentTemplate element into an info object.\n *\n * @param {shaka.dash.DashParser.Context} context\n * @return {shaka.dash.SegmentTemplate.SegmentTemplateInfo}\n * @private\n */\n static parseSegmentTemplateInfo_(context) {\n const SegmentTemplate = shaka.dash.SegmentTemplate;\n const MpdUtils = shaka.dash.MpdUtils;\n const StringUtils = shaka.util.StringUtils;\n const segmentInfo =\n MpdUtils.parseSegmentInfo(context, SegmentTemplate.fromInheritance_);\n\n const media = MpdUtils.inheritAttribute(\n context, SegmentTemplate.fromInheritance_, 'media');\n\n const index = MpdUtils.inheritAttribute(\n context, SegmentTemplate.fromInheritance_, 'index');\n\n const k = MpdUtils.inheritAttribute(\n context, SegmentTemplate.fromInheritance_, 'k');\n\n let numChunks = 0;\n if (k) {\n numChunks = parseInt(k, 10);\n }\n\n return {\n unscaledSegmentDuration: segmentInfo.unscaledSegmentDuration,\n segmentDuration: segmentInfo.segmentDuration,\n timescale: segmentInfo.timescale,\n startNumber: segmentInfo.startNumber,\n scaledPresentationTimeOffset: segmentInfo.scaledPresentationTimeOffset,\n unscaledPresentationTimeOffset:\n segmentInfo.unscaledPresentationTimeOffset,\n timeline: segmentInfo.timeline,\n mediaTemplate: media && StringUtils.htmlUnescape(media),\n indexTemplate: index,\n mimeType: context.representation.mimeType,\n codecs: context.representation.codecs,\n bandwidth: context.bandwidth,\n numChunks: numChunks,\n };\n }\n\n /**\n * Verifies a SegmentTemplate info object.\n *\n * @param {shaka.dash.DashParser.Context} context\n * @param {shaka.dash.SegmentTemplate.SegmentTemplateInfo} info\n * @private\n */\n static checkSegmentTemplateInfo_(context, info) {\n let n = 0;\n n += info.indexTemplate ? 1 : 0;\n n += info.timeline ? 1 : 0;\n n += info.segmentDuration ? 1 : 0;\n\n if (n == 0) {\n shaka.log.error(\n 'SegmentTemplate does not contain any segment information:',\n 'the SegmentTemplate must contain either an index URL template',\n 'a SegmentTimeline, or a segment duration.',\n context.representation);\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.DASH_NO_SEGMENT_INFO);\n } else if (n != 1) {\n shaka.log.warning(\n 'SegmentTemplate contains multiple segment information sources:',\n 'the SegmentTemplate should only contain an index URL template,',\n 'a SegmentTimeline or a segment duration.',\n context.representation);\n if (info.indexTemplate) {\n shaka.log.info('Using the index URL template by default.');\n info.timeline = null;\n info.unscaledSegmentDuration = null;\n info.segmentDuration = null;\n } else {\n goog.asserts.assert(info.timeline, 'There should be a timeline');\n shaka.log.info('Using the SegmentTimeline by default.');\n info.unscaledSegmentDuration = null;\n info.segmentDuration = null;\n }\n }\n\n if (!info.indexTemplate && !info.mediaTemplate) {\n shaka.log.error(\n 'SegmentTemplate does not contain sufficient segment information:',\n 'the SegmentTemplate\\'s media URL template is missing.',\n context.representation);\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.DASH_NO_SEGMENT_INFO);\n }\n }\n\n /**\n * Generates a SegmentIndex from an index URL template.\n *\n * @param {shaka.dash.DashParser.Context} context\n * @param {shaka.dash.DashParser.RequestSegmentCallback} requestSegment\n * @param {shaka.media.InitSegmentReference} init\n * @param {shaka.dash.SegmentTemplate.SegmentTemplateInfo} info\n * @return {!Promise<shaka.media.SegmentIndex>}\n * @private\n */\n static generateSegmentIndexFromIndexTemplate_(\n context, requestSegment, init, info) {\n const MpdUtils = shaka.dash.MpdUtils;\n const ManifestParserUtils = shaka.util.ManifestParserUtils;\n\n goog.asserts.assert(info.indexTemplate, 'must be using index template');\n const filledTemplate = MpdUtils.fillUriTemplate(\n info.indexTemplate, context.representation.originalId,\n null, null, context.bandwidth || null, null);\n\n const resolvedUris = ManifestParserUtils.resolveUris(\n context.representation.getBaseUris(), [filledTemplate]);\n\n return shaka.dash.SegmentBase.generateSegmentIndexFromUris(\n context, requestSegment, init, resolvedUris, 0, null,\n info.scaledPresentationTimeOffset);\n }\n\n /**\n * Generates a SegmentIndex from fixed-duration segments.\n *\n * @param {shaka.dash.DashParser.Context} context\n * @param {shaka.dash.SegmentTemplate.SegmentTemplateInfo} info\n * @param {number} segmentLimit The maximum number of segments to generate.\n * @param {shaka.media.InitSegmentReference} initSegmentReference\n * @param {!Map<string, number>} periodDurationMap\n * @param {shaka.extern.aesKey|undefined} aesKey\n * @param {?number} lastSegmentNumber\n * @param {number} segmentSequenceCadence\n * @return {!Promise<shaka.media.SegmentIndex>}\n * @private\n */\n static generateSegmentIndexFromDuration_(\n context, info, segmentLimit, initSegmentReference, periodDurationMap,\n aesKey, lastSegmentNumber, segmentSequenceCadence) {\n goog.asserts.assert(info.mediaTemplate,\n 'There should be a media template with duration');\n\n const MpdUtils = shaka.dash.MpdUtils;\n const ManifestParserUtils = shaka.util.ManifestParserUtils;\n\n const presentationTimeline = context.presentationTimeline;\n\n // Capture values that could change as the parsing context moves on to\n // other parts of the manifest.\n const periodStart = context.periodInfo.start;\n const periodId = context.period.id;\n const initialPeriodDuration = context.periodInfo.duration;\n\n // For multi-period live streams the period duration may not be known until\n // the following period appears in an updated manifest. periodDurationMap\n // provides the updated period duration.\n const getPeriodEnd = () => {\n const periodDuration =\n (periodId != null && periodDurationMap.get(periodId)) ||\n initialPeriodDuration;\n const periodEnd = periodDuration ?\n (periodStart + periodDuration) : Infinity;\n return periodEnd;\n };\n\n const segmentDuration = info.segmentDuration;\n goog.asserts.assert(\n segmentDuration != null, 'Segment duration must not be null!');\n\n const startNumber = info.startNumber;\n\n const template = info.mediaTemplate;\n const bandwidth = context.bandwidth || null;\n const id = context.representation.id;\n const getBaseUris = context.representation.getBaseUris;\n const urlParams = context.urlParams;\n\n const timestampOffset = periodStart - info.scaledPresentationTimeOffset;\n\n // Computes the range of presentation timestamps both within the period and\n // available. This is an intersection of the period range and the\n // availability window.\n const computeAvailablePeriodRange = () => {\n return [\n Math.max(\n presentationTimeline.getSegmentAvailabilityStart(),\n periodStart),\n\n Math.min(\n presentationTimeline.getSegmentAvailabilityEnd(),\n getPeriodEnd()),\n ];\n };\n\n // Computes the range of absolute positions both within the period and\n // available. The range is inclusive. These are the positions for which we\n // will generate segment references.\n const computeAvailablePositionRange = () => {\n // In presentation timestamps.\n const availablePresentationTimes = computeAvailablePeriodRange();\n goog.asserts.assert(availablePresentationTimes.every(isFinite),\n 'Available presentation times must be finite!');\n goog.asserts.assert(availablePresentationTimes.every((x) => x >= 0),\n 'Available presentation times must be positive!');\n goog.asserts.assert(segmentDuration != null,\n 'Segment duration must not be null!');\n\n // In period-relative timestamps.\n const availablePeriodTimes =\n availablePresentationTimes.map((x) => x - periodStart);\n // These may sometimes be reversed ([1] <= [0]) if the period is\n // completely unavailable. The logic will still work if this happens,\n // because we will simply generate no references.\n\n // In period-relative positions (0-based).\n const availablePeriodPositions = [\n Math.ceil(availablePeriodTimes[0] / segmentDuration),\n Math.ceil(availablePeriodTimes[1] / segmentDuration) - 1,\n ];\n\n // For Low Latency we can request the partial current position.\n if (context.representation.availabilityTimeOffset) {\n availablePeriodPositions[1]++;\n }\n\n // In absolute positions.\n const availablePresentationPositions =\n availablePeriodPositions.map((x) => x + startNumber);\n return availablePresentationPositions;\n };\n\n // For Live, we must limit the initial SegmentIndex in size, to avoid\n // consuming too much CPU or memory for content with gigantic\n // timeShiftBufferDepth (which can have values up to and including\n // Infinity).\n const range = computeAvailablePositionRange();\n const minPosition = context.dynamic ?\n Math.max(range[0], range[1] - segmentLimit + 1) :\n range[0];\n const maxPosition = lastSegmentNumber || range[1];\n\n const references = [];\n const createReference = (position) => {\n // These inner variables are all scoped to the inner loop, and can be used\n // safely in the callback below.\n\n goog.asserts.assert(segmentDuration != null,\n 'Segment duration must not be null!');\n\n // Relative to the period start.\n const positionWithinPeriod = position - startNumber;\n const segmentPeriodTime = positionWithinPeriod * segmentDuration;\n\n const unscaledSegmentDuration = info.unscaledSegmentDuration;\n goog.asserts.assert(unscaledSegmentDuration != null,\n 'Segment duration must not be null!');\n\n // The original media timestamp from the timeline is what is expected in\n // the $Time$ template. (Or based on duration, in this case.) It should\n // not be adjusted with presentationTimeOffset or the Period start.\n let timeReplacement = positionWithinPeriod * unscaledSegmentDuration;\n if ('BigInt' in window && timeReplacement > Number.MAX_SAFE_INTEGER) {\n timeReplacement =\n BigInt(positionWithinPeriod) * BigInt(unscaledSegmentDuration);\n }\n\n // Relative to the presentation.\n const segmentStart = segmentPeriodTime + periodStart;\n const trueSegmentEnd = segmentStart + segmentDuration;\n // Cap the segment end at the period end so that references from the\n // next period will fit neatly after it.\n const segmentEnd = Math.min(trueSegmentEnd, getPeriodEnd());\n\n // This condition will be true unless the segmentStart was >= periodEnd.\n // If we've done the position calculations correctly, this won't happen.\n goog.asserts.assert(segmentStart < segmentEnd,\n 'Generated a segment outside of the period!');\n\n const partialSegmentRefs = [];\n\n const numChunks = info.numChunks;\n if (numChunks) {\n const partialDuration = (segmentEnd - segmentStart) / numChunks;\n\n for (let i = 0; i < numChunks; i++) {\n const start = segmentStart + partialDuration * i;\n const end = start + partialDuration;\n const subNumber = i + 1;\n const getPartialUris = () => {\n const mediaUri = MpdUtils.fillUriTemplate(\n template, id, position, subNumber, bandwidth, timeReplacement);\n return ManifestParserUtils.resolveUris(\n getBaseUris(), [mediaUri], urlParams());\n };\n const partial = new shaka.media.SegmentReference(\n start,\n end,\n getPartialUris,\n /* startByte= */ 0,\n /* endByte= */ null,\n initSegmentReference,\n timestampOffset,\n /* appendWindowStart= */ periodStart,\n /* appendWindowEnd= */ getPeriodEnd(),\n /* partialReferences= */ [],\n /* tilesLayout= */ '',\n /* tileDuration= */ null,\n /* syncTime= */ null,\n shaka.media.SegmentReference.Status.AVAILABLE,\n aesKey);\n partial.codecs = context.representation.codecs;\n partial.mimeType = context.representation.mimeType;\n if (segmentSequenceCadence == 0) {\n if (i > 0) {\n partial.markAsNonIndependent();\n }\n } else if ((i % segmentSequenceCadence) != 0) {\n partial.markAsNonIndependent();\n }\n partialSegmentRefs.push(partial);\n }\n }\n\n const getUris = () => {\n if (numChunks) {\n return [];\n }\n const mediaUri = MpdUtils.fillUriTemplate(\n template, id, position, /* subNumber= */ null, bandwidth,\n timeReplacement);\n return ManifestParserUtils.resolveUris(\n getBaseUris(), [mediaUri], urlParams());\n };\n\n const ref = new shaka.media.SegmentReference(\n segmentStart,\n segmentEnd,\n getUris,\n /* startByte= */ 0,\n /* endByte= */ null,\n initSegmentReference,\n timestampOffset,\n /* appendWindowStart= */ periodStart,\n /* appendWindowEnd= */ getPeriodEnd(),\n partialSegmentRefs,\n /* tilesLayout= */ '',\n /* tileDuration= */ null,\n /* syncTime= */ null,\n shaka.media.SegmentReference.Status.AVAILABLE,\n aesKey,\n partialSegmentRefs.length > 0);\n ref.codecs = context.representation.codecs;\n ref.mimeType = context.representation.mimeType;\n ref.bandwidth = context.bandwidth;\n // This is necessary information for thumbnail streams:\n ref.trueEndTime = trueSegmentEnd;\n return ref;\n };\n\n for (let position = minPosition; position <= maxPosition; ++position) {\n const reference = createReference(position);\n references.push(reference);\n }\n\n /** @type {shaka.media.SegmentIndex} */\n const segmentIndex = new shaka.media.SegmentIndex(references);\n\n // If the availability timeline currently ends before the period, we will\n // need to add references over time.\n const willNeedToAddReferences =\n presentationTimeline.getSegmentAvailabilityEnd() < getPeriodEnd();\n\n // When we start a live stream with a period that ends within the\n // availability window we will not need to add more references, but we will\n // need to evict old references.\n const willNeedToEvictReferences = presentationTimeline.isLive();\n\n if (willNeedToAddReferences || willNeedToEvictReferences) {\n // The period continues to get longer over time, so check for new\n // references once every |segmentDuration| seconds.\n // We clamp to |minPosition| in case the initial range was reversed and no\n // references were generated. Otherwise, the update would start creating\n // negative positions for segments in periods which begin in the future.\n let nextPosition = Math.max(minPosition, maxPosition + 1);\n let updateTime = segmentDuration;\n // For low latency we need to evict very frequently.\n if (context.representation.availabilityTimeOffset) {\n updateTime = 0.1;\n }\n segmentIndex.updateEvery(updateTime, () => {\n // Evict any references outside the window.\n const availabilityStartTime =\n presentationTimeline.getSegmentAvailabilityStart();\n segmentIndex.evict(availabilityStartTime);\n\n // Compute any new references that need to be added.\n const [_, maxPosition] = computeAvailablePositionRange();\n const references = [];\n while (nextPosition <= maxPosition) {\n const reference = createReference(nextPosition);\n references.push(reference);\n nextPosition++;\n }\n\n // The timer must continue firing until the entire period is\n // unavailable, so that all references will be evicted.\n if (availabilityStartTime > getPeriodEnd() && !references.length) {\n // Signal stop.\n return null;\n }\n return references;\n });\n }\n\n return Promise.resolve(segmentIndex);\n }\n\n /**\n * Creates an init segment reference from a context object.\n *\n * @param {shaka.dash.DashParser.Context} context\n * @param {shaka.extern.aesKey|undefined} aesKey\n * @return {shaka.media.InitSegmentReference}\n * @private\n */\n static createInitSegment_(context, aesKey) {\n const MpdUtils = shaka.dash.MpdUtils;\n const ManifestParserUtils = shaka.util.ManifestParserUtils;\n const SegmentTemplate = shaka.dash.SegmentTemplate;\n\n let initialization = context.representation.initialization;\n if (!initialization) {\n initialization = MpdUtils.inheritAttribute(\n context, SegmentTemplate.fromInheritance_, 'initialization');\n }\n if (!initialization) {\n return null;\n }\n initialization = shaka.util.StringUtils.htmlUnescape(initialization);\n\n const repId = context.representation.originalId;\n const bandwidth = context.bandwidth || null;\n const getBaseUris = context.representation.getBaseUris;\n const urlParams = context.urlParams;\n const getUris = () => {\n goog.asserts.assert(initialization, 'Should have returned earlier');\n const filledTemplate = MpdUtils.fillUriTemplate(\n initialization, repId, null, null, bandwidth, null);\n const resolvedUris = ManifestParserUtils.resolveUris(\n getBaseUris(), [filledTemplate], urlParams());\n return resolvedUris;\n };\n const qualityInfo = shaka.dash.SegmentBase.createQualityInfo(context);\n const encrypted = context.adaptationSet.encrypted;\n const ref = new shaka.media.InitSegmentReference(\n getUris,\n /* startByte= */ 0,\n /* endByte= */ null,\n qualityInfo,\n /* timescale= */ null,\n /* segmentData= */ null,\n aesKey,\n encrypted);\n ref.codecs = context.representation.codecs;\n ref.mimeType = context.representation.mimeType;\n if (context.periodInfo) {\n ref.boundaryEnd = context.periodInfo.start + context.periodInfo.duration;\n }\n return ref;\n }\n};\n\n\n/**\n * A SegmentIndex that returns segments references on demand from\n * a segment timeline.\n *\n * @extends shaka.media.SegmentIndex\n * @implements {shaka.util.IReleasable}\n * @implements {Iterable<!shaka.media.SegmentReference>}\n *\n * @private\n *\n */\nshaka.dash.TimelineSegmentIndex = class extends shaka.media.SegmentIndex {\n /**\n *\n * @param {!shaka.dash.SegmentTemplate.SegmentTemplateInfo} templateInfo\n * @param {?string} representationId\n * @param {number} bandwidth\n * @param {function(): Array<string>} getBaseUris\n * @param {function():string} urlParams\n * @param {number} periodStart\n * @param {number} periodEnd\n * @param {shaka.media.InitSegmentReference} initSegmentReference\n * @param {shaka.extern.aesKey|undefined} aesKey\n * @param {number} segmentSequenceCadence\n */\n constructor(templateInfo, representationId, bandwidth, getBaseUris,\n urlParams, periodStart, periodEnd, initSegmentReference,\n aesKey, segmentSequenceCadence) {\n super([]);\n\n /** @private {?shaka.dash.SegmentTemplate.SegmentTemplateInfo} */\n this.templateInfo_ = templateInfo;\n\n /** @private {?string} */\n this.representationId_ = representationId;\n\n /** @private {number} */\n this.bandwidth_ = bandwidth;\n\n /** @private {function(): Array<string>} */\n this.getBaseUris_ = getBaseUris;\n\n /** @private {function():string} */\n this.urlParams_ = urlParams;\n\n /** @private {number} */\n this.periodStart_ = periodStart;\n\n /** @private {number} */\n this.periodEnd_ = periodEnd;\n\n /** @private {shaka.media.InitSegmentReference} */\n this.initSegmentReference_ = initSegmentReference;\n\n /** @private {shaka.extern.aesKey|undefined} */\n this.aesKey_ = aesKey;\n\n /** @private {number} */\n this.segmentSequenceCadence_ = segmentSequenceCadence;\n\n this.fitTimeline();\n }\n\n /**\n * @override\n */\n getNumReferences() {\n if (this.templateInfo_) {\n return this.templateInfo_.timeline.length;\n } else {\n return 0;\n }\n }\n\n /**\n * @override\n */\n release() {\n super.release();\n this.templateInfo_ = null;\n // We cannot release other fields, as segment index can\n // be recreated using only template info.\n }\n\n\n /**\n * @override\n */\n evict(time) {\n if (!this.templateInfo_) {\n return;\n }\n shaka.log.debug(`${this.representationId_} Evicting at ${time}`);\n let numToEvict = 0;\n const timeline = this.templateInfo_.timeline;\n\n for (let i = 0; i < timeline.length; i += 1) {\n const range = timeline[i];\n const end = range.end + this.periodStart_;\n const start = range.start + this.periodStart_;\n\n if (end <= time) {\n shaka.log.debug(`Evicting ${start} - ${end}`);\n numToEvict += 1;\n } else {\n break;\n }\n }\n\n if (numToEvict > 0) {\n this.templateInfo_.timeline = timeline.slice(numToEvict);\n if (this.references.length >= numToEvict) {\n this.references = this.references.slice(numToEvict);\n }\n\n this.numEvicted_ += numToEvict;\n\n if (this.getNumReferences() === 0) {\n this.release();\n }\n }\n }\n\n /**\n * Merge new template info\n * @param {shaka.dash.SegmentTemplate.SegmentTemplateInfo} info\n * @param {number} periodStart\n * @param {number} periodEnd\n * @param {shaka.media.InitSegmentReference} initSegmentReference\n */\n appendTemplateInfo(info, periodStart, periodEnd, initSegmentReference) {\n this.updateInitSegmentReference(initSegmentReference);\n if (!this.templateInfo_) {\n this.templateInfo_ = info;\n this.periodStart_ = periodStart;\n this.periodEnd_ = periodEnd;\n } else {\n const currentTimeline = this.templateInfo_.timeline;\n\n if (this.templateInfo_.mediaTemplate !== info.mediaTemplate) {\n this.templateInfo_.mediaTemplate = info.mediaTemplate;\n }\n\n // Append timeline\n let newEntries;\n if (currentTimeline.length) {\n const lastCurrentEntry = currentTimeline[currentTimeline.length - 1];\n newEntries = info.timeline.filter((entry) => {\n return entry.end > lastCurrentEntry.end;\n });\n } else {\n newEntries = info.timeline.slice();\n }\n\n if (newEntries.length > 0) {\n shaka.log.debug(`Appending ${newEntries.length} entries`);\n this.templateInfo_.timeline.push(...newEntries);\n }\n\n if (this.periodEnd_ !== periodEnd) {\n this.periodEnd_ = periodEnd;\n }\n }\n\n this.fitTimeline();\n }\n\n /**\n * Updates the init segment reference and propagates the update to all\n * references.\n * @param {shaka.media.InitSegmentReference} initSegmentReference\n */\n updateInitSegmentReference(initSegmentReference) {\n if (this.initSegmentReference_ === initSegmentReference) {\n return;\n }\n\n this.initSegmentReference_ = initSegmentReference;\n for (const reference of this.references) {\n if (reference) {\n reference.updateInitSegmentReference(initSegmentReference);\n }\n }\n }\n\n /**\n *\n * @param {number} time\n */\n isBeforeFirstEntry(time) {\n const hasTimeline = this.templateInfo_ &&\n this.templateInfo_.timeline && this.templateInfo_.timeline.length;\n\n if (hasTimeline) {\n const timeline = this.templateInfo_.timeline;\n return time < timeline[0].start + this.periodStart_;\n } else {\n return false;\n }\n }\n\n /**\n * Fit timeline entries to period boundaries\n */\n fitTimeline() {\n if (!this.templateInfo_ || this.getIsImmutable()) {\n return;\n }\n const timeline = this.templateInfo_.timeline;\n goog.asserts.assert(timeline, 'Timeline should be non-null!');\n const newTimeline = [];\n for (const range of timeline) {\n if (range.start >= this.periodEnd_) {\n // Starts after end of period.\n } else if (range.end <= 0) {\n // Ends before start of period.\n } else {\n // Usable.\n newTimeline.push(range);\n }\n }\n this.templateInfo_.timeline = newTimeline;\n\n this.evict(this.periodStart_);\n\n // Do NOT adjust last range to match period end! With high precision\n // timestamps several recalculations may give wrong results on less precise\n // platforms. To mitigate that, we're using cached |periodEnd_| value in\n // find/get() methods whenever possible.\n }\n\n /**\n * Get the current timeline\n * @return {!Array<shaka.media.PresentationTimeline.TimeRange>}\n */\n getTimeline() {\n if (!this.templateInfo_) {\n return [];\n }\n const timeline = this.templateInfo_.timeline;\n goog.asserts.assert(timeline, 'Timeline should be non-null!');\n return timeline;\n }\n\n /**\n * @override\n */\n find(time) {\n shaka.log.debug(`Find ${time}`);\n\n if (this.isBeforeFirstEntry(time)) {\n return this.numEvicted_;\n }\n\n if (!this.templateInfo_) {\n return null;\n }\n\n const timeline = this.templateInfo_.timeline;\n\n // Early exit if the time isn't within this period\n if (time < this.periodStart_ || time >= this.periodEnd_) {\n return null;\n }\n\n const lastIndex = timeline.length - 1;\n\n for (let i = 0; i < timeline.length; i++) {\n const range = timeline[i];\n const start = range.start + this.periodStart_;\n // A rounding error can cause /time/ to equal e.endTime or fall in between\n // the references by a fraction of a second. To account for this, we use\n // the start of the next segment as /end/, unless this is the last\n // reference, in which case we use the period end as the /end/\n let end;\n\n if (i < lastIndex) {\n end = timeline[i + 1].start + this.periodStart_;\n } else if (this.periodEnd_ === Infinity) {\n end = range.end + this.periodStart_;\n } else {\n end = this.periodEnd_;\n }\n\n if ((time >= start) && (time < end)) {\n return i + this.numEvicted_;\n }\n }\n\n return null;\n }\n\n /**\n * @override\n */\n get(position) {\n const correctedPosition = position - this.numEvicted_;\n if (correctedPosition < 0 ||\n correctedPosition >= this.getNumReferences() || !this.templateInfo_) {\n return null;\n }\n\n let ref = this.references[correctedPosition];\n\n if (!ref) {\n const range = this.templateInfo_.timeline[correctedPosition];\n const segmentReplacement = range.segmentPosition;\n\n // The original media timestamp from the timeline is what is expected in\n // the $Time$ template. It should not be adjusted with\n // presentationTimeOffset or the Period start, but\n // unscaledPresentationTimeOffset was already subtracted from the times\n // in timeline.\n const timeReplacement = range.unscaledStart +\n this.templateInfo_.unscaledPresentationTimeOffset;\n\n const timestampOffset = this.periodStart_ -\n this.templateInfo_.scaledPresentationTimeOffset;\n const trueSegmentEnd = this.periodStart_ + range.end;\n let segmentEnd = trueSegmentEnd;\n if (correctedPosition === this.getNumReferences() - 1 &&\n this.periodEnd_ !== Infinity) {\n segmentEnd = this.periodEnd_;\n }\n const codecs = this.templateInfo_.codecs;\n const mimeType = this.templateInfo_.mimeType;\n const bandwidth = this.templateInfo_.bandwidth;\n\n const partialSegmentRefs = [];\n\n const partialDuration = (range.end - range.start) / range.partialSegments;\n\n for (let i = 0; i < range.partialSegments; i++) {\n const start = range.start + partialDuration * i;\n const end = start + partialDuration;\n const subNumber = i + 1;\n let uris = null;\n const getPartialUris = () => {\n if (!this.templateInfo_) {\n return [];\n }\n if (uris == null) {\n uris = shaka.dash.TimelineSegmentIndex.createUris_(\n this.templateInfo_.mediaTemplate,\n this.representationId_,\n segmentReplacement,\n this.bandwidth_,\n timeReplacement,\n subNumber,\n this.getBaseUris_,\n this.urlParams_);\n }\n return uris;\n };\n const partial = new shaka.media.SegmentReference(\n this.periodStart_ + start,\n this.periodStart_ + end,\n getPartialUris,\n /* startByte= */ 0,\n /* endByte= */ null,\n this.initSegmentReference_,\n timestampOffset,\n this.periodStart_,\n this.periodEnd_,\n /* partialReferences= */ [],\n /* tilesLayout= */ '',\n /* tileDuration= */ null,\n /* syncTime= */ null,\n shaka.media.SegmentReference.Status.AVAILABLE,\n this.aesKey_);\n partial.codecs = codecs;\n partial.mimeType = mimeType;\n partial.bandwidth = bandwidth;\n if (this.segmentSequenceCadence_ == 0) {\n if (i > 0) {\n partial.markAsNonIndependent();\n }\n } else if ((i % this.segmentSequenceCadence_) != 0) {\n partial.markAsNonIndependent();\n }\n partialSegmentRefs.push(partial);\n }\n\n const createUrisCb = () => {\n if (range.partialSegments > 0 || !this.templateInfo_) {\n return [];\n }\n return shaka.dash.TimelineSegmentIndex\n .createUris_(\n this.templateInfo_.mediaTemplate,\n this.representationId_,\n segmentReplacement,\n this.bandwidth_,\n timeReplacement,\n /* subNumber= */ null,\n this.getBaseUris_,\n this.urlParams_,\n );\n };\n\n ref = new shaka.media.SegmentReference(\n this.periodStart_ + range.start,\n segmentEnd,\n createUrisCb,\n /* startByte= */ 0,\n /* endByte= */ null,\n this.initSegmentReference_,\n timestampOffset,\n this.periodStart_,\n this.periodEnd_,\n partialSegmentRefs,\n /* tilesLayout= */ '',\n /* tileDuration= */ null,\n /* syncTime= */ null,\n shaka.media.SegmentReference.Status.AVAILABLE,\n this.aesKey_,\n /* allPartialSegments= */ range.partialSegments > 0);\n ref.codecs = codecs;\n ref.mimeType = mimeType;\n ref.trueEndTime = trueSegmentEnd;\n ref.bandwidth = bandwidth;\n this.references[correctedPosition] = ref;\n }\n\n return ref;\n }\n\n /**\n * @override\n */\n forEachTopLevelReference(fn) {\n this.fitTimeline();\n for (let i = 0; i < this.getNumReferences(); i++) {\n const reference = this.get(i + this.numEvicted_);\n if (reference) {\n fn(reference);\n }\n }\n }\n\n /**\n * Fill in a specific template with values to get the segment uris\n *\n * @return {!Array<string>}\n * @private\n */\n static createUris_(mediaTemplate, repId, segmentReplacement,\n bandwidth, timeReplacement, subNumber, getBaseUris, urlParams) {\n const mediaUri = shaka.dash.MpdUtils.fillUriTemplate(\n mediaTemplate, repId,\n segmentReplacement, subNumber, bandwidth || null, timeReplacement);\n return shaka.util.ManifestParserUtils\n .resolveUris(getBaseUris(), [mediaUri], urlParams())\n .map((g) => {\n return g.toString();\n });\n }\n};\n\n/**\n * @typedef {{\n * timescale: number,\n * unscaledSegmentDuration: ?number,\n * segmentDuration: ?number,\n * startNumber: number,\n * scaledPresentationTimeOffset: number,\n * unscaledPresentationTimeOffset: number,\n * timeline: Array<shaka.media.PresentationTimeline.TimeRange>,\n * mediaTemplate: ?string,\n * indexTemplate: ?string,\n * mimeType: string,\n * codecs: string,\n * bandwidth: number,\n * numChunks: number\n * }}\n *\n * @description\n * Contains information about a SegmentTemplate.\n *\n * @property {number} timescale\n * The time-scale of the representation.\n * @property {?number} unscaledSegmentDuration\n * The duration of the segments in seconds, in timescale units.\n * @property {?number} segmentDuration\n * The duration of the segments in seconds, if given.\n * @property {number} startNumber\n * The start number of the segments; 1 or greater.\n * @property {number} scaledPresentationTimeOffset\n * The presentation time offset of the representation, in seconds.\n * @property {number} unscaledPresentationTimeOffset\n * The presentation time offset of the representation, in timescale units.\n * @property {Array<shaka.media.PresentationTimeline.TimeRange>} timeline\n * The timeline of the representation, if given. Times in seconds.\n * @property {?string} mediaTemplate\n * The media URI template, if given.\n * @property {?string} indexTemplate\n * The index URI template, if given.\n * @property {string} mimeType\n * The mimeType.\n * @property {string} codecs\n * The codecs.\n * @property {number} bandwidth\n * The bandwidth.\n * @property {number} numChunks\n * The number of chunks in each segment.\n */\nshaka.dash.SegmentTemplate.SegmentTemplateInfo;\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.ContentSteeringManager');\n\ngoog.require('goog.Uri');\ngoog.require('shaka.media.ManifestParser');\ngoog.require('shaka.net.NetworkingEngine');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.IDestroyable');\ngoog.require('shaka.util.ManifestParserUtils');\ngoog.require('shaka.util.OperationManager');\ngoog.require('shaka.util.StringUtils');\ngoog.require('shaka.util.Timer');\n\n\n/**\n * Create a Content Steering manager.\n *\n * @implements {shaka.util.IDestroyable}\n */\nshaka.util.ContentSteeringManager = class {\n /**\n * @param {shaka.extern.ManifestParser.PlayerInterface} playerInterface\n */\n constructor(playerInterface) {\n /** @private {?shaka.extern.ManifestConfiguration} */\n this.config_ = null;\n\n /** @private {?shaka.extern.ManifestParser.PlayerInterface} */\n this.playerInterface_ = playerInterface;\n\n /** @private {!shaka.util.OperationManager} */\n this.operationManager_ = new shaka.util.OperationManager();\n\n /** @private {!Array<string>} */\n this.baseUris_ = [];\n\n /** @private {?string} */\n this.defaultPathwayId_ = null;\n\n /** @private {!Array<string>} */\n this.pathwayPriority_ = [];\n\n /** @private {?string} */\n this.lastPathwayUsed_ = null;\n\n /** @private {!Array<shaka.util.ContentSteeringManager.PathwayClone>} */\n this.pathwayClones_ = [];\n\n /**\n * Default to 5 minutes. Value in seconds.\n *\n * @private {number}\n */\n this.lastTTL_ = 300;\n\n /** @private {!Map<(string | number), !Map<string, string>>} */\n this.locations_ = new Map();\n\n /** @private {!Map<string, number>} */\n this.bannedLocations_ = new Map();\n\n /** @private {?shaka.util.Timer} */\n this.updateTimer_ = null;\n\n /** @private {string} */\n this.manifestType_ = shaka.media.ManifestParser.UNKNOWN;\n }\n\n /**\n * @param {shaka.extern.ManifestConfiguration} config\n */\n configure(config) {\n this.config_ = config;\n }\n\n\n /** @override */\n destroy() {\n this.config_ = null;\n this.playerInterface_ = null;\n this.baseUris_ = [];\n this.defaultPathwayId_ = null;\n this.pathwayPriority_ = [];\n this.pathwayClones_ = [];\n this.locations_.clear();\n\n if (this.updateTimer_ != null) {\n this.updateTimer_.stop();\n this.updateTimer_ = null;\n }\n\n return this.operationManager_.destroy();\n }\n\n /**\n * @param {string} manifestType\n */\n setManifestType(manifestType) {\n this.manifestType_ = manifestType;\n }\n\n /**\n * @param {!Array<string>} baseUris\n */\n setBaseUris(baseUris) {\n this.baseUris_ = baseUris;\n }\n\n /**\n * @param {?string} defaultPathwayId\n */\n setDefaultPathwayId(defaultPathwayId) {\n this.defaultPathwayId_ = defaultPathwayId;\n }\n\n /**\n * Request the Content Steering info.\n *\n * @param {string} uri\n * @return {!Promise}\n */\n async requestInfo(uri) {\n const uris = shaka.util.ManifestParserUtils.resolveUris(\n this.baseUris_, [this.addQueryParams_(uri)]);\n const type = shaka.net.NetworkingEngine.RequestType.CONTENT_STEERING;\n const request = shaka.net.NetworkingEngine.makeRequest(\n uris, this.config_.retryParameters);\n\n const op = this.playerInterface_.networkingEngine.request(type, request);\n this.operationManager_.manage(op);\n try {\n const response = await op.promise;\n const str = shaka.util.StringUtils.fromUTF8(response.data);\n const steeringManifest =\n /** @type {shaka.util.ContentSteeringManager.SteeringManifest} */\n (JSON.parse(str));\n if (steeringManifest.VERSION == 1) {\n this.processManifest_(steeringManifest, response.uri);\n }\n } catch (e) {\n if (e && e.code == shaka.util.Error.Code.OPERATION_ABORTED) {\n return;\n }\n if (this.updateTimer_ != null) {\n this.updateTimer_.stop();\n this.updateTimer_ = null;\n }\n this.updateTimer_ = new shaka.util.Timer(() => {\n this.requestInfo(uri);\n });\n this.updateTimer_.tickAfter(this.lastTTL_);\n }\n }\n\n /** @private */\n addQueryParams_(uri) {\n if (!this.pathwayPriority_.length) {\n return uri;\n }\n const finalUri = new goog.Uri(uri);\n const currentPathwayID = this.lastPathwayUsed_ || this.pathwayPriority_[0];\n const currentBandwidth =\n Math.round(this.playerInterface_.getBandwidthEstimate());\n const queryData = finalUri.getQueryData();\n if (this.manifestType_ == shaka.media.ManifestParser.DASH) {\n queryData.add('_DASH_pathway', currentPathwayID);\n queryData.add('_DASH_throughput', String(currentBandwidth));\n } else if (this.manifestType_ == shaka.media.ManifestParser.HLS) {\n queryData.add('_HLS_pathway', currentPathwayID);\n queryData.add('_HLS_throughput', String(currentBandwidth));\n }\n if (queryData.getCount()) {\n finalUri.setQueryData(queryData);\n }\n return finalUri.toString();\n }\n\n /**\n * @param {shaka.util.ContentSteeringManager.SteeringManifest} manifest\n * @param {string} finalManifestUri\n * @private\n */\n processManifest_(manifest, finalManifestUri) {\n if (this.updateTimer_ != null) {\n this.updateTimer_.stop();\n this.updateTimer_ = null;\n }\n const uri = manifest['RELOAD-URI'] || finalManifestUri;\n this.updateTimer_ = new shaka.util.Timer(() => {\n this.requestInfo(uri);\n });\n const newTTL = manifest['TTL'];\n if (newTTL) {\n this.lastTTL_ = newTTL;\n }\n this.updateTimer_.tickAfter(this.lastTTL_);\n this.pathwayPriority_ = manifest['PATHWAY-PRIORITY'] || [];\n this.pathwayClones_ = manifest['PATHWAY-CLONES'] || [];\n }\n\n /**\n * Clear the previous locations added.\n */\n clearPreviousLocations() {\n this.locations_.clear();\n }\n\n /**\n * @param {string|number} streamId\n * @param {string} pathwayId\n * @param {string} uri\n */\n addLocation(streamId, pathwayId, uri) {\n let streamLocations = this.locations_.get(streamId);\n if (!streamLocations) {\n streamLocations = new Map();\n }\n streamLocations.set(pathwayId, uri);\n this.locations_.set(streamId, streamLocations);\n }\n\n /**\n * @param {string} uri\n */\n banLocation(uri) {\n const bannedUntil = Date.now() + 60000;\n this.bannedLocations_.set(uri, bannedUntil);\n }\n\n /**\n * Get the base locations ordered according the priority.\n *\n * @param {string|number} streamId\n * @param {boolean=} ignoreBaseUrls\n * @return {!Array<string>}\n */\n getLocations(streamId, ignoreBaseUrls = false) {\n const streamLocations = this.locations_.get(streamId) || new Map();\n /** @type {!Array<!{pathwayId: string, location: string}>} */\n let locationsPathwayIdMap = [];\n for (const pathwayId of this.pathwayPriority_) {\n const location = streamLocations.get(pathwayId);\n if (location) {\n locationsPathwayIdMap.push({pathwayId, location});\n } else {\n const clone = this.pathwayClones_.find((c) => c.ID == pathwayId);\n if (clone) {\n const cloneLocation = streamLocations.get(clone['BASE-ID']);\n if (cloneLocation) {\n if (clone['URI-REPLACEMENT'].HOST) {\n const uri = new goog.Uri(cloneLocation);\n uri.setDomain(clone['URI-REPLACEMENT'].HOST);\n locationsPathwayIdMap.push({\n pathwayId: pathwayId,\n location: uri.toString(),\n });\n } else {\n locationsPathwayIdMap.push({\n pathwayId: pathwayId,\n location: cloneLocation,\n });\n }\n }\n }\n }\n }\n\n const now = Date.now();\n for (const uri of this.bannedLocations_.keys()) {\n const bannedUntil = this.bannedLocations_.get(uri);\n if (now > bannedUntil) {\n this.bannedLocations_.delete(uri);\n }\n }\n locationsPathwayIdMap = locationsPathwayIdMap.filter((l) => {\n for (const uri of this.bannedLocations_.keys()) {\n if (uri.includes(new goog.Uri(l.location).getDomain())) {\n return false;\n }\n }\n return true;\n });\n\n if (locationsPathwayIdMap.length) {\n this.lastPathwayUsed_ = locationsPathwayIdMap[0].pathwayId;\n }\n\n const locations = locationsPathwayIdMap.map((l) => l.location);\n\n if (!locations.length && this.defaultPathwayId_) {\n for (const pathwayId of this.defaultPathwayId_.split(',')) {\n const location = streamLocations.get(pathwayId);\n if (location) {\n this.lastPathwayUsed_ = this.defaultPathwayId_;\n locations.push(location);\n }\n }\n }\n if (!locations.length) {\n for (const location of streamLocations.values()) {\n locations.push(location);\n }\n }\n if (ignoreBaseUrls) {\n return locations;\n }\n return shaka.util.ManifestParserUtils.resolveUris(\n this.baseUris_, locations);\n }\n};\n\n\n/**\n * @typedef {{\n * VERSION: number,\n * TTL: number,\n * RELOAD-URI: string,\n * PATHWAY-PRIORITY: !Array<string>,\n * PATHWAY-CLONES: !Array<shaka.util.ContentSteeringManager.PathwayClone>\n * }}\n *\n * @description\n * Contains information about the Steering Manifest\n *\n * @property {string} VERSION\n * @property {number} TTL\n * @property {string} RELOAD-URI\n * @property {!Array<string>} PATHWAY-PRIORITY\n * @property {!Array<\n * shaka.util.ContentSteeringManager.PathwayClone>} PATHWAY-CLONES\n */\nshaka.util.ContentSteeringManager.SteeringManifest;\n\n\n/**\n * @typedef {{\n * BASE-ID: string,\n * ID: string,\n * URI-REPLACEMENT: !Array<shaka.util.ContentSteeringManager.UriReplacement>\n * }}\n *\n * @property {string} BASE-ID\n * @property {string} ID\n * @property {!Array<\n * shaka.util.ContentSteeringManager.UriReplacement>} URI-REPLACEMENT\n */\nshaka.util.ContentSteeringManager.PathwayClone;\n\n\n/**\n * @typedef {{\n * HOST: string\n * }}\n *\n * @property {string} HOST\n */\nshaka.util.ContentSteeringManager.UriReplacement;\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.PeriodCombiner');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.drm.DrmUtils');\ngoog.require('shaka.log');\ngoog.require('shaka.media.MetaSegmentIndex');\ngoog.require('shaka.media.SegmentIndex');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.IReleasable');\ngoog.require('shaka.util.LanguageUtils');\ngoog.require('shaka.util.ManifestParserUtils');\ngoog.require('shaka.util.MimeUtils');\n\n/**\n * A utility to combine streams across periods.\n *\n * @implements {shaka.util.IReleasable}\n * @final\n * @export\n */\nshaka.util.PeriodCombiner = class {\n /** */\n constructor() {\n /** @private {!Array<shaka.extern.Variant>} */\n this.variants_ = [];\n\n /** @private {!Array<shaka.extern.Stream>} */\n this.audioStreams_ = [];\n\n /** @private {!Array<shaka.extern.Stream>} */\n this.videoStreams_ = [];\n\n /** @private {!Array<shaka.extern.Stream>} */\n this.textStreams_ = [];\n\n /** @private {!Array<shaka.extern.Stream>} */\n this.imageStreams_ = [];\n\n /** @private {boolean} */\n this.multiTypeVariantsAllowed_ = false;\n\n /** @private {boolean} */\n this.useStreamOnce_ = false;\n\n /**\n * The IDs of the periods we have already used to generate streams.\n * This helps us identify the periods which have been added when a live\n * stream is updated.\n *\n * @private {!Set<string>}\n */\n this.usedPeriodIds_ = new Set();\n }\n\n /** @override */\n release() {\n const allStreams =\n this.audioStreams_.concat(this.videoStreams_, this.textStreams_,\n this.imageStreams_);\n\n for (const stream of allStreams) {\n if (stream.segmentIndex) {\n stream.segmentIndex.release();\n }\n }\n\n this.audioStreams_ = [];\n this.videoStreams_ = [];\n this.textStreams_ = [];\n this.imageStreams_ = [];\n this.variants_ = [];\n this.multiTypeVariantsAllowed_ = false;\n this.useStreamOnce_ = false;\n this.usedPeriodIds_.clear();\n }\n\n /**\n * @return {!Array<shaka.extern.Variant>}\n *\n * @export\n */\n getVariants() {\n return this.variants_;\n }\n\n /**\n * @return {!Array<shaka.extern.Stream>}\n *\n * @export\n */\n getTextStreams() {\n // Return a copy of the array because makeTextStreamsForClosedCaptions\n // may make changes to the contents of the array. Those changes should not\n // propagate back to the PeriodCombiner.\n return this.textStreams_.slice();\n }\n\n /**\n * @return {!Array<shaka.extern.Stream>}\n *\n * @export\n */\n getImageStreams() {\n return this.imageStreams_;\n }\n\n /**\n * Deletes a stream from matchedStreams because it is no longer needed\n *\n * @param {?shaka.extern.Stream} stream\n * @param {string} periodId\n *\n * @export\n */\n deleteStream(stream, periodId) {\n if (!stream) {\n return;\n }\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n if (stream.type == ContentType.AUDIO) {\n for (const audioStream of this.audioStreams_) {\n audioStream.matchedStreams = audioStream.matchedStreams.filter((s) => {\n return s !== stream;\n });\n }\n } else if (stream.type == ContentType.VIDEO) {\n for (const videoStream of this.videoStreams_) {\n videoStream.matchedStreams = videoStream.matchedStreams.filter((s) => {\n return s !== stream;\n });\n if (videoStream.trickModeVideo) {\n videoStream.trickModeVideo.matchedStreams =\n videoStream.trickModeVideo.matchedStreams.filter((s) => {\n return s !== stream;\n });\n }\n if (videoStream.dependencyStream) {\n videoStream.dependencyStream.matchedStreams =\n videoStream.dependencyStream.matchedStreams.filter((s) => {\n return s !== stream;\n });\n }\n }\n } else if (stream.type == ContentType.TEXT) {\n for (const textStream of this.textStreams_) {\n textStream.matchedStreams = textStream.matchedStreams.filter((s) => {\n return s !== stream;\n });\n }\n } else if (stream.type == ContentType.IMAGE) {\n for (const imageStream of this.imageStreams_) {\n imageStream.matchedStreams = imageStream.matchedStreams.filter((s) => {\n return s !== stream;\n });\n }\n }\n if (stream.segmentIndex) {\n stream.closeSegmentIndex();\n }\n this.usedPeriodIds_.delete(periodId);\n }\n\n /**\n * Returns an object that contains arrays of streams by type\n * @param {!Array<shaka.extern.Period>} periods\n * @param {boolean} addDummy\n * @return {{\n * audioStreamsPerPeriod: !Array<!Map<string, shaka.extern.Stream>>,\n * videoStreamsPerPeriod: !Array<!Map<string, shaka.extern.Stream>>,\n * textStreamsPerPeriod: !Array<!Map<string, shaka.extern.Stream>>,\n * imageStreamsPerPeriod: !Array<!Map<string, shaka.extern.Stream>>\n * }}\n * @private\n */\n getStreamsPerPeriod_(periods, addDummy) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n const PeriodCombiner = shaka.util.PeriodCombiner;\n\n const audioStreamsPerPeriod = [];\n const videoStreamsPerPeriod = [];\n const textStreamsPerPeriod = [];\n const imageStreamsPerPeriod = [];\n\n for (const period of periods) {\n const audioMap = new Map(period.audioStreams.map((s) =>\n [PeriodCombiner.generateAudioKey_(s), s]));\n const videoMap = new Map(period.videoStreams.map((s) =>\n [PeriodCombiner.generateVideoKey_(s), s]));\n const textMap = new Map(period.textStreams.map((s) =>\n [PeriodCombiner.generateTextKey_(s), s]));\n const imageMap = new Map(period.imageStreams.map((s) =>\n [PeriodCombiner.generateImageKey_(s), s]));\n\n // It's okay to have a period with no text or images, but our algorithm\n // fails on any period without matching streams. So we add dummy streams\n // to each period. Since we combine text streams by language and image\n // streams by resolution, we might need a dummy even in periods with these\n // streams already.\n if (addDummy) {\n const dummyText = PeriodCombiner.dummyStream_(ContentType.TEXT);\n textMap.set(PeriodCombiner.generateTextKey_(dummyText), dummyText);\n const dummyImage = PeriodCombiner.dummyStream_(ContentType.IMAGE);\n imageMap.set(PeriodCombiner.generateImageKey_(dummyImage), dummyImage);\n }\n\n audioStreamsPerPeriod.push(audioMap);\n videoStreamsPerPeriod.push(videoMap);\n textStreamsPerPeriod.push(textMap);\n imageStreamsPerPeriod.push(imageMap);\n }\n return {\n audioStreamsPerPeriod,\n videoStreamsPerPeriod,\n textStreamsPerPeriod,\n imageStreamsPerPeriod,\n };\n }\n\n /**\n * @param {!Array<shaka.extern.Period>} periods\n * @param {boolean} isDynamic\n * @param {boolean=} isPatchUpdate\n * @return {!Promise}\n *\n * @export\n */\n async combinePeriods(periods, isDynamic, isPatchUpdate = false) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n\n // Optimization: for single-period VOD, do nothing. This makes sure\n // single-period DASH content will be 100% accurately represented in the\n // output.\n if (!isDynamic && periods.length == 1) {\n // We need to filter out duplicates, so call getStreamsPerPeriod()\n // so it will do that by usage of Map.\n const {\n audioStreamsPerPeriod,\n videoStreamsPerPeriod,\n textStreamsPerPeriod,\n imageStreamsPerPeriod,\n } = this.getStreamsPerPeriod_(periods, /* addDummy= */ false);\n this.audioStreams_ = Array.from(audioStreamsPerPeriod[0].values());\n this.videoStreams_ = Array.from(videoStreamsPerPeriod[0].values());\n this.textStreams_ = Array.from(textStreamsPerPeriod[0].values());\n this.imageStreams_ = Array.from(imageStreamsPerPeriod[0].values());\n } else {\n // How many periods we've seen before which are not included in this call.\n const periodsMissing = isPatchUpdate ? this.usedPeriodIds_.size : 0;\n // Find the first period we haven't seen before. Tag all the periods we\n // see now as \"used\".\n let firstNewPeriodIndex = -1;\n for (let i = 0; i < periods.length; i++) {\n const period = periods[i];\n if (this.usedPeriodIds_.has(period.id)) {\n // This isn't new.\n } else {\n // This one _is_ new.\n this.usedPeriodIds_.add(period.id);\n\n if (firstNewPeriodIndex == -1) {\n // And it's the _first_ new one.\n firstNewPeriodIndex = i;\n }\n }\n }\n\n if (firstNewPeriodIndex == -1) {\n // Nothing new? Nothing to do.\n return;\n }\n\n const {\n audioStreamsPerPeriod,\n videoStreamsPerPeriod,\n textStreamsPerPeriod,\n imageStreamsPerPeriod,\n } = this.getStreamsPerPeriod_(periods, /* addDummy= */ true);\n\n await Promise.all([\n this.combine_(\n this.audioStreams_,\n audioStreamsPerPeriod,\n firstNewPeriodIndex,\n shaka.util.PeriodCombiner.cloneStream_,\n shaka.util.PeriodCombiner.concatenateStreams_,\n periodsMissing),\n this.combine_(\n this.videoStreams_,\n videoStreamsPerPeriod,\n firstNewPeriodIndex,\n shaka.util.PeriodCombiner.cloneStream_,\n shaka.util.PeriodCombiner.concatenateStreams_,\n periodsMissing),\n this.combine_(\n this.textStreams_,\n textStreamsPerPeriod,\n firstNewPeriodIndex,\n shaka.util.PeriodCombiner.cloneStream_,\n shaka.util.PeriodCombiner.concatenateStreams_,\n periodsMissing),\n this.combine_(\n this.imageStreams_,\n imageStreamsPerPeriod,\n firstNewPeriodIndex,\n shaka.util.PeriodCombiner.cloneStream_,\n shaka.util.PeriodCombiner.concatenateStreams_,\n periodsMissing),\n ]);\n }\n\n // Create variants for all audio/video combinations.\n let nextVariantId = 0;\n const variants = [];\n if (!this.videoStreams_.length || !this.audioStreams_.length) {\n // For audio-only or video-only content, just give each stream its own\n // variant.\n const streams = this.videoStreams_.length ? this.videoStreams_ :\n this.audioStreams_;\n for (const stream of streams) {\n const id = nextVariantId++;\n let bandwidth = stream.bandwidth || 0;\n if (stream.dependencyStream) {\n bandwidth += stream.dependencyStream.bandwidth || 0;\n }\n variants.push({\n id,\n language: stream.language,\n disabledUntilTime: 0,\n primary: stream.primary,\n audio: stream.type == ContentType.AUDIO ? stream : null,\n video: stream.type == ContentType.VIDEO ? stream : null,\n bandwidth,\n drmInfos: stream.drmInfos,\n allowedByApplication: true,\n allowedByKeySystem: true,\n decodingInfos: [],\n });\n }\n } else {\n for (const audio of this.audioStreams_) {\n for (const video of this.videoStreams_) {\n const commonDrmInfos = shaka.drm.DrmUtils.getCommonDrmInfos(\n audio.drmInfos, video.drmInfos);\n\n if (audio.drmInfos.length && video.drmInfos.length &&\n !commonDrmInfos.length) {\n shaka.log.warning(\n 'Incompatible DRM in audio & video, skipping variant creation.',\n audio, video);\n continue;\n }\n\n let bandwidth = (audio.bandwidth || 0) + (video.bandwidth || 0);\n if (audio.dependencyStream) {\n bandwidth += audio.dependencyStream.bandwidth || 0;\n }\n if (video.dependencyStream) {\n bandwidth += video.dependencyStream.bandwidth || 0;\n }\n\n const id = nextVariantId++;\n variants.push({\n id,\n language: audio.language,\n disabledUntilTime: 0,\n primary: audio.primary,\n audio,\n video,\n bandwidth,\n drmInfos: commonDrmInfos,\n allowedByApplication: true,\n allowedByKeySystem: true,\n decodingInfos: [],\n });\n }\n }\n }\n\n this.variants_ = variants;\n }\n\n\n /**\n * Stitch together DB streams across periods, taking a mix of stream types.\n * The offline database does not separate these by type.\n *\n * Unlike the DASH case, this does not need to maintain any state for manifest\n * updates.\n *\n * @param {!Array<!Array<shaka.extern.StreamDB>>} streamDbsPerPeriod\n * @return {!Promise<!Array<shaka.extern.StreamDB>>}\n */\n static async combineDbStreams(streamDbsPerPeriod) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n const PeriodCombiner = shaka.util.PeriodCombiner;\n\n // Optimization: for single-period content, do nothing. This makes sure\n // single-period DASH or any HLS content stored offline will be 100%\n // accurately represented in the output.\n if (streamDbsPerPeriod.length == 1) {\n return streamDbsPerPeriod[0];\n }\n\n const audioStreamDbsPerPeriod = streamDbsPerPeriod.map(\n (streams) => new Map(streams\n .filter((s) => s.type === ContentType.AUDIO)\n .map((s) => [PeriodCombiner.generateAudioKey_(s), s])));\n const videoStreamDbsPerPeriod = streamDbsPerPeriod.map(\n (streams) => new Map(streams\n .filter((s) => s.type === ContentType.VIDEO)\n .map((s) => [PeriodCombiner.generateVideoKey_(s), s])));\n const textStreamDbsPerPeriod = streamDbsPerPeriod.map(\n (streams) => new Map(streams\n .filter((s) => s.type === ContentType.TEXT)\n .map((s) => [PeriodCombiner.generateTextKey_(s), s])));\n const imageStreamDbsPerPeriod = streamDbsPerPeriod.map(\n (streams) => new Map(streams\n .filter((s) => s.type === ContentType.IMAGE)\n .map((s) => [PeriodCombiner.generateImageKey_(s), s])));\n\n // It's okay to have a period with no text or images, but our algorithm\n // fails on any period without matching streams. So we add dummy streams to\n // each period. Since we combine text streams by language and image streams\n // by resolution, we might need a dummy even in periods with these streams\n // already.\n for (const textStreams of textStreamDbsPerPeriod) {\n const dummy = PeriodCombiner.dummyStreamDB_(ContentType.TEXT);\n textStreams.set(PeriodCombiner.generateTextKey_(dummy), dummy);\n }\n for (const imageStreams of imageStreamDbsPerPeriod) {\n const dummy = PeriodCombiner.dummyStreamDB_(ContentType.IMAGE);\n imageStreams.set(PeriodCombiner.generateImageKey_(dummy), dummy);\n }\n\n const periodCombiner = new shaka.util.PeriodCombiner();\n\n const combinedAudioStreamDbs = await periodCombiner.combine_(\n /* outputStreams= */ [],\n audioStreamDbsPerPeriod,\n /* firstNewPeriodIndex= */ 0,\n shaka.util.PeriodCombiner.cloneStreamDB_,\n shaka.util.PeriodCombiner.concatenateStreamDBs_,\n /* periodsMissing= */ 0);\n\n const combinedVideoStreamDbs = await periodCombiner.combine_(\n /* outputStreams= */ [],\n videoStreamDbsPerPeriod,\n /* firstNewPeriodIndex= */ 0,\n shaka.util.PeriodCombiner.cloneStreamDB_,\n shaka.util.PeriodCombiner.concatenateStreamDBs_,\n /* periodsMissing= */ 0);\n\n const combinedTextStreamDbs = await periodCombiner.combine_(\n /* outputStreams= */ [],\n textStreamDbsPerPeriod,\n /* firstNewPeriodIndex= */ 0,\n shaka.util.PeriodCombiner.cloneStreamDB_,\n shaka.util.PeriodCombiner.concatenateStreamDBs_,\n /* periodsMissing= */ 0);\n\n const combinedImageStreamDbs = await periodCombiner.combine_(\n /* outputStreams= */ [],\n imageStreamDbsPerPeriod,\n /* firstNewPeriodIndex= */ 0,\n shaka.util.PeriodCombiner.cloneStreamDB_,\n shaka.util.PeriodCombiner.concatenateStreamDBs_,\n /* periodsMissing= */ 0);\n\n // Recreate variantIds from scratch in the output.\n // HLS content is always single-period, so the early return at the top of\n // this method would catch all HLS content. DASH content stored with v3.0\n // will already be flattened before storage. Therefore the only content\n // that reaches this point is multi-period DASH content stored before v3.0.\n // Such content always had variants generated from all combinations of audio\n // and video, so we can simply do that now without loss of correctness.\n let nextVariantId = 0;\n if (!combinedVideoStreamDbs.length || !combinedAudioStreamDbs.length) {\n // For audio-only or video-only content, just give each stream its own\n // variant ID.\n const combinedStreamDbs =\n combinedVideoStreamDbs.concat(combinedAudioStreamDbs);\n for (const stream of combinedStreamDbs) {\n stream.variantIds = [nextVariantId++];\n }\n } else {\n for (const audio of combinedAudioStreamDbs) {\n for (const video of combinedVideoStreamDbs) {\n const id = nextVariantId++;\n video.variantIds.push(id);\n audio.variantIds.push(id);\n }\n }\n }\n\n return combinedVideoStreamDbs\n .concat(combinedAudioStreamDbs)\n .concat(combinedTextStreamDbs)\n .concat(combinedImageStreamDbs);\n }\n\n /**\n * Combine input Streams per period into flat output Streams.\n * Templatized to handle both DASH Streams and offline StreamDBs.\n *\n * @param {!Array<T>} outputStreams A list of existing output streams, to\n * facilitate updates for live DASH content. Will be modified and returned.\n * @param {!Array<!Map<string, T>>} streamsPerPeriod A list of maps of Streams\n * from each period.\n * @param {number} firstNewPeriodIndex An index into streamsPerPeriod which\n * represents the first new period that hasn't been processed yet.\n * @param {function(T):T} clone Make a clone of an input stream.\n * @param {function(T, T)} concat Concatenate the second stream onto the end\n * of the first.\n * @param {number} periodsMissing The number of periods missing\n *\n * @return {!Promise<!Array<T>>} The same array passed to outputStreams,\n * modified to include any newly-created streams.\n *\n * @template T\n * Accepts either a StreamDB or Stream type.\n *\n * @private\n */\n async combine_(\n outputStreams, streamsPerPeriod, firstNewPeriodIndex, clone, concat,\n periodsMissing) {\n const unusedStreamsPerPeriod = [];\n\n for (let i = 0; i < streamsPerPeriod.length; i++) {\n if (i >= firstNewPeriodIndex) {\n // This periods streams are all new.\n unusedStreamsPerPeriod.push(new Set(streamsPerPeriod[i].values()));\n } else {\n // This period's streams have all been used already.\n unusedStreamsPerPeriod.push(new Set());\n }\n }\n\n // First, extend all existing output Streams into the new periods.\n for (const outputStream of outputStreams) {\n // eslint-disable-next-line no-await-in-loop\n const ok = await this.extendExistingOutputStream_(\n outputStream, streamsPerPeriod, firstNewPeriodIndex, concat,\n unusedStreamsPerPeriod, periodsMissing);\n if (!ok) {\n // This output Stream was not properly extended to include streams from\n // the new period. This is likely a bug in our algorithm, so throw an\n // error.\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.PERIOD_FLATTENING_FAILED);\n }\n\n // This output stream is now complete with content from all known\n // periods.\n } // for (const outputStream of outputStreams)\n\n for (const unusedStreams of unusedStreamsPerPeriod) {\n for (const stream of unusedStreams) {\n // Create a new output stream which includes this input stream.\n const outputStream = this.createNewOutputStream_(\n stream, streamsPerPeriod, clone, concat,\n unusedStreamsPerPeriod);\n if (outputStream) {\n outputStreams.push(outputStream);\n } else {\n // This is not a stream we can build output from, but it may become\n // part of another output based on another period's stream.\n }\n } // for (const stream of unusedStreams)\n } // for (const unusedStreams of unusedStreamsPerPeriod)\n\n for (const unusedStreams of unusedStreamsPerPeriod) {\n for (const stream of unusedStreams) {\n if (shaka.util.PeriodCombiner.isDummy_(stream)) {\n // This is one of our dummy streams, so ignore it. We may not use\n // them all, and that's fine.\n continue;\n }\n // If this stream has a different codec/MIME than any other stream,\n // then we can't play it.\n const hasCodec = outputStreams.some((s) => {\n return this.areAVStreamsCompatible_(stream, s);\n });\n if (!hasCodec) {\n continue;\n }\n\n // Any other unused stream is likely a bug in our algorithm, so throw\n // an error.\n shaka.log.error('Unused stream in period-flattening!',\n stream, outputStreams);\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.PERIOD_FLATTENING_FAILED);\n }\n }\n\n return outputStreams;\n }\n\n /**\n * @param {T} outputStream An existing output stream which needs to be\n * extended into new periods.\n * @param {!Array<!Map<string, T>>} streamsPerPeriod A list of maps of Streams\n * from each period.\n * @param {number} firstNewPeriodIndex An index into streamsPerPeriod which\n * represents the first new period that hasn't been processed yet.\n * @param {function(T, T)} concat Concatenate the second stream onto the end\n * of the first.\n * @param {!Array<!Set<T>>} unusedStreamsPerPeriod An array of sets of\n * unused streams from each period.\n * @param {number} periodsMissing How many periods are missing in this update.\n *\n * @return {!Promise<boolean>}\n *\n * @template T\n * Should only be called with a Stream type in practice, but has call sites\n * from other templated functions that also accept a StreamDB.\n *\n * @private\n */\n async extendExistingOutputStream_(\n outputStream, streamsPerPeriod, firstNewPeriodIndex, concat,\n unusedStreamsPerPeriod, periodsMissing) {\n this.findMatchesInAllPeriods_(streamsPerPeriod,\n outputStream, periodsMissing > 0);\n\n // This only exists where T == Stream, and this should only ever be called\n // on Stream types. StreamDB should not have pre-existing output streams.\n goog.asserts.assert(outputStream.createSegmentIndex,\n 'outputStream should be a Stream type!');\n\n if (!outputStream.matchedStreams) {\n // We were unable to extend this output stream.\n shaka.log.error('No matches extending output stream!',\n outputStream, streamsPerPeriod);\n return false;\n }\n // We need to create all the per-period segment indexes and append them to\n // the output's MetaSegmentIndex.\n if (outputStream.segmentIndex) {\n await shaka.util.PeriodCombiner.extendOutputSegmentIndex_(outputStream,\n firstNewPeriodIndex + periodsMissing);\n }\n\n shaka.util.PeriodCombiner.extendOutputStream_(outputStream,\n firstNewPeriodIndex, concat, unusedStreamsPerPeriod, periodsMissing);\n return true;\n }\n\n /**\n * Creates the segment indexes for an array of input streams, and append them\n * to the output stream's segment index.\n *\n * @param {shaka.extern.Stream} outputStream\n * @param {number} firstNewPeriodIndex An index into streamsPerPeriod which\n * represents the first new period that hasn't been processed yet.\n * @private\n */\n static async extendOutputSegmentIndex_(outputStream, firstNewPeriodIndex) {\n const operations = [];\n const streams = outputStream.matchedStreams;\n goog.asserts.assert(streams, 'matched streams should be valid');\n\n for (let i = firstNewPeriodIndex; i < streams.length; i++) {\n const stream = streams[i];\n operations.push(stream.createSegmentIndex());\n if (stream.trickModeVideo && !stream.trickModeVideo.segmentIndex) {\n operations.push(stream.trickModeVideo.createSegmentIndex());\n }\n if (stream.dependencyStream && !stream.dependencyStream.segmentIndex) {\n operations.push(stream.dependencyStream.createSegmentIndex());\n }\n }\n await Promise.all(operations);\n\n // Concatenate the new matches onto the stream, starting at the first new\n // period.\n // Satisfy the compiler about the type.\n // Also checks if the segmentIndex is still valid after the async\n // operations, to make sure we stop if the active stream has changed.\n if (outputStream.segmentIndex instanceof shaka.media.MetaSegmentIndex) {\n for (let i = firstNewPeriodIndex; i < streams.length; i++) {\n const match = streams[i];\n goog.asserts.assert(match.segmentIndex,\n 'stream should have a segmentIndex.');\n if (match.segmentIndex) {\n outputStream.segmentIndex.appendSegmentIndex(match.segmentIndex);\n }\n }\n }\n }\n\n /**\n * Create a new output Stream based on a particular input Stream. Locates\n * matching Streams in all other periods and combines them into an output\n * Stream.\n * Templatized to handle both DASH Streams and offline StreamDBs.\n *\n * @param {T} stream An input stream on which to base the output stream.\n * @param {!Array<!Map<string, T>>} streamsPerPeriod A list of maps of Streams\n * from each period.\n * @param {function(T):T} clone Make a clone of an input stream.\n * @param {function(T, T)} concat Concatenate the second stream onto the end\n * of the first.\n * @param {!Array<!Set<T>>} unusedStreamsPerPeriod An array of sets of\n * unused streams from each period.\n *\n * @return {?T} A newly-created output Stream, or null if matches\n * could not be found.`\n *\n * @template T\n * Accepts either a StreamDB or Stream type.\n *\n * @private\n */\n createNewOutputStream_(\n stream, streamsPerPeriod, clone, concat, unusedStreamsPerPeriod) {\n // Check do we want to create output stream from dummy stream\n // and if so, return quickly.\n if (shaka.util.PeriodCombiner.isDummy_(stream)) {\n return null;\n }\n // Start by cloning the stream without segments, key IDs, etc.\n const outputStream = clone(stream);\n\n // Find best-matching streams in all periods.\n this.findMatchesInAllPeriods_(streamsPerPeriod, outputStream);\n\n // This only exists where T == Stream.\n if (outputStream.createSegmentIndex) {\n // Override the createSegmentIndex function of the outputStream.\n outputStream.createSegmentIndex = async () => {\n if (!outputStream.segmentIndex) {\n outputStream.segmentIndex = new shaka.media.MetaSegmentIndex();\n await shaka.util.PeriodCombiner.extendOutputSegmentIndex_(\n outputStream, /* firstNewPeriodIndex= */ 0);\n }\n };\n // For T == Stream, we need to create all the per-period segment indexes\n // in advance. concat() will add them to the output's MetaSegmentIndex.\n }\n\n if (!outputStream.matchedStreams || !outputStream.matchedStreams.length) {\n // This is not a stream we can build output from, but it may become part\n // of another output based on another period's stream.\n return null;\n }\n shaka.util.PeriodCombiner.extendOutputStream_(outputStream,\n /* firstNewPeriodIndex= */ 0, concat, unusedStreamsPerPeriod,\n /* periodsMissing= */ 0);\n\n return outputStream;\n }\n\n /**\n * @param {T} outputStream An existing output stream which needs to be\n * extended into new periods.\n * @param {number} firstNewPeriodIndex An index into streamsPerPeriod which\n * represents the first new period that hasn't been processed yet.\n * @param {function(T, T)} concat Concatenate the second stream onto the end\n * of the first.\n * @param {!Array<!Set<T>>} unusedStreamsPerPeriod An array of sets of\n * unused streams from each period.\n * @param {number} periodsMissing How many periods are missing in this update\n *\n * @template T\n * Accepts either a StreamDB or Stream type.\n *\n * @private\n */\n static extendOutputStream_(\n outputStream, firstNewPeriodIndex, concat, unusedStreamsPerPeriod,\n periodsMissing) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n const LanguageUtils = shaka.util.LanguageUtils;\n const matches = outputStream.matchedStreams;\n\n // Assure the compiler that matches didn't become null during the async\n // operation before.\n goog.asserts.assert(outputStream.matchedStreams,\n 'matchedStreams should be non-null');\n\n // Concatenate the new matches onto the stream, starting at the first new\n // period.\n const start = firstNewPeriodIndex + periodsMissing;\n for (let i = start; i < matches.length; i++) {\n const match = matches[i];\n concat(outputStream, match);\n\n // We only consider an audio stream \"used\" if its language is related to\n // the output language. There are scenarios where we want to generate\n // separate tracks for each language, even when we are forced to connect\n // unrelated languages across periods.\n let used = true;\n if (outputStream.type == ContentType.AUDIO) {\n const relatedness = LanguageUtils.relatedness(\n outputStream.language, match.language);\n if (relatedness == 0) {\n used = false;\n }\n }\n\n if (used) {\n unusedStreamsPerPeriod[i - periodsMissing].delete(match);\n // Add the full mimetypes to the stream.\n if (match.fullMimeTypes) {\n for (const fullMimeType of match.fullMimeTypes.values()) {\n outputStream.fullMimeTypes.add(fullMimeType);\n }\n }\n }\n }\n }\n\n /**\n * Clone a Stream to make an output Stream for combining others across\n * periods.\n *\n * @param {shaka.extern.Stream} stream\n * @return {shaka.extern.Stream}\n * @private\n */\n static cloneStream_(stream) {\n const clone = /** @type {shaka.extern.Stream} */(Object.assign({}, stream));\n\n // These are wiped out now and rebuilt later from the various per-period\n // streams that match this output.\n clone.originalId = null;\n clone.createSegmentIndex = () => Promise.resolve();\n clone.closeSegmentIndex = () => {\n if (clone.segmentIndex) {\n clone.segmentIndex.release();\n clone.segmentIndex = null;\n }\n // Close the segment index of the matched streams.\n if (clone.matchedStreams) {\n for (const match of clone.matchedStreams) {\n if (match.segmentIndex) {\n match.segmentIndex.release();\n match.segmentIndex = null;\n }\n }\n }\n };\n\n // Clone roles array so this output stream can own it.\n clone.roles = clone.roles.slice();\n clone.segmentIndex = null;\n clone.emsgSchemeIdUris = [];\n clone.keyIds = new Set(stream.keyIds);\n clone.closedCaptions = stream.closedCaptions ?\n new Map(stream.closedCaptions) : null;\n clone.trickModeVideo = null;\n clone.dependencyStream = null;\n\n return clone;\n }\n\n /**\n * Clone a StreamDB to make an output stream for combining others across\n * periods.\n *\n * @param {shaka.extern.StreamDB} streamDb\n * @return {shaka.extern.StreamDB}\n * @private\n */\n static cloneStreamDB_(streamDb) {\n const clone = /** @type {shaka.extern.StreamDB} */(Object.assign(\n {}, streamDb));\n\n // Clone roles array so this output stream can own it.\n clone.roles = clone.roles.slice();\n // These are wiped out now and rebuilt later from the various per-period\n // streams that match this output.\n clone.keyIds = new Set(streamDb.keyIds);\n clone.segments = [];\n clone.variantIds = [];\n clone.closedCaptions = streamDb.closedCaptions ?\n new Map(streamDb.closedCaptions) : null;\n\n return clone;\n }\n\n /**\n * Combine the various fields of the input Stream into the output.\n *\n * @param {shaka.extern.Stream} output\n * @param {shaka.extern.Stream} input\n * @private\n */\n static concatenateStreams_(output, input) {\n // We keep the original stream's resolution, frame rate,\n // sample rate, and channel count to ensure that it's properly\n // matched with similar content in other periods further down\n // the line.\n\n // Combine arrays, keeping only the unique elements\n const combineArrays = (output, input) => {\n if (!output) {\n output = [];\n }\n for (const item of input) {\n if (!output.includes(item)) {\n output.push(item);\n }\n }\n return output;\n };\n output.roles = combineArrays(output.roles, input.roles);\n\n if (input.emsgSchemeIdUris) {\n output.emsgSchemeIdUris = combineArrays(\n output.emsgSchemeIdUris, input.emsgSchemeIdUris);\n }\n\n for (const keyId of input.keyIds) {\n output.keyIds.add(keyId);\n }\n\n if (output.originalId == null) {\n output.originalId = input.originalId;\n } else {\n const newOriginalId = (input.originalId || '');\n if (newOriginalId && !output.originalId.endsWith(newOriginalId)) {\n output.originalId += ',' + newOriginalId;\n }\n }\n\n const commonDrmInfos = shaka.drm.DrmUtils.getCommonDrmInfos(\n output.drmInfos, input.drmInfos);\n if (input.drmInfos.length && output.drmInfos.length &&\n !commonDrmInfos.length) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.INCONSISTENT_DRM_ACROSS_PERIODS);\n }\n output.drmInfos = commonDrmInfos;\n\n // The output is encrypted if any input was encrypted.\n output.encrypted = output.encrypted || input.encrypted;\n\n // Combine the closed captions maps.\n if (input.closedCaptions) {\n if (!output.closedCaptions) {\n output.closedCaptions = new Map();\n }\n for (const [key, value] of input.closedCaptions) {\n output.closedCaptions.set(key, value);\n }\n }\n\n // Prioritize the highest bandwidth\n if (output.bandwidth && input.bandwidth) {\n output.bandwidth = Math.max(output.bandwidth, input.bandwidth);\n }\n\n // Combine trick-play video streams, if present.\n if (input.trickModeVideo) {\n if (!output.trickModeVideo) {\n // Create a fresh output stream for trick-mode playback.\n output.trickModeVideo = shaka.util.PeriodCombiner.cloneStream_(\n input.trickModeVideo);\n output.trickModeVideo.matchedStreams = [];\n output.trickModeVideo.createSegmentIndex = () => {\n if (output.trickModeVideo.segmentIndex) {\n return Promise.resolve();\n }\n const segmentIndex = new shaka.media.MetaSegmentIndex();\n goog.asserts.assert(output.trickModeVideo.matchedStreams,\n 'trickmode matched streams should exist');\n for (const stream of output.trickModeVideo.matchedStreams) {\n goog.asserts.assert(stream.segmentIndex,\n 'trickmode segment index should exist');\n segmentIndex.appendSegmentIndex(stream.segmentIndex);\n }\n output.trickModeVideo.segmentIndex = segmentIndex;\n\n return Promise.resolve();\n };\n }\n\n // Concatenate the trick mode input onto the trick mode output.\n output.trickModeVideo.matchedStreams.push(input.trickModeVideo);\n shaka.util.PeriodCombiner.concatenateStreams_(\n output.trickModeVideo, input.trickModeVideo);\n } else if (output.trickModeVideo) {\n // We have a trick mode output, but no input from this Period. Fill it in\n // from the standard input Stream.\n output.trickModeVideo.matchedStreams.push(input);\n shaka.util.PeriodCombiner.concatenateStreams_(\n output.trickModeVideo, input);\n }\n\n // Combine dependency streams, if present.\n if (input.dependencyStream) {\n if (!output.dependencyStream) {\n // Create a fresh output stream for trick-mode playback.\n output.dependencyStream = shaka.util.PeriodCombiner.cloneStream_(\n input.dependencyStream);\n output.dependencyStream.matchedStreams = [];\n output.dependencyStream.createSegmentIndex = () => {\n if (output.dependencyStream.segmentIndex) {\n return Promise.resolve();\n }\n const segmentIndex = new shaka.media.MetaSegmentIndex();\n goog.asserts.assert(output.dependencyStream.matchedStreams,\n 'dependency video matched streams should exist');\n for (const stream of output.dependencyStream.matchedStreams) {\n goog.asserts.assert(stream.segmentIndex,\n 'dependency video segment index should exist');\n segmentIndex.appendSegmentIndex(stream.segmentIndex);\n }\n output.dependencyStream.segmentIndex = segmentIndex;\n\n return Promise.resolve();\n };\n }\n\n // Concatenate the dependency input onto the dependency output.\n output.dependencyStream.matchedStreams.push(input.dependencyStream);\n shaka.util.PeriodCombiner.concatenateStreams_(\n output.dependencyStream, input.dependencyStream);\n } else if (output.dependencyStream) {\n // We have a dependency output, but no input from this Period.\n // Fill it in from the standard input Stream.\n output.dependencyStream.matchedStreams.push(input);\n shaka.util.PeriodCombiner.concatenateStreams_(\n output.dependencyStream, input);\n }\n }\n\n /**\n * Combine the various fields of the input StreamDB into the output.\n *\n * @param {shaka.extern.StreamDB} output\n * @param {shaka.extern.StreamDB} input\n * @private\n */\n static concatenateStreamDBs_(output, input) {\n // Combine arrays, keeping only the unique elements\n const combineArrays = (output, input) => {\n if (!output) {\n output = [];\n }\n for (const item of input) {\n if (!output.includes(item)) {\n output.push(item);\n }\n }\n return output;\n };\n output.roles = combineArrays(output.roles, input.roles);\n\n for (const keyId of input.keyIds) {\n output.keyIds.add(keyId);\n }\n\n // The output is encrypted if any input was encrypted.\n output.encrypted = output.encrypted && input.encrypted;\n\n // Concatenate segments without de-duping.\n output.segments.push(...input.segments);\n\n // Combine the closed captions maps.\n if (input.closedCaptions) {\n if (!output.closedCaptions) {\n output.closedCaptions = new Map();\n }\n for (const [key, value] of input.closedCaptions) {\n output.closedCaptions.set(key, value);\n }\n }\n }\n\n /**\n * Finds streams in all periods which match the output stream.\n *\n * @param {!Array<!Map<string, T>>} streamsPerPeriod\n * @param {T} outputStream\n * @param {boolean=} shouldAppend\n *\n * @template T\n * Accepts either a StreamDB or Stream type.\n *\n * @private\n */\n findMatchesInAllPeriods_(streamsPerPeriod, outputStream,\n shouldAppend = false) {\n const matches = shouldAppend ? outputStream.matchedStreams : [];\n for (const streams of streamsPerPeriod) {\n const match = this.findBestMatchInPeriod_(streams, outputStream);\n if (!match) {\n return;\n }\n matches.push(match);\n }\n outputStream.matchedStreams = matches;\n }\n\n /**\n * Find the best match for the output stream.\n *\n * @param {!Map<string, T>} streams\n * @param {T} outputStream\n * @return {?T} Returns null if no match can be found.\n *\n * @template T\n * Accepts either a StreamDB or Stream type.\n *\n * @private\n */\n findBestMatchInPeriod_(streams, outputStream) {\n const getKey = {\n 'audio': shaka.util.PeriodCombiner.generateAudioKey_,\n 'video': shaka.util.PeriodCombiner.generateVideoKey_,\n 'text': shaka.util.PeriodCombiner.generateTextKey_,\n 'image': shaka.util.PeriodCombiner.generateImageKey_,\n }[outputStream.type];\n\n let best = null;\n const key = getKey(outputStream);\n if (streams.has(key)) {\n // We've found exact match by hashing.\n best = streams.get(key);\n } else {\n // We haven't found exact match, try to find the best one via\n // linear search.\n const areCompatible = {\n 'audio': (os, s) => this.areAVStreamsCompatible_(os, s),\n 'video': (os, s) => this.areAVStreamsCompatible_(os, s),\n 'text': shaka.util.PeriodCombiner.areTextStreamsCompatible_,\n 'image': shaka.util.PeriodCombiner.areImageStreamsCompatible_,\n }[outputStream.type];\n const isBetterMatch = {\n 'audio': shaka.util.PeriodCombiner.isAudioStreamBetterMatch_,\n 'video': shaka.util.PeriodCombiner.isVideoStreamBetterMatch_,\n 'text': shaka.util.PeriodCombiner.isTextStreamBetterMatch_,\n 'image': shaka.util.PeriodCombiner.isImageStreamBetterMatch_,\n }[outputStream.type];\n\n for (const stream of streams.values()) {\n if (!areCompatible(outputStream, stream)) {\n continue;\n }\n\n if (outputStream.fastSwitching != stream.fastSwitching) {\n continue;\n }\n\n if (!best || isBetterMatch(outputStream, best, stream)) {\n best = stream;\n }\n }\n }\n\n // Remove just found stream if configured to, so possible future linear\n // searches can be faster.\n if (this.useStreamOnce_ && !shaka.util.PeriodCombiner.isDummy_(best)) {\n streams.delete(getKey(best));\n }\n\n return best;\n }\n\n /**\n * @param {T} a\n * @param {T} b\n * @return {boolean}\n *\n * @template T\n * Accepts either a StreamDB or Stream type.\n *\n * @private\n */\n static areAVStreamsExactMatch_(a, b) {\n if (a.mimeType != b.mimeType) {\n return false;\n }\n return shaka.util.PeriodCombiner.getCodec_(a.codecs) ===\n shaka.util.PeriodCombiner.getCodec_(b.codecs);\n }\n\n /**\n * @param {boolean} allowed If set to true, multi-mimeType or multi-codec\n * variants will be allowed.\n * @export\n */\n setAllowMultiTypeVariants(allowed) {\n this.multiTypeVariantsAllowed_ = allowed;\n }\n\n /**\n * @param {boolean} useOnce if true, stream will be used only once in period\n * flattening algorithm.\n * @export\n */\n setUseStreamOnce(useOnce) {\n this.useStreamOnce_ = useOnce;\n }\n\n /**\n * @param {T} outputStream An audio or video output stream\n * @param {T} candidate A candidate stream to be combined with the output\n * @return {boolean} True if the candidate could be combined with the\n * output stream\n *\n * @template T\n * Accepts either a StreamDB or Stream type.\n *\n * @private\n */\n areAVStreamsCompatible_(outputStream, candidate) {\n // Check for an exact match.\n if (!shaka.util.PeriodCombiner.areAVStreamsExactMatch_(\n outputStream, candidate)) {\n // It's not an exact match. See if we can do multi-codec or multi-mimeType\n // stream instead, using SourceBuffer.changeType.\n if (!this.multiTypeVariantsAllowed_) {\n return false;\n }\n }\n\n // This field is only available on Stream, not StreamDB.\n if (outputStream.drmInfos) {\n // Check for compatible DRM systems. Note that clear streams are\n // implicitly compatible with any DRM and with each other.\n if (!shaka.drm.DrmUtils.areDrmCompatible(outputStream.drmInfos,\n candidate.drmInfos)) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * @param {T} outputStream A text output stream\n * @param {T} candidate A candidate stream to be combined with the output\n * @return {boolean} True if the candidate could be combined with the\n * output\n *\n * @template T\n * Accepts either a StreamDB or Stream type.\n *\n * @private\n */\n static areTextStreamsCompatible_(outputStream, candidate) {\n const LanguageUtils = shaka.util.LanguageUtils;\n\n // For text, we don't care about MIME type or codec. We can always switch\n // between text types.\n\n // If the candidate is a dummy, then it is compatible, and we could use it\n // if nothing else matches.\n if (!candidate.language) {\n return true;\n }\n\n // Forced subtitles should be treated as unique streams\n if (outputStream.forced !== candidate.forced) {\n return false;\n }\n\n const languageRelatedness = LanguageUtils.relatedness(\n outputStream.language, candidate.language);\n\n // We will strictly avoid combining text across languages or \"kinds\"\n // (caption vs subtitle).\n if (languageRelatedness == 0 ||\n candidate.kind != outputStream.kind) {\n return false;\n }\n\n return true;\n }\n\n /**\n * @param {T} outputStream A image output stream\n * @param {T} candidate A candidate stream to be combined with the output\n * @return {boolean} True if the candidate could be combined with the\n * output\n *\n * @template T\n * Accepts either a StreamDB or Stream type.\n *\n * @private\n */\n static areImageStreamsCompatible_(outputStream, candidate) {\n // For image, we don't care about MIME type. We can always switch\n // between image types.\n\n return true;\n }\n\n /**\n * @param {T} outputStream An audio output stream\n * @param {T} best The best match so far for this period\n * @param {T} candidate A candidate stream which might be better\n * @return {boolean} True if the candidate is a better match\n *\n * @template T\n * Accepts either a StreamDB or Stream type.\n *\n * @private\n */\n static isAudioStreamBetterMatch_(outputStream, best, candidate) {\n const LanguageUtils = shaka.util.LanguageUtils;\n const {BETTER, EQUAL, WORSE} = shaka.util.PeriodCombiner.BetterOrWorse;\n\n // An exact match is better than a non-exact match.\n const bestIsExact = shaka.util.PeriodCombiner.areAVStreamsExactMatch_(\n outputStream, best);\n const candidateIsExact = shaka.util.PeriodCombiner.areAVStreamsExactMatch_(\n outputStream, candidate);\n if (bestIsExact && !candidateIsExact) {\n return false;\n }\n if (!bestIsExact && candidateIsExact) {\n return true;\n }\n\n // The most important thing is language. In some cases, we will accept a\n // different language across periods when we must.\n const bestRelatedness = LanguageUtils.relatedness(\n outputStream.language, best.language);\n const candidateRelatedness = LanguageUtils.relatedness(\n outputStream.language, candidate.language);\n\n if (candidateRelatedness > bestRelatedness) {\n return true;\n }\n if (candidateRelatedness < bestRelatedness) {\n return false;\n }\n\n // If language-based differences haven't decided this, look at labels.\n // If available options differ, look does any matches with output stream.\n if (best.label !== candidate.label) {\n if (outputStream.label === best.label) {\n return false;\n }\n if (outputStream.label === candidate.label) {\n return true;\n }\n }\n\n // If label-based differences haven't decided this, look at roles. If\n // the candidate has more roles in common with the output, upgrade to the\n // candidate.\n if (outputStream.roles.length) {\n const bestRoleMatches =\n best.roles.filter((role) => outputStream.roles.includes(role));\n const candidateRoleMatches =\n candidate.roles.filter((role) => outputStream.roles.includes(role));\n if (candidateRoleMatches.length > bestRoleMatches.length) {\n return true;\n } else if (candidateRoleMatches.length < bestRoleMatches.length) {\n return false;\n } else if (candidate.roles.length !== best.roles.length) {\n // Both streams have the same role overlap with the outputStream\n // If this is the case, choose the stream with the fewer roles overall.\n // Streams that match best together tend to be streams with the same\n // roles, e g stream1 with roles [r1, r2] is likely a better match\n // for stream2 with roles [r1, r2] vs stream3 with roles\n // [r1, r2, r3, r4].\n // If we match stream1 with stream3 due to the same role overlap,\n // stream2 is likely to be left unmatched and error out later.\n // See https://github.com/shaka-project/shaka-player/issues/2542 for\n // more details.\n return candidate.roles.length < best.roles.length;\n }\n } else if (!candidate.roles.length && best.roles.length) {\n // If outputStream has no roles, and only one of the streams has no roles,\n // choose the one with no roles.\n return true;\n } else if (candidate.roles.length && !best.roles.length) {\n return false;\n }\n\n // If the language doesn't match, but the candidate is the \"primary\"\n // language, then that should be preferred as a fallback.\n if (!best.primary && candidate.primary) {\n return true;\n }\n if (best.primary && !candidate.primary) {\n return false;\n }\n\n // If language-based and role-based features are equivalent, take the audio\n // with the closes channel count to the output.\n const channelsBetterOrWorse =\n shaka.util.PeriodCombiner.compareClosestPreferLower(\n outputStream.channelsCount,\n best.channelsCount,\n candidate.channelsCount);\n if (channelsBetterOrWorse == BETTER) {\n return true;\n } else if (channelsBetterOrWorse == WORSE) {\n return false;\n }\n\n // If channels are equal, take the closest sample rate to the output.\n const sampleRateBetterOrWorse =\n shaka.util.PeriodCombiner.compareClosestPreferLower(\n outputStream.audioSamplingRate,\n best.audioSamplingRate,\n candidate.audioSamplingRate);\n if (sampleRateBetterOrWorse == BETTER) {\n return true;\n } else if (sampleRateBetterOrWorse == WORSE) {\n return false;\n }\n\n if (outputStream.bandwidth) {\n // Take the audio with the closest bandwidth to the output.\n const bandwidthBetterOrWorse =\n shaka.util.PeriodCombiner.compareClosestPreferMinimalAbsDiff_(\n outputStream.bandwidth,\n best.bandwidth,\n candidate.bandwidth);\n if (bandwidthBetterOrWorse == BETTER) {\n return true;\n } else if (bandwidthBetterOrWorse == WORSE) {\n return false;\n }\n }\n\n // If the result of each comparison was inconclusive, default to false.\n return false;\n }\n\n /**\n * @param {T} outputStream A video output stream\n * @param {T} best The best match so far for this period\n * @param {T} candidate A candidate stream which might be better\n * @return {boolean} True if the candidate is a better match\n *\n * @template T\n * Accepts either a StreamDB or Stream type.\n *\n * @private\n */\n static isVideoStreamBetterMatch_(outputStream, best, candidate) {\n const {BETTER, EQUAL, WORSE} = shaka.util.PeriodCombiner.BetterOrWorse;\n\n // An exact match is better than a non-exact match.\n const bestIsExact = shaka.util.PeriodCombiner.areAVStreamsExactMatch_(\n outputStream, best);\n const candidateIsExact = shaka.util.PeriodCombiner.areAVStreamsExactMatch_(\n outputStream, candidate);\n if (bestIsExact && !candidateIsExact) {\n return false;\n }\n if (!bestIsExact && candidateIsExact) {\n return true;\n }\n\n // Take the video with the closest resolution to the output.\n const resolutionBetterOrWorse =\n shaka.util.PeriodCombiner.compareClosestPreferLower(\n outputStream.width * outputStream.height,\n best.width * best.height,\n candidate.width * candidate.height);\n if (resolutionBetterOrWorse == BETTER) {\n return true;\n } else if (resolutionBetterOrWorse == WORSE) {\n return false;\n }\n\n // We may not know the frame rate for the content, in which case this gets\n // skipped.\n if (outputStream.frameRate) {\n // Take the video with the closest frame rate to the output.\n const frameRateBetterOrWorse =\n shaka.util.PeriodCombiner.compareClosestPreferLower(\n outputStream.frameRate,\n best.frameRate,\n candidate.frameRate);\n if (frameRateBetterOrWorse == BETTER) {\n return true;\n } else if (frameRateBetterOrWorse == WORSE) {\n return false;\n }\n }\n\n\n if (outputStream.bandwidth) {\n // Take the video with the closest bandwidth to the output.\n const bandwidthBetterOrWorse =\n shaka.util.PeriodCombiner.compareClosestPreferMinimalAbsDiff_(\n outputStream.bandwidth,\n best.bandwidth,\n candidate.bandwidth);\n if (bandwidthBetterOrWorse == BETTER) {\n return true;\n } else if (bandwidthBetterOrWorse == WORSE) {\n return false;\n }\n }\n\n // If the result of each comparison was inconclusive, default to false.\n return false;\n }\n\n /**\n * @param {T} outputStream A text output stream\n * @param {T} best The best match so far for this period\n * @param {T} candidate A candidate stream which might be better\n * @return {boolean} True if the candidate is a better match\n *\n * @template T\n * Accepts either a StreamDB or Stream type.\n *\n * @private\n */\n static isTextStreamBetterMatch_(outputStream, best, candidate) {\n const LanguageUtils = shaka.util.LanguageUtils;\n\n // The most important thing is language. In some cases, we will accept a\n // different language across periods when we must.\n const bestRelatedness = LanguageUtils.relatedness(\n outputStream.language, best.language);\n const candidateRelatedness = LanguageUtils.relatedness(\n outputStream.language, candidate.language);\n\n if (candidateRelatedness > bestRelatedness) {\n return true;\n }\n if (candidateRelatedness < bestRelatedness) {\n return false;\n }\n\n // If the language doesn't match, but the candidate is the \"primary\"\n // language, then that should be preferred as a fallback.\n if (!best.primary && candidate.primary) {\n return true;\n }\n if (best.primary && !candidate.primary) {\n return false;\n }\n\n // If language-based differences haven't decided this, look at labels.\n // If available options differ, look does any matches with output stream.\n if (best.label !== candidate.label) {\n if (outputStream.label === best.label) {\n return false;\n }\n if (outputStream.label === candidate.label) {\n return true;\n }\n }\n\n // If the candidate has more roles in common with the output, upgrade to the\n // candidate.\n if (outputStream.roles.length) {\n const bestRoleMatches =\n best.roles.filter((role) => outputStream.roles.includes(role));\n const candidateRoleMatches =\n candidate.roles.filter((role) => outputStream.roles.includes(role));\n if (candidateRoleMatches.length > bestRoleMatches.length) {\n return true;\n }\n if (candidateRoleMatches.length < bestRoleMatches.length) {\n return false;\n }\n } else if (!candidate.roles.length && best.roles.length) {\n // If outputStream has no roles, and only one of the streams has no roles,\n // choose the one with no roles.\n return true;\n } else if (candidate.roles.length && !best.roles.length) {\n return false;\n }\n\n // If the candidate has the same MIME type and codec, upgrade to the\n // candidate. It's not required that text streams use the same format\n // across periods, but it's a helpful signal. Some content in our demo app\n // contains the same languages repeated with two different text formats in\n // each period. This condition ensures that all text streams are used.\n // Otherwise, we wind up with some one stream of each language left unused,\n // triggering a failure.\n if (candidate.mimeType == outputStream.mimeType &&\n candidate.codecs == outputStream.codecs &&\n (best.mimeType != outputStream.mimeType ||\n best.codecs != outputStream.codecs)) {\n return true;\n }\n\n // If the result of each comparison was inconclusive, default to false.\n return false;\n }\n\n /**\n * @param {T} outputStream A image output stream\n * @param {T} best The best match so far for this period\n * @param {T} candidate A candidate stream which might be better\n * @return {boolean} True if the candidate is a better match\n *\n * @template T\n * Accepts either a StreamDB or Stream type.\n *\n * @private\n */\n static isImageStreamBetterMatch_(outputStream, best, candidate) {\n const {BETTER, EQUAL, WORSE} = shaka.util.PeriodCombiner.BetterOrWorse;\n\n // Take the image with the closest resolution to the output.\n const resolutionBetterOrWorse =\n shaka.util.PeriodCombiner.compareClosestPreferLower(\n outputStream.width * outputStream.height,\n best.width * best.height,\n candidate.width * candidate.height);\n if (resolutionBetterOrWorse == BETTER) {\n return true;\n } else if (resolutionBetterOrWorse == WORSE) {\n return false;\n }\n\n // If the result of each comparison was inconclusive, default to false.\n return false;\n }\n\n /**\n * Create a dummy StreamDB to fill in periods that are missing a certain type,\n * to avoid failing the general flattening algorithm. This won't be used for\n * audio or video, since those are strictly required in all periods if they\n * exist in any period.\n *\n * @param {shaka.util.ManifestParserUtils.ContentType} type\n * @return {shaka.extern.StreamDB}\n * @private\n */\n static dummyStreamDB_(type) {\n return {\n id: 0,\n originalId: '',\n groupId: null,\n primary: false,\n type,\n mimeType: '',\n codecs: '',\n language: '',\n originalLanguage: null,\n label: null,\n width: null,\n height: null,\n encrypted: false,\n keyIds: new Set(),\n segments: [],\n variantIds: [],\n roles: [],\n forced: false,\n channelsCount: null,\n audioSamplingRate: null,\n spatialAudio: false,\n closedCaptions: null,\n external: false,\n fastSwitching: false,\n isAudioMuxedInVideo: false,\n baseOriginalId: null,\n };\n }\n\n /**\n * Create a dummy Stream to fill in periods that are missing a certain type,\n * to avoid failing the general flattening algorithm. This won't be used for\n * audio or video, since those are strictly required in all periods if they\n * exist in any period.\n *\n * @param {shaka.util.ManifestParserUtils.ContentType} type\n * @return {shaka.extern.Stream}\n * @private\n */\n static dummyStream_(type) {\n return {\n id: 0,\n originalId: '',\n groupId: null,\n createSegmentIndex: () => Promise.resolve(),\n segmentIndex: new shaka.media.SegmentIndex([]),\n mimeType: '',\n codecs: '',\n encrypted: false,\n drmInfos: [],\n keyIds: new Set(),\n language: '',\n originalLanguage: null,\n label: null,\n type,\n primary: false,\n trickModeVideo: null,\n dependencyStream: null,\n emsgSchemeIdUris: null,\n roles: [],\n forced: false,\n channelsCount: null,\n audioSamplingRate: null,\n spatialAudio: false,\n closedCaptions: null,\n accessibilityPurpose: null,\n external: false,\n fastSwitching: false,\n fullMimeTypes: new Set(),\n isAudioMuxedInVideo: false,\n baseOriginalId: null,\n };\n }\n\n /**\n * Compare the best value so far with the candidate value and the output\n * value. Decide if the candidate is better, equal, or worse than the best\n * so far. Any value less than or equal to the output is preferred over a\n * larger value, and closer to the output is better than farther.\n *\n * This provides us a generic way to choose things that should match as\n * closely as possible, like resolution, frame rate, audio channels, or\n * sample rate. If we have to go higher to make a match, we will. But if\n * the user selects 480p, for example, we don't want to surprise them with\n * 720p and waste bandwidth if there's another choice available to us.\n *\n * @param {number} outputValue\n * @param {number} bestValue\n * @param {number} candidateValue\n * @return {shaka.util.PeriodCombiner.BetterOrWorse}\n */\n static compareClosestPreferLower(outputValue, bestValue, candidateValue) {\n const {BETTER, EQUAL, WORSE} = shaka.util.PeriodCombiner.BetterOrWorse;\n\n // If one is the exact match for the output value, and the other isn't,\n // prefer the one that is the exact match.\n if (bestValue == outputValue && outputValue != candidateValue) {\n return WORSE;\n } else if (candidateValue == outputValue && outputValue != bestValue) {\n return BETTER;\n }\n\n if (bestValue > outputValue) {\n if (candidateValue <= outputValue) {\n // Any smaller-or-equal-to-output value is preferable to a\n // bigger-than-output value.\n return BETTER;\n }\n\n // Both \"best\" and \"candidate\" are greater than the output. Take\n // whichever is closer.\n if (candidateValue - outputValue < bestValue - outputValue) {\n return BETTER;\n } else if (candidateValue - outputValue > bestValue - outputValue) {\n return WORSE;\n }\n } else {\n // The \"best\" so far is less than or equal to the output. If the\n // candidate is bigger than the output, we don't want it.\n if (candidateValue > outputValue) {\n return WORSE;\n }\n\n // Both \"best\" and \"candidate\" are less than or equal to the output.\n // Take whichever is closer.\n if (outputValue - candidateValue < outputValue - bestValue) {\n return BETTER;\n } else if (outputValue - candidateValue > outputValue - bestValue) {\n return WORSE;\n }\n }\n\n return EQUAL;\n }\n\n /**\n * @param {number} outputValue\n * @param {number} bestValue\n * @param {number} candidateValue\n * @return {shaka.util.PeriodCombiner.BetterOrWorse}\n * @private\n */\n static compareClosestPreferMinimalAbsDiff_(\n outputValue, bestValue, candidateValue) {\n const {BETTER, EQUAL, WORSE} = shaka.util.PeriodCombiner.BetterOrWorse;\n\n const absDiffBest = Math.abs(outputValue - bestValue);\n const absDiffCandidate = Math.abs(outputValue - candidateValue);\n if (absDiffCandidate < absDiffBest) {\n return BETTER;\n } else if (absDiffBest < absDiffCandidate) {\n return WORSE;\n }\n\n return EQUAL;\n }\n\n /**\n * @param {T} stream\n * @return {boolean}\n * @template T\n * Accepts either a StreamDB or Stream type.\n * @private\n */\n static isDummy_(stream) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n switch (stream.type) {\n case ContentType.TEXT:\n return !stream.language;\n case ContentType.IMAGE:\n return !stream.tilesLayout;\n default:\n return false;\n }\n }\n\n /**\n * @param {T} v\n * @return {string}\n * @template T\n * Accepts either a StreamDB or Stream type.\n * @private\n */\n static generateVideoKey_(v) {\n return shaka.util.PeriodCombiner.generateKey_([\n v.fastSwitching,\n v.width,\n v.frameRate,\n shaka.util.PeriodCombiner.getCodec_(v.codecs),\n v.mimeType,\n v.label,\n v.roles,\n v.closedCaptions ? Array.from(v.closedCaptions.entries()) : null,\n v.bandwidth,\n v.dependencyStream ? v.dependencyStream.baseOriginalId : null,\n Array.from(v.keyIds),\n ]);\n }\n\n /**\n * @param {T} a\n * @return {string}\n * @template T\n * Accepts either a StreamDB or Stream type.\n * @private\n */\n static generateAudioKey_(a) {\n return shaka.util.PeriodCombiner.generateKey_([\n a.fastSwitching,\n a.channelsCount,\n a.language,\n a.bandwidth,\n a.label,\n shaka.util.PeriodCombiner.getCodec_(a.codecs),\n a.mimeType,\n a.roles,\n a.audioSamplingRate,\n a.primary,\n a.dependencyStream ? a.dependencyStream.baseOriginalId : null,\n Array.from(a.keyIds),\n ]);\n }\n\n /**\n * @param {T} t\n * @return {string}\n * @template T\n * Accepts either a StreamDB or Stream type.\n * @private\n */\n static generateTextKey_(t) {\n return shaka.util.PeriodCombiner.generateKey_([\n t.language,\n t.label,\n t.codecs,\n t.mimeType,\n t.bandwidth,\n t.roles,\n ]);\n }\n\n /**\n * @param {T} i\n * @return {string}\n * @template T\n * Accepts either a StreamDB or Stream type.\n * @private\n */\n static generateImageKey_(i) {\n return shaka.util.PeriodCombiner.generateKey_([\n i.width,\n i.codecs,\n i.mimeType,\n ]);\n }\n\n /**\n * @param {!Array<*>} values\n * @return {string}\n * @private\n */\n static generateKey_(values) {\n return JSON.stringify(values);\n }\n\n /**\n * @param {string} codecs\n * @return {string}\n * @private\n */\n static getCodec_(codecs) {\n if (!shaka.util.PeriodCombiner.memoizedCodecs.has(codecs)) {\n const normalizedCodec = shaka.util.MimeUtils.getNormalizedCodec(codecs);\n shaka.util.PeriodCombiner.memoizedCodecs.set(codecs, normalizedCodec);\n }\n return shaka.util.PeriodCombiner.memoizedCodecs.get(codecs);\n }\n};\n\n/**\n * @enum {number}\n */\nshaka.util.PeriodCombiner.BetterOrWorse = {\n BETTER: 1,\n EQUAL: 0,\n WORSE: -1,\n};\n\n/**\n * @private {Map<string, string>}\n */\nshaka.util.PeriodCombiner.memoizedCodecs = new Map();\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.XmlUtils');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.log');\ngoog.require('shaka.util.Lazy');\ngoog.require('shaka.util.StringUtils');\n\n\n/**\n * @summary A set of XML utility functions.\n */\nshaka.util.XmlUtils = class {\n /**\n * Parse a string and return the resulting root element if it was valid XML.\n *\n * @param {string} xmlString\n * @param {string} expectedRootElemName\n * @return {Element}\n */\n static parseXmlString(xmlString, expectedRootElemName) {\n const parser = new DOMParser();\n const unsafeXmlString =\n shaka.util.XmlUtils.trustedHTMLFromString_.value()(xmlString);\n let unsafeXml = null;\n try {\n unsafeXml = parser.parseFromString(unsafeXmlString, 'text/xml');\n } catch (exception) {\n shaka.log.error('XML parsing exception:', exception);\n return null;\n }\n\n // According to MDN, parseFromString never returns null.\n goog.asserts.assert(unsafeXml, 'Parsed XML document cannot be null!');\n\n // Check for empty documents.\n const rootElem = unsafeXml.documentElement;\n if (!rootElem) {\n shaka.log.error('XML document was empty!');\n return null;\n }\n\n // Check for parser errors.\n // cspell:disable-next-line\n const parserErrorElements = rootElem.getElementsByTagName('parsererror');\n if (parserErrorElements.length) {\n shaka.log.error('XML parser error found:', parserErrorElements[0]);\n return null;\n }\n\n // The top-level element in the loaded XML should have the name we expect.\n if (rootElem.tagName != expectedRootElemName) {\n shaka.log.error(\n `XML tag name does not match expected \"${expectedRootElemName}\":`,\n rootElem.tagName);\n return null;\n }\n\n // Cobalt browser doesn't support document.createNodeIterator.\n if (!('createNodeIterator' in document)) {\n return rootElem;\n }\n\n // SECURITY: Verify that the document does not contain elements from the\n // HTML or SVG namespaces, which could trigger script execution and XSS.\n const iterator = document.createNodeIterator(\n unsafeXml,\n NodeFilter.SHOW_ALL,\n );\n let currentNode;\n while (currentNode = iterator.nextNode()) {\n if (currentNode instanceof HTMLElement ||\n currentNode instanceof SVGElement) {\n shaka.log.error('XML document embeds unsafe content!');\n return null;\n }\n }\n\n return rootElem;\n }\n\n\n /**\n * Parse some data (auto-detecting the encoding) and return the resulting\n * root element if it was valid XML.\n * @param {BufferSource} data\n * @param {string} expectedRootElemName\n * @return {Element}\n */\n static parseXml(data, expectedRootElemName) {\n try {\n const string = shaka.util.StringUtils.fromBytesAutoDetect(data);\n return shaka.util.XmlUtils.parseXmlString(string, expectedRootElemName);\n } catch (exception) {\n shaka.log.error('parseXmlString threw!', exception);\n return null;\n }\n }\n\n\n /**\n * Converts a Element to BufferSource.\n * @param {!Element} elem\n * @return {!ArrayBuffer}\n */\n static toArrayBuffer(elem) {\n return shaka.util.StringUtils.toUTF8(elem.outerHTML);\n }\n};\n\n/**\n * Promote a string to TrustedHTML. This function is security-sensitive and\n * should only be used with security approval where the string is guaranteed not\n * to cause an XSS vulnerability.\n *\n * @private {!shaka.util.Lazy.<function(!string): (!TrustedHTML|!string)>}\n */\nshaka.util.XmlUtils.trustedHTMLFromString_ = new shaka.util.Lazy(() => {\n if (typeof trustedTypes !== 'undefined') {\n // Create a Trusted Types policy for promoting the string to TrustedHTML.\n // The Lazy wrapper ensures this policy is only created once.\n const policy = trustedTypes.createPolicy('shaka-player#xml', {\n createHTML: (s) => s,\n });\n return (s) => policy.createHTML(s);\n }\n // Fall back to strings in environments that don't support Trusted Types.\n return (s) => s;\n});\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.dash.DashParser');\n\ngoog.require('goog.asserts');\ngoog.require('goog.Uri');\ngoog.require('shaka.Deprecate');\ngoog.require('shaka.abr.Ewma');\ngoog.require('shaka.dash.ContentProtection');\ngoog.require('shaka.dash.MpdUtils');\ngoog.require('shaka.dash.SegmentBase');\ngoog.require('shaka.dash.SegmentList');\ngoog.require('shaka.dash.SegmentTemplate');\ngoog.require('shaka.log');\ngoog.require('shaka.media.Capabilities');\ngoog.require('shaka.media.ManifestParser');\ngoog.require('shaka.media.PresentationTimeline');\ngoog.require('shaka.media.SegmentIndex');\ngoog.require('shaka.media.SegmentUtils');\ngoog.require('shaka.net.NetworkingEngine');\ngoog.require('shaka.text.TextEngine');\ngoog.require('shaka.util.ContentSteeringManager');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.EventManager');\ngoog.require('shaka.util.Functional');\ngoog.require('shaka.util.LanguageUtils');\ngoog.require('shaka.util.ManifestParserUtils');\ngoog.require('shaka.util.MimeUtils');\ngoog.require('shaka.util.Networking');\ngoog.require('shaka.util.ObjectUtils');\ngoog.require('shaka.util.OperationManager');\ngoog.require('shaka.util.PeriodCombiner');\ngoog.require('shaka.util.PlayerConfiguration');\ngoog.require('shaka.util.StreamUtils');\ngoog.require('shaka.util.StringUtils');\ngoog.require('shaka.util.Timer');\ngoog.require('shaka.util.TXml');\ngoog.require('shaka.util.XmlUtils');\n\n\n/**\n * Creates a new DASH parser.\n *\n * @implements {shaka.extern.ManifestParser}\n * @export\n */\nshaka.dash.DashParser = class {\n /** Creates a new DASH parser. */\n constructor() {\n /** @private {?shaka.extern.ManifestConfiguration} */\n this.config_ = null;\n\n /** @private {?shaka.extern.ManifestParser.PlayerInterface} */\n this.playerInterface_ = null;\n\n /** @private {!Array<string>} */\n this.manifestUris_ = [];\n\n /** @private {?shaka.extern.Manifest} */\n this.manifest_ = null;\n\n /** @private {number} */\n this.globalId_ = 1;\n\n /** @private {!Array<shaka.extern.xml.Node>} */\n this.patchLocationNodes_ = [];\n\n /**\n * A context of the living manifest used for processing\n * Patch MPD's\n * @private {!shaka.dash.DashParser.PatchContext}\n */\n this.manifestPatchContext_ = {\n mpdId: '',\n type: '',\n profiles: [],\n mediaPresentationDuration: null,\n availabilityTimeOffset: 0,\n getBaseUris: null,\n publishTime: 0,\n };\n\n /**\n * This is a cache is used the store a snapshot of the context\n * object which is built up throughout node traversal to maintain\n * a current state. This data needs to be preserved for parsing\n * patches.\n * The key is a combination period and representation id's.\n * @private {!Map<string, !shaka.dash.DashParser.Context>}\n */\n this.contextCache_ = new Map();\n\n /**\n * A map of IDs to Stream objects.\n * ID: Period@id,Representation@id\n * e.g.: '1,23'\n * @private {!Map<string, !shaka.extern.Stream>}\n */\n this.streamMap_ = new Map();\n\n /**\n * A map of Period IDs to Stream Map IDs.\n * Use to have direct access to streamMap key.\n * @private {!Map<string, !Array<string>>}\n */\n this.indexStreamMap_ = new Map();\n\n /**\n * A map of period ids to their durations\n * @private {!Map<string, number>}\n */\n this.periodDurations_ = new Map();\n\n /** @private {shaka.util.PeriodCombiner} */\n this.periodCombiner_ = new shaka.util.PeriodCombiner();\n\n /**\n * The update period in seconds, or 0 for no updates.\n * @private {number}\n */\n this.updatePeriod_ = 0;\n\n /**\n * An ewma that tracks how long updates take.\n * This is to mitigate issues caused by slow parsing on embedded devices.\n * @private {!shaka.abr.Ewma}\n */\n this.averageUpdateDuration_ = new shaka.abr.Ewma(5);\n\n /** @private {shaka.util.Timer} */\n this.updateTimer_ = new shaka.util.Timer(() => {\n if (this.mediaElement_ && !this.config_.continueLoadingWhenPaused) {\n this.eventManager_.unlisten(this.mediaElement_, 'timeupdate');\n if (this.mediaElement_.paused) {\n this.eventManager_.listenOnce(\n this.mediaElement_, 'timeupdate', () => this.onUpdate_());\n return;\n }\n }\n this.onUpdate_();\n });\n\n /** @private {!shaka.util.OperationManager} */\n this.operationManager_ = new shaka.util.OperationManager();\n\n /**\n * Largest period start time seen.\n * @private {?number}\n */\n this.largestPeriodStartTime_ = null;\n\n /**\n * Period IDs seen in previous manifest.\n * @private {!Array<string>}\n */\n this.lastManifestUpdatePeriodIds_ = [];\n\n /**\n * The minimum of the availabilityTimeOffset values among the adaptation\n * sets.\n * @private {number}\n */\n this.minTotalAvailabilityTimeOffset_ = Infinity;\n\n /** @private {boolean} */\n this.lowLatencyMode_ = false;\n\n /** @private {?shaka.util.ContentSteeringManager} */\n this.contentSteeringManager_ = null;\n\n /** @private {number} */\n this.gapCount_ = 0;\n\n /** @private {boolean} */\n this.isLowLatency_ = false;\n\n /** @private {shaka.util.EventManager} */\n this.eventManager_ = new shaka.util.EventManager();\n\n /** @private {HTMLMediaElement} */\n this.mediaElement_ = null;\n\n /** @private {boolean} */\n this.isTransitionFromDynamicToStatic_ = false;\n\n /** @private {string} */\n this.lastManifestQueryParams_ = '';\n\n /** @private {function():boolean} */\n this.isPreloadFn_ = () => false;\n\n /** @private {?Array<string>} */\n this.lastCalculatedBaseUris_ = [];\n }\n\n /**\n * @param {shaka.extern.ManifestConfiguration} config\n * @param {(function():boolean)=} isPreloadFn\n * @override\n * @exportInterface\n */\n configure(config, isPreloadFn) {\n goog.asserts.assert(config.dash != null,\n 'DashManifestConfiguration should not be null!');\n const needFireUpdate = this.playerInterface_ &&\n config.updatePeriod != this.config_.updatePeriod &&\n config.updatePeriod >= 0;\n this.config_ = config;\n if (isPreloadFn) {\n this.isPreloadFn_ = isPreloadFn;\n }\n if (needFireUpdate && this.manifest_ &&\n this.manifest_.presentationTimeline.isLive()) {\n this.updateNow_();\n }\n if (this.contentSteeringManager_) {\n this.contentSteeringManager_.configure(this.config_);\n }\n\n if (this.periodCombiner_) {\n this.periodCombiner_.setAllowMultiTypeVariants(\n this.config_.dash.multiTypeVariantsAllowed &&\n shaka.media.Capabilities.isChangeTypeSupported());\n this.periodCombiner_.setUseStreamOnce(\n this.config_.dash.useStreamOnceInPeriodFlattening);\n }\n }\n\n /**\n * @override\n * @exportInterface\n */\n async start(uri, playerInterface) {\n goog.asserts.assert(this.config_, 'Must call configure() before start()!');\n this.lowLatencyMode_ = playerInterface.isLowLatencyMode();\n this.manifestUris_ = [uri];\n this.playerInterface_ = playerInterface;\n\n const updateDelay = await this.requestManifest_();\n\n if (this.playerInterface_) {\n this.setUpdateTimer_(updateDelay);\n }\n\n // Make sure that the parser has not been destroyed.\n if (!this.playerInterface_) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.PLAYER,\n shaka.util.Error.Code.OPERATION_ABORTED);\n }\n\n goog.asserts.assert(this.manifest_, 'Manifest should be non-null!');\n return this.manifest_;\n }\n\n /**\n * @override\n * @exportInterface\n */\n stop() {\n // When the parser stops, release all segment indexes, which stops their\n // timers, as well.\n for (const stream of this.streamMap_.values()) {\n if (stream.segmentIndex) {\n stream.segmentIndex.release();\n }\n }\n\n if (this.periodCombiner_) {\n this.periodCombiner_.release();\n }\n\n this.playerInterface_ = null;\n this.config_ = null;\n this.manifestUris_ = [];\n this.manifest_ = null;\n this.streamMap_.clear();\n this.indexStreamMap_.clear();\n this.contextCache_.clear();\n this.manifestPatchContext_ = {\n mpdId: '',\n type: '',\n profiles: [],\n mediaPresentationDuration: null,\n availabilityTimeOffset: 0,\n getBaseUris: null,\n publishTime: 0,\n };\n this.periodCombiner_ = null;\n\n if (this.updateTimer_ != null) {\n this.updateTimer_.stop();\n this.updateTimer_ = null;\n }\n\n if (this.contentSteeringManager_) {\n this.contentSteeringManager_.destroy();\n }\n\n if (this.eventManager_) {\n this.eventManager_.release();\n this.eventManager_ = null;\n }\n\n return this.operationManager_.destroy();\n }\n\n /**\n * @override\n * @exportInterface\n */\n async update() {\n try {\n await this.requestManifest_();\n } catch (error) {\n if (!this.playerInterface_ || !error) {\n return;\n }\n goog.asserts.assert(error instanceof shaka.util.Error, 'Bad error type');\n this.playerInterface_.onError(error);\n }\n }\n\n /**\n * @override\n * @exportInterface\n */\n onExpirationUpdated(sessionId, expiration) {\n // No-op\n }\n\n /**\n * @override\n * @exportInterface\n */\n onInitialVariantChosen(variant) {\n // For live it is necessary that the first time we update the manifest with\n // a shorter time than indicated to take into account that the last segment\n // added could be halfway, for example\n if (this.manifest_ && this.manifest_.presentationTimeline.isLive()) {\n const stream = variant.video || variant.audio;\n if (stream && stream.segmentIndex) {\n const availabilityEnd =\n this.manifest_.presentationTimeline.getSegmentAvailabilityEnd();\n const position = stream.segmentIndex.find(availabilityEnd);\n if (position == null) {\n return;\n }\n const reference = stream.segmentIndex.get(position);\n if (!reference) {\n return;\n }\n this.updatePeriod_ = reference.endTime - availabilityEnd;\n this.setUpdateTimer_(/* offset= */ 0);\n }\n }\n }\n\n /**\n * @override\n * @exportInterface\n */\n banLocation(uri) {\n if (this.contentSteeringManager_) {\n this.contentSteeringManager_.banLocation(uri);\n }\n }\n\n /**\n * @override\n * @exportInterface\n */\n setMediaElement(mediaElement) {\n this.mediaElement_ = mediaElement;\n }\n\n /**\n * Makes a network request for the manifest and parses the resulting data.\n *\n * @return {!Promise<number>} Resolves with the time it took, in seconds, to\n * fulfill the request and parse the data.\n * @private\n */\n async requestManifest_() {\n const requestType = shaka.net.NetworkingEngine.RequestType.MANIFEST;\n let type = shaka.net.NetworkingEngine.AdvancedRequestType.MPD;\n let rootElement = 'MPD';\n const patchLocationUris = this.getPatchLocationUris_();\n let manifestUris = this.manifestUris_;\n if (patchLocationUris.length) {\n manifestUris = patchLocationUris;\n rootElement = 'Patch';\n type = shaka.net.NetworkingEngine.AdvancedRequestType.MPD_PATCH;\n } else if (this.manifestUris_.length > 1 && this.contentSteeringManager_) {\n const locations = this.contentSteeringManager_.getLocations(\n 'Location', /* ignoreBaseUrls= */ true);\n if (locations.length) {\n manifestUris = locations;\n }\n }\n const request = shaka.net.NetworkingEngine.makeRequest(\n manifestUris, this.config_.retryParameters);\n const startTime = Date.now();\n\n const response = await this.makeNetworkRequest_(\n request, requestType, {type});\n\n // Detect calls to stop().\n if (!this.playerInterface_) {\n return 0;\n }\n\n // For redirections add the response uri to the first entry in the\n // Manifest Uris array.\n if (response.uri && response.uri != response.originalUri &&\n !this.manifestUris_.includes(response.uri)) {\n this.manifestUris_.unshift(response.uri);\n }\n\n const uriObj = new goog.Uri(response.uri);\n this.lastManifestQueryParams_ = uriObj.getQueryData().toString();\n\n // This may throw, but it will result in a failed promise.\n await this.parseManifest_(response.data, response.uri, rootElement);\n // Keep track of how long the longest manifest update took.\n const endTime = Date.now();\n const updateDuration = (endTime - startTime) / 1000.0;\n this.averageUpdateDuration_.sample(1, updateDuration);\n\n // Let the caller know how long this update took.\n return updateDuration;\n }\n\n /**\n * Parses the manifest XML. This also handles updates and will update the\n * stored manifest.\n *\n * @param {BufferSource} data\n * @param {string} finalManifestUri The final manifest URI, which may\n * differ from this.manifestUri_ if there has been a redirect.\n * @param {string} rootElement MPD or Patch, depending on context\n * @return {!Promise}\n * @private\n */\n async parseManifest_(data, finalManifestUri, rootElement) {\n let manifestData = data;\n const manifestPreprocessor = this.config_.dash.manifestPreprocessor;\n const defaultManifestPreprocessor =\n shaka.util.PlayerConfiguration.defaultManifestPreprocessor;\n if (manifestPreprocessor != defaultManifestPreprocessor) {\n shaka.Deprecate.deprecateFeature(5,\n 'manifest.dash.manifestPreprocessor configuration',\n 'Please Use manifest.dash.manifestPreprocessorTXml instead.');\n const mpdElement =\n shaka.util.XmlUtils.parseXml(manifestData, rootElement);\n if (!mpdElement) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.DASH_INVALID_XML,\n finalManifestUri);\n }\n manifestPreprocessor(mpdElement);\n manifestData = shaka.util.XmlUtils.toArrayBuffer(mpdElement);\n }\n const mpd = shaka.util.TXml.parseXml(manifestData, rootElement);\n if (!mpd) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.DASH_INVALID_XML,\n finalManifestUri);\n }\n const manifestPreprocessorTXml =\n this.config_.dash.manifestPreprocessorTXml;\n const defaultManifestPreprocessorTXml =\n shaka.util.PlayerConfiguration.defaultManifestPreprocessorTXml;\n if (manifestPreprocessorTXml != defaultManifestPreprocessorTXml) {\n manifestPreprocessorTXml(mpd);\n }\n\n if (rootElement === 'Patch') {\n return this.processPatchManifest_(mpd);\n }\n\n const disableXlinkProcessing = this.config_.dash.disableXlinkProcessing;\n if (disableXlinkProcessing) {\n return this.processManifest_(mpd, finalManifestUri);\n }\n\n // Process the mpd to account for xlink connections.\n const failGracefully = this.config_.dash.xlinkFailGracefully;\n const xlinkOperation = shaka.dash.MpdUtils.processXlinks(\n mpd, this.config_.retryParameters, failGracefully, finalManifestUri,\n this.playerInterface_.networkingEngine);\n this.operationManager_.manage(xlinkOperation);\n const finalMpd = await xlinkOperation.promise;\n return this.processManifest_(finalMpd, finalManifestUri);\n }\n\n\n /**\n * Takes a formatted MPD and converts it into a manifest.\n *\n * @param {!shaka.extern.xml.Node} mpd\n * @param {string} finalManifestUri The final manifest URI, which may\n * differ from this.manifestUri_ if there has been a redirect.\n * @return {!Promise}\n * @private\n */\n async processManifest_(mpd, finalManifestUri) {\n const TXml = shaka.util.TXml;\n\n goog.asserts.assert(this.config_,\n 'Must call configure() before processManifest_()!');\n\n if (this.contentSteeringManager_) {\n this.contentSteeringManager_.clearPreviousLocations();\n }\n\n // Get any Location elements. This will update the manifest location and\n // the base URI.\n /** @type {!Array<string>} */\n let manifestBaseUris = [finalManifestUri];\n /** @type {!Array<string>} */\n const locations = [];\n /** @type {!Map<string, string>} */\n const locationsMapping = new Map();\n const locationsObjs = TXml.findChildren(mpd, 'Location');\n for (const locationsObj of locationsObjs) {\n const serviceLocation = locationsObj.attributes['serviceLocation'];\n const uri = TXml.getContents(locationsObj);\n if (!uri) {\n continue;\n }\n const finalUri = shaka.util.ManifestParserUtils.resolveUris(\n manifestBaseUris, [uri])[0];\n if (serviceLocation) {\n if (this.contentSteeringManager_) {\n this.contentSteeringManager_.addLocation(\n 'Location', serviceLocation, finalUri);\n } else {\n locationsMapping.set(serviceLocation, finalUri);\n }\n }\n locations.push(finalUri);\n }\n if (this.contentSteeringManager_) {\n const steeringLocations = this.contentSteeringManager_.getLocations(\n 'Location', /* ignoreBaseUrls= */ true);\n if (steeringLocations.length > 0) {\n this.manifestUris_ = steeringLocations;\n manifestBaseUris = steeringLocations;\n }\n } else if (locations.length) {\n this.manifestUris_ = locations;\n manifestBaseUris = locations;\n }\n\n this.manifestPatchContext_.mpdId = mpd.attributes['id'] || '';\n this.manifestPatchContext_.publishTime =\n TXml.parseAttr(mpd, 'publishTime', TXml.parseDate) || 0;\n this.patchLocationNodes_ = TXml.findChildren(mpd, 'PatchLocation');\n\n let contentSteeringPromise = Promise.resolve();\n\n const contentSteering = TXml.findChild(mpd, 'ContentSteering');\n if (contentSteering && this.playerInterface_) {\n const defaultPathwayId =\n contentSteering.attributes['defaultServiceLocation'];\n if (!this.contentSteeringManager_) {\n this.contentSteeringManager_ =\n new shaka.util.ContentSteeringManager(this.playerInterface_);\n this.contentSteeringManager_.configure(this.config_);\n this.contentSteeringManager_.setManifestType(\n shaka.media.ManifestParser.DASH);\n this.contentSteeringManager_.setBaseUris(manifestBaseUris);\n this.contentSteeringManager_.setDefaultPathwayId(defaultPathwayId);\n const uri = TXml.getContents(contentSteering);\n if (uri) {\n const queryBeforeStart =\n TXml.parseAttr(contentSteering, 'queryBeforeStart',\n TXml.parseBoolean, /* defaultValue= */ false);\n if (queryBeforeStart) {\n contentSteeringPromise =\n this.contentSteeringManager_.requestInfo(uri);\n } else {\n this.contentSteeringManager_.requestInfo(uri);\n }\n }\n } else {\n this.contentSteeringManager_.setBaseUris(manifestBaseUris);\n this.contentSteeringManager_.setDefaultPathwayId(defaultPathwayId);\n }\n for (const serviceLocation of locationsMapping.keys()) {\n const uri = locationsMapping.get(serviceLocation);\n this.contentSteeringManager_.addLocation(\n 'Location', serviceLocation, uri);\n }\n }\n\n const uriObjs = TXml.findChildren(mpd, 'BaseURL');\n let someLocationValid = false;\n if (this.contentSteeringManager_) {\n for (const uriObj of uriObjs) {\n const serviceLocation = uriObj.attributes['serviceLocation'];\n const uri = TXml.getContents(uriObj);\n if (serviceLocation && uri) {\n this.contentSteeringManager_.addLocation(\n 'BaseURL', serviceLocation, uri);\n someLocationValid = true;\n }\n }\n }\n this.lastCalculatedBaseUris_ = null;\n if (!someLocationValid || !this.contentSteeringManager_) {\n const uris = uriObjs.map(TXml.getContents);\n this.lastCalculatedBaseUris_ = shaka.util.ManifestParserUtils.resolveUris(\n manifestBaseUris, uris);\n }\n\n const getBaseUris = () => {\n if (this.contentSteeringManager_ && someLocationValid) {\n return this.contentSteeringManager_.getLocations('BaseURL');\n }\n if (this.lastCalculatedBaseUris_) {\n return this.lastCalculatedBaseUris_;\n }\n return [];\n };\n\n this.manifestPatchContext_.getBaseUris = getBaseUris;\n\n let availabilityTimeOffset = 0;\n if (uriObjs && uriObjs.length) {\n availabilityTimeOffset = TXml.parseAttr(uriObjs[0],\n 'availabilityTimeOffset', TXml.parseFloat) || 0;\n }\n this.manifestPatchContext_.availabilityTimeOffset = availabilityTimeOffset;\n\n this.updatePeriod_ = /** @type {number} */ (TXml.parseAttr(\n mpd, 'minimumUpdatePeriod', TXml.parseDuration, -1));\n\n const presentationStartTime = TXml.parseAttr(\n mpd, 'availabilityStartTime', TXml.parseDate);\n let segmentAvailabilityDuration = TXml.parseAttr(\n mpd, 'timeShiftBufferDepth', TXml.parseDuration);\n\n const ignoreSuggestedPresentationDelay =\n this.config_.dash.ignoreSuggestedPresentationDelay;\n let suggestedPresentationDelay = null;\n if (!ignoreSuggestedPresentationDelay) {\n suggestedPresentationDelay = TXml.parseAttr(\n mpd, 'suggestedPresentationDelay', TXml.parseDuration);\n }\n\n const ignoreMaxSegmentDuration =\n this.config_.dash.ignoreMaxSegmentDuration;\n let maxSegmentDuration = null;\n if (!ignoreMaxSegmentDuration) {\n maxSegmentDuration = TXml.parseAttr(\n mpd, 'maxSegmentDuration', TXml.parseDuration);\n }\n const mpdType = mpd.attributes['type'] || 'static';\n\n if (this.manifest_ && this.manifest_.presentationTimeline) {\n this.isTransitionFromDynamicToStatic_ =\n this.manifest_.presentationTimeline.isLive() && mpdType == 'static';\n }\n\n this.manifestPatchContext_.type = mpdType;\n /** @type {!shaka.media.PresentationTimeline} */\n let presentationTimeline;\n if (this.manifest_) {\n presentationTimeline = this.manifest_.presentationTimeline;\n\n // Before processing an update, evict from all segment indexes. Some of\n // them may not get updated otherwise if their corresponding Period\n // element has been dropped from the manifest since the last update.\n // Without this, playback will still work, but this is necessary to\n // maintain conditions that we assert on for multi-Period content.\n // This gives us confidence that our state is maintained correctly, and\n // that the complex logic of multi-Period eviction and period-flattening\n // is correct. See also:\n // https://github.com/shaka-project/shaka-player/issues/3169#issuecomment-823580634\n const availabilityStart =\n presentationTimeline.getSegmentAvailabilityStart();\n for (const stream of this.streamMap_.values()) {\n if (stream.segmentIndex) {\n stream.segmentIndex.evict(availabilityStart);\n }\n }\n } else {\n const ignoreMinBufferTime = this.config_.dash.ignoreMinBufferTime;\n let minBufferTime = 0;\n if (!ignoreMinBufferTime) {\n minBufferTime =\n TXml.parseAttr(mpd, 'minBufferTime', TXml.parseDuration) || 0;\n }\n // DASH IOP v3.0 suggests using a default delay between minBufferTime\n // and timeShiftBufferDepth. This is literally the range of all\n // feasible choices for the value. Nothing older than\n // timeShiftBufferDepth is still available, and anything less than\n // minBufferTime will cause buffering issues.\n let delay = 0;\n if (suggestedPresentationDelay != null) {\n // 1. If a suggestedPresentationDelay is provided by the manifest, that\n // will be used preferentially.\n // This is given a minimum bound of segmentAvailabilityDuration.\n // Content providers should provide a suggestedPresentationDelay\n // whenever possible to optimize the live streaming experience.\n delay = Math.min(\n suggestedPresentationDelay,\n segmentAvailabilityDuration || Infinity);\n } else if (this.config_.defaultPresentationDelay > 0) {\n // 2. If the developer provides a value for\n // \"manifest.defaultPresentationDelay\", that is used as a fallback.\n delay = this.config_.defaultPresentationDelay;\n } else {\n // 3. Otherwise, we default to the lower of segmentAvailabilityDuration\n // and 1.5 * minBufferTime. This is fairly conservative.\n delay = Math.min(\n minBufferTime * 1.5, segmentAvailabilityDuration || Infinity);\n }\n presentationTimeline = new shaka.media.PresentationTimeline(\n presentationStartTime, delay, this.config_.dash.autoCorrectDrift);\n }\n\n presentationTimeline.setStatic(mpdType == 'static');\n\n const isLive = presentationTimeline.isLive();\n\n // If it's live, we check for an override.\n if (isLive && !isNaN(this.config_.availabilityWindowOverride)) {\n segmentAvailabilityDuration = this.config_.availabilityWindowOverride;\n }\n\n // If it's null, that means segments are always available. This is always\n // the case for VOD, and sometimes the case for live.\n if (segmentAvailabilityDuration == null) {\n segmentAvailabilityDuration = Infinity;\n }\n\n presentationTimeline.setSegmentAvailabilityDuration(\n segmentAvailabilityDuration);\n\n const profiles = mpd.attributes['profiles'] || '';\n this.manifestPatchContext_.profiles = profiles.split(',');\n\n /** @type {shaka.dash.DashParser.Context} */\n const context = {\n // Don't base on updatePeriod_ since emsg boxes can cause manifest\n // updates.\n dynamic: mpdType != 'static',\n presentationTimeline: presentationTimeline,\n period: null,\n periodInfo: null,\n adaptationSet: null,\n representation: null,\n bandwidth: 0,\n indexRangeWarningGiven: false,\n availabilityTimeOffset: availabilityTimeOffset,\n mediaPresentationDuration: null,\n profiles: profiles.split(','),\n roles: null,\n urlParams: () => '',\n };\n\n await contentSteeringPromise;\n\n this.gapCount_ = 0;\n const periodsAndDuration = this.parsePeriods_(\n context, getBaseUris, mpd, /* newPeriod= */ false);\n const duration = periodsAndDuration.duration;\n const periods = periodsAndDuration.periods;\n\n if ((mpdType == 'static' && !this.isTransitionFromDynamicToStatic_) ||\n !periodsAndDuration.durationDerivedFromPeriods) {\n // Ignore duration calculated from Period lengths if this is dynamic.\n presentationTimeline.setDuration(duration || Infinity);\n }\n\n if (this.isLowLatency_ && this.lowLatencyMode_) {\n presentationTimeline.setAvailabilityTimeOffset(\n this.minTotalAvailabilityTimeOffset_);\n }\n\n // Use @maxSegmentDuration to override smaller, derived values.\n presentationTimeline.notifyMaxSegmentDuration(maxSegmentDuration || 1);\n if (goog.DEBUG && !this.isTransitionFromDynamicToStatic_) {\n presentationTimeline.assertIsValid();\n }\n\n if (this.isLowLatency_ && this.lowLatencyMode_) {\n const presentationDelay = suggestedPresentationDelay != null ?\n suggestedPresentationDelay : this.config_.defaultPresentationDelay;\n presentationTimeline.setDelay(presentationDelay);\n }\n\n // These steps are not done on manifest update.\n if (!this.manifest_) {\n await this.periodCombiner_.combinePeriods(periods, context.dynamic);\n\n this.manifest_ = {\n presentationTimeline: presentationTimeline,\n variants: this.periodCombiner_.getVariants(),\n textStreams: this.periodCombiner_.getTextStreams(),\n imageStreams: this.periodCombiner_.getImageStreams(),\n offlineSessionIds: [],\n sequenceMode: this.config_.dash.sequenceMode,\n ignoreManifestTimestampsInSegmentsMode: false,\n type: shaka.media.ManifestParser.DASH,\n serviceDescription: this.parseServiceDescription_(mpd),\n nextUrl: this.parseMpdChaining_(mpd),\n periodCount: periods.length,\n gapCount: this.gapCount_,\n isLowLatency: this.isLowLatency_,\n startTime: null,\n };\n\n // We only need to do clock sync when we're using presentation start\n // time. This condition also excludes VOD streams.\n if (presentationTimeline.usingPresentationStartTime()) {\n const TXml = shaka.util.TXml;\n const timingElements = TXml.findChildren(mpd, 'UTCTiming');\n const offset = await this.parseUtcTiming_(getBaseUris, timingElements);\n // Detect calls to stop().\n if (!this.playerInterface_) {\n return;\n }\n presentationTimeline.setClockOffset(offset);\n }\n\n // This is the first point where we have a meaningful presentation start\n // time, and we need to tell PresentationTimeline that so that it can\n // maintain consistency from here on.\n presentationTimeline.lockStartTime();\n } else {\n this.manifest_.periodCount = periods.length;\n this.manifest_.gapCount = this.gapCount_;\n await this.postPeriodProcessing_(periods, /* isPatchUpdate= */ false);\n }\n\n // Add text streams to correspond to closed captions. This happens right\n // after period combining, while we still have a direct reference, so that\n // any new streams will appear in the period combiner.\n this.playerInterface_.makeTextStreamsForClosedCaptions(this.manifest_);\n\n this.cleanStreamMap_();\n }\n\n /**\n * Handles common procedures after processing new periods.\n *\n * @param {!Array<shaka.extern.Period>} periods to be appended\n * @param {boolean} isPatchUpdate does call comes from mpd patch update\n * @private\n */\n async postPeriodProcessing_(periods, isPatchUpdate) {\n await this.periodCombiner_.combinePeriods(periods, true, isPatchUpdate);\n\n // Just update the variants and text streams, which may change as periods\n // are added or removed.\n this.manifest_.variants = this.periodCombiner_.getVariants();\n const textStreams = this.periodCombiner_.getTextStreams();\n if (textStreams.length > 0) {\n this.manifest_.textStreams = textStreams;\n }\n this.manifest_.imageStreams = this.periodCombiner_.getImageStreams();\n\n // Re-filter the manifest. This will check any configured restrictions on\n // new variants, and will pass any new init data to DrmEngine to ensure\n // that key rotation works correctly.\n this.playerInterface_.filter(this.manifest_);\n }\n\n /**\n * Takes a formatted Patch MPD and converts it into a manifest.\n *\n * @param {!shaka.extern.xml.Node} mpd\n * @return {!Promise}\n * @private\n */\n async processPatchManifest_(mpd) {\n const TXml = shaka.util.TXml;\n\n const mpdId = mpd.attributes['mpdId'];\n const originalPublishTime = TXml.parseAttr(mpd, 'originalPublishTime',\n TXml.parseDate);\n if (!mpdId || mpdId !== this.manifestPatchContext_.mpdId ||\n originalPublishTime !== this.manifestPatchContext_.publishTime) {\n // Clean patch location nodes, so it will force full MPD update.\n this.patchLocationNodes_ = [];\n throw new shaka.util.Error(\n shaka.util.Error.Severity.RECOVERABLE,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.DASH_INVALID_PATCH);\n }\n\n /** @type {!Array<shaka.extern.Period>} */\n const newPeriods = [];\n /** @type {!Array<shaka.extern.xml.Node>} */\n const periodAdditions = [];\n /** @type {!Set<string>} */\n const modifiedTimelines = new Set();\n\n for (const patchNode of TXml.getChildNodes(mpd)) {\n let handled = true;\n const paths = TXml.parseXpath(patchNode.attributes['sel'] || '');\n const node = paths[paths.length - 1];\n const content = TXml.getContents(patchNode) || '';\n\n if (node.name === 'MPD') {\n if (node.attribute === 'mediaPresentationDuration') {\n const content = TXml.getContents(patchNode) || '';\n this.parsePatchMediaPresentationDurationChange_(content);\n } else if (node.attribute === 'type') {\n this.parsePatchMpdTypeChange_(content);\n } else if (node.attribute === 'publishTime') {\n this.manifestPatchContext_.publishTime = TXml.parseDate(content) || 0;\n } else if (node.attribute === null && patchNode.tagName === 'add') {\n periodAdditions.push(patchNode);\n } else {\n handled = false;\n }\n } else if (node.name === 'PatchLocation') {\n this.updatePatchLocationNodes_(patchNode);\n } else if (node.name === 'Period') {\n if (patchNode.tagName === 'add') {\n periodAdditions.push(patchNode);\n } else if (patchNode.tagName === 'remove' && node.id) {\n this.removePatchPeriod_(node.id);\n }\n } else if (node.name === 'SegmentTemplate') {\n const timelines = this.modifySegmentTemplate_(patchNode);\n for (const timeline of timelines) {\n modifiedTimelines.add(timeline);\n }\n } else if (node.name === 'SegmentTimeline' || node.name === 'S') {\n const timelines = this.modifyTimepoints_(patchNode);\n for (const timeline of timelines) {\n modifiedTimelines.add(timeline);\n }\n } else {\n handled = false;\n }\n if (!handled) {\n shaka.log.warning('Unhandled ' + patchNode.tagName + ' operation',\n patchNode.attributes['sel']);\n }\n }\n\n for (const timeline of modifiedTimelines) {\n this.parsePatchSegment_(timeline);\n }\n\n // Add new periods after extending timelines, as new periods\n // remove context cache of previous periods.\n for (const periodAddition of periodAdditions) {\n newPeriods.push(...this.parsePatchPeriod_(periodAddition));\n }\n\n if (newPeriods.length) {\n this.manifest_.periodCount += newPeriods.length;\n this.manifest_.gapCount = this.gapCount_;\n await this.postPeriodProcessing_(newPeriods, /* isPatchUpdate= */ true);\n }\n if (this.manifestPatchContext_.type == 'static') {\n const duration = this.manifestPatchContext_.mediaPresentationDuration;\n this.manifest_.presentationTimeline.setDuration(duration || Infinity);\n }\n }\n\n /**\n * Handles manifest type changes, this transition is expected to be\n * \"dynamic\" to \"static\".\n *\n * @param {!string} mpdType\n * @private\n */\n parsePatchMpdTypeChange_(mpdType) {\n this.manifest_.presentationTimeline.setStatic(mpdType == 'static');\n this.manifestPatchContext_.type = mpdType;\n for (const context of this.contextCache_.values()) {\n context.dynamic = mpdType == 'dynamic';\n }\n if (mpdType == 'static') {\n // Manifest is no longer dynamic, so stop live updates.\n this.updatePeriod_ = -1;\n }\n }\n\n /**\n * @param {string} durationString\n * @private\n */\n parsePatchMediaPresentationDurationChange_(durationString) {\n const duration = shaka.util.TXml.parseDuration(durationString);\n if (duration == null) {\n return;\n }\n this.manifestPatchContext_.mediaPresentationDuration = duration;\n for (const context of this.contextCache_.values()) {\n context.mediaPresentationDuration = duration;\n }\n }\n\n /**\n * Ingests a full MPD period element from a patch update\n *\n * @param {!shaka.extern.xml.Node} periods\n * @private\n */\n parsePatchPeriod_(periods) {\n goog.asserts.assert(this.manifestPatchContext_.getBaseUris,\n 'Must provide getBaseUris on manifestPatchContext_');\n\n /** @type {shaka.dash.DashParser.Context} */\n const context = {\n dynamic: this.manifestPatchContext_.type == 'dynamic',\n presentationTimeline: this.manifest_.presentationTimeline,\n period: null,\n periodInfo: null,\n adaptationSet: null,\n representation: null,\n bandwidth: 0,\n indexRangeWarningGiven: false,\n availabilityTimeOffset: this.manifestPatchContext_.availabilityTimeOffset,\n profiles: this.manifestPatchContext_.profiles,\n mediaPresentationDuration:\n this.manifestPatchContext_.mediaPresentationDuration,\n roles: null,\n urlParams: () => '',\n };\n\n const periodsAndDuration = this.parsePeriods_(context,\n this.manifestPatchContext_.getBaseUris, periods, /* newPeriod= */ true);\n\n return periodsAndDuration.periods;\n }\n\n /**\n * @param {string} periodId\n * @private\n */\n removePatchPeriod_(periodId) {\n const SegmentTemplate = shaka.dash.SegmentTemplate;\n this.manifest_.periodCount--;\n for (const contextId of this.contextCache_.keys()) {\n if (contextId.startsWith(periodId)) {\n const context = this.contextCache_.get(contextId);\n SegmentTemplate.removeTimepoints(context);\n this.parsePatchSegment_(contextId);\n this.contextCache_.delete(contextId);\n }\n }\n const newPeriods = this.lastManifestUpdatePeriodIds_.filter((pID) => {\n return pID !== periodId;\n });\n this.lastManifestUpdatePeriodIds_ = newPeriods;\n }\n\n /**\n * @param {!Array<shaka.util.TXml.PathNode>} paths\n * @return {!Array<string>}\n * @private\n */\n getContextIdsFromPath_(paths) {\n let periodId = '';\n let adaptationSetId = '';\n let adaptationSetPosition = -1;\n let representationId = '';\n for (const node of paths) {\n if (node.name === 'Period') {\n periodId = node.id;\n } else if (node.name === 'AdaptationSet') {\n adaptationSetId = node.id;\n if (node.position !== null) {\n adaptationSetPosition = node.position;\n }\n } else if (node.name === 'Representation') {\n representationId = node.id;\n }\n }\n\n /** @type {!Array<string>} */\n const contextIds = [];\n\n if (representationId) {\n contextIds.push(periodId + ',' + representationId);\n } else {\n if (adaptationSetId) {\n for (const context of this.contextCache_.values()) {\n if (context.period.id === periodId &&\n context.adaptationSet.id === adaptationSetId &&\n context.representation.id) {\n contextIds.push(periodId + ',' + context.representation.id);\n }\n }\n } else {\n if (adaptationSetPosition > -1) {\n for (const context of this.contextCache_.values()) {\n if (context.period.id === periodId &&\n context.adaptationSet.position === adaptationSetPosition &&\n context.representation.id) {\n contextIds.push(periodId + ',' + context.representation.id);\n }\n }\n }\n }\n }\n\n return contextIds;\n }\n\n /**\n * Modifies SegmentTemplate based on MPD patch.\n *\n * @param {!shaka.extern.xml.Node} patchNode\n * @return {!Array<string>} context ids with updated timeline\n * @private\n */\n modifySegmentTemplate_(patchNode) {\n const TXml = shaka.util.TXml;\n const paths = TXml.parseXpath(patchNode.attributes['sel'] || '');\n const lastPath = paths[paths.length - 1];\n if (!lastPath.attribute) {\n return [];\n }\n const contextIds = this.getContextIdsFromPath_(paths);\n const content = TXml.getContents(patchNode) || '';\n\n for (const contextId of contextIds) {\n /** @type {shaka.dash.DashParser.Context} */\n const context = this.contextCache_.get(contextId);\n goog.asserts.assert(context && context.representation.segmentTemplate,\n 'cannot modify segment template');\n TXml.modifyNodeAttribute(context.representation.segmentTemplate,\n patchNode.tagName, lastPath.attribute, content);\n }\n return contextIds;\n }\n\n /**\n * Ingests Patch MPD segments into timeline.\n *\n * @param {!shaka.extern.xml.Node} patchNode\n * @return {!Array<string>} context ids with updated timeline\n * @private\n */\n modifyTimepoints_(patchNode) {\n const TXml = shaka.util.TXml;\n const SegmentTemplate = shaka.dash.SegmentTemplate;\n\n const paths = TXml.parseXpath(patchNode.attributes['sel'] || '');\n const contextIds = this.getContextIdsFromPath_(paths);\n\n for (const contextId of contextIds) {\n /** @type {shaka.dash.DashParser.Context} */\n const context = this.contextCache_.get(contextId);\n SegmentTemplate.modifyTimepoints(context, patchNode);\n }\n return contextIds;\n }\n\n /**\n * Parses modified segments.\n *\n * @param {string} contextId\n * @private\n */\n parsePatchSegment_(contextId) {\n /** @type {shaka.dash.DashParser.Context} */\n const context = this.contextCache_.get(contextId);\n\n const currentStream = this.streamMap_.get(contextId);\n goog.asserts.assert(currentStream, 'stream should exist');\n\n if (currentStream.segmentIndex) {\n currentStream.segmentIndex.evict(\n this.manifest_.presentationTimeline.getSegmentAvailabilityStart());\n }\n\n try {\n const requestSegment = (uris, startByte, endByte, isInit) => {\n return this.requestSegment_(uris, startByte, endByte, isInit);\n };\n // TODO we should obtain lastSegmentNumber if possible\n const streamInfo = shaka.dash.SegmentTemplate.createStreamInfo(\n context, requestSegment, this.streamMap_, /* isUpdate= */ true,\n this.config_.dash.initialSegmentLimit, this.periodDurations_,\n context.representation.aesKey, /* lastSegmentNumber= */ null,\n /* isPatchUpdate= */ true);\n currentStream.createSegmentIndex = async () => {\n if (!currentStream.segmentIndex) {\n currentStream.segmentIndex =\n await streamInfo.generateSegmentIndex();\n }\n };\n } catch (error) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n const contentType = context.representation.contentType;\n const isText = contentType == ContentType.TEXT ||\n contentType == ContentType.APPLICATION;\n const isImage = contentType == ContentType.IMAGE;\n if (!(isText || isImage) ||\n error.code != shaka.util.Error.Code.DASH_NO_SEGMENT_INFO) {\n // We will ignore any DASH_NO_SEGMENT_INFO errors for text/image\n throw error;\n }\n }\n }\n\n /**\n * Reads maxLatency and maxPlaybackRate properties from service\n * description element.\n *\n * @param {!shaka.extern.xml.Node} mpd\n * @return {?shaka.extern.ServiceDescription}\n * @private\n */\n parseServiceDescription_(mpd) {\n const TXml = shaka.util.TXml;\n const elem = TXml.findChild(mpd, 'ServiceDescription');\n\n if (!elem ) {\n return null;\n }\n\n const latencyNode = TXml.findChild(elem, 'Latency');\n const playbackRateNode = TXml.findChild(elem, 'PlaybackRate');\n\n if (!latencyNode && !playbackRateNode) {\n return null;\n }\n\n const description = {};\n\n if (latencyNode) {\n if ('target' in latencyNode.attributes) {\n description.targetLatency =\n parseInt(latencyNode.attributes['target'], 10) / 1000;\n }\n if ('max' in latencyNode.attributes) {\n description.maxLatency =\n parseInt(latencyNode.attributes['max'], 10) / 1000;\n }\n if ('min' in latencyNode.attributes) {\n description.minLatency =\n parseInt(latencyNode.attributes['min'], 10) / 1000;\n }\n }\n\n if (playbackRateNode) {\n if ('max' in playbackRateNode.attributes) {\n description.maxPlaybackRate =\n parseFloat(playbackRateNode.attributes['max']);\n }\n if ('min' in playbackRateNode.attributes) {\n description.minPlaybackRate =\n parseFloat(playbackRateNode.attributes['min']);\n }\n }\n\n return description;\n }\n\n /**\n * Reads chaining url.\n *\n * @param {!shaka.extern.xml.Node} mpd\n * @return {?string}\n * @private\n */\n parseMpdChaining_(mpd) {\n const TXml = shaka.util.TXml;\n const supplementalProperties =\n TXml.findChildren(mpd, 'SupplementalProperty');\n\n if (!supplementalProperties.length) {\n return null;\n }\n\n for (const prop of supplementalProperties) {\n const schemeId = prop.attributes['schemeIdUri'];\n if (schemeId == 'urn:mpeg:dash:chaining:2016') {\n return prop.attributes['value'];\n }\n }\n\n return null;\n }\n\n /**\n * Reads and parses the periods from the manifest. This first does some\n * partial parsing so the start and duration is available when parsing\n * children.\n *\n * @param {shaka.dash.DashParser.Context} context\n * @param {function(): !Array<string>} getBaseUris\n * @param {!shaka.extern.xml.Node} mpd\n * @param {!boolean} newPeriod\n * @return {{\n * periods: !Array<shaka.extern.Period>,\n * duration: ?number,\n * durationDerivedFromPeriods: boolean\n * }}\n * @private\n */\n parsePeriods_(context, getBaseUris, mpd, newPeriod) {\n const TXml = shaka.util.TXml;\n let presentationDuration = context.mediaPresentationDuration;\n\n if (!presentationDuration) {\n presentationDuration = TXml.parseAttr(\n mpd, 'mediaPresentationDuration', TXml.parseDuration);\n this.manifestPatchContext_.mediaPresentationDuration =\n presentationDuration;\n }\n\n let seekRangeStart = 0;\n if (this.manifest_ && this.manifest_.presentationTimeline &&\n this.isTransitionFromDynamicToStatic_) {\n seekRangeStart = this.manifest_.presentationTimeline.getSeekRangeStart();\n }\n\n const periods = [];\n let prevEnd = seekRangeStart;\n const periodNodes = TXml.findChildren(mpd, 'Period');\n for (let i = 0; i < periodNodes.length; i++) {\n const elem = periodNodes[i];\n const next = periodNodes[i + 1];\n let start = /** @type {number} */ (\n TXml.parseAttr(elem, 'start', TXml.parseDuration, prevEnd));\n const periodId = elem.attributes['id'];\n const givenDuration =\n TXml.parseAttr(elem, 'duration', TXml.parseDuration);\n start = (i == 0 && start == 0 && this.isTransitionFromDynamicToStatic_) ?\n seekRangeStart : start;\n\n let periodDuration = null;\n if (next) {\n // \"The difference between the start time of a Period and the start time\n // of the following Period is the duration of the media content\n // represented by this Period.\"\n const nextStart =\n TXml.parseAttr(next, 'start', TXml.parseDuration);\n if (nextStart != null) {\n periodDuration = nextStart - start + seekRangeStart;\n }\n } else if (presentationDuration != null) {\n // \"The Period extends until the Period.start of the next Period, or\n // until the end of the Media Presentation in the case of the last\n // Period.\"\n periodDuration = presentationDuration - start + seekRangeStart;\n }\n\n const threshold =\n shaka.util.ManifestParserUtils.GAP_OVERLAP_TOLERANCE_SECONDS;\n if (periodDuration && givenDuration &&\n Math.abs(periodDuration - givenDuration) > threshold) {\n shaka.log.warning('There is a gap/overlap between Periods', elem);\n\n // This means it's a gap, the distance between period starts is\n // larger than the period's duration\n if (periodDuration > givenDuration) {\n this.gapCount_++;\n }\n }\n // Only use the @duration in the MPD if we can't calculate it. We should\n // favor the @start of the following Period. This ensures that there\n // aren't gaps between Periods.\n if (periodDuration == null) {\n periodDuration = givenDuration;\n }\n\n /**\n * This is to improve robustness when the player observes manifest with\n * past periods that are inconsistent to previous ones.\n *\n * This may happen when a CDN or proxy server switches its upstream from\n * one encoder to another redundant encoder.\n *\n * Skip periods that match all of the following criteria:\n * - Start time is earlier than latest period start time ever seen\n * - Period ID is never seen in the previous manifest\n * - Not the last period in the manifest\n *\n * Periods that meet the aforementioned criteria are considered invalid\n * and should be safe to discard.\n */\n\n if (this.largestPeriodStartTime_ !== null &&\n periodId !== null && start !== null &&\n start < this.largestPeriodStartTime_ &&\n !this.lastManifestUpdatePeriodIds_.includes(periodId) &&\n i + 1 != periodNodes.length) {\n shaka.log.debug(\n `Skipping Period with ID ${periodId} as its start time is smaller` +\n ' than the largest period start time that has been seen, and ID ' +\n 'is unseen before');\n continue;\n }\n\n\n // Save maximum period start time if it is the last period\n if (start !== null &&\n (this.largestPeriodStartTime_ === null ||\n start > this.largestPeriodStartTime_)) {\n this.largestPeriodStartTime_ = start;\n }\n\n // Parse child nodes.\n const info = {\n start: start,\n duration: periodDuration,\n node: elem,\n isLastPeriod: periodDuration == null || !next,\n };\n const period = this.parsePeriod_(context, getBaseUris, info);\n periods.push(period);\n\n if (context.period.id && periodDuration) {\n this.periodDurations_.set(context.period.id, periodDuration);\n }\n\n if (periodDuration == null) {\n if (next) {\n // If the duration is still null and we aren't at the end, then we\n // will skip any remaining periods.\n shaka.log.warning(\n 'Skipping Period', i + 1, 'and any subsequent Periods:', 'Period',\n i + 1, 'does not have a valid start time.', next);\n }\n\n // The duration is unknown, so the end is unknown.\n prevEnd = null;\n break;\n }\n\n prevEnd = start + periodDuration;\n } // end of period parsing loop\n\n if (newPeriod) {\n // append new period from the patch manifest\n for (const el of periods) {\n const periodID = el.id;\n if (!this.lastManifestUpdatePeriodIds_.includes(periodID)) {\n this.lastManifestUpdatePeriodIds_.push(periodID);\n }\n }\n } else {\n // Replace previous seen periods with the current one.\n this.lastManifestUpdatePeriodIds_ = periods.map((el) => el.id);\n }\n\n if (presentationDuration != null) {\n if (prevEnd != null) {\n const threshold =\n shaka.util.ManifestParserUtils.GAP_OVERLAP_TOLERANCE_SECONDS;\n const difference = prevEnd - seekRangeStart - presentationDuration;\n if (Math.abs(difference) > threshold) {\n shaka.log.warning(\n '@mediaPresentationDuration does not match the total duration ',\n 'of all Periods.');\n // Assume @mediaPresentationDuration is correct.\n }\n }\n return {\n periods: periods,\n duration: presentationDuration + seekRangeStart,\n durationDerivedFromPeriods: false,\n };\n } else {\n return {\n periods: periods,\n duration: prevEnd,\n durationDerivedFromPeriods: true,\n };\n }\n }\n\n /**\n * Clean StreamMap Object to remove reference of deleted Stream Object\n * @private\n */\n cleanStreamMap_() {\n const oldPeriodIds = Array.from(this.indexStreamMap_.keys());\n const diffPeriodsIDs = oldPeriodIds.filter((pId) => {\n return !this.lastManifestUpdatePeriodIds_.includes(pId);\n });\n for (const pId of diffPeriodsIDs) {\n let shouldDeleteIndex = true;\n for (const contextId of this.indexStreamMap_.get(pId)) {\n const stream = this.streamMap_.get(contextId);\n if (!stream) {\n continue;\n }\n if (stream.segmentIndex && !stream.segmentIndex.isEmpty()) {\n shouldDeleteIndex = false;\n continue;\n }\n if (this.periodCombiner_) {\n this.periodCombiner_.deleteStream(stream, pId);\n }\n this.streamMap_.delete(contextId);\n }\n if (shouldDeleteIndex) {\n this.indexStreamMap_.delete(pId);\n }\n }\n }\n\n /**\n * Parses a Period XML element. Unlike the other parse methods, this is not\n * given the Node; it is given a PeriodInfo structure. Also, partial parsing\n * was done before this was called so start and duration are valid.\n *\n * @param {shaka.dash.DashParser.Context} context\n * @param {function(): !Array<string>} getBaseUris\n * @param {shaka.dash.DashParser.PeriodInfo} periodInfo\n * @return {shaka.extern.Period}\n * @private\n */\n parsePeriod_(context, getBaseUris, periodInfo) {\n const Functional = shaka.util.Functional;\n const TXml = shaka.util.TXml;\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n\n goog.asserts.assert(periodInfo.node, 'periodInfo.node should exist');\n context.period = this.createFrame_(periodInfo.node, null, getBaseUris);\n context.periodInfo = periodInfo;\n context.period.availabilityTimeOffset = context.availabilityTimeOffset;\n\n // If the period doesn't have an ID, give it one based on its start time.\n if (!context.period.id) {\n shaka.log.info(\n 'No Period ID given for Period with start time ' + periodInfo.start +\n ', Assigning a default');\n context.period.id = '__shaka_period_' + periodInfo.start;\n }\n\n const eventStreamNodes =\n TXml.findChildren(periodInfo.node, 'EventStream');\n const availabilityStart =\n context.presentationTimeline.getSegmentAvailabilityStart();\n\n for (const node of eventStreamNodes) {\n this.parseEventStream_(\n periodInfo.start, periodInfo.duration, node, availabilityStart);\n }\n\n\n const supplementalProperties =\n TXml.findChildren(periodInfo.node, 'SupplementalProperty');\n for (const prop of supplementalProperties) {\n const schemeId = prop.attributes['schemeIdUri'];\n if (schemeId == 'urn:mpeg:dash:urlparam:2014') {\n const urlParams = this.getURLParametersFunction_(prop);\n if (urlParams) {\n context.urlParams = urlParams;\n }\n }\n }\n\n const adaptationSets =\n TXml.findChildren(periodInfo.node, 'AdaptationSet')\n .map((node, position) =>\n this.parseAdaptationSet_(context, position, node))\n .filter(Functional.isNotNull);\n\n // For dynamic manifests, we use rep IDs internally, and they must be\n // unique.\n if (context.dynamic) {\n const ids = [];\n for (const set of adaptationSets) {\n for (const id of set.representationIds) {\n ids.push(id);\n }\n }\n\n const uniqueIds = new Set(ids);\n\n if (ids.length != uniqueIds.size) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.DASH_DUPLICATE_REPRESENTATION_ID);\n }\n }\n\n /** @type {!Map<string, shaka.extern.Stream>} */\n const dependencyStreamMap = new Map();\n for (const adaptationSet of adaptationSets) {\n for (const [dependencyId, stream] of adaptationSet.dependencyStreamMap) {\n dependencyStreamMap.set(dependencyId, stream);\n }\n }\n\n if (dependencyStreamMap.size) {\n let duplicateAdaptationSets = null;\n for (const adaptationSet of adaptationSets) {\n const streamsWithDependencyStream = [];\n for (const stream of adaptationSet.streams) {\n if (dependencyStreamMap.has(stream.originalId)) {\n if (!duplicateAdaptationSets) {\n duplicateAdaptationSets =\n TXml.findChildren(periodInfo.node, 'AdaptationSet')\n .map((node, position) =>\n this.parseAdaptationSet_(context, position, node))\n .filter(Functional.isNotNull);\n }\n for (const duplicateAdaptationSet of duplicateAdaptationSets) {\n const newStream = duplicateAdaptationSet.streams.find(\n (s) => s.originalId == stream.originalId);\n if (newStream) {\n newStream.dependencyStream =\n dependencyStreamMap.get(newStream.originalId);\n streamsWithDependencyStream.push(newStream);\n }\n }\n }\n }\n if (streamsWithDependencyStream.length) {\n adaptationSet.streams.push(...streamsWithDependencyStream);\n }\n }\n }\n\n const normalAdaptationSets = adaptationSets\n .filter((as) => { return !as.trickModeFor; });\n\n const trickModeAdaptationSets = adaptationSets\n .filter((as) => { return as.trickModeFor; });\n\n // Attach trick mode tracks to normal tracks.\n if (!this.config_.disableIFrames) {\n for (const trickModeSet of trickModeAdaptationSets) {\n const targetIds = trickModeSet.trickModeFor.split(' ');\n for (const normalSet of normalAdaptationSets) {\n if (targetIds.includes(normalSet.id)) {\n for (const stream of normalSet.streams) {\n shaka.util.StreamUtils.setBetterIFrameStream(\n stream, trickModeSet.streams);\n }\n }\n }\n }\n }\n\n const audioStreams = this.getStreamsFromSets_(\n this.config_.disableAudio,\n normalAdaptationSets,\n ContentType.AUDIO);\n const videoStreams = this.getStreamsFromSets_(\n this.config_.disableVideo,\n normalAdaptationSets,\n ContentType.VIDEO);\n const textStreams = this.getStreamsFromSets_(\n this.config_.disableText,\n normalAdaptationSets,\n ContentType.TEXT);\n const imageStreams = this.getStreamsFromSets_(\n this.config_.disableThumbnails,\n normalAdaptationSets,\n ContentType.IMAGE);\n\n if (videoStreams.length === 0 && audioStreams.length === 0) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.DASH_EMPTY_PERIOD,\n );\n }\n\n return {\n id: context.period.id,\n audioStreams,\n videoStreams,\n textStreams,\n imageStreams,\n };\n }\n\n /**\n * Gets the streams from the given sets or returns an empty array if disabled\n * or no streams are found.\n * @param {boolean} disabled\n * @param {!Array<!shaka.dash.DashParser.AdaptationInfo>} adaptationSets\n * @param {string} contentType\n * @private\n */\n getStreamsFromSets_(disabled, adaptationSets, contentType) {\n if (disabled || !adaptationSets.length) {\n return [];\n }\n\n return adaptationSets.reduce((all, part) => {\n if (part.contentType != contentType) {\n return all;\n }\n\n all.push(...part.streams);\n return all;\n }, []);\n }\n\n /**\n * Parses an AdaptationSet XML element.\n *\n * @param {shaka.dash.DashParser.Context} context\n * @param {number} position\n * @param {!shaka.extern.xml.Node} elem The AdaptationSet element.\n * @return {?shaka.dash.DashParser.AdaptationInfo}\n * @private\n */\n parseAdaptationSet_(context, position, elem) {\n const TXml = shaka.util.TXml;\n const Functional = shaka.util.Functional;\n const ManifestParserUtils = shaka.util.ManifestParserUtils;\n const ContentType = ManifestParserUtils.ContentType;\n const ContentProtection = shaka.dash.ContentProtection;\n\n context.adaptationSet = this.createFrame_(elem, context.period, null);\n context.adaptationSet.position = position;\n\n let main = false;\n const roleElements = TXml.findChildren(elem, 'Role');\n const roleValues = roleElements.map((role) => {\n return role.attributes['value'];\n }).filter(Functional.isNotNull);\n\n // Default kind for text streams is 'subtitle' if unspecified in the\n // manifest.\n let kind = undefined;\n const isText = context.adaptationSet.contentType == ContentType.TEXT;\n if (isText) {\n kind = ManifestParserUtils.TextStreamKind.SUBTITLE;\n }\n\n for (const roleElement of roleElements) {\n const scheme = roleElement.attributes['schemeIdUri'];\n if (scheme == null || scheme == 'urn:mpeg:dash:role:2011') {\n // These only apply for the given scheme, but allow them to be specified\n // if there is no scheme specified.\n // See: DASH section 5.8.5.5\n const value = roleElement.attributes['value'];\n switch (value) {\n case 'main':\n main = true;\n break;\n case 'caption':\n case 'subtitle':\n kind = value;\n break;\n }\n }\n }\n\n // Parallel for HLS VIDEO-RANGE as defined in DASH-IF IOP v4.3 6.2.5.1.\n let videoRange;\n\n let colorGamut;\n\n // Ref. https://dashif.org/docs/DASH-IF-IOP-v4.3.pdf\n // If signaled, a Supplemental or Essential Property descriptor\n // shall be used, with the schemeIdUri set to\n // urn:mpeg:mpegB:cicp:<Parameter> as defined in\n // ISO/IEC 23001-8 [49] and <Parameter> one of the\n // following: ColourPrimaries, TransferCharacteristics,\n // or MatrixCoefficients.\n const scheme = 'urn:mpeg:mpegB:cicp';\n const transferCharacteristicsScheme = `${scheme}:TransferCharacteristics`;\n const colourPrimariesScheme = `${scheme}:ColourPrimaries`;\n const matrixCoefficientsScheme = `${scheme}:MatrixCoefficients`;\n\n const getVideoRangeFromTransferCharacteristicCICP = (cicp) => {\n switch (cicp) {\n case 1:\n case 6:\n case 13:\n case 14:\n case 15:\n return 'SDR';\n case 16:\n return 'PQ';\n case 18:\n return 'HLG';\n }\n return undefined;\n };\n\n const getColorGamutFromColourPrimariesCICP = (cicp) => {\n switch (cicp) {\n case 1:\n case 5:\n case 6:\n case 7:\n return 'srgb';\n case 9:\n return 'rec2020';\n case 11:\n case 12:\n return 'p3';\n }\n return undefined;\n };\n\n const parseFont = (prop) => {\n const fontFamily = prop.attributes['dvb:fontFamily'];\n const fontUrl = prop.attributes['dvb:url'];\n if (fontFamily && fontUrl) {\n const uris = shaka.util.ManifestParserUtils.resolveUris(\n context.adaptationSet.getBaseUris(), [fontUrl],\n context.urlParams());\n this.playerInterface_.addFont(fontFamily, uris[0]);\n }\n };\n\n const essentialProperties =\n TXml.findChildren(elem, 'EssentialProperty');\n // ID of real AdaptationSet if this is a trick mode set:\n let trickModeFor = null;\n let isFastSwitching = false;\n let adaptationSetUrlParams = null;\n let unrecognizedEssentialProperty = false;\n for (const prop of essentialProperties) {\n const schemeId = prop.attributes['schemeIdUri'];\n if (schemeId == 'http://dashif.org/guidelines/trickmode') {\n trickModeFor = prop.attributes['value'];\n } else if (schemeId == transferCharacteristicsScheme) {\n videoRange = getVideoRangeFromTransferCharacteristicCICP(\n parseInt(prop.attributes['value'], 10),\n );\n } else if (schemeId == colourPrimariesScheme) {\n colorGamut = getColorGamutFromColourPrimariesCICP(\n parseInt(prop.attributes['value'], 10),\n );\n } else if (schemeId == matrixCoefficientsScheme) {\n continue;\n } else if (schemeId == 'urn:mpeg:dash:ssr:2023' &&\n this.config_.dash.enableFastSwitching) {\n isFastSwitching = true;\n } else if (schemeId == 'urn:dvb:dash:fontdownload:2014') {\n parseFont(prop);\n } else if (schemeId == 'urn:mpeg:dash:urlparam:2014') {\n adaptationSetUrlParams = this.getURLParametersFunction_(prop);\n if (!adaptationSetUrlParams) {\n unrecognizedEssentialProperty = true;\n }\n } else {\n unrecognizedEssentialProperty = true;\n }\n }\n\n // According to DASH spec (2014) section 5.8.4.8, \"the successful processing\n // of the descriptor is essential to properly use the information in the\n // parent element\". According to DASH IOP v3.3, section 3.3.4, \"if the\n // scheme or the value\" for EssentialProperty is not recognized, \"the DASH\n // client shall ignore the parent element.\"\n if (unrecognizedEssentialProperty) {\n // Stop parsing this AdaptationSet and let the caller filter out the\n // nulls.\n return null;\n }\n\n let lastSegmentNumber = null;\n\n const supplementalProperties =\n TXml.findChildren(elem, 'SupplementalProperty');\n for (const prop of supplementalProperties) {\n const schemeId = prop.attributes['schemeIdUri'];\n if (schemeId == 'http://dashif.org/guidelines/last-segment-number') {\n lastSegmentNumber = parseInt(prop.attributes['value'], 10) - 1;\n } else if (schemeId == transferCharacteristicsScheme) {\n videoRange = getVideoRangeFromTransferCharacteristicCICP(\n parseInt(prop.attributes['value'], 10),\n );\n } else if (schemeId == colourPrimariesScheme) {\n colorGamut = getColorGamutFromColourPrimariesCICP(\n parseInt(prop.attributes['value'], 10),\n );\n } else if (schemeId == 'urn:dvb:dash:fontdownload:2014') {\n parseFont(prop);\n } else if (schemeId == 'urn:mpeg:dash:urlparam:2014') {\n adaptationSetUrlParams = this.getURLParametersFunction_(prop);\n }\n }\n\n if (adaptationSetUrlParams) {\n context.urlParams = adaptationSetUrlParams;\n }\n\n const accessibilities = TXml.findChildren(elem, 'Accessibility');\n const LanguageUtils = shaka.util.LanguageUtils;\n const closedCaptions = new Map();\n /** @type {?shaka.media.ManifestParser.AccessibilityPurpose} */\n let accessibilityPurpose;\n for (const prop of accessibilities) {\n const schemeId = prop.attributes['schemeIdUri'];\n const value = prop.attributes['value'];\n if (schemeId == 'urn:scte:dash:cc:cea-608:2015' &&\n !this.config_.disableText) {\n let channelId = 1;\n if (value != null) {\n const channelAssignments = value.split(';');\n for (const captionStr of channelAssignments) {\n let channel;\n let language;\n // Some closed caption descriptions have channel number and\n // language (\"CC1=eng\") others may only have language (\"eng,spa\").\n if (!captionStr.includes('=')) {\n // When the channel assignments are not explicitly provided and\n // there are only 2 values provided, it is highly likely that the\n // assignments are CC1 and CC3 (most commonly used CC streams).\n // Otherwise, cycle through all channels arbitrarily (CC1 - CC4)\n // in order of provided langs.\n channel = `CC${channelId}`;\n if (channelAssignments.length == 2) {\n channelId += 2;\n } else {\n channelId ++;\n }\n language = captionStr;\n } else {\n const channelAndLanguage = captionStr.split('=');\n // The channel info can be '1' or 'CC1'.\n // If the channel info only has channel number(like '1'), add 'CC'\n // as prefix so that it can be a full channel id (like 'CC1').\n channel = channelAndLanguage[0].startsWith('CC') ?\n channelAndLanguage[0] : `CC${channelAndLanguage[0]}`;\n\n // 3 letters (ISO 639-2). In b/187442669, we saw a blank string\n // (CC2=;CC3=), so default to \"und\" (the code for \"undetermined\").\n language = channelAndLanguage[1] || 'und';\n }\n closedCaptions.set(channel, LanguageUtils.normalize(language));\n }\n } else {\n // If channel and language information has not been provided, assign\n // 'CC1' as channel id and 'und' as language info.\n closedCaptions.set('CC1', 'und');\n }\n } else if (schemeId == 'urn:scte:dash:cc:cea-708:2015' &&\n !this.config_.disableText) {\n let serviceNumber = 1;\n if (value != null) {\n for (const captionStr of value.split(';')) {\n let service;\n let language;\n // Similar to CEA-608, it is possible that service # assignments\n // are not explicitly provided e.g. \"eng;deu;swe\" In this case,\n // we just cycle through the services for each language one by one.\n if (!captionStr.includes('=')) {\n service = `svc${serviceNumber}`;\n serviceNumber ++;\n language = captionStr;\n } else {\n // Otherwise, CEA-708 caption values take the form \"\n // 1=lang:eng;2=lang:deu\" i.e. serviceNumber=lang:threeLetterCode.\n const serviceAndLanguage = captionStr.split('=');\n service = `svc${serviceAndLanguage[0]}`;\n\n // The language info can be different formats, lang:eng',\n // or 'lang:eng,war:1,er:1'. Extract the language info.\n language = serviceAndLanguage[1].split(',')[0].split(':').pop();\n }\n closedCaptions.set(service, LanguageUtils.normalize(language));\n }\n } else {\n // If service and language information has not been provided, assign\n // 'svc1' as service number and 'und' as language info.\n closedCaptions.set('svc1', 'und');\n }\n } else if (schemeId == 'urn:mpeg:dash:role:2011') {\n // See DASH IOP 3.9.2 Table 4.\n if (value != null) {\n roleValues.push(value);\n if (value == 'captions') {\n kind = ManifestParserUtils.TextStreamKind.CLOSED_CAPTION;\n }\n }\n } else if (schemeId == 'urn:tva:metadata:cs:AudioPurposeCS:2007') {\n // See DASH DVB Document A168 Rev.6 Table 5.\n if (value == '1') {\n accessibilityPurpose =\n shaka.media.ManifestParser.AccessibilityPurpose.VISUALLY_IMPAIRED;\n } else if (value == '2') {\n accessibilityPurpose =\n shaka.media.ManifestParser.AccessibilityPurpose.HARD_OF_HEARING;\n }\n }\n }\n\n const contentProtectionElements =\n TXml.findChildren(elem, 'ContentProtection');\n const contentProtection = ContentProtection.parseFromAdaptationSet(\n contentProtectionElements,\n this.config_.ignoreDrmInfo,\n this.config_.dash.keySystemsByURI);\n\n // We us contentProtectionElements instead of drmInfos as the latter is\n // not populated yet, and we need the encrypted flag for the upcoming\n // parseRepresentation that will set the encrypted flag to the init seg.\n context.adaptationSet.encrypted = contentProtectionElements.length > 0;\n\n const language = shaka.util.LanguageUtils.normalize(\n context.adaptationSet.language || 'und');\n\n const label = context.adaptationSet.label;\n\n /** @type {!Map<string, shaka.extern.Stream>} */\n const dependencyStreamMap = new Map();\n\n // Parse Representations into Streams.\n const representations = TXml.findChildren(elem, 'Representation');\n if (!this.config_.ignoreSupplementalCodecs) {\n const supplementalRepresentations = [];\n for (const rep of representations) {\n const supplementalCodecs = TXml.getAttributeNS(\n rep, shaka.dash.DashParser.SCTE214_, 'supplementalCodecs');\n if (supplementalCodecs) {\n // Duplicate representations with their supplementalCodecs\n const obj = shaka.util.ObjectUtils.cloneObject(rep);\n obj.attributes['codecs'] = supplementalCodecs.split(' ').join(',');\n if (obj.attributes['id']) {\n obj.attributes['supplementalId'] =\n obj.attributes['id'] + '_supplementalCodecs';\n }\n supplementalRepresentations.push(obj);\n }\n }\n representations.push(...supplementalRepresentations);\n }\n const streams = representations.map((representation) => {\n const parsedRepresentation = this.parseRepresentation_(context,\n contentProtection, kind, language, label, main, roleValues,\n closedCaptions, representation, accessibilityPurpose,\n lastSegmentNumber);\n if (parsedRepresentation) {\n parsedRepresentation.hdr = parsedRepresentation.hdr || videoRange;\n parsedRepresentation.colorGamut =\n parsedRepresentation.colorGamut || colorGamut;\n parsedRepresentation.fastSwitching = isFastSwitching;\n const dependencyId = representation.attributes['dependencyId'];\n if (dependencyId) {\n parsedRepresentation.baseOriginalId = dependencyId;\n dependencyStreamMap.set(dependencyId, parsedRepresentation);\n return null;\n }\n }\n return parsedRepresentation;\n }).filter((s) => !!s);\n\n if (streams.length == 0 && dependencyStreamMap.size == 0) {\n const isImage = context.adaptationSet.contentType == ContentType.IMAGE;\n // Ignore empty AdaptationSets if ignoreEmptyAdaptationSet is true\n // or they are for text/image content.\n if (this.config_.dash.ignoreEmptyAdaptationSet || isText || isImage) {\n return null;\n }\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.DASH_EMPTY_ADAPTATION_SET);\n }\n\n // If AdaptationSet's type is unknown or is ambiguously \"application\",\n // guess based on the information in the first stream. If the attributes\n // mimeType and codecs are split across levels, they will both be inherited\n // down to the stream level by this point, so the stream will have all the\n // necessary information.\n if (!context.adaptationSet.contentType ||\n context.adaptationSet.contentType == ContentType.APPLICATION) {\n const mimeType = streams[0].mimeType;\n const codecs = streams[0].codecs;\n context.adaptationSet.contentType =\n shaka.dash.DashParser.guessContentType_(mimeType, codecs);\n\n for (const stream of streams) {\n stream.type = context.adaptationSet.contentType;\n }\n }\n\n const adaptationId = context.adaptationSet.id ||\n ('__fake__' + this.globalId_++);\n\n for (const stream of streams) {\n // Some DRM license providers require that we have a default\n // key ID from the manifest in the wrapped license request.\n // Thus, it should be put in drmInfo to be accessible to request filters.\n for (const drmInfo of contentProtection.drmInfos) {\n drmInfo.keyIds = drmInfo.keyIds && stream.keyIds ?\n new Set([...drmInfo.keyIds, ...stream.keyIds]) :\n drmInfo.keyIds || stream.keyIds;\n }\n stream.groupId = adaptationId;\n }\n\n const repIds = representations\n .map((node) => {\n return node.attributes['supplementalId'] || node.attributes['id'];\n }).filter(shaka.util.Functional.isNotNull);\n\n return {\n id: adaptationId,\n contentType: context.adaptationSet.contentType,\n language: language,\n main: main,\n streams: streams,\n drmInfos: contentProtection.drmInfos,\n trickModeFor: trickModeFor,\n representationIds: repIds,\n dependencyStreamMap,\n };\n }\n\n /**\n * @param {!shaka.extern.xml.Node} elem\n * @return {?function():string}\n * @private\n */\n getURLParametersFunction_(elem) {\n const TXml = shaka.util.TXml;\n const urlQueryInfo = TXml.findChildNS(\n elem, shaka.dash.DashParser.UP_NAMESPACE_, 'UrlQueryInfo');\n if (urlQueryInfo && TXml.parseAttr(urlQueryInfo, 'useMPDUrlQuery',\n TXml.parseBoolean, /* defaultValue= */ false)) {\n const queryTemplate = urlQueryInfo.attributes['queryTemplate'];\n if (queryTemplate) {\n return () => {\n if (queryTemplate == '$querypart$') {\n return this.lastManifestQueryParams_;\n }\n const parameters = queryTemplate.split('&').map((param) => {\n if (param == '$querypart$') {\n return this.lastManifestQueryParams_;\n } else {\n const regex = /\\$query:(.*?)\\$/g;\n const parts = regex.exec(param);\n if (parts && parts.length == 2) {\n const paramName = parts[1];\n const queryData =\n new goog.Uri.QueryData(this.lastManifestQueryParams_);\n const value = queryData.get(paramName);\n if (value.length) {\n return paramName + '=' + value[0];\n }\n }\n return param;\n }\n });\n return parameters.join('&');\n };\n }\n }\n return null;\n }\n\n /**\n * Parses a Representation XML element.\n *\n * @param {shaka.dash.DashParser.Context} context\n * @param {shaka.dash.ContentProtection.Context} contentProtection\n * @param {(string|undefined)} kind\n * @param {string} language\n * @param {?string} label\n * @param {boolean} isPrimary\n * @param {!Array<string>} roles\n * @param {Map<string, string>} closedCaptions\n * @param {!shaka.extern.xml.Node} node\n * @param {?shaka.media.ManifestParser.AccessibilityPurpose\n * } accessibilityPurpose\n * @param {?number} lastSegmentNumber\n *\n * @return {?shaka.extern.Stream} The Stream, or null when there is a\n * non-critical parsing error.\n * @private\n */\n parseRepresentation_(context, contentProtection, kind, language, label,\n isPrimary, roles, closedCaptions, node, accessibilityPurpose,\n lastSegmentNumber) {\n const TXml = shaka.util.TXml;\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n\n context.representation =\n this.createFrame_(node, context.adaptationSet, null);\n\n const representationId = context.representation.id;\n\n this.minTotalAvailabilityTimeOffset_ =\n Math.min(this.minTotalAvailabilityTimeOffset_,\n context.representation.availabilityTimeOffset);\n\n this.isLowLatency_ = this.minTotalAvailabilityTimeOffset_ > 0;\n\n if (!this.verifyRepresentation_(context.representation)) {\n shaka.log.warning('Skipping Representation', context.representation);\n return null;\n }\n const periodStart = context.periodInfo.start;\n\n // NOTE: bandwidth is a mandatory attribute according to the spec, and zero\n // does not make sense in the DASH spec's bandwidth formulas.\n // In some content, however, the attribute is missing or zero.\n // To avoid NaN at the variant level on broken content, fall back to zero.\n // https://github.com/shaka-project/shaka-player/issues/938#issuecomment-317278180\n context.bandwidth =\n TXml.parseAttr(node, 'bandwidth', TXml.parsePositiveInt) || 0;\n\n context.roles = roles;\n\n const supplementalPropertyElements =\n TXml.findChildren(node, 'SupplementalProperty');\n const essentialPropertyElements =\n TXml.findChildren(node, 'EssentialProperty');\n const contentProtectionElements =\n TXml.findChildren(node, 'ContentProtection');\n\n let representationUrlParams = null;\n let urlParamsElement = essentialPropertyElements.find((element) => {\n const schemeId = element.attributes['schemeIdUri'];\n return schemeId == 'urn:mpeg:dash:urlparam:2014';\n });\n if (urlParamsElement) {\n representationUrlParams =\n this.getURLParametersFunction_(urlParamsElement);\n } else {\n urlParamsElement = supplementalPropertyElements.find((element) => {\n const schemeId = element.attributes['schemeIdUri'];\n return schemeId == 'urn:mpeg:dash:urlparam:2014';\n });\n if (urlParamsElement) {\n representationUrlParams =\n this.getURLParametersFunction_(urlParamsElement);\n }\n }\n\n if (representationUrlParams) {\n context.urlParams = representationUrlParams;\n }\n\n /** @type {?shaka.dash.DashParser.StreamInfo} */\n let streamInfo;\n\n const contentType = context.representation.contentType;\n const isText = contentType == ContentType.TEXT ||\n contentType == ContentType.APPLICATION;\n const isImage = contentType == ContentType.IMAGE;\n\n if (contentProtectionElements.length) {\n context.adaptationSet.encrypted = true;\n }\n\n try {\n /** @type {shaka.extern.aesKey|undefined} */\n let aesKey = undefined;\n if (contentProtection.aes128Info) {\n const getBaseUris = context.representation.getBaseUris;\n const urlParams = context.urlParams;\n const uris = shaka.util.ManifestParserUtils.resolveUris(\n getBaseUris(), [contentProtection.aes128Info.keyUri], urlParams());\n const requestType = shaka.net.NetworkingEngine.RequestType.KEY;\n const request = shaka.net.NetworkingEngine.makeRequest(\n uris, this.config_.retryParameters);\n\n aesKey = {\n bitsKey: 128,\n blockCipherMode: 'CBC',\n iv: contentProtection.aes128Info.iv,\n firstMediaSequenceNumber: 0,\n };\n\n // Don't download the key object until the segment is parsed, to\n // avoid a startup delay for long manifests with lots of keys.\n aesKey.fetchKey = async () => {\n const keyResponse =\n await this.makeNetworkRequest_(request, requestType);\n\n // keyResponse.status is undefined when URI is\n // \"data:text/plain;base64,\"\n if (!keyResponse.data || keyResponse.data.byteLength != 16) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.AES_128_INVALID_KEY_LENGTH);\n }\n\n const algorithm = {\n name: 'AES-CBC',\n };\n aesKey.cryptoKey = await window.crypto.subtle.importKey(\n 'raw', keyResponse.data, algorithm, true, ['decrypt']);\n aesKey.fetchKey = undefined; // No longer needed.\n };\n }\n context.representation.aesKey = aesKey;\n\n const requestSegment = (uris, startByte, endByte, isInit) => {\n return this.requestSegment_(uris, startByte, endByte, isInit);\n };\n if (context.representation.segmentBase) {\n streamInfo = shaka.dash.SegmentBase.createStreamInfo(\n context, requestSegment, aesKey);\n } else if (context.representation.segmentList) {\n streamInfo = shaka.dash.SegmentList.createStreamInfo(\n context, this.streamMap_, aesKey);\n } else if (context.representation.segmentTemplate) {\n const hasManifest = !!this.manifest_;\n\n streamInfo = shaka.dash.SegmentTemplate.createStreamInfo(\n context, requestSegment, this.streamMap_, hasManifest,\n this.config_.dash.initialSegmentLimit, this.periodDurations_,\n aesKey, lastSegmentNumber, /* isPatchUpdate= */ false);\n } else {\n goog.asserts.assert(isText,\n 'Must have Segment* with non-text streams.');\n\n const duration = context.periodInfo.duration || 0;\n const getBaseUris = context.representation.getBaseUris;\n const mimeType = context.representation.mimeType;\n const codecs = context.representation.codecs;\n streamInfo = {\n generateSegmentIndex: () => {\n const segmentIndex = shaka.media.SegmentIndex.forSingleSegment(\n periodStart, duration, getBaseUris());\n segmentIndex.forEachTopLevelReference((ref) => {\n ref.mimeType = mimeType;\n ref.codecs = codecs;\n });\n return Promise.resolve(segmentIndex);\n },\n };\n }\n } catch (error) {\n if ((isText || isImage) &&\n error.code == shaka.util.Error.Code.DASH_NO_SEGMENT_INFO) {\n // We will ignore any DASH_NO_SEGMENT_INFO errors for text/image\n // streams.\n return null;\n }\n\n // For anything else, re-throw.\n throw error;\n }\n\n const keyId = shaka.dash.ContentProtection.parseFromRepresentation(\n contentProtectionElements, contentProtection,\n this.config_.ignoreDrmInfo,\n this.config_.dash.keySystemsByURI);\n const keyIds = new Set(keyId ? [keyId] : []);\n\n // Detect the presence of E-AC3 JOC audio content, using DD+JOC signaling.\n // See: ETSI TS 103 420 V1.2.1 (2018-10)\n const hasJoc = supplementalPropertyElements.some((element) => {\n const expectedUri = 'tag:dolby.com,2018:dash:EC3_ExtensionType:2018';\n const expectedValue = 'JOC';\n return element.attributes['schemeIdUri'] == expectedUri &&\n element.attributes['value'] == expectedValue;\n });\n let spatialAudio = false;\n if (hasJoc) {\n spatialAudio = true;\n }\n\n let forced = false;\n if (isText) {\n // See: https://github.com/shaka-project/shaka-player/issues/2122 and\n // https://github.com/Dash-Industry-Forum/DASH-IF-IOP/issues/165\n forced = roles.includes('forced_subtitle') ||\n roles.includes('forced-subtitle');\n }\n\n let tilesLayout;\n if (isImage) {\n const thumbnailTileElem = essentialPropertyElements.find((element) => {\n const expectedUris = [\n 'http://dashif.org/thumbnail_tile',\n 'http://dashif.org/guidelines/thumbnail_tile',\n ];\n return expectedUris.includes(element.attributes['schemeIdUri']);\n });\n if (thumbnailTileElem) {\n tilesLayout = thumbnailTileElem.attributes['value'];\n }\n // Filter image adaptation sets that has no tilesLayout.\n if (!tilesLayout) {\n return null;\n }\n }\n\n let hdr;\n const profiles = context.profiles;\n const codecs = context.representation.codecs;\n\n const hevcHDR = 'http://dashif.org/guidelines/dash-if-uhd#hevc-hdr-pq10';\n if (profiles.includes(hevcHDR) && (codecs.includes('hvc1.2.4.L153.B0') ||\n codecs.includes('hev1.2.4.L153.B0'))) {\n hdr = 'PQ';\n }\n\n const contextId = context.representation.id ?\n context.period.id + ',' + context.representation.id : '';\n\n if (this.patchLocationNodes_.length && representationId) {\n this.contextCache_.set(`${context.period.id},${representationId}`,\n this.cloneContext_(context));\n }\n\n /** @type {shaka.extern.Stream} */\n let stream;\n\n if (contextId && this.streamMap_.has(contextId)) {\n stream = this.streamMap_.get(contextId);\n } else {\n stream = {\n id: this.globalId_++,\n originalId: context.representation.id,\n groupId: null,\n createSegmentIndex: () => Promise.resolve(),\n closeSegmentIndex: () => {\n if (stream.segmentIndex) {\n stream.segmentIndex.release();\n stream.segmentIndex = null;\n }\n },\n segmentIndex: null,\n mimeType: context.representation.mimeType,\n codecs,\n frameRate: context.representation.frameRate,\n pixelAspectRatio: context.representation.pixelAspectRatio,\n bandwidth: context.bandwidth,\n width: context.representation.width,\n height: context.representation.height,\n kind,\n encrypted: contentProtection.drmInfos.length > 0,\n drmInfos: contentProtection.drmInfos,\n keyIds,\n language,\n originalLanguage: context.adaptationSet.language,\n label,\n type: context.adaptationSet.contentType,\n primary: isPrimary,\n trickModeVideo: null,\n dependencyStream: null,\n emsgSchemeIdUris:\n context.representation.emsgSchemeIdUris,\n roles,\n forced,\n channelsCount: context.representation.numChannels,\n audioSamplingRate: context.representation.audioSamplingRate,\n spatialAudio,\n closedCaptions,\n hdr,\n colorGamut: undefined,\n videoLayout: undefined,\n tilesLayout,\n accessibilityPurpose,\n external: false,\n fastSwitching: false,\n fullMimeTypes: new Set([shaka.util.MimeUtils.getFullType(\n context.representation.mimeType, context.representation.codecs)]),\n isAudioMuxedInVideo: false,\n baseOriginalId: null,\n };\n }\n\n stream.createSegmentIndex = async () => {\n if (!stream.segmentIndex) {\n stream.segmentIndex = await streamInfo.generateSegmentIndex();\n }\n };\n\n if (contextId && context.dynamic && !this.streamMap_.has(contextId)) {\n const periodId = context.period.id || '';\n if (!this.indexStreamMap_.has(periodId)) {\n this.indexStreamMap_.set(periodId, []);\n }\n this.streamMap_.set(contextId, stream);\n this.indexStreamMap_.get(periodId).push(contextId);\n }\n\n return stream;\n }\n\n /**\n * Clone context and remove xml document references.\n *\n * @param {!shaka.dash.DashParser.Context} context\n * @return {!shaka.dash.DashParser.Context}\n * @private\n */\n cloneContext_(context) {\n /**\n * @param {?shaka.dash.DashParser.InheritanceFrame} frame\n * @return {?shaka.dash.DashParser.InheritanceFrame}\n */\n const cloneFrame = (frame) => {\n if (!frame) {\n return null;\n }\n const clone = shaka.util.ObjectUtils.shallowCloneObject(frame);\n clone.segmentBase = null;\n clone.segmentList = null;\n clone.segmentTemplate = shaka.util.TXml.cloneNode(clone.segmentTemplate);\n return clone;\n };\n const contextClone = shaka.util.ObjectUtils.shallowCloneObject(context);\n contextClone.period = cloneFrame(contextClone.period);\n contextClone.adaptationSet = cloneFrame(contextClone.adaptationSet);\n contextClone.representation = cloneFrame(contextClone.representation);\n\n if (contextClone.periodInfo) {\n contextClone.periodInfo =\n shaka.util.ObjectUtils.shallowCloneObject(contextClone.periodInfo);\n contextClone.periodInfo.node = null;\n }\n\n return contextClone;\n }\n\n /**\n * Called when the update timer ticks.\n *\n * @return {!Promise}\n * @private\n */\n async onUpdate_() {\n goog.asserts.assert(this.updatePeriod_ >= 0,\n 'There should be an update period');\n\n shaka.log.info('Updating manifest...');\n\n // Default the update delay to 0 seconds so that if there is an error we can\n // try again right away.\n let updateDelay = 0;\n\n try {\n updateDelay = await this.requestManifest_();\n } catch (error) {\n goog.asserts.assert(error instanceof shaka.util.Error,\n 'Should only receive a Shaka error');\n\n // Try updating again, but ensure we haven't been destroyed.\n if (this.playerInterface_) {\n if (this.config_.raiseFatalErrorOnManifestUpdateRequestFailure) {\n this.playerInterface_.onError(error);\n return;\n }\n // We will retry updating, so override the severity of the error.\n error.severity = shaka.util.Error.Severity.RECOVERABLE;\n this.playerInterface_.onError(error);\n }\n }\n\n // Detect a call to stop()\n if (!this.playerInterface_) {\n return;\n }\n\n this.playerInterface_.onManifestUpdated();\n\n this.setUpdateTimer_(updateDelay);\n }\n\n /**\n * Update now the manifest\n *\n * @private\n */\n updateNow_() {\n this.updateTimer_.tickNow();\n }\n\n /**\n * Sets the update timer. Does nothing if the manifest does not specify an\n * update period.\n *\n * @param {number} offset An offset, in seconds, to apply to the manifest's\n * update period.\n * @private\n */\n setUpdateTimer_(offset) {\n // NOTE: An updatePeriod_ of -1 means the attribute was missing.\n // An attribute which is present and set to 0 should still result in\n // periodic updates. For more, see:\n // https://github.com/Dash-Industry-Forum/Guidelines-TimingModel/issues/48\n if (this.updatePeriod_ < 0) {\n return;\n }\n let updateTime = this.updatePeriod_;\n if (this.config_.updatePeriod >= 0) {\n updateTime = this.config_.updatePeriod;\n }\n\n const finalDelay = Math.max(\n updateTime - offset,\n this.averageUpdateDuration_.getEstimate());\n\n // We do not run the timer as repeating because part of update is async and\n // we need schedule the update after it finished.\n this.updateTimer_.tickAfter(/* seconds= */ finalDelay);\n }\n\n /**\n * Creates a new inheritance frame for the given element.\n *\n * @param {!shaka.extern.xml.Node} elem\n * @param {?shaka.dash.DashParser.InheritanceFrame} parent\n * @param {?function(): !Array<string>} getBaseUris\n * @return {shaka.dash.DashParser.InheritanceFrame}\n * @private\n */\n createFrame_(elem, parent, getBaseUris) {\n goog.asserts.assert(parent || getBaseUris,\n 'Must provide either parent or getBaseUris');\n const SegmentUtils = shaka.media.SegmentUtils;\n const ManifestParserUtils = shaka.util.ManifestParserUtils;\n const TXml = shaka.util.TXml;\n parent = parent || /** @type {shaka.dash.DashParser.InheritanceFrame} */ ({\n contentType: '',\n mimeType: '',\n codecs: '',\n emsgSchemeIdUris: [],\n frameRate: undefined,\n pixelAspectRatio: undefined,\n numChannels: null,\n audioSamplingRate: null,\n availabilityTimeOffset: 0,\n segmentSequenceCadence: 0,\n encrypted: false,\n });\n getBaseUris = getBaseUris || parent.getBaseUris;\n\n const parseNumber = TXml.parseNonNegativeInt;\n const evalDivision = TXml.evalDivision;\n\n const id = elem.attributes['id'];\n const supplementalId = elem.attributes['supplementalId'];\n const uriObjs = TXml.findChildren(elem, 'BaseURL');\n let calculatedBaseUris;\n let someLocationValid = false;\n if (this.contentSteeringManager_) {\n for (const uriObj of uriObjs) {\n const serviceLocation = uriObj.attributes['serviceLocation'];\n const uri = TXml.getContents(uriObj);\n if (serviceLocation && uri) {\n this.contentSteeringManager_.addLocation(\n id, serviceLocation, uri);\n someLocationValid = true;\n }\n }\n }\n if (!someLocationValid || !this.contentSteeringManager_) {\n calculatedBaseUris = uriObjs.map(TXml.getContents);\n }\n\n const getFrameUris = () => {\n if (!uriObjs.length) {\n return [];\n }\n if (this.contentSteeringManager_ && someLocationValid) {\n return this.contentSteeringManager_.getLocations(id);\n }\n if (calculatedBaseUris) {\n return calculatedBaseUris;\n }\n return [];\n };\n\n let contentType = elem.attributes['contentType'] || parent.contentType;\n const mimeType = elem.attributes['mimeType'] || parent.mimeType;\n const allCodecs = [\n elem.attributes['codecs'] || parent.codecs,\n ];\n const codecs = SegmentUtils.codecsFiltering(allCodecs).join(',');\n const frameRate =\n TXml.parseAttr(elem, 'frameRate', evalDivision) || parent.frameRate;\n const pixelAspectRatio =\n elem.attributes['sar'] || parent.pixelAspectRatio;\n const emsgSchemeIdUris = this.emsgSchemeIdUris_(\n TXml.findChildren(elem, 'InbandEventStream'),\n parent.emsgSchemeIdUris);\n const audioChannelConfigs =\n TXml.findChildren(elem, 'AudioChannelConfiguration');\n const numChannels =\n this.parseAudioChannels_(audioChannelConfigs) || parent.numChannels;\n const audioSamplingRate =\n TXml.parseAttr(elem, 'audioSamplingRate', parseNumber) ||\n parent.audioSamplingRate;\n\n if (!contentType) {\n contentType = shaka.dash.DashParser.guessContentType_(mimeType, codecs);\n }\n\n const segmentBase = TXml.findChild(elem, 'SegmentBase');\n const segmentTemplate = TXml.findChild(elem, 'SegmentTemplate');\n\n // The availabilityTimeOffset is the sum of all @availabilityTimeOffset\n // values that apply to the adaptation set, via BaseURL, SegmentBase,\n // or SegmentTemplate elements.\n const segmentBaseAto = segmentBase ?\n (TXml.parseAttr(segmentBase, 'availabilityTimeOffset',\n TXml.parseFloat) || 0) : 0;\n const segmentTemplateAto = segmentTemplate ?\n (TXml.parseAttr(segmentTemplate, 'availabilityTimeOffset',\n TXml.parseFloat) || 0) : 0;\n const baseUriAto = uriObjs && uriObjs.length ?\n (TXml.parseAttr(uriObjs[0], 'availabilityTimeOffset',\n TXml.parseFloat) || 0) : 0;\n\n const availabilityTimeOffset = parent.availabilityTimeOffset + baseUriAto +\n segmentBaseAto + segmentTemplateAto;\n\n let segmentSequenceCadence = null;\n const segmentSequenceProperties =\n TXml.findChild(elem, 'SegmentSequenceProperties');\n if (segmentSequenceProperties) {\n const sap = TXml.findChild(segmentSequenceProperties, 'SAP');\n if (sap) {\n segmentSequenceCadence = TXml.parseAttr(sap, 'cadence',\n TXml.parseInt);\n }\n }\n\n // This attribute is currently non-standard, but it is supported by Kaltura.\n let label = elem.attributes['label'];\n\n // See DASH IOP 4.3 here https://dashif.org/docs/DASH-IF-IOP-v4.3.pdf (page 35)\n const labelElements = TXml.findChildren(elem, 'Label');\n if (labelElements && labelElements.length) {\n // NOTE: Right now only one label field is supported.\n const firstLabelElement = labelElements[0];\n if (TXml.getTextContents(firstLabelElement)) {\n label = TXml.getTextContents(firstLabelElement);\n }\n }\n\n return {\n getBaseUris:\n () => ManifestParserUtils.resolveUris(getBaseUris(), getFrameUris()),\n segmentBase: segmentBase || parent.segmentBase,\n segmentList:\n TXml.findChild(elem, 'SegmentList') || parent.segmentList,\n segmentTemplate: segmentTemplate || parent.segmentTemplate,\n width: TXml.parseAttr(elem, 'width', parseNumber) || parent.width,\n height: TXml.parseAttr(elem, 'height', parseNumber) || parent.height,\n contentType: contentType,\n mimeType: mimeType,\n codecs: codecs,\n frameRate: frameRate,\n pixelAspectRatio: pixelAspectRatio,\n emsgSchemeIdUris: emsgSchemeIdUris,\n id: supplementalId || id,\n originalId: id,\n language: elem.attributes['lang'],\n numChannels: numChannels,\n audioSamplingRate: audioSamplingRate,\n availabilityTimeOffset: availabilityTimeOffset,\n initialization: null,\n segmentSequenceCadence:\n segmentSequenceCadence || parent.segmentSequenceCadence,\n label: label || null,\n encrypted: false,\n };\n }\n\n /**\n * Returns a new array of InbandEventStream schemeIdUri containing the union\n * of the ones parsed from inBandEventStreams and the ones provided in\n * emsgSchemeIdUris.\n *\n * @param {!Array<!shaka.extern.xml.Node>} inBandEventStreams\n * Array of InbandEventStream\n * elements to parse and add to the returned array.\n * @param {!Array<string>} emsgSchemeIdUris Array of parsed\n * InbandEventStream schemeIdUri attributes to add to the returned array.\n * @return {!Array<string>} schemeIdUris Array of parsed\n * InbandEventStream schemeIdUri attributes.\n * @private\n */\n emsgSchemeIdUris_(inBandEventStreams, emsgSchemeIdUris) {\n const schemeIdUris = emsgSchemeIdUris.slice();\n for (const event of inBandEventStreams) {\n const schemeIdUri = event.attributes['schemeIdUri'];\n if (!schemeIdUris.includes(schemeIdUri)) {\n schemeIdUris.push(schemeIdUri);\n }\n }\n return schemeIdUris;\n }\n\n /**\n * @param {!Array<!shaka.extern.xml.Node>} audioChannelConfigs An array of\n * AudioChannelConfiguration elements.\n * @return {?number} The number of audio channels, or null if unknown.\n * @private\n */\n parseAudioChannels_(audioChannelConfigs) {\n for (const elem of audioChannelConfigs) {\n const scheme = elem.attributes['schemeIdUri'];\n if (!scheme) {\n continue;\n }\n\n const value = elem.attributes['value'];\n if (!value) {\n continue;\n }\n\n switch (scheme) {\n case 'urn:mpeg:dash:outputChannelPositionList:2012':\n // A space-separated list of speaker positions, so the number of\n // channels is the length of this list.\n return value.trim().split(/ +/).length;\n\n case 'urn:mpeg:dash:23003:3:audio_channel_configuration:2011':\n case 'urn:dts:dash:audio_channel_configuration:2012': {\n // As far as we can tell, this is a number of channels.\n const intValue = parseInt(value, 10);\n if (!intValue) { // 0 or NaN\n shaka.log.warning('Channel parsing failure! ' +\n 'Ignoring scheme and value', scheme, value);\n continue;\n }\n return intValue;\n }\n\n case 'tag:dolby.com,2015:dash:audio_channel_configuration:2015': {\n // ETSI TS 103 190-2 v1.2.1, Annex G.3\n // LSB-to-MSB order\n const channelCountMapping =\n [2, 1, 2, 2, 2, 2, 1, 2, 2, 1, 1, 1, 1, 2, 1, 1, 2, 2];\n const hexValue = parseInt(value, 16);\n if (!hexValue) { // 0 or NaN\n shaka.log.warning('Channel parsing failure! ' +\n 'Ignoring scheme and value', scheme, value);\n continue;\n }\n let numBits = 0;\n for (let i = 0; i < channelCountMapping.length; i++) {\n if (hexValue & (1<<i)) {\n numBits += channelCountMapping[i];\n }\n }\n if (numBits) {\n return numBits;\n }\n continue;\n }\n\n case 'tag:dolby.com,2014:dash:audio_channel_configuration:2011':\n case 'urn:dolby:dash:audio_channel_configuration:2011': {\n // Defined by https://ott.dolby.com/OnDelKits/DDP/Dolby_Digital_Plus_Online_Delivery_Kit_v1.5/Documentation/Content_Creation/SDM/help_files/topics/ddp_mpeg_dash_c_mpd_auchlconfig.html\n // keep list in order of the spec; reverse for LSB-to-MSB order\n const channelCountMapping =\n [1, 1, 1, 1, 1, 2, 2, 1, 1, 2, 2, 2, 1, 2, 1, 1].reverse();\n const hexValue = parseInt(value, 16);\n if (!hexValue) { // 0 or NaN\n shaka.log.warning('Channel parsing failure! ' +\n 'Ignoring scheme and value', scheme, value);\n continue;\n }\n let numBits = 0;\n for (let i = 0; i < channelCountMapping.length; i++) {\n if (hexValue & (1<<i)) {\n numBits += channelCountMapping[i];\n }\n }\n if (numBits) {\n return numBits;\n }\n continue;\n }\n\n // Defined by https://dashif.org/identifiers/audio_source_metadata/ and clause 8.2, in ISO/IEC 23001-8.\n case 'urn:mpeg:mpegB:cicp:ChannelConfiguration': {\n const noValue = 0;\n const channelCountMapping = [\n noValue, 1, 2, 3, 4, 5, 6, 8, 2, 3, /* 0--9 */\n 4, 7, 8, 24, 8, 12, 10, 12, 14, 12, /* 10--19 */\n 14, /* 20 */\n ];\n const intValue = parseInt(value, 10);\n if (!intValue) { // 0 or NaN\n shaka.log.warning('Channel parsing failure! ' +\n 'Ignoring scheme and value', scheme, value);\n continue;\n }\n if (intValue > noValue && intValue < channelCountMapping.length) {\n return channelCountMapping[intValue];\n }\n continue;\n }\n\n default:\n shaka.log.warning(\n 'Unrecognized audio channel scheme:', scheme, value);\n continue;\n }\n }\n\n return null;\n }\n\n /**\n * Verifies that a Representation has exactly one Segment* element. Prints\n * warnings if there is a problem.\n *\n * @param {shaka.dash.DashParser.InheritanceFrame} frame\n * @return {boolean} True if the Representation is usable; otherwise return\n * false.\n * @private\n */\n verifyRepresentation_(frame) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n\n let n = 0;\n n += frame.segmentBase ? 1 : 0;\n n += frame.segmentList ? 1 : 0;\n n += frame.segmentTemplate ? 1 : 0;\n\n if (n == 0) {\n // TODO: Extend with the list of MIME types registered to TextEngine.\n if (frame.contentType == ContentType.TEXT ||\n frame.contentType == ContentType.APPLICATION) {\n return true;\n } else {\n shaka.log.warning(\n 'Representation does not contain a segment information source:',\n 'the Representation must contain one of SegmentBase, SegmentList,',\n 'SegmentTemplate, or explicitly indicate that it is \"text\".',\n frame);\n return false;\n }\n }\n\n if (n != 1) {\n shaka.log.warning(\n 'Representation contains multiple segment information sources:',\n 'the Representation should only contain one of SegmentBase,',\n 'SegmentList, or SegmentTemplate.',\n frame);\n if (frame.segmentBase) {\n shaka.log.info('Using SegmentBase by default.');\n frame.segmentList = null;\n frame.segmentTemplate = null;\n } else {\n goog.asserts.assert(frame.segmentList, 'There should be a SegmentList');\n shaka.log.info('Using SegmentList by default.');\n frame.segmentTemplate = null;\n }\n }\n\n return true;\n }\n\n /**\n * Makes a request to the given URI and calculates the clock offset.\n *\n * @param {function(): !Array<string>} getBaseUris\n * @param {string} uri\n * @param {string} method\n * @return {!Promise<number>}\n * @private\n */\n async requestForTiming_(getBaseUris, uri, method) {\n const uris = [shaka.util.StringUtils.htmlUnescape(uri)];\n const requestUris =\n shaka.util.ManifestParserUtils.resolveUris(getBaseUris(), uris);\n const request = shaka.net.NetworkingEngine.makeRequest(\n requestUris, this.config_.retryParameters);\n request.method = method;\n const type = shaka.net.NetworkingEngine.RequestType.TIMING;\n\n const operation =\n this.playerInterface_.networkingEngine.request(\n type, request, {isPreload: this.isPreloadFn_()});\n this.operationManager_.manage(operation);\n\n const response = await operation.promise;\n let text;\n if (method == 'HEAD') {\n if (!response.headers || !response.headers['date']) {\n shaka.log.warning('UTC timing response is missing',\n 'expected date header');\n return 0;\n }\n text = response.headers['date'];\n } else {\n text = shaka.util.StringUtils.fromUTF8(response.data);\n }\n const date = Date.parse(text);\n if (isNaN(date)) {\n shaka.log.warning('Unable to parse date from UTC timing response');\n return 0;\n }\n return (date - Date.now());\n }\n\n /**\n * Parses an array of UTCTiming elements.\n *\n * @param {function(): !Array<string>} getBaseUris\n * @param {!Array<!shaka.extern.xml.Node>} elements\n * @return {!Promise<number>}\n * @private\n */\n async parseUtcTiming_(getBaseUris, elements) {\n const schemesAndValues = elements.map((elem) => {\n return {\n scheme: elem.attributes['schemeIdUri'],\n value: elem.attributes['value'],\n };\n });\n\n // If there's nothing specified in the manifest, but we have a default from\n // the config, use that.\n const clockSyncUri = this.config_.dash.clockSyncUri;\n if (!schemesAndValues.length && clockSyncUri) {\n schemesAndValues.push({\n scheme: 'urn:mpeg:dash:utc:http-head:2014',\n value: clockSyncUri,\n });\n }\n\n for (const sv of schemesAndValues) {\n try {\n const scheme = sv.scheme;\n const value = sv.value;\n switch (scheme) {\n // See DASH IOP Guidelines Section 4.7\n // https://bit.ly/DashIop3-2\n // Some old ISO23009-1 drafts used 2012.\n case 'urn:mpeg:dash:utc:http-head:2014':\n case 'urn:mpeg:dash:utc:http-head:2012':\n // eslint-disable-next-line no-await-in-loop\n return await this.requestForTiming_(getBaseUris, value, 'HEAD');\n case 'urn:mpeg:dash:utc:http-xsdate:2014':\n case 'urn:mpeg:dash:utc:http-iso:2014':\n case 'urn:mpeg:dash:utc:http-xsdate:2012':\n case 'urn:mpeg:dash:utc:http-iso:2012':\n // eslint-disable-next-line no-await-in-loop\n return await this.requestForTiming_(getBaseUris, value, 'GET');\n case 'urn:mpeg:dash:utc:direct:2014':\n case 'urn:mpeg:dash:utc:direct:2012': {\n const date = Date.parse(value);\n return isNaN(date) ? 0 : (date - Date.now());\n }\n\n case 'urn:mpeg:dash:utc:http-ntp:2014':\n case 'urn:mpeg:dash:utc:ntp:2014':\n case 'urn:mpeg:dash:utc:sntp:2014':\n shaka.log.alwaysWarn('NTP UTCTiming scheme is not supported');\n break;\n default:\n shaka.log.alwaysWarn(\n 'Unrecognized scheme in UTCTiming element', scheme);\n break;\n }\n } catch (e) {\n shaka.log.warning('Error fetching time from UTCTiming elem', e.message);\n }\n }\n\n shaka.log.alwaysWarn(\n 'A UTCTiming element should always be given in live manifests! ' +\n 'This content may not play on clients with bad clocks!');\n return 0;\n }\n\n /**\n * Parses an EventStream element.\n *\n * @param {number} periodStart\n * @param {?number} periodDuration\n * @param {!shaka.extern.xml.Node} elem\n * @param {number} availabilityStart\n * @private\n */\n parseEventStream_(periodStart, periodDuration, elem, availabilityStart) {\n const TXml = shaka.util.TXml;\n const parseNumber = shaka.util.TXml.parseNonNegativeInt;\n\n const schemeIdUri = elem.attributes['schemeIdUri'] || '';\n const value = elem.attributes['value'] || '';\n const timescale = TXml.parseAttr(elem, 'timescale', parseNumber) || 1;\n const presentationTimeOffset =\n TXml.parseAttr(elem, 'presentationTimeOffset', parseNumber) || 0;\n\n for (const eventNode of TXml.findChildren(elem, 'Event')) {\n const presentationTime =\n TXml.parseAttr(eventNode, 'presentationTime', parseNumber) || 0;\n const duration =\n TXml.parseAttr(eventNode, 'duration', parseNumber) || 0;\n\n // Ensure start time won't be lower than period start.\n let startTime = Math.max(\n (presentationTime - presentationTimeOffset) / timescale + periodStart,\n periodStart);\n let endTime = startTime + (duration / timescale);\n if (periodDuration != null) {\n // An event should not go past the Period, even if the manifest says so.\n // See: Dash sec. 5.10.2.1\n startTime = Math.min(startTime, periodStart + periodDuration);\n endTime = Math.min(endTime, periodStart + periodDuration);\n }\n\n // Don't add unavailable regions to the timeline.\n if (endTime < availabilityStart) {\n continue;\n }\n\n /** @type {shaka.extern.TimelineRegionInfo} */\n const region = {\n schemeIdUri: schemeIdUri,\n value: value,\n startTime: startTime,\n endTime: endTime,\n id: eventNode.attributes['id'] || '',\n timescale: timescale,\n eventElement: TXml.txmlNodeToDomElement(eventNode),\n eventNode: TXml.cloneNode(eventNode),\n };\n\n this.playerInterface_.onTimelineRegionAdded(region);\n }\n }\n\n /**\n * Makes a network request on behalf of SegmentBase.createStreamInfo.\n *\n * @param {!Array<string>} uris\n * @param {?number} startByte\n * @param {?number} endByte\n * @param {boolean} isInit\n * @return {!Promise<BufferSource>}\n * @private\n */\n async requestSegment_(uris, startByte, endByte, isInit) {\n const requestType = shaka.net.NetworkingEngine.RequestType.SEGMENT;\n const type = isInit ?\n shaka.net.NetworkingEngine.AdvancedRequestType.INIT_SEGMENT :\n shaka.net.NetworkingEngine.AdvancedRequestType.MEDIA_SEGMENT;\n\n const request = shaka.util.Networking.createSegmentRequest(\n uris,\n startByte,\n endByte,\n this.config_.retryParameters);\n\n const response = await this.makeNetworkRequest_(\n request, requestType, {type});\n return response.data;\n }\n\n /**\n * Guess the content type based on MIME type and codecs.\n *\n * @param {string} mimeType\n * @param {string} codecs\n * @return {string}\n * @private\n */\n static guessContentType_(mimeType, codecs) {\n const fullMimeType = shaka.util.MimeUtils.getFullType(mimeType, codecs);\n\n if (shaka.text.TextEngine.isTypeSupported(fullMimeType)) {\n // If it's supported by TextEngine, it's definitely text.\n // We don't check MediaSourceEngine, because that would report support\n // for platform-supported video and audio types as well.\n return shaka.util.ManifestParserUtils.ContentType.TEXT;\n }\n\n // Otherwise, just split the MIME type. This handles video and audio\n // types well.\n return mimeType.split('/')[0];\n }\n\n\n /**\n * Create a networking request. This will manage the request using the\n * parser's operation manager.\n *\n * @param {shaka.extern.Request} request\n * @param {shaka.net.NetworkingEngine.RequestType} type\n * @param {shaka.extern.RequestContext=} context\n * @return {!Promise<shaka.extern.Response>}\n * @private\n */\n makeNetworkRequest_(request, type, context) {\n if (!context) {\n context = {};\n }\n context.isPreload = this.isPreloadFn_();\n const op = this.playerInterface_.networkingEngine.request(\n type, request, context);\n this.operationManager_.manage(op);\n return op.promise;\n }\n\n /**\n * @param {!shaka.extern.xml.Node} patchNode\n * @private\n */\n updatePatchLocationNodes_(patchNode) {\n const TXml = shaka.util.TXml;\n TXml.modifyNodes(this.patchLocationNodes_, patchNode);\n }\n\n /**\n * @return {!Array<string>}\n * @private\n */\n getPatchLocationUris_() {\n const TXml = shaka.util.TXml;\n const mpdId = this.manifestPatchContext_.mpdId;\n const publishTime = this.manifestPatchContext_.publishTime;\n if (!mpdId || !publishTime || !this.patchLocationNodes_.length) {\n return [];\n }\n const now = Date.now() / 1000;\n const patchLocations = this.patchLocationNodes_.filter((patchLocation) => {\n const ttl = TXml.parseNonNegativeInt(patchLocation.attributes['ttl']);\n return !ttl || publishTime + ttl > now;\n })\n .map(TXml.getContents)\n .filter(shaka.util.Functional.isNotNull);\n\n if (!patchLocations.length) {\n return [];\n }\n return shaka.util.ManifestParserUtils.resolveUris(\n this.manifestUris_, patchLocations);\n }\n};\n\n/**\n * @typedef {{\n * mpdId: string,\n * type: string,\n * mediaPresentationDuration: ?number,\n * profiles: !Array<string>,\n * availabilityTimeOffset: number,\n * getBaseUris: ?function():!Array<string>,\n * publishTime: number\n * }}\n *\n * @property {string} mpdId\n * ID of the original MPD file.\n * @property {string} type\n * Specifies the type of the dash manifest i.e. \"static\"\n * @property {?number} mediaPresentationDuration\n * Media presentation duration, or null if unknown.\n * @property {!Array<string>} profiles\n * Profiles of DASH are defined to enable interoperability and the\n * signaling of the use of features.\n * @property {number} availabilityTimeOffset\n * Specifies the total availabilityTimeOffset of the segment.\n * @property {?function():!Array<string>} getBaseUris\n * An array of absolute base URIs.\n * @property {number} publishTime\n * Time when manifest has been published, in seconds.\n */\nshaka.dash.DashParser.PatchContext;\n\n\n/**\n * @const {string}\n * @private\n */\nshaka.dash.DashParser.SCTE214_ = 'urn:scte:dash:scte214-extensions';\n\n\n/**\n * @const {string}\n * @private\n */\nshaka.dash.DashParser.UP_NAMESPACE_ = 'urn:mpeg:dash:schema:urlparam:2014';\n\n\n/**\n * @typedef {\n * function(!Array<string>, ?number, ?number, boolean):\n * !Promise<BufferSource>\n * }\n */\nshaka.dash.DashParser.RequestSegmentCallback;\n\n\n/**\n * @typedef {{\n * segmentBase: ?shaka.extern.xml.Node,\n * segmentList: ?shaka.extern.xml.Node,\n * segmentTemplate: ?shaka.extern.xml.Node,\n * getBaseUris: function():!Array<string>,\n * width: (number|undefined),\n * height: (number|undefined),\n * contentType: string,\n * mimeType: string,\n * codecs: string,\n * frameRate: (number|undefined),\n * pixelAspectRatio: (string|undefined),\n * emsgSchemeIdUris: !Array<string>,\n * id: ?string,\n * originalId: ?string,\n * position: (number|undefined),\n * language: ?string,\n * numChannels: ?number,\n * audioSamplingRate: ?number,\n * availabilityTimeOffset: number,\n * initialization: ?string,\n * aesKey: (shaka.extern.aesKey|undefined),\n * segmentSequenceCadence: number,\n * label: ?string,\n * encrypted: boolean\n * }}\n *\n * @description\n * A collection of elements and properties which are inherited across levels\n * of a DASH manifest.\n *\n * @property {?shaka.extern.xml.Node} segmentBase\n * The XML node for SegmentBase.\n * @property {?shaka.extern.xml.Node} segmentList\n * The XML node for SegmentList.\n * @property {?shaka.extern.xml.Node} segmentTemplate\n * The XML node for SegmentTemplate.\n * @property {function():!Array<string>} getBaseUris\n * Function than returns an array of absolute base URIs for the frame.\n * @property {(number|undefined)} width\n * The inherited width value.\n * @property {(number|undefined)} height\n * The inherited height value.\n * @property {string} contentType\n * The inherited media type.\n * @property {string} mimeType\n * The inherited MIME type value.\n * @property {string} codecs\n * The inherited codecs value.\n * @property {(number|undefined)} frameRate\n * The inherited framerate value.\n * @property {(string|undefined)} pixelAspectRatio\n * The inherited pixel aspect ratio value.\n * @property {!Array<string>} emsgSchemeIdUris\n * emsg registered schemeIdUris.\n * @property {?string} id\n * The ID of the element.\n * @property {?string} originalId\n * The original ID of the element.\n * @property {number|undefined} position\n * Position of the element used for indexing in case of no id\n * @property {?string} language\n * The original language of the element.\n * @property {?number} numChannels\n * The number of audio channels, or null if unknown.\n * @property {?number} audioSamplingRate\n * Specifies the maximum sampling rate of the content, or null if unknown.\n * @property {number} availabilityTimeOffset\n * Specifies the total availabilityTimeOffset of the segment, or 0 if unknown.\n * @property {?string} initialization\n * Specifies the file where the init segment is located, or null.\n * @property {(shaka.extern.aesKey|undefined)} aesKey\n * AES-128 Content protection key\n * @property {number} segmentSequenceCadence\n * Specifies the cadence of independent segments in Segment Sequence\n * Representation.\n * @property {?string} label\n * Label or null if unknown.\n * @property {boolean} encrypted\n * Specifies is encrypted or not.\n */\nshaka.dash.DashParser.InheritanceFrame;\n\n\n/**\n * @typedef {{\n * dynamic: boolean,\n * presentationTimeline: !shaka.media.PresentationTimeline,\n * period: ?shaka.dash.DashParser.InheritanceFrame,\n * periodInfo: ?shaka.dash.DashParser.PeriodInfo,\n * adaptationSet: ?shaka.dash.DashParser.InheritanceFrame,\n * representation: ?shaka.dash.DashParser.InheritanceFrame,\n * bandwidth: number,\n * indexRangeWarningGiven: boolean,\n * availabilityTimeOffset: number,\n * mediaPresentationDuration: ?number,\n * profiles: !Array<string>,\n * roles: ?Array<string>,\n * urlParams: function():string\n * }}\n *\n * @description\n * Contains context data for the streams. This is designed to be\n * shallow-copyable, so the parser must overwrite (not modify) each key as the\n * parser moves through the manifest and the parsing context changes.\n *\n * @property {boolean} dynamic\n * True if the MPD is dynamic (not all segments available at once)\n * @property {!shaka.media.PresentationTimeline} presentationTimeline\n * The PresentationTimeline.\n * @property {?shaka.dash.DashParser.InheritanceFrame} period\n * The inheritance from the Period element.\n * @property {?shaka.dash.DashParser.PeriodInfo} periodInfo\n * The Period info for the current Period.\n * @property {?shaka.dash.DashParser.InheritanceFrame} adaptationSet\n * The inheritance from the AdaptationSet element.\n * @property {?shaka.dash.DashParser.InheritanceFrame} representation\n * The inheritance from the Representation element.\n * @property {number} bandwidth\n * The bandwidth of the Representation, or zero if missing.\n * @property {boolean} indexRangeWarningGiven\n * True if the warning about SegmentURL@indexRange has been printed.\n * @property {number} availabilityTimeOffset\n * The sum of the availabilityTimeOffset values that apply to the element.\n * @property {!Array<string>} profiles\n * Profiles of DASH are defined to enable interoperability and the signaling\n * of the use of features.\n * @property {?number} mediaPresentationDuration\n * Media presentation duration, or null if unknown.\n * @property {function():string} urlParams\n * The query params for the segments.\n */\nshaka.dash.DashParser.Context;\n\n\n/**\n * @typedef {{\n * start: number,\n * duration: ?number,\n * node: ?shaka.extern.xml.Node,\n * isLastPeriod: boolean\n * }}\n *\n * @description\n * Contains information about a Period element.\n *\n * @property {number} start\n * The start time of the period.\n * @property {?number} duration\n * The duration of the period; or null if the duration is not given. This\n * will be non-null for all periods except the last.\n * @property {?shaka.extern.xml.Node} node\n * The XML Node for the Period.\n * @property {boolean} isLastPeriod\n * Whether this Period is the last one in the manifest.\n */\nshaka.dash.DashParser.PeriodInfo;\n\n\n/**\n * @typedef {{\n * id: string,\n * contentType: ?string,\n * language: string,\n * main: boolean,\n * streams: !Array<shaka.extern.Stream>,\n * drmInfos: !Array<shaka.extern.DrmInfo>,\n * trickModeFor: ?string,\n * representationIds: !Array<string>,\n * dependencyStreamMap: !Map<string, shaka.extern.Stream>\n * }}\n *\n * @description\n * Contains information about an AdaptationSet element.\n *\n * @property {string} id\n * The unique ID of the adaptation set.\n * @property {?string} contentType\n * The content type of the AdaptationSet.\n * @property {string} language\n * The language of the AdaptationSet.\n * @property {boolean} main\n * Whether the AdaptationSet has the 'main' type.\n * @property {!Array<shaka.extern.Stream>} streams\n * The streams this AdaptationSet contains.\n * @property {!Array<shaka.extern.DrmInfo>} drmInfos\n * The DRM info for the AdaptationSet.\n * @property {?string} trickModeFor\n * If non-null, this AdaptationInfo represents trick mode tracks. This\n * property is the ID of the normal AdaptationSet these tracks should be\n * associated with.\n * @property {!Array<string>} representationIds\n * An array of the IDs of the Representations this AdaptationSet contains.\n * @property {!Map<string, string>} dependencyStreamMap\n * A map of dependencyStream\n */\nshaka.dash.DashParser.AdaptationInfo;\n\n\n/**\n * @typedef {function(): !Promise<shaka.media.SegmentIndex>}\n * @description\n * An async function which generates and returns a SegmentIndex.\n */\nshaka.dash.DashParser.GenerateSegmentIndexFunction;\n\n\n/**\n * @typedef {{\n * generateSegmentIndex: shaka.dash.DashParser.GenerateSegmentIndexFunction\n * }}\n *\n * @description\n * Contains information about a Stream. This is passed from the createStreamInfo\n * methods.\n *\n * @property {shaka.dash.DashParser.GenerateSegmentIndexFunction\n * } generateSegmentIndex\n * An async function to create the SegmentIndex for the stream.\n */\nshaka.dash.DashParser.StreamInfo;\n\n\nshaka.media.ManifestParser.registerParserByMime(\n 'application/dash+xml', () => new shaka.dash.DashParser());\nshaka.media.ManifestParser.registerParserByMime(\n 'video/vnd.mpeg.dash.mpd', () => new shaka.dash.DashParser());\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.dependencies');\n\ngoog.require('shaka.Deprecate');\n\n/**\n * @export\n */\nshaka.dependencies = class {\n /**\n * Registers a new dependency.\n *\n * @param {shaka.dependencies.Allowed} key which is used for retrieving a\n * dependency\n * @param {?} dep a dependency\n * @export\n */\n static add(key, dep) {\n if (!shaka.dependencies.Allowed[key]) {\n throw new Error(`${key} is not supported`);\n }\n if (key == shaka.dependencies.Allowed.muxjs) {\n shaka.Deprecate.deprecateFeature(5,\n 'mux.js',\n 'mux.js is no longer used in Shaka Player.');\n return;\n }\n shaka.dependencies.dependencies_.set(key, () => dep);\n }\n\n /**\n * Check if we have a dependency for the key.\n *\n * @param {shaka.dependencies.Allowed} key key\n * @return {boolean}\n * @export\n */\n static has(key) {\n return shaka.dependencies.dependencies_.has(key);\n }\n\n /** @return {?ISOBoxer} */\n static isoBoxer() {\n return /** @type {?ISOBoxer} */ (shaka.dependencies.dependencies_.get(\n shaka.dependencies.Allowed.ISOBoxer)());\n }\n};\n\n/**\n * @export\n * @enum {string}\n */\nshaka.dependencies.Allowed = {\n muxjs: 'muxjs',\n ISOBoxer: 'ISOBoxer',\n};\n\n// eslint-disable-next-line jsdoc/require-returns\n/**\n * Contains accessor functions to shared dependencies that could be used by\n * other components. The default accessors can be overridden.\n *\n * @private {!Map<shaka.dependencies.Allowed, function(): ?>}\n */\nshaka.dependencies.dependencies_ = new Map([\n [shaka.dependencies.Allowed.ISOBoxer, () => window.ISOBoxer],\n]);\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.hls.Attribute');\ngoog.provide('shaka.hls.Playlist');\ngoog.provide('shaka.hls.PlaylistType');\ngoog.provide('shaka.hls.Segment');\ngoog.provide('shaka.hls.Tag');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.util.Error');\n\n\n/**\n * HLS playlist class.\n */\nshaka.hls.Playlist = class {\n /**\n * @param {!shaka.hls.PlaylistType} type\n * @param {!Array<shaka.hls.Tag>} tags\n * @param {!Array<shaka.hls.Segment>=} segments\n */\n constructor(type, tags, segments) {\n /** @const {shaka.hls.PlaylistType} */\n this.type = type;\n\n /** @const {!Array<!shaka.hls.Tag>} */\n this.tags = tags;\n\n /** @const {Array<!shaka.hls.Segment>} */\n this.segments = segments || null;\n }\n};\n\n\n/**\n * @enum {number}\n */\nshaka.hls.PlaylistType = {\n MASTER: 0,\n MEDIA: 1,\n};\n\n\n/**\n * HLS tag class.\n */\nshaka.hls.Tag = class {\n /**\n * @param {number} id\n * @param {string} name\n * @param {!Array<shaka.hls.Attribute>} attributes\n * @param {?string=} value\n */\n constructor(id, name, attributes, value = null) {\n /** @const {number} */\n this.id = id;\n\n /** @type {string} */\n this.name = name;\n\n /** @const {!Array<shaka.hls.Attribute>} */\n this.attributes = attributes;\n\n /** @const {?string} */\n this.value = value;\n }\n\n /**\n * Create the string representation of the tag.\n *\n * For the DRM system - the full tag needs to be passed down to the CDM.\n * There are two ways of doing this (1) save the original tag or (2) recreate\n * the tag.\n * As in some cases (like in tests) the tag never existed in string form, it\n * is far easier to recreate the tag from the parsed form.\n *\n * @param {?Set<string>=} attributesToSkip\n * @return {string}\n * @override\n */\n toString(attributesToSkip) {\n /**\n * @param {shaka.hls.Attribute} attr\n * @return {string}\n */\n const attrToStr = (attr) => {\n const isNumericAttr = !isNaN(Number(attr.value));\n const value = (isNumericAttr ? attr.value : '\"' + attr.value + '\"');\n return attr.name + '=' + value;\n };\n // A valid tag can only follow 1 of 4 patterns.\n // 1) <NAME>:<VALUE>\n // 2) <NAME>:<ATTRIBUTE LIST>\n // 3) <NAME>\n // 4) <NAME>:<VALUE>,<ATTRIBUTE_LIST>\n\n let tagStr = '#' + this.name;\n const appendages = this.attributes ? this.attributes.filter((attr) => {\n if (!attributesToSkip) {\n return true;\n }\n return !attributesToSkip.has(attr.name);\n }).map(attrToStr) : [];\n\n if (this.value) {\n appendages.unshift(this.value);\n }\n\n if (appendages.length > 0) {\n tagStr += ':' + appendages.join(',');\n }\n\n return tagStr;\n }\n\n /**\n * Create the string key of the tag.\n *\n * @param {boolean} keepAllAttributes\n * @return {string}\n */\n getTagKey(keepAllAttributes) {\n if (keepAllAttributes) {\n return this.toString();\n }\n const attributesToSkip = new Set()\n .add('AUDIO')\n .add('VIDEO')\n .add('SUBTITLES')\n .add('PATHWAY-ID')\n .add('GROUP-ID')\n .add('URI');\n return this.toString(attributesToSkip);\n }\n\n /**\n * Adds an attribute to an HLS Tag.\n *\n * @param {!shaka.hls.Attribute} attribute\n */\n addAttribute(attribute) {\n this.attributes.push(attribute);\n }\n\n\n /**\n * Gets the first attribute of the tag with a specified name.\n *\n * @param {string} name\n * @return {?shaka.hls.Attribute} attribute\n */\n getAttribute(name) {\n const attributes = this.attributes.filter((attr) => {\n return attr.name == name;\n });\n\n goog.asserts.assert(attributes.length < 2,\n 'A tag should not have multiple attributes ' +\n 'with the same name!');\n\n if (attributes.length) {\n return attributes[0];\n } else {\n return null;\n }\n }\n\n /**\n * Gets the value of the first attribute of the tag with a specified name.\n * If not found, returns an optional default value.\n *\n * @param {string} name\n * @param {string=} defaultValue\n * @return {?string}\n */\n getAttributeValue(name, defaultValue) {\n const attribute = this.getAttribute(name);\n return attribute ? attribute.value : (defaultValue || null);\n }\n\n\n /**\n * Finds the attribute and returns its value.\n * Throws an error if attribute was not found.\n *\n * @param {string} name\n * @return {string}\n */\n getRequiredAttrValue(name) {\n const attribute = this.getAttribute(name);\n if (!attribute) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.HLS_REQUIRED_ATTRIBUTE_MISSING,\n name);\n }\n\n return attribute.value;\n }\n\n /**\n * Set the name of the tag. Used only for Preload hinted MAP tag.\n * @param {string} name\n */\n setName(name) {\n this.name = name;\n }\n};\n\n\n/**\n * HLS segment class.\n */\nshaka.hls.Segment = class {\n /**\n * Creates an HLS segment object.\n *\n * @param {string} verbatimSegmentUri verbatim segment URI.\n * @param {!Array<shaka.hls.Tag>} tags\n * @param {!Array<shaka.hls.Tag>=} partialSegments\n */\n constructor(verbatimSegmentUri, tags, partialSegments=[]) {\n /** @const {!Array<shaka.hls.Tag>} */\n this.tags = tags;\n\n /** @const {?string} */\n this.verbatimSegmentUri = verbatimSegmentUri;\n\n /** @type {!Array<shaka.hls.Tag>} */\n this.partialSegments = partialSegments;\n }\n};\n\n\n/**\n * HLS Attribute class.\n */\nshaka.hls.Attribute = class {\n /**\n * Creates an HLS attribute object.\n *\n * @param {string} name\n * @param {string} value\n */\n constructor(name, value) {\n /** @const {string} */\n this.name = name;\n\n /** @const {string} */\n this.value = value;\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.hls.Utils');\n\ngoog.require('shaka.log');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.ManifestParserUtils');\ngoog.requireType('shaka.hls.Tag');\n\n\nshaka.hls.Utils = class {\n /**\n *\n * @param {!Array<!shaka.hls.Tag>} tags\n * @param {string} name\n * @return {!Array<!shaka.hls.Tag>}\n */\n static filterTagsByName(tags, name) {\n return tags.filter((tag) => {\n return tag.name == name;\n });\n }\n\n\n /**\n *\n * @param {!Array<!shaka.hls.Tag>} tags\n * @param {string} type\n * @return {!Array<!shaka.hls.Tag>}\n */\n static filterTagsByType(tags, type) {\n return tags.filter((tag) => {\n const tagType = tag.getRequiredAttrValue('TYPE');\n return tagType == type;\n });\n }\n\n\n /**\n *\n * @param {!Array<!shaka.hls.Tag>} tags\n * @param {string} name\n * @return {?shaka.hls.Tag}\n */\n static getFirstTagWithName(tags, name) {\n for (const tag of tags) {\n if (tag.name === name) {\n return tag;\n }\n }\n return null;\n }\n\n /**\n * Get the numerical value of the first tag with given name if available.\n * Return the default value if the tag is not present.\n *\n * @param {!Array<!shaka.hls.Tag>} tags\n * @param {string} name\n * @param {number=} defaultValue\n * @return {number}\n */\n static getFirstTagWithNameAsNumber(tags, name, defaultValue = 0) {\n const tag = shaka.hls.Utils.getFirstTagWithName(tags, name);\n const value = tag ? Number(tag.value) : defaultValue;\n return value;\n }\n\n /**\n * @param {!Array<string>} baseUris\n * @param {?string} relativeUri\n * @param {?Map<string, string>=} variables\n * @return {!Array<string>}\n */\n static constructSegmentUris(baseUris, relativeUri, variables) {\n if (!relativeUri) {\n return [];\n }\n return shaka.hls.Utils.constructUris(baseUris, [relativeUri], variables);\n }\n\n\n /**\n * @param {!Array<string>} baseUris\n * @param {!Array<string>} relativeUris\n * @param {?Map<string, string>=} variables\n * @return {!Array<string>}\n */\n static constructUris(baseUris, relativeUris, variables) {\n if (!relativeUris.length) {\n return [];\n }\n const resolvedUris = shaka.util.ManifestParserUtils.resolveUris(\n baseUris, relativeUris);\n\n const uris = [];\n for (const uri of resolvedUris) {\n uris.push(shaka.hls.Utils.variableSubstitution(uri, variables));\n }\n\n return uris;\n }\n\n /**\n * Replaces the variables of a given URI.\n *\n * @param {string} uri\n * @param {?Map<string, string>=} variables\n * @return {string}\n */\n static variableSubstitution(uri, variables) {\n if (!variables || !variables.size) {\n return uri;\n }\n let newUri = String(uri).replace(/%7B/g, '{').replace(/%7D/g, '}');\n\n const uriVariables = newUri.match(/{\\$\\w*}/g);\n if (uriVariables) {\n for (const variable of uriVariables) {\n // Note: All variables have the structure {$...}\n const variableName = variable.slice(2, variable.length - 1);\n const replaceValue = variables.get(variableName);\n if (replaceValue) {\n newUri = newUri.replace(variable, replaceValue);\n } else {\n shaka.log.error('A variable has been found that is not declared',\n variableName);\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.HLS_VARIABLE_NOT_FOUND,\n variableName);\n }\n }\n }\n return newUri;\n }\n\n\n /**\n * Matches a string to an HLS comment format and returns the result.\n *\n * @param {string} line\n * @return {boolean}\n */\n static isComment(line) {\n return /^#(?!EXT)/m.test(line);\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.hls.ManifestTextParser');\n\ngoog.require('shaka.hls.Attribute');\ngoog.require('shaka.hls.Playlist');\ngoog.require('shaka.hls.PlaylistType');\ngoog.require('shaka.hls.Segment');\ngoog.require('shaka.hls.Tag');\ngoog.require('shaka.hls.Utils');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.StringUtils');\ngoog.require('shaka.util.TextParser');\n\n\n/**\n * HlS manifest text parser.\n */\nshaka.hls.ManifestTextParser = class {\n /** */\n constructor() {\n /** @private {number} */\n this.globalId_ = 0;\n }\n\n /**\n * @param {BufferSource} data\n * @return {!shaka.hls.Playlist}\n */\n parsePlaylist(data) {\n const MEDIA_PLAYLIST_TAGS =\n shaka.hls.ManifestTextParser.MEDIA_PLAYLIST_TAGS;\n const SEGMENT_TAGS = shaka.hls.ManifestTextParser.SEGMENT_TAGS;\n\n // Get the input as a string. Normalize newlines to \\n.\n let str = shaka.util.StringUtils.fromUTF8(data);\n str = str.replace(/\\r\\n|\\r(?=[^\\n]|$)/gm, '\\n').trim();\n\n const lines = str.split(/\\n+/m);\n\n if (!/^#EXTM3U($|[ \\t\\n])/m.test(lines[0])) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.HLS_PLAYLIST_HEADER_MISSING);\n }\n\n /** shaka.hls.PlaylistType */\n let playlistType = shaka.hls.PlaylistType.MASTER;\n\n // First, look for media playlist tags, so that we know what the playlist\n // type really is before we start parsing.\n // TODO: refactor the for loop for better readability.\n // Whether to skip the next element; initialize to true to skip first elem.\n let skip = true;\n for (const line of lines) {\n // Ignore comments.\n if (shaka.hls.Utils.isComment(line) || skip) {\n skip = false;\n continue;\n }\n const tag = this.parseTag_(line);\n // These tags won't actually be used, so don't increment the global\n // id.\n this.globalId_ -= 1;\n\n if (MEDIA_PLAYLIST_TAGS.includes(tag.name)) {\n playlistType = shaka.hls.PlaylistType.MEDIA;\n break;\n } else if (tag.name == 'EXT-X-STREAM-INF') {\n skip = true;\n }\n }\n\n /** {Array<shaka.hls.Tag>} */\n const tags = [];\n // Initialize to \"true\" to skip the first element.\n skip = true;\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const next = lines[i + 1];\n // Skip comments\n if (shaka.hls.Utils.isComment(line) || skip) {\n skip = false;\n continue;\n }\n\n const tag = this.parseTag_(line);\n if (SEGMENT_TAGS.includes(tag.name)) {\n if (playlistType != shaka.hls.PlaylistType.MEDIA) {\n // Only media playlists should contain segment tags\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.HLS_INVALID_PLAYLIST_HIERARCHY);\n }\n\n const segmentsData = lines.splice(i, lines.length - i);\n const segments = this.parseSegments_(segmentsData, tags);\n return new shaka.hls.Playlist(playlistType, tags, segments);\n }\n\n tags.push(tag);\n\n // An EXT-X-STREAM-INF tag is followed by a URI of a media playlist.\n // Add the URI to the tag object.\n if (tag.name == 'EXT-X-STREAM-INF') {\n const tagUri = new shaka.hls.Attribute('URI', next);\n tag.addAttribute(tagUri);\n skip = true;\n }\n }\n\n return new shaka.hls.Playlist(playlistType, tags);\n }\n\n /**\n * Parses an array of strings into an array of HLS Segment objects.\n *\n * @param {!Array<string>} lines\n * @param {!Array<!shaka.hls.Tag>} playlistTags\n * @return {!Array<shaka.hls.Segment>}\n * @private\n */\n parseSegments_(lines, playlistTags) {\n /** @type {!Array<shaka.hls.Segment>} */\n const segments = [];\n /** @type {!Array<shaka.hls.Tag>} */\n let segmentTags = [];\n\n /** @type {!Array<shaka.hls.Tag>} */\n let partialSegmentTags = [];\n\n // The last parsed EXT-X-MAP tag.\n /** @type {?shaka.hls.Tag} */\n let currentMapTag = null;\n\n for (const line of lines) {\n if (/^(#EXT)/.test(line)) {\n const tag = this.parseTag_(line);\n if (shaka.hls.ManifestTextParser.MEDIA_PLAYLIST_TAGS.includes(\n tag.name)) {\n playlistTags.push(tag);\n } else {\n // Mark the the EXT-X-MAP tag, and add it to the segment tags\n // following it later.\n if (tag.name == 'EXT-X-MAP') {\n currentMapTag = tag;\n } else if (tag.name == 'EXT-X-PART') {\n partialSegmentTags.push(tag);\n } else if (tag.name == 'EXT-X-PRELOAD-HINT') {\n if (tag.getAttributeValue('TYPE') == 'PART') {\n partialSegmentTags.push(tag);\n } else if (tag.getAttributeValue('TYPE') == 'MAP') {\n // Rename the Preload Hint tag to be a Map tag.\n tag.setName('EXT-X-MAP');\n currentMapTag = tag;\n }\n } else {\n segmentTags.push(tag);\n }\n }\n } else if (shaka.hls.Utils.isComment(line)) {\n // Skip comments.\n } else {\n const verbatimSegmentUri = line.trim();\n // Attach the last parsed EXT-X-MAP tag to the segment.\n if (currentMapTag) {\n segmentTags.push(currentMapTag);\n }\n // The URI appears after all of the tags describing the segment.\n const segment = new shaka.hls.Segment(\n verbatimSegmentUri, segmentTags, partialSegmentTags);\n segments.push(segment);\n segmentTags = [];\n partialSegmentTags = [];\n }\n }\n // After all the partial segments of a regular segment is published,\n // a EXTINF tag and Uri for a regular segment containing the same media\n // content will get published at last.\n // If no EXTINF tag follows the list of partial segment tags at the end,\n // create a segment to wrap the partial segment tags.\n if (partialSegmentTags.length) {\n if (currentMapTag) {\n segmentTags.push(currentMapTag);\n }\n const segment = new shaka.hls.Segment('', segmentTags,\n partialSegmentTags);\n segments.push(segment);\n }\n\n return segments;\n }\n\n /**\n * Parses a string into an HLS Tag object while tracking what id to use next.\n *\n * @param {string} word\n * @return {!shaka.hls.Tag}\n * @private\n */\n parseTag_(word) {\n return shaka.hls.ManifestTextParser.parseTag(this.globalId_++, word);\n }\n\n /**\n * Parses a string into an HLS Tag object.\n *\n * @param {number} id\n * @param {string} word\n * @return {!shaka.hls.Tag}\n */\n static parseTag(id, word) {\n /* HLS tags start with '#EXT'. A tag can have a set of attributes\n (#EXT-<tagname>:<attribute list>) and/or a value (#EXT-<tagname>:<value>).\n An attribute's format is 'AttributeName=AttributeValue'.\n The parsing logic goes like this:\n 1. Everything before ':' is a name (we ignore '#').\n 2. Everything after ':' is a list of comma-separated items,\n 2a. The first item might be a value, if it does not contain '='.\n 2b. Otherwise, items are attributes.\n 3. If there is no \":\", it's a simple tag with no attributes and no value.\n */\n const blocks = word.match(/^#(EXT[^:]*)(?::(.*))?$/);\n if (!blocks) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.INVALID_HLS_TAG,\n word);\n }\n const name = blocks[1];\n const data = blocks[2];\n const attributes = [];\n let value;\n\n if (data) {\n const parser = new shaka.util.TextParser(data);\n let blockAttrs;\n\n // Regex: any number of non-equals-sign characters at the beginning\n // terminated by comma or end of line\n const valueRegex = /^([^,=]+)(?:,|$)/g;\n\n const blockValue = parser.readRegex(valueRegex);\n\n if (blockValue) {\n value = blockValue[1];\n }\n\n // Regex:\n // 1. Key name ([1])\n // 2. Equals sign\n // 3. Either:\n // a. A quoted string (everything up to the next quote, [2])\n // b. An unquoted string\n // (everything up to the next comma or end of line, [3])\n // 4. Either:\n // a. A comma\n // b. End of line\n const attributeRegex = /([^=]+)=(?:\"([^\"]*)\"|([^\",]*))(?:,|$)/g;\n\n while ((blockAttrs = parser.readRegex(attributeRegex))) {\n const attrName = blockAttrs[1];\n const attrValue = blockAttrs[2] || blockAttrs[3];\n const attribute = new shaka.hls.Attribute(attrName, attrValue);\n attributes.push(attribute);\n parser.skipWhitespace();\n }\n }\n\n return new shaka.hls.Tag(id, name, attributes, value);\n }\n};\n\n\n/**\n * HLS tags that only appear on Media Playlists.\n * Used to determine a playlist type.\n *\n * @const {!Array<string>}\n */\nshaka.hls.ManifestTextParser.MEDIA_PLAYLIST_TAGS = [\n 'EXT-X-TARGETDURATION',\n 'EXT-X-MEDIA-SEQUENCE',\n 'EXT-X-DISCONTINUITY-SEQUENCE',\n 'EXT-X-PLAYLIST-TYPE',\n 'EXT-X-I-FRAMES-ONLY',\n 'EXT-X-ENDLIST',\n 'EXT-X-SERVER-CONTROL',\n 'EXT-X-SKIP',\n 'EXT-X-PART-INF',\n 'EXT-X-DATERANGE',\n];\n\n\n/**\n * HLS tags that only appear on Segments in a Media Playlists.\n * Used to determine the start of the segments info.\n *\n * @const {!Array<string>}\n */\nshaka.hls.ManifestTextParser.SEGMENT_TAGS = [\n 'EXTINF',\n 'EXT-X-BYTERANGE',\n 'EXT-X-DISCONTINUITY',\n 'EXT-X-PROGRAM-DATE-TIME',\n 'EXT-X-KEY',\n 'EXT-X-DATERANGE',\n 'EXT-X-MAP',\n 'EXT-X-GAP',\n 'EXT-X-TILES',\n];\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.net.DataUriPlugin');\n\ngoog.require('shaka.log');\ngoog.require('shaka.net.NetworkingEngine');\ngoog.require('shaka.util.AbortableOperation');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.StringUtils');\ngoog.require('shaka.util.Uint8ArrayUtils');\n\n\n/**\n * @summary A networking plugin to handle data URIs.\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/data_URIs\n * @export\n */\nshaka.net.DataUriPlugin = class {\n /**\n * @param {string} uri\n * @param {shaka.extern.Request} request\n * @param {shaka.net.NetworkingEngine.RequestType} requestType\n * @param {shaka.extern.ProgressUpdated} progressUpdated Called when a\n * progress event happened.\n * @return {!shaka.extern.IAbortableOperation.<shaka.extern.Response>}\n * @export\n */\n static parse(uri, request, requestType, progressUpdated) {\n try {\n const parsed = shaka.net.DataUriPlugin.parseRaw(uri);\n\n /** @type {shaka.extern.Response} */\n const response = {\n uri: uri,\n originalUri: uri,\n data: parsed.data,\n headers: {\n 'content-type': parsed.contentType,\n },\n originalRequest: request,\n };\n\n return shaka.util.AbortableOperation.completed(response);\n } catch (error) {\n return shaka.util.AbortableOperation.failed(error);\n }\n }\n\n /**\n * @param {string} uri\n * @return {{data: BufferSource, contentType: string}}\n */\n static parseRaw(uri) {\n // Extract the scheme.\n const parts = uri.split(':');\n if (parts.length < 2 || parts[0] != 'data') {\n shaka.log.error('Bad data URI, failed to parse scheme');\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.NETWORK,\n shaka.util.Error.Code.MALFORMED_DATA_URI,\n uri);\n }\n const path = parts.slice(1).join(':');\n\n // Extract the encoding and MIME type (required but can be empty).\n const infoAndData = path.split(',');\n if (infoAndData.length < 2) {\n shaka.log.error('Bad data URI, failed to extract encoding and MIME type');\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.NETWORK,\n shaka.util.Error.Code.MALFORMED_DATA_URI,\n uri);\n }\n const info = infoAndData[0];\n const dataStr = window.decodeURIComponent(infoAndData.slice(1).join(','));\n\n // The MIME type is always the first thing in the semicolon-separated list\n // of type parameters. It may be blank.\n const typeInfoList = info.split(';');\n const contentType = typeInfoList[0];\n\n // Check for base64 encoding, which is always the last in the\n // semicolon-separated list if present.\n let base64Encoded = false;\n if (typeInfoList.length > 1 &&\n typeInfoList[typeInfoList.length - 1] == 'base64') {\n base64Encoded = true;\n typeInfoList.pop();\n }\n\n // Convert the data.\n /** @type {BufferSource} */\n let data;\n if (base64Encoded) {\n data = shaka.util.Uint8ArrayUtils.fromBase64(dataStr);\n } else {\n data = shaka.util.StringUtils.toUTF8(dataStr);\n }\n\n return {data: data, contentType};\n }\n};\n\n\nshaka.net.NetworkingEngine.registerScheme(\n 'data', shaka.net.DataUriPlugin.parse);\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\ngoog.provide('shaka.hls.HlsParser');\n\ngoog.require('goog.Uri');\ngoog.require('goog.asserts');\ngoog.require('shaka.abr.Ewma');\ngoog.require('shaka.drm.DrmUtils');\ngoog.require('shaka.drm.PlayReady');\ngoog.require('shaka.hls.Attribute');\ngoog.require('shaka.hls.ManifestTextParser');\ngoog.require('shaka.hls.Playlist');\ngoog.require('shaka.hls.PlaylistType');\ngoog.require('shaka.hls.Tag');\ngoog.require('shaka.hls.Utils');\ngoog.require('shaka.log');\ngoog.require('shaka.media.InitSegmentReference');\ngoog.require('shaka.media.ManifestParser');\ngoog.require('shaka.media.PresentationTimeline');\ngoog.require('shaka.media.QualityObserver');\ngoog.require('shaka.media.SegmentIndex');\ngoog.require('shaka.media.SegmentReference');\ngoog.require('shaka.media.SegmentUtils');\ngoog.require('shaka.net.DataUriPlugin');\ngoog.require('shaka.net.NetworkingEngine');\ngoog.require('shaka.net.NetworkingEngine.PendingRequest');\ngoog.require('shaka.util.ArrayUtils');\ngoog.require('shaka.util.BufferUtils');\ngoog.require('shaka.util.ContentSteeringManager');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.EventManager');\ngoog.require('shaka.util.FakeEvent');\ngoog.require('shaka.util.LanguageUtils');\ngoog.require('shaka.util.ManifestParserUtils');\ngoog.require('shaka.util.MimeUtils');\ngoog.require('shaka.util.Networking');\ngoog.require('shaka.util.OperationManager');\ngoog.require('shaka.util.Pssh');\ngoog.require('shaka.util.Timer');\ngoog.require('shaka.util.TsParser');\ngoog.require('shaka.util.TXml');\ngoog.require('shaka.util.StreamUtils');\ngoog.require('shaka.util.Uint8ArrayUtils');\ngoog.requireType('shaka.hls.Segment');\n\n\n/**\n * HLS parser.\n *\n * @implements {shaka.extern.ManifestParser}\n * @export\n */\nshaka.hls.HlsParser = class {\n /**\n * Creates an Hls Parser object.\n */\n constructor() {\n /** @private {?shaka.extern.ManifestParser.PlayerInterface} */\n this.playerInterface_ = null;\n\n /** @private {?shaka.extern.ManifestConfiguration} */\n this.config_ = null;\n\n /** @private {number} */\n this.globalId_ = 1;\n\n /** @private {!Map<string, string>} */\n this.globalVariables_ = new Map();\n\n /**\n * A map from group id to stream infos created from the media tags.\n * @private {!Map<string, !Array<?shaka.hls.HlsParser.StreamInfo>>}\n */\n this.groupIdToStreamInfosMap_ = new Map();\n\n /**\n * For media playlist lazy-loading to work in livestreams, we have to assume\n * that each stream of a type (video, audio, etc) has the same mappings of\n * sequence number to start time.\n * This map stores those relationships.\n * Only used during livestreams; we do not assume that VOD content is\n * aligned in that way.\n * @private {!Map<string, !Map<number, number>>}\n */\n this.mediaSequenceToStartTimeByType_ = new Map();\n\n // Set initial maps.\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n this.mediaSequenceToStartTimeByType_.set(ContentType.VIDEO, new Map());\n this.mediaSequenceToStartTimeByType_.set(ContentType.AUDIO, new Map());\n this.mediaSequenceToStartTimeByType_.set(ContentType.TEXT, new Map());\n this.mediaSequenceToStartTimeByType_.set(ContentType.IMAGE, new Map());\n\n /**\n * The values are strings of the form \"<VIDEO URI> - <AUDIO URI>\",\n * where the URIs are the verbatim media playlist URIs as they appeared in\n * the master playlist.\n *\n * Used to avoid duplicates that vary only in their text stream.\n *\n * @private {!Set<string>}\n */\n this.variantUriSet_ = new Set();\n\n /**\n * A map from (verbatim) media playlist URI to stream infos representing the\n * playlists.\n *\n * On update, used to iterate through and update from media playlists.\n *\n * On initial parse, used to iterate through and determine minimum\n * timestamps, offsets, and to handle TS rollover.\n *\n * During parsing, used to avoid duplicates in the async methods\n * createStreamInfoFromMediaTags_, createStreamInfoFromImageTag_ and\n * createStreamInfoFromVariantTags_.\n *\n * @private {!Map<string, shaka.hls.HlsParser.StreamInfo>}\n */\n this.uriToStreamInfosMap_ = new Map();\n\n /** @private {?shaka.media.PresentationTimeline} */\n this.presentationTimeline_ = null;\n\n /**\n * The master playlist URI, after redirects.\n *\n * @private {string}\n */\n this.masterPlaylistUri_ = '';\n\n /** @private {shaka.hls.ManifestTextParser} */\n this.manifestTextParser_ = new shaka.hls.ManifestTextParser();\n\n /**\n * The minimum sequence number for generated segments, when ignoring\n * EXT-X-PROGRAM-DATE-TIME.\n *\n * @private {number}\n */\n this.minSequenceNumber_ = -1;\n\n /**\n * The lowest time value for any of the streams, as defined by the\n * EXT-X-PROGRAM-DATE-TIME value. Measured in seconds since January 1, 1970.\n *\n * @private {number}\n */\n this.lowestSyncTime_ = Infinity;\n\n /**\n * Flag to indicate if any of the media playlists use\n * EXT-X-PROGRAM-DATE-TIME.\n *\n * @private {boolean}\n */\n this.usesProgramDateTime_ = false;\n\n /**\n * Whether the streams have previously been \"finalized\"; that is to say,\n * whether we have loaded enough streams to know information about the asset\n * such as timing information, live status, etc.\n *\n * @private {boolean}\n */\n this.streamsFinalized_ = false;\n\n /**\n * Whether the manifest informs about the codec to use.\n *\n * @private\n */\n this.codecInfoInManifest_ = false;\n\n /**\n * This timer is used to trigger the start of a manifest update. A manifest\n * update is async. Once the update is finished, the timer will be restarted\n * to trigger the next update. The timer will only be started if the content\n * is live content.\n *\n * @private {shaka.util.Timer}\n */\n this.updatePlaylistTimer_ = new shaka.util.Timer(() => {\n if (this.mediaElement_ && !this.config_.continueLoadingWhenPaused) {\n this.eventManager_.unlisten(this.mediaElement_, 'timeupdate');\n if (this.mediaElement_.paused) {\n this.eventManager_.listenOnce(\n this.mediaElement_, 'timeupdate', () => this.onUpdate_());\n return;\n }\n }\n this.onUpdate_();\n });\n\n /** @private {shaka.hls.HlsParser.PresentationType_} */\n this.presentationType_ = shaka.hls.HlsParser.PresentationType_.VOD;\n\n /** @private {?shaka.extern.Manifest} */\n this.manifest_ = null;\n\n /** @private {number} */\n this.maxTargetDuration_ = 0;\n\n /** @private {number} */\n this.lastTargetDuration_ = Infinity;\n\n /**\n * Partial segments target duration.\n * @private {number}\n */\n this.partialTargetDuration_ = 0;\n\n /** @private {number} */\n this.presentationDelay_ = 0;\n\n /** @private {number} */\n this.lowLatencyPresentationDelay_ = 0;\n\n /** @private {shaka.util.OperationManager} */\n this.operationManager_ = new shaka.util.OperationManager();\n\n /**\n * A map from closed captions' group id, to a map of closed captions info.\n * {group id -> {closed captions channel id -> language}}\n * @private {Map<string, Map<string, string>>}\n */\n this.groupIdToClosedCaptionsMap_ = new Map();\n\n /** @private {Map<string, string>} */\n this.groupIdToCodecsMap_ = new Map();\n\n /**\n * A cache mapping EXT-X-MAP tag info to the InitSegmentReference created\n * from the tag.\n * The key is a string combining the EXT-X-MAP tag's absolute uri, and\n * its BYTERANGE if available.\n * @private {!Map<string, !shaka.media.InitSegmentReference>}\n */\n this.mapTagToInitSegmentRefMap_ = new Map();\n\n /** @private {Map<string, !shaka.extern.aesKey>} */\n this.aesKeyInfoMap_ = new Map();\n\n /** @private {Map<string, !Promise<shaka.extern.Response>>} */\n this.aesKeyMap_ = new Map();\n\n /** @private {Map<string, !Promise<shaka.extern.Response>>} */\n this.identityKeyMap_ = new Map();\n\n /** @private {Map<!shaka.media.InitSegmentReference, ?string>} */\n this.identityKidMap_ = new Map();\n\n /** @private {boolean} */\n this.lowLatencyMode_ = false;\n\n /** @private {boolean} */\n this.lowLatencyByterangeOptimization_ = false;\n\n /**\n * An ewma that tracks how long updates take.\n * This is to mitigate issues caused by slow parsing on embedded devices.\n * @private {!shaka.abr.Ewma}\n */\n this.averageUpdateDuration_ = new shaka.abr.Ewma(5);\n\n /** @private {?shaka.util.ContentSteeringManager} */\n this.contentSteeringManager_ = null;\n\n /** @private {boolean} */\n this.needsClosedCaptionsDetection_ = true;\n\n /** @private {Set<string>} */\n this.dateRangeIdsEmitted_ = new Set();\n\n /** @private {shaka.util.EventManager} */\n this.eventManager_ = new shaka.util.EventManager();\n\n /** @private {HTMLMediaElement} */\n this.mediaElement_ = null;\n\n /** @private {?number} */\n this.startTime_ = null;\n\n /** @private {function():boolean} */\n this.isPreloadFn_ = () => false;\n }\n\n\n /**\n * @param {shaka.extern.ManifestConfiguration} config\n * @param {(function():boolean)=} isPreloadFn\n * @override\n * @exportInterface\n */\n configure(config, isPreloadFn) {\n const needFireUpdate = this.playerInterface_ &&\n config.updatePeriod != this.config_.updatePeriod &&\n config.updatePeriod >= 0;\n this.config_ = config;\n if (isPreloadFn) {\n this.isPreloadFn_ = isPreloadFn;\n }\n\n if (this.contentSteeringManager_) {\n this.contentSteeringManager_.configure(this.config_);\n }\n\n if (needFireUpdate && this.manifest_ &&\n this.manifest_.presentationTimeline.isLive()) {\n this.updatePlaylistTimer_.tickNow();\n }\n }\n\n /**\n * @override\n * @exportInterface\n */\n async start(uri, playerInterface) {\n goog.asserts.assert(this.config_, 'Must call configure() before start()!');\n this.playerInterface_ = playerInterface;\n this.lowLatencyMode_ = playerInterface.isLowLatencyMode();\n\n const response = await this.requestManifest_([uri]).promise;\n\n // Record the master playlist URI after redirects.\n this.masterPlaylistUri_ = response.uri;\n\n goog.asserts.assert(response.data, 'Response data should be non-null!');\n await this.parseManifest_(response.data, uri);\n\n goog.asserts.assert(this.manifest_, 'Manifest should be non-null');\n return this.manifest_;\n }\n\n /**\n * @override\n * @exportInterface\n */\n stop() {\n // Make sure we don't update the manifest again. Even if the timer is not\n // running, this is safe to call.\n if (this.updatePlaylistTimer_) {\n this.updatePlaylistTimer_.stop();\n this.updatePlaylistTimer_ = null;\n }\n\n /** @type {!Array<!Promise>} */\n const pending = [];\n\n if (this.operationManager_) {\n pending.push(this.operationManager_.destroy());\n this.operationManager_ = null;\n }\n\n this.playerInterface_ = null;\n this.config_ = null;\n this.variantUriSet_.clear();\n this.manifest_ = null;\n this.uriToStreamInfosMap_.clear();\n this.groupIdToStreamInfosMap_.clear();\n this.groupIdToCodecsMap_.clear();\n this.globalVariables_.clear();\n this.mapTagToInitSegmentRefMap_.clear();\n this.aesKeyInfoMap_.clear();\n this.aesKeyMap_.clear();\n this.identityKeyMap_.clear();\n this.identityKidMap_.clear();\n this.dateRangeIdsEmitted_.clear();\n\n if (this.contentSteeringManager_) {\n this.contentSteeringManager_.destroy();\n }\n\n if (this.eventManager_) {\n this.eventManager_.release();\n this.eventManager_ = null;\n }\n\n return Promise.all(pending);\n }\n\n /**\n * @override\n * @exportInterface\n */\n async update() {\n if (!this.isLive_()) {\n return;\n }\n\n /** @type {!Array<!Promise>} */\n const updates = [];\n const streamInfos = Array.from(this.uriToStreamInfosMap_.values());\n\n // This is necessary to calculate correctly the update time.\n this.lastTargetDuration_ = Infinity;\n this.manifest_.gapCount = 0;\n\n // Only update active streams.\n const activeStreamInfos = streamInfos.filter((s) => s.stream.segmentIndex);\n for (const streamInfo of activeStreamInfos) {\n updates.push(this.updateStream_(streamInfo));\n }\n await Promise.all(updates);\n\n // Now that streams have been updated, notify the presentation timeline.\n this.notifySegmentsForStreams_(activeStreamInfos.map((s) => s.stream));\n\n // If any hasEndList is false, the stream is still live.\n const stillLive = activeStreamInfos.some((s) => s.hasEndList == false);\n if (activeStreamInfos.length && !stillLive) {\n // Convert the presentation to VOD and set the duration.\n const PresentationType = shaka.hls.HlsParser.PresentationType_;\n this.setPresentationType_(PresentationType.VOD);\n\n // The duration is the minimum of the end times of all active streams.\n // Non-active streams are not guaranteed to have useful maxTimestamp\n // values, due to the lazy-loading system, so they are ignored.\n const maxTimestamps = activeStreamInfos.map((s) => s.maxTimestamp);\n // The duration is the minimum of the end times of all streams.\n this.presentationTimeline_.setDuration(Math.min(...maxTimestamps));\n this.playerInterface_.updateDuration();\n }\n if (stillLive) {\n this.determineDuration_();\n }\n // Check if any playlist does not have the first reference (due to a\n // problem in the live encoder for example), and disable the stream if\n // necessary.\n for (const streamInfo of activeStreamInfos) {\n if (!streamInfo.stream.isAudioMuxedInVideo &&\n streamInfo.stream.segmentIndex &&\n !streamInfo.stream.segmentIndex.earliestReference()) {\n this.playerInterface_.disableStream(streamInfo.stream);\n }\n }\n }\n\n /**\n * @param {!shaka.hls.HlsParser.StreamInfo} streamInfo\n * @return {!Map<number, number>}\n * @private\n */\n getMediaSequenceToStartTimeFor_(streamInfo) {\n if (this.isLive_()) {\n return this.mediaSequenceToStartTimeByType_.get(streamInfo.type);\n } else {\n return streamInfo.mediaSequenceToStartTime;\n }\n }\n\n /**\n * Updates a stream.\n *\n * @param {!shaka.hls.HlsParser.StreamInfo} streamInfo\n * @return {!Promise}\n * @private\n */\n async updateStream_(streamInfo) {\n if (streamInfo.stream.isAudioMuxedInVideo) {\n return;\n }\n const manifestUris = [];\n for (const uri of streamInfo.getUris()) {\n const uriObj = new goog.Uri(uri);\n const queryData = uriObj.getQueryData();\n if (streamInfo.canBlockReload) {\n if (streamInfo.nextMediaSequence >= 0) {\n // Indicates that the server must hold the request until a Playlist\n // contains a Media Segment with Media Sequence\n queryData.add('_HLS_msn', String(streamInfo.nextMediaSequence));\n }\n if (streamInfo.nextPart >= 0) {\n // Indicates, in combination with _HLS_msn, that the server must hold\n // the request until a Playlist contains Partial Segment N of Media\n // Sequence Number M or later.\n queryData.add('_HLS_part', String(streamInfo.nextPart));\n }\n }\n if (streamInfo.canSkipSegments) {\n // Enable delta updates. This will replace older segments with\n // 'EXT-X-SKIP' tag in the media playlist.\n queryData.add('_HLS_skip', 'YES');\n }\n if (queryData.getCount()) {\n uriObj.setQueryData(queryData);\n }\n manifestUris.push(uriObj.toString());\n }\n let response;\n try {\n response = await this.requestManifest_(\n manifestUris, /* isPlaylist= */ true).promise;\n } catch (e) {\n if (this.playerInterface_) {\n this.playerInterface_.disableStream(streamInfo.stream);\n }\n throw e;\n }\n if (!streamInfo.stream.segmentIndex) {\n // The stream was closed since the update was first requested.\n return;\n }\n\n /** @type {shaka.hls.Playlist} */\n const playlist = this.manifestTextParser_.parsePlaylist(response.data);\n\n if (playlist.type != shaka.hls.PlaylistType.MEDIA) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.HLS_INVALID_PLAYLIST_HIERARCHY);\n }\n\n // Record the final URI after redirects.\n const responseUri = response.uri;\n if (responseUri != response.originalUri &&\n !streamInfo.getUris().includes(responseUri)) {\n streamInfo.redirectUris.push(responseUri);\n }\n\n /** @type {!Array<!shaka.hls.Tag>} */\n const variablesTags = shaka.hls.Utils.filterTagsByName(playlist.tags,\n 'EXT-X-DEFINE');\n\n const mediaVariables = this.parseMediaVariables_(\n variablesTags, responseUri);\n\n const stream = streamInfo.stream;\n\n const mediaSequenceToStartTime =\n this.getMediaSequenceToStartTimeFor_(streamInfo);\n const {keyIds, drmInfos, encrypted, aesEncrypted} =\n await this.parseDrmInfo_(playlist, stream.mimeType,\n streamInfo.getUris, mediaVariables);\n\n if (!stream.encrypted && encrypted && !aesEncrypted) {\n stream.encrypted = true;\n }\n\n const keysAreEqual =\n (a, b) => a.size === b.size && [...a].every((value) => b.has(value));\n\n if (!keysAreEqual(stream.keyIds, keyIds)) {\n stream.keyIds = keyIds;\n stream.drmInfos = drmInfos;\n this.playerInterface_.newDrmInfo(stream);\n }\n\n const {segments, bandwidth} = this.createSegments_(\n playlist, mediaSequenceToStartTime, mediaVariables,\n streamInfo.getUris, streamInfo.type);\n if (bandwidth) {\n stream.bandwidth = bandwidth;\n }\n\n const qualityInfo =\n shaka.media.QualityObserver.createQualityInfo(stream);\n for (const segment of segments) {\n if (segment.initSegmentReference) {\n segment.initSegmentReference.mediaQuality = qualityInfo;\n }\n }\n\n stream.segmentIndex.mergeAndEvict(\n segments, this.presentationTimeline_.getSegmentAvailabilityStart());\n if (segments.length) {\n const mediaSequenceNumber = shaka.hls.Utils.getFirstTagWithNameAsNumber(\n playlist.tags, 'EXT-X-MEDIA-SEQUENCE', 0);\n const skipTag = shaka.hls.Utils.getFirstTagWithName(\n playlist.tags, 'EXT-X-SKIP');\n const skippedSegments =\n skipTag ? Number(skipTag.getAttributeValue('SKIPPED-SEGMENTS')) : 0;\n const {nextMediaSequence, nextPart} =\n this.getNextMediaSequenceAndPart_(mediaSequenceNumber, segments);\n streamInfo.nextMediaSequence = nextMediaSequence + skippedSegments;\n streamInfo.nextPart = nextPart;\n const playlistStartTime = mediaSequenceToStartTime.get(\n mediaSequenceNumber);\n stream.segmentIndex.evict(playlistStartTime);\n }\n const oldSegment = stream.segmentIndex.earliestReference();\n if (oldSegment) {\n streamInfo.minTimestamp = oldSegment.startTime;\n\n const newestSegment = segments[segments.length - 1];\n goog.asserts.assert(newestSegment, 'Should have segments!');\n\n streamInfo.maxTimestamp = newestSegment.endTime;\n }\n\n // Once the last segment has been added to the playlist,\n // #EXT-X-ENDLIST tag will be appended.\n // If that happened, treat the rest of the EVENT presentation as VOD.\n const endListTag =\n shaka.hls.Utils.getFirstTagWithName(playlist.tags, 'EXT-X-ENDLIST');\n\n if (endListTag) {\n // Flag this for later. We don't convert the whole presentation into VOD\n // until we've seen the ENDLIST tag for all active playlists.\n streamInfo.hasEndList = true;\n }\n\n this.determineLastTargetDuration_(playlist);\n\n this.processDateRangeTags_(\n playlist.tags, stream.type, mediaVariables, streamInfo.getUris);\n }\n\n\n /**\n * @override\n * @exportInterface\n */\n onExpirationUpdated(sessionId, expiration) {\n // No-op\n }\n\n /**\n * @override\n * @exportInterface\n */\n onInitialVariantChosen(variant) {\n // No-op\n }\n\n /**\n * @override\n * @exportInterface\n */\n banLocation(uri) {\n if (this.contentSteeringManager_) {\n this.contentSteeringManager_.banLocation(uri);\n }\n }\n\n /**\n * @override\n * @exportInterface\n */\n setMediaElement(mediaElement) {\n this.mediaElement_ = mediaElement;\n }\n\n /**\n * Align the streams by sequence number by dropping early segments. Then\n * offset the streams to begin at presentation time 0.\n * @param {!Array<!shaka.hls.HlsParser.StreamInfo>} streamInfos\n * @param {boolean=} force\n * @private\n */\n syncStreamsWithSequenceNumber_(streamInfos, force = false) {\n // We assume that, when this is first called, we have enough info to\n // determine how to use the program date times (e.g. we have both a video\n // and an audio, and all other videos and audios match those).\n // Thus, we only need to calculate this once.\n const updateMinSequenceNumber = this.minSequenceNumber_ == -1;\n // Sync using media sequence number. Find the highest starting sequence\n // number among all streams. Later, we will drop any references to\n // earlier segments in other streams, then offset everything back to 0.\n for (const streamInfo of streamInfos) {\n const segmentIndex = streamInfo.stream.segmentIndex;\n goog.asserts.assert(segmentIndex,\n 'Only loaded streams should be synced');\n const mediaSequenceToStartTime =\n this.getMediaSequenceToStartTimeFor_(streamInfo);\n const segment0 = segmentIndex.earliestReference();\n if (segment0) {\n // This looks inefficient, but iteration order is insertion order.\n // So the very first entry should be the one we want.\n // We assert that this holds true so that we are alerted by debug\n // builds and tests if it changes. We still do a loop, though, so\n // that the code functions correctly in production no matter what.\n if (goog.DEBUG) {\n const firstSequenceStartTime =\n mediaSequenceToStartTime.values().next().value;\n if (firstSequenceStartTime != segment0.startTime) {\n shaka.log.warning(\n 'Sequence number map is not ordered as expected!');\n }\n }\n for (const [sequence, start] of mediaSequenceToStartTime) {\n if (start == segment0.startTime) {\n if (updateMinSequenceNumber) {\n this.minSequenceNumber_ = Math.max(\n this.minSequenceNumber_, sequence);\n }\n // Even if we already have decided on a value for\n // |this.minSequenceNumber_|, we still need to determine the first\n // sequence number for the stream, to offset it in the code below.\n streamInfo.firstSequenceNumber = sequence;\n break;\n }\n }\n }\n }\n\n if (this.minSequenceNumber_ < 0) {\n // Nothing to sync.\n return;\n }\n\n shaka.log.debug('Syncing HLS streams against base sequence number:',\n this.minSequenceNumber_);\n\n for (const streamInfo of streamInfos) {\n if (!this.ignoreManifestProgramDateTimeFor_(streamInfo.type) && !force) {\n continue;\n }\n const segmentIndex = streamInfo.stream.segmentIndex;\n if (segmentIndex) {\n // Drop any earlier references.\n const numSegmentsToDrop =\n this.minSequenceNumber_ - streamInfo.firstSequenceNumber;\n if (numSegmentsToDrop > 0) {\n segmentIndex.dropFirstReferences(numSegmentsToDrop);\n\n // Now adjust timestamps back to begin at 0.\n const segmentN = segmentIndex.earliestReference();\n if (segmentN) {\n const streamOffset = -segmentN.startTime;\n // Modify all SegmentReferences equally.\n streamInfo.stream.segmentIndex.offset(streamOffset);\n // Update other parts of streamInfo the same way.\n this.offsetStreamInfo_(streamInfo, streamOffset);\n }\n }\n }\n }\n }\n\n /**\n * Synchronize streams by the EXT-X-PROGRAM-DATE-TIME tags attached to their\n * segments. Also normalizes segment times so that the earliest segment in\n * any stream is at time 0.\n * @param {!Array<!shaka.hls.HlsParser.StreamInfo>} streamInfos\n * @private\n */\n syncStreamsWithProgramDateTime_(streamInfos) {\n // We assume that, when this is first called, we have enough info to\n // determine how to use the program date times (e.g. we have both a video\n // and an audio, and all other videos and audios match those).\n // Thus, we only need to calculate this once.\n if (this.lowestSyncTime_ == Infinity) {\n for (const streamInfo of streamInfos) {\n const segmentIndex = streamInfo.stream.segmentIndex;\n goog.asserts.assert(segmentIndex,\n 'Only loaded streams should be synced');\n const segment0 = segmentIndex.earliestReference();\n if (segment0 != null && segment0.syncTime != null) {\n this.lowestSyncTime_ =\n Math.min(this.lowestSyncTime_, segment0.syncTime);\n }\n }\n }\n\n const lowestSyncTime = this.lowestSyncTime_;\n if (lowestSyncTime == Infinity) {\n // Nothing to sync.\n return;\n }\n\n shaka.log.debug('Syncing HLS streams against base time:', lowestSyncTime);\n\n for (const streamInfo of this.uriToStreamInfosMap_.values()) {\n if (this.ignoreManifestProgramDateTimeFor_(streamInfo.type)) {\n continue;\n }\n const segmentIndex = streamInfo.stream.segmentIndex;\n if (segmentIndex != null) {\n // A segment's startTime should be based on its syncTime vs the lowest\n // syncTime across all streams. The earliest segment sync time from\n // any stream will become presentation time 0. If two streams start\n // e.g. 6 seconds apart in syncTime, then their first segments will\n // also start 6 seconds apart in presentation time.\n\n const segment0 = segmentIndex.earliestReference();\n if (!segment0) {\n continue;\n }\n if (segment0.syncTime == null) {\n shaka.log.alwaysError('Missing EXT-X-PROGRAM-DATE-TIME for stream',\n streamInfo.getUris(),\n 'Expect AV sync issues!');\n } else {\n // Stream metadata are offset by a fixed amount based on the\n // first segment.\n const segment0TargetTime = segment0.syncTime - lowestSyncTime;\n const streamOffset = segment0TargetTime - segment0.startTime;\n this.offsetStreamInfo_(streamInfo, streamOffset);\n\n // This is computed across all segments separately to manage\n // accumulated drift in durations.\n for (const segment of segmentIndex) {\n segment.syncAgainst(lowestSyncTime);\n }\n }\n }\n }\n }\n\n /**\n * @param {!shaka.hls.HlsParser.StreamInfo} streamInfo\n * @param {number} offset\n * @private\n */\n offsetStreamInfo_(streamInfo, offset) {\n // Due to float compute issue we can have some millisecond issue.\n // We don't apply the offset if it's the case.\n if (Math.abs(offset) < 0.001) {\n return;\n }\n // Adjust our accounting of the minimum timestamp.\n streamInfo.minTimestamp += offset;\n\n // Adjust our accounting of the maximum timestamp.\n streamInfo.maxTimestamp += offset;\n goog.asserts.assert(streamInfo.maxTimestamp >= 0,\n 'Negative maxTimestamp after adjustment!');\n\n // Update our map from sequence number to start time.\n const mediaSequenceToStartTime =\n this.getMediaSequenceToStartTimeFor_(streamInfo);\n for (const [key, value] of mediaSequenceToStartTime) {\n mediaSequenceToStartTime.set(key, value + offset);\n }\n\n shaka.log.debug('Offset', offset, 'applied to',\n streamInfo.getUris());\n }\n\n /**\n * Parses the manifest.\n *\n * @param {BufferSource} data\n * @param {string} uri\n * @return {!Promise}\n * @private\n */\n async parseManifest_(data, uri) {\n const Utils = shaka.hls.Utils;\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n\n goog.asserts.assert(this.masterPlaylistUri_,\n 'Master playlist URI must be set before calling parseManifest_!');\n\n const playlist = this.manifestTextParser_.parsePlaylist(data);\n\n /** @type {!Array<!shaka.hls.Tag>} */\n const variablesTags = Utils.filterTagsByName(playlist.tags, 'EXT-X-DEFINE');\n\n /** @type {!Array<!shaka.extern.Variant>} */\n let variants = [];\n /** @type {!Array<!shaka.extern.Stream>} */\n let textStreams = [];\n /** @type {!Array<!shaka.extern.Stream>} */\n let imageStreams = [];\n\n // This assert is our own sanity check.\n goog.asserts.assert(this.presentationTimeline_ == null,\n 'Presentation timeline created early!');\n // We don't know if the presentation is VOD or live until we parse at least\n // one media playlist, so make a VOD-style presentation timeline for now\n // and change the type later if we discover this is live.\n // Since the player will load the first variant chosen early in the process,\n // there isn't a window during playback where the live-ness is unknown.\n this.presentationTimeline_ = new shaka.media.PresentationTimeline(\n /* presentationStartTime= */ null, /* delay= */ 0);\n this.presentationTimeline_.setStatic(true);\n\n const getUris = () => {\n return [uri];\n };\n\n /** @type {?string} */\n let mediaPlaylistType = null;\n\n /** @type {!Map<string, string>} */\n let mediaVariables = new Map();\n\n // Parsing a media playlist results in a single-variant stream.\n if (playlist.type == shaka.hls.PlaylistType.MEDIA) {\n this.needsClosedCaptionsDetection_ = false;\n\n /** @type {!Array<!shaka.hls.Tag>} */\n const variablesTags = shaka.hls.Utils.filterTagsByName(playlist.tags,\n 'EXT-X-DEFINE');\n\n mediaVariables = this.parseMediaVariables_(\n variablesTags, this.masterPlaylistUri_);\n\n // By default we assume it is video, but in a later step the correct type\n // is obtained.\n mediaPlaylistType = ContentType.VIDEO;\n\n // These values can be obtained later so these default values are good.\n const codecs = '';\n const languageValue = '';\n const channelsCount = null;\n const sampleRate = null;\n const closedCaptions = new Map();\n const spatialAudio = false;\n const characteristics = null;\n const forced = false; // Only relevant for text.\n const primary = true; // This is the only stream!\n const name = 'Media Playlist';\n\n // Make the stream info, with those values.\n const streamInfo = await this.convertParsedPlaylistIntoStreamInfo_(\n this.globalId_++, mediaVariables, playlist, getUris, uri, codecs,\n mediaPlaylistType, languageValue, primary, name, channelsCount,\n closedCaptions, characteristics, forced, sampleRate, spatialAudio);\n this.uriToStreamInfosMap_.set(uri, streamInfo);\n\n\n if (streamInfo.stream) {\n const qualityInfo =\n shaka.media.QualityObserver.createQualityInfo(streamInfo.stream);\n streamInfo.stream.segmentIndex.forEachTopLevelReference(\n (reference) => {\n if (reference.initSegmentReference) {\n reference.initSegmentReference.mediaQuality = qualityInfo;\n }\n });\n }\n\n mediaPlaylistType = streamInfo.stream.type;\n\n // Wrap the stream from that stream info with a variant.\n variants.push({\n id: 0,\n language: this.getLanguage_(languageValue),\n disabledUntilTime: 0,\n primary: true,\n audio: mediaPlaylistType == 'audio' ? streamInfo.stream : null,\n video: mediaPlaylistType == 'video' ? streamInfo.stream : null,\n bandwidth: streamInfo.stream.bandwidth || 0,\n allowedByApplication: true,\n allowedByKeySystem: true,\n decodingInfos: [],\n });\n } else {\n this.parseMasterVariables_(variablesTags);\n\n /** @type {!Array<!shaka.hls.Tag>} */\n const mediaTags = Utils.filterTagsByName(\n playlist.tags, 'EXT-X-MEDIA');\n /** @type {!Array<!shaka.hls.Tag>} */\n const variantTags = Utils.filterTagsByName(\n playlist.tags, 'EXT-X-STREAM-INF');\n /** @type {!Array<!shaka.hls.Tag>} */\n const imageTags = Utils.filterTagsByName(\n playlist.tags, 'EXT-X-IMAGE-STREAM-INF');\n /** @type {!Array<!shaka.hls.Tag>} */\n const iFrameTags = Utils.filterTagsByName(\n playlist.tags, 'EXT-X-I-FRAME-STREAM-INF');\n /** @type {!Array<!shaka.hls.Tag>} */\n const sessionKeyTags = Utils.filterTagsByName(\n playlist.tags, 'EXT-X-SESSION-KEY');\n /** @type {!Array<!shaka.hls.Tag>} */\n const sessionDataTags = Utils.filterTagsByName(\n playlist.tags, 'EXT-X-SESSION-DATA');\n /** @type {!Array<!shaka.hls.Tag>} */\n const contentSteeringTags = Utils.filterTagsByName(\n playlist.tags, 'EXT-X-CONTENT-STEERING');\n\n this.processSessionData_(sessionDataTags);\n await this.processContentSteering_(contentSteeringTags);\n\n if (!this.config_.ignoreSupplementalCodecs) {\n // Duplicate variant tags with supplementalCodecs\n const newVariantTags = [];\n for (const tag of variantTags) {\n const supplementalCodecsString =\n tag.getAttributeValue('SUPPLEMENTAL-CODECS');\n if (!supplementalCodecsString) {\n continue;\n }\n const supplementalCodecs = supplementalCodecsString.split(/\\s*,\\s*/)\n .map((codec) => {\n return codec.split('/')[0];\n });\n const newAttributes = tag.attributes.map((attr) => {\n const name = attr.name;\n let value = attr.value;\n if (name == 'CODECS') {\n value = supplementalCodecs.join(',');\n const allCodecs = attr.value.split(',');\n if (allCodecs.length > 1) {\n const audioCodec =\n shaka.util.ManifestParserUtils.guessCodecsSafe(\n shaka.util.ManifestParserUtils.ContentType.AUDIO,\n allCodecs);\n if (audioCodec) {\n value += ',' + audioCodec;\n }\n }\n }\n return new shaka.hls.Attribute(name, value);\n });\n newVariantTags.push(\n new shaka.hls.Tag(tag.id, tag.name, newAttributes, null));\n }\n variantTags.push(...newVariantTags);\n\n // Duplicate iFrame tags with supplementalCodecs\n const newIFrameTags = [];\n for (const tag of iFrameTags) {\n const supplementalCodecsString =\n tag.getAttributeValue('SUPPLEMENTAL-CODECS');\n if (!supplementalCodecsString) {\n continue;\n }\n const supplementalCodecs = supplementalCodecsString.split(/\\s*,\\s*/)\n .map((codec) => {\n return codec.split('/')[0];\n });\n const newAttributes = tag.attributes.map((attr) => {\n const name = attr.name;\n let value = attr.value;\n if (name == 'CODECS') {\n value = supplementalCodecs.join(',');\n }\n return new shaka.hls.Attribute(name, value);\n });\n newIFrameTags.push(\n new shaka.hls.Tag(tag.id, tag.name, newAttributes, null));\n }\n iFrameTags.push(...newIFrameTags);\n }\n\n this.parseCodecs_(variantTags);\n\n this.parseClosedCaptions_(mediaTags);\n const iFrameStreams = this.parseIFrames_(iFrameTags);\n variants = await this.createVariantsForTags_(\n variantTags, sessionKeyTags, mediaTags, getUris,\n this.globalVariables_, iFrameStreams);\n textStreams = this.parseTexts_(mediaTags);\n imageStreams = await this.parseImages_(imageTags, iFrameTags);\n }\n\n // Make sure that the parser has not been destroyed.\n if (!this.playerInterface_) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.PLAYER,\n shaka.util.Error.Code.OPERATION_ABORTED);\n }\n\n this.determineStartTime_(playlist);\n\n // Single-variant streams aren't lazy-loaded, so for them we already have\n // enough info here to determine the presentation type and duration.\n if (playlist.type == shaka.hls.PlaylistType.MEDIA) {\n if (this.isLive_()) {\n this.changePresentationTimelineToLive_(playlist);\n const delay = this.getUpdatePlaylistDelay_();\n this.updatePlaylistTimer_.tickAfter(/* seconds= */ delay);\n }\n const streamInfos = Array.from(this.uriToStreamInfosMap_.values());\n this.finalizeStreams_(streamInfos);\n this.determineDuration_();\n\n goog.asserts.assert(mediaPlaylistType,\n 'mediaPlaylistType should be non-null');\n this.processDateRangeTags_(\n playlist.tags, mediaPlaylistType, mediaVariables, getUris);\n }\n\n this.manifest_ = {\n presentationTimeline: this.presentationTimeline_,\n variants,\n textStreams,\n imageStreams,\n offlineSessionIds: [],\n sequenceMode: this.config_.hls.sequenceMode,\n ignoreManifestTimestampsInSegmentsMode:\n this.config_.hls.ignoreManifestTimestampsInSegmentsMode,\n type: shaka.media.ManifestParser.HLS,\n serviceDescription: null,\n nextUrl: null,\n periodCount: 1,\n gapCount: 0,\n isLowLatency: false,\n startTime: this.startTime_,\n };\n\n // If there is no 'CODECS' attribute in the manifest and codec guessing is\n // disabled, we need to create the segment indexes now so that missing info\n // can be parsed from the media data and added to the stream objects.\n if (!this.codecInfoInManifest_ && this.config_.hls.disableCodecGuessing) {\n const createIndexes = [];\n for (const variant of this.manifest_.variants) {\n if (variant.audio && variant.audio.codecs === '') {\n createIndexes.push(variant.audio.createSegmentIndex());\n }\n if (variant.video && variant.video.codecs === '') {\n createIndexes.push(variant.video.createSegmentIndex());\n }\n }\n\n await Promise.all(createIndexes);\n }\n\n this.playerInterface_.makeTextStreamsForClosedCaptions(this.manifest_);\n }\n\n /**\n * @param {!Array<!shaka.media.SegmentReference>} segments\n * @return {!Promise<shaka.media.SegmentUtils.BasicInfo>}\n * @private\n */\n async getBasicInfoFromSegments_(segments) {\n const HlsParser = shaka.hls.HlsParser;\n const defaultBasicInfo = shaka.media.SegmentUtils.getBasicInfoFromMimeType(\n this.config_.hls.mediaPlaylistFullMimeType);\n if (!segments.length) {\n return defaultBasicInfo;\n }\n const {segment, segmentIndex} = this.getAvailableSegment_(segments);\n const segmentUris = segment.getUris();\n const segmentUri = segmentUris[0];\n const parsedUri = new goog.Uri(segmentUri);\n const extension = parsedUri.getPath().split('.').pop();\n const rawMimeType = HlsParser.RAW_FORMATS_TO_MIME_TYPES_.get(extension);\n if (rawMimeType) {\n return shaka.media.SegmentUtils.getBasicInfoFromMimeType(\n rawMimeType);\n }\n\n const requestType = shaka.net.NetworkingEngine.RequestType.SEGMENT;\n\n let initData = null;\n let initMimeType = null;\n const initSegmentRef = segment.initSegmentReference;\n if (initSegmentRef) {\n const initSegmentRequest = shaka.util.Networking.createSegmentRequest(\n initSegmentRef.getUris(), initSegmentRef.getStartByte(),\n initSegmentRef.getEndByte(), this.config_.retryParameters);\n const initType =\n shaka.net.NetworkingEngine.AdvancedRequestType.INIT_SEGMENT;\n const initResponse = await this.makeNetworkRequest_(\n initSegmentRequest, requestType, {type: initType}).promise;\n initData = initResponse.data;\n if (initSegmentRef.aesKey) {\n initData = await shaka.media.SegmentUtils.aesDecrypt(\n initData, initSegmentRef.aesKey, 0);\n }\n\n initMimeType = initResponse.headers['content-type'];\n if (initMimeType) {\n // Split the MIME type in case the server sent additional parameters.\n initMimeType = initMimeType.split(';')[0].toLowerCase();\n }\n }\n\n const segmentRequest = shaka.util.Networking.createSegmentRequest(\n segment.getUris(), segment.getStartByte(), segment.getEndByte(),\n this.config_.retryParameters);\n const type = shaka.net.NetworkingEngine.AdvancedRequestType.MEDIA_SEGMENT;\n const response = await this.makeNetworkRequest_(\n segmentRequest, requestType, {type}).promise;\n let data = response.data;\n if (segment.aesKey) {\n data = await shaka.media.SegmentUtils.aesDecrypt(\n data, segment.aesKey, segmentIndex);\n }\n\n let contentMimeType = response.headers['content-type'];\n if (contentMimeType) {\n // Split the MIME type in case the server sent additional parameters.\n contentMimeType = contentMimeType.split(';')[0].toLowerCase();\n }\n\n const validMp4Extensions = [\n 'mp4',\n 'mp4a',\n 'm4s',\n 'm4i',\n 'm4a',\n 'm4f',\n 'cmfa',\n 'mp4v',\n 'm4v',\n 'cmfv',\n 'fmp4',\n ];\n const validMp4MimeType = [\n 'audio/mp4',\n 'video/mp4',\n 'video/iso.segment',\n ];\n\n if (shaka.util.TsParser.probe(\n shaka.util.BufferUtils.toUint8(data))) {\n const basicInfo = shaka.media.SegmentUtils.getBasicInfoFromTs(\n data, this.config_.disableAudio, this.config_.disableVideo,\n this.config_.disableText);\n if (basicInfo) {\n return basicInfo;\n }\n } else if (validMp4Extensions.includes(extension) ||\n validMp4MimeType.includes(contentMimeType) ||\n (initMimeType && validMp4MimeType.includes(initMimeType))) {\n const basicInfo = shaka.media.SegmentUtils.getBasicInfoFromMp4(\n initData, data, this.config_.disableText);\n if (basicInfo) {\n return basicInfo;\n }\n }\n if (contentMimeType) {\n return shaka.media.SegmentUtils.getBasicInfoFromMimeType(\n contentMimeType);\n }\n if (initMimeType) {\n return shaka.media.SegmentUtils.getBasicInfoFromMimeType(\n initMimeType);\n }\n return defaultBasicInfo;\n }\n\n /** @private */\n determineDuration_() {\n goog.asserts.assert(this.presentationTimeline_,\n 'Presentation timeline not created!');\n\n if (this.isLive_()) {\n // The spec says nothing much about seeking in live content, but Safari's\n // built-in HLS implementation does not allow it. Therefore we will set\n // the availability window equal to the presentation delay. The player\n // will be able to buffer ahead three segments, but the seek window will\n // be zero-sized.\n const PresentationType = shaka.hls.HlsParser.PresentationType_;\n\n if (this.presentationType_ == PresentationType.LIVE) {\n let segmentAvailabilityDuration = this.getLiveDuration_() || 0;\n\n // The app can override that with a longer duration, to allow seeking.\n if (!isNaN(this.config_.availabilityWindowOverride)) {\n segmentAvailabilityDuration = this.config_.availabilityWindowOverride;\n }\n\n this.presentationTimeline_.setSegmentAvailabilityDuration(\n segmentAvailabilityDuration);\n }\n } else {\n // Use the minimum duration as the presentation duration.\n this.presentationTimeline_.setDuration(this.getMinDuration_());\n }\n\n if (!this.presentationTimeline_.isStartTimeLocked()) {\n for (const streamInfo of this.uriToStreamInfosMap_.values()) {\n if (!streamInfo.stream.segmentIndex) {\n continue; // Not active.\n }\n if (streamInfo.type != 'audio' && streamInfo.type != 'video') {\n continue;\n }\n const firstReference =\n streamInfo.stream.segmentIndex.earliestReference();\n if (firstReference && firstReference.syncTime) {\n const syncTime = firstReference.syncTime;\n this.presentationTimeline_.setInitialProgramDateTime(syncTime);\n }\n }\n }\n\n // This is the first point where we have a meaningful presentation start\n // time, and we need to tell PresentationTimeline that so that it can\n // maintain consistency from here on.\n this.presentationTimeline_.lockStartTime();\n\n // This asserts that the live edge is being calculated from segment times.\n // For VOD and event streams, this check should still pass.\n goog.asserts.assert(\n !this.presentationTimeline_.usingPresentationStartTime(),\n 'We should not be using the presentation start time in HLS!');\n }\n\n /**\n * Get the variables of each variant tag, and store in a map.\n * @param {!Array<!shaka.hls.Tag>} tags Variant tags from the playlist.\n * @private\n */\n parseMasterVariables_(tags) {\n const queryParams = new goog.Uri(this.masterPlaylistUri_).getQueryData();\n for (const variableTag of tags) {\n const name = variableTag.getAttributeValue('NAME');\n const value = variableTag.getAttributeValue('VALUE');\n const queryParam = variableTag.getAttributeValue('QUERYPARAM');\n if (name && value) {\n if (!this.globalVariables_.has(name)) {\n this.globalVariables_.set(name, value);\n }\n }\n if (queryParam) {\n const queryParamValue = queryParams.get(queryParam)[0];\n if (queryParamValue && !this.globalVariables_.has(queryParamValue)) {\n this.globalVariables_.set(queryParam, queryParamValue);\n }\n }\n }\n }\n\n /**\n * Get the variables of each variant tag, and store in a map.\n * @param {!Array<!shaka.hls.Tag>} tags Variant tags from the playlist.\n * @param {string} uri Media playlist URI.\n * @return {!Map<string, string>}\n * @private\n */\n parseMediaVariables_(tags, uri) {\n const queryParams = new goog.Uri(uri).getQueryData();\n const mediaVariables = new Map();\n for (const variableTag of tags) {\n const name = variableTag.getAttributeValue('NAME');\n const value = variableTag.getAttributeValue('VALUE');\n const queryParam = variableTag.getAttributeValue('QUERYPARAM');\n const mediaImport = variableTag.getAttributeValue('IMPORT');\n if (name && value) {\n if (!mediaVariables.has(name)) {\n mediaVariables.set(name, value);\n }\n }\n if (queryParam) {\n const queryParamValue = queryParams.get(queryParam)[0];\n if (queryParamValue && !mediaVariables.has(queryParamValue)) {\n mediaVariables.set(queryParam, queryParamValue);\n }\n }\n if (mediaImport) {\n const globalValue = this.globalVariables_.get(mediaImport);\n if (globalValue) {\n mediaVariables.set(mediaImport, globalValue);\n }\n }\n }\n return mediaVariables;\n }\n\n /**\n * Get the codecs of each variant tag, and store in a map from\n * audio/video/subtitle group id to the codecs array list.\n * @param {!Array<!shaka.hls.Tag>} tags Variant tags from the playlist.\n * @private\n */\n parseCodecs_(tags) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n\n for (const variantTag of tags) {\n const audioGroupId = variantTag.getAttributeValue('AUDIO');\n const videoGroupId = variantTag.getAttributeValue('VIDEO');\n const subGroupId = variantTag.getAttributeValue('SUBTITLES');\n const allCodecs = this.getCodecsForVariantTag_(variantTag);\n\n if (subGroupId) {\n const textCodecs = shaka.util.ManifestParserUtils.guessCodecsSafe(\n ContentType.TEXT, allCodecs);\n goog.asserts.assert(textCodecs != null, 'Text codecs should be valid.');\n this.groupIdToCodecsMap_.set(subGroupId, textCodecs);\n shaka.util.ArrayUtils.remove(allCodecs, textCodecs);\n }\n if (audioGroupId) {\n let codecs = shaka.util.ManifestParserUtils.guessCodecsSafe(\n ContentType.AUDIO, allCodecs);\n if (!codecs) {\n codecs = this.config_.hls.defaultAudioCodec;\n }\n this.groupIdToCodecsMap_.set(audioGroupId, codecs);\n }\n if (videoGroupId) {\n let codecs = shaka.util.ManifestParserUtils.guessCodecsSafe(\n ContentType.VIDEO, allCodecs);\n if (!codecs) {\n codecs = this.config_.hls.defaultVideoCodec;\n }\n this.groupIdToCodecsMap_.set(videoGroupId, codecs);\n }\n }\n }\n\n /**\n * Process EXT-X-SESSION-DATA tags.\n *\n * @param {!Array<!shaka.hls.Tag>} tags\n * @private\n */\n processSessionData_(tags) {\n for (const tag of tags) {\n const id = tag.getAttributeValue('DATA-ID');\n const uri = tag.getAttributeValue('URI');\n const language = tag.getAttributeValue('LANGUAGE');\n const value = tag.getAttributeValue('VALUE');\n const data = (new Map()).set('id', id);\n if (uri) {\n data.set('uri', shaka.hls.Utils.constructSegmentUris(\n [this.masterPlaylistUri_], uri, this.globalVariables_)[0]);\n }\n if (language) {\n data.set('language', language);\n }\n if (value) {\n data.set('value', value);\n }\n const event = new shaka.util.FakeEvent('sessiondata', data);\n if (this.playerInterface_) {\n this.playerInterface_.onEvent(event);\n }\n }\n }\n\n /**\n * Process EXT-X-CONTENT-STEERING tags.\n *\n * @param {!Array<!shaka.hls.Tag>} tags\n * @return {!Promise}\n * @private\n */\n async processContentSteering_(tags) {\n if (!this.playerInterface_ || !this.config_) {\n return;\n }\n let contentSteeringPromise;\n for (const tag of tags) {\n const defaultPathwayId = tag.getAttributeValue('PATHWAY-ID');\n const uri = tag.getAttributeValue('SERVER-URI');\n if (!defaultPathwayId || !uri) {\n continue;\n }\n this.contentSteeringManager_ =\n new shaka.util.ContentSteeringManager(this.playerInterface_);\n this.contentSteeringManager_.configure(this.config_);\n this.contentSteeringManager_.setBaseUris([this.masterPlaylistUri_]);\n this.contentSteeringManager_.setManifestType(\n shaka.media.ManifestParser.HLS);\n this.contentSteeringManager_.setDefaultPathwayId(defaultPathwayId);\n contentSteeringPromise =\n this.contentSteeringManager_.requestInfo(uri);\n break;\n }\n await contentSteeringPromise;\n }\n\n /**\n * Parse Subtitles and Closed Captions from 'EXT-X-MEDIA' tags.\n * Create text streams for Subtitles, but not Closed Captions.\n *\n * @param {!Array<!shaka.hls.Tag>} mediaTags Media tags from the playlist.\n * @return {!Array<!shaka.extern.Stream>}\n * @private\n */\n parseTexts_(mediaTags) {\n // Create text stream for each Subtitle media tag.\n const subtitleTags =\n shaka.hls.Utils.filterTagsByType(mediaTags, 'SUBTITLES');\n const textStreams = subtitleTags.map((tag) => {\n const disableText = this.config_.disableText;\n if (disableText) {\n return null;\n }\n try {\n return this.createStreamInfoFromMediaTags_([tag], new Map()).stream;\n } catch (e) {\n if (this.config_.hls.ignoreTextStreamFailures) {\n return null;\n }\n throw e;\n }\n });\n\n const type = shaka.util.ManifestParserUtils.ContentType.TEXT;\n\n // Set the codecs for text streams.\n for (const tag of subtitleTags) {\n const groupId = tag.getRequiredAttrValue('GROUP-ID');\n const codecs = this.groupIdToCodecsMap_.get(groupId);\n if (codecs) {\n const textStreamInfos = this.groupIdToStreamInfosMap_.get(groupId);\n if (textStreamInfos) {\n for (const textStreamInfo of textStreamInfos) {\n textStreamInfo.stream.codecs = codecs;\n textStreamInfo.stream.mimeType =\n this.guessMimeTypeBeforeLoading_(type, codecs) ||\n this.guessMimeTypeFallback_(type);\n this.setFullTypeForStream_(textStreamInfo.stream);\n }\n }\n }\n }\n\n // Do not create text streams for Closed captions.\n return textStreams.filter((s) => s);\n }\n\n /**\n * @param {!shaka.extern.Stream} stream\n * @private\n */\n setFullTypeForStream_(stream) {\n const combinations = new Set([shaka.util.MimeUtils.getFullType(\n stream.mimeType, stream.codecs)]);\n if (stream.segmentIndex) {\n stream.segmentIndex.forEachTopLevelReference((reference) => {\n if (reference.mimeType) {\n combinations.add(shaka.util.MimeUtils.getFullType(\n reference.mimeType, stream.codecs));\n }\n });\n }\n stream.fullMimeTypes = combinations;\n }\n\n /**\n * @param {!Array<!shaka.hls.Tag>} imageTags from the playlist.\n * @param {!Array<!shaka.hls.Tag>} iFrameTags from the playlist.\n * @return {!Promise<!Array<!shaka.extern.Stream>>}\n * @private\n */\n async parseImages_(imageTags, iFrameTags) {\n // Create image stream for each image tag.\n const imageStreamPromises = imageTags.map(async (tag) => {\n const disableThumbnails = this.config_.disableThumbnails;\n if (disableThumbnails) {\n return null;\n }\n try {\n const streamInfo = await this.createStreamInfoFromImageTag_(tag);\n return streamInfo.stream;\n } catch (e) {\n if (this.config_.hls.ignoreImageStreamFailures) {\n return null;\n }\n throw e;\n }\n }).concat(iFrameTags.map((tag) => {\n const disableThumbnails = this.config_.disableThumbnails;\n if (disableThumbnails) {\n return null;\n }\n try {\n const streamInfo = this.createStreamInfoFromIframeTag_(tag);\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n if (streamInfo.stream.type !== ContentType.IMAGE) {\n return null;\n }\n return streamInfo.stream;\n } catch (e) {\n if (this.config_.hls.ignoreImageStreamFailures) {\n return null;\n }\n throw e;\n }\n }));\n const imageStreams = await Promise.all(imageStreamPromises);\n return imageStreams.filter((s) => s);\n }\n\n /**\n * @param {!Array<!shaka.hls.Tag>} mediaTags Media tags from the playlist.\n * @param {!Map<string, string>} groupIdPathwayIdMapping\n * @private\n */\n createStreamInfosFromMediaTags_(mediaTags, groupIdPathwayIdMapping) {\n // Filter out subtitles and media tags without uri (except audio).\n mediaTags = mediaTags.filter((tag) => {\n const uri = tag.getAttributeValue('URI') || '';\n const type = tag.getAttributeValue('TYPE');\n return type != 'SUBTITLES' && (uri != '' || type == 'AUDIO');\n });\n\n const groupedTags = {};\n for (const tag of mediaTags) {\n const key = tag.getTagKey(!this.contentSteeringManager_);\n if (!groupedTags[key]) {\n groupedTags[key] = [tag];\n } else {\n groupedTags[key].push(tag);\n }\n }\n\n for (const key in groupedTags) {\n // Create stream info for each audio / video media grouped tag.\n this.createStreamInfoFromMediaTags_(\n groupedTags[key], groupIdPathwayIdMapping, /* requireUri= */ false);\n }\n }\n\n /**\n * @param {!Array<!shaka.hls.Tag>} iFrameTags from the playlist.\n * @return {!Array<!shaka.extern.Stream>}\n * @private\n */\n parseIFrames_(iFrameTags) {\n // Create iFrame stream for each iFrame tag.\n const iFrameStreams = iFrameTags.map((tag) => {\n const streamInfo = this.createStreamInfoFromIframeTag_(tag);\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n if (streamInfo.stream.type !== ContentType.VIDEO) {\n return null;\n }\n return streamInfo.stream;\n });\n\n // Filter mjpg iFrames\n return iFrameStreams.filter((s) => s);\n }\n\n /**\n * @param {!Array<!shaka.hls.Tag>} tags Variant tags from the playlist.\n * @param {!Array<!shaka.hls.Tag>} sessionKeyTags EXT-X-SESSION-KEY tags\n * from the playlist.\n * @param {!Array<!shaka.hls.Tag>} mediaTags EXT-X-MEDIA tags from the\n * playlist.\n * @param {function(): !Array<string>} getUris\n * @param {?Map<string, string>} variables\n * @param {!Array<!shaka.extern.Stream>} iFrameStreams\n * @return {!Promise<!Array<!shaka.extern.Variant>>}\n * @private\n */\n async createVariantsForTags_(tags, sessionKeyTags, mediaTags, getUris,\n variables, iFrameStreams) {\n // EXT-X-SESSION-KEY processing\n const drmInfos = [];\n const keyIds = new Set();\n if (!this.config_.ignoreDrmInfo && sessionKeyTags.length > 0) {\n for (const drmTag of sessionKeyTags) {\n const method = drmTag.getRequiredAttrValue('METHOD');\n // According to the HLS spec, KEYFORMAT is optional and implicitly\n // defaults to \"identity\".\n // https://datatracker.ietf.org/doc/html/draft-pantos-hls-rfc8216bis-11#section-4.4.4.4\n const keyFormat =\n drmTag.getAttributeValue('KEYFORMAT') || 'identity';\n let drmInfo = null;\n if (method == 'NONE') {\n continue;\n } else if (this.isAesMethod_(method)) {\n const keyUris = shaka.hls.Utils.constructSegmentUris(\n getUris(), drmTag.getRequiredAttrValue('URI'), variables);\n const keyMapKey = keyUris.sort().join('');\n if (!this.aesKeyMap_.has(keyMapKey)) {\n const requestType = shaka.net.NetworkingEngine.RequestType.KEY;\n const request = shaka.net.NetworkingEngine.makeRequest(\n keyUris, this.config_.retryParameters);\n const keyResponse = this.makeNetworkRequest_(request, requestType)\n .promise;\n this.aesKeyMap_.set(keyMapKey, keyResponse);\n }\n continue;\n } else if (keyFormat == 'identity') {\n // eslint-disable-next-line no-await-in-loop\n drmInfo = await this.identityDrmParser_(\n drmTag, /* mimeType= */ '', getUris,\n /* initSegmentRef= */ null, variables);\n } else {\n const drmParser =\n shaka.hls.HlsParser.KEYFORMATS_TO_DRM_PARSERS_.get(keyFormat);\n\n drmInfo = drmParser ?\n drmParser(drmTag, /* mimeType= */ '') : null;\n }\n if (drmInfo) {\n if (drmInfo.keyIds) {\n for (const keyId of drmInfo.keyIds) {\n keyIds.add(keyId);\n }\n }\n drmInfos.push(drmInfo);\n } else {\n shaka.log.warning('Unsupported HLS KEYFORMAT', keyFormat);\n }\n }\n }\n\n const groupedTags = {};\n for (const tag of tags) {\n const key = tag.getTagKey(!this.contentSteeringManager_);\n if (!groupedTags[key]) {\n groupedTags[key] = [tag];\n } else {\n groupedTags[key].push(tag);\n }\n }\n\n const allVariants = [];\n // Create variants for each group of variant tag.\n for (const key in groupedTags) {\n const tags = groupedTags[key];\n const firstTag = tags[0];\n\n const frameRate = firstTag.getAttributeValue('FRAME-RATE');\n const bandwidth =\n Number(firstTag.getAttributeValue('AVERAGE-BANDWIDTH')) ||\n Number(firstTag.getRequiredAttrValue('BANDWIDTH'));\n\n const resolution = firstTag.getAttributeValue('RESOLUTION');\n const [width, height] = resolution ? resolution.split('x') : [null, null];\n\n const videoRange = firstTag.getAttributeValue('VIDEO-RANGE');\n\n let videoLayout = firstTag.getAttributeValue('REQ-VIDEO-LAYOUT');\n if (videoLayout && videoLayout.includes(',')) {\n // If multiple video layout strings are present, pick the first valid\n // one.\n const layoutStrings = videoLayout.split(',').filter((layoutString) => {\n return layoutString == 'CH-STEREO' || layoutString == 'CH-MONO';\n });\n videoLayout = layoutStrings[0];\n }\n // According to the HLS spec:\n // By default a video variant is monoscopic, so an attribute\n // consisting entirely of REQ-VIDEO-LAYOUT=\"CH-MONO\" is unnecessary\n // and SHOULD NOT be present.\n videoLayout = videoLayout || 'CH-MONO';\n\n const streamInfos = this.createStreamInfosForVariantTags_(tags,\n mediaTags, resolution, frameRate);\n\n goog.asserts.assert(streamInfos.audio.length ||\n streamInfos.video.length, 'We should have created a stream!');\n\n allVariants.push(...this.createVariants_(\n streamInfos.audio,\n streamInfos.video,\n bandwidth,\n width,\n height,\n frameRate,\n videoRange,\n videoLayout,\n drmInfos,\n keyIds,\n iFrameStreams));\n }\n return allVariants.filter((variant) => variant != null);\n }\n\n /**\n * Create audio and video streamInfos from an 'EXT-X-STREAM-INF' tag and its\n * related media tags.\n *\n * @param {!Array<!shaka.hls.Tag>} tags\n * @param {!Array<!shaka.hls.Tag>} mediaTags\n * @param {?string} resolution\n * @param {?string} frameRate\n * @return {!shaka.hls.HlsParser.StreamInfos}\n * @private\n */\n createStreamInfosForVariantTags_(tags, mediaTags, resolution, frameRate) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n\n /** @type {shaka.hls.HlsParser.StreamInfos} */\n const res = {\n audio: [],\n video: [],\n };\n const groupIdPathwayIdMapping = new Map();\n const globalGroupIds = [];\n let isAudioGroup = false;\n let isVideoGroup = false;\n for (const tag of tags) {\n const audioGroupId = tag.getAttributeValue('AUDIO');\n const videoGroupId = tag.getAttributeValue('VIDEO');\n goog.asserts.assert(audioGroupId == null || videoGroupId == null,\n 'Unexpected: both video and audio described by media tags!');\n\n const groupId = audioGroupId || videoGroupId;\n if (!groupId) {\n continue;\n }\n if (!globalGroupIds.includes(groupId)) {\n globalGroupIds.push(groupId);\n }\n const pathwayId = tag.getAttributeValue('PATHWAY-ID');\n if (pathwayId) {\n groupIdPathwayIdMapping.set(groupId, pathwayId);\n }\n if (audioGroupId) {\n isAudioGroup = true;\n } else if (videoGroupId) {\n isVideoGroup = true;\n }\n // Make an educated guess about the stream type.\n shaka.log.debug('Guessing stream type for', tag.toString());\n }\n if (globalGroupIds.length && mediaTags.length) {\n const mediaTagsForVariant = mediaTags.filter((tag) => {\n return globalGroupIds.includes(tag.getRequiredAttrValue('GROUP-ID'));\n });\n this.createStreamInfosFromMediaTags_(\n mediaTagsForVariant, groupIdPathwayIdMapping);\n }\n const globalGroupId = globalGroupIds.sort().join(',');\n const streamInfos =\n (globalGroupId && this.groupIdToStreamInfosMap_.has(globalGroupId)) ?\n this.groupIdToStreamInfosMap_.get(globalGroupId) : [];\n if (isAudioGroup) {\n res.audio.push(...streamInfos);\n } else if (isVideoGroup) {\n res.video.push(...streamInfos);\n }\n\n let type;\n let ignoreStream = false;\n\n // The Microsoft HLS manifest generators will make audio-only variants\n // that link to their URI both directly and through an audio tag.\n // In that case, ignore the local URI and use the version in the\n // AUDIO tag, so you inherit its language.\n // As an example, see the manifest linked in issue #860.\n const allStreamUris = tags.map((tag) => tag.getRequiredAttrValue('URI'));\n const hasSameUri = res.audio.find((audio) => {\n return audio && audio.getUris().find((uri) => {\n return allStreamUris.includes(uri);\n });\n });\n\n /** @type {!Array<string>} */\n let allCodecs = this.getCodecsForVariantTag_(tags[0]);\n const videoCodecs = shaka.util.ManifestParserUtils.guessCodecsSafe(\n ContentType.VIDEO, allCodecs);\n const audioCodecs = shaka.util.ManifestParserUtils.guessCodecsSafe(\n ContentType.AUDIO, allCodecs);\n\n if (audioCodecs && !videoCodecs) {\n // There are no associated media tags, and there's only audio codec,\n // and no video codec, so it should be audio.\n type = ContentType.AUDIO;\n shaka.log.debug('Guessing audio-only.');\n ignoreStream = res.audio.length > 0;\n } else if (!res.audio.length && !res.video.length &&\n audioCodecs && videoCodecs) {\n // There are both audio and video codecs, so assume multiplexed content.\n // Note that the default used when CODECS is missing assumes multiple\n // (and therefore multiplexed).\n // Recombine the codec strings into one so that MediaSource isn't\n // lied to later. (That would trigger an error in Chrome.)\n shaka.log.debug('Guessing multiplexed audio+video.');\n type = ContentType.VIDEO;\n allCodecs = [[videoCodecs, audioCodecs].join(',')];\n } else if (res.audio.length && hasSameUri) {\n shaka.log.debug('Guessing audio-only.');\n type = ContentType.AUDIO;\n ignoreStream = true;\n } else if (res.video.length && !res.audio.length) {\n // There are associated video streams. Assume this is audio.\n shaka.log.debug('Guessing audio-only.');\n type = ContentType.AUDIO;\n } else {\n shaka.log.debug('Guessing video-only.');\n type = ContentType.VIDEO;\n }\n\n if (!ignoreStream) {\n const streamInfo =\n this.createStreamInfoFromVariantTags_(tags, allCodecs, type);\n if (globalGroupId) {\n streamInfo.stream.groupId = globalGroupId;\n }\n res[streamInfo.stream.type] = [streamInfo];\n }\n return res;\n }\n\n\n /**\n * Get the codecs from the 'EXT-X-STREAM-INF' tag.\n *\n * @param {!shaka.hls.Tag} tag\n * @return {!Array<string>} codecs\n * @private\n */\n getCodecsForVariantTag_(tag) {\n let codecsString = tag.getAttributeValue('CODECS') || '';\n\n this.codecInfoInManifest_ = codecsString.length > 0;\n\n if (!this.codecInfoInManifest_ && !this.config_.hls.disableCodecGuessing) {\n // These are the default codecs to assume if none are specified.\n const defaultCodecsArray = [];\n\n if (!this.config_.disableVideo) {\n defaultCodecsArray.push(this.config_.hls.defaultVideoCodec);\n }\n if (!this.config_.disableAudio) {\n defaultCodecsArray.push(this.config_.hls.defaultAudioCodec);\n }\n\n codecsString = defaultCodecsArray.join(',');\n }\n\n // Strip out internal whitespace while splitting on commas:\n /** @type {!Array<string>} */\n const codecs = codecsString.split(/\\s*,\\s*/);\n\n return shaka.media.SegmentUtils.codecsFiltering(codecs);\n }\n\n /**\n * Get the channel count information for an HLS audio track.\n * CHANNELS specifies an ordered, \"/\" separated list of parameters.\n * If the type is audio, the first parameter will be a decimal integer\n * specifying the number of independent, simultaneous audio channels.\n * No other channels parameters are currently defined.\n *\n * @param {!shaka.hls.Tag} tag\n * @return {?number}\n * @private\n */\n getChannelsCount_(tag) {\n const channels = tag.getAttributeValue('CHANNELS');\n if (!channels) {\n return null;\n }\n const channelCountString = channels.split('/')[0];\n const count = parseInt(channelCountString, 10);\n return count;\n }\n\n /**\n * Get the sample rate information for an HLS audio track.\n *\n * @param {!shaka.hls.Tag} tag\n * @return {?number}\n * @private\n */\n getSampleRate_(tag) {\n const sampleRate = tag.getAttributeValue('SAMPLE-RATE');\n if (!sampleRate) {\n return null;\n }\n return parseInt(sampleRate, 10);\n }\n\n /**\n * Get the spatial audio information for an HLS audio track.\n * In HLS the channels field indicates the number of audio channels that the\n * stream has (eg: 2). In the case of Dolby Atmos (EAC-3), the complexity is\n * expressed with the number of channels followed by the word JOC\n * (eg: 16/JOC), so 16 would be the number of channels (eg: 7.3.6 layout),\n * and JOC indicates that the stream has spatial audio. For Dolby AC-4 ATMOS,\n * it's necessary search ATMOS word.\n * @see https://developer.apple.com/documentation/http-live-streaming/hls-authoring-specification-for-apple-devices-appendixes\n * @see https://ott.dolby.com/OnDelKits/AC-4/Dolby_AC-4_Online_Delivery_Kit_1.5/Documentation/Specs/AC4_HLS/help_files/topics/hls_playlist_c_codec_indication_ims.html\n *\n * @param {!shaka.hls.Tag} tag\n * @return {boolean}\n * @private\n */\n isSpatialAudio_(tag) {\n const channels = tag.getAttributeValue('CHANNELS');\n if (!channels) {\n return false;\n }\n const channelsParts = channels.split('/');\n if (channelsParts.length != 2) {\n return false;\n }\n return channelsParts[1] === 'JOC' || channelsParts[1].includes('ATMOS');\n }\n\n /**\n * Get the closed captions map information for the EXT-X-STREAM-INF tag, to\n * create the stream info.\n * @param {!shaka.hls.Tag} tag\n * @param {string} type\n * @return {Map<string, string>} closedCaptions\n * @private\n */\n getClosedCaptions_(tag, type) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n // The attribute of closed captions is optional, and the value may be\n // 'NONE'.\n const closedCaptionsAttr = tag.getAttributeValue('CLOSED-CAPTIONS');\n\n // EXT-X-STREAM-INF tags may have CLOSED-CAPTIONS attributes.\n // The value can be either a quoted-string or an enumerated-string with\n // the value NONE. If the value is a quoted-string, it MUST match the\n // value of the GROUP-ID attribute of an EXT-X-MEDIA tag elsewhere in the\n // Playlist whose TYPE attribute is CLOSED-CAPTIONS.\n if (type == ContentType.VIDEO ) {\n if (this.config_.disableText) {\n this.needsClosedCaptionsDetection_ = false;\n return null;\n }\n if (closedCaptionsAttr) {\n if (closedCaptionsAttr != 'NONE') {\n return this.groupIdToClosedCaptionsMap_.get(closedCaptionsAttr);\n }\n this.needsClosedCaptionsDetection_ = false;\n } else if (!closedCaptionsAttr && this.groupIdToClosedCaptionsMap_.size) {\n for (const key of this.groupIdToClosedCaptionsMap_.keys()) {\n return this.groupIdToClosedCaptionsMap_.get(key);\n }\n }\n }\n return null;\n }\n\n /**\n * Get the normalized language value.\n *\n * @param {?string} languageValue\n * @return {string}\n * @private\n */\n getLanguage_(languageValue) {\n const LanguageUtils = shaka.util.LanguageUtils;\n return LanguageUtils.normalize(languageValue || 'und');\n }\n\n /**\n * Get the type value.\n * Shaka recognizes the content types 'audio', 'video', 'text', and 'image'.\n * The HLS 'subtitles' type needs to be mapped to 'text'.\n * @param {!shaka.hls.Tag} tag\n * @return {string}\n * @private\n */\n getType_(tag) {\n let type = tag.getRequiredAttrValue('TYPE').toLowerCase();\n if (type == 'subtitles') {\n type = shaka.util.ManifestParserUtils.ContentType.TEXT;\n }\n return type;\n }\n\n /**\n * @param {!Array<shaka.hls.HlsParser.StreamInfo>} audioInfos\n * @param {!Array<shaka.hls.HlsParser.StreamInfo>} videoInfos\n * @param {number} bandwidth\n * @param {?string} width\n * @param {?string} height\n * @param {?string} frameRate\n * @param {?string} videoRange\n * @param {?string} videoLayout\n * @param {!Array<shaka.extern.DrmInfo>} drmInfos\n * @param {!Set<string>} keyIds\n * @param {!Array<!shaka.extern.Stream>} iFrameStreams\n * @return {!Array<!shaka.extern.Variant>}\n * @private\n */\n createVariants_(\n audioInfos, videoInfos, bandwidth, width, height, frameRate, videoRange,\n videoLayout, drmInfos, keyIds, iFrameStreams) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n const DrmUtils = shaka.drm.DrmUtils;\n\n for (const info of videoInfos) {\n this.addVideoAttributes_(\n info.stream, width, height, frameRate, videoRange, videoLayout,\n /** colorGamut= */ null);\n }\n\n // In case of audio-only or video-only content or the audio/video is\n // disabled by the config, we create an array of one item containing\n // a null. This way, the double-loop works for all kinds of content.\n // NOTE: we currently don't have support for audio-only content.\n const disableAudio = this.config_.disableAudio;\n if (!audioInfos.length || disableAudio) {\n audioInfos = [null];\n }\n const disableVideo = this.config_.disableVideo;\n if (!videoInfos.length || disableVideo) {\n videoInfos = [null];\n }\n\n const variants = [];\n for (const audioInfo of audioInfos) {\n for (const videoInfo of videoInfos) {\n const audioStream = audioInfo ? audioInfo.stream : null;\n if (audioStream) {\n audioStream.drmInfos = drmInfos;\n audioStream.keyIds = keyIds;\n }\n const videoStream = videoInfo ? videoInfo.stream : null;\n if (videoStream) {\n videoStream.drmInfos = drmInfos;\n videoStream.keyIds = keyIds;\n if (!this.config_.disableIFrames) {\n shaka.util.StreamUtils.setBetterIFrameStream(\n videoStream, iFrameStreams);\n }\n }\n if (videoStream && !audioStream) {\n videoStream.bandwidth = bandwidth;\n }\n if (!videoStream && audioStream) {\n audioStream.bandwidth = bandwidth;\n }\n const audioDrmInfos = audioInfo ? audioInfo.stream.drmInfos : null;\n const videoDrmInfos = videoInfo ? videoInfo.stream.drmInfos : null;\n const videoStreamUri =\n videoInfo ? videoInfo.getUris().sort().join(',') : '';\n const audioStreamUri =\n audioInfo ? audioInfo.getUris().sort().join(',') : '';\n const codecs = [];\n if (audioStream && audioStream.codecs) {\n codecs.push(audioStream.codecs);\n }\n if (videoStream && videoStream.codecs) {\n codecs.push(videoStream.codecs);\n }\n const variantUriKey = [\n videoStreamUri,\n audioStreamUri,\n codecs.sort(),\n ].join('-');\n\n if (audioStream && videoStream) {\n if (!DrmUtils.areDrmCompatible(audioDrmInfos, videoDrmInfos)) {\n shaka.log.warning(\n 'Incompatible DRM info in HLS variant. Skipping.');\n continue;\n }\n }\n\n if (this.variantUriSet_.has(variantUriKey)) {\n // This happens when two variants only differ in their text streams.\n shaka.log.debug(\n 'Skipping variant which only differs in text streams.');\n continue;\n }\n\n // Since both audio and video are of the same type, this assertion will\n // catch certain mistakes at runtime that the compiler would miss.\n goog.asserts.assert(!audioStream ||\n audioStream.type == ContentType.AUDIO, 'Audio parameter mismatch!');\n goog.asserts.assert(!videoStream ||\n videoStream.type == ContentType.VIDEO, 'Video parameter mismatch!');\n\n const variant = {\n id: this.globalId_++,\n language: audioStream ? audioStream.language : 'und',\n disabledUntilTime: 0,\n primary: (!!audioStream && audioStream.primary) ||\n (!!videoStream && videoStream.primary),\n audio: audioStream,\n video: videoStream,\n bandwidth,\n allowedByApplication: true,\n allowedByKeySystem: true,\n decodingInfos: [],\n };\n\n variants.push(variant);\n this.variantUriSet_.add(variantUriKey);\n }\n }\n return variants;\n }\n\n /**\n * Parses an array of EXT-X-MEDIA tags, then stores the values of all tags\n * with TYPE=\"CLOSED-CAPTIONS\" into a map of group id to closed captions.\n *\n * @param {!Array<!shaka.hls.Tag>} mediaTags\n * @private\n */\n parseClosedCaptions_(mediaTags) {\n const closedCaptionsTags =\n shaka.hls.Utils.filterTagsByType(mediaTags, 'CLOSED-CAPTIONS');\n this.needsClosedCaptionsDetection_ = closedCaptionsTags.length == 0;\n for (const tag of closedCaptionsTags) {\n goog.asserts.assert(tag.name == 'EXT-X-MEDIA',\n 'Should only be called on media tags!');\n const languageValue = tag.getAttributeValue('LANGUAGE');\n let language = this.getLanguage_(languageValue);\n if (!languageValue) {\n const nameValue = tag.getAttributeValue('NAME');\n if (nameValue) {\n language = nameValue;\n }\n }\n\n // The GROUP-ID value is a quoted-string that specifies the group to which\n // the Rendition belongs.\n const groupId = tag.getRequiredAttrValue('GROUP-ID');\n\n // The value of INSTREAM-ID is a quoted-string that specifies a Rendition\n // within the segments in the Media Playlist. This attribute is REQUIRED\n // if the TYPE attribute is CLOSED-CAPTIONS.\n // We need replace SERVICE string by our internal svc string.\n const instreamId = tag.getRequiredAttrValue('INSTREAM-ID')\n .replace('SERVICE', 'svc');\n if (!this.groupIdToClosedCaptionsMap_.get(groupId)) {\n this.groupIdToClosedCaptionsMap_.set(groupId, new Map());\n }\n this.groupIdToClosedCaptionsMap_.get(groupId).set(instreamId, language);\n }\n }\n\n /**\n * Parse EXT-X-MEDIA media tag into a Stream object.\n *\n * @param {!Array<!shaka.hls.Tag>} tags\n * @param {!Map<string, string>} groupIdPathwayIdMapping\n * @param {boolean=} requireUri\n * @return {!shaka.hls.HlsParser.StreamInfo}\n * @private\n */\n createStreamInfoFromMediaTags_(tags, groupIdPathwayIdMapping,\n requireUri = true) {\n const verbatimMediaPlaylistUris = [];\n const globalGroupIds = [];\n const groupIdUriMapping = new Map();\n for (const tag of tags) {\n goog.asserts.assert(tag.name == 'EXT-X-MEDIA',\n 'Should only be called on media tags!');\n const uri = requireUri ? tag.getRequiredAttrValue('URI') :\n (tag.getAttributeValue('URI') || shaka.hls.HlsParser.FAKE_MUXED_URL_);\n const groupId = tag.getRequiredAttrValue('GROUP-ID');\n verbatimMediaPlaylistUris.push(uri);\n globalGroupIds.push(groupId);\n groupIdUriMapping.set(groupId, uri);\n }\n\n const globalGroupId = globalGroupIds.sort().join(',');\n const firstTag = tags[0];\n let codecs = '';\n /** @type {string} */\n const type = this.getType_(firstTag);\n if (type == shaka.util.ManifestParserUtils.ContentType.TEXT) {\n codecs = firstTag.getAttributeValue('CODECS') || '';\n } else {\n for (const groupId of globalGroupIds) {\n if (this.groupIdToCodecsMap_.has(groupId)) {\n codecs = this.groupIdToCodecsMap_.get(groupId);\n break;\n }\n }\n }\n\n // Check if the stream has already been created as part of another Variant\n // and return it if it has.\n const key = verbatimMediaPlaylistUris.sort().join(',');\n if (this.uriToStreamInfosMap_.has(key)) {\n return this.uriToStreamInfosMap_.get(key);\n }\n const streamId = this.globalId_++;\n if (this.contentSteeringManager_) {\n for (const [groupId, uri] of groupIdUriMapping) {\n const pathwayId = groupIdPathwayIdMapping.get(groupId);\n if (pathwayId) {\n this.contentSteeringManager_.addLocation(streamId, pathwayId, uri);\n }\n }\n }\n\n const language = firstTag.getAttributeValue('LANGUAGE');\n const name = firstTag.getAttributeValue('NAME');\n\n // NOTE: According to the HLS spec, \"DEFAULT=YES\" requires \"AUTOSELECT=YES\".\n // However, we don't bother to validate \"AUTOSELECT\", since we don't\n // actually use it in our streaming model, and we treat everything as\n // \"AUTOSELECT=YES\". A value of \"AUTOSELECT=NO\" would imply that it may\n // only be selected explicitly by the user, and we don't have a way to\n // represent that in our model.\n const defaultAttrValue = firstTag.getAttributeValue('DEFAULT');\n const primary = defaultAttrValue == 'YES';\n\n const channelsCount =\n type == 'audio' ? this.getChannelsCount_(firstTag) : null;\n const spatialAudio =\n type == 'audio' ? this.isSpatialAudio_(firstTag) : false;\n const characteristics = firstTag.getAttributeValue('CHARACTERISTICS');\n\n const forcedAttrValue = firstTag.getAttributeValue('FORCED');\n const forced = forcedAttrValue == 'YES';\n const sampleRate = type == 'audio' ? this.getSampleRate_(firstTag) : null;\n // TODO: Should we take into account some of the currently ignored\n // attributes: INSTREAM-ID, Attribute descriptions: https://bit.ly/2lpjOhj\n const streamInfo = this.createStreamInfo_(\n streamId, verbatimMediaPlaylistUris, codecs, type, language,\n primary, name, channelsCount, /* closedCaptions= */ null,\n characteristics, forced, sampleRate, spatialAudio);\n if (streamInfo.stream) {\n streamInfo.stream.groupId = globalGroupId;\n }\n if (this.groupIdToStreamInfosMap_.has(globalGroupId)) {\n this.groupIdToStreamInfosMap_.get(globalGroupId).push(streamInfo);\n } else {\n this.groupIdToStreamInfosMap_.set(globalGroupId, [streamInfo]);\n }\n\n this.uriToStreamInfosMap_.set(key, streamInfo);\n return streamInfo;\n }\n\n /**\n * Parse EXT-X-IMAGE-STREAM-INF media tag into a Stream object.\n *\n * @param {shaka.hls.Tag} tag\n * @return {!Promise<!shaka.hls.HlsParser.StreamInfo>}\n * @private\n */\n async createStreamInfoFromImageTag_(tag) {\n goog.asserts.assert(tag.name == 'EXT-X-IMAGE-STREAM-INF',\n 'Should only be called on image tags!');\n /** @type {string} */\n const type = shaka.util.ManifestParserUtils.ContentType.IMAGE;\n\n const verbatimImagePlaylistUri = tag.getRequiredAttrValue('URI');\n const codecs = tag.getAttributeValue('CODECS', 'jpeg') || '';\n\n // Check if the stream has already been created as part of another Variant\n // and return it if it has.\n if (this.uriToStreamInfosMap_.has(verbatimImagePlaylistUri)) {\n return this.uriToStreamInfosMap_.get(verbatimImagePlaylistUri);\n }\n\n const language = tag.getAttributeValue('LANGUAGE');\n const name = tag.getAttributeValue('NAME');\n\n const characteristics = tag.getAttributeValue('CHARACTERISTICS');\n\n const streamInfo = this.createStreamInfo_(\n this.globalId_++, [verbatimImagePlaylistUri], codecs, type, language,\n /* primary= */ false, name, /* channelsCount= */ null,\n /* closedCaptions= */ null, characteristics, /* forced= */ false,\n /* sampleRate= */ null, /* spatialAudio= */ false);\n\n // Parse misc attributes.\n const resolution = tag.getAttributeValue('RESOLUTION');\n if (resolution) {\n // The RESOLUTION tag represents the resolution of a single thumbnail, not\n // of the entire sheet at once (like we expect in the output).\n // So multiply by the layout size.\n\n // Since we need to have generated the segment index for this, we can't\n // lazy-load in this situation.\n await streamInfo.stream.createSegmentIndex();\n\n const reference = streamInfo.stream.segmentIndex.earliestReference();\n const layout = reference.getTilesLayout();\n if (layout) {\n streamInfo.stream.width =\n Number(resolution.split('x')[0]) * Number(layout.split('x')[0]);\n streamInfo.stream.height =\n Number(resolution.split('x')[1]) * Number(layout.split('x')[1]);\n // TODO: What happens if there are multiple grids, with different\n // layout sizes, inside this image stream?\n }\n }\n const bandwidth = tag.getAttributeValue('BANDWIDTH');\n if (bandwidth) {\n streamInfo.stream.bandwidth = Number(bandwidth);\n }\n\n this.uriToStreamInfosMap_.set(verbatimImagePlaylistUri, streamInfo);\n return streamInfo;\n }\n\n /**\n * Parse EXT-X-I-FRAME-STREAM-INF media tag into a Stream object.\n *\n * @param {shaka.hls.Tag} tag\n * @return {!shaka.hls.HlsParser.StreamInfo}\n * @private\n */\n createStreamInfoFromIframeTag_(tag) {\n goog.asserts.assert(tag.name == 'EXT-X-I-FRAME-STREAM-INF',\n 'Should only be called on iframe tags!');\n /** @type {string} */\n let type = shaka.util.ManifestParserUtils.ContentType.VIDEO;\n\n const verbatimIFramePlaylistUri = tag.getRequiredAttrValue('URI');\n const codecs = tag.getAttributeValue('CODECS') || '';\n\n if (codecs == 'mjpg') {\n type = shaka.util.ManifestParserUtils.ContentType.IMAGE;\n }\n\n // Check if the stream has already been created as part of another Variant\n // and return it if it has.\n if (this.uriToStreamInfosMap_.has(verbatimIFramePlaylistUri)) {\n return this.uriToStreamInfosMap_.get(verbatimIFramePlaylistUri);\n }\n\n const language = tag.getAttributeValue('LANGUAGE');\n const name = tag.getAttributeValue('NAME');\n\n const characteristics = tag.getAttributeValue('CHARACTERISTICS');\n\n const streamInfo = this.createStreamInfo_(\n this.globalId_++, [verbatimIFramePlaylistUri], codecs, type, language,\n /* primary= */ false, name, /* channelsCount= */ null,\n /* closedCaptions= */ null, characteristics, /* forced= */ false,\n /* sampleRate= */ null, /* spatialAudio= */ false);\n\n // Parse misc attributes.\n const resolution = tag.getAttributeValue('RESOLUTION');\n const [width, height] = resolution ? resolution.split('x') : [null, null];\n streamInfo.stream.width = Number(width) || undefined;\n streamInfo.stream.height = Number(height) || undefined;\n const bandwidth = tag.getAttributeValue('BANDWIDTH');\n if (bandwidth) {\n streamInfo.stream.bandwidth = Number(bandwidth);\n }\n\n this.uriToStreamInfosMap_.set(verbatimIFramePlaylistUri, streamInfo);\n return streamInfo;\n }\n\n /**\n * Parse an EXT-X-STREAM-INF media tag into a Stream object.\n *\n * @param {!Array<!shaka.hls.Tag>} tags\n * @param {!Array<string>} allCodecs\n * @param {string} type\n * @return {!shaka.hls.HlsParser.StreamInfo}\n * @private\n */\n createStreamInfoFromVariantTags_(tags, allCodecs, type) {\n const streamId = this.globalId_++;\n const verbatimMediaPlaylistUris = [];\n for (const tag of tags) {\n goog.asserts.assert(tag.name == 'EXT-X-STREAM-INF',\n 'Should only be called on variant tags!');\n const uri = tag.getRequiredAttrValue('URI');\n const pathwayId = tag.getAttributeValue('PATHWAY-ID');\n if (this.contentSteeringManager_ && pathwayId) {\n this.contentSteeringManager_.addLocation(streamId, pathwayId, uri);\n }\n verbatimMediaPlaylistUris.push(uri);\n }\n\n const key = verbatimMediaPlaylistUris.sort().join(',') +\n allCodecs.sort().join(',');\n if (this.uriToStreamInfosMap_.has(key)) {\n return this.uriToStreamInfosMap_.get(key);\n }\n\n const name = verbatimMediaPlaylistUris.join(',');\n const closedCaptions = this.getClosedCaptions_(tags[0], type);\n const codecs = shaka.util.ManifestParserUtils.guessCodecs(type, allCodecs);\n const streamInfo = this.createStreamInfo_(\n streamId, verbatimMediaPlaylistUris,\n codecs, type, /* language= */ null, /* primary= */ false,\n name, /* channelCount= */ null, closedCaptions,\n /* characteristics= */ null, /* forced= */ false,\n /* sampleRate= */ null, /* spatialAudio= */ false);\n\n this.uriToStreamInfosMap_.set(key, streamInfo);\n return streamInfo;\n }\n\n\n /**\n * @param {number} streamId\n * @param {!Array<string>} verbatimMediaPlaylistUris\n * @param {string} codecs\n * @param {string} type\n * @param {?string} languageValue\n * @param {boolean} primary\n * @param {?string} name\n * @param {?number} channelsCount\n * @param {Map<string, string>} closedCaptions\n * @param {?string} characteristics\n * @param {boolean} forced\n * @param {?number} sampleRate\n * @param {boolean} spatialAudio\n * @return {!shaka.hls.HlsParser.StreamInfo}\n * @private\n */\n createStreamInfo_(streamId, verbatimMediaPlaylistUris, codecs, type,\n languageValue, primary, name, channelsCount, closedCaptions,\n characteristics, forced, sampleRate, spatialAudio) {\n // TODO: Refactor, too many parameters\n\n // This stream is lazy-loaded inside the createSegmentIndex function.\n // So we start out with a stream object that does not contain the actual\n // segment index, then download when createSegmentIndex is called.\n const stream = this.makeStreamObject_(streamId, codecs, type,\n languageValue, primary, name, channelsCount, closedCaptions,\n characteristics, forced, sampleRate, spatialAudio);\n\n const FAKE_MUXED_URL_ = shaka.hls.HlsParser.FAKE_MUXED_URL_;\n if (verbatimMediaPlaylistUris.includes(FAKE_MUXED_URL_)) {\n stream.isAudioMuxedInVideo = true;\n // We assigned the TS mimetype because it is the only one that works\n // with this functionality. MP4 is not supported right now.\n stream.mimeType = 'video/mp2t';\n this.setFullTypeForStream_(stream);\n }\n\n const streamInfo = {\n stream,\n type,\n redirectUris: [],\n getUris: () => {},\n // These values are filled out or updated after lazy-loading:\n minTimestamp: 0,\n maxTimestamp: 0,\n mediaSequenceToStartTime: new Map(),\n canSkipSegments: false,\n canBlockReload: false,\n hasEndList: false,\n firstSequenceNumber: -1,\n nextMediaSequence: -1,\n nextPart: -1,\n loadedOnce: false,\n };\n\n const getUris = () => {\n if (this.contentSteeringManager_ &&\n verbatimMediaPlaylistUris.length > 1) {\n return this.contentSteeringManager_.getLocations(streamId);\n }\n return streamInfo.redirectUris.concat(shaka.hls.Utils.constructUris(\n [this.masterPlaylistUri_], verbatimMediaPlaylistUris,\n this.globalVariables_));\n };\n\n streamInfo.getUris = getUris;\n\n /** @param {!shaka.net.NetworkingEngine.PendingRequest} pendingRequest */\n const downloadSegmentIndex = async (pendingRequest) => {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n\n try {\n // Download the actual manifest.\n const response = await pendingRequest.promise;\n if (pendingRequest.aborted) {\n return;\n }\n\n // Record the final URI after redirects.\n const responseUri = response.uri;\n if (responseUri != response.originalUri) {\n const uris = streamInfo.getUris();\n if (!uris.includes(responseUri)) {\n streamInfo.redirectUris.push(responseUri);\n }\n }\n\n // Record the redirected, final URI of this media playlist when we parse\n // it.\n /** @type {!shaka.hls.Playlist} */\n const playlist = this.manifestTextParser_.parsePlaylist(response.data);\n\n if (playlist.type != shaka.hls.PlaylistType.MEDIA) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.HLS_INVALID_PLAYLIST_HIERARCHY);\n }\n\n /** @type {!Array<!shaka.hls.Tag>} */\n const variablesTags = shaka.hls.Utils.filterTagsByName(playlist.tags,\n 'EXT-X-DEFINE');\n\n const mediaVariables =\n this.parseMediaVariables_(variablesTags, responseUri);\n\n const mimeType = undefined;\n\n let requestBasicInfo = false;\n\n // If no codec info was provided in the manifest and codec guessing is\n // disabled we try to get necessary info from the media data.\n if ((!this.codecInfoInManifest_ &&\n this.config_.hls.disableCodecGuessing) ||\n (this.needsClosedCaptionsDetection_ && type == ContentType.VIDEO &&\n !this.config_.hls.disableClosedCaptionsDetection)) {\n if (playlist.segments.length > 0) {\n this.needsClosedCaptionsDetection_ = false;\n requestBasicInfo = true;\n }\n }\n\n const allowOverrideMimeType = !this.codecInfoInManifest_ &&\n this.config_.hls.disableCodecGuessing;\n\n const wasLive = this.isLive_();\n const realStreamInfo = await this.convertParsedPlaylistIntoStreamInfo_(\n streamId, mediaVariables, playlist, getUris, responseUri, codecs,\n type, languageValue, primary, name, channelsCount, closedCaptions,\n characteristics, forced, sampleRate, spatialAudio, mimeType,\n requestBasicInfo, allowOverrideMimeType);\n if (pendingRequest.aborted) {\n return;\n }\n\n const realStream = realStreamInfo.stream;\n\n this.determineStartTime_(playlist);\n\n if (this.isLive_() && !wasLive) {\n // Now that we know that the presentation is live, convert the\n // timeline to live.\n this.changePresentationTimelineToLive_(playlist);\n }\n\n // Copy values from the real stream info to our initial one.\n streamInfo.minTimestamp = realStreamInfo.minTimestamp;\n streamInfo.maxTimestamp = realStreamInfo.maxTimestamp;\n streamInfo.canSkipSegments = realStreamInfo.canSkipSegments;\n streamInfo.canBlockReload = realStreamInfo.canBlockReload;\n streamInfo.hasEndList = realStreamInfo.hasEndList;\n streamInfo.mediaSequenceToStartTime =\n realStreamInfo.mediaSequenceToStartTime;\n streamInfo.nextMediaSequence = realStreamInfo.nextMediaSequence;\n streamInfo.nextPart = realStreamInfo.nextPart;\n streamInfo.loadedOnce = true;\n stream.segmentIndex = realStream.segmentIndex;\n stream.encrypted = realStream.encrypted;\n stream.drmInfos = realStream.drmInfos;\n stream.keyIds = realStream.keyIds;\n stream.mimeType = realStream.mimeType;\n stream.bandwidth = stream.bandwidth || realStream.bandwidth;\n stream.codecs = stream.codecs || realStream.codecs;\n stream.closedCaptions =\n stream.closedCaptions || realStream.closedCaptions;\n stream.width = stream.width || realStream.width;\n stream.height = stream.height || realStream.height;\n stream.hdr = stream.hdr || realStream.hdr;\n stream.colorGamut = stream.colorGamut || realStream.colorGamut;\n stream.frameRate = stream.frameRate || realStream.frameRate;\n if (stream.language == 'und' && realStream.language != 'und') {\n stream.language = realStream.language;\n }\n stream.language = stream.language || realStream.language;\n stream.channelsCount = stream.channelsCount || realStream.channelsCount;\n stream.audioSamplingRate =\n stream.audioSamplingRate || realStream.audioSamplingRate;\n this.setFullTypeForStream_(stream);\n\n // Since we lazy-loaded this content, the player may need to create new\n // sessions for the DRM info in this stream.\n if (stream.drmInfos.length) {\n this.playerInterface_.newDrmInfo(stream);\n }\n\n let closedCaptionsUpdated = false;\n if ((!closedCaptions && stream.closedCaptions) ||\n (closedCaptions && stream.closedCaptions &&\n closedCaptions.size != stream.closedCaptions.size)) {\n closedCaptionsUpdated = true;\n }\n\n if (this.manifest_ && closedCaptionsUpdated) {\n this.playerInterface_.makeTextStreamsForClosedCaptions(\n this.manifest_);\n }\n\n if (type == ContentType.VIDEO || type == ContentType.AUDIO) {\n for (const otherStreamInfo of this.uriToStreamInfosMap_.values()) {\n if (!otherStreamInfo.loadedOnce && otherStreamInfo.type == type) {\n // To aid manifest filtering, assume before loading that all video\n // renditions have the same MIME type. (And likewise for audio.)\n otherStreamInfo.stream.mimeType = realStream.mimeType;\n this.setFullTypeForStream_(otherStreamInfo.stream);\n }\n }\n }\n\n if (type == ContentType.TEXT) {\n const firstSegment = realStream.segmentIndex.earliestReference();\n if (firstSegment && firstSegment.initSegmentReference) {\n stream.mimeType = 'application/mp4';\n this.setFullTypeForStream_(stream);\n }\n }\n\n const qualityInfo =\n shaka.media.QualityObserver.createQualityInfo(stream);\n stream.segmentIndex.forEachTopLevelReference((reference) => {\n if (reference.initSegmentReference) {\n reference.initSegmentReference.mediaQuality = qualityInfo;\n }\n });\n\n // Add finishing touches to the stream that can only be done once we\n // have more full context on the media as a whole.\n if (this.hasEnoughInfoToFinalizeStreams_()) {\n if (!this.streamsFinalized_) {\n // Mark this manifest as having been finalized, so we don't go\n // through this whole process of finishing touches a second time.\n this.streamsFinalized_ = true;\n // Finalize all of the currently-loaded streams.\n const streamInfos = Array.from(this.uriToStreamInfosMap_.values());\n const activeStreamInfos =\n streamInfos.filter((s) => s.stream.segmentIndex);\n this.finalizeStreams_(activeStreamInfos);\n // With the addition of this new stream, we now have enough info to\n // figure out how long the streams should be. So process all streams\n // we have downloaded up until this point.\n this.determineDuration_();\n // Finally, start the update timer, if this asset has been\n // determined to be a livestream.\n const delay = this.getUpdatePlaylistDelay_();\n if (delay > 0) {\n this.updatePlaylistTimer_.tickAfter(/* seconds= */ delay);\n }\n } else {\n // We don't need to go through the full process; just finalize this\n // single stream.\n this.finalizeStreams_([streamInfo]);\n }\n }\n\n this.processDateRangeTags_(\n playlist.tags, stream.type, mediaVariables, getUris);\n\n if (this.manifest_) {\n this.manifest_.startTime = this.startTime_;\n }\n } catch (e) {\n stream.closeSegmentIndex();\n if (e.code === shaka.util.Error.Code.OPERATION_ABORTED) {\n return;\n }\n const handled = this.playerInterface_.disableStream(stream);\n if (!handled) {\n throw e;\n }\n }\n };\n\n /** @type {Promise} */\n let creationPromise = null;\n /** @type {!shaka.net.NetworkingEngine.PendingRequest} */\n let pendingRequest;\n const safeCreateSegmentIndex = () => {\n // An operation is already in progress. The second and subsequent\n // callers receive the same Promise as the first caller, and only one\n // download operation will occur.\n if (creationPromise) {\n return creationPromise;\n }\n\n if (stream.isAudioMuxedInVideo) {\n const segmentIndex = new shaka.media.SegmentIndex([]);\n stream.segmentIndex = segmentIndex;\n return Promise.resolve();\n }\n\n // Create a new PendingRequest to be able to cancel this specific\n // download.\n pendingRequest = this.requestManifest_(streamInfo.getUris(),\n /* isPlaylist= */ true);\n\n // Create a Promise tied to the outcome of downloadSegmentIndex(). If\n // downloadSegmentIndex is rejected, creationPromise will also be\n // rejected.\n creationPromise = new Promise((resolve) => {\n resolve(downloadSegmentIndex(pendingRequest));\n });\n return creationPromise;\n };\n\n stream.createSegmentIndex = safeCreateSegmentIndex;\n\n stream.closeSegmentIndex = () => {\n // If we're mid-creation, cancel it.\n if (creationPromise && !stream.segmentIndex) {\n pendingRequest.abort();\n }\n // If we have a segment index, release it.\n if (stream.segmentIndex) {\n stream.segmentIndex.release();\n stream.segmentIndex = null;\n }\n // Clear the creation Promise so that a new operation can begin.\n creationPromise = null;\n };\n\n return streamInfo;\n }\n\n /**\n * @return {number}\n * @private\n */\n getMinDuration_() {\n let minDuration = Infinity;\n for (const streamInfo of this.uriToStreamInfosMap_.values()) {\n if (streamInfo.stream.segmentIndex && streamInfo.stream.type != 'text' &&\n !streamInfo.stream.isAudioMuxedInVideo) {\n // Since everything is already offset to 0 (either by sync or by being\n // VOD), only maxTimestamp is necessary to compute the duration.\n minDuration = Math.min(minDuration, streamInfo.maxTimestamp);\n }\n }\n return minDuration;\n }\n\n /**\n * @return {number}\n * @private\n */\n getLiveDuration_() {\n let maxTimestamp = Infinity;\n let minTimestamp = Infinity;\n for (const streamInfo of this.uriToStreamInfosMap_.values()) {\n if (streamInfo.stream.segmentIndex && streamInfo.stream.type != 'text' &&\n !streamInfo.stream.isAudioMuxedInVideo) {\n maxTimestamp = Math.min(maxTimestamp, streamInfo.maxTimestamp);\n minTimestamp = Math.min(minTimestamp, streamInfo.minTimestamp);\n }\n }\n return maxTimestamp - minTimestamp;\n }\n\n /**\n * @param {!Array<!shaka.extern.Stream>} streams\n * @private\n */\n notifySegmentsForStreams_(streams) {\n const references = [];\n for (const stream of streams) {\n if (!stream.segmentIndex) {\n // The stream was closed since the list of streams was built.\n continue;\n }\n stream.segmentIndex.forEachTopLevelReference((reference) => {\n references.push(reference);\n });\n }\n this.presentationTimeline_.notifySegments(references);\n }\n\n /**\n * @param {!Array<!shaka.hls.HlsParser.StreamInfo>} streamInfos\n * @private\n */\n finalizeStreams_(streamInfos) {\n if (!this.isLive_()) {\n const minDuration = this.getMinDuration_();\n for (const streamInfo of streamInfos) {\n streamInfo.stream.segmentIndex.fit(/* periodStart= */ 0, minDuration);\n }\n }\n this.notifySegmentsForStreams_(streamInfos.map((s) => s.stream));\n\n const activeStreamInfos = Array.from(this.uriToStreamInfosMap_.values())\n .filter((s) => s.stream.segmentIndex);\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n const hasAudio =\n activeStreamInfos.some((s) => s.stream.type == ContentType.AUDIO);\n const hasVideo =\n activeStreamInfos.some((s) => s.stream.type == ContentType.VIDEO);\n\n const liveWithNoProgramDateTime =\n this.isLive_() && !this.usesProgramDateTime_;\n const vodWithOnlyAudioOrVideo = !this.isLive_() &&\n this.usesProgramDateTime_ && !(hasAudio && hasVideo);\n if (this.config_.hls.ignoreManifestProgramDateTime ||\n liveWithNoProgramDateTime || vodWithOnlyAudioOrVideo) {\n this.syncStreamsWithSequenceNumber_(\n streamInfos, liveWithNoProgramDateTime);\n } else {\n this.syncStreamsWithProgramDateTime_(streamInfos);\n if (this.config_.hls.ignoreManifestProgramDateTimeForTypes.length > 0) {\n this.syncStreamsWithSequenceNumber_(streamInfos);\n }\n }\n }\n\n /**\n * @param {string} type\n * @return {boolean}\n * @private\n */\n ignoreManifestProgramDateTimeFor_(type) {\n if (this.config_.hls.ignoreManifestProgramDateTime) {\n return true;\n }\n const forTypes = this.config_.hls.ignoreManifestProgramDateTimeForTypes;\n return forTypes.includes(type);\n }\n\n /**\n * There are some values on streams that can only be set once we know about\n * both the video and audio content, if present.\n * This checks if there is at least one video downloaded (if the media has\n * video), and that there is at least one audio downloaded (if the media has\n * audio).\n * @return {boolean}\n * @private\n */\n hasEnoughInfoToFinalizeStreams_() {\n if (!this.manifest_) {\n return false;\n }\n const videos = [];\n const audios = [];\n for (const variant of this.manifest_.variants) {\n if (variant.video) {\n videos.push(variant.video);\n }\n if (variant.audio) {\n audios.push(variant.audio);\n }\n }\n if (videos.length > 0 && !videos.some((stream) => stream.segmentIndex)) {\n return false;\n }\n if (audios.length > 0 && !audios.some((stream) => stream.segmentIndex)) {\n return false;\n }\n return true;\n }\n\n /**\n * @param {number} streamId\n * @param {!Map<string, string>} variables\n * @param {!shaka.hls.Playlist} playlist\n * @param {function(): !Array<string>} getUris\n * @param {string} responseUri\n * @param {string} codecs\n * @param {string} type\n * @param {?string} languageValue\n * @param {boolean} primary\n * @param {?string} name\n * @param {?number} channelsCount\n * @param {Map<string, string>} closedCaptions\n * @param {?string} characteristics\n * @param {boolean} forced\n * @param {?number} sampleRate\n * @param {boolean} spatialAudio\n * @param {(string|undefined)} mimeType\n * @param {boolean=} requestBasicInfo\n * @param {boolean=} allowOverrideMimeType\n * @return {!Promise<!shaka.hls.HlsParser.StreamInfo>}\n * @private\n */\n async convertParsedPlaylistIntoStreamInfo_(streamId, variables, playlist,\n getUris, responseUri, codecs, type, languageValue, primary, name,\n channelsCount, closedCaptions, characteristics, forced, sampleRate,\n spatialAudio, mimeType = undefined, requestBasicInfo = true,\n allowOverrideMimeType = true) {\n const playlistSegments = playlist.segments || [];\n const allAreMissing = playlistSegments.every((seg) => {\n if (shaka.hls.Utils.getFirstTagWithName(seg.tags, 'EXT-X-GAP')) {\n return true;\n }\n return false;\n });\n\n if (!playlistSegments.length || allAreMissing) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.HLS_EMPTY_MEDIA_PLAYLIST);\n }\n\n this.determinePresentationType_(playlist);\n\n if (this.isLive_()) {\n this.determineLastTargetDuration_(playlist);\n }\n\n const mediaSequenceToStartTime = this.isLive_() ?\n this.mediaSequenceToStartTimeByType_.get(type) : new Map();\n\n const {segments, bandwidth} = this.createSegments_(\n playlist, mediaSequenceToStartTime, variables, getUris, type);\n\n let width = null;\n let height = null;\n let videoRange = null;\n let colorGamut = null;\n let frameRate = null;\n if (segments.length > 0 && requestBasicInfo) {\n const basicInfo = await this.getBasicInfoFromSegments_(segments);\n\n type = basicInfo.type;\n languageValue = basicInfo.language;\n channelsCount = basicInfo.channelCount;\n sampleRate = basicInfo.sampleRate;\n if (!this.config_.disableText) {\n closedCaptions = basicInfo.closedCaptions;\n }\n\n height = basicInfo.height;\n width = basicInfo.width;\n videoRange = basicInfo.videoRange;\n colorGamut = basicInfo.colorGamut;\n frameRate = basicInfo.frameRate;\n\n if (allowOverrideMimeType) {\n mimeType = basicInfo.mimeType;\n codecs = basicInfo.codecs;\n }\n }\n\n if (!mimeType) {\n mimeType = await this.guessMimeType_(type, codecs, segments);\n\n // Some manifests don't say what text codec they use, this is a problem\n // if the cmft extension is used because we identify the mimeType as\n // application/mp4. In this case if we don't detect initialization\n // segments, we assume that the mimeType is text/vtt.\n if (type == shaka.util.ManifestParserUtils.ContentType.TEXT &&\n !codecs && mimeType == 'application/mp4' &&\n segments[0] && !segments[0].initSegmentReference) {\n mimeType = 'text/vtt';\n }\n }\n\n const {drmInfos, keyIds, encrypted, aesEncrypted} =\n await this.parseDrmInfo_(playlist, mimeType, getUris, variables);\n\n if (encrypted && !drmInfos.length && !aesEncrypted) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.HLS_KEYFORMATS_NOT_SUPPORTED);\n }\n\n const stream = this.makeStreamObject_(streamId, codecs, type,\n languageValue, primary, name, channelsCount, closedCaptions,\n characteristics, forced, sampleRate, spatialAudio);\n stream.encrypted = encrypted && !aesEncrypted;\n stream.drmInfos = drmInfos;\n stream.keyIds = keyIds;\n stream.mimeType = mimeType;\n if (bandwidth) {\n stream.bandwidth = bandwidth;\n }\n this.setFullTypeForStream_(stream);\n\n if (type == shaka.util.ManifestParserUtils.ContentType.VIDEO &&\n (width || height || videoRange || colorGamut)) {\n this.addVideoAttributes_(stream, width, height,\n frameRate, videoRange, /* videoLayout= */ null, colorGamut);\n }\n\n // This new calculation is necessary for Low Latency streams.\n if (this.isLive_()) {\n this.determineLastTargetDuration_(playlist);\n }\n\n const firstStartTime = segments[0].startTime;\n const lastSegment = segments[segments.length - 1];\n const lastEndTime = lastSegment.endTime;\n /** @type {!shaka.media.SegmentIndex} */\n const segmentIndex = new shaka.media.SegmentIndex(segments);\n stream.segmentIndex = segmentIndex;\n\n const serverControlTag = shaka.hls.Utils.getFirstTagWithName(\n playlist.tags, 'EXT-X-SERVER-CONTROL');\n const canSkipSegments = serverControlTag ?\n serverControlTag.getAttribute('CAN-SKIP-UNTIL') != null : false;\n const canBlockReload = serverControlTag ?\n serverControlTag.getAttribute('CAN-BLOCK-RELOAD') != null : false;\n\n const mediaSequenceNumber = shaka.hls.Utils.getFirstTagWithNameAsNumber(\n playlist.tags, 'EXT-X-MEDIA-SEQUENCE', 0);\n\n const {nextMediaSequence, nextPart} =\n this.getNextMediaSequenceAndPart_(mediaSequenceNumber, segments);\n\n return {\n stream,\n type,\n redirectUris: [],\n getUris,\n minTimestamp: firstStartTime,\n maxTimestamp: lastEndTime,\n canSkipSegments,\n canBlockReload,\n hasEndList: false,\n firstSequenceNumber: -1,\n nextMediaSequence,\n nextPart,\n mediaSequenceToStartTime,\n loadedOnce: false,\n };\n }\n\n /**\n * Get the next msn and part\n *\n * @param {number} mediaSequenceNumber\n * @param {!Array<!shaka.media.SegmentReference>} segments\n * @return {{nextMediaSequence: number, nextPart:number}}}\n * @private\n */\n getNextMediaSequenceAndPart_(mediaSequenceNumber, segments) {\n const currentMediaSequence = mediaSequenceNumber + segments.length - 1;\n let nextMediaSequence = currentMediaSequence;\n let nextPart = -1;\n if (!segments.length) {\n nextMediaSequence++;\n return {\n nextMediaSequence,\n nextPart,\n };\n }\n const lastSegment = segments[segments.length - 1];\n const partialReferences = lastSegment.partialReferences;\n if (!lastSegment.partialReferences.length) {\n nextMediaSequence++;\n if (lastSegment.hasByterangeOptimization()) {\n nextPart = 0;\n }\n return {\n nextMediaSequence,\n nextPart,\n };\n }\n nextPart = partialReferences.length - 1;\n const lastPartialReference =\n partialReferences[partialReferences.length - 1];\n if (!lastPartialReference.isPreload()) {\n nextMediaSequence++;\n nextPart = 0;\n }\n return {\n nextMediaSequence,\n nextPart,\n };\n }\n\n\n /**\n * Creates a stream object with the given parameters.\n * The parameters that are passed into here are only the things that can be\n * known without downloading the media playlist; other values must be set\n * manually on the object after creation.\n * @param {number} id\n * @param {string} codecs\n * @param {string} type\n * @param {?string} languageValue\n * @param {boolean} primary\n * @param {?string} name\n * @param {?number} channelsCount\n * @param {Map<string, string>} closedCaptions\n * @param {?string} characteristics\n * @param {boolean} forced\n * @param {?number} sampleRate\n * @param {boolean} spatialAudio\n * @return {!shaka.extern.Stream}\n * @private\n */\n makeStreamObject_(id, codecs, type, languageValue, primary, name,\n channelsCount, closedCaptions, characteristics, forced, sampleRate,\n spatialAudio) {\n // Fill out a \"best-guess\" mimeType, for now. It will be replaced once the\n // stream is lazy-loaded.\n const mimeType = this.guessMimeTypeBeforeLoading_(type, codecs) ||\n this.guessMimeTypeFallback_(type);\n const roles = [];\n if (characteristics) {\n for (const characteristic of characteristics.split(',')) {\n roles.push(characteristic);\n }\n }\n\n let kind = undefined;\n let accessibilityPurpose = null;\n if (type == shaka.util.ManifestParserUtils.ContentType.TEXT) {\n if (roles.includes('public.accessibility.transcribes-spoken-dialog') &&\n roles.includes('public.accessibility.describes-music-and-sound')) {\n kind = shaka.util.ManifestParserUtils.TextStreamKind.CLOSED_CAPTION;\n } else {\n kind = shaka.util.ManifestParserUtils.TextStreamKind.SUBTITLE;\n }\n } else {\n if (roles.includes('public.accessibility.describes-video')) {\n accessibilityPurpose =\n shaka.media.ManifestParser.AccessibilityPurpose.VISUALLY_IMPAIRED;\n }\n }\n\n // If there are no roles, and we have defaulted to the subtitle \"kind\" for\n // this track, add the implied subtitle role.\n if (!roles.length &&\n kind === shaka.util.ManifestParserUtils.TextStreamKind.SUBTITLE) {\n roles.push(shaka.util.ManifestParserUtils.TextStreamKind.SUBTITLE);\n }\n\n const stream = {\n id: this.globalId_++,\n originalId: name,\n groupId: null,\n createSegmentIndex: () => Promise.resolve(),\n segmentIndex: null,\n mimeType,\n codecs,\n kind: (type == shaka.util.ManifestParserUtils.ContentType.TEXT) ?\n shaka.util.ManifestParserUtils.TextStreamKind.SUBTITLE : undefined,\n encrypted: false,\n drmInfos: [],\n keyIds: new Set(),\n language: this.getLanguage_(languageValue),\n originalLanguage: languageValue,\n label: name, // For historical reasons, since before \"originalId\".\n type,\n primary,\n // TODO: trick mode\n trickModeVideo: null,\n dependencyStream: null,\n emsgSchemeIdUris: null,\n frameRate: undefined,\n pixelAspectRatio: undefined,\n width: undefined,\n height: undefined,\n bandwidth: undefined,\n roles,\n forced,\n channelsCount,\n audioSamplingRate: sampleRate,\n spatialAudio,\n closedCaptions,\n hdr: undefined,\n colorGamut: undefined,\n videoLayout: undefined,\n tilesLayout: undefined,\n accessibilityPurpose: accessibilityPurpose,\n external: false,\n fastSwitching: false,\n fullMimeTypes: new Set(),\n isAudioMuxedInVideo: false,\n baseOriginalId: null,\n };\n this.setFullTypeForStream_(stream);\n return stream;\n }\n\n /**\n * @param {!shaka.hls.Playlist} playlist\n * @param {string} mimeType\n * @param {function(): !Array<string>} getUris\n * @param {?Map<string, string>=} variables\n * @return {Promise<{\n * drmInfos: !Array<shaka.extern.DrmInfo>,\n * keyIds: !Set<string>,\n * encrypted: boolean,\n * aesEncrypted: boolean\n * }>}\n * @private\n */\n async parseDrmInfo_(playlist, mimeType, getUris, variables) {\n /** @type {!Map<!shaka.hls.Tag, ?shaka.media.InitSegmentReference>} */\n const drmTagsMap = new Map();\n if (!this.config_.ignoreDrmInfo && playlist.segments) {\n for (const segment of playlist.segments) {\n const segmentKeyTags = shaka.hls.Utils.filterTagsByName(segment.tags,\n 'EXT-X-KEY');\n let initSegmentRef = null;\n if (segmentKeyTags.length) {\n initSegmentRef = this.getInitSegmentReference_(playlist,\n segment.tags, getUris, variables);\n for (const segmentKeyTag of segmentKeyTags) {\n drmTagsMap.set(segmentKeyTag, initSegmentRef);\n }\n }\n }\n }\n\n let encrypted = false;\n let aesEncrypted = false;\n\n /** @type {!Array<shaka.extern.DrmInfo>}*/\n const drmInfos = [];\n const keyIds = new Set();\n\n for (const [key, value] of drmTagsMap) {\n const drmTag = /** @type {!shaka.hls.Tag} */ (key);\n const initSegmentRef =\n /** @type {?shaka.media.InitSegmentReference} */ (value);\n const method = drmTag.getRequiredAttrValue('METHOD');\n if (method != 'NONE') {\n encrypted = true;\n\n // According to the HLS spec, KEYFORMAT is optional and implicitly\n // defaults to \"identity\".\n // https://datatracker.ietf.org/doc/html/draft-pantos-hls-rfc8216bis-11#section-4.4.4.4\n const keyFormat =\n drmTag.getAttributeValue('KEYFORMAT') || 'identity';\n let drmInfo = null;\n\n if (this.isAesMethod_(method)) {\n // These keys are handled separately.\n aesEncrypted = true;\n continue;\n } else if (keyFormat == 'identity') {\n // eslint-disable-next-line no-await-in-loop\n drmInfo = await this.identityDrmParser_(\n drmTag, mimeType, getUris, initSegmentRef, variables);\n } else {\n const drmParser =\n shaka.hls.HlsParser.KEYFORMATS_TO_DRM_PARSERS_.get(keyFormat);\n drmInfo = drmParser ? drmParser(drmTag, mimeType) : null;\n }\n if (drmInfo) {\n if (drmInfo.keyIds) {\n for (const keyId of drmInfo.keyIds) {\n keyIds.add(keyId);\n }\n }\n drmInfos.push(drmInfo);\n } else {\n shaka.log.warning('Unsupported HLS KEYFORMAT', keyFormat);\n }\n }\n }\n\n return {drmInfos, keyIds, encrypted, aesEncrypted};\n }\n\n /**\n * @param {!shaka.hls.Tag} drmTag\n * @param {!shaka.hls.Playlist} playlist\n * @param {function(): !Array<string>} getUris\n * @param {?Map<string, string>=} variables\n * @return {!shaka.extern.aesKey}\n * @private\n */\n parseAESDrmTag_(drmTag, playlist, getUris, variables) {\n // Check if the Web Crypto API is available.\n if (!window.crypto || !window.crypto.subtle) {\n shaka.log.alwaysWarn('Web Crypto API is not available to decrypt ' +\n 'AES. (Web Crypto only exists in secure origins like https)');\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.NO_WEB_CRYPTO_API);\n }\n\n // HLS RFC 8216 Section 5.2:\n // An EXT-X-KEY tag with a KEYFORMAT of \"identity\" that does not have an IV\n // attribute indicates that the Media Sequence Number is to be used as the\n // IV when decrypting a Media Segment, by putting its big-endian binary\n // representation into a 16-octet (128-bit) buffer and padding (on the left)\n // with zeros.\n let firstMediaSequenceNumber = 0;\n let iv;\n const ivHex = drmTag.getAttributeValue('IV', '');\n if (!ivHex) {\n // Media Sequence Number will be used as IV.\n firstMediaSequenceNumber = shaka.hls.Utils.getFirstTagWithNameAsNumber(\n playlist.tags, 'EXT-X-MEDIA-SEQUENCE', 0);\n } else {\n // Exclude 0x at the start of string.\n iv = shaka.util.Uint8ArrayUtils.fromHex(ivHex.substr(2));\n if (iv.byteLength != 16) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.AES_128_INVALID_IV_LENGTH);\n }\n }\n\n const keyUris = shaka.hls.Utils.constructSegmentUris(\n getUris(), drmTag.getRequiredAttrValue('URI'), variables);\n const keyMapKey = keyUris.sort().join('');\n const aesKeyInfoKey =\n `${drmTag.toString()}-${firstMediaSequenceNumber}-${keyMapKey}`;\n if (!this.aesKeyInfoMap_.has(aesKeyInfoKey)) {\n // Default AES-128\n const keyInfo = {\n bitsKey: 128,\n blockCipherMode: 'CBC',\n iv,\n firstMediaSequenceNumber,\n };\n\n const method = drmTag.getRequiredAttrValue('METHOD');\n switch (method) {\n case 'AES-256':\n keyInfo.bitsKey = 256;\n break;\n case 'AES-256-CTR':\n keyInfo.bitsKey = 256;\n keyInfo.blockCipherMode = 'CTR';\n break;\n }\n\n // Don't download the key object until the segment is parsed, to avoid a\n // startup delay for long manifests with lots of keys.\n keyInfo.fetchKey = async () => {\n if (!this.aesKeyMap_.has(keyMapKey)) {\n const requestType = shaka.net.NetworkingEngine.RequestType.KEY;\n const request = shaka.net.NetworkingEngine.makeRequest(\n keyUris, this.config_.retryParameters);\n const keyResponse = this.makeNetworkRequest_(request, requestType)\n .promise;\n this.aesKeyMap_.set(keyMapKey, keyResponse);\n }\n const keyResponse = await this.aesKeyMap_.get(keyMapKey);\n\n // keyResponse.status is undefined when URI is \"data:text/plain;base64,\"\n if (!keyResponse.data ||\n keyResponse.data.byteLength != (keyInfo.bitsKey / 8)) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.AES_128_INVALID_KEY_LENGTH);\n }\n\n const algorithm = {\n name: keyInfo.blockCipherMode == 'CTR' ? 'AES-CTR' : 'AES-CBC',\n length: keyInfo.bitsKey,\n };\n keyInfo.cryptoKey = await window.crypto.subtle.importKey(\n 'raw', keyResponse.data, algorithm, true, ['decrypt']);\n keyInfo.fetchKey = undefined; // No longer needed.\n };\n this.aesKeyInfoMap_.set(aesKeyInfoKey, keyInfo);\n }\n return this.aesKeyInfoMap_.get(aesKeyInfoKey);\n }\n\n\n /**\n * @param {!shaka.hls.Playlist} playlist\n * @private\n */\n determineStartTime_(playlist) {\n // If we already have a starttime we avoid processing this again.\n if (this.startTime_ != null) {\n return;\n }\n const startTimeTag =\n shaka.hls.Utils.getFirstTagWithName(playlist.tags, 'EXT-X-START');\n if (startTimeTag) {\n this.startTime_ =\n Number(startTimeTag.getRequiredAttrValue('TIME-OFFSET'));\n }\n }\n\n\n /**\n * @param {!shaka.hls.Playlist} playlist\n * @private\n */\n determinePresentationType_(playlist) {\n const PresentationType = shaka.hls.HlsParser.PresentationType_;\n const presentationTypeTag =\n shaka.hls.Utils.getFirstTagWithName(playlist.tags,\n 'EXT-X-PLAYLIST-TYPE');\n const endListTag =\n shaka.hls.Utils.getFirstTagWithName(playlist.tags, 'EXT-X-ENDLIST');\n\n const isVod = (presentationTypeTag && presentationTypeTag.value == 'VOD') ||\n endListTag;\n const isEvent = presentationTypeTag &&\n presentationTypeTag.value == 'EVENT' && !isVod;\n const isLive = !isVod && !isEvent;\n\n if (isVod) {\n this.setPresentationType_(PresentationType.VOD);\n } else {\n // If it's not VOD, it must be presentation type LIVE or an ongoing EVENT.\n if (isLive) {\n this.setPresentationType_(PresentationType.LIVE);\n } else {\n this.setPresentationType_(PresentationType.EVENT);\n }\n }\n }\n\n\n /**\n * @param {!shaka.hls.Playlist} playlist\n * @private\n */\n determineLastTargetDuration_(playlist) {\n let lastTargetDuration = Infinity;\n const segments = playlist.segments;\n if (segments.length) {\n let segmentIndex = segments.length - 1;\n while (segmentIndex >= 0) {\n const segment = segments[segmentIndex];\n const extinfTag =\n shaka.hls.Utils.getFirstTagWithName(segment.tags, 'EXTINF');\n if (extinfTag) {\n // The EXTINF tag format is '#EXTINF:<duration>,[<title>]'.\n // We're interested in the duration part.\n const extinfValues = extinfTag.value.split(',');\n lastTargetDuration = Number(extinfValues[0]);\n break;\n }\n segmentIndex--;\n }\n }\n\n const targetDurationTag = this.getRequiredTag_(playlist.tags,\n 'EXT-X-TARGETDURATION');\n const targetDuration = Number(targetDurationTag.value);\n const partialTargetDurationTag =\n shaka.hls.Utils.getFirstTagWithName(playlist.tags, 'EXT-X-PART-INF');\n if (partialTargetDurationTag) {\n this.partialTargetDuration_ = Number(\n partialTargetDurationTag.getRequiredAttrValue('PART-TARGET'));\n }\n // Get the server-recommended min distance from the live edge.\n const serverControlTag = shaka.hls.Utils.getFirstTagWithName(\n playlist.tags, 'EXT-X-SERVER-CONTROL');\n // According to the HLS spec, updates should not happen more often than\n // once in targetDuration. It also requires us to only update the active\n // variant. We might implement that later, but for now every variant\n // will be updated. To get the update period, choose the smallest\n // targetDuration value across all playlists.\n // 1. Update the shortest one to use as update period and segment\n // availability time (for LIVE).\n if (this.lowLatencyMode_ && this.partialTargetDuration_) {\n // For low latency streaming, use the partial segment target duration.\n if (this.lowLatencyByterangeOptimization_) {\n // We always have at least 1 partial segment part, and most servers\n // allow you to make a request with _HLS_msn=X&_HLS_part=0 with a\n // distance of 4 partial segments. With this we ensure that we\n // obtain the minimum latency in this type of case.\n if (this.partialTargetDuration_ * 5 <= lastTargetDuration) {\n this.lastTargetDuration_ = Math.min(\n this.partialTargetDuration_, this.lastTargetDuration_);\n } else {\n this.lastTargetDuration_ = Math.min(\n lastTargetDuration, this.lastTargetDuration_);\n }\n } else {\n this.lastTargetDuration_ = Math.min(\n this.partialTargetDuration_, this.lastTargetDuration_);\n }\n // Use 'PART-HOLD-BACK' as the presentation delay for low latency mode.\n this.lowLatencyPresentationDelay_ = serverControlTag ? Number(\n serverControlTag.getRequiredAttrValue('PART-HOLD-BACK')) : 0;\n } else {\n this.lastTargetDuration_ = Math.min(\n lastTargetDuration, this.lastTargetDuration_);\n // Use 'HOLD-BACK' as the presentation delay for default if defined.\n const holdBack = serverControlTag ?\n serverControlTag.getAttribute('HOLD-BACK') : null;\n this.presentationDelay_ = holdBack ? Number(holdBack.value) : 0;\n }\n // 2. Update the longest target duration if need be to use as a\n // presentation delay later.\n this.maxTargetDuration_ = Math.max(\n targetDuration, this.maxTargetDuration_);\n }\n\n\n /**\n * @param {!shaka.hls.Playlist} playlist\n * @private\n */\n changePresentationTimelineToLive_(playlist) {\n // The live edge will be calculated from segments, so we don't need to\n // set a presentation start time. We will assert later that this is\n // working as expected.\n\n // The HLS spec (RFC 8216) states in 6.3.3:\n //\n // \"The client SHALL choose which Media Segment to play first ... the\n // client SHOULD NOT choose a segment that starts less than three target\n // durations from the end of the Playlist file. Doing so can trigger\n // playback stalls.\"\n //\n // We accomplish this in our DASH-y model by setting a presentation\n // delay of configured value, or 3 segments duration if not configured.\n // This will be the \"live edge\" of the presentation.\n let presentationDelay = 0;\n if (this.config_.defaultPresentationDelay) {\n presentationDelay = this.config_.defaultPresentationDelay;\n } else if (this.lowLatencyPresentationDelay_) {\n presentationDelay = this.lowLatencyPresentationDelay_;\n } else if (this.presentationDelay_) {\n presentationDelay = this.presentationDelay_;\n } else {\n const totalSegments = playlist.segments.length;\n let delaySegments = this.config_.hls.liveSegmentsDelay;\n if (delaySegments > (totalSegments - 2)) {\n delaySegments = Math.max(1, totalSegments - 2);\n }\n for (let i = totalSegments - delaySegments; i < totalSegments; i++) {\n const extinfTag = shaka.hls.Utils.getFirstTagWithName(\n playlist.segments[i].tags, 'EXTINF');\n if (extinfTag) {\n const extinfValues = extinfTag.value.split(',');\n const duration = Number(extinfValues[0]);\n presentationDelay += Math.ceil(duration);\n } else {\n presentationDelay += this.maxTargetDuration_;\n }\n }\n }\n\n if (this.startTime_ && this.startTime_ < 0) {\n presentationDelay = Math.min(-this.startTime_, presentationDelay);\n this.startTime_ += presentationDelay;\n }\n\n this.presentationTimeline_.setPresentationStartTime(0);\n this.presentationTimeline_.setDelay(presentationDelay);\n this.presentationTimeline_.setStatic(false);\n }\n\n /**\n * Get the InitSegmentReference for a segment if it has a EXT-X-MAP tag.\n * @param {!shaka.hls.Playlist} playlist\n * @param {!Array<!shaka.hls.Tag>} tags Segment tags\n * @param {function(): !Array<string>} getUris\n * @param {?Map<string, string>=} variables\n * @return {shaka.media.InitSegmentReference}\n * @private\n */\n getInitSegmentReference_(playlist, tags, getUris, variables) {\n /** @type {?shaka.hls.Tag} */\n const mapTag = shaka.hls.Utils.getFirstTagWithName(tags, 'EXT-X-MAP');\n\n if (!mapTag) {\n return null;\n }\n // Map tag example: #EXT-X-MAP:URI=\"main.mp4\",BYTERANGE=\"720@0\"\n const verbatimInitSegmentUri = mapTag.getRequiredAttrValue('URI');\n const absoluteInitSegmentUris = shaka.hls.Utils.constructSegmentUris(\n getUris(), verbatimInitSegmentUri, variables);\n\n const mapTagKey = [\n absoluteInitSegmentUris.toString(),\n mapTag.getAttributeValue('BYTERANGE', ''),\n ].join('-');\n if (!this.mapTagToInitSegmentRefMap_.has(mapTagKey)) {\n /** @type {shaka.extern.aesKey|undefined} */\n let aesKey = undefined;\n let byteRangeTag = null;\n let encrypted = false;\n for (const tag of tags) {\n if (tag.name == 'EXT-X-KEY') {\n const method = tag.getRequiredAttrValue('METHOD');\n if (this.isAesMethod_(method) && tag.id < mapTag.id) {\n encrypted = false;\n aesKey =\n this.parseAESDrmTag_(tag, playlist, getUris, variables);\n } else {\n encrypted = method != 'NONE';\n }\n } else if (tag.name == 'EXT-X-BYTERANGE' && tag.id < mapTag.id) {\n byteRangeTag = tag;\n }\n }\n const initSegmentRef = this.createInitSegmentReference_(\n absoluteInitSegmentUris, mapTag, byteRangeTag, aesKey, encrypted);\n this.mapTagToInitSegmentRefMap_.set(mapTagKey, initSegmentRef);\n }\n return this.mapTagToInitSegmentRefMap_.get(mapTagKey);\n }\n\n /**\n * Create an InitSegmentReference object for the EXT-X-MAP tag in the media\n * playlist.\n * @param {!Array<string>} absoluteInitSegmentUris\n * @param {!shaka.hls.Tag} mapTag EXT-X-MAP\n * @param {shaka.hls.Tag=} byteRangeTag EXT-X-BYTERANGE\n * @param {shaka.extern.aesKey=} aesKey\n * @param {boolean=} encrypted\n * @return {!shaka.media.InitSegmentReference}\n * @private\n */\n createInitSegmentReference_(absoluteInitSegmentUris, mapTag, byteRangeTag,\n aesKey, encrypted) {\n let startByte = 0;\n let endByte = null;\n let byterange = mapTag.getAttributeValue('BYTERANGE');\n if (!byterange && byteRangeTag) {\n byterange = byteRangeTag.value;\n }\n // If a BYTERANGE attribute is not specified, the segment consists\n // of the entire resource.\n if (byterange) {\n const blocks = byterange.split('@');\n const byteLength = Number(blocks[0]);\n startByte = Number(blocks[1]);\n endByte = startByte + byteLength - 1;\n\n if (aesKey) {\n // MAP segment encrypted with method AES, when served with\n // HTTP Range, has the unencrypted size specified in the range.\n // See: https://tools.ietf.org/html/draft-pantos-hls-rfc8216bis-08#section-6.3.6\n const length = (endByte + 1) - startByte;\n if (length % 16) {\n endByte += (16 - (length % 16));\n }\n }\n }\n\n const initSegmentRef = new shaka.media.InitSegmentReference(\n () => absoluteInitSegmentUris,\n startByte,\n endByte,\n /* mediaQuality= */ null,\n /* timescale= */ null,\n /* segmentData= */ null,\n aesKey,\n encrypted);\n return initSegmentRef;\n }\n\n /**\n * Parses one shaka.hls.Segment object into a shaka.media.SegmentReference.\n *\n * @param {shaka.media.InitSegmentReference} initSegmentReference\n * @param {shaka.media.SegmentReference} previousReference\n * @param {!shaka.hls.Segment} hlsSegment\n * @param {number} startTime\n * @param {!Map<string, string>} variables\n * @param {!shaka.hls.Playlist} playlist\n * @param {string} type\n * @param {function(): !Array<string>} getUris\n * @param {shaka.extern.aesKey=} aesKey\n * @return {shaka.media.SegmentReference}\n * @private\n */\n createSegmentReference_(\n initSegmentReference, previousReference, hlsSegment, startTime,\n variables, playlist, type, getUris, aesKey) {\n const HlsParser = shaka.hls.HlsParser;\n\n const getMimeType = (uri) => {\n const parsedUri = new goog.Uri(uri);\n const extension = parsedUri.getPath().split('.').pop();\n const map = HlsParser.EXTENSION_MAP_BY_CONTENT_TYPE_.get(type);\n let mimeType = map.get(extension);\n if (!mimeType) {\n mimeType = HlsParser.RAW_FORMATS_TO_MIME_TYPES_.get(extension);\n }\n return mimeType;\n };\n\n const tags = hlsSegment.tags;\n const extinfTag =\n shaka.hls.Utils.getFirstTagWithName(tags, 'EXTINF');\n\n let endTime = 0;\n let startByte = 0;\n let endByte = null;\n\n if (hlsSegment.partialSegments.length) {\n this.manifest_.isLowLatency = true;\n }\n\n let syncTime = null;\n if (!this.config_.hls.ignoreManifestProgramDateTime) {\n const dateTimeTag =\n shaka.hls.Utils.getFirstTagWithName(tags, 'EXT-X-PROGRAM-DATE-TIME');\n if (dateTimeTag && dateTimeTag.value) {\n syncTime = shaka.util.TXml.parseDate(dateTimeTag.value);\n goog.asserts.assert(syncTime != null,\n 'EXT-X-PROGRAM-DATE-TIME format not valid');\n this.usesProgramDateTime_ = true;\n }\n }\n\n let status = shaka.media.SegmentReference.Status.AVAILABLE;\n if (shaka.hls.Utils.getFirstTagWithName(tags, 'EXT-X-GAP')) {\n this.manifest_.gapCount++;\n status = shaka.media.SegmentReference.Status.MISSING;\n }\n\n if (!extinfTag) {\n if (hlsSegment.partialSegments.length == 0) {\n // EXTINF tag must be available if the segment has no partial segments.\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.HLS_REQUIRED_TAG_MISSING, 'EXTINF');\n } else if (!this.lowLatencyMode_) {\n // Without EXTINF and without low-latency mode, partial segments get\n // ignored.\n return null;\n }\n }\n\n // Create SegmentReferences for the partial segments.\n let partialSegmentRefs = [];\n\n // Optimization for LL-HLS with byterange\n // More info in https://tinyurl.com/hls-open-byte-range\n let segmentWithByteRangeOptimization = false;\n let getUrisOptimization = null;\n let somePartialSegmentWithGap = false;\n let isPreloadSegment = false;\n\n if (this.lowLatencyMode_ && hlsSegment.partialSegments.length) {\n const byterangeOptimizationSupport =\n initSegmentReference && window.ReadableStream &&\n this.config_.hls.allowLowLatencyByteRangeOptimization;\n\n let partialSyncTime = syncTime;\n for (let i = 0; i < hlsSegment.partialSegments.length; i++) {\n const item = hlsSegment.partialSegments[i];\n const pPreviousReference = i == 0 ?\n previousReference : partialSegmentRefs[partialSegmentRefs.length - 1];\n const pStartTime = (i == 0) ? startTime : pPreviousReference.endTime;\n\n // If DURATION is missing from this partial segment, use the target\n // partial duration from the top of the playlist, which is a required\n // attribute for content with partial segments.\n const pDuration = Number(item.getAttributeValue('DURATION')) ||\n this.partialTargetDuration_;\n\n // If for some reason we have neither an explicit duration, nor a target\n // partial duration, we should SKIP this partial segment to avoid\n // duplicating content in the presentation timeline.\n if (!pDuration) {\n continue;\n }\n\n const pEndTime = pStartTime + pDuration;\n\n let pStartByte = 0;\n let pEndByte = null;\n if (item.name == 'EXT-X-PRELOAD-HINT') {\n // A preload hinted partial segment may have byterange start info.\n const pByterangeStart = item.getAttributeValue('BYTERANGE-START');\n pStartByte = pByterangeStart ? Number(pByterangeStart) : 0;\n // A preload hinted partial segment may have byterange length info.\n const pByterangeLength = item.getAttributeValue('BYTERANGE-LENGTH');\n if (pByterangeLength) {\n pEndByte = pStartByte + Number(pByterangeLength) - 1;\n } else if (pStartByte) {\n // If we have a non-zero start byte, but no end byte, follow the\n // recommendation of https://tinyurl.com/hls-open-byte-range and\n // set the end byte explicitly to a large integer.\n pEndByte = Number.MAX_SAFE_INTEGER;\n }\n } else {\n const pByterange = item.getAttributeValue('BYTERANGE');\n [pStartByte, pEndByte] =\n this.parseByteRange_(pPreviousReference, pByterange);\n }\n const pUri = item.getAttributeValue('URI');\n if (!pUri) {\n continue;\n }\n\n let partialStatus = shaka.media.SegmentReference.Status.AVAILABLE;\n if (item.getAttributeValue('GAP') == 'YES') {\n this.manifest_.gapCount++;\n partialStatus = shaka.media.SegmentReference.Status.MISSING;\n somePartialSegmentWithGap = true;\n }\n\n let uris = null;\n const getPartialUris = () => {\n if (uris == null) {\n goog.asserts.assert(pUri, 'Partial uri should be defined!');\n uris = shaka.hls.Utils.constructSegmentUris(\n getUris(), pUri, variables);\n }\n return uris;\n };\n\n if (byterangeOptimizationSupport &&\n pStartByte >= 0 && pEndByte != null) {\n getUrisOptimization = getPartialUris;\n segmentWithByteRangeOptimization = true;\n }\n\n const partial = new shaka.media.SegmentReference(\n pStartTime,\n pEndTime,\n getPartialUris,\n pStartByte,\n pEndByte,\n initSegmentReference,\n /* timestampOffset= */ 0,\n /* appendWindowStart= */ 0,\n /* appendWindowEnd= */ Infinity,\n /* partialReferences= */ [],\n /* tilesLayout= */ '',\n /* tileDuration= */ null,\n partialSyncTime,\n partialStatus,\n aesKey);\n if (item.name == 'EXT-X-PRELOAD-HINT') {\n partial.markAsPreload();\n isPreloadSegment = true;\n }\n // The spec doesn't say that we can assume INDEPENDENT=YES for the\n // first partial segment. It does call the flag \"optional\", though, and\n // that cases where there are no such flags on any partial segments, it\n // is sensible to assume the first one is independent.\n if (item.getAttributeValue('INDEPENDENT') != 'YES' && i > 0) {\n partial.markAsNonIndependent();\n }\n\n const pMimeType = getMimeType(pUri);\n if (pMimeType) {\n partial.mimeType = pMimeType;\n if (HlsParser.MIME_TYPES_WITHOUT_INIT_SEGMENT_.has(pMimeType)) {\n partial.initSegmentReference = null;\n }\n }\n partialSegmentRefs.push(partial);\n\n if (partialSyncTime) {\n partialSyncTime += pDuration;\n }\n } // for-loop of hlsSegment.partialSegments\n }\n\n // If the segment has EXTINF tag, set the segment's end time, start byte\n // and end byte based on the duration and byterange information.\n // Otherwise, calculate the end time, start / end byte based on its partial\n // segments.\n // Note that the sum of partial segments durations may be slightly different\n // from the parent segment's duration. In this case, use the duration from\n // the parent segment tag.\n if (extinfTag) {\n // The EXTINF tag format is '#EXTINF:<duration>,[<title>]'.\n // We're interested in the duration part.\n const extinfValues = extinfTag.value.split(',');\n const duration = Number(extinfValues[0]);\n // Skip segments without duration\n if (duration == 0) {\n return null;\n }\n endTime = startTime + duration;\n } else if (partialSegmentRefs.length) {\n endTime = partialSegmentRefs[partialSegmentRefs.length - 1].endTime;\n } else {\n // Skip segments without duration and without partial segments\n return null;\n }\n\n if (segmentWithByteRangeOptimization) {\n // We cannot optimize segments with gaps, or with a start byte that is\n // not 0.\n if (somePartialSegmentWithGap || partialSegmentRefs[0].startByte != 0) {\n segmentWithByteRangeOptimization = false;\n getUrisOptimization = null;\n } else {\n partialSegmentRefs = [];\n }\n }\n\n // If the segment has EXT-X-BYTERANGE tag, set the start byte and end byte\n // base on the byterange information. If segment has no EXT-X-BYTERANGE tag\n // and has partial segments, set the start byte and end byte base on the\n // partial segments.\n const byterangeTag =\n shaka.hls.Utils.getFirstTagWithName(tags, 'EXT-X-BYTERANGE');\n if (byterangeTag) {\n [startByte, endByte] =\n this.parseByteRange_(previousReference, byterangeTag.value);\n } else if (partialSegmentRefs.length) {\n startByte = partialSegmentRefs[0].startByte;\n endByte = partialSegmentRefs[partialSegmentRefs.length - 1].endByte;\n }\n\n let tilesLayout = '';\n let tileDuration = null;\n if (type == shaka.util.ManifestParserUtils.ContentType.IMAGE) {\n // By default in HLS the tilesLayout is 1x1\n tilesLayout = '1x1';\n const tilesTag =\n shaka.hls.Utils.getFirstTagWithName(tags, 'EXT-X-TILES');\n if (tilesTag) {\n tilesLayout = tilesTag.getRequiredAttrValue('LAYOUT');\n const duration = tilesTag.getAttributeValue('DURATION');\n if (duration) {\n tileDuration = Number(duration);\n }\n }\n }\n\n let uris = null;\n const getSegmentUris = () => {\n if (getUrisOptimization) {\n return getUrisOptimization();\n }\n if (uris == null) {\n uris = shaka.hls.Utils.constructSegmentUris(getUris(),\n hlsSegment.verbatimSegmentUri, variables);\n }\n return uris || [];\n };\n\n const allPartialSegments = partialSegmentRefs.length > 0 &&\n !!hlsSegment.verbatimSegmentUri;\n\n const reference = new shaka.media.SegmentReference(\n startTime,\n endTime,\n getSegmentUris,\n startByte,\n endByte,\n initSegmentReference,\n /* timestampOffset= */ 0,\n /* appendWindowStart= */ 0,\n /* appendWindowEnd= */ Infinity,\n partialSegmentRefs,\n tilesLayout,\n tileDuration,\n syncTime,\n status,\n aesKey,\n allPartialSegments,\n );\n\n const mimeType = getMimeType(hlsSegment.verbatimSegmentUri);\n if (mimeType) {\n reference.mimeType = mimeType;\n if (HlsParser.MIME_TYPES_WITHOUT_INIT_SEGMENT_.has(mimeType)) {\n reference.initSegmentReference = null;\n }\n }\n\n if (segmentWithByteRangeOptimization) {\n this.lowLatencyByterangeOptimization_ = true;\n reference.markAsByterangeOptimization();\n\n if (isPreloadSegment) {\n reference.markAsPreload();\n }\n }\n\n return reference;\n }\n\n\n /**\n * Parse the startByte and endByte.\n * @param {shaka.media.SegmentReference} previousReference\n * @param {?string} byterange\n * @return {!Array<number>} An array with the start byte and end byte.\n * @private\n */\n parseByteRange_(previousReference, byterange) {\n let startByte = 0;\n let endByte = null;\n // If BYTERANGE is not specified, the segment consists of the entire\n // resource.\n if (byterange) {\n const blocks = byterange.split('@');\n const byteLength = Number(blocks[0]);\n if (blocks[1]) {\n startByte = Number(blocks[1]);\n } else {\n goog.asserts.assert(previousReference,\n 'Cannot refer back to previous HLS segment!');\n startByte = previousReference.endByte + 1;\n }\n endByte = startByte + byteLength - 1;\n }\n return [startByte, endByte];\n }\n\n /**\n * @param {!Array<!shaka.hls.Tag>} tags\n * @param {string} contentType\n * @param {!Map<string, string>} variables\n * @param {function(): !Array<string>} getUris\n * @private\n */\n processDateRangeTags_(tags, contentType, variables, getUris) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n if (contentType != ContentType.VIDEO && contentType != ContentType.AUDIO) {\n // DATE-RANGE should only appear in AUDIO or VIDEO playlists.\n // We ignore those that appear in other playlists.\n return;\n }\n const Utils = shaka.hls.Utils;\n const initialProgramDateTime =\n this.presentationTimeline_.getInitialProgramDateTime();\n if (!initialProgramDateTime ||\n this.ignoreManifestProgramDateTimeFor_(contentType)) {\n return;\n }\n let dateRangeTags =\n shaka.hls.Utils.filterTagsByName(tags, 'EXT-X-DATERANGE');\n dateRangeTags = dateRangeTags.filter((tag) => {\n return tag.getAttribute('START-DATE') != null;\n }).sort((a, b) => {\n const aStartDateValue = a.getRequiredAttrValue('START-DATE');\n const bStartDateValue = b.getRequiredAttrValue('START-DATE');\n if (aStartDateValue < bStartDateValue) {\n return -1;\n }\n if (aStartDateValue > bStartDateValue) {\n return 1;\n }\n return 0;\n });\n for (let i = 0; i < dateRangeTags.length; i++) {\n const tag = dateRangeTags[i];\n try {\n const id = tag.getRequiredAttrValue('ID');\n if (this.dateRangeIdsEmitted_.has(id)) {\n continue;\n }\n const startDateValue = tag.getRequiredAttrValue('START-DATE');\n const startDate = shaka.util.TXml.parseDate(startDateValue);\n if (isNaN(startDate)) {\n // Invalid START-DATE\n continue;\n }\n goog.asserts.assert(startDate != null,\n 'Start date should not be null!');\n const startTime = Math.max(0, startDate - initialProgramDateTime);\n\n let endTime = null;\n const endDateValue = tag.getAttributeValue('END-DATE');\n if (endDateValue) {\n const endDate = shaka.util.TXml.parseDate(endDateValue);\n if (!isNaN(endDate)) {\n goog.asserts.assert(endDate != null,\n 'End date should not be null!');\n endTime = endDate - initialProgramDateTime;\n if (endTime < 0) {\n // Date range in the past\n continue;\n }\n }\n }\n if (endTime == null) {\n const durationValue = tag.getAttributeValue('DURATION') ||\n tag.getAttributeValue('PLANNED-DURATION');\n if (durationValue) {\n const duration = parseFloat(durationValue);\n if (!isNaN(duration)) {\n endTime = startTime + duration;\n }\n const realEndTime = startDate - initialProgramDateTime + duration;\n if (realEndTime < 0) {\n // Date range in the past\n continue;\n }\n }\n }\n const type =\n tag.getAttributeValue('CLASS') || 'com.apple.quicktime.HLS';\n\n const endOnNext = tag.getAttributeValue('END-ON-NEXT') == 'YES';\n if (endTime == null && endOnNext) {\n for (let j = i + 1; j < dateRangeTags.length; j++) {\n const otherDateRangeType =\n dateRangeTags[j].getAttributeValue('CLASS') ||\n 'com.apple.quicktime.HLS';\n if (type != otherDateRangeType) {\n continue;\n }\n const otherDateRangeStartDateValue =\n dateRangeTags[j].getRequiredAttrValue('START-DATE');\n const otherDateRangeStartDate =\n shaka.util.TXml.parseDate(otherDateRangeStartDateValue);\n if (isNaN(otherDateRangeStartDate)) {\n // Invalid START-DATE\n continue;\n }\n if (otherDateRangeStartDate &&\n otherDateRangeStartDate > startDate) {\n endTime = Math.max(0,\n otherDateRangeStartDate - initialProgramDateTime);\n break;\n }\n }\n if (endTime == null) {\n // Since we cannot know when it ends, we omit it for now and in the\n // future with an update we will be able to have more information.\n continue;\n }\n }\n\n // Exclude these attributes from the metadata since they already go into\n // other fields (eg: startTime or endTime) or are not necessary..\n const excludedAttributes = [\n 'CLASS',\n 'START-DATE',\n 'END-DATE',\n 'DURATION',\n 'END-ON-NEXT',\n ];\n\n /* @type {!Array<shaka.extern.MetadataFrame>} */\n const values = [];\n for (const attribute of tag.attributes) {\n if (excludedAttributes.includes(attribute.name)) {\n continue;\n }\n let data = Utils.variableSubstitution(attribute.value, variables);\n if (attribute.name == 'X-ASSET-URI' ||\n attribute.name == 'X-ASSET-LIST') {\n data = Utils.constructSegmentUris(\n getUris(), attribute.value, variables)[0];\n }\n const metadataFrame = {\n key: attribute.name,\n description: '',\n data,\n mimeType: null,\n pictureType: null,\n };\n values.push(metadataFrame);\n }\n\n // ID is always required. So we need more than 1 value.\n if (values.length > 1) {\n this.playerInterface_.onMetadata(type, startTime, endTime, values);\n }\n\n this.dateRangeIdsEmitted_.add(id);\n } catch (e) {\n shaka.log.warning('Ignoring DATERANGE with errors', tag.toString());\n }\n }\n }\n\n /**\n * Parses shaka.hls.Segment objects into shaka.media.SegmentReferences and\n * get the bandwidth necessary for this segments If it's defined in the\n * playlist.\n *\n * @param {!shaka.hls.Playlist} playlist\n * @param {!Map<number, number>} mediaSequenceToStartTime\n * @param {!Map<string, string>} variables\n * @param {function(): !Array<string>} getUris\n * @param {string} type\n * @return {{segments: !Array<!shaka.media.SegmentReference>,\n * bandwidth: (number|undefined)}}\n * @private\n */\n createSegments_(playlist, mediaSequenceToStartTime, variables,\n getUris, type) {\n /** @type {Array<!shaka.hls.Segment>} */\n const hlsSegments = playlist.segments;\n goog.asserts.assert(hlsSegments.length, 'Playlist should have segments!');\n\n /** @type {shaka.media.InitSegmentReference} */\n let initSegmentRef;\n\n /** @type {shaka.extern.aesKey|undefined} */\n let aesKey = undefined;\n\n let discontinuitySequence = shaka.hls.Utils.getFirstTagWithNameAsNumber(\n playlist.tags, 'EXT-X-DISCONTINUITY-SEQUENCE', -1);\n const mediaSequenceNumber = shaka.hls.Utils.getFirstTagWithNameAsNumber(\n playlist.tags, 'EXT-X-MEDIA-SEQUENCE', 0);\n const skipTag = shaka.hls.Utils.getFirstTagWithName(\n playlist.tags, 'EXT-X-SKIP');\n const skippedSegments =\n skipTag ? Number(skipTag.getAttributeValue('SKIPPED-SEGMENTS')) : 0;\n let position = mediaSequenceNumber + skippedSegments;\n let firstStartTime = 0;\n\n // For live stream, use the cached value in the mediaSequenceToStartTime\n // map if available.\n if (this.isLive_() && mediaSequenceToStartTime.has(position)) {\n firstStartTime = mediaSequenceToStartTime.get(position);\n }\n // This is for recovering from disconnects.\n if (firstStartTime === 0 &&\n this.presentationType_ == shaka.hls.HlsParser.PresentationType_.LIVE &&\n mediaSequenceToStartTime.size > 0 &&\n !mediaSequenceToStartTime.has(position) &&\n this.presentationTimeline_.getPresentationStartTime() != null) {\n firstStartTime = this.presentationTimeline_.getSegmentAvailabilityStart();\n }\n\n /** @type {!Array<!shaka.media.SegmentReference>} */\n const references = [];\n\n let previousReference = null;\n\n /** @type {!Array<{bitrate: number, duration: number}>} */\n const bitrates = [];\n\n for (let i = 0; i < hlsSegments.length; i++) {\n const item = hlsSegments[i];\n const startTime =\n (i == 0) ? firstStartTime : previousReference.endTime;\n position = mediaSequenceNumber + skippedSegments + i;\n\n const discontinuityTag = shaka.hls.Utils.getFirstTagWithName(\n item.tags, 'EXT-X-DISCONTINUITY');\n if (discontinuityTag) {\n discontinuitySequence++;\n }\n\n // Apply new AES tags as you see them, keeping a running total.\n for (const drmTag of item.tags) {\n if (drmTag.name == 'EXT-X-KEY') {\n if (this.isAesMethod_(drmTag.getRequiredAttrValue('METHOD'))) {\n aesKey =\n this.parseAESDrmTag_(drmTag, playlist, getUris, variables);\n } else {\n aesKey = undefined;\n }\n }\n }\n\n mediaSequenceToStartTime.set(position, startTime);\n\n initSegmentRef = this.getInitSegmentReference_(playlist,\n item.tags, getUris, variables);\n\n const reference = this.createSegmentReference_(\n initSegmentRef,\n previousReference,\n item,\n startTime,\n variables,\n playlist,\n type,\n getUris,\n aesKey);\n\n if (reference) {\n const bitrate = shaka.hls.Utils.getFirstTagWithNameAsNumber(\n item.tags, 'EXT-X-BITRATE');\n if (bitrate) {\n bitrates.push({\n bitrate,\n duration: reference.endTime - reference.startTime,\n });\n } else if (bitrates.length) {\n // It applies to every segment between it and the next EXT-X-BITRATE,\n // so we use the latest bitrate value\n const prevBitrate = bitrates.pop();\n prevBitrate.duration += reference.endTime - reference.startTime;\n bitrates.push(prevBitrate);\n }\n\n previousReference = reference;\n reference.discontinuitySequence = discontinuitySequence;\n\n if (this.ignoreManifestProgramDateTimeFor_(type) &&\n this.minSequenceNumber_ != null &&\n position < this.minSequenceNumber_) {\n // This segment is ignored as part of our fallback synchronization\n // method.\n } else {\n references.push(reference);\n }\n }\n }\n\n let bandwidth = undefined;\n if (bitrates.length) {\n const duration = bitrates.reduce((sum, value) => {\n return sum + value.duration;\n }, 0);\n bandwidth = Math.round(bitrates.reduce((sum, value) => {\n return sum + value.bitrate * value.duration;\n }, 0) / duration * 1000);\n }\n\n // If some segments have sync times, but not all, extrapolate the sync\n // times of the ones with none.\n const someSyncTime = references.some((ref) => ref.syncTime != null);\n if (someSyncTime) {\n for (let i = 0; i < references.length; i++) {\n const reference = references[i];\n if (reference.syncTime != null) {\n // No need to extrapolate.\n continue;\n }\n // Find the nearest segment with syncTime, in either direction.\n // This looks forward and backward simultaneously, keeping track of what\n // to offset the syncTime it finds by as it goes.\n let forwardAdd = 0;\n let forwardI = i;\n /**\n * Look forwards one reference at a time, summing all durations as we\n * go, until we find a reference with a syncTime to use as a basis.\n * This DOES count the original reference, but DOESN'T count the first\n * reference with a syncTime (as we approach it from behind).\n * @return {?number}\n */\n const lookForward = () => {\n const other = references[forwardI];\n if (other) {\n if (other.syncTime != null) {\n return other.syncTime + forwardAdd;\n }\n forwardAdd -= other.endTime - other.startTime;\n forwardI += 1;\n }\n return null;\n };\n let backwardAdd = 0;\n let backwardI = i;\n /**\n * Look backwards one reference at a time, summing all durations as we\n * go, until we find a reference with a syncTime to use as a basis.\n * This DOESN'T count the original reference, but DOES count the first\n * reference with a syncTime (as we approach it from ahead).\n * @return {?number}\n */\n const lookBackward = () => {\n const other = references[backwardI];\n if (other) {\n if (other != reference) {\n backwardAdd += other.endTime - other.startTime;\n }\n if (other.syncTime != null) {\n return other.syncTime + backwardAdd;\n }\n backwardI -= 1;\n }\n return null;\n };\n while (reference.syncTime == null) {\n reference.syncTime = lookBackward();\n if (reference.syncTime == null) {\n reference.syncTime = lookForward();\n }\n }\n }\n }\n\n // Split the sync times properly among partial segments.\n if (someSyncTime) {\n for (const reference of references) {\n let syncTime = reference.syncTime;\n for (const partial of reference.partialReferences) {\n partial.syncTime = syncTime;\n syncTime += partial.endTime - partial.startTime;\n }\n }\n }\n\n // lowestSyncTime is a value from a previous playlist update. Use it to\n // set reference start times. If this is the first playlist parse, we will\n // skip this step, and wait until we have sync time across stream types.\n const lowestSyncTime = this.lowestSyncTime_;\n if (someSyncTime && lowestSyncTime != Infinity) {\n if (!this.ignoreManifestProgramDateTimeFor_(type)) {\n for (const reference of references) {\n reference.syncAgainst(lowestSyncTime);\n }\n }\n }\n\n return {\n segments: references,\n bandwidth,\n };\n }\n\n /**\n * Attempts to guess stream's mime type based on content type and URI.\n *\n * @param {string} contentType\n * @param {string} codecs\n * @return {?string}\n * @private\n */\n guessMimeTypeBeforeLoading_(contentType, codecs) {\n if (contentType == shaka.util.ManifestParserUtils.ContentType.TEXT) {\n if (codecs == 'vtt' || codecs == 'wvtt') {\n // If codecs is 'vtt', it's WebVTT.\n return 'text/vtt';\n } else if (codecs && codecs !== '') {\n // Otherwise, assume MP4-embedded text, since text-based formats tend\n // not to have a codecs string at all.\n return 'application/mp4';\n }\n }\n\n if (contentType == shaka.util.ManifestParserUtils.ContentType.IMAGE) {\n if (!codecs || codecs == 'jpeg') {\n return 'image/jpeg';\n }\n }\n\n if (contentType == shaka.util.ManifestParserUtils.ContentType.AUDIO) {\n // See: https://bugs.chromium.org/p/chromium/issues/detail?id=489520\n if (codecs == 'mp4a.40.34') {\n return 'audio/mpeg';\n }\n }\n\n if (codecs == 'mjpg') {\n return 'application/mp4';\n }\n\n // Not enough information to guess from the content type and codecs.\n return null;\n }\n\n /**\n * Get a fallback mime type for the content. Used if all the better methods\n * for determining the mime type have failed.\n *\n * @param {string} contentType\n * @return {string}\n * @private\n */\n guessMimeTypeFallback_(contentType) {\n if (contentType == shaka.util.ManifestParserUtils.ContentType.TEXT) {\n // If there was no codecs string and no content-type, assume HLS text\n // streams are WebVTT.\n return 'text/vtt';\n }\n // If the HLS content is lacking in both MIME type metadata and\n // segment file extensions, we fall back to assuming it's MP4.\n const map =\n shaka.hls.HlsParser.EXTENSION_MAP_BY_CONTENT_TYPE_.get(contentType);\n return map.get('mp4');\n }\n\n /**\n * @param {!Array<!shaka.media.SegmentReference>} segments\n * @return {{segment: !shaka.media.SegmentReference, segmentIndex: number}}\n * @private\n */\n getAvailableSegment_(segments) {\n goog.asserts.assert(segments.length, 'Should have segments!');\n\n // If you wait long enough, requesting the first segment can fail\n // because it has fallen off the left edge of DVR, so to be safer,\n // let's request the middle segment.\n let segmentIndex = this.isLive_() ?\n Math.trunc((segments.length - 1) / 2) : 0;\n let segment = segments[segmentIndex];\n while (segment.getStatus() == shaka.media.SegmentReference.Status.MISSING &&\n (segmentIndex + 1) < segments.length) {\n segmentIndex ++;\n segment = segments[segmentIndex];\n }\n return {segment, segmentIndex};\n }\n\n /**\n * Attempts to guess stream's mime type.\n *\n * @param {string} contentType\n * @param {string} codecs\n * @param {!Array<!shaka.media.SegmentReference>} segments\n * @return {!Promise<string>}\n * @private\n */\n async guessMimeType_(contentType, codecs, segments) {\n const HlsParser = shaka.hls.HlsParser;\n const requestType = shaka.net.NetworkingEngine.RequestType.SEGMENT;\n\n const {segment} = this.getAvailableSegment_(segments);\n\n if (segment.status == shaka.media.SegmentReference.Status.MISSING) {\n return this.guessMimeTypeFallback_(contentType);\n }\n\n const segmentUris = segment.getUris();\n\n const parsedUri = new goog.Uri(segmentUris[0]);\n const extension = parsedUri.getPath().split('.').pop();\n const map = HlsParser.EXTENSION_MAP_BY_CONTENT_TYPE_.get(contentType);\n\n let mimeType = map.get(extension);\n if (mimeType) {\n return mimeType;\n }\n\n mimeType = HlsParser.RAW_FORMATS_TO_MIME_TYPES_.get(extension);\n if (mimeType) {\n return mimeType;\n }\n\n // The extension map didn't work, so guess based on codecs.\n mimeType = this.guessMimeTypeBeforeLoading_(contentType, codecs);\n if (mimeType) {\n return mimeType;\n }\n\n // If unable to guess mime type, request a segment and try getting it\n // from the response.\n let contentMimeType;\n const type = shaka.net.NetworkingEngine.AdvancedRequestType.MEDIA_SEGMENT;\n const headRequest = shaka.net.NetworkingEngine.makeRequest(\n segmentUris, this.config_.retryParameters);\n let response;\n try {\n headRequest.method = 'HEAD';\n response = await this.makeNetworkRequest_(\n headRequest, requestType, {type}).promise;\n\n contentMimeType = response.headers['content-type'];\n } catch (error) {\n if (error &&\n (error.code == shaka.util.Error.Code.HTTP_ERROR ||\n error.code == shaka.util.Error.Code.BAD_HTTP_STATUS)) {\n headRequest.method = 'GET';\n if (this.config_.hls.allowRangeRequestsToGuessMimeType) {\n // Only requesting first byte\n headRequest.headers['Range'] = 'bytes=0-0';\n }\n response = await this.makeNetworkRequest_(\n headRequest, requestType, {type}).promise;\n\n contentMimeType = response.headers['content-type'];\n }\n }\n\n if (contentMimeType) {\n // Split the MIME type in case the server sent additional parameters.\n mimeType = contentMimeType.toLowerCase().split(';')[0];\n if (mimeType == 'application/octet-stream') {\n if (!response.data.byteLength) {\n headRequest.method = 'GET';\n response = await this.makeNetworkRequest_(\n headRequest, requestType, {type}).promise;\n }\n if (shaka.util.TsParser.probe(\n shaka.util.BufferUtils.toUint8(response.data))) {\n mimeType = 'video/mp2t';\n }\n }\n if (mimeType != 'application/octet-stream') {\n return mimeType;\n }\n }\n\n return this.guessMimeTypeFallback_(contentType);\n }\n\n /**\n * Returns a tag with a given name.\n * Throws an error if tag was not found.\n *\n * @param {!Array<shaka.hls.Tag>} tags\n * @param {string} tagName\n * @return {!shaka.hls.Tag}\n * @private\n */\n getRequiredTag_(tags, tagName) {\n const tag = shaka.hls.Utils.getFirstTagWithName(tags, tagName);\n if (!tag) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.HLS_REQUIRED_TAG_MISSING, tagName);\n }\n\n return tag;\n }\n\n /**\n * @param {shaka.extern.Stream} stream\n * @param {?string} width\n * @param {?string} height\n * @param {?string} frameRate\n * @param {?string} videoRange\n * @param {?string} videoLayout\n * @param {?string} colorGamut\n * @private\n */\n addVideoAttributes_(stream, width, height, frameRate, videoRange,\n videoLayout, colorGamut) {\n if (stream) {\n stream.width = Number(width) || undefined;\n stream.height = Number(height) || undefined;\n stream.frameRate = Number(frameRate) || undefined;\n stream.hdr = videoRange || undefined;\n stream.videoLayout = videoLayout || undefined;\n stream.colorGamut = colorGamut || undefined;\n }\n }\n\n /**\n * Makes a network request for the manifest and returns a Promise\n * with the resulting data.\n *\n * @param {!Array<string>} uris\n * @param {boolean=} isPlaylist\n * @return {!shaka.net.NetworkingEngine.PendingRequest}\n * @private\n */\n requestManifest_(uris, isPlaylist) {\n const requestType = shaka.net.NetworkingEngine.RequestType.MANIFEST;\n\n const request = shaka.net.NetworkingEngine.makeRequest(\n uris, this.config_.retryParameters);\n\n const type = isPlaylist ?\n shaka.net.NetworkingEngine.AdvancedRequestType.MEDIA_PLAYLIST :\n shaka.net.NetworkingEngine.AdvancedRequestType.MASTER_PLAYLIST;\n return this.makeNetworkRequest_(request, requestType, {type});\n }\n\n /**\n * Called when the update timer ticks. Because parsing a manifest is async,\n * this method is async. To work with this, this method will schedule the next\n * update when it finished instead of using a repeating-start.\n *\n * @return {!Promise}\n * @private\n */\n async onUpdate_() {\n shaka.log.info('Updating manifest...');\n\n goog.asserts.assert(\n this.getUpdatePlaylistDelay_() > 0,\n 'We should only call |onUpdate_| when we are suppose to be updating.');\n\n // Detect a call to stop()\n if (!this.playerInterface_) {\n return;\n }\n\n try {\n const startTime = Date.now();\n await this.update();\n\n // Keep track of how long the longest manifest update took.\n const endTime = Date.now();\n\n // This may have converted to VOD, in which case we stop updating.\n if (this.isLive_()) {\n const updateDuration = (endTime - startTime) / 1000.0;\n this.averageUpdateDuration_.sample(1, updateDuration);\n const delay = this.config_.updatePeriod > 0 ?\n this.config_.updatePeriod : this.getUpdatePlaylistDelay_();\n const finalDelay = Math.max(0,\n delay - this.averageUpdateDuration_.getEstimate());\n this.updatePlaylistTimer_.tickAfter(/* seconds= */ finalDelay);\n }\n } catch (error) {\n // Detect a call to stop() during this.update()\n if (!this.playerInterface_) {\n return;\n }\n\n goog.asserts.assert(error instanceof shaka.util.Error,\n 'Should only receive a Shaka error');\n\n if (this.config_.raiseFatalErrorOnManifestUpdateRequestFailure) {\n this.playerInterface_.onError(error);\n return;\n }\n\n // We will retry updating, so override the severity of the error.\n error.severity = shaka.util.Error.Severity.RECOVERABLE;\n this.playerInterface_.onError(error);\n\n // Try again very soon.\n this.updatePlaylistTimer_.tickAfter(/* seconds= */ 0.1);\n }\n\n // Detect a call to stop()\n if (!this.playerInterface_) {\n return;\n }\n\n this.playerInterface_.onManifestUpdated();\n }\n\n\n /**\n * @return {boolean}\n * @private\n */\n isLive_() {\n const PresentationType = shaka.hls.HlsParser.PresentationType_;\n return this.presentationType_ != PresentationType.VOD;\n }\n\n\n /**\n * @return {number}\n * @private\n */\n getUpdatePlaylistDelay_() {\n // The HLS spec (RFC 8216) states in 6.3.4:\n // \"the client MUST wait for at least the target duration before\n // attempting to reload the Playlist file again\".\n // For LL-HLS, the server must add a new partial segment to the Playlist\n // every part target duration.\n return this.lastTargetDuration_;\n }\n\n\n /**\n * @param {shaka.hls.HlsParser.PresentationType_} type\n * @private\n */\n setPresentationType_(type) {\n this.presentationType_ = type;\n\n if (this.presentationTimeline_) {\n this.presentationTimeline_.setStatic(!this.isLive_());\n }\n\n // If this manifest is not for live content, then we have no reason to\n // update it.\n if (!this.isLive_()) {\n this.updatePlaylistTimer_.stop();\n }\n }\n\n\n /**\n * Create a networking request. This will manage the request using the\n * parser's operation manager. If the parser has already been stopped, the\n * request will not be made.\n *\n * @param {shaka.extern.Request} request\n * @param {shaka.net.NetworkingEngine.RequestType} type\n * @param {shaka.extern.RequestContext=} context\n * @return {!shaka.net.NetworkingEngine.PendingRequest}\n * @private\n */\n makeNetworkRequest_(request, type, context) {\n if (!this.operationManager_) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.PLAYER,\n shaka.util.Error.Code.OPERATION_ABORTED);\n }\n\n if (!context) {\n context = {};\n }\n context.isPreload = this.isPreloadFn_();\n const op = this.playerInterface_.networkingEngine.request(\n type, request, context);\n this.operationManager_.manage(op);\n\n return op;\n }\n\n /**\n * @param {string} method\n * @return {boolean}\n * @private\n */\n isAesMethod_(method) {\n return method == 'AES-128' ||\n method == 'AES-256' ||\n method == 'AES-256-CTR';\n }\n\n /**\n * @param {!shaka.hls.Tag} drmTag\n * @param {string} mimeType\n * @return {?shaka.extern.DrmInfo}\n * @private\n */\n static fairplayDrmParser_(drmTag, mimeType) {\n if (mimeType == 'video/mp2t') {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.HLS_MSE_ENCRYPTED_MP2T_NOT_SUPPORTED);\n }\n\n if (shaka.drm.DrmUtils.isMediaKeysPolyfilled('apple')) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code\n .HLS_MSE_ENCRYPTED_LEGACY_APPLE_MEDIA_KEYS_NOT_SUPPORTED);\n }\n\n const method = drmTag.getRequiredAttrValue('METHOD');\n const VALID_METHODS = ['SAMPLE-AES', 'SAMPLE-AES-CTR'];\n if (!VALID_METHODS.includes(method)) {\n shaka.log.error('FairPlay in HLS is only supported with [',\n VALID_METHODS.join(', '), '], not', method);\n return null;\n }\n\n let encryptionScheme = 'cenc';\n if (method == 'SAMPLE-AES') {\n // It should be 'cbcs-1-9' but Safari doesn't support it.\n // See: https://github.com/WebKit/WebKit/blob/main/Source/WebCore/Modules/encryptedmedia/MediaKeyEncryptionScheme.idl\n encryptionScheme = 'cbcs';\n }\n\n /*\n * Even if we're not able to construct initData through the HLS tag, adding\n * a DRMInfo will allow DRM Engine to request a media key system access\n * with the correct keySystem and initDataType\n */\n const drmInfo = shaka.util.ManifestParserUtils.createDrmInfo(\n 'com.apple.fps', encryptionScheme, [\n {initDataType: 'sinf', initData: new Uint8Array(0), keyId: null},\n ], drmTag.getRequiredAttrValue('URI'));\n\n return drmInfo;\n }\n\n /**\n * @param {!shaka.hls.Tag} drmTag\n * @return {?shaka.extern.DrmInfo}\n * @private\n */\n static widevineDrmParser_(drmTag) {\n const method = drmTag.getRequiredAttrValue('METHOD');\n const VALID_METHODS = ['SAMPLE-AES', 'SAMPLE-AES-CTR'];\n if (!VALID_METHODS.includes(method)) {\n shaka.log.error('Widevine in HLS is only supported with [',\n VALID_METHODS.join(', '), '], not', method);\n return null;\n }\n\n let encryptionScheme = 'cenc';\n if (method == 'SAMPLE-AES') {\n encryptionScheme = 'cbcs';\n }\n\n const uri = drmTag.getRequiredAttrValue('URI');\n const parsedData = shaka.net.DataUriPlugin.parseRaw(uri.split('?')[0]);\n\n // The data encoded in the URI is a PSSH box to be used as init data.\n const pssh = shaka.util.BufferUtils.toUint8(parsedData.data);\n const drmInfo = shaka.util.ManifestParserUtils.createDrmInfo(\n 'com.widevine.alpha', encryptionScheme, [\n {initDataType: 'cenc', initData: pssh},\n ]);\n\n const keyId = drmTag.getAttributeValue('KEYID');\n if (keyId) {\n const keyIdLowerCase = keyId.toLowerCase();\n // This value should begin with '0x':\n goog.asserts.assert(\n keyIdLowerCase.startsWith('0x'), 'Incorrect KEYID format!');\n // But the output should not contain the '0x':\n drmInfo.keyIds = new Set([keyIdLowerCase.substr(2)]);\n }\n return drmInfo;\n }\n\n /**\n * See: https://docs.microsoft.com/en-us/playready/packaging/mp4-based-formats-supported-by-playready-clients?tabs=case4\n *\n * @param {!shaka.hls.Tag} drmTag\n * @return {?shaka.extern.DrmInfo}\n * @private\n */\n static playreadyDrmParser_(drmTag) {\n const method = drmTag.getRequiredAttrValue('METHOD');\n const VALID_METHODS = ['SAMPLE-AES', 'SAMPLE-AES-CTR'];\n if (!VALID_METHODS.includes(method)) {\n shaka.log.error('PlayReady in HLS is only supported with [',\n VALID_METHODS.join(', '), '], not', method);\n return null;\n }\n\n let encryptionScheme = 'cenc';\n if (method == 'SAMPLE-AES') {\n encryptionScheme = 'cbcs';\n }\n\n const uri = drmTag.getRequiredAttrValue('URI');\n const parsedData = shaka.net.DataUriPlugin.parseRaw(uri.split('?')[0]);\n\n // The data encoded in the URI is a PlayReady Pro Object, so we need\n // convert it to pssh.\n const data = shaka.util.BufferUtils.toUint8(parsedData.data);\n const systemId = new Uint8Array([\n 0x9a, 0x04, 0xf0, 0x79, 0x98, 0x40, 0x42, 0x86,\n 0xab, 0x92, 0xe6, 0x5b, 0xe0, 0x88, 0x5f, 0x95,\n ]);\n const keyIds = new Set();\n const psshVersion = 0;\n const pssh =\n shaka.util.Pssh.createPssh(data, systemId, keyIds, psshVersion);\n const drmInfo = shaka.util.ManifestParserUtils.createDrmInfo(\n 'com.microsoft.playready', encryptionScheme, [\n {initDataType: 'cenc', initData: pssh},\n ]);\n\n const input = shaka.util.TXml.parseXmlString([\n '<PLAYREADY>',\n shaka.util.Uint8ArrayUtils.toBase64(data),\n '</PLAYREADY>',\n ].join('\\n'));\n if (input) {\n drmInfo.licenseServerUri = shaka.drm.PlayReady.getLicenseUrl(input);\n }\n\n return drmInfo;\n }\n\n /**\n * @param {!shaka.hls.Tag} drmTag\n * @return {?shaka.extern.DrmInfo}\n * @private\n */\n static wiseplayDrmParser_(drmTag) {\n const method = drmTag.getRequiredAttrValue('METHOD');\n const VALID_METHODS = ['SAMPLE-AES', 'SAMPLE-AES-CTR'];\n if (!VALID_METHODS.includes(method)) {\n shaka.log.error('WisePlay in HLS is only supported with [',\n VALID_METHODS.join(', '), '], not', method);\n return null;\n }\n\n let encryptionScheme = 'cenc';\n if (method == 'SAMPLE-AES') {\n encryptionScheme = 'cbcs';\n }\n\n const uri = drmTag.getRequiredAttrValue('URI');\n const parsedData = shaka.net.DataUriPlugin.parseRaw(uri.split('?')[0]);\n\n // The data encoded in the URI is a PSSH box to be used as init data.\n const pssh = shaka.util.BufferUtils.toUint8(parsedData.data);\n const drmInfo = shaka.util.ManifestParserUtils.createDrmInfo(\n 'com.huawei.wiseplay', encryptionScheme, [\n {initDataType: 'cenc', initData: pssh},\n ]);\n\n const keyId = drmTag.getAttributeValue('KEYID');\n if (keyId) {\n const keyIdLowerCase = keyId.toLowerCase();\n // This value should begin with '0x':\n goog.asserts.assert(\n keyIdLowerCase.startsWith('0x'), 'Incorrect KEYID format!');\n // But the output should not contain the '0x':\n drmInfo.keyIds = new Set([keyIdLowerCase.substr(2)]);\n }\n return drmInfo;\n }\n\n /**\n * See: https://datatracker.ietf.org/doc/html/draft-pantos-hls-rfc8216bis-11#section-5.1\n *\n * @param {!shaka.hls.Tag} drmTag\n * @param {string} mimeType\n * @param {function(): !Array<string>} getUris\n * @param {?shaka.media.InitSegmentReference} initSegmentRef\n * @param {?Map<string, string>=} variables\n * @return {!Promise<?shaka.extern.DrmInfo>}\n * @private\n */\n async identityDrmParser_(drmTag, mimeType, getUris, initSegmentRef,\n variables) {\n if (mimeType == 'video/mp2t') {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.HLS_MSE_ENCRYPTED_MP2T_NOT_SUPPORTED);\n }\n\n if (shaka.drm.DrmUtils.isMediaKeysPolyfilled('apple')) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code\n .HLS_MSE_ENCRYPTED_LEGACY_APPLE_MEDIA_KEYS_NOT_SUPPORTED);\n }\n\n const method = drmTag.getRequiredAttrValue('METHOD');\n const VALID_METHODS = ['SAMPLE-AES', 'SAMPLE-AES-CTR'];\n if (!VALID_METHODS.includes(method)) {\n shaka.log.error('Identity (ClearKey) in HLS is only supported with [',\n VALID_METHODS.join(', '), '], not', method);\n return null;\n }\n\n const keyUris = shaka.hls.Utils.constructSegmentUris(\n getUris(), drmTag.getRequiredAttrValue('URI'), variables);\n\n let key;\n if (keyUris[0].startsWith('data:text/plain;base64,')) {\n key = shaka.util.Uint8ArrayUtils.toHex(\n shaka.util.Uint8ArrayUtils.fromBase64(\n keyUris[0].split('data:text/plain;base64,').pop()));\n } else {\n const keyMapKey = keyUris.sort().join('');\n if (!this.identityKeyMap_.has(keyMapKey)) {\n const requestType = shaka.net.NetworkingEngine.RequestType.KEY;\n const request = shaka.net.NetworkingEngine.makeRequest(\n keyUris, this.config_.retryParameters);\n const keyResponse = this.makeNetworkRequest_(request, requestType)\n .promise;\n this.identityKeyMap_.set(keyMapKey, keyResponse);\n }\n const keyResponse = await this.identityKeyMap_.get(keyMapKey);\n key = shaka.util.Uint8ArrayUtils.toHex(keyResponse.data);\n }\n\n // NOTE: The ClearKey CDM requires a key-id to key mapping. HLS doesn't\n // provide a key ID anywhere. So although we could use the 'URI' attribute\n // to fetch the actual 16-byte key, without a key ID, we can't provide this\n // automatically to the ClearKey CDM. By default we assume that keyId is 0,\n // but we will try to get key ID from Init Segment.\n // If the application want override this behavior will have to use\n // player.configure('drm.clearKeys', { ... }) to provide the key IDs\n // and keys or player.configure('drm.servers.org\\.w3\\.clearkey', ...) to\n // provide a ClearKey license server URI.\n let keyId = '00000000000000000000000000000000';\n\n if (initSegmentRef) {\n let defaultKID;\n if (this.identityKidMap_.has(initSegmentRef)) {\n defaultKID = this.identityKidMap_.get(initSegmentRef);\n } else {\n const initSegmentRequest = shaka.util.Networking.createSegmentRequest(\n initSegmentRef.getUris(),\n initSegmentRef.getStartByte(),\n initSegmentRef.getEndByte(),\n this.config_.retryParameters);\n const requestType = shaka.net.NetworkingEngine.RequestType.SEGMENT;\n const initType =\n shaka.net.NetworkingEngine.AdvancedRequestType.INIT_SEGMENT;\n const initResponse = await this.makeNetworkRequest_(\n initSegmentRequest, requestType, {type: initType}).promise;\n\n defaultKID = shaka.media.SegmentUtils.getDefaultKID(\n initResponse.data);\n this.identityKidMap_.set(initSegmentRef, defaultKID);\n }\n if (defaultKID) {\n keyId = defaultKID;\n }\n }\n\n const clearkeys = new Map();\n clearkeys.set(keyId, key);\n\n let encryptionScheme = 'cenc';\n if (method == 'SAMPLE-AES') {\n encryptionScheme = 'cbcs';\n }\n\n return shaka.util.ManifestParserUtils.createDrmInfoFromClearKeys(\n clearkeys, encryptionScheme);\n }\n};\n\n\n/**\n * @typedef {{\n * stream: !shaka.extern.Stream,\n * type: string,\n * redirectUris: !Array<string>,\n * getUris: function():!Array<string>,\n * minTimestamp: number,\n * maxTimestamp: number,\n * mediaSequenceToStartTime: !Map<number, number>,\n * canSkipSegments: boolean,\n * canBlockReload: boolean,\n * hasEndList: boolean,\n * firstSequenceNumber: number,\n * nextMediaSequence: number,\n * nextPart: number,\n * loadedOnce: boolean\n * }}\n *\n * @description\n * Contains a stream and information about it.\n *\n * @property {!shaka.extern.Stream} stream\n * The Stream itself.\n * @property {string} type\n * The type value. Could be 'video', 'audio', 'text', or 'image'.\n * @property {!Array<string>} redirectUris\n * The redirect URIs.\n * @property {function():!Array<string>} getUris\n * The verbatim media playlist URIs, as it appeared in the master playlist.\n * @property {number} minTimestamp\n * The minimum timestamp found in the stream.\n * @property {number} maxTimestamp\n * The maximum timestamp found in the stream.\n * @property {!Map<number, number>} mediaSequenceToStartTime\n * A map of media sequence numbers to media start times.\n * Only used for VOD content.\n * @property {boolean} canSkipSegments\n * True if the server supports delta playlist updates, and we can send a\n * request for a playlist that can skip older media segments.\n * @property {boolean} canBlockReload\n * True if the server supports blocking playlist reload, and we can send a\n * request for a playlist that can block reload until some segments are\n * present.\n * @property {boolean} hasEndList\n * True if the stream has an EXT-X-ENDLIST tag.\n * @property {number} firstSequenceNumber\n * The sequence number of the first reference. Only calculated if needed.\n * @property {number} nextMediaSequence\n * The next media sequence.\n * @property {number} nextPart\n * The next part.\n * @property {boolean} loadedOnce\n * True if the stream has been loaded at least once.\n */\nshaka.hls.HlsParser.StreamInfo;\n\n\n/**\n * @typedef {{\n * audio: !Array<shaka.hls.HlsParser.StreamInfo>,\n * video: !Array<shaka.hls.HlsParser.StreamInfo>\n * }}\n *\n * @description Audio and video stream infos.\n * @property {!Array<shaka.hls.HlsParser.StreamInfo>} audio\n * @property {!Array<shaka.hls.HlsParser.StreamInfo>} video\n */\nshaka.hls.HlsParser.StreamInfos;\n\n\n/**\n * @const {!Map<string, string>}\n * @private\n */\nshaka.hls.HlsParser.RAW_FORMATS_TO_MIME_TYPES_ = new Map()\n .set('aac', 'audio/aac')\n .set('ac3', 'audio/ac3')\n .set('ec3', 'audio/ec3')\n .set('mp3', 'audio/mpeg');\n\n\n/**\n * @const {!Map<string, string>}\n * @private\n */\nshaka.hls.HlsParser.AUDIO_EXTENSIONS_TO_MIME_TYPES_ = new Map()\n .set('mp4', 'audio/mp4')\n .set('mp4a', 'audio/mp4')\n .set('m4s', 'audio/mp4')\n .set('m4i', 'audio/mp4')\n .set('m4a', 'audio/mp4')\n .set('m4f', 'audio/mp4')\n .set('cmfa', 'audio/mp4')\n // MPEG2-TS also uses video/ for audio: https://bit.ly/TsMse\n .set('ts', 'video/mp2t')\n .set('tsa', 'video/mp2t');\n\n\n/**\n * @const {!Map<string, string>}\n * @private\n */\nshaka.hls.HlsParser.VIDEO_EXTENSIONS_TO_MIME_TYPES_ = new Map()\n .set('mp4', 'video/mp4')\n .set('mp4v', 'video/mp4')\n .set('m4s', 'video/mp4')\n .set('m4i', 'video/mp4')\n .set('m4v', 'video/mp4')\n .set('m4f', 'video/mp4')\n .set('cmfv', 'video/mp4')\n .set('ts', 'video/mp2t')\n .set('tsv', 'video/mp2t');\n\n\n/**\n * @const {!Map<string, string>}\n * @private\n */\nshaka.hls.HlsParser.TEXT_EXTENSIONS_TO_MIME_TYPES_ = new Map()\n .set('mp4', 'application/mp4')\n .set('m4s', 'application/mp4')\n .set('m4i', 'application/mp4')\n .set('m4f', 'application/mp4')\n .set('cmft', 'application/mp4')\n .set('vtt', 'text/vtt')\n .set('webvtt', 'text/vtt')\n .set('ttml', 'application/ttml+xml');\n\n\n/**\n * @const {!Map<string, string>}\n * @private\n */\nshaka.hls.HlsParser.IMAGE_EXTENSIONS_TO_MIME_TYPES_ = new Map()\n .set('jpg', 'image/jpeg')\n .set('png', 'image/png')\n .set('svg', 'image/svg+xml')\n .set('webp', 'image/webp')\n .set('avif', 'image/avif');\n\n\n/**\n * @const {!Map<string, !Map<string, string>>}\n * @private\n */\nshaka.hls.HlsParser.EXTENSION_MAP_BY_CONTENT_TYPE_ = new Map()\n .set('audio', shaka.hls.HlsParser.AUDIO_EXTENSIONS_TO_MIME_TYPES_)\n .set('video', shaka.hls.HlsParser.VIDEO_EXTENSIONS_TO_MIME_TYPES_)\n .set('text', shaka.hls.HlsParser.TEXT_EXTENSIONS_TO_MIME_TYPES_)\n .set('image', shaka.hls.HlsParser.IMAGE_EXTENSIONS_TO_MIME_TYPES_);\n\n\n/**\n * MIME types without init segment.\n *\n * @const {!Set<string>}\n * @private\n */\nshaka.hls.HlsParser.MIME_TYPES_WITHOUT_INIT_SEGMENT_ = new Set([\n 'video/mp2t',\n // Containerless types\n ...shaka.util.MimeUtils.RAW_FORMATS,\n]);\n\n\n/**\n * @typedef {function(!shaka.hls.Tag, string):?shaka.extern.DrmInfo}\n * @private\n */\nshaka.hls.HlsParser.DrmParser_;\n\n\n/**\n * @const {!Map<string, shaka.hls.HlsParser.DrmParser_>}\n * @private\n */\nshaka.hls.HlsParser.KEYFORMATS_TO_DRM_PARSERS_ = new Map()\n .set('com.apple.streamingkeydelivery',\n shaka.hls.HlsParser.fairplayDrmParser_)\n .set('urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed',\n shaka.hls.HlsParser.widevineDrmParser_)\n .set('com.microsoft.playready',\n shaka.hls.HlsParser.playreadyDrmParser_)\n .set('urn:uuid:3d5e6d35-9b9a-41e8-b843-dd3c6e72c42c',\n shaka.hls.HlsParser.wiseplayDrmParser_);\n\n\n/**\n * @enum {string}\n * @private\n */\nshaka.hls.HlsParser.PresentationType_ = {\n VOD: 'VOD',\n EVENT: 'EVENT',\n LIVE: 'LIVE',\n};\n\n\n/**\n * @const {string}\n * @private\n */\nshaka.hls.HlsParser.FAKE_MUXED_URL_ = 'shaka://hls-muxed';\n\n\nshaka.media.ManifestParser.registerParserByMime(\n 'application/x-mpegurl', () => new shaka.hls.HlsParser());\nshaka.media.ManifestParser.registerParserByMime(\n 'application/vnd.apple.mpegurl', () => new shaka.hls.HlsParser());\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.mss.ContentProtection');\n\ngoog.require('shaka.drm.PlayReady');\ngoog.require('shaka.util.ManifestParserUtils');\ngoog.require('shaka.util.Pssh');\ngoog.require('shaka.util.TXml');\ngoog.require('shaka.util.Uint8ArrayUtils');\n\n\n/**\n * @summary A set of functions for parsing and interpreting Protection\n * elements.\n */\nshaka.mss.ContentProtection = class {\n /**\n * Parses info from the Protection elements.\n *\n * @param {!Array<!shaka.extern.xml.Node>} elements\n * @param {!Object<string, string>} keySystemsBySystemId\n * @return {!Array<shaka.extern.DrmInfo>}\n */\n static parseFromProtection(elements, keySystemsBySystemId) {\n const ContentProtection = shaka.mss.ContentProtection;\n const TXml = shaka.util.TXml;\n\n /** @type {!Array<!shaka.extern.xml.Node>} */\n let protectionHeader = [];\n for (const element of elements) {\n protectionHeader = protectionHeader.concat(\n TXml.findChildren(element, 'ProtectionHeader'));\n }\n if (!protectionHeader.length) {\n return [];\n }\n return ContentProtection.convertElements_(\n protectionHeader, keySystemsBySystemId);\n }\n\n /**\n * Gets a PlayReady license URL from a protection element\n * containing a PlayReady Header Object\n *\n * @param {!shaka.extern.xml.Node} element\n * @return {string}\n */\n static getPlayReadyLicenseUrl(element) {\n return shaka.drm.PlayReady.getLicenseUrl(element);\n }\n\n /**\n * Gets a PlayReady KID from a protection element\n * containing a PlayReady Header Object\n *\n * @param {!shaka.extern.xml.Node} element\n * @return {?string}\n * @private\n */\n static getPlayReadyKID_(element) {\n return shaka.drm.PlayReady.getPlayReadyKID(element);\n }\n\n /**\n * Gets a initData from a protection element.\n *\n * @param {!shaka.extern.xml.Node} element\n * @param {string} systemID\n * @param {?string} keyId\n * @return {?Array<shaka.extern.InitDataOverride>}\n * @private\n */\n static getInitDataFromPro_(element, systemID, keyId) {\n const Uint8ArrayUtils = shaka.util.Uint8ArrayUtils;\n const data = Uint8ArrayUtils.fromBase64(\n /** @type {string} */ (shaka.util.TXml.getTextContents(element)));\n const systemId = Uint8ArrayUtils.fromHex(systemID.replace(/-/g, ''));\n const keyIds = new Set();\n const psshVersion = 0;\n const pssh =\n shaka.util.Pssh.createPssh(data, systemId, keyIds, psshVersion);\n return [\n {\n initData: pssh,\n initDataType: 'cenc',\n keyId: keyId,\n },\n ];\n }\n\n /**\n * Creates DrmInfo objects from an array of elements.\n *\n * @param {!Array<!shaka.extern.xml.Node>} elements\n * @param {!Object<string, string>} keySystemsBySystemId\n * @return {!Array<shaka.extern.DrmInfo>}\n * @private\n */\n static convertElements_(elements, keySystemsBySystemId) {\n const ContentProtection = shaka.mss.ContentProtection;\n const ManifestParserUtils = shaka.util.ManifestParserUtils;\n const licenseUrlParsers = ContentProtection.licenseUrlParsers_;\n\n /** @type {!Array<shaka.extern.DrmInfo>} */\n const out = [];\n\n for (let i = 0; i < elements.length; i++) {\n const element = elements[i];\n const systemID = element.attributes['SystemID'].toLowerCase();\n const keySystem = keySystemsBySystemId[systemID];\n if (keySystem) {\n const KID = ContentProtection.getPlayReadyKID_(element);\n const initData = ContentProtection.getInitDataFromPro_(\n element, systemID, KID);\n\n const info = ManifestParserUtils.createDrmInfo(\n keySystem, /* encryptionScheme= */ 'cenc', initData);\n if (KID) {\n info.keyIds.add(KID);\n }\n\n const licenseParser = licenseUrlParsers.get(keySystem);\n if (licenseParser) {\n info.licenseServerUri = licenseParser(element);\n }\n\n out.push(info);\n }\n }\n\n return out;\n }\n};\n\n/**\n * A map of key system name to license server url parser.\n *\n * @const {!Map<string, function(!shaka.extern.xml.Node)>}\n * @private\n */\nshaka.mss.ContentProtection.licenseUrlParsers_ = new Map()\n .set('com.microsoft.playready',\n shaka.mss.ContentProtection.getPlayReadyLicenseUrl)\n .set('com.microsoft.playready.recommendation',\n shaka.mss.ContentProtection.getPlayReadyLicenseUrl)\n .set('com.microsoft.playready.software',\n shaka.mss.ContentProtection.getPlayReadyLicenseUrl)\n .set('com.microsoft.playready.hardware',\n shaka.mss.ContentProtection.getPlayReadyLicenseUrl);\n\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.transmuxer.Mp4Generator');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.util.ManifestParserUtils');\ngoog.require('shaka.util.Platform');\ngoog.require('shaka.util.Uint8ArrayUtils');\n\n\nshaka.transmuxer.Mp4Generator = class {\n /**\n * @param {!Array<shaka.transmuxer.Mp4Generator.StreamInfo>} streamInfos\n */\n constructor(streamInfos) {\n shaka.transmuxer.Mp4Generator.initStaticProperties_();\n\n /** @private {!Array<shaka.transmuxer.Mp4Generator.StreamInfo>} */\n this.streamInfos_ = streamInfos;\n }\n\n /**\n * Generate a Init Segment (MP4).\n *\n * @return {!Uint8Array}\n */\n initSegment() {\n const Mp4Generator = shaka.transmuxer.Mp4Generator;\n const movie = this.moov_();\n const length = Mp4Generator.FTYP_.byteLength + movie.byteLength;\n const result = new Uint8Array(length);\n result.set(Mp4Generator.FTYP_);\n result.set(movie, Mp4Generator.FTYP_.byteLength);\n return result;\n }\n\n /**\n * Generate a MOOV box\n *\n * @return {!Uint8Array}\n * @private\n */\n moov_() {\n goog.asserts.assert(this.streamInfos_.length > 0,\n 'StreamInfos must have elements');\n const Mp4Generator = shaka.transmuxer.Mp4Generator;\n const trakArrays = [];\n for (const streamInfo of this.streamInfos_) {\n trakArrays.push(this.trak_(streamInfo));\n }\n const traks = shaka.util.Uint8ArrayUtils.concat(...trakArrays);\n const firstStreamInfo = this.streamInfos_[0];\n return Mp4Generator.box('moov',\n this.mvhd_(firstStreamInfo),\n traks,\n this.mvex_(),\n this.pssh_(firstStreamInfo));\n }\n\n /**\n * Generate a MVHD box\n *\n * @param {shaka.transmuxer.Mp4Generator.StreamInfo} streamInfo\n * @return {!Uint8Array}\n * @private\n */\n mvhd_(streamInfo) {\n const Mp4Generator = shaka.transmuxer.Mp4Generator;\n const duration = streamInfo.duration * streamInfo.timescale;\n const upperWordDuration =\n Math.floor(duration / (Mp4Generator.UINT32_MAX_ + 1));\n const lowerWordDuration =\n Math.floor(duration % (Mp4Generator.UINT32_MAX_ + 1));\n const bytes = new Uint8Array([\n 0x01, // version 1\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x02, // creation_time\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x03, // modification_time\n ...this.breakNumberIntoBytes_(streamInfo.timescale, 4), // timescale\n ...this.breakNumberIntoBytes_(upperWordDuration, 4),\n ...this.breakNumberIntoBytes_(lowerWordDuration, 4), // duration\n 0x00, 0x01, 0x00, 0x00, // 1.0 rate\n 0x01, 0x00, // 1.0 volume\n 0x00, 0x00, // reserved\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x01, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x40, 0x00, 0x00, 0x00, // transformation: unity matrix\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n 0xff, 0xff, 0xff, 0xff, // next_track_ID\n ]);\n return Mp4Generator.box('mvhd', bytes);\n }\n\n /**\n * Generate a TRAK box\n *\n * @param {shaka.transmuxer.Mp4Generator.StreamInfo} streamInfo\n * @return {!Uint8Array}\n * @private\n */\n trak_(streamInfo) {\n const Mp4Generator = shaka.transmuxer.Mp4Generator;\n return Mp4Generator.box('trak',\n this.tkhd_(streamInfo), this.mdia_(streamInfo));\n }\n\n /**\n * Generate a TKHD box\n *\n * @param {shaka.transmuxer.Mp4Generator.StreamInfo} streamInfo\n * @return {!Uint8Array}\n * @private\n */\n tkhd_(streamInfo) {\n const Mp4Generator = shaka.transmuxer.Mp4Generator;\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n const id = streamInfo.id + 1;\n let width = streamInfo.stream.width || 0;\n let height = streamInfo.stream.height || 0;\n if (streamInfo.type == ContentType.AUDIO) {\n width = 0;\n height = 0;\n }\n const duration = streamInfo.duration * streamInfo.timescale;\n const upperWordDuration =\n Math.floor(duration / (Mp4Generator.UINT32_MAX_ + 1));\n const lowerWordDuration =\n Math.floor(duration % (Mp4Generator.UINT32_MAX_ + 1));\n const bytes = new Uint8Array([\n 0x01, // version 1\n 0x00, 0x00, 0x07, // flags\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x02, // creation_time\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x03, // modification_time\n ...this.breakNumberIntoBytes_(id, 4), // track_ID\n 0x00, 0x00, 0x00, 0x00, // reserved\n ...this.breakNumberIntoBytes_(upperWordDuration, 4),\n ...this.breakNumberIntoBytes_(lowerWordDuration, 4), // duration\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x00, // layer\n 0x00, 0x00, // alternate_group\n 0x00, 0x00, // non-audio track volume\n 0x00, 0x00, // reserved\n 0x00, 0x01, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x01, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x40, 0x00, 0x00, 0x00, // transformation: unity matrix\n ...this.breakNumberIntoBytes_(width, 2),\n 0x00, 0x00, // width\n ...this.breakNumberIntoBytes_(height, 2),\n 0x00, 0x00, // height\n ]);\n return Mp4Generator.box('tkhd', bytes);\n }\n\n /**\n * Generate a MDIA box\n *\n * @param {shaka.transmuxer.Mp4Generator.StreamInfo} streamInfo\n * @return {!Uint8Array}\n * @private\n */\n mdia_(streamInfo) {\n const Mp4Generator = shaka.transmuxer.Mp4Generator;\n return Mp4Generator.box('mdia', this.mdhd_(streamInfo),\n this.hdlr_(streamInfo), this.minf_(streamInfo));\n }\n\n /**\n * Generate a MDHD box\n *\n * @param {shaka.transmuxer.Mp4Generator.StreamInfo} streamInfo\n * @return {!Uint8Array}\n * @private\n */\n mdhd_(streamInfo) {\n const Mp4Generator = shaka.transmuxer.Mp4Generator;\n const duration = streamInfo.duration * streamInfo.timescale;\n const upperWordDuration =\n Math.floor(duration / (Mp4Generator.UINT32_MAX_ + 1));\n const lowerWordDuration =\n Math.floor(duration % (Mp4Generator.UINT32_MAX_ + 1));\n const language = streamInfo.stream.language;\n const languageNumber = ((language.charCodeAt(0) - 0x60) << 10) |\n ((language.charCodeAt(1) - 0x60) << 5) |\n ((language.charCodeAt(2) - 0x60));\n const bytes = new Uint8Array([\n 0x01, // version 1\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x02, // creation_time\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x03, // modification_time\n ...this.breakNumberIntoBytes_(streamInfo.timescale, 4), // timescale\n ...this.breakNumberIntoBytes_(upperWordDuration, 4),\n ...this.breakNumberIntoBytes_(lowerWordDuration, 4), // duration\n ...this.breakNumberIntoBytes_(languageNumber, 2), // language\n 0x00, 0x00,\n ]);\n return Mp4Generator.box('mdhd', bytes);\n }\n\n /**\n * Generate a HDLR box\n *\n * @param {shaka.transmuxer.Mp4Generator.StreamInfo} streamInfo\n * @return {!Uint8Array}\n * @private\n */\n hdlr_(streamInfo) {\n const Mp4Generator = shaka.transmuxer.Mp4Generator;\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n let bytes = new Uint8Array([]);\n switch (streamInfo.type) {\n case ContentType.VIDEO:\n bytes = Mp4Generator.HDLR_TYPES_.video;\n break;\n case ContentType.AUDIO:\n bytes = Mp4Generator.HDLR_TYPES_.audio;\n break;\n }\n return Mp4Generator.box('hdlr', bytes);\n }\n\n /**\n * Generate a MINF box\n *\n * @param {shaka.transmuxer.Mp4Generator.StreamInfo} streamInfo\n * @return {!Uint8Array}\n * @private\n */\n minf_(streamInfo) {\n const Mp4Generator = shaka.transmuxer.Mp4Generator;\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n switch (streamInfo.type) {\n case ContentType.VIDEO:\n return Mp4Generator.box(\n 'minf', Mp4Generator.box('vmhd', Mp4Generator.VMHD_),\n Mp4Generator.DINF_, this.stbl_(streamInfo));\n case ContentType.AUDIO:\n return Mp4Generator.box(\n 'minf', Mp4Generator.box('smhd', Mp4Generator.SMHD_),\n Mp4Generator.DINF_, this.stbl_(streamInfo));\n }\n return new Uint8Array([]);\n }\n\n /**\n * Generate a STBL box\n *\n * @param {shaka.transmuxer.Mp4Generator.StreamInfo} streamInfo\n * @return {!Uint8Array}\n * @private\n */\n stbl_(streamInfo) {\n const Mp4Generator = shaka.transmuxer.Mp4Generator;\n return Mp4Generator.box(\n 'stbl',\n this.stsd_(streamInfo),\n Mp4Generator.box('stts', Mp4Generator.STTS_),\n Mp4Generator.box('stsc', Mp4Generator.STSC_),\n Mp4Generator.box('stsz', Mp4Generator.STSZ_),\n Mp4Generator.box('stco', Mp4Generator.STCO_));\n }\n\n /**\n * Generate a STSD box\n *\n * @param {shaka.transmuxer.Mp4Generator.StreamInfo} streamInfo\n * @return {!Uint8Array}\n * @private\n */\n stsd_(streamInfo) {\n const Mp4Generator = shaka.transmuxer.Mp4Generator;\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n let audioCodec = 'aac';\n if (streamInfo.codecs.includes('mp3')) {\n audioCodec = 'mp3';\n } else if (streamInfo.codecs.includes('ac-3')) {\n if (shaka.util.Platform.requiresEC3InitSegments()) {\n audioCodec = 'ec-3';\n } else {\n audioCodec = 'ac-3';\n }\n } else if (streamInfo.codecs.includes('ec-3')) {\n audioCodec = 'ec-3';\n } else if (streamInfo.codecs.includes('opus')) {\n audioCodec = 'opus';\n }\n let bytes = new Uint8Array([]);\n switch (streamInfo.type) {\n case ContentType.VIDEO:\n if (streamInfo.codecs.includes('avc1')) {\n bytes = this.avc1_(streamInfo);\n } else if (streamInfo.codecs.includes('hvc1')) {\n bytes = this.hvc1_(streamInfo);\n }\n break;\n case ContentType.AUDIO:\n if (audioCodec == 'mp3') {\n bytes = this.mp3_(streamInfo);\n } else if (audioCodec == 'ac-3') {\n bytes = this.ac3_(streamInfo);\n } else if (audioCodec == 'ec-3') {\n bytes = this.ec3_(streamInfo);\n } else if (audioCodec == 'opus') {\n bytes = this.opus_(streamInfo);\n } else {\n bytes = this.mp4a_(streamInfo);\n }\n break;\n }\n return Mp4Generator.box('stsd', Mp4Generator.STSD_, bytes);\n }\n\n /**\n * Generate a AVC1 box\n *\n * @param {shaka.transmuxer.Mp4Generator.StreamInfo} streamInfo\n * @return {!Uint8Array}\n * @private\n */\n avc1_(streamInfo) {\n const Mp4Generator = shaka.transmuxer.Mp4Generator;\n\n const width = streamInfo.stream.width || 0;\n const height = streamInfo.stream.height || 0;\n\n let avcCBox;\n if (streamInfo.videoConfig.byteLength > 0) {\n avcCBox = Mp4Generator.box('avcC', streamInfo.videoConfig);\n } else {\n avcCBox = Mp4Generator.box('avcC', this.avcC_(streamInfo));\n }\n\n const avc1Bytes = new Uint8Array([\n 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // data_reference_index\n 0x00, 0x00, // pre_defined\n 0x00, 0x00, // reserved\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n ...this.breakNumberIntoBytes_(width, 2), // width\n ...this.breakNumberIntoBytes_(height, 2), // height\n 0x00, 0x48, 0x00, 0x00, // horizontal resolution\n 0x00, 0x48, 0x00, 0x00, // vertical resolution\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // frame_count\n 0x13,\n 0x76, 0x69, 0x64, 0x65,\n 0x6f, 0x6a, 0x73, 0x2d,\n 0x63, 0x6f, 0x6e, 0x74,\n 0x72, 0x69, 0x62, 0x2d,\n 0x68, 0x6c, 0x73, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, // compressor name\n 0x00, 0x18, // depth = 24\n 0x11, 0x11, // pre_defined = -1\n ]);\n\n let boxName = 'avc1';\n const paspBox = this.pasp_(streamInfo);\n let sinfBox = new Uint8Array([]);\n if (streamInfo.encrypted) {\n sinfBox = this.sinf_(streamInfo);\n boxName = 'encv';\n }\n return Mp4Generator.box(boxName, avc1Bytes, avcCBox, paspBox, sinfBox);\n }\n\n /**\n * Generate a AVCC box\n *\n * @param {shaka.transmuxer.Mp4Generator.StreamInfo} streamInfo\n * @return {!Uint8Array}\n * @private\n */\n avcC_(streamInfo) {\n const NALU_TYPE_SPS = 7;\n const NALU_TYPE_PPS = 8;\n\n // length = 7 by default (0 SPS and 0 PPS)\n let avcCLength = 7;\n\n // First get all SPS and PPS from nalus\n const sps = [];\n const pps = [];\n let AVCProfileIndication = 0;\n let AVCLevelIndication = 0;\n let profileCompatibility = 0;\n for (let i = 0; i < streamInfo.videoNalus.length; i++) {\n const naluBytes = this.hexStringToBuffer_(streamInfo.videoNalus[i]);\n const naluType = naluBytes[0] & 0x1F;\n switch (naluType) {\n case NALU_TYPE_SPS:\n sps.push(naluBytes);\n // 2 = sequenceParameterSetLength field length\n avcCLength += naluBytes.length + 2;\n break;\n case NALU_TYPE_PPS:\n pps.push(naluBytes);\n // 2 = pictureParameterSetLength field length\n avcCLength += naluBytes.length + 2;\n break;\n default:\n break;\n }\n }\n // Get profile and level from SPS\n if (sps.length > 0) {\n AVCProfileIndication = sps[0][1];\n profileCompatibility = sps[0][2];\n AVCLevelIndication = sps[0][3];\n }\n\n // Generate avcC buffer\n const avcCBytes = new Uint8Array(avcCLength);\n let i = 0;\n // configurationVersion = 1\n avcCBytes[i++] = 1;\n avcCBytes[i++] = AVCProfileIndication;\n avcCBytes[i++] = profileCompatibility;\n avcCBytes[i++] = AVCLevelIndication;\n // '11111' + lengthSizeMinusOne = 3\n avcCBytes[i++] = 0xFF;\n // '111' + numOfSequenceParameterSets\n avcCBytes[i++] = 0xE0 | sps.length;\n for (let n = 0; n < sps.length; n++) {\n avcCBytes[i++] = (sps[n].length & 0xFF00) >> 8;\n avcCBytes[i++] = (sps[n].length & 0x00FF);\n avcCBytes.set(sps[n], i);\n i += sps[n].length;\n }\n // numOfPictureParameterSets\n avcCBytes[i++] = pps.length;\n for (let n = 0; n < pps.length; n++) {\n avcCBytes[i++] = (pps[n].length & 0xFF00) >> 8;\n avcCBytes[i++] = (pps[n].length & 0x00FF);\n avcCBytes.set(pps[n], i);\n i += pps[n].length;\n }\n return avcCBytes;\n }\n\n /**\n * Generate a HVC1 box\n *\n * @param {shaka.transmuxer.Mp4Generator.StreamInfo} streamInfo\n * @return {!Uint8Array}\n * @private\n */\n hvc1_(streamInfo) {\n const Mp4Generator = shaka.transmuxer.Mp4Generator;\n\n const width = streamInfo.stream.width || 0;\n const height = streamInfo.stream.height || 0;\n\n let hvcCBox = new Uint8Array([]);\n if (streamInfo.videoConfig.byteLength > 0) {\n hvcCBox = Mp4Generator.box('hvcC', streamInfo.videoConfig);\n }\n\n const hvc1Bytes = new Uint8Array([\n 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // data_reference_index\n 0x00, 0x00, // pre_defined\n 0x00, 0x00, // reserved\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n ...this.breakNumberIntoBytes_(width, 2), // width\n ...this.breakNumberIntoBytes_(height, 2), // height\n 0x00, 0x48, 0x00, 0x00, // horizontal resolution\n 0x00, 0x48, 0x00, 0x00, // vertical resolution\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // frame_count\n 0x13,\n 0x76, 0x69, 0x64, 0x65,\n 0x6f, 0x6a, 0x73, 0x2d,\n 0x63, 0x6f, 0x6e, 0x74,\n 0x72, 0x69, 0x62, 0x2d,\n 0x68, 0x6c, 0x73, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, // compressor name\n 0x00, 0x18, // depth = 24\n 0x11, 0x11, // pre_defined = -1\n ]);\n\n let boxName = 'hvc1';\n const paspBox = this.pasp_(streamInfo);\n let sinfBox = new Uint8Array([]);\n if (streamInfo.encrypted) {\n sinfBox = this.sinf_(streamInfo);\n boxName = 'encv';\n }\n return Mp4Generator.box(boxName, hvc1Bytes, hvcCBox, paspBox, sinfBox);\n }\n\n /**\n * Generate a PASP box\n *\n * @param {shaka.transmuxer.Mp4Generator.StreamInfo} streamInfo\n * @return {!Uint8Array}\n * @private\n */\n pasp_(streamInfo) {\n if (!streamInfo.hSpacing && !streamInfo.vSpacing) {\n return new Uint8Array([]);\n }\n const Mp4Generator = shaka.transmuxer.Mp4Generator;\n const hSpacing = streamInfo.hSpacing;\n const vSpacing = streamInfo.vSpacing;\n const bytes = new Uint8Array([\n ...this.breakNumberIntoBytes_(hSpacing, 4), // hSpacing\n ...this.breakNumberIntoBytes_(vSpacing, 4), // vSpacing\n ]);\n return Mp4Generator.box('pasp', bytes);\n }\n\n /**\n * Generate STSD bytes\n *\n * @param {shaka.transmuxer.Mp4Generator.StreamInfo} streamInfo\n * @return {!Uint8Array}\n * @private\n */\n audioStsd_(streamInfo) {\n const channelsCount = streamInfo.stream.channelsCount || 2;\n const audioSamplingRate = streamInfo.stream.audioSamplingRate || 44100;\n const bytes = new Uint8Array([\n 0x00, 0x00, 0x00, // reserved\n 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // data_reference_index\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00,\n channelsCount, // channel count\n 0x00, 0x10, // sampleSize:16bits\n 0x00, 0x00, 0x00, 0x00, // reserved2\n ...this.breakNumberIntoBytes_(audioSamplingRate, 2), // Sample Rate\n 0x00, 0x00,\n ]);\n return bytes;\n }\n\n /**\n * Generate a .MP3 box\n *\n * @param {shaka.transmuxer.Mp4Generator.StreamInfo} streamInfo\n * @return {!Uint8Array}\n * @private\n */\n mp3_(streamInfo) {\n const Mp4Generator = shaka.transmuxer.Mp4Generator;\n return Mp4Generator.box('.mp3', this.audioStsd_(streamInfo));\n }\n\n /**\n * Generate a AC-3 box\n *\n * @param {shaka.transmuxer.Mp4Generator.StreamInfo} streamInfo\n * @return {!Uint8Array}\n * @private\n */\n ac3_(streamInfo) {\n const Mp4Generator = shaka.transmuxer.Mp4Generator;\n const dac3Box = Mp4Generator.box('dac3', streamInfo.audioConfig);\n\n let boxName = 'ac-3';\n let sinfBox = new Uint8Array([]);\n if (streamInfo.encrypted) {\n sinfBox = this.sinf_(streamInfo);\n boxName = 'enca';\n }\n return Mp4Generator.box(boxName,\n this.audioStsd_(streamInfo), dac3Box, sinfBox);\n }\n\n /**\n * Generate a EC-3 box\n *\n * @param {shaka.transmuxer.Mp4Generator.StreamInfo} streamInfo\n * @return {!Uint8Array}\n * @private\n */\n ec3_(streamInfo) {\n const Mp4Generator = shaka.transmuxer.Mp4Generator;\n const dec3Box = Mp4Generator.box('dec3', streamInfo.audioConfig);\n\n let boxName = 'ec-3';\n let sinfBox = new Uint8Array([]);\n if (streamInfo.encrypted) {\n sinfBox = this.sinf_(streamInfo);\n boxName = 'enca';\n }\n return Mp4Generator.box(boxName,\n this.audioStsd_(streamInfo), dec3Box, sinfBox);\n }\n\n /**\n * Generate a Opus box\n *\n * @param {shaka.transmuxer.Mp4Generator.StreamInfo} streamInfo\n * @return {!Uint8Array}\n * @private\n */\n opus_(streamInfo) {\n const Mp4Generator = shaka.transmuxer.Mp4Generator;\n const dopsBox = Mp4Generator.box('dOps', streamInfo.audioConfig);\n\n let boxName = 'Opus';\n let sinfBox = new Uint8Array([]);\n if (streamInfo.encrypted) {\n sinfBox = this.sinf_(streamInfo);\n boxName = 'enca';\n }\n return Mp4Generator.box(boxName,\n this.audioStsd_(streamInfo), dopsBox, sinfBox);\n }\n\n /**\n * Generate a MP4A box\n *\n * @param {shaka.transmuxer.Mp4Generator.StreamInfo} streamInfo\n * @return {!Uint8Array}\n * @private\n */\n mp4a_(streamInfo) {\n const Mp4Generator = shaka.transmuxer.Mp4Generator;\n let esdsBox;\n if (streamInfo.audioConfig.byteLength > 0) {\n esdsBox = Mp4Generator.box('esds', streamInfo.audioConfig);\n } else {\n esdsBox = Mp4Generator.box('esds', this.esds_(streamInfo));\n }\n\n let boxName = 'mp4a';\n let sinfBox = new Uint8Array([]);\n if (streamInfo.encrypted) {\n sinfBox = this.sinf_(streamInfo);\n boxName = 'enca';\n }\n return Mp4Generator.box(boxName,\n this.audioStsd_(streamInfo), esdsBox, sinfBox);\n }\n\n /**\n * Generate a ESDS box\n *\n * @param {shaka.transmuxer.Mp4Generator.StreamInfo} streamInfo\n * @return {!Uint8Array}\n * @private\n */\n esds_(streamInfo) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n\n const id = streamInfo.id + 1;\n const channelsCount = streamInfo.stream.channelsCount || 2;\n const audioSamplingRate = streamInfo.stream.audioSamplingRate || 44100;\n\n const audioCodec = shaka.util.ManifestParserUtils.guessCodecs(\n ContentType.AUDIO, streamInfo.codecs.split(','));\n\n const samplingFrequencyIndex = {\n 96000: 0x0,\n 88200: 0x1,\n 64000: 0x2,\n 48000: 0x3,\n 44100: 0x4,\n 32000: 0x5,\n 24000: 0x6,\n 22050: 0x7,\n 16000: 0x8,\n 12000: 0x9,\n 11025: 0xA,\n 8000: 0xB,\n 7350: 0xC,\n };\n\n let indexFreq = samplingFrequencyIndex[audioSamplingRate];\n // In HE AAC Sampling frequence equals to SamplingRate * 2\n if (audioCodec === 'mp4a.40.5' || audioCodec === 'mp4a.40.29') {\n indexFreq = samplingFrequencyIndex[audioSamplingRate * 2];\n }\n\n const audioObjectType = parseInt(audioCodec.split('.').pop(), 10);\n\n return new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n\n // ES_Descriptor\n 0x03, // tag, ES_DescriptionTag\n 0x19, // length\n ...this.breakNumberIntoBytes_(id, 2), // ES_ID\n 0x00, // streamDependenceFlag, URL_flag, reserved, streamPriority\n\n // DecoderConfigDescriptor\n 0x04, // tag, DecoderConfigDescriptionTag\n 0x11, // length\n 0x40, // object type\n 0x15, // streamType\n 0x00, 0x00, 0x00, // bufferSizeDB\n 0x00, 0x00, 0x00, 0x00, // maxBitrate\n 0x00, 0x00, 0x00, 0x00, // avgBitrate\n\n // DecoderSpecificInfo\n 0x05, // tag, DecoderSpecificInfoTag\n 0x02, // length\n // ISO/IEC 14496-3, AudioSpecificConfig\n // for samplingFrequencyIndex see\n // ISO/IEC 13818-7:2006, 8.1.3.2.2, Table 35\n (audioObjectType << 3) | (indexFreq >>> 1),\n (indexFreq << 7) | (channelsCount << 3),\n 0x06, 0x01, 0x02, // GASpecificConfig\n ]);\n }\n\n /**\n * Generate a MVEX box\n *\n * @return {!Uint8Array}\n * @private\n */\n mvex_() {\n const Mp4Generator = shaka.transmuxer.Mp4Generator;\n const trexArrays = [];\n for (const streamInfo of this.streamInfos_) {\n trexArrays.push(this.trex_(streamInfo));\n }\n const trexs = shaka.util.Uint8ArrayUtils.concat(...trexArrays);\n return Mp4Generator.box('mvex', trexs);\n }\n\n /**\n * Generate a TREX box\n *\n * @param {shaka.transmuxer.Mp4Generator.StreamInfo} streamInfo\n * @return {!Uint8Array}\n * @private\n */\n trex_(streamInfo) {\n const Mp4Generator = shaka.transmuxer.Mp4Generator;\n const id = streamInfo.id + 1;\n const bytes = new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n ...this.breakNumberIntoBytes_(id, 4), // track_ID\n 0x00, 0x00, 0x00, 0x01, // default_sample_description_index\n 0x00, 0x00, 0x00, 0x00, // default_sample_duration\n 0x00, 0x00, 0x00, 0x00, // default_sample_size\n 0x00, 0x00, 0x00, 0x00, // default_sample_flags\n ]);\n return Mp4Generator.box('trex', bytes);\n }\n\n /**\n * Generate a PSSH box\n *\n * @param {shaka.transmuxer.Mp4Generator.StreamInfo} streamInfo\n * @return {!Uint8Array}\n * @private\n */\n pssh_(streamInfo) {\n const initDatas = [];\n if (!streamInfo.encrypted) {\n return new Uint8Array([]);\n }\n\n for (const drmInfo of streamInfo.stream.drmInfos) {\n if (!drmInfo.initData) {\n continue;\n }\n for (const initData of drmInfo.initData) {\n initDatas.push(initData.initData);\n }\n }\n const boxes = shaka.util.Uint8ArrayUtils.concat(...initDatas);\n return boxes;\n }\n\n /**\n * Generate a SINF box\n *\n * @param {shaka.transmuxer.Mp4Generator.StreamInfo} streamInfo\n * @return {!Uint8Array}\n * @private\n */\n sinf_(streamInfo) {\n const Mp4Generator = shaka.transmuxer.Mp4Generator;\n return Mp4Generator.box('sinf',\n this.frma_(streamInfo), this.schm_(), this.schi_(streamInfo));\n }\n\n /**\n * Generate a FRMA box\n *\n * @param {shaka.transmuxer.Mp4Generator.StreamInfo} streamInfo\n * @return {!Uint8Array}\n * @private\n */\n frma_(streamInfo) {\n const codec = streamInfo.codecs.substring(\n 0, streamInfo.codecs.indexOf('.'));\n const Mp4Generator = shaka.transmuxer.Mp4Generator;\n const codecNumber = this.stringToCharCode_(codec);\n const bytes = new Uint8Array([\n ...this.breakNumberIntoBytes_(codecNumber, 4),\n ]);\n return Mp4Generator.box('frma', bytes);\n }\n\n /**\n * Generate a SCHM box\n *\n * @return {!Uint8Array}\n * @private\n */\n schm_() {\n const Mp4Generator = shaka.transmuxer.Mp4Generator;\n const bytes = new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n 0x63, 0x65, 0x6e, 0x63, // Scheme: cenc\n 0x00, 0x01, 0x00, 0x00, // Scheme version: 1.0\n ]);\n return Mp4Generator.box('schm', bytes);\n }\n\n /**\n * Generate a SCHI box\n *\n * @param {shaka.transmuxer.Mp4Generator.StreamInfo} streamInfo\n * @return {!Uint8Array}\n * @private\n */\n schi_(streamInfo) {\n const Mp4Generator = shaka.transmuxer.Mp4Generator;\n return Mp4Generator.box('schi', this.tenc_(streamInfo));\n }\n\n /**\n * Generate a TENC box\n *\n * @param {shaka.transmuxer.Mp4Generator.StreamInfo} streamInfo\n * @return {!Uint8Array}\n * @private\n */\n tenc_(streamInfo) {\n // Default key ID: all zeros (dummy)\n let defaultKeyId = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n ]);\n for (const drmInfo of streamInfo.stream.drmInfos) {\n if (drmInfo && drmInfo.keyIds && drmInfo.keyIds.size) {\n for (const keyId of drmInfo.keyIds) {\n defaultKeyId = this.hexStringToBuffer_(keyId);\n }\n }\n }\n\n const Mp4Generator = shaka.transmuxer.Mp4Generator;\n const bytes = new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, // Reserved fields\n 0x01, // Default protected: true\n 0x08, // Default per-sample IV size: 8\n ]);\n goog.asserts.assert(defaultKeyId, 'Default KID should be non-null');\n return Mp4Generator.box('tenc', bytes, defaultKeyId);\n }\n\n /**\n * Generate a Segment Data (MP4).\n *\n * @return {!Uint8Array}\n */\n segmentData() {\n const segmentDataArray = [];\n for (const streamInfo of this.streamInfos_) {\n segmentDataArray.push(\n ...[this.moof_(streamInfo), this.mdat_(streamInfo)]);\n }\n const result = shaka.util.Uint8ArrayUtils.concat(...segmentDataArray);\n return result;\n }\n\n /**\n * Generate a MOOF box\n *\n * @param {shaka.transmuxer.Mp4Generator.StreamInfo} streamInfo\n * @return {!Uint8Array}\n * @private\n */\n moof_(streamInfo) {\n const Mp4Generator = shaka.transmuxer.Mp4Generator;\n return Mp4Generator.box('moof',\n this.mfhd_(streamInfo), this.traf_(streamInfo));\n }\n\n /**\n * Generate a MOOF box\n *\n * @param {shaka.transmuxer.Mp4Generator.StreamInfo} streamInfo\n * @return {!Uint8Array}\n * @private\n */\n mfhd_(streamInfo) {\n const Mp4Generator = shaka.transmuxer.Mp4Generator;\n const sequenceNumber =\n streamInfo.data ? streamInfo.data.sequenceNumber : 0;\n const bytes = new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n ...this.breakNumberIntoBytes_(sequenceNumber, 4),\n ]);\n return Mp4Generator.box('mfhd', bytes);\n }\n\n /**\n * Generate a TRAF box\n *\n * @param {shaka.transmuxer.Mp4Generator.StreamInfo} streamInfo\n * @return {!Uint8Array}\n * @private\n */\n traf_(streamInfo) {\n const Mp4Generator = shaka.transmuxer.Mp4Generator;\n const sampleDependencyTable = this.sdtp_(streamInfo);\n const offset = sampleDependencyTable.length +\n 32 + // tfhd\n 20 + // tfdt\n 8 + // traf header\n 16 + // mfhd\n 8 + // moof header\n 8; // mdat header;\n return Mp4Generator.box('traf',\n this.tfhd_(streamInfo),\n this.tfdt_(streamInfo),\n this.trun_(streamInfo, offset),\n sampleDependencyTable);\n }\n\n /**\n * Generate a SDTP box\n *\n * @param {shaka.transmuxer.Mp4Generator.StreamInfo} streamInfo\n * @return {!Uint8Array}\n * @private\n */\n sdtp_(streamInfo) {\n const Mp4Generator = shaka.transmuxer.Mp4Generator;\n const samples = streamInfo.data ? streamInfo.data.samples : [];\n const bytes = new Uint8Array(4 + samples.length);\n // leave the full box header (4 bytes) all zero\n // write the sample table\n for (let i = 0; i < samples.length; i++) {\n const flags = samples[i].flags;\n bytes[i + 4] = (flags.dependsOn << 4) |\n (flags.isDependedOn << 2) |\n flags.hasRedundancy;\n }\n return Mp4Generator.box('sdtp', bytes);\n }\n\n /**\n * Generate a TFHD box\n *\n * @param {shaka.transmuxer.Mp4Generator.StreamInfo} streamInfo\n * @return {!Uint8Array}\n * @private\n */\n tfhd_(streamInfo) {\n const Mp4Generator = shaka.transmuxer.Mp4Generator;\n const id = streamInfo.id + 1;\n const bytes = new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x3a, // flags\n ...this.breakNumberIntoBytes_(id, 4), // track_ID\n 0x00, 0x00, 0x00, 0x01, // sample_description_index\n 0x00, 0x00, 0x00, 0x00, // default_sample_duration\n 0x00, 0x00, 0x00, 0x00, // default_sample_size\n 0x00, 0x00, 0x00, 0x00, // default_sample_flags\n ]);\n return Mp4Generator.box('tfhd', bytes);\n }\n\n /**\n * Generate a TFDT box\n *\n * @param {shaka.transmuxer.Mp4Generator.StreamInfo} streamInfo\n * @return {!Uint8Array}\n * @private\n */\n tfdt_(streamInfo) {\n const Mp4Generator = shaka.transmuxer.Mp4Generator;\n const baseMediaDecodeTime =\n streamInfo.data ? streamInfo.data.baseMediaDecodeTime : 0;\n const upperWordBaseMediaDecodeTime =\n Math.floor(baseMediaDecodeTime / (Mp4Generator.UINT32_MAX_ + 1));\n const lowerWordBaseMediaDecodeTime =\n Math.floor(baseMediaDecodeTime % (Mp4Generator.UINT32_MAX_ + 1));\n const bytes = new Uint8Array([\n 0x01, // version 1\n 0x00, 0x00, 0x00, // flags\n ...this.breakNumberIntoBytes_(upperWordBaseMediaDecodeTime, 4),\n ...this.breakNumberIntoBytes_(lowerWordBaseMediaDecodeTime, 4),\n ]);\n return Mp4Generator.box('tfdt', bytes);\n }\n\n /**\n * Generate a TRUN box\n *\n * @param {shaka.transmuxer.Mp4Generator.StreamInfo} streamInfo\n * @param {number} offset\n * @return {!Uint8Array}\n * @private\n */\n trun_(streamInfo, offset) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n const Mp4Generator = shaka.transmuxer.Mp4Generator;\n\n const samples = streamInfo.data ? streamInfo.data.samples : [];\n const samplesLength = samples.length;\n const bytesLen = 12 + 16 * samplesLength;\n const bytes = new Uint8Array(bytesLen);\n offset += 8 + bytesLen;\n const isVideo = streamInfo.type === ContentType.VIDEO;\n bytes.set(\n [\n // version 1 for video with signed-int sample_composition_time_offset\n isVideo ? 0x01 : 0x00,\n 0x00, 0x0f, 0x01, // flags\n ...this.breakNumberIntoBytes_(samplesLength, 4), // sample_count\n ...this.breakNumberIntoBytes_(offset, 4), // data_offset\n ],\n 0,\n );\n for (let i = 0; i < samplesLength; i++) {\n const sample = samples[i];\n const duration = this.breakNumberIntoBytes_(sample.duration, 4);\n const size = this.breakNumberIntoBytes_(sample.size, 4);\n const flags = sample.flags;\n const cts = this.breakNumberIntoBytes_(sample.cts, 4);\n bytes.set(\n [\n ...duration, // sample_duration\n ...size, // sample_size\n (flags.isLeading << 2) | flags.dependsOn,\n (flags.isDependedOn << 6) | (flags.hasRedundancy << 4) |\n flags.isNonSync,\n flags.degradPrio & (0xf0 << 8),\n flags.degradPrio & 0x0f, // sample_flags\n ...cts, // sample_composition_time_offset\n ],\n 12 + 16 * i,\n );\n }\n return Mp4Generator.box('trun', bytes);\n }\n\n /**\n * Generate a MDAT box\n *\n * @param {shaka.transmuxer.Mp4Generator.StreamInfo} streamInfo\n * @return {!Uint8Array}\n * @private\n */\n mdat_(streamInfo) {\n const Mp4Generator = shaka.transmuxer.Mp4Generator;\n const samples = streamInfo.data ? streamInfo.data.samples : [];\n const allData = samples.map((sample) => sample.data);\n const bytes = shaka.util.Uint8ArrayUtils.concat(...allData);\n return Mp4Generator.box('mdat', bytes);\n }\n\n\n /**\n * @param {number} number\n * @param {number} numBytes\n * @return {!Array<number>}\n * @private\n */\n breakNumberIntoBytes_(number, numBytes) {\n const bytes = [];\n for (let byte = numBytes - 1; byte >= 0; byte--) {\n bytes.push((number >> (8 * byte)) & 0xff);\n }\n return bytes;\n }\n\n /**\n * Convert a hex string to buffer.\n *\n * @param {string} str\n * @return {Uint8Array}\n * @private\n */\n hexStringToBuffer_(str) {\n const buf = new Uint8Array(str.length / 2);\n for (let i = 0; i < str.length / 2; i += 1) {\n buf[i] = parseInt(String(str[i * 2] + str[i * 2 + 1]), 16);\n }\n return buf;\n }\n\n /**\n * Convert a string to char code.\n *\n * @param {string} str\n * @return {number}\n * @private\n */\n stringToCharCode_(str) {\n let code = 0;\n for (let i = 0; i < str.length; i += 1) {\n code |= str.charCodeAt(i) << ((str.length - i - 1) * 8);\n }\n return code;\n }\n\n /**\n * @private\n */\n static initStaticProperties_() {\n const Mp4Generator = shaka.transmuxer.Mp4Generator;\n if (Mp4Generator.initialized_) {\n return;\n }\n\n Mp4Generator.initialized_ = true;\n\n const majorBrand = new Uint8Array([105, 115, 111, 109]); // isom\n const avc1Brand = new Uint8Array([97, 118, 99, 49]); // avc1\n const minorVersion = new Uint8Array([0, 0, 0, 1]);\n\n Mp4Generator.FTYP_ = Mp4Generator.box(\n 'ftyp', majorBrand, minorVersion, majorBrand, avc1Brand);\n const drefBox = Mp4Generator.box('dref', Mp4Generator.DREF_);\n Mp4Generator.DINF_ = Mp4Generator.box('dinf', drefBox);\n }\n\n /**\n * Generate a box\n *\n * @param {string} boxName\n * @param {...!Uint8Array} payload\n * @return {!Uint8Array}\n */\n static box(boxName, ...payload) {\n let type = shaka.transmuxer.Mp4Generator.BOX_TYPES_.get(boxName);\n if (!type) {\n type = [\n boxName.charCodeAt(0),\n boxName.charCodeAt(1),\n boxName.charCodeAt(2),\n boxName.charCodeAt(3),\n ];\n shaka.transmuxer.Mp4Generator.BOX_TYPES_.set(boxName, type);\n }\n // make the header for the box\n let size = 8;\n // calculate the total size we need to allocate\n for (let i = payload.length - 1; i >= 0; i--) {\n size += payload[i].byteLength;\n }\n const result = new Uint8Array(size);\n result[0] = (size >> 24) & 0xff;\n result[1] = (size >> 16) & 0xff;\n result[2] = (size >> 8) & 0xff;\n result[3] = size & 0xff;\n result.set(type, 4);\n\n // copy the payload into the result\n for (let i = 0, pointer = 8; i < payload.length; i++) {\n // copy payload[i] array @ offset pointer\n result.set(payload[i], pointer);\n pointer += payload[i].byteLength;\n }\n return result;\n }\n};\n\n/**\n * @private {boolean}\n */\nshaka.transmuxer.Mp4Generator.initialized_ = false;\n\n\n/**\n * @private {number}\n */\nshaka.transmuxer.Mp4Generator.UINT32_MAX_ = Math.pow(2, 32) - 1;\n\n/**\n * @private {!Map<string, !Array<number>>}\n */\nshaka.transmuxer.Mp4Generator.BOX_TYPES_ = new Map();\n\n/**\n * @private {{video: !Uint8Array, audio: !Uint8Array}}\n */\nshaka.transmuxer.Mp4Generator.HDLR_TYPES_ = {\n video: new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n 0x76, 0x69, 0x64, 0x65, // handler_type: 'vide'\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x56, 0x69, 0x64, 0x65,\n 0x6f, 0x48, 0x61, 0x6e,\n 0x64, 0x6c, 0x65, 0x72, 0x00, // name: 'VideoHandler'\n ]),\n audio: new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n 0x73, 0x6f, 0x75, 0x6e, // handler_type: 'soun'\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x53, 0x6f, 0x75, 0x6e,\n 0x64, 0x48, 0x61, 0x6e,\n 0x64, 0x6c, 0x65, 0x72, 0x00, // name: 'SoundHandler'\n ]),\n};\n\n/**\n * @private {!Uint8Array}\n */\nshaka.transmuxer.Mp4Generator.STTS_ = new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00, // entry_count\n]);\n\n/**\n * @private {!Uint8Array}\n */\nshaka.transmuxer.Mp4Generator.STSC_ = new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00, // entry_count\n]);\n\n/**\n * @private {!Uint8Array}\n */\nshaka.transmuxer.Mp4Generator.STCO_ = new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00, // entry_count\n]);\n\n/**\n * @private {!Uint8Array}\n */\nshaka.transmuxer.Mp4Generator.STSZ_ = new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00, // sample_size\n 0x00, 0x00, 0x00, 0x00, // sample_count\n]);\n\n/**\n * @private {!Uint8Array}\n */\nshaka.transmuxer.Mp4Generator.VMHD_ = new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x01, // flags\n 0x00, 0x00, // graphics mode\n 0x00, 0x00,\n 0x00, 0x00,\n 0x00, 0x00, // op color\n]);\n\n/**\n * @private {!Uint8Array}\n */\nshaka.transmuxer.Mp4Generator.SMHD_ = new Uint8Array([\n 0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, // balance, 0 means centered\n 0x00, 0x00, // reserved\n]);\n\n/**\n * @private {!Uint8Array}\n */\nshaka.transmuxer.Mp4Generator.STSD_ = new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x01, // entry_count\n]);\n\n/**\n * @private {!Uint8Array}\n */\nshaka.transmuxer.Mp4Generator.FTYP_ = new Uint8Array([]);\n\n/**\n * @private {!Uint8Array}\n */\nshaka.transmuxer.Mp4Generator.DREF_ = new Uint8Array([\n 0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x01, // entry_count\n 0x00, 0x00, 0x00, 0x0c, // entry_size\n 0x75, 0x72, 0x6c, 0x20, // 'url' type\n 0x00, // version 0\n 0x00, 0x00, 0x01, // entry_flags\n]);\n\n/**\n * @private {!Uint8Array}\n */\nshaka.transmuxer.Mp4Generator.DINF_ = new Uint8Array([]);\n\n/**\n * @typedef {{\n * id: number,\n * type: string,\n * codecs: string,\n * encrypted: boolean,\n * timescale: number,\n * duration: number,\n * videoNalus: !Array<string>,\n * audioConfig: !Uint8Array,\n * videoConfig: !Uint8Array,\n * hSpacing: number,\n * vSpacing: number,\n * data: ?shaka.transmuxer.Mp4Generator.Data,\n * stream: !shaka.extern.Stream\n * }}\n *\n * @property {number} id\n * A unique ID\n * @property {string} type\n * Indicate the content type: 'video' or 'audio'.\n * @property {string} codecs\n * <i>Defaults to '' (i.e., unknown / not needed).</i> <br>\n * The Stream's codecs, e.g., 'avc1.4d4015' or 'vp9'<br>\n * See {@link https://tools.ietf.org/html/rfc6381}\n * @property {boolean} encrypted\n * Indicate if the stream is encrypted.\n * @property {number} timescale\n * The Stream's timescale.\n * @property {number} duration\n * The Stream's duration.\n * @property {!Array<string>} videoNalus\n * The stream's video nalus.\n * @property {!Uint8Array} audioConfig\n * The stream's audio config.\n * @property {!Uint8Array} videoConfig\n * The stream's video config.\n * @property {number} hSpacing\n * The stream's video horizontal spacing of pixels.\n * @property {number} vSpacing\n * The stream's video vertical spacing of pixels.\n * @property {?shaka.transmuxer.Mp4Generator.Data} data\n * The stream's data.\n * @property {!shaka.extern.Stream} stream\n * The Stream.\n */\nshaka.transmuxer.Mp4Generator.StreamInfo;\n\n/**\n * @typedef {{\n * sequenceNumber: number,\n * baseMediaDecodeTime: number,\n * samples: !Array<shaka.transmuxer.Mp4Generator.Mp4Sample>\n * }}\n *\n * @property {number} sequenceNumber\n * The sequence number.\n * @property {number} baseMediaDecodeTime\n * The base media decode time.\n * @property {!Array<shaka.transmuxer.Mp4Generator.Mp4Sample>} samples\n * The data samples.\n */\nshaka.transmuxer.Mp4Generator.Data;\n\n/**\n * @typedef {{\n * data: !Uint8Array,\n * size: number,\n * duration: number,\n * cts: number,\n * flags: !shaka.transmuxer.Mp4Generator.Mp4SampleFlags\n * }}\n *\n * @property {!Uint8Array} data\n * The sample data.\n * @property {number} size\n * The sample size.\n * @property {number} duration\n * The sample duration.\n * @property {number} cts\n * The sample composition time.\n * @property {!shaka.transmuxer.Mp4Generator.Mp4SampleFlags} flags\n * The sample flags.\n */\nshaka.transmuxer.Mp4Generator.Mp4Sample;\n\n/**\n * @typedef {{\n * isLeading: number,\n * isDependedOn: number,\n * hasRedundancy: number,\n * degradPrio: number,\n * dependsOn: number,\n * isNonSync: number\n * }}\n *\n * @property {number} isLeading\n * @property {number} isDependedOn\n * @property {number} hasRedundancy\n * @property {number} degradPrio\n * @property {number} dependsOn\n * @property {number} isNonSync\n */\nshaka.transmuxer.Mp4Generator.Mp4SampleFlags;\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.mss.MssParser');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.Deprecate');\ngoog.require('shaka.abr.Ewma');\ngoog.require('shaka.log');\ngoog.require('shaka.media.InitSegmentReference');\ngoog.require('shaka.media.ManifestParser');\ngoog.require('shaka.media.PresentationTimeline');\ngoog.require('shaka.media.QualityObserver');\ngoog.require('shaka.media.SegmentIndex');\ngoog.require('shaka.media.SegmentReference');\ngoog.require('shaka.mss.ContentProtection');\ngoog.require('shaka.net.NetworkingEngine');\ngoog.require('shaka.transmuxer.Mp4Generator');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.LanguageUtils');\ngoog.require('shaka.util.ManifestParserUtils');\ngoog.require('shaka.util.MimeUtils');\ngoog.require('shaka.util.OperationManager');\ngoog.require('shaka.util.PlayerConfiguration');\ngoog.require('shaka.util.Timer');\ngoog.require('shaka.util.TXml');\ngoog.require('shaka.util.XmlUtils');\n\n\n/**\n * Creates a new MSS parser.\n *\n * @implements {shaka.extern.ManifestParser}\n * @export\n */\nshaka.mss.MssParser = class {\n /** Creates a new MSS parser. */\n constructor() {\n /** @private {?shaka.extern.ManifestConfiguration} */\n this.config_ = null;\n\n /** @private {?shaka.extern.ManifestParser.PlayerInterface} */\n this.playerInterface_ = null;\n\n /** @private {!Array<string>} */\n this.manifestUris_ = [];\n\n /** @private {?shaka.extern.Manifest} */\n this.manifest_ = null;\n\n /** @private {number} */\n this.globalId_ = 1;\n\n /**\n * The update period in seconds, or 0 for no updates.\n * @private {number}\n */\n this.updatePeriod_ = 0;\n\n /** @private {?shaka.media.PresentationTimeline} */\n this.presentationTimeline_ = null;\n\n /**\n * An ewma that tracks how long updates take.\n * This is to mitigate issues caused by slow parsing on embedded devices.\n * @private {!shaka.abr.Ewma}\n */\n this.averageUpdateDuration_ = new shaka.abr.Ewma(5);\n\n /** @private {shaka.util.Timer} */\n this.updateTimer_ = new shaka.util.Timer(() => {\n this.onUpdate_();\n });\n\n /** @private {!shaka.util.OperationManager} */\n this.operationManager_ = new shaka.util.OperationManager();\n\n /**\n * @private {!Map<number, !BufferSource>}\n */\n this.initSegmentDataByStreamId_ = new Map();\n\n /** @private {function():boolean} */\n this.isPreloadFn_ = () => false;\n }\n\n /**\n * @param {shaka.extern.ManifestConfiguration} config\n * @param {(function():boolean)=} isPreloadFn\n * @override\n * @exportInterface\n */\n configure(config, isPreloadFn) {\n goog.asserts.assert(config.mss != null,\n 'MssManifestConfiguration should not be null!');\n\n this.config_ = config;\n if (isPreloadFn) {\n this.isPreloadFn_ = isPreloadFn;\n }\n }\n\n /**\n * @override\n * @exportInterface\n */\n async start(uri, playerInterface) {\n goog.asserts.assert(this.config_, 'Must call configure() before start()!');\n this.manifestUris_ = [uri];\n this.playerInterface_ = playerInterface;\n\n await this.requestManifest_();\n\n // Make sure that the parser has not been destroyed.\n if (!this.playerInterface_) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.PLAYER,\n shaka.util.Error.Code.OPERATION_ABORTED);\n }\n\n this.setUpdateTimer_();\n\n goog.asserts.assert(this.manifest_, 'Manifest should be non-null!');\n return this.manifest_;\n }\n\n /**\n * Called when the update timer ticks.\n *\n * @return {!Promise}\n * @private\n */\n async onUpdate_() {\n goog.asserts.assert(this.updatePeriod_ >= 0,\n 'There should be an update period');\n\n shaka.log.info('Updating manifest...');\n\n try {\n await this.requestManifest_();\n } catch (error) {\n goog.asserts.assert(error instanceof shaka.util.Error,\n 'Should only receive a Shaka error');\n\n // Try updating again, but ensure we haven't been destroyed.\n if (this.playerInterface_) {\n // We will retry updating, so override the severity of the error.\n error.severity = shaka.util.Error.Severity.RECOVERABLE;\n this.playerInterface_.onError(error);\n }\n }\n\n // Detect a call to stop()\n if (!this.playerInterface_) {\n return;\n }\n\n this.setUpdateTimer_();\n }\n\n /**\n * Sets the update timer. Does nothing if the manifest is not live.\n *\n * @private\n */\n setUpdateTimer_() {\n if (this.updatePeriod_ <= 0) {\n return;\n }\n\n const finalDelay = Math.max(\n shaka.mss.MssParser.MIN_UPDATE_PERIOD_,\n this.updatePeriod_,\n this.averageUpdateDuration_.getEstimate());\n\n // We do not run the timer as repeating because part of update is async and\n // we need schedule the update after it finished.\n this.updateTimer_.tickAfter(/* seconds= */ finalDelay);\n }\n\n /**\n * @override\n * @exportInterface\n */\n stop() {\n this.playerInterface_ = null;\n this.config_ = null;\n this.manifestUris_ = [];\n this.manifest_ = null;\n\n if (this.updateTimer_ != null) {\n this.updateTimer_.stop();\n this.updateTimer_ = null;\n }\n\n this.initSegmentDataByStreamId_.clear();\n\n return this.operationManager_.destroy();\n }\n\n /**\n * @override\n * @exportInterface\n */\n async update() {\n try {\n await this.requestManifest_();\n } catch (error) {\n if (!this.playerInterface_ || !error) {\n return;\n }\n goog.asserts.assert(error instanceof shaka.util.Error, 'Bad error type');\n this.playerInterface_.onError(error);\n }\n }\n\n /**\n * @override\n * @exportInterface\n */\n onExpirationUpdated(sessionId, expiration) {\n // No-op\n }\n\n /**\n * @override\n * @exportInterface\n */\n onInitialVariantChosen(variant) {\n // No-op\n }\n\n /**\n * @override\n * @exportInterface\n */\n banLocation(uri) {\n // No-op\n }\n\n /** @override */\n setMediaElement(mediaElement) {\n // No-op\n }\n\n /**\n * Makes a network request for the manifest and parses the resulting data.\n *\n * @private\n */\n async requestManifest_() {\n const requestType = shaka.net.NetworkingEngine.RequestType.MANIFEST;\n const type = shaka.net.NetworkingEngine.AdvancedRequestType.MSS;\n const request = shaka.net.NetworkingEngine.makeRequest(\n this.manifestUris_, this.config_.retryParameters);\n const networkingEngine = this.playerInterface_.networkingEngine;\n\n const startTime = Date.now();\n const operation = networkingEngine.request(requestType, request, {\n type,\n isPreload: this.isPreloadFn_(),\n });\n this.operationManager_.manage(operation);\n\n const response = await operation.promise;\n\n // Detect calls to stop().\n if (!this.playerInterface_) {\n return;\n }\n\n // For redirections add the response uri to the first entry in the\n // Manifest Uris array.\n if (response.uri && !this.manifestUris_.includes(response.uri)) {\n this.manifestUris_.unshift(response.uri);\n }\n\n // This may throw, but it will result in a failed promise.\n this.parseManifest_(response.data, response.uri);\n // Keep track of how long the longest manifest update took.\n const endTime = Date.now();\n const updateDuration = (endTime - startTime) / 1000.0;\n this.averageUpdateDuration_.sample(1, updateDuration);\n }\n\n /**\n * Parses the manifest XML. This also handles updates and will update the\n * stored manifest.\n *\n * @param {BufferSource} data\n * @param {string} finalManifestUri The final manifest URI, which may\n * differ from this.manifestUri_ if there has been a redirect.\n * @return {!Promise}\n * @private\n */\n parseManifest_(data, finalManifestUri) {\n let manifestData = data;\n const manifestPreprocessor = this.config_.mss.manifestPreprocessor;\n const defaultManifestPreprocessor =\n shaka.util.PlayerConfiguration.defaultManifestPreprocessor;\n if (manifestPreprocessor != defaultManifestPreprocessor) {\n shaka.Deprecate.deprecateFeature(5,\n 'manifest.mss.manifestPreprocessor configuration',\n 'Please Use manifest.mss.manifestPreprocessorTXml instead.');\n const mssElement =\n shaka.util.XmlUtils.parseXml(manifestData, 'SmoothStreamingMedia');\n if (!mssElement) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.MSS_INVALID_XML,\n finalManifestUri);\n }\n manifestPreprocessor(mssElement);\n manifestData = shaka.util.XmlUtils.toArrayBuffer(mssElement);\n }\n const mss = shaka.util.TXml.parseXml(manifestData, 'SmoothStreamingMedia');\n if (!mss) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.MSS_INVALID_XML,\n finalManifestUri);\n }\n const manifestPreprocessorTXml = this.config_.mss.manifestPreprocessorTXml;\n const defaultManifestPreprocessorTXml =\n shaka.util.PlayerConfiguration.defaultManifestPreprocessorTXml;\n if (manifestPreprocessorTXml != defaultManifestPreprocessorTXml) {\n manifestPreprocessorTXml(mss);\n }\n this.processManifest_(mss, finalManifestUri);\n return Promise.resolve();\n }\n\n\n /**\n * Takes a formatted MSS and converts it into a manifest.\n *\n * @param {!shaka.extern.xml.Node} mss\n * @param {string} finalManifestUri The final manifest URI, which may\n * differ from this.manifestUri_ if there has been a redirect.\n * @private\n */\n processManifest_(mss, finalManifestUri) {\n const TXml = shaka.util.TXml;\n\n if (!this.presentationTimeline_) {\n this.presentationTimeline_ = new shaka.media.PresentationTimeline(\n /* presentationStartTime= */ null, /* delay= */ 0);\n }\n\n const isLive = TXml.parseAttr(mss, 'IsLive',\n TXml.parseBoolean, /* defaultValue= */ false);\n\n if (isLive) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MANIFEST,\n shaka.util.Error.Code.MSS_LIVE_CONTENT_NOT_SUPPORTED);\n }\n\n this.presentationTimeline_.setStatic(!isLive);\n\n const timescale = TXml.parseAttr(mss, 'TimeScale',\n TXml.parseNonNegativeInt, shaka.mss.MssParser.DEFAULT_TIME_SCALE_);\n goog.asserts.assert(timescale && timescale >= 0,\n 'Timescale must be defined!');\n\n let dvrWindowLength = TXml.parseAttr(mss, 'DVRWindowLength',\n TXml.parseNonNegativeInt);\n // If the DVRWindowLength field is omitted for a live presentation or set\n // to 0, the DVR window is effectively infinite\n if (isLive && (dvrWindowLength === 0 || isNaN(dvrWindowLength))) {\n dvrWindowLength = Infinity;\n }\n // Start-over\n const canSeek = TXml.parseAttr(mss, 'CanSeek',\n TXml.parseBoolean, /* defaultValue= */ false);\n if (dvrWindowLength === 0 && canSeek) {\n dvrWindowLength = Infinity;\n }\n\n let segmentAvailabilityDuration = null;\n if (dvrWindowLength && dvrWindowLength > 0) {\n segmentAvailabilityDuration = dvrWindowLength / timescale;\n }\n\n // If it's live, we check for an override.\n if (isLive && !isNaN(this.config_.availabilityWindowOverride)) {\n segmentAvailabilityDuration = this.config_.availabilityWindowOverride;\n }\n\n // If it's null, that means segments are always available. This is always\n // the case for VOD, and sometimes the case for live.\n if (segmentAvailabilityDuration == null) {\n segmentAvailabilityDuration = Infinity;\n }\n\n this.presentationTimeline_.setSegmentAvailabilityDuration(\n segmentAvailabilityDuration);\n\n // Duration in timescale units.\n const duration = TXml.parseAttr(mss, 'Duration',\n TXml.parseNonNegativeInt, Infinity);\n goog.asserts.assert(duration && duration >= 0,\n 'Duration must be defined!');\n\n if (!isLive) {\n this.presentationTimeline_.setDuration(duration / timescale);\n }\n\n /** @type {!shaka.mss.MssParser.Context} */\n const context = {\n variants: [],\n textStreams: [],\n timescale: timescale,\n duration: duration / timescale,\n };\n\n this.parseStreamIndexes_(mss, context);\n\n // These steps are not done on manifest update.\n if (!this.manifest_) {\n this.manifest_ = {\n presentationTimeline: this.presentationTimeline_,\n variants: context.variants,\n textStreams: context.textStreams,\n imageStreams: [],\n offlineSessionIds: [],\n sequenceMode: this.config_.mss.sequenceMode,\n ignoreManifestTimestampsInSegmentsMode: false,\n type: shaka.media.ManifestParser.MSS,\n serviceDescription: null,\n nextUrl: null,\n periodCount: 1,\n gapCount: 0,\n isLowLatency: false,\n startTime: null,\n };\n\n // This is the first point where we have a meaningful presentation start\n // time, and we need to tell PresentationTimeline that so that it can\n // maintain consistency from here on.\n this.presentationTimeline_.lockStartTime();\n } else {\n // Just update the variants and text streams.\n this.manifest_.variants = context.variants;\n this.manifest_.textStreams = context.textStreams;\n\n // Re-filter the manifest. This will check any configured restrictions on\n // new variants, and will pass any new init data to DrmEngine to ensure\n // that key rotation works correctly.\n this.playerInterface_.filter(this.manifest_);\n }\n }\n\n /**\n * @param {!shaka.extern.xml.Node} mss\n * @param {!shaka.mss.MssParser.Context} context\n * @private\n */\n parseStreamIndexes_(mss, context) {\n const ContentProtection = shaka.mss.ContentProtection;\n const TXml = shaka.util.TXml;\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n\n const protectionElements = TXml.findChildren(mss, 'Protection');\n const drmInfos = ContentProtection.parseFromProtection(\n protectionElements, this.config_.mss.keySystemsBySystemId);\n\n const audioStreams = [];\n const videoStreams = [];\n const textStreams = [];\n const streamIndexes = TXml.findChildren(mss, 'StreamIndex');\n for (const streamIndex of streamIndexes) {\n const qualityLevels = TXml.findChildren(streamIndex, 'QualityLevel');\n const timeline = this.createTimeline_(\n streamIndex, context.timescale, context.duration);\n // For each QualityLevel node, create a stream element\n for (const qualityLevel of qualityLevels) {\n const stream = this.createStream_(\n streamIndex, qualityLevel, timeline, drmInfos, context);\n if (!stream) {\n // Skip unsupported stream\n continue;\n }\n if (stream.type == ContentType.AUDIO &&\n !this.config_.disableAudio) {\n audioStreams.push(stream);\n } else if (stream.type == ContentType.VIDEO &&\n !this.config_.disableVideo) {\n videoStreams.push(stream);\n } else if (stream.type == ContentType.TEXT &&\n !this.config_.disableText) {\n textStreams.push(stream);\n }\n }\n }\n\n const variants = [];\n for (const audio of (audioStreams.length > 0 ? audioStreams : [null])) {\n for (const video of (videoStreams.length > 0 ? videoStreams : [null])) {\n variants.push(this.createVariant_(audio, video));\n }\n }\n context.variants = variants;\n context.textStreams = textStreams;\n }\n\n /**\n * @param {!shaka.extern.xml.Node} streamIndex\n * @param {!shaka.extern.xml.Node} qualityLevel\n * @param {!Array<shaka.mss.MssParser.TimeRange>} timeline\n * @param {!Array<shaka.extern.DrmInfo>} drmInfos\n * @param {!shaka.mss.MssParser.Context} context\n * @return {?shaka.extern.Stream}\n * @private\n */\n createStream_(streamIndex, qualityLevel, timeline, drmInfos, context) {\n const TXml = shaka.util.TXml;\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n const MssParser = shaka.mss.MssParser;\n\n const type = streamIndex.attributes['Type'];\n const isValidType = type === 'audio' || type === 'video' ||\n type === 'text';\n if (!isValidType) {\n shaka.log.alwaysWarn('Ignoring unrecognized type:', type);\n return null;\n }\n\n const lang = streamIndex.attributes['Language'];\n const id = this.globalId_++;\n\n const bandwidth = TXml.parseAttr(\n qualityLevel, 'Bitrate', TXml.parsePositiveInt);\n const width = TXml.parseAttr(\n qualityLevel, 'MaxWidth', TXml.parsePositiveInt);\n const height = TXml.parseAttr(\n qualityLevel, 'MaxHeight', TXml.parsePositiveInt);\n const channelsCount = TXml.parseAttr(\n qualityLevel, 'Channels', TXml.parsePositiveInt);\n const audioSamplingRate = TXml.parseAttr(\n qualityLevel, 'SamplingRate', TXml.parsePositiveInt);\n\n let duration = context.duration;\n if (timeline.length) {\n const start = timeline[0].start;\n const end = timeline[timeline.length - 1].end;\n duration = end - start;\n }\n\n const presentationDuration = this.presentationTimeline_.getDuration();\n this.presentationTimeline_.setDuration(\n Math.min(duration, presentationDuration));\n\n /** @type {!shaka.extern.Stream} */\n const stream = {\n id: id,\n originalId: streamIndex.attributes['Name'] || String(id),\n groupId: null,\n createSegmentIndex: () => Promise.resolve(),\n closeSegmentIndex: () => Promise.resolve(),\n segmentIndex: null,\n mimeType: '',\n codecs: '',\n frameRate: undefined,\n pixelAspectRatio: undefined,\n bandwidth: bandwidth || 0,\n width: width || undefined,\n height: height || undefined,\n kind: '',\n encrypted: drmInfos.length > 0,\n drmInfos: drmInfos,\n keyIds: new Set(),\n language: shaka.util.LanguageUtils.normalize(lang || 'und'),\n originalLanguage: lang,\n label: '',\n type: '',\n primary: false,\n trickModeVideo: null,\n dependencyStream: null,\n emsgSchemeIdUris: [],\n roles: [],\n forced: false,\n channelsCount: channelsCount,\n audioSamplingRate: audioSamplingRate,\n spatialAudio: false,\n closedCaptions: null,\n hdr: undefined,\n colorGamut: undefined,\n videoLayout: undefined,\n tilesLayout: undefined,\n matchedStreams: [],\n mssPrivateData: {\n duration: duration,\n timescale: context.timescale,\n codecPrivateData: null,\n },\n accessibilityPurpose: null,\n external: false,\n fastSwitching: false,\n fullMimeTypes: new Set(),\n isAudioMuxedInVideo: false,\n baseOriginalId: null,\n };\n\n // This is specifically for text tracks.\n const subType = streamIndex.attributes['Subtype'];\n if (subType) {\n const role = MssParser.ROLE_MAPPING_.get(subType);\n if (role) {\n stream.roles.push(role);\n }\n if (role === 'main') {\n stream.primary = true;\n }\n }\n\n let fourCCValue = qualityLevel.attributes['FourCC'];\n\n // If FourCC not defined at QualityLevel level,\n // then get it from StreamIndex level\n if (fourCCValue === null || fourCCValue === '') {\n fourCCValue = streamIndex.attributes['FourCC'];\n }\n\n // If still not defined (optional for audio stream,\n // see https://msdn.microsoft.com/en-us/library/ff728116%28v=vs.95%29.aspx),\n // then we consider the stream is an audio AAC stream\n if (!fourCCValue) {\n if (type === 'audio') {\n fourCCValue = 'AAC';\n } else if (type === 'video') {\n shaka.log.alwaysWarn('FourCC is not defined whereas it is required ' +\n 'for a QualityLevel element for a StreamIndex of type \"video\"');\n return null;\n }\n }\n\n // Check if codec is supported\n if (!MssParser.SUPPORTED_CODECS_.includes(fourCCValue.toUpperCase())) {\n shaka.log.alwaysWarn('Codec not supported:', fourCCValue);\n return null;\n }\n\n const codecPrivateData = this.getCodecPrivateData_(\n qualityLevel, type, fourCCValue, stream);\n stream.mssPrivateData.codecPrivateData = codecPrivateData;\n\n switch (type) {\n case 'audio':\n if (!codecPrivateData) {\n shaka.log.alwaysWarn('Quality unsupported without CodecPrivateData',\n type);\n return null;\n }\n stream.type = ContentType.AUDIO;\n // This mimetype is fake to allow the transmuxing.\n stream.mimeType = 'mss/audio/mp4';\n stream.codecs = this.getAACCodec_(\n qualityLevel, fourCCValue, codecPrivateData);\n break;\n case 'video':\n if (!codecPrivateData) {\n shaka.log.alwaysWarn('Quality unsupported without CodecPrivateData',\n type);\n return null;\n }\n stream.type = ContentType.VIDEO;\n // This mimetype is fake to allow the transmuxing.\n stream.mimeType = 'mss/video/mp4';\n stream.codecs = this.getH264Codec_(\n qualityLevel, codecPrivateData);\n break;\n case 'text':\n stream.type = ContentType.TEXT;\n stream.mimeType = 'application/mp4';\n if (fourCCValue === 'TTML' || fourCCValue === 'DFXP') {\n stream.codecs = 'stpp';\n }\n break;\n }\n stream.fullMimeTypes.add(shaka.util.MimeUtils.getFullType(\n stream.mimeType, stream.codecs));\n\n // Lazy-Load the segment index to avoid create all init segment at the\n // same time\n stream.createSegmentIndex = () => {\n if (stream.segmentIndex) {\n return Promise.resolve();\n }\n let initSegmentData;\n if (this.initSegmentDataByStreamId_.has(stream.id)) {\n initSegmentData = this.initSegmentDataByStreamId_.get(stream.id);\n } else {\n let videoNalus = [];\n if (stream.type == ContentType.VIDEO) {\n const codecPrivateData = stream.mssPrivateData.codecPrivateData;\n videoNalus = codecPrivateData.split('00000001').slice(1);\n }\n /** @type {shaka.transmuxer.Mp4Generator.StreamInfo} */\n const streamInfo = {\n id: stream.id,\n type: stream.type,\n codecs: stream.codecs,\n encrypted: stream.encrypted,\n timescale: stream.mssPrivateData.timescale,\n duration: stream.mssPrivateData.duration,\n videoNalus: videoNalus,\n audioConfig: new Uint8Array([]),\n videoConfig: new Uint8Array([]),\n hSpacing: 0,\n vSpacing: 0,\n data: null, // Data is not necessary for init segment.\n stream: stream,\n };\n const mp4Generator = new shaka.transmuxer.Mp4Generator([streamInfo]);\n initSegmentData = mp4Generator.initSegment();\n this.initSegmentDataByStreamId_.set(stream.id, initSegmentData);\n }\n const qualityInfo =\n shaka.media.QualityObserver.createQualityInfo(stream);\n const initSegmentRef = new shaka.media.InitSegmentReference(\n () => [],\n /* startByte= */ 0,\n /* endByte= */ null,\n qualityInfo,\n stream.mssPrivateData.timescale,\n initSegmentData,\n /* aesKey= */ null,\n stream.encrypted);\n\n const segments = this.createSegments_(initSegmentRef,\n stream, streamIndex, timeline);\n\n stream.segmentIndex = new shaka.media.SegmentIndex(segments);\n return Promise.resolve();\n };\n stream.closeSegmentIndex = () => {\n // If we have a segment index, release it.\n if (stream.segmentIndex) {\n stream.segmentIndex.release();\n stream.segmentIndex = null;\n }\n };\n\n return stream;\n }\n\n /**\n * @param {!shaka.extern.xml.Node} qualityLevel\n * @param {string} type\n * @param {string} fourCCValue\n * @param {!shaka.extern.Stream} stream\n * @return {?string}\n * @private\n */\n getCodecPrivateData_(qualityLevel, type, fourCCValue, stream) {\n const codecPrivateData = qualityLevel.attributes['CodecPrivateData'];\n if (codecPrivateData) {\n return codecPrivateData;\n }\n if (type !== 'audio') {\n return null;\n }\n // For the audio we can reconstruct the CodecPrivateData\n // By default stereo\n const channels = stream.channelsCount || 2;\n // By default 44,1kHz.\n const samplingRate = stream.audioSamplingRate || 44100;\n\n const samplingFrequencyIndex = {\n 96000: 0x0,\n 88200: 0x1,\n 64000: 0x2,\n 48000: 0x3,\n 44100: 0x4,\n 32000: 0x5,\n 24000: 0x6,\n 22050: 0x7,\n 16000: 0x8,\n 12000: 0x9,\n 11025: 0xA,\n 8000: 0xB,\n 7350: 0xC,\n };\n\n const indexFreq = samplingFrequencyIndex[samplingRate];\n if (fourCCValue === 'AACH') {\n // High Efficiency AAC Profile\n const objectType = 0x05;\n // 4 bytes :\n // XXXXX XXXX XXXX XXXX\n // 'ObjectType' 'Freq Index' 'Channels value' 'Extension Sampling Freq'\n // XXXXX XXX XXXXXXX\n // 'ObjectType' 'GAS' 'alignment = 0'\n const data = new Uint8Array(4);\n // In HE AAC Extension Sampling frequence\n // equals to SamplingRate * 2\n const extensionSamplingFrequencyIndex =\n samplingFrequencyIndex[samplingRate * 2];\n // Freq Index is present for 3 bits in the first byte, last bit is in\n // the second\n data[0] = (objectType << 3) | (indexFreq >> 1);\n data[1] = (indexFreq << 7) | (channels << 3) |\n (extensionSamplingFrequencyIndex >> 1);\n // Origin object type equals to 2 => AAC Main Low Complexity\n data[2] = (extensionSamplingFrequencyIndex << 7) | (0x02 << 2);\n // Alignment bits\n data[3] = 0x0;\n // Put the 4 bytes in an 16 bits array\n const arr16 = new Uint16Array(2);\n arr16[0] = (data[0] << 8) + data[1];\n arr16[1] = (data[2] << 8) + data[3];\n // Convert decimal to hex value\n return arr16[0].toString(16) + arr16[1].toString(16);\n } else {\n // AAC Main Low Complexity\n const objectType = 0x02;\n // 2 bytes:\n // XXXXX XXXX XXXX XXX\n // 'ObjectType' 'Freq Index' 'Channels value' 'GAS = 000'\n const data = new Uint8Array(2);\n // Freq Index is present for 3 bits in the first byte, last bit is in\n // the second\n data[0] = (objectType << 3) | (indexFreq >> 1);\n data[1] = (indexFreq << 7) | (channels << 3);\n // Put the 2 bytes in an 16 bits array\n const arr16 = new Uint16Array(1);\n arr16[0] = (data[0] << 8) + data[1];\n // Convert decimal to hex value\n return arr16[0].toString(16);\n }\n }\n\n /**\n * @param {!shaka.extern.xml.Node} qualityLevel\n * @param {string} fourCCValue\n * @param {?string} codecPrivateData\n * @return {string}\n * @private\n */\n getAACCodec_(qualityLevel, fourCCValue, codecPrivateData) {\n let objectType = 0;\n\n // Chrome problem, in implicit AAC HE definition, so when AACH is detected\n // in FourCC set objectType to 5 => strange, it should be 2\n if (fourCCValue === 'AACH') {\n objectType = 0x05;\n }\n if (!codecPrivateData) {\n // AAC Main Low Complexity => object Type = 2\n objectType = 0x02;\n if (fourCCValue === 'AACH') {\n // High Efficiency AAC Profile = object Type = 5 SBR\n objectType = 0x05;\n }\n } else if (objectType === 0) {\n objectType = (parseInt(codecPrivateData.substr(0, 2), 16) & 0xF8) >> 3;\n }\n\n return 'mp4a.40.' + objectType;\n }\n\n /**\n * @param {!shaka.extern.xml.Node} qualityLevel\n * @param {?string} codecPrivateData\n * @return {string}\n * @private\n */\n getH264Codec_(qualityLevel, codecPrivateData) {\n // Extract from the CodecPrivateData field the hexadecimal representation\n // of the following three bytes in the sequence parameter set NAL unit.\n // => Find the SPS nal header\n const nalHeader = /00000001[0-9]7/.exec(codecPrivateData);\n if (!nalHeader.length) {\n return '';\n }\n if (!codecPrivateData) {\n return '';\n }\n // => Find the 6 characters after the SPS nalHeader (if it exists)\n const avcOti = codecPrivateData.substr(\n codecPrivateData.indexOf(nalHeader[0]) + 10, 6);\n\n return 'avc1.' + avcOti;\n }\n\n /**\n * @param {!shaka.media.InitSegmentReference} initSegmentRef\n * @param {!shaka.extern.Stream} stream\n * @param {!shaka.extern.xml.Node} streamIndex\n * @param {!Array<shaka.mss.MssParser.TimeRange>} timeline\n * @return {!Array<!shaka.media.SegmentReference>}\n * @private\n */\n createSegments_(initSegmentRef, stream, streamIndex, timeline) {\n const ManifestParserUtils = shaka.util.ManifestParserUtils;\n const url = streamIndex.attributes['Url'];\n goog.asserts.assert(url, 'Missing URL for segments');\n\n const mediaUrl = url.replace('{bitrate}', String(stream.bandwidth));\n\n const segments = [];\n for (const time of timeline) {\n const getUris = () => {\n return ManifestParserUtils.resolveUris(this.manifestUris_,\n [mediaUrl.replace('{start time}', String(time.unscaledStart))]);\n };\n segments.push(new shaka.media.SegmentReference(\n time.start,\n time.end,\n getUris,\n /* startByte= */ 0,\n /* endByte= */ null,\n initSegmentRef,\n /* timestampOffset= */ 0,\n /* appendWindowStart= */ 0,\n /* appendWindowEnd= */ stream.mssPrivateData.duration));\n }\n return segments;\n }\n\n /**\n * Expands a streamIndex into an array-based timeline. The results are in\n * seconds.\n *\n * @param {!shaka.extern.xml.Node} streamIndex\n * @param {number} timescale\n * @param {number} duration The duration in seconds.\n * @return {!Array<shaka.mss.MssParser.TimeRange>}\n * @private\n */\n createTimeline_(streamIndex, timescale, duration) {\n goog.asserts.assert(\n timescale > 0 && timescale < Infinity,\n 'timescale must be a positive, finite integer');\n goog.asserts.assert(\n duration > 0, 'duration must be a positive integer');\n\n const TXml = shaka.util.TXml;\n\n const timePoints = TXml.findChildren(streamIndex, 'c');\n\n /** @type {!Array<shaka.mss.MssParser.TimeRange>} */\n const timeline = [];\n let lastEndTime = 0;\n\n for (let i = 0; i < timePoints.length; ++i) {\n const timePoint = timePoints[i];\n const next = timePoints[i + 1];\n const t =\n TXml.parseAttr(timePoint, 't', TXml.parseNonNegativeInt);\n const d =\n TXml.parseAttr(timePoint, 'd', TXml.parseNonNegativeInt);\n const r = TXml.parseAttr(timePoint, 'r', TXml.parseInt);\n\n if (!d) {\n shaka.log.warning(\n '\"c\" element must have a duration:',\n 'ignoring the remaining \"c\" elements.', timePoint);\n return timeline;\n }\n\n let startTime = t != null ? t : lastEndTime;\n\n let repeat = r || 0;\n // Unlike in DASH, in MSS r does not start counting repetitions at 0 but\n // at 1, to maintain the code equivalent to DASH if r exists we\n // subtract 1.\n if (repeat) {\n repeat--;\n }\n if (repeat < 0) {\n if (next) {\n const nextStartTime =\n TXml.parseAttr(next, 't', TXml.parseNonNegativeInt);\n if (nextStartTime == null) {\n shaka.log.warning(\n 'An \"c\" element cannot have a negative repeat',\n 'if the next \"c\" element does not have a valid start time:',\n 'ignoring the remaining \"c\" elements.', timePoint);\n return timeline;\n } else if (startTime >= nextStartTime) {\n shaka.log.warning(\n 'An \"c\" element cannot have a negative repeat if its start ',\n 'time exceeds the next \"c\" element\\'s start time:',\n 'ignoring the remaining \"c\" elements.', timePoint);\n return timeline;\n }\n repeat = Math.ceil((nextStartTime - startTime) / d) - 1;\n } else {\n if (duration == Infinity) {\n // The MSS spec. actually allows the last \"c\" element to have a\n // negative repeat value even when it has an infinite\n // duration. No one uses this feature and no one ever should,\n // ever.\n shaka.log.warning(\n 'The last \"c\" element cannot have a negative repeat',\n 'if the Period has an infinite duration:',\n 'ignoring the last \"c\" element.', timePoint);\n return timeline;\n } else if (startTime / timescale >= duration) {\n shaka.log.warning(\n 'The last \"c\" element cannot have a negative repeat',\n 'if its start time exceeds the duration:',\n 'ignoring the last \"c\" element.', timePoint);\n return timeline;\n }\n repeat = Math.ceil((duration * timescale - startTime) / d) - 1;\n }\n }\n\n for (let j = 0; j <= repeat; ++j) {\n const endTime = startTime + d;\n const item = {\n start: startTime / timescale,\n end: endTime / timescale,\n unscaledStart: startTime,\n };\n timeline.push(item);\n\n startTime = endTime;\n lastEndTime = endTime;\n }\n }\n\n return timeline;\n }\n\n /**\n * @param {?shaka.extern.Stream} audioStream\n * @param {?shaka.extern.Stream} videoStream\n * @return {!shaka.extern.Variant}\n * @private\n */\n createVariant_(audioStream, videoStream) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n\n goog.asserts.assert(!audioStream ||\n audioStream.type == ContentType.AUDIO, 'Audio parameter mismatch!');\n goog.asserts.assert(!videoStream ||\n videoStream.type == ContentType.VIDEO, 'Video parameter mismatch!');\n\n let bandwidth = 0;\n if (audioStream && audioStream.bandwidth && audioStream.bandwidth > 0) {\n bandwidth += audioStream.bandwidth;\n }\n if (videoStream && videoStream.bandwidth && videoStream.bandwidth > 0) {\n bandwidth += videoStream.bandwidth;\n }\n\n return {\n id: this.globalId_++,\n language: audioStream ? audioStream.language : 'und',\n disabledUntilTime: 0,\n primary: (!!audioStream && audioStream.primary) ||\n (!!videoStream && videoStream.primary),\n audio: audioStream,\n video: videoStream,\n bandwidth: bandwidth,\n allowedByApplication: true,\n allowedByKeySystem: true,\n decodingInfos: [],\n };\n }\n};\n\n\n/**\n * Contains the minimum amount of time, in seconds, between manifest update\n * requests.\n *\n * @private\n * @const {number}\n */\nshaka.mss.MssParser.MIN_UPDATE_PERIOD_ = 3;\n\n\n/**\n * @private\n * @const {number}\n */\nshaka.mss.MssParser.DEFAULT_TIME_SCALE_ = 1e7;\n\n\n/**\n * MSS supported codecs.\n *\n * @private\n * @const {!Array<string>}\n */\nshaka.mss.MssParser.SUPPORTED_CODECS_ = [\n 'AAC',\n 'AACL',\n 'AACH',\n 'AACP',\n 'AVC1',\n 'H264',\n 'TTML',\n 'DFXP',\n];\n\n\n/**\n * MPEG-DASH Role and accessibility mapping for text tracks according to\n * ETSI TS 103 285 v1.1.1 (section 7.1.2)\n *\n * @const {!Map<string, string>}\n * @private\n */\nshaka.mss.MssParser.ROLE_MAPPING_ = new Map()\n .set('CAPT', 'main')\n .set('SUBT', 'alternate')\n .set('DESC', 'main');\n\n\n/**\n * @typedef {{\n * variants: !Array<shaka.extern.Variant>,\n * textStreams: !Array<shaka.extern.Stream>,\n * timescale: number,\n * duration: number\n * }}\n *\n * @property {!Array<shaka.extern.Variant>} variants\n * The presentation's Variants.\n * @property {!Array<shaka.extern.Stream>} textStreams\n * The presentation's text streams.\n * @property {number} timescale\n * The presentation's timescale.\n * @property {number} duration\n * The presentation's duration.\n */\nshaka.mss.MssParser.Context;\n\n\n/**\n * @typedef {{\n * start: number,\n * unscaledStart: number,\n * end: number\n * }}\n *\n * @description\n * Defines a time range of a media segment. Times are in seconds.\n *\n * @property {number} start\n * The start time of the range.\n * @property {number} unscaledStart\n * The start time of the range in representation timescale units.\n * @property {number} end\n * The end time (exclusive) of the range.\n */\nshaka.mss.MssParser.TimeRange;\n\nshaka.media.ManifestParser.registerParserByMime(\n 'application/vnd.ms-sstr+xml', () => new shaka.mss.MssParser());\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.net.HttpPluginUtils');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.log');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.StringUtils');\ngoog.requireType('shaka.net.NetworkingEngine');\n\n\n/**\n * @summary A set of http networking utility functions.\n * @exportDoc\n */\nshaka.net.HttpPluginUtils = class {\n /**\n * @param {!Object<string, string>} headers\n * @param {BufferSource} data\n * @param {number} status\n * @param {string} uri\n * @param {string} responseURL\n * @param {shaka.extern.Request} request\n * @param {shaka.net.NetworkingEngine.RequestType} requestType\n * @return {!shaka.extern.Response}\n */\n static makeResponse(headers, data, status, uri, responseURL, request,\n requestType) {\n goog.asserts.assert(data, 'Data should be non-null!');\n\n if ((status >= 200 && status <= 299 && status != 202) || status == 304) {\n // Most 2xx HTTP codes are success cases.\n /** @type {shaka.extern.Response} */\n const response = {\n uri: responseURL || uri,\n originalUri: uri,\n data: data,\n status: status,\n headers: headers,\n fromCache: !!headers['x-shaka-from-cache'],\n originalRequest: request,\n };\n return response;\n } else {\n let responseText = null;\n try {\n responseText = shaka.util.StringUtils.fromBytesAutoDetect(data);\n } catch (exception) {}\n shaka.log.debug('HTTP error text:', responseText);\n\n const severity = status == 401 || status == 403 ?\n shaka.util.Error.Severity.CRITICAL :\n shaka.util.Error.Severity.RECOVERABLE;\n\n throw new shaka.util.Error(\n severity,\n shaka.util.Error.Category.NETWORK,\n shaka.util.Error.Code.BAD_HTTP_STATUS,\n uri,\n status,\n responseText,\n headers,\n requestType,\n responseURL || uri);\n }\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.net.HttpFetchPlugin');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.log');\ngoog.require('shaka.net.HttpPluginUtils');\ngoog.require('shaka.net.NetworkingEngine');\ngoog.require('shaka.util.AbortableOperation');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.MapUtils');\ngoog.require('shaka.util.Timer');\n\n\n/**\n * @summary A networking plugin to handle http and https URIs via the Fetch API.\n * @export\n */\nshaka.net.HttpFetchPlugin = class {\n /**\n * @param {string} uri\n * @param {shaka.extern.Request} request\n * @param {shaka.net.NetworkingEngine.RequestType} requestType\n * @param {shaka.extern.ProgressUpdated} progressUpdated Called when a\n * progress event happened.\n * @param {shaka.extern.HeadersReceived} headersReceived Called when the\n * headers for the download are received, but before the body is.\n * @param {shaka.extern.SchemePluginConfig} config\n * @return {!shaka.extern.IAbortableOperation.<shaka.extern.Response>}\n * @export\n */\n static parse(uri, request, requestType, progressUpdated, headersReceived,\n config) {\n const headers = new shaka.net.HttpFetchPlugin.Headers_();\n shaka.util.MapUtils.asMap(request.headers).forEach((value, key) => {\n headers.append(key, value);\n });\n\n const controller = new shaka.net.HttpFetchPlugin.AbortController_();\n\n /** @type {!RequestInit} */\n const init = {\n // Edge does not treat null as undefined for body; https://bit.ly/2luyE6x\n body: request.body || undefined,\n headers: headers,\n method: request.method,\n signal: controller.signal,\n credentials: request.allowCrossSiteCredentials ? 'include' : undefined,\n };\n\n /** @type {shaka.net.HttpFetchPlugin.AbortStatus} */\n const abortStatus = {\n canceled: false,\n timedOut: false,\n };\n\n const minBytes = config.minBytesForProgressEvents || 0;\n\n const pendingRequest = shaka.net.HttpFetchPlugin.request_(\n uri, request, requestType, init, abortStatus, progressUpdated,\n headersReceived, request.streamDataCallback, minBytes);\n\n /** @type {!shaka.util.AbortableOperation} */\n const op = new shaka.util.AbortableOperation(pendingRequest, () => {\n abortStatus.canceled = true;\n controller.abort();\n return Promise.resolve();\n });\n\n // The fetch API does not timeout natively, so do a timeout manually using\n // the AbortController.\n const timeoutMs = request.retryParameters.timeout;\n if (timeoutMs) {\n const timer = new shaka.util.Timer(() => {\n abortStatus.timedOut = true;\n controller.abort();\n });\n\n timer.tickAfter(timeoutMs / 1000);\n\n // To avoid calling |abort| on the network request after it finished, we\n // will stop the timer when the requests resolves/rejects.\n op.finally(() => {\n timer.stop();\n });\n }\n\n return op;\n }\n\n /**\n * @param {string} uri\n * @param {shaka.extern.Request} request\n * @param {shaka.net.NetworkingEngine.RequestType} requestType\n * @param {!RequestInit} init\n * @param {shaka.net.HttpFetchPlugin.AbortStatus} abortStatus\n * @param {shaka.extern.ProgressUpdated} progressUpdated\n * @param {shaka.extern.HeadersReceived} headersReceived\n * @param {?function(BufferSource):!Promise} streamDataCallback\n * @param {number} minBytes\n * @return {!Promise<!shaka.extern.Response>}\n * @private\n */\n static async request_(uri, request, requestType, init, abortStatus,\n progressUpdated, headersReceived, streamDataCallback, minBytes) {\n const fetch = shaka.net.HttpFetchPlugin.fetch_;\n const ReadableStream = shaka.net.HttpFetchPlugin.ReadableStream_;\n let response;\n let arrayBuffer = new ArrayBuffer(0);\n let loaded = 0;\n let lastLoaded = 0;\n\n // Last time stamp when we got a progress event.\n let lastTime = Date.now();\n\n try {\n // The promise returned by fetch resolves as soon as the HTTP response\n // headers are available. The download itself isn't done until the promise\n // for retrieving the data (arrayBuffer, blob, etc) has resolved.\n response = await fetch(uri, init);\n // At this point in the process, we have the headers of the response, but\n // not the body yet.\n headersReceived(shaka.net.HttpFetchPlugin.headersToGenericObject_(\n response.headers));\n\n // In new versions of Chromium, HEAD requests now have a response body\n // that is null.\n // So just don't try to download the body at all, if it's a HEAD request,\n // to avoid null reference errors.\n // See: https://crbug.com/1297060\n if (init.method != 'HEAD') {\n goog.asserts.assert(response.body,\n 'non-HEAD responses should have a body');\n\n // Getting the reader in this way allows us to observe the process of\n // downloading the body, instead of just waiting for an opaque promise\n // to resolve.\n // We first clone the response because calling getReader locks the body\n // stream; if we didn't clone it here, we would be unable to get the\n // response's arrayBuffer later.\n const reader = response.clone().body.getReader();\n\n const contentLengthRaw = response.headers.get('Content-Length');\n const contentLength =\n contentLengthRaw ? parseInt(contentLengthRaw, 10) : 0;\n\n const start = (controller) => {\n const push = async () => {\n let readObj;\n try {\n readObj = await reader.read();\n } catch (e) {\n // If we abort the request, we'll get an error here. Just ignore\n // it since real errors will be reported when we read the buffer\n // below.\n shaka.log.v1('error reading from stream', e.message);\n return;\n }\n\n if (!readObj.done) {\n loaded += readObj.value.byteLength;\n if (streamDataCallback) {\n await streamDataCallback(readObj.value);\n }\n }\n\n const currentTime = Date.now();\n const chunkSize = loaded - lastLoaded;\n // If the time between last time and this time we got progress event\n // is long enough, or if a whole segment is downloaded, call\n // progressUpdated().\n if ((currentTime - lastTime > 100 && chunkSize >= minBytes) ||\n readObj.done) {\n const numBytesRemaining =\n readObj.done ? 0 : contentLength - loaded;\n progressUpdated(currentTime - lastTime, chunkSize,\n numBytesRemaining);\n lastLoaded = loaded;\n lastTime = currentTime;\n }\n\n if (readObj.done) {\n goog.asserts.assert(!readObj.value,\n 'readObj should be unset when \"done\" is true.');\n controller.close();\n } else {\n controller.enqueue(readObj.value);\n push();\n }\n };\n push();\n };\n // Create a ReadableStream to use the reader. We don't need to use the\n // actual stream for anything, though, as we are using the response's\n // arrayBuffer method to get the body, so we don't store the\n // ReadableStream.\n new ReadableStream({start}); // eslint-disable-line no-new\n arrayBuffer = await response.arrayBuffer();\n }\n } catch (error) {\n if (abortStatus.canceled) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.RECOVERABLE,\n shaka.util.Error.Category.NETWORK,\n shaka.util.Error.Code.OPERATION_ABORTED,\n uri, requestType);\n } else if (abortStatus.timedOut) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.RECOVERABLE,\n shaka.util.Error.Category.NETWORK,\n shaka.util.Error.Code.TIMEOUT,\n uri, requestType);\n } else {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.RECOVERABLE,\n shaka.util.Error.Category.NETWORK,\n shaka.util.Error.Code.HTTP_ERROR,\n uri, error, requestType);\n }\n }\n\n const headers = shaka.net.HttpFetchPlugin.headersToGenericObject_(\n response.headers);\n\n return shaka.net.HttpPluginUtils.makeResponse(headers, arrayBuffer,\n response.status, uri, response.url, request, requestType);\n }\n\n /**\n * @param {!Headers} headers\n * @return {!Object<string, string>}\n * @private\n */\n static headersToGenericObject_(headers) {\n const headersObj = {};\n headers.forEach((value, key) => {\n // Since Edge incorrectly return the header with a leading new line\n // character ('\\n'), we trim the header here.\n headersObj[key.trim()] = value;\n });\n return headersObj;\n }\n\n /**\n * Determine if the Fetch API is supported in the browser. Note: this is\n * deliberately exposed as a method to allow the client app to use the same\n * logic as Shaka when determining support.\n * @return {boolean}\n * @export\n */\n static isSupported() {\n // On Edge, ReadableStream exists, but attempting to construct it results in\n // an error. See https://bit.ly/2zwaFLL\n // So this has to check that ReadableStream is present AND usable.\n if (window.ReadableStream) {\n try {\n new ReadableStream({}); // eslint-disable-line no-new\n } catch (e) {\n return false;\n }\n } else {\n return false;\n }\n // Old fetch implementations hasn't body and ReadableStream implementation\n // See: https://github.com/shaka-project/shaka-player/issues/5088\n if (window.Response) {\n const response = new Response('');\n if (!response.body) {\n return false;\n }\n } else {\n return false;\n }\n return !!(window.fetch && !('polyfill' in window.fetch) &&\n window.AbortController);\n }\n};\n\n\n/**\n * @typedef {{\n * canceled: boolean,\n * timedOut: boolean\n * }}\n * @property {boolean} canceled\n * Indicates if the request was canceled.\n * @property {boolean} timedOut\n * Indicates if the request timed out.\n */\nshaka.net.HttpFetchPlugin.AbortStatus;\n\n\n/**\n * Overridden in unit tests, but compiled out in production.\n *\n * @const {function(string, !RequestInit)}\n * @private\n */\nshaka.net.HttpFetchPlugin.fetch_ = window.fetch;\n\n\n/**\n * Overridden in unit tests, but compiled out in production.\n *\n * @const {function(new: AbortController)}\n * @private\n */\nshaka.net.HttpFetchPlugin.AbortController_ = window.AbortController;\n\n\n/**\n * Overridden in unit tests, but compiled out in production.\n *\n * @const {function(new: ReadableStream, !Object)}\n * @private\n */\nshaka.net.HttpFetchPlugin.ReadableStream_ = window.ReadableStream;\n\n\n/**\n * Overridden in unit tests, but compiled out in production.\n *\n * @const {function(new: Headers)}\n * @private\n */\nshaka.net.HttpFetchPlugin.Headers_ = window.Headers;\n\n\nif (shaka.net.HttpFetchPlugin.isSupported()) {\n shaka.net.NetworkingEngine.registerScheme(\n 'http', shaka.net.HttpFetchPlugin.parse,\n shaka.net.NetworkingEngine.PluginPriority.PREFERRED,\n /* progressSupport= */ true);\n shaka.net.NetworkingEngine.registerScheme(\n 'https', shaka.net.HttpFetchPlugin.parse,\n shaka.net.NetworkingEngine.PluginPriority.PREFERRED,\n /* progressSupport= */ true);\n shaka.net.NetworkingEngine.registerScheme(\n 'blob', shaka.net.HttpFetchPlugin.parse,\n shaka.net.NetworkingEngine.PluginPriority.PREFERRED,\n /* progressSupport= */ true);\n}\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.net.HttpXHRPlugin');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.net.HttpPluginUtils');\ngoog.require('shaka.net.NetworkingEngine');\ngoog.require('shaka.util.AbortableOperation');\ngoog.require('shaka.util.Error');\n\n\n/**\n * @summary A networking plugin to handle http and https URIs via XHR.\n * @export\n */\nshaka.net.HttpXHRPlugin = class {\n /**\n * @param {string} uri\n * @param {shaka.extern.Request} request\n * @param {shaka.net.NetworkingEngine.RequestType} requestType\n * @param {shaka.extern.ProgressUpdated} progressUpdated Called when a\n * progress event happened.\n * @param {shaka.extern.HeadersReceived} headersReceived Called when the\n * headers for the download are received, but before the body is.\n * @param {shaka.extern.SchemePluginConfig} config\n * @return {!shaka.extern.IAbortableOperation.<shaka.extern.Response>}\n * @export\n */\n static parse(uri, request, requestType, progressUpdated, headersReceived,\n config) {\n const xhr = new shaka.net.HttpXHRPlugin.Xhr_();\n\n // Last time stamp when we got a progress event.\n let lastTime = Date.now();\n // Last number of bytes loaded, from progress event.\n let lastLoaded = 0;\n\n const promise = new Promise(((resolve, reject) => {\n xhr.open(request.method, uri, true);\n xhr.responseType = 'arraybuffer';\n xhr.timeout = request.retryParameters.timeout;\n xhr.withCredentials = request.allowCrossSiteCredentials;\n\n xhr.onabort = () => {\n reject(new shaka.util.Error(\n shaka.util.Error.Severity.RECOVERABLE,\n shaka.util.Error.Category.NETWORK,\n shaka.util.Error.Code.OPERATION_ABORTED,\n uri, requestType));\n };\n let calledHeadersReceived = false;\n xhr.onreadystatechange = (event) => {\n // See if the readyState is 2 (\"HEADERS_RECEIVED\").\n if (xhr.readyState == 2 && !calledHeadersReceived) {\n const headers = shaka.net.HttpXHRPlugin.headersToGenericObject_(xhr);\n headersReceived(headers);\n // Don't send out this event twice.\n calledHeadersReceived = true;\n }\n };\n xhr.onload = (event) => {\n const headers = shaka.net.HttpXHRPlugin.headersToGenericObject_(xhr);\n // eslint-disable-next-line shaka-rules/buffersource-no-instanceof\n goog.asserts.assert(xhr.response instanceof ArrayBuffer,\n 'XHR should have a response by now!');\n const xhrResponse = xhr.response;\n\n try {\n const currentTime = Date.now();\n progressUpdated(currentTime - lastTime, event.loaded - lastLoaded,\n /* numBytesRemaining= */ 0);\n const response = shaka.net.HttpPluginUtils.makeResponse(headers,\n xhrResponse, xhr.status, uri, xhr.responseURL, request,\n requestType);\n resolve(response);\n } catch (error) {\n goog.asserts.assert(error instanceof shaka.util.Error,\n 'Wrong error type!');\n reject(error);\n }\n };\n xhr.onerror = (event) => {\n reject(new shaka.util.Error(\n shaka.util.Error.Severity.RECOVERABLE,\n shaka.util.Error.Category.NETWORK,\n shaka.util.Error.Code.HTTP_ERROR,\n uri, event, requestType));\n };\n xhr.ontimeout = (event) => {\n reject(new shaka.util.Error(\n shaka.util.Error.Severity.RECOVERABLE,\n shaka.util.Error.Category.NETWORK,\n shaka.util.Error.Code.TIMEOUT,\n uri, requestType));\n };\n xhr.onprogress = (event) => {\n const currentTime = Date.now();\n // If the time between last time and this time we got progress event\n // is long enough, or if a whole segment is downloaded, call\n // progressUpdated().\n const minBytes = config.minBytesForProgressEvents || 0;\n const chunkSize = event.loaded - lastLoaded;\n if ((currentTime - lastTime > 100 && chunkSize >= minBytes) ||\n (event.lengthComputable && event.loaded == event.total)) {\n const numBytesRemaining =\n xhr.readyState == 4 ? 0 : event.total - event.loaded;\n progressUpdated(currentTime - lastTime, chunkSize,\n numBytesRemaining);\n lastLoaded = event.loaded;\n lastTime = currentTime;\n }\n };\n\n for (const key in request.headers) {\n // The Fetch API automatically normalizes outgoing header keys to\n // lowercase. For consistency's sake, do it here too.\n const lowercasedKey = key.toLowerCase();\n xhr.setRequestHeader(lowercasedKey, request.headers[key]);\n }\n xhr.send(request.body);\n }));\n\n return new shaka.util.AbortableOperation(\n promise,\n () => {\n xhr.abort();\n return Promise.resolve();\n });\n }\n\n /**\n * @param {!XMLHttpRequest} xhr\n * @return {!Object<string, string>}\n * @private\n */\n static headersToGenericObject_(xhr) {\n // Since Edge incorrectly return the header with a leading new\n // line character ('\\n'), we trim the header here.\n const headerLines = xhr.getAllResponseHeaders().trim().split('\\r\\n');\n const headers = {};\n for (const header of headerLines) {\n /** @type {!Array<string>} */\n const parts = header.split(': ');\n headers[parts[0].toLowerCase()] = parts.slice(1).join(': ');\n }\n return headers;\n }\n};\n\n\n/**\n * Overridden in unit tests, but compiled out in production.\n *\n * @const {function(new: XMLHttpRequest)}\n * @private\n */\nshaka.net.HttpXHRPlugin.Xhr_ = window.XMLHttpRequest;\n\n\nshaka.net.NetworkingEngine.registerScheme(\n 'http', shaka.net.HttpXHRPlugin.parse,\n shaka.net.NetworkingEngine.PluginPriority.FALLBACK,\n /* progressSupport= */ true);\nshaka.net.NetworkingEngine.registerScheme(\n 'https', shaka.net.HttpXHRPlugin.parse,\n shaka.net.NetworkingEngine.PluginPriority.FALLBACK,\n /* progressSupport= */ true);\nshaka.net.NetworkingEngine.registerScheme(\n 'blob', shaka.net.HttpXHRPlugin.parse,\n shaka.net.NetworkingEngine.PluginPriority.FALLBACK,\n /* progressSupport= */ true);\n\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.offline.DownloadInfo');\n\ngoog.require('shaka.util.Networking');\ngoog.require('shaka.util.Uint8ArrayUtils');\ngoog.requireType('shaka.media.InitSegmentReference');\ngoog.requireType('shaka.media.SegmentReference');\n\n\n/**\n * An object that represents a single segment, that the storage system will soon\n * download, but has not yet started downloading.\n */\nshaka.offline.DownloadInfo = class {\n /**\n * @param {shaka.media.SegmentReference|shaka.media.InitSegmentReference} ref\n * @param {number} estimateId\n * @param {number} groupId\n * @param {boolean} isInitSegment\n * @param {number} refPosition\n */\n constructor(ref, estimateId, groupId, isInitSegment, refPosition) {\n /** @type {shaka.media.SegmentReference|shaka.media.InitSegmentReference} */\n this.ref = ref;\n\n /** @type {number} */\n this.estimateId = estimateId;\n\n /** @type {number} */\n this.groupId = groupId;\n\n /** @type {boolean} */\n this.isInitSegment = isInitSegment;\n\n /** @type {number} */\n this.refPosition = refPosition;\n }\n\n /**\n * Creates an ID that encapsulates all important information in the ref, which\n * can then be used to check for equality.\n * @param {shaka.media.SegmentReference|shaka.media.InitSegmentReference} ref\n * @return {string}\n */\n static idForSegmentRef(ref) {\n const segmentData = ref.getSegmentData();\n if (segmentData) {\n return shaka.util.Uint8ArrayUtils.toBase64(segmentData);\n }\n // Escape the URIs using encodeURI, to make sure that a weirdly formed URI\n // cannot cause two unrelated refs to be considered equivalent.\n const removeSprites = (uri) => {\n return uri.split('#xywh=')[0];\n };\n return ref.getUris().map(\n (uri) => '{' + encodeURI(removeSprites(uri)) + '}').join('') +\n ':' + ref.startByte + ':' + ref.endByte;\n }\n\n /** @return {string} */\n getRefId() {\n return shaka.offline.DownloadInfo.idForSegmentRef(this.ref);\n }\n\n /**\n * @param {shaka.extern.PlayerConfiguration} config\n * @return {!shaka.extern.Request}\n */\n makeSegmentRequest(config) {\n return shaka.util.Networking.createSegmentRequest(\n this.ref.getUris(),\n this.ref.startByte,\n this.ref.endByte,\n config.streaming.retryParameters);\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.offline.DownloadProgressEstimator');\n\n\n/**\n * The download progress estimator class encapsulates all the logic for tracking\n * how much content has been downloaded and estimating its progress.\n *\n * @final\n */\nshaka.offline.DownloadProgressEstimator = class {\n /** */\n constructor() {\n /**\n * This is the sum of all estimates passed to |open|. This is used as the\n * denominator when measuring progress.\n *\n * @private {number}\n */\n this.estimatedTotal_ = 0;\n\n /**\n * This is the sum of all estimates pass to |open| but only after |close|\n * has been called. This is used as the numerator when measuring progress so\n * that |estimatedTotal_ == estimatedDownloaded_| after everything is\n * downloaded.\n *\n * @private {number}\n */\n this.estimatedDownloaded_ = 0;\n\n /**\n * This is the total number of bytes actually downloaded. This will most\n * likely differ from |estimatedTotal_| after everything is downloaded since\n * our estimates will be off.\n *\n * @private {number}\n */\n this.actualDownloaded_ = 0;\n\n /**\n * This is a map of all pending downloads. This maps their download id (an\n * internal id) to the estimate. This will allow us to update\n * |estimatedDownloaded_| when |close| is called.\n *\n * @private {!Map<number, number>}\n */\n this.pending_ = new Map();\n\n /**\n * This number is used to provide unique (to estimator) ids for each\n * download. This allows us to track each download in |pending_|.\n *\n * @private {number}\n */\n this.nextId_ = 0;\n }\n\n /**\n * Open a new download in the progress estimator. This will create an entry so\n * that we can track the download progress.\n *\n * This will return an id for the download. This id must be passed to |close|\n * in order for the |close| to be paired with this call to |open|.\n *\n * @param {number} estimate\n * @return {number}\n */\n open(estimate) {\n this.estimatedTotal_ += estimate;\n\n const id = this.nextId_;\n this.nextId_++;\n\n this.pending_.set(id, estimate);\n return id;\n }\n\n /**\n * Close a download in the estimator. This will signal that we have finished\n * downloading a segment and we can update the progress estimate.\n *\n * @param {number} id\n * @param {number} actual\n */\n close(id, actual) {\n if (!this.pending_.has(id)) {\n return;\n }\n\n const estimate = this.pending_.get(id);\n this.pending_.delete(id);\n\n this.estimatedDownloaded_ += estimate;\n this.actualDownloaded_ += actual;\n }\n\n /**\n * Get the current estimate for how much progress we've made downloading the\n * content. Progress will be between 0 and 1.\n *\n * Depending on the order of calls to |open| and |close|,\n * |getEstimatedProgress| will fluctuate and is not guaranteed to always be\n * increasing.\n *\n * @return {number}\n */\n getEstimatedProgress() {\n return this.estimatedTotal_ == 0 ?\n 0 :\n this.estimatedDownloaded_ / this.estimatedTotal_;\n }\n\n /**\n * Get the total number of bytes that were actually downloaded.\n *\n * @return {number}\n */\n getTotalDownloaded() {\n return this.actualDownloaded_;\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.offline.DownloadManager');\n\ngoog.require('shaka.net.NetworkingEngine');\ngoog.require('shaka.offline.DownloadProgressEstimator');\ngoog.require('shaka.util.ArrayUtils');\ngoog.require('shaka.util.BufferUtils');\ngoog.require('shaka.util.Destroyer');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.IDestroyable');\ngoog.require('shaka.util.Pssh');\n\n\n/**\n * This manages downloading segments.\n *\n * @implements {shaka.util.IDestroyable}\n * @final\n */\nshaka.offline.DownloadManager = class {\n /**\n * Create a new download manager. It will use (but not own) |networkingEngine|\n * and call |onProgress| after each download.\n *\n * @param {!shaka.net.NetworkingEngine} networkingEngine\n */\n constructor(networkingEngine) {\n /** @private {shaka.net.NetworkingEngine} */\n this.networkingEngine_ = networkingEngine;\n\n /**\n * We group downloads. Within each group, the requests are executed in\n * series. Between groups, the requests are executed in parallel. We store\n * the promise chain that is doing the work.\n *\n * @private {!Map<number, !Promise>}\n */\n this.groups_ = new Map();\n\n /** @private {!shaka.util.Destroyer} */\n this.destroyer_ = new shaka.util.Destroyer(() => {\n // Add a \"catch\" block to stop errors from being returned.\n return this.abortAll().catch(() => {});\n });\n\n /**\n * A list of callback functions to cancel any in-progress downloads.\n *\n * @private {!Array<function(): !Promise>}\n */\n this.abortCallbacks_ = [];\n\n /**\n * A callback for when a segment has been downloaded. The first parameter\n * is the progress of all segments, a number between 0.0 (0% complete) and\n * 1.0 (100% complete). The second parameter is the total number of bytes\n * that have been downloaded.\n *\n * @private {function(number, number)}\n */\n this.onProgress_ = (progress, size) => {};\n\n /**\n * A callback for when a segment has new PSSH data and we pass\n * on the initData to storage\n *\n * @private {function(!Uint8Array, string)}\n */\n this.onInitData_ = (initData, systemId) => {};\n\n /** @private {shaka.offline.DownloadProgressEstimator} */\n this.estimator_ = new shaka.offline.DownloadProgressEstimator();\n\n /** @private {boolean} */\n this.aborted_ = false;\n }\n\n /** @override */\n destroy() {\n return this.destroyer_.destroy();\n }\n\n /**\n * @param {function(number, number)} onProgress\n * @param {function(!Uint8Array, string)} onInitData\n */\n setCallbacks(onProgress, onInitData) {\n this.onProgress_ = onProgress;\n this.onInitData_ = onInitData;\n }\n\n /**\n * Aborts all in-progress downloads.\n * @return {!Promise} A promise that will resolve once the downloads are fully\n * aborted.\n */\n abortAll() {\n this.aborted_ = true;\n const promises = this.abortCallbacks_.map((callback) => callback());\n this.abortCallbacks_ = [];\n return Promise.all(promises);\n }\n\n /**\n * @return {boolean}\n */\n isAborted() {\n return this.aborted_;\n }\n\n /**\n * Adds a byte length to the download estimate.\n *\n * @param {number} estimatedByteLength\n * @return {number} estimateId\n */\n addDownloadEstimate(estimatedByteLength) {\n return this.estimator_.open(estimatedByteLength);\n }\n\n /**\n * Add a request to be downloaded as part of a group.\n *\n * @param {number} groupId\n * The group to add this segment to. If the group does not exist, a new\n * group will be created.\n * @param {shaka.extern.Request} request\n * @param {number} estimateId\n * @param {boolean} isInitSegment\n * @param {function(BufferSource):!Promise} onDownloaded\n * The callback for when this request has been downloaded. Downloading for\n * |group| will pause until the promise returned by |onDownloaded| resolves.\n * @return {!Promise} Resolved when this request is complete.\n */\n queue(groupId, request, estimateId, isInitSegment, onDownloaded) {\n this.destroyer_.ensureNotDestroyed();\n\n const group = this.groups_.get(groupId) || Promise.resolve();\n\n // Add another download to the group.\n const newPromise = group.then(async () => {\n const response = await this.fetchSegment_(request);\n\n // Make sure we stop downloading if we have been destroyed.\n if (this.destroyer_.destroyed()) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.STORAGE,\n shaka.util.Error.Code.OPERATION_ABORTED);\n }\n\n // Update initData\n if (isInitSegment) {\n const segmentBytes = shaka.util.BufferUtils.toUint8(response);\n const pssh = new shaka.util.Pssh(segmentBytes);\n for (const key in pssh.data) {\n const index = Number(key);\n const data = pssh.data[index];\n const systemId = pssh.systemIds[index];\n this.onInitData_(data, systemId);\n }\n }\n\n // Update all our internal stats.\n this.estimator_.close(estimateId, response.byteLength);\n this.onProgress_(\n this.estimator_.getEstimatedProgress(),\n this.estimator_.getTotalDownloaded());\n\n return onDownloaded(response);\n });\n\n this.groups_.set(groupId, newPromise);\n return newPromise;\n }\n\n /**\n * Add already-downloaded data to a group.\n *\n * @param {number} groupId\n * The group to add this segment to. If the group does not exist, a new\n * group will be created.\n * @param {!BufferSource} queueData\n * @param {number} estimateId\n * @param {boolean} isInitSegment\n * @param {function(BufferSource):!Promise} onDownloaded\n * The callback for when this request has been downloaded. Downloading for\n * |group| will pause until the promise returned by |onDownloaded| resolves.\n * @return {!Promise} Resolved when this request is complete.\n */\n queueData(groupId, queueData, estimateId, isInitSegment, onDownloaded) {\n this.destroyer_.ensureNotDestroyed();\n\n const group = this.groups_.get(groupId) || Promise.resolve();\n\n // Add another download to the group.\n const newPromise = group.then(() => {\n // Make sure we stop downloading if we have been destroyed.\n if (this.destroyer_.destroyed()) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.STORAGE,\n shaka.util.Error.Code.OPERATION_ABORTED);\n }\n\n // Update initData\n if (isInitSegment) {\n const segmentBytes = shaka.util.BufferUtils.toUint8(queueData);\n const pssh = new shaka.util.Pssh(segmentBytes);\n for (const key in pssh.data) {\n const index = Number(key);\n const data = pssh.data[index];\n const systemId = pssh.systemIds[index];\n this.onInitData_(data, systemId);\n }\n }\n\n // Update all our internal stats.\n this.estimator_.close(estimateId, queueData.byteLength);\n this.onProgress_(\n this.estimator_.getEstimatedProgress(),\n this.estimator_.getTotalDownloaded());\n\n return onDownloaded(queueData);\n });\n\n this.groups_.set(groupId, newPromise);\n return newPromise;\n }\n\n /**\n * Add additional async work to the group work queue.\n *\n * @param {number} groupId\n * The group to add this group to. If the group does not exist, a new\n * group will be created.\n * @param {function():!Promise} callback\n * The callback for the async work. Downloading for this group will be\n * blocked until the Promise returned by |callback| resolves.\n * @return {!Promise} Resolved when this work is complete.\n */\n queueWork(groupId, callback) {\n this.destroyer_.ensureNotDestroyed();\n const group = this.groups_.get(groupId) || Promise.resolve();\n const newPromise = group.then(async () => {\n await callback();\n });\n this.groups_.set(groupId, newPromise);\n return newPromise;\n }\n\n /**\n * Get a promise that will resolve when all currently queued downloads have\n * finished.\n *\n * @return {!Promise<number>}\n */\n async waitToFinish() {\n await Promise.all(this.groups_.values());\n return this.estimator_.getTotalDownloaded();\n }\n\n /**\n * Download a segment and return the data in the response.\n *\n * @param {shaka.extern.Request} request\n * @return {!Promise<BufferSource>}\n * @private\n */\n async fetchSegment_(request) {\n const type = shaka.net.NetworkingEngine.RequestType.SEGMENT;\n /** @type {!shaka.net.NetworkingEngine.PendingRequest} */\n const action = this.networkingEngine_.request(type, request);\n const abortCallback = () => {\n return action.abort();\n };\n this.abortCallbacks_.push(abortCallback);\n const response = await action.promise;\n shaka.util.ArrayUtils.remove(this.abortCallbacks_, abortCallback);\n return response.data;\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.offline.indexeddb.DBOperation');\n\n\ngoog.require('shaka.util.PublicPromise');\n\n\n/**\n * A DBOperation wraps an IndexedDB transaction in a promise.\n */\nshaka.offline.indexeddb.DBOperation = class {\n /**\n * @param {IDBTransaction} transaction\n * @param {string} storeName\n */\n constructor(transaction, storeName) {\n /** @private {IDBTransaction} */\n this.transaction_ = transaction;\n /** @private {IDBObjectStore} */\n this.store_ = transaction.objectStore(storeName);\n /** @private {!shaka.util.PublicPromise} */\n this.promise_ = new shaka.util.PublicPromise();\n\n // Connect the transaction and the promise together.\n // |event.preventDefault()| is used on all non-successful callbacks to\n // prevent Firefox from surfacing the error on the main thread.\n transaction.onabort = (event) => {\n event.preventDefault();\n this.promise_.reject();\n };\n transaction.onerror = (event) => {\n event.preventDefault();\n this.promise_.reject();\n };\n transaction.oncomplete = (event) => {\n this.promise_.resolve();\n };\n }\n\n /**\n * @return {!Promise}\n */\n async abort() {\n try {\n this.transaction_.abort();\n } catch (e) {\n // Ignore any exceptions that may be thrown as a result of aborting\n // the transaction.\n }\n\n try {\n // Wait for the promise to be rejected, but ignore the rejection error.\n await this.promise_;\n } catch (e) {}\n }\n\n /**\n * Calls the given callback for each entry in the database.\n *\n * @param {function(!IDBKeyType, T, !IDBCursorWithValue=):\n * (Promise|undefined)} callback\n * @return {!Promise}\n * @template T\n */\n forEachEntry(callback) {\n return new Promise((resolve, reject) => {\n const req = this.store_.openCursor();\n req.onerror = reject;\n req.onsuccess = async (event) => {\n // When we reach the end of the data that the cursor is iterating over,\n // |req.result| will be null to signal the end of the iteration.\n // https://developer.mozilla.org/en-US/docs/Web/API/IDBCursor/continue\n if (req.result == null) {\n resolve();\n return;\n }\n\n /** @type {!IDBCursorWithValue} */\n const cursor = req.result;\n await callback(cursor.key, cursor.value, cursor);\n cursor.continue();\n };\n });\n }\n\n /**\n * Get the store that the operation can interact with. Requests can be made\n * on the store. All requests made on the store will complete successfully\n * before the operation's promise will resolve. If any request fails, the\n * operation's promise will be rejected.\n *\n * @return {IDBObjectStore}\n */\n store() { return this.store_; }\n\n /**\n * Get the promise that wraps the transaction. This promise will resolve when\n * all requests on the object store complete successfully and the transaction\n * completes. If any request fails or the operation is aborted, the promise\n * will be rejected.\n *\n * @return {!Promise}\n */\n promise() { return this.promise_; }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.offline.indexeddb.DBConnection');\n\ngoog.require('shaka.offline.indexeddb.DBOperation');\ngoog.require('shaka.util.ArrayUtils');\n\n\n/**\n * DBConnection is used to manage an IndexedDB connection. It can create new\n * operations. If the connection is killed (via |destroy|) all pending\n * operations will be cancelled.\n */\nshaka.offline.indexeddb.DBConnection = class {\n /**\n * @param {IDBDatabase} connection A connection to an IndexedDB instance.\n */\n constructor(connection) {\n /** @private {IDBDatabase} */\n this.connection_ = connection;\n /** @private {!Array<shaka.offline.indexeddb.DBOperation>} */\n this.pending_ = [];\n }\n\n /**\n * @return {!Promise}\n */\n destroy() {\n return Promise.all(this.pending_.map((op) => {\n return op.abort();\n }));\n }\n\n /**\n * @param {string} store The name of the store that the operation should\n * occur on.\n * @return {!shaka.offline.indexeddb.DBOperation}\n */\n startReadOnlyOperation(store) {\n return this.startOperation_(store, 'readonly');\n }\n\n /**\n * @param {string} store The name of the store that the operation should\n * occur on.\n * @return {!shaka.offline.indexeddb.DBOperation}\n */\n startReadWriteOperation(store) {\n return this.startOperation_(store, 'readwrite');\n }\n\n /**\n * @param {string} store The name of the store that the operation should\n * occur on.\n * @param {string} type The type of operation being performed on the store.\n * This determines what commands may be performed. This\n * can either be \"readonly\" or \"readwrite\".\n * @return {!shaka.offline.indexeddb.DBOperation}\n * @private\n */\n startOperation_(store, type) {\n const transaction = this.connection_.transaction([store], type);\n const operation =\n new shaka.offline.indexeddb.DBOperation(transaction, store);\n\n this.pending_.push(operation);\n\n // Once the operation is done (regardless of outcome) stop tracking it.\n operation.promise().then(\n () => this.stopTracking_(operation),\n () => this.stopTracking_(operation));\n\n return operation;\n }\n\n /**\n * @param {!shaka.offline.indexeddb.DBOperation} operation\n * @private\n */\n stopTracking_(operation) {\n shaka.util.ArrayUtils.remove(this.pending_, operation);\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.offline.indexeddb.BaseStorageCell');\n\ngoog.require('shaka.offline.indexeddb.DBConnection');\ngoog.require('shaka.util.Error');\ngoog.requireType('shaka.offline.indexeddb.DBOperation');\n\n\n/**\n * indexeddb.StorageCellBase is a base class for all stores that use IndexedDB.\n *\n * @implements {shaka.extern.StorageCell}\n */\nshaka.offline.indexeddb.BaseStorageCell = class {\n /**\n * @param {IDBDatabase} connection\n * @param {string} segmentStore\n * @param {string} manifestStore\n */\n constructor(connection, segmentStore, manifestStore) {\n /** @protected {!shaka.offline.indexeddb.DBConnection} */\n this.connection_ = new shaka.offline.indexeddb.DBConnection(connection);\n\n /** @protected {string} */\n this.segmentStore_ = segmentStore;\n\n /** @protected {string} */\n this.manifestStore_ = manifestStore;\n }\n\n /** @override */\n destroy() {\n return this.connection_.destroy();\n }\n\n /** @override */\n hasFixedKeySpace() {\n // By default, all IDB stores are read-only. The latest one will need to\n // override this default to be read-write.\n return true;\n }\n\n /** @override */\n addSegments(segments) {\n // By default, reject all additions.\n return this.rejectAdd(this.segmentStore_);\n }\n\n /** @override */\n removeSegments(keys, onRemove) {\n return this.remove_(this.segmentStore_, keys, onRemove);\n }\n\n /** @override */\n async getSegments(keys) {\n const rawSegments = await this.get_(this.segmentStore_, keys);\n return rawSegments.map((s) => this.convertSegmentData(s));\n }\n\n /** @override */\n addManifests(manifests) {\n // By default, reject all additions.\n return this.rejectAdd(this.manifestStore_);\n }\n\n /** @override */\n updateManifest(key, manifest) {\n // By default, reject all updates.\n return this.rejectUpdate(this.manifestStore_);\n }\n\n /**\n * @param {number} key\n * @param {!shaka.extern.ManifestDB} manifest\n * @return {!Promise}\n * @protected\n */\n updateManifestImplementation(key, manifest) {\n const op = this.connection_.startReadWriteOperation(this.manifestStore_);\n const store = op.store();\n store.get(key).onsuccess = (e) => {\n store.put(manifest, key);\n };\n\n return op.promise();\n }\n\n /** @override */\n updateManifestExpiration(key, newExpiration) {\n const op = this.connection_.startReadWriteOperation(this.manifestStore_);\n const store = op.store();\n store.get(key).onsuccess = (e) => {\n const manifest = e.target.result;\n // If we can't find the value, then there is nothing for us to update.\n if (manifest) {\n manifest.expiration = newExpiration;\n store.put(manifest, key);\n }\n };\n\n return op.promise();\n }\n\n /** @override */\n removeManifests(keys, onRemove) {\n return this.remove_(this.manifestStore_, keys, onRemove);\n }\n\n /** @override */\n async getManifests(keys) {\n const rawManifests = await this.get_(this.manifestStore_, keys);\n return Promise.all(rawManifests.map((m) => this.convertManifest(m)));\n }\n\n /** @override */\n async getAllManifests() {\n /** @type {!shaka.offline.indexeddb.DBOperation} */\n const op = this.connection_.startReadOnlyOperation(this.manifestStore_);\n\n /** @type {!Map<number, shaka.extern.ManifestDB>} */\n const values = new Map();\n\n await op.forEachEntry(async (key, value) => {\n const manifest = await this.convertManifest(value);\n values.set(/** @type {number} */(key), manifest);\n });\n\n await op.promise();\n return values;\n }\n\n /**\n * @param {?} old\n * @return {shaka.extern.SegmentDataDB}\n * @protected\n */\n convertSegmentData(old) {\n // Conversion is specific to each subclass. By default, do nothing.\n return /** @type {shaka.extern.SegmentDataDB} */(old);\n }\n\n /**\n * @param {?} old\n * @return {!Promise<shaka.extern.ManifestDB>}\n * @protected\n */\n convertManifest(old) {\n // Conversion is specific to each subclass. By default, do nothing.\n return Promise.resolve(/** @type {shaka.extern.ManifestDB} */(old));\n }\n\n /**\n * @param {string} storeName\n * @return {!Promise}\n * @protected\n */\n rejectAdd(storeName) {\n return Promise.reject(new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.STORAGE,\n shaka.util.Error.Code.NEW_KEY_OPERATION_NOT_SUPPORTED,\n 'Cannot add new value to ' + storeName));\n }\n\n /**\n * @param {string} storeName\n * @return {!Promise}\n * @protected\n */\n rejectUpdate(storeName) {\n return Promise.reject(new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.STORAGE,\n shaka.util.Error.Code.MODIFY_OPERATION_NOT_SUPPORTED,\n 'Cannot modify values in ' + storeName));\n }\n\n /**\n * @param {string} storeName\n * @param {!Array<T>} values\n * @return {!Promise<!Array<number>>}\n * @template T\n * @protected\n */\n async add(storeName, values) {\n const op = this.connection_.startReadWriteOperation(storeName);\n const store = op.store();\n\n /** @type {!Array<number>} */\n const keys = [];\n\n // Write each segment out. When each request completes, the key will\n // be in |request.result| as can be seen in\n // https://w3c.github.io/IndexedDB/#key-generator-construct.\n for (const value of values) {\n const request = store.add(value);\n request.onsuccess = (event) => {\n const key = request.result;\n keys.push(key);\n };\n }\n\n // Wait until the operation completes or else |keys| will not be fully\n // populated.\n await op.promise();\n return keys;\n }\n\n /**\n * @param {string} storeName\n * @param {!Array<number>} keys\n * @param {function(number)} onRemove\n * @return {!Promise}\n * @private\n */\n remove_(storeName, keys, onRemove) {\n const op = this.connection_.startReadWriteOperation(storeName);\n const store = op.store();\n\n for (const key of keys) {\n store.delete(key).onsuccess = () => onRemove(key);\n }\n\n return op.promise();\n }\n\n /**\n * @param {string} storeName\n * @param {!Array<number>} keys\n * @return {!Promise<!Array<T>>}\n * @template T\n * @private\n */\n async get_(storeName, keys) {\n const op = this.connection_.startReadOnlyOperation(storeName);\n const store = op.store();\n\n const values = {};\n /** @type {!Array<number>} */\n const missing = [];\n\n // Use a map to store the objects so that we can reorder the results to\n // match the order of |keys|.\n for (const key of keys) {\n const request = store.get(key);\n request.onsuccess = () => {\n // Make sure a defined value was found. Indexeddb treats no-value found\n // as a success with an undefined result.\n if (request.result == undefined) {\n missing.push(key);\n }\n\n values[key] = request.result;\n };\n }\n\n // Wait until the operation completes or else values may be missing from\n // |values|. Use the original key list to convert the map to a list so that\n // the order will match.\n await op.promise();\n if (missing.length) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.STORAGE,\n shaka.util.Error.Code.KEY_NOT_FOUND,\n 'Could not find values for ' + missing);\n }\n\n return keys.map((key) => values[key]);\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.offline.indexeddb.EmeSessionStorageCell');\n\ngoog.require('shaka.offline.indexeddb.DBConnection');\ngoog.requireType('shaka.offline.indexeddb.DBOperation');\n\n\n/**\n * The implementation of the EME session storage cell.\n *\n * @implements {shaka.extern.EmeSessionStorageCell}\n */\nshaka.offline.indexeddb.EmeSessionStorageCell = class {\n /**\n * @param {IDBDatabase} connection\n * @param {string} store\n */\n constructor(connection, store) {\n /** @private {!shaka.offline.indexeddb.DBConnection} */\n this.connection_ = new shaka.offline.indexeddb.DBConnection(connection);\n\n /** @private {string} */\n this.store_ = store;\n }\n\n /** @override */\n destroy() { return this.connection_.destroy(); }\n\n /** @override */\n async getAll() {\n /** @type {!shaka.offline.indexeddb.DBOperation} */\n const op = this.connection_.startReadOnlyOperation(this.store_);\n /** @type {!Array<shaka.extern.EmeSessionDB>} */\n const values = [];\n\n await op.forEachEntry((key, value) => {\n values.push(value);\n });\n\n await op.promise();\n return values;\n }\n\n /** @override */\n add(sessions) {\n const op = this.connection_.startReadWriteOperation(this.store_);\n const store = op.store();\n\n for (const session of sessions) {\n store.add(session);\n }\n\n return op.promise();\n }\n\n /** @override */\n async remove(sessionIds) {\n /** @type {!shaka.offline.indexeddb.DBOperation} */\n const op = this.connection_.startReadWriteOperation(this.store_);\n\n await op.forEachEntry((key, value, cursor) => {\n if (sessionIds.includes(value.sessionId)) {\n cursor.delete();\n }\n });\n\n await op.promise();\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.offline.StorageCellHandle');\ngoog.provide('shaka.offline.StorageCellPath');\ngoog.provide('shaka.offline.StorageMuxer');\n\ngoog.require('shaka.log');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.IDestroyable');\n\n/**\n * @typedef {{\n * mechanism: string,\n * cell: string\n * }}\n *\n * @property {string} mechanism\n * The name of the mechanism that holds the cell.\n * @property {string} cell\n * The name of the cell in the mechanism.\n */\nshaka.offline.StorageCellPath;\n\n\n/**\n * @typedef {{\n * path: shaka.offline.StorageCellPath,\n * cell: !shaka.extern.StorageCell\n * }}\n *\n * @property {shaka.offline.StorageCellPath} path\n * The path that maps to the cell.\n * @property {shaka.extern.StorageCell} cell\n * The storage cell that the path points to within the storage muxer.\n */\nshaka.offline.StorageCellHandle;\n\n\n// TODO: revisit this when Closure Compiler supports partially-exported classes.\n/**\n * StorageMuxer is responsible for managing StorageMechanisms and addressing\n * cells. The primary purpose of the muxer is to give the caller the correct\n * cell for the operations they want to perform.\n *\n * |findActive| will be used when the caller wants a cell that supports\n * add-operations. This will be used when saving new content to storage.\n *\n * |findAll| will be used when the caller want to look at all the content\n * in storage.\n *\n * |resolvePath| will be used to convert a path (from |findActive| and\n * |findAll|) into a cell, which it then returns.\n *\n * @implements {shaka.util.IDestroyable}\n * @export\n */\nshaka.offline.StorageMuxer = class {\n /** */\n constructor() {\n /**\n * A key in this map is the name given when registering a StorageMechanism.\n *\n * @private {!Map<string, !shaka.extern.StorageMechanism>}\n */\n this.mechanisms_ = new Map();\n }\n\n // TODO: revisit this when the compiler supports partially-exported classes.\n /**\n * Free all resources used by the muxer, mechanisms, and cells. This should\n * not affect the stored content.\n *\n * @override\n * @export\n */\n destroy() {\n /** @type {!Array<!Promise>} */\n const destroys = [];\n for (const mechanism of this.mechanisms_.values()) {\n destroys.push(mechanism.destroy());\n }\n\n // Empty the map so that subsequent calls will be no-ops.\n this.mechanisms_.clear();\n\n return Promise.all(destroys);\n }\n\n /**\n * Initialize the storage muxer. This must be called before any other calls.\n * This will initialize the muxer to use all mechanisms that have been\n * registered with |StorageMuxer.register|.\n *\n * @return {!Promise}\n */\n init() {\n // Add the new instance of each mechanism to the muxer.\n const registry = shaka.offline.StorageMuxer.getRegistry_();\n registry.forEach((factory, name) => {\n const mech = factory();\n if (mech) {\n this.mechanisms_.set(name, mech);\n } else {\n shaka.log.info(\n 'Skipping ' + name + ' as it is not supported on this platform');\n }\n });\n\n /** @type {!Array<!Promise>} */\n const initPromises = [];\n for (const mechanism of this.mechanisms_.values()) {\n initPromises.push(mechanism.init());\n }\n\n return Promise.all(initPromises);\n }\n\n /**\n * Get a promise that will resolve with a storage cell that supports\n * add-operations. If no cell can be found, the promise will be rejected.\n *\n * @return {shaka.offline.StorageCellHandle}\n */\n getActive() {\n /** @type {?shaka.offline.StorageCellHandle} */\n let handle = null;\n\n this.mechanisms_.forEach((mechanism, mechanismName) => {\n mechanism.getCells().forEach((cell, cellName) => {\n // If this cell is not useful to us or we already have a handle, then\n // we don't need to make a new handle.\n if (cell.hasFixedKeySpace() || handle) {\n return;\n }\n\n const path = {\n mechanism: mechanismName,\n cell: cellName,\n };\n\n handle = {\n path: path,\n cell: cell,\n };\n });\n });\n\n if (handle) {\n return /** @type {shaka.offline.StorageCellHandle} */(handle);\n }\n\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.STORAGE,\n shaka.util.Error.Code.MISSING_STORAGE_CELL,\n 'Could not find a cell that supports add-operations');\n }\n\n /**\n * @param {function(!shaka.offline.StorageCellPath,\n * !shaka.extern.StorageCell)} callback\n */\n forEachCell(callback) {\n this.mechanisms_.forEach((mechanism, mechanismName) => {\n mechanism.getCells().forEach((cell, cellName) => {\n const path = {\n mechanism: mechanismName,\n cell: cellName,\n };\n\n callback(path, cell);\n });\n });\n }\n\n /**\n * Get a specific storage cell. The promise will resolve with the storage\n * cell if it is found. If the storage cell is not found, the promise will\n * be rejected.\n *\n * @param {string} mechanismName\n * @param {string} cellName\n * @return {!shaka.extern.StorageCell}\n */\n getCell(mechanismName, cellName) {\n const mechanism = this.mechanisms_.get(mechanismName);\n if (!mechanism) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.STORAGE,\n shaka.util.Error.Code.MISSING_STORAGE_CELL,\n 'Could not find mechanism with name ' + mechanismName);\n }\n\n const cell = mechanism.getCells().get(cellName);\n if (!cell) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.STORAGE,\n shaka.util.Error.Code.MISSING_STORAGE_CELL,\n 'Could not find cell with name ' + cellName);\n }\n\n return cell;\n }\n\n /**\n * @param {function(!shaka.extern.EmeSessionStorageCell)} callback\n */\n forEachEmeSessionCell(callback) {\n this.mechanisms_.forEach((mechanism, name) => {\n callback(mechanism.getEmeSessionCell());\n });\n }\n\n /**\n * Gets an arbitrary EME session cell that can be used for storing new session\n * info.\n *\n * @return {!shaka.extern.EmeSessionStorageCell}\n */\n getEmeSessionCell() {\n const mechanisms = Array.from(this.mechanisms_.keys());\n if (!mechanisms.length) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.STORAGE,\n shaka.util.Error.Code.STORAGE_NOT_SUPPORTED,\n 'No supported storage mechanisms found');\n }\n\n return this.mechanisms_.get(mechanisms[0]).getEmeSessionCell();\n }\n\n /**\n * Find the cell that the path points to. A path is made up of a mount point\n * and a cell id. If a cell can be found, the cell will be returned. If no\n * cell is found, null will be returned.\n *\n * @param {shaka.offline.StorageCellPath} path\n * @return {shaka.extern.StorageCell}\n */\n resolvePath(path) {\n const mechanism = this.mechanisms_.get(path.mechanism);\n\n if (!mechanism) {\n return null;\n }\n\n return mechanism.getCells().get(path.cell);\n }\n\n /**\n * This will erase all previous content from storage. Using paths obtained\n * before calling |erase| is discouraged, as cells may have changed during a\n * erase.\n *\n * @return {!Promise}\n */\n async erase() {\n // If we have initialized, we will use the existing mechanism instances.\n /** @type {!Array<!shaka.extern.StorageMechanism>} */\n const mechanisms = Array.from(this.mechanisms_.values());\n const alreadyInitialized = mechanisms.length > 0;\n\n // If we have not initialized, we should still be able to erase. This is\n // critical to our ability to wipe the DB in case of a version mismatch.\n // If there are no instances, create temporary ones and destroy them later.\n if (!alreadyInitialized) {\n const registry = shaka.offline.StorageMuxer.getRegistry_();\n registry.forEach((factory, name) => {\n const mech = factory();\n if (mech) {\n mechanisms.push(mech);\n }\n });\n }\n\n // Erase all storage mechanisms.\n await Promise.all(mechanisms.map((m) => m.erase()));\n\n // If we were erasing temporary instances, destroy them, too.\n if (!alreadyInitialized) {\n await Promise.all(mechanisms.map((m) => m.destroy()));\n }\n }\n\n /**\n * Register a storage mechanism for use with the default storage muxer. This\n * will have no effect on any storage muxer already in main memory.\n *\n * @param {string} name\n * @param {function():shaka.extern.StorageMechanism} factory\n * @export\n */\n static register(name, factory) {\n shaka.offline.StorageMuxer.registry_.set(name, factory);\n }\n\n\n /**\n * Unregister a storage mechanism for use with the default storage muxer. This\n * will have no effect on any storage muxer already in main memory.\n *\n * @param {string} name The name that the storage mechanism was registered\n * under.\n * @export\n */\n static unregister(name) {\n shaka.offline.StorageMuxer.registry_.delete(name);\n }\n\n /**\n * Check if there is support for storage on this platform. It is assumed that\n * if there are any mechanisms registered, it means that storage is supported\n * on this platform. We do not check if the mechanisms have any cells.\n *\n * @return {boolean}\n */\n static support() {\n const registry = shaka.offline.StorageMuxer.getRegistry_();\n // Make sure that we will have SOME mechanisms created by creating a\n // mechanism and immediately destroying it.\n for (const create of registry.values()) {\n const instance = create();\n\n if (instance) {\n instance.destroy();\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Replace the mechanism map used by the muxer. This should only be used\n * in testing.\n *\n * @param {Map<string, function(): shaka.extern.StorageMechanism>} map\n */\n static overrideSupport(map) {\n shaka.offline.StorageMuxer.override_ = map;\n }\n\n /**\n * Undo a previous call to |overrideSupport|.\n */\n static clearOverride() {\n shaka.offline.StorageMuxer.override_ = null;\n }\n\n /**\n * Get the registry. If the support has been disabled, this will always\n * an empty registry. Reading should always be done via |getRegistry_|.\n *\n * @return {!Map<string, function(): shaka.extern.StorageMechanism>}\n * @private\n */\n static getRegistry_() {\n const override = shaka.offline.StorageMuxer.override_;\n const registry = shaka.offline.StorageMuxer.registry_;\n\n if (COMPILED) {\n return registry;\n } else {\n return override || registry;\n }\n }\n};\n\n\n/**\n * @private {Map<string, function(): shaka.extern.StorageMechanism>}\n */\nshaka.offline.StorageMuxer.override_ = null;\n\n\n/**\n * @private {!Map<string, function(): shaka.extern.StorageMechanism>}\n */\nshaka.offline.StorageMuxer.registry_ = new Map();\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.offline.indexeddb.StorageMechanism');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.log');\ngoog.require('shaka.offline.StorageMuxer');\ngoog.require('shaka.offline.indexeddb.EmeSessionStorageCell');\ngoog.require('shaka.offline.indexeddb.V1StorageCell');\ngoog.require('shaka.offline.indexeddb.V2StorageCell');\ngoog.require('shaka.offline.indexeddb.V5StorageCell');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.PublicPromise');\ngoog.require('shaka.util.Platform');\ngoog.require('shaka.util.Timer');\n\n\n/**\n * A storage mechanism to manage storage cells for an indexed db instance.\n * The cells are just for interacting with the stores that are found in the\n * database instance. The mechanism is responsible for creating new stores\n * when opening the database. If the database is too old of a version, a\n * cell will be added for the old stores but the cell won't support add\n * operations. The mechanism will create the new versions of the stores and\n * will allow add operations for those stores.\n *\n * @implements {shaka.extern.StorageMechanism}\n */\nshaka.offline.indexeddb.StorageMechanism = class {\n /** */\n constructor() {\n /** @private {IDBDatabase} */\n this.db_ = null;\n\n /** @private {shaka.extern.StorageCell} */\n this.v1_ = null;\n /** @private {shaka.extern.StorageCell} */\n this.v2_ = null;\n /** @private {shaka.extern.StorageCell} */\n this.v3_ = null;\n /** @private {shaka.extern.StorageCell} */\n this.v5_ = null;\n /** @private {shaka.extern.EmeSessionStorageCell} */\n this.sessions_ = null;\n }\n\n /**\n * @override\n */\n init() {\n const name = shaka.offline.indexeddb.StorageMechanism.DB_NAME;\n const version = shaka.offline.indexeddb.StorageMechanism.VERSION;\n\n const p = new shaka.util.PublicPromise();\n\n // Add a timeout mechanism, for the (rare?) case where no callbacks are\n // called at all, so that this method doesn't hang forever.\n let timedOut = false;\n const timeOutTimer = new shaka.util.Timer(() => {\n timedOut = true;\n p.reject(new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.STORAGE,\n shaka.util.Error.Code.INDEXED_DB_INIT_TIMED_OUT));\n });\n timeOutTimer.tickAfter(5);\n\n const open = window.indexedDB.open(name, version);\n open.onsuccess = (event) => {\n if (timedOut) {\n // Too late, we have already given up on opening the storage mechanism.\n return;\n }\n const db = open.result;\n this.db_ = db;\n this.v1_ = shaka.offline.indexeddb.StorageMechanism.createV1_(db);\n this.v2_ = shaka.offline.indexeddb.StorageMechanism.createV2_(db);\n this.v3_ = shaka.offline.indexeddb.StorageMechanism.createV3_(db);\n // NOTE: V4 of the database was when we introduced a special table to\n // store EME session IDs. It has no separate storage cell, so we skip to\n // V5.\n this.v5_ = shaka.offline.indexeddb.StorageMechanism.createV5_(db);\n this.sessions_ =\n shaka.offline.indexeddb.StorageMechanism.createEmeSessionCell_(db);\n timeOutTimer.stop();\n p.resolve();\n };\n open.onupgradeneeded = (event) => {\n // Add object stores for the latest version only.\n this.createStores_(open.result);\n };\n open.onerror = (event) => {\n if (timedOut) {\n // Too late, we have already given up on opening the storage mechanism.\n return;\n }\n p.reject(new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.STORAGE,\n shaka.util.Error.Code.INDEXED_DB_ERROR,\n open.error));\n timeOutTimer.stop();\n\n // Firefox will raise an error on the main thread unless we stop it here.\n event.preventDefault();\n };\n\n return p;\n }\n\n /**\n * @override\n */\n async destroy() {\n if (this.v1_) {\n await this.v1_.destroy();\n }\n if (this.v2_) {\n await this.v2_.destroy();\n }\n if (this.v3_) {\n await this.v3_.destroy();\n }\n if (this.v5_) {\n await this.v5_.destroy();\n }\n if (this.sessions_) {\n await this.sessions_.destroy();\n }\n\n // If we were never initialized, then |db_| will still be null.\n if (this.db_) {\n this.db_.close();\n }\n }\n\n /**\n * @override\n */\n getCells() {\n const map = new Map();\n\n if (this.v1_) {\n map.set('v1', this.v1_);\n }\n if (this.v2_) {\n map.set('v2', this.v2_);\n }\n if (this.v3_) {\n map.set('v3', this.v3_);\n }\n if (this.v5_) {\n map.set('v5', this.v5_);\n }\n\n return map;\n }\n\n /**\n * @override\n */\n getEmeSessionCell() {\n goog.asserts.assert(this.sessions_, 'Cannot be destroyed.');\n return this.sessions_;\n }\n\n /**\n * @override\n */\n async erase() {\n // Not all cells may have been created, so only destroy the ones that\n // were created.\n if (this.v1_) {\n await this.v1_.destroy();\n }\n if (this.v2_) {\n await this.v2_.destroy();\n }\n if (this.v3_) {\n await this.v3_.destroy();\n }\n if (this.v5_) {\n await this.v5_.destroy();\n }\n\n // |db_| will only be null if the muxer was not initialized. We need to\n // close the connection in order delete the database without it being\n // blocked.\n if (this.db_) {\n this.db_.close();\n }\n\n await shaka.offline.indexeddb.StorageMechanism.deleteAll_();\n\n // Reset before initializing.\n this.db_ = null;\n this.v1_ = null;\n this.v2_ = null;\n this.v3_ = null;\n this.v5_ = null;\n\n await this.init();\n }\n\n /**\n * @param {!IDBDatabase} db\n * @return {shaka.extern.StorageCell}\n * @private\n */\n static createV1_(db) {\n const StorageMechanism = shaka.offline.indexeddb.StorageMechanism;\n const segmentStore = StorageMechanism.V1_SEGMENT_STORE;\n const manifestStore = StorageMechanism.V1_MANIFEST_STORE;\n const stores = db.objectStoreNames;\n if (stores.contains(manifestStore) && stores.contains(segmentStore)) {\n shaka.log.debug('Mounting v1 idb storage cell');\n\n return new shaka.offline.indexeddb.V1StorageCell(\n db,\n segmentStore,\n manifestStore);\n }\n return null;\n }\n\n /**\n * @param {!IDBDatabase} db\n * @return {shaka.extern.StorageCell}\n * @private\n */\n static createV2_(db) {\n const StorageMechanism = shaka.offline.indexeddb.StorageMechanism;\n const segmentStore = StorageMechanism.V2_SEGMENT_STORE;\n const manifestStore = StorageMechanism.V2_MANIFEST_STORE;\n const stores = db.objectStoreNames;\n if (stores.contains(manifestStore) && stores.contains(segmentStore)) {\n shaka.log.debug('Mounting v2 idb storage cell');\n\n return new shaka.offline.indexeddb.V2StorageCell(\n db,\n segmentStore,\n manifestStore);\n }\n return null;\n }\n\n /**\n * @param {!IDBDatabase} db\n * @return {shaka.extern.StorageCell}\n * @private\n */\n static createV3_(db) {\n const StorageMechanism = shaka.offline.indexeddb.StorageMechanism;\n const segmentStore = StorageMechanism.V3_SEGMENT_STORE;\n const manifestStore = StorageMechanism.V3_MANIFEST_STORE;\n const stores = db.objectStoreNames;\n if (stores.contains(manifestStore) && stores.contains(segmentStore)) {\n shaka.log.debug('Mounting v3 idb storage cell');\n\n // Version 3 uses the same structure as version 2, so we can use the same\n // cells but it can support new entries.\n return new shaka.offline.indexeddb.V2StorageCell(\n db,\n segmentStore,\n manifestStore);\n }\n return null;\n }\n\n /**\n * @param {!IDBDatabase} db\n * @return {shaka.extern.StorageCell}\n * @private\n */\n static createV5_(db) {\n const StorageMechanism = shaka.offline.indexeddb.StorageMechanism;\n const segmentStore = StorageMechanism.V5_SEGMENT_STORE;\n const manifestStore = StorageMechanism.V5_MANIFEST_STORE;\n const stores = db.objectStoreNames;\n if (stores.contains(manifestStore) && stores.contains(segmentStore)) {\n shaka.log.debug('Mounting v5 idb storage cell');\n\n return new shaka.offline.indexeddb.V5StorageCell(\n db,\n segmentStore,\n manifestStore);\n }\n return null;\n }\n\n /**\n * @param {!IDBDatabase} db\n * @return {shaka.extern.EmeSessionStorageCell}\n * @private\n */\n static createEmeSessionCell_(db) {\n const StorageMechanism = shaka.offline.indexeddb.StorageMechanism;\n const store = StorageMechanism.SESSION_ID_STORE;\n if (db.objectStoreNames.contains(store)) {\n shaka.log.debug('Mounting session ID idb storage cell');\n return new shaka.offline.indexeddb.EmeSessionStorageCell(db, store);\n }\n return null;\n }\n\n /**\n * @param {!IDBDatabase} db\n * @private\n */\n createStores_(db) {\n const storeNames = [\n shaka.offline.indexeddb.StorageMechanism.V5_SEGMENT_STORE,\n shaka.offline.indexeddb.StorageMechanism.V5_MANIFEST_STORE,\n shaka.offline.indexeddb.StorageMechanism.SESSION_ID_STORE,\n ];\n\n for (const name of storeNames) {\n if (!db.objectStoreNames.contains(name)) {\n db.createObjectStore(name, {autoIncrement: true});\n }\n }\n }\n\n /**\n * Delete the indexed db instance so that all stores are deleted and cleared.\n * This will force the database to a like-new state next time it opens.\n *\n * @return {!Promise}\n * @private\n */\n static deleteAll_() {\n const name = shaka.offline.indexeddb.StorageMechanism.DB_NAME;\n\n const p = new shaka.util.PublicPromise();\n\n const del = window.indexedDB.deleteDatabase(name);\n del.onblocked = (event) => {\n shaka.log.warning('Deleting', name, 'is being blocked', event);\n };\n del.onsuccess = (event) => {\n p.resolve();\n };\n del.onerror = (event) => {\n p.reject(new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.STORAGE,\n shaka.util.Error.Code.INDEXED_DB_ERROR,\n del.error));\n\n // Firefox will raise an error on the main thread unless we stop it here.\n event.preventDefault();\n };\n\n return p;\n }\n};\n\n/** @const {string} */\nshaka.offline.indexeddb.StorageMechanism.DB_NAME = 'shaka_offline_db';\n/** @const {number} */\nshaka.offline.indexeddb.StorageMechanism.VERSION = 5;\n/** @const {string} */\nshaka.offline.indexeddb.StorageMechanism.V1_SEGMENT_STORE = 'segment';\n/** @const {string} */\nshaka.offline.indexeddb.StorageMechanism.V2_SEGMENT_STORE = 'segment-v2';\n/** @const {string} */\nshaka.offline.indexeddb.StorageMechanism.V3_SEGMENT_STORE = 'segment-v3';\n/** @const {string} */\nshaka.offline.indexeddb.StorageMechanism.V5_SEGMENT_STORE = 'segment-v5';\n/** @const {string} */\nshaka.offline.indexeddb.StorageMechanism.V1_MANIFEST_STORE = 'manifest';\n/** @const {string} */\nshaka.offline.indexeddb.StorageMechanism.V2_MANIFEST_STORE = 'manifest-v2';\n/** @const {string} */\nshaka.offline.indexeddb.StorageMechanism.V3_MANIFEST_STORE = 'manifest-v3';\n/** @const {string} */\nshaka.offline.indexeddb.StorageMechanism.V5_MANIFEST_STORE = 'manifest-v5';\n/** @const {string} */\nshaka.offline.indexeddb.StorageMechanism.SESSION_ID_STORE = 'session-ids';\n\n\n// Since this may be called before the polyfills remove indexeddb support from\n// some platforms (looking at you Chromecast), we need to check for support\n// when we create the mechanism.\n//\n// Thankfully the storage muxer api allows us to return a null mechanism\n// to indicate that the mechanism is not supported on this platform.\nshaka.offline.StorageMuxer.register(\n 'idb',\n () => {\n // Offline storage is not supported on the Chromecast Linux/Fuchsia or\n // Xbox One platforms.\n if ((shaka.util.Platform.isChromecast() &&\n !shaka.util.Platform.isAndroidCastDevice()) ||\n shaka.util.Platform.isXboxOne()) {\n return null;\n }\n // Offline storage requires the IndexedDB API.\n if (!window.indexedDB) {\n return null;\n }\n return new shaka.offline.indexeddb.StorageMechanism();\n });\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.offline.indexeddb.V1StorageCell');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.log');\ngoog.require('shaka.offline.indexeddb.BaseStorageCell');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.ManifestParserUtils');\ngoog.require('shaka.util.PeriodCombiner');\ngoog.require('shaka.util.PublicPromise');\n\n\n/**\n * The V1StorageCell is for all stores that follow the shaka.externs V1 offline\n * types, introduced in Shaka Player v2.0 and deprecated in v2.3.\n *\n * @implements {shaka.extern.StorageCell}\n */\nshaka.offline.indexeddb.V1StorageCell = class\n extends shaka.offline.indexeddb.BaseStorageCell {\n /** @override */\n async updateManifestExpiration(key, newExpiration) {\n const op = this.connection_.startReadWriteOperation(this.manifestStore_);\n\n /** @type {IDBObjectStore} */\n const store = op.store();\n\n /** @type {!shaka.util.PublicPromise} */\n const p = new shaka.util.PublicPromise();\n\n store.get(key).onsuccess = (event) => {\n // Make sure a defined value was found. Indexeddb treats \"no value found\"\n // as a success with an undefined result.\n const manifest = /** @type {shaka.extern.ManifestDBV1} */(\n event.target.result);\n\n // Indexeddb does not fail when you get a value that is not in the\n // database. It will return an undefined value. However, we expect\n // the value to never be null, so something is wrong if we get a\n // falsy value.\n if (manifest) {\n // Since this store's scheme uses in-line keys, we don't specify the key\n // with |put|. This difference is why we must override the base class.\n goog.asserts.assert(\n manifest.key == key,\n 'With in-line keys, the keys should match');\n\n manifest.expiration = newExpiration;\n store.put(manifest);\n\n p.resolve();\n } else {\n p.reject(new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.STORAGE,\n shaka.util.Error.Code.KEY_NOT_FOUND,\n 'Could not find values for ' + key));\n }\n };\n\n await Promise.all([op.promise(), p]);\n }\n\n /**\n * @override\n * @param {shaka.extern.ManifestDBV1} old\n * @return {!Promise<shaka.extern.ManifestDB>}\n */\n async convertManifest(old) {\n const V1StorageCell = shaka.offline.indexeddb.V1StorageCell;\n\n const streamsPerPeriod = [];\n\n for (let i = 0; i < old.periods.length; ++i) {\n // The last period ends at the end of the presentation.\n const periodEnd = i == old.periods.length - 1 ?\n old.duration : old.periods[i + 1].startTime;\n const duration = periodEnd - old.periods[i].startTime;\n const streams = V1StorageCell.convertPeriod_(old.periods[i], duration);\n\n streamsPerPeriod.push(streams);\n }\n\n const streams = await shaka.util.PeriodCombiner.combineDbStreams(\n streamsPerPeriod);\n\n return {\n creationTime: 0,\n originalManifestUri: old.originalManifestUri,\n duration: old.duration,\n size: old.size,\n expiration: old.expiration == null ? Infinity : old.expiration,\n streams,\n sessionIds: old.sessionIds,\n drmInfo: old.drmInfo,\n appMetadata: old.appMetadata,\n sequenceMode: false,\n };\n }\n\n /**\n * @param {shaka.extern.PeriodDBV1} old\n * @param {number} periodDuration\n * @return {!Array<shaka.extern.StreamDB>}\n * @private\n */\n static convertPeriod_(old, periodDuration) {\n const V1StorageCell = shaka.offline.indexeddb.V1StorageCell;\n\n // In the case that this is really old (like really old, like dinosaurs\n // roaming the Earth old) there may be no variants, so we need to add those.\n V1StorageCell.fillMissingVariants_(old);\n\n for (const stream of old.streams) {\n const message = 'After filling in missing variants, ' +\n 'each stream should have variant ids';\n goog.asserts.assert(stream.variantIds, message);\n }\n\n return old.streams.map((stream) => V1StorageCell.convertStream_(\n stream, old.startTime, periodDuration));\n }\n\n /**\n * @param {shaka.extern.StreamDBV1} old\n * @param {number} periodStart\n * @param {number} periodDuration\n * @return {shaka.extern.StreamDB}\n * @private\n */\n static convertStream_(old, periodStart, periodDuration) {\n const V1StorageCell = shaka.offline.indexeddb.V1StorageCell;\n\n const initSegmentKey = old.initSegmentUri ?\n V1StorageCell.getKeyFromSegmentUri_(old.initSegmentUri) : null;\n\n // timestampOffset in the new format is the inverse of\n // presentationTimeOffset in the old format. Also, PTO did not include the\n // period start, while TO does.\n const timestampOffset = periodStart + old.presentationTimeOffset;\n\n const appendWindowStart = periodStart;\n const appendWindowEnd = periodStart + periodDuration;\n\n return {\n id: old.id,\n originalId: null,\n groupId: null,\n primary: old.primary,\n type: old.contentType,\n mimeType: old.mimeType,\n codecs: old.codecs,\n frameRate: old.frameRate,\n pixelAspectRatio: undefined,\n hdr: undefined,\n colorGamut: undefined,\n videoLayout: undefined,\n kind: old.kind,\n language: old.language,\n originalLanguage: old.language || null,\n label: old.label,\n width: old.width,\n height: old.height,\n initSegmentKey: initSegmentKey,\n encrypted: old.encrypted,\n keyIds: new Set([old.keyId]),\n segments: old.segments.map((segment) => V1StorageCell.convertSegment_(\n segment, initSegmentKey, appendWindowStart, appendWindowEnd,\n timestampOffset)),\n variantIds: old.variantIds,\n roles: [],\n forced: false,\n audioSamplingRate: null,\n channelsCount: null,\n spatialAudio: false,\n closedCaptions: null,\n tilesLayout: undefined,\n external: false,\n fastSwitching: false,\n isAudioMuxedInVideo: false,\n };\n }\n\n /**\n * @param {shaka.extern.SegmentDBV1} old\n * @param {?number} initSegmentKey\n * @param {number} appendWindowStart\n * @param {number} appendWindowEnd\n * @param {number} timestampOffset\n * @return {shaka.extern.SegmentDB}\n * @private\n */\n static convertSegment_(\n old, initSegmentKey, appendWindowStart, appendWindowEnd,\n timestampOffset) {\n const V1StorageCell = shaka.offline.indexeddb.V1StorageCell;\n\n // Since we don't want to use the uri anymore, we need to parse the key\n // from it.\n const dataKey = V1StorageCell.getKeyFromSegmentUri_(old.uri);\n\n return {\n startTime: appendWindowStart + old.startTime,\n endTime: appendWindowStart + old.endTime,\n dataKey,\n initSegmentKey,\n appendWindowStart,\n appendWindowEnd,\n timestampOffset,\n tilesLayout: '',\n mimeType: null,\n codecs: null,\n thumbnailSprite: null,\n };\n }\n\n /**\n * @override\n * @param {shaka.extern.SegmentDataDBV1} old\n * @return {shaka.extern.SegmentDataDB}\n */\n convertSegmentData(old) {\n return {data: old.data};\n }\n\n /**\n * @param {string} uri\n * @return {number}\n * @private\n */\n static getKeyFromSegmentUri_(uri) {\n let parts = null;\n\n // Try parsing the uri as the original Shaka Player 2.0 uri.\n parts = /^offline:[0-9]+\\/[0-9]+\\/([0-9]+)$/.exec(uri);\n if (parts) {\n return Number(parts[1]);\n }\n\n // Just before Shaka Player 2.3 the uri format was changed to remove some\n // of the un-used information from the uri and make the segment uri and\n // manifest uri follow a similar format. However the old storage system\n // was still in place, so it is possible for Storage V1 Cells to have\n // Storage V2 uris.\n parts = /^offline:segment\\/([0-9]+)$/.exec(uri);\n if (parts) {\n return Number(parts[1]);\n }\n\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.STORAGE,\n shaka.util.Error.Code.MALFORMED_OFFLINE_URI,\n 'Could not parse uri ' + uri);\n }\n\n /**\n * Take a period and check if the streams need to have variants generated.\n * Before Shaka Player moved to its variants model, there were no variants.\n * This will fill missing variants into the given object.\n *\n * @param {shaka.extern.PeriodDBV1} period\n * @private\n */\n static fillMissingVariants_(period) {\n const AUDIO = shaka.util.ManifestParserUtils.ContentType.AUDIO;\n const VIDEO = shaka.util.ManifestParserUtils.ContentType.VIDEO;\n\n // There are three cases:\n // 1. All streams' variant ids are null\n // 2. All streams' variant ids are non-null\n // 3. Some streams' variant ids are null and other are non-null\n // Case 3 is invalid and should never happen in production.\n\n const audio = period.streams.filter((s) => s.contentType == AUDIO);\n const video = period.streams.filter((s) => s.contentType == VIDEO);\n\n // Case 2 - There is nothing we need to do, so let's just get out of here.\n if (audio.every((s) => s.variantIds) && video.every((s) => s.variantIds)) {\n return;\n }\n\n // Case 3... We don't want to be in case three.\n goog.asserts.assert(\n audio.every((s) => !s.variantIds),\n 'Some audio streams have variant ids and some do not.');\n goog.asserts.assert(\n video.every((s) => !s.variantIds),\n 'Some video streams have variant ids and some do not.');\n\n // Case 1 - Populate all the variant ids (putting us back to case 2).\n // Since all the variant ids are null, we need to first make them into\n // valid arrays.\n for (const s of audio) {\n s.variantIds = [];\n }\n for (const s of video) {\n s.variantIds = [];\n }\n\n let nextId = 0;\n\n // It is not possible in Shaka Player's pre-variant world to have audio-only\n // and video-only content mixed in with audio-video content. So we can\n // assume that there is only audio-only or video-only if one group is empty.\n\n // Everything is video-only content - so each video stream gets to be its\n // own variant.\n if (video.length && !audio.length) {\n shaka.log.debug('Found video-only content. Creating variants for video.');\n const variantId = nextId++;\n for (const s of video) {\n s.variantIds.push(variantId);\n }\n }\n\n // Everything is audio-only content - so each audio stream gets to be its\n // own variant.\n if (!video.length && audio.length) {\n shaka.log.debug('Found audio-only content. Creating variants for audio.');\n const variantId = nextId++;\n for (const s of audio) {\n s.variantIds.push(variantId);\n }\n }\n\n // Everything is audio-video content.\n if (video.length && audio.length) {\n shaka.log.debug('Found audio-video content. Creating variants.');\n for (const a of audio) {\n for (const v of video) {\n const variantId = nextId++;\n a.variantIds.push(variantId);\n v.variantIds.push(variantId);\n }\n }\n }\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.offline.indexeddb.V2StorageCell');\n\ngoog.require('shaka.offline.indexeddb.BaseStorageCell');\ngoog.require('shaka.util.PeriodCombiner');\n\n\n/**\n * The V2StorageCell is for all stores that follow the shaka.externs V2 and V3\n * offline types. V2 was introduced in Shaka Player v2.3.0 and quickly\n * replaced with V3 in Shaka Player v2.3.2. V3 was then deprecated in v3.0.\n *\n * Upgrading from V1 to V2 initially broke the database in a way that prevented\n * adding new records. The problem was with the upgrade process, not with the\n * database format. Once database upgrades were removed, we increased the\n * database version to V3 and marked V2 as read-only. Therefore, V2 and V3\n * databases can both be read by this cell.\n *\n * The manifest and segment stores didn't change in database V4, but a separate\n * table for session IDs was added. So this cell also covers DB V4.\n *\n * @implements {shaka.extern.StorageCell}\n */\nshaka.offline.indexeddb.V2StorageCell = class\n extends shaka.offline.indexeddb.BaseStorageCell {\n /**\n * @override\n * @param {shaka.extern.ManifestDBV2} old\n * @return {!Promise<shaka.extern.ManifestDB>}\n */\n async convertManifest(old) {\n const streamsPerPeriod = [];\n\n for (let i = 0; i < old.periods.length; ++i) {\n // The last period ends at the end of the presentation.\n const periodEnd = i == old.periods.length - 1 ?\n old.duration : old.periods[i + 1].startTime;\n const duration = periodEnd - old.periods[i].startTime;\n const streams = this.convertPeriod_(old.periods[i], duration);\n\n streamsPerPeriod.push(streams);\n }\n\n const streams = await shaka.util.PeriodCombiner.combineDbStreams(\n streamsPerPeriod);\n\n return {\n appMetadata: old.appMetadata,\n creationTime: 0,\n drmInfo: old.drmInfo,\n duration: old.duration,\n // JSON serialization turns Infinity into null, so turn it back now.\n expiration: old.expiration == null ? Infinity : old.expiration,\n originalManifestUri: old.originalManifestUri,\n sessionIds: old.sessionIds,\n size: old.size,\n streams,\n sequenceMode: false,\n };\n }\n\n /**\n * @param {shaka.extern.PeriodDBV2} period\n * @param {number} periodDuration\n * @return {!Array<shaka.extern.StreamDB>}\n * @private\n */\n convertPeriod_(period, periodDuration) {\n const streams = [];\n for (const stream of period.streams) {\n // The v4 version of the database as written by v2.5.0 - v2.5.9 might have\n // been corrupted slightly. A bug caused the stream metadata from all\n // periods to be written to each period. This was corrected in v2.5.10.\n // To fix this, we can identify the extra streams by their lack of\n // variantIds and skip them.\n if (stream.variantIds.length == 0) {\n continue;\n }\n\n streams.push(this.convertStream_(\n stream, period.startTime, period.startTime + periodDuration));\n }\n return streams;\n }\n\n /**\n * @param {shaka.extern.StreamDBV2} old\n * @param {number} periodStart\n * @param {number} periodEnd\n * @return {shaka.extern.StreamDB}\n * @private\n */\n convertStream_(old, periodStart, periodEnd) {\n return {\n id: old.id,\n originalId: old.originalId,\n groupId: null,\n primary: old.primary,\n type: old.contentType,\n mimeType: old.mimeType,\n codecs: old.codecs,\n frameRate: old.frameRate,\n pixelAspectRatio: old.pixelAspectRatio,\n hdr: undefined,\n colorGamut: undefined,\n videoLayout: undefined,\n kind: old.kind,\n language: old.language,\n originalLanguage: old.language || null,\n label: old.label,\n width: old.width,\n height: old.height,\n encrypted: old.encrypted,\n keyIds: new Set([old.keyId]),\n segments: old.segments.map((segment) =>\n this.convertSegment_(\n segment, old.initSegmentKey, periodStart, periodEnd,\n old.presentationTimeOffset)),\n variantIds: old.variantIds,\n roles: [],\n forced: false,\n audioSamplingRate: null,\n channelsCount: null,\n spatialAudio: false,\n closedCaptions: null,\n tilesLayout: undefined,\n external: false,\n fastSwitching: false,\n isAudioMuxedInVideo: false,\n };\n }\n\n /**\n * @param {shaka.extern.SegmentDBV2} old\n * @param {?number} initSegmentKey\n * @param {number} periodStart\n * @param {number} periodEnd\n * @param {number} presentationTimeOffset\n * @return {shaka.extern.SegmentDB}\n * @private\n */\n convertSegment_(\n old, initSegmentKey, periodStart, periodEnd, presentationTimeOffset) {\n const timestampOffset = periodStart - presentationTimeOffset;\n\n return {\n startTime: periodStart + old.startTime,\n endTime: periodStart + old.endTime,\n initSegmentKey,\n appendWindowStart: periodStart,\n appendWindowEnd: periodEnd,\n timestampOffset,\n dataKey: old.dataKey,\n tilesLayout: '',\n mimeType: null,\n codecs: null,\n thumbnailSprite: null,\n };\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.offline.indexeddb.V5StorageCell');\n\ngoog.require('shaka.offline.indexeddb.BaseStorageCell');\n\n\n/**\n * The V5StorageCell is for all stores that follow the shaka.externs V5 offline\n * types introduced in v3.0.\n *\n * @implements {shaka.extern.StorageCell}\n */\nshaka.offline.indexeddb.V5StorageCell = class\n extends shaka.offline.indexeddb.BaseStorageCell {\n /** @override */\n hasFixedKeySpace() {\n // This makes the cell read-write.\n return false;\n }\n\n /** @override */\n addSegments(segments) {\n return this.add(this.segmentStore_, segments);\n }\n\n /** @override */\n addManifests(manifests) {\n return this.add(this.manifestStore_, manifests);\n }\n\n /** @override */\n updateManifest(key, manifest) {\n return this.updateManifestImplementation(key, manifest);\n }\n\n /** @override */\n convertManifest(old) {\n // JSON serialization turns Infinity into null, so turn it back now.\n if (old.expiration == null) {\n old.expiration = Infinity;\n }\n return Promise.resolve(/** @type {shaka.extern.ManifestDB} */(old));\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.offline.OfflineUri');\n\n\n/**\n * The OfflineUri class contains all the components that make up the offline\n * uri. The components are:\n * TYPE: Used to know what type of data the uri points to. It can either\n * be \"manifest\" or \"segment\".\n * MECHANISM: The name of the mechanism that manages the storage cell that\n * holds the data.\n * CELL: The name of the cell that holds the data.\n * KEY: The key that the data is stored under in the cell.\n */\nshaka.offline.OfflineUri = class {\n /**\n * @param {string} type\n * @param {string} mechanism\n * @param {string} cell\n * @param {number} key\n */\n constructor(type, mechanism, cell, key) {\n /**\n * @private {string}\n * @const\n */\n this.type_ = type;\n /**\n * @private {string}\n * @const\n */\n this.mechanism_ = mechanism;\n /**\n * @private {string}\n * @const\n */\n this.cell_ = cell;\n /**\n * @private {number}\n * @const\n */\n this.key_ = key;\n\n /**\n * @private {string}\n * @const\n */\n this.asString_ = [\n 'offline:', type, '/', mechanism, '/', cell, '/', key,\n ].join('');\n }\n\n /** @return {boolean} */\n isManifest() { return this.type_ == 'manifest'; }\n\n /** @return {boolean} */\n isSegment() { return this.type_ == 'segment'; }\n\n /** @return {string} */\n mechanism() { return this.mechanism_; }\n\n /** @return {string} */\n cell() { return this.cell_; }\n\n /** @return {number} */\n key() { return this.key_; }\n\n /** @override */\n toString() { return this.asString_; }\n\n /**\n * @param {string} uri\n * @return {?shaka.offline.OfflineUri}\n */\n static parse(uri) {\n const parts = /^offline:([a-z]+)\\/([^/]+)\\/([^/]+)\\/([0-9]+)$/.exec(uri);\n if (parts == null) {\n return null;\n }\n\n const type = parts[1];\n if (type != 'manifest' && type != 'segment') {\n return null;\n }\n\n const mechanism = parts[2];\n if (!mechanism) {\n return null;\n }\n\n const cell = parts[3];\n if (!cell) {\n return null;\n }\n\n const key = Number(parts[4]);\n if (type == null) {\n return null;\n }\n\n return new shaka.offline.OfflineUri(type, mechanism, cell, key);\n }\n\n /**\n * @param {string} mechanism\n * @param {string} cell\n * @param {number} key\n * @return {!shaka.offline.OfflineUri}\n */\n static manifest(mechanism, cell, key) {\n return new shaka.offline.OfflineUri('manifest', mechanism, cell, key);\n }\n\n /**\n * @param {string} mechanism\n * @param {string} cell\n * @param {number} key\n * @return {!shaka.offline.OfflineUri}\n */\n static segment(mechanism, cell, key) {\n return new shaka.offline.OfflineUri('segment', mechanism, cell, key);\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.offline.ManifestConverter');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.media.InitSegmentReference');\ngoog.require('shaka.media.ManifestParser');\ngoog.require('shaka.media.PresentationTimeline');\ngoog.require('shaka.media.SegmentIndex');\ngoog.require('shaka.media.SegmentReference');\ngoog.require('shaka.offline.OfflineUri');\ngoog.require('shaka.util.ManifestParserUtils');\ngoog.require('shaka.util.MimeUtils');\n\n\n/**\n * Utility class for converting database manifest objects back to normal\n * player-ready objects. Used by the offline system to convert on-disk\n * objects back to the in-memory objects.\n */\nshaka.offline.ManifestConverter = class {\n /**\n * Create a new manifest converter. Need to know the mechanism and cell that\n * the manifest is from so that all segments paths can be created.\n *\n * @param {string} mechanism\n * @param {string} cell\n */\n constructor(mechanism, cell) {\n /** @private {string} */\n this.mechanism_ = mechanism;\n\n /** @private {string} */\n this.cell_ = cell;\n }\n\n /**\n * Convert a |shaka.extern.ManifestDB| object to a |shaka.extern.Manifest|\n * object.\n *\n * @param {shaka.extern.ManifestDB} manifestDB\n * @return {shaka.extern.Manifest}\n */\n fromManifestDB(manifestDB) {\n const timeline = new shaka.media.PresentationTimeline(null, 0);\n timeline.setDuration(manifestDB.duration);\n\n /** @type {!Array<shaka.extern.StreamDB>} */\n const audioStreams =\n manifestDB.streams.filter((streamDB) => this.isAudio_(streamDB));\n\n /** @type {!Array<shaka.extern.StreamDB>} */\n const videoStreams =\n manifestDB.streams.filter((streamDB) => this.isVideo_(streamDB));\n\n /** @type {!Map<number, shaka.extern.Variant>} */\n const variants = this.createVariants(audioStreams, videoStreams, timeline);\n\n /** @type {!Array<shaka.extern.Stream>} */\n const textStreams =\n manifestDB.streams.filter((streamDB) => this.isText_(streamDB))\n .map((streamDB) => this.fromStreamDB_(streamDB, timeline));\n\n /** @type {!Array<shaka.extern.Stream>} */\n const imageStreams =\n manifestDB.streams.filter((streamDB) => this.isImage_(streamDB))\n .map((streamDB) => this.fromStreamDB_(streamDB, timeline));\n\n const drmInfos = manifestDB.drmInfo ? [manifestDB.drmInfo] : [];\n if (manifestDB.drmInfo) {\n for (const variant of variants.values()) {\n if (variant.audio && variant.audio.encrypted) {\n variant.audio.drmInfos = drmInfos;\n }\n if (variant.video && variant.video.encrypted) {\n variant.video.drmInfos = drmInfos;\n }\n }\n }\n\n return {\n presentationTimeline: timeline,\n offlineSessionIds: manifestDB.sessionIds,\n variants: Array.from(variants.values()),\n textStreams: textStreams,\n imageStreams: imageStreams,\n sequenceMode: manifestDB.sequenceMode || false,\n ignoreManifestTimestampsInSegmentsMode: false,\n type: manifestDB.type || shaka.media.ManifestParser.UNKNOWN,\n serviceDescription: null,\n nextUrl: null,\n periodCount: 1,\n gapCount: 0,\n isLowLatency: false,\n startTime: null,\n };\n }\n\n /**\n * Recreates Variants from audio and video StreamDB collections.\n *\n * @param {!Array<!shaka.extern.StreamDB>} audios\n * @param {!Array<!shaka.extern.StreamDB>} videos\n * @param {shaka.media.PresentationTimeline} timeline\n * @return {!Map<number, !shaka.extern.Variant>}\n */\n createVariants(audios, videos, timeline) {\n // Get all the variant ids from all audio and video streams.\n /** @type {!Set<number>} */\n const variantIds = new Set();\n for (const streamDB of audios) {\n for (const id of streamDB.variantIds) {\n variantIds.add(id);\n }\n }\n for (const streamDB of videos) {\n for (const id of streamDB.variantIds) {\n variantIds.add(id);\n }\n }\n\n /** @type {!Map<number, shaka.extern.Variant>} */\n const variantMap = new Map();\n for (const id of variantIds) {\n variantMap.set(id, this.createEmptyVariant_(id));\n }\n\n // Assign each audio stream to its variants.\n for (const audio of audios) {\n /** @type {shaka.extern.Stream} */\n const stream = this.fromStreamDB_(audio, timeline);\n\n for (const variantId of audio.variantIds) {\n const variant = variantMap.get(variantId);\n\n goog.asserts.assert(\n !variant.audio, 'A variant should only have one audio stream');\n\n variant.language = stream.language;\n variant.primary = variant.primary || stream.primary;\n variant.audio = stream;\n }\n }\n\n // Assign each video stream to its variants.\n for (const video of videos) {\n /** @type {shaka.extern.Stream} */\n const stream = this.fromStreamDB_(video, timeline);\n\n for (const variantId of video.variantIds) {\n const variant = variantMap.get(variantId);\n\n goog.asserts.assert(\n !variant.video, 'A variant should only have one video stream');\n\n variant.primary = variant.primary || stream.primary;\n variant.video = stream;\n }\n }\n\n return variantMap;\n }\n\n /**\n * @param {shaka.extern.StreamDB} streamDB\n * @param {shaka.media.PresentationTimeline} timeline\n * @return {shaka.extern.Stream}\n * @private\n */\n fromStreamDB_(streamDB, timeline) {\n /** @type {!Array<!shaka.media.SegmentReference>} */\n const segments = streamDB.segments.map(\n (segment, index) => this.fromSegmentDB_(index, segment, streamDB));\n\n timeline.notifySegments(segments);\n\n /** @type {!shaka.media.SegmentIndex} */\n const segmentIndex = new shaka.media.SegmentIndex(segments);\n\n /** @type {shaka.extern.Stream} */\n const stream = {\n id: streamDB.id,\n originalId: streamDB.originalId,\n groupId: streamDB.groupId,\n createSegmentIndex: () => Promise.resolve(),\n segmentIndex,\n mimeType: streamDB.mimeType,\n codecs: streamDB.codecs,\n width: streamDB.width || undefined,\n height: streamDB.height || undefined,\n frameRate: streamDB.frameRate,\n pixelAspectRatio: streamDB.pixelAspectRatio,\n hdr: streamDB.hdr,\n colorGamut: streamDB.colorGamut,\n videoLayout: streamDB.videoLayout,\n kind: streamDB.kind,\n encrypted: streamDB.encrypted,\n drmInfos: [],\n keyIds: streamDB.keyIds,\n language: streamDB.language,\n originalLanguage: streamDB.originalLanguage || null,\n label: streamDB.label,\n type: streamDB.type,\n primary: streamDB.primary,\n trickModeVideo: null,\n dependencyStream: null,\n emsgSchemeIdUris: null,\n roles: streamDB.roles,\n forced: streamDB.forced,\n channelsCount: streamDB.channelsCount,\n audioSamplingRate: streamDB.audioSamplingRate,\n spatialAudio: streamDB.spatialAudio,\n closedCaptions: streamDB.closedCaptions,\n tilesLayout: streamDB.tilesLayout,\n mssPrivateData: streamDB.mssPrivateData,\n accessibilityPurpose: null,\n external: streamDB.external,\n fastSwitching: streamDB.fastSwitching,\n fullMimeTypes: new Set([shaka.util.MimeUtils.getFullType(\n streamDB.mimeType, streamDB.codecs)]),\n isAudioMuxedInVideo: false,\n baseOriginalId: null,\n };\n\n return stream;\n }\n\n /**\n * @param {number} index\n * @param {shaka.extern.SegmentDB} segmentDB\n * @param {shaka.extern.StreamDB} streamDB\n * @return {!shaka.media.SegmentReference}\n * @private\n */\n fromSegmentDB_(index, segmentDB, streamDB) {\n /** @type {!shaka.offline.OfflineUri} */\n const uri = shaka.offline.OfflineUri.segment(\n this.mechanism_, this.cell_, segmentDB.dataKey);\n\n const initSegmentReference = segmentDB.initSegmentKey != null ?\n this.fromInitSegmentDB_(segmentDB.initSegmentKey) : null;\n\n const ref = new shaka.media.SegmentReference(\n segmentDB.startTime,\n segmentDB.endTime,\n () => [uri.toString()],\n /* startByte= */ 0,\n /* endByte= */ null,\n initSegmentReference,\n segmentDB.timestampOffset,\n segmentDB.appendWindowStart,\n segmentDB.appendWindowEnd,\n /* partialReferences= */ [],\n segmentDB.tilesLayout || '');\n ref.mimeType = segmentDB.mimeType || streamDB.mimeType || '';\n ref.codecs = segmentDB.codecs || streamDB.codecs || '';\n if (segmentDB.thumbnailSprite) {\n ref.setThumbnailSprite(segmentDB.thumbnailSprite);\n }\n return ref;\n }\n\n /**\n * @param {number} key\n * @return {!shaka.media.InitSegmentReference}\n * @private\n */\n fromInitSegmentDB_(key) {\n /** @type {!shaka.offline.OfflineUri} */\n const uri = shaka.offline.OfflineUri.segment(\n this.mechanism_, this.cell_, key);\n\n return new shaka.media.InitSegmentReference(\n () => [uri.toString()],\n /* startBytes= */ 0,\n /* endBytes= */ null );\n }\n\n /**\n * @param {shaka.extern.StreamDB} streamDB\n * @return {boolean}\n * @private\n */\n isAudio_(streamDB) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n return streamDB.type == ContentType.AUDIO;\n }\n\n /**\n * @param {shaka.extern.StreamDB} streamDB\n * @return {boolean}\n * @private\n */\n isVideo_(streamDB) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n return streamDB.type == ContentType.VIDEO;\n }\n\n /**\n * @param {shaka.extern.StreamDB} streamDB\n * @return {boolean}\n * @private\n */\n isText_(streamDB) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n return streamDB.type == ContentType.TEXT;\n }\n\n /**\n * @param {shaka.extern.StreamDB} streamDB\n * @return {boolean}\n * @private\n */\n isImage_(streamDB) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n return streamDB.type == ContentType.IMAGE;\n }\n\n /**\n * Creates an empty Variant.\n *\n * @param {number} id\n * @return {!shaka.extern.Variant}\n * @private\n */\n createEmptyVariant_(id) {\n return {\n id: id,\n language: '',\n disabledUntilTime: 0,\n primary: false,\n audio: null,\n video: null,\n bandwidth: 0,\n allowedByApplication: true,\n allowedByKeySystem: true,\n decodingInfos: [],\n };\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.offline.OfflineManifestParser');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.log');\ngoog.require('shaka.media.ManifestParser');\ngoog.require('shaka.offline.ManifestConverter');\ngoog.require('shaka.offline.OfflineUri');\ngoog.require('shaka.offline.StorageMuxer');\ngoog.require('shaka.util.Error');\n\n\n/**\n * @summary Creates a new offline manifest parser.\n * @implements {shaka.extern.ManifestParser}\n */\nshaka.offline.OfflineManifestParser = class {\n /** */\n constructor() {\n /** @private {shaka.offline.OfflineUri} */\n this.uri_ = null;\n }\n\n /** @override */\n configure(config) {\n // No-op\n }\n\n /** @override */\n async start(uriString, playerInterface) {\n /** @type {shaka.offline.OfflineUri} */\n const uri = shaka.offline.OfflineUri.parse(uriString);\n this.uri_ = uri;\n\n if (uri == null || !uri.isManifest()) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.NETWORK,\n shaka.util.Error.Code.MALFORMED_OFFLINE_URI,\n uriString);\n }\n\n /** @type {!shaka.offline.StorageMuxer} */\n const muxer = new shaka.offline.StorageMuxer();\n\n try {\n await muxer.init();\n\n const cell = await muxer.getCell(uri.mechanism(), uri.cell());\n\n const manifests = await cell.getManifests([uri.key()]);\n const manifest = manifests[0];\n\n const converter = new shaka.offline.ManifestConverter(\n uri.mechanism(), uri.cell());\n\n const finalManifest = converter.fromManifestDB(manifest);\n playerInterface.makeTextStreamsForClosedCaptions(finalManifest);\n return finalManifest;\n } finally {\n await muxer.destroy();\n }\n }\n\n /** @override */\n stop() {\n return Promise.resolve();\n }\n\n /** @override */\n update() {\n // No-op\n }\n\n /** @override */\n async onExpirationUpdated(sessionId, expiration) {\n goog.asserts.assert(\n this.uri_,\n 'Should not get update event before start has been called');\n\n /** @type {!shaka.offline.OfflineUri} */\n const uri = this.uri_;\n\n /** @type {!shaka.offline.StorageMuxer} */\n const muxer = new shaka.offline.StorageMuxer();\n\n try {\n await muxer.init();\n\n const cell = await muxer.getCell(uri.mechanism(), uri.cell());\n\n const manifests = await cell.getManifests([uri.key()]);\n const manifest = manifests[0];\n\n const foundSession = manifest.sessionIds.includes(sessionId);\n const newExpiration = manifest.expiration == undefined ||\n manifest.expiration > expiration;\n\n if (foundSession && newExpiration) {\n shaka.log.debug('Updating expiration for stored content');\n await cell.updateManifestExpiration(uri.key(), expiration);\n }\n } catch (e) {\n // Ignore errors with update.\n shaka.log.error('There was an error updating', uri, e);\n } finally {\n await muxer.destroy();\n }\n }\n\n /** @override */\n onInitialVariantChosen(variant) {\n // No-op\n }\n\n /** @override */\n banLocation(uri) {\n // No-op\n }\n\n /** @override */\n setMediaElement(mediaElement) {\n // No-op\n }\n};\n\n\nshaka.media.ManifestParser.registerParserByMime(\n 'application/x-offline-manifest',\n () => new shaka.offline.OfflineManifestParser());\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.offline.OfflineScheme');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.net.NetworkingEngine');\ngoog.require('shaka.offline.OfflineUri');\ngoog.require('shaka.offline.StorageMuxer');\ngoog.require('shaka.util.AbortableOperation');\ngoog.require('shaka.util.Error');\n\n\n/**\n * @summary A plugin that handles requests for offline content.\n * @export\n */\nshaka.offline.OfflineScheme = class {\n /**\n * @param {string} uri\n * @param {shaka.extern.Request} request\n * @param {shaka.net.NetworkingEngine.RequestType} requestType\n * @param {shaka.extern.ProgressUpdated} progressUpdated Called when a\n * progress event happened.\n * @return {!shaka.extern.IAbortableOperation.<shaka.extern.Response>}\n * @export\n */\n static plugin(uri, request, requestType, progressUpdated) {\n const offlineUri = shaka.offline.OfflineUri.parse(uri);\n\n if (offlineUri && offlineUri.isManifest()) {\n return shaka.offline.OfflineScheme.getManifest_(uri, request);\n }\n\n if (offlineUri && offlineUri.isSegment()) {\n return shaka.offline.OfflineScheme.getSegment_(\n offlineUri.key(), offlineUri, request);\n }\n\n return shaka.util.AbortableOperation.failed(\n new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.NETWORK,\n shaka.util.Error.Code.MALFORMED_OFFLINE_URI,\n uri));\n }\n\n /**\n * @param {string} uri\n * @param {shaka.extern.Request} request\n * @return {!shaka.extern.IAbortableOperation.<shaka.extern.Response>}\n * @private\n */\n static getManifest_(uri, request) {\n /** @type {shaka.extern.Response} */\n const response = {\n uri: uri,\n originalUri: uri,\n data: new ArrayBuffer(0),\n headers: {'content-type': 'application/x-offline-manifest'},\n originalRequest: request,\n };\n\n return shaka.util.AbortableOperation.completed(response);\n }\n\n /**\n * @param {number} id\n * @param {!shaka.offline.OfflineUri} uri\n * @param {shaka.extern.Request} request\n * @return {!shaka.extern.IAbortableOperation.<shaka.extern.Response>}\n * @private\n */\n static getSegment_(id, uri, request) {\n goog.asserts.assert(\n uri.isSegment(),\n 'Only segment uri\\'s should be given to getSegment');\n\n /** @type {!shaka.offline.StorageMuxer} */\n const muxer = new shaka.offline.StorageMuxer();\n\n return shaka.util.AbortableOperation.completed(undefined)\n .chain(() => muxer.init())\n .chain(() => muxer.getCell(uri.mechanism(), uri.cell()))\n .chain((cell) => cell.getSegments([uri.key()]))\n .chain((segments) => {\n const segment = segments[0];\n\n return {\n uri: uri,\n data: segment.data,\n headers: {},\n originalRequest: request,\n };\n })\n .finally(() => muxer.destroy());\n }\n};\n\nshaka.net.NetworkingEngine.registerScheme(\n 'offline', shaka.offline.OfflineScheme.plugin);\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.offline.SessionDeleter');\n\n\ngoog.require('shaka.drm.DrmEngine');\ngoog.require('shaka.log');\ngoog.require('shaka.util.ArrayUtils');\ngoog.requireType('shaka.net.NetworkingEngine');\n\n\n/**\n * Contains a utility method to delete persistent EME sessions.\n */\nshaka.offline.SessionDeleter = class {\n /**\n * Deletes the given sessions. This never fails and instead logs the error.\n *\n * @param {shaka.extern.DrmConfiguration} config\n * @param {!shaka.net.NetworkingEngine} netEngine\n * @param {!Array<shaka.extern.EmeSessionDB>} sessions\n * @return {!Promise<!Array<string>>} The session IDs that were deleted.\n */\n async delete(config, netEngine, sessions) {\n const SessionDeleter = shaka.offline.SessionDeleter;\n\n let deleted = [];\n for (const bucket of SessionDeleter.createBuckets_(sessions)) {\n // Run these sequentially to avoid creating multiple CDM instances at one\n // time. Some embedded platforms may not support multiples.\n const p = this.doDelete_(config, netEngine, bucket);\n const cur = await p; // eslint-disable-line no-await-in-loop\n deleted = deleted.concat(cur);\n }\n return deleted;\n }\n\n\n /**\n * Performs the deletion of the given session IDs.\n *\n * @param {shaka.extern.DrmConfiguration} config\n * @param {!shaka.net.NetworkingEngine} netEngine\n * @param {shaka.offline.SessionDeleter.Bucket_} bucket\n * @return {!Promise<!Array<string>>} The sessions that were deleted\n * @private\n */\n async doDelete_(config, netEngine, bucket) {\n /** @type {!shaka.drm.DrmEngine} */\n const drmEngine = new shaka.drm.DrmEngine({\n netEngine: netEngine,\n onError: () => {},\n onKeyStatus: () => {},\n onExpirationUpdated: () => {},\n onEvent: () => {},\n });\n\n try {\n drmEngine.configure(config);\n await drmEngine.initForRemoval(\n bucket.info.keySystem, bucket.info.licenseUri,\n bucket.info.serverCertificate,\n bucket.info.audioCapabilities, bucket.info.videoCapabilities);\n } catch (e) {\n shaka.log.warning('Error initializing EME', e);\n await drmEngine.destroy();\n return [];\n }\n\n /** @type {!Array<string>} */\n const sessionIds = [];\n await Promise.all(bucket.sessionIds.map(async (sessionId) => {\n // This method is in a .map(), so this starts multiple removes at once,\n // so this removes the sessions in parallel.\n try {\n await drmEngine.removeSession(sessionId);\n sessionIds.push(sessionId);\n } catch (e) {\n shaka.log.warning('Error deleting offline session', e);\n }\n }));\n await drmEngine.destroy();\n return sessionIds;\n }\n\n\n /**\n * Collects the given sessions into buckets that can be done at the same time.\n * Since querying with different parameters can give us back different CDMs,\n * we can't just use one CDM instance to delete everything.\n *\n * @param {!Array<shaka.extern.EmeSessionDB>} sessions\n * @return {!Array<shaka.offline.SessionDeleter.Bucket_>}\n * @private\n */\n static createBuckets_(sessions) {\n const SessionDeleter = shaka.offline.SessionDeleter;\n\n /** @type {!Array<shaka.offline.SessionDeleter.Bucket_>} */\n const ret = [];\n for (const session of sessions) {\n let found = false;\n for (const bucket of ret) {\n if (SessionDeleter.isCompatible_(bucket.info, session)) {\n bucket.sessionIds.push(session.sessionId);\n found = true;\n break;\n }\n }\n if (!found) {\n ret.push({info: session, sessionIds: [session.sessionId]});\n }\n }\n\n return ret;\n }\n\n\n /**\n * Returns whether the given session infos are compatible with each other.\n * @param {shaka.extern.EmeSessionDB} a\n * @param {shaka.extern.EmeSessionDB} b\n * @return {boolean}\n * @private\n */\n static isCompatible_(a, b) {\n const ArrayUtils = shaka.util.ArrayUtils;\n\n // TODO: Add a way to change the license server in DrmEngine to avoid\n // resetting EME for different license servers.\n const comp = (x, y) =>\n x.robustness == y.robustness && x.contentType == y.contentType;\n return a.keySystem == b.keySystem && a.licenseUri == b.licenseUri &&\n ArrayUtils.hasSameElements(\n a.audioCapabilities, b.audioCapabilities, comp) &&\n ArrayUtils.hasSameElements(\n a.videoCapabilities, b.videoCapabilities, comp);\n }\n};\n\n\n/**\n * @typedef {{\n * info: shaka.extern.EmeSessionDB,\n * sessionIds: !Array<string>\n * }}\n */\nshaka.offline.SessionDeleter.Bucket_;\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.offline.StoredContentUtils');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.offline.ManifestConverter');\ngoog.require('shaka.offline.OfflineUri');\ngoog.require('shaka.util.StreamUtils');\n\n\n/**\n * A utility class used to create |shaka.extern.StoredContent| from different\n * types of input.\n */\nshaka.offline.StoredContentUtils = class {\n /**\n * @param {string} originalUri\n * @param {shaka.extern.Manifest} manifest\n * @param {number} size\n * @param {!Object} metadata\n * @return {shaka.extern.StoredContent}\n */\n static fromManifest(originalUri, manifest, size, metadata) {\n goog.asserts.assert(\n manifest.variants.length,\n 'Cannot create stored content from manifest with no variants.');\n\n /** @type {number} */\n const duration = manifest.presentationTimeline.getDuration();\n\n /** @type {!Array<shaka.extern.Track>} */\n const tracks = shaka.offline.StoredContentUtils.getTracks_(manifest);\n\n /** @type {shaka.extern.StoredContent} */\n const content = {\n offlineUri: null,\n originalManifestUri: originalUri,\n duration: duration,\n size: size,\n // This expiration value is temporary and will be used in progress reports\n // during the storage process. The real value would have to come from\n // DrmEngine.\n expiration: Infinity,\n tracks: tracks,\n appMetadata: metadata,\n isIncomplete: false,\n };\n\n return content;\n }\n\n /**\n * @param {!shaka.offline.OfflineUri} offlineUri\n * @param {shaka.extern.ManifestDB} manifestDB\n * @return {shaka.extern.StoredContent}\n */\n static fromManifestDB(offlineUri, manifestDB) {\n goog.asserts.assert(\n manifestDB.streams.length,\n 'Cannot create stored content from manifestDB with no streams.');\n\n const converter = new shaka.offline.ManifestConverter(\n offlineUri.mechanism(), offlineUri.cell());\n\n /** @type {shaka.extern.Manifest} */\n const manifest = converter.fromManifestDB(manifestDB);\n\n /** @type {!Object} */\n const metadata = manifestDB.appMetadata || {};\n\n /** @type {!Array<shaka.extern.Track>} */\n const tracks = shaka.offline.StoredContentUtils.getTracks_(manifest);\n\n goog.asserts.assert(\n manifestDB.expiration != null,\n 'Manifest expiration must be set by now!');\n\n /** @type {shaka.extern.StoredContent} */\n const content = {\n offlineUri: offlineUri.toString(),\n originalManifestUri: manifestDB.originalManifestUri,\n duration: manifestDB.duration,\n size: manifestDB.size,\n expiration: manifestDB.expiration,\n tracks: tracks,\n appMetadata: metadata,\n isIncomplete: (manifestDB.isIncomplete || false),\n };\n\n return content;\n }\n\n /**\n * Gets track representations of all playable variants and all text streams.\n *\n * @param {shaka.extern.Manifest} manifest\n * @return {!Array<shaka.extern.Track>}\n * @private\n */\n static getTracks_(manifest) {\n const StreamUtils = shaka.util.StreamUtils;\n\n const tracks = [];\n\n const variants = StreamUtils.getPlayableVariants(manifest.variants);\n for (const variant of variants) {\n tracks.push(StreamUtils.variantToTrack(variant));\n }\n\n const textStreams = manifest.textStreams;\n for (const stream of textStreams) {\n tracks.push(StreamUtils.textStreamToTrack(stream));\n }\n\n return tracks;\n }\n};\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.offline.StreamBandwidthEstimator');\n\ngoog.require('shaka.log');\ngoog.requireType('shaka.media.SegmentReference');\n\n\n/**\n * A utility class to help estimate the size of streams based on stream and\n * variant bandwidths. This class's main purpose is to isolate the logic in\n * creating non-zero bandwidth estimates for all streams so that each stream\n * will have some influence over the progress of the download.\n */\nshaka.offline.StreamBandwidthEstimator = class {\n /** */\n constructor() {\n /** @private {!Map<number, number>} */\n this.estimateByStreamId_ = new Map();\n }\n\n /**\n * Add a new variant to the estimator. This will update the estimates for all\n * streams in the variant.\n *\n * @param {shaka.extern.Variant} variant\n */\n addVariant(variant) {\n // Three cases:\n // 1 - Only Audio\n // 2 - Only Video\n // 3 - Audio and Video\n\n const audio = variant.audio;\n const video = variant.video;\n\n // Case 1\n if (audio && !video) {\n const audioBitRate = audio.bandwidth || variant.bandwidth;\n this.setBitrate_(audio.id, audioBitRate);\n }\n\n // Case 2\n if (!audio && video) {\n const videoBitRate = video.bandwidth || variant.bandwidth;\n this.setBitrate_(video.id, videoBitRate);\n }\n\n // Case 3\n if (audio && video) {\n // Get the audio's bandwidth. If it is missing, default to our default\n // audio bandwidth.\n const audioBitRate =\n audio.bandwidth ||\n shaka.offline.StreamBandwidthEstimator.DEFAULT_AUDIO_BITRATE_;\n\n // Get the video's bandwidth. If it is missing, use the variant bandwidth\n // less the audio. If we get a negative bit rate, fall back to our\n // default video bandwidth.\n let videoBitRate = video.bandwidth || (variant.bandwidth - audioBitRate);\n if (videoBitRate <= 0) {\n shaka.log.warning(\n 'Audio bit rate consumes variants bandwidth. Setting video ' +\n 'bandwidth to match variant\\'s bandwidth.');\n videoBitRate = variant.bandwidth;\n }\n\n this.setBitrate_(audio.id, audioBitRate);\n this.setBitrate_(video.id, videoBitRate);\n }\n }\n\n /**\n * @param {number} stream\n * @param {number} bitRate\n * @private\n */\n setBitrate_(stream, bitRate) {\n this.estimateByStreamId_.set(stream, bitRate);\n }\n\n /**\n * Create an estimate for the text stream.\n *\n * @param {shaka.extern.Stream} text\n */\n addText(text) {\n this.estimateByStreamId_.set(text.id,\n shaka.offline.StreamBandwidthEstimator.DEFAULT_TEXT_BITRATE_);\n }\n\n /**\n * Create an estimate for the image stream.\n *\n * @param {shaka.extern.Stream} image\n */\n addImage(image) {\n this.estimateByStreamId_.set(image.id, image.bandwidth ||\n shaka.offline.StreamBandwidthEstimator.DEFAULT_IMAGE_BITRATE_);\n }\n\n /**\n * Get the estimate for a segment that is part of a stream that has already\n * added to the estimator.\n *\n * @param {number} id\n * @param {!shaka.media.SegmentReference} segment\n * @return {number}\n */\n getSegmentEstimate(id, segment) {\n const duration = segment.endTime - segment.startTime;\n return this.getEstimate_(id) * duration;\n }\n\n /**\n * Get the estimate for an init segment for a stream that has already\n * added to the estimator.\n *\n * @param {number} id\n * @return {number}\n */\n getInitSegmentEstimate(id) {\n // Assume that the init segment is worth approximately half a second of\n // content.\n const duration = 0.5;\n return this.getEstimate_(id) * duration;\n }\n\n /**\n * @param {number} id\n * @return {number}\n * @private\n */\n getEstimate_(id) {\n let bitRate = this.estimateByStreamId_.get(id);\n\n if (bitRate == null) {\n bitRate = 0;\n shaka.log.error(\n 'Asking for bitrate of stream not given to the estimator');\n }\n\n if (bitRate == 0) {\n shaka.log.warning(\n 'Using bitrate of 0, this stream won\\'t affect progress');\n }\n\n return bitRate;\n }\n};\n\n\n/**\n * Since audio bandwidth does not vary much, we are going to use a constant\n * approximation for audio bit rate allowing use to more accurately guess at\n * the video bitrate.\n *\n * YouTube's suggested bitrate for stereo audio is 384 kbps so we are going to\n * assume that: https://support.google.com/youtube/answer/1722171?hl=en\n *\n * @const {number}\n * @private\n */\nshaka.offline.StreamBandwidthEstimator.DEFAULT_AUDIO_BITRATE_ = 393216;\n\n\n/**\n * Since we don't normally get the bitrate for text, we still want to create\n * some approximation so that it can influence progress. This will use the\n * bitrate from \"Tears of Steal\" to give some kind of data-driven result.\n *\n * The file size for English subtitles is 4.7 KB. The video is 12:14 long,\n * which means that the text's bit rate is around 52 bps.\n *\n * @const {number}\n * @private\n */\nshaka.offline.StreamBandwidthEstimator.DEFAULT_TEXT_BITRATE_ = 52;\n\n\n/**\n * Since we don't normally get the bitrate for image, we still want to create\n * some approximation so that it can influence progress.\n *\n * The size of the thumbnail usually is 2KB.\n *\n * @const {number}\n * @private\n */\nshaka.offline.StreamBandwidthEstimator.DEFAULT_IMAGE_BITRATE_ = 2048;\n\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.offline.Storage');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.Player');\ngoog.require('shaka.drm.DrmEngine');\ngoog.require('shaka.log');\ngoog.require('shaka.media.ManifestParser');\ngoog.require('shaka.media.SegmentIndex');\ngoog.require('shaka.media.SegmentReference');\ngoog.require('shaka.media.SegmentUtils');\ngoog.require('shaka.net.NetworkingEngine');\ngoog.require('shaka.net.NetworkingUtils');\ngoog.require('shaka.offline.DownloadInfo');\ngoog.require('shaka.offline.DownloadManager');\ngoog.require('shaka.offline.OfflineUri');\ngoog.require('shaka.offline.SessionDeleter');\ngoog.require('shaka.offline.StorageMuxer');\ngoog.require('shaka.offline.StoredContentUtils');\ngoog.require('shaka.offline.StreamBandwidthEstimator');\ngoog.require('shaka.text.TextEngine');\ngoog.require('shaka.util.AbortableOperation');\ngoog.require('shaka.util.ArrayUtils');\ngoog.require('shaka.util.BufferUtils');\ngoog.require('shaka.util.ConfigUtils');\ngoog.require('shaka.util.Destroyer');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.IDestroyable');\ngoog.require('shaka.util.Iterables');\ngoog.require('shaka.util.ManifestParserUtils');\ngoog.require('shaka.util.MimeUtils');\ngoog.require('shaka.util.Platform');\ngoog.require('shaka.util.PlayerConfiguration');\ngoog.require('shaka.util.StreamUtils');\ngoog.requireType('shaka.media.SegmentReference');\ngoog.requireType('shaka.offline.StorageCellHandle');\n\n\n/**\n * @summary\n * This manages persistent offline data including storage, listing, and deleting\n * stored manifests. Playback of offline manifests are done through the Player\n * using a special URI (see shaka.offline.OfflineUri).\n *\n * First, check support() to see if offline is supported by the platform.\n * Second, configure() the storage object with callbacks to your application.\n * Third, call store(), remove(), or list() as needed.\n * When done, call destroy().\n *\n * @implements {shaka.util.IDestroyable}\n * @export\n */\nshaka.offline.Storage = class {\n /**\n * @param {!shaka.Player=} player\n * A player instance to share a networking engine and configuration with.\n * When initializing with a player, storage is only valid as long as\n * |destroy| has not been called on the player instance. When omitted,\n * storage will manage its own networking engine and configuration.\n */\n constructor(player) {\n // It is an easy mistake to make to pass a Player proxy from CastProxy.\n // Rather than throw a vague exception later, throw an explicit and clear\n // one now.\n //\n // TODO(vaage): After we decide whether or not we want to support\n // initializing storage with a player proxy, we should either remove\n // this error or rename the error.\n if (player && player.constructor != shaka.Player) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.STORAGE,\n shaka.util.Error.Code.LOCAL_PLAYER_INSTANCE_REQUIRED);\n }\n\n /** @private {?shaka.extern.PlayerConfiguration} */\n this.config_ = null;\n\n /** @private {shaka.net.NetworkingEngine} */\n this.networkingEngine_ = null;\n\n // Initialize |config_| and |networkingEngine_| based on whether or not\n // we were given a player instance.\n if (player) {\n this.config_ = player.getSharedConfiguration();\n this.networkingEngine_ = player.getNetworkingEngine();\n\n goog.asserts.assert(\n this.networkingEngine_,\n 'Storage should not be initialized with a player that had ' +\n '|destroy| called on it.');\n } else {\n this.config_ = shaka.util.PlayerConfiguration.createDefault();\n this.networkingEngine_ = new shaka.net.NetworkingEngine();\n }\n\n /**\n * A list of open operations that are being performed by this instance of\n * |shaka.offline.Storage|.\n *\n * @private {!Array<!Promise>}\n */\n this.openOperations_ = [];\n\n /**\n * A list of open download managers that are being used to download things.\n *\n * @private {!Array<!shaka.offline.DownloadManager>}\n */\n this.openDownloadManagers_ = [];\n\n /**\n * Storage should only destroy the networking engine if it was initialized\n * without a player instance. Store this as a flag here to avoid including\n * the player object in the destroyer's closure.\n *\n * @type {boolean}\n */\n const destroyNetworkingEngine = !player;\n\n /** @private {!shaka.util.Destroyer} */\n this.destroyer_ = new shaka.util.Destroyer(async () => {\n // Cancel all in-progress store operations.\n await Promise.all(this.openDownloadManagers_.map((dl) => dl.abortAll()));\n\n // Wait for all remaining open operations to end. Wrap each operations so\n // that a single rejected promise won't cause |Promise.all| to return\n // early or to return a rejected Promise.\n const noop = () => {};\n const awaits = [];\n for (const op of this.openOperations_) {\n awaits.push(op.then(noop, noop));\n }\n await Promise.all(awaits);\n\n // Wait until after all the operations have finished before we destroy\n // the networking engine to avoid any unexpected errors.\n if (destroyNetworkingEngine) {\n await this.networkingEngine_.destroy();\n }\n\n // Drop all references to internal objects to help with GC.\n this.config_ = null;\n this.networkingEngine_ = null;\n });\n\n /**\n * Contains an ID for use with creating streams. The manifest parser should\n * start with small IDs, so this starts with a large one.\n * @private {number}\n */\n this.nextExternalStreamId_ = 1e9;\n }\n\n\n /**\n * Gets whether offline storage is supported. Returns true if offline storage\n * is supported for clear content. Support for offline storage of encrypted\n * content will not be determined until storage is attempted.\n *\n * @return {boolean}\n * @export\n */\n static support() {\n // Our Storage system is useless without MediaSource. MediaSource allows us\n // to pull data from anywhere (including our Storage system) and feed it to\n // the video element.\n if (!shaka.util.Platform.supportsMediaSource()) {\n return false;\n }\n\n return shaka.offline.StorageMuxer.support();\n }\n\n /**\n * @override\n * @export\n */\n destroy() {\n return this.destroyer_.destroy();\n }\n\n /**\n * Sets configuration values for Storage. This is associated with\n * Player.configure and will change the player instance given at\n * initialization.\n *\n * @param {string|!Object} config This should either be a field name or an\n * object following the form of {@link shaka.extern.PlayerConfiguration},\n * where you may omit any field you do not wish to change.\n * @param {*=} value This should be provided if the previous parameter\n * was a string field name.\n * @return {boolean}\n * @export\n */\n configure(config, value) {\n goog.asserts.assert(typeof(config) == 'object' || arguments.length == 2,\n 'String configs should have values!');\n\n // ('fieldName', value) format\n if (arguments.length == 2 && typeof(config) == 'string') {\n config = shaka.util.ConfigUtils.convertToConfigObject(config, value);\n }\n goog.asserts.assert(typeof(config) == 'object', 'Should be an object!');\n\n goog.asserts.assert(\n this.config_, 'Cannot reconfigure storage after calling destroy.');\n return shaka.util.PlayerConfiguration.mergeConfigObjects(\n /* destination= */ this.config_, /* updates= */ config );\n }\n\n /**\n * Return a copy of the current configuration. Modifications of the returned\n * value will not affect the Storage instance's active configuration. You\n * must call storage.configure() to make changes.\n *\n * @return {shaka.extern.PlayerConfiguration}\n * @export\n */\n getConfiguration() {\n goog.asserts.assert(this.config_, 'Config must not be null!');\n\n const ret = shaka.util.PlayerConfiguration.createDefault();\n shaka.util.PlayerConfiguration.mergeConfigObjects(\n ret, this.config_, shaka.util.PlayerConfiguration.createDefault());\n return ret;\n }\n\n /**\n * Return the networking engine that storage is using. If storage was\n * initialized with a player instance, then the networking engine returned\n * will be the same as |player.getNetworkingEngine()|.\n *\n * The returned value will only be null if |destroy| was called before\n * |getNetworkingEngine|.\n *\n * @return {shaka.net.NetworkingEngine}\n * @export\n */\n getNetworkingEngine() {\n return this.networkingEngine_;\n }\n\n /**\n * Stores the given manifest. If the content is encrypted, and encrypted\n * content cannot be stored on this platform, the Promise will be rejected\n * with error code 6001, REQUESTED_KEY_SYSTEM_CONFIG_UNAVAILABLE.\n * Multiple assets can be downloaded at the same time, but note that since\n * the storage instance has a single networking engine, multiple storage\n * objects will be necessary if some assets require unique network filters.\n * This snapshots the storage config at the time of the call, so it will not\n * honor any changes to config mid-store operation.\n *\n * @param {string} uri The URI of the manifest to store.\n * @param {!Object=} appMetadata An arbitrary object from the application\n * that will be stored along-side the offline content. Use this for any\n * application-specific metadata you need associated with the stored\n * content. For details on the data types that can be stored here, please\n * refer to {@link https://bit.ly/StructClone}\n * @param {?string=} mimeType\n * The mime type for the content |manifestUri| points to.\n * @param {?Array<string>=} externalThumbnails\n * The external thumbnails to store along the main content.\n * @param {?Array<shaka.extern.ExtraText>=} externalText\n * The external text to store along the main content.\n * @return {!shaka.extern.IAbortableOperation.<shaka.extern.StoredContent>}\n * An AbortableOperation that resolves with a structure representing what\n * was stored. The \"offlineUri\" member is the URI that should be given to\n * Player.load() to play this piece of content offline. The \"appMetadata\"\n * member is the appMetadata argument you passed to store().\n * If you want to cancel this download, call the \"abort\" method on\n * AbortableOperation.\n * @export\n */\n store(uri, appMetadata, mimeType, externalThumbnails, externalText) {\n goog.asserts.assert(\n this.networkingEngine_,\n 'Cannot call |store| after calling |destroy|.');\n\n // Get a copy of the current config.\n const config = this.getConfiguration();\n\n const getParser = async () => {\n goog.asserts.assert(\n this.networkingEngine_, 'Should not call |store| after |destroy|');\n\n if (!mimeType) {\n mimeType = await shaka.net.NetworkingUtils.getMimeType(\n uri, this.networkingEngine_, config.manifest.retryParameters);\n }\n\n const factory = shaka.media.ManifestParser.getFactory(\n uri,\n mimeType || null);\n\n return factory();\n };\n\n /** @type {!shaka.offline.DownloadManager} */\n const downloader =\n new shaka.offline.DownloadManager(this.networkingEngine_);\n this.openDownloadManagers_.push(downloader);\n\n const storeOp = this.store_(\n uri, appMetadata || {}, externalThumbnails || [], externalText || [],\n getParser, config, downloader);\n const abortableStoreOp = new shaka.util.AbortableOperation(storeOp, () => {\n return downloader.abortAll();\n });\n abortableStoreOp.finally(() => {\n shaka.util.ArrayUtils.remove(this.openDownloadManagers_, downloader);\n });\n\n return this.startAbortableOperation_(abortableStoreOp);\n }\n\n /**\n * See |shaka.offline.Storage.store| for details.\n *\n * @param {string} uri\n * @param {!Object} appMetadata\n * @param {!Array<string>} externalThumbnails\n * @param {!Array<shaka.extern.ExtraText>} externalText\n * @param {function(): !Promise<shaka.extern.ManifestParser>} getParser\n * @param {shaka.extern.PlayerConfiguration} config\n * @param {!shaka.offline.DownloadManager} downloader\n * @return {!Promise<shaka.extern.StoredContent>}\n * @private\n */\n async store_(uri, appMetadata, externalThumbnails, externalText,\n getParser, config, downloader) {\n this.requireSupport_();\n\n // Since we will need to use |parser|, |drmEngine|, |activeHandle|, and\n // |muxer| in the catch/finally blocks, we need to define them out here.\n // Since they may not get initialized when we enter the catch/finally block,\n // we need to assume that they may be null/undefined when we get there.\n\n /** @type {?shaka.extern.ManifestParser} */\n let parser = null;\n /** @type {?shaka.drm.DrmEngine} */\n let drmEngine = null;\n /** @type {shaka.offline.StorageMuxer} */\n const muxer = new shaka.offline.StorageMuxer();\n /** @type {?shaka.offline.StorageCellHandle} */\n let activeHandle = null;\n /** @type {?number} */\n let manifestId = null;\n\n // This will be used to store any errors from drm engine. Whenever drm\n // engine is passed to another function to do work, we should check if this\n // was set.\n let drmError = null;\n\n try {\n parser = await getParser();\n\n const manifest = await this.parseManifest(uri, parser, config);\n\n // Check if we were asked to destroy ourselves while we were \"away\"\n // downloading the manifest.\n this.ensureNotDestroyed_();\n\n // Check if we can even download this type of manifest before trying to\n // create the drm engine.\n const canDownload = !manifest.presentationTimeline.isLive() &&\n !manifest.presentationTimeline.isInProgress();\n if (!canDownload) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.STORAGE,\n shaka.util.Error.Code.CANNOT_STORE_LIVE_OFFLINE,\n uri);\n }\n\n for (const thumbnailUri of externalThumbnails) {\n const imageStream =\n // eslint-disable-next-line no-await-in-loop\n await this.createExternalImageStream_(thumbnailUri, manifest);\n manifest.imageStreams.push(imageStream);\n this.ensureNotDestroyed_();\n }\n\n for (const text of externalText) {\n const textStream =\n // eslint-disable-next-line no-await-in-loop\n await this.createExternalTextStream_(manifest,\n text.uri, text.language, text.kind, text.mime, text.codecs);\n manifest.textStreams.push(textStream);\n this.ensureNotDestroyed_();\n }\n\n shaka.drm.DrmEngine.configureClearKey(\n config.drm.clearKeys, manifest.variants);\n\n const clearKeyDataLicenseServerUri = manifest.variants.some((v) => {\n if (v.audio) {\n for (const drmInfo of v.audio.drmInfos) {\n if (drmInfo.licenseServerUri.startsWith('data:')) {\n return true;\n }\n }\n }\n if (v.video) {\n for (const drmInfo of v.video.drmInfos) {\n if (drmInfo.licenseServerUri.startsWith('data:')) {\n return true;\n }\n }\n }\n return false;\n });\n\n let usePersistentLicense = config.offline.usePersistentLicense;\n if (clearKeyDataLicenseServerUri) {\n usePersistentLicense = false;\n }\n\n // Create the DRM engine, and load the keys in the manifest.\n drmEngine = await this.createDrmEngine(\n manifest,\n (e) => { drmError = drmError || e; },\n config,\n usePersistentLicense);\n\n // We could have been asked to destroy ourselves while we were \"away\"\n // creating the drm engine.\n this.ensureNotDestroyed_();\n if (drmError) {\n throw drmError;\n }\n\n await this.filterManifest_(\n manifest, drmEngine, config, usePersistentLicense);\n\n await muxer.init();\n this.ensureNotDestroyed_();\n\n // Get the cell that we are saving the manifest to. Once we get a cell\n // we will only reference the cell and not the muxer so that the manifest\n // and segments will all be saved to the same cell.\n activeHandle = await muxer.getActive();\n this.ensureNotDestroyed_();\n\n goog.asserts.assert(drmEngine, 'drmEngine should be non-null here.');\n const {manifestDB, toDownload} = this.makeManifestDB_(\n drmEngine, manifest, uri, appMetadata, config, downloader,\n usePersistentLicense);\n\n // Store the empty manifest, before downloading the segments.\n const ids = await activeHandle.cell.addManifests([manifestDB]);\n this.ensureNotDestroyed_();\n manifestId = ids[0];\n\n goog.asserts.assert(drmEngine, 'drmEngine should be non-null here.');\n this.ensureNotDestroyed_();\n if (drmError) {\n throw drmError;\n }\n\n await this.downloadSegments_(toDownload, manifestId, manifestDB,\n downloader, config, activeHandle.cell, manifest, drmEngine,\n usePersistentLicense);\n this.ensureNotDestroyed_();\n\n this.setManifestDrmFields_(\n manifest, manifestDB, drmEngine, usePersistentLicense);\n await activeHandle.cell.updateManifest(manifestId, manifestDB);\n this.ensureNotDestroyed_();\n\n const offlineUri = shaka.offline.OfflineUri.manifest(\n activeHandle.path.mechanism, activeHandle.path.cell, manifestId);\n\n return shaka.offline.StoredContentUtils.fromManifestDB(\n offlineUri, manifestDB);\n } catch (e) {\n if (manifestId != null) {\n await shaka.offline.Storage.cleanStoredManifest(manifestId);\n }\n\n // If we already had an error, ignore this error to avoid hiding\n // the original error.\n throw drmError || e;\n } finally {\n await muxer.destroy();\n\n if (parser) {\n await parser.stop();\n }\n\n if (drmEngine) {\n await drmEngine.destroy();\n }\n }\n }\n\n /**\n * Download and then store the contents of each segment.\n * The promise this returns will wait for local downloads.\n *\n * @param {!Array<!shaka.offline.DownloadInfo>} toDownload\n * @param {number} manifestId\n * @param {shaka.extern.ManifestDB} manifestDB\n * @param {!shaka.offline.DownloadManager} downloader\n * @param {shaka.extern.PlayerConfiguration} config\n * @param {shaka.extern.StorageCell} storage\n * @param {shaka.extern.Manifest} manifest\n * @param {!shaka.drm.DrmEngine} drmEngine\n * @param {boolean} usePersistentLicense\n * @return {!Promise}\n * @private\n */\n async downloadSegments_(\n toDownload, manifestId, manifestDB, downloader, config, storage,\n manifest, drmEngine, usePersistentLicense) {\n let pendingManifestUpdates = {};\n let pendingDataSize = 0;\n\n const ensureNotAbortedOrDestroyed = () => {\n if (this.destroyer_.destroyed() || downloader.isAborted()) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.STORAGE,\n shaka.util.Error.Code.OPERATION_ABORTED);\n }\n };\n\n /**\n * @param {!Array<!shaka.offline.DownloadInfo>} toDownload\n * @param {boolean} updateDRM\n */\n const download = async (toDownload, updateDRM) => {\n for (const download of toDownload) {\n ensureNotAbortedOrDestroyed();\n const request = download.makeSegmentRequest(config);\n const estimateId = download.estimateId;\n const isInitSegment = download.isInitSegment;\n\n const onDownloaded = async (data) => {\n const ref = /** @type {!shaka.media.SegmentReference} */ (\n download.ref);\n const id = shaka.offline.DownloadInfo.idForSegmentRef(ref);\n if (ref.aesKey) {\n data = await shaka.media.SegmentUtils.aesDecrypt(\n data, ref.aesKey, download.refPosition);\n }\n // Store the data.\n const dataKeys = await storage.addSegments([{data}]);\n ensureNotAbortedOrDestroyed();\n\n // Store the necessary update to the manifest, to be processed later.\n pendingManifestUpdates[id] = dataKeys[0];\n pendingDataSize += data.byteLength;\n };\n\n const ref = /** @type {!shaka.media.SegmentReference} */ (\n download.ref);\n const segmentData = ref.getSegmentData();\n if (segmentData) {\n downloader.queueData(download.groupId,\n segmentData, estimateId, isInitSegment, onDownloaded);\n } else {\n downloader.queue(download.groupId,\n request, estimateId, isInitSegment, onDownloaded);\n }\n }\n await downloader.waitToFinish();\n ensureNotAbortedOrDestroyed();\n\n if (updateDRM && !downloader.isAborted()) {\n // Re-store the manifest, to attach session IDs.\n // These were (maybe) discovered inside the downloader; we can only add\n // them now, at the end, since the manifestDB is in flux during the\n // process of downloading and storing, and assignSegmentsToManifest\n // does not know about the DRM engine.\n this.setManifestDrmFields_(\n manifest, manifestDB, drmEngine, usePersistentLicense);\n await storage.updateManifest(manifestId, manifestDB);\n }\n };\n\n const usingBgFetch = false; // TODO: Get.\n\n try {\n if (this.getManifestIsEncrypted_(manifest) && usingBgFetch &&\n !this.getManifestIncludesInitData_(manifest)) {\n // Background fetch can't make DRM sessions, so if we have to get the\n // init data from the init segments, download those first before\n // anything else.\n await download(toDownload.filter((info) => info.isInitSegment), true);\n ensureNotAbortedOrDestroyed();\n toDownload = toDownload.filter((info) => !info.isInitSegment);\n\n // Copy these and reset them now, before calling await.\n const manifestUpdates = pendingManifestUpdates;\n const dataSize = pendingDataSize;\n pendingManifestUpdates = {};\n pendingDataSize = 0;\n\n await shaka.offline.Storage.assignSegmentsToManifest(\n storage, manifestId, manifestDB, manifestUpdates, dataSize,\n () => this.ensureNotDestroyed_());\n ensureNotAbortedOrDestroyed();\n }\n\n if (!usingBgFetch) {\n await download(toDownload, false);\n ensureNotAbortedOrDestroyed();\n\n // Copy these and reset them now, before calling await.\n const manifestUpdates = pendingManifestUpdates;\n const dataSize = pendingDataSize;\n pendingManifestUpdates = {};\n pendingDataSize = 0;\n\n await shaka.offline.Storage.assignSegmentsToManifest(\n storage, manifestId, manifestDB, manifestUpdates, dataSize,\n () => ensureNotAbortedOrDestroyed());\n ensureNotAbortedOrDestroyed();\n\n goog.asserts.assert(\n !manifestDB.isIncomplete, 'The manifest should be complete by now');\n } else {\n // TODO: Send the request to the service worker. Don't await the result.\n }\n } catch (error) {\n const dataKeys = Object.values(pendingManifestUpdates);\n // Remove these pending segments that are not yet linked to the manifest.\n await storage.removeSegments(dataKeys, (key) => {});\n\n throw error;\n }\n }\n\n /**\n * Removes all of the contents for a given manifest, statelessly.\n *\n * @param {number} manifestId\n * @return {!Promise}\n */\n static async cleanStoredManifest(manifestId) {\n const muxer = new shaka.offline.StorageMuxer();\n await muxer.init();\n const activeHandle = await muxer.getActive();\n const uri = shaka.offline.OfflineUri.manifest(\n activeHandle.path.mechanism,\n activeHandle.path.cell,\n manifestId);\n await muxer.destroy();\n const storage = new shaka.offline.Storage();\n await storage.remove(uri.toString());\n }\n\n /**\n * Updates the given manifest, assigns database keys to segments, then stores\n * the updated manifest.\n *\n * It is up to the caller to ensure that this method is not called\n * concurrently on the same manifest.\n *\n * @param {shaka.extern.StorageCell} storage\n * @param {number} manifestId\n * @param {!shaka.extern.ManifestDB} manifestDB\n * @param {!Object<string, number>} manifestUpdates\n * @param {number} dataSizeUpdate\n * @param {function()} throwIfAbortedFn A function that should throw if the\n * download has been aborted.\n * @return {!Promise}\n */\n static async assignSegmentsToManifest(\n storage, manifestId, manifestDB, manifestUpdates, dataSizeUpdate,\n throwIfAbortedFn) {\n let manifestUpdated = false;\n\n try {\n // Assign the stored data to the manifest.\n let complete = true;\n for (const stream of manifestDB.streams) {\n for (const segment of stream.segments) {\n let dataKey = segment.pendingSegmentRefId ?\n manifestUpdates[segment.pendingSegmentRefId] : null;\n if (dataKey != null) {\n segment.dataKey = dataKey;\n // Now that the segment has been associated with the appropriate\n // dataKey, the pendingSegmentRefId is no longer necessary.\n segment.pendingSegmentRefId = undefined;\n }\n\n dataKey = segment.pendingInitSegmentRefId ?\n manifestUpdates[segment.pendingInitSegmentRefId] : null;\n if (dataKey != null) {\n segment.initSegmentKey = dataKey;\n // Now that the init segment has been associated with the\n // appropriate initSegmentKey, the pendingInitSegmentRefId is no\n // longer necessary.\n segment.pendingInitSegmentRefId = undefined;\n }\n\n if (segment.pendingSegmentRefId) {\n complete = false;\n }\n if (segment.pendingInitSegmentRefId) {\n complete = false;\n }\n }\n }\n\n // Update the size of the manifest.\n manifestDB.size += dataSizeUpdate;\n\n // Mark the manifest as complete, if all segments are downloaded.\n if (complete) {\n manifestDB.isIncomplete = false;\n }\n\n // Update the manifest.\n await storage.updateManifest(manifestId, manifestDB);\n manifestUpdated = true;\n throwIfAbortedFn();\n } catch (e) {\n await shaka.offline.Storage.cleanStoredManifest(manifestId);\n\n if (!manifestUpdated) {\n const dataKeys = Object.values(manifestUpdates);\n // The cleanStoredManifest method will not \"see\" any segments that have\n // been downloaded but not assigned to the manifest yet. So un-store\n // them separately.\n await storage.removeSegments(dataKeys, (key) => {});\n }\n\n throw e;\n }\n }\n\n /**\n * Filter |manifest| such that it will only contain the variants and text\n * streams that we want to store and can actually play.\n *\n * @param {shaka.extern.Manifest} manifest\n * @param {!shaka.drm.DrmEngine} drmEngine\n * @param {shaka.extern.PlayerConfiguration} config\n * @param {boolean} usePersistentLicense\n * @return {!Promise}\n * @private\n */\n async filterManifest_(manifest, drmEngine, config, usePersistentLicense) {\n // Filter the manifest based on the restrictions given in the player\n // configuration.\n const maxHwRes = {width: Infinity, height: Infinity};\n shaka.util.StreamUtils.filterByRestrictions(\n manifest, config.restrictions, maxHwRes);\n\n // Filter the manifest based on what we know MediaCapabilities will be able\n // to play later (no point storing something we can't play).\n await shaka.util.StreamUtils.filterManifestByMediaCapabilities(\n drmEngine, manifest, usePersistentLicense,\n config.drm.preferredKeySystems, config.drm.keySystemsMapping);\n\n // Gather all tracks.\n const allTracks = [];\n\n // Choose the codec that has the lowest average bandwidth.\n const preferredDecodingAttributes = config.preferredDecodingAttributes;\n const preferredVideoCodecs = config.preferredVideoCodecs;\n const preferredAudioCodecs = config.preferredAudioCodecs;\n const preferredTextFormats = config.preferredTextFormats;\n\n shaka.util.StreamUtils.chooseCodecsAndFilterManifest(\n manifest, preferredVideoCodecs, preferredAudioCodecs,\n preferredDecodingAttributes, preferredTextFormats);\n\n for (const variant of manifest.variants) {\n goog.asserts.assert(\n shaka.util.StreamUtils.isPlayable(variant),\n 'We should have already filtered by \"is playable\"');\n\n allTracks.push(shaka.util.StreamUtils.variantToTrack(variant));\n }\n\n for (const text of manifest.textStreams) {\n allTracks.push(shaka.util.StreamUtils.textStreamToTrack(text));\n }\n\n for (const image of manifest.imageStreams) {\n allTracks.push(shaka.util.StreamUtils.imageStreamToTrack(image));\n }\n\n // Let the application choose which tracks to store.\n const chosenTracks =\n await config.offline.trackSelectionCallback(allTracks);\n const duration = manifest.presentationTimeline.getDuration();\n let sizeEstimate = 0;\n for (const track of chosenTracks) {\n const trackSize = track.bandwidth * duration / 8;\n sizeEstimate += trackSize;\n }\n try {\n const allowedDownload =\n await config.offline.downloadSizeCallback(sizeEstimate);\n if (!allowedDownload) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.STORAGE,\n shaka.util.Error.Code.STORAGE_LIMIT_REACHED);\n }\n } catch (e) {\n // It is necessary to be able to catch the STORAGE_LIMIT_REACHED error\n if (e instanceof shaka.util.Error) {\n throw e;\n }\n shaka.log.warning(\n 'downloadSizeCallback has produced an unexpected error', e);\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.STORAGE,\n shaka.util.Error.Code.DOWNLOAD_SIZE_CALLBACK_ERROR);\n }\n\n /** @type {!Set<number>} */\n const variantIds = new Set();\n /** @type {!Set<number>} */\n const textIds = new Set();\n /** @type {!Set<number>} */\n const imageIds = new Set();\n\n // Collect the IDs of the chosen tracks.\n for (const track of chosenTracks) {\n if (track.type == 'variant') {\n variantIds.add(track.id);\n }\n if (track.type == 'text') {\n textIds.add(track.id);\n }\n if (track.type == 'image') {\n imageIds.add(track.id);\n }\n }\n\n // Filter the manifest to keep only what the app chose.\n manifest.variants =\n manifest.variants.filter((variant) => variantIds.has(variant.id));\n manifest.textStreams =\n manifest.textStreams.filter((stream) => textIds.has(stream.id));\n manifest.imageStreams =\n manifest.imageStreams.filter((stream) => imageIds.has(stream.id));\n\n // Check the post-filtered manifest for characteristics that may indicate\n // issues with how the app selected tracks.\n shaka.offline.Storage.validateManifest_(manifest);\n }\n\n /**\n * Create a download manager and download the manifest.\n * This also sets up download infos for each segment to be downloaded.\n *\n * @param {!shaka.drm.DrmEngine} drmEngine\n * @param {shaka.extern.Manifest} manifest\n * @param {string} uri\n * @param {!Object} metadata\n * @param {shaka.extern.PlayerConfiguration} config\n * @param {!shaka.offline.DownloadManager} downloader\n * @param {boolean} usePersistentLicense\n * @return {{\n * manifestDB: shaka.extern.ManifestDB,\n * toDownload: !Array<!shaka.offline.DownloadInfo>\n * }}\n * @private\n */\n makeManifestDB_(drmEngine, manifest, uri, metadata, config, downloader,\n usePersistentLicense) {\n const pendingContent = shaka.offline.StoredContentUtils.fromManifest(\n uri, manifest, /* size= */ 0, metadata);\n // In https://github.com/shaka-project/shaka-player/issues/2652, we found\n // that this callback would be removed by the compiler if we reference the\n // config in the onProgress closure below. Reading it into a local\n // variable first seems to work around this apparent compiler bug.\n const progressCallback = config.offline.progressCallback;\n\n const onProgress = (progress, size) => {\n // Update the size of the stored content before issuing a progress\n // update.\n pendingContent.size = size;\n progressCallback(pendingContent, progress);\n };\n const onInitData = (initData, systemId) => {\n if (needsInitData && usePersistentLicense &&\n currentSystemId == systemId) {\n drmEngine.newInitData('cenc', initData);\n }\n };\n downloader.setCallbacks(onProgress, onInitData);\n\n const needsInitData = this.getManifestIsEncrypted_(manifest) &&\n !this.getManifestIncludesInitData_(manifest);\n\n let currentSystemId = null;\n if (needsInitData) {\n const drmInfo = drmEngine.getDrmInfo();\n currentSystemId =\n shaka.offline.Storage.defaultSystemIds_.get(drmInfo.keySystem);\n }\n\n // Make the estimator, which is used to make the download registries.\n const estimator = new shaka.offline.StreamBandwidthEstimator();\n for (const stream of manifest.textStreams) {\n estimator.addText(stream);\n }\n for (const stream of manifest.imageStreams) {\n estimator.addImage(stream);\n }\n for (const variant of manifest.variants) {\n estimator.addVariant(variant);\n }\n const {streams, toDownload} = this.createStreams_(\n downloader, estimator, drmEngine, manifest, config);\n\n const drmInfo = drmEngine.getDrmInfo();\n if (drmInfo && usePersistentLicense) {\n // Don't store init data, since we have stored sessions.\n drmInfo.initData = [];\n }\n\n const manifestDB = {\n creationTime: Date.now(),\n originalManifestUri: uri,\n duration: manifest.presentationTimeline.getDuration(),\n size: 0,\n expiration: drmEngine.getExpiration(),\n streams,\n sessionIds: usePersistentLicense ? drmEngine.getSessionIds() : [],\n drmInfo,\n appMetadata: metadata,\n isIncomplete: true,\n sequenceMode: manifest.sequenceMode,\n type: manifest.type,\n };\n\n return {manifestDB, toDownload};\n }\n\n /**\n * @param {shaka.extern.Manifest} manifest\n * @return {boolean}\n * @private\n */\n getManifestIsEncrypted_(manifest) {\n return manifest.variants.some((variant) => {\n const videoEncrypted = variant.video && variant.video.encrypted;\n const audioEncrypted = variant.audio && variant.audio.encrypted;\n return videoEncrypted || audioEncrypted;\n });\n }\n\n /**\n * @param {shaka.extern.Manifest} manifest\n * @return {boolean}\n * @private\n */\n getManifestIncludesInitData_(manifest) {\n return manifest.variants.some((variant) => {\n const videoDrmInfos = variant.video ? variant.video.drmInfos : [];\n const audioDrmInfos = variant.audio ? variant.audio.drmInfos : [];\n const drmInfos = videoDrmInfos.concat(audioDrmInfos);\n return drmInfos.some((drmInfos) => {\n return drmInfos.initData && drmInfos.initData.length;\n });\n });\n }\n\n /**\n * @param {shaka.extern.Manifest} manifest\n * @param {shaka.extern.ManifestDB} manifestDB\n * @param {!shaka.drm.DrmEngine} drmEngine\n * @param {boolean} usePersistentLicense\n * @private\n */\n setManifestDrmFields_(manifest, manifestDB, drmEngine, usePersistentLicense) {\n manifestDB.expiration = drmEngine.getExpiration();\n\n const sessions = drmEngine.getSessionIds();\n manifestDB.sessionIds = usePersistentLicense ? sessions : [];\n\n if (this.getManifestIsEncrypted_(manifest) &&\n usePersistentLicense && !sessions.length) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.STORAGE,\n shaka.util.Error.Code.NO_INIT_DATA_FOR_OFFLINE);\n }\n }\n\n /**\n * Removes the given stored content. This will also attempt to release the\n * licenses, if any.\n *\n * @param {string} contentUri\n * @return {!Promise}\n * @export\n */\n remove(contentUri) {\n return this.startOperation_(this.remove_(contentUri));\n }\n\n /**\n * See |shaka.offline.Storage.remove| for details.\n *\n * @param {string} contentUri\n * @return {!Promise}\n * @private\n */\n async remove_(contentUri) {\n this.requireSupport_();\n\n const nullableUri = shaka.offline.OfflineUri.parse(contentUri);\n if (nullableUri == null || !nullableUri.isManifest()) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.STORAGE,\n shaka.util.Error.Code.MALFORMED_OFFLINE_URI,\n contentUri);\n }\n\n /** @type {!shaka.offline.OfflineUri} */\n const uri = nullableUri;\n\n /** @type {!shaka.offline.StorageMuxer} */\n const muxer = new shaka.offline.StorageMuxer();\n\n try {\n await muxer.init();\n\n const cell = await muxer.getCell(uri.mechanism(), uri.cell());\n const manifests = await cell.getManifests([uri.key()]);\n const manifest = manifests[0];\n\n await Promise.all([\n this.removeFromDRM_(uri, manifest, muxer),\n this.removeFromStorage_(cell, uri, manifest),\n ]);\n } finally {\n await muxer.destroy();\n }\n }\n\n /**\n * @param {shaka.extern.ManifestDB} manifestDb\n * @param {boolean} isVideo\n * @return {!Array<MediaKeySystemMediaCapability>}\n * @private\n */\n static getCapabilities_(manifestDb, isVideo) {\n const MimeUtils = shaka.util.MimeUtils;\n\n const ret = [];\n for (const stream of manifestDb.streams) {\n if (isVideo && stream.type == 'video') {\n ret.push({\n contentType: MimeUtils.getFullType(stream.mimeType, stream.codecs),\n robustness: manifestDb.drmInfo.videoRobustness,\n });\n } else if (!isVideo && stream.type == 'audio') {\n ret.push({\n contentType: MimeUtils.getFullType(stream.mimeType, stream.codecs),\n robustness: manifestDb.drmInfo.audioRobustness,\n });\n }\n }\n return ret;\n }\n\n /**\n * @param {!shaka.offline.OfflineUri} uri\n * @param {shaka.extern.ManifestDB} manifestDb\n * @param {!shaka.offline.StorageMuxer} muxer\n * @return {!Promise}\n * @private\n */\n async removeFromDRM_(uri, manifestDb, muxer) {\n goog.asserts.assert(this.networkingEngine_, 'Cannot be destroyed');\n await shaka.offline.Storage.deleteLicenseFor_(\n this.networkingEngine_, this.config_.drm, muxer, manifestDb);\n }\n\n /**\n * @param {shaka.extern.StorageCell} storage\n * @param {!shaka.offline.OfflineUri} uri\n * @param {shaka.extern.ManifestDB} manifest\n * @return {!Promise}\n * @private\n */\n removeFromStorage_(storage, uri, manifest) {\n /** @type {!Array<number>} */\n const segmentIds = shaka.offline.Storage.getAllSegmentIds_(manifest);\n\n // Count(segments) + Count(manifests)\n const toRemove = segmentIds.length + 1;\n let removed = 0;\n\n const pendingContent = shaka.offline.StoredContentUtils.fromManifestDB(\n uri, manifest);\n\n const onRemove = (key) => {\n removed += 1;\n this.config_.offline.progressCallback(pendingContent, removed / toRemove);\n };\n\n return Promise.all([\n storage.removeSegments(segmentIds, onRemove),\n storage.removeManifests([uri.key()], onRemove),\n ]);\n }\n\n /**\n * Removes any EME sessions that were not successfully removed before. This\n * returns whether all the sessions were successfully removed.\n *\n * @return {!Promise<boolean>}\n * @export\n */\n removeEmeSessions() {\n return this.startOperation_(this.removeEmeSessions_());\n }\n\n /**\n * @return {!Promise<boolean>}\n * @private\n */\n async removeEmeSessions_() {\n this.requireSupport_();\n\n goog.asserts.assert(this.networkingEngine_, 'Cannot be destroyed');\n const net = this.networkingEngine_;\n const config = this.config_.drm;\n\n /** @type {!shaka.offline.StorageMuxer} */\n const muxer = new shaka.offline.StorageMuxer();\n /** @type {!shaka.offline.SessionDeleter} */\n const deleter = new shaka.offline.SessionDeleter();\n\n let hasRemaining = false;\n\n try {\n await muxer.init();\n\n /** @type {!Array<shaka.extern.EmeSessionStorageCell>} */\n const cells = [];\n muxer.forEachEmeSessionCell((c) => cells.push(c));\n\n // Run these sequentially to avoid creating too many DrmEngine instances\n // and having multiple CDMs alive at once. Some embedded platforms may\n // not support that.\n for (const sessionIdCell of cells) {\n /* eslint-disable no-await-in-loop */\n const sessions = await sessionIdCell.getAll();\n const deletedSessionIds = await deleter.delete(config, net, sessions);\n await sessionIdCell.remove(deletedSessionIds);\n\n if (deletedSessionIds.length != sessions.length) {\n hasRemaining = true;\n }\n /* eslint-enable no-await-in-loop */\n }\n } finally {\n await muxer.destroy();\n }\n\n return !hasRemaining;\n }\n\n /**\n * Lists all the stored content available.\n *\n * @return {!Promise<!Array<shaka.extern.StoredContent>>} A Promise to an\n * array of structures representing all stored content. The \"offlineUri\"\n * member of the structure is the URI that should be given to Player.load()\n * to play this piece of content offline. The \"appMetadata\" member is the\n * appMetadata argument you passed to store().\n * @export\n */\n list() {\n return this.startOperation_(this.list_());\n }\n\n /**\n * See |shaka.offline.Storage.list| for details.\n *\n * @return {!Promise<!Array<shaka.extern.StoredContent>>}\n * @private\n */\n async list_() {\n this.requireSupport_();\n\n /** @type {!Array<shaka.extern.StoredContent>} */\n const result = [];\n\n /** @type {!shaka.offline.StorageMuxer} */\n const muxer = new shaka.offline.StorageMuxer();\n try {\n await muxer.init();\n\n let p = Promise.resolve();\n muxer.forEachCell((path, cell) => {\n p = p.then(async () => {\n const manifests = await cell.getAllManifests();\n\n manifests.forEach((manifest, key) => {\n const uri = shaka.offline.OfflineUri.manifest(\n path.mechanism,\n path.cell,\n key);\n\n const content = shaka.offline.StoredContentUtils.fromManifestDB(\n uri,\n manifest);\n\n result.push(content);\n });\n });\n });\n\n await p;\n } finally {\n await muxer.destroy();\n }\n\n return result;\n }\n\n\n /**\n * This method is public so that it can be overridden in testing.\n *\n * @param {string} uri\n * @param {shaka.extern.ManifestParser} parser\n * @param {shaka.extern.PlayerConfiguration} config\n * @return {!Promise<shaka.extern.Manifest>}\n */\n async parseManifest(uri, parser, config) {\n let error = null;\n\n const networkingEngine = this.networkingEngine_;\n goog.asserts.assert(networkingEngine, 'Should be initialized!');\n\n /** @type {shaka.extern.ManifestParser.PlayerInterface} */\n const playerInterface = {\n networkingEngine: networkingEngine,\n\n // Don't bother filtering now. We will do that later when we have all the\n // information we need to filter.\n filter: () => Promise.resolve(),\n\n // The responsibility for making mock text streams for closed captions is\n // handled inside shaka.offline.OfflineManifestParser, before playback.\n makeTextStreamsForClosedCaptions: (manifest) => {},\n\n onTimelineRegionAdded: () => {},\n onEvent: () => {},\n\n // Used to capture an error from the manifest parser. We will check the\n // error before returning.\n onError: (e) => {\n error = e;\n },\n isLowLatencyMode: () => false,\n updateDuration: () => {},\n newDrmInfo: (stream) => {},\n onManifestUpdated: () => {},\n getBandwidthEstimate: () => config.abr.defaultBandwidthEstimate,\n onMetadata: () => {},\n disableStream: (stream) => {},\n addFont: (name, url) => {},\n };\n\n parser.configure(config.manifest);\n\n // We may have been destroyed while we were waiting on |getParser| to\n // resolve.\n this.ensureNotDestroyed_();\n\n const manifest = await parser.start(uri, playerInterface);\n\n // We may have been destroyed while we were waiting on |start| to\n // resolve.\n this.ensureNotDestroyed_();\n\n // Get all the streams that are used in the manifest.\n const streams =\n shaka.offline.Storage.getAllStreamsFromManifest_(manifest);\n\n // Wait for each stream to create their segment indexes.\n await Promise.all(shaka.util.Iterables.map(streams, (stream) => {\n return stream.createSegmentIndex();\n }));\n\n // We may have been destroyed while we were waiting on\n // |createSegmentIndex| to resolve for each stream.\n this.ensureNotDestroyed_();\n\n // If we saw an error while parsing, surface the error.\n if (error) {\n throw error;\n }\n\n return manifest;\n }\n\n /**\n * @param {string} uri\n * @param {shaka.extern.Manifest} manifest\n * @return {!Promise<shaka.extern.Stream>}\n * @private\n */\n async createExternalImageStream_(uri, manifest) {\n const mimeType = await this.getTextMimetype_(uri);\n\n if (mimeType != 'text/vtt') {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.RECOVERABLE,\n shaka.util.Error.Category.TEXT,\n shaka.util.Error.Code.UNSUPPORTED_EXTERNAL_THUMBNAILS_URI,\n uri);\n }\n\n goog.asserts.assert(\n this.networkingEngine_, 'Need networking engine.');\n const buffer = await this.getTextData_(uri,\n this.networkingEngine_,\n this.config_.streaming.retryParameters);\n\n const factory = shaka.text.TextEngine.findParser(mimeType);\n if (!factory) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.TEXT,\n shaka.util.Error.Code.MISSING_TEXT_PLUGIN,\n mimeType);\n }\n const TextParser = factory();\n const time = {\n periodStart: 0,\n segmentStart: 0,\n segmentEnd: manifest.presentationTimeline.getDuration(),\n vttOffset: 0,\n };\n const data = shaka.util.BufferUtils.toUint8(buffer);\n const cues = TextParser.parseMedia(data, time, uri, /* images= */ []);\n\n const references = [];\n for (const cue of cues) {\n let uris = null;\n const getUris = () => {\n if (uris == null) {\n uris = shaka.util.ManifestParserUtils.resolveUris(\n [uri], [cue.payload]);\n }\n return uris || [];\n };\n const reference = new shaka.media.SegmentReference(\n cue.startTime,\n cue.endTime,\n getUris,\n /* startByte= */ 0,\n /* endByte= */ null,\n /* initSegmentReference= */ null,\n /* timestampOffset= */ 0,\n /* appendWindowStart= */ 0,\n /* appendWindowEnd= */ Infinity,\n );\n if (cue.payload.includes('#xywh')) {\n const spriteInfo = cue.payload.split('#xywh=')[1].split(',');\n if (spriteInfo.length === 4) {\n reference.setThumbnailSprite({\n height: parseInt(spriteInfo[3], 10),\n positionX: parseInt(spriteInfo[0], 10),\n positionY: parseInt(spriteInfo[1], 10),\n width: parseInt(spriteInfo[2], 10),\n });\n }\n }\n references.push(reference);\n }\n\n let segmentMimeType = mimeType;\n if (references.length) {\n segmentMimeType = await shaka.net.NetworkingUtils.getMimeType(\n references[0].getUris()[0],\n this.networkingEngine_, this.config_.manifest.retryParameters);\n }\n\n return {\n id: this.nextExternalStreamId_++,\n originalId: null,\n groupId: null,\n createSegmentIndex: () => Promise.resolve(),\n segmentIndex: new shaka.media.SegmentIndex(references),\n mimeType: segmentMimeType || '',\n codecs: '',\n kind: '',\n encrypted: false,\n drmInfos: [],\n keyIds: new Set(),\n language: 'und',\n originalLanguage: null,\n label: null,\n type: shaka.util.ManifestParserUtils.ContentType.IMAGE,\n primary: false,\n trickModeVideo: null,\n dependencyStream: null,\n emsgSchemeIdUris: null,\n roles: [],\n forced: false,\n channelsCount: null,\n audioSamplingRate: null,\n spatialAudio: false,\n closedCaptions: null,\n tilesLayout: '1x1',\n accessibilityPurpose: null,\n external: true,\n fastSwitching: false,\n fullMimeTypes: new Set([shaka.util.MimeUtils.getFullType(\n segmentMimeType || '', '')]),\n isAudioMuxedInVideo: false,\n baseOriginalId: null,\n };\n }\n\n /**\n * @param {shaka.extern.Manifest} manifest\n * @param {string} uri\n * @param {string} language\n * @param {string} kind\n * @param {string=} mimeType\n * @param {string=} codec\n * @private\n */\n async createExternalTextStream_(manifest, uri, language, kind, mimeType,\n codec) {\n if (!mimeType) {\n mimeType = await this.getTextMimetype_(uri);\n }\n\n /** @type {shaka.extern.Stream} */\n const stream = {\n id: this.nextExternalStreamId_++,\n originalId: null,\n groupId: null,\n createSegmentIndex: () => Promise.resolve(),\n segmentIndex: shaka.media.SegmentIndex.forSingleSegment(\n /* startTime= */ 0,\n /* duration= */ manifest.presentationTimeline.getDuration(),\n /* uris= */ [uri]),\n mimeType: mimeType || '',\n codecs: codec || '',\n kind: kind,\n encrypted: false,\n drmInfos: [],\n keyIds: new Set(),\n language: language,\n originalLanguage: language,\n label: null,\n type: shaka.util.ManifestParserUtils.ContentType.TEXT,\n primary: false,\n trickModeVideo: null,\n dependencyStream: null,\n emsgSchemeIdUris: null,\n roles: [],\n forced: false,\n channelsCount: null,\n audioSamplingRate: null,\n spatialAudio: false,\n closedCaptions: null,\n accessibilityPurpose: null,\n external: true,\n fastSwitching: false,\n fullMimeTypes: new Set([shaka.util.MimeUtils.getFullType(\n mimeType || '', codec || '')]),\n isAudioMuxedInVideo: false,\n baseOriginalId: null,\n };\n\n const fullMimeType = shaka.util.MimeUtils.getFullType(\n stream.mimeType, stream.codecs);\n const supported = shaka.text.TextEngine.isTypeSupported(fullMimeType);\n if (!supported) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.TEXT,\n shaka.util.Error.Code.MISSING_TEXT_PLUGIN,\n mimeType);\n }\n\n return stream;\n }\n\n /**\n * @param {string} uri\n * @return {!Promise<string>}\n * @private\n */\n async getTextMimetype_(uri) {\n let mimeType;\n try {\n goog.asserts.assert(\n this.networkingEngine_, 'Need networking engine.');\n mimeType = await shaka.net.NetworkingUtils.getMimeType(uri,\n this.networkingEngine_,\n this.config_.streaming.retryParameters);\n } catch (error) {}\n\n if (mimeType) {\n return mimeType;\n }\n\n shaka.log.error(\n 'The mimeType has not been provided and it could not be deduced ' +\n 'from its uri.');\n throw new shaka.util.Error(\n shaka.util.Error.Severity.RECOVERABLE,\n shaka.util.Error.Category.TEXT,\n shaka.util.Error.Code.TEXT_COULD_NOT_GUESS_MIME_TYPE,\n uri);\n }\n\n /**\n * @param {string} uri\n * @param {!shaka.net.NetworkingEngine} netEngine\n * @param {shaka.extern.RetryParameters} retryParams\n * @return {!Promise<BufferSource>}\n * @private\n */\n async getTextData_(uri, netEngine, retryParams) {\n const type = shaka.net.NetworkingEngine.RequestType.SEGMENT;\n\n const request = shaka.net.NetworkingEngine.makeRequest([uri], retryParams);\n request.method = 'GET';\n\n const response = await netEngine.request(type, request).promise;\n\n return response.data;\n }\n\n /**\n * This method is public so that it can be override in testing.\n *\n * @param {shaka.extern.Manifest} manifest\n * @param {function(shaka.util.Error)} onError\n * @param {shaka.extern.PlayerConfiguration} config\n * @param {boolean} usePersistentLicense\n * @return {!Promise<!shaka.drm.DrmEngine>}\n */\n async createDrmEngine(manifest, onError, config, usePersistentLicense) {\n goog.asserts.assert(\n this.networkingEngine_,\n 'Cannot call |createDrmEngine| after |destroy|');\n\n /** @type {!shaka.drm.DrmEngine} */\n const drmEngine = new shaka.drm.DrmEngine({\n netEngine: this.networkingEngine_,\n onError: onError,\n onKeyStatus: () => {},\n onExpirationUpdated: () => {},\n onEvent: () => {},\n });\n\n drmEngine.configure(config.drm);\n await drmEngine.initForStorage(manifest.variants, usePersistentLicense);\n await drmEngine.createOrLoad();\n\n return drmEngine;\n }\n\n /**\n * Converts manifest Streams to database Streams.\n *\n * @param {!shaka.offline.DownloadManager} downloader\n * @param {shaka.offline.StreamBandwidthEstimator} estimator\n * @param {!shaka.drm.DrmEngine} drmEngine\n * @param {shaka.extern.Manifest} manifest\n * @param {shaka.extern.PlayerConfiguration} config\n * @return {{\n * streams: !Array<shaka.extern.StreamDB>,\n * toDownload: !Array<!shaka.offline.DownloadInfo>\n * }}\n * @private\n */\n createStreams_(downloader, estimator, drmEngine, manifest, config) {\n // Download infos are stored based on their refId, to deduplicate them.\n /** @type {!Map<string, !shaka.offline.DownloadInfo>} */\n const toDownload = new Map();\n\n // Find the streams we want to download and create a stream db instance\n // for each of them.\n const streamSet =\n shaka.offline.Storage.getAllStreamsFromManifest_(manifest);\n const streamDBs = new Map();\n\n for (const stream of streamSet) {\n const streamDB = this.createStream_(\n downloader, estimator, manifest, stream, config, toDownload);\n streamDBs.set(stream.id, streamDB);\n }\n\n // Connect streams and variants together.\n for (const variant of manifest.variants) {\n if (variant.audio) {\n streamDBs.get(variant.audio.id).variantIds.push(variant.id);\n }\n if (variant.video) {\n streamDBs.get(variant.video.id).variantIds.push(variant.id);\n }\n }\n\n return {\n streams: Array.from(streamDBs.values()),\n toDownload: Array.from(toDownload.values()),\n };\n }\n\n /**\n * Converts a manifest stream to a database stream. This will search the\n * segment index and add all the segments to the download infos.\n *\n * @param {!shaka.offline.DownloadManager} downloader\n * @param {shaka.offline.StreamBandwidthEstimator} estimator\n * @param {shaka.extern.Manifest} manifest\n * @param {shaka.extern.Stream} stream\n * @param {shaka.extern.PlayerConfiguration} config\n * @param {!Map<string, !shaka.offline.DownloadInfo>} toDownload\n * @return {shaka.extern.StreamDB}\n * @private\n */\n createStream_(downloader, estimator, manifest, stream, config, toDownload) {\n /** @type {shaka.extern.StreamDB} */\n const streamDb = {\n id: stream.id,\n originalId: stream.originalId,\n groupId: stream.groupId,\n primary: stream.primary,\n type: stream.type,\n mimeType: stream.mimeType,\n codecs: stream.codecs,\n frameRate: stream.frameRate,\n pixelAspectRatio: stream.pixelAspectRatio,\n hdr: stream.hdr,\n colorGamut: stream.colorGamut,\n videoLayout: stream.videoLayout,\n kind: stream.kind,\n language: stream.language,\n originalLanguage: stream.originalLanguage,\n label: stream.label,\n width: stream.width || null,\n height: stream.height || null,\n encrypted: stream.encrypted,\n keyIds: stream.keyIds,\n segments: [],\n variantIds: [],\n roles: stream.roles,\n forced: stream.forced,\n channelsCount: stream.channelsCount,\n audioSamplingRate: stream.audioSamplingRate,\n spatialAudio: stream.spatialAudio,\n closedCaptions: stream.closedCaptions,\n tilesLayout: stream.tilesLayout,\n mssPrivateData: stream.mssPrivateData,\n external: stream.external,\n fastSwitching: stream.fastSwitching,\n isAudioMuxedInVideo: stream.isAudioMuxedInVideo,\n };\n\n const startTime =\n manifest.presentationTimeline.getSegmentAvailabilityStart();\n\n const numberOfParallelDownloads = config.offline.numberOfParallelDownloads;\n let groupId = numberOfParallelDownloads === 0 ? stream.id : 0;\n\n shaka.offline.Storage.forEachSegment_(stream, startTime, (segment, pos) => {\n const pendingSegmentRefId =\n shaka.offline.DownloadInfo.idForSegmentRef(segment);\n let pendingInitSegmentRefId = undefined;\n\n // Set up the download for the segment, which will be downloaded later,\n // perhaps in a service worker.\n if (!toDownload.has(pendingSegmentRefId)) {\n const estimateId = downloader.addDownloadEstimate(\n estimator.getSegmentEstimate(stream.id, segment));\n const segmentDownload = new shaka.offline.DownloadInfo(\n segment,\n estimateId,\n groupId,\n /* isInitSegment= */ false,\n pos);\n toDownload.set(pendingSegmentRefId, segmentDownload);\n }\n\n // Set up the download for the init segment, similarly, if there is one.\n if (segment.initSegmentReference) {\n pendingInitSegmentRefId = shaka.offline.DownloadInfo.idForSegmentRef(\n segment.initSegmentReference);\n if (!toDownload.has(pendingInitSegmentRefId)) {\n const estimateId = downloader.addDownloadEstimate(\n estimator.getInitSegmentEstimate(stream.id));\n const initDownload = new shaka.offline.DownloadInfo(\n segment.initSegmentReference,\n estimateId,\n groupId,\n /* isInitSegment= */ true,\n pos);\n toDownload.set(pendingInitSegmentRefId, initDownload);\n }\n }\n\n /** @type {!shaka.extern.SegmentDB} */\n const segmentDB = {\n pendingInitSegmentRefId,\n initSegmentKey: pendingInitSegmentRefId ? 0 : null,\n startTime: segment.startTime,\n endTime: segment.endTime,\n appendWindowStart: segment.appendWindowStart,\n appendWindowEnd: segment.appendWindowEnd,\n timestampOffset: segment.timestampOffset,\n tilesLayout: segment.tilesLayout,\n pendingSegmentRefId,\n dataKey: 0,\n mimeType: segment.mimeType,\n codecs: segment.codecs,\n thumbnailSprite: segment.thumbnailSprite,\n };\n streamDb.segments.push(segmentDB);\n if (numberOfParallelDownloads !== 0) {\n groupId = (groupId + 1) % numberOfParallelDownloads;\n }\n });\n\n return streamDb;\n }\n\n /**\n * @param {shaka.extern.Stream} stream\n * @param {number} startTime\n * @param {function(!shaka.media.SegmentReference, number)} callback\n * @private\n */\n static forEachSegment_(stream, startTime, callback) {\n /** @type {?number} */\n let i = stream.segmentIndex.find(startTime);\n\n if (i == null) {\n return;\n }\n\n /** @type {?shaka.media.SegmentReference} */\n let ref = stream.segmentIndex.get(i);\n while (ref) {\n callback(ref, i);\n ref = stream.segmentIndex.get(++i);\n }\n }\n\n /**\n * Throws an error if the object is destroyed.\n * @private\n */\n ensureNotDestroyed_() {\n if (this.destroyer_.destroyed()) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.STORAGE,\n shaka.util.Error.Code.OPERATION_ABORTED);\n }\n }\n\n /**\n * Used by functions that need storage support to ensure that the current\n * platform has storage support before continuing. This should only be\n * needed to be used at the start of public methods.\n *\n * @private\n */\n requireSupport_() {\n if (!shaka.offline.Storage.support()) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.STORAGE,\n shaka.util.Error.Code.STORAGE_NOT_SUPPORTED);\n }\n }\n\n /**\n * Perform an action. Track the action's progress so that when we destroy\n * we will wait until all the actions have completed before allowing destroy\n * to resolve.\n *\n * @param {!Promise<T>} action\n * @return {!Promise<T>}\n * @template T\n * @private\n */\n async startOperation_(action) {\n this.openOperations_.push(action);\n\n try {\n // Await |action| so we can use the finally statement to remove |action|\n // from |openOperations_| when we still have a reference to |action|.\n return await action;\n } finally {\n shaka.util.ArrayUtils.remove(this.openOperations_, action);\n }\n }\n\n /**\n * The equivalent of startOperation_, but for abortable operations.\n *\n * @param {!shaka.extern.IAbortableOperation<T>} action\n * @return {!shaka.extern.IAbortableOperation<T>}\n * @template T\n * @private\n */\n startAbortableOperation_(action) {\n const promise = action.promise;\n this.openOperations_.push(promise);\n\n // Remove the open operation once the action has completed. So that we\n // can still return the AbortableOperation, this is done using a |finally|\n // block, rather than awaiting the result.\n return action.finally(() => {\n shaka.util.ArrayUtils.remove(this.openOperations_, promise);\n });\n }\n\n /**\n * @param {shaka.extern.ManifestDB} manifest\n * @return {!Array<number>}\n * @private\n */\n static getAllSegmentIds_(manifest) {\n /** @type {!Set<number>} */\n const ids = new Set();\n\n // Get every segment for every stream in the manifest.\n for (const stream of manifest.streams) {\n for (const segment of stream.segments) {\n if (segment.initSegmentKey != null) {\n ids.add(segment.initSegmentKey);\n }\n\n ids.add(segment.dataKey);\n }\n }\n\n return Array.from(ids);\n }\n\n /**\n * Delete the on-disk storage and all the content it contains. This should not\n * be done in normal circumstances. Only do it when storage is rendered\n * unusable, such as by a version mismatch. No business logic will be run, and\n * licenses will not be released.\n *\n * @return {!Promise}\n * @export\n */\n static async deleteAll() {\n /** @type {!shaka.offline.StorageMuxer} */\n const muxer = new shaka.offline.StorageMuxer();\n try {\n // Wipe all content from all storage mechanisms.\n await muxer.erase();\n } finally {\n // Destroy the muxer, whether or not erase() succeeded.\n await muxer.destroy();\n }\n }\n\n /**\n * @param {!shaka.net.NetworkingEngine} net\n * @param {!shaka.extern.DrmConfiguration} drmConfig\n * @param {!shaka.offline.StorageMuxer} muxer\n * @param {shaka.extern.ManifestDB} manifestDb\n * @return {!Promise}\n * @private\n */\n static async deleteLicenseFor_(net, drmConfig, muxer, manifestDb) {\n if (!manifestDb.drmInfo) {\n return;\n }\n\n const sessionIdCell = muxer.getEmeSessionCell();\n\n /** @type {!Array<shaka.extern.EmeSessionDB>} */\n const sessions = manifestDb.sessionIds.map((sessionId) => {\n return {\n sessionId: sessionId,\n keySystem: manifestDb.drmInfo.keySystem,\n licenseUri: manifestDb.drmInfo.licenseServerUri,\n serverCertificate: manifestDb.drmInfo.serverCertificate,\n audioCapabilities: shaka.offline.Storage.getCapabilities_(\n manifestDb,\n /* isVideo= */ false),\n videoCapabilities: shaka.offline.Storage.getCapabilities_(\n manifestDb,\n /* isVideo= */ true),\n };\n });\n // Try to delete the sessions; any sessions that weren't deleted get stored\n // in the database so we can try to remove them again later. This allows us\n // to still delete the stored content but not \"forget\" about these sessions.\n // Later, we can remove the sessions to free up space.\n const deleter = new shaka.offline.SessionDeleter();\n const deletedSessionIds = await deleter.delete(drmConfig, net, sessions);\n await sessionIdCell.remove(deletedSessionIds);\n await sessionIdCell.add(sessions.filter(\n (session) => !deletedSessionIds.includes(session.sessionId)));\n }\n\n /**\n * Get the set of all streams in |manifest|.\n *\n * @param {shaka.extern.Manifest} manifest\n * @return {!Set<shaka.extern.Stream>}\n * @private\n */\n static getAllStreamsFromManifest_(manifest) {\n /** @type {!Set<shaka.extern.Stream>} */\n const set = new Set();\n\n for (const variant of manifest.variants) {\n if (variant.audio) {\n set.add(variant.audio);\n }\n if (variant.video) {\n set.add(variant.video);\n }\n }\n\n for (const text of manifest.textStreams) {\n set.add(text);\n }\n\n for (const image of manifest.imageStreams) {\n set.add(image);\n }\n\n return set;\n }\n\n /**\n * Go over a manifest and issue warnings for any suspicious properties.\n *\n * @param {shaka.extern.Manifest} manifest\n * @private\n */\n static validateManifest_(manifest) {\n const videos = new Set(manifest.variants.map((v) => v.video));\n const audios = new Set(manifest.variants.map((v) => v.audio));\n const texts = manifest.textStreams;\n\n if (videos.size > 1) {\n shaka.log.warning('Multiple video tracks selected to be stored');\n }\n\n for (const audio1 of audios) {\n for (const audio2 of audios) {\n if (audio1 != audio2 && audio1.language == audio2.language) {\n shaka.log.warning(\n 'Similar audio tracks were selected to be stored',\n audio1.id,\n audio2.id);\n }\n }\n }\n\n for (const text1 of texts) {\n for (const text2 of texts) {\n if (text1 != text2 && text1.language == text2.language) {\n shaka.log.warning(\n 'Similar text tracks were selected to be stored',\n text1.id,\n text2.id);\n }\n }\n }\n }\n};\n\nshaka.offline.Storage.defaultSystemIds_ = new Map()\n .set('org.w3.clearkey', '1077efecc0b24d02ace33c1e52e2fb4b')\n .set('com.widevine.alpha', 'edef8ba979d64acea3c827dcd51d21ed')\n .set('com.microsoft.playready', '9a04f07998404286ab92e65be0885f95')\n .set('com.microsoft.playready.recommendation',\n '9a04f07998404286ab92e65be0885f95')\n .set('com.microsoft.playready.software',\n '9a04f07998404286ab92e65be0885f95')\n .set('com.microsoft.playready.hardware',\n '9a04f07998404286ab92e65be0885f95')\n .set('com.huawei.wiseplay', '3d5e6d359b9a41e8b843dd3c6e72c42c');\n\nshaka.Player.registerSupportPlugin('offline', shaka.offline.Storage.support);\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.polyfill');\n\ngoog.require('shaka.log');\n\n\n/**\n * @summary A one-stop installer for all polyfills.\n * @see http://enwp.org/polyfill\n * @export\n */\nshaka.polyfill = class {\n /**\n * Install all polyfills.\n * @export\n */\n static installAll() {\n for (const polyfill of shaka.polyfill.polyfills_) {\n try {\n polyfill.callback();\n } catch (error) {\n shaka.log.alwaysWarn('Error installing polyfill!', error);\n }\n }\n }\n\n /**\n * Registers a new polyfill to be installed.\n *\n * @param {function()} polyfill\n * @param {number=} priority An optional number priority. Higher priorities\n * will be executed before lower priority ones. Default is 0.\n * @export\n */\n static register(polyfill, priority) {\n const newItem = {priority: priority || 0, callback: polyfill};\n for (let i = 0; i < shaka.polyfill.polyfills_.length; i++) {\n const item = shaka.polyfill.polyfills_[i];\n if (item.priority < newItem.priority) {\n shaka.polyfill.polyfills_.splice(i, 0, newItem);\n return;\n }\n }\n shaka.polyfill.polyfills_.push(newItem);\n }\n};\n\n\n/**\n * Contains the polyfills that will be installed.\n * @private {!Array<{priority: number, callback: function()}>}\n */\nshaka.polyfill.polyfills_ = [];\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.polyfill.Aria');\n\ngoog.require('shaka.log');\ngoog.require('shaka.polyfill');\n\n/**\n * @summary A polyfill to add support for the ARIAMixin interface mixin, for\n * browsers that do not implement it (e.g. Firefox).\n * Note that IE also does not support ARIAMixin, but this polyfill does not work\n * for that platform, as it relies on getters and setters.\n * @see https://w3c.github.io/aria/#ARIAMixin\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Element\n * @export\n */\nshaka.polyfill.Aria = class {\n /**\n * Install the polyfill if needed.\n * @export\n */\n static install() {\n // eslint-disable-next-line no-restricted-syntax\n if (Object.getOwnPropertyDescriptor(Element.prototype, 'ariaHidden')) {\n shaka.log.info('Using native ARIAMixin interface.');\n return;\n }\n shaka.log.info('ARIAMixin interface not detected. Installing polyfill.');\n\n // Define a list of all of the ARIAMixin properties that we have externs\n // for.\n const attributes = [\n 'ariaHidden',\n 'ariaLabel',\n 'ariaPressed',\n 'ariaSelected',\n ];\n\n // Add each attribute, one by one.\n for (const attribute of attributes) {\n shaka.polyfill.Aria.addARIAMixinAttribute_(attribute);\n }\n }\n\n /**\n * Adds an attribute with the given name.\n * @param {string} name The name of the attribute, in camelCase.\n * @private\n */\n static addARIAMixinAttribute_(name) {\n const baseName = name.toLowerCase().replace(/^aria/, '');\n // NOTE: All the attributes listed in the method above begin with \"aria\".\n // However, to add extra protection against the possibility of XSS attacks\n // through this method, this enforces \"aria-\" at the beginning of the\n // snake-case name, even if somehow \"aria\" were missing from the input.\n const snakeCaseName = `aria-${baseName}`;\n\n /* eslint-disable no-restricted-syntax */\n Object.defineProperty(Element.prototype, name, {\n get() {\n const element = /** @type {!Element} */ (this);\n return element.getAttribute(snakeCaseName);\n },\n set(value) {\n const element = /** @type {!Element} */ (this);\n if (value == null || value == undefined) {\n element.removeAttribute(snakeCaseName);\n } else {\n element.setAttribute(snakeCaseName, value);\n }\n },\n });\n /* eslint-enable no-restricted-syntax */\n }\n};\n\n\nshaka.polyfill.register(shaka.polyfill.Aria.install);\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.polyfill.EncryptionScheme');\n\ngoog.require('shaka.polyfill');\ngoog.require('shaka.util.Platform');\n\n/**\n * @summary A polyfill to add support for EncryptionScheme queries in EME.\n * @see https://wicg.github.io/encrypted-media-encryption-scheme/\n * @see https://github.com/w3c/encrypted-media/pull/457\n * @see https://github.com/shaka-project/eme-encryption-scheme-polyfill\n * @export\n */\nshaka.polyfill.EncryptionScheme = class {\n /**\n * Install the polyfill if needed.\n *\n * @suppress {missingRequire}\n * @export\n */\n static install() {\n // Skip polyfill for PlayStation 4 and SkyQ devices due to known crashes\n // caused by unsupported encryptionScheme handling. These platforms do not\n // require the polyfill, and forcing encryptionScheme processing can result\n // in playback crashes.\n if (shaka.util.Platform.isPS4() || shaka.util.Platform.isSkyQ()) {\n return;\n }\n\n EncryptionSchemePolyfills.install();\n }\n};\n\n// Install at a low priority so that other EME polyfills go first.\nshaka.polyfill.register(shaka.polyfill.EncryptionScheme.install, -2);\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.polyfill.Fullscreen');\n\ngoog.require('shaka.polyfill');\n\n\n/**\n * @summary A polyfill to unify fullscreen APIs across browsers.\n * Many browsers have prefixed fullscreen methods on Element and document.\n * See {@link https://mzl.la/2K0xcHo Using fullscreen mode} on MDN for more\n * information.\n * @export\n */\nshaka.polyfill.Fullscreen = class {\n /**\n * Install the polyfill if needed.\n * @export\n */\n static install() {\n if (!window.Document) {\n // Avoid errors on very old browsers.\n return;\n }\n\n // eslint-disable-next-line no-restricted-syntax\n let proto = Element.prototype;\n proto.requestFullscreen = proto.requestFullscreen ||\n proto.mozRequestFullScreen ||\n proto.msRequestFullscreen ||\n proto.webkitRequestFullscreen;\n\n // eslint-disable-next-line no-restricted-syntax\n proto = Document.prototype;\n proto.exitFullscreen = proto.exitFullscreen ||\n proto.mozCancelFullScreen ||\n proto.msExitFullscreen ||\n proto.webkitCancelFullScreen;\n\n if (!('fullscreenElement' in document)) {\n Object.defineProperty(document, 'fullscreenElement', {\n get: () => {\n return document.mozFullScreenElement ||\n document.msFullscreenElement ||\n document.webkitCurrentFullScreenElement ||\n document.webkitFullscreenElement;\n },\n });\n Object.defineProperty(document, 'fullscreenEnabled', {\n get: () => {\n return document.mozFullScreenEnabled ||\n document.msFullscreenEnabled ||\n document.webkitFullscreenEnabled;\n },\n });\n }\n\n const proxy = shaka.polyfill.Fullscreen.proxyEvent_;\n document.addEventListener('webkitfullscreenchange', proxy);\n document.addEventListener('webkitfullscreenerror', proxy);\n document.addEventListener('mozfullscreenchange', proxy);\n document.addEventListener('mozfullscreenerror', proxy);\n document.addEventListener('MSFullscreenChange', proxy);\n document.addEventListener('MSFullscreenError', proxy);\n }\n\n /**\n * Proxy fullscreen events after changing their name.\n * @param {!Event} event\n * @private\n */\n static proxyEvent_(event) {\n const eventType = event.type.replace(/^(webkit|moz|MS)/, '').toLowerCase();\n\n const newEvent = document.createEvent('Event');\n newEvent.initEvent(eventType, event.bubbles, event.cancelable);\n\n event.target.dispatchEvent(newEvent);\n }\n};\n\n\nshaka.polyfill.register(shaka.polyfill.Fullscreen.install);\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.polyfill.MediaCapabilities');\n\ngoog.require('shaka.log');\ngoog.require('shaka.drm.DrmUtils');\ngoog.require('shaka.media.Capabilities');\ngoog.require('shaka.polyfill');\ngoog.require('shaka.util.MimeUtils');\ngoog.require('shaka.util.Platform');\n\n\n/**\n * @summary A polyfill to provide navigator.mediaCapabilities on all browsers.\n * This is necessary for Tizen 3, Xbox One and possibly others we have yet to\n * discover.\n * @export\n */\nshaka.polyfill.MediaCapabilities = class {\n /**\n * Install the polyfill if needed.\n * @suppress {const}\n * @export\n */\n static install() {\n // We can enable MediaCapabilities in Android and Fuchsia devices, but not\n // in Linux devices because the implementation is buggy.\n // Since MediaCapabilities implementation is buggy in Apple browsers, we\n // should always install polyfill for Apple browsers.\n // See: https://github.com/shaka-project/shaka-player/issues/3530\n // TODO: re-evaluate MediaCapabilities in the future versions of Apple\n // Browsers.\n // Since MediaCapabilities implementation is buggy in PS5 browsers, we\n // should always install polyfill for PS5 browsers.\n // See: https://github.com/shaka-project/shaka-player/issues/3582\n // TODO: re-evaluate MediaCapabilities in the future versions of PS5\n // Browsers.\n // Since MediaCapabilities implementation does not exist in PS4 browsers, we\n // should always install polyfill.\n // Since MediaCapabilities implementation is buggy in Tizen browsers, we\n // should always install polyfill for Tizen browsers.\n // Since MediaCapabilities implementation is buggy in WebOS browsers, we\n // should always install polyfill for WebOS browsers.\n // Since MediaCapabilities implementation is buggy in EOS browsers, we\n // should always install polyfill for EOS browsers.\n // Since MediaCapabilities implementation is buggy in Hisense browsers, we\n // should always install polyfill for Hisense browsers.\n let canUseNativeMCap = true;\n if (shaka.util.Platform.isOlderChromecast() ||\n shaka.util.Platform.isApple() ||\n shaka.util.Platform.isPS5() ||\n shaka.util.Platform.isPS4() ||\n shaka.util.Platform.isWebOS() ||\n shaka.util.Platform.isTizen() ||\n shaka.util.Platform.isHisense() ||\n shaka.util.Platform.isWebkitSTB()) {\n canUseNativeMCap = false;\n }\n if (canUseNativeMCap && navigator.mediaCapabilities) {\n shaka.log.info(\n 'MediaCapabilities: Native mediaCapabilities support found.');\n return;\n }\n\n shaka.log.info('MediaCapabilities: install');\n\n if (!navigator.mediaCapabilities) {\n navigator.mediaCapabilities = /** @type {!MediaCapabilities} */ ({});\n }\n\n // Keep the patched MediaCapabilities object from being garbage-collected in\n // Safari.\n // See https://github.com/shaka-project/shaka-player/issues/3696#issuecomment-1009472718\n shaka.polyfill.MediaCapabilities.originalMcap =\n navigator.mediaCapabilities;\n\n navigator.mediaCapabilities.decodingInfo =\n shaka.polyfill.MediaCapabilities.decodingInfo_;\n }\n\n /**\n * @param {!MediaDecodingConfiguration} mediaDecodingConfig\n * @return {!Promise<!MediaCapabilitiesDecodingInfo>}\n * @private\n */\n static async decodingInfo_(mediaDecodingConfig) {\n /** @type {!MediaCapabilitiesDecodingInfo} */\n const res = {\n supported: false,\n powerEfficient: true,\n smooth: true,\n keySystemAccess: null,\n configuration: mediaDecodingConfig,\n };\n\n const videoConfig = mediaDecodingConfig['video'];\n const audioConfig = mediaDecodingConfig['audio'];\n\n if (mediaDecodingConfig.type == 'media-source') {\n if (!shaka.util.Platform.supportsMediaSource()) {\n return res;\n }\n\n if (videoConfig) {\n const isSupported =\n await shaka.polyfill.MediaCapabilities.checkVideoSupport_(\n videoConfig);\n if (!isSupported) {\n return res;\n }\n }\n\n if (audioConfig) {\n const isSupported =\n shaka.polyfill.MediaCapabilities.checkAudioSupport_(audioConfig);\n if (!isSupported) {\n return res;\n }\n }\n } else if (mediaDecodingConfig.type == 'file') {\n if (videoConfig) {\n const contentType = videoConfig.contentType;\n const isSupported = shaka.util.Platform.supportsMediaType(contentType);\n if (!isSupported) {\n return res;\n }\n }\n\n if (audioConfig) {\n const contentType = audioConfig.contentType;\n const isSupported = shaka.util.Platform.supportsMediaType(contentType);\n if (!isSupported) {\n return res;\n }\n }\n } else {\n // Otherwise not supported.\n return res;\n }\n\n if (!mediaDecodingConfig.keySystemConfiguration) {\n // The variant is supported if it's unencrypted.\n res.supported = true;\n return res;\n } else {\n const mcapKeySystemConfig = mediaDecodingConfig.keySystemConfiguration;\n const keySystemAccess =\n await shaka.polyfill.MediaCapabilities.checkDrmSupport_(\n videoConfig, audioConfig, mcapKeySystemConfig);\n if (keySystemAccess) {\n res.supported = true;\n res.keySystemAccess = keySystemAccess;\n }\n }\n\n return res;\n }\n\n /**\n * @param {!VideoConfiguration} videoConfig The 'video' field of the\n * MediaDecodingConfiguration.\n * @return {!Promise<boolean>}\n * @private\n */\n static async checkVideoSupport_(videoConfig) {\n // Use 'shaka.media.Capabilities.isTypeSupported' to check if\n // the stream is supported.\n // Cast platforms will additionally check canDisplayType(), which\n // accepts extended MIME type parameters.\n // See: https://github.com/shaka-project/shaka-player/issues/4726\n if (shaka.util.Platform.isChromecast()) {\n const isSupported =\n await shaka.polyfill.MediaCapabilities.canCastDisplayType_(\n videoConfig);\n return isSupported;\n } else if (shaka.util.Platform.isTizen()) {\n let extendedType = videoConfig.contentType;\n if (videoConfig.width && videoConfig.height) {\n extendedType += `; width=${videoConfig.width}`;\n extendedType += `; height=${videoConfig.height}`;\n }\n if (videoConfig.framerate) {\n extendedType += `; framerate=${videoConfig.framerate}`;\n }\n if (videoConfig.bitrate) {\n extendedType += `; bitrate=${videoConfig.bitrate}`;\n }\n return shaka.media.Capabilities.isTypeSupported(extendedType);\n }\n return shaka.media.Capabilities.isTypeSupported(videoConfig.contentType);\n }\n\n /**\n * @param {!AudioConfiguration} audioConfig The 'audio' field of the\n * MediaDecodingConfiguration.\n * @return {boolean}\n * @private\n */\n static checkAudioSupport_(audioConfig) {\n let extendedType = audioConfig.contentType;\n if (shaka.util.Platform.isChromecast() && audioConfig.spatialRendering) {\n extendedType += '; spatialRendering=true';\n }\n return shaka.media.Capabilities.isTypeSupported(extendedType);\n }\n\n /**\n * @param {VideoConfiguration} videoConfig The 'video' field of the\n * MediaDecodingConfiguration.\n * @param {AudioConfiguration} audioConfig The 'audio' field of the\n * MediaDecodingConfiguration.\n * @param {!MediaCapabilitiesKeySystemConfiguration} mcapKeySystemConfig The\n * 'keySystemConfiguration' field of the MediaDecodingConfiguration.\n * @return {Promise<MediaKeySystemAccess>}\n * @private\n */\n static async checkDrmSupport_(videoConfig, audioConfig, mcapKeySystemConfig) {\n const MimeUtils = shaka.util.MimeUtils;\n const audioCapabilities = [];\n const videoCapabilities = [];\n\n if (mcapKeySystemConfig.audio) {\n const capability = {\n robustness: mcapKeySystemConfig.audio.robustness || '',\n contentType: audioConfig.contentType,\n };\n\n // Some Tizen devices seem to misreport AC-3 support, but correctly\n // report EC-3 support. So query EC-3 as a fallback for AC-3.\n // See https://github.com/shaka-project/shaka-player/issues/2989 for\n // details.\n if (shaka.util.Platform.isTizen() &&\n audioConfig.contentType.includes('codecs=\"ac-3\"')) {\n capability.contentType = 'audio/mp4; codecs=\"ec-3\"';\n }\n\n if (mcapKeySystemConfig.audio.encryptionScheme) {\n capability.encryptionScheme =\n mcapKeySystemConfig.audio.encryptionScheme;\n }\n\n audioCapabilities.push(capability);\n }\n\n if (mcapKeySystemConfig.video) {\n const capability = {\n robustness: mcapKeySystemConfig.video.robustness || '',\n contentType: videoConfig.contentType,\n };\n if (mcapKeySystemConfig.video.encryptionScheme) {\n capability.encryptionScheme =\n mcapKeySystemConfig.video.encryptionScheme;\n }\n videoCapabilities.push(capability);\n }\n\n /** @type {MediaKeySystemConfiguration} */\n const mediaKeySystemConfig = {\n initDataTypes: [mcapKeySystemConfig.initDataType],\n distinctiveIdentifier: mcapKeySystemConfig.distinctiveIdentifier,\n persistentState: mcapKeySystemConfig.persistentState,\n sessionTypes: mcapKeySystemConfig.sessionTypes,\n };\n\n // Only add audio / video capabilities if they have valid data.\n // Otherwise the query will fail.\n if (audioCapabilities.length) {\n mediaKeySystemConfig.audioCapabilities = audioCapabilities;\n }\n if (videoCapabilities.length) {\n mediaKeySystemConfig.videoCapabilities = videoCapabilities;\n }\n\n const videoMimeType = videoConfig ? videoConfig.contentType : '';\n const audioMimeType = audioConfig ? audioConfig.contentType : '';\n const videoCodec = MimeUtils.getBasicType(videoMimeType) + ';' +\n MimeUtils.getCodecBase(videoMimeType);\n const audioCodec = MimeUtils.getBasicType(audioMimeType) + ';' +\n MimeUtils.getCodecBase(audioMimeType);\n const keySystem = mcapKeySystemConfig.keySystem;\n\n /** @type {MediaKeySystemAccess} */\n let keySystemAccess = null;\n try {\n if (shaka.drm.DrmUtils.hasMediaKeySystemAccess(\n videoCodec, audioCodec, keySystem)) {\n keySystemAccess = shaka.drm.DrmUtils.getMediaKeySystemAccess(\n videoCodec, audioCodec, keySystem);\n } else {\n keySystemAccess = await navigator.requestMediaKeySystemAccess(\n mcapKeySystemConfig.keySystem, [mediaKeySystemConfig]);\n shaka.drm.DrmUtils.setMediaKeySystemAccess(\n videoCodec, audioCodec, keySystem, keySystemAccess);\n }\n } catch (e) {\n shaka.log.info('navigator.requestMediaKeySystemAccess failed.');\n }\n\n return keySystemAccess;\n }\n\n /**\n * Checks if the given media parameters of the video or audio streams are\n * supported by the Cast platform.\n * @param {!VideoConfiguration} videoConfig The 'video' field of the\n * MediaDecodingConfiguration.\n * @return {!Promise<boolean>} `true` when the stream can be displayed on a\n * Cast device.\n * @private\n */\n static async canCastDisplayType_(videoConfig) {\n if (!(window.cast &&\n cast.__platform__ && cast.__platform__.canDisplayType)) {\n shaka.log.warning('Expected cast APIs to be available! Falling back to ' +\n 'shaka.media.Capabilities.isTypeSupported() for type support.');\n return shaka.media.Capabilities.isTypeSupported(videoConfig.contentType);\n }\n\n let displayType = videoConfig.contentType;\n if (videoConfig.width && videoConfig.height) {\n // All Chromecast can support 720p videos\n if (videoConfig.width > 1280 && videoConfig.height > 720) {\n displayType +=\n `; width=${videoConfig.width}; height=${videoConfig.height}`;\n }\n }\n if (videoConfig.framerate) {\n // All Chromecast can support a framerate of 24, 25 or 30.\n const framerate = Math.round(videoConfig.framerate);\n if (framerate < 24 || framerate > 30) {\n displayType += `; framerate=${videoConfig.framerate}`;\n }\n }\n\n // Don't trust Closure types here. Although transferFunction is string or\n // undefined, we don't want to count on the input type. A switch statement\n // will, however, differentiate between null and undefined. So we default\n // to a blank string.\n const transferFunction = videoConfig.transferFunction || '';\n\n // Based on internal sources. Googlers, see go/cast-hdr-queries for source.\n switch (transferFunction) {\n // The empty case falls through to SDR.\n case '':\n // These are the only 3 values defined by MCap as of November 2024.\n case 'srgb':\n // https://en.wikipedia.org/wiki/Standard-dynamic-range_video\n // https://en.wikipedia.org/wiki/SRGB\n // https://en.wikipedia.org/wiki/Rec._709\n // This is SDR, standardized in BT 709.\n // The platform recognizes \"eotf=bt709\", but we can also omit it.\n break;\n\n case 'pq':\n // https://en.wikipedia.org/wiki/Perceptual_quantizer\n // This HDR transfer function is standardized as SMPTE ST 2084.\n displayType += '; eotf=smpte2084';\n break;\n\n case 'hlg':\n // https://en.wikipedia.org/wiki/Hybrid_log%E2%80%93gamma\n // This HDR transfer function is standardized as ARIB STD-B67.\n displayType += '; eotf=arib-std-b67';\n break;\n\n default:\n // An unrecognized transfer function. Reject this query.\n return false;\n }\n\n let result = false;\n const memoizedCanDisplayTypeRequests =\n shaka.polyfill.MediaCapabilities.memoizedCanDisplayTypeRequests_;\n if (memoizedCanDisplayTypeRequests.has(displayType)) {\n result = memoizedCanDisplayTypeRequests.get(displayType);\n } else {\n result = await cast.__platform__.canDisplayType(displayType);\n memoizedCanDisplayTypeRequests.set(displayType, result);\n }\n return result;\n }\n};\n\n/**\n * A copy of the MediaCapabilities instance, to prevent Safari from\n * garbage-collecting the polyfilled method on it. We make it public and export\n * it to ensure that it is not stripped out by the compiler.\n *\n * @type {MediaCapabilities}\n * @export\n */\nshaka.polyfill.MediaCapabilities.originalMcap = null;\n\n/**\n * A cache that stores the canDisplayType result of calling\n * `cast.__platform__.canDisplayType`.\n *\n * @type {Map<string, boolean>}\n * @private\n */\nshaka.polyfill.MediaCapabilities.memoizedCanDisplayTypeRequests_ = new Map();\n\n// Install at a lower priority than MediaSource polyfill, so that we have\n// MediaSource available first.\nshaka.polyfill.register(shaka.polyfill.MediaCapabilities.install, -1);\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.polyfill.PatchedMediaKeysApple');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.drm.DrmUtils');\ngoog.require('shaka.log');\ngoog.require('shaka.polyfill');\ngoog.require('shaka.util.BufferUtils');\ngoog.require('shaka.util.EventManager');\ngoog.require('shaka.util.FakeEvent');\ngoog.require('shaka.util.FakeEventTarget');\ngoog.require('shaka.util.MediaReadyState');\ngoog.require('shaka.util.PublicPromise');\ngoog.require('shaka.util.StreamUtils');\ngoog.require('shaka.util.StringUtils');\n\n\n/**\n * @summary A polyfill to implement modern, standardized EME on top of Apple's\n * prefixed EME in Safari.\n * @export\n */\nshaka.polyfill.PatchedMediaKeysApple = class {\n /**\n * Installs the polyfill if needed.\n */\n static defaultInstall() {\n if (!window.HTMLVideoElement || !window.WebKitMediaKeys) {\n // No HTML5 video or no prefixed EME.\n return;\n }\n if (navigator.requestMediaKeySystemAccess &&\n // eslint-disable-next-line no-restricted-syntax\n MediaKeySystemAccess.prototype.getConfiguration) {\n // Unprefixed EME available\n return;\n }\n // If there is no unprefixed EME and prefixed EME exists, apply installation\n // by default. Eg: older versions of Safari.\n shaka.polyfill.PatchedMediaKeysApple.install();\n }\n\n /**\n * Installs the polyfill if needed.\n * @param {boolean=} enableUninstall enables uninstalling the polyfill\n * @export\n */\n static install(enableUninstall = false) {\n // Alias\n const PatchedMediaKeysApple = shaka.polyfill.PatchedMediaKeysApple;\n\n if (!window.HTMLVideoElement || !window.WebKitMediaKeys) {\n // No HTML5 video or no prefixed EME.\n return;\n }\n\n if (enableUninstall) {\n PatchedMediaKeysApple.enableUninstall = true;\n PatchedMediaKeysApple.originalHTMLMediaElementPrototypeMediaKeys =\n /** @type {!Object} */ (\n Object.getOwnPropertyDescriptor(\n // eslint-disable-next-line no-restricted-syntax\n HTMLMediaElement.prototype, 'mediaKeys',\n )\n );\n PatchedMediaKeysApple.originalHTMLMediaElementPrototypeSetMediaKeys =\n // eslint-disable-next-line no-restricted-syntax\n HTMLMediaElement.prototype.setMediaKeys;\n PatchedMediaKeysApple.originalWindowMediaKeys = window.MediaKeys;\n PatchedMediaKeysApple.originalWindowMediaKeySystemAccess =\n window.MediaKeySystemAccess;\n PatchedMediaKeysApple.originalNavigatorRequestMediaKeySystemAccess =\n navigator.requestMediaKeySystemAccess;\n }\n\n shaka.log.info('Using Apple-prefixed EME');\n\n // Delete mediaKeys to work around strict mode compatibility issues.\n // eslint-disable-next-line no-restricted-syntax\n delete HTMLMediaElement.prototype['mediaKeys'];\n // Work around read-only declaration for mediaKeys by using a string.\n // eslint-disable-next-line no-restricted-syntax\n HTMLMediaElement.prototype['mediaKeys'] = null;\n // eslint-disable-next-line no-restricted-syntax\n HTMLMediaElement.prototype.setMediaKeys =\n PatchedMediaKeysApple.setMediaKeys;\n\n // Install patches\n window.MediaKeys = PatchedMediaKeysApple.MediaKeys;\n window.MediaKeySystemAccess = PatchedMediaKeysApple.MediaKeySystemAccess;\n navigator.requestMediaKeySystemAccess =\n PatchedMediaKeysApple.requestMediaKeySystemAccess;\n\n window.shakaMediaKeysPolyfill = PatchedMediaKeysApple.apiName_;\n\n shaka.util.StreamUtils.clearDecodingConfigCache();\n shaka.drm.DrmUtils.clearMediaKeySystemAccessMap();\n }\n\n /**\n * Uninstalls the polyfill if needed and enabled.\n * @export\n */\n static uninstall() {\n // Alias\n const PatchedMediaKeysApple = shaka.polyfill.PatchedMediaKeysApple;\n\n if (!PatchedMediaKeysApple.enableUninstall) {\n return;\n }\n\n shaka.log.info('Un-installing Apple-prefixed EME');\n\n PatchedMediaKeysApple.enableUninstall = false;\n Object.defineProperty(\n // eslint-disable-next-line no-restricted-syntax\n HTMLMediaElement.prototype,\n 'mediaKeys',\n PatchedMediaKeysApple.originalHTMLMediaElementPrototypeMediaKeys,\n );\n // eslint-disable-next-line no-restricted-syntax\n HTMLMediaElement.prototype.setMediaKeys =\n PatchedMediaKeysApple.originalHTMLMediaElementPrototypeSetMediaKeys;\n window.MediaKeys = PatchedMediaKeysApple.originalWindowMediaKeys;\n window.MediaKeySystemAccess =\n PatchedMediaKeysApple.originalWindowMediaKeySystemAccess;\n navigator.requestMediaKeySystemAccess =\n PatchedMediaKeysApple.originalNavigatorRequestMediaKeySystemAccess;\n\n PatchedMediaKeysApple.originalWindowMediaKeys = null;\n PatchedMediaKeysApple.originalWindowMediaKeySystemAccess = null;\n PatchedMediaKeysApple.originalHTMLMediaElementPrototypeSetMediaKeys = null;\n PatchedMediaKeysApple.originalNavigatorRequestMediaKeySystemAccess = null;\n PatchedMediaKeysApple.originalHTMLMediaElementPrototypeMediaKeys = null;\n\n window.shakaMediaKeysPolyfill = '';\n\n shaka.util.StreamUtils.clearDecodingConfigCache();\n shaka.drm.DrmUtils.clearMediaKeySystemAccessMap();\n }\n\n /**\n * An implementation of navigator.requestMediaKeySystemAccess.\n * Retrieves a MediaKeySystemAccess object.\n *\n * @this {!Navigator}\n * @param {string} keySystem\n * @param {!Array<!MediaKeySystemConfiguration>} supportedConfigurations\n * @return {!Promise<!MediaKeySystemAccess>}\n */\n static requestMediaKeySystemAccess(keySystem, supportedConfigurations) {\n shaka.log.debug('PatchedMediaKeysApple.requestMediaKeySystemAccess');\n goog.asserts.assert(this == navigator,\n 'bad \"this\" for requestMediaKeySystemAccess');\n\n // Alias.\n const PatchedMediaKeysApple = shaka.polyfill.PatchedMediaKeysApple;\n try {\n const access = new PatchedMediaKeysApple.MediaKeySystemAccess(\n keySystem, supportedConfigurations);\n return Promise.resolve(/** @type {!MediaKeySystemAccess} */ (access));\n } catch (exception) {\n return Promise.reject(exception);\n }\n }\n\n /**\n * An implementation of HTMLMediaElement.prototype.setMediaKeys.\n * Attaches a MediaKeys object to the media element.\n *\n * @this {!HTMLMediaElement}\n * @param {MediaKeys} mediaKeys\n * @return {!Promise}\n */\n static setMediaKeys(mediaKeys) {\n shaka.log.debug('PatchedMediaKeysApple.setMediaKeys');\n goog.asserts.assert(this instanceof HTMLMediaElement,\n 'bad \"this\" for setMediaKeys');\n\n // Alias\n const PatchedMediaKeysApple = shaka.polyfill.PatchedMediaKeysApple;\n\n const newMediaKeys =\n /** @type {shaka.polyfill.PatchedMediaKeysApple.MediaKeys} */ (\n mediaKeys);\n const oldMediaKeys =\n /** @type {shaka.polyfill.PatchedMediaKeysApple.MediaKeys} */ (\n this.mediaKeys);\n\n if (oldMediaKeys && oldMediaKeys != newMediaKeys) {\n goog.asserts.assert(\n oldMediaKeys instanceof PatchedMediaKeysApple.MediaKeys,\n 'non-polyfill instance of oldMediaKeys');\n // Have the old MediaKeys stop listening to events on the video tag.\n oldMediaKeys.setMedia(null);\n }\n\n delete this['mediaKeys']; // in case there is an existing getter\n this['mediaKeys'] = mediaKeys; // work around read-only declaration\n\n if (newMediaKeys) {\n goog.asserts.assert(\n newMediaKeys instanceof PatchedMediaKeysApple.MediaKeys,\n 'non-polyfill instance of newMediaKeys');\n return newMediaKeys.setMedia(this);\n }\n\n return Promise.resolve();\n }\n\n /**\n * Handler for the native media elements webkitneedkey event.\n *\n * @this {!HTMLMediaElement}\n * @param {!MediaKeyEvent} event\n * @suppress {constantProperty} We reassign what would be const on a real\n * MediaEncryptedEvent, but in our look-alike event.\n * @private\n */\n static onWebkitNeedKey_(event) {\n shaka.log.debug('PatchedMediaKeysApple.onWebkitNeedKey_', event);\n\n const PatchedMediaKeysApple = shaka.polyfill.PatchedMediaKeysApple;\n const mediaKeys =\n /** @type {shaka.polyfill.PatchedMediaKeysApple.MediaKeys} */(\n this.mediaKeys);\n goog.asserts.assert(mediaKeys instanceof PatchedMediaKeysApple.MediaKeys,\n 'non-polyfill instance of newMediaKeys');\n\n goog.asserts.assert(event.initData != null, 'missing init data!');\n\n // Convert the prefixed init data to match the native 'encrypted' event.\n const uint8 = shaka.util.BufferUtils.toUint8(event.initData);\n const dataview = shaka.util.BufferUtils.toDataView(uint8);\n // The first part is a 4 byte little-endian int, which is the length of\n // the second part.\n const length = dataview.getUint32(\n /* position= */ 0, /* littleEndian= */ true);\n if (length + 4 != uint8.byteLength) {\n throw new RangeError('Malformed FairPlay init data');\n }\n // The remainder is a UTF-16 skd URL. Convert this to UTF-8 and pass on.\n const str = shaka.util.StringUtils.fromUTF16(\n uint8.subarray(4), /* littleEndian= */ true);\n const initData = shaka.util.StringUtils.toUTF8(str);\n\n // NOTE: Because \"this\" is a real EventTarget, the event we dispatch here\n // must also be a real Event.\n const event2 = new Event('encrypted');\n\n const encryptedEvent =\n /** @type {!MediaEncryptedEvent} */(/** @type {?} */(event2));\n encryptedEvent.initDataType = 'skd';\n encryptedEvent.initData = shaka.util.BufferUtils.toArrayBuffer(initData);\n\n this.dispatchEvent(event2);\n }\n};\n\n\n/**\n * An implementation of MediaKeySystemAccess.\n *\n * @implements {MediaKeySystemAccess}\n */\nshaka.polyfill.PatchedMediaKeysApple.MediaKeySystemAccess = class {\n /**\n * @param {string} keySystem\n * @param {!Array<!MediaKeySystemConfiguration>} supportedConfigurations\n */\n constructor(keySystem, supportedConfigurations) {\n shaka.log.debug('PatchedMediaKeysApple.MediaKeySystemAccess');\n\n /** @type {string} */\n this.keySystem = keySystem;\n\n /** @private {!MediaKeySystemConfiguration} */\n this.configuration_;\n\n // Optimization: WebKitMediaKeys.isTypeSupported delays responses by a\n // significant amount of time, possibly to discourage fingerprinting.\n // Since we know only FairPlay is supported here, let's skip queries for\n // anything else to speed up the process.\n if (keySystem.startsWith('com.apple.fps')) {\n for (const cfg of supportedConfigurations) {\n const newCfg = this.checkConfig_(cfg);\n if (newCfg) {\n this.configuration_ = newCfg;\n return;\n }\n }\n }\n\n // According to the spec, this should be a DOMException, but there is not a\n // public constructor for that. So we make this look-alike instead.\n const unsupportedKeySystemError = new Error('Unsupported keySystem');\n unsupportedKeySystemError.name = 'NotSupportedError';\n unsupportedKeySystemError['code'] = DOMException.NOT_SUPPORTED_ERR;\n throw unsupportedKeySystemError;\n }\n\n /**\n * Check a single config for MediaKeySystemAccess.\n *\n * @param {MediaKeySystemConfiguration} cfg The requested config.\n * @return {?MediaKeySystemConfiguration} A matching config we can support, or\n * null if the input is not supportable.\n * @private\n */\n checkConfig_(cfg) {\n if (cfg.persistentState == 'required') {\n // Not supported by the prefixed API.\n return null;\n }\n\n // Create a new config object and start adding in the pieces which we find\n // support for. We will return this from getConfiguration() later if\n // asked.\n\n /** @type {!MediaKeySystemConfiguration} */\n const newCfg = {\n 'audioCapabilities': [],\n 'videoCapabilities': [],\n // It is technically against spec to return these as optional, but we\n // don't truly know their values from the prefixed API:\n 'persistentState': 'optional',\n 'distinctiveIdentifier': 'optional',\n // Pretend the requested init data types are supported, since we don't\n // really know that either:\n 'initDataTypes': cfg.initDataTypes,\n 'sessionTypes': ['temporary'],\n 'label': cfg.label,\n };\n\n // PatchedMediaKeysApple tests for key system availability through\n // WebKitMediaKeys.isTypeSupported.\n let ranAnyTests = false;\n let success = false;\n\n if (cfg.audioCapabilities) {\n for (const cap of cfg.audioCapabilities) {\n if (cap.contentType) {\n ranAnyTests = true;\n\n const contentType = cap.contentType.split(';')[0];\n if (WebKitMediaKeys.isTypeSupported(this.keySystem, contentType)) {\n newCfg.audioCapabilities.push(cap);\n success = true;\n }\n }\n }\n }\n\n if (cfg.videoCapabilities) {\n for (const cap of cfg.videoCapabilities) {\n if (cap.contentType) {\n ranAnyTests = true;\n\n const contentType = cap.contentType.split(';')[0];\n if (WebKitMediaKeys.isTypeSupported(this.keySystem, contentType)) {\n newCfg.videoCapabilities.push(cap);\n success = true;\n }\n }\n }\n }\n\n if (!ranAnyTests) {\n // If no specific types were requested, we check all common types to\n // find out if the key system is present at all.\n success = WebKitMediaKeys.isTypeSupported(this.keySystem, 'video/mp4');\n }\n\n if (success) {\n return newCfg;\n }\n return null;\n }\n\n /** @override */\n createMediaKeys() {\n shaka.log.debug(\n 'PatchedMediaKeysApple.MediaKeySystemAccess.createMediaKeys');\n\n // Alias\n const PatchedMediaKeysApple = shaka.polyfill.PatchedMediaKeysApple;\n\n const mediaKeys = new PatchedMediaKeysApple.MediaKeys(this.keySystem);\n return Promise.resolve(/** @type {!MediaKeys} */ (mediaKeys));\n }\n\n /** @override */\n getConfiguration() {\n shaka.log.debug(\n 'PatchedMediaKeysApple.MediaKeySystemAccess.getConfiguration');\n return this.configuration_;\n }\n};\n\n\n/**\n * An implementation of MediaKeys.\n *\n * @implements {MediaKeys}\n */\nshaka.polyfill.PatchedMediaKeysApple.MediaKeys = class {\n /** @param {string} keySystem */\n constructor(keySystem) {\n shaka.log.debug('PatchedMediaKeysApple.MediaKeys');\n\n /** @private {!WebKitMediaKeys} */\n this.nativeMediaKeys_ = new WebKitMediaKeys(keySystem);\n\n /** @private {!shaka.util.EventManager} */\n this.eventManager_ = new shaka.util.EventManager();\n }\n\n /** @override */\n createSession(sessionType) {\n shaka.log.debug('PatchedMediaKeysApple.MediaKeys.createSession');\n\n sessionType = sessionType || 'temporary';\n // For now, only the 'temporary' type is supported.\n if (sessionType != 'temporary') {\n throw new TypeError('Session type ' + sessionType +\n ' is unsupported on this platform.');\n }\n\n // Alias\n const PatchedMediaKeysApple = shaka.polyfill.PatchedMediaKeysApple;\n\n return new PatchedMediaKeysApple.MediaKeySession(\n this.nativeMediaKeys_, sessionType);\n }\n\n /** @override */\n setServerCertificate(serverCertificate) {\n shaka.log.debug('PatchedMediaKeysApple.MediaKeys.setServerCertificate');\n return Promise.resolve(false);\n }\n\n /**\n * @param {HTMLMediaElement} media\n * @protected\n * @return {!Promise}\n */\n setMedia(media) {\n // Alias\n const PatchedMediaKeysApple = shaka.polyfill.PatchedMediaKeysApple;\n\n // Remove any old listeners.\n this.eventManager_.removeAll();\n\n // It is valid for media to be null; null is used to flag that event\n // handlers need to be cleaned up.\n if (!media) {\n return Promise.resolve();\n }\n\n // Intercept and translate these prefixed EME events.\n this.eventManager_.listen(media, 'webkitneedkey',\n /** @type {shaka.util.EventManager.ListenerType} */\n (PatchedMediaKeysApple.onWebkitNeedKey_));\n\n // Wrap native HTMLMediaElement.webkitSetMediaKeys with a Promise.\n try {\n // Some browsers require that readyState >=1 before mediaKeys can be\n // set, so check this and wait for loadedmetadata if we are not in the\n // correct state\n shaka.util.MediaReadyState.waitForReadyState(media,\n HTMLMediaElement.HAVE_METADATA,\n this.eventManager_, () => {\n media.webkitSetMediaKeys(this.nativeMediaKeys_);\n });\n\n return Promise.resolve();\n } catch (exception) {\n return Promise.reject(exception);\n }\n }\n\n /** @override */\n getStatusForPolicy(policy) {\n return Promise.resolve('usable');\n }\n};\n\n\n/**\n * An implementation of MediaKeySession.\n *\n * @implements {MediaKeySession}\n */\nshaka.polyfill.PatchedMediaKeysApple.MediaKeySession =\nclass extends shaka.util.FakeEventTarget {\n /**\n * @param {WebKitMediaKeys} nativeMediaKeys\n * @param {string} sessionType\n */\n constructor(nativeMediaKeys, sessionType) {\n shaka.log.debug('PatchedMediaKeysApple.MediaKeySession');\n super();\n\n /**\n * The native MediaKeySession, which will be created in generateRequest.\n * @private {WebKitMediaKeySession}\n */\n this.nativeMediaKeySession_ = null;\n\n /** @private {WebKitMediaKeys} */\n this.nativeMediaKeys_ = nativeMediaKeys;\n\n // Promises that are resolved later\n /** @private {shaka.util.PublicPromise} */\n this.generateRequestPromise_ = null;\n\n /** @private {shaka.util.PublicPromise} */\n this.updatePromise_ = null;\n\n /** @private {!shaka.util.EventManager} */\n this.eventManager_ = new shaka.util.EventManager();\n\n /** @type {string} */\n this.sessionId = '';\n\n /** @type {number} */\n this.expiration = NaN;\n\n /** @type {!shaka.util.PublicPromise} */\n this.closed = new shaka.util.PublicPromise();\n\n /** @type {!shaka.polyfill.PatchedMediaKeysApple.MediaKeyStatusMap} */\n this.keyStatuses =\n new shaka.polyfill.PatchedMediaKeysApple.MediaKeyStatusMap();\n }\n\n /** @override */\n generateRequest(initDataType, initData) {\n shaka.log.debug(\n 'PatchedMediaKeysApple.MediaKeySession.generateRequest');\n\n this.generateRequestPromise_ = new shaka.util.PublicPromise();\n\n try {\n // This EME spec version requires a MIME content type as the 1st param to\n // createSession, but doesn't seem to matter what the value is.\n // It also only accepts Uint8Array, not ArrayBuffer, so explicitly make\n // initData into a Uint8Array.\n const session = this.nativeMediaKeys_.createSession(\n 'video/mp4', shaka.util.BufferUtils.toUint8(initData));\n this.nativeMediaKeySession_ = session;\n this.sessionId = session.sessionId || '';\n\n // Attach session event handlers here.\n this.eventManager_.listen(\n this.nativeMediaKeySession_, 'webkitkeymessage',\n /** @type {shaka.util.EventManager.ListenerType} */\n ((event) => this.onWebkitKeyMessage_(event)));\n this.eventManager_.listen(session, 'webkitkeyadded',\n /** @type {shaka.util.EventManager.ListenerType} */\n ((event) => this.onWebkitKeyAdded_(event)));\n this.eventManager_.listen(session, 'webkitkeyerror',\n /** @type {shaka.util.EventManager.ListenerType} */\n ((event) => this.onWebkitKeyError_(event)));\n\n this.updateKeyStatus_('status-pending');\n } catch (exception) {\n this.generateRequestPromise_.reject(exception);\n }\n\n return this.generateRequestPromise_;\n }\n\n /** @override */\n load() {\n shaka.log.debug('PatchedMediaKeysApple.MediaKeySession.load');\n\n return Promise.reject(new Error('MediaKeySession.load not yet supported'));\n }\n\n /** @override */\n update(response) {\n shaka.log.debug('PatchedMediaKeysApple.MediaKeySession.update');\n\n this.updatePromise_ = new shaka.util.PublicPromise();\n\n try {\n // Pass through to the native session.\n this.nativeMediaKeySession_.update(\n shaka.util.BufferUtils.toUint8(response));\n } catch (exception) {\n this.updatePromise_.reject(exception);\n }\n\n return this.updatePromise_;\n }\n\n /** @override */\n close() {\n shaka.log.debug('PatchedMediaKeysApple.MediaKeySession.close');\n\n try {\n // Pass through to the native session.\n this.nativeMediaKeySession_.close();\n\n this.closed.resolve();\n this.eventManager_.removeAll();\n } catch (exception) {\n this.closed.reject(exception);\n }\n\n return this.closed;\n }\n\n /** @override */\n remove() {\n shaka.log.debug('PatchedMediaKeysApple.MediaKeySession.remove');\n\n return Promise.reject(new Error(\n 'MediaKeySession.remove is only applicable for persistent licenses, ' +\n 'which are not supported on this platform'));\n }\n\n /**\n * Handler for the native keymessage event on WebKitMediaKeySession.\n *\n * @param {!MediaKeyEvent} event\n * @private\n */\n onWebkitKeyMessage_(event) {\n shaka.log.debug('PatchedMediaKeysApple.onWebkitKeyMessage_', event);\n\n // We can now resolve this.generateRequestPromise, which should be non-null.\n goog.asserts.assert(this.generateRequestPromise_,\n 'generateRequestPromise_ should be set before now!');\n if (this.generateRequestPromise_) {\n this.generateRequestPromise_.resolve();\n this.generateRequestPromise_ = null;\n }\n\n const isNew = this.keyStatuses.getStatus() == undefined;\n\n const data = new Map()\n .set('messageType', isNew ? 'license-request' : 'license-renewal')\n .set('message', shaka.util.BufferUtils.toArrayBuffer(event.message));\n const event2 = new shaka.util.FakeEvent('message', data);\n\n this.dispatchEvent(event2);\n }\n\n /**\n * Handler for the native keyadded event on WebKitMediaKeySession.\n *\n * @param {!MediaKeyEvent} event\n * @private\n */\n onWebkitKeyAdded_(event) {\n shaka.log.debug('PatchedMediaKeysApple.onWebkitKeyAdded_', event);\n\n // This shouldn't fire while we're in the middle of generateRequest,\n // but if it does, we will need to change the logic to account for it.\n goog.asserts.assert(!this.generateRequestPromise_,\n 'Key added during generate!');\n\n // We can now resolve this.updatePromise, which should be non-null.\n goog.asserts.assert(this.updatePromise_,\n 'updatePromise_ should be set before now!');\n if (this.updatePromise_) {\n this.updateKeyStatus_('usable');\n this.updatePromise_.resolve();\n this.updatePromise_ = null;\n }\n }\n\n /**\n * Handler for the native keyerror event on WebKitMediaKeySession.\n *\n * @param {!MediaKeyEvent} event\n * @private\n */\n onWebkitKeyError_(event) {\n shaka.log.debug('PatchedMediaKeysApple.onWebkitKeyError_', event);\n\n const error = new Error('EME PatchedMediaKeysApple key error');\n error['errorCode'] = this.nativeMediaKeySession_.error;\n\n if (this.generateRequestPromise_ != null) {\n this.generateRequestPromise_.reject(error);\n this.generateRequestPromise_ = null;\n } else if (this.updatePromise_ != null) {\n this.updatePromise_.reject(error);\n this.updatePromise_ = null;\n } else {\n // Unexpected error - map native codes to standardised key statuses.\n // Possible values of this.nativeMediaKeySession_.error.code:\n // MEDIA_KEYERR_UNKNOWN = 1\n // MEDIA_KEYERR_CLIENT = 2\n // MEDIA_KEYERR_SERVICE = 3\n // MEDIA_KEYERR_OUTPUT = 4\n // MEDIA_KEYERR_HARDWARECHANGE = 5\n // MEDIA_KEYERR_DOMAIN = 6\n\n switch (this.nativeMediaKeySession_.error.code) {\n case WebKitMediaKeyError.MEDIA_KEYERR_OUTPUT:\n case WebKitMediaKeyError.MEDIA_KEYERR_HARDWARECHANGE:\n this.updateKeyStatus_('output-not-allowed');\n break;\n default:\n this.updateKeyStatus_('internal-error');\n break;\n }\n }\n }\n\n /**\n * Updates key status and dispatch a 'keystatuseschange' event.\n *\n * @param {string} status\n * @private\n */\n updateKeyStatus_(status) {\n this.keyStatuses.setStatus(status);\n const event = new shaka.util.FakeEvent('keystatuseschange');\n this.dispatchEvent(event);\n }\n};\n\n\n/**\n * @summary An implementation of MediaKeyStatusMap.\n * This fakes a map with a single key ID.\n *\n * @todo Consolidate the MediaKeyStatusMap types in these polyfills.\n * @implements {MediaKeyStatusMap}\n */\nshaka.polyfill.PatchedMediaKeysApple.MediaKeyStatusMap = class {\n /** */\n constructor() {\n /**\n * @type {number}\n */\n this.size = 0;\n\n /**\n * @private {string|undefined}\n */\n this.status_ = undefined;\n }\n\n /**\n * An internal method used by the session to set key status.\n * @param {string|undefined} status\n */\n setStatus(status) {\n this.size = status == undefined ? 0 : 1;\n this.status_ = status;\n }\n\n /**\n * An internal method used by the session to get key status.\n * @return {string|undefined}\n */\n getStatus() {\n return this.status_;\n }\n\n /** @override */\n forEach(fn) {\n if (this.status_) {\n fn(this.status_, shaka.drm.DrmUtils.DUMMY_KEY_ID.value());\n }\n }\n\n /** @override */\n get(keyId) {\n if (this.has(keyId)) {\n return this.status_;\n }\n return undefined;\n }\n\n /** @override */\n has(keyId) {\n const fakeKeyId = shaka.drm.DrmUtils.DUMMY_KEY_ID.value();\n if (this.status_ && shaka.util.BufferUtils.equal(keyId, fakeKeyId)) {\n return true;\n }\n return false;\n }\n\n /**\n * @suppress {missingReturn}\n * @override\n */\n entries() {\n goog.asserts.assert(false, 'Not used! Provided only for the compiler.');\n }\n\n /**\n * @suppress {missingReturn}\n * @override\n */\n keys() {\n goog.asserts.assert(false, 'Not used! Provided only for the compiler.');\n }\n\n /**\n * @suppress {missingReturn}\n * @override\n */\n values() {\n goog.asserts.assert(false, 'Not used! Provided only for the compiler.');\n }\n};\n\n/**\n * API name.\n *\n * @private {string}\n */\nshaka.polyfill.PatchedMediaKeysApple.apiName_ = 'apple';\n\nshaka.polyfill.register(shaka.polyfill.PatchedMediaKeysApple.defaultInstall);\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.polyfill.MediaSource');\n\ngoog.require('shaka.log');\ngoog.require('shaka.polyfill');\ngoog.require('shaka.util.MimeUtils');\ngoog.require('shaka.util.Platform');\n\n/**\n * @summary A polyfill to patch MSE bugs.\n * @export\n */\nshaka.polyfill.MediaSource = class {\n /**\n * Install the polyfill if needed.\n * @export\n */\n static install() {\n shaka.log.debug('MediaSource.install');\n\n // MediaSource bugs are difficult to detect without checking for the\n // affected platform. SourceBuffer is not always exposed on window, for\n // example, and instances are only accessible after setting up MediaSource\n // on a video element. Because of this, we use UA detection and other\n // platform detection tricks to decide which patches to install.\n const safariVersion = shaka.util.Platform.safariVersion();\n\n if (!window.MediaSource && !window.ManagedMediaSource) {\n shaka.log.info('No MSE implementation available.');\n } else if (safariVersion && window.MediaSource) {\n // NOTE: shaka.Player.isBrowserSupported() has its own restrictions on\n // Safari version.\n if (safariVersion <= 12) {\n shaka.log.info('Patching Safari 8-12 MSE bugs.');\n // Safari 8 does not implement appendWindowEnd.\n // Safari 10 fires spurious 'updateend' events after endOfStream().\n // We do not have patches for these bugs here.\n\n // Safari 8-12 do not correctly implement abort() on SourceBuffer.\n // Calling abort() before appending a segment causes that segment to be\n // incomplete in the buffer.\n // Bug filed: https://bugs.webkit.org/show_bug.cgi?id=165342\n shaka.polyfill.MediaSource.stubAbort_();\n\n // If you remove up to a keyframe, Safari 8-12 incorrectly will also\n // remove that keyframe and the content up to the next.\n // Offsetting the end of the removal range seems to help.\n // Bug filed: https://bugs.webkit.org/show_bug.cgi?id=177884\n shaka.polyfill.MediaSource.patchRemovalRange_();\n } else if (safariVersion <= 15) {\n shaka.log.info('Patching Safari 13 & 14 & 15 MSE bugs.');\n // Safari 13 does not correctly implement abort() on SourceBuffer.\n // Calling abort() before appending a segment causes that segment to be\n // incomplete in the buffer.\n // Bug filed: https://bugs.webkit.org/show_bug.cgi?id=165342\n shaka.polyfill.MediaSource.stubAbort_();\n }\n } else if (shaka.util.Platform.isZenterio()) {\n // Zenterio uses WPE based on Webkit 607.x.x which do not correctly\n // implement abort() on SourceBuffer.\n // Calling abort() before appending a segment causes that segment to be\n // incomplete in the buffer.\n // Bug filed: https://bugs.webkit.org/show_bug.cgi?id=165342\n shaka.polyfill.MediaSource.stubAbort_();\n // If you remove up to a keyframe, Webkit 607.x.x incorrectly will also\n // remove that keyframe and the content up to the next.\n // Offsetting the end of the removal range seems to help.\n // Bug filed: https://bugs.webkit.org/show_bug.cgi?id=177884\n shaka.polyfill.MediaSource.patchRemovalRange_();\n } else if (shaka.util.Platform.isTizen2() ||\n shaka.util.Platform.isTizen3() ||\n shaka.util.Platform.isTizen4()) {\n shaka.log.info('Rejecting Opus.');\n // Tizen's implementation of MSE does not work well with opus. To prevent\n // the player from trying to play opus on Tizen, we will override media\n // source to always reject opus content.\n shaka.polyfill.MediaSource.rejectCodec_('opus');\n } else {\n shaka.log.info('Using native MSE as-is.');\n }\n\n if (window.MediaSource || window.ManagedMediaSource) {\n // TS content is broken on all browsers in general.\n // See https://github.com/shaka-project/shaka-player/issues/4955\n // See https://github.com/shaka-project/shaka-player/issues/5278\n // See https://github.com/shaka-project/shaka-player/issues/6334\n shaka.polyfill.MediaSource.rejectContainer_('mp2t');\n }\n\n if (window.MediaSource &&\n MediaSource.isTypeSupported('video/webm; codecs=\"vp9\"') &&\n !MediaSource.isTypeSupported('video/webm; codecs=\"vp09.00.10.08\"')) {\n shaka.log.info('Patching vp09 support queries.');\n // Only the old, deprecated style of VP9 codec strings is supported.\n // This occurs on older smart TVs.\n // Patch isTypeSupported to translate the new strings into the old one.\n shaka.polyfill.MediaSource.patchVp09_();\n }\n }\n\n /**\n * Stub out abort(). On some buggy MSE implementations, calling abort()\n * causes various problems.\n *\n * @private\n */\n static stubAbort_() {\n /* eslint-disable no-restricted-syntax */\n const addSourceBuffer = MediaSource.prototype.addSourceBuffer;\n MediaSource.prototype.addSourceBuffer = function(...varArgs) {\n const sourceBuffer = addSourceBuffer.apply(this, varArgs);\n sourceBuffer.abort = function() {}; // Stub out for buggy implementations.\n return sourceBuffer;\n };\n /* eslint-enable no-restricted-syntax */\n }\n\n /**\n * Patch remove(). On Safari 11, if you call remove() to remove the content\n * up to a keyframe, Safari will also remove the keyframe and all of the data\n * up to the next one. For example, if the keyframes are at 0s, 5s, and 10s,\n * and you tried to remove 0s-5s, it would instead remove 0s-10s.\n *\n * Offsetting the end of the range seems to be a usable workaround.\n *\n * @private\n */\n static patchRemovalRange_() {\n // eslint-disable-next-line no-restricted-syntax\n const originalRemove = SourceBuffer.prototype.remove;\n\n // eslint-disable-next-line no-restricted-syntax\n SourceBuffer.prototype.remove = function(startTime, endTime) {\n // eslint-disable-next-line no-restricted-syntax\n return originalRemove.call(this, startTime, endTime - 0.001);\n };\n }\n\n /**\n * Patch |MediaSource.isTypeSupported| to always reject |container|. This is\n * used when we know that we are on a platform that does not work well with\n * a given container.\n *\n * @param {string} container\n * @private\n */\n static rejectContainer_(container) {\n if (window.MediaSource) {\n const isTypeSupported =\n // eslint-disable-next-line no-restricted-syntax\n MediaSource.isTypeSupported.bind(MediaSource);\n\n MediaSource.isTypeSupported = (mimeType) => {\n const actualContainer = shaka.util.MimeUtils.getContainerType(mimeType);\n return actualContainer != container && isTypeSupported(mimeType);\n };\n }\n\n if (window.ManagedMediaSource) {\n const isTypeSupportedManaged =\n // eslint-disable-next-line no-restricted-syntax\n ManagedMediaSource.isTypeSupported.bind(ManagedMediaSource);\n\n window.ManagedMediaSource.isTypeSupported = (mimeType) => {\n const actualContainer = shaka.util.MimeUtils.getContainerType(mimeType);\n return actualContainer != container && isTypeSupportedManaged(mimeType);\n };\n }\n }\n\n /**\n * Patch |MediaSource.isTypeSupported| to always reject |codec|. This is used\n * when we know that we are on a platform that does not work well with a given\n * codec.\n *\n * @param {string} codec\n * @private\n */\n static rejectCodec_(codec) {\n const isTypeSupported =\n // eslint-disable-next-line no-restricted-syntax\n MediaSource.isTypeSupported.bind(MediaSource);\n\n MediaSource.isTypeSupported = (mimeType) => {\n const actualCodec = shaka.util.MimeUtils.getCodecBase(mimeType);\n return actualCodec != codec && isTypeSupported(mimeType);\n };\n\n if (window.ManagedMediaSource) {\n const isTypeSupportedManaged =\n // eslint-disable-next-line no-restricted-syntax\n ManagedMediaSource.isTypeSupported.bind(ManagedMediaSource);\n\n window.ManagedMediaSource.isTypeSupported = (mimeType) => {\n const actualCodec = shaka.util.MimeUtils.getCodecBase(mimeType);\n return actualCodec != codec && isTypeSupportedManaged(mimeType);\n };\n }\n }\n\n /**\n * Patch isTypeSupported() to translate vp09 codec strings into vp9, to allow\n * such content to play on older smart TVs.\n *\n * @private\n */\n static patchVp09_() {\n const originalIsTypeSupported = MediaSource.isTypeSupported;\n\n if (shaka.util.Platform.isWebOS()) {\n // Don't do this on LG webOS as otherwise it is unable\n // to play vp09 at all.\n return;\n }\n\n MediaSource.isTypeSupported = (mimeType) => {\n // Split the MIME type into its various parameters.\n const pieces = mimeType.split(/ *; */);\n\n const codecsIndex =\n pieces.findIndex((piece) => piece.startsWith('codecs='));\n if (codecsIndex < 0) {\n // No codec? Call the original without modifying the MIME type.\n return originalIsTypeSupported(mimeType);\n }\n\n const codecsParam = pieces[codecsIndex];\n const codecs = codecsParam\n .replace('codecs=', '').replace(/\"/g, '').split(/\\s*,\\s*/);\n\n const vp09Index = codecs.findIndex(\n (codecName) => codecName.startsWith('vp09'));\n if (vp09Index >= 0) {\n // vp09? Replace it with vp9.\n codecs[vp09Index] = 'vp9';\n pieces[codecsIndex] = 'codecs=\"' + codecs.join(',') + '\"';\n mimeType = pieces.join('; ');\n }\n\n return originalIsTypeSupported(mimeType);\n };\n }\n};\n\n\nshaka.polyfill.register(shaka.polyfill.MediaSource.install);\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.polyfill.Orientation');\n\ngoog.require('shaka.log');\ngoog.require('shaka.util.FakeEvent');\ngoog.require('shaka.util.FakeEventTarget');\ngoog.require('shaka.polyfill');\n\n\n/**\n * @summary A polyfill for systems that do not implement screen.orientation.\n * For now, this only handles systems that implement the deprecated\n * window.orientation feature... e.g. iPad.\n * @export\n */\nshaka.polyfill.Orientation = class {\n /**\n * Install the polyfill if needed.\n * @export\n */\n static install() {\n if (screen.orientation && screen.orientation.unlock) {\n // Not needed.\n shaka.log.info('Using native screen.orientation');\n return;\n }\n\n if (screen.orientation != undefined) {\n // There are some platforms where screen.orientation is defined but\n // incomplete (e.g. Safari).\n // Install a very simple polyfill in that case.\n shaka.polyfill.Orientation.installBasedOnScreenMethods_();\n } else if (window.orientation != undefined) {\n // There is no way to check to see if the 'orientationchange' event exists\n // on window, which could theoretically lead to this making a\n // screen.orientation object that doesn't actually work.\n // However, it looks like all platforms that support the deprecated\n // window.orientation feature also support that event.\n shaka.polyfill.Orientation.installBasedOnWindowMethods_();\n }\n }\n\n /**\n * Modifies screen.orientation to add no-ops for missing methods.\n * Meant for cases where screen.orientation is defined, but has missing\n * methods that cannot be properly polyfilled.\n * @private\n */\n static installBasedOnScreenMethods_() {\n if (screen.orientation.lock === undefined) {\n screen.orientation.lock = (orientation) => {\n shaka.log.info('screen.orientation.lock is a no-op');\n return Promise.resolve();\n };\n }\n if (screen.orientation.unlock === undefined) {\n screen.orientation.unlock = () => {\n shaka.log.info('screen.orientation.unlock is a no-op');\n };\n }\n }\n\n /**\n * Makes a polyfill for orientation, based on window methods.\n * Note that some of the features this is based on are deprecated, so this\n * will not necessarily work on all platforms.\n * @private\n */\n static installBasedOnWindowMethods_() {\n const orientation = new shaka.polyfill.Orientation.FakeOrientation();\n screen.orientation = /** @type {!ScreenOrientation} */ (orientation);\n const setValues = () => {\n switch (window.orientation) {\n case -90:\n orientation.type = 'landscape-secondary';\n orientation.angle = 270;\n break;\n case 0:\n orientation.type = 'portrait-primary';\n orientation.angle = 0;\n break;\n case 90:\n orientation.type = 'landscape-primary';\n orientation.angle = 90;\n break;\n case 180:\n orientation.type = 'portrait-secondary';\n orientation.angle = 180;\n break;\n }\n };\n\n setValues();\n window.addEventListener('orientationchange', () => {\n setValues();\n orientation.dispatchChangeEvent();\n });\n }\n};\n\n\nshaka.polyfill.Orientation.FakeOrientation =\nclass extends shaka.util.FakeEventTarget {\n /** */\n constructor() {\n super();\n\n /** @type {string} */\n this.type = '';\n\n /** @type {number} */\n this.angle = 0;\n }\n\n /** Dispatch a 'change' event. */\n dispatchChangeEvent() {\n const event = new shaka.util.FakeEvent('change');\n this.dispatchEvent(event);\n }\n\n /**\n * @param {string} orientation\n * @return {!Promise}\n */\n lock(orientation) {\n /**\n * @param {string} orientation\n * @return {boolean}\n */\n const lockOrientation = (orientation) => {\n if (screen.lockOrientation) {\n return screen.lockOrientation(orientation);\n }\n if (screen.mozLockOrientation) {\n return screen.mozLockOrientation(orientation);\n }\n if (screen.msLockOrientation) {\n return screen.msLockOrientation(orientation);\n }\n return false;\n };\n\n let success = false;\n // The set of input strings for screen.orientation.lock and for\n // screen.lockOrientation are almost, but not entirely, the same.\n switch (orientation) {\n case 'natural':\n success = lockOrientation('default');\n break;\n case 'any':\n // It's not quite clear what locking the screen orientation to 'any'\n // is supposed to mean... presumably, that's equivalent to not being\n // locked?\n success = true;\n this.unlock();\n break;\n default:\n success = lockOrientation(orientation);\n break;\n }\n // According to the docs, there \"may be a delay\" between the\n // lockOrientation method being called and the screen actually being\n // locked. Unfortunately, without any idea as to how long that delay is,\n // and with no events to listen for, we cannot account for it here.\n if (success) {\n return Promise.resolve();\n }\n // Either locking was not available, or the process failed... either way,\n // reject this with a mock error.\n // This should be a DOMException, but there is not a public constructor for\n // that. So we make this look-alike instead.\n const unsupportedKeySystemError =\n new Error('screen.orientation.lock() is not available on this device');\n unsupportedKeySystemError.name = 'NotSupportedError';\n unsupportedKeySystemError['code'] = DOMException.NOT_SUPPORTED_ERR;\n return Promise.reject(unsupportedKeySystemError);\n }\n\n /** Unlock the screen orientation. */\n unlock() {\n // screen.unlockOrientation has a return value, but\n // screen.orientation.unlock does not. So ignore the return value.\n if (screen.unlockOrientation) {\n screen.unlockOrientation();\n } else if (screen.mozUnlockOrientation) {\n screen.mozUnlockOrientation();\n } else if (screen.msUnlockOrientation) {\n screen.msUnlockOrientation();\n }\n }\n};\n\n\nshaka.polyfill.register(shaka.polyfill.Orientation.install);\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.polyfill.PatchedMediaKeysCert');\n\ngoog.require('shaka.log');\ngoog.require('shaka.polyfill');\ngoog.require('shaka.util.Platform');\n\n\n/**\n * @summary A polyfill to fix setServerCertificate implementation on\n * older platforms which claim to support modern EME.\n * @export\n */\nshaka.polyfill.PatchedMediaKeysCert = class {\n /**\n * Installs the polyfill if needed.\n * @export\n */\n static install() {\n if (!window.MediaKeys) {\n // No MediaKeys available\n return;\n }\n // eslint-disable-next-line no-restricted-syntax\n if (MediaKeys.prototype.setServerCertificate &&\n !shaka.polyfill.PatchedMediaKeysCert.hasInvalidImplementation_()) {\n // setServerCertificate is there and userAgent seems to be valid.\n return;\n }\n\n shaka.log.info('Patching MediaKeys.setServerCertificate');\n // eslint-disable-next-line no-restricted-syntax\n MediaKeys.prototype.setServerCertificate =\n shaka.polyfill.PatchedMediaKeysCert.setServerCertificate_;\n }\n\n /**\n * @param {!BufferSource} certificate\n * @return {!Promise<boolean>}\n * @private\n */\n static setServerCertificate_(certificate) {\n shaka.log.debug('PatchedMediaKeysCert.setServerCertificate');\n return Promise.resolve(false);\n }\n\n /**\n * @return {boolean}\n * @private\n */\n static hasInvalidImplementation_() {\n return shaka.util.Platform.isTizen3() || shaka.util.Platform.isTizen4() ||\n shaka.util.Platform.isTizen5_0() || shaka.util.Platform.isWebOS3();\n }\n};\n\nshaka.polyfill.register(shaka.polyfill.PatchedMediaKeysCert.install);\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.polyfill.PatchedMediaKeysWebkit');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.drm.DrmUtils');\ngoog.require('shaka.log');\ngoog.require('shaka.polyfill');\ngoog.require('shaka.util.BufferUtils');\ngoog.require('shaka.util.EventManager');\ngoog.require('shaka.util.FakeEvent');\ngoog.require('shaka.util.FakeEventTarget');\ngoog.require('shaka.util.PublicPromise');\ngoog.require('shaka.util.StringUtils');\ngoog.require('shaka.util.Timer');\ngoog.require('shaka.util.Uint8ArrayUtils');\n\n\n/**\n * @summary A polyfill to implement\n * {@link https://bit.ly/EmeMar15 EME draft 12 March 2015} on top of\n * webkit-prefixed {@link https://bit.ly/Eme01b EME v0.1b}.\n * @export\n */\nshaka.polyfill.PatchedMediaKeysWebkit = class {\n /**\n * Installs the polyfill if needed.\n * @export\n */\n static install() {\n // Alias.\n const PatchedMediaKeysWebkit = shaka.polyfill.PatchedMediaKeysWebkit;\n\n if (!window.HTMLVideoElement ||\n (navigator.requestMediaKeySystemAccess &&\n // eslint-disable-next-line no-restricted-syntax\n MediaKeySystemAccess.prototype.getConfiguration)) {\n return;\n }\n // eslint-disable-next-line no-restricted-syntax\n if (HTMLMediaElement.prototype.webkitGenerateKeyRequest) {\n shaka.log.info('Using webkit-prefixed EME v0.1b');\n PatchedMediaKeysWebkit.prefix_ = 'webkit';\n // eslint-disable-next-line no-restricted-syntax\n } else if (HTMLMediaElement.prototype.generateKeyRequest) {\n shaka.log.info('Using nonprefixed EME v0.1b');\n } else {\n return;\n }\n\n goog.asserts.assert(\n // eslint-disable-next-line no-restricted-syntax\n HTMLMediaElement.prototype[\n PatchedMediaKeysWebkit.prefixApi_('generateKeyRequest')],\n 'PatchedMediaKeysWebkit APIs not available!');\n\n // Install patches.\n navigator.requestMediaKeySystemAccess =\n PatchedMediaKeysWebkit.requestMediaKeySystemAccess;\n // Delete mediaKeys to work around strict mode compatibility issues.\n // eslint-disable-next-line no-restricted-syntax\n delete HTMLMediaElement.prototype['mediaKeys'];\n // Work around read-only declaration for mediaKeys by using a string.\n // eslint-disable-next-line no-restricted-syntax\n HTMLMediaElement.prototype['mediaKeys'] = null;\n // eslint-disable-next-line no-restricted-syntax\n HTMLMediaElement.prototype.setMediaKeys =\n PatchedMediaKeysWebkit.setMediaKeys;\n window.MediaKeys = PatchedMediaKeysWebkit.MediaKeys;\n window.MediaKeySystemAccess = PatchedMediaKeysWebkit.MediaKeySystemAccess;\n\n window.shakaMediaKeysPolyfill = PatchedMediaKeysWebkit.apiName_;\n }\n\n /**\n * Prefix the api with the stored prefix.\n *\n * @param {string} api\n * @return {string}\n * @private\n */\n static prefixApi_(api) {\n const prefix = shaka.polyfill.PatchedMediaKeysWebkit.prefix_;\n if (prefix) {\n return prefix + api.charAt(0).toUpperCase() + api.slice(1);\n }\n return api;\n }\n\n /**\n * An implementation of navigator.requestMediaKeySystemAccess.\n * Retrieves a MediaKeySystemAccess object.\n *\n * @this {!Navigator}\n * @param {string} keySystem\n * @param {!Array<!MediaKeySystemConfiguration>} supportedConfigurations\n * @return {!Promise<!MediaKeySystemAccess>}\n */\n static requestMediaKeySystemAccess(keySystem, supportedConfigurations) {\n shaka.log.debug('PatchedMediaKeysWebkit.requestMediaKeySystemAccess');\n goog.asserts.assert(this == navigator,\n 'bad \"this\" for requestMediaKeySystemAccess');\n\n // Alias.\n const PatchedMediaKeysWebkit = shaka.polyfill.PatchedMediaKeysWebkit;\n try {\n const access = new PatchedMediaKeysWebkit.MediaKeySystemAccess(\n keySystem, supportedConfigurations);\n return Promise.resolve(/** @type {!MediaKeySystemAccess} */ (access));\n } catch (exception) {\n return Promise.reject(exception);\n }\n }\n\n /**\n * An implementation of HTMLMediaElement.prototype.setMediaKeys.\n * Attaches a MediaKeys object to the media element.\n *\n * @this {!HTMLMediaElement}\n * @param {MediaKeys} mediaKeys\n * @return {!Promise}\n */\n static setMediaKeys(mediaKeys) {\n shaka.log.debug('PatchedMediaKeysWebkit.setMediaKeys');\n goog.asserts.assert(this instanceof HTMLMediaElement,\n 'bad \"this\" for setMediaKeys');\n\n // Alias.\n const PatchedMediaKeysWebkit = shaka.polyfill.PatchedMediaKeysWebkit;\n\n const newMediaKeys =\n /** @type {shaka.polyfill.PatchedMediaKeysWebkit.MediaKeys} */ (\n mediaKeys);\n const oldMediaKeys =\n /** @type {shaka.polyfill.PatchedMediaKeysWebkit.MediaKeys} */ (\n this.mediaKeys);\n\n if (oldMediaKeys && oldMediaKeys != newMediaKeys) {\n goog.asserts.assert(\n oldMediaKeys instanceof PatchedMediaKeysWebkit.MediaKeys,\n 'non-polyfill instance of oldMediaKeys');\n // Have the old MediaKeys stop listening to events on the video tag.\n oldMediaKeys.setMedia(null);\n }\n\n delete this['mediaKeys']; // In case there is an existing getter.\n this['mediaKeys'] = mediaKeys; // Work around the read-only declaration.\n\n if (newMediaKeys) {\n goog.asserts.assert(\n newMediaKeys instanceof PatchedMediaKeysWebkit.MediaKeys,\n 'non-polyfill instance of newMediaKeys');\n newMediaKeys.setMedia(this);\n }\n\n return Promise.resolve();\n }\n\n /**\n * For some of this polyfill's implementation, we need to query a video\n * element. But for some embedded systems, it is memory-expensive to create\n * multiple video elements. Therefore, we check the document to see if we can\n * borrow one to query before we fall back to creating one temporarily.\n *\n * @return {!HTMLVideoElement}\n * @private\n */\n static getVideoElement_() {\n const videos = document.getElementsByTagName('video');\n const video = videos.length ? videos[0] : document.createElement('video');\n return /** @type {!HTMLVideoElement} */(video);\n }\n};\n\n\n/**\n * An implementation of MediaKeySystemAccess.\n *\n * @implements {MediaKeySystemAccess}\n */\nshaka.polyfill.PatchedMediaKeysWebkit.MediaKeySystemAccess = class {\n /**\n * @param {string} keySystem\n * @param {!Array<!MediaKeySystemConfiguration>} supportedConfigurations\n */\n constructor(keySystem, supportedConfigurations) {\n shaka.log.debug('PatchedMediaKeysWebkit.MediaKeySystemAccess');\n\n /** @type {string} */\n this.keySystem = keySystem;\n\n /** @private {string} */\n this.internalKeySystem_ = keySystem;\n\n /** @private {!MediaKeySystemConfiguration} */\n this.configuration_;\n\n // This is only a guess, since we don't really know from the prefixed API.\n let allowPersistentState = false;\n\n if (keySystem == 'org.w3.clearkey') {\n // ClearKey's string must be prefixed in v0.1b.\n this.internalKeySystem_ = 'webkit-org.w3.clearkey';\n // ClearKey doesn't support persistence.\n allowPersistentState = false;\n }\n\n let success = false;\n const tmpVideo = shaka.polyfill.PatchedMediaKeysWebkit.getVideoElement_();\n for (const cfg of supportedConfigurations) {\n // Create a new config object and start adding in the pieces which we\n // find support for. We will return this from getConfiguration() if\n // asked.\n /** @type {!MediaKeySystemConfiguration} */\n const newCfg = {\n 'audioCapabilities': [],\n 'videoCapabilities': [],\n // It is technically against spec to return these as optional, but we\n // don't truly know their values from the prefixed API:\n 'persistentState': 'optional',\n 'distinctiveIdentifier': 'optional',\n // Pretend the requested init data types are supported, since we don't\n // really know that either:\n 'initDataTypes': cfg.initDataTypes,\n 'sessionTypes': ['temporary'],\n 'label': cfg.label,\n };\n\n // v0.1b tests for key system availability with an extra argument on\n // canPlayType.\n let ranAnyTests = false;\n if (cfg.audioCapabilities) {\n for (const cap of cfg.audioCapabilities) {\n if (cap.contentType) {\n ranAnyTests = true;\n // In Chrome <= 40, if you ask about Widevine-encrypted audio\n // support, you get a false-negative when you specify codec\n // information. Work around this by stripping codec info for audio\n // types.\n const contentType = cap.contentType.split(';')[0];\n if (tmpVideo.canPlayType(contentType, this.internalKeySystem_)) {\n newCfg.audioCapabilities.push(cap);\n success = true;\n }\n }\n }\n }\n if (cfg.videoCapabilities) {\n for (const cap of cfg.videoCapabilities) {\n if (cap.contentType) {\n ranAnyTests = true;\n if (tmpVideo.canPlayType(\n cap.contentType, this.internalKeySystem_)) {\n newCfg.videoCapabilities.push(cap);\n success = true;\n }\n }\n }\n }\n\n if (!ranAnyTests) {\n // If no specific types were requested, we check all common types to\n // find out if the key system is present at all.\n success =\n tmpVideo.canPlayType('video/mp4', this.internalKeySystem_) ||\n tmpVideo.canPlayType('video/webm', this.internalKeySystem_);\n }\n if (cfg.persistentState == 'required') {\n if (allowPersistentState) {\n newCfg.persistentState = 'required';\n newCfg.sessionTypes = ['persistent-license'];\n } else {\n success = false;\n }\n }\n\n if (success) {\n this.configuration_ = newCfg;\n return;\n }\n } // for each cfg in supportedConfigurations\n\n let message = 'Unsupported keySystem';\n if (keySystem == 'org.w3.clearkey' || keySystem == 'com.widevine.alpha') {\n message = 'None of the requested configurations were supported.';\n }\n\n // According to the spec, this should be a DOMException, but there is not a\n // public constructor for that. So we make this look-alike instead.\n const unsupportedError = new Error(message);\n unsupportedError.name = 'NotSupportedError';\n unsupportedError['code'] = DOMException.NOT_SUPPORTED_ERR;\n throw unsupportedError;\n }\n\n /** @override */\n createMediaKeys() {\n shaka.log.debug(\n 'PatchedMediaKeysWebkit.MediaKeySystemAccess.createMediaKeys');\n\n // Alias.\n const PatchedMediaKeysWebkit = shaka.polyfill.PatchedMediaKeysWebkit;\n const mediaKeys =\n new PatchedMediaKeysWebkit.MediaKeys(this.internalKeySystem_);\n return Promise.resolve(/** @type {!MediaKeys} */ (mediaKeys));\n }\n\n /** @override */\n getConfiguration() {\n shaka.log.debug(\n 'PatchedMediaKeysWebkit.MediaKeySystemAccess.getConfiguration');\n return this.configuration_;\n }\n};\n\n\n/**\n * An implementation of MediaKeys.\n *\n * @implements {MediaKeys}\n */\nshaka.polyfill.PatchedMediaKeysWebkit.MediaKeys = class {\n /**\n * @param {string} keySystem\n */\n constructor(keySystem) {\n shaka.log.debug('PatchedMediaKeysWebkit.MediaKeys');\n\n /** @private {string} */\n this.keySystem_ = keySystem;\n\n /** @private {HTMLMediaElement} */\n this.media_ = null;\n\n /** @private {!shaka.util.EventManager} */\n this.eventManager_ = new shaka.util.EventManager();\n\n /**\n * @private {Array<!shaka.polyfill.PatchedMediaKeysWebkit.MediaKeySession>}\n */\n this.newSessions_ = [];\n\n /**\n * @private {!Map<string,\n * !shaka.polyfill.PatchedMediaKeysWebkit.MediaKeySession>}\n */\n this.sessionMap_ = new Map();\n }\n\n /**\n * @param {HTMLMediaElement} media\n * @protected\n */\n setMedia(media) {\n this.media_ = media;\n\n // Remove any old listeners.\n this.eventManager_.removeAll();\n\n const prefix = shaka.polyfill.PatchedMediaKeysWebkit.prefix_;\n if (media) {\n // Intercept and translate these prefixed EME events.\n this.eventManager_.listen(media, prefix + 'needkey',\n /** @type {shaka.util.EventManager.ListenerType} */ (\n (event) => this.onWebkitNeedKey_(event)));\n\n this.eventManager_.listen(media, prefix + 'keymessage',\n /** @type {shaka.util.EventManager.ListenerType} */ (\n (event) => this.onWebkitKeyMessage_(event)));\n\n this.eventManager_.listen(media, prefix + 'keyadded',\n /** @type {shaka.util.EventManager.ListenerType} */ (\n (event) => this.onWebkitKeyAdded_(event)));\n\n this.eventManager_.listen(media, prefix + 'keyerror',\n /** @type {shaka.util.EventManager.ListenerType} */ (\n (event) => this.onWebkitKeyError_(event)));\n }\n }\n\n /** @override */\n createSession(sessionType) {\n shaka.log.debug('PatchedMediaKeysWebkit.MediaKeys.createSession');\n\n sessionType = sessionType || 'temporary';\n if (sessionType != 'temporary' && sessionType != 'persistent-license') {\n throw new TypeError('Session type ' + sessionType +\n ' is unsupported on this platform.');\n }\n\n // Alias.\n const PatchedMediaKeysWebkit = shaka.polyfill.PatchedMediaKeysWebkit;\n\n // Unprefixed EME allows for session creation without a video tag or src.\n // Prefixed EME requires both a valid HTMLMediaElement and a src.\n const media = this.media_ || /** @type {!HTMLMediaElement} */(\n document.createElement('video'));\n if (!media.src) {\n media.src = 'about:blank';\n }\n\n const session = new PatchedMediaKeysWebkit.MediaKeySession(\n media, this.keySystem_, sessionType);\n this.newSessions_.push(session);\n return session;\n }\n\n /** @override */\n setServerCertificate(serverCertificate) {\n shaka.log.debug('PatchedMediaKeysWebkit.MediaKeys.setServerCertificate');\n\n // There is no equivalent in v0.1b, so return failure.\n return Promise.resolve(false);\n }\n\n /** @override */\n getStatusForPolicy(policy) {\n return Promise.resolve('usable');\n }\n\n /**\n * @param {!MediaKeyEvent} event\n * @suppress {constantProperty} We reassign what would be const on a real\n * MediaEncryptedEvent, but in our look-alike event.\n * @private\n */\n onWebkitNeedKey_(event) {\n shaka.log.debug('PatchedMediaKeysWebkit.onWebkitNeedKey_', event);\n goog.asserts.assert(this.media_, 'media_ not set in onWebkitNeedKey_');\n\n const event2 = new CustomEvent('encrypted');\n const encryptedEvent =\n /** @type {!MediaEncryptedEvent} */(/** @type {?} */(event2));\n // initDataType is not used by v0.1b EME, so any valid value is fine here.\n encryptedEvent.initDataType = 'cenc';\n encryptedEvent.initData = shaka.util.BufferUtils.toArrayBuffer(\n event.initData);\n\n this.media_.dispatchEvent(event2);\n }\n\n /**\n * @param {!MediaKeyEvent} event\n * @private\n */\n onWebkitKeyMessage_(event) {\n shaka.log.debug('PatchedMediaKeysWebkit.onWebkitKeyMessage_', event);\n\n const session = this.findSession_(event.sessionId);\n if (!session) {\n shaka.log.error('Session not found', event.sessionId);\n return;\n }\n\n const isNew = session.keyStatuses.getStatus() == undefined;\n\n const data = new Map()\n .set('messageType', isNew ? 'licenserequest' : 'licenserenewal')\n .set('message', event.message);\n const event2 = new shaka.util.FakeEvent('message', data);\n\n session.generated();\n session.dispatchEvent(event2);\n }\n\n /**\n * @param {!MediaKeyEvent} event\n * @private\n */\n onWebkitKeyAdded_(event) {\n shaka.log.debug('PatchedMediaKeysWebkit.onWebkitKeyAdded_', event);\n\n const session = this.findSession_(event.sessionId);\n goog.asserts.assert(\n session, 'unable to find session in onWebkitKeyAdded_');\n if (session) {\n session.ready();\n }\n }\n\n /**\n * @param {!MediaKeyEvent} event\n * @private\n */\n onWebkitKeyError_(event) {\n shaka.log.debug('PatchedMediaKeysWebkit.onWebkitKeyError_', event);\n\n const session = this.findSession_(event.sessionId);\n goog.asserts.assert(\n session, 'unable to find session in onWebkitKeyError_');\n if (session) {\n session.handleError(event);\n }\n }\n\n /**\n * @param {string} sessionId\n * @return {shaka.polyfill.PatchedMediaKeysWebkit.MediaKeySession}\n * @private\n */\n findSession_(sessionId) {\n let session = this.sessionMap_.get(sessionId);\n if (session) {\n shaka.log.debug(\n 'PatchedMediaKeysWebkit.MediaKeys.findSession_', session);\n return session;\n }\n\n session = this.newSessions_.shift();\n if (session) {\n session.sessionId = sessionId;\n this.sessionMap_.set(sessionId, session);\n shaka.log.debug(\n 'PatchedMediaKeysWebkit.MediaKeys.findSession_', session);\n return session;\n }\n\n return null;\n }\n};\n\n\n/**\n * An implementation of MediaKeySession.\n *\n * @implements {MediaKeySession}\n */\nshaka.polyfill.PatchedMediaKeysWebkit.MediaKeySession =\nclass extends shaka.util.FakeEventTarget {\n /**\n * @param {!HTMLMediaElement} media\n * @param {string} keySystem\n * @param {string} sessionType\n */\n constructor(media, keySystem, sessionType) {\n shaka.log.debug('PatchedMediaKeysWebkit.MediaKeySession');\n super();\n\n /** @private {!HTMLMediaElement} */\n this.media_ = media;\n\n /** @private {boolean} */\n this.initialized_ = false;\n\n /** @private {shaka.util.PublicPromise} */\n this.generatePromise_ = null;\n\n /** @private {shaka.util.PublicPromise} */\n this.updatePromise_ = null;\n\n /** @private {string} */\n this.keySystem_ = keySystem;\n\n /** @private {string} */\n this.type_ = sessionType;\n\n /** @type {string} */\n this.sessionId = '';\n\n /** @type {number} */\n this.expiration = NaN;\n\n /** @type {!shaka.util.PublicPromise} */\n this.closed = new shaka.util.PublicPromise();\n\n /** @type {!shaka.polyfill.PatchedMediaKeysWebkit.MediaKeyStatusMap} */\n this.keyStatuses =\n new shaka.polyfill.PatchedMediaKeysWebkit.MediaKeyStatusMap();\n }\n\n /**\n * Signals that the license request has been generated. This resolves the\n * 'generateRequest' promise.\n *\n * @protected\n */\n generated() {\n shaka.log.debug('PatchedMediaKeysWebkit.MediaKeySession.generated');\n\n if (this.generatePromise_) {\n this.generatePromise_.resolve();\n this.generatePromise_ = null;\n }\n }\n\n /**\n * Signals that the session is 'ready', which is the terminology used in older\n * versions of EME. The new signal is to resolve the 'update' promise. This\n * translates between the two.\n *\n * @protected\n */\n ready() {\n shaka.log.debug('PatchedMediaKeysWebkit.MediaKeySession.ready');\n\n this.updateKeyStatus_('usable');\n\n if (this.updatePromise_) {\n this.updatePromise_.resolve();\n }\n this.updatePromise_ = null;\n }\n\n /**\n * Either rejects a promise, or dispatches an error event, as appropriate.\n *\n * @param {!MediaKeyEvent} event\n */\n handleError(event) {\n shaka.log.debug(\n 'PatchedMediaKeysWebkit.MediaKeySession.handleError', event);\n\n // This does not match the DOMException we get in current WD EME, but it\n // will at least provide some information which can be used to look into the\n // problem.\n const error = new Error('EME v0.1b key error');\n const errorCode = event.errorCode;\n errorCode.systemCode = event.systemCode;\n error['errorCode'] = errorCode;\n\n // The presence or absence of sessionId indicates whether this corresponds\n // to generateRequest() or update().\n if (!event.sessionId && this.generatePromise_) {\n if (event.systemCode == 45) {\n error.message = 'Unsupported session type.';\n }\n this.generatePromise_.reject(error);\n this.generatePromise_ = null;\n } else if (event.sessionId && this.updatePromise_) {\n this.updatePromise_.reject(error);\n this.updatePromise_ = null;\n } else {\n // This mapping of key statuses is imperfect at best.\n const code = event.errorCode.code;\n const systemCode = event.systemCode;\n if (code == MediaKeyError['MEDIA_KEYERR_OUTPUT']) {\n this.updateKeyStatus_('output-restricted');\n } else if (systemCode == 1) {\n this.updateKeyStatus_('expired');\n } else {\n this.updateKeyStatus_('internal-error');\n }\n }\n }\n\n /**\n * Logic which is shared between generateRequest() and load(), both of which\n * are ultimately implemented with webkitGenerateKeyRequest in prefixed EME.\n *\n * @param {?BufferSource} initData\n * @param {?string} offlineSessionId\n * @return {!Promise}\n * @private\n */\n generate_(initData, offlineSessionId) {\n const PatchedMediaKeysWebkit = shaka.polyfill.PatchedMediaKeysWebkit;\n\n if (this.initialized_) {\n const error = new Error('The session is already initialized.');\n return Promise.reject(error);\n }\n\n this.initialized_ = true;\n\n /** @type {!Uint8Array} */\n let mangledInitData;\n\n try {\n if (this.type_ == 'persistent-license') {\n const StringUtils = shaka.util.StringUtils;\n if (!offlineSessionId) {\n goog.asserts.assert(initData, 'expecting init data');\n // Persisting the initial license.\n // Prefix the init data with a tag to indicate persistence.\n const prefix = StringUtils.toUTF8('PERSISTENT|');\n mangledInitData = shaka.util.Uint8ArrayUtils.concat(prefix, initData);\n } else {\n // Loading a stored license.\n // Prefix the init data (which is really a session ID) with a tag to\n // indicate that we are loading a persisted session.\n mangledInitData = shaka.util.BufferUtils.toUint8(\n StringUtils.toUTF8('LOAD_SESSION|' + offlineSessionId));\n }\n } else {\n // Streaming.\n goog.asserts.assert(this.type_ == 'temporary',\n 'expected temporary session');\n goog.asserts.assert(!offlineSessionId,\n 'unexpected offline session ID');\n goog.asserts.assert(initData, 'expecting init data');\n mangledInitData = shaka.util.BufferUtils.toUint8(initData);\n }\n\n goog.asserts.assert(mangledInitData, 'init data not set!');\n } catch (exception) {\n return Promise.reject(exception);\n }\n\n goog.asserts.assert(this.generatePromise_ == null,\n 'generatePromise_ should be null');\n this.generatePromise_ = new shaka.util.PublicPromise();\n\n // Because we are hacking media.src in createSession to better emulate\n // unprefixed EME's ability to create sessions and license requests without\n // a video tag, we can get ourselves into trouble. It seems that sometimes,\n // the setting of media.src hasn't been processed by some other thread, and\n // GKR can throw an exception. If this occurs, wait 10 ms and try again at\n // most once. This situation should only occur when init data is available\n // ahead of the 'needkey' event.\n\n const generateKeyRequestName =\n PatchedMediaKeysWebkit.prefixApi_('generateKeyRequest');\n try {\n this.media_[generateKeyRequestName](this.keySystem_, mangledInitData);\n } catch (exception) {\n if (exception.name != 'InvalidStateError') {\n this.generatePromise_ = null;\n return Promise.reject(exception);\n }\n\n const timer = new shaka.util.Timer(() => {\n try {\n this.media_[generateKeyRequestName](this.keySystem_, mangledInitData);\n } catch (exception2) {\n this.generatePromise_.reject(exception2);\n this.generatePromise_ = null;\n }\n });\n\n timer.tickAfter(/* seconds= */ 0.01);\n }\n\n return this.generatePromise_;\n }\n\n /**\n * An internal version of update which defers new calls while old ones are in\n * progress.\n *\n * @param {!shaka.util.PublicPromise} promise The promise associated with\n * this call.\n * @param {BufferSource} response\n * @private\n */\n update_(promise, response) {\n const PatchedMediaKeysWebkit = shaka.polyfill.PatchedMediaKeysWebkit;\n\n if (this.updatePromise_) {\n // We already have an update in-progress, so defer this one until after\n // the old one is resolved. Execute this whether the original one\n // succeeds or fails.\n this.updatePromise_.then(() => this.update_(promise, response))\n .catch(() => this.update_(promise, response));\n return;\n }\n\n this.updatePromise_ = promise;\n\n let key;\n let keyId;\n\n if (this.keySystem_ == 'webkit-org.w3.clearkey') {\n // The current EME version of clearkey wants a structured JSON response.\n // The v0.1b version wants just a raw key. Parse the JSON response and\n // extract the key and key ID.\n const StringUtils = shaka.util.StringUtils;\n const Uint8ArrayUtils = shaka.util.Uint8ArrayUtils;\n const licenseString = StringUtils.fromUTF8(response);\n const jwkSet = /** @type {JWKSet} */ (JSON.parse(licenseString));\n const kty = jwkSet.keys[0].kty;\n if (kty != 'oct') {\n // Reject the promise.\n this.updatePromise_.reject(new Error(\n 'Response is not a valid JSON Web Key Set.'));\n this.updatePromise_ = null;\n }\n key = Uint8ArrayUtils.fromBase64(jwkSet.keys[0].k);\n keyId = Uint8ArrayUtils.fromBase64(jwkSet.keys[0].kid);\n } else {\n // The key ID is not required.\n key = shaka.util.BufferUtils.toUint8(response);\n keyId = null;\n }\n\n const addKeyName = PatchedMediaKeysWebkit.prefixApi_('addKey');\n try {\n this.media_[addKeyName](this.keySystem_, key, keyId, this.sessionId);\n } catch (exception) {\n // Reject the promise.\n this.updatePromise_.reject(exception);\n this.updatePromise_ = null;\n }\n }\n\n /**\n * Update key status and dispatch a 'keystatuseschange' event.\n *\n * @param {string} status\n * @private\n */\n updateKeyStatus_(status) {\n this.keyStatuses.setStatus(status);\n const event = new shaka.util.FakeEvent('keystatuseschange');\n this.dispatchEvent(event);\n }\n\n /** @override */\n generateRequest(initDataType, initData) {\n shaka.log.debug('PatchedMediaKeysWebkit.MediaKeySession.generateRequest');\n return this.generate_(initData, null);\n }\n\n /** @override */\n load(sessionId) {\n shaka.log.debug('PatchedMediaKeysWebkit.MediaKeySession.load');\n if (this.type_ == 'persistent-license') {\n return this.generate_(null, sessionId);\n } else {\n return Promise.reject(new Error('Not a persistent session.'));\n }\n }\n\n /** @override */\n update(response) {\n shaka.log.debug('PatchedMediaKeysWebkit.MediaKeySession.update', response);\n goog.asserts.assert(this.sessionId, 'update without session ID');\n\n const nextUpdatePromise = new shaka.util.PublicPromise();\n this.update_(nextUpdatePromise, response);\n return nextUpdatePromise;\n }\n\n /** @override */\n close() {\n const PatchedMediaKeysWebkit = shaka.polyfill.PatchedMediaKeysWebkit;\n\n shaka.log.debug('PatchedMediaKeysWebkit.MediaKeySession.close');\n\n // This will remove a persistent session, but it's also the only way to free\n // CDM resources on v0.1b.\n if (this.type_ != 'persistent-license') {\n // sessionId may reasonably be null if no key request has been generated\n // yet. Unprefixed EME will return a rejected promise in this case. We\n // will use the same error message that Chrome 41 uses in its EME\n // implementation.\n if (!this.sessionId) {\n this.closed.reject(new Error('The session is not callable.'));\n return this.closed;\n }\n\n // This may throw an exception, but we ignore it because we are only using\n // it to clean up resources in v0.1b. We still consider the session\n // closed. We can't let the exception propagate because\n // MediaKeySession.close() should not throw.\n const cancelKeyRequestName =\n PatchedMediaKeysWebkit.prefixApi_('cancelKeyRequest');\n try {\n this.media_[cancelKeyRequestName](this.keySystem_, this.sessionId);\n } catch (exception) {\n shaka.log.debug(`${cancelKeyRequestName} exception`, exception);\n }\n }\n\n // Resolve the 'closed' promise and return it.\n this.closed.resolve();\n return this.closed;\n }\n\n /** @override */\n remove() {\n shaka.log.debug('PatchedMediaKeysWebkit.MediaKeySession.remove');\n\n if (this.type_ != 'persistent-license') {\n return Promise.reject(new Error('Not a persistent session.'));\n }\n\n return this.close();\n }\n};\n\n\n/**\n * An implementation of MediaKeyStatusMap.\n * This fakes a map with a single key ID.\n *\n * @todo Consolidate the MediaKeyStatusMap types in these polyfills.\n * @implements {MediaKeyStatusMap}\n */\nshaka.polyfill.PatchedMediaKeysWebkit.MediaKeyStatusMap = class {\n /** */\n constructor() {\n /**\n * @type {number}\n */\n this.size = 0;\n\n /**\n * @private {string|undefined}\n */\n this.status_ = undefined;\n }\n\n /**\n * An internal method used by the session to set key status.\n * @param {string|undefined} status\n */\n setStatus(status) {\n this.size = status == undefined ? 0 : 1;\n this.status_ = status;\n }\n\n /**\n * An internal method used by the session to get key status.\n * @return {string|undefined}\n */\n getStatus() {\n return this.status_;\n }\n\n /** @override */\n forEach(fn) {\n if (this.status_) {\n fn(this.status_, shaka.drm.DrmUtils.DUMMY_KEY_ID.value());\n }\n }\n\n /** @override */\n get(keyId) {\n if (this.has(keyId)) {\n return this.status_;\n }\n return undefined;\n }\n\n /** @override */\n has(keyId) {\n const fakeKeyId = shaka.drm.DrmUtils.DUMMY_KEY_ID.value();\n if (this.status_ && shaka.util.BufferUtils.equal(keyId, fakeKeyId)) {\n return true;\n }\n return false;\n }\n\n /**\n * @suppress {missingReturn}\n * @override\n */\n entries() {\n goog.asserts.assert(false, 'Not used! Provided only for compiler.');\n }\n\n /**\n * @suppress {missingReturn}\n * @override\n */\n keys() {\n goog.asserts.assert(false, 'Not used! Provided only for compiler.');\n }\n\n /**\n * @suppress {missingReturn}\n * @override\n */\n values() {\n goog.asserts.assert(false, 'Not used! Provided only for compiler.');\n }\n};\n\n\n/**\n * Store api prefix.\n *\n * @private {string}\n */\nshaka.polyfill.PatchedMediaKeysWebkit.prefix_ = '';\n\n\n/**\n * API name.\n *\n * @private {string}\n */\nshaka.polyfill.PatchedMediaKeysWebkit.apiName_ = 'webkit';\n\n\nshaka.polyfill.register(shaka.polyfill.PatchedMediaKeysWebkit.install);\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.polyfill.PiPWebkit');\n\ngoog.require('shaka.log');\ngoog.require('shaka.polyfill');\n\n/**\n * @summary A polyfill to provide PiP support in Safari.\n * Note that Safari only supports PiP on video elements, not audio.\n * @export\n */\nshaka.polyfill.PiPWebkit = class {\n /**\n * Install the polyfill if needed.\n * @export\n */\n static install() {\n if (!window.HTMLVideoElement) {\n // Avoid errors on very old browsers.\n return;\n }\n\n // eslint-disable-next-line no-restricted-syntax\n const proto = HTMLVideoElement.prototype;\n if (proto.requestPictureInPicture &&\n document.exitPictureInPicture) {\n // No polyfill needed.\n return;\n }\n\n if (!proto.webkitSupportsPresentationMode) {\n // No Webkit PiP API available.\n return;\n }\n\n const PiPWebkit = shaka.polyfill.PiPWebkit;\n shaka.log.debug('PiPWebkit.install');\n\n // Polyfill document.pictureInPictureEnabled.\n // It's definitely enabled now. :-)\n document.pictureInPictureEnabled = true;\n\n // Polyfill document.pictureInPictureElement.\n // This is initially empty. We don't need getter or setter because we don't\n // need any special handling when this is set. We assume in good faith that\n // applications won't try to set this directly.\n document.pictureInPictureElement = null;\n\n // Polyfill HTMLVideoElement.requestPictureInPicture.\n proto.requestPictureInPicture = PiPWebkit.requestPictureInPicture_;\n\n // Polyfill HTMLVideoElement.disablePictureInPicture.\n Object.defineProperty(proto, 'disablePictureInPicture', {\n get: PiPWebkit.getDisablePictureInPicture_,\n set: PiPWebkit.setDisablePictureInPicture_,\n // You should be able to discover this property.\n enumerable: true,\n // And maybe we're not so smart. Let someone else change it if they want.\n configurable: true,\n });\n\n // Polyfill document.exitPictureInPicture.\n document.exitPictureInPicture = PiPWebkit.exitPictureInPicture_;\n\n // Use the \"capturing\" event phase to get the webkit presentation mode event\n // from the document. This way, we get the event on its way from document\n // to the target element without having to intercept events in every\n // possible video element.\n document.addEventListener(\n 'webkitpresentationmodechanged', PiPWebkit.proxyEvent_,\n /* useCapture= */ true);\n }\n\n /**\n * @param {!Event} event\n * @private\n */\n static proxyEvent_(event) {\n const PiPWebkit = shaka.polyfill.PiPWebkit;\n const element = /** @type {!HTMLVideoElement} */(event.target);\n\n if (element.webkitPresentationMode == PiPWebkit.PIP_MODE_) {\n // Keep track of the PiP element. This element just entered PiP mode.\n document.pictureInPictureElement = element;\n\n // Dispatch a standard event to match.\n const event2 = new Event('enterpictureinpicture');\n element.dispatchEvent(event2);\n } else {\n // Keep track of the PiP element. This element just left PiP mode.\n // If something else hasn't already take its place, clear it.\n if (document.pictureInPictureElement == element) {\n document.pictureInPictureElement = null;\n }\n\n // Dispatch a standard event to match.\n const event2 = new Event('leavepictureinpicture');\n element.dispatchEvent(event2);\n }\n }\n\n /**\n * @this {HTMLVideoElement}\n * @return {!Promise}\n * @private\n */\n static requestPictureInPicture_() {\n const PiPWebkit = shaka.polyfill.PiPWebkit;\n // NOTE: \"this\" here is the video element.\n\n // Check if PiP is enabled for this element.\n if (!this.webkitSupportsPresentationMode(PiPWebkit.PIP_MODE_)) {\n const error = new Error('PiP not allowed by video element');\n return Promise.reject(error);\n } else {\n // Enter PiP mode.\n this.webkitSetPresentationMode(PiPWebkit.PIP_MODE_);\n document.pictureInPictureElement = this;\n return Promise.resolve();\n }\n }\n\n /**\n * @this {Document}\n * @return {!Promise}\n * @private\n */\n static exitPictureInPicture_() {\n const PiPWebkit = shaka.polyfill.PiPWebkit;\n\n const pipElement =\n /** @type {HTMLVideoElement} */(document.pictureInPictureElement);\n if (pipElement) {\n // Exit PiP mode.\n pipElement.webkitSetPresentationMode(PiPWebkit.INLINE_MODE_);\n document.pictureInPictureElement = null;\n return Promise.resolve();\n } else {\n const error = new Error('No picture in picture element found');\n return Promise.reject(error);\n }\n }\n\n /**\n * @this {HTMLVideoElement}\n * @return {boolean}\n * @private\n */\n static getDisablePictureInPicture_() {\n // This respects the HTML attribute, which may have been set in HTML or\n // through the JS setter.\n if (this.hasAttribute('disablePictureInPicture')) {\n return true;\n }\n\n // Use Apple's non-standard API to know if PiP is allowed on this\n // device for this content. If not, say that PiP is disabled, even\n // if not specified by the user through the setter or HTML attribute.\n const PiPWebkit = shaka.polyfill.PiPWebkit;\n return !this.webkitSupportsPresentationMode(PiPWebkit.PIP_MODE_);\n }\n\n /**\n * @this {HTMLVideoElement}\n * @param {boolean} value\n * @private\n */\n static setDisablePictureInPicture_(value) {\n // This mimics how the JS setter works in browsers that implement the spec.\n if (value) {\n this.setAttribute('disablePictureInPicture', '');\n } else {\n this.removeAttribute('disablePictureInPicture');\n }\n }\n};\n\n\n/**\n * The presentation mode string used to indicate PiP mode in Safari.\n *\n * @const {string}\n * @private\n */\nshaka.polyfill.PiPWebkit.PIP_MODE_ = 'picture-in-picture';\n\n\n/**\n * The presentation mode string used to indicate inline mode in Safari.\n *\n * @const {string}\n * @private\n */\nshaka.polyfill.PiPWebkit.INLINE_MODE_ = 'inline';\n\n\nshaka.polyfill.register(shaka.polyfill.PiPWebkit.install);\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\ngoog.provide('shaka.polyfill.RandomUUID');\n\ngoog.require('shaka.log');\ngoog.require('shaka.polyfill');\n\n/**\n * @summary A polyfill to provide window.crypto.randomUUID in all browsers.\n * @export\n */\nshaka.polyfill.RandomUUID = class {\n /**\n * Install the polyfill if needed.\n * @export\n */\n static install() {\n shaka.log.debug('randomUUID.install');\n\n if (!window.crypto) {\n // See: https://caniuse.com/cryptography\n shaka.log.debug(\n 'window.crypto must be available to install randomUUID polyfill.');\n return;\n }\n\n if ('randomUUID' in window.crypto) {\n shaka.log.debug(\n 'RandomUUID: Native window.crypto.randomUUID() support found.');\n return;\n }\n\n window.crypto.randomUUID = shaka.polyfill.RandomUUID.randomUUID_;\n }\n\n /**\n * @return {string}\n * @private\n */\n static randomUUID_() {\n const url = URL.createObjectURL(new Blob());\n const uuid = url.toString();\n URL.revokeObjectURL(url);\n return uuid.substr(uuid.lastIndexOf('/') + 1);\n }\n};\n\n\nshaka.polyfill.register(shaka.polyfill.RandomUUID.install);\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\ngoog.provide('shaka.polyfill.Symbol');\n\ngoog.require('shaka.log');\ngoog.require('shaka.polyfill');\n\n/**\n * @summary A polyfill to provide Symbol.prototype.description in all browsers.\n * See: https://caniuse.com/mdn-javascript_builtins_symbol_description\n * @export\n */\nshaka.polyfill.Symbol = class {\n /**\n * Install the polyfill if needed.\n * @export\n */\n static install() {\n shaka.log.debug('Symbol.install');\n\n // eslint-disable-next-line no-restricted-syntax\n const proto = Symbol.prototype;\n\n if (!('description' in proto)) {\n Object.defineProperty(proto, 'description', {\n get: shaka.polyfill.Symbol.getSymbolDescription_,\n });\n }\n }\n\n /**\n * @this {Symbol}\n * @return {(string|undefined)}\n * @private\n */\n static getSymbolDescription_() {\n const m = /\\((.*)\\)/.exec(this.toString());\n return m ? m[1] : undefined;\n }\n};\n\n\nshaka.polyfill.register(shaka.polyfill.Symbol.install);\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.polyfill.VideoPlayPromise');\n\ngoog.require('shaka.log');\ngoog.require('shaka.polyfill');\n\n\n/**\n * @summary A polyfill to silence the play() Promise in HTML5 video.\n * @export\n */\nshaka.polyfill.VideoPlayPromise = class {\n /**\n * Install the polyfill if needed.\n * @export\n */\n static install() {\n shaka.log.debug('VideoPlayPromise.install');\n\n if (window.HTMLMediaElement) {\n // eslint-disable-next-line no-restricted-syntax\n const originalPlay = HTMLMediaElement.prototype.play;\n // eslint-disable-next-line no-restricted-syntax\n HTMLMediaElement.prototype.play = function() {\n const p = originalPlay.apply(this);\n if (p) {\n // This browser is returning a Promise from play().\n // If the play() call fails or is interrupted, the Promise will be\n // rejected. Some apps, however, don't listen to this Promise,\n // especially since it is not available cross-browser. If the Promise\n // is rejected without anyone listening for the failure, an error will\n // appear in the JS console.\n // To avoid confusion over this innocuous \"error\", we will install a\n // catch handler on the Promise. This does not prevent the app from\n // also catching failures and handling them. It only prevents the\n // console message.\n p.catch(() => {});\n }\n return p;\n };\n }\n }\n};\n\n\nshaka.polyfill.register(shaka.polyfill.VideoPlayPromise.install);\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.polyfill.VideoPlaybackQuality');\n\ngoog.require('shaka.polyfill');\ngoog.require('shaka.util.Platform');\n\n\n/**\n * @summary A polyfill to provide MSE VideoPlaybackQuality metrics.\n * Many browsers do not yet provide this API, and Chrome currently provides\n * similar data through individual prefixed attributes on HTMLVideoElement.\n * @export\n */\nshaka.polyfill.VideoPlaybackQuality = class {\n /**\n * Install the polyfill if needed.\n * @export\n */\n static install() {\n if (!window.HTMLVideoElement) {\n // Avoid errors on very old browsers.\n return;\n }\n\n // eslint-disable-next-line no-restricted-syntax\n const proto = HTMLVideoElement.prototype;\n if (proto.getVideoPlaybackQuality) {\n // No polyfill needed.\n return;\n }\n\n if ('webkitDroppedFrameCount' in proto ||\n shaka.util.Platform.isWebOS3()) {\n proto.getVideoPlaybackQuality =\n shaka.polyfill.VideoPlaybackQuality.webkit_;\n }\n }\n\n /**\n * @this {HTMLVideoElement}\n * @return {!VideoPlaybackQuality}\n * @private\n */\n static webkit_() {\n return {\n 'droppedVideoFrames': this.webkitDroppedFrameCount,\n 'totalVideoFrames': this.webkitDecodedFrameCount,\n // Not provided by this polyfill:\n 'corruptedVideoFrames': 0,\n 'creationTime': NaN,\n 'totalFrameDelay': 0,\n };\n }\n};\n\n\nshaka.polyfill.register(shaka.polyfill.VideoPlaybackQuality.install);\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.polyfill.VTTCue');\n\ngoog.require('shaka.log');\ngoog.require('shaka.polyfill');\n\n\n/**\n * @summary A polyfill to provide VTTCue.\n * @export\n */\nshaka.polyfill.VTTCue = class {\n /**\n * Install the polyfill if needed.\n * @export\n */\n static install() {\n if (window.VTTCue) {\n shaka.log.info('Using native VTTCue.');\n return;\n }\n\n if (!window.TextTrackCue) {\n shaka.log.error('VTTCue not available.');\n return;\n }\n\n /** @type {?function(number, number, string):!TextTrackCue} */\n let replacement = null;\n const constructorLength = TextTrackCue.length;\n if (constructorLength == 3) {\n shaka.log.info('Using VTTCue polyfill from 3 argument TextTrackCue.');\n replacement = shaka.polyfill.VTTCue.from3ArgsTextTrackCue_;\n } else if (constructorLength == 6) {\n shaka.log.info('Using VTTCue polyfill from 6 argument TextTrackCue.');\n replacement = shaka.polyfill.VTTCue.from6ArgsTextTrackCue_;\n } else if (shaka.polyfill.VTTCue.canUse3ArgsTextTrackCue_()) {\n shaka.log.info('Using VTTCue polyfill from 3 argument TextTrackCue.');\n replacement = shaka.polyfill.VTTCue.from3ArgsTextTrackCue_;\n }\n\n if (!replacement) {\n shaka.log.error('No recognized signature for TextTrackCue found!');\n return;\n }\n\n // The polyfilled VTTCue must be callable with \"new\", but the static methods\n // in this class cannot be called that way on legacy Edge. So we must wrap\n // the replacement in a plain function.\n // eslint-disable-next-line no-restricted-syntax\n window['VTTCue'] = function(start, end, text) {\n return replacement(start, end, text);\n };\n }\n\n /**\n * Draft spec TextTrackCue with 3 constructor arguments.\n * @see {@link https://bit.ly/2IdyKbA W3C Working Draft 25 October 2012}.\n *\n * @param {number} startTime\n * @param {number} endTime\n * @param {string} text\n * @return {!TextTrackCue}\n * @private\n */\n static from3ArgsTextTrackCue_(startTime, endTime, text) {\n return new window.TextTrackCue(startTime, endTime, text);\n }\n\n /**\n * Draft spec TextTrackCue with 6 constructor arguments (5th & 6th are\n * optional).\n * @see {@link https://bit.ly/2KaGSP2 W3C Working Draft 29 March 2012}.\n *\n * @param {number} startTime\n * @param {number} endTime\n * @param {string} text\n * @return {!TextTrackCue}\n * @private\n */\n static from6ArgsTextTrackCue_(startTime, endTime, text) {\n const id = startTime + '-' + endTime + '-' + text;\n // Quoting the access to the TextTrackCue object to satisfy the compiler.\n return new window['TextTrackCue'](id, startTime, endTime, text);\n }\n\n /**\n * Edge returns TextTrackCue.length = 0, although it accepts 3\n * constructor arguments.\n *\n * @return {boolean}\n * @private\n */\n static canUse3ArgsTextTrackCue_() {\n try {\n return !!shaka.polyfill.VTTCue.from3ArgsTextTrackCue_(1, 2, '');\n } catch (error) {\n return false;\n }\n }\n};\n\n\nshaka.polyfill.register(shaka.polyfill.VTTCue.install);\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.text.LrcTextParser');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.log');\ngoog.require('shaka.text.Cue');\ngoog.require('shaka.text.TextEngine');\ngoog.require('shaka.util.StringUtils');\n\n\n/**\n * LRC file format: https://en.wikipedia.org/wiki/LRC_(file_format)\n *\n * @implements {shaka.extern.TextParser}\n * @export\n */\nshaka.text.LrcTextParser = class {\n /**\n * @override\n * @export\n */\n parseInit(data) {\n goog.asserts.assert(false, 'LRC does not have init segments');\n }\n\n /**\n * @override\n * @export\n */\n setSequenceMode(sequenceMode) {\n // Unused.\n }\n\n /**\n * @override\n * @export\n */\n setManifestType(manifestType) {\n // Unused.\n }\n\n /**\n * @override\n * @export\n */\n parseMedia(data, time) {\n const StringUtils = shaka.util.StringUtils;\n const LrcTextParser = shaka.text.LrcTextParser;\n\n // Get the input as a string.\n const str = StringUtils.fromUTF8(data);\n\n /** @type {shaka.text.Cue} */\n let prevCue = null;\n\n /** @type {!Array<!shaka.text.Cue>} */\n const cues = [];\n const lines = str.split(/\\r?\\n/);\n for (const line of lines) {\n if (!line || /^\\s+$/.test(line)) {\n continue;\n }\n\n // LRC content\n const match = LrcTextParser.lyricLine_.exec(line);\n if (match) {\n const startTime = LrcTextParser.parseTime_(match[1]);\n // This time can be overwritten by a subsequent cue.\n // By default we add 2 seconds of duration.\n const endTime = time.segmentEnd ? time.segmentEnd : startTime + 2;\n const payload = match[2];\n const cue = new shaka.text.Cue(startTime, endTime, payload);\n\n // Update previous\n if (prevCue) {\n prevCue.endTime = startTime;\n cues.push(prevCue);\n }\n prevCue = cue;\n continue;\n }\n shaka.log.warning('LrcTextParser encountered an unknown line.', line);\n }\n if (prevCue) {\n cues.push(prevCue);\n }\n\n return cues;\n }\n\n /**\n * Parses a LRC time from the given parser.\n *\n * @param {string} string\n * @return {number}\n * @private\n */\n static parseTime_(string) {\n const LrcTextParser = shaka.text.LrcTextParser;\n const match = LrcTextParser.timeFormat_.exec(string);\n const minutes = parseInt(match[1], 10);\n const seconds = parseFloat(match[2].replace(',', '.'));\n return minutes * 60 + seconds;\n }\n};\n\n/**\n * @const\n * @private {!RegExp}\n * @example [00:12.0]Text or [00:12.00]Text or [00:12.000]Text or\n * [00:12,0]Text or [00:12,00]Text or [00:12,000]Text\n */\nshaka.text.LrcTextParser.lyricLine_ =\n /^\\[(\\d{1,2}:\\d{1,2}(?:[.,]\\d{1,3})?)\\](.*)/;\n\n/**\n * @const\n * @private {!RegExp}\n * @example 00:12.0 or 00:12.00 or 00:12.000 or\n * 00:12,0 or 00:12,00 or 00:12,000\n */\nshaka.text.LrcTextParser.timeFormat_ =\n /^(\\d+):(\\d{1,2}(?:[.,]\\d{1,3})?)$/;\n\nshaka.text.TextEngine.registerParser(\n 'application/x-subtitle-lrc', () => new shaka.text.LrcTextParser());\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.text.TtmlTextParser');\n\ngoog.require('goog.asserts');\ngoog.require('goog.Uri');\ngoog.require('shaka.log');\ngoog.require('shaka.text.Cue');\ngoog.require('shaka.text.CueRegion');\ngoog.require('shaka.text.TextEngine');\ngoog.require('shaka.util.ArrayUtils');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.StringUtils');\ngoog.require('shaka.util.TXml');\n\n\n/**\n * @implements {shaka.extern.TextParser}\n * @export\n */\nshaka.text.TtmlTextParser = class {\n /**\n * @override\n * @export\n */\n parseInit(data) {\n goog.asserts.assert(false, 'TTML does not have init segments');\n }\n\n /**\n * @override\n * @export\n */\n setSequenceMode(sequenceMode) {\n // Unused.\n }\n\n /**\n * @override\n * @export\n */\n setManifestType(manifestType) {\n // Unused.\n }\n\n /**\n * @override\n * @export\n */\n parseMedia(data, time, uri, images) {\n const TtmlTextParser = shaka.text.TtmlTextParser;\n const TXml = shaka.util.TXml;\n const ttpNs = TtmlTextParser.parameterNs_;\n const ttsNs = TtmlTextParser.styleNs_;\n const str = shaka.util.StringUtils.fromUTF8(data);\n const cues = [];\n\n // dont try to parse empty string as\n // DOMParser will not throw error but return an errored xml\n if (str == '') {\n return cues;\n }\n\n const tt = TXml.parseXmlString(str, 'tt', /* includeParent= */ true);\n if (!tt) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.TEXT,\n shaka.util.Error.Code.INVALID_XML,\n 'Failed to parse TTML.');\n }\n\n const body = TXml.getElementsByTagName(tt, 'body')[0];\n if (!body) {\n return [];\n }\n\n // Get the framerate, subFrameRate and frameRateMultiplier if applicable.\n const frameRate = TXml.getAttributeNSList(tt, ttpNs, 'frameRate');\n const subFrameRate = TXml.getAttributeNSList(\n tt, ttpNs, 'subFrameRate');\n const frameRateMultiplier =\n TXml.getAttributeNSList(tt, ttpNs, 'frameRateMultiplier');\n const tickRate = TXml.getAttributeNSList(tt, ttpNs, 'tickRate');\n\n const cellResolution = TXml.getAttributeNSList(\n tt, ttpNs, 'cellResolution');\n const spaceStyle = tt.attributes['xml:space'] || 'default';\n const extent = TXml.getAttributeNSList(tt, ttsNs, 'extent');\n\n if (spaceStyle != 'default' && spaceStyle != 'preserve') {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.TEXT,\n shaka.util.Error.Code.INVALID_XML,\n 'Invalid xml:space value: ' + spaceStyle);\n }\n const collapseMultipleSpaces = spaceStyle == 'default';\n\n const rateInfo = new TtmlTextParser.RateInfo_(\n frameRate, subFrameRate, frameRateMultiplier, tickRate);\n\n const cellResolutionInfo =\n TtmlTextParser.getCellResolution_(cellResolution);\n\n const metadata = TXml.getElementsByTagName(tt, 'metadata')[0];\n const metadataElements =\n (metadata ? metadata.children : []).filter((c) => c != '\\n');\n const styles = TXml.getElementsByTagName(tt, 'style');\n const regionElements = TXml.getElementsByTagName(tt, 'region');\n\n const cueRegions = [];\n for (const region of regionElements) {\n const cueRegion =\n TtmlTextParser.parseCueRegion_(region, styles, extent);\n if (cueRegion) {\n cueRegions.push(cueRegion);\n }\n }\n\n // A <body> element should only contain <div> elements, not <p> or <span>\n // elements. We used to allow this, but it is non-compliant, and the\n // loose nature of our previous parser made it difficult to implement TTML\n // nesting more fully.\n if (TXml.findChildren(body, 'p').length) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.TEXT,\n shaka.util.Error.Code.INVALID_TEXT_CUE,\n '<p> can only be inside <div> in TTML');\n }\n\n for (const div of TXml.findChildren(body, 'div')) {\n // A <div> element should only contain <p>, not <span>.\n if (TXml.findChildren(div, 'span').length) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.TEXT,\n shaka.util.Error.Code.INVALID_TEXT_CUE,\n '<span> can only be inside <p> in TTML');\n }\n }\n\n const cue = TtmlTextParser.parseCue_(\n body, time, rateInfo, metadataElements, styles,\n regionElements, cueRegions, collapseMultipleSpaces,\n cellResolutionInfo, /* parentCueElement= */ null,\n /* isContent= */ false, uri, images);\n if (cue) {\n // According to the TTML spec, backgrounds default to transparent.\n // So default the background of the top-level element to transparent.\n // Nested elements may override that background color already.\n if (!cue.backgroundColor) {\n cue.backgroundColor = 'transparent';\n }\n cues.push(cue);\n }\n\n return cues;\n }\n\n /**\n * Parses a TTML node into a Cue.\n *\n * @param {!shaka.extern.xml.Node} cueNode\n * @param {shaka.extern.TextParser.TimeContext} timeContext\n * @param {!shaka.text.TtmlTextParser.RateInfo_} rateInfo\n * @param {!Array<!shaka.extern.xml.Node>} metadataElements\n * @param {!Array<!shaka.extern.xml.Node>} styles\n * @param {!Array<!shaka.extern.xml.Node>} regionElements\n * @param {!Array<!shaka.text.CueRegion>} cueRegions\n * @param {boolean} collapseMultipleSpaces\n * @param {?{columns: number, rows: number}} cellResolution\n * @param {?shaka.extern.xml.Node} parentCueElement\n * @param {boolean} isContent\n * @param {?(string|undefined)} uri\n * @param {!Array<string>} images\n * @return {shaka.text.Cue}\n * @private\n */\n static parseCue_(\n cueNode, timeContext, rateInfo, metadataElements, styles, regionElements,\n cueRegions, collapseMultipleSpaces, cellResolution, parentCueElement,\n isContent, uri, images) {\n const TXml = shaka.util.TXml;\n const StringUtils = shaka.util.StringUtils;\n /** @type {shaka.extern.xml.Node} */\n let cueElement;\n /** @type {?shaka.extern.xml.Node} */\n let parentElement = parentCueElement;\n\n if (TXml.isText(cueNode)) {\n if (!isContent) {\n // Ignore text elements outside the content. For example, whitespace\n // on the same lexical level as the <p> elements, in a document with\n // xml:space=\"preserve\", should not be renderer.\n return null;\n }\n // This should generate an \"anonymous span\" according to the TTML spec.\n // So pretend the element was a <span>. parentElement was set above, so\n // we should still be able to correctly traverse up for timing\n // information later.\n /** @type {shaka.extern.xml.Node} */\n const span = {\n tagName: 'span',\n children: [TXml.getTextContents(cueNode)],\n attributes: {},\n parent: null,\n };\n cueElement = span;\n } else {\n cueElement = cueNode;\n }\n goog.asserts.assert(cueElement, 'cueElement should be non-null!');\n\n let imageElement = null;\n for (const nameSpace of shaka.text.TtmlTextParser.smpteNsList_) {\n imageElement = shaka.text.TtmlTextParser.getElementsFromCollection_(\n cueElement, 'backgroundImage', metadataElements, '#',\n nameSpace)[0];\n if (imageElement) {\n break;\n }\n }\n\n let imageUri = null;\n const backgroundImage = TXml.getAttributeNSList(\n cueElement,\n shaka.text.TtmlTextParser.smpteNsList_,\n 'backgroundImage');\n const imsc1ImgUrnTester =\n /^(urn:)(mpeg:[a-z0-9][a-z0-9-]{0,31}:)(subs:)([0-9]+)$/;\n if (backgroundImage && imsc1ImgUrnTester.test(backgroundImage)) {\n const index = parseInt(backgroundImage.split(':').pop(), 10) -1;\n if (index >= images.length) {\n return null;\n }\n imageUri = images[index];\n } else if (uri && backgroundImage && !backgroundImage.startsWith('#')) {\n const baseUri = new goog.Uri(uri);\n const relativeUri = new goog.Uri(backgroundImage);\n const newUri = baseUri.resolve(relativeUri).toString();\n if (newUri) {\n imageUri = newUri;\n }\n }\n\n if (cueNode.tagName == 'p' || imageElement || imageUri) {\n isContent = true;\n }\n\n const parentIsContent = isContent;\n\n const spaceStyle = cueElement.attributes['xml:space'] ||\n (collapseMultipleSpaces ? 'default' : 'preserve');\n\n const localCollapseMultipleSpaces = spaceStyle == 'default';\n\n // Parse any nested cues first.\n const isLeafNode = cueElement.children.every(TXml.isText);\n const nestedCues = [];\n if (!isLeafNode) {\n // Otherwise, recurse into the children. Text nodes will convert into\n // anonymous spans, which will then be leaf nodes.\n for (const childNode of cueElement.children) {\n const nestedCue = shaka.text.TtmlTextParser.parseCue_(\n childNode,\n timeContext,\n rateInfo,\n metadataElements,\n styles,\n regionElements,\n cueRegions,\n localCollapseMultipleSpaces,\n cellResolution,\n cueElement,\n isContent,\n uri,\n images,\n );\n\n // This node may or may not generate a nested cue.\n if (nestedCue) {\n nestedCues.push(nestedCue);\n }\n }\n }\n\n const isNested = /** @type {boolean} */ (parentCueElement != null);\n\n const textContent = TXml.getTextContents(cueElement);\n // In this regex, \"\\S\" means \"non-whitespace character\".\n const hasTextContent = cueElement.children.length &&\n textContent &&\n /\\S/.test(textContent);\n\n const hasTimeAttributes =\n cueElement.attributes['begin'] ||\n cueElement.attributes['end'] ||\n cueElement.attributes['dur'];\n\n if (!hasTimeAttributes && !hasTextContent && cueElement.tagName != 'br' &&\n nestedCues.length == 0) {\n if (!isNested) {\n // Disregards empty <p> elements without time attributes nor content.\n // <p begin=\"...\" smpte:backgroundImage=\"...\" /> will go through,\n // as some information could be held by its attributes.\n // <p /> won't, as it would not be displayed.\n return null;\n } else if (localCollapseMultipleSpaces) {\n // Disregards empty anonymous spans when (local) trim is true.\n return null;\n }\n }\n\n // Get local time attributes.\n let {start, end} = shaka.text.TtmlTextParser.parseTime_(\n cueElement, rateInfo);\n // Resolve local time relative to parent elements. Time elements can appear\n // all the way up to 'body', but not 'tt'.\n while (parentElement && TXml.isNode(parentElement) &&\n parentElement.tagName != 'tt') {\n ({start, end} = shaka.text.TtmlTextParser.resolveTime_(\n parentElement, rateInfo, start, end));\n parentElement =\n /** @type {shaka.extern.xml.Node} */ (parentElement.parent);\n }\n\n if (start == null) {\n start = 0;\n }\n start += timeContext.periodStart;\n\n // If end is null, that means the duration is effectively infinite.\n if (end == null) {\n end = Infinity;\n } else {\n end += timeContext.periodStart;\n }\n\n // Clip times to segment boundaries.\n // https://github.com/shaka-project/shaka-player/issues/4631\n start = Math.max(start, timeContext.segmentStart);\n end = Math.min(end, timeContext.segmentEnd);\n\n if (!hasTimeAttributes && nestedCues.length > 0) {\n // If no time is defined for this cue, base the timing information on\n // the time of the nested cues. In the case of multiple nested cues with\n // different start times, it is the text displayer's responsibility to\n // make sure that only the appropriate nested cue is drawn at any given\n // time.\n start = Infinity;\n end = 0;\n for (const cue of nestedCues) {\n start = Math.min(start, cue.startTime);\n end = Math.max(end, cue.endTime);\n }\n }\n\n if (cueElement.tagName == 'br') {\n const cue = new shaka.text.Cue(start, end, '');\n cue.lineBreak = true;\n return cue;\n }\n\n let payload = '';\n if (isLeafNode) {\n // If the childNodes are all text, this is a leaf node. Get the payload.\n payload = StringUtils.htmlUnescape(\n shaka.util.TXml.getTextContents(cueElement) || '');\n if (localCollapseMultipleSpaces) {\n // Collapse multiple spaces into one.\n payload = payload.replace(/\\s+/g, ' ');\n }\n }\n\n const cue = new shaka.text.Cue(start, end, payload);\n cue.nestedCues = nestedCues;\n\n if (!isContent) {\n // If this is not a <p> element or a <div> with images, and it has no\n // parent that was a <p> element, then it's part of the outer containers\n // (e.g. the <body> or a normal <div> element within it).\n cue.isContainer = true;\n }\n\n if (cellResolution) {\n cue.cellResolution = cellResolution;\n }\n\n // Get other properties if available.\n const regionElement = shaka.text.TtmlTextParser.getElementsFromCollection_(\n cueElement, 'region', regionElements, /* prefix= */ '')[0];\n // Do not actually apply that region unless it is non-inherited, though.\n // This makes it so that, if a parent element has a region, the children\n // don't also all independently apply the positioning of that region.\n if (cueElement.attributes['region']) {\n if (regionElement && regionElement.attributes['xml:id']) {\n const regionId = regionElement.attributes['xml:id'];\n cue.region = cueRegions.filter((region) => region.id == regionId)[0];\n }\n }\n\n let regionElementForStyle = regionElement;\n if (parentCueElement && isNested && !cueElement.attributes['region'] &&\n !cueElement.attributes['style']) {\n regionElementForStyle =\n shaka.text.TtmlTextParser.getElementsFromCollection_(\n parentCueElement, 'region', regionElements, /* prefix= */ '')[0];\n }\n\n shaka.text.TtmlTextParser.addStyle_(\n cue,\n cueElement,\n regionElementForStyle,\n /** @type {!shaka.extern.xml.Node} */(imageElement),\n imageUri,\n styles,\n /** isNested= */ parentIsContent, // \"nested in a <div>\" doesn't count.\n /** isLeaf= */ (nestedCues.length == 0));\n\n return cue;\n }\n\n /**\n * Parses an Element into a TextTrackCue or VTTCue.\n *\n * @param {!shaka.extern.xml.Node} regionElement\n * @param {!Array<!shaka.extern.xml.Node>} styles\n * Defined in the top of tt element and used principally for images.\n * @param {?string} globalExtent\n * @return {shaka.text.CueRegion}\n * @private\n */\n static parseCueRegion_(regionElement, styles, globalExtent) {\n const TtmlTextParser = shaka.text.TtmlTextParser;\n const region = new shaka.text.CueRegion();\n const id = regionElement.attributes['xml:id'];\n if (!id) {\n shaka.log.warning('TtmlTextParser parser encountered a region with ' +\n 'no id. Region will be ignored.');\n return null;\n }\n region.id = id;\n\n let globalResults = null;\n if (globalExtent) {\n globalResults = TtmlTextParser.percentValues_.exec(globalExtent) ||\n TtmlTextParser.pixelValues_.exec(globalExtent);\n }\n const globalWidth = globalResults ? Number(globalResults[1]) : null;\n const globalHeight = globalResults ? Number(globalResults[2]) : null;\n\n let results = null;\n let percentage = null;\n const extent = TtmlTextParser.getStyleAttributeFromRegion_(\n regionElement, styles, 'extent');\n if (extent) {\n percentage = TtmlTextParser.percentValues_.exec(extent);\n results = percentage || TtmlTextParser.pixelValues_.exec(extent);\n if (results != null) {\n region.width = Number(results[1]);\n region.height = Number(results[2]);\n\n if (!percentage) {\n if (globalWidth != null) {\n region.width = region.width * 100 / globalWidth;\n }\n if (globalHeight != null) {\n region.height = region.height * 100 / globalHeight;\n }\n }\n\n region.widthUnits = percentage || globalWidth != null ?\n shaka.text.CueRegion.units.PERCENTAGE :\n shaka.text.CueRegion.units.PX;\n\n region.heightUnits = percentage || globalHeight != null ?\n shaka.text.CueRegion.units.PERCENTAGE :\n shaka.text.CueRegion.units.PX;\n }\n }\n\n const origin = TtmlTextParser.getStyleAttributeFromRegion_(\n regionElement, styles, 'origin');\n if (origin) {\n percentage = TtmlTextParser.percentValues_.exec(origin);\n results = percentage || TtmlTextParser.pixelValues_.exec(origin);\n if (results != null) {\n region.viewportAnchorX = Number(results[1]);\n region.viewportAnchorY = Number(results[2]);\n\n if (!percentage) {\n if (globalHeight != null) {\n region.viewportAnchorY = region.viewportAnchorY * 100 /\n globalHeight;\n }\n if (globalWidth != null) {\n region.viewportAnchorX = region.viewportAnchorX * 100 /\n globalWidth;\n }\n } else if (!extent) {\n region.width = 100 - region.viewportAnchorX;\n region.widthUnits = shaka.text.CueRegion.units.PERCENTAGE;\n region.height = 100 - region.viewportAnchorY;\n region.heightUnits = shaka.text.CueRegion.units.PERCENTAGE;\n }\n\n region.viewportAnchorUnits = percentage || globalWidth != null ?\n shaka.text.CueRegion.units.PERCENTAGE :\n shaka.text.CueRegion.units.PX;\n }\n }\n\n return region;\n }\n\n /**\n * Ensures any TTML RGBA's alpha range of 0-255 is converted to 0-1.\n * @param {string} color\n * @return {string}\n * @private\n */\n static convertTTMLrgbaToHTMLrgba_(color) {\n const rgba = color.match(/rgba\\(([^)]+)\\)/);\n if (rgba) {\n const values = rgba[1].split(',');\n if (values.length == 4) {\n values[3] = String(Number(values[3]) / 255);\n return 'rgba(' + values.join(',') + ')';\n }\n }\n return color;\n }\n\n /**\n * Adds applicable style properties to a cue.\n *\n * @param {!shaka.text.Cue} cue\n * @param {!shaka.extern.xml.Node} cueElement\n * @param {shaka.extern.xml.Node} region\n * @param {shaka.extern.xml.Node} imageElement\n * @param {?string} imageUri\n * @param {!Array<!shaka.extern.xml.Node>} styles\n * @param {boolean} isNested\n * @param {boolean} isLeaf\n * @private\n */\n static addStyle_(\n cue, cueElement, region, imageElement, imageUri, styles,\n isNested, isLeaf) {\n const TtmlTextParser = shaka.text.TtmlTextParser;\n const TXml = shaka.util.TXml;\n const Cue = shaka.text.Cue;\n\n // Styles should be inherited from regions, if a style property is not\n // associated with a Content element (or an anonymous span).\n const shouldInheritRegionStyles = isNested || isLeaf;\n\n const direction = TtmlTextParser.getStyleAttribute_(\n cueElement, region, styles, 'direction', shouldInheritRegionStyles);\n if (direction == 'rtl') {\n cue.direction = Cue.direction.HORIZONTAL_RIGHT_TO_LEFT;\n }\n\n // Direction attribute specifies one-dimensional writing direction\n // (left to right or right to left). Writing mode specifies that\n // plus whether text is vertical or horizontal.\n // They should not contradict each other. If they do, we give\n // preference to writing mode.\n const writingMode = TtmlTextParser.getStyleAttribute_(\n cueElement, region, styles, 'writingMode', shouldInheritRegionStyles);\n // Set cue's direction if the text is horizontal, and cue's writingMode if\n // it's vertical.\n if (writingMode == 'tb' || writingMode == 'tblr') {\n cue.writingMode = Cue.writingMode.VERTICAL_LEFT_TO_RIGHT;\n } else if (writingMode == 'tbrl') {\n cue.writingMode = Cue.writingMode.VERTICAL_RIGHT_TO_LEFT;\n } else if (writingMode == 'rltb' || writingMode == 'rl') {\n cue.direction = Cue.direction.HORIZONTAL_RIGHT_TO_LEFT;\n } else if (writingMode) {\n cue.direction = Cue.direction.HORIZONTAL_LEFT_TO_RIGHT;\n }\n\n const align = TtmlTextParser.getStyleAttribute_(\n cueElement, region, styles, 'textAlign', true);\n if (align) {\n cue.positionAlign = TtmlTextParser.textAlignToPositionAlign_.get(align);\n cue.lineAlign = TtmlTextParser.textAlignToLineAlign_.get(align);\n\n goog.asserts.assert(align.toUpperCase() in Cue.textAlign,\n align.toUpperCase() + ' Should be in Cue.textAlign values!');\n\n cue.textAlign = Cue.textAlign[align.toUpperCase()];\n } else {\n // Default value is START in the TTML spec: https://bit.ly/32OGmvo\n // But to make the subtitle render consistent with other players and the\n // shaka.text.Cue we use CENTER\n cue.textAlign = Cue.textAlign.CENTER;\n }\n\n const displayAlign = TtmlTextParser.getStyleAttribute_(\n cueElement, region, styles, 'displayAlign', true);\n if (displayAlign) {\n goog.asserts.assert(displayAlign.toUpperCase() in Cue.displayAlign,\n displayAlign.toUpperCase() +\n ' Should be in Cue.displayAlign values!');\n cue.displayAlign = Cue.displayAlign[displayAlign.toUpperCase()];\n }\n\n const color = TtmlTextParser.getStyleAttribute_(\n cueElement, region, styles, 'color', shouldInheritRegionStyles);\n if (color) {\n cue.color = TtmlTextParser.convertTTMLrgbaToHTMLrgba_(color);\n }\n\n // Background color should not be set on a container. If this is a nested\n // cue, you can set the background. If it's a top-level that happens to\n // also be a leaf, you can set the background.\n // See https://github.com/shaka-project/shaka-player/issues/2623\n // This used to be handled in the displayer, but that is confusing. The Cue\n // structure should reflect what you want to happen in the displayer, and\n // the displayer shouldn't have to know about TTML.\n const backgroundColor = TtmlTextParser.getStyleAttribute_(\n cueElement, region, styles, 'backgroundColor',\n shouldInheritRegionStyles);\n if (backgroundColor) {\n cue.backgroundColor =\n TtmlTextParser.convertTTMLrgbaToHTMLrgba_(backgroundColor);\n }\n\n const border = TtmlTextParser.getStyleAttribute_(\n cueElement, region, styles, 'border', shouldInheritRegionStyles);\n if (border) {\n cue.border = border;\n }\n\n const fontFamily = TtmlTextParser.getStyleAttribute_(\n cueElement, region, styles, 'fontFamily', shouldInheritRegionStyles);\n // See https://github.com/sandflow/imscJS/blob/1.1.3/src/main/js/html.js#L1384\n if (fontFamily) {\n switch (fontFamily) {\n case 'monospaceSerif':\n cue.fontFamily = 'Courier New,Liberation Mono,Courier,monospace';\n break;\n case 'proportionalSansSerif':\n cue.fontFamily = 'Arial,Helvetica,Liberation Sans,sans-serif';\n break;\n case 'sansSerif':\n cue.fontFamily = 'sans-serif';\n break;\n case 'monospaceSansSerif':\n // cspell: disable-next-line\n cue.fontFamily = 'Consolas,monospace';\n break;\n case 'proportionalSerif':\n cue.fontFamily = 'serif';\n break;\n default:\n cue.fontFamily = fontFamily.split(',').filter((font) => {\n return font != 'default';\n }).join(',');\n break;\n }\n }\n\n const fontWeight = TtmlTextParser.getStyleAttribute_(\n cueElement, region, styles, 'fontWeight', shouldInheritRegionStyles);\n if (fontWeight && fontWeight == 'bold') {\n cue.fontWeight = Cue.fontWeight.BOLD;\n }\n\n const wrapOption = TtmlTextParser.getStyleAttribute_(\n cueElement, region, styles, 'wrapOption', shouldInheritRegionStyles);\n if (wrapOption && wrapOption == 'noWrap') {\n cue.wrapLine = false;\n } else {\n cue.wrapLine = true;\n }\n\n const lineHeight = TtmlTextParser.getStyleAttribute_(\n cueElement, region, styles, 'lineHeight', shouldInheritRegionStyles);\n if (lineHeight && lineHeight.match(TtmlTextParser.unitValues_)) {\n cue.lineHeight = lineHeight;\n }\n\n const fontSize = TtmlTextParser.getStyleAttribute_(\n cueElement, region, styles, 'fontSize', shouldInheritRegionStyles);\n if (fontSize) {\n const isValidFontSizeUnit =\n fontSize.match(TtmlTextParser.unitValues_) ||\n fontSize.match(TtmlTextParser.percentValue_);\n\n if (isValidFontSizeUnit) {\n cue.fontSize = fontSize;\n }\n }\n\n const fontStyle = TtmlTextParser.getStyleAttribute_(\n cueElement, region, styles, 'fontStyle', shouldInheritRegionStyles);\n if (fontStyle) {\n goog.asserts.assert(fontStyle.toUpperCase() in Cue.fontStyle,\n fontStyle.toUpperCase() +\n ' Should be in Cue.fontStyle values!');\n cue.fontStyle = Cue.fontStyle[fontStyle.toUpperCase()];\n }\n\n if (imageElement) {\n // According to the spec, we should use imageType (camelCase), but\n // historically we have checked for imagetype (lowercase).\n // This was the case since background image support was first introduced\n // in PR #1859, in April 2019, and first released in v2.5.0.\n // Now we check for both, although only imageType (camelCase) is to spec.\n const backgroundImageType =\n imageElement.attributes['imageType'] ||\n imageElement.attributes['imagetype'];\n const backgroundImageEncoding = imageElement.attributes['encoding'];\n const backgroundImageData = (TXml.getTextContents(imageElement)).trim();\n if (backgroundImageType == 'PNG' &&\n backgroundImageEncoding == 'Base64' &&\n backgroundImageData) {\n cue.backgroundImage = 'data:image/png;base64,' + backgroundImageData;\n }\n } else if (imageUri) {\n cue.backgroundImage = imageUri;\n }\n\n const textOutline = TtmlTextParser.getStyleAttribute_(\n cueElement, region, styles, 'textOutline', shouldInheritRegionStyles);\n if (textOutline) {\n // tts:textOutline isn't natively supported by browsers, but it can be\n // mostly replicated using the non-standard -webkit-text-stroke-width and\n // -webkit-text-stroke-color properties.\n const split = textOutline.split(' ');\n if (split[0].match(TtmlTextParser.unitValues_)) {\n // There is no defined color, so default to the text color.\n cue.textStrokeColor = cue.color;\n } else {\n cue.textStrokeColor =\n TtmlTextParser.convertTTMLrgbaToHTMLrgba_(split[0]);\n split.shift();\n }\n if (split[0] && split[0].match(TtmlTextParser.unitValues_)) {\n cue.textStrokeWidth = split[0];\n } else {\n // If there is no width, or the width is not a number, don't draw a\n // border.\n cue.textStrokeColor = '';\n }\n // There is an optional blur radius also, but we have no way of\n // replicating that, so ignore it.\n }\n\n const letterSpacing = TtmlTextParser.getStyleAttribute_(\n cueElement, region, styles, 'letterSpacing', shouldInheritRegionStyles);\n if (letterSpacing && letterSpacing.match(TtmlTextParser.unitValues_)) {\n cue.letterSpacing = letterSpacing;\n }\n\n const linePadding = TtmlTextParser.getStyleAttribute_(\n cueElement, region, styles, 'linePadding', shouldInheritRegionStyles);\n if (linePadding && linePadding.match(TtmlTextParser.unitValues_)) {\n cue.linePadding = linePadding;\n }\n\n const opacity = TtmlTextParser.getStyleAttribute_(\n cueElement, region, styles, 'opacity', shouldInheritRegionStyles);\n if (opacity) {\n cue.opacity = parseFloat(opacity);\n }\n\n // Text decoration is an array of values which can come both from the\n // element's style or be inherited from elements' parent nodes. All of those\n // values should be applied as long as they don't contradict each other. If\n // they do, elements' own style gets preference.\n const textDecorationRegion = TtmlTextParser.getStyleAttributeFromRegion_(\n region, styles, 'textDecoration');\n if (textDecorationRegion) {\n TtmlTextParser.addTextDecoration_(cue, textDecorationRegion);\n }\n\n const textDecorationElement = TtmlTextParser.getStyleAttributeFromElement_(\n cueElement, styles, 'textDecoration');\n if (textDecorationElement) {\n TtmlTextParser.addTextDecoration_(cue, textDecorationElement);\n }\n\n const textCombine = TtmlTextParser.getStyleAttribute_(\n cueElement, region, styles, 'textCombine', shouldInheritRegionStyles);\n if (textCombine) {\n cue.textCombineUpright = textCombine;\n }\n\n const ruby = TtmlTextParser.getStyleAttribute_(\n cueElement, region, styles, 'ruby', shouldInheritRegionStyles);\n switch (ruby) {\n case 'container':\n cue.rubyTag = 'ruby';\n break;\n case 'text':\n cue.rubyTag = 'rt';\n break;\n }\n }\n\n /**\n * Parses text decoration values and adds/removes them to/from the cue.\n *\n * @param {!shaka.text.Cue} cue\n * @param {string} decoration\n * @private\n */\n static addTextDecoration_(cue, decoration) {\n const Cue = shaka.text.Cue;\n for (const value of decoration.split(' ')) {\n switch (value) {\n case 'underline':\n if (!cue.textDecoration.includes(Cue.textDecoration.UNDERLINE)) {\n cue.textDecoration.push(Cue.textDecoration.UNDERLINE);\n }\n break;\n case 'noUnderline':\n if (cue.textDecoration.includes(Cue.textDecoration.UNDERLINE)) {\n shaka.util.ArrayUtils.remove(cue.textDecoration,\n Cue.textDecoration.UNDERLINE);\n }\n break;\n case 'lineThrough':\n if (!cue.textDecoration.includes(Cue.textDecoration.LINE_THROUGH)) {\n cue.textDecoration.push(Cue.textDecoration.LINE_THROUGH);\n }\n break;\n case 'noLineThrough':\n if (cue.textDecoration.includes(Cue.textDecoration.LINE_THROUGH)) {\n shaka.util.ArrayUtils.remove(cue.textDecoration,\n Cue.textDecoration.LINE_THROUGH);\n }\n break;\n case 'overline':\n if (!cue.textDecoration.includes(Cue.textDecoration.OVERLINE)) {\n cue.textDecoration.push(Cue.textDecoration.OVERLINE);\n }\n break;\n case 'noOverline':\n if (cue.textDecoration.includes(Cue.textDecoration.OVERLINE)) {\n shaka.util.ArrayUtils.remove(cue.textDecoration,\n Cue.textDecoration.OVERLINE);\n }\n break;\n }\n }\n }\n\n /**\n * Finds a specified attribute on either the original cue element or its\n * associated region and returns the value if the attribute was found.\n *\n * @param {!shaka.extern.xml.Node} cueElement\n * @param {shaka.extern.xml.Node} region\n * @param {!Array<!shaka.extern.xml.Node>} styles\n * @param {string} attribute\n * @param {boolean=} shouldInheritRegionStyles\n * @return {?string}\n * @private\n */\n static getStyleAttribute_(cueElement, region, styles, attribute,\n shouldInheritRegionStyles=true) {\n // An attribute can be specified on region level or in a styling block\n // associated with the region or original element.\n const TtmlTextParser = shaka.text.TtmlTextParser;\n const attr = TtmlTextParser.getStyleAttributeFromElement_(\n cueElement, styles, attribute);\n if (attr) {\n return attr;\n }\n\n if (shouldInheritRegionStyles) {\n return TtmlTextParser.getStyleAttributeFromRegion_(\n region, styles, attribute);\n }\n return null;\n }\n\n /**\n * Finds a specified attribute on the element's associated region\n * and returns the value if the attribute was found.\n *\n * @param {shaka.extern.xml.Node} region\n * @param {!Array<!shaka.extern.xml.Node>} styles\n * @param {string} attribute\n * @return {?string}\n * @private\n */\n static getStyleAttributeFromRegion_(region, styles, attribute) {\n const TXml = shaka.util.TXml;\n const ttsNs = shaka.text.TtmlTextParser.styleNs_;\n\n if (!region) {\n return null;\n }\n\n const attr = TXml.getAttributeNSList(region, ttsNs, attribute);\n if (attr) {\n return attr;\n }\n\n return shaka.text.TtmlTextParser.getInheritedStyleAttribute_(\n region, styles, attribute);\n }\n\n /**\n * Finds a specified attribute on the cue element and returns the value\n * if the attribute was found.\n *\n * @param {!shaka.extern.xml.Node} cueElement\n * @param {!Array<!shaka.extern.xml.Node>} styles\n * @param {string} attribute\n * @return {?string}\n * @private\n */\n static getStyleAttributeFromElement_(cueElement, styles, attribute) {\n const TXml = shaka.util.TXml;\n const ttsNs = shaka.text.TtmlTextParser.styleNs_;\n\n // Styling on elements should take precedence\n // over the main styling attributes\n const elementAttribute = TXml.getAttributeNSList(\n cueElement,\n ttsNs,\n attribute);\n\n if (elementAttribute) {\n return elementAttribute;\n }\n return shaka.text.TtmlTextParser.getInheritedStyleAttribute_(\n cueElement, styles, attribute);\n }\n\n /**\n * Finds a specified attribute on an element's styles and the styles those\n * styles inherit from.\n *\n * @param {!shaka.extern.xml.Node} element\n * @param {!Array<!shaka.extern.xml.Node>} styles\n * @param {string} attribute\n * @return {?string}\n * @private\n */\n static getInheritedStyleAttribute_(element, styles, attribute) {\n const TXml = shaka.util.TXml;\n const ttsNs = shaka.text.TtmlTextParser.styleNs_;\n const ebuttsNs = shaka.text.TtmlTextParser.styleEbuttsNs_;\n\n const inheritedStyles =\n shaka.text.TtmlTextParser.getElementsFromCollection_(\n element, 'style', styles, /* prefix= */ '');\n\n let styleValue = null;\n\n // The last value in our styles stack takes the precedence over the others\n for (let i = 0; i < inheritedStyles.length; i++) {\n // Check ebu namespace first.\n let styleAttributeValue = TXml.getAttributeNS(\n inheritedStyles[i],\n ebuttsNs,\n attribute);\n\n if (!styleAttributeValue) {\n // Fall back to tts namespace.\n styleAttributeValue = TXml.getAttributeNSList(\n inheritedStyles[i],\n ttsNs,\n attribute);\n }\n\n if (!styleAttributeValue) {\n // Next, check inheritance.\n // Styles can inherit from other styles, so traverse up that chain.\n styleAttributeValue =\n shaka.text.TtmlTextParser.getStyleAttributeFromElement_(\n inheritedStyles[i], styles, attribute);\n }\n\n if (styleAttributeValue) {\n styleValue = styleAttributeValue;\n }\n }\n\n return styleValue;\n }\n\n\n /**\n * Selects items from |collection| whose id matches |attributeName|\n * from |element|.\n *\n * @param {shaka.extern.xml.Node} element\n * @param {string} attributeName\n * @param {!Array<shaka.extern.xml.Node>} collection\n * @param {string} prefixName\n * @param {string=} nsName\n * @return {!Array<!shaka.extern.xml.Node>}\n * @private\n */\n static getElementsFromCollection_(\n element, attributeName, collection, prefixName, nsName) {\n const items = [];\n\n if (!element || collection.length < 1) {\n return items;\n }\n\n const attributeValue = shaka.text.TtmlTextParser.getInheritedAttribute_(\n element, attributeName, nsName);\n\n if (attributeValue) {\n // There could be multiple items in one attribute\n // <span style=\"style1 style2\">A cue</span>\n const itemNames = attributeValue.split(' ');\n\n for (const name of itemNames) {\n for (const item of collection) {\n if ((prefixName + item.attributes['xml:id']) == name) {\n items.push(item);\n break;\n }\n }\n }\n }\n\n return items;\n }\n\n\n /**\n * Traverses upwards from a given node until a given attribute is found.\n *\n * @param {!shaka.extern.xml.Node} element\n * @param {string} attributeName\n * @param {string=} nsName\n * @return {?string}\n * @private\n */\n static getInheritedAttribute_(element, attributeName, nsName) {\n let ret = null;\n const TXml = shaka.util.TXml;\n while (!ret) {\n ret = nsName ?\n TXml.getAttributeNS(element, nsName, attributeName) :\n element.attributes[attributeName];\n if (ret) {\n break;\n }\n\n // Element.parentNode can lead to XMLDocument, which is not an Element and\n // has no getAttribute().\n const parentNode = element.parent;\n if (parentNode) {\n element = parentNode;\n } else {\n break;\n }\n }\n return ret;\n }\n\n /**\n * Factor parent/ancestor time attributes into the parsed time of a\n * child/descendent.\n *\n * @param {!shaka.extern.xml.Node} parentElement\n * @param {!shaka.text.TtmlTextParser.RateInfo_} rateInfo\n * @param {?number} start The child's start time\n * @param {?number} end The child's end time\n * @return {{start: ?number, end: ?number}}\n * @private\n */\n static resolveTime_(parentElement, rateInfo, start, end) {\n const parentTime = shaka.text.TtmlTextParser.parseTime_(\n parentElement, rateInfo);\n\n if (start == null) {\n // No start time of your own? Inherit from the parent.\n start = parentTime.start;\n } else {\n // Otherwise, the start time is relative to the parent's start time.\n if (parentTime.start != null) {\n start += parentTime.start;\n }\n }\n\n if (end == null) {\n // No end time of your own? Inherit from the parent.\n end = parentTime.end;\n } else {\n // Otherwise, the end time is relative to the parent's _start_ time.\n // This is not a typo. Both times are relative to the parent's _start_.\n if (parentTime.start != null) {\n end += parentTime.start;\n }\n }\n\n return {start, end};\n }\n\n /**\n * Parse TTML time attributes from the given element.\n *\n * @param {!shaka.extern.xml.Node} element\n * @param {!shaka.text.TtmlTextParser.RateInfo_} rateInfo\n * @return {{start: ?number, end: ?number}}\n * @private\n */\n static parseTime_(element, rateInfo) {\n const start = shaka.text.TtmlTextParser.parseTimeAttribute_(\n element.attributes['begin'], rateInfo);\n let end = shaka.text.TtmlTextParser.parseTimeAttribute_(\n element.attributes['end'], rateInfo);\n const duration = shaka.text.TtmlTextParser.parseTimeAttribute_(\n element.attributes['dur'], rateInfo);\n if (end == null && duration != null) {\n end = start + duration;\n }\n return {start, end};\n }\n\n /**\n * Parses a TTML time from the given attribute text.\n *\n * @param {string} text\n * @param {!shaka.text.TtmlTextParser.RateInfo_} rateInfo\n * @return {?number}\n * @private\n */\n static parseTimeAttribute_(text, rateInfo) {\n let ret = null;\n const TtmlTextParser = shaka.text.TtmlTextParser;\n\n if (TtmlTextParser.timeColonFormatFrames_.test(text)) {\n ret = TtmlTextParser.parseColonTimeWithFrames_(rateInfo, text);\n } else if (TtmlTextParser.timeColonFormat_.test(text)) {\n ret = TtmlTextParser.parseTimeFromRegex_(\n TtmlTextParser.timeColonFormat_, text);\n } else if (TtmlTextParser.timeColonFormatMilliseconds_.test(text)) {\n ret = TtmlTextParser.parseTimeFromRegex_(\n TtmlTextParser.timeColonFormatMilliseconds_, text);\n } else if (TtmlTextParser.timeFramesFormat_.test(text)) {\n ret = TtmlTextParser.parseFramesTime_(rateInfo, text);\n } else if (TtmlTextParser.timeTickFormat_.test(text)) {\n ret = TtmlTextParser.parseTickTime_(rateInfo, text);\n } else if (TtmlTextParser.timeHMSFormat_.test(text)) {\n ret = TtmlTextParser.parseTimeFromRegex_(\n TtmlTextParser.timeHMSFormat_, text);\n } else if (text) {\n // It's not empty or null, but it doesn't match a known format.\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.TEXT,\n shaka.util.Error.Code.INVALID_TEXT_CUE,\n 'Could not parse cue time range in TTML');\n }\n\n return ret;\n }\n\n /**\n * Parses a TTML time in frame format.\n *\n * @param {!shaka.text.TtmlTextParser.RateInfo_} rateInfo\n * @param {string} text\n * @return {?number}\n * @private\n */\n static parseFramesTime_(rateInfo, text) {\n // 75f or 75.5f\n const results = shaka.text.TtmlTextParser.timeFramesFormat_.exec(text);\n const frames = Number(results[1]);\n\n return frames / rateInfo.frameRate;\n }\n\n /**\n * Parses a TTML time in tick format.\n *\n * @param {!shaka.text.TtmlTextParser.RateInfo_} rateInfo\n * @param {string} text\n * @return {?number}\n * @private\n */\n static parseTickTime_(rateInfo, text) {\n // 50t or 50.5t\n const results = shaka.text.TtmlTextParser.timeTickFormat_.exec(text);\n const ticks = Number(results[1]);\n\n return ticks / rateInfo.tickRate;\n }\n\n /**\n * Parses a TTML colon formatted time containing frames.\n *\n * @param {!shaka.text.TtmlTextParser.RateInfo_} rateInfo\n * @param {string} text\n * @return {?number}\n * @private\n */\n static parseColonTimeWithFrames_(rateInfo, text) {\n // 01:02:43:07 ('07' is frames) or 01:02:43:07.1 (subframes)\n const results = shaka.text.TtmlTextParser.timeColonFormatFrames_.exec(text);\n\n const hours = Number(results[1]);\n const minutes = Number(results[2]);\n let seconds = Number(results[3]);\n let frames = Number(results[4]);\n const subframes = Number(results[5]) || 0;\n\n frames += subframes / rateInfo.subFrameRate;\n seconds += frames / rateInfo.frameRate;\n\n return seconds + (minutes * 60) + (hours * 3600);\n }\n\n /**\n * Parses a TTML time with a given regex. Expects regex to be some\n * sort of a time-matcher to match hours, minutes, seconds and milliseconds\n *\n * @param {!RegExp} regex\n * @param {string} text\n * @return {?number}\n * @private\n */\n static parseTimeFromRegex_(regex, text) {\n const results = regex.exec(text);\n if (results == null || results[0] == '') {\n return null;\n }\n // This capture is optional, but will still be in the array as undefined,\n // in which case it is 0.\n const hours = Number(results[1]) || 0;\n const minutes = Number(results[2]) || 0;\n const seconds = Number(results[3]) || 0;\n const milliseconds = Number(results[4]) || 0;\n\n return (milliseconds / 1000) + seconds + (minutes * 60) + (hours * 3600);\n }\n\n /**\n * If ttp:cellResolution provided returns cell resolution info\n * with number of columns and rows into which the Root Container\n * Region area is divided\n *\n * @param {?string} cellResolution\n * @return {?{columns: number, rows: number}}\n * @private\n */\n static getCellResolution_(cellResolution) {\n if (!cellResolution) {\n return null;\n }\n const matches = /^(\\d+) (\\d+)$/.exec(cellResolution);\n\n if (!matches) {\n return null;\n }\n\n const columns = parseInt(matches[1], 10);\n const rows = parseInt(matches[2], 10);\n\n return {columns, rows};\n }\n};\n\n/**\n * @summary\n * Contains information about frame/subframe rate\n * and frame rate multiplier for time in frame format.\n *\n * @example 01:02:03:04(4 frames) or 01:02:03:04.1(4 frames, 1 subframe)\n * @private\n */\nshaka.text.TtmlTextParser.RateInfo_ = class {\n /**\n * @param {?string} frameRate\n * @param {?string} subFrameRate\n * @param {?string} frameRateMultiplier\n * @param {?string} tickRate\n */\n constructor(frameRate, subFrameRate, frameRateMultiplier, tickRate) {\n /**\n * @type {number}\n */\n this.frameRate = Number(frameRate) || 30;\n\n /**\n * @type {number}\n */\n this.subFrameRate = Number(subFrameRate) || 1;\n\n /**\n * @type {number}\n */\n this.tickRate = Number(tickRate);\n if (this.tickRate == 0) {\n if (frameRate) {\n this.tickRate = this.frameRate * this.subFrameRate;\n } else {\n this.tickRate = 1;\n }\n }\n\n if (frameRateMultiplier) {\n const multiplierResults = /^(\\d+) (\\d+)$/g.exec(frameRateMultiplier);\n if (multiplierResults) {\n const numerator = Number(multiplierResults[1]);\n const denominator = Number(multiplierResults[2]);\n const multiplierNum = numerator / denominator;\n this.frameRate *= multiplierNum;\n }\n }\n }\n};\n\n/**\n * @const\n * @private {!RegExp}\n * @example 50.17% 10%\n */\nshaka.text.TtmlTextParser.percentValues_ =\n /^(\\d{1,2}(?:\\.\\d+)?|100(?:\\.0+)?)% (\\d{1,2}(?:\\.\\d+)?|100(?:\\.0+)?)%$/;\n\n/**\n * @const\n * @private {!RegExp}\n * @example 0.6% 90% 300% 1000%\n */\nshaka.text.TtmlTextParser.percentValue_ = /^(\\d{1,4}(?:\\.\\d+)?|100)%$/;\n\n/**\n * @const\n * @private {!RegExp}\n * @example 100px, 8em, 0.80c\n */\nshaka.text.TtmlTextParser.unitValues_ = /^(\\d+px|\\d+em|\\d*\\.?\\d+c)$/;\n\n/**\n * @const\n * @private {!RegExp}\n * @example 100px\n */\nshaka.text.TtmlTextParser.pixelValues_ = /^(\\d+)px (\\d+)px$/;\n\n/**\n * @const\n * @private {!RegExp}\n * @example 00:00:40:07 (7 frames) or 00:00:40:07.1 (7 frames, 1 subframe)\n */\nshaka.text.TtmlTextParser.timeColonFormatFrames_ =\n /^(\\d{2,}):(\\d{2}):(\\d{2}):(\\d{2})\\.?(\\d+)?$/;\n\n/**\n * @const\n * @private {!RegExp}\n * @example 00:00:40 or 00:40\n */\nshaka.text.TtmlTextParser.timeColonFormat_ = /^(?:(\\d{2,}):)?(\\d{2}):(\\d{2})$/;\n\n/**\n * @const\n * @private {!RegExp}\n * @example 01:02:43.0345555 or 02:43.03 or 02:45.5\n */\nshaka.text.TtmlTextParser.timeColonFormatMilliseconds_ =\n /^(?:(\\d{2,}):)?(\\d{2}):(\\d{2}\\.\\d+)$/;\n\n/**\n * @const\n * @private {!RegExp}\n * @example 75f or 75.5f\n */\nshaka.text.TtmlTextParser.timeFramesFormat_ = /^(\\d*(?:\\.\\d*)?)f$/;\n\n/**\n * @const\n * @private {!RegExp}\n * @example 50t or 50.5t\n */\nshaka.text.TtmlTextParser.timeTickFormat_ = /^(\\d*(?:\\.\\d*)?)t$/;\n\n/**\n * @const\n * @private {!RegExp}\n * @example 3.45h, 3m or 4.20s\n */\nshaka.text.TtmlTextParser.timeHMSFormat_ =\n new RegExp(['^(?:(\\\\d*(?:\\\\.\\\\d*)?)h)?',\n '(?:(\\\\d*(?:\\\\.\\\\d*)?)m)?',\n '(?:(\\\\d*(?:\\\\.\\\\d*)?)s)?',\n '(?:(\\\\d*(?:\\\\.\\\\d*)?)ms)?$'].join(''));\n\n/**\n * @const\n * @private {!Map<string, shaka.text.Cue.lineAlign>}\n */\nshaka.text.TtmlTextParser.textAlignToLineAlign_ = new Map()\n .set('left', shaka.text.Cue.lineAlign.START)\n .set('center', shaka.text.Cue.lineAlign.CENTER)\n .set('right', shaka.text.Cue.lineAlign.END)\n .set('start', shaka.text.Cue.lineAlign.START)\n .set('end', shaka.text.Cue.lineAlign.END);\n\n/**\n * @const\n * @private {!Map<string, shaka.text.Cue.positionAlign>}\n */\nshaka.text.TtmlTextParser.textAlignToPositionAlign_ = new Map()\n .set('left', shaka.text.Cue.positionAlign.LEFT)\n .set('center', shaka.text.Cue.positionAlign.CENTER)\n .set('right', shaka.text.Cue.positionAlign.RIGHT);\n\n/**\n * The namespace URL for TTML parameters. Can be assigned any name in the TTML\n * document, not just \"ttp:\", so we use this with getAttributeNS() to ensure\n * that we support arbitrary namespace names.\n *\n * @const {!Array<string>}\n * @private\n */\nshaka.text.TtmlTextParser.parameterNs_ = [\n 'http://www.w3.org/ns/ttml#parameter',\n 'http://www.w3.org/2006/10/ttaf1#parameter',\n];\n\n/**\n * The namespace URL for TTML styles. Can be assigned any name in the TTML\n * document, not just \"tts:\", so we use this with getAttributeNS() to ensure\n * that we support arbitrary namespace names.\n *\n * @const {!Array<string>}\n * @private\n */\nshaka.text.TtmlTextParser.styleNs_ = [\n 'http://www.w3.org/ns/ttml#styling',\n 'http://www.w3.org/2006/10/ttaf1#styling',\n];\n\n/**\n * The namespace URL for EBU TTML styles. Can be assigned any name in the TTML\n * document, not just \"ebutts:\", so we use this with getAttributeNS() to ensure\n * that we support arbitrary namespace names.\n *\n * @const {string}\n * @private\n */\nshaka.text.TtmlTextParser.styleEbuttsNs_ = 'urn:ebu:tt:style';\n\n/**\n * The supported namespace URLs for SMPTE fields.\n * @const {!Array<string>}\n * @private\n */\nshaka.text.TtmlTextParser.smpteNsList_ = [\n 'http://www.smpte-ra.org/schemas/2052-1/2010/smpte-tt',\n 'http://www.smpte-ra.org/schemas/2052-1/2013/smpte-tt',\n];\n\nshaka.text.TextEngine.registerParser(\n 'application/ttml+xml', () => new shaka.text.TtmlTextParser());\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.text.Mp4TtmlParser');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.text.TextEngine');\ngoog.require('shaka.text.TtmlTextParser');\ngoog.require('shaka.util.BufferUtils');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.Mp4BoxParsers');\ngoog.require('shaka.util.Mp4Parser');\ngoog.require('shaka.util.Uint8ArrayUtils');\n\n\n/**\n * @implements {shaka.extern.TextParser}\n * @export\n */\nshaka.text.Mp4TtmlParser = class {\n /** */\n constructor() {\n /**\n * @type {!shaka.extern.TextParser}\n * @private\n */\n this.parser_ = new shaka.text.TtmlTextParser();\n }\n\n /**\n * @override\n * @export\n */\n parseInit(data) {\n const Mp4Parser = shaka.util.Mp4Parser;\n\n let sawSTPP = false;\n\n new Mp4Parser()\n .box('moov', Mp4Parser.children)\n .box('trak', Mp4Parser.children)\n .box('mdia', Mp4Parser.children)\n .box('minf', Mp4Parser.children)\n .box('stbl', Mp4Parser.children)\n .fullBox('stsd', Mp4Parser.sampleDescription)\n .box('stpp', (box) => {\n sawSTPP = true;\n box.parser.stop();\n }).parse(data);\n\n if (!sawSTPP) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.TEXT,\n shaka.util.Error.Code.INVALID_MP4_TTML);\n }\n }\n\n /**\n * @override\n * @export\n */\n setSequenceMode(sequenceMode) {\n // Unused.\n }\n\n /**\n * @override\n * @export\n */\n setManifestType(manifestType) {\n // Unused.\n }\n\n /**\n * @override\n * @export\n */\n parseMedia(data, time, uri) {\n const Mp4Parser = shaka.util.Mp4Parser;\n\n let payload = [];\n let defaultSampleSize = null;\n\n /** @type {!Array<Uint8Array>} */\n const mdats = [];\n\n /* @type {!Map<number,!Array<number>>} */\n const subSampleSizesPerSample = new Map();\n\n /** @type {!Array<number>} */\n const sampleSizes = [];\n\n const parser = new Mp4Parser()\n .box('moof', Mp4Parser.children)\n .box('traf', Mp4Parser.children)\n .fullBox('tfhd', (box) => {\n goog.asserts.assert(\n box.flags != null,\n 'A TFHD box should have a valid flags value');\n const parsedTFHDBox = shaka.util.Mp4BoxParsers.parseTFHD(\n box.reader, box.flags);\n defaultSampleSize = parsedTFHDBox.defaultSampleSize;\n })\n .fullBox('trun', (box) => {\n goog.asserts.assert(\n box.version != null,\n 'A TRUN box should have a valid version value');\n goog.asserts.assert(\n box.flags != null,\n 'A TRUN box should have a valid flags value');\n\n const parsedTRUNBox = shaka.util.Mp4BoxParsers.parseTRUN(\n box.reader, box.version, box.flags);\n\n for (const sample of parsedTRUNBox.sampleData) {\n const sampleSize =\n sample.sampleSize || defaultSampleSize || 0;\n sampleSizes.push(sampleSize);\n }\n })\n .fullBox('subs', (box) => {\n const reader = box.reader;\n const entryCount = reader.readUint32();\n let currentSampleNum = -1;\n for (let i = 0; i < entryCount; i++) {\n const sampleDelta = reader.readUint32();\n currentSampleNum += sampleDelta;\n const subsampleCount = reader.readUint16();\n const subsampleSizes = [];\n for (let j = 0; j < subsampleCount; j++) {\n if (box.version == 1) {\n subsampleSizes.push(reader.readUint32());\n } else {\n subsampleSizes.push(reader.readUint16());\n }\n reader.readUint8(); // priority\n reader.readUint8(); // discardable\n reader.readUint32(); // codec_specific_parameters\n }\n subSampleSizesPerSample.set(currentSampleNum, subsampleSizes);\n }\n })\n .box('mdat', Mp4Parser.allData((data) => {\n // We collect all of the mdats first, before parsing any of them.\n // This is necessary in case the mp4 has multiple mdats.\n mdats.push(data);\n }));\n parser.parse(data, /* partialOkay= */ false);\n\n if (mdats.length == 0) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.TEXT,\n shaka.util.Error.Code.INVALID_MP4_TTML);\n }\n\n const fullData =\n shaka.util.Uint8ArrayUtils.concat(...mdats);\n\n let sampleOffset = 0;\n for (let sampleNum = 0; sampleNum < sampleSizes.length; sampleNum++) {\n const sampleData =\n shaka.util.BufferUtils.toUint8(fullData, sampleOffset,\n sampleSizes[sampleNum]);\n sampleOffset += sampleSizes[sampleNum];\n\n const subSampleSizes = subSampleSizesPerSample.get(sampleNum);\n\n if (subSampleSizes && subSampleSizes.length) {\n const contentData =\n shaka.util.BufferUtils.toUint8(sampleData, 0, subSampleSizes[0]);\n const images = [];\n let subOffset = subSampleSizes[0];\n for (let i = 1; i < subSampleSizes.length; i++) {\n const imageData =\n shaka.util.BufferUtils.toUint8(data, subOffset,\n subSampleSizes[i]);\n const raw =\n shaka.util.Uint8ArrayUtils.toStandardBase64(imageData);\n images.push('data:image/png;base64,' + raw);\n subOffset += subSampleSizes[i];\n }\n payload = payload.concat(\n this.parser_.parseMedia(contentData, time, uri, images));\n } else {\n payload = payload.concat(\n this.parser_.parseMedia(sampleData, time, uri,\n /* images= */ []));\n }\n }\n\n return payload;\n }\n};\n\n\nshaka.text.TextEngine.registerParser(\n 'application/mp4; codecs=\"stpp\"', () => new shaka.text.Mp4TtmlParser());\nshaka.text.TextEngine.registerParser(\n 'application/mp4; codecs=\"stpp.ttml\"',\n () => new shaka.text.Mp4TtmlParser());\nshaka.text.TextEngine.registerParser(\n 'application/mp4; codecs=\"stpp.ttml.im1i\"',\n () => new shaka.text.Mp4TtmlParser());\nshaka.text.TextEngine.registerParser(\n 'application/mp4; codecs=\"stpp.ttml.im1t\"',\n () => new shaka.text.Mp4TtmlParser());\nshaka.text.TextEngine.registerParser(\n 'application/mp4; codecs=\"stpp.ttml.im2i\"',\n () => new shaka.text.Mp4TtmlParser());\nshaka.text.TextEngine.registerParser(\n 'application/mp4; codecs=\"stpp.ttml.im2t\"',\n () => new shaka.text.Mp4TtmlParser());\nshaka.text.TextEngine.registerParser(\n 'application/mp4; codecs=\"stpp.ttml.etd1\"',\n () => new shaka.text.Mp4TtmlParser());\nshaka.text.TextEngine.registerParser(\n 'application/mp4; codecs=\"stpp.ttml.etd1|im1t\"',\n () => new shaka.text.Mp4TtmlParser());\nshaka.text.TextEngine.registerParser(\n 'application/mp4; codecs=\"stpp.ttml.im1t|etd1\"',\n () => new shaka.text.Mp4TtmlParser());\n\n// Legacy codec string uses capital \"TTML\", i.e.: prior to HLS rfc8216bis:\n// Note that if a Variant Stream specifies one or more Renditions that\n// include IMSC subtitles, the CODECS attribute MUST indicate this with a\n// format identifier such as \"stpp.ttml.im1t\".\n// (https://tools.ietf.org/html/draft-pantos-hls-rfc8216bis-05#section-4.4.5.2)\nshaka.text.TextEngine.registerParser(\n 'application/mp4; codecs=\"stpp.TTML.im1t\"',\n () => new shaka.text.Mp4TtmlParser());\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.text.VttTextParser');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.log');\ngoog.require('shaka.media.ManifestParser');\ngoog.require('shaka.text.Cue');\ngoog.require('shaka.text.CueRegion');\ngoog.require('shaka.text.TextEngine');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.StringUtils');\ngoog.require('shaka.util.TextParser');\n\n\n/**\n * @implements {shaka.extern.TextParser}\n * @export\n */\nshaka.text.VttTextParser = class {\n /** Constructs a VTT parser. */\n constructor() {\n /** @private {boolean} */\n this.sequenceMode_ = false;\n\n /** @private {string} */\n this.manifestType_ = shaka.media.ManifestParser.UNKNOWN;\n }\n\n /**\n * @override\n * @export\n */\n parseInit(data) {\n goog.asserts.assert(false, 'VTT does not have init segments');\n }\n\n /**\n * @override\n * @export\n */\n setSequenceMode(sequenceMode) {\n this.sequenceMode_ = sequenceMode;\n }\n\n /**\n * @override\n * @export\n */\n setManifestType(manifestType) {\n this.manifestType_ = manifestType;\n }\n\n /**\n * @override\n * @export\n */\n parseMedia(data, time) {\n const VttTextParser = shaka.text.VttTextParser;\n // Get the input as a string. Normalize newlines to \\n.\n let str = shaka.util.StringUtils.fromUTF8(data);\n str = str.replace(/\\r\\n|\\r(?=[^\\n]|$)/gm, '\\n');\n const blocks = str.split(/\\n{2,}/m);\n\n if (!/^WEBVTT($|[ \\t\\n])/m.test(blocks[0])) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.TEXT,\n shaka.util.Error.Code.INVALID_TEXT_HEADER);\n }\n\n // Depending on \"segmentRelativeVttTiming\" configuration,\n // \"vttOffset\" will correspond to either \"periodStart\" (default)\n // or \"segmentStart\", for segmented VTT where timings are relative\n // to the beginning of each segment.\n // NOTE: \"periodStart\" is the timestamp offset applied via TextEngine.\n // It is no longer closely tied to periods, but the name stuck around.\n // NOTE: This offset and the flag choosing its meaning have no effect on\n // HLS content, which should use X-TIMESTAMP-MAP and periodStart instead.\n let offset = time.vttOffset;\n\n if (this.manifestType_ == shaka.media.ManifestParser.HLS) {\n // Only use 'X-TIMESTAMP-MAP' with HLS.\n if (blocks[0].includes('X-TIMESTAMP-MAP')) {\n offset = this.computeHlsOffset_(blocks[0], time);\n } else if (time.periodStart && time.vttOffset == time.periodStart) {\n // In the case where X-TIMESTAMP-MAP is not used and it is HLS, we\n // should not use offset unless segment-relative times are used.\n offset = 0;\n }\n }\n\n // Parse VTT regions.\n /* !Array<!shaka.text.CueRegion> */\n const regions = [];\n for (const line of blocks[0].split('\\n')) {\n if (/^Region:/.test(line)) {\n const region = VttTextParser.parseRegion_(line);\n regions.push(region);\n }\n }\n\n /** @type {!Map<string, !shaka.text.Cue>} */\n const styles = new Map();\n shaka.text.Cue.addDefaultTextColor(styles);\n\n // Parse cues.\n const ret = [];\n for (const block of blocks.slice(1)) {\n const lines = block.split('\\n');\n VttTextParser.parseStyle_(lines, styles);\n const cue = VttTextParser.parseCue_(lines, offset, regions, styles);\n if (cue) {\n ret.push(cue);\n }\n }\n\n return ret;\n }\n\n /**\n * @param {string} headerBlock Contains X-TIMESTAMP-MAP.\n * @param {shaka.extern.TextParser.TimeContext} time\n * @return {number}\n * @private\n */\n computeHlsOffset_(headerBlock, time) {\n // https://bit.ly/2K92l7y\n // The 'X-TIMESTAMP-MAP' header is used in HLS to align text with\n // the rest of the media.\n // The header format is 'X-TIMESTAMP-MAP=MPEGTS:n,LOCAL:m'\n // (the attributes can go in any order)\n // where n is MPEG-2 time and m is cue time it maps to.\n // For example 'X-TIMESTAMP-MAP=LOCAL:00:00:00.000,MPEGTS:900000'\n // means an offset of 10 seconds\n // 900000/MPEG_TIMESCALE - cue time.\n const cueTimeMatch = headerBlock.match(\n /LOCAL:((?:(\\d{1,}):)?(\\d{2}):(\\d{2})\\.(\\d{3}))/m);\n const mpegTimeMatch = headerBlock.match(/MPEGTS:(\\d+)/m);\n\n if (!cueTimeMatch || !mpegTimeMatch) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.TEXT,\n shaka.util.Error.Code.INVALID_TEXT_HEADER);\n }\n\n const cueTime = shaka.util.TextParser.parseTime(cueTimeMatch[1]);\n if (cueTime == null) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.TEXT,\n shaka.util.Error.Code.INVALID_TEXT_HEADER);\n }\n\n let mpegTime = Number(mpegTimeMatch[1]);\n const mpegTimescale = shaka.text.VttTextParser.MPEG_TIMESCALE_;\n\n const rolloverSeconds =\n shaka.text.VttTextParser.TS_ROLLOVER_ / mpegTimescale;\n let segmentStart = time.segmentStart - time.periodStart;\n while (segmentStart >= rolloverSeconds) {\n segmentStart -= rolloverSeconds;\n mpegTime += shaka.text.VttTextParser.TS_ROLLOVER_;\n }\n\n return time.periodStart + mpegTime / mpegTimescale - cueTime;\n }\n\n /**\n * Parses a string into a Region object.\n *\n * @param {string} text\n * @return {!shaka.text.CueRegion}\n * @private\n */\n static parseRegion_(text) {\n const VttTextParser = shaka.text.VttTextParser;\n const parser = new shaka.util.TextParser(text);\n // The region string looks like this:\n // Region: id=fred width=50% lines=3 regionanchor=0%,100%\n // viewportanchor=10%,90% scroll=up\n const region = new shaka.text.CueRegion();\n\n // Skip 'Region:'\n parser.readWord();\n parser.skipWhitespace();\n\n let word = parser.readWord();\n while (word) {\n if (!VttTextParser.parseRegionSetting_(region, word)) {\n shaka.log.warning(\n 'VTT parser encountered an invalid VTTRegion setting: ', word,\n ' The setting will be ignored.');\n }\n parser.skipWhitespace();\n word = parser.readWord();\n }\n\n return region;\n }\n\n /**\n * Parses a style block into a Cue object.\n *\n * @param {!Array<string>} text\n * @param {!Map<string, !shaka.text.Cue>} styles\n * @private\n */\n static parseStyle_(text, styles) {\n // Skip empty blocks.\n if (text.length == 1 && !text[0]) {\n return;\n }\n\n // Skip comment blocks.\n if (/^NOTE($|[ \\t])/.test(text[0])) {\n return;\n }\n\n // Only style block are allowed.\n if (text[0] != 'STYLE') {\n return;\n }\n\n /** @type {!Array<!Array<string>>} */\n const styleBlocks = [];\n let lastBlockIndex = -1;\n for (let i = 1; i < text.length; i++) {\n if (text[i].includes('::cue')) {\n styleBlocks.push([]);\n lastBlockIndex = styleBlocks.length - 1;\n }\n if (lastBlockIndex == -1) {\n continue;\n }\n styleBlocks[lastBlockIndex].push(text[i]);\n if (text[i].includes('}')) {\n lastBlockIndex = -1;\n }\n }\n\n for (const styleBlock of styleBlocks) {\n let styleSelector = 'global';\n // Look for what is within parentheses. For example:\n // <code>:: cue (b) {</code>, what we are looking for is <code>b</code>\n const selector = styleBlock[0].match(/\\((.*)\\)/);\n if (selector) {\n styleSelector = selector.pop();\n }\n\n // We start at 1 to avoid '::cue' and end earlier to avoid '}'\n let propertyLines = styleBlock.slice(1, -1);\n if (styleBlock[0].includes('}')) {\n const payload = /\\{(.*?)\\}/.exec(styleBlock[0]);\n if (payload) {\n propertyLines = payload[1].split(';');\n }\n }\n\n // Continue styles over multiple selectors if necessary.\n // For example,\n // ::cue(b) { background: white; } ::cue(b) { color: blue; }\n // should set both the background and foreground of bold tags.\n let cue = styles.get(styleSelector);\n if (!cue) {\n cue = new shaka.text.Cue(0, 0, '');\n }\n\n let validStyle = false;\n for (let i = 0; i < propertyLines.length; i++) {\n // We look for CSS properties. As a general rule they are separated by\n // <code>:</code>. Eg: <code>color: red;</code>\n const lineParts = /^\\s*([^:]+):\\s*(.*)/.exec(propertyLines[i]);\n if (lineParts) {\n const name = lineParts[1].trim();\n const value = lineParts[2].trim().replace(';', '');\n switch (name) {\n case 'background-color':\n case 'background':\n validStyle = true;\n cue.backgroundColor = value;\n break;\n case 'color':\n validStyle = true;\n cue.color = value;\n break;\n case 'font-family':\n validStyle = true;\n cue.fontFamily = value;\n break;\n case 'font-size':\n validStyle = true;\n cue.fontSize = value;\n break;\n case 'font-weight':\n if (parseInt(value, 10) >= 700 || value == 'bold') {\n validStyle = true;\n cue.fontWeight = shaka.text.Cue.fontWeight.BOLD;\n }\n break;\n case 'font-style':\n switch (value) {\n case 'normal':\n validStyle = true;\n cue.fontStyle = shaka.text.Cue.fontStyle.NORMAL;\n break;\n case 'italic':\n validStyle = true;\n cue.fontStyle = shaka.text.Cue.fontStyle.ITALIC;\n break;\n case 'oblique':\n validStyle = true;\n cue.fontStyle = shaka.text.Cue.fontStyle.OBLIQUE;\n break;\n }\n break;\n case 'opacity':\n validStyle = true;\n cue.opacity = parseFloat(value);\n break;\n case 'text-combine-upright':\n validStyle = true;\n cue.textCombineUpright = value;\n break;\n case 'text-shadow':\n validStyle = true;\n cue.textShadow = value;\n break;\n case 'white-space':\n validStyle = true;\n cue.wrapLine = value != 'noWrap';\n break;\n default:\n shaka.log.warning('VTT parser encountered an unsupported style: ',\n lineParts);\n break;\n }\n }\n }\n\n if (validStyle) {\n styles.set(styleSelector, cue);\n }\n }\n }\n\n /**\n * Parses a text block into a Cue object.\n *\n * @param {!Array<string>} text\n * @param {number} timeOffset\n * @param {!Array<!shaka.text.CueRegion>} regions\n * @param {!Map<string, !shaka.text.Cue>} styles\n * @return {shaka.text.Cue}\n * @private\n */\n static parseCue_(text, timeOffset, regions, styles) {\n const VttTextParser = shaka.text.VttTextParser;\n\n // Skip empty blocks.\n if (text.length == 1 && !text[0]) {\n return null;\n }\n\n // Skip comment blocks.\n if (/^NOTE($|[ \\t])/.test(text[0])) {\n return null;\n }\n\n // Skip style and region blocks.\n if (text[0] == 'STYLE' || text[0] == 'REGION') {\n return null;\n }\n\n let id = null;\n if (!text[0].includes('-->')) {\n id = text[0];\n text.splice(0, 1);\n }\n\n // Parse the times.\n const parser = new shaka.util.TextParser(text[0]);\n let start = parser.parseTime();\n const expect = parser.readRegex(/[ \\t]+-->[ \\t]+/g);\n let end = parser.parseTime();\n\n if (start == null || expect == null || end == null) {\n shaka.log.alwaysWarn(\n 'Failed to parse VTT time code. Cue skipped:', id, text);\n return null;\n }\n\n start += timeOffset;\n end += timeOffset;\n\n // Get the payload.\n const payload = text.slice(1).join('\\n').trim();\n\n let cue = null;\n if (styles.has('global')) {\n cue = styles.get('global').clone();\n cue.startTime = start;\n cue.endTime = end;\n cue.payload = payload;\n } else {\n cue = new shaka.text.Cue(start, end, payload);\n }\n\n // Parse optional settings.\n parser.skipWhitespace();\n let word = parser.readWord();\n while (word) {\n if (!VttTextParser.parseCueSetting(cue, word, regions)) {\n shaka.log.warning('VTT parser encountered an invalid VTT setting: ',\n word,\n ' The setting will be ignored.');\n }\n parser.skipWhitespace();\n word = parser.readWord();\n }\n\n shaka.text.Cue.parseCuePayload(cue, styles);\n\n if (id != null) {\n cue.id = id;\n }\n return cue;\n }\n\n /**\n * Parses a WebVTT setting from the given word.\n *\n * @param {!shaka.text.Cue} cue\n * @param {string} word\n * @param {!Array<!shaka.text.CueRegion>} regions\n * @return {boolean} True on success.\n */\n static parseCueSetting(cue, word, regions) {\n const VttTextParser = shaka.text.VttTextParser;\n let results = null;\n if ((results = /^align:(start|middle|center|end|left|right)$/.exec(word))) {\n VttTextParser.setTextAlign_(cue, results[1]);\n } else if ((results = /^vertical:(lr|rl)$/.exec(word))) {\n VttTextParser.setVerticalWritingMode_(cue, results[1]);\n } else if ((results = /^size:([\\d.]+)%$/.exec(word))) {\n cue.size = Number(results[1]);\n } else if ((results =\n // eslint-disable-next-line @stylistic/max-len\n /^position:([\\d.]+)%(?:,(line-left|line-right|middle|center|start|end|auto))?$/\n .exec(word))) {\n cue.position = Number(results[1]);\n if (results[2]) {\n VttTextParser.setPositionAlign_(cue, results[2]);\n }\n } else if ((results = /^region:(.*)$/.exec(word))) {\n const region = VttTextParser.getRegionById_(regions, results[1]);\n if (region) {\n cue.region = region;\n }\n } else {\n return VttTextParser.parsedLineValueAndInterpretation_(cue, word);\n }\n\n return true;\n }\n\n /**\n *\n * @param {!Array<!shaka.text.CueRegion>} regions\n * @param {string} id\n * @return {?shaka.text.CueRegion}\n * @private\n */\n static getRegionById_(regions, id) {\n const regionsWithId = regions.filter((region) => {\n return region.id == id;\n });\n if (!regionsWithId.length) {\n shaka.log.warning('VTT parser could not find a region with id: ',\n id,\n ' The region will be ignored.');\n return null;\n }\n goog.asserts.assert(regionsWithId.length == 1,\n 'VTTRegion ids should be unique!');\n\n return regionsWithId[0];\n }\n\n /**\n * Parses a WebVTTRegion setting from the given word.\n *\n * @param {!shaka.text.CueRegion} region\n * @param {string} word\n * @return {boolean} True on success.\n * @private\n */\n static parseRegionSetting_(region, word) {\n let results = null;\n if ((results = /^id=(.*)$/.exec(word))) {\n region.id = results[1];\n } else if ((results = /^width=(\\d{1,2}|100)%$/.exec(word))) {\n region.width = Number(results[1]);\n } else if ((results = /^lines=(\\d+)$/.exec(word))) {\n region.height = Number(results[1]);\n region.heightUnits = shaka.text.CueRegion.units.LINES;\n } else if ((results = /^regionanchor=(\\d{1,2}|100)%,(\\d{1,2}|100)%$/\n .exec(word))) {\n region.regionAnchorX = Number(results[1]);\n region.regionAnchorY = Number(results[2]);\n } else if ((results = /^viewportanchor=(\\d{1,2}|100)%,(\\d{1,2}|100)%$/\n .exec(word))) {\n region.viewportAnchorX = Number(results[1]);\n region.viewportAnchorY = Number(results[2]);\n } else if ((results = /^scroll=up$/.exec(word))) {\n region.scroll = shaka.text.CueRegion.scrollMode.UP;\n } else {\n return false;\n }\n\n return true;\n }\n\n /**\n * @param {!shaka.text.Cue} cue\n * @param {string} align\n * @private\n */\n static setTextAlign_(cue, align) {\n const Cue = shaka.text.Cue;\n if (align == 'middle') {\n cue.textAlign = Cue.textAlign.CENTER;\n } else {\n goog.asserts.assert(align.toUpperCase() in Cue.textAlign,\n align.toUpperCase() +\n ' Should be in Cue.textAlign values!');\n\n cue.textAlign = Cue.textAlign[align.toUpperCase()];\n }\n }\n\n /**\n * @param {!shaka.text.Cue} cue\n * @param {string} align\n * @private\n */\n static setPositionAlign_(cue, align) {\n const Cue = shaka.text.Cue;\n if (align == 'line-left' || align == 'start') {\n cue.positionAlign = Cue.positionAlign.LEFT;\n } else if (align == 'line-right' || align == 'end') {\n cue.positionAlign = Cue.positionAlign.RIGHT;\n } else if (align == 'center' || align == 'middle') {\n cue.positionAlign = Cue.positionAlign.CENTER;\n } else {\n cue.positionAlign = Cue.positionAlign.AUTO;\n }\n }\n\n /**\n * @param {!shaka.text.Cue} cue\n * @param {string} value\n * @private\n */\n static setVerticalWritingMode_(cue, value) {\n const Cue = shaka.text.Cue;\n if (value == 'lr') {\n cue.writingMode = Cue.writingMode.VERTICAL_LEFT_TO_RIGHT;\n } else {\n cue.writingMode = Cue.writingMode.VERTICAL_RIGHT_TO_LEFT;\n }\n }\n\n /**\n * @param {!shaka.text.Cue} cue\n * @param {string} word\n * @return {boolean}\n * @private\n */\n static parsedLineValueAndInterpretation_(cue, word) {\n const Cue = shaka.text.Cue;\n let results = null;\n if ((results = /^line:([\\d.]+)%(?:,(start|end|center))?$/.exec(word))) {\n cue.lineInterpretation = Cue.lineInterpretation.PERCENTAGE;\n cue.line = Number(results[1]);\n if (results[2]) {\n goog.asserts.assert(\n results[2].toUpperCase() in Cue.lineAlign,\n results[2].toUpperCase() + ' Should be in Cue.lineAlign values!');\n cue.lineAlign = Cue.lineAlign[results[2].toUpperCase()];\n }\n } else if ((results =\n /^line:(-?\\d+)(?:,(start|end|center))?$/.exec(word))) {\n cue.lineInterpretation = Cue.lineInterpretation.LINE_NUMBER;\n cue.line = Number(results[1]);\n if (results[2]) {\n goog.asserts.assert(\n results[2].toUpperCase() in Cue.lineAlign,\n results[2].toUpperCase() + ' Should be in Cue.lineAlign values!');\n cue.lineAlign = Cue.lineAlign[results[2].toUpperCase()];\n }\n } else {\n return false;\n }\n\n return true;\n }\n};\n\n/**\n * @const {number}\n * @private\n */\nshaka.text.VttTextParser.MPEG_TIMESCALE_ = 90000;\n\n/**\n * At this value, timestamps roll over in TS content.\n * @const {number}\n * @private\n */\nshaka.text.VttTextParser.TS_ROLLOVER_ = 0x200000000;\n\nshaka.text.TextEngine.registerParser(\n 'text/vtt', () => new shaka.text.VttTextParser());\n\nshaka.text.TextEngine.registerParser(\n 'text/vtt; codecs=\"vtt\"', () => new shaka.text.VttTextParser());\n\nshaka.text.TextEngine.registerParser(\n 'text/vtt; codecs=\"wvtt\"', () => new shaka.text.VttTextParser());\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.text.Mp4VttParser');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.log');\ngoog.require('shaka.text.Cue');\ngoog.require('shaka.text.TextEngine');\ngoog.require('shaka.text.VttTextParser');\ngoog.require('shaka.util.DataViewReader');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.Functional');\ngoog.require('shaka.util.Mp4Parser');\ngoog.require('shaka.util.Mp4BoxParsers');\ngoog.require('shaka.util.StringUtils');\ngoog.require('shaka.util.TextParser');\n\n\n/**\n * @implements {shaka.extern.TextParser}\n * @export\n */\nshaka.text.Mp4VttParser = class {\n /** */\n constructor() {\n /**\n * The current time scale used by the VTT parser.\n *\n * @type {?number}\n * @private\n */\n this.timescale_ = null;\n }\n\n /**\n * @override\n * @export\n */\n parseInit(data) {\n const Mp4Parser = shaka.util.Mp4Parser;\n\n let sawWVTT = false;\n\n new Mp4Parser()\n .box('moov', Mp4Parser.children)\n .box('trak', Mp4Parser.children)\n .box('mdia', Mp4Parser.children)\n .fullBox('mdhd', (box) => {\n goog.asserts.assert(\n box.version == 0 || box.version == 1,\n 'MDHD version can only be 0 or 1');\n\n const parsedMDHDBox = shaka.util.Mp4BoxParsers.parseMDHD(\n box.reader, box.version);\n this.timescale_ = parsedMDHDBox.timescale;\n })\n .box('minf', Mp4Parser.children)\n .box('stbl', Mp4Parser.children)\n .fullBox('stsd', Mp4Parser.sampleDescription)\n .box('wvtt', (box) => {\n // A valid vtt init segment, though we have no actual subtitles yet.\n sawWVTT = true;\n }).parse(data);\n\n if (!this.timescale_) {\n // Missing timescale for VTT content. It should be located in the MDHD.\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.TEXT,\n shaka.util.Error.Code.INVALID_MP4_VTT);\n }\n\n if (!sawWVTT) {\n // A WVTT box should have been seen (a valid vtt init segment with no\n // actual subtitles).\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.TEXT,\n shaka.util.Error.Code.INVALID_MP4_VTT);\n }\n }\n\n /**\n * @override\n * @export\n */\n setSequenceMode(sequenceMode) {\n // Unused.\n }\n\n /**\n * @override\n * @export\n */\n setManifestType(manifestType) {\n // Unused.\n }\n\n /**\n * @override\n * @export\n */\n parseMedia(data, time) {\n if (!data.length) {\n return [];\n }\n\n if (!this.timescale_) {\n // Missing timescale for VTT content. We should have seen the init\n // segment.\n shaka.log.error('No init segment for MP4+VTT!');\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.TEXT,\n shaka.util.Error.Code.INVALID_MP4_VTT);\n }\n\n const Mp4Parser = shaka.util.Mp4Parser;\n\n let baseTime = 0;\n /** @type {!Array<shaka.util.ParsedTRUNSample>} */\n let presentations = [];\n /** @type {!Uint8Array} */\n let rawPayload;\n /** @type {!Array<shaka.text.Cue>} */\n const cues = [];\n\n let sawTFDT = false;\n let sawTRUN = false;\n let sawMDAT = false;\n let defaultDuration = null;\n\n const parser = new Mp4Parser()\n .box('moof', Mp4Parser.children)\n .box('traf', Mp4Parser.children)\n .fullBox('tfdt', (box) => {\n sawTFDT = true;\n goog.asserts.assert(\n box.version == 0 || box.version == 1,\n 'TFDT version can only be 0 or 1');\n\n const parsedTFDTBox = shaka.util.Mp4BoxParsers.parseTFDTInaccurate(\n box.reader, box.version);\n baseTime = parsedTFDTBox.baseMediaDecodeTime;\n })\n .fullBox('tfhd', (box) => {\n goog.asserts.assert(\n box.flags != null,\n 'A TFHD box should have a valid flags value');\n const parsedTFHDBox = shaka.util.Mp4BoxParsers.parseTFHD(\n box.reader, box.flags);\n defaultDuration = parsedTFHDBox.defaultSampleDuration;\n })\n .fullBox('trun', (box) => {\n sawTRUN = true;\n goog.asserts.assert(\n box.version != null,\n 'A TRUN box should have a valid version value');\n goog.asserts.assert(\n box.flags != null,\n 'A TRUN box should have a valid flags value');\n\n const parsedTRUNBox = shaka.util.Mp4BoxParsers.parseTRUN(\n box.reader, box.version, box.flags);\n presentations = parsedTRUNBox.sampleData;\n })\n .box('mdat', Mp4Parser.allData((data) => {\n goog.asserts.assert(\n !sawMDAT,\n 'VTT cues in mp4 with multiple MDAT are not currently supported');\n sawMDAT = true;\n rawPayload = data;\n }));\n parser.parse(data, /* partialOkay= */ false);\n\n if (!sawMDAT && !sawTFDT && !sawTRUN) {\n // A required box is missing.\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.TEXT,\n shaka.util.Error.Code.INVALID_MP4_VTT);\n }\n\n let currentTime = baseTime;\n\n /** @type {!shaka.util.DataViewReader} */\n const reader = new shaka.util.DataViewReader(\n rawPayload, shaka.util.DataViewReader.Endianness.BIG_ENDIAN);\n\n for (const presentation of presentations) {\n // If one presentation corresponds to multiple payloads, it is assumed\n // that all of those payloads have the same start time and duration.\n const duration = presentation.sampleDuration || defaultDuration;\n const startTime = presentation.sampleCompositionTimeOffset ?\n baseTime + presentation.sampleCompositionTimeOffset :\n currentTime;\n currentTime = startTime + (duration || 0);\n\n // Read samples until it adds up to the given size.\n let totalSize = 0;\n do {\n // Read the payload size.\n const payloadSize = reader.readUint32();\n totalSize += payloadSize;\n\n // Skip the type.\n const payloadType = reader.readUint32();\n const payloadName = shaka.util.Mp4Parser.typeToString(payloadType);\n\n // Read the data payload.\n /** @type {Uint8Array} */\n let payload = null;\n if (payloadName == 'vttc') {\n if (payloadSize > 8) {\n payload = reader.readBytes(payloadSize - 8);\n }\n } else if (payloadName == 'vtte') {\n // It's a vtte, which is a vtt cue that is empty. Ignore any data that\n // does exist.\n reader.skip(payloadSize - 8);\n } else {\n shaka.log.error('Unknown box ' + payloadName + '! Skipping!');\n reader.skip(payloadSize - 8);\n }\n\n if (duration) {\n if (payload) {\n goog.asserts.assert(\n this.timescale_ != null, 'Timescale should not be null!');\n const cue = shaka.text.Mp4VttParser.parseVTTC_(\n payload,\n time.periodStart + startTime / this.timescale_,\n time.periodStart + currentTime / this.timescale_);\n cues.push(cue);\n }\n } else {\n shaka.log.error(\n 'WVTT sample duration unknown, and no default found!');\n }\n\n goog.asserts.assert(\n !presentation.sampleSize || totalSize <= presentation.sampleSize,\n 'The samples do not fit evenly into the sample sizes given in ' +\n 'the TRUN box!');\n\n // If no sampleSize was specified, it's assumed that this presentation\n // corresponds to only a single cue.\n } while (presentation.sampleSize &&\n (totalSize < presentation.sampleSize));\n }\n\n goog.asserts.assert(\n !reader.hasMoreData(),\n 'MDAT which contain VTT cues and non-VTT data are not currently ' +\n 'supported!');\n\n return /** @type {!Array<!shaka.text.Cue>} */ (\n cues.filter(shaka.util.Functional.isNotNull));\n }\n\n /**\n * Parses a vttc box into a cue.\n *\n * @param {!Uint8Array} data\n * @param {number} startTime\n * @param {number} endTime\n * @return {shaka.text.Cue}\n * @private\n */\n static parseVTTC_(data, startTime, endTime) {\n let payload;\n let id;\n let settings;\n\n new shaka.util.Mp4Parser()\n .box('payl', shaka.util.Mp4Parser.allData((data) => {\n payload = shaka.util.StringUtils.fromUTF8(data);\n }))\n .box('iden', shaka.util.Mp4Parser.allData((data) => {\n id = shaka.util.StringUtils.fromUTF8(data);\n }))\n .box('sttg', shaka.util.Mp4Parser.allData((data) => {\n settings = shaka.util.StringUtils.fromUTF8(data);\n }))\n .parse(data);\n\n if (payload) {\n return shaka.text.Mp4VttParser.assembleCue_(\n payload, id, settings, startTime, endTime);\n } else {\n return null;\n }\n }\n\n /**\n * Take the individual components that make a cue and create a vttc cue.\n *\n * @param {string} payload\n * @param {?string} id\n * @param {?string} settings\n * @param {number} startTime\n * @param {number} endTime\n * @return {!shaka.text.Cue}\n * @private\n */\n static assembleCue_(payload, id, settings, startTime, endTime) {\n const cue = new shaka.text.Cue(startTime, endTime, payload);\n shaka.text.Cue.parseCuePayload(cue);\n\n if (id) {\n cue.id = id;\n }\n\n if (settings) {\n const parser = new shaka.util.TextParser(settings);\n\n let word = parser.readWord();\n\n while (word) {\n // TODO: Check WebVTTConfigurationBox for region info.\n if (!shaka.text.VttTextParser.parseCueSetting(\n cue, word, /* VTTRegions= */[])) {\n shaka.log.warning(\n 'VTT parser encountered an invalid VTT setting: ', word,\n ' The setting will be ignored.');\n }\n\n parser.skipWhitespace();\n word = parser.readWord();\n }\n }\n\n return cue;\n }\n};\n\nshaka.text.TextEngine.registerParser(\n 'application/mp4; codecs=\"wvtt\"', () => new shaka.text.Mp4VttParser());\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.text.SbvTextParser');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.text.Cue');\ngoog.require('shaka.text.TextEngine');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.StringUtils');\ngoog.require('shaka.util.TextParser');\n\n\n/**\n * @implements {shaka.extern.TextParser}\n * @export\n */\nshaka.text.SbvTextParser = class {\n /**\n * @override\n * @export\n */\n parseInit(data) {\n goog.asserts.assert(false, 'SubViewer does not have init segments');\n }\n\n /**\n * @override\n * @export\n */\n setSequenceMode(sequenceMode) {\n // Unused.\n }\n\n /**\n * @override\n * @export\n */\n setManifestType(manifestType) {\n // Unused.\n }\n\n /**\n * @override\n * @export\n */\n parseMedia(data, time) {\n const StringUtils = shaka.util.StringUtils;\n\n // Get the input as a string.\n const strFromData = StringUtils.fromUTF8(data);\n // remove dos newlines\n let str = strFromData.replace(/\\r+/g, '');\n // trim white space start and end\n str = str.trim();\n\n /** @type {!Array<!shaka.text.Cue>} */\n const cues = [];\n\n // Supports no cues\n if (str == '') {\n return cues;\n }\n\n // get cues\n const blocklist = str.split('\\n\\n');\n for (const block of blocklist) {\n const lines = block.split('\\n');\n // Parse the times.\n const parser = new shaka.util.TextParser(lines[0]);\n const start = parser.parseTime();\n const expect = parser.readRegex(/,/g);\n const end = parser.parseTime();\n\n if (start == null || expect == null || end == null) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.TEXT,\n shaka.util.Error.Code.INVALID_TEXT_CUE,\n 'Could not parse cue time range in SubViewer');\n }\n\n // Get the payload.\n const payload = lines.slice(1).join('\\n').trim();\n\n const cue = new shaka.text.Cue(start, end, payload);\n cues.push(cue);\n }\n\n return cues;\n }\n};\n\n\nshaka.text.TextEngine.registerParser(\n 'text/x-subviewer', () => new shaka.text.SbvTextParser());\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.text.SrtTextParser');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.text.TextEngine');\ngoog.require('shaka.text.VttTextParser');\ngoog.require('shaka.util.BufferUtils');\ngoog.require('shaka.util.StringUtils');\n\n\n/**\n * @implements {shaka.extern.TextParser}\n * @export\n */\nshaka.text.SrtTextParser = class {\n /** */\n constructor() {\n /**\n * @type {!shaka.extern.TextParser}\n * @private\n */\n this.parser_ = new shaka.text.VttTextParser();\n }\n\n /**\n * @override\n * @export\n */\n parseInit(data) {\n goog.asserts.assert(false, 'SRT does not have init segments');\n }\n\n /**\n * @override\n * @export\n */\n setSequenceMode(sequenceMode) {\n // Unused.\n }\n\n /**\n * @override\n * @export\n */\n setManifestType(manifestType) {\n // Unused.\n }\n\n /**\n * @override\n * @export\n */\n parseMedia(data, time, uri) {\n const SrtTextParser = shaka.text.SrtTextParser;\n const BufferUtils = shaka.util.BufferUtils;\n const StringUtils = shaka.util.StringUtils;\n\n // Get the input as a string.\n const str = StringUtils.fromUTF8(data);\n\n const vvtText = SrtTextParser.srt2webvtt(str);\n\n const newData = BufferUtils.toUint8(StringUtils.toUTF8(vvtText));\n\n return this.parser_.parseMedia(newData, time, uri, /* images= */ []);\n }\n\n /**\n * Convert a SRT format to WebVTT\n *\n * @param {string} data\n * @return {string}\n * @export\n */\n static srt2webvtt(data) {\n const SrtTextParser = shaka.text.SrtTextParser;\n let result = 'WEBVTT\\n\\n';\n\n // Supports no cues\n if (data == '') {\n return result;\n }\n\n // remove dos newlines\n let srt = data.replace(/\\r+/g, '');\n // trim white space start and end\n srt = srt.trim();\n\n // get cues\n const cuelist = srt.split('\\n\\n');\n for (const cue of cuelist) {\n result += SrtTextParser.convertSrtCue_(cue);\n }\n\n return result;\n }\n\n /**\n * Convert a SRT cue into WebVTT cue\n *\n * @param {string} caption\n * @return {string}\n * @private\n */\n static convertSrtCue_(caption) {\n const lines = caption.split(/\\n/);\n\n // detect and skip numeric identifier\n if (lines[0].match(/\\d+/)) {\n lines.shift();\n }\n\n // convert time codes\n lines[0] = lines[0].replace(/,/g, '.');\n\n const webvttCue = lines.join('\\n')\n .replace(/{b}/g, '<b>')\n .replace(/{\\/b}/g, '</b>')\n .replace(/{i}/g, '<i>')\n .replace(/{\\/i}/g, '</i>')\n .replace(/{u}/g, '<u>')\n .replace(/{\\/u}/g, '</u>');\n\n return webvttCue + '\\n\\n';\n }\n};\n\n\nshaka.text.TextEngine.registerParser(\n 'text/srt', () => new shaka.text.SrtTextParser());\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// cspell:ignore AABBGGRR HAABBGGRR\n\ngoog.provide('shaka.text.SsaTextParser');\n\ngoog.require('goog.asserts');\ngoog.require('shaka.log');\ngoog.require('shaka.text.Cue');\ngoog.require('shaka.text.TextEngine');\ngoog.require('shaka.util.StringUtils');\n\n\n/**\n * Documentation: http://moodub.free.fr/video/ass-specs.doc\n * https://en.wikipedia.org/wiki/SubStation_Alpha\n * @implements {shaka.extern.TextParser}\n * @export\n */\nshaka.text.SsaTextParser = class {\n /**\n * @override\n * @export\n */\n parseInit(data) {\n goog.asserts.assert(false, 'SSA does not have init segments');\n }\n\n /**\n * @override\n * @export\n */\n setSequenceMode(sequenceMode) {\n // Unused.\n }\n\n /**\n * @override\n * @export\n */\n setManifestType(manifestType) {\n // Unused.\n }\n\n /**\n * @override\n * @export\n */\n parseMedia(data, time) {\n const StringUtils = shaka.util.StringUtils;\n const SsaTextParser = shaka.text.SsaTextParser;\n\n // Get the input as a string.\n const str = StringUtils.fromUTF8(data);\n\n const section = {\n styles: '',\n events: '',\n };\n\n let tag = null;\n let lines = null;\n const parts = str.split(/\\r?\\n\\s*\\r?\\n/);\n for (const part of parts) {\n lines = part;\n // SSA content\n const match = SsaTextParser.ssaContent_.exec(part);\n if (match) {\n tag = match[1];\n lines = match[2];\n }\n if (tag == 'V4 Styles' || tag == 'V4+ Styles') {\n section.styles = lines;\n if (section.events) {\n section.styles += '\\n' + lines;\n } else {\n section.styles = lines;\n }\n continue;\n }\n if (tag == 'Events') {\n if (section.events) {\n section.events += '\\n' + lines;\n } else {\n section.events = lines;\n }\n continue;\n }\n if (tag == 'Script Info') {\n continue;\n }\n shaka.log.warning('SsaTextParser parser encountered an unknown part.',\n lines);\n }\n\n // Process styles\n const styles = [];\n\n // Used to be able to iterate over the style parameters.\n let styleColumns = null;\n\n const styleLines = section.styles.split(/\\r?\\n/);\n for (const line of styleLines) {\n if (/^\\s*;/.test(line)) {\n // Skip comment\n continue;\n }\n const lineParts = SsaTextParser.lineParts_.exec(line);\n if (lineParts) {\n const name = lineParts[1].trim();\n const value = lineParts[2].trim();\n if (name == 'Format') {\n styleColumns = value.split(SsaTextParser.valuesFormat_);\n continue;\n }\n if (name == 'Style') {\n const values = value.split(SsaTextParser.valuesFormat_);\n const style = {};\n for (let c = 0; c < styleColumns.length && c < values.length; c++) {\n style[styleColumns[c]] = values[c];\n }\n styles.push(style);\n continue;\n }\n }\n }\n\n // Process cues\n /** @type {!Array<!shaka.text.Cue>} */\n const cues = [];\n\n // Used to be able to iterate over the event parameters.\n let eventColumns = null;\n\n const eventLines = section.events.split(/\\r?\\n/);\n for (const line of eventLines) {\n if (/^\\s*;/.test(line)) {\n // Skip comment\n continue;\n }\n const lineParts = SsaTextParser.lineParts_.exec(line);\n if (lineParts) {\n const name = lineParts[1].trim();\n const value = lineParts[2].trim();\n if (name == 'Format') {\n eventColumns = value.split(SsaTextParser.valuesFormat_);\n continue;\n }\n if (name == 'Dialogue') {\n const values = value.split(SsaTextParser.valuesFormat_);\n const data = {};\n for (let c = 0; c < eventColumns.length && c < values.length; c++) {\n data[eventColumns[c]] = values[c];\n }\n\n const startTime = SsaTextParser.parseTime_(data['Start']);\n const endTime = SsaTextParser.parseTime_(data['End']);\n\n // Note: Normally, you should take the \"Text\" field, but if it\n // has a comma, it fails.\n const payload = values.slice(eventColumns.length - 1).join(',')\n .replace(/\\\\N/g, '\\n') // '\\n' for new line\n .replace(/\\{[^}]+\\}/g, ''); // {\\pos(400,570)}\n\n const cue = new shaka.text.Cue(startTime, endTime, payload);\n\n const styleName = data['Style'];\n const styleData = styles.find((s) => s['Name'] == styleName);\n if (styleData) {\n SsaTextParser.addStyle_(cue, styleData);\n }\n cues.push(cue);\n continue;\n }\n }\n }\n\n return cues;\n }\n\n /**\n * Adds applicable style properties to a cue.\n *\n * @param {shaka.text.Cue} cue\n * @param {Object} style\n * @private\n */\n static addStyle_(cue, style) {\n const Cue = shaka.text.Cue;\n const SsaTextParser = shaka.text.SsaTextParser;\n const fontFamily = style['Fontname'];\n if (fontFamily) {\n cue.fontFamily = fontFamily;\n }\n const fontSize = style['Fontsize'];\n if (fontSize) {\n cue.fontSize = fontSize + 'px';\n }\n const color = style['PrimaryColour'];\n if (color) {\n const ccsColor = SsaTextParser.parseSsaColor_(color);\n if (ccsColor) {\n cue.color = ccsColor;\n }\n }\n const backgroundColor = style['BackColour'];\n if (backgroundColor) {\n const cssBackgroundColor = SsaTextParser.parseSsaColor_(backgroundColor);\n if (cssBackgroundColor) {\n cue.backgroundColor = cssBackgroundColor;\n }\n }\n const bold = style['Bold'];\n if (bold) {\n cue.fontWeight = Cue.fontWeight.BOLD;\n }\n const italic = style['Italic'];\n if (italic) {\n cue.fontStyle = Cue.fontStyle.ITALIC;\n }\n const underline = style['Underline'];\n if (underline) {\n cue.textDecoration.push(Cue.textDecoration.UNDERLINE);\n }\n const letterSpacing = style['Spacing'];\n if (letterSpacing) {\n cue.letterSpacing = letterSpacing + 'px';\n }\n const alignment = style['Alignment'];\n if (alignment) {\n const alignmentInt = parseInt(alignment, 10);\n switch (alignmentInt) {\n case 1:\n cue.displayAlign = Cue.displayAlign.AFTER;\n cue.textAlign = Cue.textAlign.START;\n break;\n case 2:\n cue.displayAlign = Cue.displayAlign.AFTER;\n cue.textAlign = Cue.textAlign.CENTER;\n break;\n case 3:\n cue.displayAlign = Cue.displayAlign.AFTER;\n cue.textAlign = Cue.textAlign.END;\n break;\n case 5:\n cue.displayAlign = Cue.displayAlign.BEFORE;\n cue.textAlign = Cue.textAlign.START;\n break;\n case 6:\n cue.displayAlign = Cue.displayAlign.BEFORE;\n cue.textAlign = Cue.textAlign.CENTER;\n break;\n case 7:\n cue.displayAlign = Cue.displayAlign.BEFORE;\n cue.textAlign = Cue.textAlign.END;\n break;\n case 9:\n cue.displayAlign = Cue.displayAlign.CENTER;\n cue.textAlign = Cue.textAlign.START;\n break;\n case 10:\n cue.displayAlign = Cue.displayAlign.CENTER;\n cue.textAlign = Cue.textAlign.CENTER;\n break;\n case 11:\n cue.displayAlign = Cue.displayAlign.CENTER;\n cue.textAlign = Cue.textAlign.END;\n break;\n }\n }\n const opacity = style['AlphaLevel'];\n if (opacity) {\n cue.opacity = parseFloat(opacity);\n }\n }\n\n /**\n * Parses a SSA color .\n *\n * @param {string} colorString\n * @return {?string}\n * @private\n */\n static parseSsaColor_(colorString) {\n // The SSA V4+ color can be represented in hex (&HAABBGGRR) or in decimal\n // format (byte order AABBGGRR) and in both cases the alpha channel's\n // value needs to be inverted as in case of SSA the 0xFF alpha value means\n // transparent and 0x00 means opaque\n /** @type {number} */\n const abgr = parseInt(colorString.replace('&H', ''), 16);\n if (abgr >= 0) {\n const a = ((abgr >> 24) & 0xFF) ^ 0xFF; // Flip alpha.\n const alpha = a / 255;\n const b = (abgr >> 16) & 0xFF;\n const g = (abgr >> 8) & 0xFF;\n const r = abgr & 0xff;\n return 'rgba(' + r + ',' + g + ',' + b + ',' + alpha + ')';\n }\n return null;\n }\n\n /**\n * Parses a SSA time from the given parser.\n *\n * @param {string} string\n * @return {number}\n * @private\n */\n static parseTime_(string) {\n const SsaTextParser = shaka.text.SsaTextParser;\n const match = SsaTextParser.timeFormat_.exec(string);\n const hours = match[1] ? parseInt(match[1].replace(':', ''), 10) : 0;\n const minutes = parseInt(match[2], 10);\n const seconds = parseFloat(match[3]);\n return hours * 3600 + minutes * 60 + seconds;\n }\n};\n\n/**\n * @const\n * @private {!RegExp}\n * @example [V4 Styles]\\nFormat: Name\\nStyle: DefaultVCD\n */\nshaka.text.SsaTextParser.ssaContent_ =\n /^\\s*\\[([^\\]]+)\\]\\r?\\n([\\s\\S]*)/;\n\n/**\n * @const\n * @private {!RegExp}\n * @example Style: DefaultVCD,...\n */\nshaka.text.SsaTextParser.lineParts_ =\n /^\\s*([^:]+):\\s*(.*)/;\n\n/**\n * @const\n * @private {!RegExp}\n * @example Style: DefaultVCD,...\n */\nshaka.text.SsaTextParser.valuesFormat_ = /\\s*,\\s*/;\n\n/**\n * @const\n * @private {!RegExp}\n * @example 0:00:01.1 or 0:00:01.18 or 0:00:01.180\n */\nshaka.text.SsaTextParser.timeFormat_ =\n /^(\\d+:)?(\\d{1,2}):(\\d{1,2}(?:[.]\\d{1,3})?)?$/;\n\nshaka.text.TextEngine.registerParser(\n 'text/x-ssa', () => new shaka.text.SsaTextParser());\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// cspell:ignore lavfi aevalsrc libfdk hexdump\n\ngoog.provide('shaka.transmuxer.ADTS');\n\n\n/**\n * ADTS utils\n */\nshaka.transmuxer.ADTS = class {\n /**\n * @param {!Uint8Array} data\n * @param {!number} offset\n * @return {?{headerLength: number, frameLength: number}}\n */\n static parseHeader(data, offset) {\n const ADTS = shaka.transmuxer.ADTS;\n // The protection skip bit tells us if we have 2 bytes of CRC data at the\n // end of the ADTS header\n const headerLength = ADTS.getHeaderLength(data, offset);\n if (offset + headerLength <= data.length) {\n // retrieve frame size\n const frameLength = ADTS.getFullFrameLength(data, offset) - headerLength;\n if (frameLength > 0) {\n return {\n headerLength,\n frameLength,\n };\n }\n }\n return null;\n }\n\n /**\n * @param {!Uint8Array} data\n * @param {!number} offset\n * @return {?{sampleRate: number, channelCount: number, codec: string}}\n */\n static parseInfo(data, offset) {\n const adtsSamplingRates = [\n 96000,\n 88200,\n 64000,\n 48000,\n 44100,\n 32000,\n 24000,\n 22050,\n 16000,\n 12000,\n 11025,\n 8000,\n 7350,\n ];\n const adtsSamplingIndex = (data[offset + 2] & 0x3c) >>> 2;\n if (adtsSamplingIndex > adtsSamplingRates.length - 1) {\n return null;\n }\n const adtsObjectType = ((data[offset + 2] & 0xc0) >>> 6) + 1;\n let adtsChannelConfig = (data[offset + 2] & 0x01) << 2;\n adtsChannelConfig |= (data[offset + 3] & 0xc0) >>> 6;\n return {\n sampleRate: adtsSamplingRates[adtsSamplingIndex],\n channelCount: adtsChannelConfig,\n codec: 'mp4a.40.' + adtsObjectType,\n };\n }\n\n /**\n * @param {!Uint8Array} data\n * @param {!number} offset\n * @return {boolean}\n */\n static isHeaderPattern(data, offset) {\n return data[offset] === 0xff && (data[offset + 1] & 0xf6) === 0xf0;\n }\n\n /**\n * @param {!Uint8Array} data\n * @param {!number} offset\n * @return {number}\n */\n static getHeaderLength(data, offset) {\n return data[offset + 1] & 0x01 ? 7 : 9;\n }\n\n /**\n * @param {!Uint8Array} data\n * @param {!number} offset\n * @return {number}\n */\n static getFullFrameLength(data, offset) {\n return ((data[offset + 3] & 0x03) << 11) |\n (data[offset + 4] << 3) |\n ((data[offset + 5] & 0xe0) >>> 5);\n }\n\n /**\n * @param {!Uint8Array} data\n * @param {!number} offset\n * @return {boolean}\n */\n static isHeader(data, offset) {\n const ADTS = shaka.transmuxer.ADTS;\n // Look for ADTS header | 1111 1111 | 1111 X00X | where X can be\n // either 0 or 1\n // Layer bits (position 14 and 15) in header should be always 0 for ADTS\n // More info https://wiki.multimedia.cx/index.php?title=ADTS\n return offset + 1 < data.length && ADTS.isHeaderPattern(data, offset);\n }\n\n /**\n * @param {!Uint8Array} data\n * @param {!number} offset\n * @return {boolean}\n */\n static probe(data, offset) {\n const ADTS = shaka.transmuxer.ADTS;\n // same as isHeader but we also check that ADTS frame follows last ADTS\n // frame or end of data is reached\n if (ADTS.isHeader(data, offset)) {\n // ADTS header Length\n const headerLength = ADTS.getHeaderLength(data, offset);\n if (offset + headerLength >= data.length) {\n return false;\n }\n // ADTS frame Length\n const frameLength = ADTS.getFullFrameLength(data, offset);\n if (frameLength <= headerLength) {\n return false;\n }\n\n const newOffset = offset + frameLength;\n return newOffset === data.length || ADTS.isHeader(data, newOffset);\n }\n return false;\n }\n\n /**\n * @param {!number} samplerate\n * @return {number}\n */\n static getFrameDuration(samplerate) {\n return (shaka.transmuxer.ADTS.AAC_SAMPLES_PER_FRAME * 90000) / samplerate;\n }\n\n /**\n * @param {string} codec\n * @param {number} channelCount\n * @return {?Uint8Array}\n */\n static getSilentFrame(codec, channelCount) {\n switch (codec) {\n case 'mp4a.40.2':\n if (channelCount === 1) {\n return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x23, 0x80]);\n } else if (channelCount === 2) {\n return new Uint8Array([\n 0x21, 0x00, 0x49, 0x90, 0x02, 0x19, 0x00, 0x23, 0x80,\n ]);\n } else if (channelCount === 3) {\n return new Uint8Array([\n 0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64,\n 0x00, 0x8e,\n ]);\n } else if (channelCount === 4) {\n return new Uint8Array([\n 0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64,\n 0x00, 0x80, 0x2c, 0x80, 0x08, 0x02, 0x38,\n ]);\n } else if (channelCount === 5) {\n return new Uint8Array([\n 0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64,\n 0x00, 0x82, 0x30, 0x04, 0x99, 0x00, 0x21, 0x90, 0x02, 0x38,\n ]);\n } else if (channelCount === 6) {\n return new Uint8Array([\n 0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64,\n 0x00, 0x82, 0x30, 0x04, 0x99, 0x00, 0x21, 0x90, 0x02, 0x00, 0xb2,\n 0x00, 0x20, 0x08, 0xe0,\n ]);\n }\n break;\n // handle HE-AAC below (mp4a.40.5 / mp4a.40.29)\n default:\n if (channelCount === 1) {\n // eslint-disable-next-line @stylistic/max-len\n // ffmpeg -y -f lavfi -i \"aevalsrc=0:d=0.05\" -c:a libfdk_aac -profile:a aac_he -b:a 4k output.aac && hexdump -v -e '16/1 \"0x%x,\" \"\\n\"' -v output.aac\n return new Uint8Array([\n 0x1, 0x40, 0x22, 0x80, 0xa3, 0x4e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0,\n 0x0, 0x1c, 0x6, 0xf1, 0xc1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5e,\n ]);\n } else if (channelCount === 2) {\n // eslint-disable-next-line @stylistic/max-len\n // ffmpeg -y -f lavfi -i \"aevalsrc=0|0:d=0.05\" -c:a libfdk_aac -profile:a aac_he_v2 -b:a 4k output.aac && hexdump -v -e '16/1 \"0x%x,\" \"\\n\"' -v output.aac\n return new Uint8Array([\n 0x1, 0x40, 0x22, 0x80, 0xa3, 0x5e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0,\n 0x0, 0x0, 0x95, 0x0, 0x6, 0xf1, 0xa1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5e,\n ]);\n } else if (channelCount === 3) {\n // eslint-disable-next-line @stylistic/max-len\n // ffmpeg -y -f lavfi -i \"aevalsrc=0|0|0:d=0.05\" -c:a libfdk_aac -profile:a aac_he_v2 -b:a 4k output.aac && hexdump -v -e '16/1 \"0x%x,\" \"\\n\"' -v output.aac\n return new Uint8Array([\n 0x1, 0x40, 0x22, 0x80, 0xa3, 0x5e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0,\n 0x0, 0x0, 0x95, 0x0, 0x6, 0xf1, 0xa1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5e,\n ]);\n }\n break;\n }\n return null;\n }\n};\n\n/**\n * @const {number}\n */\nshaka.transmuxer.ADTS.AAC_SAMPLES_PER_FRAME = 1024;\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.transmuxer.AacTransmuxer');\n\ngoog.require('shaka.media.Capabilities');\ngoog.require('shaka.transmuxer.ADTS');\ngoog.require('shaka.transmuxer.Mp4Generator');\ngoog.require('shaka.transmuxer.TransmuxerEngine');\ngoog.require('shaka.util.BufferUtils');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.Id3Utils');\ngoog.require('shaka.util.ManifestParserUtils');\ngoog.require('shaka.util.MimeUtils');\ngoog.require('shaka.util.Uint8ArrayUtils');\n\n\n/**\n * @implements {shaka.extern.Transmuxer}\n * @export\n */\nshaka.transmuxer.AacTransmuxer = class {\n /**\n * @param {string} mimeType\n */\n constructor(mimeType) {\n /** @private {string} */\n this.originalMimeType_ = mimeType;\n\n /** @private {number} */\n this.frameIndex_ = 0;\n\n /** @private {!Map<string, !Uint8Array>} */\n this.initSegments = new Map();\n\n /** @private {?Uint8Array} */\n this.lastInitSegment_ = null;\n }\n\n\n /**\n * @override\n * @export\n */\n destroy() {\n this.initSegments.clear();\n }\n\n\n /**\n * Check if the mime type and the content type is supported.\n * @param {string} mimeType\n * @param {string=} contentType\n * @return {boolean}\n * @override\n * @export\n */\n isSupported(mimeType, contentType) {\n const Capabilities = shaka.media.Capabilities;\n\n if (!this.isAacContainer_(mimeType)) {\n return false;\n }\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n return Capabilities.isTypeSupported(\n this.convertCodecs(ContentType.AUDIO, mimeType));\n }\n\n\n /**\n * Check if the mimetype is 'audio/aac'.\n * @param {string} mimeType\n * @return {boolean}\n * @private\n */\n isAacContainer_(mimeType) {\n return mimeType.toLowerCase().split(';')[0] == 'audio/aac';\n }\n\n\n /**\n * @override\n * @export\n */\n convertCodecs(contentType, mimeType) {\n if (this.isAacContainer_(mimeType)) {\n const codecs = shaka.util.MimeUtils.getCodecs(mimeType);\n return `audio/mp4; codecs=\"${codecs || 'mp4a.40.2'}\"`;\n }\n return mimeType;\n }\n\n\n /**\n * @override\n * @export\n */\n getOriginalMimeType() {\n return this.originalMimeType_;\n }\n\n\n /**\n * @override\n * @export\n */\n transmux(data, stream, reference, duration) {\n const ADTS = shaka.transmuxer.ADTS;\n const Uint8ArrayUtils = shaka.util.Uint8ArrayUtils;\n\n const uint8ArrayData = shaka.util.BufferUtils.toUint8(data);\n\n // Check for the ADTS sync word\n // Look for ADTS header | 1111 1111 | 1111 X00X | where X can be\n // either 0 or 1\n // Layer bits (position 14 and 15) in header should be always 0 for ADTS\n // More info https://wiki.multimedia.cx/index.php?title=ADTS\n const id3Data = shaka.util.Id3Utils.getID3Data(uint8ArrayData);\n let offset = id3Data.length;\n for (; offset < uint8ArrayData.length; offset++) {\n if (ADTS.probe(uint8ArrayData, offset)) {\n break;\n }\n }\n\n let timestamp = reference.endTime * 1000;\n\n const frames = shaka.util.Id3Utils.getID3Frames(id3Data);\n if (frames.length && reference) {\n const metadataTimestamp = frames.find((frame) => {\n return frame.description ===\n 'com.apple.streaming.transportStreamTimestamp';\n });\n if (metadataTimestamp) {\n timestamp = /** @type {!number} */(metadataTimestamp.data);\n }\n }\n\n const info = ADTS.parseInfo(uint8ArrayData, offset);\n if (!info) {\n return Promise.reject(new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.TRANSMUXING_FAILED,\n reference ? reference.getUris()[0] : null));\n }\n stream.audioSamplingRate = info.sampleRate;\n stream.channelsCount = info.channelCount;\n\n /** @type {!Array<shaka.transmuxer.Mp4Generator.Mp4Sample>} */\n const samples = [];\n\n while (offset < uint8ArrayData.length) {\n const header = ADTS.parseHeader(uint8ArrayData, offset);\n if (!header) {\n return Promise.reject(new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.TRANSMUXING_FAILED,\n reference ? reference.getUris()[0] : null));\n }\n const length = header.headerLength + header.frameLength;\n if (offset + length <= uint8ArrayData.length) {\n const data = uint8ArrayData.subarray(\n offset + header.headerLength, offset + length);\n samples.push({\n data: data,\n size: header.frameLength,\n duration: ADTS.AAC_SAMPLES_PER_FRAME,\n cts: 0,\n flags: {\n isLeading: 0,\n isDependedOn: 0,\n hasRedundancy: 0,\n degradPrio: 0,\n dependsOn: 2,\n isNonSync: 0,\n },\n });\n }\n offset += length;\n }\n\n /** @type {number} */\n const sampleRate = info.sampleRate;\n /** @type {number} */\n const baseMediaDecodeTime = Math.floor(timestamp * sampleRate / 1000);\n\n /** @type {shaka.transmuxer.Mp4Generator.StreamInfo} */\n const streamInfo = {\n id: stream.id,\n type: shaka.util.ManifestParserUtils.ContentType.AUDIO,\n codecs: info.codec,\n encrypted: stream.encrypted && stream.drmInfos.length > 0,\n timescale: sampleRate,\n duration: duration,\n videoNalus: [],\n audioConfig: new Uint8Array([]),\n videoConfig: new Uint8Array([]),\n hSpacing: 0,\n vSpacing: 0,\n data: {\n sequenceNumber: this.frameIndex_,\n baseMediaDecodeTime: baseMediaDecodeTime,\n samples: samples,\n },\n stream: stream,\n };\n const mp4Generator = new shaka.transmuxer.Mp4Generator([streamInfo]);\n let initSegment;\n const initSegmentKey = stream.id + '_' + reference.discontinuitySequence;\n if (!this.initSegments.has(initSegmentKey)) {\n initSegment = mp4Generator.initSegment();\n this.initSegments.set(initSegmentKey, initSegment);\n } else {\n initSegment = this.initSegments.get(initSegmentKey);\n }\n const appendInitSegment = this.lastInitSegment_ !== initSegment;\n const segmentData = mp4Generator.segmentData();\n this.lastInitSegment_ = initSegment;\n this.frameIndex_++;\n if (appendInitSegment) {\n const transmuxData = Uint8ArrayUtils.concat(initSegment, segmentData);\n return Promise.resolve(transmuxData);\n } else {\n return Promise.resolve(segmentData);\n }\n }\n};\n\nshaka.transmuxer.TransmuxerEngine.registerTransmuxer(\n 'audio/aac',\n () => new shaka.transmuxer.AacTransmuxer('audio/aac'),\n shaka.transmuxer.TransmuxerEngine.PluginPriority.FALLBACK);\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.transmuxer.Ac3');\n\n\n/**\n * AC3 utils\n */\nshaka.transmuxer.Ac3 = class {\n /**\n * @param {!Uint8Array} data\n * @param {!number} offset\n * @return {?{sampleRate: number, channelCount: number,\n * audioConfig: !Uint8Array, frameLength: number}}\n */\n static parseFrame(data, offset) {\n if (offset + 8 > data.length) {\n // not enough bytes left\n return null;\n }\n\n if (data[offset] !== 0x0b || data[offset + 1] !== 0x77) {\n // invalid magic\n return null;\n }\n\n // get sample rate\n const samplingRateCode = data[offset + 4] >> 6;\n if (samplingRateCode >= 3) {\n // invalid sampling rate\n return null;\n }\n\n const samplingRateMap = [48000, 44100, 32000];\n\n // get frame size\n const frameSizeCode = data[offset + 4] & 0x3f;\n const frameSizeMap = [\n 64, 69, 96, 64, 70, 96, 80, 87, 120, 80, 88, 120, 96, 104, 144, 96, 105,\n 144, 112, 121, 168, 112, 122, 168, 128, 139, 192, 128, 140, 192, 160,\n 174, 240, 160, 175, 240, 192, 208, 288, 192, 209, 288, 224, 243, 336,\n 224, 244, 336, 256, 278, 384, 256, 279, 384, 320, 348, 480, 320, 349,\n 480, 384, 417, 576, 384, 418, 576, 448, 487, 672, 448, 488, 672, 512,\n 557, 768, 512, 558, 768, 640, 696, 960, 640, 697, 960, 768, 835, 1152,\n 768, 836, 1152, 896, 975, 1344, 896, 976, 1344, 1024, 1114, 1536, 1024,\n 1115, 1536, 1152, 1253, 1728, 1152, 1254, 1728, 1280, 1393, 1920, 1280,\n 1394, 1920,\n ];\n\n const frameLength = frameSizeMap[frameSizeCode * 3 + samplingRateCode] * 2;\n if (offset + frameLength > data.length) {\n return null;\n }\n\n // get channel count\n const channelMode = data[offset + 6] >> 5;\n let skipCount = 0;\n if (channelMode === 2) {\n skipCount += 2;\n } else {\n if ((channelMode & 1) && channelMode !== 1) {\n skipCount += 2;\n }\n if (channelMode & 4) {\n skipCount += 2;\n }\n }\n\n const lowFrequencyEffectsChannelOn =\n (((data[offset + 6] << 8) | data[offset + 7]) >> (12 - skipCount)) & 1;\n\n const channelsMap = [2, 1, 2, 3, 3, 4, 4, 5];\n\n // Audio config for DAC3 box\n const bitStreamIdentification = data[offset + 5] >> 3;\n const bitStreamMode = data[offset + 5] & 7;\n\n const config = new Uint8Array([\n (samplingRateCode << 6) |\n (bitStreamIdentification << 1) |\n (bitStreamMode >> 2),\n ((bitStreamMode & 3) << 6) |\n (channelMode << 3) |\n (lowFrequencyEffectsChannelOn << 2) |\n (frameSizeCode >> 4),\n (frameSizeCode << 4) & 0xe0,\n ]);\n\n return {\n sampleRate: samplingRateMap[samplingRateCode],\n channelCount: channelsMap[channelMode] + lowFrequencyEffectsChannelOn,\n audioConfig: config,\n frameLength: frameLength,\n };\n }\n\n /**\n * @param {!Uint8Array} data\n * @param {!number} offset\n * @return {boolean}\n */\n static probe(data, offset) {\n // look for the ac-3 sync bytes\n if (data[offset] === 0x0b &&\n data[offset + 1] === 0x77) {\n // check the bsid (bitStreamIdentification) to confirm ac-3\n let bsid = 0;\n let numBits = 5;\n offset += numBits;\n /** @type {?number} */\n let temp = null;\n /** @type {?number} */\n let mask = null;\n /** @type {?number} */\n let byte = null;\n while (numBits > 0) {\n byte = data[offset];\n // read remaining bits, upto 8 bits at a time\n const bits = Math.min(numBits, 8);\n const shift = 8 - bits;\n mask = (0xff000000 >>> (24 + shift)) << shift;\n temp = (byte & mask) >> shift;\n bsid = !bsid ? temp : (bsid << bits) | temp;\n offset += 1;\n numBits -= bits;\n }\n if (bsid < 16) {\n return true;\n }\n }\n return false;\n }\n};\n\n/**\n * @const {number}\n */\nshaka.transmuxer.Ac3.AC3_SAMPLES_PER_FRAME = 1536;\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.transmuxer.Ac3Transmuxer');\n\ngoog.require('shaka.media.Capabilities');\ngoog.require('shaka.transmuxer.Ac3');\ngoog.require('shaka.transmuxer.Mp4Generator');\ngoog.require('shaka.transmuxer.TransmuxerEngine');\ngoog.require('shaka.util.BufferUtils');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.Id3Utils');\ngoog.require('shaka.util.ManifestParserUtils');\ngoog.require('shaka.util.Platform');\ngoog.require('shaka.util.Uint8ArrayUtils');\n\n\n/**\n * @implements {shaka.extern.Transmuxer}\n * @export\n */\nshaka.transmuxer.Ac3Transmuxer = class {\n /**\n * @param {string} mimeType\n */\n constructor(mimeType) {\n /** @private {string} */\n this.originalMimeType_ = mimeType;\n\n /** @private {number} */\n this.frameIndex_ = 0;\n\n /** @private {!Map<string, !Uint8Array>} */\n this.initSegments = new Map();\n\n /** @private {?Uint8Array} */\n this.lastInitSegment_ = null;\n }\n\n\n /**\n * @override\n * @export\n */\n destroy() {\n this.initSegments.clear();\n }\n\n\n /**\n * Check if the mime type and the content type is supported.\n * @param {string} mimeType\n * @param {string=} contentType\n * @return {boolean}\n * @override\n * @export\n */\n isSupported(mimeType, contentType) {\n const Capabilities = shaka.media.Capabilities;\n\n if (!this.isAc3Container_(mimeType)) {\n return false;\n }\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n return Capabilities.isTypeSupported(\n this.convertCodecs(ContentType.AUDIO, mimeType));\n }\n\n\n /**\n * Check if the mimetype is 'audio/ac3'.\n * @param {string} mimeType\n * @return {boolean}\n * @private\n */\n isAc3Container_(mimeType) {\n return mimeType.toLowerCase().split(';')[0] == 'audio/ac3';\n }\n\n\n /**\n * @override\n * @export\n */\n convertCodecs(contentType, mimeType) {\n if (this.isAc3Container_(mimeType)) {\n if (shaka.util.Platform.requiresEC3InitSegments()) {\n return 'audio/mp4; codecs=\"ec-3\"';\n } else {\n return 'audio/mp4; codecs=\"ac-3\"';\n }\n }\n return mimeType;\n }\n\n\n /**\n * @override\n * @export\n */\n getOriginalMimeType() {\n return this.originalMimeType_;\n }\n\n\n /**\n * @override\n * @export\n */\n transmux(data, stream, reference, duration) {\n const Ac3 = shaka.transmuxer.Ac3;\n const Uint8ArrayUtils = shaka.util.Uint8ArrayUtils;\n\n const uint8ArrayData = shaka.util.BufferUtils.toUint8(data);\n\n const id3Data = shaka.util.Id3Utils.getID3Data(uint8ArrayData);\n let offset = id3Data.length;\n for (; offset < uint8ArrayData.length; offset++) {\n if (Ac3.probe(uint8ArrayData, offset)) {\n break;\n }\n }\n\n let timestamp = reference.endTime * 1000;\n\n const frames = shaka.util.Id3Utils.getID3Frames(id3Data);\n if (frames.length && reference) {\n const metadataTimestamp = frames.find((frame) => {\n return frame.description ===\n 'com.apple.streaming.transportStreamTimestamp';\n });\n if (metadataTimestamp) {\n timestamp = /** @type {!number} */(metadataTimestamp.data);\n }\n }\n\n /** @type {number} */\n let sampleRate = 0;\n\n /** @type {!Uint8Array} */\n let audioConfig = new Uint8Array([]);\n\n /** @type {!Array<shaka.transmuxer.Mp4Generator.Mp4Sample>} */\n const samples = [];\n\n while (offset < uint8ArrayData.length) {\n const frame = Ac3.parseFrame(uint8ArrayData, offset);\n if (!frame) {\n return Promise.reject(new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.TRANSMUXING_FAILED,\n reference ? reference.getUris()[0] : null));\n }\n stream.audioSamplingRate = frame.sampleRate;\n stream.channelsCount = frame.channelCount;\n sampleRate = frame.sampleRate;\n audioConfig = frame.audioConfig;\n\n const frameData = uint8ArrayData.subarray(\n offset, offset + frame.frameLength);\n\n samples.push({\n data: frameData,\n size: frame.frameLength,\n duration: Ac3.AC3_SAMPLES_PER_FRAME,\n cts: 0,\n flags: {\n isLeading: 0,\n isDependedOn: 0,\n hasRedundancy: 0,\n degradPrio: 0,\n dependsOn: 2,\n isNonSync: 0,\n },\n });\n offset += frame.frameLength;\n }\n /** @type {number} */\n const baseMediaDecodeTime = Math.floor(timestamp * sampleRate / 1000);\n\n /** @type {shaka.transmuxer.Mp4Generator.StreamInfo} */\n const streamInfo = {\n id: stream.id,\n type: shaka.util.ManifestParserUtils.ContentType.AUDIO,\n codecs: 'ac-3',\n encrypted: stream.encrypted && stream.drmInfos.length > 0,\n timescale: sampleRate,\n duration: duration,\n videoNalus: [],\n audioConfig: audioConfig,\n videoConfig: new Uint8Array([]),\n hSpacing: 0,\n vSpacing: 0,\n data: {\n sequenceNumber: this.frameIndex_,\n baseMediaDecodeTime: baseMediaDecodeTime,\n samples: samples,\n },\n stream: stream,\n };\n const mp4Generator = new shaka.transmuxer.Mp4Generator([streamInfo]);\n let initSegment;\n const initSegmentKey = stream.id + '_' + reference.discontinuitySequence;\n if (!this.initSegments.has(initSegmentKey)) {\n initSegment = mp4Generator.initSegment();\n this.initSegments.set(initSegmentKey, initSegment);\n } else {\n initSegment = this.initSegments.get(initSegmentKey);\n }\n const appendInitSegment = this.lastInitSegment_ !== initSegment;\n const segmentData = mp4Generator.segmentData();\n this.lastInitSegment_ = initSegment;\n this.frameIndex_++;\n if (appendInitSegment) {\n const transmuxData = Uint8ArrayUtils.concat(initSegment, segmentData);\n return Promise.resolve(transmuxData);\n } else {\n return Promise.resolve(segmentData);\n }\n }\n};\n\nshaka.transmuxer.TransmuxerEngine.registerTransmuxer(\n 'audio/ac3',\n () => new shaka.transmuxer.Ac3Transmuxer('audio/ac3'),\n shaka.transmuxer.TransmuxerEngine.PluginPriority.FALLBACK);\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.transmuxer.Ec3');\n\ngoog.require('shaka.util.ExpGolomb');\n\n\n/**\n * EC3 utils\n */\nshaka.transmuxer.Ec3 = class {\n /**\n * @param {!Uint8Array} data\n * @param {!number} offset\n * @return {?{sampleRate: number, channelCount: number,\n * audioConfig: !Uint8Array, frameLength: number}}\n */\n static parseFrame(data, offset) {\n if (offset + 8 > data.length) {\n // not enough bytes left\n return null;\n }\n\n if (!shaka.transmuxer.Ec3.probe(data, offset)) {\n return null;\n }\n\n const gb = new shaka.util.ExpGolomb(data.subarray(offset + 2));\n // Skip stream_type\n gb.skipBits(2);\n // Skip sub_stream_id\n gb.skipBits(3);\n const frameLength = (gb.readBits(11) + 1) << 1;\n let samplingRateCode = gb.readBits(2);\n let sampleRate = null;\n let numBlocksCode = null;\n if (samplingRateCode == 0x03) {\n samplingRateCode = gb.readBits(2);\n sampleRate = [24000, 22060, 16000][samplingRateCode];\n numBlocksCode = 3;\n } else {\n sampleRate = [48000, 44100, 32000][samplingRateCode];\n numBlocksCode = gb.readBits(2);\n }\n\n const channelMode = gb.readBits(3);\n const lowFrequencyEffectsChannelOn = gb.readBits(1);\n const bitStreamIdentification = gb.readBits(5);\n\n if (offset + frameLength > data.byteLength) {\n return null;\n }\n\n const channelsMap = [2, 1, 2, 3, 3, 4, 4, 5];\n\n const numBlocksMap = [1, 2, 3, 6];\n\n const numBlocks = numBlocksMap[numBlocksCode];\n\n const dataRateSub =\n Math.floor((frameLength * sampleRate) / (numBlocks * 16));\n\n const config = new Uint8Array([\n ((dataRateSub & 0x1FE0) >> 5),\n ((dataRateSub & 0x001F) << 3), // num_ind_sub = zero\n (sampleRate << 6) | (bitStreamIdentification << 1) | (0 << 0),\n (0 << 7) | (0 << 4) |\n (channelMode << 1) | (lowFrequencyEffectsChannelOn << 0),\n (0 << 5) | (0 << 1) | (0 << 0),\n ]);\n\n return {\n sampleRate,\n channelCount: channelsMap[channelMode] + lowFrequencyEffectsChannelOn,\n audioConfig: config,\n frameLength,\n };\n }\n\n /**\n * @param {!Uint8Array} data\n * @param {!number} offset\n * @return {boolean}\n */\n static probe(data, offset) {\n // search 16-bit 0x0B77 sync word\n const syncWord = (data[offset] << 8) | (data[offset + 1] << 0);\n if (syncWord === 0x0B77) {\n return true;\n } else {\n return false;\n }\n }\n};\n\n/**\n * @const {number}\n */\nshaka.transmuxer.Ec3.EC3_SAMPLES_PER_FRAME = 1536;\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.transmuxer.Ec3Transmuxer');\n\ngoog.require('shaka.media.Capabilities');\ngoog.require('shaka.transmuxer.Ec3');\ngoog.require('shaka.transmuxer.Mp4Generator');\ngoog.require('shaka.transmuxer.TransmuxerEngine');\ngoog.require('shaka.util.BufferUtils');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.Id3Utils');\ngoog.require('shaka.util.ManifestParserUtils');\ngoog.require('shaka.util.Uint8ArrayUtils');\n\n\n/**\n * @implements {shaka.extern.Transmuxer}\n * @export\n */\nshaka.transmuxer.Ec3Transmuxer = class {\n /**\n * @param {string} mimeType\n */\n constructor(mimeType) {\n /** @private {string} */\n this.originalMimeType_ = mimeType;\n\n /** @private {number} */\n this.frameIndex_ = 0;\n\n /** @private {!Map<string, !Uint8Array>} */\n this.initSegments = new Map();\n\n /** @private {?Uint8Array} */\n this.lastInitSegment_ = null;\n }\n\n\n /**\n * @override\n * @export\n */\n destroy() {\n this.initSegments.clear();\n }\n\n\n /**\n * Check if the mime type and the content type is supported.\n * @param {string} mimeType\n * @param {string=} contentType\n * @return {boolean}\n * @override\n * @export\n */\n isSupported(mimeType, contentType) {\n const Capabilities = shaka.media.Capabilities;\n\n if (!this.isEc3Container_(mimeType)) {\n return false;\n }\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n return Capabilities.isTypeSupported(\n this.convertCodecs(ContentType.AUDIO, mimeType));\n }\n\n\n /**\n * Check if the mimetype is 'audio/ec3'.\n * @param {string} mimeType\n * @return {boolean}\n * @private\n */\n isEc3Container_(mimeType) {\n return mimeType.toLowerCase().split(';')[0] == 'audio/ec3';\n }\n\n\n /**\n * @override\n * @export\n */\n convertCodecs(contentType, mimeType) {\n if (this.isEc3Container_(mimeType)) {\n return 'audio/mp4; codecs=\"ec-3\"';\n }\n return mimeType;\n }\n\n\n /**\n * @override\n * @export\n */\n getOriginalMimeType() {\n return this.originalMimeType_;\n }\n\n\n /**\n * @override\n * @export\n */\n transmux(data, stream, reference, duration) {\n const Ec3 = shaka.transmuxer.Ec3;\n const Uint8ArrayUtils = shaka.util.Uint8ArrayUtils;\n\n const uint8ArrayData = shaka.util.BufferUtils.toUint8(data);\n\n const id3Data = shaka.util.Id3Utils.getID3Data(uint8ArrayData);\n let offset = id3Data.length;\n for (; offset < uint8ArrayData.length; offset++) {\n if (Ec3.probe(uint8ArrayData, offset)) {\n break;\n }\n }\n\n let timestamp = reference.endTime * 1000;\n\n const frames = shaka.util.Id3Utils.getID3Frames(id3Data);\n if (frames.length && reference) {\n const metadataTimestamp = frames.find((frame) => {\n return frame.description ===\n 'com.apple.streaming.transportStreamTimestamp';\n });\n if (metadataTimestamp) {\n timestamp = /** @type {!number} */(metadataTimestamp.data);\n }\n }\n\n /** @type {number} */\n let sampleRate = 0;\n\n /** @type {!Uint8Array} */\n let audioConfig = new Uint8Array([]);\n\n /** @type {!Array<shaka.transmuxer.Mp4Generator.Mp4Sample>} */\n const samples = [];\n\n while (offset < uint8ArrayData.length) {\n const frame = Ec3.parseFrame(uint8ArrayData, offset);\n if (!frame) {\n return Promise.reject(new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.TRANSMUXING_FAILED,\n reference ? reference.getUris()[0] : null));\n }\n stream.audioSamplingRate = frame.sampleRate;\n stream.channelsCount = frame.channelCount;\n sampleRate = frame.sampleRate;\n audioConfig = frame.audioConfig;\n\n const frameData = uint8ArrayData.subarray(\n offset, offset + frame.frameLength);\n\n samples.push({\n data: frameData,\n size: frame.frameLength,\n duration: Ec3.EC3_SAMPLES_PER_FRAME,\n cts: 0,\n flags: {\n isLeading: 0,\n isDependedOn: 0,\n hasRedundancy: 0,\n degradPrio: 0,\n dependsOn: 2,\n isNonSync: 0,\n },\n });\n offset += frame.frameLength;\n }\n /** @type {number} */\n const baseMediaDecodeTime = Math.floor(timestamp * sampleRate / 1000);\n\n /** @type {shaka.transmuxer.Mp4Generator.StreamInfo} */\n const streamInfo = {\n id: stream.id,\n type: shaka.util.ManifestParserUtils.ContentType.AUDIO,\n codecs: 'ec-3',\n encrypted: stream.encrypted && stream.drmInfos.length > 0,\n timescale: sampleRate,\n duration: duration,\n videoNalus: [],\n audioConfig: audioConfig,\n videoConfig: new Uint8Array([]),\n hSpacing: 0,\n vSpacing: 0,\n data: {\n sequenceNumber: this.frameIndex_,\n baseMediaDecodeTime: baseMediaDecodeTime,\n samples: samples,\n },\n stream: stream,\n };\n const mp4Generator = new shaka.transmuxer.Mp4Generator([streamInfo]);\n let initSegment;\n const initSegmentKey = stream.id + '_' + reference.discontinuitySequence;\n if (!this.initSegments.has(initSegmentKey)) {\n initSegment = mp4Generator.initSegment();\n this.initSegments.set(initSegmentKey, initSegment);\n } else {\n initSegment = this.initSegments.get(initSegmentKey);\n }\n const appendInitSegment = this.lastInitSegment_ !== initSegment;\n const segmentData = mp4Generator.segmentData();\n this.lastInitSegment_ = initSegment;\n this.frameIndex_++;\n if (appendInitSegment) {\n const transmuxData = Uint8ArrayUtils.concat(initSegment, segmentData);\n return Promise.resolve(transmuxData);\n } else {\n return Promise.resolve(segmentData);\n }\n }\n};\n\nshaka.transmuxer.TransmuxerEngine.registerTransmuxer(\n 'audio/ec3',\n () => new shaka.transmuxer.Ec3Transmuxer('audio/ec3'),\n shaka.transmuxer.TransmuxerEngine.PluginPriority.FALLBACK);\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.transmuxer.H264');\n\ngoog.require('shaka.util.ExpGolomb');\ngoog.require('shaka.util.Uint8ArrayUtils');\n\n\n/**\n * H.264 utils\n */\nshaka.transmuxer.H264 = class {\n /**\n * Read a sequence parameter set and return some interesting video\n * properties. A sequence parameter set is the H264 metadata that\n * describes the properties of upcoming video frames.\n *\n * @param {!Array<shaka.extern.VideoNalu>} nalus\n * @return {?{height: number, width: number, videoConfig: !Uint8Array,\n * hSpacing: number, vSpacing: number}}\n */\n static parseInfo(nalus) {\n const H264 = shaka.transmuxer.H264;\n if (!nalus.length) {\n return null;\n }\n const spsNalu = nalus.find((nalu) => {\n return nalu.type == H264.NALU_TYPE_SPS_;\n });\n const ppsNalu = nalus.find((nalu) => {\n return nalu.type == H264.NALU_TYPE_PPS_;\n });\n if (!spsNalu || !ppsNalu) {\n return null;\n }\n\n const expGolombDecoder = new shaka.util.ExpGolomb(spsNalu.data);\n // profile_idc\n const profileIdc = expGolombDecoder.readUnsignedByte();\n // constraint_set[0-5]_flag\n expGolombDecoder.readUnsignedByte();\n // level_idc u(8)\n expGolombDecoder.readUnsignedByte();\n // seq_parameter_set_id\n expGolombDecoder.skipExpGolomb();\n\n // some profiles have more optional data we don't need\n if (H264.PROFILES_WITH_OPTIONAL_SPS_DATA_.includes(profileIdc)) {\n const chromaFormatIdc = expGolombDecoder.readUnsignedExpGolomb();\n if (chromaFormatIdc === 3) {\n // separate_colour_plane_flag\n expGolombDecoder.skipBits(1);\n }\n // bit_depth_luma_minus8\n expGolombDecoder.skipExpGolomb();\n // bit_depth_chroma_minus8\n expGolombDecoder.skipExpGolomb();\n // qpprime_y_zero_transform_bypass_flag\n expGolombDecoder.skipBits(1);\n // seq_scaling_matrix_present_flag\n if (expGolombDecoder.readBoolean()) {\n const scalingListCount = (chromaFormatIdc !== 3) ? 8 : 12;\n for (let i = 0; i < scalingListCount; i++) {\n // seq_scaling_list_present_flag[ i ]\n if (expGolombDecoder.readBoolean()) {\n if (i < 6) {\n expGolombDecoder.skipScalingList(16);\n } else {\n expGolombDecoder.skipScalingList(64);\n }\n }\n }\n }\n }\n\n // log2_max_frame_num_minus4\n expGolombDecoder.skipExpGolomb();\n const picOrderCntType = expGolombDecoder.readUnsignedExpGolomb();\n\n if (picOrderCntType === 0) {\n // log2_max_pic_order_cnt_lsb_minus4\n expGolombDecoder.readUnsignedExpGolomb();\n } else if (picOrderCntType === 1) {\n // delta_pic_order_always_zero_flag\n expGolombDecoder.skipBits(1);\n // offset_for_non_ref_pic\n expGolombDecoder.skipExpGolomb();\n // offset_for_top_to_bottom_field\n expGolombDecoder.skipExpGolomb();\n const numRefFramesInPicOrderCntCycle =\n expGolombDecoder.readUnsignedExpGolomb();\n for (let i = 0; i < numRefFramesInPicOrderCntCycle; i++) {\n // offset_for_ref_frame[ i ]\n expGolombDecoder.skipExpGolomb();\n }\n }\n\n // max_num_ref_frames\n expGolombDecoder.skipExpGolomb();\n // gaps_in_frame_num_value_allowed_flag\n expGolombDecoder.skipBits(1);\n\n const picWidthInMbsMinus1 =\n expGolombDecoder.readUnsignedExpGolomb();\n const picHeightInMapUnitsMinus1 =\n expGolombDecoder.readUnsignedExpGolomb();\n\n const frameMbsOnlyFlag = expGolombDecoder.readBits(1);\n if (frameMbsOnlyFlag === 0) {\n // mb_adaptive_frame_field_flag\n expGolombDecoder.skipBits(1);\n }\n // direct_8x8_inference_flag\n expGolombDecoder.skipBits(1);\n\n let frameCropLeftOffset = 0;\n let frameCropRightOffset = 0;\n let frameCropTopOffset = 0;\n let frameCropBottomOffset = 0;\n\n // frame_cropping_flag\n if (expGolombDecoder.readBoolean()) {\n frameCropLeftOffset = expGolombDecoder.readUnsignedExpGolomb();\n frameCropRightOffset = expGolombDecoder.readUnsignedExpGolomb();\n frameCropTopOffset = expGolombDecoder.readUnsignedExpGolomb();\n frameCropBottomOffset = expGolombDecoder.readUnsignedExpGolomb();\n }\n\n let hSpacing = 1;\n let vSpacing = 1;\n\n // vui_parameters_present_flag\n if (expGolombDecoder.readBoolean()) {\n // aspect_ratio_info_present_flag\n if (expGolombDecoder.readBoolean()) {\n const aspectRatioIdc = expGolombDecoder.readUnsignedByte();\n const hSpacingTable = [\n 1, 12, 10, 16, 40, 24, 20, 32, 80, 18, 15, 64, 160, 4, 3, 2,\n ];\n const vSpacingTable = [\n 1, 11, 11, 11, 33, 11, 11, 11, 33, 11, 11, 33, 99, 3, 2, 1,\n ];\n if (aspectRatioIdc > 0 && aspectRatioIdc <= 16) {\n hSpacing = hSpacingTable[aspectRatioIdc - 1];\n vSpacing = vSpacingTable[aspectRatioIdc - 1];\n } else if (aspectRatioIdc === 255) {\n hSpacing = expGolombDecoder.readBits(16);\n vSpacing = expGolombDecoder.readBits(16);\n }\n }\n }\n\n const height = ((2 - frameMbsOnlyFlag) *\n (picHeightInMapUnitsMinus1 + 1) * 16) - (frameCropTopOffset * 2) -\n (frameCropBottomOffset * 2);\n const width = ((picWidthInMbsMinus1 + 1) * 16) -\n frameCropLeftOffset * 2 - frameCropRightOffset * 2;\n\n // assemble the SPSs\n let sps = [];\n const spsData = spsNalu.fullData;\n sps.push((spsData.byteLength >>> 8) & 0xff);\n sps.push(spsData.byteLength & 0xff);\n sps = sps.concat(...spsData);\n\n // assemble the PPSs\n let pps = [];\n const ppsData = ppsNalu.fullData;\n pps.push((ppsData.byteLength >>> 8) & 0xff);\n pps.push(ppsData.byteLength & 0xff);\n pps = pps.concat(...ppsData);\n\n const videoConfig = new Uint8Array(\n [\n 0x01, // version\n sps[3], // profile\n sps[4], // profile compat\n sps[5], // level\n 0xfc | 3, // lengthSizeMinusOne, hard-coded to 4 bytes\n 0xe0 | 1, // 3bit reserved (111) + numOfSequenceParameterSets\n ].concat(sps).concat([\n 1, // numOfPictureParameterSets\n ]).concat(pps));\n\n return {\n height,\n width,\n videoConfig,\n hSpacing,\n vSpacing,\n };\n }\n\n /**\n * @param {!Array<shaka.extern.MPEG_PES>} videoData\n * @return {!Array<shaka.extern.VideoSample>}\n */\n static getVideoSamples(videoData) {\n const H264 = shaka.transmuxer.H264;\n\n /** @type {!Array<shaka.extern.VideoSample>} */\n const videoSamples = [];\n /** @type {?shaka.extern.VideoSample} */\n let lastVideoSample = null;\n /** @type {boolean} */\n let audFound = false;\n\n const addLastVideoSample = () => {\n if (!lastVideoSample) {\n return;\n }\n if (!lastVideoSample.nalus.length || !lastVideoSample.frame) {\n return;\n }\n const nalusData = [];\n for (const nalu of lastVideoSample.nalus) {\n const size = nalu.fullData.byteLength;\n const naluLength = new Uint8Array(4);\n naluLength[0] = (size >> 24) & 0xff;\n naluLength[1] = (size >> 16) & 0xff;\n naluLength[2] = (size >> 8) & 0xff;\n naluLength[3] = size & 0xff;\n nalusData.push(naluLength);\n nalusData.push(nalu.fullData);\n }\n lastVideoSample.data = shaka.util.Uint8ArrayUtils.concat(...nalusData);\n videoSamples.push(lastVideoSample);\n };\n\n const createLastVideoSample = (pes) => {\n lastVideoSample = {\n data: new Uint8Array([]),\n frame: false,\n isKeyframe: false,\n pts: pes.pts,\n dts: pes.dts,\n nalus: [],\n };\n };\n\n for (let i = 0; i < videoData.length; i++) {\n const pes = videoData[i];\n const nalus = pes.nalus;\n let spsFound = false;\n\n // If new NAL units found and last sample still there, let's push ...\n // This helps parsing streams with missing AUD\n // (only do this if AUD never found)\n if (lastVideoSample && nalus.length && !audFound) {\n addLastVideoSample();\n createLastVideoSample(pes);\n }\n\n for (const nalu of pes.nalus) {\n let push = false;\n switch (nalu.type) {\n case H264.NALU_TYPE_NDR_: {\n let isKeyframe = false;\n push = true;\n const data = nalu.data;\n // Only check slice type to detect KF in case SPS found in same\n // packet (any keyframe is preceded by SPS ...)\n if (spsFound && data.length > 4) {\n // retrieve slice type by parsing beginning of NAL unit (follow\n // H264 spec,slice_header definition) to detect keyframe embedded\n // in NDR\n const sliceType = new shaka.util.ExpGolomb(data).readSliceType();\n // 2 : I slice, 4 : SI slice, 7 : I slice, 9: SI slice\n // SI slice : A slice that is coded using intra prediction only\n // and using quantisation of the prediction samples.\n // An SI slice can be coded such that its decoded samples can be\n // constructed identically to an SP slice.\n // I slice: A slice that is not an SI slice that is decoded using\n // intra prediction only.\n if (sliceType === 2 || sliceType === 4 ||\n sliceType === 7 || sliceType === 9) {\n isKeyframe = true;\n }\n }\n if (isKeyframe) {\n // If we have non-keyframe data already, that cannot belong to\n // the same frame as a keyframe, so force a push\n if (lastVideoSample &&\n lastVideoSample.frame && !lastVideoSample.isKeyframe) {\n addLastVideoSample();\n lastVideoSample = null;\n }\n }\n if (!lastVideoSample) {\n createLastVideoSample(pes);\n }\n lastVideoSample.frame = true;\n lastVideoSample.isKeyframe = isKeyframe;\n break;\n }\n case H264.NALU_TYPE_IDR_: {\n push = true;\n // Handle PES not starting with AUD\n // If we have frame data already, that cannot belong to the same\n // frame, so force a push\n if (lastVideoSample &&\n lastVideoSample.frame && !lastVideoSample.isKeyframe) {\n addLastVideoSample();\n lastVideoSample = null;\n }\n if (!lastVideoSample) {\n createLastVideoSample(pes);\n }\n lastVideoSample.frame = true;\n lastVideoSample.isKeyframe = true;\n break;\n }\n case H264.NALU_TYPE_SEI_:\n push = true;\n break;\n case H264.NALU_TYPE_SPS_:\n push = true;\n spsFound = true;\n break;\n case H264.NALU_TYPE_PPS_:\n push = true;\n break;\n case H264.NALU_TYPE_AUD_:\n push = true;\n audFound = true;\n if (lastVideoSample && lastVideoSample.frame) {\n addLastVideoSample();\n lastVideoSample = null;\n }\n if (!lastVideoSample) {\n createLastVideoSample(pes);\n }\n break;\n case H264.NALU_TYPE_FILLER_DATA_:\n push = true;\n break;\n default:\n push = false;\n break;\n }\n if (lastVideoSample && push) {\n lastVideoSample.nalus.push(nalu);\n }\n }\n }\n\n // If last PES packet, push samples\n addLastVideoSample();\n\n return videoSamples;\n }\n};\n\n\n/**\n * NALU type for NDR for H.264.\n * @const {number}\n * @private\n */\nshaka.transmuxer.H264.NALU_TYPE_NDR_ = 0x01;\n\n\n/**\n * NALU type for Instantaneous Decoder Refresh (IDR) for H.264.\n * @const {number}\n * @private\n */\nshaka.transmuxer.H264.NALU_TYPE_IDR_ = 0x05;\n\n\n/**\n * NALU type for Supplemental Enhancement Information (SEI) for H.264.\n * @const {number}\n * @private\n */\nshaka.transmuxer.H264.NALU_TYPE_SEI_ = 0x06;\n\n\n/**\n * NALU type for Sequence Parameter Set (SPS) for H.264.\n * @const {number}\n * @private\n */\nshaka.transmuxer.H264.NALU_TYPE_SPS_ = 0x07;\n\n\n/**\n * NALU type for Picture Parameter Set (PPS) for H.264.\n * @const {number}\n * @private\n */\nshaka.transmuxer.H264.NALU_TYPE_PPS_ = 0x08;\n\n\n/**\n * NALU type for Access Unit Delimiter (AUD) for H.264.\n * @const {number}\n * @private\n */\nshaka.transmuxer.H264.NALU_TYPE_AUD_ = 0x09;\n\n\n/**\n * NALU type for Filler Data for H.264.\n * @const {number}\n * @private\n */\nshaka.transmuxer.H264.NALU_TYPE_FILLER_DATA_ = 0x0c;\n\n\n/**\n * Values of profile_idc that indicate additional fields are included in the\n * SPS.\n * see Recommendation ITU-T H.264 (4/2013)\n * 7.3.2.1.1 Sequence parameter set data syntax\n *\n * @const {!Array<number>}\n * @private\n */\nshaka.transmuxer.H264.PROFILES_WITH_OPTIONAL_SPS_DATA_ =\n [100, 110, 122, 244, 44, 83, 86, 118, 128, 138, 139, 134];\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.transmuxer.H265');\n\ngoog.require('shaka.util.ExpGolomb');\ngoog.require('shaka.util.Uint8ArrayUtils');\n\n\n/**\n * H.265 utils\n */\nshaka.transmuxer.H265 = class {\n /**\n * Read a sequence parameter set and return some interesting video\n * properties. A sequence parameter set is the H265 metadata that\n * describes the properties of upcoming video frames.\n *\n * @param {!Array<shaka.extern.VideoNalu>} nalus\n * @return {?{height: number, width: number, videoConfig: !Uint8Array,\n * hSpacing: number, vSpacing: number}}\n */\n static parseInfo(nalus) {\n const H265 = shaka.transmuxer.H265;\n if (!nalus.length) {\n return null;\n }\n const vpsNalu = nalus.find((nalu) => {\n return nalu.type == H265.NALU_TYPE_VPS_;\n });\n const spsNalu = nalus.find((nalu) => {\n return nalu.type == H265.NALU_TYPE_SPS_;\n });\n const ppsNalu = nalus.find((nalu) => {\n return nalu.type == H265.NALU_TYPE_PPS_;\n });\n if (!vpsNalu || !spsNalu || !ppsNalu) {\n return null;\n }\n\n const vpsConfiguration = H265.parseVPS_(vpsNalu.fullData);\n const spsConfiguration = H265.parseSPS_(spsNalu.fullData);\n const ppsConfiguration = H265.parsePPS_(ppsNalu.fullData);\n\n /** @type {shaka.transmuxer.H265.DecoderConfigurationRecordType} */\n const detail = {\n numTemporalLayers: vpsConfiguration.numTemporalLayers,\n temporalIdNested: vpsConfiguration.temporalIdNested,\n generalProfileSpace: spsConfiguration.generalProfileSpace,\n generalTierFlag: spsConfiguration.generalTierFlag,\n generalLevelIdc: spsConfiguration.generalLevelIdc,\n generalProfileIdc: spsConfiguration.generalProfileIdc,\n generalProfileCompatibilityFlags1:\n spsConfiguration.generalProfileCompatibilityFlags1,\n generalProfileCompatibilityFlags2:\n spsConfiguration.generalProfileCompatibilityFlags2,\n generalProfileCompatibilityFlags3:\n spsConfiguration.generalProfileCompatibilityFlags3,\n generalProfileCompatibilityFlags4:\n spsConfiguration.generalProfileCompatibilityFlags4,\n generalConstraintIndicatorFlags1:\n spsConfiguration.generalConstraintIndicatorFlags1,\n generalConstraintIndicatorFlags2:\n spsConfiguration.generalConstraintIndicatorFlags2,\n generalConstraintIndicatorFlags3:\n spsConfiguration.generalConstraintIndicatorFlags3,\n generalConstraintIndicatorFlags4:\n spsConfiguration.generalConstraintIndicatorFlags4,\n generalConstraintIndicatorFlags5:\n spsConfiguration.generalConstraintIndicatorFlags5,\n generalConstraintIndicatorFlags6:\n spsConfiguration.generalConstraintIndicatorFlags6,\n constantFrameRate: spsConfiguration.constantFrameRate,\n minSpatialSegmentationIdc: spsConfiguration.minSpatialSegmentationIdc,\n chromaFormatIdc: spsConfiguration.chromaFormatIdc,\n bitDepthLumaMinus8: spsConfiguration.bitDepthLumaMinus8,\n bitDepthChromaMinus8: spsConfiguration.bitDepthChromaMinus8,\n parallelismType: ppsConfiguration.parallelismType,\n };\n\n const videoConfig = H265.getVideoConfiguration_(\n vpsNalu.fullData, spsNalu.fullData, ppsNalu.fullData, detail);\n\n return {\n height: spsConfiguration.height,\n width: spsConfiguration.width,\n videoConfig,\n hSpacing: spsConfiguration.sarWidth,\n vSpacing: spsConfiguration.sarHeight,\n };\n }\n\n /**\n * @param {!Uint8Array} data\n * @return {shaka.transmuxer.H265.VPSConfiguration}\n * @private\n */\n static parseVPS_(data) {\n const gb = new shaka.util.ExpGolomb(data, /* convertEbsp2rbsp= */ true);\n\n // remove NALu Header\n gb.readUnsignedByte();\n gb.readUnsignedByte();\n\n // VPS\n gb.readBits(4); // video_parameter_set_id\n gb.readBits(2);\n gb.readBits(6); // max_layers_minus1\n const maxSubLayersMinus1 = gb.readBits(3);\n const temporalIdNestingFlag = gb.readBoolean();\n\n return {\n numTemporalLayers: maxSubLayersMinus1 + 1,\n temporalIdNested: temporalIdNestingFlag,\n };\n }\n\n /**\n * The code is based on mpegts.js\n * https://github.com/xqq/mpegts.js/blob/master/src/demux/h265-parser.js#L65\n *\n * @param {!Uint8Array} data\n * @return {shaka.transmuxer.H265.SPSConfiguration}\n * @private\n */\n static parseSPS_(data) {\n const gb = new shaka.util.ExpGolomb(data, /* convertEbsp2rbsp= */ true);\n\n // remove NALu Header\n gb.readUnsignedByte();\n gb.readUnsignedByte();\n\n let leftOffset = 0;\n let rightOffset = 0;\n let topOffset = 0;\n let bottomOffset = 0;\n\n // SPS\n gb.readBits(4); // video_parameter_set_id\n const maxSubLayersMinus1 = gb.readBits(3);\n gb.readBoolean(); // temporal_id_nesting_flag\n\n // profile_tier_level begin\n const generalProfileSpace = gb.readBits(2);\n const generalTierFlag = gb.readBits(1);\n const generalProfileIdc = gb.readBits(5);\n const generalProfileCompatibilityFlags1 = gb.readUnsignedByte();\n const generalProfileCompatibilityFlags2 = gb.readUnsignedByte();\n const generalProfileCompatibilityFlags3 = gb.readUnsignedByte();\n const generalProfileCompatibilityFlags4 = gb.readUnsignedByte();\n const generalConstraintIndicatorFlags1 = gb.readUnsignedByte();\n const generalConstraintIndicatorFlags2 = gb.readUnsignedByte();\n const generalConstraintIndicatorFlags3 = gb.readUnsignedByte();\n const generalConstraintIndicatorFlags4 = gb.readUnsignedByte();\n const generalConstraintIndicatorFlags5 = gb.readUnsignedByte();\n const generalConstraintIndicatorFlags6 = gb.readUnsignedByte();\n const generalLevelIdc = gb.readUnsignedByte();\n const subLayerProfilePresentFlag = [];\n const subLayerLevelPresentFlag = [];\n for (let i = 0; i < maxSubLayersMinus1; i++) {\n subLayerProfilePresentFlag.push(gb.readBoolean());\n subLayerLevelPresentFlag.push(gb.readBoolean());\n }\n if (maxSubLayersMinus1 > 0) {\n for (let i = maxSubLayersMinus1; i < 8; i++) {\n gb.readBits(2);\n }\n }\n for (let i = 0; i < maxSubLayersMinus1; i++) {\n if (subLayerProfilePresentFlag[i]) {\n gb.readBits(88);\n }\n if (subLayerLevelPresentFlag[i]) {\n gb.readUnsignedByte();\n }\n }\n // profile_tier_level end\n\n gb.readUnsignedExpGolomb(); // seq_parameter_set_id\n const chromaFormatIdc = gb.readUnsignedExpGolomb();\n if (chromaFormatIdc == 3) {\n gb.readBits(1); // separate_colour_plane_flag\n }\n const picWidthInLumaSamples = gb.readUnsignedExpGolomb();\n const picHeightInLumaSamples = gb.readUnsignedExpGolomb();\n const conformanceWindowFlag = gb.readBoolean();\n if (conformanceWindowFlag) {\n leftOffset += gb.readUnsignedExpGolomb();\n rightOffset += gb.readUnsignedExpGolomb();\n topOffset += gb.readUnsignedExpGolomb();\n bottomOffset += gb.readUnsignedExpGolomb();\n }\n const bitDepthLumaMinus8 = gb.readUnsignedExpGolomb();\n const bitDepthChromaMinus8 = gb.readUnsignedExpGolomb();\n const log2MaxPicOrderCntLsbMinus4 = gb.readUnsignedExpGolomb();\n const subLayerOrderingInfoPresentFlag = gb.readBoolean();\n if (subLayerOrderingInfoPresentFlag) {\n // Skip each layer\n for (let i = 0; i <= maxSubLayersMinus1; i++) {\n gb.readUnsignedExpGolomb(); // max_dec_pic_buffering_minus1[i]\n gb.readUnsignedExpGolomb(); // max_num_reorder_pics[i]\n gb.readUnsignedExpGolomb(); // max_latency_increase_plus1[i]\n }\n } else {\n // Skip one layer\n gb.readUnsignedExpGolomb(); // max_dec_pic_buffering_minus1[i]\n gb.readUnsignedExpGolomb(); // max_num_reorder_pics[i]\n gb.readUnsignedExpGolomb(); // max_latency_increase_plus1[i]\n }\n gb.readUnsignedExpGolomb(); // log2_min_luma_coding_block_size_minus3\n gb.readUnsignedExpGolomb(); // log2_diff_max_min_luma_coding_block_size\n gb.readUnsignedExpGolomb(); // log2_min_transform_block_size_minus2\n gb.readUnsignedExpGolomb(); // log2_diff_max_min_transform_block_size\n gb.readUnsignedExpGolomb(); // max_transform_hierarchy_depth_inter\n gb.readUnsignedExpGolomb(); // max_transform_hierarchy_depth_intra\n const scalingListEnabledFlag = gb.readBoolean();\n if (scalingListEnabledFlag) {\n const spsScalingListDataPresentFlag = gb.readBoolean();\n if (spsScalingListDataPresentFlag) {\n for (let sizeId = 0; sizeId < 4; sizeId++) {\n for (\n let matrixId = 0;\n matrixId < (sizeId === 3 ? 2 : 6);\n matrixId++\n ) {\n const scalingListPredModeFlag = gb.readBoolean();\n if (!scalingListPredModeFlag) {\n gb.readUnsignedExpGolomb(); // scaling_list_pred_matrix_id_delta\n } else {\n const coefNum = Math.min(64, 1 << (4 + (sizeId << 1)));\n if (sizeId > 1) {\n gb.readExpGolomb();\n }\n for (let i = 0; i < coefNum; i++) {\n gb.readExpGolomb();\n }\n }\n }\n }\n }\n }\n gb.readBoolean(); // amp_enabled_flag\n gb.readBoolean(); // sample_adaptive_offset_enabled_flag\n const pcmEnabledFlag = gb.readBoolean();\n if (pcmEnabledFlag) {\n gb.readUnsignedByte();\n gb.readUnsignedExpGolomb();\n gb.readUnsignedExpGolomb();\n gb.readBoolean();\n }\n const numShortTermRefPicSets = gb.readUnsignedExpGolomb();\n let numDeltaPocs = 0;\n for (let i = 0; i < numShortTermRefPicSets; i++) {\n let interRefPicSetPredictionFlag = false;\n if (i !== 0) {\n interRefPicSetPredictionFlag = gb.readBoolean();\n }\n if (interRefPicSetPredictionFlag) {\n if (i === numShortTermRefPicSets) {\n gb.readUnsignedExpGolomb();\n }\n gb.readBoolean();\n gb.readUnsignedExpGolomb();\n let nextNumDeltaPocs = 0;\n for (let j = 0; j <= numDeltaPocs; j++) {\n const usedByCurrPicFlag = gb.readBoolean();\n let useDeltaFlag = false;\n if (!usedByCurrPicFlag) {\n useDeltaFlag = gb.readBoolean();\n }\n if (usedByCurrPicFlag || useDeltaFlag) {\n nextNumDeltaPocs++;\n }\n }\n numDeltaPocs = nextNumDeltaPocs;\n } else {\n const numNegativePics = gb.readUnsignedExpGolomb();\n const numPositivePics = gb.readUnsignedExpGolomb();\n numDeltaPocs = numNegativePics + numPositivePics;\n for (let j = 0; j < numNegativePics; j++) {\n gb.readUnsignedExpGolomb();\n gb.readBoolean();\n }\n for (let j = 0; j < numPositivePics; j++) {\n gb.readUnsignedExpGolomb();\n gb.readBoolean();\n }\n }\n }\n const longTermRefPicsPresentFlag = gb.readBoolean();\n if (longTermRefPicsPresentFlag) {\n const numLongTermRefPicsSps = gb.readUnsignedExpGolomb();\n for (let i = 0; i < numLongTermRefPicsSps; i++) {\n for (let j = 0; j < log2MaxPicOrderCntLsbMinus4 + 4; j++) {\n gb.readBits(1);\n }\n gb.readBits(1);\n }\n }\n let defaultDisplayWindowFlag = false; // for calc offset\n let sarWidth = 1;\n let sarHeight = 1;\n let minSpatialSegmentationIdc = 0; // for hvcC\n gb.readBoolean(); // sps_temporal_mvp_enabled_flag\n gb.readBoolean(); // strong_intra_smoothing_enabled_flag\n const vuiParametersPresentFlag = gb.readBoolean();\n if (vuiParametersPresentFlag) {\n const aspectRatioInfoPresentFlag = gb.readBoolean();\n if (aspectRatioInfoPresentFlag) {\n const aspectRatioIdc = gb.readUnsignedByte();\n const sarWidthTable = [\n 1, 12, 10, 16, 40, 24, 20, 32, 80, 18, 15, 64, 160, 4, 3, 2,\n ];\n const sarHeightTable = [\n 1, 11, 11, 11, 33, 11, 11, 11, 33, 11, 11, 33, 99, 3, 2, 1,\n ];\n if (aspectRatioIdc > 0 && aspectRatioIdc <= 16) {\n sarWidth = sarWidthTable[aspectRatioIdc - 1];\n sarHeight = sarHeightTable[aspectRatioIdc - 1];\n } else if (aspectRatioIdc === 255) {\n sarWidth = gb.readBits(16);\n sarHeight = gb.readBits(16);\n }\n }\n const overscanInfoPresentFlag = gb.readBoolean();\n if (overscanInfoPresentFlag) {\n gb.readBoolean();\n }\n const videoSignalTypePresentFlag = gb.readBoolean();\n if (videoSignalTypePresentFlag) {\n gb.readBits(3);\n gb.readBoolean();\n const colourDescriptionPresentFlag = gb.readBoolean();\n if (colourDescriptionPresentFlag) {\n gb.readUnsignedByte();\n gb.readUnsignedByte();\n gb.readUnsignedByte();\n }\n }\n const chromaLocInfoPresentFlag = gb.readBoolean();\n if (chromaLocInfoPresentFlag) {\n gb.readUnsignedExpGolomb();\n gb.readUnsignedExpGolomb();\n }\n gb.readBoolean(); // neutral_chroma_indication_flag\n gb.readBoolean(); // field_seq_flag\n gb.readBoolean(); // frame_field_info_present_flag\n defaultDisplayWindowFlag = gb.readBoolean();\n if (defaultDisplayWindowFlag) {\n gb.readUnsignedExpGolomb();\n gb.readUnsignedExpGolomb();\n gb.readUnsignedExpGolomb();\n gb.readUnsignedExpGolomb();\n }\n const vuiTimingInfoPresentFlag = gb.readBoolean();\n if (vuiTimingInfoPresentFlag) {\n gb.readBits(32); // fps_den\n gb.readBits(32); // fps_num\n const vuiPocProportionalToTimingFlag = gb.readBoolean();\n if (vuiPocProportionalToTimingFlag) {\n gb.readUnsignedExpGolomb();\n }\n const vuiHrdParametersPresentFlag = gb.readBoolean();\n if (vuiHrdParametersPresentFlag) {\n const commonInfPresentFlag = 1;\n let nalHrdParametersPresentFlag = false;\n let vclHrdParametersPresentFlag = false;\n let subPicHrdParamsPresentFlag = false;\n if (commonInfPresentFlag) {\n nalHrdParametersPresentFlag = gb.readBoolean();\n vclHrdParametersPresentFlag = gb.readBoolean();\n if (nalHrdParametersPresentFlag || vclHrdParametersPresentFlag) {\n subPicHrdParamsPresentFlag = gb.readBoolean();\n if (subPicHrdParamsPresentFlag) {\n gb.readUnsignedByte();\n gb.readBits(5);\n gb.readBoolean();\n gb.readBits(5);\n }\n gb.readBits(4); // bit_rate_scale\n gb.readBits(4); // cpb_size_scale\n if (subPicHrdParamsPresentFlag) {\n gb.readBits(4);\n }\n gb.readBits(5);\n gb.readBits(5);\n gb.readBits(5);\n }\n }\n for (let i = 0; i <= maxSubLayersMinus1; i++) {\n const fixedPicRateGeneralFlag = gb.readBoolean();\n let fixedPicRateWithinCvsFlag = true;\n let cpbCnt = 1;\n if (!fixedPicRateGeneralFlag) {\n fixedPicRateWithinCvsFlag = gb.readBoolean();\n }\n let lowDelayHrdFlag = false;\n if (fixedPicRateWithinCvsFlag) {\n gb.readUnsignedExpGolomb();\n } else {\n lowDelayHrdFlag = gb.readBoolean();\n }\n if (!lowDelayHrdFlag) {\n cpbCnt = gb.readUnsignedExpGolomb() + 1;\n }\n if (nalHrdParametersPresentFlag) {\n for (let j = 0; j < cpbCnt; j++) {\n gb.readUnsignedExpGolomb();\n gb.readUnsignedExpGolomb();\n if (subPicHrdParamsPresentFlag) {\n gb.readUnsignedExpGolomb();\n gb.readUnsignedExpGolomb();\n }\n }\n gb.readBoolean();\n }\n if (vclHrdParametersPresentFlag) {\n for (let j = 0; j < cpbCnt; j++) {\n gb.readUnsignedExpGolomb();\n gb.readUnsignedExpGolomb();\n if (subPicHrdParamsPresentFlag) {\n gb.readUnsignedExpGolomb();\n gb.readUnsignedExpGolomb();\n }\n }\n gb.readBoolean();\n }\n }\n }\n }\n const bitstreamRestrictionFlag = gb.readBoolean();\n if (bitstreamRestrictionFlag) {\n gb.readBoolean(); // tiles_fixed_structure_flag\n gb.readBoolean(); // motion_vectors_over_pic_boundaries_flag\n gb.readBoolean(); // restricted_ref_pic_lists_flag\n minSpatialSegmentationIdc = gb.readUnsignedExpGolomb();\n gb.readUnsignedExpGolomb(); // max_bytes_per_pic_denom\n gb.readUnsignedExpGolomb(); // max_bits_per_min_cu_denom\n gb.readUnsignedExpGolomb(); // log2_max_mv_length_horizontal\n gb.readUnsignedExpGolomb(); // log2_max_mv_length_vertical\n }\n }\n\n const subWc = chromaFormatIdc === 1 || chromaFormatIdc === 2 ? 2 : 1;\n const subHc = chromaFormatIdc === 1 ? 2 : 1;\n const codecWidth =\n picWidthInLumaSamples - (leftOffset + rightOffset) * subWc;\n const codecHeight =\n picHeightInLumaSamples - (topOffset + bottomOffset) * subHc;\n\n return {\n generalLevelIdc,\n generalProfileSpace,\n generalTierFlag,\n generalProfileIdc,\n generalProfileCompatibilityFlags1,\n generalProfileCompatibilityFlags2,\n generalProfileCompatibilityFlags3,\n generalProfileCompatibilityFlags4,\n generalConstraintIndicatorFlags1,\n generalConstraintIndicatorFlags2,\n generalConstraintIndicatorFlags3,\n generalConstraintIndicatorFlags4,\n generalConstraintIndicatorFlags5,\n generalConstraintIndicatorFlags6,\n minSpatialSegmentationIdc,\n constantFrameRate: 0, // FIXME!!!\n chromaFormatIdc,\n bitDepthLumaMinus8,\n bitDepthChromaMinus8,\n width: codecWidth,\n height: codecHeight,\n sarWidth: sarWidth,\n sarHeight: sarHeight,\n };\n }\n\n /**\n * @param {!Uint8Array} data\n * @return {shaka.transmuxer.H265.PPSConfiguration}\n * @private\n */\n static parsePPS_(data) {\n const gb = new shaka.util.ExpGolomb(data, /* convertEbsp2rbsp= */ true);\n\n // remove NALu Header\n gb.readUnsignedByte();\n gb.readUnsignedByte();\n\n // PPS\n gb.readUnsignedExpGolomb(); // pic_parameter_set_id\n gb.readUnsignedExpGolomb(); // seq_parameter_set_id\n gb.readBoolean(); // dependent_slice_segments_enabled_flag\n gb.readBoolean(); // output_flag_present_flag\n gb.readBits(3); // num_extra_slice_header_bits\n gb.readBoolean(); // sign_data_hiding_enabled_flag\n gb.readBoolean(); // cabac_init_present_flag\n gb.readUnsignedExpGolomb(); // num_ref_idx_l0_default_active_minus1\n gb.readUnsignedExpGolomb(); // num_ref_idx_l1_default_active_minus1\n gb.readExpGolomb(); // init_qp_minus26\n gb.readBoolean(); // constrained_intra_pred_flag\n gb.readBoolean(); // transform_skip_enabled_flag\n const cuQpDeltaEnabledFlag = gb.readBoolean();\n if (cuQpDeltaEnabledFlag) {\n gb.readUnsignedExpGolomb(); // diff_cu_qp_delta_depth\n }\n gb.readExpGolomb(); // cb_qp_offset\n gb.readExpGolomb(); // cr_qp_offset\n gb.readBoolean(); // pps_slice_chroma_qp_offsets_present_flag\n gb.readBoolean(); // weighted_pred_flag\n gb.readBoolean(); // weighted_bipred_flag\n gb.readBoolean(); // transquant_bypass_enabled_flag\n const tilesEnabledFlag = gb.readBoolean();\n const entropyCodingSyncEnabledFlag = gb.readBoolean();\n\n // needs hvcC\n let parallelismType = 1; // slice-based parallel decoding\n if (entropyCodingSyncEnabledFlag && tilesEnabledFlag) {\n parallelismType = 0; // mixed-type parallel decoding\n } else if (entropyCodingSyncEnabledFlag) {\n parallelismType = 3; // wavefront-based parallel decoding\n } else if (tilesEnabledFlag) {\n parallelismType = 2; // tile-based parallel decoding\n }\n\n return {\n parallelismType,\n };\n }\n\n /**\n * @param {!Uint8Array} vps\n * @param {!Uint8Array} sps\n * @param {!Uint8Array} pps\n * @param {shaka.transmuxer.H265.DecoderConfigurationRecordType} detail\n * @return {!Uint8Array}\n * @private\n */\n static getVideoConfiguration_(vps, sps, pps, detail) {\n const H265 = shaka.transmuxer.H265;\n\n const length = 23 + (3 + 2 + vps.byteLength) +\n (3 + 2 + sps.byteLength) + (3 + 2 + pps.byteLength);\n const data = new Uint8Array(length);\n\n data[0] = 0x01; // configurationVersion\n data[1] = ((detail.generalProfileSpace & 0x03) << 6) |\n ((detail.generalTierFlag ? 1 : 0) << 5) |\n ((detail.generalProfileIdc & 0x1F));\n data[2] = detail.generalProfileCompatibilityFlags1;\n data[3] = detail.generalProfileCompatibilityFlags2;\n data[4] = detail.generalProfileCompatibilityFlags3;\n data[5] = detail.generalProfileCompatibilityFlags4;\n data[6] = detail.generalConstraintIndicatorFlags1;\n data[7] = detail.generalConstraintIndicatorFlags2;\n data[8] = detail.generalConstraintIndicatorFlags3;\n data[9] = detail.generalConstraintIndicatorFlags4;\n data[10] = detail.generalConstraintIndicatorFlags5;\n data[11] = detail.generalConstraintIndicatorFlags6;\n data[12] = detail.generalLevelIdc;\n data[13] = 0xF0 |\n ((detail.minSpatialSegmentationIdc & 0x0F00) >> 8);\n data[14] = (detail.minSpatialSegmentationIdc & 0xFF);\n data[15] = 0xFC | (detail.parallelismType & 0x03);\n data[16] = 0xFC | (detail.chromaFormatIdc & 0x03);\n data[17] = 0xF8 | (detail.bitDepthLumaMinus8 & 0x07);\n data[18] = 0xF8 | (detail.bitDepthChromaMinus8 & 0x07);\n data[19] = 0;\n data[20] = 0;\n data[21] = ((detail.constantFrameRate & 0x03) << 6) |\n ((detail.numTemporalLayers & 0x07) << 3) |\n ((detail.temporalIdNested ? 1 : 0) << 2) | 3;\n data[22] = 3;\n data[23 + 0 + 0] = 0x80 | H265.NALU_TYPE_VPS_;\n data[23 + 0 + 1] = 0;\n data[23 + 0 + 2] = 1;\n data[23 + 0 + 3] = (vps.byteLength & 0xFF00) >> 8;\n data[23 + 0 + 4] = (vps.byteLength & 0x00FF) >> 0;\n data.set(vps, 23 + 0 + 5);\n data[23 + (5 + vps.byteLength) + 0] =\n 0x80 | H265.NALU_TYPE_SPS_;\n data[23 + (5 + vps.byteLength) + 1] = 0;\n data[23 + (5 + vps.byteLength) + 2] = 1;\n data[23 + (5 + vps.byteLength) + 3] = (sps.byteLength & 0xFF00) >> 8;\n data[23 + (5 + vps.byteLength) + 4] = (sps.byteLength & 0x00FF) >> 0;\n data.set(sps, 23 + (5 + vps.byteLength) + 5);\n data[23 + (5 + vps.byteLength + 5 + sps.byteLength) + 0] =\n 0x80 | H265.NALU_TYPE_PPS_;\n data[23 + (5 + vps.byteLength + 5 + sps.byteLength) + 1] = 0;\n data[23 + (5 + vps.byteLength + 5 + sps.byteLength) + 2] = 1;\n data[23 + (5 + vps.byteLength + 5 + sps.byteLength) + 3] =\n (pps.byteLength & 0xFF00) >> 8;\n data[23 + (5 + vps.byteLength + 5 + sps.byteLength) + 4] =\n (pps.byteLength & 0x00FF) >> 0;\n data.set(pps, 23 + (5 + vps.byteLength + 5 + sps.byteLength) + 5);\n return data;\n }\n\n /**\n * @param {!Array<shaka.extern.VideoNalu>} nalus\n * @return {?{data: !Uint8Array, isKeyframe: boolean}}\n */\n static parseFrame(nalus) {\n const H265 = shaka.transmuxer.H265;\n let isKeyframe = false;\n const nalusData = [];\n let hvcSample = false;\n for (const nalu of nalus) {\n let push = false;\n switch (nalu.type) {\n case H265.NALU_TYPE_TRAIL_N_:\n case H265.NALU_TYPE_TRAIL_R_: {\n hvcSample = true;\n push = true;\n break;\n }\n case H265.NALU_TYPE_IDR_W_RADL_:\n case H265.NALU_TYPE_IDR_N_LP_:\n case H265.NALU_TYPE_CRA_NUT_:\n hvcSample = true;\n push = true;\n isKeyframe = true;\n break;\n case H265.NALU_TYPE_VPS_:\n push = true;\n break;\n case H265.NALU_TYPE_SPS_:\n push = true;\n break;\n case H265.NALU_TYPE_PPS_:\n push = true;\n break;\n case H265.NALU_TYPE_AUD_:\n push = true;\n hvcSample = true;\n break;\n case H265.NALU_TYPE_SEI_PREFIX_:\n case H265.NALU_TYPE_SEI_SUFFIX_:\n push = true;\n break;\n default:\n push = false;\n break;\n }\n if (hvcSample && push) {\n const size = nalu.fullData.byteLength;\n const naluLength = new Uint8Array(4);\n naluLength[0] = (size >> 24) & 0xff;\n naluLength[1] = (size >> 16) & 0xff;\n naluLength[2] = (size >> 8) & 0xff;\n naluLength[3] = size & 0xff;\n nalusData.push(naluLength);\n nalusData.push(nalu.fullData);\n }\n }\n if (!nalusData.length) {\n return null;\n }\n const data = shaka.util.Uint8ArrayUtils.concat(...nalusData);\n return {\n data,\n isKeyframe,\n };\n }\n};\n\n\n/**\n * NALU type for non-reference trailing picture for H.265.\n * @const {number}\n * @private\n */\nshaka.transmuxer.H265.NALU_TYPE_TRAIL_N_ = 0x01;\n\n\n/**\n * NALU type for reference trailing picture for H.265.\n * @const {number}\n * @private\n */\nshaka.transmuxer.H265.NALU_TYPE_TRAIL_R_ = 0x00;\n\n\n/**\n * NALU type for Instantaneous Decoder Refresh (IDR) for H.265.\n * @const {number}\n * @private\n */\nshaka.transmuxer.H265.NALU_TYPE_IDR_W_RADL_ = 0x13;\n\n\n/**\n * NALU type for Instantaneous Decoder Refresh (IDR) for H.265.\n * @const {number}\n * @private\n */\nshaka.transmuxer.H265.NALU_TYPE_IDR_N_LP_ = 0x14;\n\n/**\n * NALU type for Clean Random Access (CRA) for H.265.\n * @const {number}\n * @private\n */\nshaka.transmuxer.H265.NALU_TYPE_CRA_NUT_ = 0x15;\n\n\n/**\n * NALU type for Video Parameter Set (VPS) for H.265.\n * @const {number}\n * @private\n */\nshaka.transmuxer.H265.NALU_TYPE_VPS_ = 0x20;\n\n\n/**\n * NALU type for Sequence Parameter Set (SPS) for H.265.\n * @const {number}\n * @private\n */\nshaka.transmuxer.H265.NALU_TYPE_SPS_ = 0x21;\n\n\n/**\n * NALU type for Picture Parameter Set (PPS) for H.265.\n * @const {number}\n * @private\n */\nshaka.transmuxer.H265.NALU_TYPE_PPS_ = 0x22;\n\n\n/**\n * NALU type for Access Unit Delimiter (AUD) for H.265.\n * @const {number}\n * @private\n */\nshaka.transmuxer.H265.NALU_TYPE_AUD_ = 0x23;\n\n\n/**\n * NALU type for Supplemental Enhancement Information (SEI) for H.265.\n * @const {number}\n * @private\n */\nshaka.transmuxer.H265.NALU_TYPE_SEI_PREFIX_ = 0x27;\n\n\n/**\n * NALU type for Supplemental Enhancement Information (SEI) for H.265.\n * @const {number}\n * @private\n */\nshaka.transmuxer.H265.NALU_TYPE_SEI_SUFFIX_ = 0x28;\n\n\n/**\n * @typedef {{\n * numTemporalLayers: number,\n * temporalIdNested: boolean\n * }}\n *\n * @property {number} numTemporalLayers\n * @property {boolean} temporalIdNested\n */\nshaka.transmuxer.H265.VPSConfiguration;\n\n\n/**\n * @typedef {{\n * generalProfileSpace: number,\n * generalTierFlag: number,\n * generalLevelIdc: number,\n * generalProfileIdc: number,\n * generalProfileCompatibilityFlags1: number,\n * generalProfileCompatibilityFlags2: number,\n * generalProfileCompatibilityFlags3: number,\n * generalProfileCompatibilityFlags4: number,\n * generalConstraintIndicatorFlags1: number,\n * generalConstraintIndicatorFlags2: number,\n * generalConstraintIndicatorFlags3: number,\n * generalConstraintIndicatorFlags4: number,\n * generalConstraintIndicatorFlags5: number,\n * generalConstraintIndicatorFlags6: number,\n * constantFrameRate: number,\n * minSpatialSegmentationIdc: number,\n * chromaFormatIdc: number,\n * bitDepthLumaMinus8: number,\n * bitDepthChromaMinus8: number,\n * width: number,\n * height: number,\n * sarWidth: number,\n * sarHeight: number\n * }}\n *\n * @property {number} generalProfileSpace\n * @property {number} generalTierFlag\n * @property {number} generalLevelIdc\n * @property {number} generalProfileIdc\n * @property {number} generalProfileCompatibilityFlags1\n * @property {number} generalProfileCompatibilityFlags2\n * @property {number} generalProfileCompatibilityFlags3\n * @property {number} generalProfileCompatibilityFlags4\n * @property {number} generalConstraintIndicatorFlags1\n * @property {number} generalConstraintIndicatorFlags2\n * @property {number} generalConstraintIndicatorFlags3\n * @property {number} generalConstraintIndicatorFlags4\n * @property {number} generalConstraintIndicatorFlags5\n * @property {number} generalConstraintIndicatorFlags6\n * @property {number} constantFrameRate\n * @property {number} minSpatialSegmentationIdc\n * @property {number} chromaFormatIdc\n * @property {number} bitDepthLumaMinus8\n * @property {number} bitDepthChromaMinus8\n * @property {number} width\n * @property {number} height\n * @property {number} sarWidth\n * @property {number} sarHeight\n */\nshaka.transmuxer.H265.SPSConfiguration;\n\n\n/**\n * @typedef {{\n * parallelismType: number\n * }}\n *\n * @property {number} parallelismType\n */\nshaka.transmuxer.H265.PPSConfiguration;\n\n\n/**\n * @typedef {{\n * numTemporalLayers: number,\n * temporalIdNested: boolean,\n * generalProfileSpace: number,\n * generalTierFlag: number,\n * generalLevelIdc: number,\n * generalProfileIdc: number,\n * generalProfileCompatibilityFlags1: number,\n * generalProfileCompatibilityFlags2: number,\n * generalProfileCompatibilityFlags3: number,\n * generalProfileCompatibilityFlags4: number,\n * generalConstraintIndicatorFlags1: number,\n * generalConstraintIndicatorFlags2: number,\n * generalConstraintIndicatorFlags3: number,\n * generalConstraintIndicatorFlags4: number,\n * generalConstraintIndicatorFlags5: number,\n * generalConstraintIndicatorFlags6: number,\n * constantFrameRate: number,\n * minSpatialSegmentationIdc: number,\n * chromaFormatIdc: number,\n * bitDepthLumaMinus8: number,\n * bitDepthChromaMinus8: number,\n * parallelismType: number\n * }}\n *\n * @property {number} numTemporalLayers\n * @property {boolean} temporalIdNested\n * @property {number} generalProfileSpace\n * @property {number} generalTierFlag\n * @property {number} generalLevelIdc\n * @property {number} generalProfileIdc\n * @property {number} generalProfileCompatibilityFlags1\n * @property {number} generalProfileCompatibilityFlags2\n * @property {number} generalProfileCompatibilityFlags3\n * @property {number} generalProfileCompatibilityFlags4\n * @property {number} generalConstraintIndicatorFlags1\n * @property {number} generalConstraintIndicatorFlags2\n * @property {number} generalConstraintIndicatorFlags3\n * @property {number} generalConstraintIndicatorFlags4\n * @property {number} generalConstraintIndicatorFlags5\n * @property {number} generalConstraintIndicatorFlags6\n * @property {number} constantFrameRate\n * @property {number} minSpatialSegmentationIdc\n * @property {number} chromaFormatIdc\n * @property {number} bitDepthLumaMinus8\n * @property {number} bitDepthChromaMinus8\n * @property {number} parallelismType\n */\nshaka.transmuxer.H265.DecoderConfigurationRecordType;\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.transmuxer.MpegAudio');\n\n\n/**\n * MPEG parser utils\n *\n * @see https://en.wikipedia.org/wiki/MP3\n */\nshaka.transmuxer.MpegAudio = class {\n /**\n * @param {!Uint8Array} data\n * @param {!number} offset\n * @return {?{sampleRate: number, channelCount: number,\n * frameLength: number, samplesPerFrame: number}}\n */\n static parseHeader(data, offset) {\n const MpegAudio = shaka.transmuxer.MpegAudio;\n\n const mpegVersion = (data[offset + 1] >> 3) & 3;\n const mpegLayer = (data[offset + 1] >> 1) & 3;\n const bitRateIndex = (data[offset + 2] >> 4) & 15;\n const sampleRateIndex = (data[offset + 2] >> 2) & 3;\n if (mpegVersion !== 1 && bitRateIndex !== 0 &&\n bitRateIndex !== 15 && sampleRateIndex !== 3) {\n const paddingBit = (data[offset + 2] >> 1) & 1;\n const channelMode = data[offset + 3] >> 6;\n let columnInBitrates = 0;\n if (mpegVersion === 3) {\n columnInBitrates = 3 - mpegLayer;\n } else {\n columnInBitrates = mpegLayer === 3 ? 3 : 4;\n }\n const bitRate = MpegAudio.BITRATES_MAP_[\n columnInBitrates * 14 + bitRateIndex - 1] * 1000;\n const columnInSampleRates =\n mpegVersion === 3 ? 0 : mpegVersion === 2 ? 1 : 2;\n const sampleRate = MpegAudio.SAMPLING_RATE_MAP_[\n columnInSampleRates * 3 + sampleRateIndex];\n // If bits of channel mode are `11` then it is a single channel (Mono)\n const channelCount = channelMode === 3 ? 1 : 2;\n const sampleCoefficient =\n MpegAudio.SAMPLES_COEFFICIENTS_[mpegVersion][mpegLayer];\n const bytesInSlot = MpegAudio.BYTES_IN_SLOT_[mpegLayer];\n const samplesPerFrame = sampleCoefficient * 8 * bytesInSlot;\n const frameLength =\n Math.floor((sampleCoefficient * bitRate) / sampleRate + paddingBit) *\n bytesInSlot;\n\n const userAgent = navigator.userAgent || '';\n // This affect to Tizen also for example.\n const result = userAgent.match(/Chrome\\/(\\d+)/i);\n const chromeVersion = result ? parseInt(result[1], 10) : 0;\n const needChromeFix = !!chromeVersion && chromeVersion <= 87;\n\n if (needChromeFix && mpegLayer === 2 &&\n bitRate >= 224000 && channelMode === 0) {\n // Work around bug in Chromium by setting channelMode\n // to dual-channel (01) instead of stereo (00)\n data[offset + 3] = data[offset + 3] | 0x80;\n }\n\n return {sampleRate, channelCount, frameLength, samplesPerFrame};\n }\n return null;\n }\n\n /**\n * @param {!Uint8Array} data\n * @param {!number} offset\n * @return {boolean}\n */\n static isHeaderPattern(data, offset) {\n return (\n data[offset] === 0xff &&\n (data[offset + 1] & 0xe0) === 0xe0 &&\n (data[offset + 1] & 0x06) !== 0x00\n );\n }\n\n /**\n * @param {!Uint8Array} data\n * @param {!number} offset\n * @return {boolean}\n */\n static isHeader(data, offset) {\n // Look for MPEG header | 1111 1111 | 111X XYZX | where X can be either\n // 0 or 1 and Y or Z should be 1\n // Layer bits (position 14 and 15) in header should be always different\n // from 0 (Layer I or Layer II or Layer III)\n // More info http://www.mp3-tech.org/programmer/frame_header.html\n return offset + 1 < data.length &&\n shaka.transmuxer.MpegAudio.isHeaderPattern(data, offset);\n }\n\n /**\n * @param {!Uint8Array} data\n * @param {!number} offset\n * @return {boolean}\n */\n static probe(data, offset) {\n const MpegAudio = shaka.transmuxer.MpegAudio;\n // same as isHeader but we also check that MPEG frame follows last\n // MPEG frame or end of data is reached\n if (offset + 1 < data.length &&\n MpegAudio.isHeaderPattern(data, offset)) {\n // MPEG header Length\n const headerLength = 4;\n // MPEG frame Length\n const header = MpegAudio.parseHeader(data, offset);\n let frameLength = headerLength;\n if (header && header.frameLength) {\n frameLength = header.frameLength;\n }\n\n const newOffset = offset + frameLength;\n return newOffset === data.length ||\n MpegAudio.isHeader(data, newOffset);\n }\n return false;\n }\n};\n\n\n/**\n * @private {!Array<number>}\n */\nshaka.transmuxer.MpegAudio.BITRATES_MAP_ = [\n 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 32, 48, 56,\n 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 32, 40, 48, 56, 64, 80,\n 96, 112, 128, 160, 192, 224, 256, 320, 32, 48, 56, 64, 80, 96, 112, 128, 144,\n 160, 176, 192, 224, 256, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144,\n 160,\n];\n\n/**\n * @private {!Array<number>}\n */\nshaka.transmuxer.MpegAudio.SAMPLING_RATE_MAP_ = [\n 44100, 48000, 32000, 22050, 24000, 16000, 11025, 12000, 8000,\n];\n\n/**\n * @private {!Array<!Array<number>>}\n */\nshaka.transmuxer.MpegAudio.SAMPLES_COEFFICIENTS_ = [\n // MPEG 2.5\n [\n 0, // Reserved\n 72, // Layer3\n 144, // Layer2\n 12, // Layer1\n ],\n // Reserved\n [\n 0, // Reserved\n 0, // Layer3\n 0, // Layer2\n 0, // Layer1\n ],\n // MPEG 2\n [\n 0, // Reserved\n 72, // Layer3\n 144, // Layer2\n 12, // Layer1\n ],\n // MPEG 1\n [\n 0, // Reserved\n 144, // Layer3\n 144, // Layer2\n 12, // Layer1\n ],\n];\n\n\n/**\n * @private {!Array<number>}\n */\nshaka.transmuxer.MpegAudio.BYTES_IN_SLOT_ = [\n 0, // Reserved\n 1, // Layer3\n 1, // Layer2\n 4, // Layer1\n];\n\n/**\n * @const {number}\n */\nshaka.transmuxer.MpegAudio.MPEG_AUDIO_SAMPLE_PER_FRAME = 1152;\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.transmuxer.Mp3Transmuxer');\n\ngoog.require('shaka.media.Capabilities');\ngoog.require('shaka.transmuxer.Mp4Generator');\ngoog.require('shaka.transmuxer.MpegAudio');\ngoog.require('shaka.transmuxer.TransmuxerEngine');\ngoog.require('shaka.util.BufferUtils');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.Id3Utils');\ngoog.require('shaka.util.ManifestParserUtils');\ngoog.require('shaka.util.Uint8ArrayUtils');\n\n\n/**\n * @implements {shaka.extern.Transmuxer}\n * @export\n */\nshaka.transmuxer.Mp3Transmuxer = class {\n /**\n * @param {string} mimeType\n */\n constructor(mimeType) {\n /** @private {string} */\n this.originalMimeType_ = mimeType;\n\n /** @private {number} */\n this.frameIndex_ = 0;\n\n /** @private {!Map<string, !Uint8Array>} */\n this.initSegments = new Map();\n\n /** @private {?Uint8Array} */\n this.lastInitSegment_ = null;\n }\n\n\n /**\n * @override\n * @export\n */\n destroy() {\n this.initSegments.clear();\n }\n\n\n /**\n * Check if the mime type and the content type is supported.\n * @param {string} mimeType\n * @param {string=} contentType\n * @return {boolean}\n * @override\n * @export\n */\n isSupported(mimeType, contentType) {\n const Capabilities = shaka.media.Capabilities;\n\n if (!this.isMpegContainer_(mimeType)) {\n return false;\n }\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n return Capabilities.isTypeSupported(\n this.convertCodecs(ContentType.AUDIO, mimeType));\n }\n\n\n /**\n * Check if the mimetype is 'audio/mpeg'.\n * @param {string} mimeType\n * @return {boolean}\n * @private\n */\n isMpegContainer_(mimeType) {\n return mimeType.toLowerCase().split(';')[0] == 'audio/mpeg';\n }\n\n\n /**\n * @override\n * @export\n */\n convertCodecs(contentType, mimeType) {\n if (this.isMpegContainer_(mimeType)) {\n return 'audio/mp4; codecs=\"mp3\"';\n }\n return mimeType;\n }\n\n\n /**\n * @override\n * @export\n */\n getOriginalMimeType() {\n return this.originalMimeType_;\n }\n\n\n /**\n * @override\n * @export\n */\n transmux(data, stream, reference, duration) {\n const MpegAudio = shaka.transmuxer.MpegAudio;\n const Uint8ArrayUtils = shaka.util.Uint8ArrayUtils;\n\n const uint8ArrayData = shaka.util.BufferUtils.toUint8(data);\n\n const id3Data = shaka.util.Id3Utils.getID3Data(uint8ArrayData);\n let offset = id3Data.length;\n for (; offset < uint8ArrayData.length; offset++) {\n if (MpegAudio.probe(uint8ArrayData, offset)) {\n break;\n }\n }\n\n const timescale = 90000;\n let firstHeader;\n\n /** @type {!Array<shaka.transmuxer.Mp4Generator.Mp4Sample>} */\n const samples = [];\n\n while (offset < uint8ArrayData.length) {\n const header = MpegAudio.parseHeader(uint8ArrayData, offset);\n if (!header) {\n return Promise.reject(new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.TRANSMUXING_FAILED,\n reference ? reference.getUris()[0] : null));\n }\n if (!firstHeader) {\n firstHeader = header;\n }\n if (offset + header.frameLength <= uint8ArrayData.length) {\n samples.push({\n data: uint8ArrayData.subarray(offset, offset + header.frameLength),\n size: header.frameLength,\n duration: MpegAudio.MPEG_AUDIO_SAMPLE_PER_FRAME,\n cts: 0,\n flags: {\n isLeading: 0,\n isDependedOn: 0,\n hasRedundancy: 0,\n degradPrio: 0,\n dependsOn: 2,\n isNonSync: 0,\n },\n });\n }\n offset += header.frameLength;\n }\n if (!firstHeader) {\n return Promise.reject(new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.TRANSMUXING_FAILED,\n reference ? reference.getUris()[0] : null));\n }\n /** @type {number} */\n const sampleRate = firstHeader.sampleRate;\n /** @type {number} */\n const frameDuration =\n firstHeader.samplesPerFrame * timescale / firstHeader.sampleRate;\n /** @type {number} */\n const baseMediaDecodeTime = this.frameIndex_ * frameDuration;\n\n /** @type {shaka.transmuxer.Mp4Generator.StreamInfo} */\n const streamInfo = {\n id: stream.id,\n type: shaka.util.ManifestParserUtils.ContentType.AUDIO,\n codecs: 'mp3',\n encrypted: stream.encrypted && stream.drmInfos.length > 0,\n timescale: sampleRate,\n duration: duration,\n videoNalus: [],\n audioConfig: new Uint8Array([]),\n videoConfig: new Uint8Array([]),\n hSpacing: 0,\n vSpacing: 0,\n data: {\n sequenceNumber: this.frameIndex_,\n baseMediaDecodeTime: baseMediaDecodeTime,\n samples: samples,\n },\n stream: stream,\n };\n const mp4Generator = new shaka.transmuxer.Mp4Generator([streamInfo]);\n let initSegment;\n const initSegmentKey = stream.id + '_' + reference.discontinuitySequence;\n if (!this.initSegments.has(initSegmentKey)) {\n initSegment = mp4Generator.initSegment();\n this.initSegments.set(initSegmentKey, initSegment);\n } else {\n initSegment = this.initSegments.get(initSegmentKey);\n }\n const appendInitSegment = this.lastInitSegment_ !== initSegment;\n const segmentData = mp4Generator.segmentData();\n this.lastInitSegment_ = initSegment;\n this.frameIndex_++;\n if (appendInitSegment) {\n const transmuxData = Uint8ArrayUtils.concat(initSegment, segmentData);\n return Promise.resolve(transmuxData);\n } else {\n return Promise.resolve(segmentData);\n }\n }\n};\n\nshaka.transmuxer.TransmuxerEngine.registerTransmuxer(\n 'audio/mpeg',\n () => new shaka.transmuxer.Mp3Transmuxer('audio/mpeg'),\n shaka.transmuxer.TransmuxerEngine.PluginPriority.FALLBACK);\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.transmuxer.MpegTsTransmuxer');\n\ngoog.require('shaka.media.Capabilities');\ngoog.require('shaka.transmuxer.MpegAudio');\ngoog.require('shaka.transmuxer.TransmuxerEngine');\ngoog.require('shaka.util.BufferUtils');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.ManifestParserUtils');\ngoog.require('shaka.util.MimeUtils');\ngoog.require('shaka.util.TsParser');\ngoog.require('shaka.util.Uint8ArrayUtils');\n\n/**\n * @fileoverview\n *\n * This transmuxer takes an audio-only TS with MP3, and converts it to\n * raw MP3(audio/mpeg). We don't do it in ts_transmuxer.js because the\n * output of it is always MP4. This transmuxer is necessary because the only\n * browser that supports MP3 in MP4 is Firefox(audio/mp4; codecs=\"mp3\"),\n * other browsers don't support it.\n */\n\n/**\n * @implements {shaka.extern.Transmuxer}\n * @export\n */\nshaka.transmuxer.MpegTsTransmuxer = class {\n /**\n * @param {string} mimeType\n */\n constructor(mimeType) {\n /** @private {string} */\n this.originalMimeType_ = mimeType;\n\n /** @private {?shaka.util.TsParser} */\n this.tsParser_ = null;\n }\n\n\n /**\n * @override\n * @export\n */\n destroy() {\n // Nothing\n }\n\n\n /**\n * Check if the mime type and the content type is supported.\n * @param {string} mimeType\n * @param {string=} contentType\n * @return {boolean}\n * @override\n * @export\n */\n isSupported(mimeType, contentType) {\n const Capabilities = shaka.media.Capabilities;\n\n if (!this.isTsContainer_(mimeType)) {\n return false;\n }\n\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n const MimeUtils = shaka.util.MimeUtils;\n\n const codecs = MimeUtils.getCodecs(mimeType);\n const allCodecs = MimeUtils.splitCodecs(codecs);\n\n const audioCodec = shaka.util.ManifestParserUtils.guessCodecsSafe(\n ContentType.AUDIO, allCodecs);\n const videoCodec = shaka.util.ManifestParserUtils.guessCodecsSafe(\n ContentType.VIDEO, allCodecs);\n\n if (!audioCodec || videoCodec) {\n return false;\n }\n const normalizedCodec = MimeUtils.getNormalizedCodec(audioCodec);\n\n if (normalizedCodec != 'mp3') {\n return false;\n }\n\n return Capabilities.isTypeSupported(\n this.convertCodecs(ContentType.AUDIO, mimeType));\n }\n\n\n /**\n * Check if the mimetype is 'video/mp2t'.\n * @param {string} mimeType\n * @return {boolean}\n * @private\n */\n isTsContainer_(mimeType) {\n return mimeType.toLowerCase().split(';')[0] == 'video/mp2t';\n }\n\n\n /**\n * @override\n * @export\n */\n convertCodecs(contentType, mimeType) {\n if (this.isTsContainer_(mimeType)) {\n return 'audio/mpeg';\n }\n return mimeType;\n }\n\n\n /**\n * @override\n * @export\n */\n getOriginalMimeType() {\n return this.originalMimeType_;\n }\n\n\n /**\n * @override\n * @export\n */\n transmux(data, stream, reference, duration, contentType) {\n const MpegAudio = shaka.transmuxer.MpegAudio;\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n const Uint8ArrayUtils = shaka.util.Uint8ArrayUtils;\n\n if (!this.tsParser_) {\n this.tsParser_ = new shaka.util.TsParser();\n } else {\n this.tsParser_.clearData();\n }\n\n const uint8ArrayData = shaka.util.BufferUtils.toUint8(data);\n\n const tsParser = this.tsParser_.parse(uint8ArrayData);\n const codecs = tsParser.getCodecs();\n if (codecs.audio != 'mp3' || contentType != ContentType.AUDIO) {\n return Promise.reject(new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.TRANSMUXING_FAILED,\n reference ? reference.getUris()[0] : null));\n }\n\n let transmuxData = new Uint8Array([]);\n\n for (const audioData of tsParser.getAudioData()) {\n const data = audioData.data;\n if (!data) {\n continue;\n }\n let offset = 0;\n while (offset < data.length) {\n const header = MpegAudio.parseHeader(data, offset);\n if (!header) {\n offset++;\n continue;\n }\n if (offset + header.frameLength <= data.length) {\n transmuxData = Uint8ArrayUtils.concat(transmuxData,\n data.subarray(offset, offset + header.frameLength));\n }\n offset += header.frameLength;\n }\n }\n\n return Promise.resolve(transmuxData);\n }\n};\n\n\nshaka.transmuxer.TransmuxerEngine.registerTransmuxer(\n 'video/mp2t',\n () => new shaka.transmuxer.MpegTsTransmuxer('video/mp2t'),\n shaka.transmuxer.TransmuxerEngine.PluginPriority.PREFERRED_SECONDARY);\n","/*! @license\n * MSS Transmuxer\n * Copyright 2015 Dash Industry Forum\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/*\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n * - Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation\n * and/or other materials provided with the distribution.\n * - Neither the name of the Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this\n * software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS”\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n// cspell:words crypted usertype\n\ngoog.provide('shaka.transmuxer.MssTransmuxer');\n\ngoog.require('shaka.media.Capabilities');\ngoog.require('shaka.transmuxer.TransmuxerEngine');\ngoog.require('shaka.util.BufferUtils');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.ManifestParserUtils');\ngoog.require('shaka.dependencies');\n\ngoog.requireType('shaka.media.SegmentReference');\n\n\n/**\n * @implements {shaka.extern.Transmuxer}\n * @export\n */\nshaka.transmuxer.MssTransmuxer = class {\n /**\n * @param {string} mimeType\n */\n constructor(mimeType) {\n /** @private {string} */\n this.originalMimeType_ = mimeType;\n\n /** @private {?ISOBoxer} */\n this.isoBoxer_ = shaka.dependencies.isoBoxer();\n\n if (this.isoBoxer_) {\n this.addSpecificBoxProcessor_();\n }\n }\n\n /**\n * Add specific box processor for codem-isoboxer\n *\n * @private\n */\n addSpecificBoxProcessor_() {\n // eslint-disable-next-line no-restricted-syntax\n this.isoBoxer_.addBoxProcessor('saio', function() {\n // eslint-disable-next-line no-invalid-this\n const box = /** @type {!ISOBox} */(this);\n box._procFullBox();\n if (box.flags & 1) {\n box._procField('aux_info_type', 'uint', 32);\n box._procField('aux_info_type_parameter', 'uint', 32);\n }\n box._procField('entry_count', 'uint', 32);\n box._procFieldArray('offset', box.entry_count, 'uint',\n (box.version === 1) ? 64 : 32);\n });\n // eslint-disable-next-line no-restricted-syntax\n this.isoBoxer_.addBoxProcessor('saiz', function() {\n // eslint-disable-next-line no-invalid-this\n const box = /** @type {!ISOBox} */(this);\n box._procFullBox();\n if (box.flags & 1) {\n box._procField('aux_info_type', 'uint', 32);\n box._procField('aux_info_type_parameter', 'uint', 32);\n }\n box._procField('default_sample_info_size', 'uint', 8);\n box._procField('sample_count', 'uint', 32);\n if (box.default_sample_info_size === 0) {\n box._procFieldArray('sample_info_size',\n box.sample_count, 'uint', 8);\n }\n });\n // eslint-disable-next-line no-restricted-syntax\n const sencProcessor = function() {\n // eslint-disable-next-line no-invalid-this\n const box = /** @type {!ISOBox} */(this);\n box._procFullBox();\n if (box.flags & 1) {\n box._procField('AlgorithmID', 'uint', 24);\n box._procField('IV_size', 'uint', 8);\n box._procFieldArray('KID', 16, 'uint', 8);\n }\n box._procField('sample_count', 'uint', 32);\n // eslint-disable-next-line no-restricted-syntax\n box._procEntries('entry', box.sample_count, function(entry) {\n // eslint-disable-next-line no-invalid-this\n const boxEntry = /** @type {!ISOBox} */(this);\n boxEntry._procEntryField(entry, 'InitializationVector', 'data', 8);\n if (boxEntry.flags & 2) {\n boxEntry._procEntryField(entry, 'NumberOfEntries', 'uint', 16);\n boxEntry._procSubEntries(entry, 'clearAndCryptedData',\n // eslint-disable-next-line no-restricted-syntax\n entry.NumberOfEntries, function(clearAndCryptedData) {\n // eslint-disable-next-line no-invalid-this\n const subBoxEntry = /** @type {!ISOBox} */(this);\n subBoxEntry._procEntryField(clearAndCryptedData,\n 'BytesOfClearData', 'uint', 16);\n subBoxEntry._procEntryField(clearAndCryptedData,\n 'BytesOfEncryptedData', 'uint', 32);\n });\n }\n });\n };\n this.isoBoxer_.addBoxProcessor('senc', sencProcessor);\n // eslint-disable-next-line no-restricted-syntax\n this.isoBoxer_.addBoxProcessor('uuid', function() {\n const MssTransmuxer = shaka.transmuxer.MssTransmuxer;\n // eslint-disable-next-line no-invalid-this\n const box = /** @type {!ISOBox} */(this);\n let isSENC = true;\n for (let i = 0; i < 16; i++) {\n if (box.usertype[i] !== MssTransmuxer.UUID_SENC_[i]) {\n isSENC = false;\n }\n // Add support for other user types here\n }\n\n if (isSENC) {\n if (box._parsing) {\n // Convert this box to sepiff for later processing.\n // See processMediaSegment_ function.\n box.type = 'sepiff';\n }\n // eslint-disable-next-line no-restricted-syntax, no-invalid-this\n sencProcessor.call(/** @type {!ISOBox} */(this));\n }\n });\n }\n\n\n /**\n * @override\n * @export\n */\n destroy() {\n // Nothing\n }\n\n\n /**\n * Check if the mime type and the content type is supported.\n * @param {string} mimeType\n * @param {string=} contentType\n * @return {boolean}\n * @override\n * @export\n */\n isSupported(mimeType, contentType) {\n const Capabilities = shaka.media.Capabilities;\n\n const isMss = mimeType.startsWith('mss/');\n\n if (!this.isoBoxer_ || !isMss) {\n return false;\n }\n\n if (contentType) {\n return Capabilities.isTypeSupported(\n this.convertCodecs(contentType, mimeType));\n }\n\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n\n const audioMime = this.convertCodecs(ContentType.AUDIO, mimeType);\n const videoMime = this.convertCodecs(ContentType.VIDEO, mimeType);\n return Capabilities.isTypeSupported(audioMime) ||\n Capabilities.isTypeSupported(videoMime);\n }\n\n\n /**\n * @override\n * @export\n */\n convertCodecs(contentType, mimeType) {\n return mimeType.replace('mss/', '');\n }\n\n\n /**\n * @override\n * @export\n */\n getOriginalMimeType() {\n return this.originalMimeType_;\n }\n\n\n /**\n * @override\n * @export\n */\n transmux(data, stream, reference) {\n if (!reference) {\n // Init segment doesn't need transmux\n return Promise.resolve(shaka.util.BufferUtils.toUint8(data));\n }\n if (!stream.mssPrivateData) {\n return Promise.reject(new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.MSS_MISSING_DATA_FOR_TRANSMUXING,\n reference ? reference.getUris()[0] : null));\n }\n try {\n const transmuxedData = this.processMediaSegment_(\n data, stream, reference);\n return Promise.resolve(transmuxedData);\n } catch (exception) {\n if (exception instanceof shaka.util.Error) {\n return Promise.reject(exception);\n }\n return Promise.reject(new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.MSS_TRANSMUXING_FAILED,\n reference ? reference.getUris()[0] : null));\n }\n }\n\n /**\n * Process a media segment from a data and stream.\n * @param {BufferSource} data\n * @param {shaka.extern.Stream} stream\n * @param {shaka.media.SegmentReference} reference\n * @return {!Uint8Array}\n * @private\n */\n processMediaSegment_(data, stream, reference) {\n let i;\n /** @type {!ISOFile} */\n const isoFile = this.isoBoxer_.parseBuffer(data);\n // Update track_Id in tfhd box\n const tfhd = isoFile.fetch('tfhd');\n tfhd.track_ID = stream.id + 1;\n // Add tfdt box\n let tfdt = isoFile.fetch('tfdt');\n const traf = isoFile.fetch('traf');\n if (tfdt === null) {\n tfdt = this.isoBoxer_.createFullBox('tfdt', traf, tfhd);\n tfdt.version = 1;\n tfdt.flags = 0;\n const timescale = stream.mssPrivateData.timescale;\n const startTime = reference.startTime;\n tfdt.baseMediaDecodeTime = Math.floor(startTime * timescale);\n }\n const trun = isoFile.fetch('trun');\n // Process tfxd boxes\n // This box provide absolute timestamp but we take the segment start\n // time for tfdt\n let tfxd = isoFile.fetch('tfxd');\n if (tfxd) {\n tfxd._parent.boxes.splice(tfxd._parent.boxes.indexOf(tfxd), 1);\n tfxd = null;\n }\n let tfrf = isoFile.fetch('tfrf');\n if (tfrf) {\n tfrf._parent.boxes.splice(tfrf._parent.boxes.indexOf(tfrf), 1);\n tfrf = null;\n }\n\n // If protected content in PIFF1.1 format\n // (sepiff box = Sample Encryption PIFF)\n // => convert sepiff box it into a senc box\n // => create saio and saiz boxes (if not already present)\n const sepiff = isoFile.fetch('sepiff');\n if (sepiff !== null) {\n sepiff.type = 'senc';\n sepiff.usertype = undefined;\n\n let saio = isoFile.fetch('saio');\n if (saio === null) {\n // Create Sample Auxiliary Information Offsets Box box (saio)\n saio = this.isoBoxer_.createFullBox('saio', traf);\n saio.version = 0;\n saio.flags = 0;\n saio.entry_count = 1;\n saio.offset = [0];\n const saiz = this.isoBoxer_.createFullBox('saiz', traf);\n saiz.version = 0;\n saiz.flags = 0;\n saiz.sample_count = sepiff.sample_count;\n saiz.default_sample_info_size = 0;\n saiz.sample_info_size = [];\n if (sepiff.flags & 0x02) {\n // Sub-sample encryption => set sample_info_size for each sample\n for (i = 0; i < sepiff.sample_count; i += 1) {\n // 10 = 8 (InitializationVector field size) + 2\n // (subsample_count field size)\n // 6 = 2 (BytesOfClearData field size) + 4\n // (BytesOfEncryptedData field size)\n const entry = /** @type {!ISOEntry} */ (sepiff.entry[i]);\n saiz.sample_info_size[i] = 10 + (6 * entry.NumberOfEntries);\n }\n } else {\n // No sub-sample encryption => set default\n // sample_info_size = InitializationVector field size (8)\n saiz.default_sample_info_size = 8;\n }\n }\n }\n\n // set tfhd.base-data-offset-present to false\n tfhd.flags &= 0xFFFFFE;\n // set tfhd.default-base-is-moof to true\n tfhd.flags |= 0x020000;\n // set trun.data-offset-present to true\n trun.flags |= 0x000001;\n\n // Update trun.data_offset field that corresponds to first data byte\n // (inside mdat box)\n const moof = isoFile.fetch('moof');\n const length = moof.getLength();\n trun.data_offset = length + 8;\n\n // Update saio box offset field according to new senc box offset\n const saio = isoFile.fetch('saio');\n if (saio !== null) {\n const trafPosInMoof = this.getBoxOffset_(moof, 'traf');\n const sencPosInTraf = this.getBoxOffset_(traf, 'senc');\n // Set offset from begin fragment to the first IV field in senc box\n // 16 = box header (12) + sample_count field size (4)\n saio.offset[0] = trafPosInMoof + sencPosInTraf + 16;\n }\n\n return shaka.util.BufferUtils.toUint8(isoFile.write());\n }\n\n /**\n * This function returns the offset of the 1st byte of a child box within\n * a container box.\n *\n * @param {ISOBox} parent\n * @param {string} type\n * @return {number}\n * @private\n */\n getBoxOffset_(parent, type) {\n let offset = 8;\n for (let i = 0; i < parent.boxes.length; i++) {\n if (parent.boxes[i].type === type) {\n return offset;\n }\n offset += parent.boxes[i].size;\n }\n return offset;\n }\n};\n\n/**\n * @private {!Uint8Array}\n */\nshaka.transmuxer.MssTransmuxer.UUID_SENC_ = new Uint8Array([\n 0xA2, 0x39, 0x4F, 0x52, 0x5A, 0x9B, 0x4F, 0x14,\n 0xA2, 0x44, 0x6C, 0x42, 0x7C, 0x64, 0x8D, 0xF4,\n]);\n\nshaka.transmuxer.TransmuxerEngine.registerTransmuxer(\n 'mss/audio/mp4',\n () => new shaka.transmuxer.MssTransmuxer('mss/audio/mp4'),\n shaka.transmuxer.TransmuxerEngine.PluginPriority.FALLBACK);\nshaka.transmuxer.TransmuxerEngine.registerTransmuxer(\n 'mss/video/mp4',\n () => new shaka.transmuxer.MssTransmuxer('mss/video/mp4'),\n shaka.transmuxer.TransmuxerEngine.PluginPriority.FALLBACK);\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.transmuxer.TsTransmuxer');\n\ngoog.require('shaka.media.Capabilities');\ngoog.require('shaka.transmuxer.AacTransmuxer');\ngoog.require('shaka.transmuxer.Ac3');\ngoog.require('shaka.transmuxer.ADTS');\ngoog.require('shaka.transmuxer.Ec3');\ngoog.require('shaka.transmuxer.H264');\ngoog.require('shaka.transmuxer.H265');\ngoog.require('shaka.transmuxer.Mp4Generator');\ngoog.require('shaka.transmuxer.MpegAudio');\ngoog.require('shaka.transmuxer.Opus');\ngoog.require('shaka.transmuxer.TransmuxerEngine');\ngoog.require('shaka.util.BufferUtils');\ngoog.require('shaka.util.Error');\ngoog.require('shaka.util.Id3Utils');\ngoog.require('shaka.util.ManifestParserUtils');\ngoog.require('shaka.util.MimeUtils');\ngoog.require('shaka.util.StreamUtils');\ngoog.require('shaka.util.TsParser');\ngoog.require('shaka.util.Uint8ArrayUtils');\n\ngoog.requireType('shaka.media.SegmentReference');\n\n\n/**\n * @implements {shaka.extern.Transmuxer}\n * @export\n */\nshaka.transmuxer.TsTransmuxer = class {\n /**\n * @param {string} mimeType\n */\n constructor(mimeType) {\n /** @private {string} */\n this.originalMimeType_ = mimeType;\n\n /** @private {number} */\n this.frameIndex_ = 0;\n\n /** @private {!Map<string, !Uint8Array>} */\n this.initSegments = new Map();\n\n /** @private {?shaka.util.TsParser} */\n this.tsParser_ = null;\n\n /** @private {?shaka.transmuxer.AacTransmuxer} */\n this.aacTransmuxer_ = null;\n\n /** @private {?Uint8Array} */\n this.lastInitSegment_ = null;\n }\n\n\n /**\n * @override\n * @export\n */\n destroy() {\n this.initSegments.clear();\n\n if (this.aacTransmuxer_) {\n this.aacTransmuxer_.destroy();\n }\n }\n\n\n /**\n * Check if the mime type and the content type is supported.\n * @param {string} mimeType\n * @param {string=} contentType\n * @return {boolean}\n * @override\n * @export\n */\n isSupported(mimeType, contentType) {\n const Capabilities = shaka.media.Capabilities;\n\n if (!this.isTsContainer_(mimeType)) {\n return false;\n }\n\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n const MimeUtils = shaka.util.MimeUtils;\n\n let convertedMimeType = mimeType;\n if (contentType) {\n convertedMimeType = this.convertCodecs(contentType, mimeType);\n }\n const codecs = MimeUtils.getCodecs(convertedMimeType);\n const allCodecs = MimeUtils.splitCodecs(codecs);\n\n const audioCodec = shaka.util.ManifestParserUtils.guessCodecsSafe(\n ContentType.AUDIO, allCodecs);\n const videoCodec = shaka.util.ManifestParserUtils.guessCodecsSafe(\n ContentType.VIDEO, allCodecs);\n\n const TsTransmuxer = shaka.transmuxer.TsTransmuxer;\n\n if (audioCodec) {\n const normalizedCodec = MimeUtils.getNormalizedCodec(audioCodec);\n if (!TsTransmuxer.SUPPORTED_AUDIO_CODECS_.includes(normalizedCodec)) {\n return false;\n }\n }\n\n if (videoCodec) {\n const normalizedCodec = MimeUtils.getNormalizedCodec(videoCodec);\n if (!TsTransmuxer.SUPPORTED_VIDEO_CODECS_.includes(normalizedCodec)) {\n return false;\n }\n }\n\n if (contentType) {\n return Capabilities.isTypeSupported(\n this.convertCodecs(contentType, mimeType));\n }\n\n const audioMime = this.convertCodecs(ContentType.AUDIO, mimeType);\n const videoMime = this.convertCodecs(ContentType.VIDEO, mimeType);\n return Capabilities.isTypeSupported(audioMime) ||\n Capabilities.isTypeSupported(videoMime);\n }\n\n\n /**\n * Check if the mimetype is 'video/mp2t'.\n * @param {string} mimeType\n * @return {boolean}\n * @private\n */\n isTsContainer_(mimeType) {\n return mimeType.toLowerCase().split(';')[0] == 'video/mp2t';\n }\n\n\n /**\n * @override\n * @export\n */\n convertCodecs(contentType, mimeType) {\n if (this.isTsContainer_(mimeType)) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n const StreamUtils = shaka.util.StreamUtils;\n // The replace it's necessary because Firefox(the only browser that\n // supports MP3 in MP4) only support the MP3 codec with the mp3 string.\n // MediaSource.isTypeSupported('audio/mp4; codecs=\"mp4a.40.34\"') -> false\n // MediaSource.isTypeSupported('audio/mp4; codecs=\"mp3\"') -> true\n const codecs = shaka.util.MimeUtils.getCodecs(mimeType)\n .replace('mp4a.40.34', 'mp3').split(',')\n .map((codecs) => {\n return StreamUtils.getCorrectAudioCodecs(codecs, 'audio/mp4');\n })\n .map(StreamUtils.getCorrectVideoCodecs).join(',');\n if (contentType == ContentType.AUDIO) {\n return `audio/mp4; codecs=\"${codecs}\"`;\n }\n return `video/mp4; codecs=\"${codecs}\"`;\n }\n return mimeType;\n }\n\n\n /**\n * @override\n * @export\n */\n getOriginalMimeType() {\n return this.originalMimeType_;\n }\n\n\n /**\n * @override\n * @export\n */\n transmux(data, stream, reference, duration, contentType) {\n const ContentType = shaka.util.ManifestParserUtils.ContentType;\n const Uint8ArrayUtils = shaka.util.Uint8ArrayUtils;\n\n const uint8ArrayData = shaka.util.BufferUtils.toUint8(data);\n\n if (contentType == ContentType.AUDIO &&\n !shaka.util.TsParser.probe(uint8ArrayData)) {\n const id3Data = shaka.util.Id3Utils.getID3Data(uint8ArrayData);\n let offset = id3Data.length;\n for (; offset < uint8ArrayData.length; offset++) {\n if (shaka.transmuxer.MpegAudio.probe(uint8ArrayData, offset)) {\n return Promise.reject(new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.TRANSMUXING_FAILED,\n reference ? reference.getUris()[0] : null));\n }\n }\n offset = id3Data.length;\n for (; offset < uint8ArrayData.length; offset++) {\n if (shaka.transmuxer.ADTS.probe(uint8ArrayData, offset)) {\n if (!this.aacTransmuxer_) {\n this.aacTransmuxer_ =\n new shaka.transmuxer.AacTransmuxer('audio/aac');\n }\n return this.aacTransmuxer_\n .transmux(data, stream, reference, duration, contentType);\n }\n }\n return Promise.reject(new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.TRANSMUXING_FAILED,\n reference ? reference.getUris()[0] : null));\n }\n\n if (!this.tsParser_) {\n this.tsParser_ = new shaka.util.TsParser();\n } else {\n this.tsParser_.clearData();\n }\n\n const tsParser = this.tsParser_.parse(uint8ArrayData);\n const streamInfos = [];\n const codecs = tsParser.getCodecs();\n try {\n let streamInfo = null;\n if (contentType == ContentType.VIDEO) {\n switch (codecs.video) {\n case 'avc':\n streamInfo =\n this.getAvcStreamInfo_(tsParser, stream, duration, reference);\n break;\n case 'hvc':\n streamInfo =\n this.getHvcStreamInfo_(tsParser, stream, duration, reference);\n break;\n }\n if (streamInfo) {\n streamInfos.push(streamInfo);\n streamInfo = null;\n }\n }\n if (contentType == ContentType.AUDIO) {\n switch (codecs.audio) {\n case 'aac':\n streamInfo =\n this.getAacStreamInfo_(tsParser, stream, duration, reference);\n break;\n case 'ac3':\n streamInfo =\n this.getAc3StreamInfo_(tsParser, stream, duration, reference);\n break;\n case 'ec3':\n streamInfo =\n this.getEc3StreamInfo_(tsParser, stream, duration, reference);\n break;\n case 'mp3':\n streamInfo =\n this.getMp3StreamInfo_(tsParser, stream, duration, reference);\n break;\n case 'opus':\n streamInfo =\n this.getOpusStreamInfo_(tsParser, stream, duration, reference);\n break;\n }\n if (streamInfo) {\n streamInfos.push(streamInfo);\n streamInfo = null;\n }\n }\n } catch (e) {\n if (e && e.code == shaka.util.Error.Code.TRANSMUXING_NO_VIDEO_DATA) {\n return Promise.resolve(new Uint8Array([]));\n }\n return Promise.reject(e);\n }\n\n if (!streamInfos.length) {\n return Promise.reject(new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.TRANSMUXING_FAILED,\n reference ? reference.getUris()[0] : null));\n }\n\n const mp4Generator = new shaka.transmuxer.Mp4Generator(streamInfos);\n let initSegment;\n const initSegmentKey = stream.id + '_' + reference.discontinuitySequence;\n if (!this.initSegments.has(initSegmentKey)) {\n initSegment = mp4Generator.initSegment();\n this.initSegments.set(initSegmentKey, initSegment);\n } else {\n initSegment = this.initSegments.get(initSegmentKey);\n }\n const appendInitSegment = this.lastInitSegment_ !== initSegment;\n const segmentData = mp4Generator.segmentData();\n this.lastInitSegment_ = initSegment;\n this.frameIndex_++;\n if (appendInitSegment) {\n const transmuxData = Uint8ArrayUtils.concat(initSegment, segmentData);\n return Promise.resolve(transmuxData);\n } else {\n return Promise.resolve(segmentData);\n }\n }\n\n\n /**\n * @param {shaka.util.TsParser} tsParser\n * @param {shaka.extern.Stream} stream\n * @param {number} duration\n * @param {?shaka.media.SegmentReference} reference\n * @return {shaka.transmuxer.Mp4Generator.StreamInfo}\n * @private\n */\n getAacStreamInfo_(tsParser, stream, duration, reference) {\n const ADTS = shaka.transmuxer.ADTS;\n const timescale = shaka.util.TsParser.Timescale;\n const Uint8ArrayUtils = shaka.util.Uint8ArrayUtils;\n\n /** @type {!Array<shaka.transmuxer.Mp4Generator.Mp4Sample>} */\n const samples = [];\n\n let info;\n\n let firstPts = null;\n\n /** @type {?number} */\n let nextStartOffset = null;\n /** @type {?Uint8Array} */\n let overflowBytes = null;\n\n for (const audioData of tsParser.getAudioData()) {\n let data = audioData.data;\n if (!data) {\n continue;\n }\n let offset = 0;\n if (nextStartOffset == -1 && overflowBytes) {\n data = Uint8ArrayUtils.concat(overflowBytes, audioData.data);\n nextStartOffset = null;\n } else if (nextStartOffset != null && overflowBytes) {\n offset = Math.max(0, nextStartOffset);\n const missingFrameData =\n Uint8ArrayUtils.concat(overflowBytes, data.subarray(0, offset));\n samples.push({\n data: missingFrameData,\n size: missingFrameData.byteLength,\n duration: ADTS.AAC_SAMPLES_PER_FRAME,\n cts: 0,\n flags: {\n isLeading: 0,\n isDependedOn: 0,\n hasRedundancy: 0,\n degradPrio: 0,\n dependsOn: 2,\n isNonSync: 0,\n },\n });\n overflowBytes = null;\n nextStartOffset = null;\n }\n info = ADTS.parseInfo(data, offset);\n if (!info) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.TRANSMUXING_FAILED,\n reference ? reference.getUris()[0] : null);\n }\n stream.audioSamplingRate = info.sampleRate;\n stream.channelsCount = info.channelCount;\n if (firstPts == null && audioData.pts !== null) {\n firstPts = audioData.pts;\n }\n while (offset < data.length) {\n const header = ADTS.parseHeader(data, offset);\n if (!header) {\n overflowBytes = data.subarray(offset, data.length);\n nextStartOffset = -1;\n break;\n }\n const length = header.headerLength + header.frameLength;\n nextStartOffset = Math.max(0, offset + length - data.length);\n if (nextStartOffset != 0) {\n overflowBytes = data.subarray(\n offset + header.headerLength, offset + length);\n } else if (offset + length <= data.length) {\n const frameData = data.subarray(\n offset + header.headerLength, offset + length);\n\n samples.push({\n data: frameData,\n size: header.frameLength,\n duration: ADTS.AAC_SAMPLES_PER_FRAME,\n cts: 0,\n flags: {\n isLeading: 0,\n isDependedOn: 0,\n hasRedundancy: 0,\n degradPrio: 0,\n dependsOn: 2,\n isNonSync: 0,\n },\n });\n }\n offset += length;\n }\n }\n\n if (!info || firstPts == null) {\n if (!tsParser.getVideoData().length) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.TRANSMUXING_FAILED,\n reference ? reference.getUris()[0] : null);\n }\n\n firstPts = reference.startTime * timescale;\n\n const allCodecs = shaka.util.MimeUtils.splitCodecs(stream.codecs);\n const audioCodec = shaka.util.ManifestParserUtils.guessCodecsSafe(\n shaka.util.ManifestParserUtils.ContentType.AUDIO, allCodecs);\n if (!audioCodec || !stream.channelsCount || !stream.audioSamplingRate) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.TRANSMUXING_FAILED,\n reference ? reference.getUris()[0] : null);\n }\n info = {\n sampleRate: stream.audioSamplingRate,\n channelCount: stream.channelsCount,\n codec: audioCodec,\n };\n const silenceFrame =\n ADTS.getSilentFrame(audioCodec, stream.channelsCount);\n if (!silenceFrame) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.TRANSMUXING_FAILED,\n reference ? reference.getUris()[0] : null);\n }\n const segmentDuration =\n (reference.endTime - reference.startTime) * timescale;\n const finalPTs = firstPts + segmentDuration;\n let currentPts = firstPts;\n while (currentPts < finalPTs) {\n samples.push({\n data: silenceFrame,\n size: silenceFrame.byteLength,\n duration: ADTS.AAC_SAMPLES_PER_FRAME,\n cts: 0,\n flags: {\n isLeading: 0,\n isDependedOn: 0,\n hasRedundancy: 0,\n degradPrio: 0,\n dependsOn: 2,\n isNonSync: 0,\n },\n });\n currentPts += ADTS.AAC_SAMPLES_PER_FRAME / info.sampleRate * timescale;\n }\n }\n\n /** @type {number} */\n const sampleRate = info.sampleRate;\n /** @type {number} */\n const baseMediaDecodeTime = firstPts / timescale * sampleRate;\n\n return {\n id: stream.id,\n type: shaka.util.ManifestParserUtils.ContentType.AUDIO,\n codecs: info.codec,\n encrypted: stream.encrypted && stream.drmInfos.length > 0,\n timescale: sampleRate,\n duration: duration,\n videoNalus: [],\n audioConfig: new Uint8Array([]),\n videoConfig: new Uint8Array([]),\n hSpacing: 0,\n vSpacing: 0,\n data: {\n sequenceNumber: this.frameIndex_,\n baseMediaDecodeTime: baseMediaDecodeTime,\n samples: samples,\n },\n stream: stream,\n };\n }\n\n\n /**\n * @param {shaka.util.TsParser} tsParser\n * @param {shaka.extern.Stream} stream\n * @param {number} duration\n * @param {?shaka.media.SegmentReference} reference\n * @return {shaka.transmuxer.Mp4Generator.StreamInfo}\n * @private\n */\n getAc3StreamInfo_(tsParser, stream, duration, reference) {\n const Ac3 = shaka.transmuxer.Ac3;\n const timescale = shaka.util.TsParser.Timescale;\n\n /** @type {!Array<shaka.transmuxer.Mp4Generator.Mp4Sample>} */\n const samples = [];\n\n /** @type {number} */\n let sampleRate = 0;\n\n /** @type {!Uint8Array} */\n let audioConfig = new Uint8Array([]);\n\n let firstPts = null;\n\n for (const audioData of tsParser.getAudioData()) {\n const data = audioData.data;\n if (firstPts == null && audioData.pts !== null) {\n firstPts = audioData.pts;\n }\n let offset = 0;\n while (offset < data.length) {\n const frame = Ac3.parseFrame(data, offset);\n if (!frame) {\n offset++;\n continue;\n }\n stream.audioSamplingRate = frame.sampleRate;\n stream.channelsCount = frame.channelCount;\n sampleRate = frame.sampleRate;\n audioConfig = frame.audioConfig;\n\n const frameData = data.subarray(\n offset, offset + frame.frameLength);\n\n samples.push({\n data: frameData,\n size: frame.frameLength,\n duration: Ac3.AC3_SAMPLES_PER_FRAME,\n cts: 0,\n flags: {\n isLeading: 0,\n isDependedOn: 0,\n hasRedundancy: 0,\n degradPrio: 0,\n dependsOn: 2,\n isNonSync: 0,\n },\n });\n offset += frame.frameLength;\n }\n }\n\n if (sampleRate == 0 || audioConfig.byteLength == 0 || firstPts == null) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.TRANSMUXING_FAILED,\n reference ? reference.getUris()[0] : null);\n }\n\n\n /** @type {number} */\n const baseMediaDecodeTime = firstPts / timescale * sampleRate;\n\n return {\n id: stream.id,\n type: shaka.util.ManifestParserUtils.ContentType.AUDIO,\n codecs: 'ac-3',\n encrypted: stream.encrypted && stream.drmInfos.length > 0,\n timescale: sampleRate,\n duration: duration,\n videoNalus: [],\n audioConfig: audioConfig,\n videoConfig: new Uint8Array([]),\n hSpacing: 0,\n vSpacing: 0,\n data: {\n sequenceNumber: this.frameIndex_,\n baseMediaDecodeTime: baseMediaDecodeTime,\n samples: samples,\n },\n stream: stream,\n };\n }\n\n\n /**\n * @param {shaka.util.TsParser} tsParser\n * @param {shaka.extern.Stream} stream\n * @param {number} duration\n * @param {?shaka.media.SegmentReference} reference\n * @return {shaka.transmuxer.Mp4Generator.StreamInfo}\n * @private\n */\n getEc3StreamInfo_(tsParser, stream, duration, reference) {\n const Ec3 = shaka.transmuxer.Ec3;\n const timescale = shaka.util.TsParser.Timescale;\n\n /** @type {!Array<shaka.transmuxer.Mp4Generator.Mp4Sample>} */\n const samples = [];\n\n /** @type {number} */\n let sampleRate = 0;\n\n /** @type {!Uint8Array} */\n let audioConfig = new Uint8Array([]);\n\n let firstPts = null;\n\n for (const audioData of tsParser.getAudioData()) {\n const data = audioData.data;\n if (firstPts == null && audioData.pts !== null) {\n firstPts = audioData.pts;\n }\n let offset = 0;\n while (offset < data.length) {\n const frame = Ec3.parseFrame(data, offset);\n if (!frame) {\n offset++;\n continue;\n }\n stream.audioSamplingRate = frame.sampleRate;\n stream.channelsCount = frame.channelCount;\n sampleRate = frame.sampleRate;\n audioConfig = frame.audioConfig;\n\n const frameData = data.subarray(\n offset, offset + frame.frameLength);\n\n samples.push({\n data: frameData,\n size: frame.frameLength,\n duration: Ec3.EC3_SAMPLES_PER_FRAME,\n cts: 0,\n flags: {\n isLeading: 0,\n isDependedOn: 0,\n hasRedundancy: 0,\n degradPrio: 0,\n dependsOn: 2,\n isNonSync: 0,\n },\n });\n offset += frame.frameLength;\n }\n }\n\n if (sampleRate == 0 || audioConfig.byteLength == 0 || firstPts == null) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.TRANSMUXING_FAILED,\n reference ? reference.getUris()[0] : null);\n }\n\n\n /** @type {number} */\n const baseMediaDecodeTime = firstPts / timescale * sampleRate;\n\n return {\n id: stream.id,\n type: shaka.util.ManifestParserUtils.ContentType.AUDIO,\n codecs: 'ec-3',\n encrypted: stream.encrypted && stream.drmInfos.length > 0,\n timescale: sampleRate,\n duration: duration,\n videoNalus: [],\n audioConfig: audioConfig,\n videoConfig: new Uint8Array([]),\n hSpacing: 0,\n vSpacing: 0,\n data: {\n sequenceNumber: this.frameIndex_,\n baseMediaDecodeTime: baseMediaDecodeTime,\n samples: samples,\n },\n stream: stream,\n };\n }\n\n\n /**\n * @param {shaka.util.TsParser} tsParser\n * @param {shaka.extern.Stream} stream\n * @param {number} duration\n * @param {?shaka.media.SegmentReference} reference\n * @return {shaka.transmuxer.Mp4Generator.StreamInfo}\n * @private\n */\n getMp3StreamInfo_(tsParser, stream, duration, reference) {\n const MpegAudio = shaka.transmuxer.MpegAudio;\n const timescale = shaka.util.TsParser.Timescale;\n\n /** @type {!Array<shaka.transmuxer.Mp4Generator.Mp4Sample>} */\n const samples = [];\n\n let firstHeader;\n\n let firstPts = null;\n\n for (const audioData of tsParser.getAudioData()) {\n const data = audioData.data;\n if (!data) {\n continue;\n }\n if (firstPts == null && audioData.pts !== null) {\n firstPts = audioData.pts;\n }\n let offset = 0;\n while (offset < data.length) {\n const header = MpegAudio.parseHeader(data, offset);\n if (!header) {\n offset++;\n continue;\n }\n if (!firstHeader) {\n firstHeader = header;\n }\n if (offset + header.frameLength <= data.length) {\n samples.push({\n data: data.subarray(offset, offset + header.frameLength),\n size: header.frameLength,\n duration: MpegAudio.MPEG_AUDIO_SAMPLE_PER_FRAME,\n cts: 0,\n flags: {\n isLeading: 0,\n isDependedOn: 0,\n hasRedundancy: 0,\n degradPrio: 0,\n dependsOn: 2,\n isNonSync: 0,\n },\n });\n }\n offset += header.frameLength;\n }\n }\n if (!firstHeader || firstPts == null) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.TRANSMUXING_FAILED,\n reference ? reference.getUris()[0] : null);\n }\n /** @type {number} */\n const sampleRate = firstHeader.sampleRate;\n /** @type {number} */\n const baseMediaDecodeTime = firstPts / timescale * sampleRate;\n\n return {\n id: stream.id,\n type: shaka.util.ManifestParserUtils.ContentType.AUDIO,\n codecs: 'mp3',\n encrypted: stream.encrypted && stream.drmInfos.length > 0,\n timescale: sampleRate,\n duration: duration,\n videoNalus: [],\n audioConfig: new Uint8Array([]),\n videoConfig: new Uint8Array([]),\n hSpacing: 0,\n vSpacing: 0,\n data: {\n sequenceNumber: this.frameIndex_,\n baseMediaDecodeTime: baseMediaDecodeTime,\n samples: samples,\n },\n stream: stream,\n };\n }\n\n\n /**\n * @param {shaka.util.TsParser} tsParser\n * @param {shaka.extern.Stream} stream\n * @param {number} duration\n * @param {?shaka.media.SegmentReference} reference\n * @return {shaka.transmuxer.Mp4Generator.StreamInfo}\n * @private\n */\n getOpusStreamInfo_(tsParser, stream, duration, reference) {\n const Opus = shaka.transmuxer.Opus;\n const timescale = shaka.util.TsParser.Timescale;\n\n /** @type {!Array<shaka.transmuxer.Mp4Generator.Mp4Sample>} */\n const samples = [];\n\n let firstPts = null;\n\n /** @type {?shaka.util.TsParser.OpusMetadata} */\n const opusMetadata = tsParser.getOpusMetadata();\n\n if (!opusMetadata) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.TRANSMUXING_FAILED,\n reference ? reference.getUris()[0] : null);\n }\n\n /** @type {!Uint8Array} */\n const audioConfig = Opus.getAudioConfig(opusMetadata);\n\n /** @type {number} */\n const sampleRate = opusMetadata.sampleRate;\n\n for (const audioData of tsParser.getAudioData()) {\n const data = audioData.data;\n if (firstPts == null && audioData.pts !== null) {\n firstPts = audioData.pts;\n }\n let offset = 0;\n while (offset < data.length) {\n const opusPendingTrimStart = (data[offset + 1] & 0x10) !== 0;\n const trimEnd = (data[offset + 1] & 0x08) !== 0;\n let index = offset + 2;\n let size = 0;\n\n while (data[index] === 0xFF) {\n size += 255;\n index += 1;\n }\n size += data[index];\n index += 1;\n index += opusPendingTrimStart ? 2 : 0;\n index += trimEnd ? 2 : 0;\n\n const sample = data.slice(index, index + size);\n\n samples.push({\n data: sample,\n size: sample.byteLength,\n duration: Opus.OPUS_AUDIO_SAMPLE_PER_FRAME,\n cts: 0,\n flags: {\n isLeading: 0,\n isDependedOn: 0,\n hasRedundancy: 0,\n degradPrio: 0,\n dependsOn: 2,\n isNonSync: 0,\n },\n });\n offset = index + size;\n }\n }\n\n if (audioConfig.byteLength == 0 || firstPts == null) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.TRANSMUXING_FAILED,\n reference ? reference.getUris()[0] : null);\n }\n\n stream.audioSamplingRate = opusMetadata.sampleRate;\n stream.channelsCount = opusMetadata.channelCount;\n\n\n /** @type {number} */\n const baseMediaDecodeTime = firstPts / timescale * sampleRate;\n\n return {\n id: stream.id,\n type: shaka.util.ManifestParserUtils.ContentType.AUDIO,\n codecs: 'opus',\n encrypted: stream.encrypted && stream.drmInfos.length > 0,\n timescale: sampleRate,\n duration: duration,\n videoNalus: [],\n audioConfig: audioConfig,\n videoConfig: new Uint8Array([]),\n hSpacing: 0,\n vSpacing: 0,\n data: {\n sequenceNumber: this.frameIndex_,\n baseMediaDecodeTime: baseMediaDecodeTime,\n samples: samples,\n },\n stream: stream,\n };\n }\n\n\n /**\n * @param {shaka.util.TsParser} tsParser\n * @param {shaka.extern.Stream} stream\n * @param {number} duration\n * @param {?shaka.media.SegmentReference} reference\n * @return {shaka.transmuxer.Mp4Generator.StreamInfo}\n * @private\n */\n getAvcStreamInfo_(tsParser, stream, duration, reference) {\n const H264 = shaka.transmuxer.H264;\n const timescale = shaka.util.TsParser.Timescale;\n\n /** @type {!Array<shaka.transmuxer.Mp4Generator.Mp4Sample>} */\n const samples = [];\n\n /** @type {?number} */\n let baseMediaDecodeTime = null;\n\n const videoData = tsParser.getVideoData();\n const videoSamples = H264.getVideoSamples(videoData);\n if (!videoSamples.length) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.TRANSMUXING_NO_VIDEO_DATA,\n reference ? reference.getUris()[0] : null);\n }\n for (let i = 0; i < videoSamples.length; i++) {\n const videoSample = videoSamples[i];\n if (baseMediaDecodeTime == null) {\n baseMediaDecodeTime = videoSample.dts;\n }\n let duration;\n if (i + 1 < videoSamples.length) {\n duration = (videoSamples[i + 1].dts || 0) - (videoSample.dts || 0);\n } else if (videoSamples.length > 1) {\n duration = (videoSample.dts || 0) - (videoSamples[i - 1].dts || 0);\n } else {\n duration = (reference.endTime - reference.startTime) * timescale;\n }\n samples.push({\n data: videoSample.data,\n size: videoSample.data.byteLength,\n duration: duration,\n cts: Math.round((videoSample.pts || 0) - (videoSample.dts || 0)),\n flags: {\n isLeading: 0,\n isDependedOn: 0,\n hasRedundancy: 0,\n degradPrio: 0,\n dependsOn: videoSample.isKeyframe ? 2 : 1,\n isNonSync: videoSample.isKeyframe ? 0 : 1,\n },\n });\n }\n\n const nalus = [];\n for (const pes of videoData) {\n nalus.push(...pes.nalus);\n }\n const info = H264.parseInfo(nalus);\n\n if (!info || baseMediaDecodeTime == null) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.TRANSMUXING_FAILED,\n reference ? reference.getUris()[0] : null);\n }\n stream.height = info.height;\n stream.width = info.width;\n\n return {\n id: stream.id,\n type: shaka.util.ManifestParserUtils.ContentType.VIDEO,\n codecs: 'avc1',\n encrypted: stream.encrypted && stream.drmInfos.length > 0,\n timescale: timescale,\n duration: duration,\n videoNalus: [],\n audioConfig: new Uint8Array([]),\n videoConfig: info.videoConfig,\n hSpacing: info.hSpacing,\n vSpacing: info.vSpacing,\n data: {\n sequenceNumber: this.frameIndex_,\n baseMediaDecodeTime: baseMediaDecodeTime,\n samples: samples,\n },\n stream: stream,\n };\n }\n\n\n /**\n * @param {shaka.util.TsParser} tsParser\n * @param {shaka.extern.Stream} stream\n * @param {number} duration\n * @param {?shaka.media.SegmentReference} reference\n * @return {shaka.transmuxer.Mp4Generator.StreamInfo}\n * @private\n */\n getHvcStreamInfo_(tsParser, stream, duration, reference) {\n const H265 = shaka.transmuxer.H265;\n const timescale = shaka.util.TsParser.Timescale;\n\n /** @type {!Array<shaka.transmuxer.Mp4Generator.Mp4Sample>} */\n const samples = [];\n\n /** @type {?number} */\n let baseMediaDecodeTime = null;\n\n const nalus = [];\n const videoData = tsParser.getVideoData();\n if (!videoData.length) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.TRANSMUXING_NO_VIDEO_DATA,\n reference ? reference.getUris()[0] : null);\n }\n for (let i = 0; i < videoData.length; i++) {\n const pes = videoData[i];\n const dataNalus = pes.nalus;\n nalus.push(...dataNalus);\n const frame = H265.parseFrame(dataNalus);\n if (!frame) {\n continue;\n }\n if (baseMediaDecodeTime == null && pes.dts != null) {\n baseMediaDecodeTime = pes.dts;\n }\n let duration;\n if (i + 1 < videoData.length) {\n duration = (videoData[i + 1].dts || 0) - (pes.dts || 0);\n } else if (videoData.length > 1) {\n duration = (pes.dts || 0) - (videoData[i - 1].dts || 0);\n } else {\n duration = (reference.endTime - reference.startTime) * timescale;\n }\n samples.push({\n data: frame.data,\n size: frame.data.byteLength,\n duration: duration,\n cts: Math.round((pes.pts || 0) - (pes.dts || 0)),\n flags: {\n isLeading: 0,\n isDependedOn: 0,\n hasRedundancy: 0,\n degradPrio: 0,\n dependsOn: frame.isKeyframe ? 2 : 1,\n isNonSync: frame.isKeyframe ? 0 : 1,\n },\n });\n }\n\n const info = H265.parseInfo(nalus);\n\n if (!info || baseMediaDecodeTime == null) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.CRITICAL,\n shaka.util.Error.Category.MEDIA,\n shaka.util.Error.Code.TRANSMUXING_FAILED,\n reference ? reference.getUris()[0] : null);\n }\n stream.height = info.height;\n stream.width = info.width;\n\n return {\n id: stream.id,\n type: shaka.util.ManifestParserUtils.ContentType.VIDEO,\n codecs: 'hvc1',\n encrypted: stream.encrypted && stream.drmInfos.length > 0,\n timescale: timescale,\n duration: duration,\n videoNalus: [],\n audioConfig: new Uint8Array([]),\n videoConfig: info.videoConfig,\n hSpacing: info.hSpacing,\n vSpacing: info.vSpacing,\n data: {\n sequenceNumber: this.frameIndex_,\n baseMediaDecodeTime: baseMediaDecodeTime,\n samples: samples,\n },\n stream: stream,\n };\n }\n};\n\n/**\n * Supported audio codecs.\n *\n * @private\n * @const {!Array<string>}\n */\nshaka.transmuxer.TsTransmuxer.SUPPORTED_AUDIO_CODECS_ = [\n 'aac',\n 'ac-3',\n 'ec-3',\n 'mp3',\n 'opus',\n];\n\n/**\n * Supported audio codecs.\n *\n * @private\n * @const {!Array<string>}\n */\nshaka.transmuxer.TsTransmuxer.SUPPORTED_VIDEO_CODECS_ = [\n 'avc',\n 'hevc',\n];\n\n\nshaka.transmuxer.TransmuxerEngine.registerTransmuxer(\n 'video/mp2t',\n () => new shaka.transmuxer.TsTransmuxer('video/mp2t'),\n shaka.transmuxer.TransmuxerEngine.PluginPriority.PREFERRED);\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.transmuxer.Opus');\n\ngoog.requireType('shaka.util.TsParser');\n\n\n/**\n * Opus utils\n */\nshaka.transmuxer.Opus = class {\n /**\n * @param {!shaka.util.TsParser.OpusMetadata} metadata\n * @return {!Uint8Array}\n */\n static getAudioConfig(metadata) {\n let mapping = [];\n switch (metadata.channelConfigCode) {\n case 0x01:\n case 0x02:\n mapping = [0x0];\n break;\n case 0x00: // dualmono\n mapping = [0xFF, 1, 1, 0, 1];\n break;\n case 0x80: // dualmono\n mapping = [0xFF, 2, 0, 0, 1];\n break;\n case 0x03:\n mapping = [0x01, 2, 1, 0, 2, 1];\n break;\n case 0x04:\n mapping = [0x01, 2, 2, 0, 1, 2, 3];\n break;\n case 0x05:\n mapping = [0x01, 3, 2, 0, 4, 1, 2, 3];\n break;\n case 0x06:\n mapping = [0x01, 4, 2, 0, 4, 1, 2, 3, 5];\n break;\n case 0x07:\n mapping = [0x01, 4, 2, 0, 4, 1, 2, 3, 5, 6];\n break;\n case 0x08:\n mapping = [0x01, 5, 3, 0, 6, 1, 2, 3, 4, 5, 7];\n break;\n case 0x82:\n mapping = [0x01, 1, 2, 0, 1];\n break;\n case 0x83:\n mapping = [0x01, 1, 3, 0, 1, 2];\n break;\n case 0x84:\n mapping = [0x01, 1, 4, 0, 1, 2, 3];\n break;\n case 0x85:\n mapping = [0x01, 1, 5, 0, 1, 2, 3, 4];\n break;\n case 0x86:\n mapping = [0x01, 1, 6, 0, 1, 2, 3, 4, 5];\n break;\n case 0x87:\n mapping = [0x01, 1, 7, 0, 1, 2, 3, 4, 5, 6];\n break;\n case 0x88:\n mapping = [0x01, 1, 8, 0, 1, 2, 3, 4, 5, 6, 7];\n break;\n }\n\n return new Uint8Array([\n 0x00, // Version (1)\n metadata.channelCount, // OutputChannelCount: 2\n 0x00, 0x00, // PreSkip: 2\n (metadata.sampleRate >>> 24) & 0xFF, // Audio sample rate: 4\n (metadata.sampleRate >>> 17) & 0xFF,\n (metadata.sampleRate >>> 8) & 0xFF,\n (metadata.sampleRate >>> 0) & 0xFF,\n 0x00, 0x00, // Global Gain : 2\n ...mapping,\n ]);\n }\n};\n\n/**\n * @const {number}\n */\nshaka.transmuxer.Opus.OPUS_AUDIO_SAMPLE_PER_FRAME = 960;\n","/*! @license\n * Shaka Player\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\ngoog.provide('shaka.util.FairPlayUtils');\n\ngoog.require('shaka.drm.FairPlay');\n\n\n/**\n * @summary A set of FairPlay utility functions. DEPRECATED: Please use\n * shaka.drm.FairPlay instead.\n * @deprecated\n * @export\n */\nshaka.util.FairPlayUtils = class extends shaka.drm.FairPlay {\n // DEPRECATED\n};\n","/* @flow */\n\n// Values are CSS class names and should not be changed\nconst Theme = Object.freeze({\n Dark: 'dark',\n Light: 'light',\n});\n\nexport type ThemeType = 'light' | 'dark';\n\nconst Luminosity = Object.freeze({\n Dark: 'dk',\n Light: 'lt',\n});\n\nexport type LuminosityType = typeof Luminosity.Dark | typeof Luminosity.Light;\n\nconst Variant = {\n ...Luminosity,\n Default: 'default',\n};\n\n// Return themed image based on given variant\nconst getThemedImageFromVariant: (assetId: string, variant: string) => string = (assetId, variant) => `${assetId}_${variant}`;\n\nconst getVariant: (luminosity?: LuminosityType, theme?: ThemeType) => string = (luminosity, theme) => {\n // Luminosity has been provided\n if (luminosity === Luminosity.Dark) {\n return Variant.Dark;\n }\n if (luminosity === Luminosity.Light) {\n return Variant.Light;\n }\n\n // Theme has been provided\n if (theme) {\n return theme === Theme.Dark ? Variant.Light : Variant.Dark;\n }\n\n // Nothing has been provided\n return Variant.Default;\n};\n\nconst getOppositeMode: (theme: ThemeType) => ThemeType = (theme) => (theme === Theme.Dark ? Theme.Light : Theme.Dark);\n\nmodule.exports = {\n Luminosity,\n Theme,\n Variant,\n getOppositeMode,\n getThemedImageFromVariant,\n getVariant,\n};\n","/* @flow */\n\nconst SHOW_DELAY = 150;\nconst HIDE_DELAY = 150;\nconst TOOLTIP_DELAY = [SHOW_DELAY, HIDE_DELAY];\nconst SHOW_DURATION = 250;\nconst HIDE_DURATION = 175;\nconst TOOLTIP_DURATION = [SHOW_DURATION, HIDE_DURATION];\nconst TOOLTIP_MAX_WIDTH = 600;\nconst TOOLTIP_INTERACTIVE_BORDER = 10;\nconst TOOLTIP_ZINDEX = 100_000;\n\nexport type TippyOptionsType = {|\n animation: string,\n arrow: boolean,\n content?: any,\n delay: Array<number>,\n duration: Array<number>,\n interactiveBorder: number,\n maxWidth: number,\n placement: string,\n theme: string,\n trigger: string,\n zIndex: number,\n|};\n\nconst TIPPY_DEFAULT_OPTIONS: TippyOptionsType = {\n animation: 'scale',\n arrow: false,\n delay: TOOLTIP_DELAY,\n duration: TOOLTIP_DURATION,\n interactiveBorder: TOOLTIP_INTERACTIVE_BORDER,\n maxWidth: TOOLTIP_MAX_WIDTH,\n placement: 'bottom',\n theme: 'dark',\n trigger: 'mouseenter focus',\n zIndex: TOOLTIP_ZINDEX,\n};\n\nexport type TippyHTMLElement = {\n ...HTMLElement,\n _tippy: any,\n};\n\nmodule.exports = {\n TIPPY_DEFAULT_OPTIONS,\n};\n","/* @flow */\n\nconst openFooterPage: (urlStr: string, windowName: string) => void = (urlStr, windowName) => {\n const url = new URL(urlStr);\n url.searchParams.set('webview', 'false');\n\n window.open(url.toString(), windowName);\n};\n\nexport { openFooterPage };\n","/* @flow */\n\nimport type { KeyValuePair } from '../../dist/types';\n\nconst cleanLanguage: (tag: string) => string | null = (tag) => {\n try {\n return new Intl.Locale(tag).language;\n } catch {\n return null;\n }\n};\n\n/*\n * What this function does:\n * - Removes duplicates\n * - Removes country-specific codes (e.g. [\"fr\", \"fr-BE\"] and [\"fr-CA\"] both becomes [\"fr\"])\n * - Converts to lower case\n * - Preserves order\n */\nconst cleanLanguageList: (languages: $ReadOnlyArray<string>) => Array<string> = (languages) => {\n const langDic: KeyValuePair<number> = {};\n\n if (languages) {\n let i = 0;\n languages.forEach((l) => {\n const language = cleanLanguage(l);\n if (language !== null && typeof langDic[language] !== 'number') {\n langDic[language] = i;\n i += 1;\n }\n });\n }\n\n const languageList = Object.keys(langDic);\n const cleanedLanguages = Array(languageList.length);\n\n languageList.forEach((language) => {\n cleanedLanguages[langDic[language]] = language;\n });\n\n return cleanedLanguages;\n};\n\nconst checkUpdatePageTitle: (language: string) => void = (language) => {\n // Find all titles in page\n document.head?.querySelectorAll('meta[name=title]').forEach((tag) => {\n if (tag instanceof HTMLMetaElement) {\n const { content, lang } = tag;\n\n if (lang === language && content) {\n document.title = content;\n }\n }\n });\n};\n\nexport { checkUpdatePageTitle, cleanLanguage, cleanLanguageList };\n","/* @flow */\n\nimport { checkUpdatePageTitle, cleanLanguageList } from './helper';\nimport Backend from 'i18next-xhr-backend';\nimport type { KeyValuePair } from '../types';\nimport i18nInstance from 'i18next';\nimport { initReactI18next } from 'react-i18next';\n\nclass Localizer {\n static instance: any;\n\n static language: string;\n\n // $FlowFixMe: Flow does not support symbols yet\n get [Symbol.toStringTag]() {\n return 'Localizer';\n }\n\n static initialize: (language: string, translations: { [string]: any }) => Promise<any> = (language, translations) => {\n if (Localizer.instance) {\n return Promise.resolve();\n }\n\n Localizer.language = language;\n\n // Ensure that the page title is in the right language\n checkUpdatePageTitle(language);\n\n const resources: KeyValuePair<{| translation: any |}> = {};\n Object.entries(translations).forEach(([lang, file]) => {\n resources[lang] = { translation: file };\n });\n\n return i18nInstance\n .use(initReactI18next)\n .use(Backend)\n .init({\n debug: false,\n defaultNS: 'translation',\n interpolation: {\n escapeValue: false,\n },\n keySeparator: '.',\n lng: language,\n ns: ['translation'],\n resources,\n })\n .then(() => {\n Localizer.instance = i18nInstance;\n });\n };\n\n static getInstance: () => any = () => Localizer.instance;\n\n static localize: (key: string, options: any) => string = (key, options) =>\n Localizer.instance\n .t(key, options)\n .replace(/ ([:!?-])/giu, '\\u00A0$1')\n .replace(/_/giu, '\\u00A0');\n\n /*\n * What this function does:\n * - Takes all languages defined in browser\n * - Only keeps languages supported by application\n * - If resulting list is empty, returns supported languages\n * - Preserves order\n */\n static getAppLanguages: (supportedLanguages: $ReadOnlyArray<string>) => Array<string> = (supportedLanguages) => {\n const { language, languages } = navigator;\n const browserLanguages = cleanLanguageList(languages && languages.length ? languages : [language]);\n const appLanguages = browserLanguages.filter((lang) => supportedLanguages.includes(lang));\n\n // Add supported languages if they are missing (not among the browser languages)\n supportedLanguages.forEach((lang) => {\n if (!appLanguages.includes(lang)) {\n appLanguages.push(lang);\n }\n });\n\n return appLanguages;\n };\n\n /*\n * Find given key in locales and return, by order of priority:\n * - localized string for current language\n * - default value, if given\n * - first value, if present\n */\n static getLocalizedStringFromAppConf: (locales: ?{| [string]: Array<{| lang: string, value: string |}> |}, key: string, defaultValue?: string) => string = (locales, key, defaultValue) => {\n let firstValue: string | null = null;\n\n if (locales) {\n const { [key]: allStrings } = locales;\n\n if (allStrings && allStrings.length > 0) {\n const localizedString = allStrings.find(({ lang }) => lang === Localizer.language);\n\n if (localizedString?.value) {\n // Return value for current language\n return localizedString.value;\n }\n\n firstValue = allStrings[0].value ?? null;\n }\n }\n\n // Return default value or first value\n return defaultValue || firstValue || `***missing localized string for ${key}***`;\n };\n}\n\nmodule.exports = {\n Localizer,\n};\n","/* @flow */\n\nimport Messenger from './messenger';\nimport { MessengerEvents } from './messenger-events';\n\nmodule.exports = {\n Messenger,\n MessengerEvents,\n};\n","/* @flow */\n\nimport type { ReadOnlyKeyValuePair } from '../types';\n\nexport const MessengerEvents: ReadOnlyKeyValuePair<string> = Object.freeze({\n ACCOUNT_CREATED: 'account_created_event',\n APPLICATION_FULLY_LOADED: 'application_fully_loaded_event',\n AUTHENTICATION_REQUIRED: 'authentication_required_event',\n AUTHENTICATION_TOKEN_CHANGED: 'authentication_token_changed_event',\n AVENUE_RESET: 'reset_avenue_event',\n CAROUSEL_HIDE: 'carousel_hide_event',\n CAROUSEL_SET_CURRENT_INDEX: 'carousel_set_current_index_event',\n CAROUSEL_SHOW: 'carousel_show_event',\n CAROUSEL_SHOW_DEBUG: 'carousel_show_debug_event',\n CHECK_PENDING_OPERATION: 'check_pending_operation_event',\n CHECK_VERSION: 'check_version_event',\n CLEAR_NPVR: 'clear_npvr_event',\n CLEAR_PURCHASE_LIST: 'clear_purchase_list_event',\n CLEAR_VIEWING_HISTORY: 'clear_viewing_history_event',\n CLEAR_WISH_LIST: 'clear_wish_list_event',\n CLOSE_CHANNEL_LIST: 'close_channel_list_event',\n CONSENT_OPEN_SETTINGS: 'open_consent_settings_event',\n CONSENT_RESET: 'reset_consent_event',\n DEBUG_SHOW_FINISHING_LIVE_PROGRAMS: 'debug_show_finishing_live_programs_event',\n DOWNLOAD_SUCCESSFUL: 'download_successful_event',\n ENLARGE_VIDEO_CAROUSEL_MASK: 'show_video_carousel_mask_event',\n EPISODES_FEED_LOADED: 'episodes_feed_loaded_event',\n FLUSH_COLLECTOR: 'flush_collector_event',\n IMAGE_CAROUSEL_SET: 'image_carousel_set_event',\n ITEM_CLICKED: 'item_clicked_event',\n LOG_OUT: 'log_out_event',\n MANAGE_SUPER_STREAM: 'manage_super_stream_event',\n MODAL_CONFIRMATION_CLOSED: 'modal_confirmation_closed_event',\n MOVE_TO_TOP: 'move_to_top_event',\n NOTIFY_CLOSE: 'notify_close_event',\n NOTIFY_ERROR: 'notify_error_event',\n NOTIFY_INFO: 'notify_info_event',\n NOTIFY_SUCCESS: 'notify_success_event',\n NOTIFY_WARNING: 'notify_warning_event',\n OPEN_CARD: 'open_card_event',\n OPEN_EXPLORE_MODAL: 'open_explore_modal_event',\n OPEN_GLOBAL_SETTINGS: 'open_global_settings_event',\n OPEN_GRID_AVENUE: 'open_grid_avenue_event',\n OPEN_NPVR_MANAGEMENT_SCREEN: 'open_npvr_management_screen_event',\n OPEN_PLAYER: 'open_player_event',\n OPEN_TILE_TYPES_AVENUE: 'open_tile_types_avenue_event',\n OPEN_USER_ACCOUNT: 'open_user_account_event',\n REDUCE_VIDEO_CAROUSEL_MASK: 'hide_video_carousel_mask_event',\n REFRESH_AUTHENTICATION_TOKEN: 'refresh_authentication_token_event',\n REFRESH_HUB: 'refresh_hub_event',\n REFRESH_NPVR: 'refresh_npvr_event',\n REFRESH_PURCHASE_LIST: 'refresh_purchase_list_event',\n REFRESH_RECORDINGS_SECTION: 'refresh_recordings_section_event',\n REFRESH_VIEWING_HISTORY: 'refresh_viewing_history_event',\n REFRESH_WISH_LIST: 'refresh_wish_list_event',\n REGISTER_AS_GUEST: 'register_as_guest_event',\n RESTART_APP: 'restart_app_event',\n RESTORE_POSITION: 'restore_position_event',\n SECTION_SLIDING_UPDATE: 'update_section_sliding_event',\n SHOW_GUEST_MODE: 'show_guest_mode_event',\n SHOW_LEGAL_NOTICE: 'show_legal_notice_event',\n SHOW_PODS: 'show_pods_event',\n SHOW_SIGN_IN: 'show_sign_in_event',\n SHOW_SUBSCRIBE: 'show_subscribe_event',\n STASH_COLLECTOR: 'stash_collector_event',\n SUBSCRIBED: 'subscribed_event',\n TOGGLE_DEBUG_MODE: 'toggle_debug_mode_event',\n UNSTASH_COLLECTOR: 'unstash_collector_event',\n VIDEO_CAROUSEL_ENDED: 'video_carousel_ended_event',\n VIDEO_CAROUSEL_ENTER_FULLSCREEN: 'video_carousel_enter_fullscreen_event',\n VIDEO_CAROUSEL_EXIT_FULLSCREEN: 'video_carousel_exit_fullscreen_event',\n VIDEO_CAROUSEL_FULLSCREEN_EXITED: 'video_carousel_fullscreen_exited_event',\n VIDEO_CAROUSEL_SET: 'video_carousel_set_event',\n VIDEO_CAROUSEL_STOP: 'video_carousel_stop_event',\n VIDEO_CAROUSEL_TOGGLE_FULLSCREEN: 'video_carousel_toggle_fullscreen_event',\n VIDEO_CAROUSEL_TRAILER_HIDDEN: 'video_carousel_trailer_hidden_event',\n VIDEO_CAROUSEL_TRAILER_VISIBLE: 'video_carousel_trailer_visible_event',\n VIDEO_CAROUSEL_UPDATE_PROGRESS: 'video_carousel_update_progress_event',\n WATCH_RIGHTS_CHANGE: 'watch_rights_change_event',\n});\n","/* @flow */\n\nimport EventEmitter from 'events';\n\nconst MAX_LISTENERS = 200;\n\nclass Messenger extends EventEmitter {\n // eslint-disable-next-line no-use-before-define\n static instance: Messenger;\n\n constructor() {\n super();\n this.setMaxListeners(MAX_LISTENERS);\n }\n\n // $FlowFixMe: Flow does not support symbols yet\n get [Symbol.toStringTag]() {\n return 'Messenger';\n }\n\n // eslint-disable-next-line no-use-before-define\n static getInstance: () => Messenger = () => {\n if (!Messenger.instance) {\n Messenger.instance = new Messenger();\n }\n\n return Messenger.instance;\n };\n\n static on: (eventName: string, callback: (...args: Array<any>) => void) => void = (eventName, callback) => {\n Messenger.getInstance().on(eventName, callback);\n };\n\n static once: (eventName: string, callback: (...args: Array<any>) => void) => void = (eventName, callback) => {\n Messenger.getInstance().once(eventName, callback);\n };\n\n static off: (eventName: string, callback: (...args: Array<any>) => void) => void = (eventName, callback) => {\n Messenger.getInstance().off(eventName, callback);\n };\n\n static emit: (eventName: string, ...args: Array<any>) => void = (eventName, ...args) => {\n Messenger.getInstance().emit(eventName, ...args);\n };\n}\n\nexport default Messenger;\n","/* @flow */\n\nconst capitalizeFirstLetter: (s: ?string) => string = (s) => {\n if (!s) {\n return '';\n }\n return s.charAt(0).toUpperCase() + s.slice(1);\n};\n\nconst replaceUnderscoreByNbsp: (s: ?string) => string = (s) => {\n if (!s) {\n return '';\n }\n return s.replace(/_/giu, '\\u00A0');\n};\n\nmodule.exports = {\n capitalizeFirstLetter,\n replaceUnderscoreByNbsp,\n};\n","/* @flow */\n\nclass Timer {\n callback: (error: Error) => void;\n\n timedOut: boolean;\n\n timer: TimeoutID;\n\n constructor(delay: number, callback: (error: Error) => void, error: Error) {\n this.callback = callback;\n this.timedOut = false;\n this.timer = setTimeout(this.timeOutCallback, delay, error);\n }\n\n // $FlowFixMe: Flow does not support symbols yet\n get [Symbol.toStringTag]() {\n return 'Timer';\n }\n\n clear: () => void = () => {\n clearTimeout(this.timer);\n this.timedOut = false;\n };\n\n timeOutCallback: (error: Error) => void = (error) => {\n this.timedOut = true;\n this.callback(error);\n };\n\n hasTimedOut: () => boolean = () => this.timedOut;\n}\n\nmodule.exports = {\n Timer,\n};\n","/* @flow */\n\nexport const isUndefinedOrNull: (value: any) => boolean = (value) => value === undefined || value === null;\n\nexport type Undefined<T> = T | typeof undefined;\n\nexport type BasicFunction = () => void;\n\nexport type BasicPromiseFunction = () => Promise<void>;\n\nexport type KeyValuePair<T> = {| [string]: T |};\n\nexport type ReadOnlyKeyValuePair<T> = {| +[string]: T |};\n","function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}\nexport { _typeof as default };","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nfunction toPropertyKey(t) {\n var i = toPrimitive(t, \"string\");\n return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\nexport { toPropertyKey as default };","import _typeof from \"./typeof.js\";\nfunction toPrimitive(t, r) {\n if (\"object\" != _typeof(t) || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != _typeof(i)) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nexport { toPrimitive as default };","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperties(e, r) {\n for (var t = 0; t < r.length; t++) {\n var o = r[t];\n o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, toPropertyKey(o.key), o);\n }\n}\nfunction _createClass(e, r, t) {\n return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", {\n writable: !1\n }), e;\n}\nexport { _createClass as default };","import _classCallCheck from '@babel/runtime/helpers/esm/classCallCheck';\nimport _createClass from '@babel/runtime/helpers/esm/createClass';\nimport _defineProperty from '@babel/runtime/helpers/esm/defineProperty';\nimport _typeof from '@babel/runtime/helpers/esm/typeof';\n\nvar arr = [];\nvar each = arr.forEach;\nvar slice = arr.slice;\nfunction defaults(obj) {\n each.call(slice.call(arguments, 1), function (source) {\n if (source) {\n for (var prop in source) {\n if (obj[prop] === undefined) obj[prop] = source[prop];\n }\n }\n });\n return obj;\n}\n\nfunction addQueryString(url, params) {\n if (params && _typeof(params) === 'object') {\n var queryString = '',\n e = encodeURIComponent; // Must encode data\n\n for (var paramName in params) {\n queryString += '&' + e(paramName) + '=' + e(params[paramName]);\n }\n\n if (!queryString) {\n return url;\n }\n\n url = url + (url.indexOf('?') !== -1 ? '&' : '?') + queryString.slice(1);\n }\n\n return url;\n} // https://gist.github.com/Xeoncross/7663273\n\n\nfunction ajax(url, options, callback, data, cache) {\n if (data && _typeof(data) === 'object') {\n if (!cache) {\n data['_t'] = new Date();\n } // URL encoded form data must be in querystring format\n\n\n data = addQueryString('', data).slice(1);\n }\n\n if (options.queryStringParams) {\n url = addQueryString(url, options.queryStringParams);\n }\n\n try {\n var x;\n\n if (XMLHttpRequest) {\n x = new XMLHttpRequest();\n } else {\n x = new ActiveXObject('MSXML2.XMLHTTP.3.0');\n }\n\n x.open(data ? 'POST' : 'GET', url, 1);\n\n if (!options.crossDomain) {\n x.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\n }\n\n x.withCredentials = !!options.withCredentials;\n\n if (data) {\n x.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');\n }\n\n if (x.overrideMimeType) {\n x.overrideMimeType(\"application/json\");\n }\n\n var h = options.customHeaders;\n h = typeof h === 'function' ? h() : h;\n\n if (h) {\n for (var i in h) {\n x.setRequestHeader(i, h[i]);\n }\n }\n\n x.onreadystatechange = function () {\n x.readyState > 3 && callback && callback(x.responseText, x);\n };\n\n x.send(data);\n } catch (e) {\n console && console.log(e);\n }\n}\n\nfunction getDefaults() {\n return {\n loadPath: '/locales/{{lng}}/{{ns}}.json',\n addPath: '/locales/add/{{lng}}/{{ns}}',\n allowMultiLoading: false,\n parse: JSON.parse,\n parsePayload: function parsePayload(namespace, key, fallbackValue) {\n return _defineProperty({}, key, fallbackValue || '');\n },\n crossDomain: false,\n ajax: ajax\n };\n}\n\nvar Backend =\n/*#__PURE__*/\nfunction () {\n function Backend(services) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n _classCallCheck(this, Backend);\n\n this.init(services, options);\n this.type = 'backend';\n }\n\n _createClass(Backend, [{\n key: \"init\",\n value: function init(services) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n this.services = services;\n this.options = defaults(options, this.options || {}, getDefaults());\n }\n }, {\n key: \"readMulti\",\n value: function readMulti(languages, namespaces, callback) {\n var loadPath = this.options.loadPath;\n\n if (typeof this.options.loadPath === 'function') {\n loadPath = this.options.loadPath(languages, namespaces);\n }\n\n var url = this.services.interpolator.interpolate(loadPath, {\n lng: languages.join('+'),\n ns: namespaces.join('+')\n });\n this.loadUrl(url, callback);\n }\n }, {\n key: \"read\",\n value: function read(language, namespace, callback) {\n var loadPath = this.options.loadPath;\n\n if (typeof this.options.loadPath === 'function') {\n loadPath = this.options.loadPath([language], [namespace]);\n }\n\n var url = this.services.interpolator.interpolate(loadPath, {\n lng: language,\n ns: namespace\n });\n this.loadUrl(url, callback);\n }\n }, {\n key: \"loadUrl\",\n value: function loadUrl(url, callback) {\n var _this = this;\n\n this.options.ajax(url, this.options, function (data, xhr) {\n if (xhr.status >= 500 && xhr.status < 600) return callback('failed loading ' + url, true\n /* retry */\n );\n if (xhr.status >= 400 && xhr.status < 500) return callback('failed loading ' + url, false\n /* no retry */\n );\n var ret, err;\n\n try {\n ret = _this.options.parse(data, url);\n } catch (e) {\n err = 'failed parsing ' + url + ' to json';\n }\n\n if (err) return callback(err, false);\n callback(null, ret);\n });\n }\n }, {\n key: \"create\",\n value: function create(languages, namespace, key, fallbackValue) {\n var _this2 = this;\n\n if (typeof languages === 'string') languages = [languages];\n var payload = this.options.parsePayload(namespace, key, fallbackValue);\n languages.forEach(function (lng) {\n var url = _this2.services.interpolator.interpolate(_this2.options.addPath, {\n lng: lng,\n ns: namespace\n });\n\n _this2.options.ajax(url, _this2.options, function (data, xhr) {//const statusCode = xhr.status.toString();\n // TODO: if statusCode === 4xx do log\n }, payload);\n });\n }\n }]);\n\n return Backend;\n}();\n\nBackend.type = 'backend';\n\nexport default Backend;\n","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperty(e, r, t) {\n return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[r] = t, e;\n}\nexport { _defineProperty as default };","function _classCallCheck(a, n) {\n if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\");\n}\nexport { _classCallCheck as default };","'use strict';\n\nconst isString = obj => typeof obj === 'string';\nconst defer = () => {\n let res;\n let rej;\n const promise = new Promise((resolve, reject) => {\n res = resolve;\n rej = reject;\n });\n promise.resolve = res;\n promise.reject = rej;\n return promise;\n};\nconst makeString = object => {\n if (object == null) return '';\n return '' + object;\n};\nconst copy = (a, s, t) => {\n a.forEach(m => {\n if (s[m]) t[m] = s[m];\n });\n};\nconst lastOfPathSeparatorRegExp = /###/g;\nconst cleanKey = key => key && key.indexOf('###') > -1 ? key.replace(lastOfPathSeparatorRegExp, '.') : key;\nconst canNotTraverseDeeper = object => !object || isString(object);\nconst getLastOfPath = (object, path, Empty) => {\n const stack = !isString(path) ? path : path.split('.');\n let stackIndex = 0;\n while (stackIndex < stack.length - 1) {\n if (canNotTraverseDeeper(object)) return {};\n const key = cleanKey(stack[stackIndex]);\n if (!object[key] && Empty) object[key] = new Empty();\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n object = object[key];\n } else {\n object = {};\n }\n ++stackIndex;\n }\n if (canNotTraverseDeeper(object)) return {};\n return {\n obj: object,\n k: cleanKey(stack[stackIndex])\n };\n};\nconst setPath = (object, path, newValue) => {\n const {\n obj,\n k\n } = getLastOfPath(object, path, Object);\n if (obj !== undefined || path.length === 1) {\n obj[k] = newValue;\n return;\n }\n let e = path[path.length - 1];\n let p = path.slice(0, path.length - 1);\n let last = getLastOfPath(object, p, Object);\n while (last.obj === undefined && p.length) {\n e = `${p[p.length - 1]}.${e}`;\n p = p.slice(0, p.length - 1);\n last = getLastOfPath(object, p, Object);\n if (last && last.obj && typeof last.obj[`${last.k}.${e}`] !== 'undefined') {\n last.obj = undefined;\n }\n }\n last.obj[`${last.k}.${e}`] = newValue;\n};\nconst pushPath = (object, path, newValue, concat) => {\n const {\n obj,\n k\n } = getLastOfPath(object, path, Object);\n obj[k] = obj[k] || [];\n obj[k].push(newValue);\n};\nconst getPath = (object, path) => {\n const {\n obj,\n k\n } = getLastOfPath(object, path);\n if (!obj) return undefined;\n return obj[k];\n};\nconst getPathWithDefaults = (data, defaultData, key) => {\n const value = getPath(data, key);\n if (value !== undefined) {\n return value;\n }\n return getPath(defaultData, key);\n};\nconst deepExtend = (target, source, overwrite) => {\n for (const prop in source) {\n if (prop !== '__proto__' && prop !== 'constructor') {\n if (prop in target) {\n if (isString(target[prop]) || target[prop] instanceof String || isString(source[prop]) || source[prop] instanceof String) {\n if (overwrite) target[prop] = source[prop];\n } else {\n deepExtend(target[prop], source[prop], overwrite);\n }\n } else {\n target[prop] = source[prop];\n }\n }\n }\n return target;\n};\nconst regexEscape = str => str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, '\\\\$&');\nvar _entityMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '/': '/'\n};\nconst escape = data => {\n if (isString(data)) {\n return data.replace(/[&<>\"'\\/]/g, s => _entityMap[s]);\n }\n return data;\n};\nclass RegExpCache {\n constructor(capacity) {\n this.capacity = capacity;\n this.regExpMap = new Map();\n this.regExpQueue = [];\n }\n getRegExp(pattern) {\n const regExpFromCache = this.regExpMap.get(pattern);\n if (regExpFromCache !== undefined) {\n return regExpFromCache;\n }\n const regExpNew = new RegExp(pattern);\n if (this.regExpQueue.length === this.capacity) {\n this.regExpMap.delete(this.regExpQueue.shift());\n }\n this.regExpMap.set(pattern, regExpNew);\n this.regExpQueue.push(pattern);\n return regExpNew;\n }\n}\nconst chars = [' ', ',', '?', '!', ';'];\nconst looksLikeObjectPathRegExpCache = new RegExpCache(20);\nconst looksLikeObjectPath = (key, nsSeparator, keySeparator) => {\n nsSeparator = nsSeparator || '';\n keySeparator = keySeparator || '';\n const possibleChars = chars.filter(c => nsSeparator.indexOf(c) < 0 && keySeparator.indexOf(c) < 0);\n if (possibleChars.length === 0) return true;\n const r = looksLikeObjectPathRegExpCache.getRegExp(`(${possibleChars.map(c => c === '?' ? '\\\\?' : c).join('|')})`);\n let matched = !r.test(key);\n if (!matched) {\n const ki = key.indexOf(keySeparator);\n if (ki > 0 && !r.test(key.substring(0, ki))) {\n matched = true;\n }\n }\n return matched;\n};\nconst deepFind = function (obj, path) {\n let keySeparator = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '.';\n if (!obj) return undefined;\n if (obj[path]) return obj[path];\n const tokens = path.split(keySeparator);\n let current = obj;\n for (let i = 0; i < tokens.length;) {\n if (!current || typeof current !== 'object') {\n return undefined;\n }\n let next;\n let nextPath = '';\n for (let j = i; j < tokens.length; ++j) {\n if (j !== i) {\n nextPath += keySeparator;\n }\n nextPath += tokens[j];\n next = current[nextPath];\n if (next !== undefined) {\n if (['string', 'number', 'boolean'].indexOf(typeof next) > -1 && j < tokens.length - 1) {\n continue;\n }\n i += j - i + 1;\n break;\n }\n }\n current = next;\n }\n return current;\n};\nconst getCleanedCode = code => code && code.replace('_', '-');\n\nconst consoleLogger = {\n type: 'logger',\n log(args) {\n this.output('log', args);\n },\n warn(args) {\n this.output('warn', args);\n },\n error(args) {\n this.output('error', args);\n },\n output(type, args) {\n if (console && console[type]) console[type].apply(console, args);\n }\n};\nclass Logger {\n constructor(concreteLogger) {\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n this.init(concreteLogger, options);\n }\n init(concreteLogger) {\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n this.prefix = options.prefix || 'i18next:';\n this.logger = concreteLogger || consoleLogger;\n this.options = options;\n this.debug = options.debug;\n }\n log() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n return this.forward(args, 'log', '', true);\n }\n warn() {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n return this.forward(args, 'warn', '', true);\n }\n error() {\n for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n args[_key3] = arguments[_key3];\n }\n return this.forward(args, 'error', '');\n }\n deprecate() {\n for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n args[_key4] = arguments[_key4];\n }\n return this.forward(args, 'warn', 'WARNING DEPRECATED: ', true);\n }\n forward(args, lvl, prefix, debugOnly) {\n if (debugOnly && !this.debug) return null;\n if (isString(args[0])) args[0] = `${prefix}${this.prefix} ${args[0]}`;\n return this.logger[lvl](args);\n }\n create(moduleName) {\n return new Logger(this.logger, {\n ...{\n prefix: `${this.prefix}:${moduleName}:`\n },\n ...this.options\n });\n }\n clone(options) {\n options = options || this.options;\n options.prefix = options.prefix || this.prefix;\n return new Logger(this.logger, options);\n }\n}\nvar baseLogger = new Logger();\n\nclass EventEmitter {\n constructor() {\n this.observers = {};\n }\n on(events, listener) {\n events.split(' ').forEach(event => {\n if (!this.observers[event]) this.observers[event] = new Map();\n const numListeners = this.observers[event].get(listener) || 0;\n this.observers[event].set(listener, numListeners + 1);\n });\n return this;\n }\n off(event, listener) {\n if (!this.observers[event]) return;\n if (!listener) {\n delete this.observers[event];\n return;\n }\n this.observers[event].delete(listener);\n }\n emit(event) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n if (this.observers[event]) {\n const cloned = Array.from(this.observers[event].entries());\n cloned.forEach(_ref => {\n let [observer, numTimesAdded] = _ref;\n for (let i = 0; i < numTimesAdded; i++) {\n observer(...args);\n }\n });\n }\n if (this.observers['*']) {\n const cloned = Array.from(this.observers['*'].entries());\n cloned.forEach(_ref2 => {\n let [observer, numTimesAdded] = _ref2;\n for (let i = 0; i < numTimesAdded; i++) {\n observer.apply(observer, [event, ...args]);\n }\n });\n }\n }\n}\n\nclass ResourceStore extends EventEmitter {\n constructor(data) {\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n ns: ['translation'],\n defaultNS: 'translation'\n };\n super();\n this.data = data || {};\n this.options = options;\n if (this.options.keySeparator === undefined) {\n this.options.keySeparator = '.';\n }\n if (this.options.ignoreJSONStructure === undefined) {\n this.options.ignoreJSONStructure = true;\n }\n }\n addNamespaces(ns) {\n if (this.options.ns.indexOf(ns) < 0) {\n this.options.ns.push(ns);\n }\n }\n removeNamespaces(ns) {\n const index = this.options.ns.indexOf(ns);\n if (index > -1) {\n this.options.ns.splice(index, 1);\n }\n }\n getResource(lng, ns, key) {\n let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n const keySeparator = options.keySeparator !== undefined ? options.keySeparator : this.options.keySeparator;\n const ignoreJSONStructure = options.ignoreJSONStructure !== undefined ? options.ignoreJSONStructure : this.options.ignoreJSONStructure;\n let path;\n if (lng.indexOf('.') > -1) {\n path = lng.split('.');\n } else {\n path = [lng, ns];\n if (key) {\n if (Array.isArray(key)) {\n path.push(...key);\n } else if (isString(key) && keySeparator) {\n path.push(...key.split(keySeparator));\n } else {\n path.push(key);\n }\n }\n }\n const result = getPath(this.data, path);\n if (!result && !ns && !key && lng.indexOf('.') > -1) {\n lng = path[0];\n ns = path[1];\n key = path.slice(2).join('.');\n }\n if (result || !ignoreJSONStructure || !isString(key)) return result;\n return deepFind(this.data && this.data[lng] && this.data[lng][ns], key, keySeparator);\n }\n addResource(lng, ns, key, value) {\n let options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {\n silent: false\n };\n const keySeparator = options.keySeparator !== undefined ? options.keySeparator : this.options.keySeparator;\n let path = [lng, ns];\n if (key) path = path.concat(keySeparator ? key.split(keySeparator) : key);\n if (lng.indexOf('.') > -1) {\n path = lng.split('.');\n value = ns;\n ns = path[1];\n }\n this.addNamespaces(ns);\n setPath(this.data, path, value);\n if (!options.silent) this.emit('added', lng, ns, key, value);\n }\n addResources(lng, ns, resources) {\n let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {\n silent: false\n };\n for (const m in resources) {\n if (isString(resources[m]) || Array.isArray(resources[m])) this.addResource(lng, ns, m, resources[m], {\n silent: true\n });\n }\n if (!options.silent) this.emit('added', lng, ns, resources);\n }\n addResourceBundle(lng, ns, resources, deep, overwrite) {\n let options = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {\n silent: false,\n skipCopy: false\n };\n let path = [lng, ns];\n if (lng.indexOf('.') > -1) {\n path = lng.split('.');\n deep = resources;\n resources = ns;\n ns = path[1];\n }\n this.addNamespaces(ns);\n let pack = getPath(this.data, path) || {};\n if (!options.skipCopy) resources = JSON.parse(JSON.stringify(resources));\n if (deep) {\n deepExtend(pack, resources, overwrite);\n } else {\n pack = {\n ...pack,\n ...resources\n };\n }\n setPath(this.data, path, pack);\n if (!options.silent) this.emit('added', lng, ns, resources);\n }\n removeResourceBundle(lng, ns) {\n if (this.hasResourceBundle(lng, ns)) {\n delete this.data[lng][ns];\n }\n this.removeNamespaces(ns);\n this.emit('removed', lng, ns);\n }\n hasResourceBundle(lng, ns) {\n return this.getResource(lng, ns) !== undefined;\n }\n getResourceBundle(lng, ns) {\n if (!ns) ns = this.options.defaultNS;\n if (this.options.compatibilityAPI === 'v1') return {\n ...{},\n ...this.getResource(lng, ns)\n };\n return this.getResource(lng, ns);\n }\n getDataByLanguage(lng) {\n return this.data[lng];\n }\n hasLanguageSomeTranslations(lng) {\n const data = this.getDataByLanguage(lng);\n const n = data && Object.keys(data) || [];\n return !!n.find(v => data[v] && Object.keys(data[v]).length > 0);\n }\n toJSON() {\n return this.data;\n }\n}\n\nvar postProcessor = {\n processors: {},\n addPostProcessor(module) {\n this.processors[module.name] = module;\n },\n handle(processors, value, key, options, translator) {\n processors.forEach(processor => {\n if (this.processors[processor]) value = this.processors[processor].process(value, key, options, translator);\n });\n return value;\n }\n};\n\nconst checkedLoadedFor = {};\nclass Translator extends EventEmitter {\n constructor(services) {\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n super();\n copy(['resourceStore', 'languageUtils', 'pluralResolver', 'interpolator', 'backendConnector', 'i18nFormat', 'utils'], services, this);\n this.options = options;\n if (this.options.keySeparator === undefined) {\n this.options.keySeparator = '.';\n }\n this.logger = baseLogger.create('translator');\n }\n changeLanguage(lng) {\n if (lng) this.language = lng;\n }\n exists(key) {\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n interpolation: {}\n };\n if (key === undefined || key === null) {\n return false;\n }\n const resolved = this.resolve(key, options);\n return resolved && resolved.res !== undefined;\n }\n extractFromKey(key, options) {\n let nsSeparator = options.nsSeparator !== undefined ? options.nsSeparator : this.options.nsSeparator;\n if (nsSeparator === undefined) nsSeparator = ':';\n const keySeparator = options.keySeparator !== undefined ? options.keySeparator : this.options.keySeparator;\n let namespaces = options.ns || this.options.defaultNS || [];\n const wouldCheckForNsInKey = nsSeparator && key.indexOf(nsSeparator) > -1;\n const seemsNaturalLanguage = !this.options.userDefinedKeySeparator && !options.keySeparator && !this.options.userDefinedNsSeparator && !options.nsSeparator && !looksLikeObjectPath(key, nsSeparator, keySeparator);\n if (wouldCheckForNsInKey && !seemsNaturalLanguage) {\n const m = key.match(this.interpolator.nestingRegexp);\n if (m && m.length > 0) {\n return {\n key,\n namespaces: isString(namespaces) ? [namespaces] : namespaces\n };\n }\n const parts = key.split(nsSeparator);\n if (nsSeparator !== keySeparator || nsSeparator === keySeparator && this.options.ns.indexOf(parts[0]) > -1) namespaces = parts.shift();\n key = parts.join(keySeparator);\n }\n return {\n key,\n namespaces: isString(namespaces) ? [namespaces] : namespaces\n };\n }\n translate(keys, options, lastKey) {\n if (typeof options !== 'object' && this.options.overloadTranslationOptionHandler) {\n options = this.options.overloadTranslationOptionHandler(arguments);\n }\n if (typeof options === 'object') options = {\n ...options\n };\n if (!options) options = {};\n if (keys === undefined || keys === null) return '';\n if (!Array.isArray(keys)) keys = [String(keys)];\n const returnDetails = options.returnDetails !== undefined ? options.returnDetails : this.options.returnDetails;\n const keySeparator = options.keySeparator !== undefined ? options.keySeparator : this.options.keySeparator;\n const {\n key,\n namespaces\n } = this.extractFromKey(keys[keys.length - 1], options);\n const namespace = namespaces[namespaces.length - 1];\n const lng = options.lng || this.language;\n const appendNamespaceToCIMode = options.appendNamespaceToCIMode || this.options.appendNamespaceToCIMode;\n if (lng && lng.toLowerCase() === 'cimode') {\n if (appendNamespaceToCIMode) {\n const nsSeparator = options.nsSeparator || this.options.nsSeparator;\n if (returnDetails) {\n return {\n res: `${namespace}${nsSeparator}${key}`,\n usedKey: key,\n exactUsedKey: key,\n usedLng: lng,\n usedNS: namespace,\n usedParams: this.getUsedParamsDetails(options)\n };\n }\n return `${namespace}${nsSeparator}${key}`;\n }\n if (returnDetails) {\n return {\n res: key,\n usedKey: key,\n exactUsedKey: key,\n usedLng: lng,\n usedNS: namespace,\n usedParams: this.getUsedParamsDetails(options)\n };\n }\n return key;\n }\n const resolved = this.resolve(keys, options);\n let res = resolved && resolved.res;\n const resUsedKey = resolved && resolved.usedKey || key;\n const resExactUsedKey = resolved && resolved.exactUsedKey || key;\n const resType = Object.prototype.toString.apply(res);\n const noObject = ['[object Number]', '[object Function]', '[object RegExp]'];\n const joinArrays = options.joinArrays !== undefined ? options.joinArrays : this.options.joinArrays;\n const handleAsObjectInI18nFormat = !this.i18nFormat || this.i18nFormat.handleAsObject;\n const handleAsObject = !isString(res) && typeof res !== 'boolean' && typeof res !== 'number';\n if (handleAsObjectInI18nFormat && res && handleAsObject && noObject.indexOf(resType) < 0 && !(isString(joinArrays) && Array.isArray(res))) {\n if (!options.returnObjects && !this.options.returnObjects) {\n if (!this.options.returnedObjectHandler) {\n this.logger.warn('accessing an object - but returnObjects options is not enabled!');\n }\n const r = this.options.returnedObjectHandler ? this.options.returnedObjectHandler(resUsedKey, res, {\n ...options,\n ns: namespaces\n }) : `key '${key} (${this.language})' returned an object instead of string.`;\n if (returnDetails) {\n resolved.res = r;\n resolved.usedParams = this.getUsedParamsDetails(options);\n return resolved;\n }\n return r;\n }\n if (keySeparator) {\n const resTypeIsArray = Array.isArray(res);\n const copy = resTypeIsArray ? [] : {};\n const newKeyToUse = resTypeIsArray ? resExactUsedKey : resUsedKey;\n for (const m in res) {\n if (Object.prototype.hasOwnProperty.call(res, m)) {\n const deepKey = `${newKeyToUse}${keySeparator}${m}`;\n copy[m] = this.translate(deepKey, {\n ...options,\n ...{\n joinArrays: false,\n ns: namespaces\n }\n });\n if (copy[m] === deepKey) copy[m] = res[m];\n }\n }\n res = copy;\n }\n } else if (handleAsObjectInI18nFormat && isString(joinArrays) && Array.isArray(res)) {\n res = res.join(joinArrays);\n if (res) res = this.extendTranslation(res, keys, options, lastKey);\n } else {\n let usedDefault = false;\n let usedKey = false;\n const needsPluralHandling = options.count !== undefined && !isString(options.count);\n const hasDefaultValue = Translator.hasDefaultValue(options);\n const defaultValueSuffix = needsPluralHandling ? this.pluralResolver.getSuffix(lng, options.count, options) : '';\n const defaultValueSuffixOrdinalFallback = options.ordinal && needsPluralHandling ? this.pluralResolver.getSuffix(lng, options.count, {\n ordinal: false\n }) : '';\n const needsZeroSuffixLookup = needsPluralHandling && !options.ordinal && options.count === 0 && this.pluralResolver.shouldUseIntlApi();\n const defaultValue = needsZeroSuffixLookup && options[`defaultValue${this.options.pluralSeparator}zero`] || options[`defaultValue${defaultValueSuffix}`] || options[`defaultValue${defaultValueSuffixOrdinalFallback}`] || options.defaultValue;\n if (!this.isValidLookup(res) && hasDefaultValue) {\n usedDefault = true;\n res = defaultValue;\n }\n if (!this.isValidLookup(res)) {\n usedKey = true;\n res = key;\n }\n const missingKeyNoValueFallbackToKey = options.missingKeyNoValueFallbackToKey || this.options.missingKeyNoValueFallbackToKey;\n const resForMissing = missingKeyNoValueFallbackToKey && usedKey ? undefined : res;\n const updateMissing = hasDefaultValue && defaultValue !== res && this.options.updateMissing;\n if (usedKey || usedDefault || updateMissing) {\n this.logger.log(updateMissing ? 'updateKey' : 'missingKey', lng, namespace, key, updateMissing ? defaultValue : res);\n if (keySeparator) {\n const fk = this.resolve(key, {\n ...options,\n keySeparator: false\n });\n if (fk && fk.res) this.logger.warn('Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.');\n }\n let lngs = [];\n const fallbackLngs = this.languageUtils.getFallbackCodes(this.options.fallbackLng, options.lng || this.language);\n if (this.options.saveMissingTo === 'fallback' && fallbackLngs && fallbackLngs[0]) {\n for (let i = 0; i < fallbackLngs.length; i++) {\n lngs.push(fallbackLngs[i]);\n }\n } else if (this.options.saveMissingTo === 'all') {\n lngs = this.languageUtils.toResolveHierarchy(options.lng || this.language);\n } else {\n lngs.push(options.lng || this.language);\n }\n const send = (l, k, specificDefaultValue) => {\n const defaultForMissing = hasDefaultValue && specificDefaultValue !== res ? specificDefaultValue : resForMissing;\n if (this.options.missingKeyHandler) {\n this.options.missingKeyHandler(l, namespace, k, defaultForMissing, updateMissing, options);\n } else if (this.backendConnector && this.backendConnector.saveMissing) {\n this.backendConnector.saveMissing(l, namespace, k, defaultForMissing, updateMissing, options);\n }\n this.emit('missingKey', l, namespace, k, res);\n };\n if (this.options.saveMissing) {\n if (this.options.saveMissingPlurals && needsPluralHandling) {\n lngs.forEach(language => {\n const suffixes = this.pluralResolver.getSuffixes(language, options);\n if (needsZeroSuffixLookup && options[`defaultValue${this.options.pluralSeparator}zero`] && suffixes.indexOf(`${this.options.pluralSeparator}zero`) < 0) {\n suffixes.push(`${this.options.pluralSeparator}zero`);\n }\n suffixes.forEach(suffix => {\n send([language], key + suffix, options[`defaultValue${suffix}`] || defaultValue);\n });\n });\n } else {\n send(lngs, key, defaultValue);\n }\n }\n }\n res = this.extendTranslation(res, keys, options, resolved, lastKey);\n if (usedKey && res === key && this.options.appendNamespaceToMissingKey) res = `${namespace}:${key}`;\n if ((usedKey || usedDefault) && this.options.parseMissingKeyHandler) {\n if (this.options.compatibilityAPI !== 'v1') {\n res = this.options.parseMissingKeyHandler(this.options.appendNamespaceToMissingKey ? `${namespace}:${key}` : key, usedDefault ? res : undefined);\n } else {\n res = this.options.parseMissingKeyHandler(res);\n }\n }\n }\n if (returnDetails) {\n resolved.res = res;\n resolved.usedParams = this.getUsedParamsDetails(options);\n return resolved;\n }\n return res;\n }\n extendTranslation(res, key, options, resolved, lastKey) {\n var _this = this;\n if (this.i18nFormat && this.i18nFormat.parse) {\n res = this.i18nFormat.parse(res, {\n ...this.options.interpolation.defaultVariables,\n ...options\n }, options.lng || this.language || resolved.usedLng, resolved.usedNS, resolved.usedKey, {\n resolved\n });\n } else if (!options.skipInterpolation) {\n if (options.interpolation) this.interpolator.init({\n ...options,\n ...{\n interpolation: {\n ...this.options.interpolation,\n ...options.interpolation\n }\n }\n });\n const skipOnVariables = isString(res) && (options && options.interpolation && options.interpolation.skipOnVariables !== undefined ? options.interpolation.skipOnVariables : this.options.interpolation.skipOnVariables);\n let nestBef;\n if (skipOnVariables) {\n const nb = res.match(this.interpolator.nestingRegexp);\n nestBef = nb && nb.length;\n }\n let data = options.replace && !isString(options.replace) ? options.replace : options;\n if (this.options.interpolation.defaultVariables) data = {\n ...this.options.interpolation.defaultVariables,\n ...data\n };\n res = this.interpolator.interpolate(res, data, options.lng || this.language || resolved.usedLng, options);\n if (skipOnVariables) {\n const na = res.match(this.interpolator.nestingRegexp);\n const nestAft = na && na.length;\n if (nestBef < nestAft) options.nest = false;\n }\n if (!options.lng && this.options.compatibilityAPI !== 'v1' && resolved && resolved.res) options.lng = this.language || resolved.usedLng;\n if (options.nest !== false) res = this.interpolator.nest(res, function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (lastKey && lastKey[0] === args[0] && !options.context) {\n _this.logger.warn(`It seems you are nesting recursively key: ${args[0]} in key: ${key[0]}`);\n return null;\n }\n return _this.translate(...args, key);\n }, options);\n if (options.interpolation) this.interpolator.reset();\n }\n const postProcess = options.postProcess || this.options.postProcess;\n const postProcessorNames = isString(postProcess) ? [postProcess] : postProcess;\n if (res !== undefined && res !== null && postProcessorNames && postProcessorNames.length && options.applyPostProcessor !== false) {\n res = postProcessor.handle(postProcessorNames, res, key, this.options && this.options.postProcessPassResolved ? {\n i18nResolved: {\n ...resolved,\n usedParams: this.getUsedParamsDetails(options)\n },\n ...options\n } : options, this);\n }\n return res;\n }\n resolve(keys) {\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n let found;\n let usedKey;\n let exactUsedKey;\n let usedLng;\n let usedNS;\n if (isString(keys)) keys = [keys];\n keys.forEach(k => {\n if (this.isValidLookup(found)) return;\n const extracted = this.extractFromKey(k, options);\n const key = extracted.key;\n usedKey = key;\n let namespaces = extracted.namespaces;\n if (this.options.fallbackNS) namespaces = namespaces.concat(this.options.fallbackNS);\n const needsPluralHandling = options.count !== undefined && !isString(options.count);\n const needsZeroSuffixLookup = needsPluralHandling && !options.ordinal && options.count === 0 && this.pluralResolver.shouldUseIntlApi();\n const needsContextHandling = options.context !== undefined && (isString(options.context) || typeof options.context === 'number') && options.context !== '';\n const codes = options.lngs ? options.lngs : this.languageUtils.toResolveHierarchy(options.lng || this.language, options.fallbackLng);\n namespaces.forEach(ns => {\n if (this.isValidLookup(found)) return;\n usedNS = ns;\n if (!checkedLoadedFor[`${codes[0]}-${ns}`] && this.utils && this.utils.hasLoadedNamespace && !this.utils.hasLoadedNamespace(usedNS)) {\n checkedLoadedFor[`${codes[0]}-${ns}`] = true;\n this.logger.warn(`key \"${usedKey}\" for languages \"${codes.join(', ')}\" won't get resolved as namespace \"${usedNS}\" was not yet loaded`, 'This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!');\n }\n codes.forEach(code => {\n if (this.isValidLookup(found)) return;\n usedLng = code;\n const finalKeys = [key];\n if (this.i18nFormat && this.i18nFormat.addLookupKeys) {\n this.i18nFormat.addLookupKeys(finalKeys, key, code, ns, options);\n } else {\n let pluralSuffix;\n if (needsPluralHandling) pluralSuffix = this.pluralResolver.getSuffix(code, options.count, options);\n const zeroSuffix = `${this.options.pluralSeparator}zero`;\n const ordinalPrefix = `${this.options.pluralSeparator}ordinal${this.options.pluralSeparator}`;\n if (needsPluralHandling) {\n finalKeys.push(key + pluralSuffix);\n if (options.ordinal && pluralSuffix.indexOf(ordinalPrefix) === 0) {\n finalKeys.push(key + pluralSuffix.replace(ordinalPrefix, this.options.pluralSeparator));\n }\n if (needsZeroSuffixLookup) {\n finalKeys.push(key + zeroSuffix);\n }\n }\n if (needsContextHandling) {\n const contextKey = `${key}${this.options.contextSeparator}${options.context}`;\n finalKeys.push(contextKey);\n if (needsPluralHandling) {\n finalKeys.push(contextKey + pluralSuffix);\n if (options.ordinal && pluralSuffix.indexOf(ordinalPrefix) === 0) {\n finalKeys.push(contextKey + pluralSuffix.replace(ordinalPrefix, this.options.pluralSeparator));\n }\n if (needsZeroSuffixLookup) {\n finalKeys.push(contextKey + zeroSuffix);\n }\n }\n }\n }\n let possibleKey;\n while (possibleKey = finalKeys.pop()) {\n if (!this.isValidLookup(found)) {\n exactUsedKey = possibleKey;\n found = this.getResource(code, ns, possibleKey, options);\n }\n }\n });\n });\n });\n return {\n res: found,\n usedKey,\n exactUsedKey,\n usedLng,\n usedNS\n };\n }\n isValidLookup(res) {\n return res !== undefined && !(!this.options.returnNull && res === null) && !(!this.options.returnEmptyString && res === '');\n }\n getResource(code, ns, key) {\n let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n if (this.i18nFormat && this.i18nFormat.getResource) return this.i18nFormat.getResource(code, ns, key, options);\n return this.resourceStore.getResource(code, ns, key, options);\n }\n getUsedParamsDetails() {\n let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n const optionsKeys = ['defaultValue', 'ordinal', 'context', 'replace', 'lng', 'lngs', 'fallbackLng', 'ns', 'keySeparator', 'nsSeparator', 'returnObjects', 'returnDetails', 'joinArrays', 'postProcess', 'interpolation'];\n const useOptionsReplaceForData = options.replace && !isString(options.replace);\n let data = useOptionsReplaceForData ? options.replace : options;\n if (useOptionsReplaceForData && typeof options.count !== 'undefined') {\n data.count = options.count;\n }\n if (this.options.interpolation.defaultVariables) {\n data = {\n ...this.options.interpolation.defaultVariables,\n ...data\n };\n }\n if (!useOptionsReplaceForData) {\n data = {\n ...data\n };\n for (const key of optionsKeys) {\n delete data[key];\n }\n }\n return data;\n }\n static hasDefaultValue(options) {\n const prefix = 'defaultValue';\n for (const option in options) {\n if (Object.prototype.hasOwnProperty.call(options, option) && prefix === option.substring(0, prefix.length) && undefined !== options[option]) {\n return true;\n }\n }\n return false;\n }\n}\n\nconst capitalize = string => string.charAt(0).toUpperCase() + string.slice(1);\nclass LanguageUtil {\n constructor(options) {\n this.options = options;\n this.supportedLngs = this.options.supportedLngs || false;\n this.logger = baseLogger.create('languageUtils');\n }\n getScriptPartFromCode(code) {\n code = getCleanedCode(code);\n if (!code || code.indexOf('-') < 0) return null;\n const p = code.split('-');\n if (p.length === 2) return null;\n p.pop();\n if (p[p.length - 1].toLowerCase() === 'x') return null;\n return this.formatLanguageCode(p.join('-'));\n }\n getLanguagePartFromCode(code) {\n code = getCleanedCode(code);\n if (!code || code.indexOf('-') < 0) return code;\n const p = code.split('-');\n return this.formatLanguageCode(p[0]);\n }\n formatLanguageCode(code) {\n if (isString(code) && code.indexOf('-') > -1) {\n if (typeof Intl !== 'undefined' && typeof Intl.getCanonicalLocales !== 'undefined') {\n try {\n let formattedCode = Intl.getCanonicalLocales(code)[0];\n if (formattedCode && this.options.lowerCaseLng) {\n formattedCode = formattedCode.toLowerCase();\n }\n if (formattedCode) return formattedCode;\n } catch (e) {}\n }\n const specialCases = ['hans', 'hant', 'latn', 'cyrl', 'cans', 'mong', 'arab'];\n let p = code.split('-');\n if (this.options.lowerCaseLng) {\n p = p.map(part => part.toLowerCase());\n } else if (p.length === 2) {\n p[0] = p[0].toLowerCase();\n p[1] = p[1].toUpperCase();\n if (specialCases.indexOf(p[1].toLowerCase()) > -1) p[1] = capitalize(p[1].toLowerCase());\n } else if (p.length === 3) {\n p[0] = p[0].toLowerCase();\n if (p[1].length === 2) p[1] = p[1].toUpperCase();\n if (p[0] !== 'sgn' && p[2].length === 2) p[2] = p[2].toUpperCase();\n if (specialCases.indexOf(p[1].toLowerCase()) > -1) p[1] = capitalize(p[1].toLowerCase());\n if (specialCases.indexOf(p[2].toLowerCase()) > -1) p[2] = capitalize(p[2].toLowerCase());\n }\n return p.join('-');\n }\n return this.options.cleanCode || this.options.lowerCaseLng ? code.toLowerCase() : code;\n }\n isSupportedCode(code) {\n if (this.options.load === 'languageOnly' || this.options.nonExplicitSupportedLngs) {\n code = this.getLanguagePartFromCode(code);\n }\n return !this.supportedLngs || !this.supportedLngs.length || this.supportedLngs.indexOf(code) > -1;\n }\n getBestMatchFromCodes(codes) {\n if (!codes) return null;\n let found;\n codes.forEach(code => {\n if (found) return;\n const cleanedLng = this.formatLanguageCode(code);\n if (!this.options.supportedLngs || this.isSupportedCode(cleanedLng)) found = cleanedLng;\n });\n if (!found && this.options.supportedLngs) {\n codes.forEach(code => {\n if (found) return;\n const lngOnly = this.getLanguagePartFromCode(code);\n if (this.isSupportedCode(lngOnly)) return found = lngOnly;\n found = this.options.supportedLngs.find(supportedLng => {\n if (supportedLng === lngOnly) return supportedLng;\n if (supportedLng.indexOf('-') < 0 && lngOnly.indexOf('-') < 0) return;\n if (supportedLng.indexOf('-') > 0 && lngOnly.indexOf('-') < 0 && supportedLng.substring(0, supportedLng.indexOf('-')) === lngOnly) return supportedLng;\n if (supportedLng.indexOf(lngOnly) === 0 && lngOnly.length > 1) return supportedLng;\n });\n });\n }\n if (!found) found = this.getFallbackCodes(this.options.fallbackLng)[0];\n return found;\n }\n getFallbackCodes(fallbacks, code) {\n if (!fallbacks) return [];\n if (typeof fallbacks === 'function') fallbacks = fallbacks(code);\n if (isString(fallbacks)) fallbacks = [fallbacks];\n if (Array.isArray(fallbacks)) return fallbacks;\n if (!code) return fallbacks.default || [];\n let found = fallbacks[code];\n if (!found) found = fallbacks[this.getScriptPartFromCode(code)];\n if (!found) found = fallbacks[this.formatLanguageCode(code)];\n if (!found) found = fallbacks[this.getLanguagePartFromCode(code)];\n if (!found) found = fallbacks.default;\n return found || [];\n }\n toResolveHierarchy(code, fallbackCode) {\n const fallbackCodes = this.getFallbackCodes(fallbackCode || this.options.fallbackLng || [], code);\n const codes = [];\n const addCode = c => {\n if (!c) return;\n if (this.isSupportedCode(c)) {\n codes.push(c);\n } else {\n this.logger.warn(`rejecting language code not found in supportedLngs: ${c}`);\n }\n };\n if (isString(code) && (code.indexOf('-') > -1 || code.indexOf('_') > -1)) {\n if (this.options.load !== 'languageOnly') addCode(this.formatLanguageCode(code));\n if (this.options.load !== 'languageOnly' && this.options.load !== 'currentOnly') addCode(this.getScriptPartFromCode(code));\n if (this.options.load !== 'currentOnly') addCode(this.getLanguagePartFromCode(code));\n } else if (isString(code)) {\n addCode(this.formatLanguageCode(code));\n }\n fallbackCodes.forEach(fc => {\n if (codes.indexOf(fc) < 0) addCode(this.formatLanguageCode(fc));\n });\n return codes;\n }\n}\n\nlet sets = [{\n lngs: ['ach', 'ak', 'am', 'arn', 'br', 'fil', 'gun', 'ln', 'mfe', 'mg', 'mi', 'oc', 'pt', 'pt-BR', 'tg', 'tl', 'ti', 'tr', 'uz', 'wa'],\n nr: [1, 2],\n fc: 1\n}, {\n lngs: ['af', 'an', 'ast', 'az', 'bg', 'bn', 'ca', 'da', 'de', 'dev', 'el', 'en', 'eo', 'es', 'et', 'eu', 'fi', 'fo', 'fur', 'fy', 'gl', 'gu', 'ha', 'hi', 'hu', 'hy', 'ia', 'it', 'kk', 'kn', 'ku', 'lb', 'mai', 'ml', 'mn', 'mr', 'nah', 'nap', 'nb', 'ne', 'nl', 'nn', 'no', 'nso', 'pa', 'pap', 'pms', 'ps', 'pt-PT', 'rm', 'sco', 'se', 'si', 'so', 'son', 'sq', 'sv', 'sw', 'ta', 'te', 'tk', 'ur', 'yo'],\n nr: [1, 2],\n fc: 2\n}, {\n lngs: ['ay', 'bo', 'cgg', 'fa', 'ht', 'id', 'ja', 'jbo', 'ka', 'km', 'ko', 'ky', 'lo', 'ms', 'sah', 'su', 'th', 'tt', 'ug', 'vi', 'wo', 'zh'],\n nr: [1],\n fc: 3\n}, {\n lngs: ['be', 'bs', 'cnr', 'dz', 'hr', 'ru', 'sr', 'uk'],\n nr: [1, 2, 5],\n fc: 4\n}, {\n lngs: ['ar'],\n nr: [0, 1, 2, 3, 11, 100],\n fc: 5\n}, {\n lngs: ['cs', 'sk'],\n nr: [1, 2, 5],\n fc: 6\n}, {\n lngs: ['csb', 'pl'],\n nr: [1, 2, 5],\n fc: 7\n}, {\n lngs: ['cy'],\n nr: [1, 2, 3, 8],\n fc: 8\n}, {\n lngs: ['fr'],\n nr: [1, 2],\n fc: 9\n}, {\n lngs: ['ga'],\n nr: [1, 2, 3, 7, 11],\n fc: 10\n}, {\n lngs: ['gd'],\n nr: [1, 2, 3, 20],\n fc: 11\n}, {\n lngs: ['is'],\n nr: [1, 2],\n fc: 12\n}, {\n lngs: ['jv'],\n nr: [0, 1],\n fc: 13\n}, {\n lngs: ['kw'],\n nr: [1, 2, 3, 4],\n fc: 14\n}, {\n lngs: ['lt'],\n nr: [1, 2, 10],\n fc: 15\n}, {\n lngs: ['lv'],\n nr: [1, 2, 0],\n fc: 16\n}, {\n lngs: ['mk'],\n nr: [1, 2],\n fc: 17\n}, {\n lngs: ['mnk'],\n nr: [0, 1, 2],\n fc: 18\n}, {\n lngs: ['mt'],\n nr: [1, 2, 11, 20],\n fc: 19\n}, {\n lngs: ['or'],\n nr: [2, 1],\n fc: 2\n}, {\n lngs: ['ro'],\n nr: [1, 2, 20],\n fc: 20\n}, {\n lngs: ['sl'],\n nr: [5, 1, 2, 3],\n fc: 21\n}, {\n lngs: ['he', 'iw'],\n nr: [1, 2, 20, 21],\n fc: 22\n}];\nlet _rulesPluralsTypes = {\n 1: n => Number(n > 1),\n 2: n => Number(n != 1),\n 3: n => 0,\n 4: n => Number(n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2),\n 5: n => Number(n == 0 ? 0 : n == 1 ? 1 : n == 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5),\n 6: n => Number(n == 1 ? 0 : n >= 2 && n <= 4 ? 1 : 2),\n 7: n => Number(n == 1 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2),\n 8: n => Number(n == 1 ? 0 : n == 2 ? 1 : n != 8 && n != 11 ? 2 : 3),\n 9: n => Number(n >= 2),\n 10: n => Number(n == 1 ? 0 : n == 2 ? 1 : n < 7 ? 2 : n < 11 ? 3 : 4),\n 11: n => Number(n == 1 || n == 11 ? 0 : n == 2 || n == 12 ? 1 : n > 2 && n < 20 ? 2 : 3),\n 12: n => Number(n % 10 != 1 || n % 100 == 11),\n 13: n => Number(n !== 0),\n 14: n => Number(n == 1 ? 0 : n == 2 ? 1 : n == 3 ? 2 : 3),\n 15: n => Number(n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2),\n 16: n => Number(n % 10 == 1 && n % 100 != 11 ? 0 : n !== 0 ? 1 : 2),\n 17: n => Number(n == 1 || n % 10 == 1 && n % 100 != 11 ? 0 : 1),\n 18: n => Number(n == 0 ? 0 : n == 1 ? 1 : 2),\n 19: n => Number(n == 1 ? 0 : n == 0 || n % 100 > 1 && n % 100 < 11 ? 1 : n % 100 > 10 && n % 100 < 20 ? 2 : 3),\n 20: n => Number(n == 1 ? 0 : n == 0 || n % 100 > 0 && n % 100 < 20 ? 1 : 2),\n 21: n => Number(n % 100 == 1 ? 1 : n % 100 == 2 ? 2 : n % 100 == 3 || n % 100 == 4 ? 3 : 0),\n 22: n => Number(n == 1 ? 0 : n == 2 ? 1 : (n < 0 || n > 10) && n % 10 == 0 ? 2 : 3)\n};\nconst nonIntlVersions = ['v1', 'v2', 'v3'];\nconst intlVersions = ['v4'];\nconst suffixesOrder = {\n zero: 0,\n one: 1,\n two: 2,\n few: 3,\n many: 4,\n other: 5\n};\nconst createRules = () => {\n const rules = {};\n sets.forEach(set => {\n set.lngs.forEach(l => {\n rules[l] = {\n numbers: set.nr,\n plurals: _rulesPluralsTypes[set.fc]\n };\n });\n });\n return rules;\n};\nclass PluralResolver {\n constructor(languageUtils) {\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n this.languageUtils = languageUtils;\n this.options = options;\n this.logger = baseLogger.create('pluralResolver');\n if ((!this.options.compatibilityJSON || intlVersions.includes(this.options.compatibilityJSON)) && (typeof Intl === 'undefined' || !Intl.PluralRules)) {\n this.options.compatibilityJSON = 'v3';\n this.logger.error('Your environment seems not to be Intl API compatible, use an Intl.PluralRules polyfill. Will fallback to the compatibilityJSON v3 format handling.');\n }\n this.rules = createRules();\n this.pluralRulesCache = {};\n }\n addRule(lng, obj) {\n this.rules[lng] = obj;\n }\n clearCache() {\n this.pluralRulesCache = {};\n }\n getRule(code) {\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n if (this.shouldUseIntlApi()) {\n const cleanedCode = getCleanedCode(code === 'dev' ? 'en' : code);\n const type = options.ordinal ? 'ordinal' : 'cardinal';\n const cacheKey = JSON.stringify({\n cleanedCode,\n type\n });\n if (cacheKey in this.pluralRulesCache) {\n return this.pluralRulesCache[cacheKey];\n }\n let rule;\n try {\n rule = new Intl.PluralRules(cleanedCode, {\n type\n });\n } catch (err) {\n if (!code.match(/-|_/)) return;\n const lngPart = this.languageUtils.getLanguagePartFromCode(code);\n rule = this.getRule(lngPart, options);\n }\n this.pluralRulesCache[cacheKey] = rule;\n return rule;\n }\n return this.rules[code] || this.rules[this.languageUtils.getLanguagePartFromCode(code)];\n }\n needsPlural(code) {\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n const rule = this.getRule(code, options);\n if (this.shouldUseIntlApi()) {\n return rule && rule.resolvedOptions().pluralCategories.length > 1;\n }\n return rule && rule.numbers.length > 1;\n }\n getPluralFormsOfKey(code, key) {\n let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n return this.getSuffixes(code, options).map(suffix => `${key}${suffix}`);\n }\n getSuffixes(code) {\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n const rule = this.getRule(code, options);\n if (!rule) {\n return [];\n }\n if (this.shouldUseIntlApi()) {\n return rule.resolvedOptions().pluralCategories.sort((pluralCategory1, pluralCategory2) => suffixesOrder[pluralCategory1] - suffixesOrder[pluralCategory2]).map(pluralCategory => `${this.options.prepend}${options.ordinal ? `ordinal${this.options.prepend}` : ''}${pluralCategory}`);\n }\n return rule.numbers.map(number => this.getSuffix(code, number, options));\n }\n getSuffix(code, count) {\n let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n const rule = this.getRule(code, options);\n if (rule) {\n if (this.shouldUseIntlApi()) {\n return `${this.options.prepend}${options.ordinal ? `ordinal${this.options.prepend}` : ''}${rule.select(count)}`;\n }\n return this.getSuffixRetroCompatible(rule, count);\n }\n this.logger.warn(`no plural rule found for: ${code}`);\n return '';\n }\n getSuffixRetroCompatible(rule, count) {\n const idx = rule.noAbs ? rule.plurals(count) : rule.plurals(Math.abs(count));\n let suffix = rule.numbers[idx];\n if (this.options.simplifyPluralSuffix && rule.numbers.length === 2 && rule.numbers[0] === 1) {\n if (suffix === 2) {\n suffix = 'plural';\n } else if (suffix === 1) {\n suffix = '';\n }\n }\n const returnSuffix = () => this.options.prepend && suffix.toString() ? this.options.prepend + suffix.toString() : suffix.toString();\n if (this.options.compatibilityJSON === 'v1') {\n if (suffix === 1) return '';\n if (typeof suffix === 'number') return `_plural_${suffix.toString()}`;\n return returnSuffix();\n } else if (this.options.compatibilityJSON === 'v2') {\n return returnSuffix();\n } else if (this.options.simplifyPluralSuffix && rule.numbers.length === 2 && rule.numbers[0] === 1) {\n return returnSuffix();\n }\n return this.options.prepend && idx.toString() ? this.options.prepend + idx.toString() : idx.toString();\n }\n shouldUseIntlApi() {\n return !nonIntlVersions.includes(this.options.compatibilityJSON);\n }\n}\n\nconst deepFindWithDefaults = function (data, defaultData, key) {\n let keySeparator = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '.';\n let ignoreJSONStructure = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n let path = getPathWithDefaults(data, defaultData, key);\n if (!path && ignoreJSONStructure && isString(key)) {\n path = deepFind(data, key, keySeparator);\n if (path === undefined) path = deepFind(defaultData, key, keySeparator);\n }\n return path;\n};\nconst regexSafe = val => val.replace(/\\$/g, '$$$$');\nclass Interpolator {\n constructor() {\n let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.logger = baseLogger.create('interpolator');\n this.options = options;\n this.format = options.interpolation && options.interpolation.format || (value => value);\n this.init(options);\n }\n init() {\n let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n if (!options.interpolation) options.interpolation = {\n escapeValue: true\n };\n const {\n escape: escape$1,\n escapeValue,\n useRawValueToEscape,\n prefix,\n prefixEscaped,\n suffix,\n suffixEscaped,\n formatSeparator,\n unescapeSuffix,\n unescapePrefix,\n nestingPrefix,\n nestingPrefixEscaped,\n nestingSuffix,\n nestingSuffixEscaped,\n nestingOptionsSeparator,\n maxReplaces,\n alwaysFormat\n } = options.interpolation;\n this.escape = escape$1 !== undefined ? escape$1 : escape;\n this.escapeValue = escapeValue !== undefined ? escapeValue : true;\n this.useRawValueToEscape = useRawValueToEscape !== undefined ? useRawValueToEscape : false;\n this.prefix = prefix ? regexEscape(prefix) : prefixEscaped || '{{';\n this.suffix = suffix ? regexEscape(suffix) : suffixEscaped || '}}';\n this.formatSeparator = formatSeparator || ',';\n this.unescapePrefix = unescapeSuffix ? '' : unescapePrefix || '-';\n this.unescapeSuffix = this.unescapePrefix ? '' : unescapeSuffix || '';\n this.nestingPrefix = nestingPrefix ? regexEscape(nestingPrefix) : nestingPrefixEscaped || regexEscape('$t(');\n this.nestingSuffix = nestingSuffix ? regexEscape(nestingSuffix) : nestingSuffixEscaped || regexEscape(')');\n this.nestingOptionsSeparator = nestingOptionsSeparator || ',';\n this.maxReplaces = maxReplaces || 1000;\n this.alwaysFormat = alwaysFormat !== undefined ? alwaysFormat : false;\n this.resetRegExp();\n }\n reset() {\n if (this.options) this.init(this.options);\n }\n resetRegExp() {\n const getOrResetRegExp = (existingRegExp, pattern) => {\n if (existingRegExp && existingRegExp.source === pattern) {\n existingRegExp.lastIndex = 0;\n return existingRegExp;\n }\n return new RegExp(pattern, 'g');\n };\n this.regexp = getOrResetRegExp(this.regexp, `${this.prefix}(.+?)${this.suffix}`);\n this.regexpUnescape = getOrResetRegExp(this.regexpUnescape, `${this.prefix}${this.unescapePrefix}(.+?)${this.unescapeSuffix}${this.suffix}`);\n this.nestingRegexp = getOrResetRegExp(this.nestingRegexp, `${this.nestingPrefix}(.+?)${this.nestingSuffix}`);\n }\n interpolate(str, data, lng, options) {\n let match;\n let value;\n let replaces;\n const defaultData = this.options && this.options.interpolation && this.options.interpolation.defaultVariables || {};\n const handleFormat = key => {\n if (key.indexOf(this.formatSeparator) < 0) {\n const path = deepFindWithDefaults(data, defaultData, key, this.options.keySeparator, this.options.ignoreJSONStructure);\n return this.alwaysFormat ? this.format(path, undefined, lng, {\n ...options,\n ...data,\n interpolationkey: key\n }) : path;\n }\n const p = key.split(this.formatSeparator);\n const k = p.shift().trim();\n const f = p.join(this.formatSeparator).trim();\n return this.format(deepFindWithDefaults(data, defaultData, k, this.options.keySeparator, this.options.ignoreJSONStructure), f, lng, {\n ...options,\n ...data,\n interpolationkey: k\n });\n };\n this.resetRegExp();\n const missingInterpolationHandler = options && options.missingInterpolationHandler || this.options.missingInterpolationHandler;\n const skipOnVariables = options && options.interpolation && options.interpolation.skipOnVariables !== undefined ? options.interpolation.skipOnVariables : this.options.interpolation.skipOnVariables;\n const todos = [{\n regex: this.regexpUnescape,\n safeValue: val => regexSafe(val)\n }, {\n regex: this.regexp,\n safeValue: val => this.escapeValue ? regexSafe(this.escape(val)) : regexSafe(val)\n }];\n todos.forEach(todo => {\n replaces = 0;\n while (match = todo.regex.exec(str)) {\n const matchedVar = match[1].trim();\n value = handleFormat(matchedVar);\n if (value === undefined) {\n if (typeof missingInterpolationHandler === 'function') {\n const temp = missingInterpolationHandler(str, match, options);\n value = isString(temp) ? temp : '';\n } else if (options && Object.prototype.hasOwnProperty.call(options, matchedVar)) {\n value = '';\n } else if (skipOnVariables) {\n value = match[0];\n continue;\n } else {\n this.logger.warn(`missed to pass in variable ${matchedVar} for interpolating ${str}`);\n value = '';\n }\n } else if (!isString(value) && !this.useRawValueToEscape) {\n value = makeString(value);\n }\n const safeValue = todo.safeValue(value);\n str = str.replace(match[0], safeValue);\n if (skipOnVariables) {\n todo.regex.lastIndex += value.length;\n todo.regex.lastIndex -= match[0].length;\n } else {\n todo.regex.lastIndex = 0;\n }\n replaces++;\n if (replaces >= this.maxReplaces) {\n break;\n }\n }\n });\n return str;\n }\n nest(str, fc) {\n let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n let match;\n let value;\n let clonedOptions;\n const handleHasOptions = (key, inheritedOptions) => {\n const sep = this.nestingOptionsSeparator;\n if (key.indexOf(sep) < 0) return key;\n const c = key.split(new RegExp(`${sep}[ ]*{`));\n let optionsString = `{${c[1]}`;\n key = c[0];\n optionsString = this.interpolate(optionsString, clonedOptions);\n const matchedSingleQuotes = optionsString.match(/'/g);\n const matchedDoubleQuotes = optionsString.match(/\"/g);\n if (matchedSingleQuotes && matchedSingleQuotes.length % 2 === 0 && !matchedDoubleQuotes || matchedDoubleQuotes.length % 2 !== 0) {\n optionsString = optionsString.replace(/'/g, '\"');\n }\n try {\n clonedOptions = JSON.parse(optionsString);\n if (inheritedOptions) clonedOptions = {\n ...inheritedOptions,\n ...clonedOptions\n };\n } catch (e) {\n this.logger.warn(`failed parsing options string in nesting for key ${key}`, e);\n return `${key}${sep}${optionsString}`;\n }\n if (clonedOptions.defaultValue && clonedOptions.defaultValue.indexOf(this.prefix) > -1) delete clonedOptions.defaultValue;\n return key;\n };\n while (match = this.nestingRegexp.exec(str)) {\n let formatters = [];\n clonedOptions = {\n ...options\n };\n clonedOptions = clonedOptions.replace && !isString(clonedOptions.replace) ? clonedOptions.replace : clonedOptions;\n clonedOptions.applyPostProcessor = false;\n delete clonedOptions.defaultValue;\n let doReduce = false;\n if (match[0].indexOf(this.formatSeparator) !== -1 && !/{.*}/.test(match[1])) {\n const r = match[1].split(this.formatSeparator).map(elem => elem.trim());\n match[1] = r.shift();\n formatters = r;\n doReduce = true;\n }\n value = fc(handleHasOptions.call(this, match[1].trim(), clonedOptions), clonedOptions);\n if (value && match[0] === str && !isString(value)) return value;\n if (!isString(value)) value = makeString(value);\n if (!value) {\n this.logger.warn(`missed to resolve ${match[1]} for nesting ${str}`);\n value = '';\n }\n if (doReduce) {\n value = formatters.reduce((v, f) => this.format(v, f, options.lng, {\n ...options,\n interpolationkey: match[1].trim()\n }), value.trim());\n }\n str = str.replace(match[0], value);\n this.regexp.lastIndex = 0;\n }\n return str;\n }\n}\n\nconst parseFormatStr = formatStr => {\n let formatName = formatStr.toLowerCase().trim();\n const formatOptions = {};\n if (formatStr.indexOf('(') > -1) {\n const p = formatStr.split('(');\n formatName = p[0].toLowerCase().trim();\n const optStr = p[1].substring(0, p[1].length - 1);\n if (formatName === 'currency' && optStr.indexOf(':') < 0) {\n if (!formatOptions.currency) formatOptions.currency = optStr.trim();\n } else if (formatName === 'relativetime' && optStr.indexOf(':') < 0) {\n if (!formatOptions.range) formatOptions.range = optStr.trim();\n } else {\n const opts = optStr.split(';');\n opts.forEach(opt => {\n if (opt) {\n const [key, ...rest] = opt.split(':');\n const val = rest.join(':').trim().replace(/^'+|'+$/g, '');\n const trimmedKey = key.trim();\n if (!formatOptions[trimmedKey]) formatOptions[trimmedKey] = val;\n if (val === 'false') formatOptions[trimmedKey] = false;\n if (val === 'true') formatOptions[trimmedKey] = true;\n if (!isNaN(val)) formatOptions[trimmedKey] = parseInt(val, 10);\n }\n });\n }\n }\n return {\n formatName,\n formatOptions\n };\n};\nconst createCachedFormatter = fn => {\n const cache = {};\n return (val, lng, options) => {\n let optForCache = options;\n if (options && options.interpolationkey && options.formatParams && options.formatParams[options.interpolationkey] && options[options.interpolationkey]) {\n optForCache = {\n ...optForCache,\n [options.interpolationkey]: undefined\n };\n }\n const key = lng + JSON.stringify(optForCache);\n let formatter = cache[key];\n if (!formatter) {\n formatter = fn(getCleanedCode(lng), options);\n cache[key] = formatter;\n }\n return formatter(val);\n };\n};\nclass Formatter {\n constructor() {\n let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.logger = baseLogger.create('formatter');\n this.options = options;\n this.formats = {\n number: createCachedFormatter((lng, opt) => {\n const formatter = new Intl.NumberFormat(lng, {\n ...opt\n });\n return val => formatter.format(val);\n }),\n currency: createCachedFormatter((lng, opt) => {\n const formatter = new Intl.NumberFormat(lng, {\n ...opt,\n style: 'currency'\n });\n return val => formatter.format(val);\n }),\n datetime: createCachedFormatter((lng, opt) => {\n const formatter = new Intl.DateTimeFormat(lng, {\n ...opt\n });\n return val => formatter.format(val);\n }),\n relativetime: createCachedFormatter((lng, opt) => {\n const formatter = new Intl.RelativeTimeFormat(lng, {\n ...opt\n });\n return val => formatter.format(val, opt.range || 'day');\n }),\n list: createCachedFormatter((lng, opt) => {\n const formatter = new Intl.ListFormat(lng, {\n ...opt\n });\n return val => formatter.format(val);\n })\n };\n this.init(options);\n }\n init(services) {\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n interpolation: {}\n };\n this.formatSeparator = options.interpolation.formatSeparator || ',';\n }\n add(name, fc) {\n this.formats[name.toLowerCase().trim()] = fc;\n }\n addCached(name, fc) {\n this.formats[name.toLowerCase().trim()] = createCachedFormatter(fc);\n }\n format(value, format, lng) {\n let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n const formats = format.split(this.formatSeparator);\n if (formats.length > 1 && formats[0].indexOf('(') > 1 && formats[0].indexOf(')') < 0 && formats.find(f => f.indexOf(')') > -1)) {\n const lastIndex = formats.findIndex(f => f.indexOf(')') > -1);\n formats[0] = [formats[0], ...formats.splice(1, lastIndex)].join(this.formatSeparator);\n }\n const result = formats.reduce((mem, f) => {\n const {\n formatName,\n formatOptions\n } = parseFormatStr(f);\n if (this.formats[formatName]) {\n let formatted = mem;\n try {\n const valOptions = options && options.formatParams && options.formatParams[options.interpolationkey] || {};\n const l = valOptions.locale || valOptions.lng || options.locale || options.lng || lng;\n formatted = this.formats[formatName](mem, l, {\n ...formatOptions,\n ...options,\n ...valOptions\n });\n } catch (error) {\n this.logger.warn(error);\n }\n return formatted;\n } else {\n this.logger.warn(`there was no format function for ${formatName}`);\n }\n return mem;\n }, value);\n return result;\n }\n}\n\nconst removePending = (q, name) => {\n if (q.pending[name] !== undefined) {\n delete q.pending[name];\n q.pendingCount--;\n }\n};\nclass Connector extends EventEmitter {\n constructor(backend, store, services) {\n let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n super();\n this.backend = backend;\n this.store = store;\n this.services = services;\n this.languageUtils = services.languageUtils;\n this.options = options;\n this.logger = baseLogger.create('backendConnector');\n this.waitingReads = [];\n this.maxParallelReads = options.maxParallelReads || 10;\n this.readingCalls = 0;\n this.maxRetries = options.maxRetries >= 0 ? options.maxRetries : 5;\n this.retryTimeout = options.retryTimeout >= 1 ? options.retryTimeout : 350;\n this.state = {};\n this.queue = [];\n if (this.backend && this.backend.init) {\n this.backend.init(services, options.backend, options);\n }\n }\n queueLoad(languages, namespaces, options, callback) {\n const toLoad = {};\n const pending = {};\n const toLoadLanguages = {};\n const toLoadNamespaces = {};\n languages.forEach(lng => {\n let hasAllNamespaces = true;\n namespaces.forEach(ns => {\n const name = `${lng}|${ns}`;\n if (!options.reload && this.store.hasResourceBundle(lng, ns)) {\n this.state[name] = 2;\n } else if (this.state[name] < 0) ; else if (this.state[name] === 1) {\n if (pending[name] === undefined) pending[name] = true;\n } else {\n this.state[name] = 1;\n hasAllNamespaces = false;\n if (pending[name] === undefined) pending[name] = true;\n if (toLoad[name] === undefined) toLoad[name] = true;\n if (toLoadNamespaces[ns] === undefined) toLoadNamespaces[ns] = true;\n }\n });\n if (!hasAllNamespaces) toLoadLanguages[lng] = true;\n });\n if (Object.keys(toLoad).length || Object.keys(pending).length) {\n this.queue.push({\n pending,\n pendingCount: Object.keys(pending).length,\n loaded: {},\n errors: [],\n callback\n });\n }\n return {\n toLoad: Object.keys(toLoad),\n pending: Object.keys(pending),\n toLoadLanguages: Object.keys(toLoadLanguages),\n toLoadNamespaces: Object.keys(toLoadNamespaces)\n };\n }\n loaded(name, err, data) {\n const s = name.split('|');\n const lng = s[0];\n const ns = s[1];\n if (err) this.emit('failedLoading', lng, ns, err);\n if (!err && data) {\n this.store.addResourceBundle(lng, ns, data, undefined, undefined, {\n skipCopy: true\n });\n }\n this.state[name] = err ? -1 : 2;\n if (err && data) this.state[name] = 0;\n const loaded = {};\n this.queue.forEach(q => {\n pushPath(q.loaded, [lng], ns);\n removePending(q, name);\n if (err) q.errors.push(err);\n if (q.pendingCount === 0 && !q.done) {\n Object.keys(q.loaded).forEach(l => {\n if (!loaded[l]) loaded[l] = {};\n const loadedKeys = q.loaded[l];\n if (loadedKeys.length) {\n loadedKeys.forEach(n => {\n if (loaded[l][n] === undefined) loaded[l][n] = true;\n });\n }\n });\n q.done = true;\n if (q.errors.length) {\n q.callback(q.errors);\n } else {\n q.callback();\n }\n }\n });\n this.emit('loaded', loaded);\n this.queue = this.queue.filter(q => !q.done);\n }\n read(lng, ns, fcName) {\n let tried = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n let wait = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : this.retryTimeout;\n let callback = arguments.length > 5 ? arguments[5] : undefined;\n if (!lng.length) return callback(null, {});\n if (this.readingCalls >= this.maxParallelReads) {\n this.waitingReads.push({\n lng,\n ns,\n fcName,\n tried,\n wait,\n callback\n });\n return;\n }\n this.readingCalls++;\n const resolver = (err, data) => {\n this.readingCalls--;\n if (this.waitingReads.length > 0) {\n const next = this.waitingReads.shift();\n this.read(next.lng, next.ns, next.fcName, next.tried, next.wait, next.callback);\n }\n if (err && data && tried < this.maxRetries) {\n setTimeout(() => {\n this.read.call(this, lng, ns, fcName, tried + 1, wait * 2, callback);\n }, wait);\n return;\n }\n callback(err, data);\n };\n const fc = this.backend[fcName].bind(this.backend);\n if (fc.length === 2) {\n try {\n const r = fc(lng, ns);\n if (r && typeof r.then === 'function') {\n r.then(data => resolver(null, data)).catch(resolver);\n } else {\n resolver(null, r);\n }\n } catch (err) {\n resolver(err);\n }\n return;\n }\n return fc(lng, ns, resolver);\n }\n prepareLoading(languages, namespaces) {\n let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n let callback = arguments.length > 3 ? arguments[3] : undefined;\n if (!this.backend) {\n this.logger.warn('No backend was added via i18next.use. Will not load resources.');\n return callback && callback();\n }\n if (isString(languages)) languages = this.languageUtils.toResolveHierarchy(languages);\n if (isString(namespaces)) namespaces = [namespaces];\n const toLoad = this.queueLoad(languages, namespaces, options, callback);\n if (!toLoad.toLoad.length) {\n if (!toLoad.pending.length) callback();\n return null;\n }\n toLoad.toLoad.forEach(name => {\n this.loadOne(name);\n });\n }\n load(languages, namespaces, callback) {\n this.prepareLoading(languages, namespaces, {}, callback);\n }\n reload(languages, namespaces, callback) {\n this.prepareLoading(languages, namespaces, {\n reload: true\n }, callback);\n }\n loadOne(name) {\n let prefix = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n const s = name.split('|');\n const lng = s[0];\n const ns = s[1];\n this.read(lng, ns, 'read', undefined, undefined, (err, data) => {\n if (err) this.logger.warn(`${prefix}loading namespace ${ns} for language ${lng} failed`, err);\n if (!err && data) this.logger.log(`${prefix}loaded namespace ${ns} for language ${lng}`, data);\n this.loaded(name, err, data);\n });\n }\n saveMissing(languages, namespace, key, fallbackValue, isUpdate) {\n let options = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};\n let clb = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : () => {};\n if (this.services.utils && this.services.utils.hasLoadedNamespace && !this.services.utils.hasLoadedNamespace(namespace)) {\n this.logger.warn(`did not save key \"${key}\" as the namespace \"${namespace}\" was not yet loaded`, 'This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!');\n return;\n }\n if (key === undefined || key === null || key === '') return;\n if (this.backend && this.backend.create) {\n const opts = {\n ...options,\n isUpdate\n };\n const fc = this.backend.create.bind(this.backend);\n if (fc.length < 6) {\n try {\n let r;\n if (fc.length === 5) {\n r = fc(languages, namespace, key, fallbackValue, opts);\n } else {\n r = fc(languages, namespace, key, fallbackValue);\n }\n if (r && typeof r.then === 'function') {\n r.then(data => clb(null, data)).catch(clb);\n } else {\n clb(null, r);\n }\n } catch (err) {\n clb(err);\n }\n } else {\n fc(languages, namespace, key, fallbackValue, clb, opts);\n }\n }\n if (!languages || !languages[0]) return;\n this.store.addResource(languages[0], namespace, key, fallbackValue);\n }\n}\n\nconst get = () => ({\n debug: false,\n initImmediate: true,\n ns: ['translation'],\n defaultNS: ['translation'],\n fallbackLng: ['dev'],\n fallbackNS: false,\n supportedLngs: false,\n nonExplicitSupportedLngs: false,\n load: 'all',\n preload: false,\n simplifyPluralSuffix: true,\n keySeparator: '.',\n nsSeparator: ':',\n pluralSeparator: '_',\n contextSeparator: '_',\n partialBundledLanguages: false,\n saveMissing: false,\n updateMissing: false,\n saveMissingTo: 'fallback',\n saveMissingPlurals: true,\n missingKeyHandler: false,\n missingInterpolationHandler: false,\n postProcess: false,\n postProcessPassResolved: false,\n returnNull: false,\n returnEmptyString: true,\n returnObjects: false,\n joinArrays: false,\n returnedObjectHandler: false,\n parseMissingKeyHandler: false,\n appendNamespaceToMissingKey: false,\n appendNamespaceToCIMode: false,\n overloadTranslationOptionHandler: args => {\n let ret = {};\n if (typeof args[1] === 'object') ret = args[1];\n if (isString(args[1])) ret.defaultValue = args[1];\n if (isString(args[2])) ret.tDescription = args[2];\n if (typeof args[2] === 'object' || typeof args[3] === 'object') {\n const options = args[3] || args[2];\n Object.keys(options).forEach(key => {\n ret[key] = options[key];\n });\n }\n return ret;\n },\n interpolation: {\n escapeValue: true,\n format: value => value,\n prefix: '{{',\n suffix: '}}',\n formatSeparator: ',',\n unescapePrefix: '-',\n nestingPrefix: '$t(',\n nestingSuffix: ')',\n nestingOptionsSeparator: ',',\n maxReplaces: 1000,\n skipOnVariables: true\n }\n});\nconst transformOptions = options => {\n if (isString(options.ns)) options.ns = [options.ns];\n if (isString(options.fallbackLng)) options.fallbackLng = [options.fallbackLng];\n if (isString(options.fallbackNS)) options.fallbackNS = [options.fallbackNS];\n if (options.supportedLngs && options.supportedLngs.indexOf('cimode') < 0) {\n options.supportedLngs = options.supportedLngs.concat(['cimode']);\n }\n return options;\n};\n\nconst noop = () => {};\nconst bindMemberFunctions = inst => {\n const mems = Object.getOwnPropertyNames(Object.getPrototypeOf(inst));\n mems.forEach(mem => {\n if (typeof inst[mem] === 'function') {\n inst[mem] = inst[mem].bind(inst);\n }\n });\n};\nclass I18n extends EventEmitter {\n constructor() {\n let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n let callback = arguments.length > 1 ? arguments[1] : undefined;\n super();\n this.options = transformOptions(options);\n this.services = {};\n this.logger = baseLogger;\n this.modules = {\n external: []\n };\n bindMemberFunctions(this);\n if (callback && !this.isInitialized && !options.isClone) {\n if (!this.options.initImmediate) {\n this.init(options, callback);\n return this;\n }\n setTimeout(() => {\n this.init(options, callback);\n }, 0);\n }\n }\n init() {\n var _this = this;\n let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n let callback = arguments.length > 1 ? arguments[1] : undefined;\n this.isInitializing = true;\n if (typeof options === 'function') {\n callback = options;\n options = {};\n }\n if (!options.defaultNS && options.defaultNS !== false && options.ns) {\n if (isString(options.ns)) {\n options.defaultNS = options.ns;\n } else if (options.ns.indexOf('translation') < 0) {\n options.defaultNS = options.ns[0];\n }\n }\n const defOpts = get();\n this.options = {\n ...defOpts,\n ...this.options,\n ...transformOptions(options)\n };\n if (this.options.compatibilityAPI !== 'v1') {\n this.options.interpolation = {\n ...defOpts.interpolation,\n ...this.options.interpolation\n };\n }\n if (options.keySeparator !== undefined) {\n this.options.userDefinedKeySeparator = options.keySeparator;\n }\n if (options.nsSeparator !== undefined) {\n this.options.userDefinedNsSeparator = options.nsSeparator;\n }\n const createClassOnDemand = ClassOrObject => {\n if (!ClassOrObject) return null;\n if (typeof ClassOrObject === 'function') return new ClassOrObject();\n return ClassOrObject;\n };\n if (!this.options.isClone) {\n if (this.modules.logger) {\n baseLogger.init(createClassOnDemand(this.modules.logger), this.options);\n } else {\n baseLogger.init(null, this.options);\n }\n let formatter;\n if (this.modules.formatter) {\n formatter = this.modules.formatter;\n } else if (typeof Intl !== 'undefined') {\n formatter = Formatter;\n }\n const lu = new LanguageUtil(this.options);\n this.store = new ResourceStore(this.options.resources, this.options);\n const s = this.services;\n s.logger = baseLogger;\n s.resourceStore = this.store;\n s.languageUtils = lu;\n s.pluralResolver = new PluralResolver(lu, {\n prepend: this.options.pluralSeparator,\n compatibilityJSON: this.options.compatibilityJSON,\n simplifyPluralSuffix: this.options.simplifyPluralSuffix\n });\n if (formatter && (!this.options.interpolation.format || this.options.interpolation.format === defOpts.interpolation.format)) {\n s.formatter = createClassOnDemand(formatter);\n s.formatter.init(s, this.options);\n this.options.interpolation.format = s.formatter.format.bind(s.formatter);\n }\n s.interpolator = new Interpolator(this.options);\n s.utils = {\n hasLoadedNamespace: this.hasLoadedNamespace.bind(this)\n };\n s.backendConnector = new Connector(createClassOnDemand(this.modules.backend), s.resourceStore, s, this.options);\n s.backendConnector.on('*', function (event) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n _this.emit(event, ...args);\n });\n if (this.modules.languageDetector) {\n s.languageDetector = createClassOnDemand(this.modules.languageDetector);\n if (s.languageDetector.init) s.languageDetector.init(s, this.options.detection, this.options);\n }\n if (this.modules.i18nFormat) {\n s.i18nFormat = createClassOnDemand(this.modules.i18nFormat);\n if (s.i18nFormat.init) s.i18nFormat.init(this);\n }\n this.translator = new Translator(this.services, this.options);\n this.translator.on('*', function (event) {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n _this.emit(event, ...args);\n });\n this.modules.external.forEach(m => {\n if (m.init) m.init(this);\n });\n }\n this.format = this.options.interpolation.format;\n if (!callback) callback = noop;\n if (this.options.fallbackLng && !this.services.languageDetector && !this.options.lng) {\n const codes = this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);\n if (codes.length > 0 && codes[0] !== 'dev') this.options.lng = codes[0];\n }\n if (!this.services.languageDetector && !this.options.lng) {\n this.logger.warn('init: no languageDetector is used and no lng is defined');\n }\n const storeApi = ['getResource', 'hasResourceBundle', 'getResourceBundle', 'getDataByLanguage'];\n storeApi.forEach(fcName => {\n this[fcName] = function () {\n return _this.store[fcName](...arguments);\n };\n });\n const storeApiChained = ['addResource', 'addResources', 'addResourceBundle', 'removeResourceBundle'];\n storeApiChained.forEach(fcName => {\n this[fcName] = function () {\n _this.store[fcName](...arguments);\n return _this;\n };\n });\n const deferred = defer();\n const load = () => {\n const finish = (err, t) => {\n this.isInitializing = false;\n if (this.isInitialized && !this.initializedStoreOnce) this.logger.warn('init: i18next is already initialized. You should call init just once!');\n this.isInitialized = true;\n if (!this.options.isClone) this.logger.log('initialized', this.options);\n this.emit('initialized', this.options);\n deferred.resolve(t);\n callback(err, t);\n };\n if (this.languages && this.options.compatibilityAPI !== 'v1' && !this.isInitialized) return finish(null, this.t.bind(this));\n this.changeLanguage(this.options.lng, finish);\n };\n if (this.options.resources || !this.options.initImmediate) {\n load();\n } else {\n setTimeout(load, 0);\n }\n return deferred;\n }\n loadResources(language) {\n let callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : noop;\n let usedCallback = callback;\n const usedLng = isString(language) ? language : this.language;\n if (typeof language === 'function') usedCallback = language;\n if (!this.options.resources || this.options.partialBundledLanguages) {\n if (usedLng && usedLng.toLowerCase() === 'cimode' && (!this.options.preload || this.options.preload.length === 0)) return usedCallback();\n const toLoad = [];\n const append = lng => {\n if (!lng) return;\n if (lng === 'cimode') return;\n const lngs = this.services.languageUtils.toResolveHierarchy(lng);\n lngs.forEach(l => {\n if (l === 'cimode') return;\n if (toLoad.indexOf(l) < 0) toLoad.push(l);\n });\n };\n if (!usedLng) {\n const fallbacks = this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);\n fallbacks.forEach(l => append(l));\n } else {\n append(usedLng);\n }\n if (this.options.preload) {\n this.options.preload.forEach(l => append(l));\n }\n this.services.backendConnector.load(toLoad, this.options.ns, e => {\n if (!e && !this.resolvedLanguage && this.language) this.setResolvedLanguage(this.language);\n usedCallback(e);\n });\n } else {\n usedCallback(null);\n }\n }\n reloadResources(lngs, ns, callback) {\n const deferred = defer();\n if (typeof lngs === 'function') {\n callback = lngs;\n lngs = undefined;\n }\n if (typeof ns === 'function') {\n callback = ns;\n ns = undefined;\n }\n if (!lngs) lngs = this.languages;\n if (!ns) ns = this.options.ns;\n if (!callback) callback = noop;\n this.services.backendConnector.reload(lngs, ns, err => {\n deferred.resolve();\n callback(err);\n });\n return deferred;\n }\n use(module) {\n if (!module) throw new Error('You are passing an undefined module! Please check the object you are passing to i18next.use()');\n if (!module.type) throw new Error('You are passing a wrong module! Please check the object you are passing to i18next.use()');\n if (module.type === 'backend') {\n this.modules.backend = module;\n }\n if (module.type === 'logger' || module.log && module.warn && module.error) {\n this.modules.logger = module;\n }\n if (module.type === 'languageDetector') {\n this.modules.languageDetector = module;\n }\n if (module.type === 'i18nFormat') {\n this.modules.i18nFormat = module;\n }\n if (module.type === 'postProcessor') {\n postProcessor.addPostProcessor(module);\n }\n if (module.type === 'formatter') {\n this.modules.formatter = module;\n }\n if (module.type === '3rdParty') {\n this.modules.external.push(module);\n }\n return this;\n }\n setResolvedLanguage(l) {\n if (!l || !this.languages) return;\n if (['cimode', 'dev'].indexOf(l) > -1) return;\n for (let li = 0; li < this.languages.length; li++) {\n const lngInLngs = this.languages[li];\n if (['cimode', 'dev'].indexOf(lngInLngs) > -1) continue;\n if (this.store.hasLanguageSomeTranslations(lngInLngs)) {\n this.resolvedLanguage = lngInLngs;\n break;\n }\n }\n }\n changeLanguage(lng, callback) {\n var _this2 = this;\n this.isLanguageChangingTo = lng;\n const deferred = defer();\n this.emit('languageChanging', lng);\n const setLngProps = l => {\n this.language = l;\n this.languages = this.services.languageUtils.toResolveHierarchy(l);\n this.resolvedLanguage = undefined;\n this.setResolvedLanguage(l);\n };\n const done = (err, l) => {\n if (l) {\n setLngProps(l);\n this.translator.changeLanguage(l);\n this.isLanguageChangingTo = undefined;\n this.emit('languageChanged', l);\n this.logger.log('languageChanged', l);\n } else {\n this.isLanguageChangingTo = undefined;\n }\n deferred.resolve(function () {\n return _this2.t(...arguments);\n });\n if (callback) callback(err, function () {\n return _this2.t(...arguments);\n });\n };\n const setLng = lngs => {\n if (!lng && !lngs && this.services.languageDetector) lngs = [];\n const l = isString(lngs) ? lngs : this.services.languageUtils.getBestMatchFromCodes(lngs);\n if (l) {\n if (!this.language) {\n setLngProps(l);\n }\n if (!this.translator.language) this.translator.changeLanguage(l);\n if (this.services.languageDetector && this.services.languageDetector.cacheUserLanguage) this.services.languageDetector.cacheUserLanguage(l);\n }\n this.loadResources(l, err => {\n done(err, l);\n });\n };\n if (!lng && this.services.languageDetector && !this.services.languageDetector.async) {\n setLng(this.services.languageDetector.detect());\n } else if (!lng && this.services.languageDetector && this.services.languageDetector.async) {\n if (this.services.languageDetector.detect.length === 0) {\n this.services.languageDetector.detect().then(setLng);\n } else {\n this.services.languageDetector.detect(setLng);\n }\n } else {\n setLng(lng);\n }\n return deferred;\n }\n getFixedT(lng, ns, keyPrefix) {\n var _this3 = this;\n const fixedT = function (key, opts) {\n let options;\n if (typeof opts !== 'object') {\n for (var _len3 = arguments.length, rest = new Array(_len3 > 2 ? _len3 - 2 : 0), _key3 = 2; _key3 < _len3; _key3++) {\n rest[_key3 - 2] = arguments[_key3];\n }\n options = _this3.options.overloadTranslationOptionHandler([key, opts].concat(rest));\n } else {\n options = {\n ...opts\n };\n }\n options.lng = options.lng || fixedT.lng;\n options.lngs = options.lngs || fixedT.lngs;\n options.ns = options.ns || fixedT.ns;\n if (options.keyPrefix !== '') options.keyPrefix = options.keyPrefix || keyPrefix || fixedT.keyPrefix;\n const keySeparator = _this3.options.keySeparator || '.';\n let resultKey;\n if (options.keyPrefix && Array.isArray(key)) {\n resultKey = key.map(k => `${options.keyPrefix}${keySeparator}${k}`);\n } else {\n resultKey = options.keyPrefix ? `${options.keyPrefix}${keySeparator}${key}` : key;\n }\n return _this3.t(resultKey, options);\n };\n if (isString(lng)) {\n fixedT.lng = lng;\n } else {\n fixedT.lngs = lng;\n }\n fixedT.ns = ns;\n fixedT.keyPrefix = keyPrefix;\n return fixedT;\n }\n t() {\n return this.translator && this.translator.translate(...arguments);\n }\n exists() {\n return this.translator && this.translator.exists(...arguments);\n }\n setDefaultNamespace(ns) {\n this.options.defaultNS = ns;\n }\n hasLoadedNamespace(ns) {\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n if (!this.isInitialized) {\n this.logger.warn('hasLoadedNamespace: i18next was not initialized', this.languages);\n return false;\n }\n if (!this.languages || !this.languages.length) {\n this.logger.warn('hasLoadedNamespace: i18n.languages were undefined or empty', this.languages);\n return false;\n }\n const lng = options.lng || this.resolvedLanguage || this.languages[0];\n const fallbackLng = this.options ? this.options.fallbackLng : false;\n const lastLng = this.languages[this.languages.length - 1];\n if (lng.toLowerCase() === 'cimode') return true;\n const loadNotPending = (l, n) => {\n const loadState = this.services.backendConnector.state[`${l}|${n}`];\n return loadState === -1 || loadState === 0 || loadState === 2;\n };\n if (options.precheck) {\n const preResult = options.precheck(this, loadNotPending);\n if (preResult !== undefined) return preResult;\n }\n if (this.hasResourceBundle(lng, ns)) return true;\n if (!this.services.backendConnector.backend || this.options.resources && !this.options.partialBundledLanguages) return true;\n if (loadNotPending(lng, ns) && (!fallbackLng || loadNotPending(lastLng, ns))) return true;\n return false;\n }\n loadNamespaces(ns, callback) {\n const deferred = defer();\n if (!this.options.ns) {\n if (callback) callback();\n return Promise.resolve();\n }\n if (isString(ns)) ns = [ns];\n ns.forEach(n => {\n if (this.options.ns.indexOf(n) < 0) this.options.ns.push(n);\n });\n this.loadResources(err => {\n deferred.resolve();\n if (callback) callback(err);\n });\n return deferred;\n }\n loadLanguages(lngs, callback) {\n const deferred = defer();\n if (isString(lngs)) lngs = [lngs];\n const preloaded = this.options.preload || [];\n const newLngs = lngs.filter(lng => preloaded.indexOf(lng) < 0 && this.services.languageUtils.isSupportedCode(lng));\n if (!newLngs.length) {\n if (callback) callback();\n return Promise.resolve();\n }\n this.options.preload = preloaded.concat(newLngs);\n this.loadResources(err => {\n deferred.resolve();\n if (callback) callback(err);\n });\n return deferred;\n }\n dir(lng) {\n if (!lng) lng = this.resolvedLanguage || (this.languages && this.languages.length > 0 ? this.languages[0] : this.language);\n if (!lng) return 'rtl';\n const rtlLngs = ['ar', 'shu', 'sqr', 'ssh', 'xaa', 'yhd', 'yud', 'aao', 'abh', 'abv', 'acm', 'acq', 'acw', 'acx', 'acy', 'adf', 'ads', 'aeb', 'aec', 'afb', 'ajp', 'apc', 'apd', 'arb', 'arq', 'ars', 'ary', 'arz', 'auz', 'avl', 'ayh', 'ayl', 'ayn', 'ayp', 'bbz', 'pga', 'he', 'iw', 'ps', 'pbt', 'pbu', 'pst', 'prp', 'prd', 'ug', 'ur', 'ydd', 'yds', 'yih', 'ji', 'yi', 'hbo', 'men', 'xmn', 'fa', 'jpr', 'peo', 'pes', 'prs', 'dv', 'sam', 'ckb'];\n const languageUtils = this.services && this.services.languageUtils || new LanguageUtil(get());\n return rtlLngs.indexOf(languageUtils.getLanguagePartFromCode(lng)) > -1 || lng.toLowerCase().indexOf('-arab') > 1 ? 'rtl' : 'ltr';\n }\n static createInstance() {\n let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n let callback = arguments.length > 1 ? arguments[1] : undefined;\n return new I18n(options, callback);\n }\n cloneInstance() {\n let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n let callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : noop;\n const forkResourceStore = options.forkResourceStore;\n if (forkResourceStore) delete options.forkResourceStore;\n const mergedOptions = {\n ...this.options,\n ...options,\n ...{\n isClone: true\n }\n };\n const clone = new I18n(mergedOptions);\n if (options.debug !== undefined || options.prefix !== undefined) {\n clone.logger = clone.logger.clone(options);\n }\n const membersToCopy = ['store', 'services', 'language'];\n membersToCopy.forEach(m => {\n clone[m] = this[m];\n });\n clone.services = {\n ...this.services\n };\n clone.services.utils = {\n hasLoadedNamespace: clone.hasLoadedNamespace.bind(clone)\n };\n if (forkResourceStore) {\n clone.store = new ResourceStore(this.store.data, mergedOptions);\n clone.services.resourceStore = clone.store;\n }\n clone.translator = new Translator(clone.services, mergedOptions);\n clone.translator.on('*', function (event) {\n for (var _len4 = arguments.length, args = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {\n args[_key4 - 1] = arguments[_key4];\n }\n clone.emit(event, ...args);\n });\n clone.init(mergedOptions, callback);\n clone.translator.options = mergedOptions;\n clone.translator.backendConnector.services.utils = {\n hasLoadedNamespace: clone.hasLoadedNamespace.bind(clone)\n };\n return clone;\n }\n toJSON() {\n return {\n options: this.options,\n store: this.store,\n language: this.language,\n languages: this.languages,\n resolvedLanguage: this.resolvedLanguage\n };\n }\n}\nconst instance = I18n.createInstance();\ninstance.createInstance = I18n.createInstance;\n\nmodule.exports = instance;\n","/**\n * This file automatically generated from `pre-publish.js`.\n * Do not manually edit.\n */\n\nmodule.exports = {\n \"area\": true,\n \"base\": true,\n \"br\": true,\n \"col\": true,\n \"embed\": true,\n \"hr\": true,\n \"img\": true,\n \"input\": true,\n \"link\": true,\n \"meta\": true,\n \"param\": true,\n \"source\": true,\n \"track\": true,\n \"wbr\": true\n};\n","/**\n * @license React\n * react.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var l=Symbol.for(\"react.element\"),n=Symbol.for(\"react.portal\"),p=Symbol.for(\"react.fragment\"),q=Symbol.for(\"react.strict_mode\"),r=Symbol.for(\"react.profiler\"),t=Symbol.for(\"react.provider\"),u=Symbol.for(\"react.context\"),v=Symbol.for(\"react.forward_ref\"),w=Symbol.for(\"react.suspense\"),x=Symbol.for(\"react.memo\"),y=Symbol.for(\"react.lazy\"),z=Symbol.iterator;function A(a){if(null===a||\"object\"!==typeof a)return null;a=z&&a[z]||a[\"@@iterator\"];return\"function\"===typeof a?a:null}\nvar B={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},C=Object.assign,D={};function E(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B}E.prototype.isReactComponent={};\nE.prototype.setState=function(a,b){if(\"object\"!==typeof a&&\"function\"!==typeof a&&null!=a)throw Error(\"setState(...): takes an object of state variables to update or a function which returns an object of state variables.\");this.updater.enqueueSetState(this,a,b,\"setState\")};E.prototype.forceUpdate=function(a){this.updater.enqueueForceUpdate(this,a,\"forceUpdate\")};function F(){}F.prototype=E.prototype;function G(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B}var H=G.prototype=new F;\nH.constructor=G;C(H,E.prototype);H.isPureReactComponent=!0;var I=Array.isArray,J=Object.prototype.hasOwnProperty,K={current:null},L={key:!0,ref:!0,__self:!0,__source:!0};\nfunction M(a,b,e){var d,c={},k=null,h=null;if(null!=b)for(d in void 0!==b.ref&&(h=b.ref),void 0!==b.key&&(k=\"\"+b.key),b)J.call(b,d)&&!L.hasOwnProperty(d)&&(c[d]=b[d]);var g=arguments.length-2;if(1===g)c.children=e;else if(1<g){for(var f=Array(g),m=0;m<g;m++)f[m]=arguments[m+2];c.children=f}if(a&&a.defaultProps)for(d in g=a.defaultProps,g)void 0===c[d]&&(c[d]=g[d]);return{$$typeof:l,type:a,key:k,ref:h,props:c,_owner:K.current}}\nfunction N(a,b){return{$$typeof:l,type:a.type,key:b,ref:a.ref,props:a.props,_owner:a._owner}}function O(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===l}function escape(a){var b={\"=\":\"=0\",\":\":\"=2\"};return\"$\"+a.replace(/[=:]/g,function(a){return b[a]})}var P=/\\/+/g;function Q(a,b){return\"object\"===typeof a&&null!==a&&null!=a.key?escape(\"\"+a.key):b.toString(36)}\nfunction R(a,b,e,d,c){var k=typeof a;if(\"undefined\"===k||\"boolean\"===k)a=null;var h=!1;if(null===a)h=!0;else switch(k){case \"string\":case \"number\":h=!0;break;case \"object\":switch(a.$$typeof){case l:case n:h=!0}}if(h)return h=a,c=c(h),a=\"\"===d?\".\"+Q(h,0):d,I(c)?(e=\"\",null!=a&&(e=a.replace(P,\"$&/\")+\"/\"),R(c,b,e,\"\",function(a){return a})):null!=c&&(O(c)&&(c=N(c,e+(!c.key||h&&h.key===c.key?\"\":(\"\"+c.key).replace(P,\"$&/\")+\"/\")+a)),b.push(c)),1;h=0;d=\"\"===d?\".\":d+\":\";if(I(a))for(var g=0;g<a.length;g++){k=\na[g];var f=d+Q(k,g);h+=R(k,b,e,f,c)}else if(f=A(a),\"function\"===typeof f)for(a=f.call(a),g=0;!(k=a.next()).done;)k=k.value,f=d+Q(k,g++),h+=R(k,b,e,f,c);else if(\"object\"===k)throw b=String(a),Error(\"Objects are not valid as a React child (found: \"+(\"[object Object]\"===b?\"object with keys {\"+Object.keys(a).join(\", \")+\"}\":b)+\"). If you meant to render a collection of children, use an array instead.\");return h}\nfunction S(a,b,e){if(null==a)return a;var d=[],c=0;R(a,d,\"\",\"\",function(a){return b.call(e,a,c++)});return d}function T(a){if(-1===a._status){var b=a._result;b=b();b.then(function(b){if(0===a._status||-1===a._status)a._status=1,a._result=b},function(b){if(0===a._status||-1===a._status)a._status=2,a._result=b});-1===a._status&&(a._status=0,a._result=b)}if(1===a._status)return a._result.default;throw a._result;}\nvar U={current:null},V={transition:null},W={ReactCurrentDispatcher:U,ReactCurrentBatchConfig:V,ReactCurrentOwner:K};function X(){throw Error(\"act(...) is not supported in production builds of React.\");}\nexports.Children={map:S,forEach:function(a,b,e){S(a,function(){b.apply(this,arguments)},e)},count:function(a){var b=0;S(a,function(){b++});return b},toArray:function(a){return S(a,function(a){return a})||[]},only:function(a){if(!O(a))throw Error(\"React.Children.only expected to receive a single React element child.\");return a}};exports.Component=E;exports.Fragment=p;exports.Profiler=r;exports.PureComponent=G;exports.StrictMode=q;exports.Suspense=w;\nexports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=W;exports.act=X;\nexports.cloneElement=function(a,b,e){if(null===a||void 0===a)throw Error(\"React.cloneElement(...): The argument must be a React element, but you passed \"+a+\".\");var d=C({},a.props),c=a.key,k=a.ref,h=a._owner;if(null!=b){void 0!==b.ref&&(k=b.ref,h=K.current);void 0!==b.key&&(c=\"\"+b.key);if(a.type&&a.type.defaultProps)var g=a.type.defaultProps;for(f in b)J.call(b,f)&&!L.hasOwnProperty(f)&&(d[f]=void 0===b[f]&&void 0!==g?g[f]:b[f])}var f=arguments.length-2;if(1===f)d.children=e;else if(1<f){g=Array(f);\nfor(var m=0;m<f;m++)g[m]=arguments[m+2];d.children=g}return{$$typeof:l,type:a.type,key:c,ref:k,props:d,_owner:h}};exports.createContext=function(a){a={$$typeof:u,_currentValue:a,_currentValue2:a,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null};a.Provider={$$typeof:t,_context:a};return a.Consumer=a};exports.createElement=M;exports.createFactory=function(a){var b=M.bind(null,a);b.type=a;return b};exports.createRef=function(){return{current:null}};\nexports.forwardRef=function(a){return{$$typeof:v,render:a}};exports.isValidElement=O;exports.lazy=function(a){return{$$typeof:y,_payload:{_status:-1,_result:a},_init:T}};exports.memo=function(a,b){return{$$typeof:x,type:a,compare:void 0===b?null:b}};exports.startTransition=function(a){var b=V.transition;V.transition={};try{a()}finally{V.transition=b}};exports.unstable_act=X;exports.useCallback=function(a,b){return U.current.useCallback(a,b)};exports.useContext=function(a){return U.current.useContext(a)};\nexports.useDebugValue=function(){};exports.useDeferredValue=function(a){return U.current.useDeferredValue(a)};exports.useEffect=function(a,b){return U.current.useEffect(a,b)};exports.useId=function(){return U.current.useId()};exports.useImperativeHandle=function(a,b,e){return U.current.useImperativeHandle(a,b,e)};exports.useInsertionEffect=function(a,b){return U.current.useInsertionEffect(a,b)};exports.useLayoutEffect=function(a,b){return U.current.useLayoutEffect(a,b)};\nexports.useMemo=function(a,b){return U.current.useMemo(a,b)};exports.useReducer=function(a,b,e){return U.current.useReducer(a,b,e)};exports.useRef=function(a){return U.current.useRef(a)};exports.useState=function(a){return U.current.useState(a)};exports.useSyncExternalStore=function(a,b,e){return U.current.useSyncExternalStore(a,b,e)};exports.useTransition=function(){return U.current.useTransition()};exports.version=\"18.3.1\";\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react.production.min.js');\n} else {\n module.exports = require('./cjs/react.development.js');\n}\n","// extracted by mini-css-extract-plugin\nexport default {};","// extracted by mini-css-extract-plugin\nexport default {};","'use strict';\nvar isCallable = require('../internals/is-callable');\nvar tryToString = require('../internals/try-to-string');\n\nvar $TypeError = TypeError;\n\n// `Assert: IsCallable(argument) is true`\nmodule.exports = function (argument) {\n if (isCallable(argument)) return argument;\n throw new $TypeError(tryToString(argument) + ' is not a function');\n};\n","'use strict';\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar create = require('../internals/object-create');\nvar defineProperty = require('../internals/object-define-property').f;\n\nvar UNSCOPABLES = wellKnownSymbol('unscopables');\nvar ArrayPrototype = Array.prototype;\n\n// Array.prototype[@@unscopables]\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\nif (ArrayPrototype[UNSCOPABLES] === undefined) {\n defineProperty(ArrayPrototype, UNSCOPABLES, {\n configurable: true,\n value: create(null)\n });\n}\n\n// add a key to Array.prototype[@@unscopables]\nmodule.exports = function (key) {\n ArrayPrototype[UNSCOPABLES][key] = true;\n};\n","'use strict';\nvar isObject = require('../internals/is-object');\n\nvar $String = String;\nvar $TypeError = TypeError;\n\n// `Assert: Type(argument) is Object`\nmodule.exports = function (argument) {\n if (isObject(argument)) return argument;\n throw new $TypeError($String(argument) + ' is not an object');\n};\n","'use strict';\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\nvar createMethod = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIndexedObject($this);\n var length = lengthOfArrayLike(O);\n if (length === 0) return !IS_INCLUDES && -1;\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare -- NaN check\n if (IS_INCLUDES && el !== el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare -- NaN check\n if (value !== value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) {\n if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.includes` method\n // https://tc39.es/ecma262/#sec-array.prototype.includes\n includes: createMethod(true),\n // `Array.prototype.indexOf` method\n // https://tc39.es/ecma262/#sec-array.prototype.indexof\n indexOf: createMethod(false)\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nvar toString = uncurryThis({}.toString);\nvar stringSlice = uncurryThis(''.slice);\n\nmodule.exports = function (it) {\n return stringSlice(toString(it), 8, -1);\n};\n","'use strict';\nvar hasOwn = require('../internals/has-own-property');\nvar ownKeys = require('../internals/own-keys');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\n\nmodule.exports = function (target, source, exceptions) {\n var keys = ownKeys(source);\n var defineProperty = definePropertyModule.f;\n var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (!hasOwn(target, key) && !(exceptions && hasOwn(exceptions, key))) {\n defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n }\n }\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = DESCRIPTORS ? function (object, key, value) {\n return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","'use strict';\nmodule.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n","'use strict';\nvar isCallable = require('../internals/is-callable');\nvar definePropertyModule = require('../internals/object-define-property');\nvar makeBuiltIn = require('../internals/make-built-in');\nvar defineGlobalProperty = require('../internals/define-global-property');\n\nmodule.exports = function (O, key, value, options) {\n if (!options) options = {};\n var simple = options.enumerable;\n var name = options.name !== undefined ? options.name : key;\n if (isCallable(value)) makeBuiltIn(value, name, options);\n if (options.global) {\n if (simple) O[key] = value;\n else defineGlobalProperty(key, value);\n } else {\n try {\n if (!options.unsafe) delete O[key];\n else if (O[key]) simple = true;\n } catch (error) { /* empty */ }\n if (simple) O[key] = value;\n else definePropertyModule.f(O, key, {\n value: value,\n enumerable: false,\n configurable: !options.nonConfigurable,\n writable: !options.nonWritable\n });\n } return O;\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\n\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar defineProperty = Object.defineProperty;\n\nmodule.exports = function (key, value) {\n try {\n defineProperty(globalThis, key, { value: value, configurable: true, writable: true });\n } catch (error) {\n globalThis[key] = value;\n } return value;\n};\n","'use strict';\nvar fails = require('../internals/fails');\n\n// Detect IE8's incomplete defineProperty implementation\nmodule.exports = !fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] !== 7;\n});\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar isObject = require('../internals/is-object');\n\nvar document = globalThis.document;\n// typeof document.createElement is 'object' in old IE\nvar EXISTS = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n return EXISTS ? document.createElement(it) : {};\n};\n","'use strict';\n// IE8- don't enum bug keys\nmodule.exports = [\n 'constructor',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf'\n];\n","'use strict';\nvar globalThis = require('../internals/global-this');\n\nvar navigator = globalThis.navigator;\nvar userAgent = navigator && navigator.userAgent;\n\nmodule.exports = userAgent ? String(userAgent) : '';\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar userAgent = require('../internals/environment-user-agent');\n\nvar process = globalThis.process;\nvar Deno = globalThis.Deno;\nvar versions = process && process.versions || Deno && Deno.version;\nvar v8 = versions && versions.v8;\nvar match, version;\n\nif (v8) {\n match = v8.split('.');\n // in old Chrome, versions of V8 isn't V8 = Chrome / 10\n // but their correct versions are not interesting for us\n version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]);\n}\n\n// BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0`\n// so check `userAgent` even if `.v8` exists, but 0\nif (!version && userAgent) {\n match = userAgent.match(/Edge\\/(\\d+)/);\n if (!match || match[1] >= 74) {\n match = userAgent.match(/Chrome\\/(\\d+)/);\n if (match) version = +match[1];\n }\n}\n\nmodule.exports = version;\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar defineGlobalProperty = require('../internals/define-global-property');\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\nvar isForced = require('../internals/is-forced');\n\n/*\n options.target - name of the target object\n options.global - target is the global object\n options.stat - export as static methods of target\n options.proto - export as prototype methods of target\n options.real - real prototype method for the `pure` version\n options.forced - export even if the native feature is available\n options.bind - bind methods to the target, required for the `pure` version\n options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n options.unsafe - use the simple assignment of property instead of delete + defineProperty\n options.sham - add a flag to not completely full polyfills\n options.enumerable - export as enumerable property\n options.dontCallGetSet - prevent calling a getter on target\n options.name - the .name of the function if it does not match the key\n*/\nmodule.exports = function (options, source) {\n var TARGET = options.target;\n var GLOBAL = options.global;\n var STATIC = options.stat;\n var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n if (GLOBAL) {\n target = globalThis;\n } else if (STATIC) {\n target = globalThis[TARGET] || defineGlobalProperty(TARGET, {});\n } else {\n target = globalThis[TARGET] && globalThis[TARGET].prototype;\n }\n if (target) for (key in source) {\n sourceProperty = source[key];\n if (options.dontCallGetSet) {\n descriptor = getOwnPropertyDescriptor(target, key);\n targetProperty = descriptor && descriptor.value;\n } else targetProperty = target[key];\n FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n // contained in target\n if (!FORCED && targetProperty !== undefined) {\n if (typeof sourceProperty == typeof targetProperty) continue;\n copyConstructorProperties(sourceProperty, targetProperty);\n }\n // add a flag to not completely full polyfills\n if (options.sham || (targetProperty && targetProperty.sham)) {\n createNonEnumerableProperty(sourceProperty, 'sham', true);\n }\n defineBuiltIn(target, key, sourceProperty, options);\n }\n};\n","'use strict';\nmodule.exports = function (exec) {\n try {\n return !!exec();\n } catch (error) {\n return true;\n }\n};\n","'use strict';\nvar fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n // eslint-disable-next-line es/no-function-prototype-bind -- safe\n var test = (function () { /* empty */ }).bind();\n // eslint-disable-next-line no-prototype-builtins -- safe\n return typeof test != 'function' || test.hasOwnProperty('prototype');\n});\n","'use strict';\nvar NATIVE_BIND = require('../internals/function-bind-native');\n\nvar call = Function.prototype.call;\n\nmodule.exports = NATIVE_BIND ? call.bind(call) : function () {\n return call.apply(call, arguments);\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar hasOwn = require('../internals/has-own-property');\n\nvar FunctionPrototype = Function.prototype;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor;\n\nvar EXISTS = hasOwn(FunctionPrototype, 'name');\n// additional protection from minified / mangled / dropped function names\nvar PROPER = EXISTS && (function something() { /* empty */ }).name === 'something';\nvar CONFIGURABLE = EXISTS && (!DESCRIPTORS || (DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable));\n\nmodule.exports = {\n EXISTS: EXISTS,\n PROPER: PROPER,\n CONFIGURABLE: CONFIGURABLE\n};\n","'use strict';\nvar NATIVE_BIND = require('../internals/function-bind-native');\n\nvar FunctionPrototype = Function.prototype;\nvar call = FunctionPrototype.call;\nvar uncurryThisWithBind = NATIVE_BIND && FunctionPrototype.bind.bind(call, call);\n\nmodule.exports = NATIVE_BIND ? uncurryThisWithBind : function (fn) {\n return function () {\n return call.apply(fn, arguments);\n };\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar isCallable = require('../internals/is-callable');\n\nvar aFunction = function (argument) {\n return isCallable(argument) ? argument : undefined;\n};\n\nmodule.exports = function (namespace, method) {\n return arguments.length < 2 ? aFunction(globalThis[namespace]) : globalThis[namespace] && globalThis[namespace][method];\n};\n","'use strict';\nvar aCallable = require('../internals/a-callable');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\n\n// `GetMethod` abstract operation\n// https://tc39.es/ecma262/#sec-getmethod\nmodule.exports = function (V, P) {\n var func = V[P];\n return isNullOrUndefined(func) ? undefined : aCallable(func);\n};\n","'use strict';\nvar check = function (it) {\n return it && it.Math === Math && it;\n};\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nmodule.exports =\n // eslint-disable-next-line es/no-global-this -- safe\n check(typeof globalThis == 'object' && globalThis) ||\n check(typeof window == 'object' && window) ||\n // eslint-disable-next-line no-restricted-globals -- safe\n check(typeof self == 'object' && self) ||\n check(typeof global == 'object' && global) ||\n check(typeof this == 'object' && this) ||\n // eslint-disable-next-line no-new-func -- fallback\n (function () { return this; })() || Function('return this')();\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toObject = require('../internals/to-object');\n\nvar hasOwnProperty = uncurryThis({}.hasOwnProperty);\n\n// `HasOwnProperty` abstract operation\n// https://tc39.es/ecma262/#sec-hasownproperty\n// eslint-disable-next-line es/no-object-hasown -- safe\nmodule.exports = Object.hasOwn || function hasOwn(it, key) {\n return hasOwnProperty(toObject(it), key);\n};\n","'use strict';\nmodule.exports = {};\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('document', 'documentElement');\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar createElement = require('../internals/document-create-element');\n\n// Thanks to IE8 for its funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty(createElement('div'), 'a', {\n get: function () { return 7; }\n }).a !== 7;\n});\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar fails = require('../internals/fails');\nvar classof = require('../internals/classof-raw');\n\nvar $Object = Object;\nvar split = uncurryThis(''.split);\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nmodule.exports = fails(function () {\n // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n // eslint-disable-next-line no-prototype-builtins -- safe\n return !$Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n return classof(it) === 'String' ? split(it, '') : $Object(it);\n} : $Object;\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar isCallable = require('../internals/is-callable');\nvar store = require('../internals/shared-store');\n\nvar functionToString = uncurryThis(Function.toString);\n\n// this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper\nif (!isCallable(store.inspectSource)) {\n store.inspectSource = function (it) {\n return functionToString(it);\n };\n}\n\nmodule.exports = store.inspectSource;\n","'use strict';\nvar NATIVE_WEAK_MAP = require('../internals/weak-map-basic-detection');\nvar globalThis = require('../internals/global-this');\nvar isObject = require('../internals/is-object');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar hasOwn = require('../internals/has-own-property');\nvar shared = require('../internals/shared-store');\nvar sharedKey = require('../internals/shared-key');\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar OBJECT_ALREADY_INITIALIZED = 'Object already initialized';\nvar TypeError = globalThis.TypeError;\nvar WeakMap = globalThis.WeakMap;\nvar set, get, has;\n\nvar enforce = function (it) {\n return has(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n return function (it) {\n var state;\n if (!isObject(it) || (state = get(it)).type !== TYPE) {\n throw new TypeError('Incompatible receiver, ' + TYPE + ' required');\n } return state;\n };\n};\n\nif (NATIVE_WEAK_MAP || shared.state) {\n var store = shared.state || (shared.state = new WeakMap());\n /* eslint-disable no-self-assign -- prototype methods protection */\n store.get = store.get;\n store.has = store.has;\n store.set = store.set;\n /* eslint-enable no-self-assign -- prototype methods protection */\n set = function (it, metadata) {\n if (store.has(it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);\n metadata.facade = it;\n store.set(it, metadata);\n return metadata;\n };\n get = function (it) {\n return store.get(it) || {};\n };\n has = function (it) {\n return store.has(it);\n };\n} else {\n var STATE = sharedKey('state');\n hiddenKeys[STATE] = true;\n set = function (it, metadata) {\n if (hasOwn(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);\n metadata.facade = it;\n createNonEnumerableProperty(it, STATE, metadata);\n return metadata;\n };\n get = function (it) {\n return hasOwn(it, STATE) ? it[STATE] : {};\n };\n has = function (it) {\n return hasOwn(it, STATE);\n };\n}\n\nmodule.exports = {\n set: set,\n get: get,\n has: has,\n enforce: enforce,\n getterFor: getterFor\n};\n","'use strict';\n// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot\nvar documentAll = typeof document == 'object' && document.all;\n\n// `IsCallable` abstract operation\n// https://tc39.es/ecma262/#sec-iscallable\n// eslint-disable-next-line unicorn/no-typeof-undefined -- required for testing\nmodule.exports = typeof documentAll == 'undefined' && documentAll !== undefined ? function (argument) {\n return typeof argument == 'function' || argument === documentAll;\n} : function (argument) {\n return typeof argument == 'function';\n};\n","'use strict';\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\n\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n var value = data[normalize(feature)];\n return value === POLYFILL ? true\n : value === NATIVE ? false\n : isCallable(detection) ? fails(detection)\n : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nmodule.exports = isForced;\n","'use strict';\n// we can't use just `it == null` since of `document.all` special case\n// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot-aec\nmodule.exports = function (it) {\n return it === null || it === undefined;\n};\n","'use strict';\nvar isCallable = require('../internals/is-callable');\n\nmodule.exports = function (it) {\n return typeof it == 'object' ? it !== null : isCallable(it);\n};\n","'use strict';\nmodule.exports = false;\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar isCallable = require('../internals/is-callable');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar $Object = Object;\n\nmodule.exports = USE_SYMBOL_AS_UID ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n var $Symbol = getBuiltIn('Symbol');\n return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, $Object(it));\n};\n","'use strict';\nvar toLength = require('../internals/to-length');\n\n// `LengthOfArrayLike` abstract operation\n// https://tc39.es/ecma262/#sec-lengthofarraylike\nmodule.exports = function (obj) {\n return toLength(obj.length);\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\nvar hasOwn = require('../internals/has-own-property');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar CONFIGURABLE_FUNCTION_NAME = require('../internals/function-name').CONFIGURABLE;\nvar inspectSource = require('../internals/inspect-source');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar enforceInternalState = InternalStateModule.enforce;\nvar getInternalState = InternalStateModule.get;\nvar $String = String;\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar defineProperty = Object.defineProperty;\nvar stringSlice = uncurryThis(''.slice);\nvar replace = uncurryThis(''.replace);\nvar join = uncurryThis([].join);\n\nvar CONFIGURABLE_LENGTH = DESCRIPTORS && !fails(function () {\n return defineProperty(function () { /* empty */ }, 'length', { value: 8 }).length !== 8;\n});\n\nvar TEMPLATE = String(String).split('String');\n\nvar makeBuiltIn = module.exports = function (value, name, options) {\n if (stringSlice($String(name), 0, 7) === 'Symbol(') {\n name = '[' + replace($String(name), /^Symbol\\(([^)]*)\\).*$/, '$1') + ']';\n }\n if (options && options.getter) name = 'get ' + name;\n if (options && options.setter) name = 'set ' + name;\n if (!hasOwn(value, 'name') || (CONFIGURABLE_FUNCTION_NAME && value.name !== name)) {\n if (DESCRIPTORS) defineProperty(value, 'name', { value: name, configurable: true });\n else value.name = name;\n }\n if (CONFIGURABLE_LENGTH && options && hasOwn(options, 'arity') && value.length !== options.arity) {\n defineProperty(value, 'length', { value: options.arity });\n }\n try {\n if (options && hasOwn(options, 'constructor') && options.constructor) {\n if (DESCRIPTORS) defineProperty(value, 'prototype', { writable: false });\n // in V8 ~ Chrome 53, prototypes of some methods, like `Array.prototype.values`, are non-writable\n } else if (value.prototype) value.prototype = undefined;\n } catch (error) { /* empty */ }\n var state = enforceInternalState(value);\n if (!hasOwn(state, 'source')) {\n state.source = join(TEMPLATE, typeof name == 'string' ? name : '');\n } return value;\n};\n\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n// eslint-disable-next-line no-extend-native -- required\nFunction.prototype.toString = makeBuiltIn(function toString() {\n return isCallable(this) && getInternalState(this).source || inspectSource(this);\n}, 'toString');\n","'use strict';\nvar ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `Math.trunc` method\n// https://tc39.es/ecma262/#sec-math.trunc\n// eslint-disable-next-line es/no-math-trunc -- safe\nmodule.exports = Math.trunc || function trunc(x) {\n var n = +x;\n return (n > 0 ? floor : ceil)(n);\n};\n","'use strict';\n/* global ActiveXObject -- old IE, WSH */\nvar anObject = require('../internals/an-object');\nvar definePropertiesModule = require('../internals/object-define-properties');\nvar enumBugKeys = require('../internals/enum-bug-keys');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar html = require('../internals/html');\nvar documentCreateElement = require('../internals/document-create-element');\nvar sharedKey = require('../internals/shared-key');\n\nvar GT = '>';\nvar LT = '<';\nvar PROTOTYPE = 'prototype';\nvar SCRIPT = 'script';\nvar IE_PROTO = sharedKey('IE_PROTO');\n\nvar EmptyConstructor = function () { /* empty */ };\n\nvar scriptTag = function (content) {\n return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\n};\n\n// Create object with fake `null` prototype: use ActiveX Object with cleared prototype\nvar NullProtoObjectViaActiveX = function (activeXDocument) {\n activeXDocument.write(scriptTag(''));\n activeXDocument.close();\n var temp = activeXDocument.parentWindow.Object;\n // eslint-disable-next-line no-useless-assignment -- avoid memory leak\n activeXDocument = null;\n return temp;\n};\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar NullProtoObjectViaIFrame = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = documentCreateElement('iframe');\n var JS = 'java' + SCRIPT + ':';\n var iframeDocument;\n iframe.style.display = 'none';\n html.appendChild(iframe);\n // https://github.com/zloirock/core-js/issues/475\n iframe.src = String(JS);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(scriptTag('document.F=Object'));\n iframeDocument.close();\n return iframeDocument.F;\n};\n\n// Check for document.domain and active x support\n// No need to use active x approach when document.domain is not set\n// see https://github.com/es-shims/es5-shim/issues/150\n// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\n// avoid IE GC bug\nvar activeXDocument;\nvar NullProtoObject = function () {\n try {\n activeXDocument = new ActiveXObject('htmlfile');\n } catch (error) { /* ignore */ }\n NullProtoObject = typeof document != 'undefined'\n ? document.domain && activeXDocument\n ? NullProtoObjectViaActiveX(activeXDocument) // old IE\n : NullProtoObjectViaIFrame()\n : NullProtoObjectViaActiveX(activeXDocument); // WSH\n var length = enumBugKeys.length;\n while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\n return NullProtoObject();\n};\n\nhiddenKeys[IE_PROTO] = true;\n\n// `Object.create` method\n// https://tc39.es/ecma262/#sec-object.create\n// eslint-disable-next-line es/no-object-create -- safe\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n EmptyConstructor[PROTOTYPE] = anObject(O);\n result = new EmptyConstructor();\n EmptyConstructor[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = NullProtoObject();\n return Properties === undefined ? result : definePropertiesModule.f(result, Properties);\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar V8_PROTOTYPE_DEFINE_BUG = require('../internals/v8-prototype-define-bug');\nvar definePropertyModule = require('../internals/object-define-property');\nvar anObject = require('../internals/an-object');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar objectKeys = require('../internals/object-keys');\n\n// `Object.defineProperties` method\n// https://tc39.es/ecma262/#sec-object.defineproperties\n// eslint-disable-next-line es/no-object-defineproperties -- safe\nexports.f = DESCRIPTORS && !V8_PROTOTYPE_DEFINE_BUG ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var props = toIndexedObject(Properties);\n var keys = objectKeys(Properties);\n var length = keys.length;\n var index = 0;\n var key;\n while (length > index) definePropertyModule.f(O, key = keys[index++], props[key]);\n return O;\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\nvar V8_PROTOTYPE_DEFINE_BUG = require('../internals/v8-prototype-define-bug');\nvar anObject = require('../internals/an-object');\nvar toPropertyKey = require('../internals/to-property-key');\n\nvar $TypeError = TypeError;\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar $defineProperty = Object.defineProperty;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nvar ENUMERABLE = 'enumerable';\nvar CONFIGURABLE = 'configurable';\nvar WRITABLE = 'writable';\n\n// `Object.defineProperty` method\n// https://tc39.es/ecma262/#sec-object.defineproperty\nexports.f = DESCRIPTORS ? V8_PROTOTYPE_DEFINE_BUG ? function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPropertyKey(P);\n anObject(Attributes);\n if (typeof O === 'function' && P === 'prototype' && 'value' in Attributes && WRITABLE in Attributes && !Attributes[WRITABLE]) {\n var current = $getOwnPropertyDescriptor(O, P);\n if (current && current[WRITABLE]) {\n O[P] = Attributes.value;\n Attributes = {\n configurable: CONFIGURABLE in Attributes ? Attributes[CONFIGURABLE] : current[CONFIGURABLE],\n enumerable: ENUMERABLE in Attributes ? Attributes[ENUMERABLE] : current[ENUMERABLE],\n writable: false\n };\n }\n } return $defineProperty(O, P, Attributes);\n} : $defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPropertyKey(P);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return $defineProperty(O, P, Attributes);\n } catch (error) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw new $TypeError('Accessors not supported');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar call = require('../internals/function-call');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPropertyKey = require('../internals/to-property-key');\nvar hasOwn = require('../internals/has-own-property');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\n\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor\nexports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPropertyKey(P);\n if (IE8_DOM_DEFINE) try {\n return $getOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (hasOwn(O, P)) return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]);\n};\n","'use strict';\nvar internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\n\n// `Object.getOwnPropertyNames` method\n// https://tc39.es/ecma262/#sec-object.getownpropertynames\n// eslint-disable-next-line es/no-object-getownpropertynames -- safe\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return internalObjectKeys(O, hiddenKeys);\n};\n","'use strict';\n// eslint-disable-next-line es/no-object-getownpropertysymbols -- safe\nexports.f = Object.getOwnPropertySymbols;\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nmodule.exports = uncurryThis({}.isPrototypeOf);\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar hasOwn = require('../internals/has-own-property');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar indexOf = require('../internals/array-includes').indexOf;\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar push = uncurryThis([].push);\n\nmodule.exports = function (object, names) {\n var O = toIndexedObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (hasOwn(O, key = names[i++])) {\n ~indexOf(result, key) || push(result, key);\n }\n return result;\n};\n","'use strict';\nvar internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\n// `Object.keys` method\n// https://tc39.es/ecma262/#sec-object.keys\n// eslint-disable-next-line es/no-object-keys -- safe\nmodule.exports = Object.keys || function keys(O) {\n return internalObjectKeys(O, enumBugKeys);\n};\n","'use strict';\nvar $propertyIsEnumerable = {}.propertyIsEnumerable;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1);\n\n// `Object.prototype.propertyIsEnumerable` method implementation\n// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable\nexports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n var descriptor = getOwnPropertyDescriptor(this, V);\n return !!descriptor && descriptor.enumerable;\n} : $propertyIsEnumerable;\n","'use strict';\nvar call = require('../internals/function-call');\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\n\nvar $TypeError = TypeError;\n\n// `OrdinaryToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-ordinarytoprimitive\nmodule.exports = function (input, pref) {\n var fn, val;\n if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;\n if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input))) return val;\n if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;\n throw new $TypeError(\"Can't convert object to primitive value\");\n};\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar anObject = require('../internals/an-object');\n\nvar concat = uncurryThis([].concat);\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n var keys = getOwnPropertyNamesModule.f(anObject(it));\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys;\n};\n","'use strict';\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\n\nvar $TypeError = TypeError;\n\n// `RequireObjectCoercible` abstract operation\n// https://tc39.es/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n if (isNullOrUndefined(it)) throw new $TypeError(\"Can't call method on \" + it);\n return it;\n};\n","'use strict';\nvar shared = require('../internals/shared');\nvar uid = require('../internals/uid');\n\nvar keys = shared('keys');\n\nmodule.exports = function (key) {\n return keys[key] || (keys[key] = uid(key));\n};\n","'use strict';\nvar IS_PURE = require('../internals/is-pure');\nvar globalThis = require('../internals/global-this');\nvar defineGlobalProperty = require('../internals/define-global-property');\n\nvar SHARED = '__core-js_shared__';\nvar store = module.exports = globalThis[SHARED] || defineGlobalProperty(SHARED, {});\n\n(store.versions || (store.versions = [])).push({\n version: '3.39.0',\n mode: IS_PURE ? 'pure' : 'global',\n copyright: '© 2014-2024 Denis Pushkarev (zloirock.ru)',\n license: 'https://github.com/zloirock/core-js/blob/v3.39.0/LICENSE',\n source: 'https://github.com/zloirock/core-js'\n});\n","'use strict';\nvar store = require('../internals/shared-store');\n\nmodule.exports = function (key, value) {\n return store[key] || (store[key] = value || {});\n};\n","'use strict';\n/* eslint-disable es/no-symbol -- required for testing */\nvar V8_VERSION = require('../internals/environment-v8-version');\nvar fails = require('../internals/fails');\nvar globalThis = require('../internals/global-this');\n\nvar $String = globalThis.String;\n\n// eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n var symbol = Symbol('symbol detection');\n // Chrome 38 Symbol has incorrect toString conversion\n // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances\n // nb: Do not call `String` directly to avoid this being optimized out to `symbol+''` which will,\n // of course, fail.\n return !$String(symbol) || !(Object(symbol) instanceof Symbol) ||\n // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances\n !Symbol.sham && V8_VERSION && V8_VERSION < 41;\n});\n","'use strict';\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\nmodule.exports = function (index, length) {\n var integer = toIntegerOrInfinity(index);\n return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n","'use strict';\n// toObject with fallback for non-array-like ES3 strings\nvar IndexedObject = require('../internals/indexed-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nmodule.exports = function (it) {\n return IndexedObject(requireObjectCoercible(it));\n};\n","'use strict';\nvar trunc = require('../internals/math-trunc');\n\n// `ToIntegerOrInfinity` abstract operation\n// https://tc39.es/ecma262/#sec-tointegerorinfinity\nmodule.exports = function (argument) {\n var number = +argument;\n // eslint-disable-next-line no-self-compare -- NaN check\n return number !== number || number === 0 ? 0 : trunc(number);\n};\n","'use strict';\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.es/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n var len = toIntegerOrInfinity(argument);\n return len > 0 ? min(len, 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n","'use strict';\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nvar $Object = Object;\n\n// `ToObject` abstract operation\n// https://tc39.es/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n return $Object(requireObjectCoercible(argument));\n};\n","'use strict';\nvar call = require('../internals/function-call');\nvar isObject = require('../internals/is-object');\nvar isSymbol = require('../internals/is-symbol');\nvar getMethod = require('../internals/get-method');\nvar ordinaryToPrimitive = require('../internals/ordinary-to-primitive');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar $TypeError = TypeError;\nvar TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\n\n// `ToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-toprimitive\nmodule.exports = function (input, pref) {\n if (!isObject(input) || isSymbol(input)) return input;\n var exoticToPrim = getMethod(input, TO_PRIMITIVE);\n var result;\n if (exoticToPrim) {\n if (pref === undefined) pref = 'default';\n result = call(exoticToPrim, input, pref);\n if (!isObject(result) || isSymbol(result)) return result;\n throw new $TypeError(\"Can't convert object to primitive value\");\n }\n if (pref === undefined) pref = 'number';\n return ordinaryToPrimitive(input, pref);\n};\n","'use strict';\nvar toPrimitive = require('../internals/to-primitive');\nvar isSymbol = require('../internals/is-symbol');\n\n// `ToPropertyKey` abstract operation\n// https://tc39.es/ecma262/#sec-topropertykey\nmodule.exports = function (argument) {\n var key = toPrimitive(argument, 'string');\n return isSymbol(key) ? key : key + '';\n};\n","'use strict';\nvar $String = String;\n\nmodule.exports = function (argument) {\n try {\n return $String(argument);\n } catch (error) {\n return 'Object';\n }\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nvar id = 0;\nvar postfix = Math.random();\nvar toString = uncurryThis(1.0.toString);\n\nmodule.exports = function (key) {\n return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36);\n};\n","'use strict';\n/* eslint-disable es/no-symbol -- required for testing */\nvar NATIVE_SYMBOL = require('../internals/symbol-constructor-detection');\n\nmodule.exports = NATIVE_SYMBOL &&\n !Symbol.sham &&\n typeof Symbol.iterator == 'symbol';\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\n\n// V8 ~ Chrome 36-\n// https://bugs.chromium.org/p/v8/issues/detail?id=3334\nmodule.exports = DESCRIPTORS && fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty(function () { /* empty */ }, 'prototype', {\n value: 42,\n writable: false\n }).prototype !== 42;\n});\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar isCallable = require('../internals/is-callable');\n\nvar WeakMap = globalThis.WeakMap;\n\nmodule.exports = isCallable(WeakMap) && /native code/.test(String(WeakMap));\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar shared = require('../internals/shared');\nvar hasOwn = require('../internals/has-own-property');\nvar uid = require('../internals/uid');\nvar NATIVE_SYMBOL = require('../internals/symbol-constructor-detection');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar Symbol = globalThis.Symbol;\nvar WellKnownSymbolsStore = shared('wks');\nvar createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol['for'] || Symbol : Symbol && Symbol.withoutSetter || uid;\n\nmodule.exports = function (name) {\n if (!hasOwn(WellKnownSymbolsStore, name)) {\n WellKnownSymbolsStore[name] = NATIVE_SYMBOL && hasOwn(Symbol, name)\n ? Symbol[name]\n : createWellKnownSymbol('Symbol.' + name);\n } return WellKnownSymbolsStore[name];\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar $includes = require('../internals/array-includes').includes;\nvar fails = require('../internals/fails');\nvar addToUnscopables = require('../internals/add-to-unscopables');\n\n// FF99+ bug\nvar BROKEN_ON_SPARSE = fails(function () {\n // eslint-disable-next-line es/no-array-prototype-includes -- detection\n return !Array(1).includes();\n});\n\n// `Array.prototype.includes` method\n// https://tc39.es/ecma262/#sec-array.prototype.includes\n$({ target: 'Array', proto: true, forced: BROKEN_ON_SPARSE }, {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('includes');\n","'use strict';\nvar isCallable = require('../internals/is-callable');\nvar tryToString = require('../internals/try-to-string');\n\nvar $TypeError = TypeError;\n\n// `Assert: IsCallable(argument) is true`\nmodule.exports = function (argument) {\n if (isCallable(argument)) return argument;\n throw new $TypeError(tryToString(argument) + ' is not a function');\n};\n","'use strict';\nvar has = require('../internals/map-helpers').has;\n\n// Perform ? RequireInternalSlot(M, [[MapData]])\nmodule.exports = function (it) {\n has(it);\n return it;\n};\n","'use strict';\nvar $TypeError = TypeError;\n\nmodule.exports = function (argument) {\n if (typeof argument == 'number') return argument;\n throw new $TypeError('Argument is not a number');\n};\n","'use strict';\nvar isPossiblePrototype = require('../internals/is-possible-prototype');\n\nvar $String = String;\nvar $TypeError = TypeError;\n\nmodule.exports = function (argument) {\n if (isPossiblePrototype(argument)) return argument;\n throw new $TypeError(\"Can't set \" + $String(argument) + ' as a prototype');\n};\n","'use strict';\nvar has = require('../internals/set-helpers').has;\n\n// Perform ? RequireInternalSlot(M, [[SetData]])\nmodule.exports = function (it) {\n has(it);\n return it;\n};\n","'use strict';\nvar has = require('../internals/weak-map-helpers').has;\n\n// Perform ? RequireInternalSlot(M, [[WeakMapData]])\nmodule.exports = function (it) {\n has(it);\n return it;\n};\n","'use strict';\nvar has = require('../internals/weak-set-helpers').has;\n\n// Perform ? RequireInternalSlot(M, [[WeakSetData]])\nmodule.exports = function (it) {\n has(it);\n return it;\n};\n","'use strict';\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar create = require('../internals/object-create');\nvar defineProperty = require('../internals/object-define-property').f;\n\nvar UNSCOPABLES = wellKnownSymbol('unscopables');\nvar ArrayPrototype = Array.prototype;\n\n// Array.prototype[@@unscopables]\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\nif (ArrayPrototype[UNSCOPABLES] === undefined) {\n defineProperty(ArrayPrototype, UNSCOPABLES, {\n configurable: true,\n value: create(null)\n });\n}\n\n// add a key to Array.prototype[@@unscopables]\nmodule.exports = function (key) {\n ArrayPrototype[UNSCOPABLES][key] = true;\n};\n","'use strict';\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\n\nvar $TypeError = TypeError;\n\nmodule.exports = function (it, Prototype) {\n if (isPrototypeOf(Prototype, it)) return it;\n throw new $TypeError('Incorrect invocation');\n};\n","'use strict';\nvar isObject = require('../internals/is-object');\n\nvar $String = String;\nvar $TypeError = TypeError;\n\n// `Assert: Type(argument) is Object`\nmodule.exports = function (argument) {\n if (isObject(argument)) return argument;\n throw new $TypeError($String(argument) + ' is not an object');\n};\n","'use strict';\n// eslint-disable-next-line es/no-typed-arrays -- safe\nmodule.exports = typeof ArrayBuffer != 'undefined' && typeof DataView != 'undefined';\n","'use strict';\n// FF26- bug: ArrayBuffers are non-extensible, but Object.isExtensible does not report it\nvar fails = require('../internals/fails');\n\nmodule.exports = fails(function () {\n if (typeof ArrayBuffer == 'function') {\n var buffer = new ArrayBuffer(8);\n // eslint-disable-next-line es/no-object-isextensible, es/no-object-defineproperty -- safe\n if (Object.isExtensible(buffer)) Object.defineProperty(buffer, 'a', { value: 8 });\n }\n});\n","'use strict';\nvar NATIVE_ARRAY_BUFFER = require('../internals/array-buffer-basic-detection');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar globalThis = require('../internals/global-this');\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\nvar hasOwn = require('../internals/has-own-property');\nvar classof = require('../internals/classof');\nvar tryToString = require('../internals/try-to-string');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar uid = require('../internals/uid');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar enforceInternalState = InternalStateModule.enforce;\nvar getInternalState = InternalStateModule.get;\nvar Int8Array = globalThis.Int8Array;\nvar Int8ArrayPrototype = Int8Array && Int8Array.prototype;\nvar Uint8ClampedArray = globalThis.Uint8ClampedArray;\nvar Uint8ClampedArrayPrototype = Uint8ClampedArray && Uint8ClampedArray.prototype;\nvar TypedArray = Int8Array && getPrototypeOf(Int8Array);\nvar TypedArrayPrototype = Int8ArrayPrototype && getPrototypeOf(Int8ArrayPrototype);\nvar ObjectPrototype = Object.prototype;\nvar TypeError = globalThis.TypeError;\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar TYPED_ARRAY_TAG = uid('TYPED_ARRAY_TAG');\nvar TYPED_ARRAY_CONSTRUCTOR = 'TypedArrayConstructor';\n// Fixing native typed arrays in Opera Presto crashes the browser, see #595\nvar NATIVE_ARRAY_BUFFER_VIEWS = NATIVE_ARRAY_BUFFER && !!setPrototypeOf && classof(globalThis.opera) !== 'Opera';\nvar TYPED_ARRAY_TAG_REQUIRED = false;\nvar NAME, Constructor, Prototype;\n\nvar TypedArrayConstructorsList = {\n Int8Array: 1,\n Uint8Array: 1,\n Uint8ClampedArray: 1,\n Int16Array: 2,\n Uint16Array: 2,\n Int32Array: 4,\n Uint32Array: 4,\n Float32Array: 4,\n Float64Array: 8\n};\n\nvar BigIntArrayConstructorsList = {\n BigInt64Array: 8,\n BigUint64Array: 8\n};\n\nvar isView = function isView(it) {\n if (!isObject(it)) return false;\n var klass = classof(it);\n return klass === 'DataView'\n || hasOwn(TypedArrayConstructorsList, klass)\n || hasOwn(BigIntArrayConstructorsList, klass);\n};\n\nvar getTypedArrayConstructor = function (it) {\n var proto = getPrototypeOf(it);\n if (!isObject(proto)) return;\n var state = getInternalState(proto);\n return (state && hasOwn(state, TYPED_ARRAY_CONSTRUCTOR)) ? state[TYPED_ARRAY_CONSTRUCTOR] : getTypedArrayConstructor(proto);\n};\n\nvar isTypedArray = function (it) {\n if (!isObject(it)) return false;\n var klass = classof(it);\n return hasOwn(TypedArrayConstructorsList, klass)\n || hasOwn(BigIntArrayConstructorsList, klass);\n};\n\nvar aTypedArray = function (it) {\n if (isTypedArray(it)) return it;\n throw new TypeError('Target is not a typed array');\n};\n\nvar aTypedArrayConstructor = function (C) {\n if (isCallable(C) && (!setPrototypeOf || isPrototypeOf(TypedArray, C))) return C;\n throw new TypeError(tryToString(C) + ' is not a typed array constructor');\n};\n\nvar exportTypedArrayMethod = function (KEY, property, forced, options) {\n if (!DESCRIPTORS) return;\n if (forced) for (var ARRAY in TypedArrayConstructorsList) {\n var TypedArrayConstructor = globalThis[ARRAY];\n if (TypedArrayConstructor && hasOwn(TypedArrayConstructor.prototype, KEY)) try {\n delete TypedArrayConstructor.prototype[KEY];\n } catch (error) {\n // old WebKit bug - some methods are non-configurable\n try {\n TypedArrayConstructor.prototype[KEY] = property;\n } catch (error2) { /* empty */ }\n }\n }\n if (!TypedArrayPrototype[KEY] || forced) {\n defineBuiltIn(TypedArrayPrototype, KEY, forced ? property\n : NATIVE_ARRAY_BUFFER_VIEWS && Int8ArrayPrototype[KEY] || property, options);\n }\n};\n\nvar exportTypedArrayStaticMethod = function (KEY, property, forced) {\n var ARRAY, TypedArrayConstructor;\n if (!DESCRIPTORS) return;\n if (setPrototypeOf) {\n if (forced) for (ARRAY in TypedArrayConstructorsList) {\n TypedArrayConstructor = globalThis[ARRAY];\n if (TypedArrayConstructor && hasOwn(TypedArrayConstructor, KEY)) try {\n delete TypedArrayConstructor[KEY];\n } catch (error) { /* empty */ }\n }\n if (!TypedArray[KEY] || forced) {\n // V8 ~ Chrome 49-50 `%TypedArray%` methods are non-writable non-configurable\n try {\n return defineBuiltIn(TypedArray, KEY, forced ? property : NATIVE_ARRAY_BUFFER_VIEWS && TypedArray[KEY] || property);\n } catch (error) { /* empty */ }\n } else return;\n }\n for (ARRAY in TypedArrayConstructorsList) {\n TypedArrayConstructor = globalThis[ARRAY];\n if (TypedArrayConstructor && (!TypedArrayConstructor[KEY] || forced)) {\n defineBuiltIn(TypedArrayConstructor, KEY, property);\n }\n }\n};\n\nfor (NAME in TypedArrayConstructorsList) {\n Constructor = globalThis[NAME];\n Prototype = Constructor && Constructor.prototype;\n if (Prototype) enforceInternalState(Prototype)[TYPED_ARRAY_CONSTRUCTOR] = Constructor;\n else NATIVE_ARRAY_BUFFER_VIEWS = false;\n}\n\nfor (NAME in BigIntArrayConstructorsList) {\n Constructor = globalThis[NAME];\n Prototype = Constructor && Constructor.prototype;\n if (Prototype) enforceInternalState(Prototype)[TYPED_ARRAY_CONSTRUCTOR] = Constructor;\n}\n\n// WebKit bug - typed arrays constructors prototype is Object.prototype\nif (!NATIVE_ARRAY_BUFFER_VIEWS || !isCallable(TypedArray) || TypedArray === Function.prototype) {\n // eslint-disable-next-line no-shadow -- safe\n TypedArray = function TypedArray() {\n throw new TypeError('Incorrect invocation');\n };\n if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) {\n if (globalThis[NAME]) setPrototypeOf(globalThis[NAME], TypedArray);\n }\n}\n\nif (!NATIVE_ARRAY_BUFFER_VIEWS || !TypedArrayPrototype || TypedArrayPrototype === ObjectPrototype) {\n TypedArrayPrototype = TypedArray.prototype;\n if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) {\n if (globalThis[NAME]) setPrototypeOf(globalThis[NAME].prototype, TypedArrayPrototype);\n }\n}\n\n// WebKit bug - one more object in Uint8ClampedArray prototype chain\nif (NATIVE_ARRAY_BUFFER_VIEWS && getPrototypeOf(Uint8ClampedArrayPrototype) !== TypedArrayPrototype) {\n setPrototypeOf(Uint8ClampedArrayPrototype, TypedArrayPrototype);\n}\n\nif (DESCRIPTORS && !hasOwn(TypedArrayPrototype, TO_STRING_TAG)) {\n TYPED_ARRAY_TAG_REQUIRED = true;\n defineBuiltInAccessor(TypedArrayPrototype, TO_STRING_TAG, {\n configurable: true,\n get: function () {\n return isObject(this) ? this[TYPED_ARRAY_TAG] : undefined;\n }\n });\n for (NAME in TypedArrayConstructorsList) if (globalThis[NAME]) {\n createNonEnumerableProperty(globalThis[NAME], TYPED_ARRAY_TAG, NAME);\n }\n}\n\nmodule.exports = {\n NATIVE_ARRAY_BUFFER_VIEWS: NATIVE_ARRAY_BUFFER_VIEWS,\n TYPED_ARRAY_TAG: TYPED_ARRAY_TAG_REQUIRED && TYPED_ARRAY_TAG,\n aTypedArray: aTypedArray,\n aTypedArrayConstructor: aTypedArrayConstructor,\n exportTypedArrayMethod: exportTypedArrayMethod,\n exportTypedArrayStaticMethod: exportTypedArrayStaticMethod,\n getTypedArrayConstructor: getTypedArrayConstructor,\n isView: isView,\n isTypedArray: isTypedArray,\n TypedArray: TypedArray,\n TypedArrayPrototype: TypedArrayPrototype\n};\n","'use strict';\nvar toObject = require('../internals/to-object');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\n\n// `Array.prototype.fill` method implementation\n// https://tc39.es/ecma262/#sec-array.prototype.fill\nmodule.exports = function fill(value /* , start = 0, end = @length */) {\n var O = toObject(this);\n var length = lengthOfArrayLike(O);\n var argumentsLength = arguments.length;\n var index = toAbsoluteIndex(argumentsLength > 1 ? arguments[1] : undefined, length);\n var end = argumentsLength > 2 ? arguments[2] : undefined;\n var endPos = end === undefined ? length : toAbsoluteIndex(end, length);\n while (endPos > index) O[index++] = value;\n return O;\n};\n","'use strict';\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\nvar createMethod = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIndexedObject($this);\n var length = lengthOfArrayLike(O);\n if (length === 0) return !IS_INCLUDES && -1;\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare -- NaN check\n if (IS_INCLUDES && el !== el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare -- NaN check\n if (value !== value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) {\n if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.includes` method\n // https://tc39.es/ecma262/#sec-array.prototype.includes\n includes: createMethod(true),\n // `Array.prototype.indexOf` method\n // https://tc39.es/ecma262/#sec-array.prototype.indexof\n indexOf: createMethod(false)\n};\n","'use strict';\nvar bind = require('../internals/function-bind-context');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar IndexedObject = require('../internals/indexed-object');\nvar toObject = require('../internals/to-object');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar arraySpeciesCreate = require('../internals/array-species-create');\n\nvar push = uncurryThis([].push);\n\n// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex, filterReject }` methods implementation\nvar createMethod = function (TYPE) {\n var IS_MAP = TYPE === 1;\n var IS_FILTER = TYPE === 2;\n var IS_SOME = TYPE === 3;\n var IS_EVERY = TYPE === 4;\n var IS_FIND_INDEX = TYPE === 6;\n var IS_FILTER_REJECT = TYPE === 7;\n var NO_HOLES = TYPE === 5 || IS_FIND_INDEX;\n return function ($this, callbackfn, that, specificCreate) {\n var O = toObject($this);\n var self = IndexedObject(O);\n var length = lengthOfArrayLike(self);\n var boundFunction = bind(callbackfn, that);\n var index = 0;\n var create = specificCreate || arraySpeciesCreate;\n var target = IS_MAP ? create($this, length) : IS_FILTER || IS_FILTER_REJECT ? create($this, 0) : undefined;\n var value, result;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n value = self[index];\n result = boundFunction(value, index, O);\n if (TYPE) {\n if (IS_MAP) target[index] = result; // map\n else if (result) switch (TYPE) {\n case 3: return true; // some\n case 5: return value; // find\n case 6: return index; // findIndex\n case 2: push(target, value); // filter\n } else switch (TYPE) {\n case 4: return false; // every\n case 7: push(target, value); // filterReject\n }\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.forEach` method\n // https://tc39.es/ecma262/#sec-array.prototype.foreach\n forEach: createMethod(0),\n // `Array.prototype.map` method\n // https://tc39.es/ecma262/#sec-array.prototype.map\n map: createMethod(1),\n // `Array.prototype.filter` method\n // https://tc39.es/ecma262/#sec-array.prototype.filter\n filter: createMethod(2),\n // `Array.prototype.some` method\n // https://tc39.es/ecma262/#sec-array.prototype.some\n some: createMethod(3),\n // `Array.prototype.every` method\n // https://tc39.es/ecma262/#sec-array.prototype.every\n every: createMethod(4),\n // `Array.prototype.find` method\n // https://tc39.es/ecma262/#sec-array.prototype.find\n find: createMethod(5),\n // `Array.prototype.findIndex` method\n // https://tc39.es/ecma262/#sec-array.prototype.findIndex\n findIndex: createMethod(6),\n // `Array.prototype.filterReject` method\n // https://github.com/tc39/proposal-array-filtering\n filterReject: createMethod(7)\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nmodule.exports = uncurryThis([].slice);\n","'use strict';\nvar arraySlice = require('../internals/array-slice');\n\nvar floor = Math.floor;\n\nvar sort = function (array, comparefn) {\n var length = array.length;\n\n if (length < 8) {\n // insertion sort\n var i = 1;\n var element, j;\n\n while (i < length) {\n j = i;\n element = array[i];\n while (j && comparefn(array[j - 1], element) > 0) {\n array[j] = array[--j];\n }\n if (j !== i++) array[j] = element;\n }\n } else {\n // merge sort\n var middle = floor(length / 2);\n var left = sort(arraySlice(array, 0, middle), comparefn);\n var right = sort(arraySlice(array, middle), comparefn);\n var llength = left.length;\n var rlength = right.length;\n var lindex = 0;\n var rindex = 0;\n\n while (lindex < llength || rindex < rlength) {\n array[lindex + rindex] = (lindex < llength && rindex < rlength)\n ? comparefn(left[lindex], right[rindex]) <= 0 ? left[lindex++] : right[rindex++]\n : lindex < llength ? left[lindex++] : right[rindex++];\n }\n }\n\n return array;\n};\n\nmodule.exports = sort;\n","'use strict';\nvar isArray = require('../internals/is-array');\nvar isConstructor = require('../internals/is-constructor');\nvar isObject = require('../internals/is-object');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\nvar $Array = Array;\n\n// a part of `ArraySpeciesCreate` abstract operation\n// https://tc39.es/ecma262/#sec-arrayspeciescreate\nmodule.exports = function (originalArray) {\n var C;\n if (isArray(originalArray)) {\n C = originalArray.constructor;\n // cross-realm fallback\n if (isConstructor(C) && (C === $Array || isArray(C.prototype))) C = undefined;\n else if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return C === undefined ? $Array : C;\n};\n","'use strict';\nvar arraySpeciesConstructor = require('../internals/array-species-constructor');\n\n// `ArraySpeciesCreate` abstract operation\n// https://tc39.es/ecma262/#sec-arrayspeciescreate\nmodule.exports = function (originalArray, length) {\n return new (arraySpeciesConstructor(originalArray))(length === 0 ? 0 : length);\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar aCallable = require('../internals/a-callable');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar toObject = require('../internals/to-object');\nvar MapHelpers = require('../internals/map-helpers');\nvar iterate = require('../internals/map-iterate');\n\nvar Map = MapHelpers.Map;\nvar mapHas = MapHelpers.has;\nvar mapSet = MapHelpers.set;\nvar push = uncurryThis([].push);\n\n// `Array.prototype.uniqueBy` method\n// https://github.com/tc39/proposal-array-unique\nmodule.exports = function uniqueBy(resolver) {\n var that = toObject(this);\n var length = lengthOfArrayLike(that);\n var result = [];\n var map = new Map();\n var resolverFunction = !isNullOrUndefined(resolver) ? aCallable(resolver) : function (value) {\n return value;\n };\n var index, item, key;\n for (index = 0; index < length; index++) {\n item = that[index];\n key = resolverFunction(item);\n if (!mapHas(map, key)) mapSet(map, key, item);\n }\n iterate(map, function (value) {\n push(result, value);\n });\n return result;\n};\n","'use strict';\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var called = 0;\n var iteratorWithReturn = {\n next: function () {\n return { done: !!called++ };\n },\n 'return': function () {\n SAFE_CLOSING = true;\n }\n };\n iteratorWithReturn[ITERATOR] = function () {\n return this;\n };\n // eslint-disable-next-line es/no-array-from, no-throw-literal -- required for testing\n Array.from(iteratorWithReturn, function () { throw 2; });\n} catch (error) { /* empty */ }\n\nmodule.exports = function (exec, SKIP_CLOSING) {\n try {\n if (!SKIP_CLOSING && !SAFE_CLOSING) return false;\n } catch (error) { return false; } // workaround of old WebKit + `eval` bug\n var ITERATION_SUPPORT = false;\n try {\n var object = {};\n object[ITERATOR] = function () {\n return {\n next: function () {\n return { done: ITERATION_SUPPORT = true };\n }\n };\n };\n exec(object);\n } catch (error) { /* empty */ }\n return ITERATION_SUPPORT;\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nvar toString = uncurryThis({}.toString);\nvar stringSlice = uncurryThis(''.slice);\n\nmodule.exports = function (it) {\n return stringSlice(toString(it), 8, -1);\n};\n","'use strict';\nvar TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar isCallable = require('../internals/is-callable');\nvar classofRaw = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar $Object = Object;\n\n// ES3 wrong here\nvar CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) === 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (error) { /* empty */ }\n};\n\n// getting tag from ES6+ `Object.prototype.toString`\nmodule.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) {\n var O, tag, result;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (tag = tryGet(O = $Object(it), TO_STRING_TAG)) == 'string' ? tag\n // builtinTag case\n : CORRECT_ARGUMENTS ? classofRaw(O)\n // ES3 arguments fallback\n : (result = classofRaw(O)) === 'Object' && isCallable(O.callee) ? 'Arguments' : result;\n};\n","'use strict';\n// https://tc39.github.io/proposal-setmap-offrom/\nvar bind = require('../internals/function-bind-context');\nvar anObject = require('../internals/an-object');\nvar toObject = require('../internals/to-object');\nvar iterate = require('../internals/iterate');\n\nmodule.exports = function (C, adder, ENTRY) {\n return function from(source /* , mapFn, thisArg */) {\n var O = toObject(source);\n var length = arguments.length;\n var mapFn = length > 1 ? arguments[1] : undefined;\n var mapping = mapFn !== undefined;\n var boundFunction = mapping ? bind(mapFn, length > 2 ? arguments[2] : undefined) : undefined;\n var result = new C();\n var n = 0;\n iterate(O, function (nextItem) {\n var entry = mapping ? boundFunction(nextItem, n++) : nextItem;\n if (ENTRY) adder(result, anObject(entry)[0], entry[1]);\n else adder(result, entry);\n });\n return result;\n };\n};\n","'use strict';\nvar anObject = require('../internals/an-object');\n\n// https://tc39.github.io/proposal-setmap-offrom/\nmodule.exports = function (C, adder, ENTRY) {\n return function of() {\n var result = new C();\n var length = arguments.length;\n for (var index = 0; index < length; index++) {\n var entry = arguments[index];\n if (ENTRY) adder(result, anObject(entry)[0], entry[1]);\n else adder(result, entry);\n } return result;\n };\n};\n","'use strict';\nvar create = require('../internals/object-create');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\nvar defineBuiltIns = require('../internals/define-built-ins');\nvar bind = require('../internals/function-bind-context');\nvar anInstance = require('../internals/an-instance');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar iterate = require('../internals/iterate');\nvar defineIterator = require('../internals/iterator-define');\nvar createIterResultObject = require('../internals/create-iter-result-object');\nvar setSpecies = require('../internals/set-species');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar fastKey = require('../internals/internal-metadata').fastKey;\nvar InternalStateModule = require('../internals/internal-state');\n\nvar setInternalState = InternalStateModule.set;\nvar internalStateGetterFor = InternalStateModule.getterFor;\n\nmodule.exports = {\n getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {\n var Constructor = wrapper(function (that, iterable) {\n anInstance(that, Prototype);\n setInternalState(that, {\n type: CONSTRUCTOR_NAME,\n index: create(null),\n first: null,\n last: null,\n size: 0\n });\n if (!DESCRIPTORS) that.size = 0;\n if (!isNullOrUndefined(iterable)) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n });\n\n var Prototype = Constructor.prototype;\n\n var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);\n\n var define = function (that, key, value) {\n var state = getInternalState(that);\n var entry = getEntry(that, key);\n var previous, index;\n // change existing entry\n if (entry) {\n entry.value = value;\n // create new entry\n } else {\n state.last = entry = {\n index: index = fastKey(key, true),\n key: key,\n value: value,\n previous: previous = state.last,\n next: null,\n removed: false\n };\n if (!state.first) state.first = entry;\n if (previous) previous.next = entry;\n if (DESCRIPTORS) state.size++;\n else that.size++;\n // add to index\n if (index !== 'F') state.index[index] = entry;\n } return that;\n };\n\n var getEntry = function (that, key) {\n var state = getInternalState(that);\n // fast case\n var index = fastKey(key);\n var entry;\n if (index !== 'F') return state.index[index];\n // frozen object case\n for (entry = state.first; entry; entry = entry.next) {\n if (entry.key === key) return entry;\n }\n };\n\n defineBuiltIns(Prototype, {\n // `{ Map, Set }.prototype.clear()` methods\n // https://tc39.es/ecma262/#sec-map.prototype.clear\n // https://tc39.es/ecma262/#sec-set.prototype.clear\n clear: function clear() {\n var that = this;\n var state = getInternalState(that);\n var entry = state.first;\n while (entry) {\n entry.removed = true;\n if (entry.previous) entry.previous = entry.previous.next = null;\n entry = entry.next;\n }\n state.first = state.last = null;\n state.index = create(null);\n if (DESCRIPTORS) state.size = 0;\n else that.size = 0;\n },\n // `{ Map, Set }.prototype.delete(key)` methods\n // https://tc39.es/ecma262/#sec-map.prototype.delete\n // https://tc39.es/ecma262/#sec-set.prototype.delete\n 'delete': function (key) {\n var that = this;\n var state = getInternalState(that);\n var entry = getEntry(that, key);\n if (entry) {\n var next = entry.next;\n var prev = entry.previous;\n delete state.index[entry.index];\n entry.removed = true;\n if (prev) prev.next = next;\n if (next) next.previous = prev;\n if (state.first === entry) state.first = next;\n if (state.last === entry) state.last = prev;\n if (DESCRIPTORS) state.size--;\n else that.size--;\n } return !!entry;\n },\n // `{ Map, Set }.prototype.forEach(callbackfn, thisArg = undefined)` methods\n // https://tc39.es/ecma262/#sec-map.prototype.foreach\n // https://tc39.es/ecma262/#sec-set.prototype.foreach\n forEach: function forEach(callbackfn /* , that = undefined */) {\n var state = getInternalState(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n var entry;\n while (entry = entry ? entry.next : state.first) {\n boundFunction(entry.value, entry.key, this);\n // revert to the last existing entry\n while (entry && entry.removed) entry = entry.previous;\n }\n },\n // `{ Map, Set}.prototype.has(key)` methods\n // https://tc39.es/ecma262/#sec-map.prototype.has\n // https://tc39.es/ecma262/#sec-set.prototype.has\n has: function has(key) {\n return !!getEntry(this, key);\n }\n });\n\n defineBuiltIns(Prototype, IS_MAP ? {\n // `Map.prototype.get(key)` method\n // https://tc39.es/ecma262/#sec-map.prototype.get\n get: function get(key) {\n var entry = getEntry(this, key);\n return entry && entry.value;\n },\n // `Map.prototype.set(key, value)` method\n // https://tc39.es/ecma262/#sec-map.prototype.set\n set: function set(key, value) {\n return define(this, key === 0 ? 0 : key, value);\n }\n } : {\n // `Set.prototype.add(value)` method\n // https://tc39.es/ecma262/#sec-set.prototype.add\n add: function add(value) {\n return define(this, value = value === 0 ? 0 : value, value);\n }\n });\n if (DESCRIPTORS) defineBuiltInAccessor(Prototype, 'size', {\n configurable: true,\n get: function () {\n return getInternalState(this).size;\n }\n });\n return Constructor;\n },\n setStrong: function (Constructor, CONSTRUCTOR_NAME, IS_MAP) {\n var ITERATOR_NAME = CONSTRUCTOR_NAME + ' Iterator';\n var getInternalCollectionState = internalStateGetterFor(CONSTRUCTOR_NAME);\n var getInternalIteratorState = internalStateGetterFor(ITERATOR_NAME);\n // `{ Map, Set }.prototype.{ keys, values, entries, @@iterator }()` methods\n // https://tc39.es/ecma262/#sec-map.prototype.entries\n // https://tc39.es/ecma262/#sec-map.prototype.keys\n // https://tc39.es/ecma262/#sec-map.prototype.values\n // https://tc39.es/ecma262/#sec-map.prototype-@@iterator\n // https://tc39.es/ecma262/#sec-set.prototype.entries\n // https://tc39.es/ecma262/#sec-set.prototype.keys\n // https://tc39.es/ecma262/#sec-set.prototype.values\n // https://tc39.es/ecma262/#sec-set.prototype-@@iterator\n defineIterator(Constructor, CONSTRUCTOR_NAME, function (iterated, kind) {\n setInternalState(this, {\n type: ITERATOR_NAME,\n target: iterated,\n state: getInternalCollectionState(iterated),\n kind: kind,\n last: null\n });\n }, function () {\n var state = getInternalIteratorState(this);\n var kind = state.kind;\n var entry = state.last;\n // revert to the last existing entry\n while (entry && entry.removed) entry = entry.previous;\n // get next entry\n if (!state.target || !(state.last = entry = entry ? entry.next : state.state.first)) {\n // or finish the iteration\n state.target = null;\n return createIterResultObject(undefined, true);\n }\n // return step by kind\n if (kind === 'keys') return createIterResultObject(entry.key, false);\n if (kind === 'values') return createIterResultObject(entry.value, false);\n return createIterResultObject([entry.key, entry.value], false);\n }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);\n\n // `{ Map, Set }.prototype[@@species]` accessors\n // https://tc39.es/ecma262/#sec-get-map-@@species\n // https://tc39.es/ecma262/#sec-get-set-@@species\n setSpecies(CONSTRUCTOR_NAME);\n }\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar defineBuiltIns = require('../internals/define-built-ins');\nvar getWeakData = require('../internals/internal-metadata').getWeakData;\nvar anInstance = require('../internals/an-instance');\nvar anObject = require('../internals/an-object');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar isObject = require('../internals/is-object');\nvar iterate = require('../internals/iterate');\nvar ArrayIterationModule = require('../internals/array-iteration');\nvar hasOwn = require('../internals/has-own-property');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar setInternalState = InternalStateModule.set;\nvar internalStateGetterFor = InternalStateModule.getterFor;\nvar find = ArrayIterationModule.find;\nvar findIndex = ArrayIterationModule.findIndex;\nvar splice = uncurryThis([].splice);\nvar id = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (state) {\n return state.frozen || (state.frozen = new UncaughtFrozenStore());\n};\n\nvar UncaughtFrozenStore = function () {\n this.entries = [];\n};\n\nvar findUncaughtFrozen = function (store, key) {\n return find(store.entries, function (it) {\n return it[0] === key;\n });\n};\n\nUncaughtFrozenStore.prototype = {\n get: function (key) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) return entry[1];\n },\n has: function (key) {\n return !!findUncaughtFrozen(this, key);\n },\n set: function (key, value) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) entry[1] = value;\n else this.entries.push([key, value]);\n },\n 'delete': function (key) {\n var index = findIndex(this.entries, function (it) {\n return it[0] === key;\n });\n if (~index) splice(this.entries, index, 1);\n return !!~index;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {\n var Constructor = wrapper(function (that, iterable) {\n anInstance(that, Prototype);\n setInternalState(that, {\n type: CONSTRUCTOR_NAME,\n id: id++,\n frozen: null\n });\n if (!isNullOrUndefined(iterable)) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n });\n\n var Prototype = Constructor.prototype;\n\n var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);\n\n var define = function (that, key, value) {\n var state = getInternalState(that);\n var data = getWeakData(anObject(key), true);\n if (data === true) uncaughtFrozenStore(state).set(key, value);\n else data[state.id] = value;\n return that;\n };\n\n defineBuiltIns(Prototype, {\n // `{ WeakMap, WeakSet }.prototype.delete(key)` methods\n // https://tc39.es/ecma262/#sec-weakmap.prototype.delete\n // https://tc39.es/ecma262/#sec-weakset.prototype.delete\n 'delete': function (key) {\n var state = getInternalState(this);\n if (!isObject(key)) return false;\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state)['delete'](key);\n return data && hasOwn(data, state.id) && delete data[state.id];\n },\n // `{ WeakMap, WeakSet }.prototype.has(key)` methods\n // https://tc39.es/ecma262/#sec-weakmap.prototype.has\n // https://tc39.es/ecma262/#sec-weakset.prototype.has\n has: function has(key) {\n var state = getInternalState(this);\n if (!isObject(key)) return false;\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state).has(key);\n return data && hasOwn(data, state.id);\n }\n });\n\n defineBuiltIns(Prototype, IS_MAP ? {\n // `WeakMap.prototype.get(key)` method\n // https://tc39.es/ecma262/#sec-weakmap.prototype.get\n get: function get(key) {\n var state = getInternalState(this);\n if (isObject(key)) {\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state).get(key);\n if (data) return data[state.id];\n }\n },\n // `WeakMap.prototype.set(key, value)` method\n // https://tc39.es/ecma262/#sec-weakmap.prototype.set\n set: function set(key, value) {\n return define(this, key, value);\n }\n } : {\n // `WeakSet.prototype.add(value)` method\n // https://tc39.es/ecma262/#sec-weakset.prototype.add\n add: function add(value) {\n return define(this, value, true);\n }\n });\n\n return Constructor;\n }\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar globalThis = require('../internals/global-this');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar isForced = require('../internals/is-forced');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar InternalMetadataModule = require('../internals/internal-metadata');\nvar iterate = require('../internals/iterate');\nvar anInstance = require('../internals/an-instance');\nvar isCallable = require('../internals/is-callable');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar isObject = require('../internals/is-object');\nvar fails = require('../internals/fails');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar inheritIfRequired = require('../internals/inherit-if-required');\n\nmodule.exports = function (CONSTRUCTOR_NAME, wrapper, common) {\n var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1;\n var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1;\n var ADDER = IS_MAP ? 'set' : 'add';\n var NativeConstructor = globalThis[CONSTRUCTOR_NAME];\n var NativePrototype = NativeConstructor && NativeConstructor.prototype;\n var Constructor = NativeConstructor;\n var exported = {};\n\n var fixMethod = function (KEY) {\n var uncurriedNativeMethod = uncurryThis(NativePrototype[KEY]);\n defineBuiltIn(NativePrototype, KEY,\n KEY === 'add' ? function add(value) {\n uncurriedNativeMethod(this, value === 0 ? 0 : value);\n return this;\n } : KEY === 'delete' ? function (key) {\n return IS_WEAK && !isObject(key) ? false : uncurriedNativeMethod(this, key === 0 ? 0 : key);\n } : KEY === 'get' ? function get(key) {\n return IS_WEAK && !isObject(key) ? undefined : uncurriedNativeMethod(this, key === 0 ? 0 : key);\n } : KEY === 'has' ? function has(key) {\n return IS_WEAK && !isObject(key) ? false : uncurriedNativeMethod(this, key === 0 ? 0 : key);\n } : function set(key, value) {\n uncurriedNativeMethod(this, key === 0 ? 0 : key, value);\n return this;\n }\n );\n };\n\n var REPLACE = isForced(\n CONSTRUCTOR_NAME,\n !isCallable(NativeConstructor) || !(IS_WEAK || NativePrototype.forEach && !fails(function () {\n new NativeConstructor().entries().next();\n }))\n );\n\n if (REPLACE) {\n // create collection constructor\n Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER);\n InternalMetadataModule.enable();\n } else if (isForced(CONSTRUCTOR_NAME, true)) {\n var instance = new Constructor();\n // early implementations not supports chaining\n var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) !== instance;\n // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false\n var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });\n // most early implementations doesn't supports iterables, most modern - not close it correctly\n // eslint-disable-next-line no-new -- required for testing\n var ACCEPT_ITERABLES = checkCorrectnessOfIteration(function (iterable) { new NativeConstructor(iterable); });\n // for early implementations -0 and +0 not the same\n var BUGGY_ZERO = !IS_WEAK && fails(function () {\n // V8 ~ Chromium 42- fails only with 5+ elements\n var $instance = new NativeConstructor();\n var index = 5;\n while (index--) $instance[ADDER](index, index);\n return !$instance.has(-0);\n });\n\n if (!ACCEPT_ITERABLES) {\n Constructor = wrapper(function (dummy, iterable) {\n anInstance(dummy, NativePrototype);\n var that = inheritIfRequired(new NativeConstructor(), dummy, Constructor);\n if (!isNullOrUndefined(iterable)) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n return that;\n });\n Constructor.prototype = NativePrototype;\n NativePrototype.constructor = Constructor;\n }\n\n if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n fixMethod('delete');\n fixMethod('has');\n IS_MAP && fixMethod('get');\n }\n\n if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n\n // weak collections should not contains .clear method\n if (IS_WEAK && NativePrototype.clear) delete NativePrototype.clear;\n }\n\n exported[CONSTRUCTOR_NAME] = Constructor;\n $({ global: true, constructor: true, forced: Constructor !== NativeConstructor }, exported);\n\n setToStringTag(Constructor, CONSTRUCTOR_NAME);\n\n if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP);\n\n return Constructor;\n};\n","'use strict';\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\nrequire('../modules/es.map');\nrequire('../modules/es.weak-map');\nvar getBuiltIn = require('../internals/get-built-in');\nvar create = require('../internals/object-create');\nvar isObject = require('../internals/is-object');\n\nvar $Object = Object;\nvar $TypeError = TypeError;\nvar Map = getBuiltIn('Map');\nvar WeakMap = getBuiltIn('WeakMap');\n\nvar Node = function () {\n // keys\n this.object = null;\n this.symbol = null;\n // child nodes\n this.primitives = null;\n this.objectsByIndex = create(null);\n};\n\nNode.prototype.get = function (key, initializer) {\n return this[key] || (this[key] = initializer());\n};\n\nNode.prototype.next = function (i, it, IS_OBJECT) {\n var store = IS_OBJECT\n ? this.objectsByIndex[i] || (this.objectsByIndex[i] = new WeakMap())\n : this.primitives || (this.primitives = new Map());\n var entry = store.get(it);\n if (!entry) store.set(it, entry = new Node());\n return entry;\n};\n\nvar root = new Node();\n\nmodule.exports = function () {\n var active = root;\n var length = arguments.length;\n var i, it;\n // for prevent leaking, start from objects\n for (i = 0; i < length; i++) {\n if (isObject(it = arguments[i])) active = active.next(i, it, true);\n }\n if (this === $Object && active === root) throw new $TypeError('Composite keys must contain a non-primitive component');\n for (i = 0; i < length; i++) {\n if (!isObject(it = arguments[i])) active = active.next(i, it, false);\n } return active;\n};\n","'use strict';\nvar hasOwn = require('../internals/has-own-property');\nvar ownKeys = require('../internals/own-keys');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\n\nmodule.exports = function (target, source, exceptions) {\n var keys = ownKeys(source);\n var defineProperty = definePropertyModule.f;\n var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (!hasOwn(target, key) && !(exceptions && hasOwn(exceptions, key))) {\n defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n }\n }\n};\n","'use strict';\nvar fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n function F() { /* empty */ }\n F.prototype.constructor = null;\n // eslint-disable-next-line es/no-object-getprototypeof -- required for testing\n return Object.getPrototypeOf(new F()) !== F.prototype;\n});\n","'use strict';\n// `CreateIterResultObject` abstract operation\n// https://tc39.es/ecma262/#sec-createiterresultobject\nmodule.exports = function (value, done) {\n return { value: value, done: done };\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = DESCRIPTORS ? function (object, key, value) {\n return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","'use strict';\nmodule.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n","'use strict';\nvar makeBuiltIn = require('../internals/make-built-in');\nvar defineProperty = require('../internals/object-define-property');\n\nmodule.exports = function (target, name, descriptor) {\n if (descriptor.get) makeBuiltIn(descriptor.get, name, { getter: true });\n if (descriptor.set) makeBuiltIn(descriptor.set, name, { setter: true });\n return defineProperty.f(target, name, descriptor);\n};\n","'use strict';\nvar isCallable = require('../internals/is-callable');\nvar definePropertyModule = require('../internals/object-define-property');\nvar makeBuiltIn = require('../internals/make-built-in');\nvar defineGlobalProperty = require('../internals/define-global-property');\n\nmodule.exports = function (O, key, value, options) {\n if (!options) options = {};\n var simple = options.enumerable;\n var name = options.name !== undefined ? options.name : key;\n if (isCallable(value)) makeBuiltIn(value, name, options);\n if (options.global) {\n if (simple) O[key] = value;\n else defineGlobalProperty(key, value);\n } else {\n try {\n if (!options.unsafe) delete O[key];\n else if (O[key]) simple = true;\n } catch (error) { /* empty */ }\n if (simple) O[key] = value;\n else definePropertyModule.f(O, key, {\n value: value,\n enumerable: false,\n configurable: !options.nonConfigurable,\n writable: !options.nonWritable\n });\n } return O;\n};\n","'use strict';\nvar defineBuiltIn = require('../internals/define-built-in');\n\nmodule.exports = function (target, src, options) {\n for (var key in src) defineBuiltIn(target, key, src[key], options);\n return target;\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\n\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar defineProperty = Object.defineProperty;\n\nmodule.exports = function (key, value) {\n try {\n defineProperty(globalThis, key, { value: value, configurable: true, writable: true });\n } catch (error) {\n globalThis[key] = value;\n } return value;\n};\n","'use strict';\nvar fails = require('../internals/fails');\n\n// Detect IE8's incomplete defineProperty implementation\nmodule.exports = !fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] !== 7;\n});\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar isObject = require('../internals/is-object');\n\nvar document = globalThis.document;\n// typeof document.createElement is 'object' in old IE\nvar EXISTS = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n return EXISTS ? document.createElement(it) : {};\n};\n","'use strict';\n// IE8- don't enum bug keys\nmodule.exports = [\n 'constructor',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf'\n];\n","'use strict';\nvar userAgent = require('../internals/environment-user-agent');\n\nvar firefox = userAgent.match(/firefox\\/(\\d+)/i);\n\nmodule.exports = !!firefox && +firefox[1];\n","'use strict';\nvar UA = require('../internals/environment-user-agent');\n\nmodule.exports = /MSIE|Trident/.test(UA);\n","'use strict';\nvar userAgent = require('../internals/environment-user-agent');\n\n// eslint-disable-next-line redos/no-vulnerable -- safe\nmodule.exports = /(?:ipad|iphone|ipod).*applewebkit/i.test(userAgent);\n","'use strict';\nvar ENVIRONMENT = require('../internals/environment');\n\nmodule.exports = ENVIRONMENT === 'NODE';\n","'use strict';\nvar globalThis = require('../internals/global-this');\n\nvar navigator = globalThis.navigator;\nvar userAgent = navigator && navigator.userAgent;\n\nmodule.exports = userAgent ? String(userAgent) : '';\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar userAgent = require('../internals/environment-user-agent');\n\nvar process = globalThis.process;\nvar Deno = globalThis.Deno;\nvar versions = process && process.versions || Deno && Deno.version;\nvar v8 = versions && versions.v8;\nvar match, version;\n\nif (v8) {\n match = v8.split('.');\n // in old Chrome, versions of V8 isn't V8 = Chrome / 10\n // but their correct versions are not interesting for us\n version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]);\n}\n\n// BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0`\n// so check `userAgent` even if `.v8` exists, but 0\nif (!version && userAgent) {\n match = userAgent.match(/Edge\\/(\\d+)/);\n if (!match || match[1] >= 74) {\n match = userAgent.match(/Chrome\\/(\\d+)/);\n if (match) version = +match[1];\n }\n}\n\nmodule.exports = version;\n","'use strict';\nvar userAgent = require('../internals/environment-user-agent');\n\nvar webkit = userAgent.match(/AppleWebKit\\/(\\d+)\\./);\n\nmodule.exports = !!webkit && +webkit[1];\n","'use strict';\n/* global Bun, Deno -- detection */\nvar globalThis = require('../internals/global-this');\nvar userAgent = require('../internals/environment-user-agent');\nvar classof = require('../internals/classof-raw');\n\nvar userAgentStartsWith = function (string) {\n return userAgent.slice(0, string.length) === string;\n};\n\nmodule.exports = (function () {\n if (userAgentStartsWith('Bun/')) return 'BUN';\n if (userAgentStartsWith('Cloudflare-Workers')) return 'CLOUDFLARE';\n if (userAgentStartsWith('Deno/')) return 'DENO';\n if (userAgentStartsWith('Node.js/')) return 'NODE';\n if (globalThis.Bun && typeof Bun.version == 'string') return 'BUN';\n if (globalThis.Deno && typeof Deno.version == 'object') return 'DENO';\n if (classof(globalThis.process) === 'process') return 'NODE';\n if (globalThis.window && globalThis.document) return 'BROWSER';\n return 'REST';\n})();\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar defineGlobalProperty = require('../internals/define-global-property');\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\nvar isForced = require('../internals/is-forced');\n\n/*\n options.target - name of the target object\n options.global - target is the global object\n options.stat - export as static methods of target\n options.proto - export as prototype methods of target\n options.real - real prototype method for the `pure` version\n options.forced - export even if the native feature is available\n options.bind - bind methods to the target, required for the `pure` version\n options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n options.unsafe - use the simple assignment of property instead of delete + defineProperty\n options.sham - add a flag to not completely full polyfills\n options.enumerable - export as enumerable property\n options.dontCallGetSet - prevent calling a getter on target\n options.name - the .name of the function if it does not match the key\n*/\nmodule.exports = function (options, source) {\n var TARGET = options.target;\n var GLOBAL = options.global;\n var STATIC = options.stat;\n var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n if (GLOBAL) {\n target = globalThis;\n } else if (STATIC) {\n target = globalThis[TARGET] || defineGlobalProperty(TARGET, {});\n } else {\n target = globalThis[TARGET] && globalThis[TARGET].prototype;\n }\n if (target) for (key in source) {\n sourceProperty = source[key];\n if (options.dontCallGetSet) {\n descriptor = getOwnPropertyDescriptor(target, key);\n targetProperty = descriptor && descriptor.value;\n } else targetProperty = target[key];\n FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n // contained in target\n if (!FORCED && targetProperty !== undefined) {\n if (typeof sourceProperty == typeof targetProperty) continue;\n copyConstructorProperties(sourceProperty, targetProperty);\n }\n // add a flag to not completely full polyfills\n if (options.sham || (targetProperty && targetProperty.sham)) {\n createNonEnumerableProperty(sourceProperty, 'sham', true);\n }\n defineBuiltIn(target, key, sourceProperty, options);\n }\n};\n","'use strict';\nmodule.exports = function (exec) {\n try {\n return !!exec();\n } catch (error) {\n return true;\n }\n};\n","'use strict';\nvar fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n // eslint-disable-next-line es/no-object-isextensible, es/no-object-preventextensions -- required for testing\n return Object.isExtensible(Object.preventExtensions({}));\n});\n","'use strict';\nvar NATIVE_BIND = require('../internals/function-bind-native');\n\nvar FunctionPrototype = Function.prototype;\nvar apply = FunctionPrototype.apply;\nvar call = FunctionPrototype.call;\n\n// eslint-disable-next-line es/no-function-prototype-bind, es/no-reflect -- safe\nmodule.exports = typeof Reflect == 'object' && Reflect.apply || (NATIVE_BIND ? call.bind(apply) : function () {\n return call.apply(apply, arguments);\n});\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this-clause');\nvar aCallable = require('../internals/a-callable');\nvar NATIVE_BIND = require('../internals/function-bind-native');\n\nvar bind = uncurryThis(uncurryThis.bind);\n\n// optional / simple context binding\nmodule.exports = function (fn, that) {\n aCallable(fn);\n return that === undefined ? fn : NATIVE_BIND ? bind(fn, that) : function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n","'use strict';\nvar fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n // eslint-disable-next-line es/no-function-prototype-bind -- safe\n var test = (function () { /* empty */ }).bind();\n // eslint-disable-next-line no-prototype-builtins -- safe\n return typeof test != 'function' || test.hasOwnProperty('prototype');\n});\n","'use strict';\nvar NATIVE_BIND = require('../internals/function-bind-native');\n\nvar call = Function.prototype.call;\n// eslint-disable-next-line es/no-function-prototype-bind -- safe\nmodule.exports = NATIVE_BIND ? call.bind(call) : function () {\n return call.apply(call, arguments);\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar hasOwn = require('../internals/has-own-property');\n\nvar FunctionPrototype = Function.prototype;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor;\n\nvar EXISTS = hasOwn(FunctionPrototype, 'name');\n// additional protection from minified / mangled / dropped function names\nvar PROPER = EXISTS && (function something() { /* empty */ }).name === 'something';\nvar CONFIGURABLE = EXISTS && (!DESCRIPTORS || (DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable));\n\nmodule.exports = {\n EXISTS: EXISTS,\n PROPER: PROPER,\n CONFIGURABLE: CONFIGURABLE\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar aCallable = require('../internals/a-callable');\n\nmodule.exports = function (object, key, method) {\n try {\n // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\n return uncurryThis(aCallable(Object.getOwnPropertyDescriptor(object, key)[method]));\n } catch (error) { /* empty */ }\n};\n","'use strict';\nvar classofRaw = require('../internals/classof-raw');\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nmodule.exports = function (fn) {\n // Nashorn bug:\n // https://github.com/zloirock/core-js/issues/1128\n // https://github.com/zloirock/core-js/issues/1130\n if (classofRaw(fn) === 'Function') return uncurryThis(fn);\n};\n","'use strict';\nvar NATIVE_BIND = require('../internals/function-bind-native');\n\nvar FunctionPrototype = Function.prototype;\nvar call = FunctionPrototype.call;\n// eslint-disable-next-line es/no-function-prototype-bind -- safe\nvar uncurryThisWithBind = NATIVE_BIND && FunctionPrototype.bind.bind(call, call);\n\nmodule.exports = NATIVE_BIND ? uncurryThisWithBind : function (fn) {\n return function () {\n return call.apply(fn, arguments);\n };\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar isCallable = require('../internals/is-callable');\n\nvar aFunction = function (argument) {\n return isCallable(argument) ? argument : undefined;\n};\n\nmodule.exports = function (namespace, method) {\n return arguments.length < 2 ? aFunction(globalThis[namespace]) : globalThis[namespace] && globalThis[namespace][method];\n};\n","'use strict';\n// `GetIteratorDirect(obj)` abstract operation\n// https://tc39.es/proposal-iterator-helpers/#sec-getiteratordirect\nmodule.exports = function (obj) {\n return {\n iterator: obj,\n next: obj.next,\n done: false\n };\n};\n","'use strict';\nvar classof = require('../internals/classof');\nvar getMethod = require('../internals/get-method');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar Iterators = require('../internals/iterators');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = function (it) {\n if (!isNullOrUndefined(it)) return getMethod(it, ITERATOR)\n || getMethod(it, '@@iterator')\n || Iterators[classof(it)];\n};\n","'use strict';\nvar call = require('../internals/function-call');\nvar aCallable = require('../internals/a-callable');\nvar anObject = require('../internals/an-object');\nvar tryToString = require('../internals/try-to-string');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\nvar $TypeError = TypeError;\n\nmodule.exports = function (argument, usingIterator) {\n var iteratorMethod = arguments.length < 2 ? getIteratorMethod(argument) : usingIterator;\n if (aCallable(iteratorMethod)) return anObject(call(iteratorMethod, argument));\n throw new $TypeError(tryToString(argument) + ' is not iterable');\n};\n","'use strict';\nvar aCallable = require('../internals/a-callable');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\n\n// `GetMethod` abstract operation\n// https://tc39.es/ecma262/#sec-getmethod\nmodule.exports = function (V, P) {\n var func = V[P];\n return isNullOrUndefined(func) ? undefined : aCallable(func);\n};\n","'use strict';\nvar aCallable = require('../internals/a-callable');\nvar anObject = require('../internals/an-object');\nvar call = require('../internals/function-call');\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\nvar getIteratorDirect = require('../internals/get-iterator-direct');\n\nvar INVALID_SIZE = 'Invalid size';\nvar $RangeError = RangeError;\nvar $TypeError = TypeError;\nvar max = Math.max;\n\nvar SetRecord = function (set, intSize) {\n this.set = set;\n this.size = max(intSize, 0);\n this.has = aCallable(set.has);\n this.keys = aCallable(set.keys);\n};\n\nSetRecord.prototype = {\n getIterator: function () {\n return getIteratorDirect(anObject(call(this.keys, this.set)));\n },\n includes: function (it) {\n return call(this.has, this.set, it);\n }\n};\n\n// `GetSetRecord` abstract operation\n// https://tc39.es/proposal-set-methods/#sec-getsetrecord\nmodule.exports = function (obj) {\n anObject(obj);\n var numSize = +obj.size;\n // NOTE: If size is undefined, then numSize will be NaN\n // eslint-disable-next-line no-self-compare -- NaN check\n if (numSize !== numSize) throw new $TypeError(INVALID_SIZE);\n var intSize = toIntegerOrInfinity(numSize);\n if (intSize < 0) throw new $RangeError(INVALID_SIZE);\n return new SetRecord(obj, intSize);\n};\n","'use strict';\nvar check = function (it) {\n return it && it.Math === Math && it;\n};\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nmodule.exports =\n // eslint-disable-next-line es/no-global-this -- safe\n check(typeof globalThis == 'object' && globalThis) ||\n check(typeof window == 'object' && window) ||\n // eslint-disable-next-line no-restricted-globals -- safe\n check(typeof self == 'object' && self) ||\n check(typeof global == 'object' && global) ||\n check(typeof this == 'object' && this) ||\n // eslint-disable-next-line no-new-func -- fallback\n (function () { return this; })() || Function('return this')();\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toObject = require('../internals/to-object');\n\nvar hasOwnProperty = uncurryThis({}.hasOwnProperty);\n\n// `HasOwnProperty` abstract operation\n// https://tc39.es/ecma262/#sec-hasownproperty\n// eslint-disable-next-line es/no-object-hasown -- safe\nmodule.exports = Object.hasOwn || function hasOwn(it, key) {\n return hasOwnProperty(toObject(it), key);\n};\n","'use strict';\nmodule.exports = {};\n","'use strict';\nmodule.exports = function (a, b) {\n try {\n // eslint-disable-next-line no-console -- safe\n arguments.length === 1 ? console.error(a) : console.error(a, b);\n } catch (error) { /* empty */ }\n};\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('document', 'documentElement');\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar createElement = require('../internals/document-create-element');\n\n// Thanks to IE8 for its funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty(createElement('div'), 'a', {\n get: function () { return 7; }\n }).a !== 7;\n});\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar fails = require('../internals/fails');\nvar classof = require('../internals/classof-raw');\n\nvar $Object = Object;\nvar split = uncurryThis(''.split);\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nmodule.exports = fails(function () {\n // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n // eslint-disable-next-line no-prototype-builtins -- safe\n return !$Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n return classof(it) === 'String' ? split(it, '') : $Object(it);\n} : $Object;\n","'use strict';\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\n\n// makes subclassing work correct for wrapped built-ins\nmodule.exports = function ($this, dummy, Wrapper) {\n var NewTarget, NewTargetPrototype;\n if (\n // it can work only with native `setPrototypeOf`\n setPrototypeOf &&\n // we haven't completely correct pre-ES6 way for getting `new.target`, so use this\n isCallable(NewTarget = dummy.constructor) &&\n NewTarget !== Wrapper &&\n isObject(NewTargetPrototype = NewTarget.prototype) &&\n NewTargetPrototype !== Wrapper.prototype\n ) setPrototypeOf($this, NewTargetPrototype);\n return $this;\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar isCallable = require('../internals/is-callable');\nvar store = require('../internals/shared-store');\n\nvar functionToString = uncurryThis(Function.toString);\n\n// this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper\nif (!isCallable(store.inspectSource)) {\n store.inspectSource = function (it) {\n return functionToString(it);\n };\n}\n\nmodule.exports = store.inspectSource;\n","'use strict';\nvar $ = require('../internals/export');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar isObject = require('../internals/is-object');\nvar hasOwn = require('../internals/has-own-property');\nvar defineProperty = require('../internals/object-define-property').f;\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertyNamesExternalModule = require('../internals/object-get-own-property-names-external');\nvar isExtensible = require('../internals/object-is-extensible');\nvar uid = require('../internals/uid');\nvar FREEZING = require('../internals/freezing');\n\nvar REQUIRED = false;\nvar METADATA = uid('meta');\nvar id = 0;\n\nvar setMetadata = function (it) {\n defineProperty(it, METADATA, { value: {\n objectID: 'O' + id++, // object ID\n weakData: {} // weak collections IDs\n } });\n};\n\nvar fastKey = function (it, create) {\n // return a primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!hasOwn(it, METADATA)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return 'F';\n // not necessary to add metadata\n if (!create) return 'E';\n // add missing metadata\n setMetadata(it);\n // return object ID\n } return it[METADATA].objectID;\n};\n\nvar getWeakData = function (it, create) {\n if (!hasOwn(it, METADATA)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return true;\n // not necessary to add metadata\n if (!create) return false;\n // add missing metadata\n setMetadata(it);\n // return the store of weak collections IDs\n } return it[METADATA].weakData;\n};\n\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n if (FREEZING && REQUIRED && isExtensible(it) && !hasOwn(it, METADATA)) setMetadata(it);\n return it;\n};\n\nvar enable = function () {\n meta.enable = function () { /* empty */ };\n REQUIRED = true;\n var getOwnPropertyNames = getOwnPropertyNamesModule.f;\n var splice = uncurryThis([].splice);\n var test = {};\n test[METADATA] = 1;\n\n // prevent exposing of metadata key\n if (getOwnPropertyNames(test).length) {\n getOwnPropertyNamesModule.f = function (it) {\n var result = getOwnPropertyNames(it);\n for (var i = 0, length = result.length; i < length; i++) {\n if (result[i] === METADATA) {\n splice(result, i, 1);\n break;\n }\n } return result;\n };\n\n $({ target: 'Object', stat: true, forced: true }, {\n getOwnPropertyNames: getOwnPropertyNamesExternalModule.f\n });\n }\n};\n\nvar meta = module.exports = {\n enable: enable,\n fastKey: fastKey,\n getWeakData: getWeakData,\n onFreeze: onFreeze\n};\n\nhiddenKeys[METADATA] = true;\n","'use strict';\nvar NATIVE_WEAK_MAP = require('../internals/weak-map-basic-detection');\nvar globalThis = require('../internals/global-this');\nvar isObject = require('../internals/is-object');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar hasOwn = require('../internals/has-own-property');\nvar shared = require('../internals/shared-store');\nvar sharedKey = require('../internals/shared-key');\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar OBJECT_ALREADY_INITIALIZED = 'Object already initialized';\nvar TypeError = globalThis.TypeError;\nvar WeakMap = globalThis.WeakMap;\nvar set, get, has;\n\nvar enforce = function (it) {\n return has(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n return function (it) {\n var state;\n if (!isObject(it) || (state = get(it)).type !== TYPE) {\n throw new TypeError('Incompatible receiver, ' + TYPE + ' required');\n } return state;\n };\n};\n\nif (NATIVE_WEAK_MAP || shared.state) {\n var store = shared.state || (shared.state = new WeakMap());\n /* eslint-disable no-self-assign -- prototype methods protection */\n store.get = store.get;\n store.has = store.has;\n store.set = store.set;\n /* eslint-enable no-self-assign -- prototype methods protection */\n set = function (it, metadata) {\n if (store.has(it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);\n metadata.facade = it;\n store.set(it, metadata);\n return metadata;\n };\n get = function (it) {\n return store.get(it) || {};\n };\n has = function (it) {\n return store.has(it);\n };\n} else {\n var STATE = sharedKey('state');\n hiddenKeys[STATE] = true;\n set = function (it, metadata) {\n if (hasOwn(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);\n metadata.facade = it;\n createNonEnumerableProperty(it, STATE, metadata);\n return metadata;\n };\n get = function (it) {\n return hasOwn(it, STATE) ? it[STATE] : {};\n };\n has = function (it) {\n return hasOwn(it, STATE);\n };\n}\n\nmodule.exports = {\n set: set,\n get: get,\n has: has,\n enforce: enforce,\n getterFor: getterFor\n};\n","'use strict';\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar Iterators = require('../internals/iterators');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar ArrayPrototype = Array.prototype;\n\n// check on default Array iterator\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it);\n};\n","'use strict';\nvar classof = require('../internals/classof-raw');\n\n// `IsArray` abstract operation\n// https://tc39.es/ecma262/#sec-isarray\n// eslint-disable-next-line es/no-array-isarray -- safe\nmodule.exports = Array.isArray || function isArray(argument) {\n return classof(argument) === 'Array';\n};\n","'use strict';\n// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot\nvar documentAll = typeof document == 'object' && document.all;\n\n// `IsCallable` abstract operation\n// https://tc39.es/ecma262/#sec-iscallable\n// eslint-disable-next-line unicorn/no-typeof-undefined -- required for testing\nmodule.exports = typeof documentAll == 'undefined' && documentAll !== undefined ? function (argument) {\n return typeof argument == 'function' || argument === documentAll;\n} : function (argument) {\n return typeof argument == 'function';\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\nvar classof = require('../internals/classof');\nvar getBuiltIn = require('../internals/get-built-in');\nvar inspectSource = require('../internals/inspect-source');\n\nvar noop = function () { /* empty */ };\nvar construct = getBuiltIn('Reflect', 'construct');\nvar constructorRegExp = /^\\s*(?:class|function)\\b/;\nvar exec = uncurryThis(constructorRegExp.exec);\nvar INCORRECT_TO_STRING = !constructorRegExp.test(noop);\n\nvar isConstructorModern = function isConstructor(argument) {\n if (!isCallable(argument)) return false;\n try {\n construct(noop, [], argument);\n return true;\n } catch (error) {\n return false;\n }\n};\n\nvar isConstructorLegacy = function isConstructor(argument) {\n if (!isCallable(argument)) return false;\n switch (classof(argument)) {\n case 'AsyncFunction':\n case 'GeneratorFunction':\n case 'AsyncGeneratorFunction': return false;\n }\n try {\n // we can't check .prototype since constructors produced by .bind haven't it\n // `Function#toString` throws on some built-it function in some legacy engines\n // (for example, `DOMQuad` and similar in FF41-)\n return INCORRECT_TO_STRING || !!exec(constructorRegExp, inspectSource(argument));\n } catch (error) {\n return true;\n }\n};\n\nisConstructorLegacy.sham = true;\n\n// `IsConstructor` abstract operation\n// https://tc39.es/ecma262/#sec-isconstructor\nmodule.exports = !construct || fails(function () {\n var called;\n return isConstructorModern(isConstructorModern.call)\n || !isConstructorModern(Object)\n || !isConstructorModern(function () { called = true; })\n || called;\n}) ? isConstructorLegacy : isConstructorModern;\n","'use strict';\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\n\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n var value = data[normalize(feature)];\n return value === POLYFILL ? true\n : value === NATIVE ? false\n : isCallable(detection) ? fails(detection)\n : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nmodule.exports = isForced;\n","'use strict';\nvar classof = require('../internals/classof');\nvar hasOwn = require('../internals/has-own-property');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar Iterators = require('../internals/iterators');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar $Object = Object;\n\nmodule.exports = function (it) {\n if (isNullOrUndefined(it)) return false;\n var O = $Object(it);\n return O[ITERATOR] !== undefined\n || '@@iterator' in O\n || hasOwn(Iterators, classof(O));\n};\n","'use strict';\n// we can't use just `it == null` since of `document.all` special case\n// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot-aec\nmodule.exports = function (it) {\n return it === null || it === undefined;\n};\n","'use strict';\nvar isCallable = require('../internals/is-callable');\n\nmodule.exports = function (it) {\n return typeof it == 'object' ? it !== null : isCallable(it);\n};\n","'use strict';\nvar isObject = require('../internals/is-object');\n\nmodule.exports = function (argument) {\n return isObject(argument) || argument === null;\n};\n","'use strict';\nmodule.exports = false;\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar isCallable = require('../internals/is-callable');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar $Object = Object;\n\nmodule.exports = USE_SYMBOL_AS_UID ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n var $Symbol = getBuiltIn('Symbol');\n return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, $Object(it));\n};\n","'use strict';\nvar call = require('../internals/function-call');\n\nmodule.exports = function (record, fn, ITERATOR_INSTEAD_OF_RECORD) {\n var iterator = ITERATOR_INSTEAD_OF_RECORD ? record : record.iterator;\n var next = record.next;\n var step, result;\n while (!(step = call(next, iterator)).done) {\n result = fn(step.value);\n if (result !== undefined) return result;\n }\n};\n","'use strict';\nvar bind = require('../internals/function-bind-context');\nvar call = require('../internals/function-call');\nvar anObject = require('../internals/an-object');\nvar tryToString = require('../internals/try-to-string');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar getIterator = require('../internals/get-iterator');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar iteratorClose = require('../internals/iterator-close');\n\nvar $TypeError = TypeError;\n\nvar Result = function (stopped, result) {\n this.stopped = stopped;\n this.result = result;\n};\n\nvar ResultPrototype = Result.prototype;\n\nmodule.exports = function (iterable, unboundFunction, options) {\n var that = options && options.that;\n var AS_ENTRIES = !!(options && options.AS_ENTRIES);\n var IS_RECORD = !!(options && options.IS_RECORD);\n var IS_ITERATOR = !!(options && options.IS_ITERATOR);\n var INTERRUPTED = !!(options && options.INTERRUPTED);\n var fn = bind(unboundFunction, that);\n var iterator, iterFn, index, length, result, next, step;\n\n var stop = function (condition) {\n if (iterator) iteratorClose(iterator, 'normal', condition);\n return new Result(true, condition);\n };\n\n var callFn = function (value) {\n if (AS_ENTRIES) {\n anObject(value);\n return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]);\n } return INTERRUPTED ? fn(value, stop) : fn(value);\n };\n\n if (IS_RECORD) {\n iterator = iterable.iterator;\n } else if (IS_ITERATOR) {\n iterator = iterable;\n } else {\n iterFn = getIteratorMethod(iterable);\n if (!iterFn) throw new $TypeError(tryToString(iterable) + ' is not iterable');\n // optimisation for array iterators\n if (isArrayIteratorMethod(iterFn)) {\n for (index = 0, length = lengthOfArrayLike(iterable); length > index; index++) {\n result = callFn(iterable[index]);\n if (result && isPrototypeOf(ResultPrototype, result)) return result;\n } return new Result(false);\n }\n iterator = getIterator(iterable, iterFn);\n }\n\n next = IS_RECORD ? iterable.next : iterator.next;\n while (!(step = call(next, iterator)).done) {\n try {\n result = callFn(step.value);\n } catch (error) {\n iteratorClose(iterator, 'throw', error);\n }\n if (typeof result == 'object' && result && isPrototypeOf(ResultPrototype, result)) return result;\n } return new Result(false);\n};\n","'use strict';\nvar call = require('../internals/function-call');\nvar anObject = require('../internals/an-object');\nvar getMethod = require('../internals/get-method');\n\nmodule.exports = function (iterator, kind, value) {\n var innerResult, innerError;\n anObject(iterator);\n try {\n innerResult = getMethod(iterator, 'return');\n if (!innerResult) {\n if (kind === 'throw') throw value;\n return value;\n }\n innerResult = call(innerResult, iterator);\n } catch (error) {\n innerError = true;\n innerResult = error;\n }\n if (kind === 'throw') throw value;\n if (innerError) throw innerResult;\n anObject(innerResult);\n return value;\n};\n","'use strict';\nvar IteratorPrototype = require('../internals/iterators-core').IteratorPrototype;\nvar create = require('../internals/object-create');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar Iterators = require('../internals/iterators');\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (IteratorConstructor, NAME, next, ENUMERABLE_NEXT) {\n var TO_STRING_TAG = NAME + ' Iterator';\n IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(+!ENUMERABLE_NEXT, next) });\n setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true);\n Iterators[TO_STRING_TAG] = returnThis;\n return IteratorConstructor;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar IS_PURE = require('../internals/is-pure');\nvar FunctionName = require('../internals/function-name');\nvar isCallable = require('../internals/is-callable');\nvar createIteratorConstructor = require('../internals/iterator-create-constructor');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar Iterators = require('../internals/iterators');\nvar IteratorsCore = require('../internals/iterators-core');\n\nvar PROPER_FUNCTION_NAME = FunctionName.PROPER;\nvar CONFIGURABLE_FUNCTION_NAME = FunctionName.CONFIGURABLE;\nvar IteratorPrototype = IteratorsCore.IteratorPrototype;\nvar BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS;\nvar ITERATOR = wellKnownSymbol('iterator');\nvar KEYS = 'keys';\nvar VALUES = 'values';\nvar ENTRIES = 'entries';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {\n createIteratorConstructor(IteratorConstructor, NAME, next);\n\n var getIterationMethod = function (KIND) {\n if (KIND === DEFAULT && defaultIterator) return defaultIterator;\n if (!BUGGY_SAFARI_ITERATORS && KIND && KIND in IterablePrototype) return IterablePrototype[KIND];\n\n switch (KIND) {\n case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };\n case VALUES: return function values() { return new IteratorConstructor(this, KIND); };\n case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };\n }\n\n return function () { return new IteratorConstructor(this); };\n };\n\n var TO_STRING_TAG = NAME + ' Iterator';\n var INCORRECT_VALUES_NAME = false;\n var IterablePrototype = Iterable.prototype;\n var nativeIterator = IterablePrototype[ITERATOR]\n || IterablePrototype['@@iterator']\n || DEFAULT && IterablePrototype[DEFAULT];\n var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT);\n var anyNativeIterator = NAME === 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;\n var CurrentIteratorPrototype, methods, KEY;\n\n // fix native\n if (anyNativeIterator) {\n CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable()));\n if (CurrentIteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) {\n if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) {\n if (setPrototypeOf) {\n setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype);\n } else if (!isCallable(CurrentIteratorPrototype[ITERATOR])) {\n defineBuiltIn(CurrentIteratorPrototype, ITERATOR, returnThis);\n }\n }\n // Set @@toStringTag to native iterators\n setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true);\n if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis;\n }\n }\n\n // fix Array.prototype.{ values, @@iterator }.name in V8 / FF\n if (PROPER_FUNCTION_NAME && DEFAULT === VALUES && nativeIterator && nativeIterator.name !== VALUES) {\n if (!IS_PURE && CONFIGURABLE_FUNCTION_NAME) {\n createNonEnumerableProperty(IterablePrototype, 'name', VALUES);\n } else {\n INCORRECT_VALUES_NAME = true;\n defaultIterator = function values() { return call(nativeIterator, this); };\n }\n }\n\n // export additional methods\n if (DEFAULT) {\n methods = {\n values: getIterationMethod(VALUES),\n keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),\n entries: getIterationMethod(ENTRIES)\n };\n if (FORCED) for (KEY in methods) {\n if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {\n defineBuiltIn(IterablePrototype, KEY, methods[KEY]);\n }\n } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);\n }\n\n // define iterator\n if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) {\n defineBuiltIn(IterablePrototype, ITERATOR, defaultIterator, { name: DEFAULT });\n }\n Iterators[NAME] = defaultIterator;\n\n return methods;\n};\n","'use strict';\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\nvar create = require('../internals/object-create');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar BUGGY_SAFARI_ITERATORS = false;\n\n// `%IteratorPrototype%` object\n// https://tc39.es/ecma262/#sec-%iteratorprototype%-object\nvar IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\n\n/* eslint-disable es/no-array-prototype-keys -- safe */\nif ([].keys) {\n arrayIterator = [].keys();\n // Safari 8 has buggy iterators w/o `next`\n if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;\n else {\n PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));\n if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n }\n}\n\nvar NEW_ITERATOR_PROTOTYPE = !isObject(IteratorPrototype) || fails(function () {\n var test = {};\n // FF44- legacy iterators case\n return IteratorPrototype[ITERATOR].call(test) !== test;\n});\n\nif (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {};\nelse if (IS_PURE) IteratorPrototype = create(IteratorPrototype);\n\n// `%IteratorPrototype%[@@iterator]()` method\n// https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator\nif (!isCallable(IteratorPrototype[ITERATOR])) {\n defineBuiltIn(IteratorPrototype, ITERATOR, function () {\n return this;\n });\n}\n\nmodule.exports = {\n IteratorPrototype: IteratorPrototype,\n BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS\n};\n","'use strict';\nmodule.exports = {};\n","'use strict';\nvar toLength = require('../internals/to-length');\n\n// `LengthOfArrayLike` abstract operation\n// https://tc39.es/ecma262/#sec-lengthofarraylike\nmodule.exports = function (obj) {\n return toLength(obj.length);\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\nvar hasOwn = require('../internals/has-own-property');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar CONFIGURABLE_FUNCTION_NAME = require('../internals/function-name').CONFIGURABLE;\nvar inspectSource = require('../internals/inspect-source');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar enforceInternalState = InternalStateModule.enforce;\nvar getInternalState = InternalStateModule.get;\nvar $String = String;\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar defineProperty = Object.defineProperty;\nvar stringSlice = uncurryThis(''.slice);\nvar replace = uncurryThis(''.replace);\nvar join = uncurryThis([].join);\n\nvar CONFIGURABLE_LENGTH = DESCRIPTORS && !fails(function () {\n return defineProperty(function () { /* empty */ }, 'length', { value: 8 }).length !== 8;\n});\n\nvar TEMPLATE = String(String).split('String');\n\nvar makeBuiltIn = module.exports = function (value, name, options) {\n if (stringSlice($String(name), 0, 7) === 'Symbol(') {\n name = '[' + replace($String(name), /^Symbol\\(([^)]*)\\).*$/, '$1') + ']';\n }\n if (options && options.getter) name = 'get ' + name;\n if (options && options.setter) name = 'set ' + name;\n if (!hasOwn(value, 'name') || (CONFIGURABLE_FUNCTION_NAME && value.name !== name)) {\n if (DESCRIPTORS) defineProperty(value, 'name', { value: name, configurable: true });\n else value.name = name;\n }\n if (CONFIGURABLE_LENGTH && options && hasOwn(options, 'arity') && value.length !== options.arity) {\n defineProperty(value, 'length', { value: options.arity });\n }\n try {\n if (options && hasOwn(options, 'constructor') && options.constructor) {\n if (DESCRIPTORS) defineProperty(value, 'prototype', { writable: false });\n // in V8 ~ Chrome 53, prototypes of some methods, like `Array.prototype.values`, are non-writable\n } else if (value.prototype) value.prototype = undefined;\n } catch (error) { /* empty */ }\n var state = enforceInternalState(value);\n if (!hasOwn(state, 'source')) {\n state.source = join(TEMPLATE, typeof name == 'string' ? name : '');\n } return value;\n};\n\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n// eslint-disable-next-line no-extend-native -- required\nFunction.prototype.toString = makeBuiltIn(function toString() {\n return isCallable(this) && getInternalState(this).source || inspectSource(this);\n}, 'toString');\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\n// eslint-disable-next-line es/no-map -- safe\nvar MapPrototype = Map.prototype;\n\nmodule.exports = {\n // eslint-disable-next-line es/no-map -- safe\n Map: Map,\n set: uncurryThis(MapPrototype.set),\n get: uncurryThis(MapPrototype.get),\n has: uncurryThis(MapPrototype.has),\n remove: uncurryThis(MapPrototype['delete']),\n proto: MapPrototype\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar iterateSimple = require('../internals/iterate-simple');\nvar MapHelpers = require('../internals/map-helpers');\n\nvar Map = MapHelpers.Map;\nvar MapPrototype = MapHelpers.proto;\nvar forEach = uncurryThis(MapPrototype.forEach);\nvar entries = uncurryThis(MapPrototype.entries);\nvar next = entries(new Map()).next;\n\nmodule.exports = function (map, fn, interruptible) {\n return interruptible ? iterateSimple({ iterator: entries(map), next: next }, function (entry) {\n return fn(entry[1], entry[0]);\n }) : forEach(map, fn);\n};\n","'use strict';\nvar sign = require('../internals/math-sign');\nvar roundTiesToEven = require('../internals/math-round-ties-to-even');\n\nvar abs = Math.abs;\n\nvar EPSILON = 2.220446049250313e-16; // Number.EPSILON\n\nmodule.exports = function (x, FLOAT_EPSILON, FLOAT_MAX_VALUE, FLOAT_MIN_VALUE) {\n var n = +x;\n var absolute = abs(n);\n var s = sign(n);\n if (absolute < FLOAT_MIN_VALUE) return s * roundTiesToEven(absolute / FLOAT_MIN_VALUE / FLOAT_EPSILON) * FLOAT_MIN_VALUE * FLOAT_EPSILON;\n var a = (1 + FLOAT_EPSILON / EPSILON) * absolute;\n var result = a - (a - absolute);\n // eslint-disable-next-line no-self-compare -- NaN check\n if (result > FLOAT_MAX_VALUE || result !== result) return s * Infinity;\n return s * result;\n};\n","'use strict';\nvar floatRound = require('../internals/math-float-round');\n\nvar FLOAT32_EPSILON = 1.1920928955078125e-7; // 2 ** -23;\nvar FLOAT32_MAX_VALUE = 3.4028234663852886e+38; // 2 ** 128 - 2 ** 104\nvar FLOAT32_MIN_VALUE = 1.1754943508222875e-38; // 2 ** -126;\n\n// `Math.fround` method implementation\n// https://tc39.es/ecma262/#sec-math.fround\n// eslint-disable-next-line es/no-math-fround -- safe\nmodule.exports = Math.fround || function fround(x) {\n return floatRound(x, FLOAT32_EPSILON, FLOAT32_MAX_VALUE, FLOAT32_MIN_VALUE);\n};\n","'use strict';\nvar EPSILON = 2.220446049250313e-16; // Number.EPSILON\nvar INVERSE_EPSILON = 1 / EPSILON;\n\nmodule.exports = function (n) {\n return n + INVERSE_EPSILON - INVERSE_EPSILON;\n};\n","'use strict';\n// `Math.scale` method implementation\n// https://rwaldron.github.io/proposal-math-extensions/\nmodule.exports = function scale(x, inLow, inHigh, outLow, outHigh) {\n var nx = +x;\n var nInLow = +inLow;\n var nInHigh = +inHigh;\n var nOutLow = +outLow;\n var nOutHigh = +outHigh;\n // eslint-disable-next-line no-self-compare -- NaN check\n if (nx !== nx || nInLow !== nInLow || nInHigh !== nInHigh || nOutLow !== nOutLow || nOutHigh !== nOutHigh) return NaN;\n if (nx === Infinity || nx === -Infinity) return nx;\n return (nx - nInLow) * (nOutHigh - nOutLow) / (nInHigh - nInLow) + nOutLow;\n};\n","'use strict';\n// `Math.sign` method implementation\n// https://tc39.es/ecma262/#sec-math.sign\n// eslint-disable-next-line es/no-math-sign -- safe\nmodule.exports = Math.sign || function sign(x) {\n var n = +x;\n // eslint-disable-next-line no-self-compare -- NaN check\n return n === 0 || n !== n ? n : n < 0 ? -1 : 1;\n};\n","'use strict';\nvar ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `Math.trunc` method\n// https://tc39.es/ecma262/#sec-math.trunc\n// eslint-disable-next-line es/no-math-trunc -- safe\nmodule.exports = Math.trunc || function trunc(x) {\n var n = +x;\n return (n > 0 ? floor : ceil)(n);\n};\n","'use strict';\nvar aCallable = require('../internals/a-callable');\n\nvar $TypeError = TypeError;\n\nvar PromiseCapability = function (C) {\n var resolve, reject;\n this.promise = new C(function ($$resolve, $$reject) {\n if (resolve !== undefined || reject !== undefined) throw new $TypeError('Bad Promise constructor');\n resolve = $$resolve;\n reject = $$reject;\n });\n this.resolve = aCallable(resolve);\n this.reject = aCallable(reject);\n};\n\n// `NewPromiseCapability` abstract operation\n// https://tc39.es/ecma262/#sec-newpromisecapability\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n","'use strict';\nvar $RangeError = RangeError;\n\nmodule.exports = function (it) {\n // eslint-disable-next-line no-self-compare -- NaN check\n if (it === it) return it;\n throw new $RangeError('NaN is not allowed');\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\n\nvar globalIsFinite = globalThis.isFinite;\n\n// `Number.isFinite` method\n// https://tc39.es/ecma262/#sec-number.isfinite\n// eslint-disable-next-line es/no-number-isfinite -- safe\nmodule.exports = Number.isFinite || function isFinite(it) {\n return typeof it == 'number' && globalIsFinite(it);\n};\n","'use strict';\n/* global ActiveXObject -- old IE, WSH */\nvar anObject = require('../internals/an-object');\nvar definePropertiesModule = require('../internals/object-define-properties');\nvar enumBugKeys = require('../internals/enum-bug-keys');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar html = require('../internals/html');\nvar documentCreateElement = require('../internals/document-create-element');\nvar sharedKey = require('../internals/shared-key');\n\nvar GT = '>';\nvar LT = '<';\nvar PROTOTYPE = 'prototype';\nvar SCRIPT = 'script';\nvar IE_PROTO = sharedKey('IE_PROTO');\n\nvar EmptyConstructor = function () { /* empty */ };\n\nvar scriptTag = function (content) {\n return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\n};\n\n// Create object with fake `null` prototype: use ActiveX Object with cleared prototype\nvar NullProtoObjectViaActiveX = function (activeXDocument) {\n activeXDocument.write(scriptTag(''));\n activeXDocument.close();\n var temp = activeXDocument.parentWindow.Object;\n // eslint-disable-next-line no-useless-assignment -- avoid memory leak\n activeXDocument = null;\n return temp;\n};\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar NullProtoObjectViaIFrame = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = documentCreateElement('iframe');\n var JS = 'java' + SCRIPT + ':';\n var iframeDocument;\n iframe.style.display = 'none';\n html.appendChild(iframe);\n // https://github.com/zloirock/core-js/issues/475\n iframe.src = String(JS);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(scriptTag('document.F=Object'));\n iframeDocument.close();\n return iframeDocument.F;\n};\n\n// Check for document.domain and active x support\n// No need to use active x approach when document.domain is not set\n// see https://github.com/es-shims/es5-shim/issues/150\n// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\n// avoid IE GC bug\nvar activeXDocument;\nvar NullProtoObject = function () {\n try {\n activeXDocument = new ActiveXObject('htmlfile');\n } catch (error) { /* ignore */ }\n NullProtoObject = typeof document != 'undefined'\n ? document.domain && activeXDocument\n ? NullProtoObjectViaActiveX(activeXDocument) // old IE\n : NullProtoObjectViaIFrame()\n : NullProtoObjectViaActiveX(activeXDocument); // WSH\n var length = enumBugKeys.length;\n while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\n return NullProtoObject();\n};\n\nhiddenKeys[IE_PROTO] = true;\n\n// `Object.create` method\n// https://tc39.es/ecma262/#sec-object.create\n// eslint-disable-next-line es/no-object-create -- safe\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n EmptyConstructor[PROTOTYPE] = anObject(O);\n result = new EmptyConstructor();\n EmptyConstructor[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = NullProtoObject();\n return Properties === undefined ? result : definePropertiesModule.f(result, Properties);\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar V8_PROTOTYPE_DEFINE_BUG = require('../internals/v8-prototype-define-bug');\nvar definePropertyModule = require('../internals/object-define-property');\nvar anObject = require('../internals/an-object');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar objectKeys = require('../internals/object-keys');\n\n// `Object.defineProperties` method\n// https://tc39.es/ecma262/#sec-object.defineproperties\n// eslint-disable-next-line es/no-object-defineproperties -- safe\nexports.f = DESCRIPTORS && !V8_PROTOTYPE_DEFINE_BUG ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var props = toIndexedObject(Properties);\n var keys = objectKeys(Properties);\n var length = keys.length;\n var index = 0;\n var key;\n while (length > index) definePropertyModule.f(O, key = keys[index++], props[key]);\n return O;\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\nvar V8_PROTOTYPE_DEFINE_BUG = require('../internals/v8-prototype-define-bug');\nvar anObject = require('../internals/an-object');\nvar toPropertyKey = require('../internals/to-property-key');\n\nvar $TypeError = TypeError;\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar $defineProperty = Object.defineProperty;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nvar ENUMERABLE = 'enumerable';\nvar CONFIGURABLE = 'configurable';\nvar WRITABLE = 'writable';\n\n// `Object.defineProperty` method\n// https://tc39.es/ecma262/#sec-object.defineproperty\nexports.f = DESCRIPTORS ? V8_PROTOTYPE_DEFINE_BUG ? function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPropertyKey(P);\n anObject(Attributes);\n if (typeof O === 'function' && P === 'prototype' && 'value' in Attributes && WRITABLE in Attributes && !Attributes[WRITABLE]) {\n var current = $getOwnPropertyDescriptor(O, P);\n if (current && current[WRITABLE]) {\n O[P] = Attributes.value;\n Attributes = {\n configurable: CONFIGURABLE in Attributes ? Attributes[CONFIGURABLE] : current[CONFIGURABLE],\n enumerable: ENUMERABLE in Attributes ? Attributes[ENUMERABLE] : current[ENUMERABLE],\n writable: false\n };\n }\n } return $defineProperty(O, P, Attributes);\n} : $defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPropertyKey(P);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return $defineProperty(O, P, Attributes);\n } catch (error) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw new $TypeError('Accessors not supported');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar call = require('../internals/function-call');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPropertyKey = require('../internals/to-property-key');\nvar hasOwn = require('../internals/has-own-property');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\n\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor\nexports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPropertyKey(P);\n if (IE8_DOM_DEFINE) try {\n return $getOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (hasOwn(O, P)) return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]);\n};\n","'use strict';\n/* eslint-disable es/no-object-getownpropertynames -- safe */\nvar classof = require('../internals/classof-raw');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar $getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar arraySlice = require('../internals/array-slice');\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n try {\n return $getOwnPropertyNames(it);\n } catch (error) {\n return arraySlice(windowNames);\n }\n};\n\n// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nmodule.exports.f = function getOwnPropertyNames(it) {\n return windowNames && classof(it) === 'Window'\n ? getWindowNames(it)\n : $getOwnPropertyNames(toIndexedObject(it));\n};\n","'use strict';\nvar internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\n\n// `Object.getOwnPropertyNames` method\n// https://tc39.es/ecma262/#sec-object.getownpropertynames\n// eslint-disable-next-line es/no-object-getownpropertynames -- safe\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return internalObjectKeys(O, hiddenKeys);\n};\n","'use strict';\n// eslint-disable-next-line es/no-object-getownpropertysymbols -- safe\nexports.f = Object.getOwnPropertySymbols;\n","'use strict';\nvar hasOwn = require('../internals/has-own-property');\nvar isCallable = require('../internals/is-callable');\nvar toObject = require('../internals/to-object');\nvar sharedKey = require('../internals/shared-key');\nvar CORRECT_PROTOTYPE_GETTER = require('../internals/correct-prototype-getter');\n\nvar IE_PROTO = sharedKey('IE_PROTO');\nvar $Object = Object;\nvar ObjectPrototype = $Object.prototype;\n\n// `Object.getPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.getprototypeof\n// eslint-disable-next-line es/no-object-getprototypeof -- safe\nmodule.exports = CORRECT_PROTOTYPE_GETTER ? $Object.getPrototypeOf : function (O) {\n var object = toObject(O);\n if (hasOwn(object, IE_PROTO)) return object[IE_PROTO];\n var constructor = object.constructor;\n if (isCallable(constructor) && object instanceof constructor) {\n return constructor.prototype;\n } return object instanceof $Object ? ObjectPrototype : null;\n};\n","'use strict';\nvar fails = require('../internals/fails');\nvar isObject = require('../internals/is-object');\nvar classof = require('../internals/classof-raw');\nvar ARRAY_BUFFER_NON_EXTENSIBLE = require('../internals/array-buffer-non-extensible');\n\n// eslint-disable-next-line es/no-object-isextensible -- safe\nvar $isExtensible = Object.isExtensible;\nvar FAILS_ON_PRIMITIVES = fails(function () { $isExtensible(1); });\n\n// `Object.isExtensible` method\n// https://tc39.es/ecma262/#sec-object.isextensible\nmodule.exports = (FAILS_ON_PRIMITIVES || ARRAY_BUFFER_NON_EXTENSIBLE) ? function isExtensible(it) {\n if (!isObject(it)) return false;\n if (ARRAY_BUFFER_NON_EXTENSIBLE && classof(it) === 'ArrayBuffer') return false;\n return $isExtensible ? $isExtensible(it) : true;\n} : $isExtensible;\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nmodule.exports = uncurryThis({}.isPrototypeOf);\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar hasOwn = require('../internals/has-own-property');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar indexOf = require('../internals/array-includes').indexOf;\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar push = uncurryThis([].push);\n\nmodule.exports = function (object, names) {\n var O = toIndexedObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (hasOwn(O, key = names[i++])) {\n ~indexOf(result, key) || push(result, key);\n }\n return result;\n};\n","'use strict';\nvar internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\n// `Object.keys` method\n// https://tc39.es/ecma262/#sec-object.keys\n// eslint-disable-next-line es/no-object-keys -- safe\nmodule.exports = Object.keys || function keys(O) {\n return internalObjectKeys(O, enumBugKeys);\n};\n","'use strict';\nvar $propertyIsEnumerable = {}.propertyIsEnumerable;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1);\n\n// `Object.prototype.propertyIsEnumerable` method implementation\n// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable\nexports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n var descriptor = getOwnPropertyDescriptor(this, V);\n return !!descriptor && descriptor.enumerable;\n} : $propertyIsEnumerable;\n","'use strict';\n/* eslint-disable no-proto -- safe */\nvar uncurryThisAccessor = require('../internals/function-uncurry-this-accessor');\nvar isObject = require('../internals/is-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar aPossiblePrototype = require('../internals/a-possible-prototype');\n\n// `Object.setPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.setprototypeof\n// Works with __proto__ only. Old v8 can't work with null proto objects.\n// eslint-disable-next-line es/no-object-setprototypeof -- safe\nmodule.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () {\n var CORRECT_SETTER = false;\n var test = {};\n var setter;\n try {\n setter = uncurryThisAccessor(Object.prototype, '__proto__', 'set');\n setter(test, []);\n CORRECT_SETTER = test instanceof Array;\n } catch (error) { /* empty */ }\n return function setPrototypeOf(O, proto) {\n requireObjectCoercible(O);\n aPossiblePrototype(proto);\n if (!isObject(O)) return O;\n if (CORRECT_SETTER) setter(O, proto);\n else O.__proto__ = proto;\n return O;\n };\n}() : undefined);\n","'use strict';\nvar call = require('../internals/function-call');\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\n\nvar $TypeError = TypeError;\n\n// `OrdinaryToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-ordinarytoprimitive\nmodule.exports = function (input, pref) {\n var fn, val;\n if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;\n if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input))) return val;\n if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;\n throw new $TypeError(\"Can't convert object to primitive value\");\n};\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar anObject = require('../internals/an-object');\n\nvar concat = uncurryThis([].concat);\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n var keys = getOwnPropertyNamesModule.f(anObject(it));\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys;\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\n\nmodule.exports = globalThis;\n","'use strict';\nmodule.exports = function (exec) {\n try {\n return { error: false, value: exec() };\n } catch (error) {\n return { error: true, value: error };\n }\n};\n","'use strict';\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\nrequire('../modules/es.map');\nrequire('../modules/es.weak-map');\nvar getBuiltIn = require('../internals/get-built-in');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar shared = require('../internals/shared');\n\nvar Map = getBuiltIn('Map');\nvar WeakMap = getBuiltIn('WeakMap');\nvar push = uncurryThis([].push);\n\nvar metadata = shared('metadata');\nvar store = metadata.store || (metadata.store = new WeakMap());\n\nvar getOrCreateMetadataMap = function (target, targetKey, create) {\n var targetMetadata = store.get(target);\n if (!targetMetadata) {\n if (!create) return;\n store.set(target, targetMetadata = new Map());\n }\n var keyMetadata = targetMetadata.get(targetKey);\n if (!keyMetadata) {\n if (!create) return;\n targetMetadata.set(targetKey, keyMetadata = new Map());\n } return keyMetadata;\n};\n\nvar ordinaryHasOwnMetadata = function (MetadataKey, O, P) {\n var metadataMap = getOrCreateMetadataMap(O, P, false);\n return metadataMap === undefined ? false : metadataMap.has(MetadataKey);\n};\n\nvar ordinaryGetOwnMetadata = function (MetadataKey, O, P) {\n var metadataMap = getOrCreateMetadataMap(O, P, false);\n return metadataMap === undefined ? undefined : metadataMap.get(MetadataKey);\n};\n\nvar ordinaryDefineOwnMetadata = function (MetadataKey, MetadataValue, O, P) {\n getOrCreateMetadataMap(O, P, true).set(MetadataKey, MetadataValue);\n};\n\nvar ordinaryOwnMetadataKeys = function (target, targetKey) {\n var metadataMap = getOrCreateMetadataMap(target, targetKey, false);\n var keys = [];\n if (metadataMap) metadataMap.forEach(function (_, key) { push(keys, key); });\n return keys;\n};\n\nvar toMetadataKey = function (it) {\n return it === undefined || typeof it == 'symbol' ? it : String(it);\n};\n\nmodule.exports = {\n store: store,\n getMap: getOrCreateMetadataMap,\n has: ordinaryHasOwnMetadata,\n get: ordinaryGetOwnMetadata,\n set: ordinaryDefineOwnMetadata,\n keys: ordinaryOwnMetadataKeys,\n toKey: toMetadataKey\n};\n","'use strict';\nvar anObject = require('../internals/an-object');\n\n// `RegExp.prototype.flags` getter implementation\n// https://tc39.es/ecma262/#sec-get-regexp.prototype.flags\nmodule.exports = function () {\n var that = anObject(this);\n var result = '';\n if (that.hasIndices) result += 'd';\n if (that.global) result += 'g';\n if (that.ignoreCase) result += 'i';\n if (that.multiline) result += 'm';\n if (that.dotAll) result += 's';\n if (that.unicode) result += 'u';\n if (that.unicodeSets) result += 'v';\n if (that.sticky) result += 'y';\n return result;\n};\n","'use strict';\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\n\nvar $TypeError = TypeError;\n\n// `RequireObjectCoercible` abstract operation\n// https://tc39.es/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n if (isNullOrUndefined(it)) throw new $TypeError(\"Can't call method on \" + it);\n return it;\n};\n","'use strict';\n// `SameValueZero` abstract operation\n// https://tc39.es/ecma262/#sec-samevaluezero\nmodule.exports = function (x, y) {\n // eslint-disable-next-line no-self-compare -- NaN check\n return x === y || x !== x && y !== y;\n};\n","'use strict';\n// `SameValue` abstract operation\n// https://tc39.es/ecma262/#sec-samevalue\n// eslint-disable-next-line es/no-object-is -- safe\nmodule.exports = Object.is || function is(x, y) {\n // eslint-disable-next-line no-self-compare -- NaN check\n return x === y ? x !== 0 || 1 / x === 1 / y : x !== x && y !== y;\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar apply = require('../internals/function-apply');\nvar isCallable = require('../internals/is-callable');\nvar ENVIRONMENT = require('../internals/environment');\nvar USER_AGENT = require('../internals/environment-user-agent');\nvar arraySlice = require('../internals/array-slice');\nvar validateArgumentsLength = require('../internals/validate-arguments-length');\n\nvar Function = globalThis.Function;\n// dirty IE9- and Bun 0.3.0- checks\nvar WRAP = /MSIE .\\./.test(USER_AGENT) || ENVIRONMENT === 'BUN' && (function () {\n var version = globalThis.Bun.version.split('.');\n return version.length < 3 || version[0] === '0' && (version[1] < 3 || version[1] === '3' && version[2] === '0');\n})();\n\n// IE9- / Bun 0.3.0- setTimeout / setInterval / setImmediate additional parameters fix\n// https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#timers\n// https://github.com/oven-sh/bun/issues/1633\nmodule.exports = function (scheduler, hasTimeArg) {\n var firstParamIndex = hasTimeArg ? 2 : 1;\n return WRAP ? function (handler, timeout /* , ...arguments */) {\n var boundArgs = validateArgumentsLength(arguments.length, 1) > firstParamIndex;\n var fn = isCallable(handler) ? handler : Function(handler);\n var params = boundArgs ? arraySlice(arguments, firstParamIndex) : [];\n var callback = boundArgs ? function () {\n apply(fn, this, params);\n } : fn;\n return hasTimeArg ? scheduler(callback, timeout) : scheduler(callback);\n } : scheduler;\n};\n","'use strict';\nvar SetHelpers = require('../internals/set-helpers');\nvar iterate = require('../internals/set-iterate');\n\nvar Set = SetHelpers.Set;\nvar add = SetHelpers.add;\n\nmodule.exports = function (set) {\n var result = new Set();\n iterate(set, function (it) {\n add(result, it);\n });\n return result;\n};\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar SetHelpers = require('../internals/set-helpers');\nvar clone = require('../internals/set-clone');\nvar size = require('../internals/set-size');\nvar getSetRecord = require('../internals/get-set-record');\nvar iterateSet = require('../internals/set-iterate');\nvar iterateSimple = require('../internals/iterate-simple');\n\nvar has = SetHelpers.has;\nvar remove = SetHelpers.remove;\n\n// `Set.prototype.difference` method\n// https://github.com/tc39/proposal-set-methods\nmodule.exports = function difference(other) {\n var O = aSet(this);\n var otherRec = getSetRecord(other);\n var result = clone(O);\n if (size(O) <= otherRec.size) iterateSet(O, function (e) {\n if (otherRec.includes(e)) remove(result, e);\n });\n else iterateSimple(otherRec.getIterator(), function (e) {\n if (has(O, e)) remove(result, e);\n });\n return result;\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\n// eslint-disable-next-line es/no-set -- safe\nvar SetPrototype = Set.prototype;\n\nmodule.exports = {\n // eslint-disable-next-line es/no-set -- safe\n Set: Set,\n add: uncurryThis(SetPrototype.add),\n has: uncurryThis(SetPrototype.has),\n remove: uncurryThis(SetPrototype['delete']),\n proto: SetPrototype\n};\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar SetHelpers = require('../internals/set-helpers');\nvar size = require('../internals/set-size');\nvar getSetRecord = require('../internals/get-set-record');\nvar iterateSet = require('../internals/set-iterate');\nvar iterateSimple = require('../internals/iterate-simple');\n\nvar Set = SetHelpers.Set;\nvar add = SetHelpers.add;\nvar has = SetHelpers.has;\n\n// `Set.prototype.intersection` method\n// https://github.com/tc39/proposal-set-methods\nmodule.exports = function intersection(other) {\n var O = aSet(this);\n var otherRec = getSetRecord(other);\n var result = new Set();\n\n if (size(O) > otherRec.size) {\n iterateSimple(otherRec.getIterator(), function (e) {\n if (has(O, e)) add(result, e);\n });\n } else {\n iterateSet(O, function (e) {\n if (otherRec.includes(e)) add(result, e);\n });\n }\n\n return result;\n};\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar has = require('../internals/set-helpers').has;\nvar size = require('../internals/set-size');\nvar getSetRecord = require('../internals/get-set-record');\nvar iterateSet = require('../internals/set-iterate');\nvar iterateSimple = require('../internals/iterate-simple');\nvar iteratorClose = require('../internals/iterator-close');\n\n// `Set.prototype.isDisjointFrom` method\n// https://tc39.github.io/proposal-set-methods/#Set.prototype.isDisjointFrom\nmodule.exports = function isDisjointFrom(other) {\n var O = aSet(this);\n var otherRec = getSetRecord(other);\n if (size(O) <= otherRec.size) return iterateSet(O, function (e) {\n if (otherRec.includes(e)) return false;\n }, true) !== false;\n var iterator = otherRec.getIterator();\n return iterateSimple(iterator, function (e) {\n if (has(O, e)) return iteratorClose(iterator, 'normal', false);\n }) !== false;\n};\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar size = require('../internals/set-size');\nvar iterate = require('../internals/set-iterate');\nvar getSetRecord = require('../internals/get-set-record');\n\n// `Set.prototype.isSubsetOf` method\n// https://tc39.github.io/proposal-set-methods/#Set.prototype.isSubsetOf\nmodule.exports = function isSubsetOf(other) {\n var O = aSet(this);\n var otherRec = getSetRecord(other);\n if (size(O) > otherRec.size) return false;\n return iterate(O, function (e) {\n if (!otherRec.includes(e)) return false;\n }, true) !== false;\n};\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar has = require('../internals/set-helpers').has;\nvar size = require('../internals/set-size');\nvar getSetRecord = require('../internals/get-set-record');\nvar iterateSimple = require('../internals/iterate-simple');\nvar iteratorClose = require('../internals/iterator-close');\n\n// `Set.prototype.isSupersetOf` method\n// https://tc39.github.io/proposal-set-methods/#Set.prototype.isSupersetOf\nmodule.exports = function isSupersetOf(other) {\n var O = aSet(this);\n var otherRec = getSetRecord(other);\n if (size(O) < otherRec.size) return false;\n var iterator = otherRec.getIterator();\n return iterateSimple(iterator, function (e) {\n if (!has(O, e)) return iteratorClose(iterator, 'normal', false);\n }) !== false;\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar iterateSimple = require('../internals/iterate-simple');\nvar SetHelpers = require('../internals/set-helpers');\n\nvar Set = SetHelpers.Set;\nvar SetPrototype = SetHelpers.proto;\nvar forEach = uncurryThis(SetPrototype.forEach);\nvar keys = uncurryThis(SetPrototype.keys);\nvar next = keys(new Set()).next;\n\nmodule.exports = function (set, fn, interruptible) {\n return interruptible ? iterateSimple({ iterator: keys(set), next: next }, fn) : forEach(set, fn);\n};\n","'use strict';\nvar uncurryThisAccessor = require('../internals/function-uncurry-this-accessor');\nvar SetHelpers = require('../internals/set-helpers');\n\nmodule.exports = uncurryThisAccessor(SetHelpers.proto, 'size', 'get') || function (set) {\n return set.size;\n};\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar DESCRIPTORS = require('../internals/descriptors');\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (CONSTRUCTOR_NAME) {\n var Constructor = getBuiltIn(CONSTRUCTOR_NAME);\n\n if (DESCRIPTORS && Constructor && !Constructor[SPECIES]) {\n defineBuiltInAccessor(Constructor, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n }\n};\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar SetHelpers = require('../internals/set-helpers');\nvar clone = require('../internals/set-clone');\nvar getSetRecord = require('../internals/get-set-record');\nvar iterateSimple = require('../internals/iterate-simple');\n\nvar add = SetHelpers.add;\nvar has = SetHelpers.has;\nvar remove = SetHelpers.remove;\n\n// `Set.prototype.symmetricDifference` method\n// https://github.com/tc39/proposal-set-methods\nmodule.exports = function symmetricDifference(other) {\n var O = aSet(this);\n var keysIter = getSetRecord(other).getIterator();\n var result = clone(O);\n iterateSimple(keysIter, function (e) {\n if (has(O, e)) remove(result, e);\n else add(result, e);\n });\n return result;\n};\n","'use strict';\nvar defineProperty = require('../internals/object-define-property').f;\nvar hasOwn = require('../internals/has-own-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n\nmodule.exports = function (target, TAG, STATIC) {\n if (target && !STATIC) target = target.prototype;\n if (target && !hasOwn(target, TO_STRING_TAG)) {\n defineProperty(target, TO_STRING_TAG, { configurable: true, value: TAG });\n }\n};\n","'use strict';\nvar aSet = require('../internals/a-set');\nvar add = require('../internals/set-helpers').add;\nvar clone = require('../internals/set-clone');\nvar getSetRecord = require('../internals/get-set-record');\nvar iterateSimple = require('../internals/iterate-simple');\n\n// `Set.prototype.union` method\n// https://github.com/tc39/proposal-set-methods\nmodule.exports = function union(other) {\n var O = aSet(this);\n var keysIter = getSetRecord(other).getIterator();\n var result = clone(O);\n iterateSimple(keysIter, function (it) {\n add(result, it);\n });\n return result;\n};\n","'use strict';\nvar shared = require('../internals/shared');\nvar uid = require('../internals/uid');\n\nvar keys = shared('keys');\n\nmodule.exports = function (key) {\n return keys[key] || (keys[key] = uid(key));\n};\n","'use strict';\nvar IS_PURE = require('../internals/is-pure');\nvar globalThis = require('../internals/global-this');\nvar defineGlobalProperty = require('../internals/define-global-property');\n\nvar SHARED = '__core-js_shared__';\nvar store = module.exports = globalThis[SHARED] || defineGlobalProperty(SHARED, {});\n\n(store.versions || (store.versions = [])).push({\n version: '3.41.0',\n mode: IS_PURE ? 'pure' : 'global',\n copyright: '© 2014-2025 Denis Pushkarev (zloirock.ru)',\n license: 'https://github.com/zloirock/core-js/blob/v3.41.0/LICENSE',\n source: 'https://github.com/zloirock/core-js'\n});\n","'use strict';\nvar store = require('../internals/shared-store');\n\nmodule.exports = function (key, value) {\n return store[key] || (store[key] = value || {});\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\nvar toString = require('../internals/to-string');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nvar charAt = uncurryThis(''.charAt);\nvar charCodeAt = uncurryThis(''.charCodeAt);\nvar stringSlice = uncurryThis(''.slice);\n\nvar createMethod = function (CONVERT_TO_STRING) {\n return function ($this, pos) {\n var S = toString(requireObjectCoercible($this));\n var position = toIntegerOrInfinity(pos);\n var size = S.length;\n var first, second;\n if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\n first = charCodeAt(S, position);\n return first < 0xD800 || first > 0xDBFF || position + 1 === size\n || (second = charCodeAt(S, position + 1)) < 0xDC00 || second > 0xDFFF\n ? CONVERT_TO_STRING\n ? charAt(S, position)\n : first\n : CONVERT_TO_STRING\n ? stringSlice(S, position, position + 2)\n : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n };\n};\n\nmodule.exports = {\n // `String.prototype.codePointAt` method\n // https://tc39.es/ecma262/#sec-string.prototype.codepointat\n codeAt: createMethod(false),\n // `String.prototype.at` method\n // https://github.com/mathiasbynens/String.prototype.at\n charAt: createMethod(true)\n};\n","'use strict';\n/* eslint-disable es/no-symbol -- required for testing */\nvar V8_VERSION = require('../internals/environment-v8-version');\nvar fails = require('../internals/fails');\nvar globalThis = require('../internals/global-this');\n\nvar $String = globalThis.String;\n\n// eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n var symbol = Symbol('symbol detection');\n // Chrome 38 Symbol has incorrect toString conversion\n // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances\n // nb: Do not call `String` directly to avoid this being optimized out to `symbol+''` which will,\n // of course, fail.\n return !$String(symbol) || !(Object(symbol) instanceof Symbol) ||\n // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances\n !Symbol.sham && V8_VERSION && V8_VERSION < 41;\n});\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar apply = require('../internals/function-apply');\nvar bind = require('../internals/function-bind-context');\nvar isCallable = require('../internals/is-callable');\nvar hasOwn = require('../internals/has-own-property');\nvar fails = require('../internals/fails');\nvar html = require('../internals/html');\nvar arraySlice = require('../internals/array-slice');\nvar createElement = require('../internals/document-create-element');\nvar validateArgumentsLength = require('../internals/validate-arguments-length');\nvar IS_IOS = require('../internals/environment-is-ios');\nvar IS_NODE = require('../internals/environment-is-node');\n\nvar set = globalThis.setImmediate;\nvar clear = globalThis.clearImmediate;\nvar process = globalThis.process;\nvar Dispatch = globalThis.Dispatch;\nvar Function = globalThis.Function;\nvar MessageChannel = globalThis.MessageChannel;\nvar String = globalThis.String;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar $location, defer, channel, port;\n\nfails(function () {\n // Deno throws a ReferenceError on `location` access without `--location` flag\n $location = globalThis.location;\n});\n\nvar run = function (id) {\n if (hasOwn(queue, id)) {\n var fn = queue[id];\n delete queue[id];\n fn();\n }\n};\n\nvar runner = function (id) {\n return function () {\n run(id);\n };\n};\n\nvar eventListener = function (event) {\n run(event.data);\n};\n\nvar globalPostMessageDefer = function (id) {\n // old engines have not location.origin\n globalThis.postMessage(String(id), $location.protocol + '//' + $location.host);\n};\n\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!set || !clear) {\n set = function setImmediate(handler) {\n validateArgumentsLength(arguments.length, 1);\n var fn = isCallable(handler) ? handler : Function(handler);\n var args = arraySlice(arguments, 1);\n queue[++counter] = function () {\n apply(fn, undefined, args);\n };\n defer(counter);\n return counter;\n };\n clear = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (IS_NODE) {\n defer = function (id) {\n process.nextTick(runner(id));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(runner(id));\n };\n // Browsers with MessageChannel, includes WebWorkers\n // except iOS - https://github.com/zloirock/core-js/issues/624\n } else if (MessageChannel && !IS_IOS) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = eventListener;\n defer = bind(port.postMessage, port);\n // Browsers with postMessage, skip WebWorkers\n // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n } else if (\n globalThis.addEventListener &&\n isCallable(globalThis.postMessage) &&\n !globalThis.importScripts &&\n $location && $location.protocol !== 'file:' &&\n !fails(globalPostMessageDefer)\n ) {\n defer = globalPostMessageDefer;\n globalThis.addEventListener('message', eventListener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in createElement('script')) {\n defer = function (id) {\n html.appendChild(createElement('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(runner(id), 0);\n };\n }\n}\n\nmodule.exports = {\n set: set,\n clear: clear\n};\n","'use strict';\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\nmodule.exports = function (index, length) {\n var integer = toIntegerOrInfinity(index);\n return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n","'use strict';\nvar toPrimitive = require('../internals/to-primitive');\n\nvar $TypeError = TypeError;\n\n// `ToBigInt` abstract operation\n// https://tc39.es/ecma262/#sec-tobigint\nmodule.exports = function (argument) {\n var prim = toPrimitive(argument, 'number');\n if (typeof prim == 'number') throw new $TypeError(\"Can't convert number to bigint\");\n // eslint-disable-next-line es/no-bigint -- safe\n return BigInt(prim);\n};\n","'use strict';\n// toObject with fallback for non-array-like ES3 strings\nvar IndexedObject = require('../internals/indexed-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nmodule.exports = function (it) {\n return IndexedObject(requireObjectCoercible(it));\n};\n","'use strict';\nvar trunc = require('../internals/math-trunc');\n\n// `ToIntegerOrInfinity` abstract operation\n// https://tc39.es/ecma262/#sec-tointegerorinfinity\nmodule.exports = function (argument) {\n var number = +argument;\n // eslint-disable-next-line no-self-compare -- NaN check\n return number !== number || number === 0 ? 0 : trunc(number);\n};\n","'use strict';\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.es/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n var len = toIntegerOrInfinity(argument);\n return len > 0 ? min(len, 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n","'use strict';\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nvar $Object = Object;\n\n// `ToObject` abstract operation\n// https://tc39.es/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n return $Object(requireObjectCoercible(argument));\n};\n","'use strict';\nvar toPositiveInteger = require('../internals/to-positive-integer');\n\nvar $RangeError = RangeError;\n\nmodule.exports = function (it, BYTES) {\n var offset = toPositiveInteger(it);\n if (offset % BYTES) throw new $RangeError('Wrong offset');\n return offset;\n};\n","'use strict';\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\n\nvar $RangeError = RangeError;\n\nmodule.exports = function (it) {\n var result = toIntegerOrInfinity(it);\n if (result < 0) throw new $RangeError(\"The argument can't be less than 0\");\n return result;\n};\n","'use strict';\nvar call = require('../internals/function-call');\nvar isObject = require('../internals/is-object');\nvar isSymbol = require('../internals/is-symbol');\nvar getMethod = require('../internals/get-method');\nvar ordinaryToPrimitive = require('../internals/ordinary-to-primitive');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar $TypeError = TypeError;\nvar TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\n\n// `ToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-toprimitive\nmodule.exports = function (input, pref) {\n if (!isObject(input) || isSymbol(input)) return input;\n var exoticToPrim = getMethod(input, TO_PRIMITIVE);\n var result;\n if (exoticToPrim) {\n if (pref === undefined) pref = 'default';\n result = call(exoticToPrim, input, pref);\n if (!isObject(result) || isSymbol(result)) return result;\n throw new $TypeError(\"Can't convert object to primitive value\");\n }\n if (pref === undefined) pref = 'number';\n return ordinaryToPrimitive(input, pref);\n};\n","'use strict';\nvar toPrimitive = require('../internals/to-primitive');\nvar isSymbol = require('../internals/is-symbol');\n\n// `ToPropertyKey` abstract operation\n// https://tc39.es/ecma262/#sec-topropertykey\nmodule.exports = function (argument) {\n var key = toPrimitive(argument, 'string');\n return isSymbol(key) ? key : key + '';\n};\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar isCallable = require('../internals/is-callable');\nvar isIterable = require('../internals/is-iterable');\nvar isObject = require('../internals/is-object');\n\nvar Set = getBuiltIn('Set');\n\nvar isSetLike = function (it) {\n return isObject(it)\n && typeof it.size == 'number'\n && isCallable(it.has)\n && isCallable(it.keys);\n};\n\n// fallback old -> new set methods proposal arguments\nmodule.exports = function (it) {\n if (isSetLike(it)) return it;\n return isIterable(it) ? new Set(it) : it;\n};\n","'use strict';\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar test = {};\n\ntest[TO_STRING_TAG] = 'z';\n\nmodule.exports = String(test) === '[object z]';\n","'use strict';\nvar classof = require('../internals/classof');\n\nvar $String = String;\n\nmodule.exports = function (argument) {\n if (classof(argument) === 'Symbol') throw new TypeError('Cannot convert a Symbol value to a string');\n return $String(argument);\n};\n","'use strict';\nvar $String = String;\n\nmodule.exports = function (argument) {\n try {\n return $String(argument);\n } catch (error) {\n return 'Object';\n }\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nvar id = 0;\nvar postfix = Math.random();\nvar toString = uncurryThis(1.0.toString);\n\nmodule.exports = function (key) {\n return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36);\n};\n","'use strict';\n/* eslint-disable es/no-symbol -- required for testing */\nvar NATIVE_SYMBOL = require('../internals/symbol-constructor-detection');\n\nmodule.exports = NATIVE_SYMBOL &&\n !Symbol.sham &&\n typeof Symbol.iterator == 'symbol';\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\n\n// V8 ~ Chrome 36-\n// https://bugs.chromium.org/p/v8/issues/detail?id=3334\nmodule.exports = DESCRIPTORS && fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty(function () { /* empty */ }, 'prototype', {\n value: 42,\n writable: false\n }).prototype !== 42;\n});\n","'use strict';\nvar $TypeError = TypeError;\n\nmodule.exports = function (passed, required) {\n if (passed < required) throw new $TypeError('Not enough arguments');\n return passed;\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar isCallable = require('../internals/is-callable');\n\nvar WeakMap = globalThis.WeakMap;\n\nmodule.exports = isCallable(WeakMap) && /native code/.test(String(WeakMap));\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\n// eslint-disable-next-line es/no-weak-map -- safe\nvar WeakMapPrototype = WeakMap.prototype;\n\nmodule.exports = {\n // eslint-disable-next-line es/no-weak-map -- safe\n WeakMap: WeakMap,\n set: uncurryThis(WeakMapPrototype.set),\n get: uncurryThis(WeakMapPrototype.get),\n has: uncurryThis(WeakMapPrototype.has),\n remove: uncurryThis(WeakMapPrototype['delete'])\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\n// eslint-disable-next-line es/no-weak-set -- safe\nvar WeakSetPrototype = WeakSet.prototype;\n\nmodule.exports = {\n // eslint-disable-next-line es/no-weak-set -- safe\n WeakSet: WeakSet,\n add: uncurryThis(WeakSetPrototype.add),\n has: uncurryThis(WeakSetPrototype.has),\n remove: uncurryThis(WeakSetPrototype['delete'])\n};\n","'use strict';\nvar path = require('../internals/path');\nvar hasOwn = require('../internals/has-own-property');\nvar wrappedWellKnownSymbolModule = require('../internals/well-known-symbol-wrapped');\nvar defineProperty = require('../internals/object-define-property').f;\n\nmodule.exports = function (NAME) {\n var Symbol = path.Symbol || (path.Symbol = {});\n if (!hasOwn(Symbol, NAME)) defineProperty(Symbol, NAME, {\n value: wrappedWellKnownSymbolModule.f(NAME)\n });\n};\n","'use strict';\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nexports.f = wellKnownSymbol;\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar shared = require('../internals/shared');\nvar hasOwn = require('../internals/has-own-property');\nvar uid = require('../internals/uid');\nvar NATIVE_SYMBOL = require('../internals/symbol-constructor-detection');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar Symbol = globalThis.Symbol;\nvar WellKnownSymbolsStore = shared('wks');\nvar createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol['for'] || Symbol : Symbol && Symbol.withoutSetter || uid;\n\nmodule.exports = function (name) {\n if (!hasOwn(WellKnownSymbolsStore, name)) {\n WellKnownSymbolsStore[name] = NATIVE_SYMBOL && hasOwn(Symbol, name)\n ? Symbol[name]\n : createWellKnownSymbol('Symbol.' + name);\n } return WellKnownSymbolsStore[name];\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar $includes = require('../internals/array-includes').includes;\nvar fails = require('../internals/fails');\nvar addToUnscopables = require('../internals/add-to-unscopables');\n\n// FF99+ bug\nvar BROKEN_ON_SPARSE = fails(function () {\n // eslint-disable-next-line es/no-array-prototype-includes -- detection\n return !Array(1).includes();\n});\n\n// `Array.prototype.includes` method\n// https://tc39.es/ecma262/#sec-array.prototype.includes\n$({ target: 'Array', proto: true, forced: BROKEN_ON_SPARSE }, {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('includes');\n","'use strict';\nvar collection = require('../internals/collection');\nvar collectionStrong = require('../internals/collection-strong');\n\n// `Map` constructor\n// https://tc39.es/ecma262/#sec-map-objects\ncollection('Map', function (init) {\n return function Map() { return init(this, arguments.length ? arguments[0] : undefined); };\n}, collectionStrong);\n","'use strict';\nvar $ = require('../internals/export');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar aCallable = require('../internals/a-callable');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar iterate = require('../internals/iterate');\nvar MapHelpers = require('../internals/map-helpers');\nvar IS_PURE = require('../internals/is-pure');\nvar fails = require('../internals/fails');\n\nvar Map = MapHelpers.Map;\nvar has = MapHelpers.has;\nvar get = MapHelpers.get;\nvar set = MapHelpers.set;\nvar push = uncurryThis([].push);\n\nvar DOES_NOT_WORK_WITH_PRIMITIVES = IS_PURE || fails(function () {\n return Map.groupBy('ab', function (it) {\n return it;\n }).get('a').length !== 1;\n});\n\n// `Map.groupBy` method\n// https://tc39.es/ecma262/#sec-map.groupby\n$({ target: 'Map', stat: true, forced: IS_PURE || DOES_NOT_WORK_WITH_PRIMITIVES }, {\n groupBy: function groupBy(items, callbackfn) {\n requireObjectCoercible(items);\n aCallable(callbackfn);\n var map = new Map();\n var k = 0;\n iterate(items, function (value) {\n var key = callbackfn(value, k++);\n if (!has(map, key)) set(map, key, [value]);\n else push(get(map, key), value);\n });\n return map;\n }\n});\n","'use strict';\n// TODO: Remove this module from `core-js@4` since it's replaced to module below\nrequire('../modules/es.map.constructor');\n","'use strict';\nvar $ = require('../internals/export');\nvar globalThis = require('../internals/global-this');\nvar apply = require('../internals/function-apply');\nvar slice = require('../internals/array-slice');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar aCallable = require('../internals/a-callable');\nvar perform = require('../internals/perform');\n\nvar Promise = globalThis.Promise;\n\nvar ACCEPT_ARGUMENTS = false;\n// Avoiding the use of polyfills of the previous iteration of this proposal\n// that does not accept arguments of the callback\nvar FORCED = !Promise || !Promise['try'] || perform(function () {\n Promise['try'](function (argument) {\n ACCEPT_ARGUMENTS = argument === 8;\n }, 8);\n}).error || !ACCEPT_ARGUMENTS;\n\n// `Promise.try` method\n// https://tc39.es/ecma262/#sec-promise.try\n$({ target: 'Promise', stat: true, forced: FORCED }, {\n 'try': function (callbackfn /* , ...args */) {\n var args = arguments.length > 1 ? slice(arguments, 1) : [];\n var promiseCapability = newPromiseCapabilityModule.f(this);\n var result = perform(function () {\n return apply(aCallable(callbackfn), undefined, args);\n });\n (result.error ? promiseCapability.reject : promiseCapability.resolve)(result.value);\n return promiseCapability.promise;\n }\n});\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\nvar regExpFlags = require('../internals/regexp-flags');\nvar fails = require('../internals/fails');\n\n// babel-minify and Closure Compiler transpiles RegExp('.', 'd') -> /./d and it causes SyntaxError\nvar RegExp = globalThis.RegExp;\nvar RegExpPrototype = RegExp.prototype;\n\nvar FORCED = DESCRIPTORS && fails(function () {\n var INDICES_SUPPORT = true;\n try {\n RegExp('.', 'd');\n } catch (error) {\n INDICES_SUPPORT = false;\n }\n\n var O = {};\n // modern V8 bug\n var calls = '';\n var expected = INDICES_SUPPORT ? 'dgimsy' : 'gimsy';\n\n var addGetter = function (key, chr) {\n // eslint-disable-next-line es/no-object-defineproperty -- safe\n Object.defineProperty(O, key, { get: function () {\n calls += chr;\n return true;\n } });\n };\n\n var pairs = {\n dotAll: 's',\n global: 'g',\n ignoreCase: 'i',\n multiline: 'm',\n sticky: 'y'\n };\n\n if (INDICES_SUPPORT) pairs.hasIndices = 'd';\n\n for (var key in pairs) addGetter(key, pairs[key]);\n\n // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\n var result = Object.getOwnPropertyDescriptor(RegExpPrototype, 'flags').get.call(O);\n\n return result !== expected || calls !== expected;\n});\n\n// `RegExp.prototype.flags` getter\n// https://tc39.es/ecma262/#sec-get-regexp.prototype.flags\nif (FORCED) defineBuiltInAccessor(RegExpPrototype, 'flags', {\n configurable: true,\n get: regExpFlags\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $fill = require('../internals/array-fill');\nvar toBigInt = require('../internals/to-big-int');\nvar classof = require('../internals/classof');\nvar call = require('../internals/function-call');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar fails = require('../internals/fails');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar slice = uncurryThis(''.slice);\n\n// V8 ~ Chrome < 59, Safari < 14.1, FF < 55, Edge <=18\nvar CONVERSION_BUG = fails(function () {\n var count = 0;\n // eslint-disable-next-line es/no-typed-arrays -- safe\n new Int8Array(2).fill({ valueOf: function () { return count++; } });\n return count !== 1;\n});\n\n// `%TypedArray%.prototype.fill` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.fill\nexportTypedArrayMethod('fill', function fill(value /* , start, end */) {\n var length = arguments.length;\n aTypedArray(this);\n var actualValue = slice(classof(this), 0, 3) === 'Big' ? toBigInt(value) : +value;\n return call($fill, this, actualValue, length > 1 ? arguments[1] : undefined, length > 2 ? arguments[2] : undefined);\n}, CONVERSION_BUG);\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar call = require('../internals/function-call');\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar toOffset = require('../internals/to-offset');\nvar toIndexedObject = require('../internals/to-object');\nvar fails = require('../internals/fails');\n\nvar RangeError = globalThis.RangeError;\nvar Int8Array = globalThis.Int8Array;\nvar Int8ArrayPrototype = Int8Array && Int8Array.prototype;\nvar $set = Int8ArrayPrototype && Int8ArrayPrototype.set;\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\nvar WORKS_WITH_OBJECTS_AND_GENERIC_ON_TYPED_ARRAYS = !fails(function () {\n // eslint-disable-next-line es/no-typed-arrays -- required for testing\n var array = new Uint8ClampedArray(2);\n call($set, array, { length: 1, 0: 3 }, 1);\n return array[1] !== 3;\n});\n\n// https://bugs.chromium.org/p/v8/issues/detail?id=11294 and other\nvar TO_OBJECT_BUG = WORKS_WITH_OBJECTS_AND_GENERIC_ON_TYPED_ARRAYS && ArrayBufferViewCore.NATIVE_ARRAY_BUFFER_VIEWS && fails(function () {\n var array = new Int8Array(2);\n array.set(1);\n array.set('2', 1);\n return array[0] !== 0 || array[1] !== 2;\n});\n\n// `%TypedArray%.prototype.set` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.set\nexportTypedArrayMethod('set', function set(arrayLike /* , offset */) {\n aTypedArray(this);\n var offset = toOffset(arguments.length > 1 ? arguments[1] : undefined, 1);\n var src = toIndexedObject(arrayLike);\n if (WORKS_WITH_OBJECTS_AND_GENERIC_ON_TYPED_ARRAYS) return call($set, this, src, offset);\n var length = this.length;\n var len = lengthOfArrayLike(src);\n var index = 0;\n if (len + offset > length) throw new RangeError('Wrong length');\n while (index < len) this[offset + index] = src[index++];\n}, !WORKS_WITH_OBJECTS_AND_GENERIC_ON_TYPED_ARRAYS || TO_OBJECT_BUG);\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar uncurryThis = require('../internals/function-uncurry-this-clause');\nvar fails = require('../internals/fails');\nvar aCallable = require('../internals/a-callable');\nvar internalSort = require('../internals/array-sort');\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar FF = require('../internals/environment-ff-version');\nvar IE_OR_EDGE = require('../internals/environment-is-ie-or-edge');\nvar V8 = require('../internals/environment-v8-version');\nvar WEBKIT = require('../internals/environment-webkit-version');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar Uint16Array = globalThis.Uint16Array;\nvar nativeSort = Uint16Array && uncurryThis(Uint16Array.prototype.sort);\n\n// WebKit\nvar ACCEPT_INCORRECT_ARGUMENTS = !!nativeSort && !(fails(function () {\n nativeSort(new Uint16Array(2), null);\n}) && fails(function () {\n nativeSort(new Uint16Array(2), {});\n}));\n\nvar STABLE_SORT = !!nativeSort && !fails(function () {\n // feature detection can be too slow, so check engines versions\n if (V8) return V8 < 74;\n if (FF) return FF < 67;\n if (IE_OR_EDGE) return true;\n if (WEBKIT) return WEBKIT < 602;\n\n var array = new Uint16Array(516);\n var expected = Array(516);\n var index, mod;\n\n for (index = 0; index < 516; index++) {\n mod = index % 4;\n array[index] = 515 - index;\n expected[index] = index - 2 * mod + 3;\n }\n\n nativeSort(array, function (a, b) {\n return (a / 4 | 0) - (b / 4 | 0);\n });\n\n for (index = 0; index < 516; index++) {\n if (array[index] !== expected[index]) return true;\n }\n});\n\nvar getSortCompare = function (comparefn) {\n return function (x, y) {\n if (comparefn !== undefined) return +comparefn(x, y) || 0;\n // eslint-disable-next-line no-self-compare -- NaN check\n if (y !== y) return -1;\n // eslint-disable-next-line no-self-compare -- NaN check\n if (x !== x) return 1;\n if (x === 0 && y === 0) return 1 / x > 0 && 1 / y < 0 ? 1 : -1;\n return x > y;\n };\n};\n\n// `%TypedArray%.prototype.sort` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.sort\nexportTypedArrayMethod('sort', function sort(comparefn) {\n if (comparefn !== undefined) aCallable(comparefn);\n if (STABLE_SORT) return nativeSort(this, comparefn);\n\n return internalSort(aTypedArray(this), getSortCompare(comparefn));\n}, !STABLE_SORT || ACCEPT_INCORRECT_ARGUMENTS);\n","'use strict';\nvar FREEZING = require('../internals/freezing');\nvar globalThis = require('../internals/global-this');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar defineBuiltIns = require('../internals/define-built-ins');\nvar InternalMetadataModule = require('../internals/internal-metadata');\nvar collection = require('../internals/collection');\nvar collectionWeak = require('../internals/collection-weak');\nvar isObject = require('../internals/is-object');\nvar enforceInternalState = require('../internals/internal-state').enforce;\nvar fails = require('../internals/fails');\nvar NATIVE_WEAK_MAP = require('../internals/weak-map-basic-detection');\n\nvar $Object = Object;\n// eslint-disable-next-line es/no-array-isarray -- safe\nvar isArray = Array.isArray;\n// eslint-disable-next-line es/no-object-isextensible -- safe\nvar isExtensible = $Object.isExtensible;\n// eslint-disable-next-line es/no-object-isfrozen -- safe\nvar isFrozen = $Object.isFrozen;\n// eslint-disable-next-line es/no-object-issealed -- safe\nvar isSealed = $Object.isSealed;\n// eslint-disable-next-line es/no-object-freeze -- safe\nvar freeze = $Object.freeze;\n// eslint-disable-next-line es/no-object-seal -- safe\nvar seal = $Object.seal;\n\nvar IS_IE11 = !globalThis.ActiveXObject && 'ActiveXObject' in globalThis;\nvar InternalWeakMap;\n\nvar wrapper = function (init) {\n return function WeakMap() {\n return init(this, arguments.length ? arguments[0] : undefined);\n };\n};\n\n// `WeakMap` constructor\n// https://tc39.es/ecma262/#sec-weakmap-constructor\nvar $WeakMap = collection('WeakMap', wrapper, collectionWeak);\nvar WeakMapPrototype = $WeakMap.prototype;\nvar nativeSet = uncurryThis(WeakMapPrototype.set);\n\n// Chakra Edge bug: adding frozen arrays to WeakMap unfreeze them\nvar hasMSEdgeFreezingBug = function () {\n return FREEZING && fails(function () {\n var frozenArray = freeze([]);\n nativeSet(new $WeakMap(), frozenArray, 1);\n return !isFrozen(frozenArray);\n });\n};\n\n// IE11 WeakMap frozen keys fix\n// We can't use feature detection because it crash some old IE builds\n// https://github.com/zloirock/core-js/issues/485\nif (NATIVE_WEAK_MAP) if (IS_IE11) {\n InternalWeakMap = collectionWeak.getConstructor(wrapper, 'WeakMap', true);\n InternalMetadataModule.enable();\n var nativeDelete = uncurryThis(WeakMapPrototype['delete']);\n var nativeHas = uncurryThis(WeakMapPrototype.has);\n var nativeGet = uncurryThis(WeakMapPrototype.get);\n defineBuiltIns(WeakMapPrototype, {\n 'delete': function (key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceInternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeDelete(this, key) || state.frozen['delete'](key);\n } return nativeDelete(this, key);\n },\n has: function has(key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceInternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeHas(this, key) || state.frozen.has(key);\n } return nativeHas(this, key);\n },\n get: function get(key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceInternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeHas(this, key) ? nativeGet(this, key) : state.frozen.get(key);\n } return nativeGet(this, key);\n },\n set: function set(key, value) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceInternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n nativeHas(this, key) ? nativeSet(this, key, value) : state.frozen.set(key, value);\n } else nativeSet(this, key, value);\n return this;\n }\n });\n// Chakra Edge frozen keys fix\n} else if (hasMSEdgeFreezingBug()) {\n defineBuiltIns(WeakMapPrototype, {\n set: function set(key, value) {\n var arrayIntegrityLevel;\n if (isArray(key)) {\n if (isFrozen(key)) arrayIntegrityLevel = freeze;\n else if (isSealed(key)) arrayIntegrityLevel = seal;\n }\n nativeSet(this, key, value);\n if (arrayIntegrityLevel) arrayIntegrityLevel(key);\n return this;\n }\n });\n}\n","'use strict';\n// TODO: Remove this module from `core-js@4` since it's replaced to module below\nrequire('../modules/es.weak-map.constructor');\n","'use strict';\n// TODO: Remove from `core-js@4`\nvar DESCRIPTORS = require('../internals/descriptors');\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar toObject = require('../internals/to-object');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\n\n// `Array.prototype.lastIndex` getter\n// https://github.com/keithamus/proposal-array-last\nif (DESCRIPTORS) {\n defineBuiltInAccessor(Array.prototype, 'lastIndex', {\n configurable: true,\n get: function lastIndex() {\n var O = toObject(this);\n var len = lengthOfArrayLike(O);\n return len === 0 ? 0 : len - 1;\n }\n });\n\n addToUnscopables('lastIndex');\n}\n","'use strict';\n// TODO: Remove from `core-js@4`\nvar DESCRIPTORS = require('../internals/descriptors');\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar toObject = require('../internals/to-object');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\n\n// `Array.prototype.lastIndex` accessor\n// https://github.com/keithamus/proposal-array-last\nif (DESCRIPTORS) {\n defineBuiltInAccessor(Array.prototype, 'lastItem', {\n configurable: true,\n get: function lastItem() {\n var O = toObject(this);\n var len = lengthOfArrayLike(O);\n return len === 0 ? undefined : O[len - 1];\n },\n set: function lastItem(value) {\n var O = toObject(this);\n var len = lengthOfArrayLike(O);\n return O[len === 0 ? 0 : len - 1] = value;\n }\n });\n\n addToUnscopables('lastItem');\n}\n","'use strict';\nvar $ = require('../internals/export');\nvar apply = require('../internals/function-apply');\nvar getCompositeKeyNode = require('../internals/composite-key');\nvar getBuiltIn = require('../internals/get-built-in');\nvar create = require('../internals/object-create');\n\nvar $Object = Object;\n\nvar initializer = function () {\n var freeze = getBuiltIn('Object', 'freeze');\n return freeze ? freeze(create(null)) : create(null);\n};\n\n// https://github.com/tc39/proposal-richer-keys/tree/master/compositeKey\n$({ global: true, forced: true }, {\n compositeKey: function compositeKey() {\n return apply(getCompositeKeyNode, $Object, arguments).get('object', initializer);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar getCompositeKeyNode = require('../internals/composite-key');\nvar getBuiltIn = require('../internals/get-built-in');\nvar apply = require('../internals/function-apply');\n\n// https://github.com/tc39/proposal-richer-keys/tree/master/compositeKey\n$({ global: true, forced: true }, {\n compositeSymbol: function compositeSymbol() {\n if (arguments.length === 1 && typeof arguments[0] == 'string') return getBuiltIn('Symbol')['for'](arguments[0]);\n return apply(getCompositeKeyNode, null, arguments).get('symbol', getBuiltIn('Symbol'));\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar aMap = require('../internals/a-map');\nvar remove = require('../internals/map-helpers').remove;\n\n// `Map.prototype.deleteAll` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', proto: true, real: true, forced: true }, {\n deleteAll: function deleteAll(/* ...elements */) {\n var collection = aMap(this);\n var allDeleted = true;\n var wasDeleted;\n for (var k = 0, len = arguments.length; k < len; k++) {\n wasDeleted = remove(collection, arguments[k]);\n allDeleted = allDeleted && wasDeleted;\n } return !!allDeleted;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar bind = require('../internals/function-bind-context');\nvar aMap = require('../internals/a-map');\nvar iterate = require('../internals/map-iterate');\n\n// `Map.prototype.every` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', proto: true, real: true, forced: true }, {\n every: function every(callbackfn /* , thisArg */) {\n var map = aMap(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n return iterate(map, function (value, key) {\n if (!boundFunction(value, key, map)) return false;\n }, true) !== false;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar bind = require('../internals/function-bind-context');\nvar aMap = require('../internals/a-map');\nvar MapHelpers = require('../internals/map-helpers');\nvar iterate = require('../internals/map-iterate');\n\nvar Map = MapHelpers.Map;\nvar set = MapHelpers.set;\n\n// `Map.prototype.filter` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', proto: true, real: true, forced: true }, {\n filter: function filter(callbackfn /* , thisArg */) {\n var map = aMap(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n var newMap = new Map();\n iterate(map, function (value, key) {\n if (boundFunction(value, key, map)) set(newMap, key, value);\n });\n return newMap;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar bind = require('../internals/function-bind-context');\nvar aMap = require('../internals/a-map');\nvar iterate = require('../internals/map-iterate');\n\n// `Map.prototype.findKey` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', proto: true, real: true, forced: true }, {\n findKey: function findKey(callbackfn /* , thisArg */) {\n var map = aMap(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n var result = iterate(map, function (value, key) {\n if (boundFunction(value, key, map)) return { key: key };\n }, true);\n return result && result.key;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar bind = require('../internals/function-bind-context');\nvar aMap = require('../internals/a-map');\nvar iterate = require('../internals/map-iterate');\n\n// `Map.prototype.find` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', proto: true, real: true, forced: true }, {\n find: function find(callbackfn /* , thisArg */) {\n var map = aMap(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n var result = iterate(map, function (value, key) {\n if (boundFunction(value, key, map)) return { value: value };\n }, true);\n return result && result.value;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar MapHelpers = require('../internals/map-helpers');\nvar createCollectionFrom = require('../internals/collection-from');\n\n// `Map.from` method\n// https://tc39.github.io/proposal-setmap-offrom/#sec-map.from\n$({ target: 'Map', stat: true, forced: true }, {\n from: createCollectionFrom(MapHelpers.Map, MapHelpers.set, true)\n});\n","'use strict';\n// TODO: Remove from `core-js@4`\nrequire('../modules/es.map.group-by');\n","'use strict';\nvar $ = require('../internals/export');\nvar sameValueZero = require('../internals/same-value-zero');\nvar aMap = require('../internals/a-map');\nvar iterate = require('../internals/map-iterate');\n\n// `Map.prototype.includes` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', proto: true, real: true, forced: true }, {\n includes: function includes(searchElement) {\n return iterate(aMap(this), function (value) {\n if (sameValueZero(value, searchElement)) return true;\n }, true) === true;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar iterate = require('../internals/iterate');\nvar isCallable = require('../internals/is-callable');\nvar aCallable = require('../internals/a-callable');\nvar Map = require('../internals/map-helpers').Map;\n\n// `Map.keyBy` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', stat: true, forced: true }, {\n keyBy: function keyBy(iterable, keyDerivative) {\n var C = isCallable(this) ? this : Map;\n var newMap = new C();\n aCallable(keyDerivative);\n var setter = aCallable(newMap.set);\n iterate(iterable, function (element) {\n call(setter, newMap, keyDerivative(element), element);\n });\n return newMap;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar aMap = require('../internals/a-map');\nvar iterate = require('../internals/map-iterate');\n\n// `Map.prototype.keyOf` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', proto: true, real: true, forced: true }, {\n keyOf: function keyOf(searchElement) {\n var result = iterate(aMap(this), function (value, key) {\n if (value === searchElement) return { key: key };\n }, true);\n return result && result.key;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar bind = require('../internals/function-bind-context');\nvar aMap = require('../internals/a-map');\nvar MapHelpers = require('../internals/map-helpers');\nvar iterate = require('../internals/map-iterate');\n\nvar Map = MapHelpers.Map;\nvar set = MapHelpers.set;\n\n// `Map.prototype.mapKeys` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', proto: true, real: true, forced: true }, {\n mapKeys: function mapKeys(callbackfn /* , thisArg */) {\n var map = aMap(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n var newMap = new Map();\n iterate(map, function (value, key) {\n set(newMap, boundFunction(value, key, map), value);\n });\n return newMap;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar bind = require('../internals/function-bind-context');\nvar aMap = require('../internals/a-map');\nvar MapHelpers = require('../internals/map-helpers');\nvar iterate = require('../internals/map-iterate');\n\nvar Map = MapHelpers.Map;\nvar set = MapHelpers.set;\n\n// `Map.prototype.mapValues` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', proto: true, real: true, forced: true }, {\n mapValues: function mapValues(callbackfn /* , thisArg */) {\n var map = aMap(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n var newMap = new Map();\n iterate(map, function (value, key) {\n set(newMap, key, boundFunction(value, key, map));\n });\n return newMap;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar aMap = require('../internals/a-map');\nvar iterate = require('../internals/iterate');\nvar set = require('../internals/map-helpers').set;\n\n// `Map.prototype.merge` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', proto: true, real: true, arity: 1, forced: true }, {\n // eslint-disable-next-line no-unused-vars -- required for `.length`\n merge: function merge(iterable /* ...iterables */) {\n var map = aMap(this);\n var argumentsLength = arguments.length;\n var i = 0;\n while (i < argumentsLength) {\n iterate(arguments[i++], function (key, value) {\n set(map, key, value);\n }, { AS_ENTRIES: true });\n }\n return map;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar MapHelpers = require('../internals/map-helpers');\nvar createCollectionOf = require('../internals/collection-of');\n\n// `Map.of` method\n// https://tc39.github.io/proposal-setmap-offrom/#sec-map.of\n$({ target: 'Map', stat: true, forced: true }, {\n of: createCollectionOf(MapHelpers.Map, MapHelpers.set, true)\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar aCallable = require('../internals/a-callable');\nvar aMap = require('../internals/a-map');\nvar iterate = require('../internals/map-iterate');\n\nvar $TypeError = TypeError;\n\n// `Map.prototype.reduce` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', proto: true, real: true, forced: true }, {\n reduce: function reduce(callbackfn /* , initialValue */) {\n var map = aMap(this);\n var noInitial = arguments.length < 2;\n var accumulator = noInitial ? undefined : arguments[1];\n aCallable(callbackfn);\n iterate(map, function (value, key) {\n if (noInitial) {\n noInitial = false;\n accumulator = value;\n } else {\n accumulator = callbackfn(accumulator, value, key, map);\n }\n });\n if (noInitial) throw new $TypeError('Reduce of empty map with no initial value');\n return accumulator;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar bind = require('../internals/function-bind-context');\nvar aMap = require('../internals/a-map');\nvar iterate = require('../internals/map-iterate');\n\n// `Map.prototype.some` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', proto: true, real: true, forced: true }, {\n some: function some(callbackfn /* , thisArg */) {\n var map = aMap(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n return iterate(map, function (value, key) {\n if (boundFunction(value, key, map)) return true;\n }, true) === true;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar aCallable = require('../internals/a-callable');\nvar aMap = require('../internals/a-map');\nvar MapHelpers = require('../internals/map-helpers');\n\nvar $TypeError = TypeError;\nvar get = MapHelpers.get;\nvar has = MapHelpers.has;\nvar set = MapHelpers.set;\n\n// `Map.prototype.update` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Map', proto: true, real: true, forced: true }, {\n update: function update(key, callback /* , thunk */) {\n var map = aMap(this);\n var length = arguments.length;\n aCallable(callback);\n var isPresentInMap = has(map, key);\n if (!isPresentInMap && length < 3) {\n throw new $TypeError('Updating absent value');\n }\n var value = isPresentInMap ? get(map, key) : aCallable(length > 2 ? arguments[2] : undefined)(key, map);\n set(map, key, callback(value, key, map));\n return map;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar aNumber = require('../internals/a-number');\nvar notANaN = require('../internals/not-a-nan');\nvar sameValue = require('../internals/same-value');\n\nvar $RangeError = RangeError;\nvar $min = Math.min;\nvar $max = Math.max;\n\n// `Math.clamp` method\n// https://github.com/tc39/proposal-math-clamp\n$({ target: 'Math', stat: true, forced: true }, {\n clamp: function clamp(value, min, max) {\n aNumber(value);\n notANaN(aNumber(min));\n notANaN(aNumber(max));\n if ((sameValue(min, 0) && sameValue(max, -0)) || min > max) throw new $RangeError('`min` should be smaller than `max`');\n return $min(max, $max(min, value));\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\n\n// `Math.DEG_PER_RAD` constant\n// https://rwaldron.github.io/proposal-math-extensions/\n$({ target: 'Math', stat: true, nonConfigurable: true, nonWritable: true }, {\n DEG_PER_RAD: Math.PI / 180\n});\n","'use strict';\nvar $ = require('../internals/export');\n\nvar RAD_PER_DEG = 180 / Math.PI;\n\n// `Math.degrees` method\n// https://rwaldron.github.io/proposal-math-extensions/\n$({ target: 'Math', stat: true, forced: true }, {\n degrees: function degrees(radians) {\n return radians * RAD_PER_DEG;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\n\nvar scale = require('../internals/math-scale');\nvar fround = require('../internals/math-fround');\n\n// `Math.fscale` method\n// https://rwaldron.github.io/proposal-math-extensions/\n$({ target: 'Math', stat: true, forced: true }, {\n fscale: function fscale(x, inLow, inHigh, outLow, outHigh) {\n return fround(scale(x, inLow, inHigh, outLow, outHigh));\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\n\n// `Math.iaddh` method\n// https://gist.github.com/BrendanEich/4294d5c212a6d2254703\n// TODO: Remove from `core-js@4`\n$({ target: 'Math', stat: true, forced: true }, {\n iaddh: function iaddh(x0, x1, y0, y1) {\n var $x0 = x0 >>> 0;\n var $x1 = x1 >>> 0;\n var $y0 = y0 >>> 0;\n return $x1 + (y1 >>> 0) + (($x0 & $y0 | ($x0 | $y0) & ~($x0 + $y0 >>> 0)) >>> 31) | 0;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\n\n// `Math.imulh` method\n// https://gist.github.com/BrendanEich/4294d5c212a6d2254703\n// TODO: Remove from `core-js@4`\n$({ target: 'Math', stat: true, forced: true }, {\n imulh: function imulh(u, v) {\n var UINT16 = 0xFFFF;\n var $u = +u;\n var $v = +v;\n var u0 = $u & UINT16;\n var v0 = $v & UINT16;\n var u1 = $u >> 16;\n var v1 = $v >> 16;\n var t = (u1 * v0 >>> 0) + (u0 * v0 >>> 16);\n return u1 * v1 + (t >> 16) + ((u0 * v1 >>> 0) + (t & UINT16) >> 16);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\n\n// `Math.isubh` method\n// https://gist.github.com/BrendanEich/4294d5c212a6d2254703\n// TODO: Remove from `core-js@4`\n$({ target: 'Math', stat: true, forced: true }, {\n isubh: function isubh(x0, x1, y0, y1) {\n var $x0 = x0 >>> 0;\n var $x1 = x1 >>> 0;\n var $y0 = y0 >>> 0;\n return $x1 - (y1 >>> 0) - ((~$x0 & $y0 | ~($x0 ^ $y0) & $x0 - $y0 >>> 0) >>> 31) | 0;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\n\n// `Math.RAD_PER_DEG` constant\n// https://rwaldron.github.io/proposal-math-extensions/\n$({ target: 'Math', stat: true, nonConfigurable: true, nonWritable: true }, {\n RAD_PER_DEG: 180 / Math.PI\n});\n","'use strict';\nvar $ = require('../internals/export');\n\nvar DEG_PER_RAD = Math.PI / 180;\n\n// `Math.radians` method\n// https://rwaldron.github.io/proposal-math-extensions/\n$({ target: 'Math', stat: true, forced: true }, {\n radians: function radians(degrees) {\n return degrees * DEG_PER_RAD;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar scale = require('../internals/math-scale');\n\n// `Math.scale` method\n// https://rwaldron.github.io/proposal-math-extensions/\n$({ target: 'Math', stat: true, forced: true }, {\n scale: scale\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar anObject = require('../internals/an-object');\nvar numberIsFinite = require('../internals/number-is-finite');\nvar createIteratorConstructor = require('../internals/iterator-create-constructor');\nvar createIterResultObject = require('../internals/create-iter-result-object');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar SEEDED_RANDOM = 'Seeded Random';\nvar SEEDED_RANDOM_GENERATOR = SEEDED_RANDOM + ' Generator';\nvar SEED_TYPE_ERROR = 'Math.seededPRNG() argument should have a \"seed\" field with a finite value.';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(SEEDED_RANDOM_GENERATOR);\nvar $TypeError = TypeError;\n\nvar $SeededRandomGenerator = createIteratorConstructor(function SeededRandomGenerator(seed) {\n setInternalState(this, {\n type: SEEDED_RANDOM_GENERATOR,\n seed: seed % 2147483647\n });\n}, SEEDED_RANDOM, function next() {\n var state = getInternalState(this);\n var seed = state.seed = (state.seed * 1103515245 + 12345) % 2147483647;\n return createIterResultObject((seed & 1073741823) / 1073741823, false);\n});\n\n// `Math.seededPRNG` method\n// https://github.com/tc39/proposal-seeded-random\n// based on https://github.com/tc39/proposal-seeded-random/blob/78b8258835b57fc2100d076151ab506bc3202ae6/demo.html\n$({ target: 'Math', stat: true, forced: true }, {\n seededPRNG: function seededPRNG(it) {\n var seed = anObject(it).seed;\n if (!numberIsFinite(seed)) throw new $TypeError(SEED_TYPE_ERROR);\n return new $SeededRandomGenerator(seed);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\n\n// `Math.signbit` method\n// https://github.com/tc39/proposal-Math.signbit\n$({ target: 'Math', stat: true, forced: true }, {\n signbit: function signbit(x) {\n var n = +x;\n // eslint-disable-next-line no-self-compare -- NaN check\n return n === n && n === 0 ? 1 / n === -Infinity : n < 0;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\n\n// `Math.umulh` method\n// https://gist.github.com/BrendanEich/4294d5c212a6d2254703\n// TODO: Remove from `core-js@4`\n$({ target: 'Math', stat: true, forced: true }, {\n umulh: function umulh(u, v) {\n var UINT16 = 0xFFFF;\n var $u = +u;\n var $v = +v;\n var u0 = $u & UINT16;\n var v0 = $v & UINT16;\n var u1 = $u >>> 16;\n var v1 = $v >>> 16;\n var t = (u1 * v0 >>> 0) + (u0 * v0 >>> 16);\n return u1 * v1 + (t >>> 16) + ((u0 * v1 >>> 0) + (t & UINT16) >>> 16);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\n\nvar INVALID_NUMBER_REPRESENTATION = 'Invalid number representation';\nvar INVALID_RADIX = 'Invalid radix';\nvar $RangeError = RangeError;\nvar $SyntaxError = SyntaxError;\nvar $TypeError = TypeError;\nvar $parseInt = parseInt;\nvar pow = Math.pow;\nvar valid = /^[\\d.a-z]+$/;\nvar charAt = uncurryThis(''.charAt);\nvar exec = uncurryThis(valid.exec);\nvar numberToString = uncurryThis(1.0.toString);\nvar stringSlice = uncurryThis(''.slice);\nvar split = uncurryThis(''.split);\n\n// `Number.fromString` method\n// https://github.com/tc39/proposal-number-fromstring\n$({ target: 'Number', stat: true, forced: true }, {\n fromString: function fromString(string, radix) {\n var sign = 1;\n if (typeof string != 'string') throw new $TypeError(INVALID_NUMBER_REPRESENTATION);\n if (!string.length) throw new $SyntaxError(INVALID_NUMBER_REPRESENTATION);\n if (charAt(string, 0) === '-') {\n sign = -1;\n string = stringSlice(string, 1);\n if (!string.length) throw new $SyntaxError(INVALID_NUMBER_REPRESENTATION);\n }\n var R = radix === undefined ? 10 : toIntegerOrInfinity(radix);\n if (R < 2 || R > 36) throw new $RangeError(INVALID_RADIX);\n if (!exec(valid, string)) throw new $SyntaxError(INVALID_NUMBER_REPRESENTATION);\n var parts = split(string, '.');\n var mathNum = $parseInt(parts[0], R);\n if (parts.length > 1) mathNum += $parseInt(parts[1], R) / pow(R, parts[1].length);\n if (R === 10 && numberToString(mathNum, R) !== string) throw new $SyntaxError(INVALID_NUMBER_REPRESENTATION);\n return sign * mathNum;\n }\n});\n","'use strict';\n// https://github.com/tc39/proposal-observable\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar setSpecies = require('../internals/set-species');\nvar aCallable = require('../internals/a-callable');\nvar anObject = require('../internals/an-object');\nvar anInstance = require('../internals/an-instance');\nvar isCallable = require('../internals/is-callable');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar isObject = require('../internals/is-object');\nvar getMethod = require('../internals/get-method');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar defineBuiltIns = require('../internals/define-built-ins');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\nvar hostReportErrors = require('../internals/host-report-errors');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar $$OBSERVABLE = wellKnownSymbol('observable');\nvar OBSERVABLE = 'Observable';\nvar SUBSCRIPTION = 'Subscription';\nvar SUBSCRIPTION_OBSERVER = 'SubscriptionObserver';\nvar getterFor = InternalStateModule.getterFor;\nvar setInternalState = InternalStateModule.set;\nvar getObservableInternalState = getterFor(OBSERVABLE);\nvar getSubscriptionInternalState = getterFor(SUBSCRIPTION);\nvar getSubscriptionObserverInternalState = getterFor(SUBSCRIPTION_OBSERVER);\n\nvar SubscriptionState = function (observer) {\n this.observer = anObject(observer);\n this.cleanup = null;\n this.subscriptionObserver = null;\n};\n\nSubscriptionState.prototype = {\n type: SUBSCRIPTION,\n clean: function () {\n var cleanup = this.cleanup;\n if (cleanup) {\n this.cleanup = null;\n try {\n cleanup();\n } catch (error) {\n hostReportErrors(error);\n }\n }\n },\n close: function () {\n if (!DESCRIPTORS) {\n var subscription = this.facade;\n var subscriptionObserver = this.subscriptionObserver;\n subscription.closed = true;\n if (subscriptionObserver) subscriptionObserver.closed = true;\n } this.observer = null;\n },\n isClosed: function () {\n return this.observer === null;\n }\n};\n\nvar Subscription = function (observer, subscriber) {\n var subscriptionState = setInternalState(this, new SubscriptionState(observer));\n var start;\n if (!DESCRIPTORS) this.closed = false;\n try {\n if (start = getMethod(observer, 'start')) call(start, observer, this);\n } catch (error) {\n hostReportErrors(error);\n }\n if (subscriptionState.isClosed()) return;\n var subscriptionObserver = subscriptionState.subscriptionObserver = new SubscriptionObserver(subscriptionState);\n try {\n var cleanup = subscriber(subscriptionObserver);\n var subscription = cleanup;\n if (!isNullOrUndefined(cleanup)) subscriptionState.cleanup = isCallable(cleanup.unsubscribe)\n ? function () { subscription.unsubscribe(); }\n : aCallable(cleanup);\n } catch (error) {\n subscriptionObserver.error(error);\n return;\n } if (subscriptionState.isClosed()) subscriptionState.clean();\n};\n\nSubscription.prototype = defineBuiltIns({}, {\n unsubscribe: function unsubscribe() {\n var subscriptionState = getSubscriptionInternalState(this);\n if (!subscriptionState.isClosed()) {\n subscriptionState.close();\n subscriptionState.clean();\n }\n }\n});\n\nif (DESCRIPTORS) defineBuiltInAccessor(Subscription.prototype, 'closed', {\n configurable: true,\n get: function closed() {\n return getSubscriptionInternalState(this).isClosed();\n }\n});\n\nvar SubscriptionObserver = function (subscriptionState) {\n setInternalState(this, {\n type: SUBSCRIPTION_OBSERVER,\n subscriptionState: subscriptionState\n });\n if (!DESCRIPTORS) this.closed = false;\n};\n\nSubscriptionObserver.prototype = defineBuiltIns({}, {\n next: function next(value) {\n var subscriptionState = getSubscriptionObserverInternalState(this).subscriptionState;\n if (!subscriptionState.isClosed()) {\n var observer = subscriptionState.observer;\n try {\n var nextMethod = getMethod(observer, 'next');\n if (nextMethod) call(nextMethod, observer, value);\n } catch (error) {\n hostReportErrors(error);\n }\n }\n },\n error: function error(value) {\n var subscriptionState = getSubscriptionObserverInternalState(this).subscriptionState;\n if (!subscriptionState.isClosed()) {\n var observer = subscriptionState.observer;\n subscriptionState.close();\n try {\n var errorMethod = getMethod(observer, 'error');\n if (errorMethod) call(errorMethod, observer, value);\n else hostReportErrors(value);\n } catch (err) {\n hostReportErrors(err);\n } subscriptionState.clean();\n }\n },\n complete: function complete() {\n var subscriptionState = getSubscriptionObserverInternalState(this).subscriptionState;\n if (!subscriptionState.isClosed()) {\n var observer = subscriptionState.observer;\n subscriptionState.close();\n try {\n var completeMethod = getMethod(observer, 'complete');\n if (completeMethod) call(completeMethod, observer);\n } catch (error) {\n hostReportErrors(error);\n } subscriptionState.clean();\n }\n }\n});\n\nif (DESCRIPTORS) defineBuiltInAccessor(SubscriptionObserver.prototype, 'closed', {\n configurable: true,\n get: function closed() {\n return getSubscriptionObserverInternalState(this).subscriptionState.isClosed();\n }\n});\n\nvar $Observable = function Observable(subscriber) {\n anInstance(this, ObservablePrototype);\n setInternalState(this, {\n type: OBSERVABLE,\n subscriber: aCallable(subscriber)\n });\n};\n\nvar ObservablePrototype = $Observable.prototype;\n\ndefineBuiltIns(ObservablePrototype, {\n subscribe: function subscribe(observer) {\n var length = arguments.length;\n return new Subscription(isCallable(observer) ? {\n next: observer,\n error: length > 1 ? arguments[1] : undefined,\n complete: length > 2 ? arguments[2] : undefined\n } : isObject(observer) ? observer : {}, getObservableInternalState(this).subscriber);\n }\n});\n\ndefineBuiltIn(ObservablePrototype, $$OBSERVABLE, function () { return this; });\n\n$({ global: true, constructor: true, forced: true }, {\n Observable: $Observable\n});\n\nsetSpecies(OBSERVABLE);\n","'use strict';\nvar $ = require('../internals/export');\nvar getBuiltIn = require('../internals/get-built-in');\nvar call = require('../internals/function-call');\nvar anObject = require('../internals/an-object');\nvar isConstructor = require('../internals/is-constructor');\nvar getIterator = require('../internals/get-iterator');\nvar getMethod = require('../internals/get-method');\nvar iterate = require('../internals/iterate');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar $$OBSERVABLE = wellKnownSymbol('observable');\n\n// `Observable.from` method\n// https://github.com/tc39/proposal-observable\n$({ target: 'Observable', stat: true, forced: true }, {\n from: function from(x) {\n var C = isConstructor(this) ? this : getBuiltIn('Observable');\n var observableMethod = getMethod(anObject(x), $$OBSERVABLE);\n if (observableMethod) {\n var observable = anObject(call(observableMethod, x));\n return observable.constructor === C ? observable : new C(function (observer) {\n return observable.subscribe(observer);\n });\n }\n var iterator = getIterator(x);\n return new C(function (observer) {\n iterate(iterator, function (it, stop) {\n observer.next(it);\n if (observer.closed) return stop();\n }, { IS_ITERATOR: true, INTERRUPTED: true });\n observer.complete();\n });\n }\n});\n","'use strict';\n// TODO: Remove this module from `core-js@4` since it's split to modules listed below\nrequire('../modules/esnext.observable.constructor');\nrequire('../modules/esnext.observable.from');\nrequire('../modules/esnext.observable.of');\n","'use strict';\nvar $ = require('../internals/export');\nvar getBuiltIn = require('../internals/get-built-in');\nvar isConstructor = require('../internals/is-constructor');\n\nvar Array = getBuiltIn('Array');\n\n// `Observable.of` method\n// https://github.com/tc39/proposal-observable\n$({ target: 'Observable', stat: true, forced: true }, {\n of: function of() {\n var C = isConstructor(this) ? this : getBuiltIn('Observable');\n var length = arguments.length;\n var items = Array(length);\n var index = 0;\n while (index < length) items[index] = arguments[index++];\n return new C(function (observer) {\n for (var i = 0; i < length; i++) {\n observer.next(items[i]);\n if (observer.closed) return;\n } observer.complete();\n });\n }\n});\n","'use strict';\n// TODO: Remove from `core-js@4`\nrequire('../modules/es.promise.try.js');\n","'use strict';\n// TODO: Remove from `core-js@4`\nvar $ = require('../internals/export');\nvar ReflectMetadataModule = require('../internals/reflect-metadata');\nvar anObject = require('../internals/an-object');\n\nvar toMetadataKey = ReflectMetadataModule.toKey;\nvar ordinaryDefineOwnMetadata = ReflectMetadataModule.set;\n\n// `Reflect.defineMetadata` method\n// https://github.com/rbuckton/reflect-metadata\n$({ target: 'Reflect', stat: true }, {\n defineMetadata: function defineMetadata(metadataKey, metadataValue, target /* , targetKey */) {\n var targetKey = arguments.length < 4 ? undefined : toMetadataKey(arguments[3]);\n ordinaryDefineOwnMetadata(metadataKey, metadataValue, anObject(target), targetKey);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar ReflectMetadataModule = require('../internals/reflect-metadata');\nvar anObject = require('../internals/an-object');\n\nvar toMetadataKey = ReflectMetadataModule.toKey;\nvar getOrCreateMetadataMap = ReflectMetadataModule.getMap;\nvar store = ReflectMetadataModule.store;\n\n// `Reflect.deleteMetadata` method\n// https://github.com/rbuckton/reflect-metadata\n$({ target: 'Reflect', stat: true }, {\n deleteMetadata: function deleteMetadata(metadataKey, target /* , targetKey */) {\n var targetKey = arguments.length < 3 ? undefined : toMetadataKey(arguments[2]);\n var metadataMap = getOrCreateMetadataMap(anObject(target), targetKey, false);\n if (metadataMap === undefined || !metadataMap['delete'](metadataKey)) return false;\n if (metadataMap.size) return true;\n var targetMetadata = store.get(target);\n targetMetadata['delete'](targetKey);\n return !!targetMetadata.size || store['delete'](target);\n }\n});\n","'use strict';\n// TODO: Remove from `core-js@4`\nvar $ = require('../internals/export');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar ReflectMetadataModule = require('../internals/reflect-metadata');\nvar anObject = require('../internals/an-object');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar $arrayUniqueBy = require('../internals/array-unique-by');\n\nvar arrayUniqueBy = uncurryThis($arrayUniqueBy);\nvar concat = uncurryThis([].concat);\nvar ordinaryOwnMetadataKeys = ReflectMetadataModule.keys;\nvar toMetadataKey = ReflectMetadataModule.toKey;\n\nvar ordinaryMetadataKeys = function (O, P) {\n var oKeys = ordinaryOwnMetadataKeys(O, P);\n var parent = getPrototypeOf(O);\n if (parent === null) return oKeys;\n var pKeys = ordinaryMetadataKeys(parent, P);\n return pKeys.length ? oKeys.length ? arrayUniqueBy(concat(oKeys, pKeys)) : pKeys : oKeys;\n};\n\n// `Reflect.getMetadataKeys` method\n// https://github.com/rbuckton/reflect-metadata\n$({ target: 'Reflect', stat: true }, {\n getMetadataKeys: function getMetadataKeys(target /* , targetKey */) {\n var targetKey = arguments.length < 2 ? undefined : toMetadataKey(arguments[1]);\n return ordinaryMetadataKeys(anObject(target), targetKey);\n }\n});\n","'use strict';\n// TODO: Remove from `core-js@4`\nvar $ = require('../internals/export');\nvar ReflectMetadataModule = require('../internals/reflect-metadata');\nvar anObject = require('../internals/an-object');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\n\nvar ordinaryHasOwnMetadata = ReflectMetadataModule.has;\nvar ordinaryGetOwnMetadata = ReflectMetadataModule.get;\nvar toMetadataKey = ReflectMetadataModule.toKey;\n\nvar ordinaryGetMetadata = function (MetadataKey, O, P) {\n var hasOwn = ordinaryHasOwnMetadata(MetadataKey, O, P);\n if (hasOwn) return ordinaryGetOwnMetadata(MetadataKey, O, P);\n var parent = getPrototypeOf(O);\n return parent !== null ? ordinaryGetMetadata(MetadataKey, parent, P) : undefined;\n};\n\n// `Reflect.getMetadata` method\n// https://github.com/rbuckton/reflect-metadata\n$({ target: 'Reflect', stat: true }, {\n getMetadata: function getMetadata(metadataKey, target /* , targetKey */) {\n var targetKey = arguments.length < 3 ? undefined : toMetadataKey(arguments[2]);\n return ordinaryGetMetadata(metadataKey, anObject(target), targetKey);\n }\n});\n","'use strict';\n// TODO: Remove from `core-js@4`\nvar $ = require('../internals/export');\nvar ReflectMetadataModule = require('../internals/reflect-metadata');\nvar anObject = require('../internals/an-object');\n\nvar ordinaryOwnMetadataKeys = ReflectMetadataModule.keys;\nvar toMetadataKey = ReflectMetadataModule.toKey;\n\n// `Reflect.getOwnMetadataKeys` method\n// https://github.com/rbuckton/reflect-metadata\n$({ target: 'Reflect', stat: true }, {\n getOwnMetadataKeys: function getOwnMetadataKeys(target /* , targetKey */) {\n var targetKey = arguments.length < 2 ? undefined : toMetadataKey(arguments[1]);\n return ordinaryOwnMetadataKeys(anObject(target), targetKey);\n }\n});\n","'use strict';\n// TODO: Remove from `core-js@4`\nvar $ = require('../internals/export');\nvar ReflectMetadataModule = require('../internals/reflect-metadata');\nvar anObject = require('../internals/an-object');\n\nvar ordinaryGetOwnMetadata = ReflectMetadataModule.get;\nvar toMetadataKey = ReflectMetadataModule.toKey;\n\n// `Reflect.getOwnMetadata` method\n// https://github.com/rbuckton/reflect-metadata\n$({ target: 'Reflect', stat: true }, {\n getOwnMetadata: function getOwnMetadata(metadataKey, target /* , targetKey */) {\n var targetKey = arguments.length < 3 ? undefined : toMetadataKey(arguments[2]);\n return ordinaryGetOwnMetadata(metadataKey, anObject(target), targetKey);\n }\n});\n","'use strict';\n// TODO: Remove from `core-js@4`\nvar $ = require('../internals/export');\nvar ReflectMetadataModule = require('../internals/reflect-metadata');\nvar anObject = require('../internals/an-object');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\n\nvar ordinaryHasOwnMetadata = ReflectMetadataModule.has;\nvar toMetadataKey = ReflectMetadataModule.toKey;\n\nvar ordinaryHasMetadata = function (MetadataKey, O, P) {\n var hasOwn = ordinaryHasOwnMetadata(MetadataKey, O, P);\n if (hasOwn) return true;\n var parent = getPrototypeOf(O);\n return parent !== null ? ordinaryHasMetadata(MetadataKey, parent, P) : false;\n};\n\n// `Reflect.hasMetadata` method\n// https://github.com/rbuckton/reflect-metadata\n$({ target: 'Reflect', stat: true }, {\n hasMetadata: function hasMetadata(metadataKey, target /* , targetKey */) {\n var targetKey = arguments.length < 3 ? undefined : toMetadataKey(arguments[2]);\n return ordinaryHasMetadata(metadataKey, anObject(target), targetKey);\n }\n});\n","'use strict';\n// TODO: Remove from `core-js@4`\nvar $ = require('../internals/export');\nvar ReflectMetadataModule = require('../internals/reflect-metadata');\nvar anObject = require('../internals/an-object');\n\nvar ordinaryHasOwnMetadata = ReflectMetadataModule.has;\nvar toMetadataKey = ReflectMetadataModule.toKey;\n\n// `Reflect.hasOwnMetadata` method\n// https://github.com/rbuckton/reflect-metadata\n$({ target: 'Reflect', stat: true }, {\n hasOwnMetadata: function hasOwnMetadata(metadataKey, target /* , targetKey */) {\n var targetKey = arguments.length < 3 ? undefined : toMetadataKey(arguments[2]);\n return ordinaryHasOwnMetadata(metadataKey, anObject(target), targetKey);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar ReflectMetadataModule = require('../internals/reflect-metadata');\nvar anObject = require('../internals/an-object');\n\nvar toMetadataKey = ReflectMetadataModule.toKey;\nvar ordinaryDefineOwnMetadata = ReflectMetadataModule.set;\n\n// `Reflect.metadata` method\n// https://github.com/rbuckton/reflect-metadata\n$({ target: 'Reflect', stat: true }, {\n metadata: function metadata(metadataKey, metadataValue) {\n return function decorator(target, key) {\n ordinaryDefineOwnMetadata(metadataKey, metadataValue, anObject(target), toMetadataKey(key));\n };\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar aSet = require('../internals/a-set');\nvar add = require('../internals/set-helpers').add;\n\n// `Set.prototype.addAll` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n addAll: function addAll(/* ...elements */) {\n var set = aSet(this);\n for (var k = 0, len = arguments.length; k < len; k++) {\n add(set, arguments[k]);\n } return set;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar aSet = require('../internals/a-set');\nvar remove = require('../internals/set-helpers').remove;\n\n// `Set.prototype.deleteAll` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n deleteAll: function deleteAll(/* ...elements */) {\n var collection = aSet(this);\n var allDeleted = true;\n var wasDeleted;\n for (var k = 0, len = arguments.length; k < len; k++) {\n wasDeleted = remove(collection, arguments[k]);\n allDeleted = allDeleted && wasDeleted;\n } return !!allDeleted;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar toSetLike = require('../internals/to-set-like');\nvar $difference = require('../internals/set-difference');\n\n// `Set.prototype.difference` method\n// https://github.com/tc39/proposal-set-methods\n// TODO: Obsolete version, remove from `core-js@4`\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n difference: function difference(other) {\n return call($difference, this, toSetLike(other));\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar bind = require('../internals/function-bind-context');\nvar aSet = require('../internals/a-set');\nvar iterate = require('../internals/set-iterate');\n\n// `Set.prototype.every` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n every: function every(callbackfn /* , thisArg */) {\n var set = aSet(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n return iterate(set, function (value) {\n if (!boundFunction(value, value, set)) return false;\n }, true) !== false;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar bind = require('../internals/function-bind-context');\nvar aSet = require('../internals/a-set');\nvar SetHelpers = require('../internals/set-helpers');\nvar iterate = require('../internals/set-iterate');\n\nvar Set = SetHelpers.Set;\nvar add = SetHelpers.add;\n\n// `Set.prototype.filter` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n filter: function filter(callbackfn /* , thisArg */) {\n var set = aSet(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n var newSet = new Set();\n iterate(set, function (value) {\n if (boundFunction(value, value, set)) add(newSet, value);\n });\n return newSet;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar bind = require('../internals/function-bind-context');\nvar aSet = require('../internals/a-set');\nvar iterate = require('../internals/set-iterate');\n\n// `Set.prototype.find` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n find: function find(callbackfn /* , thisArg */) {\n var set = aSet(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n var result = iterate(set, function (value) {\n if (boundFunction(value, value, set)) return { value: value };\n }, true);\n return result && result.value;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar SetHelpers = require('../internals/set-helpers');\nvar createCollectionFrom = require('../internals/collection-from');\n\n// `Set.from` method\n// https://tc39.github.io/proposal-setmap-offrom/#sec-set.from\n$({ target: 'Set', stat: true, forced: true }, {\n from: createCollectionFrom(SetHelpers.Set, SetHelpers.add, false)\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar toSetLike = require('../internals/to-set-like');\nvar $intersection = require('../internals/set-intersection');\n\n// `Set.prototype.intersection` method\n// https://github.com/tc39/proposal-set-methods\n// TODO: Obsolete version, remove from `core-js@4`\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n intersection: function intersection(other) {\n return call($intersection, this, toSetLike(other));\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar toSetLike = require('../internals/to-set-like');\nvar $isDisjointFrom = require('../internals/set-is-disjoint-from');\n\n// `Set.prototype.isDisjointFrom` method\n// https://github.com/tc39/proposal-set-methods\n// TODO: Obsolete version, remove from `core-js@4`\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n isDisjointFrom: function isDisjointFrom(other) {\n return call($isDisjointFrom, this, toSetLike(other));\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar toSetLike = require('../internals/to-set-like');\nvar $isSubsetOf = require('../internals/set-is-subset-of');\n\n// `Set.prototype.isSubsetOf` method\n// https://github.com/tc39/proposal-set-methods\n// TODO: Obsolete version, remove from `core-js@4`\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n isSubsetOf: function isSubsetOf(other) {\n return call($isSubsetOf, this, toSetLike(other));\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar toSetLike = require('../internals/to-set-like');\nvar $isSupersetOf = require('../internals/set-is-superset-of');\n\n// `Set.prototype.isSupersetOf` method\n// https://github.com/tc39/proposal-set-methods\n// TODO: Obsolete version, remove from `core-js@4`\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n isSupersetOf: function isSupersetOf(other) {\n return call($isSupersetOf, this, toSetLike(other));\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar aSet = require('../internals/a-set');\nvar iterate = require('../internals/set-iterate');\nvar toString = require('../internals/to-string');\n\nvar arrayJoin = uncurryThis([].join);\nvar push = uncurryThis([].push);\n\n// `Set.prototype.join` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n join: function join(separator) {\n var set = aSet(this);\n var sep = separator === undefined ? ',' : toString(separator);\n var array = [];\n iterate(set, function (value) {\n push(array, value);\n });\n return arrayJoin(array, sep);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar bind = require('../internals/function-bind-context');\nvar aSet = require('../internals/a-set');\nvar SetHelpers = require('../internals/set-helpers');\nvar iterate = require('../internals/set-iterate');\n\nvar Set = SetHelpers.Set;\nvar add = SetHelpers.add;\n\n// `Set.prototype.map` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n map: function map(callbackfn /* , thisArg */) {\n var set = aSet(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n var newSet = new Set();\n iterate(set, function (value) {\n add(newSet, boundFunction(value, value, set));\n });\n return newSet;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar SetHelpers = require('../internals/set-helpers');\nvar createCollectionOf = require('../internals/collection-of');\n\n// `Set.of` method\n// https://tc39.github.io/proposal-setmap-offrom/#sec-set.of\n$({ target: 'Set', stat: true, forced: true }, {\n of: createCollectionOf(SetHelpers.Set, SetHelpers.add, false)\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar aCallable = require('../internals/a-callable');\nvar aSet = require('../internals/a-set');\nvar iterate = require('../internals/set-iterate');\n\nvar $TypeError = TypeError;\n\n// `Set.prototype.reduce` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n reduce: function reduce(callbackfn /* , initialValue */) {\n var set = aSet(this);\n var noInitial = arguments.length < 2;\n var accumulator = noInitial ? undefined : arguments[1];\n aCallable(callbackfn);\n iterate(set, function (value) {\n if (noInitial) {\n noInitial = false;\n accumulator = value;\n } else {\n accumulator = callbackfn(accumulator, value, value, set);\n }\n });\n if (noInitial) throw new $TypeError('Reduce of empty set with no initial value');\n return accumulator;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar bind = require('../internals/function-bind-context');\nvar aSet = require('../internals/a-set');\nvar iterate = require('../internals/set-iterate');\n\n// `Set.prototype.some` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n some: function some(callbackfn /* , thisArg */) {\n var set = aSet(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n return iterate(set, function (value) {\n if (boundFunction(value, value, set)) return true;\n }, true) === true;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar toSetLike = require('../internals/to-set-like');\nvar $symmetricDifference = require('../internals/set-symmetric-difference');\n\n// `Set.prototype.symmetricDifference` method\n// https://github.com/tc39/proposal-set-methods\n// TODO: Obsolete version, remove from `core-js@4`\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n symmetricDifference: function symmetricDifference(other) {\n return call($symmetricDifference, this, toSetLike(other));\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar toSetLike = require('../internals/to-set-like');\nvar $union = require('../internals/set-union');\n\n// `Set.prototype.union` method\n// https://github.com/tc39/proposal-set-methods\n// TODO: Obsolete version, remove from `core-js@4`\n$({ target: 'Set', proto: true, real: true, forced: true }, {\n union: function union(other) {\n return call($union, this, toSetLike(other));\n }\n});\n","'use strict';\n// TODO: Remove from `core-js@4`\nvar $ = require('../internals/export');\nvar charAt = require('../internals/string-multibyte').charAt;\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\nvar toString = require('../internals/to-string');\n\n// `String.prototype.at` method\n// https://github.com/mathiasbynens/String.prototype.at\n$({ target: 'String', proto: true, forced: true }, {\n at: function at(index) {\n var S = toString(requireObjectCoercible(this));\n var len = S.length;\n var relativeIndex = toIntegerOrInfinity(index);\n var k = relativeIndex >= 0 ? relativeIndex : len + relativeIndex;\n return (k < 0 || k >= len) ? undefined : charAt(S, k);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar createIteratorConstructor = require('../internals/iterator-create-constructor');\nvar createIterResultObject = require('../internals/create-iter-result-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar toString = require('../internals/to-string');\nvar InternalStateModule = require('../internals/internal-state');\nvar StringMultibyteModule = require('../internals/string-multibyte');\n\nvar codeAt = StringMultibyteModule.codeAt;\nvar charAt = StringMultibyteModule.charAt;\nvar STRING_ITERATOR = 'String Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(STRING_ITERATOR);\n\n// TODO: unify with String#@@iterator\nvar $StringIterator = createIteratorConstructor(function StringIterator(string) {\n setInternalState(this, {\n type: STRING_ITERATOR,\n string: string,\n index: 0\n });\n}, 'String', function next() {\n var state = getInternalState(this);\n var string = state.string;\n var index = state.index;\n var point;\n if (index >= string.length) return createIterResultObject(undefined, true);\n point = charAt(string, index);\n state.index += point.length;\n return createIterResultObject({ codePoint: codeAt(point, 0), position: index }, false);\n});\n\n// `String.prototype.codePoints` method\n// https://github.com/tc39/proposal-string-prototype-codepoints\n$({ target: 'String', proto: true, forced: true }, {\n codePoints: function codePoints() {\n return new $StringIterator(toString(requireObjectCoercible(this)));\n }\n});\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar defineWellKnownSymbol = require('../internals/well-known-symbol-define');\nvar defineProperty = require('../internals/object-define-property').f;\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\n\nvar Symbol = globalThis.Symbol;\n\n// `Symbol.dispose` well-known symbol\n// https://github.com/tc39/proposal-explicit-resource-management\ndefineWellKnownSymbol('dispose');\n\nif (Symbol) {\n var descriptor = getOwnPropertyDescriptor(Symbol, 'dispose');\n // workaround of NodeJS 20.4 bug\n // https://github.com/nodejs/node/issues/48699\n // and incorrect descriptor from some transpilers and userland helpers\n if (descriptor.enumerable && descriptor.configurable && descriptor.writable) {\n defineProperty(Symbol, 'dispose', { value: descriptor.value, enumerable: false, configurable: false, writable: false });\n }\n}\n","'use strict';\nvar defineWellKnownSymbol = require('../internals/well-known-symbol-define');\n\n// `Symbol.observable` well-known symbol\n// https://github.com/tc39/proposal-observable\ndefineWellKnownSymbol('observable');\n","'use strict';\n// TODO: remove from `core-js@4`\nvar defineWellKnownSymbol = require('../internals/well-known-symbol-define');\n\n// `Symbol.patternMatch` well-known symbol\n// https://github.com/tc39/proposal-pattern-matching\ndefineWellKnownSymbol('patternMatch');\n","'use strict';\nvar $ = require('../internals/export');\nvar aWeakMap = require('../internals/a-weak-map');\nvar remove = require('../internals/weak-map-helpers').remove;\n\n// `WeakMap.prototype.deleteAll` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'WeakMap', proto: true, real: true, forced: true }, {\n deleteAll: function deleteAll(/* ...elements */) {\n var collection = aWeakMap(this);\n var allDeleted = true;\n var wasDeleted;\n for (var k = 0, len = arguments.length; k < len; k++) {\n wasDeleted = remove(collection, arguments[k]);\n allDeleted = allDeleted && wasDeleted;\n } return !!allDeleted;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar WeakMapHelpers = require('../internals/weak-map-helpers');\nvar createCollectionFrom = require('../internals/collection-from');\n\n// `WeakMap.from` method\n// https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.from\n$({ target: 'WeakMap', stat: true, forced: true }, {\n from: createCollectionFrom(WeakMapHelpers.WeakMap, WeakMapHelpers.set, true)\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar WeakMapHelpers = require('../internals/weak-map-helpers');\nvar createCollectionOf = require('../internals/collection-of');\n\n// `WeakMap.of` method\n// https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.of\n$({ target: 'WeakMap', stat: true, forced: true }, {\n of: createCollectionOf(WeakMapHelpers.WeakMap, WeakMapHelpers.set, true)\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar aWeakSet = require('../internals/a-weak-set');\nvar add = require('../internals/weak-set-helpers').add;\n\n// `WeakSet.prototype.addAll` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'WeakSet', proto: true, real: true, forced: true }, {\n addAll: function addAll(/* ...elements */) {\n var set = aWeakSet(this);\n for (var k = 0, len = arguments.length; k < len; k++) {\n add(set, arguments[k]);\n } return set;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar aWeakSet = require('../internals/a-weak-set');\nvar remove = require('../internals/weak-set-helpers').remove;\n\n// `WeakSet.prototype.deleteAll` method\n// https://github.com/tc39/proposal-collection-methods\n$({ target: 'WeakSet', proto: true, real: true, forced: true }, {\n deleteAll: function deleteAll(/* ...elements */) {\n var collection = aWeakSet(this);\n var allDeleted = true;\n var wasDeleted;\n for (var k = 0, len = arguments.length; k < len; k++) {\n wasDeleted = remove(collection, arguments[k]);\n allDeleted = allDeleted && wasDeleted;\n } return !!allDeleted;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar WeakSetHelpers = require('../internals/weak-set-helpers');\nvar createCollectionFrom = require('../internals/collection-from');\n\n// `WeakSet.from` method\n// https://tc39.github.io/proposal-setmap-offrom/#sec-weakset.from\n$({ target: 'WeakSet', stat: true, forced: true }, {\n from: createCollectionFrom(WeakSetHelpers.WeakSet, WeakSetHelpers.add, false)\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar WeakSetHelpers = require('../internals/weak-set-helpers');\nvar createCollectionOf = require('../internals/collection-of');\n\n// `WeakSet.of` method\n// https://tc39.github.io/proposal-setmap-offrom/#sec-weakset.of\n$({ target: 'WeakSet', stat: true, forced: true }, {\n of: createCollectionOf(WeakSetHelpers.WeakSet, WeakSetHelpers.add, false)\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar globalThis = require('../internals/global-this');\nvar clearImmediate = require('../internals/task').clear;\n\n// `clearImmediate` method\n// http://w3c.github.io/setImmediate/#si-clearImmediate\n$({ global: true, bind: true, enumerable: true, forced: globalThis.clearImmediate !== clearImmediate }, {\n clearImmediate: clearImmediate\n});\n","'use strict';\n// TODO: Remove this module from `core-js@4` since it's split to modules listed below\nrequire('../modules/web.clear-immediate');\nrequire('../modules/web.set-immediate');\n","'use strict';\nvar $ = require('../internals/export');\nvar globalThis = require('../internals/global-this');\nvar setTask = require('../internals/task').set;\nvar schedulersFix = require('../internals/schedulers-fix');\n\n// https://github.com/oven-sh/bun/issues/1633\nvar setImmediate = globalThis.setImmediate ? schedulersFix(setTask, false) : setTask;\n\n// `setImmediate` method\n// http://w3c.github.io/setImmediate/#si-setImmediate\n$({ global: true, bind: true, enumerable: true, forced: globalThis.setImmediate !== setImmediate }, {\n setImmediate: setImmediate\n});\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","// Should be no imports here!\n\n/**\n * The sentinel value returned by producers to replace the draft with undefined.\n */\nexport const NOTHING: unique symbol = Symbol.for(\"immer-nothing\")\n\n/**\n * To let Immer treat your class instances as plain immutable objects\n * (albeit with a custom prototype), you must define either an instance property\n * or a static property on each of your custom classes.\n *\n * Otherwise, your class instance will never be drafted, which means it won't be\n * safe to mutate in a produce callback.\n */\nexport const DRAFTABLE: unique symbol = Symbol.for(\"immer-draftable\")\n\nexport const DRAFT_STATE: unique symbol = Symbol.for(\"immer-state\")\n","export const errors =\n\tprocess.env.NODE_ENV !== \"production\"\n\t\t? [\n\t\t\t\t// All error codes, starting by 0:\n\t\t\t\tfunction(plugin: string) {\n\t\t\t\t\treturn `The plugin for '${plugin}' has not been loaded into Immer. To enable the plugin, import and call \\`enable${plugin}()\\` when initializing your application.`\n\t\t\t\t},\n\t\t\t\tfunction(thing: string) {\n\t\t\t\t\treturn `produce can only be called on things that are draftable: plain objects, arrays, Map, Set or classes that are marked with '[immerable]: true'. Got '${thing}'`\n\t\t\t\t},\n\t\t\t\t\"This object has been frozen and should not be mutated\",\n\t\t\t\tfunction(data: any) {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t\"Cannot use a proxy that has been revoked. Did you pass an object from inside an immer function to an async process? \" +\n\t\t\t\t\t\tdata\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t\t\"An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft.\",\n\t\t\t\t\"Immer forbids circular references\",\n\t\t\t\t\"The first or second argument to `produce` must be a function\",\n\t\t\t\t\"The third argument to `produce` must be a function or undefined\",\n\t\t\t\t\"First argument to `createDraft` must be a plain object, an array, or an immerable object\",\n\t\t\t\t\"First argument to `finishDraft` must be a draft returned by `createDraft`\",\n\t\t\t\tfunction(thing: string) {\n\t\t\t\t\treturn `'current' expects a draft, got: ${thing}`\n\t\t\t\t},\n\t\t\t\t\"Object.defineProperty() cannot be used on an Immer draft\",\n\t\t\t\t\"Object.setPrototypeOf() cannot be used on an Immer draft\",\n\t\t\t\t\"Immer only supports deleting array indices\",\n\t\t\t\t\"Immer only supports setting array indices and the 'length' property\",\n\t\t\t\tfunction(thing: string) {\n\t\t\t\t\treturn `'original' expects a draft, got: ${thing}`\n\t\t\t\t}\n\t\t\t\t// Note: if more errors are added, the errorOffset in Patches.ts should be increased\n\t\t\t\t// See Patches.ts for additional errors\n\t\t ]\n\t\t: []\n\nexport function die(error: number, ...args: any[]): never {\n\tif (process.env.NODE_ENV !== \"production\") {\n\t\tconst e = errors[error]\n\t\tconst msg = typeof e === \"function\" ? e.apply(null, args as any) : e\n\t\tthrow new Error(`[Immer] ${msg}`)\n\t}\n\tthrow new Error(\n\t\t`[Immer] minified error nr: ${error}. Full error at: https://bit.ly/3cXEKWf`\n\t)\n}\n","import {\n\tDRAFT_STATE,\n\tDRAFTABLE,\n\tObjectish,\n\tDrafted,\n\tAnyObject,\n\tAnyMap,\n\tAnySet,\n\tImmerState,\n\tArchType,\n\tdie,\n\tStrictMode\n} from \"../internal\"\n\nexport const getPrototypeOf = Object.getPrototypeOf\n\n/** Returns true if the given value is an Immer draft */\n/*#__PURE__*/\nexport function isDraft(value: any): boolean {\n\treturn !!value && !!value[DRAFT_STATE]\n}\n\n/** Returns true if the given value can be drafted by Immer */\n/*#__PURE__*/\nexport function isDraftable(value: any): boolean {\n\tif (!value) return false\n\treturn (\n\t\tisPlainObject(value) ||\n\t\tArray.isArray(value) ||\n\t\t!!value[DRAFTABLE] ||\n\t\t!!value.constructor?.[DRAFTABLE] ||\n\t\tisMap(value) ||\n\t\tisSet(value)\n\t)\n}\n\nconst objectCtorString = Object.prototype.constructor.toString()\n/*#__PURE__*/\nexport function isPlainObject(value: any): boolean {\n\tif (!value || typeof value !== \"object\") return false\n\tconst proto = getPrototypeOf(value)\n\tif (proto === null) {\n\t\treturn true\n\t}\n\tconst Ctor =\n\t\tObject.hasOwnProperty.call(proto, \"constructor\") && proto.constructor\n\n\tif (Ctor === Object) return true\n\n\treturn (\n\t\ttypeof Ctor == \"function\" &&\n\t\tFunction.toString.call(Ctor) === objectCtorString\n\t)\n}\n\n/** Get the underlying object that is represented by the given draft */\n/*#__PURE__*/\nexport function original<T>(value: T): T | undefined\nexport function original(value: Drafted<any>): any {\n\tif (!isDraft(value)) die(15, value)\n\treturn value[DRAFT_STATE].base_\n}\n\n/**\n * Each iterates a map, set or array.\n * Or, if any other kind of object, all of its own properties.\n * Regardless whether they are enumerable or symbols\n */\nexport function each<T extends Objectish>(\n\tobj: T,\n\titer: (key: string | number, value: any, source: T) => void\n): void\nexport function each(obj: any, iter: any) {\n\tif (getArchtype(obj) === ArchType.Object) {\n\t\tReflect.ownKeys(obj).forEach(key => {\n\t\t\titer(key, obj[key], obj)\n\t\t})\n\t} else {\n\t\tobj.forEach((entry: any, index: any) => iter(index, entry, obj))\n\t}\n}\n\n/*#__PURE__*/\nexport function getArchtype(thing: any): ArchType {\n\tconst state: undefined | ImmerState = thing[DRAFT_STATE]\n\treturn state\n\t\t? state.type_\n\t\t: Array.isArray(thing)\n\t\t? ArchType.Array\n\t\t: isMap(thing)\n\t\t? ArchType.Map\n\t\t: isSet(thing)\n\t\t? ArchType.Set\n\t\t: ArchType.Object\n}\n\n/*#__PURE__*/\nexport function has(thing: any, prop: PropertyKey): boolean {\n\treturn getArchtype(thing) === ArchType.Map\n\t\t? thing.has(prop)\n\t\t: Object.prototype.hasOwnProperty.call(thing, prop)\n}\n\n/*#__PURE__*/\nexport function get(thing: AnyMap | AnyObject, prop: PropertyKey): any {\n\t// @ts-ignore\n\treturn getArchtype(thing) === ArchType.Map ? thing.get(prop) : thing[prop]\n}\n\n/*#__PURE__*/\nexport function set(thing: any, propOrOldValue: PropertyKey, value: any) {\n\tconst t = getArchtype(thing)\n\tif (t === ArchType.Map) thing.set(propOrOldValue, value)\n\telse if (t === ArchType.Set) {\n\t\tthing.add(value)\n\t} else thing[propOrOldValue] = value\n}\n\n/*#__PURE__*/\nexport function is(x: any, y: any): boolean {\n\t// From: https://github.com/facebook/fbjs/blob/c69904a511b900266935168223063dd8772dfc40/packages/fbjs/src/core/shallowEqual.js\n\tif (x === y) {\n\t\treturn x !== 0 || 1 / x === 1 / y\n\t} else {\n\t\treturn x !== x && y !== y\n\t}\n}\n\n/*#__PURE__*/\nexport function isMap(target: any): target is AnyMap {\n\treturn target instanceof Map\n}\n\n/*#__PURE__*/\nexport function isSet(target: any): target is AnySet {\n\treturn target instanceof Set\n}\n/*#__PURE__*/\nexport function latest(state: ImmerState): any {\n\treturn state.copy_ || state.base_\n}\n\n/*#__PURE__*/\nexport function shallowCopy(base: any, strict: StrictMode) {\n\tif (isMap(base)) {\n\t\treturn new Map(base)\n\t}\n\tif (isSet(base)) {\n\t\treturn new Set(base)\n\t}\n\tif (Array.isArray(base)) return Array.prototype.slice.call(base)\n\n\tconst isPlain = isPlainObject(base)\n\n\tif (strict === true || (strict === \"class_only\" && !isPlain)) {\n\t\t// Perform a strict copy\n\t\tconst descriptors = Object.getOwnPropertyDescriptors(base)\n\t\tdelete descriptors[DRAFT_STATE as any]\n\t\tlet keys = Reflect.ownKeys(descriptors)\n\t\tfor (let i = 0; i < keys.length; i++) {\n\t\t\tconst key: any = keys[i]\n\t\t\tconst desc = descriptors[key]\n\t\t\tif (desc.writable === false) {\n\t\t\t\tdesc.writable = true\n\t\t\t\tdesc.configurable = true\n\t\t\t}\n\t\t\t// like object.assign, we will read any _own_, get/set accessors. This helps in dealing\n\t\t\t// with libraries that trap values, like mobx or vue\n\t\t\t// unlike object.assign, non-enumerables will be copied as well\n\t\t\tif (desc.get || desc.set)\n\t\t\t\tdescriptors[key] = {\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true, // could live with !!desc.set as well here...\n\t\t\t\t\tenumerable: desc.enumerable,\n\t\t\t\t\tvalue: base[key]\n\t\t\t\t}\n\t\t}\n\t\treturn Object.create(getPrototypeOf(base), descriptors)\n\t} else {\n\t\t// perform a sloppy copy\n\t\tconst proto = getPrototypeOf(base)\n\t\tif (proto !== null && isPlain) {\n\t\t\treturn {...base} // assumption: better inner class optimization than the assign below\n\t\t}\n\t\tconst obj = Object.create(proto)\n\t\treturn Object.assign(obj, base)\n\t}\n}\n\n/**\n * Freezes draftable objects. Returns the original object.\n * By default freezes shallowly, but if the second argument is `true` it will freeze recursively.\n *\n * @param obj\n * @param deep\n */\nexport function freeze<T>(obj: T, deep?: boolean): T\nexport function freeze<T>(obj: any, deep: boolean = false): T {\n\tif (isFrozen(obj) || isDraft(obj) || !isDraftable(obj)) return obj\n\tif (getArchtype(obj) > 1 /* Map or Set */) {\n\t\tobj.set = obj.add = obj.clear = obj.delete = dontMutateFrozenCollections as any\n\t}\n\tObject.freeze(obj)\n\tif (deep)\n\t\t// See #590, don't recurse into non-enumerable / Symbol properties when freezing\n\t\t// So use Object.entries (only string-like, enumerables) instead of each()\n\t\tObject.entries(obj).forEach(([key, value]) => freeze(value, true))\n\treturn obj\n}\n\nfunction dontMutateFrozenCollections() {\n\tdie(2)\n}\n\nexport function isFrozen(obj: any): boolean {\n\treturn Object.isFrozen(obj)\n}\n","import {\n\tImmerState,\n\tPatch,\n\tDrafted,\n\tImmerBaseState,\n\tAnyMap,\n\tAnySet,\n\tArchType,\n\tdie\n} from \"../internal\"\n\n/** Plugin utilities */\nconst plugins: {\n\tPatches?: {\n\t\tgeneratePatches_(\n\t\t\tstate: ImmerState,\n\t\t\tbasePath: PatchPath,\n\t\t\tpatches: Patch[],\n\t\t\tinversePatches: Patch[]\n\t\t): void\n\t\tgenerateReplacementPatches_(\n\t\t\tbase: any,\n\t\t\treplacement: any,\n\t\t\tpatches: Patch[],\n\t\t\tinversePatches: Patch[]\n\t\t): void\n\t\tapplyPatches_<T>(draft: T, patches: readonly Patch[]): T\n\t}\n\tMapSet?: {\n\t\tproxyMap_<T extends AnyMap>(target: T, parent?: ImmerState): T\n\t\tproxySet_<T extends AnySet>(target: T, parent?: ImmerState): T\n\t}\n} = {}\n\ntype Plugins = typeof plugins\n\nexport function getPlugin<K extends keyof Plugins>(\n\tpluginKey: K\n): Exclude<Plugins[K], undefined> {\n\tconst plugin = plugins[pluginKey]\n\tif (!plugin) {\n\t\tdie(0, pluginKey)\n\t}\n\t// @ts-ignore\n\treturn plugin\n}\n\nexport function loadPlugin<K extends keyof Plugins>(\n\tpluginKey: K,\n\timplementation: Plugins[K]\n): void {\n\tif (!plugins[pluginKey]) plugins[pluginKey] = implementation\n}\n/** Map / Set plugin */\n\nexport interface MapState extends ImmerBaseState {\n\ttype_: ArchType.Map\n\tcopy_: AnyMap | undefined\n\tassigned_: Map<any, boolean> | undefined\n\tbase_: AnyMap\n\trevoked_: boolean\n\tdraft_: Drafted<AnyMap, MapState>\n}\n\nexport interface SetState extends ImmerBaseState {\n\ttype_: ArchType.Set\n\tcopy_: AnySet | undefined\n\tbase_: AnySet\n\tdrafts_: Map<any, Drafted> // maps the original value to the draft value in the new set\n\trevoked_: boolean\n\tdraft_: Drafted<AnySet, SetState>\n}\n\n/** Patches plugin */\n\nexport type PatchPath = (string | number)[]\n","import {\n\tPatch,\n\tPatchListener,\n\tDrafted,\n\tImmer,\n\tDRAFT_STATE,\n\tImmerState,\n\tArchType,\n\tgetPlugin\n} from \"../internal\"\n\n/** Each scope represents a `produce` call. */\n\nexport interface ImmerScope {\n\tpatches_?: Patch[]\n\tinversePatches_?: Patch[]\n\tcanAutoFreeze_: boolean\n\tdrafts_: any[]\n\tparent_?: ImmerScope\n\tpatchListener_?: PatchListener\n\timmer_: Immer\n\tunfinalizedDrafts_: number\n}\n\nlet currentScope: ImmerScope | undefined\n\nexport function getCurrentScope() {\n\treturn currentScope!\n}\n\nfunction createScope(\n\tparent_: ImmerScope | undefined,\n\timmer_: Immer\n): ImmerScope {\n\treturn {\n\t\tdrafts_: [],\n\t\tparent_,\n\t\timmer_,\n\t\t// Whenever the modified draft contains a draft from another scope, we\n\t\t// need to prevent auto-freezing so the unowned draft can be finalized.\n\t\tcanAutoFreeze_: true,\n\t\tunfinalizedDrafts_: 0\n\t}\n}\n\nexport function usePatchesInScope(\n\tscope: ImmerScope,\n\tpatchListener?: PatchListener\n) {\n\tif (patchListener) {\n\t\tgetPlugin(\"Patches\") // assert we have the plugin\n\t\tscope.patches_ = []\n\t\tscope.inversePatches_ = []\n\t\tscope.patchListener_ = patchListener\n\t}\n}\n\nexport function revokeScope(scope: ImmerScope) {\n\tleaveScope(scope)\n\tscope.drafts_.forEach(revokeDraft)\n\t// @ts-ignore\n\tscope.drafts_ = null\n}\n\nexport function leaveScope(scope: ImmerScope) {\n\tif (scope === currentScope) {\n\t\tcurrentScope = scope.parent_\n\t}\n}\n\nexport function enterScope(immer: Immer) {\n\treturn (currentScope = createScope(currentScope, immer))\n}\n\nfunction revokeDraft(draft: Drafted) {\n\tconst state: ImmerState = draft[DRAFT_STATE]\n\tif (state.type_ === ArchType.Object || state.type_ === ArchType.Array)\n\t\tstate.revoke_()\n\telse state.revoked_ = true\n}\n","import {\n\tImmerScope,\n\tDRAFT_STATE,\n\tisDraftable,\n\tNOTHING,\n\tPatchPath,\n\teach,\n\thas,\n\tfreeze,\n\tImmerState,\n\tisDraft,\n\tSetState,\n\tset,\n\tArchType,\n\tgetPlugin,\n\tdie,\n\trevokeScope,\n\tisFrozen\n} from \"../internal\"\n\nexport function processResult(result: any, scope: ImmerScope) {\n\tscope.unfinalizedDrafts_ = scope.drafts_.length\n\tconst baseDraft = scope.drafts_![0]\n\tconst isReplaced = result !== undefined && result !== baseDraft\n\tif (isReplaced) {\n\t\tif (baseDraft[DRAFT_STATE].modified_) {\n\t\t\trevokeScope(scope)\n\t\t\tdie(4)\n\t\t}\n\t\tif (isDraftable(result)) {\n\t\t\t// Finalize the result in case it contains (or is) a subset of the draft.\n\t\t\tresult = finalize(scope, result)\n\t\t\tif (!scope.parent_) maybeFreeze(scope, result)\n\t\t}\n\t\tif (scope.patches_) {\n\t\t\tgetPlugin(\"Patches\").generateReplacementPatches_(\n\t\t\t\tbaseDraft[DRAFT_STATE].base_,\n\t\t\t\tresult,\n\t\t\t\tscope.patches_,\n\t\t\t\tscope.inversePatches_!\n\t\t\t)\n\t\t}\n\t} else {\n\t\t// Finalize the base draft.\n\t\tresult = finalize(scope, baseDraft, [])\n\t}\n\trevokeScope(scope)\n\tif (scope.patches_) {\n\t\tscope.patchListener_!(scope.patches_, scope.inversePatches_!)\n\t}\n\treturn result !== NOTHING ? result : undefined\n}\n\nfunction finalize(rootScope: ImmerScope, value: any, path?: PatchPath) {\n\t// Don't recurse in tho recursive data structures\n\tif (isFrozen(value)) return value\n\n\tconst state: ImmerState = value[DRAFT_STATE]\n\t// A plain object, might need freezing, might contain drafts\n\tif (!state) {\n\t\teach(value, (key, childValue) =>\n\t\t\tfinalizeProperty(rootScope, state, value, key, childValue, path)\n\t\t)\n\t\treturn value\n\t}\n\t// Never finalize drafts owned by another scope.\n\tif (state.scope_ !== rootScope) return value\n\t// Unmodified draft, return the (frozen) original\n\tif (!state.modified_) {\n\t\tmaybeFreeze(rootScope, state.base_, true)\n\t\treturn state.base_\n\t}\n\t// Not finalized yet, let's do that now\n\tif (!state.finalized_) {\n\t\tstate.finalized_ = true\n\t\tstate.scope_.unfinalizedDrafts_--\n\t\tconst result = state.copy_\n\t\t// Finalize all children of the copy\n\t\t// For sets we clone before iterating, otherwise we can get in endless loop due to modifying during iteration, see #628\n\t\t// To preserve insertion order in all cases we then clear the set\n\t\t// And we let finalizeProperty know it needs to re-add non-draft children back to the target\n\t\tlet resultEach = result\n\t\tlet isSet = false\n\t\tif (state.type_ === ArchType.Set) {\n\t\t\tresultEach = new Set(result)\n\t\t\tresult.clear()\n\t\t\tisSet = true\n\t\t}\n\t\teach(resultEach, (key, childValue) =>\n\t\t\tfinalizeProperty(rootScope, state, result, key, childValue, path, isSet)\n\t\t)\n\t\t// everything inside is frozen, we can freeze here\n\t\tmaybeFreeze(rootScope, result, false)\n\t\t// first time finalizing, let's create those patches\n\t\tif (path && rootScope.patches_) {\n\t\t\tgetPlugin(\"Patches\").generatePatches_(\n\t\t\t\tstate,\n\t\t\t\tpath,\n\t\t\t\trootScope.patches_,\n\t\t\t\trootScope.inversePatches_!\n\t\t\t)\n\t\t}\n\t}\n\treturn state.copy_\n}\n\nfunction finalizeProperty(\n\trootScope: ImmerScope,\n\tparentState: undefined | ImmerState,\n\ttargetObject: any,\n\tprop: string | number,\n\tchildValue: any,\n\trootPath?: PatchPath,\n\ttargetIsSet?: boolean\n) {\n\tif (process.env.NODE_ENV !== \"production\" && childValue === targetObject)\n\t\tdie(5)\n\tif (isDraft(childValue)) {\n\t\tconst path =\n\t\t\trootPath &&\n\t\t\tparentState &&\n\t\t\tparentState!.type_ !== ArchType.Set && // Set objects are atomic since they have no keys.\n\t\t\t!has((parentState as Exclude<ImmerState, SetState>).assigned_!, prop) // Skip deep patches for assigned keys.\n\t\t\t\t? rootPath!.concat(prop)\n\t\t\t\t: undefined\n\t\t// Drafts owned by `scope` are finalized here.\n\t\tconst res = finalize(rootScope, childValue, path)\n\t\tset(targetObject, prop, res)\n\t\t// Drafts from another scope must prevented to be frozen\n\t\t// if we got a draft back from finalize, we're in a nested produce and shouldn't freeze\n\t\tif (isDraft(res)) {\n\t\t\trootScope.canAutoFreeze_ = false\n\t\t} else return\n\t} else if (targetIsSet) {\n\t\ttargetObject.add(childValue)\n\t}\n\t// Search new objects for unfinalized drafts. Frozen objects should never contain drafts.\n\tif (isDraftable(childValue) && !isFrozen(childValue)) {\n\t\tif (!rootScope.immer_.autoFreeze_ && rootScope.unfinalizedDrafts_ < 1) {\n\t\t\t// optimization: if an object is not a draft, and we don't have to\n\t\t\t// deepfreeze everything, and we are sure that no drafts are left in the remaining object\n\t\t\t// cause we saw and finalized all drafts already; we can stop visiting the rest of the tree.\n\t\t\t// This benefits especially adding large data tree's without further processing.\n\t\t\t// See add-data.js perf test\n\t\t\treturn\n\t\t}\n\t\tfinalize(rootScope, childValue)\n\t\t// Immer deep freezes plain objects, so if there is no parent state, we freeze as well\n\t\t// Per #590, we never freeze symbolic properties. Just to make sure don't accidentally interfere\n\t\t// with other frameworks.\n\t\tif (\n\t\t\t(!parentState || !parentState.scope_.parent_) &&\n\t\t\ttypeof prop !== \"symbol\" &&\n\t\t\tObject.prototype.propertyIsEnumerable.call(targetObject, prop)\n\t\t)\n\t\t\tmaybeFreeze(rootScope, childValue)\n\t}\n}\n\nfunction maybeFreeze(scope: ImmerScope, value: any, deep = false) {\n\t// we never freeze for a non-root scope; as it would prevent pruning for drafts inside wrapping objects\n\tif (!scope.parent_ && scope.immer_.autoFreeze_ && scope.canAutoFreeze_) {\n\t\tfreeze(value, deep)\n\t}\n}\n","import {\n\teach,\n\thas,\n\tis,\n\tisDraftable,\n\tshallowCopy,\n\tlatest,\n\tImmerBaseState,\n\tImmerState,\n\tDrafted,\n\tAnyObject,\n\tAnyArray,\n\tObjectish,\n\tgetCurrentScope,\n\tgetPrototypeOf,\n\tDRAFT_STATE,\n\tdie,\n\tcreateProxy,\n\tArchType,\n\tImmerScope\n} from \"../internal\"\n\ninterface ProxyBaseState extends ImmerBaseState {\n\tassigned_: {\n\t\t[property: string]: boolean\n\t}\n\tparent_?: ImmerState\n\trevoke_(): void\n}\n\nexport interface ProxyObjectState extends ProxyBaseState {\n\ttype_: ArchType.Object\n\tbase_: any\n\tcopy_: any\n\tdraft_: Drafted<AnyObject, ProxyObjectState>\n}\n\nexport interface ProxyArrayState extends ProxyBaseState {\n\ttype_: ArchType.Array\n\tbase_: AnyArray\n\tcopy_: AnyArray | null\n\tdraft_: Drafted<AnyArray, ProxyArrayState>\n}\n\ntype ProxyState = ProxyObjectState | ProxyArrayState\n\n/**\n * Returns a new draft of the `base` object.\n *\n * The second argument is the parent draft-state (used internally).\n */\nexport function createProxyProxy<T extends Objectish>(\n\tbase: T,\n\tparent?: ImmerState\n): Drafted<T, ProxyState> {\n\tconst isArray = Array.isArray(base)\n\tconst state: ProxyState = {\n\t\ttype_: isArray ? ArchType.Array : (ArchType.Object as any),\n\t\t// Track which produce call this is associated with.\n\t\tscope_: parent ? parent.scope_ : getCurrentScope()!,\n\t\t// True for both shallow and deep changes.\n\t\tmodified_: false,\n\t\t// Used during finalization.\n\t\tfinalized_: false,\n\t\t// Track which properties have been assigned (true) or deleted (false).\n\t\tassigned_: {},\n\t\t// The parent draft state.\n\t\tparent_: parent,\n\t\t// The base state.\n\t\tbase_: base,\n\t\t// The base proxy.\n\t\tdraft_: null as any, // set below\n\t\t// The base copy with any updated values.\n\t\tcopy_: null,\n\t\t// Called by the `produce` function.\n\t\trevoke_: null as any,\n\t\tisManual_: false\n\t}\n\n\t// the traps must target something, a bit like the 'real' base.\n\t// but also, we need to be able to determine from the target what the relevant state is\n\t// (to avoid creating traps per instance to capture the state in closure,\n\t// and to avoid creating weird hidden properties as well)\n\t// So the trick is to use 'state' as the actual 'target'! (and make sure we intercept everything)\n\t// Note that in the case of an array, we put the state in an array to have better Reflect defaults ootb\n\tlet target: T = state as any\n\tlet traps: ProxyHandler<object | Array<any>> = objectTraps\n\tif (isArray) {\n\t\ttarget = [state] as any\n\t\ttraps = arrayTraps\n\t}\n\n\tconst {revoke, proxy} = Proxy.revocable(target, traps)\n\tstate.draft_ = proxy as any\n\tstate.revoke_ = revoke\n\treturn proxy as any\n}\n\n/**\n * Object drafts\n */\nexport const objectTraps: ProxyHandler<ProxyState> = {\n\tget(state, prop) {\n\t\tif (prop === DRAFT_STATE) return state\n\n\t\tconst source = latest(state)\n\t\tif (!has(source, prop)) {\n\t\t\t// non-existing or non-own property...\n\t\t\treturn readPropFromProto(state, source, prop)\n\t\t}\n\t\tconst value = source[prop]\n\t\tif (state.finalized_ || !isDraftable(value)) {\n\t\t\treturn value\n\t\t}\n\t\t// Check for existing draft in modified state.\n\t\t// Assigned values are never drafted. This catches any drafts we created, too.\n\t\tif (value === peek(state.base_, prop)) {\n\t\t\tprepareCopy(state)\n\t\t\treturn (state.copy_![prop as any] = createProxy(value, state))\n\t\t}\n\t\treturn value\n\t},\n\thas(state, prop) {\n\t\treturn prop in latest(state)\n\t},\n\townKeys(state) {\n\t\treturn Reflect.ownKeys(latest(state))\n\t},\n\tset(\n\t\tstate: ProxyObjectState,\n\t\tprop: string /* strictly not, but helps TS */,\n\t\tvalue\n\t) {\n\t\tconst desc = getDescriptorFromProto(latest(state), prop)\n\t\tif (desc?.set) {\n\t\t\t// special case: if this write is captured by a setter, we have\n\t\t\t// to trigger it with the correct context\n\t\t\tdesc.set.call(state.draft_, value)\n\t\t\treturn true\n\t\t}\n\t\tif (!state.modified_) {\n\t\t\t// the last check is because we need to be able to distinguish setting a non-existing to undefined (which is a change)\n\t\t\t// from setting an existing property with value undefined to undefined (which is not a change)\n\t\t\tconst current = peek(latest(state), prop)\n\t\t\t// special case, if we assigning the original value to a draft, we can ignore the assignment\n\t\t\tconst currentState: ProxyObjectState = current?.[DRAFT_STATE]\n\t\t\tif (currentState && currentState.base_ === value) {\n\t\t\t\tstate.copy_![prop] = value\n\t\t\t\tstate.assigned_[prop] = false\n\t\t\t\treturn true\n\t\t\t}\n\t\t\tif (is(value, current) && (value !== undefined || has(state.base_, prop)))\n\t\t\t\treturn true\n\t\t\tprepareCopy(state)\n\t\t\tmarkChanged(state)\n\t\t}\n\n\t\tif (\n\t\t\t(state.copy_![prop] === value &&\n\t\t\t\t// special case: handle new props with value 'undefined'\n\t\t\t\t(value !== undefined || prop in state.copy_)) ||\n\t\t\t// special case: NaN\n\t\t\t(Number.isNaN(value) && Number.isNaN(state.copy_![prop]))\n\t\t)\n\t\t\treturn true\n\n\t\t// @ts-ignore\n\t\tstate.copy_![prop] = value\n\t\tstate.assigned_[prop] = true\n\t\treturn true\n\t},\n\tdeleteProperty(state, prop: string) {\n\t\t// The `undefined` check is a fast path for pre-existing keys.\n\t\tif (peek(state.base_, prop) !== undefined || prop in state.base_) {\n\t\t\tstate.assigned_[prop] = false\n\t\t\tprepareCopy(state)\n\t\t\tmarkChanged(state)\n\t\t} else {\n\t\t\t// if an originally not assigned property was deleted\n\t\t\tdelete state.assigned_[prop]\n\t\t}\n\t\tif (state.copy_) {\n\t\t\tdelete state.copy_[prop]\n\t\t}\n\t\treturn true\n\t},\n\t// Note: We never coerce `desc.value` into an Immer draft, because we can't make\n\t// the same guarantee in ES5 mode.\n\tgetOwnPropertyDescriptor(state, prop) {\n\t\tconst owner = latest(state)\n\t\tconst desc = Reflect.getOwnPropertyDescriptor(owner, prop)\n\t\tif (!desc) return desc\n\t\treturn {\n\t\t\twritable: true,\n\t\t\tconfigurable: state.type_ !== ArchType.Array || prop !== \"length\",\n\t\t\tenumerable: desc.enumerable,\n\t\t\tvalue: owner[prop]\n\t\t}\n\t},\n\tdefineProperty() {\n\t\tdie(11)\n\t},\n\tgetPrototypeOf(state) {\n\t\treturn getPrototypeOf(state.base_)\n\t},\n\tsetPrototypeOf() {\n\t\tdie(12)\n\t}\n}\n\n/**\n * Array drafts\n */\n\nconst arrayTraps: ProxyHandler<[ProxyArrayState]> = {}\neach(objectTraps, (key, fn) => {\n\t// @ts-ignore\n\tarrayTraps[key] = function() {\n\t\targuments[0] = arguments[0][0]\n\t\treturn fn.apply(this, arguments)\n\t}\n})\narrayTraps.deleteProperty = function(state, prop) {\n\tif (process.env.NODE_ENV !== \"production\" && isNaN(parseInt(prop as any)))\n\t\tdie(13)\n\t// @ts-ignore\n\treturn arrayTraps.set!.call(this, state, prop, undefined)\n}\narrayTraps.set = function(state, prop, value) {\n\tif (\n\t\tprocess.env.NODE_ENV !== \"production\" &&\n\t\tprop !== \"length\" &&\n\t\tisNaN(parseInt(prop as any))\n\t)\n\t\tdie(14)\n\treturn objectTraps.set!.call(this, state[0], prop, value, state[0])\n}\n\n// Access a property without creating an Immer draft.\nfunction peek(draft: Drafted, prop: PropertyKey) {\n\tconst state = draft[DRAFT_STATE]\n\tconst source = state ? latest(state) : draft\n\treturn source[prop]\n}\n\nfunction readPropFromProto(state: ImmerState, source: any, prop: PropertyKey) {\n\tconst desc = getDescriptorFromProto(source, prop)\n\treturn desc\n\t\t? `value` in desc\n\t\t\t? desc.value\n\t\t\t: // This is a very special case, if the prop is a getter defined by the\n\t\t\t // prototype, we should invoke it with the draft as context!\n\t\t\t desc.get?.call(state.draft_)\n\t\t: undefined\n}\n\nfunction getDescriptorFromProto(\n\tsource: any,\n\tprop: PropertyKey\n): PropertyDescriptor | undefined {\n\t// 'in' checks proto!\n\tif (!(prop in source)) return undefined\n\tlet proto = getPrototypeOf(source)\n\twhile (proto) {\n\t\tconst desc = Object.getOwnPropertyDescriptor(proto, prop)\n\t\tif (desc) return desc\n\t\tproto = getPrototypeOf(proto)\n\t}\n\treturn undefined\n}\n\nexport function markChanged(state: ImmerState) {\n\tif (!state.modified_) {\n\t\tstate.modified_ = true\n\t\tif (state.parent_) {\n\t\t\tmarkChanged(state.parent_)\n\t\t}\n\t}\n}\n\nexport function prepareCopy(state: {\n\tbase_: any\n\tcopy_: any\n\tscope_: ImmerScope\n}) {\n\tif (!state.copy_) {\n\t\tstate.copy_ = shallowCopy(\n\t\t\tstate.base_,\n\t\t\tstate.scope_.immer_.useStrictShallowCopy_\n\t\t)\n\t}\n}\n","import {\n\tIProduceWithPatches,\n\tIProduce,\n\tImmerState,\n\tDrafted,\n\tisDraftable,\n\tprocessResult,\n\tPatch,\n\tObjectish,\n\tDRAFT_STATE,\n\tDraft,\n\tPatchListener,\n\tisDraft,\n\tisMap,\n\tisSet,\n\tcreateProxyProxy,\n\tgetPlugin,\n\tdie,\n\tenterScope,\n\trevokeScope,\n\tleaveScope,\n\tusePatchesInScope,\n\tgetCurrentScope,\n\tNOTHING,\n\tfreeze,\n\tcurrent\n} from \"../internal\"\n\ninterface ProducersFns {\n\tproduce: IProduce\n\tproduceWithPatches: IProduceWithPatches\n}\n\nexport type StrictMode = boolean | \"class_only\";\n\nexport class Immer implements ProducersFns {\n\tautoFreeze_: boolean = true\n\tuseStrictShallowCopy_: StrictMode = false\n\n\tconstructor(config?: {\n\t\tautoFreeze?: boolean\n\t\tuseStrictShallowCopy?: StrictMode\n\t}) {\n\t\tif (typeof config?.autoFreeze === \"boolean\")\n\t\t\tthis.setAutoFreeze(config!.autoFreeze)\n\t\tif (typeof config?.useStrictShallowCopy === \"boolean\")\n\t\t\tthis.setUseStrictShallowCopy(config!.useStrictShallowCopy)\n\t}\n\n\t/**\n\t * The `produce` function takes a value and a \"recipe function\" (whose\n\t * return value often depends on the base state). The recipe function is\n\t * free to mutate its first argument however it wants. All mutations are\n\t * only ever applied to a __copy__ of the base state.\n\t *\n\t * Pass only a function to create a \"curried producer\" which relieves you\n\t * from passing the recipe function every time.\n\t *\n\t * Only plain objects and arrays are made mutable. All other objects are\n\t * considered uncopyable.\n\t *\n\t * Note: This function is __bound__ to its `Immer` instance.\n\t *\n\t * @param {any} base - the initial state\n\t * @param {Function} recipe - function that receives a proxy of the base state as first argument and which can be freely modified\n\t * @param {Function} patchListener - optional function that will be called with all the patches produced here\n\t * @returns {any} a new state, or the initial state if nothing was modified\n\t */\n\tproduce: IProduce = (base: any, recipe?: any, patchListener?: any) => {\n\t\t// curried invocation\n\t\tif (typeof base === \"function\" && typeof recipe !== \"function\") {\n\t\t\tconst defaultBase = recipe\n\t\t\trecipe = base\n\n\t\t\tconst self = this\n\t\t\treturn function curriedProduce(\n\t\t\t\tthis: any,\n\t\t\t\tbase = defaultBase,\n\t\t\t\t...args: any[]\n\t\t\t) {\n\t\t\t\treturn self.produce(base, (draft: Drafted) => recipe.call(this, draft, ...args)) // prettier-ignore\n\t\t\t}\n\t\t}\n\n\t\tif (typeof recipe !== \"function\") die(6)\n\t\tif (patchListener !== undefined && typeof patchListener !== \"function\")\n\t\t\tdie(7)\n\n\t\tlet result\n\n\t\t// Only plain objects, arrays, and \"immerable classes\" are drafted.\n\t\tif (isDraftable(base)) {\n\t\t\tconst scope = enterScope(this)\n\t\t\tconst proxy = createProxy(base, undefined)\n\t\t\tlet hasError = true\n\t\t\ttry {\n\t\t\t\tresult = recipe(proxy)\n\t\t\t\thasError = false\n\t\t\t} finally {\n\t\t\t\t// finally instead of catch + rethrow better preserves original stack\n\t\t\t\tif (hasError) revokeScope(scope)\n\t\t\t\telse leaveScope(scope)\n\t\t\t}\n\t\t\tusePatchesInScope(scope, patchListener)\n\t\t\treturn processResult(result, scope)\n\t\t} else if (!base || typeof base !== \"object\") {\n\t\t\tresult = recipe(base)\n\t\t\tif (result === undefined) result = base\n\t\t\tif (result === NOTHING) result = undefined\n\t\t\tif (this.autoFreeze_) freeze(result, true)\n\t\t\tif (patchListener) {\n\t\t\t\tconst p: Patch[] = []\n\t\t\t\tconst ip: Patch[] = []\n\t\t\t\tgetPlugin(\"Patches\").generateReplacementPatches_(base, result, p, ip)\n\t\t\t\tpatchListener(p, ip)\n\t\t\t}\n\t\t\treturn result\n\t\t} else die(1, base)\n\t}\n\n\tproduceWithPatches: IProduceWithPatches = (base: any, recipe?: any): any => {\n\t\t// curried invocation\n\t\tif (typeof base === \"function\") {\n\t\t\treturn (state: any, ...args: any[]) =>\n\t\t\t\tthis.produceWithPatches(state, (draft: any) => base(draft, ...args))\n\t\t}\n\n\t\tlet patches: Patch[], inversePatches: Patch[]\n\t\tconst result = this.produce(base, recipe, (p: Patch[], ip: Patch[]) => {\n\t\t\tpatches = p\n\t\t\tinversePatches = ip\n\t\t})\n\t\treturn [result, patches!, inversePatches!]\n\t}\n\n\tcreateDraft<T extends Objectish>(base: T): Draft<T> {\n\t\tif (!isDraftable(base)) die(8)\n\t\tif (isDraft(base)) base = current(base)\n\t\tconst scope = enterScope(this)\n\t\tconst proxy = createProxy(base, undefined)\n\t\tproxy[DRAFT_STATE].isManual_ = true\n\t\tleaveScope(scope)\n\t\treturn proxy as any\n\t}\n\n\tfinishDraft<D extends Draft<any>>(\n\t\tdraft: D,\n\t\tpatchListener?: PatchListener\n\t): D extends Draft<infer T> ? T : never {\n\t\tconst state: ImmerState = draft && (draft as any)[DRAFT_STATE]\n\t\tif (!state || !state.isManual_) die(9)\n\t\tconst {scope_: scope} = state\n\t\tusePatchesInScope(scope, patchListener)\n\t\treturn processResult(undefined, scope)\n\t}\n\n\t/**\n\t * Pass true to automatically freeze all copies created by Immer.\n\t *\n\t * By default, auto-freezing is enabled.\n\t */\n\tsetAutoFreeze(value: boolean) {\n\t\tthis.autoFreeze_ = value\n\t}\n\n\t/**\n\t * Pass true to enable strict shallow copy.\n\t *\n\t * By default, immer does not copy the object descriptors such as getter, setter and non-enumrable properties.\n\t */\n\tsetUseStrictShallowCopy(value: StrictMode) {\n\t\tthis.useStrictShallowCopy_ = value\n\t}\n\n\tapplyPatches<T extends Objectish>(base: T, patches: readonly Patch[]): T {\n\t\t// If a patch replaces the entire state, take that replacement as base\n\t\t// before applying patches\n\t\tlet i: number\n\t\tfor (i = patches.length - 1; i >= 0; i--) {\n\t\t\tconst patch = patches[i]\n\t\t\tif (patch.path.length === 0 && patch.op === \"replace\") {\n\t\t\t\tbase = patch.value\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\t// If there was a patch that replaced the entire state, start from the\n\t\t// patch after that.\n\t\tif (i > -1) {\n\t\t\tpatches = patches.slice(i + 1)\n\t\t}\n\n\t\tconst applyPatchesImpl = getPlugin(\"Patches\").applyPatches_\n\t\tif (isDraft(base)) {\n\t\t\t// N.B: never hits if some patch a replacement, patches are never drafts\n\t\t\treturn applyPatchesImpl(base, patches)\n\t\t}\n\t\t// Otherwise, produce a copy of the base state.\n\t\treturn this.produce(base, (draft: Drafted) =>\n\t\t\tapplyPatchesImpl(draft, patches)\n\t\t)\n\t}\n}\n\nexport function createProxy<T extends Objectish>(\n\tvalue: T,\n\tparent?: ImmerState\n): Drafted<T, ImmerState> {\n\t// precondition: createProxy should be guarded by isDraftable, so we know we can safely draft\n\tconst draft: Drafted = isMap(value)\n\t\t? getPlugin(\"MapSet\").proxyMap_(value, parent)\n\t\t: isSet(value)\n\t\t? getPlugin(\"MapSet\").proxySet_(value, parent)\n\t\t: createProxyProxy(value, parent)\n\n\tconst scope = parent ? parent.scope_ : getCurrentScope()\n\tscope.drafts_.push(draft)\n\treturn draft\n}\n","import {\n\tdie,\n\tisDraft,\n\tshallowCopy,\n\teach,\n\tDRAFT_STATE,\n\tset,\n\tImmerState,\n\tisDraftable,\n\tisFrozen\n} from \"../internal\"\n\n/** Takes a snapshot of the current state of a draft and finalizes it (but without freezing). This is a great utility to print the current state during debugging (no Proxies in the way). The output of current can also be safely leaked outside the producer. */\nexport function current<T>(value: T): T\nexport function current(value: any): any {\n\tif (!isDraft(value)) die(10, value)\n\treturn currentImpl(value)\n}\n\nfunction currentImpl(value: any): any {\n\tif (!isDraftable(value) || isFrozen(value)) return value\n\tconst state: ImmerState | undefined = value[DRAFT_STATE]\n\tlet copy: any\n\tif (state) {\n\t\tif (!state.modified_) return state.base_\n\t\t// Optimization: avoid generating new drafts during copying\n\t\tstate.finalized_ = true\n\t\tcopy = shallowCopy(value, state.scope_.immer_.useStrictShallowCopy_)\n\t} else {\n\t\tcopy = shallowCopy(value, true)\n\t}\n\t// recurse\n\teach(copy, (key, childValue) => {\n\t\tset(copy, key, currentImpl(childValue))\n\t})\n\tif (state) {\n\t\tstate.finalized_ = false\n\t}\n\treturn copy\n}\n","// types only!\nimport {\n\tImmerState,\n\tAnyMap,\n\tAnySet,\n\tMapState,\n\tSetState,\n\tDRAFT_STATE,\n\tgetCurrentScope,\n\tlatest,\n\tisDraftable,\n\tcreateProxy,\n\tloadPlugin,\n\tmarkChanged,\n\tdie,\n\tArchType,\n\teach\n} from \"../internal\"\n\nexport function enableMapSet() {\n\tclass DraftMap extends Map {\n\t\t[DRAFT_STATE]: MapState\n\n\t\tconstructor(target: AnyMap, parent?: ImmerState) {\n\t\t\tsuper()\n\t\t\tthis[DRAFT_STATE] = {\n\t\t\t\ttype_: ArchType.Map,\n\t\t\t\tparent_: parent,\n\t\t\t\tscope_: parent ? parent.scope_ : getCurrentScope()!,\n\t\t\t\tmodified_: false,\n\t\t\t\tfinalized_: false,\n\t\t\t\tcopy_: undefined,\n\t\t\t\tassigned_: undefined,\n\t\t\t\tbase_: target,\n\t\t\t\tdraft_: this as any,\n\t\t\t\tisManual_: false,\n\t\t\t\trevoked_: false\n\t\t\t}\n\t\t}\n\n\t\tget size(): number {\n\t\t\treturn latest(this[DRAFT_STATE]).size\n\t\t}\n\n\t\thas(key: any): boolean {\n\t\t\treturn latest(this[DRAFT_STATE]).has(key)\n\t\t}\n\n\t\tset(key: any, value: any) {\n\t\t\tconst state: MapState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\tif (!latest(state).has(key) || latest(state).get(key) !== value) {\n\t\t\t\tprepareMapCopy(state)\n\t\t\t\tmarkChanged(state)\n\t\t\t\tstate.assigned_!.set(key, true)\n\t\t\t\tstate.copy_!.set(key, value)\n\t\t\t\tstate.assigned_!.set(key, true)\n\t\t\t}\n\t\t\treturn this\n\t\t}\n\n\t\tdelete(key: any): boolean {\n\t\t\tif (!this.has(key)) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tconst state: MapState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\tprepareMapCopy(state)\n\t\t\tmarkChanged(state)\n\t\t\tif (state.base_.has(key)) {\n\t\t\t\tstate.assigned_!.set(key, false)\n\t\t\t} else {\n\t\t\t\tstate.assigned_!.delete(key)\n\t\t\t}\n\t\t\tstate.copy_!.delete(key)\n\t\t\treturn true\n\t\t}\n\n\t\tclear() {\n\t\t\tconst state: MapState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\tif (latest(state).size) {\n\t\t\t\tprepareMapCopy(state)\n\t\t\t\tmarkChanged(state)\n\t\t\t\tstate.assigned_ = new Map()\n\t\t\t\teach(state.base_, key => {\n\t\t\t\t\tstate.assigned_!.set(key, false)\n\t\t\t\t})\n\t\t\t\tstate.copy_!.clear()\n\t\t\t}\n\t\t}\n\n\t\tforEach(cb: (value: any, key: any, self: any) => void, thisArg?: any) {\n\t\t\tconst state: MapState = this[DRAFT_STATE]\n\t\t\tlatest(state).forEach((_value: any, key: any, _map: any) => {\n\t\t\t\tcb.call(thisArg, this.get(key), key, this)\n\t\t\t})\n\t\t}\n\n\t\tget(key: any): any {\n\t\t\tconst state: MapState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\tconst value = latest(state).get(key)\n\t\t\tif (state.finalized_ || !isDraftable(value)) {\n\t\t\t\treturn value\n\t\t\t}\n\t\t\tif (value !== state.base_.get(key)) {\n\t\t\t\treturn value // either already drafted or reassigned\n\t\t\t}\n\t\t\t// despite what it looks, this creates a draft only once, see above condition\n\t\t\tconst draft = createProxy(value, state)\n\t\t\tprepareMapCopy(state)\n\t\t\tstate.copy_!.set(key, draft)\n\t\t\treturn draft\n\t\t}\n\n\t\tkeys(): IterableIterator<any> {\n\t\t\treturn latest(this[DRAFT_STATE]).keys()\n\t\t}\n\n\t\tvalues(): IterableIterator<any> {\n\t\t\tconst iterator = this.keys()\n\t\t\treturn {\n\t\t\t\t[Symbol.iterator]: () => this.values(),\n\t\t\t\tnext: () => {\n\t\t\t\t\tconst r = iterator.next()\n\t\t\t\t\t/* istanbul ignore next */\n\t\t\t\t\tif (r.done) return r\n\t\t\t\t\tconst value = this.get(r.value)\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdone: false,\n\t\t\t\t\t\tvalue\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} as any\n\t\t}\n\n\t\tentries(): IterableIterator<[any, any]> {\n\t\t\tconst iterator = this.keys()\n\t\t\treturn {\n\t\t\t\t[Symbol.iterator]: () => this.entries(),\n\t\t\t\tnext: () => {\n\t\t\t\t\tconst r = iterator.next()\n\t\t\t\t\t/* istanbul ignore next */\n\t\t\t\t\tif (r.done) return r\n\t\t\t\t\tconst value = this.get(r.value)\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdone: false,\n\t\t\t\t\t\tvalue: [r.value, value]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} as any\n\t\t}\n\n\t\t[Symbol.iterator]() {\n\t\t\treturn this.entries()\n\t\t}\n\t}\n\n\tfunction proxyMap_<T extends AnyMap>(target: T, parent?: ImmerState): T {\n\t\t// @ts-ignore\n\t\treturn new DraftMap(target, parent)\n\t}\n\n\tfunction prepareMapCopy(state: MapState) {\n\t\tif (!state.copy_) {\n\t\t\tstate.assigned_ = new Map()\n\t\t\tstate.copy_ = new Map(state.base_)\n\t\t}\n\t}\n\n\tclass DraftSet extends Set {\n\t\t[DRAFT_STATE]: SetState\n\t\tconstructor(target: AnySet, parent?: ImmerState) {\n\t\t\tsuper()\n\t\t\tthis[DRAFT_STATE] = {\n\t\t\t\ttype_: ArchType.Set,\n\t\t\t\tparent_: parent,\n\t\t\t\tscope_: parent ? parent.scope_ : getCurrentScope()!,\n\t\t\t\tmodified_: false,\n\t\t\t\tfinalized_: false,\n\t\t\t\tcopy_: undefined,\n\t\t\t\tbase_: target,\n\t\t\t\tdraft_: this,\n\t\t\t\tdrafts_: new Map(),\n\t\t\t\trevoked_: false,\n\t\t\t\tisManual_: false\n\t\t\t}\n\t\t}\n\n\t\tget size(): number {\n\t\t\treturn latest(this[DRAFT_STATE]).size\n\t\t}\n\n\t\thas(value: any): boolean {\n\t\t\tconst state: SetState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\t// bit of trickery here, to be able to recognize both the value, and the draft of its value\n\t\t\tif (!state.copy_) {\n\t\t\t\treturn state.base_.has(value)\n\t\t\t}\n\t\t\tif (state.copy_.has(value)) return true\n\t\t\tif (state.drafts_.has(value) && state.copy_.has(state.drafts_.get(value)))\n\t\t\t\treturn true\n\t\t\treturn false\n\t\t}\n\n\t\tadd(value: any): any {\n\t\t\tconst state: SetState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\tif (!this.has(value)) {\n\t\t\t\tprepareSetCopy(state)\n\t\t\t\tmarkChanged(state)\n\t\t\t\tstate.copy_!.add(value)\n\t\t\t}\n\t\t\treturn this\n\t\t}\n\n\t\tdelete(value: any): any {\n\t\t\tif (!this.has(value)) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tconst state: SetState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\tprepareSetCopy(state)\n\t\t\tmarkChanged(state)\n\t\t\treturn (\n\t\t\t\tstate.copy_!.delete(value) ||\n\t\t\t\t(state.drafts_.has(value)\n\t\t\t\t\t? state.copy_!.delete(state.drafts_.get(value))\n\t\t\t\t\t: /* istanbul ignore next */ false)\n\t\t\t)\n\t\t}\n\n\t\tclear() {\n\t\t\tconst state: SetState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\tif (latest(state).size) {\n\t\t\t\tprepareSetCopy(state)\n\t\t\t\tmarkChanged(state)\n\t\t\t\tstate.copy_!.clear()\n\t\t\t}\n\t\t}\n\n\t\tvalues(): IterableIterator<any> {\n\t\t\tconst state: SetState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\tprepareSetCopy(state)\n\t\t\treturn state.copy_!.values()\n\t\t}\n\n\t\tentries(): IterableIterator<[any, any]> {\n\t\t\tconst state: SetState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\tprepareSetCopy(state)\n\t\t\treturn state.copy_!.entries()\n\t\t}\n\n\t\tkeys(): IterableIterator<any> {\n\t\t\treturn this.values()\n\t\t}\n\n\t\t[Symbol.iterator]() {\n\t\t\treturn this.values()\n\t\t}\n\n\t\tforEach(cb: any, thisArg?: any) {\n\t\t\tconst iterator = this.values()\n\t\t\tlet result = iterator.next()\n\t\t\twhile (!result.done) {\n\t\t\t\tcb.call(thisArg, result.value, result.value, this)\n\t\t\t\tresult = iterator.next()\n\t\t\t}\n\t\t}\n\t}\n\tfunction proxySet_<T extends AnySet>(target: T, parent?: ImmerState): T {\n\t\t// @ts-ignore\n\t\treturn new DraftSet(target, parent)\n\t}\n\n\tfunction prepareSetCopy(state: SetState) {\n\t\tif (!state.copy_) {\n\t\t\t// create drafts for all entries to preserve insertion order\n\t\t\tstate.copy_ = new Set()\n\t\t\tstate.base_.forEach(value => {\n\t\t\t\tif (isDraftable(value)) {\n\t\t\t\t\tconst draft = createProxy(value, state)\n\t\t\t\t\tstate.drafts_.set(value, draft)\n\t\t\t\t\tstate.copy_!.add(draft)\n\t\t\t\t} else {\n\t\t\t\t\tstate.copy_!.add(value)\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t}\n\n\tfunction assertUnrevoked(state: any /*ES5State | MapState | SetState*/) {\n\t\tif (state.revoked_) die(3, JSON.stringify(latest(state)))\n\t}\n\n\tloadPlugin(\"MapSet\", {proxyMap_, proxySet_})\n}\n","import {\n\tIProduce,\n\tIProduceWithPatches,\n\tImmer,\n\tDraft,\n\tImmutable\n} from \"./internal\"\n\nexport {\n\tDraft,\n\tWritableDraft,\n\tImmutable,\n\tPatch,\n\tPatchListener,\n\tProducer,\n\toriginal,\n\tcurrent,\n\tisDraft,\n\tisDraftable,\n\tNOTHING as nothing,\n\tDRAFTABLE as immerable,\n\tfreeze,\n\tObjectish,\n\tStrictMode\n} from \"./internal\"\n\nconst immer = new Immer()\n\n/**\n * The `produce` function takes a value and a \"recipe function\" (whose\n * return value often depends on the base state). The recipe function is\n * free to mutate its first argument however it wants. All mutations are\n * only ever applied to a __copy__ of the base state.\n *\n * Pass only a function to create a \"curried producer\" which relieves you\n * from passing the recipe function every time.\n *\n * Only plain objects and arrays are made mutable. All other objects are\n * considered uncopyable.\n *\n * Note: This function is __bound__ to its `Immer` instance.\n *\n * @param {any} base - the initial state\n * @param {Function} producer - function that receives a proxy of the base state as first argument and which can be freely modified\n * @param {Function} patchListener - optional function that will be called with all the patches produced here\n * @returns {any} a new state, or the initial state if nothing was modified\n */\nexport const produce: IProduce = immer.produce\n\n/**\n * Like `produce`, but `produceWithPatches` always returns a tuple\n * [nextState, patches, inversePatches] (instead of just the next state)\n */\nexport const produceWithPatches: IProduceWithPatches = immer.produceWithPatches.bind(\n\timmer\n)\n\n/**\n * Pass true to automatically freeze all copies created by Immer.\n *\n * Always freeze by default, even in production mode\n */\nexport const setAutoFreeze = immer.setAutoFreeze.bind(immer)\n\n/**\n * Pass true to enable strict shallow copy.\n *\n * By default, immer does not copy the object descriptors such as getter, setter and non-enumrable properties.\n */\nexport const setUseStrictShallowCopy = immer.setUseStrictShallowCopy.bind(immer)\n\n/**\n * Apply an array of Immer patches to the first argument.\n *\n * This function is a producer, which means copy-on-write is in effect.\n */\nexport const applyPatches = immer.applyPatches.bind(immer)\n\n/**\n * Create an Immer draft from the given base state, which may be a draft itself.\n * The draft can be modified until you finalize it with the `finishDraft` function.\n */\nexport const createDraft = immer.createDraft.bind(immer)\n\n/**\n * Finalize an Immer draft from a `createDraft` call, returning the base state\n * (if no changes were made) or a modified copy. The draft must *not* be\n * mutated afterwards.\n *\n * Pass a function as the 2nd argument to generate Immer patches based on the\n * changes that were made.\n */\nexport const finishDraft = immer.finishDraft.bind(immer)\n\n/**\n * This function is actually a no-op, but can be used to cast an immutable type\n * to an draft type and make TypeScript happy\n *\n * @param value\n */\nexport function castDraft<T>(value: T): Draft<T> {\n\treturn value as any\n}\n\n/**\n * This function is actually a no-op, but can be used to cast a mutable type\n * to an immutable type and make TypeScript happy\n * @param value\n */\nexport function castImmutable<T>(value: T): Immutable<T> {\n\treturn value as any\n}\n\nexport {Immer}\n\nexport {enablePatches} from \"./plugins/patches\"\nexport {enableMapSet} from \"./plugins/mapset\"\n","import type { ElementType, MemoExoticComponent, ReactElement } from 'react'\nimport { React } from './react'\n\n// Directly ported from:\n// https://unpkg.com/browse/react-is@19.0.0/cjs/react-is.production.js\n// It's very possible this could change in the future, but given that\n// we only use these in `connect`, this is a low priority.\n\nexport const IS_REACT_19 = /* @__PURE__ */ React.version.startsWith('19')\n\nconst REACT_ELEMENT_TYPE = /* @__PURE__ */ Symbol.for(\n IS_REACT_19 ? 'react.transitional.element' : 'react.element',\n)\nconst REACT_PORTAL_TYPE = /* @__PURE__ */ Symbol.for('react.portal')\nconst REACT_FRAGMENT_TYPE = /* @__PURE__ */ Symbol.for('react.fragment')\nconst REACT_STRICT_MODE_TYPE = /* @__PURE__ */ Symbol.for('react.strict_mode')\nconst REACT_PROFILER_TYPE = /* @__PURE__ */ Symbol.for('react.profiler')\nconst REACT_CONSUMER_TYPE = /* @__PURE__ */ Symbol.for('react.consumer')\nconst REACT_CONTEXT_TYPE = /* @__PURE__ */ Symbol.for('react.context')\nconst REACT_FORWARD_REF_TYPE = /* @__PURE__ */ Symbol.for('react.forward_ref')\nconst REACT_SUSPENSE_TYPE = /* @__PURE__ */ Symbol.for('react.suspense')\nconst REACT_SUSPENSE_LIST_TYPE = /* @__PURE__ */ Symbol.for(\n 'react.suspense_list',\n)\nconst REACT_MEMO_TYPE = /* @__PURE__ */ Symbol.for('react.memo')\nconst REACT_LAZY_TYPE = /* @__PURE__ */ Symbol.for('react.lazy')\nconst REACT_OFFSCREEN_TYPE = /* @__PURE__ */ Symbol.for('react.offscreen')\nconst REACT_CLIENT_REFERENCE = /* @__PURE__ */ Symbol.for(\n 'react.client.reference',\n)\n\nexport const ForwardRef = REACT_FORWARD_REF_TYPE\nexport const Memo = REACT_MEMO_TYPE\n\nexport function isValidElementType(type: any): type is ElementType {\n return typeof type === 'string' ||\n typeof type === 'function' ||\n type === REACT_FRAGMENT_TYPE ||\n type === REACT_PROFILER_TYPE ||\n type === REACT_STRICT_MODE_TYPE ||\n type === REACT_SUSPENSE_TYPE ||\n type === REACT_SUSPENSE_LIST_TYPE ||\n type === REACT_OFFSCREEN_TYPE ||\n (typeof type === 'object' &&\n type !== null &&\n (type.$$typeof === REACT_LAZY_TYPE ||\n type.$$typeof === REACT_MEMO_TYPE ||\n type.$$typeof === REACT_CONTEXT_TYPE ||\n type.$$typeof === REACT_CONSUMER_TYPE ||\n type.$$typeof === REACT_FORWARD_REF_TYPE ||\n type.$$typeof === REACT_CLIENT_REFERENCE ||\n type.getModuleId !== undefined))\n ? !0\n : !1\n}\n\nfunction typeOf(object: any): symbol | undefined {\n if (typeof object === 'object' && object !== null) {\n const { $$typeof } = object\n\n switch ($$typeof) {\n case REACT_ELEMENT_TYPE:\n switch (((object = object.type), object)) {\n case REACT_FRAGMENT_TYPE:\n case REACT_PROFILER_TYPE:\n case REACT_STRICT_MODE_TYPE:\n case REACT_SUSPENSE_TYPE:\n case REACT_SUSPENSE_LIST_TYPE:\n return object\n default:\n switch (((object = object && object.$$typeof), object)) {\n case REACT_CONTEXT_TYPE:\n case REACT_FORWARD_REF_TYPE:\n case REACT_LAZY_TYPE:\n case REACT_MEMO_TYPE:\n return object\n case REACT_CONSUMER_TYPE:\n return object\n default:\n return $$typeof\n }\n }\n case REACT_PORTAL_TYPE:\n return $$typeof\n }\n }\n}\n\nexport function isContextConsumer(object: any): object is ReactElement {\n return IS_REACT_19\n ? typeOf(object) === REACT_CONSUMER_TYPE\n : typeOf(object) === REACT_CONTEXT_TYPE\n}\n\nexport function isMemo(object: any): object is MemoExoticComponent<any> {\n return typeOf(object) === REACT_MEMO_TYPE\n}\n","import type { Dispatch, Action } from 'redux'\nimport type { ComponentType } from 'react'\nimport verifySubselectors from './verifySubselectors'\nimport type { EqualityFn, ExtendedEqualityFn } from '../types'\n\nexport type SelectorFactory<S, TProps, TOwnProps, TFactoryOptions> = (\n dispatch: Dispatch<Action<string>>,\n factoryOptions: TFactoryOptions,\n) => Selector<S, TProps, TOwnProps>\n\nexport type Selector<S, TProps, TOwnProps = null> = TOwnProps extends\n | null\n | undefined\n ? (state: S) => TProps\n : (state: S, ownProps: TOwnProps) => TProps\n\nexport type MapStateToProps<TStateProps, TOwnProps, State> = (\n state: State,\n ownProps: TOwnProps,\n) => TStateProps\n\nexport type MapStateToPropsFactory<TStateProps, TOwnProps, State> = (\n initialState: State,\n ownProps: TOwnProps,\n) => MapStateToProps<TStateProps, TOwnProps, State>\n\nexport type MapStateToPropsParam<TStateProps, TOwnProps, State> =\n | MapStateToPropsFactory<TStateProps, TOwnProps, State>\n | MapStateToProps<TStateProps, TOwnProps, State>\n | null\n | undefined\n\nexport type MapDispatchToPropsFunction<TDispatchProps, TOwnProps> = (\n dispatch: Dispatch<Action<string>>,\n ownProps: TOwnProps,\n) => TDispatchProps\n\nexport type MapDispatchToProps<TDispatchProps, TOwnProps> =\n | MapDispatchToPropsFunction<TDispatchProps, TOwnProps>\n | TDispatchProps\n\nexport type MapDispatchToPropsFactory<TDispatchProps, TOwnProps> = (\n dispatch: Dispatch<Action<string>>,\n ownProps: TOwnProps,\n) => MapDispatchToPropsFunction<TDispatchProps, TOwnProps>\n\nexport type MapDispatchToPropsParam<TDispatchProps, TOwnProps> =\n | MapDispatchToPropsFactory<TDispatchProps, TOwnProps>\n | MapDispatchToProps<TDispatchProps, TOwnProps>\n\nexport type MapDispatchToPropsNonObject<TDispatchProps, TOwnProps> =\n | MapDispatchToPropsFactory<TDispatchProps, TOwnProps>\n | MapDispatchToPropsFunction<TDispatchProps, TOwnProps>\n\nexport type MergeProps<TStateProps, TDispatchProps, TOwnProps, TMergedProps> = (\n stateProps: TStateProps,\n dispatchProps: TDispatchProps,\n ownProps: TOwnProps,\n) => TMergedProps\n\ninterface PureSelectorFactoryComparisonOptions<TStateProps, TOwnProps, State> {\n readonly areStatesEqual: ExtendedEqualityFn<State, TOwnProps>\n readonly areStatePropsEqual: EqualityFn<TStateProps>\n readonly areOwnPropsEqual: EqualityFn<TOwnProps>\n}\n\nfunction pureFinalPropsSelectorFactory<\n TStateProps,\n TOwnProps,\n TDispatchProps,\n TMergedProps,\n State,\n>(\n mapStateToProps: WrappedMapStateToProps<TStateProps, TOwnProps, State>,\n mapDispatchToProps: WrappedMapDispatchToProps<TDispatchProps, TOwnProps>,\n mergeProps: MergeProps<TStateProps, TDispatchProps, TOwnProps, TMergedProps>,\n dispatch: Dispatch<Action<string>>,\n {\n areStatesEqual,\n areOwnPropsEqual,\n areStatePropsEqual,\n }: PureSelectorFactoryComparisonOptions<TStateProps, TOwnProps, State>,\n) {\n let hasRunAtLeastOnce = false\n let state: State\n let ownProps: TOwnProps\n let stateProps: TStateProps\n let dispatchProps: TDispatchProps\n let mergedProps: TMergedProps\n\n function handleFirstCall(firstState: State, firstOwnProps: TOwnProps) {\n state = firstState\n ownProps = firstOwnProps\n stateProps = mapStateToProps(state, ownProps)\n dispatchProps = mapDispatchToProps(dispatch, ownProps)\n mergedProps = mergeProps(stateProps, dispatchProps, ownProps)\n hasRunAtLeastOnce = true\n return mergedProps\n }\n\n function handleNewPropsAndNewState() {\n stateProps = mapStateToProps(state, ownProps)\n\n if (mapDispatchToProps.dependsOnOwnProps)\n dispatchProps = mapDispatchToProps(dispatch, ownProps)\n\n mergedProps = mergeProps(stateProps, dispatchProps, ownProps)\n return mergedProps\n }\n\n function handleNewProps() {\n if (mapStateToProps.dependsOnOwnProps)\n stateProps = mapStateToProps(state, ownProps)\n\n if (mapDispatchToProps.dependsOnOwnProps)\n dispatchProps = mapDispatchToProps(dispatch, ownProps)\n\n mergedProps = mergeProps(stateProps, dispatchProps, ownProps)\n return mergedProps\n }\n\n function handleNewState() {\n const nextStateProps = mapStateToProps(state, ownProps)\n const statePropsChanged = !areStatePropsEqual(nextStateProps, stateProps)\n stateProps = nextStateProps\n\n if (statePropsChanged)\n mergedProps = mergeProps(stateProps, dispatchProps, ownProps)\n\n return mergedProps\n }\n\n function handleSubsequentCalls(nextState: State, nextOwnProps: TOwnProps) {\n const propsChanged = !areOwnPropsEqual(nextOwnProps, ownProps)\n const stateChanged = !areStatesEqual(\n nextState,\n state,\n nextOwnProps,\n ownProps,\n )\n state = nextState\n ownProps = nextOwnProps\n\n if (propsChanged && stateChanged) return handleNewPropsAndNewState()\n if (propsChanged) return handleNewProps()\n if (stateChanged) return handleNewState()\n return mergedProps\n }\n\n return function pureFinalPropsSelector(\n nextState: State,\n nextOwnProps: TOwnProps,\n ) {\n return hasRunAtLeastOnce\n ? handleSubsequentCalls(nextState, nextOwnProps)\n : handleFirstCall(nextState, nextOwnProps)\n }\n}\n\ninterface WrappedMapStateToProps<TStateProps, TOwnProps, State> {\n (state: State, ownProps: TOwnProps): TStateProps\n readonly dependsOnOwnProps: boolean\n}\n\ninterface WrappedMapDispatchToProps<TDispatchProps, TOwnProps> {\n (dispatch: Dispatch<Action<string>>, ownProps: TOwnProps): TDispatchProps\n readonly dependsOnOwnProps: boolean\n}\n\nexport interface InitOptions<TStateProps, TOwnProps, TMergedProps, State>\n extends PureSelectorFactoryComparisonOptions<TStateProps, TOwnProps, State> {\n readonly shouldHandleStateChanges: boolean\n readonly displayName: string\n readonly wrappedComponentName: string\n readonly WrappedComponent: ComponentType<TOwnProps>\n readonly areMergedPropsEqual: EqualityFn<TMergedProps>\n}\n\nexport interface SelectorFactoryOptions<\n TStateProps,\n TOwnProps,\n TDispatchProps,\n TMergedProps,\n State,\n> extends InitOptions<TStateProps, TOwnProps, TMergedProps, State> {\n readonly initMapStateToProps: (\n dispatch: Dispatch<Action<string>>,\n options: InitOptions<TStateProps, TOwnProps, TMergedProps, State>,\n ) => WrappedMapStateToProps<TStateProps, TOwnProps, State>\n readonly initMapDispatchToProps: (\n dispatch: Dispatch<Action<string>>,\n options: InitOptions<TStateProps, TOwnProps, TMergedProps, State>,\n ) => WrappedMapDispatchToProps<TDispatchProps, TOwnProps>\n readonly initMergeProps: (\n dispatch: Dispatch<Action<string>>,\n options: InitOptions<TStateProps, TOwnProps, TMergedProps, State>,\n ) => MergeProps<TStateProps, TDispatchProps, TOwnProps, TMergedProps>\n}\n\n// TODO: Add more comments\n\n// The selector returned by selectorFactory will memoize its results,\n// allowing connect's shouldComponentUpdate to return false if final\n// props have not changed.\n\nexport default function finalPropsSelectorFactory<\n TStateProps,\n TOwnProps,\n TDispatchProps,\n TMergedProps,\n State,\n>(\n dispatch: Dispatch<Action<string>>,\n {\n initMapStateToProps,\n initMapDispatchToProps,\n initMergeProps,\n ...options\n }: SelectorFactoryOptions<\n TStateProps,\n TOwnProps,\n TDispatchProps,\n TMergedProps,\n State\n >,\n) {\n const mapStateToProps = initMapStateToProps(dispatch, options)\n const mapDispatchToProps = initMapDispatchToProps(dispatch, options)\n const mergeProps = initMergeProps(dispatch, options)\n\n if (process.env.NODE_ENV !== 'production') {\n verifySubselectors(mapStateToProps, mapDispatchToProps, mergeProps)\n }\n\n return pureFinalPropsSelectorFactory<\n TStateProps,\n TOwnProps,\n TDispatchProps,\n TMergedProps,\n State\n >(mapStateToProps, mapDispatchToProps, mergeProps, dispatch, options)\n}\n","import type { ActionCreatorsMapObject, Dispatch, ActionCreator } from 'redux'\n\nimport type { FixTypeLater } from '../types'\nimport verifyPlainObject from '../utils/verifyPlainObject'\n\ntype AnyState = { [key: string]: any }\ntype StateOrDispatch<S extends AnyState = AnyState> = S | Dispatch\n\ntype AnyProps = { [key: string]: any }\n\nexport type MapToProps<P extends AnyProps = AnyProps> = {\n // eslint-disable-next-line no-unused-vars\n (stateOrDispatch: StateOrDispatch, ownProps?: P): FixTypeLater\n dependsOnOwnProps?: boolean\n}\n\nexport function wrapMapToPropsConstant(\n // * Note:\n // It seems that the dispatch argument\n // could be a dispatch function in some cases (ex: whenMapDispatchToPropsIsMissing)\n // and a state object in some others (ex: whenMapStateToPropsIsMissing)\n // eslint-disable-next-line no-unused-vars\n getConstant: (dispatch: Dispatch) =>\n | {\n dispatch?: Dispatch\n dependsOnOwnProps?: boolean\n }\n | ActionCreatorsMapObject\n | ActionCreator<any>,\n) {\n return function initConstantSelector(dispatch: Dispatch) {\n const constant = getConstant(dispatch)\n\n function constantSelector() {\n return constant\n }\n constantSelector.dependsOnOwnProps = false\n return constantSelector\n }\n}\n\n// dependsOnOwnProps is used by createMapToPropsProxy to determine whether to pass props as args\n// to the mapToProps function being wrapped. It is also used by makePurePropsSelector to determine\n// whether mapToProps needs to be invoked when props have changed.\n//\n// A length of one signals that mapToProps does not depend on props from the parent component.\n// A length of zero is assumed to mean mapToProps is getting args via arguments or ...args and\n// therefore not reporting its length accurately..\n// TODO Can this get pulled out so that we can subscribe directly to the store if we don't need ownProps?\nfunction getDependsOnOwnProps(mapToProps: MapToProps) {\n return mapToProps.dependsOnOwnProps\n ? Boolean(mapToProps.dependsOnOwnProps)\n : mapToProps.length !== 1\n}\n\n// Used by whenMapStateToPropsIsFunction and whenMapDispatchToPropsIsFunction,\n// this function wraps mapToProps in a proxy function which does several things:\n//\n// * Detects whether the mapToProps function being called depends on props, which\n// is used by selectorFactory to decide if it should reinvoke on props changes.\n//\n// * On first call, handles mapToProps if returns another function, and treats that\n// new function as the true mapToProps for subsequent calls.\n//\n// * On first call, verifies the first result is a plain object, in order to warn\n// the developer that their mapToProps function is not returning a valid result.\n//\nexport function wrapMapToPropsFunc<P extends AnyProps = AnyProps>(\n mapToProps: MapToProps,\n methodName: string,\n) {\n return function initProxySelector(\n dispatch: Dispatch,\n { displayName }: { displayName: string },\n ) {\n const proxy = function mapToPropsProxy(\n stateOrDispatch: StateOrDispatch,\n ownProps?: P,\n ): MapToProps {\n return proxy.dependsOnOwnProps\n ? proxy.mapToProps(stateOrDispatch, ownProps)\n : proxy.mapToProps(stateOrDispatch, undefined)\n }\n\n // allow detectFactoryAndVerify to get ownProps\n proxy.dependsOnOwnProps = true\n\n proxy.mapToProps = function detectFactoryAndVerify(\n stateOrDispatch: StateOrDispatch,\n ownProps?: P,\n ): MapToProps {\n proxy.mapToProps = mapToProps\n proxy.dependsOnOwnProps = getDependsOnOwnProps(mapToProps)\n let props = proxy(stateOrDispatch, ownProps)\n\n if (typeof props === 'function') {\n proxy.mapToProps = props\n proxy.dependsOnOwnProps = getDependsOnOwnProps(props)\n props = proxy(stateOrDispatch, ownProps)\n }\n\n if (process.env.NODE_ENV !== 'production')\n verifyPlainObject(props, displayName, methodName)\n\n return props\n }\n\n return proxy\n }\n}\n","import type { Action, Dispatch } from 'redux'\n\nexport function createInvalidArgFactory(arg: unknown, name: string) {\n return (\n dispatch: Dispatch<Action<string>>,\n options: { readonly wrappedComponentName: string },\n ) => {\n throw new Error(\n `Invalid value of type ${typeof arg} for ${name} argument when connecting component ${\n options.wrappedComponentName\n }.`,\n )\n }\n}\n","import type { Action, Dispatch } from 'redux'\nimport verifyPlainObject from '../utils/verifyPlainObject'\nimport { createInvalidArgFactory } from './invalidArgFactory'\nimport type { MergeProps } from './selectorFactory'\nimport type { EqualityFn } from '../types'\n\nfunction defaultMergeProps<\n TStateProps,\n TDispatchProps,\n TOwnProps,\n TMergedProps,\n>(\n stateProps: TStateProps,\n dispatchProps: TDispatchProps,\n ownProps: TOwnProps,\n): TMergedProps {\n // @ts-ignore\n return { ...ownProps, ...stateProps, ...dispatchProps }\n}\n\nfunction wrapMergePropsFunc<\n TStateProps,\n TDispatchProps,\n TOwnProps,\n TMergedProps,\n>(\n mergeProps: MergeProps<TStateProps, TDispatchProps, TOwnProps, TMergedProps>,\n): (\n dispatch: Dispatch<Action<string>>,\n options: {\n readonly displayName: string\n readonly areMergedPropsEqual: EqualityFn<TMergedProps>\n },\n) => MergeProps<TStateProps, TDispatchProps, TOwnProps, TMergedProps> {\n return function initMergePropsProxy(\n dispatch,\n { displayName, areMergedPropsEqual },\n ) {\n let hasRunOnce = false\n let mergedProps: TMergedProps\n\n return function mergePropsProxy(\n stateProps: TStateProps,\n dispatchProps: TDispatchProps,\n ownProps: TOwnProps,\n ) {\n const nextMergedProps = mergeProps(stateProps, dispatchProps, ownProps)\n\n if (hasRunOnce) {\n if (!areMergedPropsEqual(nextMergedProps, mergedProps))\n mergedProps = nextMergedProps\n } else {\n hasRunOnce = true\n mergedProps = nextMergedProps\n\n if (process.env.NODE_ENV !== 'production')\n verifyPlainObject(mergedProps, displayName, 'mergeProps')\n }\n\n return mergedProps\n }\n }\n}\n\nexport function mergePropsFactory<\n TStateProps,\n TDispatchProps,\n TOwnProps,\n TMergedProps,\n>(\n mergeProps?: MergeProps<TStateProps, TDispatchProps, TOwnProps, TMergedProps>,\n) {\n return !mergeProps\n ? () => defaultMergeProps\n : typeof mergeProps === 'function'\n ? wrapMergePropsFunc(mergeProps)\n : createInvalidArgFactory(mergeProps, 'mergeProps')\n}\n","// Default to a dummy \"batch\" implementation that just runs the callback\r\nexport function defaultNoopBatch(callback: () => void) {\r\n callback()\r\n}\r\n","import { defaultNoopBatch as batch } from './batch'\n\n// encapsulates the subscription logic for connecting a component to the redux store, as\n// well as nesting subscriptions of descendant components, so that we can ensure the\n// ancestor components re-render before descendants\n\ntype VoidFunc = () => void\n\ntype Listener = {\n callback: VoidFunc\n next: Listener | null\n prev: Listener | null\n}\n\nfunction createListenerCollection() {\n let first: Listener | null = null\n let last: Listener | null = null\n\n return {\n clear() {\n first = null\n last = null\n },\n\n notify() {\n batch(() => {\n let listener = first\n while (listener) {\n listener.callback()\n listener = listener.next\n }\n })\n },\n\n get() {\n const listeners: Listener[] = []\n let listener = first\n while (listener) {\n listeners.push(listener)\n listener = listener.next\n }\n return listeners\n },\n\n subscribe(callback: () => void) {\n let isSubscribed = true\n\n const listener: Listener = (last = {\n callback,\n next: null,\n prev: last,\n })\n\n if (listener.prev) {\n listener.prev.next = listener\n } else {\n first = listener\n }\n\n return function unsubscribe() {\n if (!isSubscribed || first === null) return\n isSubscribed = false\n\n if (listener.next) {\n listener.next.prev = listener.prev\n } else {\n last = listener.prev\n }\n if (listener.prev) {\n listener.prev.next = listener.next\n } else {\n first = listener.next\n }\n }\n },\n }\n}\n\ntype ListenerCollection = ReturnType<typeof createListenerCollection>\n\nexport interface Subscription {\n addNestedSub: (listener: VoidFunc) => VoidFunc\n notifyNestedSubs: VoidFunc\n handleChangeWrapper: VoidFunc\n isSubscribed: () => boolean\n onStateChange?: VoidFunc | null\n trySubscribe: VoidFunc\n tryUnsubscribe: VoidFunc\n getListeners: () => ListenerCollection\n}\n\nconst nullListeners = {\n notify() {},\n get: () => [],\n} as unknown as ListenerCollection\n\nexport function createSubscription(store: any, parentSub?: Subscription) {\n let unsubscribe: VoidFunc | undefined\n let listeners: ListenerCollection = nullListeners\n\n // Reasons to keep the subscription active\n let subscriptionsAmount = 0\n\n // Is this specific subscription subscribed (or only nested ones?)\n let selfSubscribed = false\n\n function addNestedSub(listener: () => void) {\n trySubscribe()\n\n const cleanupListener = listeners.subscribe(listener)\n\n // cleanup nested sub\n let removed = false\n return () => {\n if (!removed) {\n removed = true\n cleanupListener()\n tryUnsubscribe()\n }\n }\n }\n\n function notifyNestedSubs() {\n listeners.notify()\n }\n\n function handleChangeWrapper() {\n if (subscription.onStateChange) {\n subscription.onStateChange()\n }\n }\n\n function isSubscribed() {\n return selfSubscribed\n }\n\n function trySubscribe() {\n subscriptionsAmount++\n if (!unsubscribe) {\n unsubscribe = parentSub\n ? parentSub.addNestedSub(handleChangeWrapper)\n : store.subscribe(handleChangeWrapper)\n\n listeners = createListenerCollection()\n }\n }\n\n function tryUnsubscribe() {\n subscriptionsAmount--\n if (unsubscribe && subscriptionsAmount === 0) {\n unsubscribe()\n unsubscribe = undefined\n listeners.clear()\n listeners = nullListeners\n }\n }\n\n function trySubscribeSelf() {\n if (!selfSubscribed) {\n selfSubscribed = true\n trySubscribe()\n }\n }\n\n function tryUnsubscribeSelf() {\n if (selfSubscribed) {\n selfSubscribed = false\n tryUnsubscribe()\n }\n }\n\n const subscription: Subscription = {\n addNestedSub,\n notifyNestedSubs,\n handleChangeWrapper,\n isSubscribed,\n trySubscribe: trySubscribeSelf,\n tryUnsubscribe: tryUnsubscribeSelf,\n getListeners: () => listeners,\n }\n\n return subscription\n}\n","import { React } from '../utils/react'\n\n// React currently throws a warning when using useLayoutEffect on the server.\n// To get around it, we can conditionally useEffect on the server (no-op) and\n// useLayoutEffect in the browser. We need useLayoutEffect to ensure the store\n// subscription callback always has the selector from the latest render commit\n// available, otherwise a store update may happen between render and the effect,\n// which may cause missed updates; we also must ensure the store subscription\n// is created synchronously, otherwise a store update may occur before the\n// subscription is created and an inconsistent state may be observed\n\n// Matches logic in React's `shared/ExecutionEnvironment` file\nconst canUseDOM = () =>\n !!(\n typeof window !== 'undefined' &&\n typeof window.document !== 'undefined' &&\n typeof window.document.createElement !== 'undefined'\n )\n\nconst isDOM = /* @__PURE__ */ canUseDOM()\n\n// Under React Native, we know that we always want to use useLayoutEffect\n\n/**\n * Checks if the code is running in a React Native environment.\n *\n * @returns Whether the code is running in a React Native environment.\n *\n * @see {@link https://github.com/facebook/react-native/issues/1331 Reference}\n */\nconst isRunningInReactNative = () =>\n typeof navigator !== 'undefined' && navigator.product === 'ReactNative'\n\nconst isReactNative = /* @__PURE__ */ isRunningInReactNative()\n\nconst getUseIsomorphicLayoutEffect = () =>\n isDOM || isReactNative ? React.useLayoutEffect : React.useEffect\n\nexport const useIsomorphicLayoutEffect =\n /* @__PURE__ */ getUseIsomorphicLayoutEffect()\n","function is(x: unknown, y: unknown) {\r\n if (x === y) {\r\n return x !== 0 || y !== 0 || 1 / x === 1 / y\r\n } else {\r\n return x !== x && y !== y\r\n }\r\n}\r\n\r\nexport default function shallowEqual(objA: any, objB: any) {\r\n if (is(objA, objB)) return true\r\n\r\n if (\r\n typeof objA !== 'object' ||\r\n objA === null ||\r\n typeof objB !== 'object' ||\r\n objB === null\r\n ) {\r\n return false\r\n }\r\n\r\n const keysA = Object.keys(objA)\r\n const keysB = Object.keys(objB)\r\n\r\n if (keysA.length !== keysB.length) return false\r\n\r\n for (let i = 0; i < keysA.length; i++) {\r\n if (\r\n !Object.prototype.hasOwnProperty.call(objB, keysA[i]) ||\r\n !is(objA[keysA[i]], objB[keysA[i]])\r\n ) {\r\n return false\r\n }\r\n }\r\n\r\n return true\r\n}\r\n","// Copied directly from:\n// https://github.com/mridgway/hoist-non-react-statics/blob/main/src/index.js\n// https://unpkg.com/browse/@types/hoist-non-react-statics@3.3.6/index.d.ts\n\n/**\n * Copyright 2015, Yahoo! Inc.\n * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.\n */\nimport type { ForwardRefExoticComponent, MemoExoticComponent } from 'react'\nimport { ForwardRef, Memo, isMemo } from '../utils/react-is'\n\nconst REACT_STATICS = {\n childContextTypes: true,\n contextType: true,\n contextTypes: true,\n defaultProps: true,\n displayName: true,\n getDefaultProps: true,\n getDerivedStateFromError: true,\n getDerivedStateFromProps: true,\n mixins: true,\n propTypes: true,\n type: true,\n} as const\n\nconst KNOWN_STATICS = {\n name: true,\n length: true,\n prototype: true,\n caller: true,\n callee: true,\n arguments: true,\n arity: true,\n} as const\n\nconst FORWARD_REF_STATICS = {\n $$typeof: true,\n render: true,\n defaultProps: true,\n displayName: true,\n propTypes: true,\n} as const\n\nconst MEMO_STATICS = {\n $$typeof: true,\n compare: true,\n defaultProps: true,\n displayName: true,\n propTypes: true,\n type: true,\n} as const\n\nconst TYPE_STATICS = {\n [ForwardRef]: FORWARD_REF_STATICS,\n [Memo]: MEMO_STATICS,\n} as const\n\nfunction getStatics(component: any) {\n // React v16.11 and below\n if (isMemo(component)) {\n return MEMO_STATICS\n }\n\n // React v16.12 and above\n return TYPE_STATICS[component['$$typeof']] || REACT_STATICS\n}\n\nexport type NonReactStatics<\n Source,\n C extends {\n [key: string]: true\n } = {},\n> = {\n [key in Exclude<\n keyof Source,\n Source extends MemoExoticComponent<any>\n ? keyof typeof MEMO_STATICS | keyof C\n : Source extends ForwardRefExoticComponent<any>\n ? keyof typeof FORWARD_REF_STATICS | keyof C\n : keyof typeof REACT_STATICS | keyof typeof KNOWN_STATICS | keyof C\n >]: Source[key]\n}\n\nconst defineProperty = Object.defineProperty\nconst getOwnPropertyNames = Object.getOwnPropertyNames\nconst getOwnPropertySymbols = Object.getOwnPropertySymbols\nconst getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor\nconst getPrototypeOf = Object.getPrototypeOf\nconst objectPrototype = Object.prototype\n\nexport default function hoistNonReactStatics<\n Target,\n Source,\n CustomStatic extends {\n [key: string]: true\n } = {},\n>(\n targetComponent: Target,\n sourceComponent: Source,\n): Target & NonReactStatics<Source, CustomStatic> {\n if (typeof sourceComponent !== 'string') {\n // don't hoist over string (html) components\n\n if (objectPrototype) {\n const inheritedComponent = getPrototypeOf(sourceComponent)\n if (inheritedComponent && inheritedComponent !== objectPrototype) {\n hoistNonReactStatics(targetComponent, inheritedComponent)\n }\n }\n\n let keys: (string | symbol)[] = getOwnPropertyNames(sourceComponent)\n\n if (getOwnPropertySymbols) {\n keys = keys.concat(getOwnPropertySymbols(sourceComponent))\n }\n\n const targetStatics = getStatics(targetComponent)\n const sourceStatics = getStatics(sourceComponent)\n\n for (let i = 0; i < keys.length; ++i) {\n const key = keys[i]\n if (\n !KNOWN_STATICS[key as keyof typeof KNOWN_STATICS] &&\n !(sourceStatics && sourceStatics[key as keyof typeof sourceStatics]) &&\n !(targetStatics && targetStatics[key as keyof typeof targetStatics])\n ) {\n const descriptor = getOwnPropertyDescriptor(sourceComponent, key)\n try {\n // Avoid failures from read-only properties\n defineProperty(targetComponent, key, descriptor!)\n } catch (e) {\n // ignore\n }\n }\n }\n }\n\n return targetComponent as any\n}\n","import type { Context } from 'react'\nimport { React } from '../utils/react'\nimport type { Action, Store, UnknownAction } from 'redux'\nimport type { Subscription } from '../utils/Subscription'\nimport type { ProviderProps } from './Provider'\n\nexport interface ReactReduxContextValue<\n SS = any,\n A extends Action<string> = UnknownAction,\n> extends Pick<ProviderProps, 'stabilityCheck' | 'identityFunctionCheck'> {\n store: Store<SS, A>\n subscription: Subscription\n getServerState?: () => SS\n}\n\nconst ContextKey = /* @__PURE__ */ Symbol.for(`react-redux-context`)\nconst gT: {\n [ContextKey]?: Map<\n typeof React.createContext,\n Context<ReactReduxContextValue | null>\n >\n} = (\n typeof globalThis !== 'undefined'\n ? globalThis\n : /* fall back to a per-module scope (pre-8.1 behaviour) if `globalThis` is not available */ {}\n) as any\n\nfunction getContext(): Context<ReactReduxContextValue | null> {\n if (!React.createContext) return {} as any\n\n const contextMap = (gT[ContextKey] ??= new Map<\n typeof React.createContext,\n Context<ReactReduxContextValue | null>\n >())\n let realContext = contextMap.get(React.createContext)\n if (!realContext) {\n realContext = React.createContext<ReactReduxContextValue | null>(\n null as any,\n )\n if (process.env.NODE_ENV !== 'production') {\n realContext.displayName = 'ReactRedux'\n }\n contextMap.set(React.createContext, realContext)\n }\n return realContext\n}\n\nexport const ReactReduxContext = /*#__PURE__*/ getContext()\n\nexport type ReactReduxContextInstance = typeof ReactReduxContext\n","/* eslint-disable valid-jsdoc, @typescript-eslint/no-unused-vars */\nimport type { ComponentType } from 'react'\nimport { React } from '../utils/react'\nimport { isValidElementType, isContextConsumer } from '../utils/react-is'\n\nimport type { Store } from 'redux'\n\nimport type {\n ConnectedComponent,\n InferableComponentEnhancer,\n InferableComponentEnhancerWithProps,\n ResolveThunks,\n DispatchProp,\n ConnectPropsMaybeWithoutContext,\n} from '../types'\n\nimport type {\n MapStateToPropsParam,\n MapDispatchToPropsParam,\n MergeProps,\n MapDispatchToPropsNonObject,\n SelectorFactoryOptions,\n} from '../connect/selectorFactory'\nimport defaultSelectorFactory from '../connect/selectorFactory'\nimport { mapDispatchToPropsFactory } from '../connect/mapDispatchToProps'\nimport { mapStateToPropsFactory } from '../connect/mapStateToProps'\nimport { mergePropsFactory } from '../connect/mergeProps'\n\nimport type { Subscription } from '../utils/Subscription'\nimport { createSubscription } from '../utils/Subscription'\nimport { useIsomorphicLayoutEffect } from '../utils/useIsomorphicLayoutEffect'\nimport shallowEqual from '../utils/shallowEqual'\nimport hoistStatics from '../utils/hoistStatics'\nimport warning from '../utils/warning'\n\nimport type {\n ReactReduxContextValue,\n ReactReduxContextInstance,\n} from './Context'\nimport { ReactReduxContext } from './Context'\n\n// Define some constant arrays just to avoid re-creating these\nconst EMPTY_ARRAY: [unknown, number] = [null, 0]\nconst NO_SUBSCRIPTION_ARRAY = [null, null]\n\n// Attempts to stringify whatever not-really-a-component value we were given\n// for logging in an error message\nconst stringifyComponent = (Comp: unknown) => {\n try {\n return JSON.stringify(Comp)\n } catch (err) {\n return String(Comp)\n }\n}\n\ntype EffectFunc = (...args: any[]) => void | ReturnType<React.EffectCallback>\n\n// This is \"just\" a `useLayoutEffect`, but with two modifications:\n// - we need to fall back to `useEffect` in SSR to avoid annoying warnings\n// - we extract this to a separate function to avoid closing over values\n// and causing memory leaks\nfunction useIsomorphicLayoutEffectWithArgs(\n effectFunc: EffectFunc,\n effectArgs: any[],\n dependencies?: React.DependencyList,\n) {\n useIsomorphicLayoutEffect(() => effectFunc(...effectArgs), dependencies)\n}\n\n// Effect callback, extracted: assign the latest props values to refs for later usage\nfunction captureWrapperProps(\n lastWrapperProps: React.MutableRefObject<unknown>,\n lastChildProps: React.MutableRefObject<unknown>,\n renderIsScheduled: React.MutableRefObject<boolean>,\n wrapperProps: unknown,\n // actualChildProps: unknown,\n childPropsFromStoreUpdate: React.MutableRefObject<unknown>,\n notifyNestedSubs: () => void,\n) {\n // We want to capture the wrapper props and child props we used for later comparisons\n lastWrapperProps.current = wrapperProps\n renderIsScheduled.current = false\n\n // If the render was from a store update, clear out that reference and cascade the subscriber update\n if (childPropsFromStoreUpdate.current) {\n childPropsFromStoreUpdate.current = null\n notifyNestedSubs()\n }\n}\n\n// Effect callback, extracted: subscribe to the Redux store or nearest connected ancestor,\n// check for updates after dispatched actions, and trigger re-renders.\nfunction subscribeUpdates(\n shouldHandleStateChanges: boolean,\n store: Store,\n subscription: Subscription,\n childPropsSelector: (state: unknown, props: unknown) => unknown,\n lastWrapperProps: React.MutableRefObject<unknown>,\n lastChildProps: React.MutableRefObject<unknown>,\n renderIsScheduled: React.MutableRefObject<boolean>,\n isMounted: React.MutableRefObject<boolean>,\n childPropsFromStoreUpdate: React.MutableRefObject<unknown>,\n notifyNestedSubs: () => void,\n // forceComponentUpdateDispatch: React.Dispatch<any>,\n additionalSubscribeListener: () => void,\n) {\n // If we're not subscribed to the store, nothing to do here\n if (!shouldHandleStateChanges) return () => {}\n\n // Capture values for checking if and when this component unmounts\n let didUnsubscribe = false\n let lastThrownError: Error | null = null\n\n // We'll run this callback every time a store subscription update propagates to this component\n const checkForUpdates = () => {\n if (didUnsubscribe || !isMounted.current) {\n // Don't run stale listeners.\n // Redux doesn't guarantee unsubscriptions happen until next dispatch.\n return\n }\n\n // TODO We're currently calling getState ourselves here, rather than letting `uSES` do it\n const latestStoreState = store.getState()\n\n let newChildProps, error\n try {\n // Actually run the selector with the most recent store state and wrapper props\n // to determine what the child props should be\n newChildProps = childPropsSelector(\n latestStoreState,\n lastWrapperProps.current,\n )\n } catch (e) {\n error = e\n lastThrownError = e as Error | null\n }\n\n if (!error) {\n lastThrownError = null\n }\n\n // If the child props haven't changed, nothing to do here - cascade the subscription update\n if (newChildProps === lastChildProps.current) {\n if (!renderIsScheduled.current) {\n notifyNestedSubs()\n }\n } else {\n // Save references to the new child props. Note that we track the \"child props from store update\"\n // as a ref instead of a useState/useReducer because we need a way to determine if that value has\n // been processed. If this went into useState/useReducer, we couldn't clear out the value without\n // forcing another re-render, which we don't want.\n lastChildProps.current = newChildProps\n childPropsFromStoreUpdate.current = newChildProps\n renderIsScheduled.current = true\n\n // TODO This is hacky and not how `uSES` is meant to be used\n // Trigger the React `useSyncExternalStore` subscriber\n additionalSubscribeListener()\n }\n }\n\n // Actually subscribe to the nearest connected ancestor (or store)\n subscription.onStateChange = checkForUpdates\n subscription.trySubscribe()\n\n // Pull data from the store after first render in case the store has\n // changed since we began.\n checkForUpdates()\n\n const unsubscribeWrapper = () => {\n didUnsubscribe = true\n subscription.tryUnsubscribe()\n subscription.onStateChange = null\n\n if (lastThrownError) {\n // It's possible that we caught an error due to a bad mapState function, but the\n // parent re-rendered without this component and we're about to unmount.\n // This shouldn't happen as long as we do top-down subscriptions correctly, but\n // if we ever do those wrong, this throw will surface the error in our tests.\n // In that case, throw the error from here so it doesn't get lost.\n throw lastThrownError\n }\n }\n\n return unsubscribeWrapper\n}\n\n// Reducer initial state creation for our update reducer\nconst initStateUpdates = () => EMPTY_ARRAY\n\nexport interface ConnectProps {\n /** A custom Context instance that the component can use to access the store from an alternate Provider using that same Context instance */\n context?: ReactReduxContextInstance\n /** A Redux store instance to be used for subscriptions instead of the store from a Provider */\n store?: Store\n}\n\ninterface InternalConnectProps extends ConnectProps {\n reactReduxForwardedRef?: React.ForwardedRef<unknown>\n}\n\nfunction strictEqual(a: unknown, b: unknown) {\n return a === b\n}\n\n/**\n * Infers the type of props that a connector will inject into a component.\n */\nexport type ConnectedProps<TConnector> =\n TConnector extends InferableComponentEnhancerWithProps<\n infer TInjectedProps,\n any\n >\n ? unknown extends TInjectedProps\n ? TConnector extends InferableComponentEnhancer<infer TInjectedProps>\n ? TInjectedProps\n : never\n : TInjectedProps\n : never\n\nexport interface ConnectOptions<\n State = unknown,\n TStateProps = {},\n TOwnProps = {},\n TMergedProps = {},\n> {\n forwardRef?: boolean\n context?: typeof ReactReduxContext\n areStatesEqual?: (\n nextState: State,\n prevState: State,\n nextOwnProps: TOwnProps,\n prevOwnProps: TOwnProps,\n ) => boolean\n\n areOwnPropsEqual?: (\n nextOwnProps: TOwnProps,\n prevOwnProps: TOwnProps,\n ) => boolean\n\n areStatePropsEqual?: (\n nextStateProps: TStateProps,\n prevStateProps: TStateProps,\n ) => boolean\n areMergedPropsEqual?: (\n nextMergedProps: TMergedProps,\n prevMergedProps: TMergedProps,\n ) => boolean\n}\n\n/**\n * Connects a React component to a Redux store.\n *\n * - Without arguments, just wraps the component, without changing the behavior / props\n *\n * - If 2 params are passed (3rd param, mergeProps, is skipped), default behavior\n * is to override ownProps (as stated in the docs), so what remains is everything that's\n * not a state or dispatch prop\n *\n * - When 3rd param is passed, we don't know if ownProps propagate and whether they\n * should be valid component props, because it depends on mergeProps implementation.\n * As such, it is the user's responsibility to extend ownProps interface from state or\n * dispatch props or both when applicable\n *\n * @param mapStateToProps\n * @param mapDispatchToProps\n * @param mergeProps\n * @param options\n */\nexport interface Connect<DefaultState = unknown> {\n // tslint:disable:no-unnecessary-generics\n (): InferableComponentEnhancer<DispatchProp>\n\n /** mapState only */\n <TStateProps = {}, no_dispatch = {}, TOwnProps = {}, State = DefaultState>(\n mapStateToProps: MapStateToPropsParam<TStateProps, TOwnProps, State>,\n ): InferableComponentEnhancerWithProps<TStateProps & DispatchProp, TOwnProps>\n\n /** mapDispatch only (as a function) */\n <no_state = {}, TDispatchProps = {}, TOwnProps = {}>(\n mapStateToProps: null | undefined,\n mapDispatchToProps: MapDispatchToPropsNonObject<TDispatchProps, TOwnProps>,\n ): InferableComponentEnhancerWithProps<TDispatchProps, TOwnProps>\n\n /** mapDispatch only (as an object) */\n <no_state = {}, TDispatchProps = {}, TOwnProps = {}>(\n mapStateToProps: null | undefined,\n mapDispatchToProps: MapDispatchToPropsParam<TDispatchProps, TOwnProps>,\n ): InferableComponentEnhancerWithProps<\n ResolveThunks<TDispatchProps>,\n TOwnProps\n >\n\n /** mapState and mapDispatch (as a function)*/\n <TStateProps = {}, TDispatchProps = {}, TOwnProps = {}, State = DefaultState>(\n mapStateToProps: MapStateToPropsParam<TStateProps, TOwnProps, State>,\n mapDispatchToProps: MapDispatchToPropsNonObject<TDispatchProps, TOwnProps>,\n ): InferableComponentEnhancerWithProps<\n TStateProps & TDispatchProps,\n TOwnProps\n >\n\n /** mapState and mapDispatch (nullish) */\n <TStateProps = {}, TDispatchProps = {}, TOwnProps = {}, State = DefaultState>(\n mapStateToProps: MapStateToPropsParam<TStateProps, TOwnProps, State>,\n mapDispatchToProps: null | undefined,\n ): InferableComponentEnhancerWithProps<TStateProps, TOwnProps>\n\n /** mapState and mapDispatch (as an object) */\n <TStateProps = {}, TDispatchProps = {}, TOwnProps = {}, State = DefaultState>(\n mapStateToProps: MapStateToPropsParam<TStateProps, TOwnProps, State>,\n mapDispatchToProps: MapDispatchToPropsParam<TDispatchProps, TOwnProps>,\n ): InferableComponentEnhancerWithProps<\n TStateProps & ResolveThunks<TDispatchProps>,\n TOwnProps\n >\n\n /** mergeProps only */\n <no_state = {}, no_dispatch = {}, TOwnProps = {}, TMergedProps = {}>(\n mapStateToProps: null | undefined,\n mapDispatchToProps: null | undefined,\n mergeProps: MergeProps<undefined, DispatchProp, TOwnProps, TMergedProps>,\n ): InferableComponentEnhancerWithProps<TMergedProps, TOwnProps>\n\n /** mapState and mergeProps */\n <\n TStateProps = {},\n no_dispatch = {},\n TOwnProps = {},\n TMergedProps = {},\n State = DefaultState,\n >(\n mapStateToProps: MapStateToPropsParam<TStateProps, TOwnProps, State>,\n mapDispatchToProps: null | undefined,\n mergeProps: MergeProps<TStateProps, DispatchProp, TOwnProps, TMergedProps>,\n ): InferableComponentEnhancerWithProps<TMergedProps, TOwnProps>\n\n /** mapDispatch (as a object) and mergeProps */\n <no_state = {}, TDispatchProps = {}, TOwnProps = {}, TMergedProps = {}>(\n mapStateToProps: null | undefined,\n mapDispatchToProps: MapDispatchToPropsParam<TDispatchProps, TOwnProps>,\n mergeProps: MergeProps<undefined, TDispatchProps, TOwnProps, TMergedProps>,\n ): InferableComponentEnhancerWithProps<TMergedProps, TOwnProps>\n\n /** mapState and options */\n <TStateProps = {}, no_dispatch = {}, TOwnProps = {}, State = DefaultState>(\n mapStateToProps: MapStateToPropsParam<TStateProps, TOwnProps, State>,\n mapDispatchToProps: null | undefined,\n mergeProps: null | undefined,\n options: ConnectOptions<State, TStateProps, TOwnProps>,\n ): InferableComponentEnhancerWithProps<DispatchProp & TStateProps, TOwnProps>\n\n /** mapDispatch (as a function) and options */\n <TStateProps = {}, TDispatchProps = {}, TOwnProps = {}>(\n mapStateToProps: null | undefined,\n mapDispatchToProps: MapDispatchToPropsNonObject<TDispatchProps, TOwnProps>,\n mergeProps: null | undefined,\n options: ConnectOptions<{}, TStateProps, TOwnProps>,\n ): InferableComponentEnhancerWithProps<TDispatchProps, TOwnProps>\n\n /** mapDispatch (as an object) and options*/\n <TStateProps = {}, TDispatchProps = {}, TOwnProps = {}>(\n mapStateToProps: null | undefined,\n mapDispatchToProps: MapDispatchToPropsParam<TDispatchProps, TOwnProps>,\n mergeProps: null | undefined,\n options: ConnectOptions<{}, TStateProps, TOwnProps>,\n ): InferableComponentEnhancerWithProps<\n ResolveThunks<TDispatchProps>,\n TOwnProps\n >\n\n /** mapState, mapDispatch (as a function), and options */\n <TStateProps = {}, TDispatchProps = {}, TOwnProps = {}, State = DefaultState>(\n mapStateToProps: MapStateToPropsParam<TStateProps, TOwnProps, State>,\n mapDispatchToProps: MapDispatchToPropsNonObject<TDispatchProps, TOwnProps>,\n mergeProps: null | undefined,\n options: ConnectOptions<State, TStateProps, TOwnProps>,\n ): InferableComponentEnhancerWithProps<\n TStateProps & TDispatchProps,\n TOwnProps\n >\n\n /** mapState, mapDispatch (as an object), and options */\n <TStateProps = {}, TDispatchProps = {}, TOwnProps = {}, State = DefaultState>(\n mapStateToProps: MapStateToPropsParam<TStateProps, TOwnProps, State>,\n mapDispatchToProps: MapDispatchToPropsParam<TDispatchProps, TOwnProps>,\n mergeProps: null | undefined,\n options: ConnectOptions<State, TStateProps, TOwnProps>,\n ): InferableComponentEnhancerWithProps<\n TStateProps & ResolveThunks<TDispatchProps>,\n TOwnProps\n >\n\n /** mapState, mapDispatch, mergeProps, and options */\n <\n TStateProps = {},\n TDispatchProps = {},\n TOwnProps = {},\n TMergedProps = {},\n State = DefaultState,\n >(\n mapStateToProps: MapStateToPropsParam<TStateProps, TOwnProps, State>,\n mapDispatchToProps: MapDispatchToPropsParam<TDispatchProps, TOwnProps>,\n mergeProps: MergeProps<\n TStateProps,\n TDispatchProps,\n TOwnProps,\n TMergedProps\n >,\n options?: ConnectOptions<State, TStateProps, TOwnProps, TMergedProps>,\n ): InferableComponentEnhancerWithProps<TMergedProps, TOwnProps>\n // tslint:enable:no-unnecessary-generics\n}\n\nlet hasWarnedAboutDeprecatedPureOption = false\n\n/**\n * Connects a React component to a Redux store.\n *\n * - Without arguments, just wraps the component, without changing the behavior / props\n *\n * - If 2 params are passed (3rd param, mergeProps, is skipped), default behavior\n * is to override ownProps (as stated in the docs), so what remains is everything that's\n * not a state or dispatch prop\n *\n * - When 3rd param is passed, we don't know if ownProps propagate and whether they\n * should be valid component props, because it depends on mergeProps implementation.\n * As such, it is the user's responsibility to extend ownProps interface from state or\n * dispatch props or both when applicable\n *\n * @param mapStateToProps A function that extracts values from state\n * @param mapDispatchToProps Setup for dispatching actions\n * @param mergeProps Optional callback to merge state and dispatch props together\n * @param options Options for configuring the connection\n *\n */\nfunction connect<\n TStateProps = {},\n TDispatchProps = {},\n TOwnProps = {},\n TMergedProps = {},\n State = unknown,\n>(\n mapStateToProps?: MapStateToPropsParam<TStateProps, TOwnProps, State>,\n mapDispatchToProps?: MapDispatchToPropsParam<TDispatchProps, TOwnProps>,\n mergeProps?: MergeProps<TStateProps, TDispatchProps, TOwnProps, TMergedProps>,\n {\n // The `pure` option has been removed, so TS doesn't like us destructuring this to check its existence.\n // @ts-ignore\n pure,\n areStatesEqual = strictEqual,\n areOwnPropsEqual = shallowEqual,\n areStatePropsEqual = shallowEqual,\n areMergedPropsEqual = shallowEqual,\n\n // use React's forwardRef to expose a ref of the wrapped component\n forwardRef = false,\n\n // the context consumer to use\n context = ReactReduxContext,\n }: ConnectOptions<unknown, unknown, unknown, unknown> = {},\n): unknown {\n if (process.env.NODE_ENV !== 'production') {\n if (pure !== undefined && !hasWarnedAboutDeprecatedPureOption) {\n hasWarnedAboutDeprecatedPureOption = true\n warning(\n 'The `pure` option has been removed. `connect` is now always a \"pure/memoized\" component',\n )\n }\n }\n\n const Context = context\n\n const initMapStateToProps = mapStateToPropsFactory(mapStateToProps)\n const initMapDispatchToProps = mapDispatchToPropsFactory(mapDispatchToProps)\n const initMergeProps = mergePropsFactory(mergeProps)\n\n const shouldHandleStateChanges = Boolean(mapStateToProps)\n\n const wrapWithConnect = <TProps,>(\n WrappedComponent: ComponentType<TProps>,\n ) => {\n type WrappedComponentProps = TProps &\n ConnectPropsMaybeWithoutContext<TProps>\n\n if (process.env.NODE_ENV !== 'production') {\n const isValid = /*#__PURE__*/ isValidElementType(WrappedComponent)\n if (!isValid)\n throw new Error(\n `You must pass a component to the function returned by connect. Instead received ${stringifyComponent(\n WrappedComponent,\n )}`,\n )\n }\n\n const wrappedComponentName =\n WrappedComponent.displayName || WrappedComponent.name || 'Component'\n\n const displayName = `Connect(${wrappedComponentName})`\n\n const selectorFactoryOptions: SelectorFactoryOptions<\n any,\n any,\n any,\n any,\n State\n > = {\n shouldHandleStateChanges,\n displayName,\n wrappedComponentName,\n WrappedComponent,\n // @ts-ignore\n initMapStateToProps,\n initMapDispatchToProps,\n initMergeProps,\n areStatesEqual,\n areStatePropsEqual,\n areOwnPropsEqual,\n areMergedPropsEqual,\n }\n\n function ConnectFunction<TOwnProps>(\n props: InternalConnectProps & TOwnProps,\n ) {\n const [propsContext, reactReduxForwardedRef, wrapperProps] =\n React.useMemo(() => {\n // Distinguish between actual \"data\" props that were passed to the wrapper component,\n // and values needed to control behavior (forwarded refs, alternate context instances).\n // To maintain the wrapperProps object reference, memoize this destructuring.\n const { reactReduxForwardedRef, ...wrapperProps } = props\n return [props.context, reactReduxForwardedRef, wrapperProps]\n }, [props])\n\n const ContextToUse: ReactReduxContextInstance = React.useMemo(() => {\n // Users may optionally pass in a custom context instance to use instead of our ReactReduxContext.\n // Memoize the check that determines which context instance we should use.\n let ResultContext = Context\n if (propsContext?.Consumer) {\n if (process.env.NODE_ENV !== 'production') {\n const isValid = /*#__PURE__*/ isContextConsumer(\n // @ts-ignore\n <propsContext.Consumer />,\n )\n if (!isValid) {\n throw new Error(\n 'You must pass a valid React context consumer as `props.context`',\n )\n }\n ResultContext = propsContext\n }\n }\n return ResultContext\n }, [propsContext, Context])\n\n // Retrieve the store and ancestor subscription via context, if available\n const contextValue = React.useContext(ContextToUse)\n\n // The store _must_ exist as either a prop or in context.\n // We'll check to see if it _looks_ like a Redux store first.\n // This allows us to pass through a `store` prop that is just a plain value.\n const didStoreComeFromProps =\n Boolean(props.store) &&\n Boolean(props.store!.getState) &&\n Boolean(props.store!.dispatch)\n const didStoreComeFromContext =\n Boolean(contextValue) && Boolean(contextValue!.store)\n\n if (\n process.env.NODE_ENV !== 'production' &&\n !didStoreComeFromProps &&\n !didStoreComeFromContext\n ) {\n throw new Error(\n `Could not find \"store\" in the context of ` +\n `\"${displayName}\". Either wrap the root component in a <Provider>, ` +\n `or pass a custom React context provider to <Provider> and the corresponding ` +\n `React context consumer to ${displayName} in connect options.`,\n )\n }\n\n // Based on the previous check, one of these must be true\n const store: Store = didStoreComeFromProps\n ? props.store!\n : contextValue!.store\n\n const getServerState = didStoreComeFromContext\n ? contextValue!.getServerState\n : store.getState\n\n const childPropsSelector = React.useMemo(() => {\n // The child props selector needs the store reference as an input.\n // Re-create this selector whenever the store changes.\n return defaultSelectorFactory(store.dispatch, selectorFactoryOptions)\n }, [store])\n\n const [subscription, notifyNestedSubs] = React.useMemo(() => {\n if (!shouldHandleStateChanges) return NO_SUBSCRIPTION_ARRAY\n\n // This Subscription's source should match where store came from: props vs. context. A component\n // connected to the store via props shouldn't use subscription from context, or vice versa.\n const subscription = createSubscription(\n store,\n didStoreComeFromProps ? undefined : contextValue!.subscription,\n )\n\n // `notifyNestedSubs` is duplicated to handle the case where the component is unmounted in\n // the middle of the notification loop, where `subscription` will then be null. This can\n // probably be avoided if Subscription's listeners logic is changed to not call listeners\n // that have been unsubscribed in the middle of the notification loop.\n const notifyNestedSubs =\n subscription.notifyNestedSubs.bind(subscription)\n\n return [subscription, notifyNestedSubs]\n }, [store, didStoreComeFromProps, contextValue])\n\n // Determine what {store, subscription} value should be put into nested context, if necessary,\n // and memoize that value to avoid unnecessary context updates.\n const overriddenContextValue = React.useMemo(() => {\n if (didStoreComeFromProps) {\n // This component is directly subscribed to a store from props.\n // We don't want descendants reading from this store - pass down whatever\n // the existing context value is from the nearest connected ancestor.\n return contextValue!\n }\n\n // Otherwise, put this component's subscription instance into context, so that\n // connected descendants won't update until after this component is done\n return {\n ...contextValue,\n subscription,\n } as ReactReduxContextValue\n }, [didStoreComeFromProps, contextValue, subscription])\n\n // Set up refs to coordinate values between the subscription effect and the render logic\n const lastChildProps = React.useRef<unknown>(undefined)\n const lastWrapperProps = React.useRef(wrapperProps)\n const childPropsFromStoreUpdate = React.useRef<unknown>(undefined)\n const renderIsScheduled = React.useRef(false)\n const isMounted = React.useRef(false)\n\n // TODO: Change this to `React.useRef<Error>(undefined)` after upgrading to React 19.\n /**\n * @todo Change this to `React.useRef<Error>(undefined)` after upgrading to React 19.\n */\n const latestSubscriptionCallbackError = React.useRef<Error | undefined>(\n undefined,\n )\n\n useIsomorphicLayoutEffect(() => {\n isMounted.current = true\n return () => {\n isMounted.current = false\n }\n }, [])\n\n const actualChildPropsSelector = React.useMemo(() => {\n const selector = () => {\n // Tricky logic here:\n // - This render may have been triggered by a Redux store update that produced new child props\n // - However, we may have gotten new wrapper props after that\n // If we have new child props, and the same wrapper props, we know we should use the new child props as-is.\n // But, if we have new wrapper props, those might change the child props, so we have to recalculate things.\n // So, we'll use the child props from store update only if the wrapper props are the same as last time.\n if (\n childPropsFromStoreUpdate.current &&\n wrapperProps === lastWrapperProps.current\n ) {\n return childPropsFromStoreUpdate.current\n }\n\n // TODO We're reading the store directly in render() here. Bad idea?\n // This will likely cause Bad Things (TM) to happen in Concurrent Mode.\n // Note that we do this because on renders _not_ caused by store updates, we need the latest store state\n // to determine what the child props should be.\n return childPropsSelector(store.getState(), wrapperProps)\n }\n return selector\n }, [store, wrapperProps])\n\n // We need this to execute synchronously every time we re-render. However, React warns\n // about useLayoutEffect in SSR, so we try to detect environment and fall back to\n // just useEffect instead to avoid the warning, since neither will run anyway.\n\n const subscribeForReact = React.useMemo(() => {\n const subscribe = (reactListener: () => void) => {\n if (!subscription) {\n return () => {}\n }\n\n return subscribeUpdates(\n shouldHandleStateChanges,\n store,\n subscription,\n // @ts-ignore\n childPropsSelector,\n lastWrapperProps,\n lastChildProps,\n renderIsScheduled,\n isMounted,\n childPropsFromStoreUpdate,\n notifyNestedSubs,\n reactListener,\n )\n }\n\n return subscribe\n }, [subscription])\n\n useIsomorphicLayoutEffectWithArgs(captureWrapperProps, [\n lastWrapperProps,\n lastChildProps,\n renderIsScheduled,\n wrapperProps,\n childPropsFromStoreUpdate,\n notifyNestedSubs,\n ])\n\n let actualChildProps: Record<string, unknown>\n\n try {\n actualChildProps = React.useSyncExternalStore(\n // TODO We're passing through a big wrapper that does a bunch of extra side effects besides subscribing\n subscribeForReact,\n // TODO This is incredibly hacky. We've already processed the store update and calculated new child props,\n // TODO and we're just passing that through so it triggers a re-render for us rather than relying on `uSES`.\n actualChildPropsSelector,\n getServerState\n ? () => childPropsSelector(getServerState(), wrapperProps)\n : actualChildPropsSelector,\n )\n } catch (err) {\n if (latestSubscriptionCallbackError.current) {\n // eslint-disable-next-line no-extra-semi\n ;(err as Error).message +=\n `\\nThe error may be correlated with this previous error:\\n${latestSubscriptionCallbackError.current.stack}\\n\\n`\n }\n\n throw err\n }\n\n useIsomorphicLayoutEffect(() => {\n latestSubscriptionCallbackError.current = undefined\n childPropsFromStoreUpdate.current = undefined\n lastChildProps.current = actualChildProps\n })\n\n // Now that all that's done, we can finally try to actually render the child component.\n // We memoize the elements for the rendered child component as an optimization.\n const renderedWrappedComponent = React.useMemo(() => {\n return (\n // @ts-ignore\n <WrappedComponent\n {...actualChildProps}\n ref={reactReduxForwardedRef}\n />\n )\n }, [reactReduxForwardedRef, WrappedComponent, actualChildProps])\n\n // If React sees the exact same element reference as last time, it bails out of re-rendering\n // that child, same as if it was wrapped in React.memo() or returned false from shouldComponentUpdate.\n const renderedChild = React.useMemo(() => {\n if (shouldHandleStateChanges) {\n // If this component is subscribed to store updates, we need to pass its own\n // subscription instance down to our descendants. That means rendering the same\n // Context instance, and putting a different value into the context.\n return (\n <ContextToUse.Provider value={overriddenContextValue}>\n {renderedWrappedComponent}\n </ContextToUse.Provider>\n )\n }\n\n return renderedWrappedComponent\n }, [ContextToUse, renderedWrappedComponent, overriddenContextValue])\n\n return renderedChild\n }\n\n const _Connect = React.memo(ConnectFunction)\n\n type ConnectedWrapperComponent = typeof _Connect & {\n WrappedComponent: typeof WrappedComponent\n }\n\n // Add a hacky cast to get the right output type\n const Connect = _Connect as unknown as ConnectedComponent<\n typeof WrappedComponent,\n WrappedComponentProps\n >\n Connect.WrappedComponent = WrappedComponent\n Connect.displayName = ConnectFunction.displayName = displayName\n\n if (forwardRef) {\n const _forwarded = React.forwardRef(\n function forwardConnectRef(props, ref) {\n // @ts-ignore\n return <Connect {...props} reactReduxForwardedRef={ref} />\n },\n )\n\n const forwarded = _forwarded as ConnectedWrapperComponent\n forwarded.displayName = displayName\n forwarded.WrappedComponent = WrappedComponent\n return /*#__PURE__*/ hoistStatics(forwarded, WrappedComponent)\n }\n\n return /*#__PURE__*/ hoistStatics(Connect, WrappedComponent)\n }\n\n return wrapWithConnect\n}\n\nexport default connect as Connect\n","import { wrapMapToPropsConstant, wrapMapToPropsFunc } from './wrapMapToProps'\nimport { createInvalidArgFactory } from './invalidArgFactory'\nimport type { MapStateToPropsParam } from './selectorFactory'\n\nexport function mapStateToPropsFactory<TStateProps, TOwnProps, State>(\n mapStateToProps: MapStateToPropsParam<TStateProps, TOwnProps, State>,\n) {\n return !mapStateToProps\n ? wrapMapToPropsConstant(() => ({}))\n : typeof mapStateToProps === 'function'\n ? // @ts-ignore\n wrapMapToPropsFunc(mapStateToProps, 'mapStateToProps')\n : createInvalidArgFactory(mapStateToProps, 'mapStateToProps')\n}\n","import type { Action, Dispatch } from 'redux'\nimport bindActionCreators from '../utils/bindActionCreators'\nimport { wrapMapToPropsConstant, wrapMapToPropsFunc } from './wrapMapToProps'\nimport { createInvalidArgFactory } from './invalidArgFactory'\nimport type { MapDispatchToPropsParam } from './selectorFactory'\n\nexport function mapDispatchToPropsFactory<TDispatchProps, TOwnProps>(\n mapDispatchToProps:\n | MapDispatchToPropsParam<TDispatchProps, TOwnProps>\n | undefined,\n) {\n return mapDispatchToProps && typeof mapDispatchToProps === 'object'\n ? wrapMapToPropsConstant((dispatch: Dispatch<Action<string>>) =>\n // @ts-ignore\n bindActionCreators(mapDispatchToProps, dispatch),\n )\n : !mapDispatchToProps\n ? wrapMapToPropsConstant((dispatch: Dispatch<Action<string>>) => ({\n dispatch,\n }))\n : typeof mapDispatchToProps === 'function'\n ? // @ts-ignore\n wrapMapToPropsFunc(mapDispatchToProps, 'mapDispatchToProps')\n : createInvalidArgFactory(mapDispatchToProps, 'mapDispatchToProps')\n}\n","import type { ActionCreatorsMapObject, Dispatch } from 'redux'\n\nexport default function bindActionCreators(\n actionCreators: ActionCreatorsMapObject,\n dispatch: Dispatch,\n): ActionCreatorsMapObject {\n const boundActionCreators: ActionCreatorsMapObject = {}\n\n for (const key in actionCreators) {\n const actionCreator = actionCreators[key]\n if (typeof actionCreator === 'function') {\n boundActionCreators[key] = (...args) => dispatch(actionCreator(...args))\n }\n }\n return boundActionCreators\n}\n","import type { Context, ReactNode } from 'react'\nimport { React } from '../utils/react'\nimport type { Action, Store, UnknownAction } from 'redux'\nimport type { DevModeCheckFrequency } from '../hooks/useSelector'\nimport { createSubscription } from '../utils/Subscription'\nimport { useIsomorphicLayoutEffect } from '../utils/useIsomorphicLayoutEffect'\nimport type { ReactReduxContextValue } from './Context'\nimport { ReactReduxContext } from './Context'\n\nexport interface ProviderProps<\n A extends Action<string> = UnknownAction,\n S = unknown,\n> {\n /**\n * The single Redux store in your application.\n */\n store: Store<S, A>\n\n /**\n * An optional server state snapshot. Will be used during initial hydration render if available, to ensure that the UI output is consistent with the HTML generated on the server.\n */\n serverState?: S\n\n /**\n * Optional context to be used internally in react-redux. Use React.createContext() to create a context to be used.\n * If this is used, you'll need to customize `connect` by supplying the same context provided to the Provider.\n * Set the initial value to null, and the hooks will error\n * if this is not overwritten by Provider.\n */\n context?: Context<ReactReduxContextValue<S, A> | null>\n\n /**\n * Determines the frequency of stability checks for all selectors.\n * This setting overrides the global configuration for\n * the `useSelector` stability check, allowing you to specify how often\n * these checks should occur in development mode.\n *\n * @since 8.1.0\n */\n stabilityCheck?: DevModeCheckFrequency\n\n /**\n * Determines the frequency of identity function checks for all selectors.\n * This setting overrides the global configuration for\n * the `useSelector` identity function check, allowing you to specify how often\n * these checks should occur in development mode.\n *\n * **Note**: Previously referred to as `noopCheck`.\n *\n * @since 9.0.0\n */\n identityFunctionCheck?: DevModeCheckFrequency\n\n children: ReactNode\n}\n\nfunction Provider<A extends Action<string> = UnknownAction, S = unknown>(\n providerProps: ProviderProps<A, S>,\n) {\n const { children, context, serverState, store } = providerProps\n\n const contextValue = React.useMemo(() => {\n const subscription = createSubscription(store)\n\n const baseContextValue = {\n store,\n subscription,\n getServerState: serverState ? () => serverState : undefined,\n }\n\n if (process.env.NODE_ENV === 'production') {\n return baseContextValue\n } else {\n const { identityFunctionCheck = 'once', stabilityCheck = 'once' } =\n providerProps\n\n return /* @__PURE__ */ Object.assign(baseContextValue, {\n stabilityCheck,\n identityFunctionCheck,\n })\n }\n }, [store, serverState])\n\n const previousState = React.useMemo(() => store.getState(), [store])\n\n useIsomorphicLayoutEffect(() => {\n const { subscription } = contextValue\n subscription.onStateChange = subscription.notifyNestedSubs\n subscription.trySubscribe()\n\n if (previousState !== store.getState()) {\n subscription.notifyNestedSubs()\n }\n return () => {\n subscription.tryUnsubscribe()\n subscription.onStateChange = undefined\n }\n }, [contextValue, previousState])\n\n const Context = context || ReactReduxContext\n\n return <Context.Provider value={contextValue}>{children}</Context.Provider>\n}\n\nexport default Provider\n","import { React } from '../utils/react'\nimport { ReactReduxContext } from '../components/Context'\nimport type { ReactReduxContextValue } from '../components/Context'\n\n/**\n * Hook factory, which creates a `useReduxContext` hook bound to a given context. This is a low-level\n * hook that you should usually not need to call directly.\n *\n * @param {React.Context} [context=ReactReduxContext] Context passed to your `<Provider>`.\n * @returns {Function} A `useReduxContext` hook bound to the specified context.\n */\nexport function createReduxContextHook(context = ReactReduxContext) {\n return function useReduxContext(): ReactReduxContextValue {\n const contextValue = React.useContext(context)\n\n if (process.env.NODE_ENV !== 'production' && !contextValue) {\n throw new Error(\n 'could not find react-redux context value; please ensure the component is wrapped in a <Provider>',\n )\n }\n\n return contextValue!\n }\n}\n\n/**\n * A hook to access the value of the `ReactReduxContext`. This is a low-level\n * hook that you should usually not need to call directly.\n *\n * @returns {any} the value of the `ReactReduxContext`\n *\n * @example\n *\n * import React from 'react'\n * import { useReduxContext } from 'react-redux'\n *\n * export const CounterComponent = () => {\n * const { store } = useReduxContext()\n * return <div>{store.getState()}</div>\n * }\n */\nexport const useReduxContext = /*#__PURE__*/ createReduxContextHook()\n","import type { Context } from 'react'\nimport type { Action, Store } from 'redux'\nimport type { ReactReduxContextValue } from '../components/Context'\nimport { ReactReduxContext } from '../components/Context'\nimport {\n createReduxContextHook,\n useReduxContext as useDefaultReduxContext,\n} from './useReduxContext'\n\n/**\n * Represents a type that extracts the action type from a given Redux store.\n *\n * @template StoreType - The specific type of the Redux store.\n *\n * @since 9.1.0\n * @internal\n */\nexport type ExtractStoreActionType<StoreType extends Store> =\n StoreType extends Store<any, infer ActionType> ? ActionType : never\n\n/**\n * Represents a custom hook that provides access to the Redux store.\n *\n * @template StoreType - The specific type of the Redux store that gets returned.\n *\n * @since 9.1.0\n * @public\n */\nexport interface UseStore<StoreType extends Store> {\n /**\n * Returns the Redux store instance.\n *\n * @returns The Redux store instance.\n */\n (): StoreType\n\n /**\n * Returns the Redux store instance with specific state and action types.\n *\n * @returns The Redux store with the specified state and action types.\n *\n * @template StateType - The specific type of the state used in the store.\n * @template ActionType - The specific type of the actions used in the store.\n */\n <\n StateType extends ReturnType<StoreType['getState']> = ReturnType<\n StoreType['getState']\n >,\n ActionType extends Action = ExtractStoreActionType<Store>,\n >(): Store<StateType, ActionType>\n\n /**\n * Creates a \"pre-typed\" version of {@linkcode useStore useStore}\n * where the type of the Redux `store` is predefined.\n *\n * This allows you to set the `store` type once, eliminating the need to\n * specify it with every {@linkcode useStore useStore} call.\n *\n * @returns A pre-typed `useStore` with the store type already defined.\n *\n * @example\n * ```ts\n * export const useAppStore = useStore.withTypes<AppStore>()\n * ```\n *\n * @template OverrideStoreType - The specific type of the Redux store that gets returned.\n *\n * @since 9.1.0\n */\n withTypes: <\n OverrideStoreType extends StoreType,\n >() => UseStore<OverrideStoreType>\n}\n\n/**\n * Hook factory, which creates a `useStore` hook bound to a given context.\n *\n * @param {React.Context} [context=ReactReduxContext] Context passed to your `<Provider>`.\n * @returns {Function} A `useStore` hook bound to the specified context.\n */\nexport function createStoreHook<\n StateType = unknown,\n ActionType extends Action = Action,\n>(\n // @ts-ignore\n context?: Context<ReactReduxContextValue<\n StateType,\n ActionType\n > | null> = ReactReduxContext,\n) {\n const useReduxContext =\n context === ReactReduxContext\n ? useDefaultReduxContext\n : // @ts-ignore\n createReduxContextHook(context)\n const useStore = () => {\n const { store } = useReduxContext()\n return store\n }\n\n Object.assign(useStore, {\n withTypes: () => useStore,\n })\n\n return useStore as UseStore<Store<StateType, ActionType>>\n}\n\n/**\n * A hook to access the redux store.\n *\n * @returns {any} the redux store\n *\n * @example\n *\n * import React from 'react'\n * import { useStore } from 'react-redux'\n *\n * export const ExampleComponent = () => {\n * const store = useStore()\n * return <div>{store.getState()}</div>\n * }\n */\nexport const useStore = /*#__PURE__*/ createStoreHook()\n","import type { Context } from 'react'\nimport type { Action, Dispatch, UnknownAction } from 'redux'\n\nimport type { ReactReduxContextValue } from '../components/Context'\nimport { ReactReduxContext } from '../components/Context'\nimport { createStoreHook, useStore as useDefaultStore } from './useStore'\n\n/**\n * Represents a custom hook that provides a dispatch function\n * from the Redux store.\n *\n * @template DispatchType - The specific type of the dispatch function.\n *\n * @since 9.1.0\n * @public\n */\nexport interface UseDispatch<\n DispatchType extends Dispatch<UnknownAction> = Dispatch<UnknownAction>,\n> {\n /**\n * Returns the dispatch function from the Redux store.\n *\n * @returns The dispatch function from the Redux store.\n *\n * @template AppDispatch - The specific type of the dispatch function.\n */\n <AppDispatch extends DispatchType = DispatchType>(): AppDispatch\n\n /**\n * Creates a \"pre-typed\" version of {@linkcode useDispatch useDispatch}\n * where the type of the `dispatch` function is predefined.\n *\n * This allows you to set the `dispatch` type once, eliminating the need to\n * specify it with every {@linkcode useDispatch useDispatch} call.\n *\n * @returns A pre-typed `useDispatch` with the dispatch type already defined.\n *\n * @example\n * ```ts\n * export const useAppDispatch = useDispatch.withTypes<AppDispatch>()\n * ```\n *\n * @template OverrideDispatchType - The specific type of the dispatch function.\n *\n * @since 9.1.0\n */\n withTypes: <\n OverrideDispatchType extends DispatchType,\n >() => UseDispatch<OverrideDispatchType>\n}\n\n/**\n * Hook factory, which creates a `useDispatch` hook bound to a given context.\n *\n * @param {React.Context} [context=ReactReduxContext] Context passed to your `<Provider>`.\n * @returns {Function} A `useDispatch` hook bound to the specified context.\n */\nexport function createDispatchHook<\n StateType = unknown,\n ActionType extends Action = UnknownAction,\n>(\n // @ts-ignore\n context?: Context<ReactReduxContextValue<\n StateType,\n ActionType\n > | null> = ReactReduxContext,\n) {\n const useStore =\n context === ReactReduxContext ? useDefaultStore : createStoreHook(context)\n\n const useDispatch = () => {\n const store = useStore()\n return store.dispatch\n }\n\n Object.assign(useDispatch, {\n withTypes: () => useDispatch,\n })\n\n return useDispatch as UseDispatch<Dispatch<ActionType>>\n}\n\n/**\n * A hook to access the redux `dispatch` function.\n *\n * @returns {any|function} redux store's `dispatch` function\n *\n * @example\n *\n * import React, { useCallback } from 'react'\n * import { useDispatch } from 'react-redux'\n *\n * export const CounterComponent = ({ value }) => {\n * const dispatch = useDispatch()\n * const increaseCounter = useCallback(() => dispatch({ type: 'increase-counter' }), [])\n * return (\n * <div>\n * <span>{value}</span>\n * <button onClick={increaseCounter}>Increase counter</button>\n * </div>\n * )\n * }\n */\nexport const useDispatch = /*#__PURE__*/ createDispatchHook()\n","//import * as React from 'react'\nimport { React } from '../utils/react'\nimport { useSyncExternalStoreWithSelector } from 'use-sync-external-store/with-selector.js'\nimport type { ReactReduxContextValue } from '../components/Context'\nimport { ReactReduxContext } from '../components/Context'\nimport type { EqualityFn, NoInfer } from '../types'\nimport {\n createReduxContextHook,\n useReduxContext as useDefaultReduxContext,\n} from './useReduxContext'\n\n/**\n * The frequency of development mode checks.\n *\n * @since 8.1.0\n * @internal\n */\nexport type DevModeCheckFrequency = 'never' | 'once' | 'always'\n\n/**\n * Represents the configuration for development mode checks.\n *\n * @since 9.0.0\n * @internal\n */\nexport interface DevModeChecks {\n /**\n * Overrides the global stability check for the selector.\n * - `once` - Run only the first time the selector is called.\n * - `always` - Run every time the selector is called.\n * - `never` - Never run the stability check.\n *\n * @default 'once'\n *\n * @since 8.1.0\n */\n stabilityCheck: DevModeCheckFrequency\n\n /**\n * Overrides the global identity function check for the selector.\n * - `once` - Run only the first time the selector is called.\n * - `always` - Run every time the selector is called.\n * - `never` - Never run the identity function check.\n *\n * **Note**: Previously referred to as `noopCheck`.\n *\n * @default 'once'\n *\n * @since 9.0.0\n */\n identityFunctionCheck: DevModeCheckFrequency\n}\n\nexport interface UseSelectorOptions<Selected = unknown> {\n equalityFn?: EqualityFn<Selected>\n\n /**\n * `useSelector` performs additional checks in development mode to help\n * identify and warn about potential issues in selector behavior. This\n * option allows you to customize the behavior of these checks per selector.\n *\n * @since 9.0.0\n */\n devModeChecks?: Partial<DevModeChecks>\n}\n\n/**\n * Represents a custom hook that allows you to extract data from the\n * Redux store state, using a selector function. The selector function\n * takes the current state as an argument and returns a part of the state\n * or some derived data. The hook also supports an optional equality\n * function or options object to customize its behavior.\n *\n * @template StateType - The specific type of state this hook operates on.\n *\n * @public\n */\nexport interface UseSelector<StateType = unknown> {\n /**\n * A function that takes a selector function as its first argument.\n * The selector function is responsible for selecting a part of\n * the Redux store's state or computing derived data.\n *\n * @param selector - A function that receives the current state and returns a part of the state or some derived data.\n * @param equalityFnOrOptions - An optional equality function or options object for customizing the behavior of the selector.\n * @returns The selected part of the state or derived data.\n *\n * @template TState - The specific type of state this hook operates on.\n * @template Selected - The type of the value that the selector function will return.\n */\n <TState extends StateType = StateType, Selected = unknown>(\n selector: (state: TState) => Selected,\n equalityFnOrOptions?: EqualityFn<Selected> | UseSelectorOptions<Selected>,\n ): Selected\n\n /**\n * Creates a \"pre-typed\" version of {@linkcode useSelector useSelector}\n * where the `state` type is predefined.\n *\n * This allows you to set the `state` type once, eliminating the need to\n * specify it with every {@linkcode useSelector useSelector} call.\n *\n * @returns A pre-typed `useSelector` with the state type already defined.\n *\n * @example\n * ```ts\n * export const useAppSelector = useSelector.withTypes<RootState>()\n * ```\n *\n * @template OverrideStateType - The specific type of state this hook operates on.\n *\n * @since 9.1.0\n */\n withTypes: <\n OverrideStateType extends StateType,\n >() => UseSelector<OverrideStateType>\n}\n\nconst refEquality: EqualityFn<any> = (a, b) => a === b\n\n/**\n * Hook factory, which creates a `useSelector` hook bound to a given context.\n *\n * @param {React.Context} [context=ReactReduxContext] Context passed to your `<Provider>`.\n * @returns {Function} A `useSelector` hook bound to the specified context.\n */\nexport function createSelectorHook(\n context: React.Context<ReactReduxContextValue<\n any,\n any\n > | null> = ReactReduxContext,\n): UseSelector {\n const useReduxContext =\n context === ReactReduxContext\n ? useDefaultReduxContext\n : createReduxContextHook(context)\n\n const useSelector = <TState, Selected>(\n selector: (state: TState) => Selected,\n equalityFnOrOptions:\n | EqualityFn<NoInfer<Selected>>\n | UseSelectorOptions<NoInfer<Selected>> = {},\n ): Selected => {\n const { equalityFn = refEquality } =\n typeof equalityFnOrOptions === 'function'\n ? { equalityFn: equalityFnOrOptions }\n : equalityFnOrOptions\n if (process.env.NODE_ENV !== 'production') {\n if (!selector) {\n throw new Error(`You must pass a selector to useSelector`)\n }\n if (typeof selector !== 'function') {\n throw new Error(`You must pass a function as a selector to useSelector`)\n }\n if (typeof equalityFn !== 'function') {\n throw new Error(\n `You must pass a function as an equality function to useSelector`,\n )\n }\n }\n\n const reduxContext = useReduxContext()\n\n const { store, subscription, getServerState } = reduxContext\n\n const firstRun = React.useRef(true)\n\n const wrappedSelector = React.useCallback<typeof selector>(\n {\n [selector.name](state: TState) {\n const selected = selector(state)\n if (process.env.NODE_ENV !== 'production') {\n const { devModeChecks = {} } =\n typeof equalityFnOrOptions === 'function'\n ? {}\n : equalityFnOrOptions\n const { identityFunctionCheck, stabilityCheck } = reduxContext\n const {\n identityFunctionCheck: finalIdentityFunctionCheck,\n stabilityCheck: finalStabilityCheck,\n } = {\n stabilityCheck,\n identityFunctionCheck,\n ...devModeChecks,\n }\n if (\n finalStabilityCheck === 'always' ||\n (finalStabilityCheck === 'once' && firstRun.current)\n ) {\n const toCompare = selector(state)\n if (!equalityFn(selected, toCompare)) {\n let stack: string | undefined = undefined\n try {\n throw new Error()\n } catch (e) {\n // eslint-disable-next-line no-extra-semi\n ;({ stack } = e as Error)\n }\n console.warn(\n 'Selector ' +\n (selector.name || 'unknown') +\n ' returned a different result when called with the same parameters. This can lead to unnecessary rerenders.' +\n '\\nSelectors that return a new reference (such as an object or an array) should be memoized: https://redux.js.org/usage/deriving-data-selectors#optimizing-selectors-with-memoization',\n {\n state,\n selected,\n selected2: toCompare,\n stack,\n },\n )\n }\n }\n if (\n finalIdentityFunctionCheck === 'always' ||\n (finalIdentityFunctionCheck === 'once' && firstRun.current)\n ) {\n // @ts-ignore\n if (selected === state) {\n let stack: string | undefined = undefined\n try {\n throw new Error()\n } catch (e) {\n // eslint-disable-next-line no-extra-semi\n ;({ stack } = e as Error)\n }\n console.warn(\n 'Selector ' +\n (selector.name || 'unknown') +\n ' returned the root state when called. This can lead to unnecessary rerenders.' +\n '\\nSelectors that return the entire state are almost certainly a mistake, as they will cause a rerender whenever *anything* in state changes.',\n { stack },\n )\n }\n }\n if (firstRun.current) firstRun.current = false\n }\n return selected\n },\n }[selector.name],\n [selector],\n )\n\n const selectedState = useSyncExternalStoreWithSelector(\n subscription.addNestedSub,\n store.getState,\n getServerState || store.getState,\n wrappedSelector,\n equalityFn,\n )\n\n React.useDebugValue(selectedState)\n\n return selectedState\n }\n\n Object.assign(useSelector, {\n withTypes: () => useSelector,\n })\n\n return useSelector as UseSelector\n}\n\n/**\n * A hook to access the redux store's state. This hook takes a selector function\n * as an argument. The selector is called with the store state.\n *\n * This hook takes an optional equality comparison function as the second parameter\n * that allows you to customize the way the selected state is compared to determine\n * whether the component needs to be re-rendered.\n *\n * @param {Function} selector the selector function\n * @param {Function=} equalityFn the function that will be used to determine equality\n *\n * @returns {any} the selected state\n *\n * @example\n *\n * import React from 'react'\n * import { useSelector } from 'react-redux'\n *\n * export const CounterComponent = () => {\n * const counter = useSelector(state => state.counter)\n * return <div>{counter}</div>\n * }\n */\nexport const useSelector = /*#__PURE__*/ createSelectorHook()\n","import lookup from 'void-elements'\nconst attrRE = /\\s([^'\"/\\s><]+?)[\\s/>]|([^\\s=]+)=\\s?(\".*?\"|'.*?')/g\n\nexport default function stringify(tag) {\n const res = {\n type: 'tag',\n name: '',\n voidElement: false,\n attrs: {},\n children: [],\n }\n\n const tagMatch = tag.match(/<\\/?([^\\s]+?)[/\\s>]/)\n if (tagMatch) {\n res.name = tagMatch[1]\n if (\n lookup[tagMatch[1]] ||\n tag.charAt(tag.length - 2) === '/'\n ) {\n res.voidElement = true\n }\n\n // handle comment tag\n if (res.name.startsWith('!--')) {\n const endIndex = tag.indexOf('-->')\n return {\n type: 'comment',\n comment: endIndex !== -1 ? tag.slice(4, endIndex) : '',\n }\n }\n }\n\n const reg = new RegExp(attrRE)\n let result = null\n for (;;) {\n result = reg.exec(tag)\n\n if (result === null) {\n break\n }\n\n if (!result[0].trim()) {\n continue\n }\n\n if (result[1]) {\n const attr = result[1].trim()\n let arr = [attr, '']\n\n if (attr.indexOf('=') > -1) {\n arr = attr.split('=')\n }\n\n res.attrs[arr[0]] = arr[1]\n reg.lastIndex--\n } else if (result[2]) {\n res.attrs[result[2]] = result[3].trim().substring(1, result[3].length - 1)\n }\n }\n\n return res\n}\n","import parseTag from './parse-tag'\n\nconst tagRE = /<[a-zA-Z0-9\\-\\!\\/](?:\"[^\"]*\"|'[^']*'|[^'\">])*>/g\nconst whitespaceRE = /^\\s*$/\n\n// re-used obj for quick lookups of components\nconst empty = Object.create(null)\n\nexport default function parse(html, options) {\n options || (options = {})\n options.components || (options.components = empty)\n const result = []\n const arr = []\n let current\n let level = -1\n let inComponent = false\n\n // handle text at top level\n if (html.indexOf('<') !== 0) {\n var end = html.indexOf('<')\n result.push({\n type: 'text',\n content: end === -1 ? html : html.substring(0, end),\n })\n }\n\n html.replace(tagRE, function (tag, index) {\n if (inComponent) {\n if (tag !== '</' + current.name + '>') {\n return\n } else {\n inComponent = false\n }\n }\n const isOpen = tag.charAt(1) !== '/'\n const isComment = tag.startsWith('<!--')\n const start = index + tag.length\n const nextChar = html.charAt(start)\n let parent\n\n if (isComment) {\n const comment = parseTag(tag)\n\n // if we're at root, push new base node\n if (level < 0) {\n result.push(comment)\n return result\n }\n parent = arr[level]\n parent.children.push(comment)\n return result\n }\n\n if (isOpen) {\n level++\n\n current = parseTag(tag)\n if (current.type === 'tag' && options.components[current.name]) {\n current.type = 'component'\n inComponent = true\n }\n\n if (\n !current.voidElement &&\n !inComponent &&\n nextChar &&\n nextChar !== '<'\n ) {\n current.children.push({\n type: 'text',\n content: html.slice(start, html.indexOf('<', start)),\n })\n }\n\n // if we're at root, push new base node\n if (level === 0) {\n result.push(current)\n }\n\n parent = arr[level - 1]\n\n if (parent) {\n parent.children.push(current)\n }\n\n arr[level] = current\n }\n\n if (!isOpen || current.voidElement) {\n if (\n level > -1 &&\n (current.voidElement || current.name === tag.slice(2, -1))\n ) {\n level--\n // move current up a level to match the end tag\n current = level === -1 ? result : arr[level]\n }\n if (!inComponent && nextChar !== '<' && nextChar) {\n // trailing text node\n // if we're at the root, push a base text node. otherwise add as\n // a child to the current node.\n parent = level === -1 ? result : arr[level].children\n\n // calculate correct end of the content slice in case there's\n // no tag after the text node.\n const end = html.indexOf('<', start)\n let content = html.slice(start, end === -1 ? undefined : end)\n // if a node is nothing but whitespace, collapse it as the spec states:\n // https://www.w3.org/TR/html4/struct/text.html#h-9.1\n if (whitespaceRE.test(content)) {\n content = ' '\n }\n // don't add whitespace-only text nodes if they would be trailing text nodes\n // or if they would be leading whitespace-only text nodes:\n // * end > -1 indicates this is not a trailing text node\n // * leading node is when level is -1 and parent has length 0\n if ((end > -1 && level + parent.length >= 0) || content !== ' ') {\n parent.push({\n type: 'text',\n content: content,\n })\n }\n }\n }\n })\n\n return result\n}\n","function attrString(attrs) {\n const buff = []\n for (let key in attrs) {\n buff.push(key + '=\"' + attrs[key] + '\"')\n }\n if (!buff.length) {\n return ''\n }\n return ' ' + buff.join(' ')\n}\n\nfunction stringify(buff, doc) {\n switch (doc.type) {\n case 'text':\n return buff + doc.content\n case 'tag':\n buff +=\n '<' +\n doc.name +\n (doc.attrs ? attrString(doc.attrs) : '') +\n (doc.voidElement ? '/>' : '>')\n if (doc.voidElement) {\n return buff\n }\n return buff + doc.children.reduce(stringify, '') + '</' + doc.name + '>'\n case 'comment':\n buff += '<!--' + doc.comment + '-->'\n return buff\n }\n}\n\nexport default function (doc) {\n return doc.reduce(function (token, rootEl) {\n return token + stringify('', rootEl)\n }, '')\n}\n","import parse from './parse'\nimport stringify from './stringify'\n\nexport default {\n parse,\n stringify,\n}\n","export const warn = (i18n, code, msg, rest) => {\n const args = [msg, {\n code,\n ...(rest || {})\n }];\n if (i18n?.services?.logger?.forward) {\n return i18n.services.logger.forward(args, 'warn', 'react-i18next::', true);\n }\n if (isString(args[0])) args[0] = `react-i18next:: ${args[0]}`;\n if (i18n?.services?.logger?.warn) {\n i18n.services.logger.warn(...args);\n } else if (console?.warn) {\n console.warn(...args);\n }\n};\nconst alreadyWarned = {};\nexport const warnOnce = (i18n, code, msg, rest) => {\n if (isString(msg) && alreadyWarned[msg]) return;\n if (isString(msg)) alreadyWarned[msg] = new Date();\n warn(i18n, code, msg, rest);\n};\nconst loadedClb = (i18n, cb) => () => {\n if (i18n.isInitialized) {\n cb();\n } else {\n const initialized = () => {\n setTimeout(() => {\n i18n.off('initialized', initialized);\n }, 0);\n cb();\n };\n i18n.on('initialized', initialized);\n }\n};\nexport const loadNamespaces = (i18n, ns, cb) => {\n i18n.loadNamespaces(ns, loadedClb(i18n, cb));\n};\nexport const loadLanguages = (i18n, lng, ns, cb) => {\n if (isString(ns)) ns = [ns];\n if (i18n.options.preload && i18n.options.preload.indexOf(lng) > -1) return loadNamespaces(i18n, ns, cb);\n ns.forEach(n => {\n if (i18n.options.ns.indexOf(n) < 0) i18n.options.ns.push(n);\n });\n i18n.loadLanguages(lng, loadedClb(i18n, cb));\n};\nexport const hasLoadedNamespace = (ns, i18n, options = {}) => {\n if (!i18n.languages || !i18n.languages.length) {\n warnOnce(i18n, 'NO_LANGUAGES', 'i18n.languages were undefined or empty', {\n languages: i18n.languages\n });\n return true;\n }\n return i18n.hasLoadedNamespace(ns, {\n lng: options.lng,\n precheck: (i18nInstance, loadNotPending) => {\n if (options.bindI18n?.indexOf('languageChanging') > -1 && i18nInstance.services.backendConnector.backend && i18nInstance.isLanguageChangingTo && !loadNotPending(i18nInstance.isLanguageChangingTo, ns)) return false;\n }\n });\n};\nexport const getDisplayName = Component => Component.displayName || Component.name || (isString(Component) && Component.length > 0 ? Component : 'Unknown');\nexport const isString = obj => typeof obj === 'string';\nexport const isObject = obj => typeof obj === 'object' && obj !== null;","const matchHtmlEntity = /&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g;\nconst htmlEntities = {\n '&': '&',\n '&': '&',\n '<': '<',\n '<': '<',\n '>': '>',\n '>': '>',\n ''': \"'\",\n ''': \"'\",\n '"': '\"',\n '"': '\"',\n ' ': ' ',\n ' ': ' ',\n '©': '©',\n '©': '©',\n '®': '®',\n '®': '®',\n '…': '…',\n '…': '…',\n '/': '/',\n '/': '/'\n};\nconst unescapeHtmlEntity = m => htmlEntities[m];\nexport const unescape = text => text.replace(matchHtmlEntity, unescapeHtmlEntity);","import { unescape } from './unescape.js';\nlet defaultOptions = {\n bindI18n: 'languageChanged',\n bindI18nStore: '',\n transEmptyNodeValue: '',\n transSupportBasicHtmlNodes: true,\n transWrapTextNodes: '',\n transKeepBasicHtmlNodesFor: ['br', 'strong', 'i', 'p'],\n useSuspense: true,\n unescape\n};\nexport const setDefaults = (options = {}) => {\n defaultOptions = {\n ...defaultOptions,\n ...options\n };\n};\nexport const getDefaults = () => defaultOptions;","let i18nInstance;\nexport const setI18n = instance => {\n i18nInstance = instance;\n};\nexport const getI18n = () => i18nInstance;","import { Fragment, isValidElement, cloneElement, createElement, Children } from 'react';\nimport HTML from 'html-parse-stringify';\nimport { isObject, isString, warn, warnOnce } from './utils.js';\nimport { getDefaults } from './defaults.js';\nimport { getI18n } from './i18nInstance.js';\nconst hasChildren = (node, checkLength) => {\n if (!node) return false;\n const base = node.props?.children ?? node.children;\n if (checkLength) return base.length > 0;\n return !!base;\n};\nconst getChildren = node => {\n if (!node) return [];\n const children = node.props?.children ?? node.children;\n return node.props?.i18nIsDynamicList ? getAsArray(children) : children;\n};\nconst hasValidReactChildren = children => Array.isArray(children) && children.every(isValidElement);\nconst getAsArray = data => Array.isArray(data) ? data : [data];\nconst mergeProps = (source, target) => {\n const newTarget = {\n ...target\n };\n newTarget.props = Object.assign(source.props, target.props);\n return newTarget;\n};\nexport const nodesToString = (children, i18nOptions, i18n, i18nKey) => {\n if (!children) return '';\n let stringNode = '';\n const childrenArray = getAsArray(children);\n const keepArray = i18nOptions?.transSupportBasicHtmlNodes ? i18nOptions.transKeepBasicHtmlNodesFor ?? [] : [];\n childrenArray.forEach((child, childIndex) => {\n if (isString(child)) {\n stringNode += `${child}`;\n return;\n }\n if (isValidElement(child)) {\n const {\n props,\n type\n } = child;\n const childPropsCount = Object.keys(props).length;\n const shouldKeepChild = keepArray.indexOf(type) > -1;\n const childChildren = props.children;\n if (!childChildren && shouldKeepChild && !childPropsCount) {\n stringNode += `<${type}/>`;\n return;\n }\n if (!childChildren && (!shouldKeepChild || childPropsCount) || props.i18nIsDynamicList) {\n stringNode += `<${childIndex}></${childIndex}>`;\n return;\n }\n if (shouldKeepChild && childPropsCount === 1 && isString(childChildren)) {\n stringNode += `<${type}>${childChildren}</${type}>`;\n return;\n }\n const content = nodesToString(childChildren, i18nOptions, i18n, i18nKey);\n stringNode += `<${childIndex}>${content}</${childIndex}>`;\n return;\n }\n if (child === null) {\n warn(i18n, 'TRANS_NULL_VALUE', `Passed in a null value as child`, {\n i18nKey\n });\n return;\n }\n if (isObject(child)) {\n const {\n format,\n ...clone\n } = child;\n const keys = Object.keys(clone);\n if (keys.length === 1) {\n const value = format ? `${keys[0]}, ${format}` : keys[0];\n stringNode += `{{${value}}}`;\n return;\n }\n warn(i18n, 'TRANS_INVALID_OBJ', `Invalid child - Object should only have keys {{ value, format }} (format is optional).`, {\n i18nKey,\n child\n });\n return;\n }\n warn(i18n, 'TRANS_INVALID_VAR', `Passed in a variable like {number} - pass variables for interpolation as full objects like {{number}}.`, {\n i18nKey,\n child\n });\n });\n return stringNode;\n};\nconst renderNodes = (children, targetString, i18n, i18nOptions, combinedTOpts, shouldUnescape) => {\n if (targetString === '') return [];\n const keepArray = i18nOptions.transKeepBasicHtmlNodesFor || [];\n const emptyChildrenButNeedsHandling = targetString && new RegExp(keepArray.map(keep => `<${keep}`).join('|')).test(targetString);\n if (!children && !emptyChildrenButNeedsHandling && !shouldUnescape) return [targetString];\n const data = {};\n const getData = childs => {\n const childrenArray = getAsArray(childs);\n childrenArray.forEach(child => {\n if (isString(child)) return;\n if (hasChildren(child)) getData(getChildren(child));else if (isObject(child) && !isValidElement(child)) Object.assign(data, child);\n });\n };\n getData(children);\n const ast = HTML.parse(`<0>${targetString}</0>`);\n const opts = {\n ...data,\n ...combinedTOpts\n };\n const renderInner = (child, node, rootReactNode) => {\n const childs = getChildren(child);\n const mappedChildren = mapAST(childs, node.children, rootReactNode);\n return hasValidReactChildren(childs) && mappedChildren.length === 0 || child.props?.i18nIsDynamicList ? childs : mappedChildren;\n };\n const pushTranslatedJSX = (child, inner, mem, i, isVoid) => {\n if (child.dummy) {\n child.children = inner;\n mem.push(cloneElement(child, {\n key: i\n }, isVoid ? undefined : inner));\n } else {\n mem.push(...Children.map([child], c => {\n const props = {\n ...c.props\n };\n delete props.i18nIsDynamicList;\n return createElement(c.type, {\n ...props,\n key: i,\n ref: c.ref\n }, isVoid ? null : inner);\n }));\n }\n };\n const mapAST = (reactNode, astNode, rootReactNode) => {\n const reactNodes = getAsArray(reactNode);\n const astNodes = getAsArray(astNode);\n return astNodes.reduce((mem, node, i) => {\n const translationContent = node.children?.[0]?.content && i18n.services.interpolator.interpolate(node.children[0].content, opts, i18n.language);\n if (node.type === 'tag') {\n let tmp = reactNodes[parseInt(node.name, 10)];\n if (rootReactNode.length === 1 && !tmp) tmp = rootReactNode[0][node.name];\n if (!tmp) tmp = {};\n const child = Object.keys(node.attrs).length !== 0 ? mergeProps({\n props: node.attrs\n }, tmp) : tmp;\n const isElement = isValidElement(child);\n const isValidTranslationWithChildren = isElement && hasChildren(node, true) && !node.voidElement;\n const isEmptyTransWithHTML = emptyChildrenButNeedsHandling && isObject(child) && child.dummy && !isElement;\n const isKnownComponent = isObject(children) && Object.hasOwnProperty.call(children, node.name);\n if (isString(child)) {\n const value = i18n.services.interpolator.interpolate(child, opts, i18n.language);\n mem.push(value);\n } else if (hasChildren(child) || isValidTranslationWithChildren) {\n const inner = renderInner(child, node, rootReactNode);\n pushTranslatedJSX(child, inner, mem, i);\n } else if (isEmptyTransWithHTML) {\n const inner = mapAST(reactNodes, node.children, rootReactNode);\n pushTranslatedJSX(child, inner, mem, i);\n } else if (Number.isNaN(parseFloat(node.name))) {\n if (isKnownComponent) {\n const inner = renderInner(child, node, rootReactNode);\n pushTranslatedJSX(child, inner, mem, i, node.voidElement);\n } else if (i18nOptions.transSupportBasicHtmlNodes && keepArray.indexOf(node.name) > -1) {\n if (node.voidElement) {\n mem.push(createElement(node.name, {\n key: `${node.name}-${i}`\n }));\n } else {\n const inner = mapAST(reactNodes, node.children, rootReactNode);\n mem.push(createElement(node.name, {\n key: `${node.name}-${i}`\n }, inner));\n }\n } else if (node.voidElement) {\n mem.push(`<${node.name} />`);\n } else {\n const inner = mapAST(reactNodes, node.children, rootReactNode);\n mem.push(`<${node.name}>${inner}</${node.name}>`);\n }\n } else if (isObject(child) && !isElement) {\n const content = node.children[0] ? translationContent : null;\n if (content) mem.push(content);\n } else {\n pushTranslatedJSX(child, translationContent, mem, i, node.children.length !== 1 || !translationContent);\n }\n } else if (node.type === 'text') {\n const wrapTextNodes = i18nOptions.transWrapTextNodes;\n const content = shouldUnescape ? i18nOptions.unescape(i18n.services.interpolator.interpolate(node.content, opts, i18n.language)) : i18n.services.interpolator.interpolate(node.content, opts, i18n.language);\n if (wrapTextNodes) {\n mem.push(createElement(wrapTextNodes, {\n key: `${node.name}-${i}`\n }, content));\n } else {\n mem.push(content);\n }\n }\n return mem;\n }, []);\n };\n const result = mapAST([{\n dummy: true,\n children: children || []\n }], ast, getAsArray(children || []));\n return getChildren(result[0]);\n};\nconst fixComponentProps = (component, index, translation) => {\n const componentKey = component.key || index;\n const comp = cloneElement(component, {\n key: componentKey\n });\n if (!comp.props || !comp.props.children || translation.indexOf(`${index}/>`) < 0 && translation.indexOf(`${index} />`) < 0) {\n return comp;\n }\n function Componentized() {\n return createElement(Fragment, null, comp);\n }\n return createElement(Componentized, {\n key: componentKey\n });\n};\nconst generateArrayComponents = (components, translation) => components.map((c, index) => fixComponentProps(c, index, translation));\nconst generateObjectComponents = (components, translation) => {\n const componentMap = {};\n Object.keys(components).forEach(c => {\n Object.assign(componentMap, {\n [c]: fixComponentProps(components[c], c, translation)\n });\n });\n return componentMap;\n};\nconst generateComponents = (components, translation, i18n, i18nKey) => {\n if (!components) return null;\n if (Array.isArray(components)) {\n return generateArrayComponents(components, translation);\n }\n if (isObject(components)) {\n return generateObjectComponents(components, translation);\n }\n warnOnce(i18n, 'TRANS_INVALID_COMPONENTS', `<Trans /> \"components\" prop expects an object or array`, {\n i18nKey\n });\n return null;\n};\nexport function Trans({\n children,\n count,\n parent,\n i18nKey,\n context,\n tOptions = {},\n values,\n defaults,\n components,\n ns,\n i18n: i18nFromProps,\n t: tFromProps,\n shouldUnescape,\n ...additionalProps\n}) {\n const i18n = i18nFromProps || getI18n();\n if (!i18n) {\n warnOnce(i18n, 'NO_I18NEXT_INSTANCE', `Trans: You need to pass in an i18next instance using i18nextReactModule`, {\n i18nKey\n });\n return children;\n }\n const t = tFromProps || i18n.t.bind(i18n) || (k => k);\n const reactI18nextOptions = {\n ...getDefaults(),\n ...i18n.options?.react\n };\n let namespaces = ns || t.ns || i18n.options?.defaultNS;\n namespaces = isString(namespaces) ? [namespaces] : namespaces || ['translation'];\n const nodeAsString = nodesToString(children, reactI18nextOptions, i18n, i18nKey);\n const defaultValue = defaults || nodeAsString || reactI18nextOptions.transEmptyNodeValue || i18nKey;\n const {\n hashTransKey\n } = reactI18nextOptions;\n const key = i18nKey || (hashTransKey ? hashTransKey(nodeAsString || defaultValue) : nodeAsString || defaultValue);\n if (i18n.options?.interpolation?.defaultVariables) {\n values = values && Object.keys(values).length > 0 ? {\n ...values,\n ...i18n.options.interpolation.defaultVariables\n } : {\n ...i18n.options.interpolation.defaultVariables\n };\n }\n const interpolationOverride = values || count !== undefined && !i18n.options?.interpolation?.alwaysFormat || !children ? tOptions.interpolation : {\n interpolation: {\n ...tOptions.interpolation,\n prefix: '#$?',\n suffix: '?$#'\n }\n };\n const combinedTOpts = {\n ...tOptions,\n context: context || tOptions.context,\n count,\n ...values,\n ...interpolationOverride,\n defaultValue,\n ns: namespaces\n };\n const translation = key ? t(key, combinedTOpts) : defaultValue;\n const generatedComponents = generateComponents(components, translation, i18n, i18nKey);\n const content = renderNodes(generatedComponents || children, translation, i18n, reactI18nextOptions, combinedTOpts, shouldUnescape);\n const useAsParent = parent ?? reactI18nextOptions.defaultTransParent;\n return useAsParent ? createElement(useAsParent, additionalProps, content) : content;\n}","import { setDefaults } from './defaults.js';\nimport { setI18n } from './i18nInstance.js';\nexport const initReactI18next = {\n type: '3rdParty',\n init(instance) {\n setDefaults(instance.options.react);\n setI18n(instance);\n }\n};","import { createContext } from 'react';\nimport { getDefaults, setDefaults } from './defaults.js';\nimport { getI18n, setI18n } from './i18nInstance.js';\nimport { initReactI18next } from './initReactI18next.js';\nexport { getDefaults, setDefaults, getI18n, setI18n, initReactI18next };\nexport const I18nContext = createContext();\nexport class ReportNamespaces {\n constructor() {\n this.usedNamespaces = {};\n }\n addUsedNamespaces(namespaces) {\n namespaces.forEach(ns => {\n if (!this.usedNamespaces[ns]) this.usedNamespaces[ns] = true;\n });\n }\n getUsedNamespaces() {\n return Object.keys(this.usedNamespaces);\n }\n}\nexport const composeInitialProps = ForComponent => async ctx => {\n const componentsInitialProps = (await ForComponent.getInitialProps?.(ctx)) ?? {};\n const i18nInitialProps = getInitialProps();\n return {\n ...componentsInitialProps,\n ...i18nInitialProps\n };\n};\nexport const getInitialProps = () => {\n const i18n = getI18n();\n const namespaces = i18n.reportNamespaces?.getUsedNamespaces() ?? [];\n const ret = {};\n const initialI18nStore = {};\n i18n.languages.forEach(l => {\n initialI18nStore[l] = {};\n namespaces.forEach(ns => {\n initialI18nStore[l][ns] = i18n.getResourceBundle(l, ns) || {};\n });\n });\n ret.initialI18nStore = initialI18nStore;\n ret.initialLanguage = i18n.language;\n return ret;\n};","import { useContext } from 'react';\nimport { nodesToString, Trans as TransWithoutContext } from './TransWithoutContext.js';\nimport { getI18n, I18nContext } from './context.js';\nexport { nodesToString };\nexport function Trans({\n children,\n count,\n parent,\n i18nKey,\n context,\n tOptions = {},\n values,\n defaults,\n components,\n ns,\n i18n: i18nFromProps,\n t: tFromProps,\n shouldUnescape,\n ...additionalProps\n}) {\n const {\n i18n: i18nFromContext,\n defaultNS: defaultNSFromContext\n } = useContext(I18nContext) || {};\n const i18n = i18nFromProps || i18nFromContext || getI18n();\n const t = tFromProps || i18n?.t.bind(i18n);\n return TransWithoutContext({\n children,\n count,\n parent,\n i18nKey,\n context,\n tOptions,\n values,\n defaults,\n components,\n ns: ns || t?.ns || defaultNSFromContext || i18n?.options?.defaultNS,\n i18n,\n t: tFromProps,\n shouldUnescape,\n ...additionalProps\n });\n}","import { useState, useEffect, useContext, useRef, useCallback } from 'react';\nimport { getI18n, getDefaults, ReportNamespaces, I18nContext } from './context.js';\nimport { warnOnce, loadNamespaces, loadLanguages, hasLoadedNamespace, isString, isObject } from './utils.js';\nconst usePrevious = (value, ignore) => {\n const ref = useRef();\n useEffect(() => {\n ref.current = ignore ? ref.current : value;\n }, [value, ignore]);\n return ref.current;\n};\nconst alwaysNewT = (i18n, language, namespace, keyPrefix) => i18n.getFixedT(language, namespace, keyPrefix);\nconst useMemoizedT = (i18n, language, namespace, keyPrefix) => useCallback(alwaysNewT(i18n, language, namespace, keyPrefix), [i18n, language, namespace, keyPrefix]);\nexport const useTranslation = (ns, props = {}) => {\n const {\n i18n: i18nFromProps\n } = props;\n const {\n i18n: i18nFromContext,\n defaultNS: defaultNSFromContext\n } = useContext(I18nContext) || {};\n const i18n = i18nFromProps || i18nFromContext || getI18n();\n if (i18n && !i18n.reportNamespaces) i18n.reportNamespaces = new ReportNamespaces();\n if (!i18n) {\n warnOnce(i18n, 'NO_I18NEXT_INSTANCE', 'useTranslation: You will need to pass in an i18next instance by using initReactI18next');\n const notReadyT = (k, optsOrDefaultValue) => {\n if (isString(optsOrDefaultValue)) return optsOrDefaultValue;\n if (isObject(optsOrDefaultValue) && isString(optsOrDefaultValue.defaultValue)) return optsOrDefaultValue.defaultValue;\n return Array.isArray(k) ? k[k.length - 1] : k;\n };\n const retNotReady = [notReadyT, {}, false];\n retNotReady.t = notReadyT;\n retNotReady.i18n = {};\n retNotReady.ready = false;\n return retNotReady;\n }\n if (i18n.options.react?.wait) warnOnce(i18n, 'DEPRECATED_OPTION', 'useTranslation: It seems you are still using the old wait option, you may migrate to the new useSuspense behaviour.');\n const i18nOptions = {\n ...getDefaults(),\n ...i18n.options.react,\n ...props\n };\n const {\n useSuspense,\n keyPrefix\n } = i18nOptions;\n let namespaces = ns || defaultNSFromContext || i18n.options?.defaultNS;\n namespaces = isString(namespaces) ? [namespaces] : namespaces || ['translation'];\n i18n.reportNamespaces.addUsedNamespaces?.(namespaces);\n const ready = (i18n.isInitialized || i18n.initializedStoreOnce) && namespaces.every(n => hasLoadedNamespace(n, i18n, i18nOptions));\n const memoGetT = useMemoizedT(i18n, props.lng || null, i18nOptions.nsMode === 'fallback' ? namespaces : namespaces[0], keyPrefix);\n const getT = () => memoGetT;\n const getNewT = () => alwaysNewT(i18n, props.lng || null, i18nOptions.nsMode === 'fallback' ? namespaces : namespaces[0], keyPrefix);\n const [t, setT] = useState(getT);\n let joinedNS = namespaces.join();\n if (props.lng) joinedNS = `${props.lng}${joinedNS}`;\n const previousJoinedNS = usePrevious(joinedNS);\n const isMounted = useRef(true);\n useEffect(() => {\n const {\n bindI18n,\n bindI18nStore\n } = i18nOptions;\n isMounted.current = true;\n if (!ready && !useSuspense) {\n if (props.lng) {\n loadLanguages(i18n, props.lng, namespaces, () => {\n if (isMounted.current) setT(getNewT);\n });\n } else {\n loadNamespaces(i18n, namespaces, () => {\n if (isMounted.current) setT(getNewT);\n });\n }\n }\n if (ready && previousJoinedNS && previousJoinedNS !== joinedNS && isMounted.current) {\n setT(getNewT);\n }\n const boundReset = () => {\n if (isMounted.current) setT(getNewT);\n };\n if (bindI18n) i18n?.on(bindI18n, boundReset);\n if (bindI18nStore) i18n?.store.on(bindI18nStore, boundReset);\n return () => {\n isMounted.current = false;\n if (i18n) bindI18n?.split(' ').forEach(e => i18n.off(e, boundReset));\n if (bindI18nStore && i18n) bindI18nStore.split(' ').forEach(e => i18n.store.off(e, boundReset));\n };\n }, [i18n, joinedNS]);\n useEffect(() => {\n if (isMounted.current && ready) {\n setT(getT);\n }\n }, [i18n, keyPrefix, ready]);\n const ret = [t, i18n, ready];\n ret.t = t;\n ret.i18n = i18n;\n ret.ready = ready;\n if (ready) return ret;\n if (!ready && !useSuspense) return ret;\n throw new Promise(resolve => {\n if (props.lng) {\n loadLanguages(i18n, props.lng, namespaces, () => resolve());\n } else {\n loadNamespaces(i18n, namespaces, () => resolve());\n }\n });\n};","import { createElement, forwardRef as forwardRefReact } from 'react';\nimport { useTranslation } from './useTranslation.js';\nimport { getDisplayName } from './utils.js';\nexport const withTranslation = (ns, options = {}) => function Extend(WrappedComponent) {\n function I18nextWithTranslation({\n forwardedRef,\n ...rest\n }) {\n const [t, i18n, ready] = useTranslation(ns, {\n ...rest,\n keyPrefix: options.keyPrefix\n });\n const passDownProps = {\n ...rest,\n t,\n i18n,\n tReady: ready\n };\n if (options.withRef && forwardedRef) {\n passDownProps.ref = forwardedRef;\n } else if (!options.withRef && forwardedRef) {\n passDownProps.forwardedRef = forwardedRef;\n }\n return createElement(WrappedComponent, passDownProps);\n }\n I18nextWithTranslation.displayName = `withI18nextTranslation(${getDisplayName(WrappedComponent)})`;\n I18nextWithTranslation.WrappedComponent = WrappedComponent;\n const forwardRef = (props, ref) => createElement(I18nextWithTranslation, Object.assign({}, props, {\n forwardedRef: ref\n }));\n return options.withRef ? forwardRefReact(forwardRef) : I18nextWithTranslation;\n};","import { useTranslation } from './useTranslation.js';\nexport const Translation = ({\n ns,\n children,\n ...options\n}) => {\n const [t, i18n, ready] = useTranslation(ns, options);\n return children(t, {\n i18n,\n lng: i18n.language\n }, ready);\n};","import { createElement, useMemo } from 'react';\nimport { I18nContext } from './context.js';\nexport function I18nextProvider({\n i18n,\n defaultNS,\n children\n}) {\n const value = useMemo(() => ({\n i18n,\n defaultNS\n }), [i18n, defaultNS]);\n return createElement(I18nContext.Provider, {\n value\n }, children);\n}","import { useContext } from 'react';\nimport { getI18n, I18nContext } from './context.js';\nexport const useSSR = (initialI18nStore, initialLanguage, props = {}) => {\n const {\n i18n: i18nFromProps\n } = props;\n const {\n i18n: i18nFromContext\n } = useContext(I18nContext) || {};\n const i18n = i18nFromProps || i18nFromContext || getI18n();\n if (i18n.options?.isClone) return;\n if (initialI18nStore && !i18n.initializedStoreOnce) {\n i18n.services.resourceStore.data = initialI18nStore;\n i18n.options.ns = Object.values(initialI18nStore).reduce((mem, lngResources) => {\n Object.keys(lngResources).forEach(ns => {\n if (mem.indexOf(ns) < 0) mem.push(ns);\n });\n return mem;\n }, i18n.options.ns);\n i18n.initializedStoreOnce = true;\n i18n.isInitialized = true;\n }\n if (initialLanguage && !i18n.initializedLanguageOnce) {\n i18n.changeLanguage(initialLanguage);\n i18n.initializedLanguageOnce = true;\n }\n};","import { createElement } from 'react';\nimport { useSSR } from './useSSR.js';\nimport { composeInitialProps } from './context.js';\nimport { getDisplayName } from './utils.js';\nexport const withSSR = () => function Extend(WrappedComponent) {\n function I18nextWithSSR({\n initialI18nStore,\n initialLanguage,\n ...rest\n }) {\n useSSR(initialI18nStore, initialLanguage);\n return createElement(WrappedComponent, {\n ...rest\n });\n }\n I18nextWithSSR.getInitialProps = composeInitialProps(WrappedComponent);\n I18nextWithSSR.displayName = `withI18nextSSR(${getDisplayName(WrappedComponent)})`;\n I18nextWithSSR.WrappedComponent = WrappedComponent;\n return I18nextWithSSR;\n};","export { Trans } from './Trans.js';\nexport { Trans as TransWithoutContext } from './TransWithoutContext.js';\nexport { useTranslation } from './useTranslation.js';\nexport { withTranslation } from './withTranslation.js';\nexport { Translation } from './Translation.js';\nexport { I18nextProvider } from './I18nextProvider.js';\nexport { withSSR } from './withSSR.js';\nexport { useSSR } from './useSSR.js';\nexport { initReactI18next } from './initReactI18next.js';\nexport { setDefaults, getDefaults } from './defaults.js';\nexport { setI18n, getI18n } from './i18nInstance.js';\nexport { I18nContext, composeInitialProps, getInitialProps } from './context.js';\nexport const date = () => '';\nexport const time = () => '';\nexport const number = () => '';\nexport const select = () => '';\nexport const plural = () => '';\nexport const selectOrdinal = () => '';","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","__webpack_require__.amdO = {};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"static/js/\" + chunkId + \".\" + {\"91\":\"b40c1af0\",\"129\":\"3088da62\",\"153\":\"2f6a0db2\",\"271\":\"3e99ca13\",\"287\":\"810c57ea\",\"360\":\"e7f4d759\",\"365\":\"49e38dcf\",\"403\":\"d52ac15c\",\"466\":\"a8a76d91\",\"470\":\"b2dbf30a\",\"480\":\"4da861cb\",\"552\":\"12d70f6c\",\"668\":\"3b9e881f\",\"707\":\"0ddd3503\",\"740\":\"50089617\",\"783\":\"391eddef\",\"992\":\"2923af89\"}[chunkId] + \".chunk.js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"static/css/\" + chunkId + \".\" + {\"91\":\"c4bacc4b\",\"129\":\"357022ac\",\"153\":\"53bea60b\",\"271\":\"f648f594\",\"360\":\"774b0797\",\"365\":\"43adf12f\",\"403\":\"82618bc2\",\"466\":\"26729b35\",\"470\":\"81605775\",\"480\":\"178868d8\",\"552\":\"8ad95496\",\"668\":\"41f6a7c6\",\"707\":\"b3d15ae7\",\"740\":\"e9fa4b78\",\"783\":\"191abcee\",\"992\":\"c7333f1b\"}[chunkId] + \".chunk.css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var inProgress = {};\nvar dataWebpackPrefix = \"@ntg/core:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"./\";","if (typeof document === \"undefined\") return;\nvar createStylesheet = (chunkId, fullhref, oldTag, resolve, reject) => {\n\tvar linkTag = document.createElement(\"link\");\n\n\tlinkTag.rel = \"stylesheet\";\n\tlinkTag.type = \"text/css\";\n\tif (__webpack_require__.nc) {\n\t\tlinkTag.nonce = __webpack_require__.nc;\n\t}\n\tvar onLinkComplete = (event) => {\n\t\t// avoid mem leaks.\n\t\tlinkTag.onerror = linkTag.onload = null;\n\t\tif (event.type === 'load') {\n\t\t\tresolve();\n\t\t} else {\n\t\t\tvar errorType = event && event.type;\n\t\t\tvar realHref = event && event.target && event.target.href || fullhref;\n\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + errorType + \": \" + realHref + \")\");\n\t\t\terr.name = \"ChunkLoadError\";\n\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n\t\t\terr.type = errorType;\n\t\t\terr.request = realHref;\n\t\t\tif (linkTag.parentNode) linkTag.parentNode.removeChild(linkTag)\n\t\t\treject(err);\n\t\t}\n\t}\n\tlinkTag.onerror = linkTag.onload = onLinkComplete;\n\tlinkTag.href = fullhref;\n\n\n\tif (oldTag) {\n\t\toldTag.parentNode.insertBefore(linkTag, oldTag.nextSibling);\n\t} else {\n\t\tdocument.head.appendChild(linkTag);\n\t}\n\treturn linkTag;\n};\nvar findStylesheet = (href, fullhref) => {\n\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n\tfor(var i = 0; i < existingLinkTags.length; i++) {\n\t\tvar tag = existingLinkTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return tag;\n\t}\n\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n\tfor(var i = 0; i < existingStyleTags.length; i++) {\n\t\tvar tag = existingStyleTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\");\n\t\tif(dataHref === href || dataHref === fullhref) return tag;\n\t}\n};\nvar loadStylesheet = (chunkId) => {\n\treturn new Promise((resolve, reject) => {\n\t\tvar href = __webpack_require__.miniCssF(chunkId);\n\t\tvar fullhref = __webpack_require__.p + href;\n\t\tif(findStylesheet(href, fullhref)) return resolve();\n\t\tcreateStylesheet(chunkId, fullhref, null, resolve, reject);\n\t});\n}\n// object to store loaded CSS chunks\nvar installedCssChunks = {\n\t792: 0\n};\n\n__webpack_require__.f.miniCss = (chunkId, promises) => {\n\tvar cssChunks = {\"91\":1,\"129\":1,\"153\":1,\"271\":1,\"360\":1,\"365\":1,\"403\":1,\"466\":1,\"470\":1,\"480\":1,\"552\":1,\"668\":1,\"707\":1,\"740\":1,\"783\":1,\"992\":1};\n\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n\t\tpromises.push(installedCssChunks[chunkId] = loadStylesheet(chunkId).then(() => {\n\t\t\tinstalledCssChunks[chunkId] = 0;\n\t\t}, (e) => {\n\t\t\tdelete installedCssChunks[chunkId];\n\t\t\tthrow e;\n\t\t}));\n\t}\n};\n\n// no hmr\n\n// no prefetching\n\n// no preloaded","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t792: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunk_ntg_core\"] = self[\"webpackChunk_ntg_core\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(43212);\n"],"names":["FAKE_LOCATION","Object","freeze","channelId","duration","ISO8601_DURATION_ZERO","id","score","startDate","FAKE_SCHEDULED_EVENT_ITEM","locations","undefined","parentalGuidance","explanatoryText","minimumAge","FAKE_CHANNEL_ITEM","PAGE_DISPLAY_COUNT","MAX_Z_INDEX","SWIPE","CooldownTime","PageVelocityStep","LOCAL_PROVIDER_QUERY","Catchup","Est","Recording","Scheduledevent","Svod","Tvod","StandardSectionType","require","_ref","allowZeroProgress","children","className","data","hasPadding","heightKind","HeightKind","Large","isDisabled","isEmpty","isLoading","onClick","progress","theme","Theme","Dark","widthKind","WidthKind","isDebugModeEnabled","useSelector","state","appConfiguration","isButtonDown","setIsButtonDown","useState","isHovered","setIsHovered","mousePosition","setMousePosition","x","y","hoverLayerElt","useRef","showDebugInfo","useCallback","showDebug","props","propsFields","stateFields","handleButtonOnClick","event","altKey","ctrlKey","preventDefault","stopPropagation","handleMouseDown","handleMouseUp","handleMouseEnter","buttons","handleMouseLeave","handleMouseMove","current","clientX","clientY","left","top","getBoundingClientRect","background","useMemo","BUTTON_HOVER_COLORS","Cursor","Main","loaderElt","_jsx","InfiniteCircleLoader","disabledLayerElt","_jsxs","clsx","Content","onMouseDown","onMouseEnter","onMouseLeave","onMouseMove","onMouseUp","ref","style","ProgressBar","Stretched","Small","Medium","MAX_PERCENTAGE","CIRCUMFERENCE","Math","PI","renderPercentage","hidePercentage","min","onAnimationCompleted","timer","setTimer","percentage","setPercentage","useEffect","clearTimeout","setTimeout","viewBox","cx","cy","r","strokeDashoffset","xmlns","d","Fragment","React","ConfirmationModalResult","ConfirmationModalView","constructor","super","arguments","close","result","modal","this","handleButton1OnClick","Button1","handleButton2OnClick","Button2","renderQuestion","confirmationData","question","split","map","line","renderButtons","button1Title","button2Title","ButtonFX","render","index","header","icon","title","Modal","canCloseOnEnter","instance","connect","forwardRef","InitialState","closingData","isClosing","isClosingEnabled","Z_INDEX","ContentBase","OverlayBase","Shift","ModalView","handleCloseHotKey","cancel","handleOverlayOnMouseDown","isMouseDown","handleOverlayOnMouseUp","openModalCount","setState","handleCloseButtonOnClick","enableClosing","disableClosing","handleDialogOnMouseDown","handleBackButtonOnClick","backCallback","handleContentOnAnimationEnd","localHideModal","Messenger","emit","MessengerEvents","MODAL_CONFIRMATION_CLOSED","renderPicto","ModalIcon","None","Cart","PictoCart","Info","PictoInfo","Error","PictoFailure","Record","PictoRecord","User","PictoUser","renderIcon","pictoElt","componentDidMount","canCloseOnEscape","HotKeys","register","disableOthers","name","componentWillUnmount","unregister","canCloseOnOverlayClick","hasSeparator","isCloseButtonDisplayed","closeButton","PictoX","backButton","PictoArrowLeft","titleElement","shift","overlayStyle","zIndex","contentStyle","headerElement","onAnimationEnd","defaultProps","openModals","length","dispatch","hideModal","AUTHENTICATION_REQUIRED_MODAL","AVENUE_MODAL","CARD_MODAL","CONFIRMATION_MODAL","EXTERNAL_CONTENT_MODAL","KEYBOARD_SHORTCUTS_MODAL","LEGAL_NOTICE_MODAL","MESSAGE_MODAL","NEW_VERSION_MODAL","NPVR_HELP_MODAL","NPVR_MODAL","VOD_PURCHASE_MODAL","LabelWidth","MultipleChoices","handleLabelsOnResize","choices","labels","height","width","labelWidth","setProperty","updateSelectionBackground","selectedIndex","handleOnClick","currentTarget","dataset","indexStr","parseInt","value","onSelectionChanged","setting","toString","offsetWidth","offsetHeight","componentDidUpdate","prevProps","prevSelectedIndex","requestedLabelWidth","choice","text","ResizeDetectorWrapper","handleHeight","handleWidth","onResize","filterExternalSubtitles","subtitles","Map","forEach","subs","filterSubtitlesTrack","captions","format","language","mimeType","url","subtitlesCopy","getMimeType","subsForLanguage","get","pos","findIndex","s","subsOtherMimeType","SubtitlesMimeType","TTML","WebVTT","push","set","filteredSubs","lcFormat","toLowerCase","test","getStreamsFromPlaybackUrls","streamPriorities","playbackUrls","player","start","params","videostreams","find","p","allStreams","errorCode","VIDEOPLAYER_ERRORS","VS002StreamNotFound","args","streams","supportedTypes","getSupportedTypes","drmStreamFound","j","stream","drms","path","properties","type","isTypeSupported","includes","k","drmType","laUrl","ntgEntitlement","_laUrl$url","isDrmSupported","drm","VD002DrmNotSupportedError","VS001NoStreamSupported","sortStreams","getSupportedDrms","getSupportedTypesPerDrm","getVideoStreamDataFromChannel","channel","ptfResult","epgid","info","notFound","initData","urlContentType","playbacks","uri","service","getVideoStreamDataFromPlatformChannel","ptfErrorCode","ptfInitData","dmsResult","msdrmCustomData","isFastChannel","localUrl","DidomiWrapper","addFastChannelConsent","customData","getVideoStreamDataFromDmsChannel","dmsErrorCode","dmsInitData","priorities","default","a","videos","sort","b","c","bitrate","drmComparison","compareDrmsFromName","index1","index2","getHtmlMediaErrorText","code","isInvalidTokenError","error","CustomNetworkError","getCustomCode","BO_STREAM_DEVICE_NOT_FOUND","BO_INVALID_JWT_V2","BO_INVALID_APPLICATION_V2","BO_INVALID_SUBSCRIBER_V2","getInitDataAsSentryContext","audioLanguage","customHeaders","fairplayCertificateUrl","fairplayContentKeySystem","manifestUpdatePeriod","maxBitrate","subtitlesLanguage","trackingStart","vuDrmToken","JSON","stringify","ShakaStorage","Symbol","toStringTag","_ShakaStorage","storage","inProgress","getInstance","shaka","Storage","listContent","async","list","logError","message","exists","allContent","some","originalManifestUri","manifestUrl","loadContent","offlineUri","load","removeContent","remove","removeAllContent","Promise","all","_ref2","downloadContent","manifestUri","metadata","selectTracks","updateProgress","configure","offline","progressCallback","trackSelectionCallback","appMetadata","downloadTime","Date","now","downloadOp","store","promise","finally","delete","cancelDownload","abort","VideoPlayerMediaType","Audio","Subtitles","Video","VD001DrmGenericError","VP001MetadataLocationRequestError","VP002NtgEntitlementRequestError","VP003MetadataRecordingsRequestError","VP004NtgEntitlementNoSubscriptionError","VP005NtgEntitlementReleaseError","VS004StreamRequestPending","VS005StreamStopError","VS006ManifestError","VS994OfflineContentError","VS995SessionTimeOut","VS996StartupCancelled","VS997NoTrailerError","VS998InternalError","VS999StreamUnknownError","VIDEOPLAYER_NAME","VIDEOPLAYER_DEBUG","BufferFlushed","BufferLoaded","BufferStalled","NoKeepAlive","NotApplicable","StateEnded","StateInitializing","StatePaused","StatePlaying","UnknownMetric","HtmlMediaError","level","target","Unknown","Aborted","Network","Decode","SrcNotSupported","broadcastStatus","item","progressPct","BroadcastStatus","Live","endTime","startTime","getRealPercentage","getProgress","styles","transform","useResizeDetector","skipOnMount","refreshMode","refreshRate","refreshOptions","targetRef","observerOptions","skipResize","onResizeRef","callback","callbackRef","_a","_len","Array","_key","call","useCallbackRef","size","setSize","refProxy","refElement","setRefElement","Proxy","node","prop","useRefProxy","box","resizeCallback","entries","entry","dimensions","getDimensions","borderBoxSize","inlineSize","blockSize","contentBoxSize","contentRect","prevSize","shouldSetSize","nextSize","resizeHandler","patchResizeCallback","debounce","throttle","resizeObserver","window","ResizeObserver","observe","disconnect","_c","_b","assign","APPLICATION_ID","FranceChannel","Gaumont","MyVideofutur","Post","Premiere","Viva","ZeopTV","getAppCss","process","resolve","getAppLottieLoader","animationDataFrCh","animationDataGaumont","animationDataMyVF","animationDataPost","animationDataPremiere","animationDataViva","animationDataZeopTV","AppAppleStoreLogo","createAppAppleStoreLogo","storeLogoAppleFrCh","storeLogoAppleGaumont","storeLogoAppleMyVF","storeLogoApplePost","storeLogoApplePremiere","storeLogoAppleViva","storeLogoAppleZeopTV","AppGoogleStoreLogo","createAppGoogleStoreLogo","storeLogoGoogleFrCh","storeLogoGoogleGaumont","storeLogoGoogleMyVF","storeLogoGooglePost","storeLogoGooglePremiere","storeLogoGoogleViva","storeLogoGoogleZeopTV","AppFooterContent","createAppFooterContent","then","module","AppHasHeaderCloseButton","createAppHasHeaderCloseButton","AppHeaderLogo","createAppHeaderLogo","headerLogoFrCh","headerLogoGaumont","headerLogoMyVF","headerLogoPost","headerLogoPremiere","headerLogoViva","headerLogoZeopTV","AppMobileAppLogo","createAppMobileAppLogo","mobileAppLogoFrCh","mobileAppLogoGaumont","mobileAppLogoMyVF","mobileAppLogoPost","mobileAppLogoPremiere","mobileAppLogoViva","mobileAppLogoZeopTV","AppBackgroundImage","createAppBackgroundImage","backgroundImageGaumont","backgroundImageMyVF","backgroundImagePost","backgroundImagePremiere","backgroundImageViva","filterDuplicates","feed","duplicateChannels","channels","Set","selectedLocation","has","add","logWarning","join","reverse","splice","addMissingChannels","sectionChannels","missingChannels","i","location","getFirstLocation","logDebug","AccurateTimestamp","nowInSeconds","_channelId$replace","fakeItem","FAKE_EPG_LIVE_PREFIX","replace","fakeLocation","feedItem","buildFeedItem","getSectionChannels","section","channelsParameter","allChannels","deviceChannels","listAlias","listAliasChannelLists","allChannelIds","keys","getAllSectionChannels","model","channelsParameterName","slice","param","channelListOrListAlias","getValueForParameter","isArray","startsWith","parse","channelList","filter","isHidden","getBooleanSetting","settingName","_channel$consolidated","_channel$consolidated2","consolidated","getChannelImageId","_channel$consolidated3","_channel$consolidated4","imageId","getChannelRights","_channel$info$rights","_channel$info","rights","getChannelName","_channel$name","getChannelNumber","_channel$number","number","getChannelGroupId","_channel$info$channel","_channel$info2","channelGrId","getChannelListFromGroupId","channelGroupId","key","getChannelListFromTag","tag","tags","indexOf","getAllTags","allTags","getChannelMetrics","streamType","locationMetrics","_channel$info3","metrics","typeMetrics","m","metricsProperties","typeLocationMetrics","getChannelUrlLifecycle","_channel$data$urlLife","urlLifecycle","channelHasKeepFromReplay","channelHasStartover","channelHasTimeshift","channelIsRecordable","_DidomiWrapper","initialize","didomi","resetConsent","reset","manageConsent","preferences","show","getUserId","getCurrentUserStatus","user_id","getConsentString","consent_string","isVendorEnabled","vendor","vendors","enabled","isGtmEnabled","isMediametrieEnabled","u","URL","searchParams","_AccurateTimestamp","nowInternal","performance","timeOrigin","origin","trunc","MILLISECONDS_PER_SECOND","nowAsDate","nowAsIsoString","toISOString","startOfDayInSeconds","setHours","round","getTime","MONTH_KEYS","DAY_KEYS","MILLISECONDS_PER_MINUTE","MILLISECONDS_PER_HOUR","MILLISECONDS_PER_WEEK","SECONDS_PER_MINUTE","SECONDS_PER_HOUR","SECONDS_PER_DAY","MINUTES_PER_HOUR","HOURS_PER_DAY","DAYS_PER_MONTH","MONTHS_PER_YEAR","SECONDS_PER_WEEK","SECONDS_PER_MONTH","MIN_DATE","MIN_DATE_ISO","MAX_DATE_IN_SECONDS","MAX_DATE_ISO","LIVE_START_THRESHOLD","pad2","n","padStart","formatTime","getHours","getMinutes","formatTimeFromSeconds","t","buildSpecificDate","dDay","dDate","dMonth","time","Localizer","localize","date","day","month","formatDate","isNaN","formattedDate","formatDateInternal","itemDate","itemDateMidnight","itemTimeMidnight","getDate","getDay","getMonth","formattedTime","currentDate","currentDateMidnight","isToday","timeBeforeStart","timeBeforeStartMin","floor","timeBeforeStartH","timeBeforeStartM","hours","minutes","currentWeek","week","setDate","elapsed","elapsedMin","remainingMin","elapsedH","elapsedM","remainingH","remainingM","dYear","getFullYear","yearDiff","capitalizeFirstLetter","year","formatAvailabilityTimestamp","timestamp","formatExpirationTimestamp","expirationTime","Infinity","remainingTime","durationD","count","durationH","durationM","formatExpirationDate","iso8601Date","getIso8601DurationInSeconds","iso8601Duration","exec","reduce","sum","coef","formatIso8601Duration","formatDuration","durationInSeconds","durationS","abs","formatSecondsToHHMMSS","seconds","formattedDuration","getIso8601DateInSeconds","showGroup","label","fields","log","field","showItem","displayedValue","instanceFields","misc","showFinishingLivePrograms","itemCountPerPage","maxTime","maxItems","threshold","maxCount","items","remainingTimeStr","_channelId$lastIndexO","posInSection","page","ceil","lastIndexOf","substring","buildMissingParametersMessage","parameters","missingParameters","isUndefinedOrNull","buildMissingParametersError","logInfo","flattenNotificationMessage","flattenText","addPrefixIfDefined","child","getTimeRangesAsString","timeRanges","toFixed","end","getDurationDisplay","h","remainder","getDurationAsString","getTimestampDisplay","toLocaleTimeString","handleOnKeyDown","keyCode","shiftKey","hotKey","buildHotKey","listeners","isInEditableContext","handler","allowEditableContext","addEventListener","capture","_HotKeys","listHotKeys","listenerDescriptions","l","parts","toHumanReadable","normalizeHotkey","toUpperCase","keyName","KEY","modifiers","modifier","ALT","CTRL","SHIFT","alt","ctrl","Number","part","getKeyNameFromCode","options","unshift","tagName","A","ACCEPT","ADD","ANDROID_VIRTUAL_KEYBOARD_DEAD_KEY","B","BACK","BACK_QUOTE","BACK_SLASH","BACK_SPACE","BALANCE_LEFT","BALANCE_RIGHT","BASS_BOOST_DOWN","BASS_BOOST_UP","BLUE","BROWN","C","CANCEL","CAPS_LOCK","CHANNEL_DOWN","CHANNEL_UP","CLEAR","CLEAR_FAVORITE_0","CLEAR_FAVORITE_1","CLEAR_FAVORITE_2","CLEAR_FAVORITE_3","CLOSE_BRACKET","COMMA","CONTROL","CONVERT","D","DECIMAL","DELETE","DIMMER","DISPLAY_SWAP","DIVIDE","DOWN","E","EJECT_TOGGLE","END","ENTER","EQUALS","ESCAPE","F","F1","F10","F11","F12","F2","F3","F4","F5","F6","F7","F8","F9","FADER_FRONT","FADER_REAR","FAST_FWD","FINAL","G","GO_TO_END","GO_TO_START","GREEN","GREY","GUIDE","H","HELP","HOME","I","INFO","INSERT","J","K","KANA","KANJI","L","LEFT","LESS_THAN","M","MENU","META","MINUS","MODECHANGE","MULTIPLY","MUTE","N","NEXT","NONCONVERT","NUMPAD_0","NUMPAD_1","NUMPAD_2","NUMPAD_3","NUMPAD_4","NUMPAD_5","NUMPAD_6","NUMPAD_7","NUMPAD_8","NUMPAD_9","NUMPAD_MINUS","NUMPAD_PLUS","NUM_0","NUM_1","NUM_2","NUM_3","NUM_4","NUM_5","NUM_6","NUM_7","NUM_8","NUM_9","NUM_LOCK","O","OPEN_BRACKET","P","PAGE_DOWN","PAGE_UP","PAUSE","PERIOD","PINP_TOGGLE","PLAY","PLAY_PAUSE","PLAY_SPEED_DOWN","PLAY_SPEED_RESET","PLAY_SPEED_UP","PLUS","POWER","PREV","PRINTSCREEN","Q","QUOTE","R","RANDOM_TOGGLE","RECALL_FAVORITE_0","RECALL_FAVORITE_1","RECALL_FAVORITE_2","RECALL_FAVORITE_3","RECORD","RECORD_SPEED_NEXT","RED","REWIND","RIGHT","S","SCAN_CHANNELS_TOGGLE","SCREEN_MODE_NEXT","SCROLL_LOCK","SEMICOLON","SEPARATOR","SLASH","SPACE","SPLIT_SCREEN_TOGGLE","STOP","STORE_FAVORITE_0","STORE_FAVORITE_1","STORE_FAVORITE_2","STORE_FAVORITE_3","SUBTITLE","SUBTRACT","SURROUND_MODE_NEXT","T","TAB","TELETEXT","U","UNDEFINED","UP","V","VIDEO_MODE_NEXT","VOLUME_DOWN","VOLUME_UP","W","WINK","X","Y","YELLOW","Z","Drm","Fairplay","Playready","Widevine","DRM_KEY_SYSTEM","DRM_KEY_SYSTEMS","supportedDrms","getDrmName","Config","audioCapabilities","contentType","robustness","initDataTypes","videoCapabilities","getDrmPriority","compareDrms","drm1","drm2","priority1","priority2","cast","supportedDrm","getFirstSupportedDrm","StreamType","HLS","MP4","DASH","MSS","defaultEmeChecker","keySystem","navigator","requestMediaKeySystemAccess","requestMediaKey","webKitEmeChecker","WebKitMediaKeys","reject","msEmeChecker","MSMediaKeys","detectDrmInternal","checker","supportedSystems","promises","from","members","getKeySystemsFromDrm","allSettled","detectDrm","document","createElement","mediaKeys","systems","parseBoolean","parseFloat","defaultValue","parseInteger","f","isInteger","parseStringArray","delimiter","parseIntegerArray","SettledPromiseFulfilled","SettledPromiseRejected","fireAndForget","catch","wait","LoadableStatus","StorageKeys","CardExpandedItemIndex","CrmData","DataCollectionStash","DefaultSubtitlesApplied","DeviceIdentifier","LastBOTokenRenewal","LastPaymentExpirationNotification","LastStartup","LastTokenRenewal","LastViewingHistoryCleanUp","NextBOTokenRenewal","NextTokenRenewal","NextVersionCheckDate","OptimisticDefaultActions","OptimisticDmsSettings","OptimisticDmsSettingsUsed","OptimisticHub","OverriddenAppConf","PendingOperation","RegisteredAsGuest","SearchHistory","Settings","UserDeviceInfo","replacer","dataType","reviver","NaN","LocalStorageManager","clear","localStorage","removeItem","loadString","_localStorage$getItem","getItem","loadObject","str","loadBoolean","loadNumber","loadIsoDate","save","setItem","dailyShuffleArray","array","getRandomNumber","getRandomNumberGeneratorWithSeed","getBoundedValue","minValue","maxValue","max","getClosestEvenInteger","getIntegerPercentage","getRandomInteger","localMin","localMax","random","seed","decimalPlaces","EPSILON","roundDownTo","rounding","roundUpTo","modulo","getPriceAsFloat","price","getPriceAsInteger","padEnd","e","o","defineProperty","enumerable","prototype","hasOwnProperty","eStatTag","debugEnabled","err","console","debug","setDebug","isDebug","streaming","live","replay","timeshifting","optout","optin","exempted","logger","schema","serial","measure","levels","level_1","hitName","level_2","level_3","level_4","level_5","diffusion","streamName","streamURL","streamGenre","streamDuration","playerName","playerVersion","pluginName","pluginVersion","newLevels","newLevel_1","newLevel_2","newLevel_3","newLevel_4","newLevel_5","newLevel_6","newLevel_7","newLevel_8","newLevel_9","newLevel_10","newLevel_11","multiLevels","mediaInfo","mediaContentId","mediaDiffMode","mediaChannel","netMeasurement","firstParty","consentType","consentString","validateConfiguration","callbackPosition","probe","callbackState","buildConfiguration","defaultConfiguration","mergeConfiguration","argmap","contextInfos","buildParameters","cmsPO","cmsPS","cmsEV","callbackOffset","oft","buildURL","getInfos","localeCompare","collectUrl","encodeURIComponent","setCollectUrl","setSessionID","cmsVI","setSessionNumber","cmsRK","setOldPosition","cmsOP","getState","getType","getPosition","getLogObject","POLLING","eventType","position","cmsDU","casting","isCastingEnabled","sessionID","rank","STATE","g","timeout","status","started","notify","_","play","stop","stopPolling","startPolling","setStatus","configurationChange","setSessionManager","sessionManager","snooze","wakeup","sendPollingHit","setInterval","clearInterval","send","pollingBehavior","configuration","session","setPrototypeOf","__proto__","TypeError","String","create","apply","pause","v","playing","liveBehavior","probeHandle","w","replayBehavior","lastPos","lastCall","liveMode","hitname","banner","blog","email","link","search","social","isCasting","userDomain","implementation","hitFormatVersion","domain","encoding","screenColorDepth","screenHeigth","screenWidth","version","viewportHeigth","viewportWidth","generateParams","update","getDomain","getOriginIfAllowed","extractCampaignInformation","forgetCampaignInformation","setCast","setImplementation","setConsentType","characterSet","charset","screen","colorDepth","innerHeight","documentElement","clientHeight","body","innerWidth","clientWidth","getParentDomain","parent","referrer","match","getOrigin","decodeURIComponent","getOriginRedirected","extractFQDNFromGivenUrl","href","hostname","cookie","getURLParameter","source","support","RegExp","access","hitUrl","bind","thenCb","catchCb","_serial","_authURL","_DEFAULT_AUTH_URL","_hitURL","_DEFAULT_HIT_URL","parseResponse","authenticate","requestValue","FULL","updateConfiguration","authUrl","fallbackCollectUrl","XMLHttpRequest","open","DENIED","onload","responseText","ontimeout","onerror","RESTRICTED","src","sessionCount","previousPosition","hitReduction","hits","sessionId","hitURL","sendRemainingHits","sendInSession","terminate","terminated","sendHitReduced","firstHit","doSend","lastHit","clearHitReducer","conf","initAuth","auth","currentSession","isSessionStarted","snoozed","setHitInfo","contextInfosBuilder","updateBehaviour","behavior","disable","getConsentType","diffusionType","probeEnabled","changeBehaviour","confBuilder","orchestrator","valid","notifyPlayer","__esModule","isSeriesScheduledRecordingRunning","seriesScheduledRecording","description","toUtc","hasRunningSeriesScheduledRecording","seriesId","npvrScheduledRecordingsList","PlayerError","getHashFromDate","getCacheExpirationTime","maxAge","SubtitlesSize","Big","SubtitlesBGColor","Yellow","White","Setting","AutoOpenPlayerDebugPanel","AutoResume","AutoSelectAudioTrack","AutoSelectSubtitlesTrack","BufferBehind","BufferingGoal","GreenStreaming","LastAudioTrack","LastSubtitlesTrack","RebufferingGoal","Volume","AvenueType","isTabHidden","hidden","mozHidden","msHidden","webkitHidden","smoothScrollIntoView","container","element","same","lastPosTop","scrollTop","checkForScrollEnd","newPosTop","requestAnimationFrame","scrollIntoView","DEFAULT_MAX_BITRATE","SKIP_DURATION_LEVEL0","SKIP_DURATION_LEVEL1","SKIP_DURATION_LEVEL2","CARD_BACKGROUND_IMAGE_WIDTH","CARD_BACKGROUND_IMAGE_HEIGHT","CAROUSEL_BACKGROUND_IMAGE_WIDTH","CAROUSEL_BACKGROUND_IMAGE_HEIGHT","AVENUE_HEADER_WIDTH","AVENUE_HEADER_HEIGHT","HUB_IMAGE_WIDTH","HUB_IMAGE_HEIGHT","getComputedStyle","getCssNumber","getPropertyValue","getCssString","TV_TILE_WIDTH_PLUS_MARGIN","VOD_TILE_WIDTH","VOD_TILE_HEIGHT","VOD_TILE_WIDTH_PLUS_MARGIN","DEEPLINK_TILE_WIDTH_PLUS_MARGIN","DEEPLINK_3X1_TILE_WIDTH_PLUS_MARGIN","DEEPLINK_5X1_TILE_WIDTH_PLUS_MARGIN","LANDSCAPE_BIG_TILE_WIDTH_PLUS_MARGIN","LANDSCAPE_VOD_TILE_WIDTH_PLUS_MARGIN","NPVR_TV_TILE_WIDTH","NPVR_TV_TILE_HEIGHT","CHANNEL_GROUP_TILE_WIDTH","CHANNEL_GROUP_TILE_WIDTH_PLUS_MARGIN","CHANNEL_GROUP_BIG_TILE_WIDTH","CHANNEL_GROUP_BIG_TILE_WIDTH_PLUS_MARGIN","CHANNEL_IMAGE_WIDTH","CHANNEL_IMAGE_HEIGHT","CONFLICT_CHANNEL_IMAGE_WIDTH","CONFLICT_CHANNEL_IMAGE_HEIGHT","TILE_CHANNEL_IMAGE_WIDTH","TILE_CHANNEL_IMAGE_HEIGHT","TILE_CHANNEL_IMAGE_WIDTH_PLUS_MARGIN","AVENUE_IMAGE_WIDTH","AVENUE_IMAGE_HEIGHT","TILE_SYNOPSIS_LINE_HEIGHT","TILE_SYNOPSIS_TAGLINE_LINE_HEIGHT","BURGER_WIDTH","getTileWidthPlusMargin","tileType","TileConfigTileType","Channel","ChannelGroup","ChannelGroupBig","ChannelGroupBigFill","ChannelGroupFill","Deeplink","Deeplink3x1","Deeplink5x1","Gemtv","GemtvBig","GemtvMedium","Landscape","LandscapeBig","LandscapeVod","Portrait","EPG","ChannelChunkSize","FeedRange","IntervalCachedLiveFeed","IntervalLiveFeedEpgReady","IntervalLiveFeedEpgRefreshing","RewindPeriod","getDistributorId","vodLocations","purchaseInfo","programMetadata","_programMetadata$prov","_programMetadata$prov2","_programMetadata$prov3","_vodLocations$0$locat","_vodLocations$0$locat2","settings","distributorId","providerInfo","ExtendedItemType","FAKE_EPG_LIVE_ITEM_TYPE","ItemType","FakeItem","FAKE_LIVE_CHANNEL_ITEM_TYPE","FAKE_LIVE_CHANNEL_PREFIX","CAPTIONS","SUBTITLES","convertToHumanReadable","ucCode","LANGUAGE","OriginalVersion","VisuallyImpaired","VisuallyImpairedAlt","Intl","DisplayNames","of","isCaptionInArray","isHearingImpairedSubtitlesTrack","track","accessibility","accessibilityPurpose","kind","roles","isVisuallyImpairedAudioTrack","lang","ucLang","getAudioSettingCode","getSubtitlesSettingCode","getSubtitlesTrackFromCode","tracks","languageCode","isHearingImpaired","hearingImpairedFunc","requestedLanguageTracks","exactRequestedLanguage","closestRequestedLanguage","WebAppHelpersLocationStatus","App","Future","Past","Preview","Vod","getLocationStatus","authority","selectedProgramId","locationStatus","getBroadcastStatus","locType","NETGEM_API_V8_ITEM_LOCATION_TYPE_APP","NETGEM_API_V8_ITEM_LOCATION_TYPE_CATCHUP","NETGEM_API_V8_ITEM_LOCATION_TYPE_RECORDING","NETGEM_API_V8_ITEM_LOCATION_TYPE_EST","NETGEM_API_V8_ITEM_LOCATION_TYPE_SVOD","NETGEM_API_V8_ITEM_LOCATION_TYPE_TVOD","NETGEM_API_V8_ITEM_LOCATION_TYPE_VOD","getLocationStatusInternal","NETGEM_API_V8_AUTHENT_REALM_NETGEM","NETGEM_API_V8_ITEM_LOCATION_TYPE_SCHEDULEDEVENT","getStartAndEndTimes","getBroadcastStatusFromTimes","availabilityEndDate","availabilityStartDate","localNow","getAvailabilityStartTimeOrDefault","getAvailabilityEndTimeOrDefault","getLocationType","SynopsisType","addIfNotNull","elements","buildTitle","seriesMetadata","alwaysDisplaySeriesTitle","titleArray","addToTitleArrayIfNotNull","seriesTitle","titles","getTranslatedText","episodeIndex","episodeTitle","getEpisodeIndexAndTitle","renderProgramLanguage","locationMetadata","languageElements","formatAudioAndSubtitles","renderProgramParentalGuidance","dataPG","metadataPG","pgText","pg","renderProgramDetails","genres","productionCountry","releaseDate","genreText","values","details","addToDetailsIfNotNull","PROGRAM_INFO","Duration","METADATA_KIND_PROGRAM","renderProgramDuration","locationDuration","quotaUsed","scheduledEventDuration","programDuration","localDuration","recordedDuration","_Fragment","Genre","ProductionCountry","ReleaseDate","Language","ParentalGuidance","formatSeasonEpisodeNbr","textResult","episodeOf","episodeNumber","seasonNumber","hasLanguage","languages","_languages$some","propertiesArg","audio","audioAndSubs","visuallyImpairedElt","hearingImpairedElt","FR","_languages$some2","hasNotVFLanguage","audioDescription","ucLanguage","isVisuallyImpairedAudio","PictoVisuallyImpaired","sub","PictoHearingImpaired","getLocalizedString","langArray","fallbackValue","requestedType","_defaultText","baseLang","defaultText","Short","getSynopsisInternal","synopses","getTagline","getSynopsis","Full","getTitle","getTitleInternal","scheduledEventStartDate","localEndTime","localStartTime","DEFINITION_PRIORITY","Definition4K","DefinitionHD","DefinitionSD","Definition","FourK","HD","SD","DE","EN","Undetermined","Currency","Euro","getCurrencySymbol","currency","areArraysDifferent","a1","a2","concat","val","arr","areAvenuesDifferent","avenue1","avenue2","areHubsDifferent","hub1","hub2","arePurchaseListsByDistributorDifferent","l1","l2","keys1","keys2","item1","item2","lastBookmark","purchaseDate","arePurchasedItemsDifferent","arePurchaseListsDifferent","arePlayedItemsDifferent","playedItems1","playedItems2","areViewingHistoryItemsDifferent","rating","watchingstatus","areViewingHistoriesDifferent","playeditems","areFavoriteListsDifferent","SectionType","Carousel","Grid","HeroPanel","Regular","SectionDisplayType","Collapsed","Hidden","BOVodAssetStatus","Bought","Free","FreeButAvailableInFuture","Locked","Rented","Series","endDate","getDefinitionPriority","definition","MIN_SAFE_INTEGER","getTrailerInternal","trailerUrl","getTrailer","_seriesMetadata$trail","hasTrailer","hasProgramTrailer","hasSeriesTrailer","getVodKind","VodKind","EST","TVOD","SVOD","VOD","hasBeenPurchased","purchaseList","vtiId","otherVtiId","getPurchaseDetails","_purchaseListForDistr","purchaseListForDistributor","getVodStatusFromLocations","_vodLocations$","viewingHistoryId","newVtiId","newViewingHistoryId","availabilityTime","purchaseDetails","Purchase","Rent","getPrice","_priceOptions$find","priceOptions","comparePrices","option1","option2","amount","amount1","amount2","isBetterPriceOption","candidate","currentStart","candidateStart","promo","getCurrentOrNextPriceOption","_currentPriceOption","currentPriceOption","nextPriceOption","option","previewAvailabilityStartDate","previewTime","formatDisplayPrice","display","reCurrencyText","getDisplayPriceAndDefinition","vodLocation","euroPrice","availabilityStartTime","displayPrice","renderPurchaseSummary","purchaseType","discountPrice","updatedPrice","getPurchaseType","vodKind","Buy","getTimeLeftFromExpirationTime","extractDistributorId","deviceOS","_match$groups$distrib","_match$groups","groups","getTitIdFromProviderInfo","programProviderInfo","_seriesMetadata$provi","titId","at","getVodLocationFromVtiId","_vodLocations$find","loc","_loc$location$purchas","WishlistCache","_WishlistCache","ids","hashCode","checkGet","newWishlist","ordered","Loaded","newHashCode","PendingOperationKind","AddToFavorite","AddToWishlist","OpenCard","Play","PendingOperationReason","RequireAccount","RequireSubscription","storePendingOperation","cardData","getPendingOperation","clearPendingOperation","checkPendingOperation","pendingOperation","OPEN_CARD","updatePendingOperationType","newType","_pendingOperation$car","operationType","XhrResponseType","ArrayBuffer","Blob","Json","Text","Xml","getXhrResponseTypeFromString","responseType","_XhrResponseType$cast","handleFetchError","ok","statusText","response","headers","textError","json","fetchJsonWithErrorCheck","fetch","REDUX_MSG_APPLICATION_REGISTER","REDUX_MSG_APPLICATION_UNREGISTER","REDUX_MSG_ASSOCIATED_DEVICES_UPDATE","REDUX_MSG_SET_DEVICE_ID","REDUX_MSG_UPDATE_AUTHENTICATION_TOKEN","REDUX_MSG_USER_INFO_RESET","REDUX_MSG_USER_INFO_UPDATE","registerApplication","userInfo","asGuest","resetUserInfo","unregisterApplication","updateAuthenticationToken","authenticationToken","paymentSystemUrls","DidomiSDK","_ref$apiKey","apiKey","apiKeyProp","_ref$iabVersion","iabVersion","_ref$noticeId","noticeId","_ref$platform","platform","_ref$config","config","_ref$gdprAppliesGloba","gdprAppliesGlobally","gdprAppliesGloballyProp","onReady","onConsentChanged","onNoticeShown","onNoticeHidden","onNoticeBackdropclick","onNoticeClickAgree","onNoticeClickMoreInfo","onPreferencesClickAgreeToAll","onPreferencesClickDisagreeToAll","onPreferencesClickPurposeAgree","onPreferencesClickPurposeDisagree","onPreferencesClickViewVendors","onPreferencesClickSaveChoices","onPreferencesClickVendorAgree","onPreferencesClickVendorDisagree","onPreferencesClickVendorSaveChoices","_ref$sdkPath","sdkPath","_ref$embedTCFStub","embedTCFStub","init","loaderParams","app","getApiKey","didomiConfig","command","parameter","stub","returnValue","success","callId","postMessage","attachEvent","frames","firstChild","insertBefore","__cmpBuffer","cmpLoaded","__cmp","__cmpCall","__cmpReturn","__cmpLocator","spcloaderId","getElementById","loaderScript","firstScriptTagInDocument","getElementsByTagName","parentNode","didomiOnReady","didomiEventListeners","listener","consentToken","propTypes","PropTypes","searchInFeedRawItem","rawItem","rawItemId","stack","pop","itemId","rawChannelId","getLocationStartAndEndTime","itemType","getItemType","Program","buildUrlDefinition","locationEpgUrl","newParams","urlDef","currentParams","newParam","sendV8LocationEpgRequest","range","channelIds","signal","NetgemApiEmitter","netgemApi","createCustomNetworkErrorFromKey","authent","method","getChannelList","REDUX_MSG_REQUEST_GENERIC","generateApiUrl","EpgManager","getEpgChunk","abortController","results","throwIfAborted","feedMap","splitFeedByChannels","mapUnion","otherMap","cachedFeedTemp","ignoreIfAborted","startTimer","feedCachedTimer","refreshCachedFeed","cachedFeed","visibleChannels","startBase","setMinutes","setSeconds","isRefreshing","startIndex","getLiveFeed","hubItem","newFeed","filterLiveFeed","filterChannels","scoring","sortFeed","lastLiveFeed","findItem","matchingItem","buildFakeChannelsSection","handleShowFinishingLivePrograms","AbortController","feedLiveTimer","on","AUTHENTICATION_TOKEN_CHANGED","DEBUG_SHOW_FINISHING_LIVE_PROGRAMS","_EpgManager","_EpgManager$instance$","_EpgManager$instance","initializeCachedFeed","FeedProviderKind","validateSection","provider","Aggregation","sources","srcProvider","NtgVideo","Local","validateAvenue","avenue","sections","getValidHub","hub","sendV8HubRequest","hubKey","hubUrl","ui","hubETag","initialETag","optimisticHubResult","updateAvenueList","getSettingValueByName","eTag","cacheMaxAge","hubResult","hubMaxAge","sendV8DefaultHubRequest","skipCache","defaultHubUrl","optimisticDefaultActions","updateDefaultActions","actions","AVENUE_ID_EXPLORE","AVENUE_ID_MYVIDEOS","hasShaft","hasText","PictoArrowLeftWithShaft","forceHoverEffect","SearchHistoryTermView","handleSearchOnClick","term","handleDeleteOnClick","localDeleteSearchString","PictoReplay","searchString","deleteSearchHistoryTerm","SearchHistoryView","onSearchStringClick","searchHistory","SearchHistoryTerm","LocalFeed","Channels","ViewingHistory","Wishlist","SortKind","SortDirection","enableHotKeys","handleExitGridViewHotKey","disableHotKeys","getPageStepFromKeyboardModifiers","step","getValuesFromQueryString","parameterNames","fromEntries","getMatchingRecordingFeed","recordingsListFeed","seriesOrProgramId","recording","feedIndex","getTimestampFromRange","getViewingHistoryPromiseGenerator","getCatchupForAsset","getVodForAsset","queryAllChannels","queryType","getChannelIds","getCatchupForAssetRequest","assetId","errorResult","programId","getStatus","HttpStatus","NotFound","getWishlistPromiseGenerator","getEpgForAsset","q","queryTypeToLocationType","d1","d2","d3","compareDate","availabilityStartDate1","scheduledEventStartDate1","startDate1","availabilityStartDate2","scheduledEventStartDate2","startDate2","time1","time2","checkSources","authentRealm","sakName","isItemTypeMatching","expectedType","firstLocation","DefaultTileConfig","caption","channelLogo","contentImage","TileContentImageKind","hoverContent","imageLayout","TileImageLayout","onFocus","TileOnFocus","Details","completeIfNeeded","tileConfig","sectionId","contentImageVariant","completeTileConfig","program","TileConfig","ProgramTitle","ProgramSynopsis","Year","series","SeriesTitle","SeriesSynopsis","Selection","Other","endsWith","Cover","getTileConfig","widgetConfig","getTileTypeClass","getTileTextDescription","textDescription","descriptionByType","getSeriesCardUrlDefinition","onItemClick","defaultOnItemClick","localOnItemClick","seriesCardParam","prefix","action","NETGEM_API_V8_WIDGET_ITEM_CLICK_ACTION_CARD","TRANSPARENT_PIXEL","MetadataStatus","SHORT_DEEPLINK_TEMPLATE_PROGRAM","SHORT_DEEPLINK_TEMPLATE_SERIES","deepCopyViewingHistoryItem","episodes","episodesOriginal","playeditemsOriginal","clone","episode","locationId","playedItem","computeProgress","getMostRecentlyPlayedEpisode","mostRecentEp","ep","getHighestProgress","vodViewingHistoryId","_historyItem$percent","historyItem","percent","highestProgress","viewingHistory","isSeries","vodStatus","getVodProgress","getTVProgress","seriesProviderInfo","programHistory","seriesHistory","mostRecentEpisode","watchedEpisode","getTimeText","timeParts","durationText","getWatchingStatus","viewingHistoryStatus","ItemContent","VODOrDeeplink","_vodStatus$status","renderProgramTitle","programMetadataStatus","seriesMetadataStatus","programTitle","timeText","noInfoTextAllowed","Loading","renderSeriesTitle","ONE_HUNDRED","DEFAULT_GRANULARITY","WatchingStatusView","granularity","currentPercentage","adjustedProgress","transitionTimer","prevProgress","progressCircle","PictoPlay","renderDebugInfoElement","hasSingleScheduledRecording","hasSeriesScheduledRecording","recordingOutcomes","channelNumber","isDebugModePlusEnabled","matchingScheduledRecordings","recordOutcome","scheduledRecordingType","ScheduledRecordingsKind","Single","scheduledRecordingTypeElement","outcomeToString","outcome","debugContentElement","outcomes","sr","renderChannelImage","channelImageUrl","backgroundImage","renderWatchingStatus","vodLocationsMetadata","WatchingStatus","isInLiveSection","previewCatchupScheduledEventId","tvLocationMetadata","watchingStatus","npvr","npvrRecordingsFuture","npvrRecordingsList","renderRegularTileDecoration","scheduledEventId","localScheduledEventId","singleScheduledRecording","getRecordingOutcomes","associatedRecords","records","recordings","isLive","startMargin","rec","futureRecordings","isRecordOutcomeOK","RecordingOutcome","Recorded","seriesIconElement","NetgemSVOD","TV","PictoSeries","previewIconElement","PictoClock","hasBackground","liveRecordingIconElement","renderLiveRecordingIcon","recordingIconElement","renderRecordingIcon","scheduledRecordingIconElement","renderScheduledRecordingIcon","futureIconElement","TruncateState","leftPart","rightPart","ContextKind","minEpisodePrice","BuyPack","PricingVodView","locationsMetadata","sortedLocations","compareDefinitions","vodLocationMetadata","itemCount","countEpisodes","_elements$0$elements$","_elements$0$elements","getLocationId","_locations","_elements$0$elements$2","_elements$0$elements2","setPackPurchaseDetailsNew","_getFirstEpisodeLocat","_getFirstEpisodeLocat2","_locationsMetadata$fi","selectedPurchase","selectedPriceOption","purchase","priceOption","condition","packElements","getFirstEpisodeLocation","setPurchaseDetailsNew","selection","licenseDuration","buildPurchaseDetails","_vodLocationsMetadata","updatePurchaseDetails","isVodSeries","getMinEpisodePrice","minDisplayPrice","minPrice","MAX_SAFE_INTEGER","onBuyClick","packPurchaseDetails","onPurchaseClick","onRentClick","_purchaseDetails","location1","location2","info1","info2","def1","def2","getDisplayData","clickCallback","context","isTextOnly","localizationKey","VodEpisode","ButtonFXBicolor","Card","LandscapeTile","renderPackPurchaseButton","rentElement","isRentTextOnly","buyElement","isBuyTextOnly","prevLocationsMetadata","prevPurchaseInfo","lines","expiration","isPackPurchased","purchasedItems","packVtiId","rentAndBuyButtons","appRegistration","registration","RegistrationType","NpvrModalDialogResult","increasingEpisodesIndex","isSeriesMode","recordsToKeepIndex","NpvrModalView","handleRecordEpisode","dialogResult","RecordEpisode","handleDeleteEpisode","DeleteEpisode","handleRecordSeries","handleRecordSeriesInternal","handleStopSeries","StopSeries","handleIncreasingEpisodesOnSelectionChanged","produce","draft","increasingEpisodes","Boolean","handleRecordsToKeepOnSelectionChanged","recordsToKeep","renderHeader","npvrData","episodeTitleElement","isEpisodeDeletable","isEpisodeRecordable","isSeriesRecordable","episodeRecordBtn","episodeDeleteBtn","seriesRecordBtn","seriesStopBtn","renderRegularBody","RecordSeries","renderSeriesBody","increasingEpisodesChoices","recordsToKeepChoices","seriesRecordOptions","handleBackOnClick","renderBackPicto","renderChildren","isBackDisplayed","RecordingKind","RecordButtonActionKind","SCHEDULED_RECORDING_CHECK_TIMEOUT","SCHEDULED_RECORDING_MAX_CHECK_COUNT","isRecordingMatching","localStart","recordingDuration","recordingStart","searchProgramInRecordings","recordingList","failedRecordingId","warningScheduledEventId","warningScheduledRecordingId","hasRecording","scheduledRecordingInDanger","scheduledRecording","WillBeRecorded","getEpisodeAndSeriesRecordStatus","metadataSeriesId","correctOutcome","isRecordingFallback","hasScheduledRecording","getScheduledRecordingIdFromRecordingId","scheduledRecordingId","promptUser","recordItem","finishedOperationEventName","once","Cancel","npvrConfirmationClosedCallback","showNpvrModal","deleteSingle","stopSeries","recordSingle","recordSeries","catchupId","creationSettings","scheduledRecordKind","sendV8ScheduledRecordingCreateRequest","recordId","getRecordId","futureOutcome","keepFromReplayOutcome","liveOutcome","seriesOutcome","KeepFromReplay","checkKeepFromReplay","checkLiveRecording","checkFutureRecording","networkError","networkMsg","NOTIFY_ERROR","restartSeriesScheduledRecording","createSeriesScheduledRecording","fromUtc","getRoundedNowToISOString","recordingType","SeriesWithSingle","seriesScheduledRecordingId","updateSettings","startSeriesScheduledRecording","REFRESH_NPVR","checkCount","ServerError","showSingleRecordingError","sendV8RecordingsMetadataRequest","NOTIFY_SUCCESS","showKeepFromReplayError","getExistingRecordings","existingRecordings","isRecordingPresent","recordingOutcome","searchRecordingInExisting","existingValues","Rebroadcast","REFRESH_RECORDINGS_SECTION","checkSeriesRecordingOutcome","getFutureRecordings","isScheduledRecordingFuturePresent","scheduledRecordingOutcome","searchScheduledRecordingInFuture","futureValues","OutdatedEpisode","showSeriesRecordingError","deleteSingleConfirmationClosedCallback","showConfirmationModal","deleteFutureRecordings","isMatching","deleteExistingRecordings","recordingIds","successMessage","deleteRecording","futureRecording","scheduledRecordings","deleteScheduledRecording","stopSeriesConfirmationClosedCallback","liveRecordingIds","searchLiveRecording","record","recordingItem","typedRecordingItem","stopSeriesScheduledRecording","handleCleanUpOnClick","OPEN_NPVR_MANAGEMENT_SCREEN","OutOfQuota","futureDefaultMsg","ExceededConcurrency","NOTIFY_WARNING","liveErrorKey","NETGEM_API_V8_RIGHTS_PLAYBACK","getRequiredLocationRights","kindRights","getRequiredPlaybackRightsForLocationType","playbackRights","locationTypeRights","defaultRights","getRequiredRights","channelRights","requiredLocationRights","requiredChannelRights","requiredDefaultRights","isAccessGranted","requiredRights","userRights","rights1","rights2","getIntersectionRights","showMissingSubscription","commercialOffers","reason","matchingOffers","getMatchingCommercialOffers","right","_commercialOffers$rig","offer","WATCH_RIGHTS_CHANGE","SHOW_SUBSCRIBE","DisplayMode","actionType","isWaitingForDeleteConfirmation","isWaitingForRecordConfirmation","RecordButtonView","isRecordable","isChannelRecordable","hasChannelKeepFromReplay","refreshState","isNpvrEnabled","Delete","checkPendingRecording","isRegisteredAsGuest","targetId","operation","recordKind","startRecording","stopWaitingRecordConfirmation","recordFinishedEventName","stopWaitingDeleteConfirmation","deleteFinishedEventName","handleStartRecordingButtonOnClick","getPendingRecordKind","isPendingOperation","pendingRecordKind","cardDataUrlDefinition","isSubscriptionFeatureEnabled","localStartRecord","isRecordGranted","SHOW_SIGN_IN","urlDefinition","handleStopRecordingButtonOnClick","localStopRecord","localKind","renderStartRecordButton","recordKey","renderStopRecordButton","deleteKey","renderButton","renderStartRecordPicto","PictoRecordingStart","renderStopRecordPicto","isDisabledAggregated","PictoRecordingStop","prevSelectedProgramId","prevBroadcastStatus","prevLocation","prevNpvrRecordingsFuture","prevNpvrRecordingsList","prevNpvrScheduledRecordingsList","prevPreviewCatchupScheduledEventId","off","displayMode","Button","rightsCommercialOffers","rightsDefault","features","FEATURE_NPVR","isEnabled","FEATURE_SUBSCRIPTION","rightsUser","startRecord","stopRecord","isWishlistGrantedInternal","isWishlistGranted","_seriesMetadata$id","addToWishlistData","isFavoriteGranted","addToFavoriteData","getRecursiveChildText","joinedNodes","scrollOnMount","leftPct","setLeftPct","elementRef","isTruncated","setIsTruncated","scrollStop","setScrollStop","mountDelayTimerId","hoverTimerId","scrollingIntervalId","getWidths","displayedTextWidth","realTextWidth","availableWidth","_document$body","_document$body2","div","innerHTML","classList","appendChild","removeChild","measureTextWidth","translate","currentLeftPct","stopScrolling","startScrolling","widths","truncated","handleOnMouseEnter","handleOnMouseLeave","addToFavoriteList","mainDistributorId","getRequestDetails","BO_API_ADD_FAVORITE","requestDetails","REDUX_MSG_REQUEST_BO_FAVORITE_ADD","getFavoriteList","getItemLiveProgress","isPlaybackGranted","synopsis","textHeight","truncateState","Initializing","textHeightCache","ItemOverlayView","setIsReady","measureTextHeight","isTagLine","cachedHeight","localGetWatchingStatus","updateSynopsis","assetMetadata","_getTagline","isFavorite","favoriteList","wishlist","wishlistStatus","NETGEM_API_V8_AUTHENT_REALM_VIDEOFUTUR","_favoriteList$include","getTimeElement","getDetailsElement","toggleWishlist","toggler","toggleFavorite","handleTrailerButtonOnClick","OPEN_PLAYER","Trailer","handleAddToWishlistButtonOnClick","localAddToWishlist","localAddToFavoriteList","handleRemoveFromWishlistButtonOnClick","localRemoveFromWishlist","localRemoveFromFavoriteList","handlePlayButtonOnClick","_locationMetadata$loc","_locationMetadata$loc2","_locationMetadata$loc3","handleReplayButtonOnClick","startoverItem","vodPurchaseModalClosedCallback","playNow","handlePurchaseButtonOnClick","_vodLocationMetadata$","showVodPurchaseDialog","purchaseData","renderVodActions","pictoGem","playBtn","mainButton","renderPricingVod","renderTVActions","_tvLocationMetadata$l","RecordButton","RecordContext","Tile","_tvLocationMetadata$l2","buttonTextKey","Picto","handleSynopsisOnResize","availableHeight","wrapperHeight","requiredHeight","newTextHeight","newTruncateState","lineHeight","Truncated","NotTruncated","renderSynopsis","wrapperStyle","maxHeight","synopsisElt","_vodStatus$expiration","purchasable","PricingContext","RegularTile","PricingVod","renderHoverContentElements","subtitleElement","synopsisElement","programTitleElement","timeElement","detailsElement","TextScroller","font","renderUnknownProgram","renderIconBar","picto","prevProgramMetadata","prevProgramTitle","prevSeriesMetadata","prevTVLocationMetadata","prevVodLocationsMetadata","Universe","isVisible","fullHeartPicto","PictoHeartFull","emptyHeartPicto","PictoHeartEmpty","pictoWishlist","PictoTrailer","hoverContentElements","iconBar","defaultActions","playerStreamPriorities","addToWishlist","removeFromFavoriteList","removeFromWishlist","vodPurchaseData","showVodPurchaseModal","CastExclusionList","filterSections","every","excluded","filterCredits","credits","person","generateDeeplinkInternal","_itemId$split$pop","host","protocol","getVodDomain","generateLegacyDeeplink","_getDistributorId","generateVFDeeplink","generateNetgemVodDeeplink","generateNetgemTVDeeplink","generateShortDeeplink","deeplinkPattern","normalize","normalizeString","getId","getPurchaseInfoPerAsset","purchaseInfoPerAssetUrl","fixVtiIdType","getStartOverItem","requestResponse","firstItem","sendV8LocationCatchupForAssetRequest","locationCatchupForAssetUrl","backgroundImageDisplayIndex","channelName","imageUrls","isFocused","Item","resetTimeRefreshTimer","timeRefreshTimer","resetImageLoadTimer","imageLoadTimer","resetBroadcastStatusRefreshTimer","broadcastStatusRefreshTimer","startTimeRefreshTimer","updateTime","startBroadcastStatusRefreshTimer","updateBroadcastStatus","handleTokenUpdate","token","itemOverlay","getImageWidth","imageElement","imageWidth","getImageHeight","imageHeight","unfocus","getTileHoverContent","getTileCaption","loadChannelImage","loadImage","loadProgramMetadata","loadSeriesMetadata","loadStartoverItem","updateTitles","localGetImageUrl","channelImageId","luminosity","Luminosity","Light","localSendV8MetadataRequest","_programMetadata$epis","getItemContentType","loadTVLocationMetadata","METADATA_KIND_SERIES","forcedVariant","isNewAttempt","preloadedImage","Image","handleImageOnLoad","previousImageUrls","aborted","getImageUrl","loadPurchaseInfo","localGetPurchaseInfoPerAsset","loadVodLocations","localGetVodLocations","usePackPurchaseApi","localSendV8LocationCatchupForAssetRequest","isItemLiveOrAboutToStart","localSendV8MetadataLocationRequest","localSendV8RecordingsMetadataRequest","handleTileMouseOver","handleTileMouseLeave","handleTileOnClick","isInExploreModal","isSwiping","currentIsDebugModePlusEnabled","deeplink","generateDeeplink","imageUrl","ITEM_CLICKED","renderCaption","titleFilter","lcFilter","isFiltered","secondLineElt","renderSelectionTile","imageStyle","renderBackgroundImages","renderDetailsTile","isDebugModePlusForced","bgImageElements","onMouseOver","ItemDecoration","ItemOverlay","prevState","prevAuthenticationToken","prevItem","prevPurchaseList","prevContentType","getVodLocations","sendV8MetadataLocationRequest","sendV8MetadataRequest","PlaceholderItemView","availableSorts","Default","Chronological","getSortName","updateSortAndFilter","sortKind","setSortKind","sortDirection","setSortDirection","Ascendant","setFilter","direction","handleFilterOnChange","handleSortOnClick","getAttribute","Descendant","renderDirection","PictoArrowUp","PictoArrowDown","onChange","placeholder","delta","preventScrollOnSwipe","rotationAngle","trackMouse","trackTouch","swipeDuration","touchEventOptions","passive","initialState","first","initial","swiping","xy","mouseMove","mouseUp","rotateXYByAngle","angle","angleInRadians","cos","sin","getHandlers","handlerProps","onStart","isTouch","touches","onMove","onUp","onTouchStartOrOnMouseDown","timeStamp","deltaX","deltaY","absX","absY","velocity","sqrt","vxvy","dir","getDirection","eventData","onSwipeStart","onSwiping","cancelablePageSwipe","onSwiped","cancelable","onEnd","onSwipedDir","onTap","onTouchEndOrOnMouseUp","removeEventListener","attachTouch","el","cleanup","baseOptions","tls","output","addState","cleanUpTouch","useSwipeable","transientState","transientProps","previousProps","defaultKey","handlers","stateSetter","updateTransientState","getTVItem","ViewingHistoryCache","_ViewingHistoryCache","newViewingHistory","createSectionPagination","itemWidth","previousPageIndex","previousItemCountPerPage","maxPageIndex","pageIndex","sliderPositions","mostLeftItemIndex","desiredPageIndex","sendV8LocationEpgForAssetRequest","locationEpgForAssetUrl","sendV8LocationVodForAssetRequest","locationVodForAssetUrl","sendV8SectionFeedRequest","REDUX_MSG_REQUEST_SECTION_FEED","displayType","isCollapsed","isDebugModePlus","sortAndFilter","updateDimensionsNeeded","SectionView","componentDidUpdateFeedUpdate","avenueIndex","dataLoadedCallback","sectionIndex","prevAvenueIndex","prevHubItem","prevDisplayType","prevFeed","_feed$length","collapse","exitGridView","createPageList","updateIsCollapsed","gridSectionId","resetSwipeTimeout","swipeTimeout","setEmptySectionLoaded","setSectionLoaded","_feed$length2","updateLiveSection","newLiveFeed","liveFeedTimer","buildWishlistSection","localSendV8LocationEpgForAssetRequest","localSendV8LocationVodForAssetRequest","globalScoring","globalSlice","NotInitialized","promiseGenerator","feedArray","endIndex","sourceFeed","addToSourceFeed","_value$result","_value$result$feed","filteredFeed","filterFeed","setFeedScore","mergeFeeds","parseViewingHistory","playedItemIds","playedItemsMap","playedSeries","itemsToAdd","mostRecentlyPlayedEpisode","_itemsToAdd","locationType","locationTypeToQueryType","buildViewingHistoryFeedFromPromises","promiseCountByType","localCleanUpViewingHistory","searchedLocationTypes","noIdPlayedItemsMap","_value$result2","_value$result2$feed","validFeed","filterViewingHistoryFeed","buildViewingHistorySection","thresholdTime","buildRegularSection","isFirstCall","localSendV8SectionFeedRequest","isItemRecordingOrScheduledRecording","forceRefresh","loadData","aggregationModel","_result$groups$path","_result$groups","getLocalPath","channelsParam","sectionType","skipGridViewExit","isGridAvenue","goToPage","calculateItemCountPerPage","sectionItemWidth","slider","parentElement","HTMLElement","updateDimensions","checkSavedPageIndex","handleEnterGridViewButtonOnClick","enterGridView","handleExitGridViewButtonOnClick","handlePlaceholderSectionTitleOnClick","handleSectionTitleOnClick","isPlaceholder","handleNextButtonOnClick","goToNextPage","handlePrevButtonOnClick","goToPreviousPage","pageStep","skipIndexSave","localSavePageIndex","posX","SECTION_SLIDING_UPDATE","sectionPageIndices","savedPageIndex","handleOnTransitionEnd","handleSectionVisibilityChanged","handleWaypointEnter","handleWaypointLeave","handleOnSwiping","newPosX","handleOnSwiped","localUpdateGridSectionId","MOVE_TO_TOP","localResetGridSectionId","RESTORE_POSITION","onUpdateSortAndFilter","hide","renderPlaceholderSection","sectionTitle","tileTypeClass","tileCount","getPlaceholderItemCount","placeholderTiles","PlaceholderItem","Waypoint","fireOnRapidScroll","onEnter","onLeave","customSortFeed","sortedFeed","renderTiles","localFeed","indexEnd","tiles","prevButton","nextButton","sortAndFilterElt","SortAndFilter","gridViewButton","PictoArrowRight","paginationElt","sectionName","AVENUE_RESET","prevFavoriteList","prevGridSectionId","prevSearchString","prevViewingHistory","prevWishlist","prevIsCollapsed","prevItemCountPerPage","ButtonBack","Swipeable","onTransitionEnd","Section","npvrRecordingsListFeed","locationTypes","cleanUpViewingHistory","resetGridSectionId","updateSectionPageIndex","updateGridSectionId","CarouselSectionType","IMAGE_TAG_NO_TEXT","findLandscapeImageId","images","_image$id","image","img","EQUALIZER","AnimationSpeed","BarCount","MinValues","RangeValues","barHeights","EqualizerView","isMuted","startEqualizerAnimation","stopEqualizerAnimation","equalizerAnimationTimer","updateEqualizer","getEqualizerBarHeights","prevIsEnabled","prevIsMuted","bars","muteSign","x1","x2","y1","y2","Tippy","TIPPY_DEFAULT_OPTIONS","content","isTooltipShown","ItemIndexView","updateIndex","resetProgress","renderTitleElement","itemData","VIDEO_CAROUSEL_UPDATE_PROGRESS","currentIndex","prevCurrentIndex","_itemData$imageUrl","indexText","progressStyle","onHidden","onShown","indexElement","StatusPicto","startRefreshTimer","resetRefreshTimer","refreshTimer","forcedText","createItemFromChannel","isVodItem","isLiveRecording","ItemSlideView","handleDebugOnClick","checkRecordingState","_itemData$seriesMetad","isVod","handleItemClick","renderOverTitle","isClickable","handleChannelOnClick","channelItem","renderTitleInternal","translatedTitleText","seasonEpisodeText","renderTitle","renderActionPanel","playButton","moreInfoButton","itemIndex","_state$ui$purchaseLis","hubImageUrl","imageUrlList","isUIHidden","itemDataList","selectedItemIndices","trailerUrlList","SectionCarouselView","enabledHotKeys","handleFullscreenHotKey","handleMuteHotKey","handlePlayHotKey","disabledHotKeys","CAROUSEL_SHOW_DEBUG","VIDEO_CAROUSEL_TOGGLE_FULLSCREEN","toggleSound","videoCarousel","isPlaying","pauseVideo","playVideo","handleTrailerEnded","displayNextItem","VIDEO_CAROUSEL_STOP","resetUIHideTimer","refreshNpvr","CAROUSEL_HIDE","resetCarouselTimer","wasTrailerPlaying","isVideo","CAROUSEL_SHOW","displayItemIndex","resetBackgroundCarousel","IMAGE_CAROUSEL_SET","VIDEO_CAROUSEL_SET","loadHubImage","avenueImageUri","feedItemIds","shouldNpvrBeRefreshed","renderItemSlides","carouselIndex","ItemSlide","renderIndices","_itemDataList$feedInd","ItemIndex","handleItemIndexOnClick","updateItemData","partialState","getProgramMetadata","getSeriesMetadata","_seriesMetadata$image","imagesMetadata","getItemData","badItem","programMetadataPromise","seriesMetadataPromise","initializeItemList","availableItemCount","observeVideoVisibility","selectItemIndices","observer","sectionElement","IntersectionObserver","isIntersecting","displayedItemCount","loadItemsData","newItemDataList","checkTrailers","startImageCarousel","newSelectedItemIndices","trailer","startVideoCarousel","moveToFirstPage","CAROUSEL_SET_CURRENT_INDEX","startCarouselTimer","nextIndex","areIndicesDifferent","newTrailerUrlList","_itemDataList$index$i","startCarousel","carouselTimerId","startUIHideTimer","isMouseOverSection","uiHideTimerId","hideUI","thenRestart","showUI","onUIHiddenCallback","REDUCE_VIDEO_CAROUSEL_MASK","onUIShownCallback","ENLARGE_VIDEO_CAROUSEL_MASK","handleOnMouseMove","handlePreviousButtonOnClick","localUpdateVideoCarouselPlaying","localUpdateVideoCarouselPaused","handlePauseButtonOnClick","muteVideo","localUpdateVideoCarouselMuted","unmuteVideo","localUpdateVideoCarouselUnmuted","handleEqualizerButtonOnClick","handleFullscreenButtonOnClick","VIDEO_CAROUSEL_ENTER_FULLSCREEN","wrapPictoInTooltip","tooltipKeyContent","tooltipTheme","tooltipContentClass","tooltipContent","renderVideoIconBar","pauseBtn","PictoPause","playPauseBtn","fullscreenBtn","PictoFullscreen","equalizerBtn","Equalizer","VIDEO_CAROUSEL_ENDED","isInTheaterMode","prevIsInTheaterMode","prevImageUrlList","prevSelectedItemIndices","prevTrailerUrlList","unobserve","handleSectionMouseLeave","handleSectionMouseEnter","previousButton","pagination","hubImage","updateVideoCarouselMuted","updateVideoCarouselPaused","updateVideoCarouselPlaying","updateVideoCarouselUnmuted","SectionGridView","sortedChannels","c1","c2","itemWidthPlusMargin","checkGetPageStep","getSearchHistory","deleteTermInternal","history","trimmedTerm","trim","saveSearchString","avenueHeaderUri","avenueHeaderUrl","avenueImageUrl","avenueItemCount","emptyAvenueImageUrl","isLoadingSearchResults","isMyVideosEmptyVisible","isNoResultVisible","isSectionRenderingLimited","newSearchString","sectionElements","AvenueView","_this","resetFirstSectionsLoadTimer","firstSectionsLoadTimer","handleFocusSearchBoxHotKey","searchBox","focus","handleGoBackToFocusedAvenueHotKey","localGoBackToFocusedAvenue","getAvenue","avenueList","localHub","getAvenueImageAndHeaderUri","_avenueImageUri2","headerUri","imageUri","loadAvenue","_avenue$widgetConfig","layout","WidgetLayoutType","localSections","avenueVisibleSectionCountdown","loadedSectionCount","sectionItemCountMap","loadAvenueHeaderOrImage","loadAvenueHeader","loadAvenueImage","handleOnSearchChange","handleSearchStringOnClick","launchSearch","handleOnSearchKeyDown","localUpdateSearchString","trimmedSearchString","handleOnUIHiddenCallback","toggleSectionNextToCarousel","handleOnUIShownCallback","carouselSectionIndex","sectionMapRef","sectionItemCount","currentAvenueIndex","diff","increaseLoadedSectionCount","checkForEmptyAvenue","loadedCallback","Search","Myvideos","renderSectionElement","avenueId","_widgetConfig$layout","List","SectionCarousel","SectionChannelGroup","SectionChannelGrid","renderSectionElements","isSearching","renderedSectionCount","sectionView","forceLoadingRemainingSections","renderRemainingSectionElements","currentElements","renderNoResult","PictoSadFace","renderMyVideosEmptyContent","FEATURE_TV","FEATURE_VOD","loadEmptyAvenueImageUrl","_imageUrl$params","_imageUrl$uri","localGetImageUrlFromDefinition","isLoadingEmptyAvenueImageUrl","renderMyVideosEmpty","_avenue$widgetConfig2","onEmptyAvenue","instructions","localizedTitle","localizedInstructions","PictoNoContent","renderSearchElement","PictoMagnifier","onKeyDown","hasBackButton","prevAvenueList","prevHasBackButton","prevIndex","prevType","prevAvenue","prevIsSectionRenderingLimited","prevSections","_avenue$widgetConfig3","avenueHeader","avenueImage","_state$ui$focusedAven","_state$ui$focusedAven2","focusedAvenue","getImageUrlFromDefinition","goBackToFocusedAvenue","updateSearchString","ErrorBoundary","getDerivedStateFromError","componentDidCatch","componentName","errorCallback","isNotificationEnabled","errorName","FooterView","setFooterContent","FooterContent","versionShort","handleTopButtonOnClick","prevIsDebugModeEnabled","fallback","versionAppShort","securityInfoKey","securityInfoValue","renderSubscriptionPresentationButton","ExternalContentDisplayType","NewTab","rel","EmbeddedPopup","onClickHandler","showExternalContentModal","renderFreeTrialButton","hasButton","MenuItemView","getTotalWidth","itemElement","totalWidth","marginLeft","marginRight","focusedAvenueIndex","localUpdateFocusedAvenue","Explore","OPEN_EXPLORE_MODAL","MenuItem","NO_AVENUE_INDEX","updateFocusedAvenue","hiddenItems","visibleItems","NavigationMenuView","computeVisibleItemsWidth","itemMapRef","itemWidths","visibleItemsWidth","itemRef","hideItems","menuWidth","newHiddenItems","visibleItemsCopy","newVisibleItemsWidth","lastItemIndex","lastVisibleItem","showItemsIfNecessary","hiddenItemsCopy","hiddenItemCount","firstHiddenItemIndex","potentialNewWidth","newVisibleItems","firstHiddenItem","handleMenuOnResize","createItems","renderItems","renderBurgerIcon","SearchBox","onSearch","lastSearchTerm","isOpen","setIsOpen","setSearchString","inputRef","isClosed","useImperativeHandle","handleSearchHotKey","handleResetHotKey","searchTerm","handleOnChange","handleOnBlur","inputElt","onBlur","UserMenu","handleGlobalSettingsOnClick","OPEN_GLOBAL_SETTINGS","handleSignInOnClick","isScrolling","onLogoLoaded","useDispatch","isLogoLoaded","setIsLogoLoaded","headerClass","setHeaderClass","applicationName","mainAvenue","securityInfo","distributorAppKeys","applicationId","deviceKey","subscriberId","cacheKey","customerId","getBOSetting","identity","productId","device","appKey","buildSecurityInfo","subscriptionPresentationDisplay","subscriptionPresentationUrl","_state$appConfigurati","hasFreeTrialButton","freeTrialUrl","_state$appConfigurati2","subscribeWebUrl","logoLoadTimer","searchBoxRef","resetLogoLoadTimer","handleHeaderImageOnLoad","handleOpenSearchBoxHotKey","_searchBoxRef$current","getHeaderClass","handleHeaderImageOnClick","clipboard","writeText","logSecurityInfo","handleOnSearch","draggable","onLoad","ImageCarouselView","setImages","setCurrentIndex","SkipDirection","ControlLevel","eventToControlLevel","Level2","Level1","Level0","getSkippingTypeAndValue","Forward","SkippingKind","ForwardLevel0","BackwardLevel0","ForwardLevel1","BackwardLevel1","ForwardLevel2","BackwardLevel2","Backward","StopStreamKind","ProgramInfoLoadStatus","ResumeState","ContentType","DOUBLE_CLICK","BackwardSkipAreaThreshold","ForwardSkipAreaThreshold","MaxDuration","PLAYBACK_RATES","NORMAL_PLAYBACK_INDEX","ONE_THOUSAND","NO_ERROR_CODE","RESOLUTION","Height","Width","DataCollectionMessage","CurrentState","Navigation","PlayerState","TurnOff","TurnOn","DataCollectionStream","Timeshift","DataCollectionPlayerState","Pause","Start","Stop","DataCollectionHubCold","DataCollectionHubHot","KeepAliveState","ForbiddenError","InitializationError","TemporaryError","Terminated","Working","KeepAlive","heartbeatInterval","redirected","originalUrl","sendKeepAlive","_this$url","Forbidden","intervalId","OK","NoContent","sendTearDown","_this$url2","startRetry","kaType","MetricsStreamType","MetricsProperties","Desktop","Mobile","Stb","Tablet","SentryLevel","Warning","SentryTagName","Component","Session","SubscriberId","SentryTagValue","DataCollect","PaymentSystem","Player","Recorder","VodPurchase","Xhr","getShakaErrorCategoryAsText","category","getShakaErrorCodeAsText","ShakaErrors","OperationAborted","RequestedKeySystemConfigUnavailable","shouldErrorBeIgnored","sendColdDataRequest","sasDelay","dataCollectionColdUrl","sendDataRequest","sendHotDataRequest","dataCollectionHotUrl","apiKeyValue","sas","computeSas","buildHeaderList","HeaderName","Authorization","HeaderValue","ApplicationMicrosoftServiceBus","REDUX_MSG_REQUEST_DATA_COLLECTION","__spreadArray","to","pack","ar","BrowserInfo","os","NodeInfo","SearchBotDeviceInfo","bot","BotInfo","ReactNativeInfo","SEARCHBOT_OS_REGEX","userAgentRules","operatingSystemRules","detect","userAgent","parseUserAgent","product","matchUserAgent","ua","matched","browser","regex","uaMatch","matchedRule","versionParts","ii","createVersionParts","detectOS","searchBotMatch","getBrowserAndOS","detectBrowser","browserName","browserVersion","osName","osVersion","isRunningOnLocalhost","upgradeDeviceUrl","REDUX_MSG_REQUEST_DATA_COLLECTION_COLLECTOR_ID","collectorId","Collector","appVersion","realm","setCollectorId","userProperties","sendGetCollectorIdRequest","subscribe","subscribeToEvents","initializeBrowserAndOs","msgCurrentState","msgNavigation","msgPlayerState","msgTurnOff","msgTurnOn","onCurrentStateEvent","onNavigationEvent","onPlayerStateEvent","onTurnOffEvent","onTurnOnEvent","FLUSH_COLLECTOR","flushAll","STASH_COLLECTOR","stash","UNSTASH_COLLECTOR","unstash","msg","onEvent","hubType","messageType","serialNumber","enqueue","batchTimers","maxFlushDelay","flushDelay","maxFlushSize","flushSize","queue","typedQueue","Body","UserProperties","flush","resetBatchTimer","sendData","coldQueue","hotQueue","stashedQueue","coldHub","coldMaxFlushDelay","coldMaxFlushSize","coldSasDelay","hotHub","hotMaxFlushDelay","hotMaxFlushSize","hotSasDelay","sampling","samplingDelay","startDelay","_Collector","getPlayerStateSettings","GMC_PLAYBACK_STATE_NONE","MediaController","mediaSession","MediaMetadata","album","playbackState","setPlayingState","setPausedState","setTitles","artist","setImage","artwork","sizes","setPlayHandler","setActionHandler","setPauseHandler","setSeekBackwardHandler","setSeekForwardHandler","setPreviousTrackHandler","setNextTrackHandler","MediametrieDiffusion","Replay","Timeshifting","MediametrieState","MediametrieDiffusionMode","Aod","MediametrieStateEvent","addIfDefined","obj","callbackStateAsNumber","Mediametrie","forceOptOutConsent","destroy","contentStreamTag","addLevels","cmsS1","cmsS2","cmsS3","cmsS4","cmsS5","addNewLevels","ml1","ml10","ml11","ml2","ml3","ml4","ml5","ml6","ml7","ml8","ml9","setDuration","updateTimeshift","notifyStop","notifyPlay","notifyPause","chId","cmsGR","cmsSN","dom","miCh","msCh","msCid","msDm","cloneAudioTracks","cloneTextTracks","cloneVideoTracks","cloneAllTracks","video","handleCancelOnClick","selectDownloadTracks","maxBandwidth","bandwidth","firstTrack","Verimatrix","Case2LastIndex","CharCodeRadix","HexCharCodeLength","UuidLength","GLOBAL_OBJ","globalThis","dateTimestampInSeconds","timestampInSeconds","approxStartingTimeOrigin","createUnixTimestampInSecondsFunc","cachedTimeOrigin","browserPerformanceTimeOrigin","performanceNow","dateNow","timeOriginDelta","timeOriginIsReliable","navigationStart","timing","navigationStartDelta","getBrowserTimeOrigin","SDK_VERSION","getMainCarrier","getSentryCarrier","carrier","__SENTRY__","getGlobalSingleton","creator","objectToString","isError","wat","isInstanceOf","isBuiltin","isErrorEvent","isDOMError","isString","isParameterizedString","isPrimitive","isPlainObject","isEvent","Event","isThenable","base","_e","isVueViewModel","__isVue","_isVue","WINDOW","htmlTreeAsString","elem","currentElem","MAX_TRAVERSE_HEIGHT","out","len","separator","sepLength","nextStr","keyAttrs","maxStringLength","_htmlElementAsString","_oO","keyAttrPairs","keyAttr","keyAttrPair","classes","allowedAttrs","attr","getLocationHref","oO","getComponentName","DEBUG_BUILD","__SENTRY_DEBUG__","CONSOLE_LEVELS","originalConsoleMethods","consoleSandbox","wrappedFuncs","wrappedLevels","originalConsoleMethod","enable","truncate","safeJoin","input","isMatchingPattern","pattern","requireExactStringMatch","stringMatchesSomePattern","testString","fill","replacementFactory","original","wrapped","markFunctionWrapped","addNonEnumerableProperty","writable","configurable","o_O","proto","getOriginalFunction","func","__sentry_original__","convertToPlainObject","getOwnProperties","newObj","serializeEventTarget","CustomEvent","detail","Element","extractedProps","property","dropUndefinedKeys","inputValue","_dropUndefinedKeys","memoizationMap","memoVal","isPojo","uuid4","crypto","gbl","msCrypto","getCrypto","getRandomByte","randomUUID","getRandomValues","typedArray","Uint8Array","getFirstException","exception","getEventDescription","event_id","eventId","firstException","addExceptionTypeValue","addExceptionMechanism","newMechanism","currentMechanism","mechanism","handled","mergedData","checkOrSetAlreadyCaught","__sentry_captured__","isAlreadyCaptured","makeSession","startingTime","sid","errors","ignoreDuration","toJSON","did","abnormal_mechanism","attrs","release","environment","ip_address","ipAddress","user_agent","sessionToJSON","updateSession","user","username","generateTraceId","generateSpanId","merge","initialObj","mergeObj","SCOPE_SPAN_FIELD","_setSpanForScope","scope","span","_getSpanForScope","Scope","_notifyingListeners","_scopeListeners","_eventProcessors","_breadcrumbs","_attachments","_user","_tags","_extra","_contexts","_sdkProcessingMetadata","_propagationContext","traceId","sampleRand","newScope","flags","_level","_session","_transactionName","_fingerprint","_client","_lastEventId","setClient","client","setLastEventId","lastEventId","getClient","addScopeListener","addEventProcessor","setUser","_notifyScopeListeners","getUser","setTags","setTag","setExtras","extras","setExtra","extra","setFingerprint","fingerprint","setLevel","setTransactionName","setContext","setSession","getSession","captureContext","scopeToMerge","scopeInstance","getScopeData","contexts","propagationContext","setPropagationContext","addBreadcrumb","breadcrumb","maxBreadcrumbs","maxCrumbs","mergedBreadcrumb","recordDroppedEvent","getLastBreadcrumb","clearBreadcrumbs","addAttachment","attachment","clearAttachments","breadcrumbs","attachments","eventProcessors","sdkProcessingMetadata","transactionName","setSDKProcessingMetadata","newData","getPropagationContext","captureException","hint","warn","syntheticException","originalException","captureMessage","captureEvent","AsyncContextStack","isolationScope","assignedScope","assignedIsolationScope","_stack","_isolationScope","withScope","_pushScope","maybePromiseResult","_popScope","res","getStackTop","getScope","getIsolationScope","getAsyncContextStack","sentry","withSetScope","withIsolationScope","getAsyncContextStrategy","acs","withSetIsolationScope","getCurrentScope","rest","getTraceContextFromScope","parentSpanId","propagationSpanId","traceContext","trace_id","span_id","parent_span_id","SEMANTIC_ATTRIBUTE_SENTRY_SOURCE","SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE","SEMANTIC_ATTRIBUTE_SENTRY_OP","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON","SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT","SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE","SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME","SEMANTIC_ATTRIBUTE_PROFILE_ID","SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME","SEMANTIC_LINK_ATTRIBUTE_LINK_TYPE","setHttpStatus","httpStatus","setAttribute","spanStatus","getSpanStatusFromHttpCode","SCOPE_ON_START_SPAN_FIELD","ISOLATION_SCOPE_ON_START_SPAN_FIELD","getCapturedScopesOnSpan","parseSampleRate","sampleRate","rate","SENTRY_BAGGAGE_KEY_PREFIX","SENTRY_BAGGAGE_KEY_PREFIX_REGEX","baggageHeaderToDynamicSamplingContext","baggageHeader","baggageObject","acc","curr","currBaggageObject","baggageHeaderToObject","_ref3","parseBaggageHeader","dynamicSamplingContext","dynamicSamplingContextToSentryBaggageHeader","object","_ref5","objectKey","objectValue","baggageEntry","newBaggageHeader","objectToBaggageHeader","dscKey","dscValue","keyOrValue","_ref4","TRACEPARENT_REGEXP","propagationContextFromHeaders","sentryTrace","baggage","traceparentData","traceparent","matches","parentSampled","extractTraceparentData","dsc","parsedSampleRand","sample_rand","parsedSampleRate","sample_rate","getSampleRandFromTraceparentAndDsc","sampled","generateSentryTraceHeader","spanId","sampledString","hasShownSpanDropWarning","spanToTransactionTraceContext","spanContext","op","links","spanToJSON","spanToTraceContext","isRemote","convertSpanLinksForEnvelope","traceFlags","restContext","attributes","spanTimeInputToSeconds","ensureTimestampInSeconds","getSpanJSON","spanIsSentrySpan","castSpan","spanIsOpenTelemetrySdkTraceBaseSpan","start_timestamp","getStatusMessage","spanIsSampled","CHILD_SPANS_FIELD","ROOT_SPAN_FIELD","addChildSpanToSpan","childSpan","rootSpan","getSpanDescendants","resultSet","addSpanChildren","childSpans","getRootSpan","getActiveSpan","showSpanDropWarning","timedEventsToMeasurements","events","measurements","unit","parseStringToURL","canParse","parseUrl","query","fragment","hash","relative","stripUrlQueryAndFragment","urlPath","UNKNOWN_FUNCTION","WEBPACK_ERROR_REGEXP","STRIP_FRAME_REGEXP","createStackParser","parsers","sortedParsers","skipFirstLines","framesToPop","cleanedLine","parser","frame","localStack","getLastStackFrame","function","filename","stripSentryFramesAndReverse","defaultFunctionName","getFunctionName","fn","getFramesFromEvent","stacktrace","bindReporter","metric","thresholds","reportAllChanges","prevValue","forceReport","getRating","getNavigationEntry","checkResponseStart","navigationEntry","getEntriesByType","responseStart","getActivationStart","navEntry","activationStart","initMetric","navigationType","prerendering","wasDiscarded","opts","PerformanceObserver","supportedEntryTypes","po","getEntries","buffered","cb","onHiddenOrPageHide","visibilityState","runOnce","called","firstHiddenTime","onVisibilityUpdate","removeChangeListeners","getVisibilityWatcher","whenActivated","FCPThresholds","CLSThresholds","onCLS","onReport","visibilityWatcher","report","onFCP","sessionValue","sessionEntries","handleEntries","hadRecentInput","firstSessionEntry","lastSessionEntry","takeRecords","FIDThresholds","interactionCountEstimate","minKnownInteractionId","maxKnownInteractionId","updateEstimate","interactionId","initInteractionCountPolyfill","durationThreshold","longestInteractionList","longestInteractionMap","getInteractionCountForNavigation","interactionCount","entryPreProcessingCallbacks","processInteractionEntry","entryType","minLongestInteraction","existingInteraction","latency","interaction","whenIdle","rIC","requestIdleCallback","handle","INPThresholds","onINP","PerformanceEventTiming","inp","estimateP98LongestInteraction","candidateInteractionIndex","LCPThresholds","reportedMetricIDs","TTFBThresholds","whenReady","readyState","instrumented","_previousCls","_previousFid","_previousLcp","_previousTtfb","_previousInp","addClsInstrumentationHandler","addMetricObserver","instrumentCls","addPerformanceInstrumentationHandler","addHandler","triggerHandlers","instrumentPerformanceObserver","getCleanupCallback","typeHandlers","instrumentFid","handleEntry","processingStart","onFID","instrumentLcp","stopListening","onLCP","instrumentTtfb","onTTFB","instrumentInp","instrumentFn","previousValue","stopOnCallback","hasSpansEnabled","maybeOptions","__SENTRY_TRACING__","getOptions","tracesSampleRate","tracesSampler","DEFAULT_ENVIRONMENT","FROZEN_DSC_FIELD","freezeDscOnSpan","getDynamicSamplingContextFromClient","publicKey","public_key","getDsn","getDynamicSamplingContextFromScope","getDynamicSamplingContextFromSpan","rootSpanJson","rootSpanAttributes","traceState","rootSpanSampleRate","applyLocalSampleRateToDsc","frozenDsc","traceStateDsc","dscOnTraceState","transaction","SentryNonRecordingSpan","_traceId","_spanId","_timestamp","_value","setAttributes","_values","_status","updateName","_name","isRecording","addEvent","_attributesOrStartTime","_startTime","addLink","_link","addLinks","_links","recordException","_exception","_time","DSN_REGEX","dsnToString","dsn","withPassword","pass","port","projectId","dsnFromComponents","components","makeDsn","lastPath","projectMatch","dsnFromString","component","isValidProtocol","validateDsn","depth","maxProperties","visit","ERROR","normalizeToSize","maxSize","normalized","encodeURI","utf8Length","memo","inner","WeakSet","memoize","unmemoize","memoBuilder","isFinite","stringified","_events","global","objName","getPrototypeOf","getConstructorName","stringifyValue","remainingDepth","valueWithToJSON","numAdded","visitable","visitKey","visitValue","createEnvelope","addItemToEnvelope","envelope","newItem","forEachEnvelopeItem","envelopeItems","envelopeItem","encodeUTF8","encodePolyfill","TextEncoder","encode","serializeEnvelope","envHeaders","append","next","itemHeaders","payload","stringifiedPayload","buffers","totalLength","buf","merged","offset","buffer","concatBuffers","createSpanEnvelopeItem","spanJson","createAttachmentEnvelopeItem","content_type","attachment_type","attachmentType","ITEM_TYPE_TO_DATA_CATEGORY_MAP","sessions","client_report","user_report","profile","profile_chunk","replay_event","replay_recording","check_in","feedback","raw_security","otel_log","envelopeItemTypeToDataCategory","getSdkMetadataForEnvelopeHeader","metadataOrEvent","sdk","createEventEnvelope","tunnel","sdkInfo","integrations","packages","enhanceEventWithSdkInfo","envelopeHeaders","sent_at","trace","createEventEnvelopeHeaders","SentrySpan","startTimestamp","_attributes","_parentSpanId","_sampled","endTimestamp","_endTime","_isStandaloneSpan","isStandalone","_onSpanEnded","updateStartTime","timeInput","logSpanEnd","profile_id","exclusive_time","is_segment","segment_id","attributesOrStartTime","isSpanTimeInput","isStandaloneSpan","spanItems","sendEnvelope","sendSpanEnvelope","spans","dscHasRequiredProps","beforeSendSpan","convertToSpanJSON","createSpanEnvelope","transactionEvent","_convertSpanToTransaction","isFullFinishedSpan","capturedSpanScope","capturedSpanIsolationScope","transaction_info","SUPPRESS_TRACING_KEY","startInactiveSpan","getAcs","spanArguments","parseSentrySpanArguments","forceTransaction","parentSpan","customParentSpan","wrapper","withActiveSpan","getParentSpan","onlyIfParent","createChildOrRootSpan","_startChildSpan","_startRootSpan","isRootSpan","infoParts","logSpanStart","setCapturedScopesOnSpan","initialCtx","experimental","standalone","ctx","currentPropagationContext","localSampleRateWasApplied","samplingContext","inheritOrSampleWith","fallbackSampleRate","parentSampleRate","shouldSample","sampleSpan","parentSpanIsAlwaysRootSpan","isMeasurementValue","startAndEndSpan","startTimeInSeconds","parentStartTime","startStandaloneWebVitalSpan","passedAttributes","sendDefaultPii","getIntegrationByName","replayId","getReplayId","userDisplay","profileId","replay_id","getBrowserPerformanceAPI","msToSec","extractNetworkProtocol","nextHopProtocol","char","trackClsAsStandaloneSpan","standaloneClsEntry","pageloadSpanId","standaloneCLsValue","supportsLayoutShift","sentSpan","_collectClsOnce","clsValue","routeName","sendStandaloneClsSpan","cleanupClsHandler","unsubscribeStartNavigation","activeSpan","_lcpEntry","_clsEntry","_performanceCursor","_measurements","startTrackingWebVitals","recordClsStandaloneSpans","mark","fidCleanupCallback","addFidInstrumentationHandler","_ref6","lcpCleanupCallback","addLcpInstrumentationHandler","ttfbCleanupCallback","addTtfbInstrumentationHandler","_ref7","clsCleanupCallback","addPerformanceEntries","performanceEntries","transactionStartTime","_addPerformanceNavigationTiming","requestStartTimestamp","requestStart","responseEndTimestamp","responseEnd","responseStartTimestamp","_addRequest","_addNavigationSpans","requestTime","measureStartTimestamp","startTimeStamp","measureEndTimestamp","_addMeasureSpans","firstHidden","shouldRecord","resourceUrl","initiatorType","parsedUrl","setResourceEntrySizeData","deliveryType","renderBlockingStatus","_addResourceSpans","connection","effectiveType","rtt","deviceMemory","hardwareConcurrency","_trackNavigator","_addTtfbRequestTimeToMeasurements","fidMark","recordClsOnPageloadSpan","cls","_ref8","measurementName","measurement","setMeasurement","loadTime","renderTime","_setWebVitalAttributes","eventEnd","_getEndPropertyNameForNavigationTiming","dataKey","entryVal","LAST_INTERACTIONS","INTERACTIONS_SPAN_MAP","startTrackingINP","inpCallback","addInpInstrumentationHandler","INP_ENTRY_MAP","interactionType","spanToUse","click","pointerdown","pointerup","mousedown","mouseup","touchstart","touchend","mouseover","mouseout","mouseenter","mouseleave","pointerover","pointerout","pointerenter","pointerleave","dragstart","dragend","drag","dragenter","dragleave","dragover","drop","keydown","keyup","keypress","maybeInstrument","supportsFetch","Headers","Request","Response","isNativeFunction","lastHref","addHistoryInstrumentationHandler","instrumentHistory","historyReplacementFunction","originalHistoryFunction","TRACING_DEFAULTS","idleTimeout","finalTimeout","childSpanTimeout","startIdleSpan","startSpanOptions","activities","_idleTimeoutID","_finished","_finishReason","_autoFinishAllowed","disableAutoFinish","_cleanupHooks","beforeSpanEnd","previousActiveSpan","_startIdleSpan","_cancelIdleTimeout","_restartIdleTimeout","_restartChildSpanTimeout","onIdleSpanEnded","spanJSON","discardedSpans","childSpanJSON","childEndTimestamp","childStartTimestamp","spanStartedBeforeIdleSpanEnd","spanEndedBeforeFinalTimeout","stringifiedSpan","removeChildSpanFromSpan","thisArg","definedEndTimestamp","spanEndTimestamp","Reflect","childEndTimestamps","latestSpanEndTimestamp","spanStartTimestamp","startedSpan","endedSpan","spanToAllowAutoFinish","_oldOnErrorHandler","addGlobalErrorInstrumentationHandler","instrumentError","column","__SENTRY_INSTRUMENTED__","_oldOnUnhandledRejectionHandler","addGlobalUnhandledRejectionInstrumentationHandler","instrumentUnhandledRejection","onunhandledrejection","errorsInstrumented","States","resolvedSyncPromise","SyncPromise","rejectedSyncPromise","executor","_state","PENDING","_handlers","_runExecutor","onfulfilled","onrejected","_executeHandlers","onfinally","isRejected","cachedHandlers","RESOLVED","REJECTED","setResult","notifyEventProcessors","processors","processor","final","parsedStackResults","lastKeysCount","cachedFilenameDebugIds","getFilenameToDebugIdMap","stackParser","debugIdMap","_sentryDebugIds","debugIdKeys","stackKey","parsedStack","stackFrame","debugId","applyScopeDataToEvent","applyDataToEvent","applySpanToEvent","applyFingerprintToEvent","mergedBreadcrumbs","applyBreadcrumbsToEvent","applySdkMetadataToEvent","mergeScopeData","mergeData","mergeAndOverwriteScopeData","mergeVal","prepareEvent","normalizeDepth","normalizeMaxBreadth","prepared","dist","maxValueLength","request","applyClientOptions","integrationNames","applyIntegrationsMetadata","filenameDebugIdMap","debug_id","applyDebugIds","finalScope","getFinalScope","clientEventProcessors","getEventProcessors","evt","abs_path","debug_meta","code_file","applyDebugMeta","maxBreadth","normalizeEvent","parseEventHintOrCaptureContext","hintIsScopeOrFunction","captureContextKeys","hintIsScopeContext","startSession","currentScope","endSession","closeSession","_sendSessionUpdate","captureSession","ignoreOnError","shouldIgnoreOnError","wrap","isFunction","__sentry_wrapped__","sentryWrapped","wrappedArguments","arg","ex","getOwnPropertyDescriptor","SENTRY_XHR_DATA_KEY","addXhrInstrumentationHandler","instrumentXHR","xhrproto","originalOpen","xhrOpenThisArg","xhrOpenArgArray","virtualError","request_headers","__sentry_own_request__","onreadystatechangeHandler","xhrInfo","status_code","xhr","onreadystatechange","originalOnreadystatechange","onreadystatechangeThisArg","onreadystatechangeArgArray","setRequestHeader","originalSetRequestHeader","setRequestHeaderThisArg","setRequestHeaderArgArray","originalSend","sendThisArg","sendArgArray","sentryXhrData","addFetchInstrumentationHandler","skipNativeFetchCheck","instrumentFetch","onFetchResolved","EdgeRuntime","doc","sandbox","head","contentWindow","supportsNativeFetch","originalFetch","fetchArgs","getUrlFromResource","hasProp","parseFetchArgs","handlerData","fetchData","streamHandler","clonedResponseForResolving","onFinishedResolving","responseReader","getReader","maxFetchDurationTimeout","readingActive","chunkTimeout","done","read","releaseLock","resolveResponse","resource","getTraceData","getTransport","spanToTraceHeader","scopeToTraceHeader","instrumentFetchRequest","shouldCreateSpan","shouldAttachHeaders","spanOrigin","shouldCreateSpanResult","__span","contentLength","contentLengthNum","endSpan","fullUrl","hasParent","fetchOptionsObj","traceHeaders","isRequest","isHeaders","newHeaders","prevBaggageHeader","prevHeaderStrippedFromSentryBaggage","stripBaggageHeaderOfSentryBaggageValues","headerName","headerValue","existingBaggageHeader","newBaggageHeaders","headerItem","_addTracingHeadersToFetchRequest","fetchHint","responseToSpanId","WeakMap","spanIdToEndTimestamp","defaultRequestInstrumentationOptions","traceFetch","traceXHR","enableHTTPTimings","trackFetchStreamPerformance","instrumentOutgoingRequests","_options","shouldCreateSpanForRequest","tracePropagationTargets","shouldAttachHeadersWithTargets","targetUrl","resolvedUrl","currentOrigin","isSameOriginRequest","pathname","isRelativeSameOriginRequest","updatedTimestamp","addFetchEndInstrumentationHandler","createdSpan","getFullURL","addHTTPTimings","__sentry_xhr_span_id__","urlForSpanName","sentryTraceHeader","sentryBaggageHeader","setHeaderOnXhr","addTracingHeadersToXhrRequest","xhrCallback","isPerformanceResourceTiming","spanData","resourceTiming","timingSpanData","getAbsoluteTime","redirectStart","fetchStart","domainLookupStart","domainLookupEnd","connectStart","secureConnectionStart","connectEnd","resourceTimingEntryToSpanData","PREVIOUS_TRACE_KEY","addPreviousTraceSpanLink","previousTraceInfo","DEFAULT_BROWSER_TRACING_OPTIONS","instrumentNavigation","instrumentPageLoad","markBackgroundSpan","enableLongTask","enableLongAnimationFrame","enableInp","linkPreviousTrace","_experiments","browserTracingIntegration","optionalWindowDocument","enableInteractions","enableStandaloneClsSpans","beforeStartSpan","_collectWebVitals","scripts","parentStartTimestamp","parentOp","initialScript","invoker","invokerType","sourceURL","sourceFunctionName","sourceCharPosition","spanOptions","latestRoute","_createRouteSpan","isPageloadTransaction","finalStartSpanOptions","idleSpan","setActiveIdleSpan","oldPropagationContext","emitFinish","afterAllSetup","startingUrl","maybeEndActiveSpan","getActiveIdleSpan","traceOptions","getMetaContent","inMemoryPreviousTraceInfo","sessionStorage","storePreviousTraceInSessionStorage","getPreviousTraceFromSessionStorage","startBrowserTracingPageLoadSpan","startBrowserTracingNavigationSpan","cancelledStatus","inflightInteractionSpan","registerInteractionTransaction","activeIdleSpan","currentRootSpanOp","registerInteractionListener","activeRootSpan","isPerformanceEventTiming","last","registerInpInteractionListener","metaName","metaTag","querySelector","ACTIVE_IDLE_SPAN_PROPERTY","installedIntegrations","getIntegrationsToSetup","defaultIntegrations","userIntegrations","integration","isDefaultInstance","resolvedUserIntegrations","integrationsByName","currentInstance","existingInstance","afterSetupIntegrations","setupIntegration","integrationIndex","setupOnce","setup","preprocessEvent","processEvent","getPossibleEventMessages","possibleMessages","lastException","DEFAULT_IGNORE_ERRORS","eventFiltersIntegration","mergedOptions","clientOptions","_mergeOptions","_hint","ignoreTransactions","_isIgnoredTransaction","ignoreInternal","_isSentryError","ignoreErrors","_isIgnoredError","_isUselessError","denyUrls","_getEventFilterUrl","_isDeniedUrl","allowUrls","_isAllowedUrl","_shouldDropEvent","inboundFiltersIntegration","internalOptions","disableErrorDefaults","rootException","parent_id","_getLastValidUrl","originalFunctionToString","SETUP_CLIENTS","functionToStringIntegration","_functionToStringIntegration","Function","originalFunction","dedupeIntegration","_dedupeIntegration","previousEvent","currentEvent","currentMessage","previousMessage","_isSameFingerprint","_isSameStacktrace","_isSameMessageEvent","previousException","_getExceptionFromEvent","currentException","_isSameExceptionEvent","currentFrames","previousFrames","frameA","frameB","lineno","colno","currentFingerprint","previousFingerprint","initAndBind","clientClass","initialScope","setCurrentClient","getBaseApiEndpoint","getEnvelopeEndpointWithUrlEncodedAuth","_getIngestEndpoint","sentry_version","sentry_key","sentry_client","URLSearchParams","_encodedAuth","SentryError","logLevel","ALREADY_SEEN_ERROR","MISSING_RELEASE_FOR_SESSION_ERROR","Client","_integrations","_numProcessing","_outcomes","_hooks","_dsn","_metadata","_transport","transport","transportOptions","hintWithEventId","_process","eventFromException","_captureEvent","eventMessage","promisedEvent","eventFromMessage","sendSession","getSdkMetadata","_isClientDoneProcessing","clientFinished","transportFlushed","eventProcessor","_isEnabled","_setupIntegrations","integrationName","addIntegration","isAlreadyInstalled","sendEvent","env","sendResponse","clientReleaseOption","clientEnvironmentOption","sessionAttrs","createSessionEnvelope","sendClientReports","hook","hooks","cbIndex","callbacks","setupIntegrations","_updateSessionFromEvent","crashed","errored","exceptions","sessionNonTerminal","ticked","interval","_prepareEvent","_processEvent","finalEvent","isTransaction","isTransactionEvent","beforeSendLabel","dataCategory","__sentry__","beforeSend","beforeSendTransaction","processedEvent","processedRootSpanJson","convertTransactionEventToSpanJson","processedSpans","processedSpan","spanCountBefore","spanCountBeforeProcessing","processBeforeSend","beforeSendResult","invalidValueError","_validateBeforeSendResult","spanCount","droppedSpanCount","transactionInfo","_clearOutcomes","quantity","_flushOutcomes","discarded_events","addAutoIpAddressToUser","objWithMaybeUser","addAutoIpAddressToSession","exceptionFromError","parseStackFrames","extractType","extractMessage","eventFromPlainObject","isUnhandledRejection","errorFromProp","getErrorPropertyFromObject","__serialized__","getNonErrorObjectExceptionValue","eventFromError","skipLines","reactMinifiedRegexp","getSkipFirstStackStringLines","getPopFirstTopFrames","isWebAssemblyException","WebAssembly","Exception","eventFromUnknownInput","attachStacktrace","domException","eventFromString","synthetic","__sentry_template_string__","__sentry_template_values__","logentry","maxLength","firstKey","includedKeys","serialized","extractExceptionKeysForMessage","captureType","getObjectClassName","BrowserClient","names","applySdkMetadata","SENTRY_SDK_SOURCE","debounceTimerID","lastCapturedEventType","lastCapturedEventTargetId","instrumentDOM","triggerDOMHandler","globalDOMEventHandler","makeDOMEventHandler","globalObject","originalAddEventListener","__sentry_instrumentation_handlers__","handlerForType","refCount","originalRemoveEventListener","globalListener","getEventTarget","isContentEditable","shouldSkipDOMEvent","_sentryId","isSimilarToLastCapturedEvent","instrumentConsole","DEFAULT_BREADCRUMBS","beforeBreadcrumb","finalBreadcrumb","severityLevelFromString","getBreadcrumbLogLevelFromHttpStatusCode","statusCode","MAX_ALLOWED_STRING_LENGTH","breadcrumbsIntegration","addConsoleInstrumentationHandler","_getConsoleBreadcrumbHandler","serializeAttribute","_isEvent","_getDomBreadcrumbHandler","_getXhrBreadcrumbHandler","request_body_size","response_body_size","_getFetchBreadcrumbHandler","parsedLoc","parsedFrom","parsedTo","_getHistoryBreadcrumbHandler","_getSentryBreadcrumbHandler","DEFAULT_EVENT_TARGET","browserApiErrorsIntegration","eventTarget","_wrapTimeFunction","_wrapRAF","_wrapXHR","eventTargetOption","_wrapEventTarget","originalCallback","wrapOptions","_len2","_key2","eventName","handleEvent","originalEventHandler","browserSessionIntegration","globalHandlersIntegration","stackTraceLimit","ev","ev0","ev0s","ev0sf","in_app","_enhanceEventWithInitialFrame","_installGlobalOnErrorHandler","globalHandlerLog","_getUnhandledRejectionError","_installGlobalOnUnhandledRejectionHandler","httpContextIntegration","Referer","applyAggregateErrorsToEvent","exceptionFromErrorImplementation","maxValueLimit","limit","aggregateExceptionsFromError","prevExceptions","exceptionId","newExceptions","applyExceptionGroupFieldsForParentException","newException","newExceptionId","applyExceptionGroupFieldsForChildException","childError","is_exception_group","exception_id","parentId","linkedErrorsIntegration","createFrame","chromeRegexNoFnName","chromeRegex","chromeEvalRegex","geckoREgex","geckoEvalRegex","defaultStackParser","noFnParts","col","subMatch","extractSafariExtensionDetails","isSafariExtension","isSafariWebExtension","cachedImplementations","getNativeImplementation","cached","impl","clearCachedImplementation","makePromiseBuffer","task","$","taskProducer","drain","counter","capturedSetTimeout","updateRateLimits","limits","updatedRateLimits","rateLimitHeader","retryAfterHeader","retryAfter","categories","namespaces","headerDelay","delay","headerDate","parseRetryAfterHeader","createTransport","makeRequest","bufferSize","rateLimits","filteredEnvelopeItems","disabledUntil","isRateLimited","filteredEnvelope","recordEnvelopeLoss","requestTask","makeFetchTransport","nativeFetch","pendingBodySize","pendingCount","requestSize","requestOptions","referrerPolicy","keepalive","fetchOptions","dropTopLevelUndefinedKeys","mutatetedObj","getOwnPropertyNames","optionsArg","__SENTRY_RELEASE__","SENTRY_RELEASE","applyDefaultOptions","skipBrowserExtensionCheck","windowWithMaybeExtension","extensionObject","chrome","runtimeId","runtime","isDedicatedExtensionPage","isNWjs","nw","shouldShowBrowserExtensionError","init$1","SentryWrapper","_SentryWrapper","SentryReact","SentryBrowser","updateSubscriberId","tagValue","warning","ONE_MILLION","videoElement","videoContainer","shakaPlayer","getConfiguration","getManifest","presentationTimeline","getDelay","updateMaxBitrate","_shakaPlayer$configur","getName","getVersion","ended","paused","endPosition","currentTime","isVerimatrixFairplay","PatchedMediaKeysApple","install","setVideoContainer","plugCallbacks","attach","certificate","loadCertificate","configureAndStart","initializeOffline","startOffline","configurePlayer","initializeAudioAndVideoTracks","arrayBuffer","errorEvent","bufferingEvent","textChangedEvent","tracksChangedEvent","adaptationEvent","variantChangedEvent","endedEvent","pausedEvent","playingEvent","timeUpdateEvent","durationChangeEvent","volumeChangedEvent","bufferBehind","bufferingGoal","rebufferingGoal","autoLowLatencyMode","ignoreTextStreamFailures","retryParameters","maxAttempts","addDrmConfiguration","preferredAudioLanguage","preferredTextLanguage","restrictions","resetRetryTimer","retryTimer","retryCount","uninstall","detach","configureRequestFilter","getNetworkingEngine","registerRequestFilter","NetworkingEngine","RequestType","LICENSE","hasVUDrmToken","VuDrmToken","_this$authenticationT","ApplicationJson","spc","Uint8ArrayUtils","toStandardBase64","skdUri","skd","StringUtils","toUTF8","configureResponseFilter","registerResponseFilter","ckc","fromUTF8","fromBase64","configureServers","serverUrl","advanced","serverCertificate","initDataTransform","initDataType","drmInfo","fromBytesAutoDetect","contentId","getContentId","skdOriginalValue","ma1","ma2","atob","charCodeAt","_contentId","FairPlayUtils","servers","audioRobustness","videoRobustness","compareNumbers","sortAudioTrack","sortVideoTrack","videoBandwidth","getInitializeTrack","audioTracks","videoTracks","active","audioBandwidth","audioCodec","audioId","audioMimeType","frameRate","originalAudioId","originalVideoId","videoCodec","videoId","videoMimeType","selectedAudioId","selectedVideoId","initializeTrack","getVariantTracks","addSubtitles","streamInfoUpdatedCallback","subtitlesMap","getTextTracks","subsForLang","_subtitlesMap$languag","addTextTrackAsync","safariVodWorkaroundCallback","untypedMediaErrorCode","untypedErrorMsg","mediaErrorCode","Category","MEDIA","Code","VIDEO_ERROR","streamInitializedCallback","Static","liveBufferLengthUpdatedCallback","playbackTimeUpdatedCallback","_shakaPlayer$getPlayh","_shakaPlayer$getPlayh2","seekRange","liveBufferLength","getPlayheadTimeAsDate","timeshift","LiveRecording","buffering","bufferingCallback","bufferLoadedCallback","isBuffering","selectedTextId","findSelectedTrackId","textTracks","forced","_tracks$find$id","_tracks$find","playbackEndedCallback","playbackPausedCallback","playbackPlayingCallback","volumeChangedCallback","volume","getBitrateInfoListFor","mediaType","getQualityFor","getAutoSwitchQualityFor","setQualityFor","setAutoSwitchQualityFor","isPaused","_videoElement$paused","setVolume","_videoElement$muted","muted","setMute","mute","liveSeek","goBackToLive","goToLive","seek","download","downloadOperationId","updateDownloadProgress","generateUpdateDownloadProgress","toastId","NOTIFY_CLOSE","NOTIFY_INFO","DOWNLOAD_SUCCESSFUL","setCurrentTrack","typeEnum","selectAudioLanguage","setTextTrackVisibility","selectTextTrack","unsetCurrentTrack","audioTrack","getAudioTrackIndex","role","languageAndRoles","getAudioLanguagesAndRoles","currLanguage","currRole","currLabel","getActiveTrack","getActiveAudioTrack","getActiveTextTrack","getCurrentTrackFor","indexedTrack","mapAudioShakaTrack","mapTextTrack","mapAudioShakaLanguageRole","mapAudioTracks","mapTextTracks","getTracksFor","getMetrics","shakaMetrics","bufferFullness","getBufferFullness","bufferedInfo","getBufferedInfo","selectedTrackIds","stats","getStats","isStopped","installAll","isBrowserSupported","displayChannelName","ChannelView","isUIDisabled","CHANNEL","ChangeDebounceTimeout","CountThreshold","ImageContainerHeight","ListTimeout","channelElementsArray","channelIndex","translateY","ChannelZapperView","resetChannelChangeDebounceTimer","channelChangeDebounceTimer","resetChannelListTimer","channelListTimer","openChannelList","savedChannelIndex","closeChannelList","savedChannelId","setChannelById","setChannelByIndex","createChannelElements","channelIndices","isChannelPlaybackGranted","newIndex","skipNotification","debounceChannelChange","slide","notifyChannelChange","onChannelChangedCallback","handleArrowUpOnClick","channelCount","handleArrowDownOnClick","handleChannelZapperOnMouseEnter","handleChannelZapperOnMouseLeave","handleOnWheel","goToNextChannel","goToPreviousChannel","handleChannelListOpenerOnMouseEnter","CLOSE_CHANNEL_LIST","onWheel","EmptyProgressBarView","canSeek","currentTimePosition","displayedTime","dragDelta","hoverPosition","hoverTime","isThumbDragged","isWaitingForCurrentPositionUpdate","percentAvailable","percentProgress","percentStartProgressBar","LiveProgressBar","initialSeekPosition","initialTimeStamp","programEnd","programStart","liveProgramEndTime","liveProgramStartTime","playheadPosition","onPlayheadChanged","liveTimeUpdateInterval","updateLiveTime","resetLiveTimeUpdateInterval","updateCanSeek","isTimeshiftEnabled","updateProgressBar","updateAvailableBar","leftOffset","seekTo","onSeekChanged","getHoverTimeFromMousePosition","mainContainer","handleMainContainerOnClick","liveDelta","displayTimeBadge","handleThumbMouseDown","handleThumbMouseMove","handleThumbMouseUp","performSeek","renderAvailableBar","renderProgressBar","PictoDot","renderTimeBadge","prevIsTimeshiftEnabled","prevLiveBufferLength","prevPlayheadPosition","OptionsType","OptionsView","handleAudioOnClick","toggleOptions","handleSubtitlesOnClick","optionsType","displayedOptions","currentDisplayedOptions","handleNewAudioTrackOnClick","onNewAudioTrackSelected","selectedAudioMediaInfo","handleNewOptionSelected","handleNewSubtitlesTrackOnClick","onNewSubtitlesTrackSelected","selectedSubtitlesMediaInfo","newOptionSelected","currentSelection","idNumber","getCurrentAudio","_audioMediaInfo$find","audioMediaInfo","currentAudioMediaInfo","elt","currentAudio","isVisuallyImpaired","getCurrentSubtitles","_subtitlesMediaInfo$f","subtitlesMediaInfo","currentSubtitlesMediaInfo","currentSubtitles","buildAudioMediaInfoList","audioMediaInfoList","audioIndicator","PictoCheck","buildSubtitlesMediaInfoList","subtitlesMediaInfoList","subtitlesIndicator","renderAudio","optionsElement","selectionElement","renderSelectionAndOptions","renderSubtitles","optionsList","impairedPicto","handleLimitBitrateOnClick","isBitrateLimited","localUpdateSetting","renderGreenStreamingOption","isMaxBitrateAllowed","OfflineContent","PictoLeaf","audioOptions","audioSelection","subtitlesOptions","subtitlesSelection","updateSetting","VOLUME","BarLimits","MiddleValue","PlayerVolume","handleVolumeControllerOnClick","onVolumeControllerClickCallback","volumeController","mousePosX","handleVolumeOnClick","onVolumeClickCallback","volumeBarClasses","pictoVolumeDown","pictoVolumeUp","pictoVolumeMuted","PictoVolumeMute","PictoVolumeDown","PictoVolumeUp","PictoVolume","barClass","PERCENT_START_MARGIN","PERCENT_END_MARGIN","availableBarWidth","bufferedBarWidth","isHoveringMargin","progressBarWidth","StandardProgressBar","bufferedTimeRanges","endMargin","realEnd","realStart","totalDuration","userViewEndOffset","userViewStartOffset","realDuration","resetDragTimer","dragTimer","getRealDuration","onPlayingInMargin","calculateProgressWidth","partsWidth","calculatePartsWidth","contentWidth","endMarginWidth","startMarginWidth","viewableEndMarginDuration","adjustedWidth","missedContent","updateBufferedBar","_mainContainer$offset","mainContainerWidth","relativeWidth","getRelativeMousePosition","mouseX","relativePosition","calculateTimeFromMousePosition","mousePos","startMarginDuration","endMarginDuration","mouseTime","absoluteTime","dragSeekPosition","renderBufferedBar","prevBufferedTimeRanges","prevDuration","prevEndMargin","prevStartMargin","prevTotalDuration","prevUserViewEndOffset","prevUserViewStartOffset","areOptionsVisible","playingInMargin","PlayerControllerView","resetOptionsTimer","optionsTimer","startOptionsTimer","closePlayerOptions","handlePlayerOptionsOnMouseEnter","handlePlayerOptionsOnMouseLeave","setPlayerOptionsVisibility","handleOnClickOverlay","handlePictoCogOnClick","handleChannelZapperChannelChanged","onChannelChanged","handlePlayInMargin","channelZapper","_currentItem$startTim","_currentItem$endTime","currentItem","isTrailer","onLiveProgressBarSeekChanged","onStandardProgressBarSeekChanged","EmptyProgressBar","liveStartTime","liveEndTime","progressBarElement","renderDownloadPicto","onDownloadClick","PictoDownload","renderOptionsPicto","areOptionsEnabled","PictoCog","renderFullScreenPicto","isInFullscreen","onEnterFullScreenClick","onExitFullScreenClick","PictoCompress","PictoExpand","renderLiveIndicator","onGoToLiveClick","recordingPicto","liveIndicator","isProgramInfoHidden","seriesEpisodeText","mainLineTitle","subLineTitle","renderPictoLeaf","renderVideoQuality","videoQuality","getDisplayedDuration","displayedDuration","renderTimeInfo","displayedSeekPosition","renderOptions","Options","renderChannelZapper","ChannelZapper","renderRecordButton","isBlackOutEnabled","isControllerEnabled","renderSkipBackwardButton","controlLevel","onSkipBackwardClick","PictoRewind10","PictoRewind30","PictoRewind60","renderSkipForwardButton","onSkipForwardClick","PictoForward10","PictoForward30","PictoForward60","renderPlayOrPauseButton","onPauseClick","onPlayClick","PictoBigPlay","prevIsVisible","onInfoClick","onVolumeChanged","onVolumeClick","playPauseButton","recordButton","buildErrorResponse","defaultStatus","mapV2ErrorToV1Error","errorMsg","errormsg","errorMsg1","errorMsg2","errorStatus","_text","messageObj","errStatus","BO_PURCHASE_UNKNOWN_ERROR","fullscreenEnabled","fullscreenElement","requestFullscreen","exitFullscreen","fullscreenchange","fullscreenerror","fullscreen","webkit","moz","ms","requestFullscreenFunction","fullscreenPseudoClass","onfullscreenchange","onfullscreenerror","sendPurchaseListRequest","purchaseListETagCache","BO_API_PURCHASE_LIST","REDUX_MSG_REQUEST_BO_PURCHASE_LIST","DATE_PATTERN","convertTimeLeftToExpirationTime","timeLeft","convertToIsoDate","days","months","years","getPurchaseListForDistributor","skipStoreUpdate","purchaseTitleData","licenseExpirationDate","licenseTimeLeft","vhiDate","videoPosition","subType","existingItem","purchases","PurchaseSubType","Movie","updateBOPurchaseListForDistributor","NotModified","convertSubtitleTrackMetadataToExternalSubtitles","sendCreateStreamRequest","license","BO_API_CREATE_STREAM2","REDUX_MSG_REQUEST_BO_STREAM_CREATE","grantedTicket","subtitleTrackMetadatas","vstId","appId","gt","contentUrl","licenceIssuer","licenseIssuer","heartbeat","sendPurchaseRequest","promocode","BO_API_PURCHASE","REDUX_MSG_REQUEST_BO_PURCHASE","BO_PURCHASE_STATUS_OK","mapResponse","_typeof","iterator","toPropertyKey","toPrimitive","lim","p2b","n2b","b2n","n2p","map$1","hex","h1","h2","eq","hexString","isShort","alpha","HUE_RE","hsl2rgbn","hsv2rgbn","hwb2rgbn","rgb","rgb2hsl","hueValue","calln","hsl2rgb","hue","hueParse","p1","p2","hwb2rgb","hsv2rgb","names$1","OiceXe","antiquewEte","aqua","aquamarRe","azuY","beige","bisque","black","blanKedOmond","Xe","XeviTet","bPwn","burlywood","caMtXe","KartYuse","KocTate","cSO","cSnflowerXe","cSnsilk","crimson","cyan","xXe","xcyan","xgTMnPd","xWay","xgYF","xgYy","xkhaki","xmagFta","xTivegYF","xSange","xScEd","xYd","xsOmon","xsHgYF","xUXe","xUWay","xUgYy","xQe","xviTet","dAppRk","dApskyXe","dimWay","dimgYy","dodgerXe","fiYbrick","flSOwEte","foYstWAn","fuKsia","gaRsbSo","ghostwEte","gTd","gTMnPd","Way","gYF","gYFLw","gYy","honeyMw","hotpRk","RdianYd","Rdigo","ivSy","khaki","lavFMr","lavFMrXsh","lawngYF","NmoncEffon","ZXe","ZcSO","Zcyan","ZgTMnPdLw","ZWay","ZgYF","ZgYy","ZpRk","ZsOmon","ZsHgYF","ZskyXe","ZUWay","ZUgYy","ZstAlXe","ZLw","lime","limegYF","lRF","magFta","maPon","VaquamarRe","VXe","VScEd","VpurpN","VsHgYF","VUXe","VsprRggYF","VQe","VviTetYd","midnightXe","mRtcYam","mistyPse","moccasR","navajowEte","navy","Tdlace","Tive","TivedBb","Sange","SangeYd","ScEd","pOegTMnPd","pOegYF","pOeQe","pOeviTetYd","papayawEp","pHKpuff","peru","pRk","plum","powMrXe","purpN","YbeccapurpN","Yd","Psybrown","PyOXe","saddNbPwn","sOmon","sandybPwn","sHgYF","sHshell","siFna","silver","skyXe","UXe","UWay","UgYy","snow","sprRggYF","stAlXe","tan","teO","tEstN","tomato","Qe","viTet","JHt","wEte","wEtesmoke","Lw","LwgYF","nameParse","unpacked","tkeys","nk","unpack","transparent","RGB_RE","pow","modHSL","ratio","tmp","fromObject","functionParse","charAt","rgbParse","Color","ret","hexParse","_rgb","_valid","rgbString","hslString","mix","color","weight","w2","w1","interpolate","rgb1","rgb2","clearer","greyscale","opaquer","negate","lighten","darken","saturate","desaturate","rotate","deg","noop","uid","isNullOrUndef","isObject","isNumberFinite","finiteOrDefault","valueOrDefault","toDimension","dimension","each","loopable","_elementsEqual","a0","ilen","v0","v1","datasetIndex","klen","isValidKey","_merger","tval","sval","merger","mergeIf","_mergerIf","keyResolvers","resolveObjectKey","resolver","_splitKey","_getKeyResolver","_capitalize","defined","setsEqual","TAU","PITAU","INFINITY","POSITIVE_INFINITY","RAD_PER_DEG","HALF_PI","QUARTER_PI","TWO_THIRDS_PI","log10","sign","almostEquals","epsilon","niceNum","roundedRange","niceRange","fraction","isNumber","isNonPrimitive","_setMinAndMaxByKey","toRadians","degrees","toDegrees","radians","_decimalPlaces","getAngleFromPoint","centrePoint","anglePoint","distanceFromXCenter","distanceFromYCenter","radialDistanceFromCenter","atan2","distance","distanceBetweenPoints","pt1","pt2","_angleDiff","_normalizeAngle","_angleBetween","sameAngleIsFullCircle","angleToStart","angleToEnd","startToAngle","endToAngle","_limitValue","_isBetween","_lookup","table","cmp","mid","hi","lo","_lookupByKey","ti","_rlookupByKey","arrayEvents","unlistenArrayEvents","_chartjs","_arrayUnique","requestAnimFrame","throttled","argsToUse","ticking","_toLeftRightCenter","align","_alignStartEnd","_getStartAndCountOfVisiblePoints","meta","points","animationsDisabled","pointCount","_sorted","iScale","vScale","_parsed","spanGaps","axis","minDefined","maxDefined","getUserBounds","getPixelForValue","distanceToDefinedLo","point","distanceToDefinedHi","_scaleRangesChanged","xScale","yScale","_scaleRanges","newRanges","xmin","xmax","ymin","ymax","changed","atEdge","elasticIn","elasticOut","effects","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInElastic","easeOutElastic","easeInOutElastic","easeInBack","easeOutBack","easeInOutBack","easeInBounce","easeOutBounce","easeInOutBounce","isPatternOrGradient","getHoverColor","numbers","colors","intlCache","formatNumber","num","locale","formatter","NumberFormat","getNumberFormat","formatters","numeric","tickValue","ticks","chart","notation","maxTick","calculateDelta","logDelta","numDecimal","minimumFractionDigits","maximumFractionDigits","logarithmic","remain","significand","Ticks","overrides","descriptors","getScope$1","root","Defaults","_descriptors","_appliers","animation","backgroundColor","borderColor","datasets","devicePixelRatio","getDevicePixelRatio","family","hover","hoverBackgroundColor","hoverBorderColor","hoverColor","indexAxis","mode","intersect","includeInvisible","maintainAspectRatio","onHover","parsing","plugins","responsive","scale","scales","showLine","drawActiveElementsOnTop","describe","override","route","targetScope","targetName","scopeObject","targetScopeObject","privateName","defineProperties","local","appliers","defaults","_scriptable","_indexable","_fallback","easing","loop","resize","animations","visible","autoPadding","padding","bottom","beginAtZero","bounds","clip","grace","grid","lineWidth","drawOnChartArea","drawTicks","tickLength","tickWidth","_ctx","tickColor","border","dash","dashOffset","minRotation","maxRotation","mirror","textStrokeWidth","textStrokeColor","autoSkip","autoSkipPadding","labelOffset","minor","major","crossAlign","showLabelBackdrop","backdropColor","backdropPadding","_measureText","gc","longest","string","textWidth","measureText","_longestText","arrayOfThings","cache","garbageCollect","jlen","thing","nestedThing","restore","gcLen","_alignPixel","pixel","currentDevicePixelRatio","halfWidth","clearCanvas","canvas","getContext","resetTransform","clearRect","drawPoint","drawPointLegend","xOffset","yOffset","cornerRadius","xOffsetW","yOffsetW","pointStyle","rotation","radius","rad","drawImage","beginPath","ellipse","arc","closePath","moveTo","lineTo","SQRT1_2","rect","borderWidth","stroke","_isPointInArea","area","margin","clipArea","unclipArea","_steppedLineTo","previous","flip","midpoint","_bezierCurveTo","bezierCurveTo","cp1x","cp2x","cp1y","cp2y","decorateText","strikethrough","underline","actualBoundingBoxLeft","actualBoundingBoxRight","actualBoundingBoxAscent","actualBoundingBoxDescent","yDecoration","strokeStyle","fillStyle","decorationWidth","drawBackdrop","oldColor","fillRect","renderText","strokeWidth","strokeColor","translation","textAlign","textBaseline","setRenderOpts","backdrop","strokeText","maxWidth","fillText","addRoundedRectPath","topLeft","bottomLeft","bottomRight","topRight","LINE_HEIGHT","FONT_STYLE","toLineHeight","_readValueToProps","objProps","toTRBL","toTRBLCorners","toPadding","toFont","toFontString","inputs","cacheable","createContext","parentContext","_createResolver","scopes","prefixes","getTarget","finalRootScopes","_resolve","_cacheable","_scopes","_rootScopes","_getTarget","deleteProperty","_keys","_cached","proxy","readKey","needsSubResolver","createSubResolver","_resolveWithPrefixes","getKeysFromAllScopes","ownKeys","_storage","_attachContext","subProxy","descriptorDefaults","_proxy","_context","_subProxy","receiver","isScriptable","getValue","_resolveScriptable","isIndexable","_resolveArray","_resolveWithContext","allKeys","scriptable","indexable","_allKeys","resolveFallback","addScopes","parentScopes","parentFallback","rootScopes","allScopes","addScopesFromKey","subGetTarget","resolveKeysFromAllScopes","_parseObjectDataRadialScale","_parsing","parsed","getPoint","skip","getValueAxis","splineCurve","firstPoint","middlePoint","afterPoint","d01","d12","s01","s12","fa","fb","splineCurveMonotone","valueAxis","pointsLen","deltaK","mK","pointBefore","pointCurrent","pointAfter","slopeDelta","alphaK","betaK","tauK","squaredMagnitude","monotoneAdjust","iPixel","vPixel","monotoneCompute","capControlPoint","pt","_updateBezierControlPoints","controlPoints","cubicInterpolationMode","prev","tension","capBezierPoints","inArea","inAreaPrev","inAreaNext","_isDomSupported","_getParentNode","domNode","parseMaxStyle","styleValue","parentProperty","valueInPixels","ownerDocument","defaultView","positions","getPositionedStyle","suffix","getRelativePosition","borderBox","boxSizing","paddings","borders","offsetX","offsetY","useOffsetPos","shadowRoot","getCanvasPosition","round1","getMaximumSize","bbWidth","bbHeight","aspectRatio","margins","containerSize","containerStyle","containerBorder","containerPadding","getContainerSize","retinaScale","forceRatio","forceStyle","pixelRatio","deviceHeight","deviceWidth","setTransform","supportsEventListenerOptions","passiveSupported","readUsedSize","getStyle","_pointInLine","_steppedInterpolation","_bezierInterpolation","cp1","cp2","getRtlAdapter","rtl","rectX","setWidth","xPlus","leftForLtr","getRightToLeftAdapter","_itemWidth","overrideTextDirection","getPropertyPriority","prevTextDirection","restoreTextDirection","propertyFn","between","compare","normalizeSegment","_boundSegment","segment","startBound","endBound","getSegment","inside","subStart","shouldStart","shouldStop","_boundSegments","segments","splitByStyles","segmentOptions","chartContext","_chart","baseStyle","readStyle","_datasetIndex","prevStyle","addStyle","st","p0","p0DataIndex","p1DataIndex","styleChanged","doSplitByStyles","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","Animator","_request","_charts","_running","_lastDate","_notify","anims","numSteps","currentStep","_refresh","_update","remaining","running","draw","_active","_total","tick","_getAnims","charts","complete","listen","cur","_duration","animator","interpolators","boolean","factor","c0","Animation","cfg","currentValue","_fn","_easing","_start","_loop","_target","_prop","_from","_to","_promises","rej","resolved","Animations","_properties","animationOptions","animatedProps","_animateOptions","newOptions","$shared","$animations","resolveTargetOptions","_createAnimations","anim","awaitAll","scaleClip","allowedOverflow","getSortedDatasetIndices","filterVisible","metasets","_getSortedDatasetMetas","applyStack","dsIndex","singleMode","otherValue","found","isStacked","stacked","getOrCreateStack","stacks","indexValue","subStack","getLastIndexInStack","positive","getMatchingVisibleMetas","updateStacks","controller","_cachedMeta","_stacks","iAxis","vAxis","indexScale","valueScale","getStackKey","_top","_bottom","_visualValues","getFirstScaleId","clearStacks","isDirectUpdateMode","cloneIfNotShared","shared","DatasetController","_cachedDataOpts","getMeta","_type","_data","_objectData","_sharedOptions","_drawStart","_drawCount","enableOptionSharing","supportsDecimation","$context","_syncList","datasetElementType","dataElementType","linkScales","_stacked","addElements","isPluginEnabled","getDataset","chooseId","xid","xAxisID","yid","yAxisID","rid","rAxisID","iid","iAxisID","vid","vAxisID","getScaleForId","rScale","getDatasetMeta","scaleID","_getOtherScale","_destroy","_dataCheck","iAxisKey","vAxisKey","adata","convertObjectDataToArray","isExtensible","listenArrayEvents","buildOrUpdateElements","resetNewElements","stackChanged","oldStacked","_resyncElements","scopeKeys","datasetScopeKeys","getOptionScopes","createResolver","sorted","parseArrayData","parseObjectData","parsePrimitiveData","isNotInOrderComparedToPrev","getLabels","singleScale","xAxisKey","yAxisKey","getParsed","getDataElement","updateRangeFromParsed","parsedValue","getMinMax","canStack","otherScale","createStack","NEGATIVE_INFINITY","otherMin","otherMax","_skip","getAllParsedValues","getMaxOverflow","getLabelAndValue","getLabelForValue","_clip","disabled","toClip","defaultClip","chartArea","resolveDatasetElementOptions","resolveDataElementOptions","dataIndex","raw","createDataContext","createDatasetContext","_resolveElementOptions","elementType","sharing","datasetElementScopeKeys","resolveNamedOptions","_resolveAnimations","transition","datasetAnimationScopeKeys","getSharedOptions","includeOptions","sharedOptions","_animationsDisabled","_getSharedOptions","firstOpts","previouslySharedOptions","updateSharedOptions","updateElement","_setStyle","removeHoverStyle","setHoverStyle","_removeDatasetHoverStyle","_setDatasetHoverStyle","arg1","arg2","numMeta","numData","_insertElements","_removeElements","move","updateElements","removed","_sync","_dataChanges","_onDataPush","_onDataPop","_onDataShift","_onDataSplice","newCount","_onDataUnshift","computeMinSampleSize","_cache","$bar","visibleMetas","getAllScaleValues","_length","updateMinAndPrev","getPixelForTick","parseValue","startValue","endValue","barStart","barEnd","_custom","parseFloatBar","parseArrayOrPrimitive","isFloatBar","custom","setBorderSkipped","edge","borderSkipped","horizontal","borderProps","enableBorderRadius","parseEdge","orig","v2","startEnd","setInflateAmount","inflateAmount","_defineProperty","BarController","getBasePixel","isHorizontal","ruler","_getRuler","vpixels","_calculateBarValuePixels","ipixels","_calculateBarIndexPixels","center","_getStacks","grouped","currentParsed","iScaleValue","skipNull","_getStackCount","_getStackIndex","pixels","barThickness","_startPixel","_endPixel","stackCount","categoryPercentage","barPercentage","baseValue","minBarLength","actualBase","floating","getDataVisibility","barSign","startPixel","getPixelForDecimal","endPixel","getValueForPixel","halfGrid","getLineWidthForValue","maxBarThickness","chunk","computeFlexCategoryTraits","thickness","computeFitCategoryTraits","stackIndex","rects","_index_","_value_","BubbleController","DoughnutController","innerRadius","outerRadius","getter","_getRotation","_getCircumference","circumference","_getRotationExtents","isDatasetVisible","arcs","spacing","getMaxBorderWidth","getMaxOffset","cutout","toPercentage","chartWeight","_getRingWeight","ratioX","ratioY","startAngle","endAngle","startX","startY","endX","endY","calcMax","calcMin","maxX","maxY","minX","minY","getRatioAndOffset","maxRadius","radiusLength","_getVisibleDatasetWeightTotal","total","calculateTotal","_getRingWeightOffset","_circumference","animateRotate","calculateCircumference","animationOpts","centerX","centerY","animateScale","metaData","borderAlign","hoverBorderWidth","hoverOffset","ringWeightOffset","legend","generateLabels","fontColor","legendItem","toggleDataVisibility","LineController","_dataset","_decimated","animated","maxGapLength","directUpdate","pointsCount","prevParsed","nullData","lastPoint","updateControlPoints","PolarAreaController","_updateRadius","minSize","cutoutPercentage","getVisibleDatasetCount","xCenter","yCenter","datasetStartAngle","getIndexAngle","defaultAngle","countVisibleElements","_computeAngle","getDistanceFromCenterForValue","angleLines","circular","pointLabels","PieController","RadarController","_fullLoop","pointPosition","getPointPositionForValue","ScatterController","registry","getElement","abstract","DateAdapterBase","formats","startOf","endOf","adapters","_date","binarySearch","metaset","lookupMethod","_reversePixels","getRange","evaluateInteractionItems","getSortedVisibleDatasetMetas","getIntersectItems","useFinalPosition","isPointInArea","inRange","getNearestCartesianItems","distanceMetric","useX","useY","getDistanceMetricForAxis","minDistance","getCenterPoint","getNearestItems","getProps","getNearestRadialItems","getAxisItems","rangeMethod","intersectsItem","Interaction","modes","nearest","STATIC_POSITIONS","filterByPosition","filterDynamicPositionByAxis","sortByWeight","setLayoutDims","layouts","stackWeight","placed","buildStacks","vBoxMaxWidth","hBoxMaxHeight","fullSize","getCombinedMax","maxPadding","updateMaxPadding","boxPadding","updateDims","getPadding","newWidth","outerWidth","newHeight","outerHeight","widthChanged","heightChanged","other","getMargins","marginForPositions","fitBoxes","boxes","refitBoxes","refit","setBoxDims","placeBoxes","userPadding","addBox","_layers","z","removeBox","layoutItem","minPadding","layoutBoxes","wrapBoxes","centerHorizontal","centerVertical","leftAndTop","rightAndBottom","vertical","buildLayoutBoxes","verticalBoxes","horizontalBoxes","beforeLayout","visibleVerticalBoxCount","updatePos","change","handleMaxPadding","BasePlatform","acquireContext","releaseContext","isAttached","updateConfig","BasicPlatform","EXPANDO_KEY","EVENT_TYPES","touchmove","pointermove","isNullOrEmpty","eventListenerOptions","removeListener","nodeListContains","nodeList","contains","createAttachObserver","MutationObserver","trigger","addedNodes","removedNodes","childList","subtree","createDetachObserver","drpListeningCharts","oldDevicePixelRatio","onWindowResize","dpr","createResizeObserver","listenDevicePixelRatioChanges","releaseObserver","unlistenDevicePixelRatioChanges","createProxyAndListen","native","fromNativeEvent","addListener","DomPlatform","renderHeight","renderWidth","displayWidth","displayHeight","initCanvas","removeAttribute","proxies","$proxies","isConnected","tooltipPosition","hasValue","tickOpts","determinedMaxTicks","_tickSize","maxScale","maxChart","_maxLength","determineMaxTicks","ticksLimit","maxTicksLimit","majorIndices","getMajorIndices","numMajorIndices","newTicks","skipMajors","evenMajorSpacing","getEvenSpacing","factors","_factorize","calculateSpacing","avgMajorSpacing","majorStart","majorEnd","offsetFromEdge","getTicksLimit","ticksLength","sample","numItems","increment","getPixelForGridLine","offsetGridLines","validIndex","lineValue","getTickMarkLength","getTitleHeight","titleAlign","reverseAlign","Scale","_margins","paddingTop","paddingBottom","paddingLeft","paddingRight","labelRotation","_range","_gridLineItems","_labelItems","_labelSizes","_longestTextCache","_userMax","_userMin","_suggestedMax","_suggestedMin","_ticksLength","_borderValue","_dataLimitsCached","suggestedMin","suggestedMax","metas","getTicks","xLabels","yLabels","getLabelItems","_computeLabelItems","beforeUpdate","sampleSize","beforeSetDimensions","setDimensions","afterSetDimensions","beforeDataLimits","determineDataLimits","afterDataLimits","minmax","keepZero","_addGrace","beforeBuildTicks","buildTicks","afterBuildTicks","samplingEnabled","_convertTicksToLabels","beforeCalculateLabelRotation","calculateLabelRotation","afterCalculateLabelRotation","afterAutoSkip","beforeFit","fit","afterFit","afterUpdate","reversePixels","_alignToPixels","alignToPixels","_callHooks","notifyPlugins","beforeTickToLabelConversion","generateTickLabels","afterTickToLabelConversion","numTicks","maxLabelDiagonal","_isVisible","labelSizes","_getLabelSizes","maxLabelWidth","widest","maxLabelHeight","highest","asin","titleOpts","gridOpts","titleHeight","tickPadding","angleRadians","labelHeight","_calculatePadding","_handleMargins","isRotated","labelsBelowTicks","offsetLeft","offsetRight","isFullSize","_computeLabelSizes","caches","heights","tickFont","fontString","nestedLabel","widestLabelSize","highestLabelSize","_resolveTickFontOptions","valueAt","idx","decimal","getDecimalForPixel","getBaseValue","createTickContext","createScaleContext","optionTicks","rot","_computeGridLineItems","tl","borderOpts","axisWidth","axisHalfWidth","alignBorderValue","borderValue","alignedLineValue","tx1","ty1","tx2","ty2","positionAxisID","optsAtIndex","optsAtIndexBorder","lineColor","tickBorderDash","tickBorderDashOffset","tickAndPadding","hTickAndPadding","lineCount","textOffset","_getXAxisLabelAlignment","_getYAxisLabelAlignment","halfCount","tickTextAlign","labelPadding","_computeLabelArea","drawBackground","drawGrid","drawLine","setLineDash","lineDashOffset","drawBorder","lastLineWidth","drawLabels","renderTextOptions","drawTitle","titleX","titleY","titleArgs","tz","gz","bz","axisID","_maxDigits","fontSize","TypedRegistry","isForType","isPrototypeOf","parentScope","isIChartComponent","itemDefaults","defaultRoutes","routes","propertyParts","sourceName","sourceScope","routeDefaults","registerDefaults","Registry","controllers","_typedRegistries","_each","addControllers","_len3","_key3","_len4","_key4","addPlugins","_len5","_key5","addScales","_len6","_key6","getController","_get","getPlugin","getScale","removeControllers","_len7","_key7","removeElements","_len8","_key8","removePlugins","_len9","_key9","removeScales","_len10","_key10","typedRegistry","reg","_getRegistryForType","_exec","itemReg","camelMethod","PluginService","_init","_createDescriptors","descriptor","plugin","invalidate","_oldCache","_notifyStateChanges","localIds","allPlugins","getOpts","pluginOpts","createDescriptors","previousDescriptors","pluginScopeKeys","getIndexAxis","datasetDefaults","idMatchesAxis","determineAxis","_len11","scaleOptions","_key11","getAxisFromDataset","mergeScaleConfig","chartDefaults","configScales","chartIndexAxis","scaleConf","boundDs","retrieveAxisFromDatasets","defaultId","getDefaultScaleIDFromAxis","defaultScaleOptions","defaultID","getAxisFromDefaultScaleID","initOptions","keyCache","keysCached","cachedKeys","generate","addIfFound","_config","initConfig","_scopeCache","_resolverCache","clearCache","datasetType","additionalOptionScopes","_cachedScopes","mainScope","resetCache","keyLists","chartOptionScopes","subPrefixes","getResolver","hasFunction","needContext","resolverCache","KNOWN_POSITIONS","positionIsHorizontal","compare2Level","onAnimationsComplete","onComplete","onAnimationProgress","onProgress","getCanvas","instances","getChart","moveNumericKeys","intKey","getSizeForArea","Chart","invalidatePlugins","userConfig","initialCanvas","existingChart","OffscreenCanvas","_detectPlatform","_aspectRatio","_metasets","_lastEvent","_listeners","_responsiveListeners","_sortedMetasets","_plugins","_hiddenIndices","attached","_doResize","resizeDelay","_initialize","bindEvents","_resizeBeforeDraw","_resize","newSize","newRatio","ensureScalesHaveIDs","axisOptions","buildOrUpdateScales","scaleOpts","updated","isRadial","dposition","dtype","scaleType","hasUpdated","_updateMetasets","_destroyDatasetMeta","_removeUnreferencedMetasets","buildOrUpdateControllers","newControllers","order","ControllerClass","_resetElements","animsDisabled","_updateScales","_checkEventBindings","_updateHiddenIndices","_minPadding","_updateLayout","_updateDatasets","_eventHandler","_updateHoverStyles","existingEvents","newEvents","unbindEvents","changes","_getUniformDataChanges","datasetCount","makeSet","changeSet","noArea","_idx","_updateDataset","layers","_drawDatasets","_drawDataset","useClip","getDatasetArea","getElementsAtEventForMode","setDatasetVisibility","_updateVisibility","_stop","toBase64Image","toDataURL","bindUserEvents","bindResponsiveEvents","_add","_remove","detached","updateHoverStyle","getActiveElements","setActiveElements","activeElements","lastActive","pluginId","hoverOptions","deactivated","activated","inChartArea","eventFilter","_handleEvent","_getActiveElements","isClick","_isClickEvent","lastEvent","determineLastEvent","parseBorderRadius$1","angleDelta","borderRadius","halfThickness","innerLimit","computeOuterLimit","outerArcLimit","outerStart","outerEnd","innerStart","innerEnd","rThetaToXY","theta","pathArc","pixelMargin","innerR","spacingOffset","avNogSpacingRadius","angleOffset","outerStartAdjustedRadius","outerEndAdjustedRadius","outerStartAdjustedAngle","outerEndAdjustedAngle","innerStartAdjustedRadius","innerEndAdjustedRadius","innerStartAdjustedAngle","innerEndAdjustedAngle","outerMidAdjustedAngle","pCenter","p4","innerMidAdjustedAngle","p8","outerStartX","outerStartY","outerEndX","outerEndY","fullCircles","lineJoin","angleMargin","clipArc","ArcElement","chartX","chartY","rAdjust","nonZeroBetween","betweenAngles","withinRadius","halfAngle","halfRadius","radiusOffset","drawArc","setStyle","lineCap","pathVars","paramsStart","paramsEnd","segmentStart","segmentEnd","outside","pathSegment","lineMethod","stepped","getLineMethod","fastPathSegment","prevX","lastY","avgX","countX","pointIndex","drawX","truncX","_getSegmentMethod","usePath2D","Path2D","_path","strokePathWithCache","segmentMethod","strokePathDirect","LineElement","_points","_segments","_pointsUpdated","findStartAndEnd","solidSegments","_computeSegments","_interpolate","_getInterpolationMethod","interpolated","inRange$1","hitRadius","PointElement","mouseY","inXRange","inYRange","hoverRadius","getBarBounds","bar","half","skipOrLimit","boundingRects","maxW","maxH","parseBorderWidth","maxR","enableBorder","parseBorderRadius","outer","skipX","skipY","addNormalRectPath","inflateRect","refRect","BarElement","addRectPath","positioners","average","xSet","xAverage","eventPosition","nearestElement","tp","pushOrConcat","toPush","splitNewlines","createTooltipItem","formattedValue","getTooltipSize","tooltip","footer","boxWidth","boxHeight","bodyFont","titleFont","footerFont","titleLineCount","footerLineCount","bodyLineItemCount","combinedBodyLength","bodyItem","before","after","beforeBody","afterBody","titleSpacing","titleMarginBottom","displayColors","bodySpacing","footerMarginTop","footerSpacing","widthPadding","maxLineWidth","determineXAlign","yAlign","chartWidth","xAlign","caret","caretSize","caretPadding","doesNotFitWithAlign","determineAlignment","determineYAlign","getBackgroundPoint","alignment","paddingAndSize","alignX","alignY","getAlignedX","getBeforeAfterBodyLines","overrideCallbacks","defaultCallbacks","beforeTitle","tooltipItems","labelCount","afterTitle","beforeLabel","tooltipItem","labelColor","labelTextColor","bodyColor","labelPointStyle","afterLabel","beforeFooter","afterFooter","invokeCallbackWithFallback","Tooltip","opacity","_eventPosition","_size","_cachedAnimations","_tooltipItems","dataPoints","caretX","caretY","labelColors","labelPointStyles","labelTextColors","createTooltipContext","getBeforeBody","getBody","bodyItems","scoped","getAfterBody","getFooter","_createItems","itemSort","positionAndSize","backgroundPoint","external","drawCaret","tooltipPoint","caretPosition","getCaretPosition","x3","y3","ptX","ptY","rtlHelper","titleColor","_drawColorBox","colorX","rtlColorX","yOffSet","colorY","usePointStyle","drawOptions","multiKeyBackground","outerX","innerX","strokeRect","drawBody","bodyAlign","bodyLineHeight","xLinePadding","fillLineOfText","bodyAlignForCalculation","textColor","drawFooter","footerAlign","footerColor","tooltipSize","quadraticCurveTo","_updateAnimationTarget","animX","animY","_willRender","hasTooltipContent","globalAlpha","textDirection","positionChanged","_positionChanged","_ignoreReplayEvents","findOrAddLabel","addedLabels","addIfString","_getLabelForValue","CategoryScale","_startValue","_valueRange","_addedLabels","added","generateTicks$1","generationOptions","dataRange","precision","maxTicks","maxDigits","includeBounds","maxSpaces","rmin","rmax","countDefined","minSpacing","niceMin","niceMax","numSpaces","rounded","almostWhole","relativeLabelSize","LinearScaleBase","_endValue","handleTickRangeOptions","setMin","setMax","minSign","maxSign","getTickLimit","stepSize","computeTickLimit","LinearScale","log10Floor","changeExponent","isMajor","tickVal","steps","rangeExp","rangeStep","generateTicks","minExp","exp","startExp","lastTick","LogarithmicScale","_zero","getTickBackdropHeight","determineLimits","fitWithPointLabels","_padding","valueCount","_pointLabels","pointLabelOpts","additionalAngle","centerPointLabels","getPointLabelContext","getPointPosition","drawingArea","plFont","textSize","updateLimits","setCenterPoint","_pointLabelItems","itemOpts","createPointLabelItem","isNotOverlapped","buildPointLabelItems","hLimits","vLimits","outerDistance","pointLabelPosition","yForAngle","getTextAlignForAngle","leftForTextAlign","drawPointLabelBox","backdropLeft","backdropTop","backdropWidth","backdropHeight","pathRadiusLine","RadialLinearScale","leftMovement","rightMovement","topMovement","bottomMovement","scalingFactor","getValueForDistanceFromCenter","scaledDistance","pointLabel","createPointLabelContext","distanceFromCenter","getBasePosition","getPointLabelPosition","drawPointLabels","gridLineOpts","drawRadiusLine","animate","INTERVALS","millisecond","common","second","minute","hour","quarter","UNITS","sorter","adapter","_adapter","isoWeekday","_parseOpts","determineUnitForAutoTicks","minUnit","capacity","addTick","timestamps","ticksFromTimestamps","majorUnit","setMajorTicks","TimeScale","_unit","_majorUnit","_offsets","_normalized","displayFormats","_applyBounds","_getLabelBounds","getLabelTimestamps","timeOpts","_generate","_filterBetween","_getLabelCapacity","determineUnitForFormatting","determineMajorUnit","initOffsets","offsetAfterAutoskip","getDecimalForValue","weekday","hasWeekday","getDataTimestamps","tooltipFormat","datetime","fmt","_tickFormatFunction","minorFormat","majorFormat","offsets","_getLabelSize","ticksOpts","tickLabelWidth","cosRotation","sinRotation","tickFontSize","exampleTime","exampleLabel","prevSource","nextSource","prevTarget","nextTarget","TimeSeriesScale","_table","_minPos","_tableRange","_getTimestampsForTable","buildLookupTable","dayjs","AdvancedFormat","QuarterOfYear","LocalizedFormat","CustomParseFormat","isoWeek","FORMATS","_adapters","valueType","isValid","valueOf","_format","validatedWeekday","defaultDatasetIdKey","reforwardRef","setLabels","currentData","nextLabels","setDatasets","nextDatasets","datasetIdKey","addedDatasets","nextDataset","currentDataset","cloneData","nextData","ChartComponent","redraw","fallbackContent","updateMode","canvasProps","canvasRef","chartRef","renderChart","Chart$1","destroyChart","nextOptions","setOptions","createTypedChart","registerables","Line","clamp","lower","upper","resolveOption","realtimeOpts","realtime","streamingOpts","getAxisMap","axisMap","axisId","cancelAnimFrame","cancelAnimationFrame","stopFrameRefreshTimer","frameRequestID","stopDataRefreshTimer","refreshTimerID","refreshInterval","startDataRefreshTimer","newInterval","scaleValue","transitionable","initAnnotationPlugin","BoxAnnotation","LineAnnotation","PointAnnotation","resolveBoxAnnotationProperties","resolveElementProperties","resolveLineAnnotationProperties","resolvePointAnnotationProperties","xScaleID","yScaleID","xMin","xMax","yMin","yMax","$streaming","updateBoxAnnotation","updateLineAnnotation","xValue","yValue","updatePointAnnotation","transitionKeys$1","update$1","me","chartStates","storeOriginalScaleOptions","originalScaleOptions","opt","zoomRealTimeScale","zoom","minDuration","maxDuration","minDelay","maxDelay","newDuration","maxPercent","newDelay","panRealTimeScale","attachChart","zoomPlugin","resetZoom","zoomFunctions","panFunctions","initZoomPlugin","realtimeOptions","resetRealTimeScaleOptions","detachChart","removeState","datasetPropertyKeys","RealTimeScale","$realtime","ttl","removalRange","datalabels","clean","majorTicksOpts","majorEnabled","refresh","nextRefresh","newFrameRate","frameDuration","newNextRefresh","startFrameRefreshTimer","annotations","annotationPlugin","_getState","getElements","scroll","maxArray","minArray","milliseconds","determineStepSize","majorTicksEnabled","quiet","transitionKeys","_mode","lastMouseEvent","StreamingPlugin","beforeInit","mouseEventListener","afterInit","attachChart$1","detachChart$1","beforeDatasetUpdate","afterDatasetUpdate","beforeDatasetDraw","afterDatasetDraw","beforeEvent","afterDestroy","onRefresh","Blue","Green","Red","ThemeColors","blue","green","red","yellow","afterBuildTicksCallback","getY","tickCallback","tickStep","buildInitialDatasets","yOptions","buildYOptions","formatBitrate","toLocaleString","formatBpsBitrate","renderDebugInfoLine","noValue","renderDebugInfoLabel","renderGeneralDebug","keepAliveState","_currentItem$locType","debugInfo","isPlayheadPositionFallback","playerState","totalTime","displayTime","renderHtmlVideoElementDebug","bufferChunkCount","bufferLength","elementHeight","elementWidth","playbackRate","videoHeight","videoWidth","renderShakaVideoDebug","_currentTrack$videoBa","_currentTrack$id","_currentTrack$videoId","_currentTrack$origina","_currentTrack$label","_currentTrack$width","_currentTrack$height","_currentTrack$languag","_currentTrack$videoMi","_currentTrack$videoCo","_currentTrack$roles$j","_currentTrack$frameRa","bufferingTime","completionPercent","corruptedFrames","decodedFrames","droppedFrames","estimatedBandwidth","gapsJumped","liveLatency","loadLatency","manifestTimeSeconds","maxSegmentDuration","pauseTime","playTime","stallsDetected","currentLevel","currentTrack","renderShakaAudioDebug","_currentTrack$audioBa","_currentTrack$id2","_currentTrack$audioId","_currentTrack$origina2","_currentTrack$label2","_currentTrack$languag2","_currentTrack$audioMi","_currentTrack$audioCo","_currentTrack$roles$j2","renderSubtitlesDebug","_currentTrack$label3","_currentTrack$kind","_currentTrack$mimeTyp","areSubtitlesEnabled","currentTrackLabel","currentTrackDetails","renderLegacySubtitlesDebug","currentTrackIntro","getInitDataType","renderDrmDetails","drmTimeSeconds","licenseTime","renderDrmDebug","getBuffer","_state$debugInfo$shak","_state$debugInfo$shak2","getCurrentLevelAndTrack","getLevel","getResolution","getBandwidths","_currentTrack$videoBa2","requiredBandwidth","bufferYAxisCallback","resolutionAfterBuildTicksCallback","renderGraphs","levelGraph","Graph","panelContainer","panel","handleOnMouseDown","panelElt","closest","panelContainerElt","offsetTop","handleOnMouseUp","newLeft","newTop","maxLeft","maxTop","copyUrl","_currentTarget$getAtt","renderUrl","renderDebugOverlay","onCloseHandler","streamUrl","isDebugOverlayVisible","sendStreamStartRequest","streamId","BO_API_START_STREAM","REDUX_MSG_REQUEST_BO_STREAM_START","sendStreamStopRequest","bookmark","keepAlive","BO_API_STOP_STREAM","REDUX_MSG_REQUEST_BO_STREAM_STOP","sendNtgEntitlementGetRequest","entitlementGetUrl","REDUX_MSG_REQUEST_ENTITLEMENT_GET","sendNtgEntitlementReleaseRequest","entitlementReleaseUrl","REDUX_MSG_REQUEST_ENTITLEMENT_RELEASE","sendGetStreamsRequest","BO_API_GET_STREAMS","REDUX_MSG_REQUEST_BO_STREAMS_GET","stopOpenStreams","distributor","openStreamCount","stopStreamsForThisDevice","mapStreams","dataCollectionLastPlaybackTime","dataCollectionMessage","dataCollectionStartTime","externalSubtitles","forcedResumePosition","isBOStreamRequestPending","isCurrentItemBlackedOut","isOverlayVisible","isTimeshiftSwitching","isVideoQualityAuto","isVideofuturAsset","programInfoLoadStatus","NotStarted","resumePosition","resumeState","NotChecked","selectedVideoQuality","skipping","videoStreamData","PlayerView","handleShowDebugHotKey","videoPlayer","handleShowDebugOverlayHotKey","setDebugInfoUrls","checkDebugOverlayAutoOpen","autoOpenPlayerDebugPanel","stopBOStream","localSendVideofuturStreamStopRequest","currentVideofuturStreamId","getBookmark","toggleFullscreen","handleHideControlsHotKey","hideControls","handleShowInfoHotKey","handleInfoOnClick","handleBackwardHotKey","handleForwardHotKey","handlePreviousChannelHotKey","handleNextChannelHotKey","togglePlayVideo","handleExitHotKey","handleClose","handleVolumeDownHotKey","changeVolume","handleVolumeUpHotKey","setPlaybackRate","playbackRateIndex","handleSlowerHotKey","handleFasterHotKey","handleNormalSpeedHotKey","handleLevelControlKey","updateTimeshiftStatus","initializeMediaController","mcLoadProgramImage","mcSkipBackward","mcSkipForward","videoController","showOverlay","currentFeedItemTime","startDebugInfoMetricsTimer","resetDebugInfoMetricsTimer","debugInfoMetricsTimer","updateDebugInfoMetrics","resetOverlayTimer","overlayTimer","resetResumeTimer","resumeTimer","resetClickTimer","clickTimer","displayChannelNotAvailableMsg","finishZapping","displayErrorMessage","isLargeNotificationNeeded","msgText","codeElement","handleAuthenticationRequired","promptUserToCancelDownload","operationId","localShowConfirmation","cancelDownloadConfirmationClosedCallback","closePlayer","isSafariWorkaround","closeCallback","closeConfirmation","sendCurrentPlayerState","stopDataCollection","fscreen","stopVideo","FinalStop","checkEnd","isFirstPass","updateViewingHistory","localUpdateViewingHistory","Done","NoResumePosition","getViewingHistoryItem","exactPlayheadPosition","lastViewingHistoryItem","viewingHistoryIds","getViewingHistoryIds","lastLocationId","lastPlayheadPosition","buildViewingHistoryItem","episodeItem","seriesItem","shouldEpisodeBeAdded","maxPosition","newWatchingstatus","playerItem","stateViewingHistoryId","getResumeData","_episodes$find","PromptUserIfNeeded","checkResumePosition","fullLocationId","currentResumeState","resumeData","_seriesMetadata$id2","stopMediametrie","mediametrie","stopType","sendStreamStop","setInitAudioAndSubtitlesLanguages","autoSelectAudioTrack","autoSelectSubtitlesTrack","lastAudioTrack","lastSubtitlesTrack","bufferLoaded","playerError","liveBufferLengthUpdated","playbackEnded","playbackPaused","playbackPlaying","playbackTimeUpdated","safariVodWorkaround","streamInfoUpdated","streamInitialized","createVideoPlayer","PlayerShaka","startVideoInternal","errorAction","deviceSettings","getSettingValueByNameFromDeviceSettings","startVideoWithPromise","startVideoWithPromiseSuccess","trackingUrl","dataWithLanguage","REFRESH_PURCHASE_LIST","DOMException","startVideo","Initialization","startIfReady","isPlayStarted","openOfflineContent","offlineContent","loadImageFromAssetId","openTVItem","initialChannelId","loadImageFromMetadata","checkLiveRecordingStatus","initializePlayer","isBeingLiveRecorded","openTrailerItem","getSubtitlesFromMetadata","handleVodPlayError","_errorMsg","maxNbStreams","_result$variables","maxNbStreamsStr","variables","buildBOErrorResponse","BO_STREAM_MAX_CONCURRENT_STREAMS_REACHED","BO_STREAM_NO_SVOD_CONTENT_RIGHT","BO_STREAM_INVALID_USER_IP","openVodItem","localCreateVodStreamFromId","localCreateSvodStreamFromId","localLocationId","createStream","createStreamWithRetry","localStopOpenStreams","isRetry","createdStream","startVideofuturStream","loadVodLocationMetadata","newState","initializeVideofuturData","isRestartingSession","redirectUrl","initializeKeepAliveIfRequired","startDataCollection","initializeCatchupPlayer","checkEndFunction","launchPlayer","initializeRecordingPlayer","loadLiveItemLocationMetadata","checkBlackOut","initializeLivePlayer","locEndMargin","tracking","locStartMargin","locUserViewEndOffset","locUserViewStartOffset","playbackUrlDefinition","setTimeshiftSwitch","isSwitching","isoDuration","dataCollectionSettings","frequency","rampUp","streamTypes","playbackDuration","sessionDuration","sessionGuid","finalizeDataCollectionStart","dataCollectionRampUpTimers","dataCollectionSamplingTimer","stopProgramDataCollection","useLastPosition","restartProgramDataCollection","updateProgramDataCollection","_draft$channel$epgid","_draft$channel","_draft$location","dcMsg","localChannelId","_dcMsg$playbackDurati","checkPlaybackDuration","errorDetails","playerSessionStart","playerSessionDuration","onFullScreenChange","checkCurrentPlayedItem","checkResumeState","Seeking","isForbidden","_this$videoPlayer$get","_this$videoPlayer","_videoStreamData$drm","_videoStreamData$type","_videoStreamData$url","restartSession","toggleDebugInfoMetrics","commonMetrics","getCommonMetrics","specificMetrics","initializeDebugInfo","playerDuration","durationWithMargins","promptUserToResume","isAutoResumeEnabled","resumeConfirmationClosedCallback","startPosition","nextPosition","getTrackFromLang","autoSelectTracks","isSubtitlesAutoSelectionApplied","_subtitlesTrack$index","subtitlesTrack","setSubtitlesTrack","currentAudioTrack","currentSubtitlesTrack","subtitlesTracks","_currentAudioTrack$in","_currentSubtitlesTrac","handleStandardProgressBarSeekChanged","seekTime","handleLiveProgressBarSeekChanged","forcePlay","newTime","findPlayedItemInEpgFeed","startVFVideoWithPromise","startTVVideoWithPromise","createVFStream","localSendVideofuturStreamCreateRequest","localSendVideofuturStreamStartRequest","startVFVideoWithPromiseErrorHandler","_result$variables2","startTVVideoWithPromiseWithoutEntitlement","urlLifecycleDms","startTVVideoWithPromiseWithEntitlement","entitlement","localSendNtgEntitlementGetRequest","entCustomData","entUrl","currentEntitlementParams","_errorCode","_message","ntgCode","NetgemNetworkCode","MissingDmsChannel","ConcurrencyLimit","Geolock","MissingRight","getRoundedDurationToISOString","sendVideofuturStreamStop","localSendNtgEntitlementReleaseRequest","skipValue","brieflyShow","handleSkipBackwardOnClick","handleSkipForwardOnClick","newVolume","handleVolumeChanged","setAudioTrack","saveSetting","handleNewAudioTrackSelected","handleNewSubtitlesTrackSelected","handleNewVideoQualitySelected","handleGoToLiveOnClick","handleGoBackToLiveHotKey","handleExitFullScreenOnClick","handleEnterFullScreenOnClick","handleOnMouseMoveOnVideo","handleOnClickOnVideo","executeDoubleClick","handleOnMouseEnterController","isOverlayHovered","handleOnMouseLeaveController","hideOverlay","thenHide","hidePlayPicto","notifyDataCollector","_this$keepAlive","handlePauseOnClick","handlePlayOnClick","getTileType","handleDownloadOnClick","_seriesMetadata$id3","inProgressDownloadOperationId","displayedSectionCount","isOpenFromPlayer","isTimeshifting","isZapping","nextChannel","currentProgramId","matchingProgramId","updateEpgInfo","ItemNotFound","LoadingSeriesMetadata","liveDuration","LoadingProgramMetadata","prevIsCurrentItemBlackedOut","isLivePlaybackEnabled","renderBlackOutOverlay","renderLoader","visibilityClass","InfiniteCircleLoaderArc","getVideoQuality","renderVideoController","_playerItem$type","VideoController","renderBackwardPicto","renderForwardPicto","renderPictos","backwardPicto","forwardPicto","playOrPausePicto","backwardClass","forwardClass","debugOverlayCloseHandler","playerOfflineContent","AUTHENTICATION_REQUIRED","prevIsBitrateLimited","prevChannel","prevCurrentItem","prevIsControllerEnabled","prevIsDebugOverlayVisible","prevIsOverlayVisible","prevResumeState","prevTimeshift","_keepAlive$getState","purchaseAndCreate","createResponse","purchaseResponse","BO_PURCHASE_SVOD_CONTENT_RIGHT_NOT_FOUND","BO_PURCHASE_ALREADY_PURCHASED_V2","sendBOStreamCreateRequest","localSendV8LocationEpgRequest","licence","sendBOStreamStartRequest","sendBOStreamStopRequest","isInitializingPlay","isMaskHidden","isMaskReduced","VideoCarouselView","reduceMask","enlargeMask","setTrailers","onFullscreenChange","VIDEO_CAROUSEL_FULLSCREEN_EXITED","enterFullscreen","controls","skipVideo","handleOnEnded","handleOnPause","handleOnPlay","handleOnVolumeChange","handleOnTimeUpdate","handleOnDoubleClick","playPromise","isPlayPromiseCancelled","handleTrailerHidden","wasTrailerPlayingBeforePause","handleTrailerVisible","VIDEO_CAROUSEL_EXIT_FULLSCREEN","VIDEO_CAROUSEL_TRAILER_HIDDEN","VIDEO_CAROUSEL_TRAILER_VISIBLE","prevIsPlaying","maskElement","controlsList","onDoubleClick","onEnded","onPause","onPlay","onTimeUpdate","onVolumeChange","getAvenueIndexFromId","getMainAvenue","isMain","getAvenueFromIndex","getUserInfoStatuses","paymentInfo","dunningStatus","invoiceStatus","subscriptions","statuses","PaymentStatus","Expiring","hasPaymentExpirationPoppedToday","lastNotification","notificationType","InvoiceStatus","Paid","Voided","SubscriptionStatus","Active","InTrial","NonRenewing","hasActiveSubscription","DunningStatus","InProgress","Exhausted","hasActiveSubscriptionForPlan","planId","defer","makeString","lastOfPathSeparatorRegExp","cleanKey","canNotTraverseDeeper","getLastOfPath","Empty","setPath","newValue","getPath","deepExtend","overwrite","regexEscape","_entityMap","escape","chars","looksLikeObjectPathRegExpCache","regExpMap","regExpQueue","getRegExp","regExpFromCache","regExpNew","deepFind","keySeparator","tokens","nextPath","getCleanedCode","consoleLogger","Logger","concreteLogger","forward","deprecate","lvl","debugOnly","moduleName","baseLogger","EventEmitter","observers","numListeners","numTimesAdded","ResourceStore","ns","defaultNS","ignoreJSONStructure","addNamespaces","removeNamespaces","getResource","lng","addResource","silent","addResources","resources","addResourceBundle","deep","skipCopy","removeResourceBundle","hasResourceBundle","getResourceBundle","compatibilityAPI","getDataByLanguage","hasLanguageSomeTranslations","postProcessor","addPostProcessor","translator","checkedLoadedFor","Translator","services","copy","changeLanguage","interpolation","extractFromKey","nsSeparator","wouldCheckForNsInKey","seemsNaturalLanguage","userDefinedKeySeparator","userDefinedNsSeparator","looksLikeObjectPath","possibleChars","ki","interpolator","nestingRegexp","lastKey","overloadTranslationOptionHandler","returnDetails","namespace","appendNamespaceToCIMode","usedKey","exactUsedKey","usedLng","usedNS","usedParams","getUsedParamsDetails","resUsedKey","resExactUsedKey","resType","joinArrays","handleAsObjectInI18nFormat","i18nFormat","handleAsObject","extendTranslation","usedDefault","needsPluralHandling","hasDefaultValue","defaultValueSuffix","pluralResolver","getSuffix","defaultValueSuffixOrdinalFallback","ordinal","needsZeroSuffixLookup","shouldUseIntlApi","pluralSeparator","isValidLookup","resForMissing","missingKeyNoValueFallbackToKey","updateMissing","fk","lngs","fallbackLngs","languageUtils","getFallbackCodes","fallbackLng","saveMissingTo","toResolveHierarchy","specificDefaultValue","defaultForMissing","missingKeyHandler","backendConnector","saveMissing","saveMissingPlurals","suffixes","getSuffixes","appendNamespaceToMissingKey","parseMissingKeyHandler","returnObjects","returnedObjectHandler","resTypeIsArray","newKeyToUse","deepKey","defaultVariables","skipInterpolation","skipOnVariables","nestBef","nb","na","nest","postProcess","postProcessorNames","applyPostProcessor","postProcessPassResolved","i18nResolved","extracted","fallbackNS","needsContextHandling","codes","utils","hasLoadedNamespace","finalKeys","addLookupKeys","pluralSuffix","zeroSuffix","ordinalPrefix","contextKey","contextSeparator","possibleKey","returnNull","returnEmptyString","resourceStore","optionsKeys","useOptionsReplaceForData","capitalize","LanguageUtil","supportedLngs","getScriptPartFromCode","formatLanguageCode","getLanguagePartFromCode","getCanonicalLocales","formattedCode","lowerCaseLng","specialCases","cleanCode","isSupportedCode","nonExplicitSupportedLngs","getBestMatchFromCodes","cleanedLng","lngOnly","supportedLng","fallbacks","fallbackCode","fallbackCodes","addCode","fc","sets","nr","_rulesPluralsTypes","nonIntlVersions","intlVersions","suffixesOrder","zero","one","two","few","many","PluralResolver","compatibilityJSON","PluralRules","rules","createRules","plurals","pluralRulesCache","addRule","getRule","cleanedCode","rule","lngPart","needsPlural","resolvedOptions","pluralCategories","getPluralFormsOfKey","pluralCategory1","pluralCategory2","pluralCategory","prepend","select","getSuffixRetroCompatible","noAbs","simplifyPluralSuffix","returnSuffix","deepFindWithDefaults","defaultData","getPathWithDefaults","regexSafe","Interpolator","escapeValue","escape$1","useRawValueToEscape","prefixEscaped","suffixEscaped","formatSeparator","unescapeSuffix","unescapePrefix","nestingPrefix","nestingPrefixEscaped","nestingSuffix","nestingSuffixEscaped","nestingOptionsSeparator","maxReplaces","alwaysFormat","resetRegExp","getOrResetRegExp","existingRegExp","lastIndex","regexp","regexpUnescape","replaces","handleFormat","interpolationkey","missingInterpolationHandler","safeValue","todo","matchedVar","temp","clonedOptions","handleHasOptions","inheritedOptions","sep","optionsString","matchedSingleQuotes","matchedDoubleQuotes","doReduce","createCachedFormatter","optForCache","formatParams","Formatter","DateTimeFormat","relativetime","RelativeTimeFormat","ListFormat","addCached","mem","formatName","formatOptions","formatStr","optStr","trimmedKey","parseFormatStr","formatted","valOptions","Connector","backend","waitingReads","maxParallelReads","readingCalls","maxRetries","retryTimeout","queueLoad","toLoad","pending","toLoadLanguages","toLoadNamespaces","hasAllNamespaces","reload","loaded","pushPath","removePending","loadedKeys","fcName","tried","prepareLoading","loadOne","isUpdate","clb","initImmediate","preload","partialBundledLanguages","tDescription","transformOptions","I18n","inst","modules","isInitialized","isClone","isInitializing","defOpts","createClassOnDemand","ClassOrObject","lu","languageDetector","detection","deferred","finish","initializedStoreOnce","loadResources","usedCallback","resolvedLanguage","setResolvedLanguage","reloadResources","use","li","lngInLngs","_this2","isLanguageChangingTo","setLngProps","setLng","cacheUserLanguage","getFixedT","keyPrefix","_this3","fixedT","resultKey","setDefaultNamespace","lastLng","loadNotPending","loadState","precheck","preResult","loadNamespaces","loadLanguages","preloaded","newLngs","createInstance","cloneInstance","forkResourceStore","sendV8AssetIdForDeeplinkRequest","deeplinkParameter","cncProgramGetUrl","cncSeriesGetUrl","deeplinkProgramGetUrl","deeplinkSeriesGetUrl","sendV8AssetIdForDeeplinkRequestV2","sendV8AssetIdForDeeplinkRequestV1","cncParameter","sendV8CustomStrategyRequest","REDUX_MSG_REQUEST_CUSTOM_STRATEGY","ChargebeeWrapper","genericErrorCallback","drawingsDescription","drawings","showEE","generatedDrawing","getDrawing","NpvrManagement","isHeaderLoaded","previousVerticalPosition","safariWorkaroundBackoffTime","safariWorkaroundItem","safariWorkaroundProgress","LoadedHeaderState","MainLayoutView","setDebugFunctions","localDeleteWishlist","localTogglePackPurchase","dbg","i18next","checkVersion","CHECK_VERSION","deleteWhishlistFromCloud","flushDataCollector","getAssetMetadata","getLogLevel","notifyError","autoClose","notifyInfo","notifySuccess","notifyWarning","inMs","openNpvr","openNpvrManagementScreen","refreshAuthToken","REFRESH_AUTHENTICATION_TOKEN","refreshHub","REFRESH_HUB","setSetting","showChargebeeInfo","showChargebeeDebug","showHotKeys","togglePackPurchase","resetSafariWorkaroundTimer","safariWorkaroundTimer","handleOnLogoLoaded","checkVisibility","handleOnScroll","mainLayout","enterTheaterMode","localEnterTheaterMode","extendedItem","closeModal","storePosition","exitTheaterMode","localExitTheaterMode","localReopenModalCard","openFromCard","playerExit","handleTheaterModeExited","restorePosition","moveToTop","savePosition","buildPreviousPositionKey","_focusedAvenue$hubIte","_focusedAvenue$hubIte2","_focusedAvenue$search","openCard","fullItem","previousCard","loadHubFromUrlDefinition","localSendV8CustomStrategyRequest","exploreAvenueIndex","_focusedAvenue$type","avenueType","openPlayer","executeItemClick","NETGEM_API_V8_WIDGET_ITEM_CLICK_ACTION_SWITCH","executeAction","assetSeriesId","switchItem","onItemClickSwitch","switchAction","NETGEM_API_V8_WIDGET_ITEM_CLICK_ACTION_HUB","NETGEM_API_V8_WIDGET_ITEM_CLICK_ACTION_PLAYER","openExploreModal","shouldBeReopenedLater","playerCloseCallback","retry","scheduleSafariWorkaroundProgress","handleOnSafariWorkaroundCompleted","loadAvenueFromId","getAvenueFromId","clearDisplayPaywallSubscription","displaySubscriptionPaywall","localShowAvenueModal","isDeeplinkHandled","checkDeeplink","localHubItem","view","CHECK_PENDING_OPERATION","decodedValue","openGlobalSettingsScreen","openDeeplinkCard","getMatchingRequest","localSendV8AssetIdForDeeplinkRequest","isNpvrFeatureEnabled","focusedExistingRecordingId","focusedFutureRecordingId","focusedScheduledRecordingId","openTileTypesAvenue","avenueKey","localSendV8HubRequest","openGridAvenue","manageSuperStream","guruWebsiteUrl","hasPods","openFooterPage","SHOW_PODS","localSearch","updateSectionSliding","isSliding","isSectionSliding","nativeEvent","composedPath","renderWorkingZoneContent","ImageCarousel","VideoCarousel","renderSafariWorkaroundLoader","CircleLoader","visibilityChangeEventName","APPLICATION_FULLY_LOADED","MANAGE_SUPER_STREAM","OPEN_TILE_TYPES_AVENUE","OPEN_GRID_AVENUE","_mainAvenue$index","_mainAvenue$type","localResetSectionPageIndices","prevFocusedAvenue","prevHub","onScroll","Footer","Header","MainLayout","updateDisplayPaywallSubscription","deleteWishlist","reopenModalCard","resetSectionPageIndices","avenueData","showAvenueModal","SMART_BANNER_TAG_NAME","MainView","checkDefaultSubtitles","defaultSubtitles","startHubRefreshTimer","hubRefreshTimer","resetHubRefreshTimer","localGetAllRecordings","localGetAllScheduledRecordings","refreshPersonalDataInternal","refreshPurchaseList","isBORunning","localGetPurchaseList","refreshViewingHistory","localGetViewingHistory","refreshWishList","isTVEnabled","localGetWishlist","localGetFavoriteList","localFunction","clearPurchaseList","localClearPurchaseList","clearViewingHistory","localClearViewingHistory","clearWishList","localClearFavoriteList","localClearWishList","clearNpvr","localClearExistingRecordings","localClearFutureRecordings","localClearScheduledRecordings","showLegalNotice","showCard","refreshPersonalData","openConsentSettings","handleDidomiReady","localUpdateDeeplink","_document$head","currentTag","updateSmartBannerTag","isGoogleBot","pushState","CONSENT_OPEN_SETTINGS","CONSENT_RESET","REFRESH_VIEWING_HISTORY","REFRESH_WISH_LIST","CLEAR_PURCHASE_LIST","CLEAR_VIEWING_HISTORY","CLEAR_WISH_LIST","CLEAR_NPVR","SHOW_LEGAL_NOTICE","prevFocusedAvenueIndex","prevHubMaxAge","didomiApiKey","didomiNoticeId","updateExistingRecordings","clearBOFavoriteList","updateFutureRecordings","DEFAULT_RECORDINGS_STATUS_ITEM","expectedError","expectedSuccess","maxQuota","clearBOPurchaseList","updateScheduledRecordings","updateWholeViewingHistory","updateWishlist","getAllRecordings","getAllScheduledRecordings","distributors","allPurchaseLists","updateBOPurchaseListsForAllDistributors","getPurchaseList","getViewingHistory","getWishlist","setDeeplink","showCardModal","showLegalNoticeModal","AuthenticationRequiredModal","AvenueModalView","modalIndex","ImageDisplayType","getDisplayType","imageDisplayType","Unset","_cardData$programMeta","_cardData$seriesMetad","isItemPlayable","updateTitle","PlaceholderTVEpisode","PlaceholderVodEpisode","canBePlayed","TVEpisode","isSvodDisplayedAsCatchup","isPlayable","updateRecordStatus","focusedLocationId","isExpanded","onToggleExpandedState","stopImmediatePropagation","localCardData","handleErrorPictoOnClick","renderRecordErrorPicto","pictoElement","PictoWarning","renderActions","isFuture","PictoClockEmpty","renderContent","recordErrorPicto","liveRecordingElement","closedCallback","renderVodStatus","renderPurchaseStatus","isHeader","episodeIndexStr","episodesMetadata","expandedItemIndex","tileRenderer","EPISODES_FEED_LOADED","loadEpisodesMetadata","loadEpisodeMetadata","filteredMetadata","savedIndex","savedItemId","updateExpandedState","checkEpisodeType","_episodesMetadata$","getVodTileRenderer","getTVTileRenderer","propsMetadata","stateMetadata","getTVPlaceholderRenderer","getVodPlaceholderRenderer","handleOnToggleExpandedState","TVItem","VodItem","renderEpisodes","placeholderRenderer","lastLoadedIndex","cardItem","CardModalAvenue","loadAvenueFromUrlDefinition","destroyAvenue","createAvenue","selectedLocationId","sectionCount","sectionContainer","groupItemsBy","GroupItemsBy","SeriesSection","RegularSection","NETGEM_API_V8_CREDIT_ROLE_ACTOR","NETGEM_API_V8_CREDIT_ROLE_DIRECTOR","NETGEM_API_V8_CREDIT_ROLE_GUEST","NETGEM_API_V8_CREDIT_ROLE_PRESENTER","CAST_TOOLTIP","Distance","HideDelay","ShowDelay","WikipediaResultStatusType","textKey","PictoExternal","WIKI_PAGE_URL","Wikipedia","_Wikipedia","buildSummary","rawData","content_urls","desktop","pageUrl","revisions","authorsUrl","extract","extract_html","extractHtml","originalimage","getData","resultTitle","Success","summary","Notfound","Disambiguation","isNotFound","onTrigger","wikipediaUrl","wikipediaResult","setWikipediaResult","handleCastSummaryOnShow","ExternalLink","renderNotFoundContent","renderCastContent","allowHTML","appendTo","hideOnClick","interactive","onShow","labelKey","Credit","MAX_PEOPLE_BY_ROLE","keyByRole","orderedRoles","openTooltips","setOpenTooltips","handleOnHidden","tip","newOpenTooltips","handleOnTrigger","listByRole","CreditsByRole","addLinkedData","uploadDate","thumbnailUrl","regionsAllowed","REACT_APP_REGIONS_ALLOWED","getOrCreateScript","jsonLd","_document$querySelect","innerText","backgroundImageUrl","followedPictoClassName","isDeletable","isFollowed","portraitImageUrl","CardModalView","updateContentType","performPendingAddToFavorite","performPendingAddToWishlist","performPendingPurchase","performPendingPlay","toggleFavoriteInternal","_purchaseData$vodLoca","_purchaseData$vodLoca2","_purchaseData$vodLoca3","checkPlay","localGetImageSourceUrl","updateCard","loadItemRelatedData","updateFollowedPictoClassName","prevIsFollowed","updateIsFollowed","_programMetadata$id","updateChannelImage","loadVodData","loadLandscapeImage","isPortraitAllowed","loadPortraitImage","loadEpisodesVodData","updateVodStatus","_vodStatus$viewingHis","_vodStatus$vtiId","cardDataLocal","openPreviousCard","renderTitleAndSynopsis","renderBroadcastTime","renderProgramOrSeriesInfo","isVodOrDeeplink","programInfo","renderVodActionPanel","isPlayButtonDisplayed","renderWishlistButton","renderTVActionPanel","getLiveProgress","isRecordingAllowed","renderActionPanelAndPricing","getBackTitle","renderTagline","tagline","renderSingleTVProgramInfo","scheduledRecordingElement","channelImage","programInfoElement","singleTVProgramInfoElement","actionPanel","tagLineElement","backgroundElement","coverElement","CreditsView","CardAvenue","prevCardData","prevWishlistStatus","prevLocType","prevSelectedLocation","getImageSourceUrl","ExternalContentModal","resetLoadTimer","loadTimer","handleMessagePosted","loadErrorCallback","externalContentUrl","PLAYER_SHORTCUT_LIST","feature","TRAILER_SHORTCUT_LIST","KeyboardShortcutsModalView","getKeyRepresentation","localizedKey","renderShortcutTrigger","renderShortcut","shortcut","renderShortcutList","titleKey","LegalNoticeModalView","locales","localesDefault","legalInformation","defaultLegalInformation","localizedLegalInformation","getLocalizedStringFromAppConf","MessageModal","messageData","buttonText","NewVersionModal","NpvrHelpModalView","npvrTotalQuota","quota","availability","concurrency","getNpvrTotalQuota","npvrRecordingsFutureStatus","DrmDiagnosis","dmsSettings","videoDiagContainer","videoDiagContent","videoDiagLegend","cleanUpNotify","isCleaning","errorMessage","returnResult","runDiagnosis","isAvailable","drmDiagnosticLAUrl","drmDiagnosticStreamUrl","safari","canParseUrl","sendPurchaseStatusRequest","BO_API_PURCHASE_STATUS","REDUX_MSG_REQUEST_BO_PURCHASE_STATUS","drmLicense","appliedPromocode","errorMessageKey","isApplyingPromocode","isPaying","promocodeError","rentValidity","VodPurchaseModalView","buildPurchaseTitle","applyPromocode","_episodeCount","seriesTitles","episodeCount","fixedEpisodeTitle","line1","line2","getFullTitle","_this$formatLicenceDu","formatLicenceDuration","handlePlayNowButtonOnClick","_localVodLocation$pro","_localVodLocation$pro2","_localVodLocation$pur","_localVodLocation$pur2","vodLocationMetadataState","localVodLocation","handlePlayLaterButtonOnClick","handlePromocodeOnChange","validity","handlePromocodeOK","originalPrice","getLocalizedErrorMessage","BO_PURCHASE_INVALID_CONTENT","BO_PURCHASE_INVALID_USER_IP","promocodeAppliedCallback","BO_PURCHASE_INVALID_PROMOCODE","BO_PURCHASE_INVALID_PROMOCODE_FOR_TITLE","BO_PURCHASE_ALREADY_PURCHASED","BO_PURCHASE_DEVICE_NOT_FOUND","localGetPurchaseStatus","handleApplyPromocodeButtonOnClick","paidCallback","isNotFree","handlePayButtonOnClick","localShowMessage","purchaseInternal","isExternalCheckOutEnabled","localPurchase","openCheckOut","promoCode","discountPriceAsInteger","Timer","_ChargebeeWrapper","timedOut","renderTitles","handleInformationTooltipOnShow","helpTooltip","handleHideHotKey","handleInformationTooltipOnHide","closingEnableTimer","renderInformationTooltipContent","renderPurchaseValidity","_vodLocationMetadata$2","onHide","placement","clearPendingPurchase","_pendingOp$cardData$p","pendingOp","prevVodPurchaseData","getIdentity","_getBOSetting","sendBOPurchaseStatusRequest","showMessageModal","MODAL_COMPONENTS","AvenueModal","CardModal","ConfirmationModal","KeyboardShortcutsModal","LegalNoticeModal","NpvrHelpModal","NpvrModal","VodPurchaseModal","ModalContainer","modalProps","modalType","SpecificModal","fullProps","TOAST","styleSheet","cssText","createTextNode","Mt","getAutoCloseDelay","$t","enter","exit","appendPosition","collapseDuration","preventExitTransition","nodeRef","isIn","playToast","zt","Bt","Rt","onExited","scrollHeight","minHeight","ut","tt","containerId","removalReason","Ut","Ft","closeToast","toastProps","isRunning","controlledProgress","animationDuration","animationPlayState","Tt","defaultClassName","et","Xt","genToastId","_t","onClose","isActive","updateId","staleId","onOpen","toggle","removeToast","toasts","clearQueue","buildToast","toastStyle","toastClassName","progressClassName","deleteToast","setProps","setToggle","isToastActive","getSnapshot","Vt","bt","hasContainers","ht","mt","nt","rt","Et","Wt","At","kt","St","removalDistance","canCloseOnClick","canDrag","didMove","pauseOnHover","closeOnClick","draggableDirection","collapseAll","removeProperty","xt","Zt","pauseOnFocusLoss","hasFocus","onPointerDown","pointerType","draggablePercent","onPointerUp","pauseToast","toastRef","eventHandlers","loading","dismiss","dark","clearWaitingQueue","getToast","vt","Ot","Jt","_ref9","spinner","Nt","_ref10","eo","oo","wt","hideProgressBar","ariaLabel","it","ft","dt","fo","co","ot","fillRule","yt","tabIndex","customProgressBar","lt","_o","hotKeys","Lt","go","To","getToastToRender","Kt","Yt","newestOnTop","It","Dt","querySelectorAll","collapsed","yo","activeElement","ct","pointerEvents","_ref11","Notifier","notification","toast","notifyClose","_Notifier","getDeviceOS","buildDeviceUrl","deviceId","deviceName","getDeviceAndBrowser","appversion","deviceid","devicemodel","devicename","deviceos","deviceosversion","webview","urlParams","utmSource","utmMedium","utmCampaign","utm_source","utm_medium","utm_campaign","addGtmData","areSectionSettingsEqual","settings1","settings2","map1","map2","val1","_classPrivateFieldInitSpec","_assertClassBrand","_classPrivateFieldGet2","_classPrivateFieldSet2","encoder","decoder","TextDecoder","decode","alphabet","encoded","binary","bytes","decodeBase64","unencoded","toBase64","omitPadding","fromCharCode","subarray","btoa","encodeBase64","JOSEError","captureStackTrace","JWTClaimValidationFailed","claim","cause","JWTExpired","JOSEAlgNotAllowed","JOSENotSupported","JWSInvalid","JWTInvalid","asyncIterator","JWSSignatureVerificationFailed","alg","algorithm","saltLength","namedCurve","modulusLength","unusable","isAlgorithm","getHashLength","checkUsage","usage","usages","checkSigCryptoKey","expected","getNamedCurve","actual","types","withAlg","invalidKeyInput","subtle","importKey","isCryptoKey","isKeyObject","isJWK","kty","jwkMatchesOp","key_ops","expectedKeyOp","symmetricTypeCheck","jwk","isKeyLike","asymmetricTypeCheck","Err","recognizedDefault","recognizedOption","protectedHeader","joseHeader","crit","recognized","keyUsages","crv","subtleMapping","keyData","ext","handleJWK","cryptoKey","importJWK","export","toCryptoKey","handleKeyObject","keyObject","isPublic","extractable","asymmetricKeyType","asymmetricKeyDetails","_payload","_protectedHeader","_unprotectedHeader","FlattenedSign","_classPrivateFieldSet","setProtectedHeader","_classPrivateFieldGet","setUnprotectedHeader","unprotectedHeader","isDisjoint","b64","validateCrit","checkKeyType","b64u","normalizeKey","signature","getSignKey","checkKeyLength","subtleAlgorithm","jws","protected","_flattened","CompactSign","REGEX","numericDate","validateInput","normalizeTyp","validateClaimsSet","encodedPayload","typ","requiredClaims","issuer","subject","audience","maxTokenAge","presenceCheck","iss","audPayload","aud","audOption","checkAudiencePresence","tolerance","clockTolerance","secs","epoch","iat","nbf","age","JWTClaimsBuilder","structuredClone","jti","_jwt","SignJWT","setIssuer","setSubject","setAudience","setJti","jwtId","setNotBefore","setExpirationTime","setIssuedAt","sig","flattenedVerify","parsedProt","algorithms","validateAlgorithms","resolvedKey","verified","getVerifyKey","verify","jwtVerify","jwt","compactVerify","JwtKeyPrefix","buildKey","sha256","generateToken","userDeviceInfo","jose","crmUrl","overriddenAppConf","selectedAppConf","RegistrationView","clearCrmData","storeCrmData","extraData","authDeviceUrl","highlightedCommercialOffers","logoutUrl","pendingOperationType","utmParameters","anonymous","buildCrmUrl","applicationState","loginUrl","podsWebUrl","signupUrl","ApplicationState","SignUpDisplayed","showSignup","SubscribeDisplayed","showSubscribe","PodsDisplayed","showPods","showSignin","getBooleanValue","defaultValues","userDeviceInfoKeys","lcUserDeviceInfoKeys","lcKey","boolValue","hideHeaderCallback","localRegisterApplication","registrationFailureCallback","SHOW_GUEST_MODE","ACCOUNT_CREATED","SUBSCRIBED","userDeviceInfoJwt","handleCloseDebugPanelOnClick","closeDebugPanelCallback","handleRevertAppConfOnClick","handleApplyAppConfOnClick","handleAppConfUrlOnChange","renderOverriddenAppConf","isDebugPanelVisible","renderAppConf","renderDebugPanel","overriddenAppConfElt","appConfElt","crmLoadTimeoutCallback","_state$appConfigurati3","_state$appConfigurati4","getChannelsByTag","channel1","channel2","createTagListAliases","sendV8ListAliasMultiRequest","listAliasMultiUrl","REDUX_MSG_REQUEST_LIST_ALIAS_MULTI","bodyParam","alias","updateListAlias","sendUserRightsRequest","rightsUserUrl","updateUserRights","DmsNetworkCode","Created","MissingOrInvalidParameters","MissingOrInvalidRequiredParameters","MissingOrInvalidAuthenticationToken","InvalidChallenge","UnknownDevice","InvalidExchange","InvalidDevice","MalformedJson","UnknownError","getMessageFromErrorCode","REDUX_MSG_REQUEST_GET_DEVICE_CHANNELS","UNKNOWN","versionApp","appInfo","displayResolution","screenResolution","REDUX_MSG_REQUEST_GET_DEVICE_SETTINGS","sendLoginRequest","oem","isFirstToken","REDUX_MSG_REQUEST_LOGIN","setNtgUrlDefinition","apiKeyId","timeRound","HttpMethod","GET","discoveryResult","dataCollection","game","personalData","REDUX_MSG_HUB_URL","REDUX_MSG_DEFAULT_HUB_URL","multi","listAliasMulti","post","listAliasPost","REDUX_MSG_LIST_ALIAS_MULTI_URL","REDUX_MSG_LIST_ALIAS_URL","metadataProgram","REDUX_MSG_METADATA_PROGRAM_URL","imageWithVariant","metadataImageWithVariant","REDUX_MSG_METADATA_IMAGE_WITH_VARIANT_URL","schedule","metadataSchedule","REDUX_MSG_METADATA_SCHEDULE_URL","metadataChannels","REDUX_MSG_METADATA_CHANNELS_URL","catchupForAsset","epg","epgForAsset","vodForAsset","REDUX_MSG_LOCATION_CATCHUP_FOR_ASSET_URL","REDUX_MSG_LOCATION_EPG_URL","REDUX_MSG_LOCATION_EPG_FOR_ASSET_URL","REDUX_MSG_LOCATION_VOD_FOR_ASSET_URL","entitlementGet","entitlementRelease","REDUX_MSG_REQUEST_ENTITLEMENT_GET_URL","REDUX_MSG_REQUEST_ENTITLEMENT_RELEASE_URL","recordingsDelete","future","recordingsFuture","recordingsList","recordingsMetadata","recordingsQuota","recordingsRetry","recordingsStop","schRecordingsCreate","schRecordingsDelete","schRecordingsList","listFull","schRecordingsListFull","schRecordingsMetadata","schRecordingsUpdate","REDUX_MSG_NPVR_RECORDINGS_DELETE_URL","REDUX_MSG_NPVR_RECORDINGS_FUTURE_URL","REDUX_MSG_NPVR_RECORDINGS_LIST_URL","REDUX_MSG_NPVR_RECORDINGS_METADATA_URL","REDUX_MSG_NPVR_RECORDINGS_QUOTA_URL","REDUX_MSG_NPVR_RECORDINGS_RETRY_URL","REDUX_MSG_NPVR_RECORDINGS_STOP_URL","REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_CREATE_URL","REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_DELETE_URL","REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_LIST_URL","REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_METADATA_URL","REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_UPDATE_URL","REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_LIST_FULL_URL","cnc","REDUX_MSG_CNC_PROGRAM_GET_URL","REDUX_MSG_CNC_SERIES_GET_URL","REDUX_MSG_DEEPLINK_PROGRAM_GET_URL","REDUX_MSG_DEEPLINK_SERIES_GET_URL","single","perUser","personalDataDelete","personalDataGet","personalDataPost","REDUX_MSG_PERSONAL_DATA_POST_URL","REDUX_MSG_PERSONAL_DATA_GET_URL","REDUX_MSG_PERSONAL_DATA_DELETE_URL","personalDataListDelete","personalDataListGet","personalDataListPost","REDUX_MSG_PERSONAL_DATA_LIST_POST_URL","REDUX_MSG_PERSONAL_DATA_LIST_GET_URL","REDUX_MSG_PERSONAL_DATA_LIST_DELETE_URL","coldStack","hotStack","REDUX_MSG_DATA_COLLECTION_COLD_POST_URL","REDUX_MSG_DATA_COLLECTION_HOT_POST_URL","REDUX_MSG_RIGHT_COMMERCIAL_OFFERS_URL","REDUX_MSG_RIGHT_DEFAULT_RIGHTS_URL","REDUX_MSG_RIGHT_USER_RIGHTS_URL","perAsset","REDUX_MSG_PURCHASE_INFO_PER_ASSET_URL","enablePackPurchaseApi","getGamestreamToken","REDUX_MSG_GAMESTREAM_TOKEN_GET_URL","compareStreamTypes","STREAM_TYPE_PRIORITIES","toBoolean","consolidateChannels","dmsChannels","channelsInfo","ptfChannels","dmsChannel","ptfChannel","playback","pbs","pb","videostreamParam","s1","s2","consolidateChannel","_dmsChannel$data","_dmsChannel$data2","hasCatchup","hasKeepFromReplay","hasStartover","isSeekable","channelHasCatchup","cleanedMetrics","_images$0$id","consolidatedChannel","hasTimeshift","metadataChannelsUrl","updateDeviceChannels","CancellablePromise","getPromise","abortHandler","abortHandlerController","signalPromise","race","_this$abortHandlerCon","getETagFromRequest","req","responseHeaders","getAllResponseHeaders","_result$","notifySentry","customNetworkError","isErrorExcluded","Unauthorized","getResponseHeader","customCode","BO_PURCHASE_SVOD_CONTENT_RIGHT_NOT_FOUND_V2","BO_PURCHASE_INVALID_USER_IP_V2","BO_PURCHASE_INVALID_PROMOCODE_V2","BO_PURCHASE_INVALID_PROMOCODE_FOR_TITLE_V2","customMessage","customStatus","getCustomStatus","commonPromisedXMLHttpRequest","expectedResponseType","requestHeaderList","requestParam","withCredentials","networkErrorCallBack","initialPromise","baseUrl","responseXML","commonNetworkErrorCallBack","_response$body","createCustomNetworkError","buildUrl","urlWithParameters","sendAuthenticationRequest","baseurl","authenticationEndpoint","updateBOState","authenticationUrl","REDUX_MSG_REQUEST_BO_AUTHENTICATE","apiName","queryStringParameters","sendDiscoveryRequestForDistributor","boV2ServiceInfoUrl","discoveryUrl","discoveryEndpoint","REDUX_MSG_REQUEST_BO_DISCOVERY","distributorDef","urls","POST","BO_API_DELETE_FAVORITE","BO_API_FAVORITE_LIST","BO_API_PERSONAL_DATA","distributorDefinition","REDUX_MSG_DISTRIBUTOR_ADD","sendVideofuturPersonalDataRequest","REDUX_MSG_REQUEST_BO_PERSONAL_DATA","updateBOProductId","formatMs","Padding","InitSequence","Name","StepName","Version","VersionBO","VersionCrmBack","VersionCrmFront","Css","Initial","StepError","StepSuccess","QueryStatus","Disabled","ChannelList","ChannelsInfo","CommercialOffers","DefaultHub","DefaultRights","DeviceSettings","Discovery","Hub","ListAlias","Login","TagListAliases","UserRights","VideofuturAuthentication","VideofuturDiscovery","VideofuturPersonalData","VideofuturStopOpenStreams","STEPS","displayIndex","displayName","isOptional","currentSteps","durations","killedStreamCount","nextSteps","queryStatuses","stepProgress","StartView","isBOStepEnabled","prepareSteps","proceedToSecondStep","resetStartingTimer","startingTimer","handleToggleDebugPanelHotKey","onAnimationComplete","isAnimationFinished","checkInitializationSequenceEnd","successCallback","versionBO","versionCrmBack","versionCrmFront","areQueriesFinished","initializationSequenceEnd","initializationSequenceStart","orderedSteps","isAppHidden","_stepDuration$padStar","stepStatus","stepDuration","statusStr","css","localDisplayName","localSendLoginRequest","unrecoverableFailureCallback","requestEnd","_this$rootStep$then","_this$rootStep$thenAf","rootStep","thenAfter","processCurrentSteps","filterCurrentSteps","disabledSteps","localDisabledSteps","newSteps","enabledSteps","stepCount","nextStepCount","hasStartedProcess","startedSteps","processStep","_parameters$map","handleStepError","failureCallback","handleVersionOnClick","localToggleDebugMode","DebugPicto","localCreateTagListAliases","localSendCommercialOfferRequest","localSendDefaultHubRequest","localSendDefaultRightsRequest","localSendDiscoveryRequest","localSendGetDeviceChannelListRequest","localSendGetDeviceSettingRequest","localSendHubRequest","localSendListAliasPostRequest","localSendMetadataChannelsRequest","localSendUserRightsRequest","localSendVideofuturAuthenticationRequest","localSendVideofuturDiscoveryRequest","localSendVideofuturPersonalDataRequest","localStopVideofuturOpenStreams","isLoadingAnimationVisible","timeoutCallback","animationData","lottie","autoplay","getElementsByClassName","renderer","rendererSettings","progressiveLoad","rightsCommercialOffersUrl","updateCommercialOffers","sendCommercialOffersRequest","rightsDefaultUrl","updateDefaultRights","sendDefaultRightsRequest","sendV8DiscoveryRequest","sendGetDeviceChannelListRequest","sendGetDeviceSettingsRequest","sendV8ListAliasPostRequest","listAliasPostUrl","REDUX_MSG_REQUEST_LIST_ALIAS_POST","sendV8MetadataChannelsRequest","sendVideofuturAuthenticationRequest","sendVideofuturDiscoveryRequest","toggleDebugMode","deleteOptimisticData","getSubscriptionStatusPriority","Cancelled","Paused","getUserInfo","getUserInfoUrl","getUserInfoFromCrm","newsletter","rawPaymentInfo","rawSubscriptions","currentStatus","expiry","monthLength","expirationDate","setMonth","parseUserInfo","updateUserInfo","VERSION_CHECK","Interval","Timeout","ErrorType","LoadingStates","DummyRestart","RegisteringAsGuest","forceSignInDisplay","hasSkippedGuestRegistration","isCloseButtonHidden","isHeaderDisplayed","registrationCounter","requiredRightsChangeWatched","ApplicationContainerView","initialAppState","initialAppError","isGuestModeAllowed","RegisterAsGuest","registerAsGuest","updateState","SignInDisplayed","RunningOnMobile","BrowserNotCompatible","startVersionCheckTimer","getBOVersion","getCrmBackVersion","getCrmFrontVersion","localUpdateBOVersion","REACT_APP_BO_VERSION_URL_V2","fetchTextWithErrorCheck","localUpdateCrmBackVersion","getCrmVersion","REACT_APP_CRM_BACK_VERSION_URL","localUpdateCrmFrontVersion","REACT_APP_CRM_FRONT_VERSION_URL","urlStr","updater","localShowAuthenticationRequiredModal","authenticationRequiredModalCloseCallback","localUnregisterApplication","updateApplicationStateIfNotRegistering","prevRegistration","NotRegistered","handleNotRegisteredState","Registered","handleOpenUserAccountOnClick","localShowExternalContentModal","userAccountDisplay","userAccountUrl","ExternalPopup","openSelfCare","openPortal","refreshUserInfo","localGetUserInfo","refreshUserRights","localResetUserInfo","Logged","showSignIn","watchRightsChange","checkRightsChange","userRightsSet","checkPendingOperationIfAllowed","resetVersionCheckTimer","versionCheckTimer","getNextVersionCheckDate","showNewVersion","currentVersion","nextCheckDate","isForced","latestVersion","isCheck","getTimezoneOffset","dateLengthWithoutSeconds","newVersionData","newVersion","statesWithHeader","updateErrorState","showCloseButton","hideCloseButton","applicationLoaded","isFirstStartupSequence","restartApp","finalizeGuestRegistration","guestRegistrationServiceUrl","GuestAuthent","credentials","startupSuccessCallback","showGuestMode","showApp","LoadTimeout","unrecoverableStartupFailureCallback","StartupFailure","startupTimeoutCallback","StartupTimeout","startupFailureCallback","toggleDebugPanel","renderTextLink","renderImageLink","renderUserAccountButton","renderBrowserNotCompatibleState","chromeUrl","appStoreAppUrl","googlePlayAppUrl","edgeUrl","firefoxUrl","renderRunningOnMobileState","renderNotRegisteredState","renderRegisteredState","renderLoggedState","renderErrorState","isAuthentInFullscreen","TOGGLE_DEBUG_MODE","RESTART_APP","REGISTER_AS_GUEST","OPEN_USER_ACCOUNT","prevInitialAppState","prevUserRights","prevApplicationState","areRightsDifferent","r1","r2","contentElement","ApplicationContainer","devicesUrl","firefox","customerAccountUrl","showAuthenticationRequiredModal","updateBOVersion","updateCrmBackVersion","updateCrmFrontVersion","showNewVersionModal","E_TAGS","sendV8PromisedXMLHttpRequest","isAuthenticated","v8NetworkErrorCallBack","HTTP_READY_STATE_DONE","ClientError","NetgemNetworkErrorMessage","InvalidModalState","InvalidDimensions","AuthenticationFailed","HubNotFound","RealmNotFound","CACHE_GARBAGE_COLLECTION_TIMEOUT","nextGarbageCollectionDate","gcTimer","garbageCollectCache","sendV8Request","isPersonalData","mustBeTransformedToImage","mustBeTransformedToJson","Accept","getResponseSettings","localMethod","isCachedItemOnProbation","cachedItem","addAuthenticationHeader","forceETagUsage","previousETag","_E_TAGS$url$eTag","_E_TAGS$url","getETag","addETagHeader","returnObject","parseJsonResponse","directive","getCacheMaxAge","setETag","webkitURL","createObjectURL","responseURL","retryIfUnauthorized","WwwAuthenticate","AppKey","authenticationRequest","ApplicationFormUrlencoded","jsonChallengeResponse","hmac","hmacSHA1","challenge","discoveryRequest","jsonResponse","favorites","getStreams","purchaseStatus","startStream","stopStream","addFavorites","deleteFavorites","convertJson","requestHeader","sendDmsPromisedXMLHttpRequest","dmsNetworkErrorCallBack","getMessageFromErrorStatus","dmsAssociatedDeviceRequest","baseAuthDeviceUrl","createDmsCommonRequestHeader","getValueFromNode","parseResolver","argsPos","createChannelMap","channelsMap","_channel$Amsnumber","_npvr$Catchup","_npvr$Keep","_npvr$Startover","_npvr$Record","_stream$Debug","_stream$Seekable","_stream$LaUrl","_resolver$customData","_stream$Notrickmode","_resolver$service","altimg","amsnumber","notrickmode","template","dmsDeviceChannelsRequest","_channels$setup$chann","channelArray","deviceChannelNetworkResponse","DmsFlags","FLAG00_RESTART_STB_BROWSER","FLAG01_STB_SETTING_TO_ADD","FLAG02_STB_SETTING_TO_SET","FLAG03_STB_SETTING_TO_DEL","FLAG04_DISTRIBUTOR_SETTING_TO_ADD","FLAG05_DISTRIBUTOR_SETTING_TO_SET","FLAG06_DISTRIBUTOR_SETTING_TO_DEL","FLAG07_SERVICE_SETTING_TO_ADD","FLAG08_SERVICE_SETTING_TO_SET","FLAG09_SERVICE_SETTING_TO_DEL","FLAG10_SETTING_UPDATED","FLAG11_SETTING_NOT_UPDATED","settingCmp","nameA","nameB","dmsDeviceSettingsRequest","exchange","deviceInfo","settingsArray","upgradecheck","script","settingsMap","flag","currentArray","createSettingsMap","dmsLoginRequest","requestParamArray","authenticateBody","authenticateJSONResponse","opaque","challengeBody","errorCallBack","dmsQuotaPvrRequest","headerList","ApplicationJsonUtf8","sendPersonalDataGetRequest","IfNoneMatch","sendPersonalDataPostRequest","IfMatch","sendV8GenericRequest","sendFeedRequestInternal","extraHeaders","extraHeaderList","sendFeedRequest","sourceList","sourceCount","additionalParameters","networkFeedsArray","filterMergeSourcesFeed","feedCount","filteredFeedsArray","sectionModel","sectionFilter","sectionProvider","sectionSlice","aggregationSectionModel","aggregationSources","flattenFeedIfRequested","TOKEN_RENEWAL_CHECK_INTERVAL","TOKEN_RENEWAL_EXPIRATION_MARGIN","NetgemApi","connectedCallback","disconnectedCallback","deviceSettingsCallback","deviceChannelsCallback","associatedDevicesCallback","quotaPvrCallback","boAuthenticationCallback","resetTokenRenewalTimer","resetBOTokenRenewalTimer","checkErrorMessage","refreshToken","authenticationTokenData","isAuthenticationTokenRenewing","startTokenRenewalTimer","tokenRenewalTimer","nextTokenRenewalDate","retriesLeft","startBOTokenRenewalTimer","boTokenRenewalTimer","nextBOTokenRenewalDate","sendBOAuthenticationRequest","dmsSettingsSuccessCallback","isChecking","optimisticDmsSettings","areSettingsEqual","val2","settingsCount","getDeviceSettings","baseUpgradeDeviceUrl","getDeviceChannelList","getAssociatedDeviceList","associatedDeviceNetworkResponse","getQuotaPvr","quotaPvrNetworkResponse","quotaPVR","quotaPVRUsed","sendLogoutRequest","dmsLogoutRequest","boAuthenticationRequest","authenticationSettings","authentication","identityExpiration","firstName","_product$toString","getVfAuthenticationSettings","sendNtgEntitlementRequest","entId","entService","sendV8RecordingsDeleteRequest","sendV8RecordingsFutureRequest","sendV8RecordingsListRequest","sendV8RecordingsQuotaRequest","sendV8RecordingsRetryRequest","fromBeginning","sendV8ScheduledRecordingDeleteRequest","sendV8ScheduledRecordingListRequest","sendV8ScheduledRecordingMetadataRequest","sendV8ScheduledRecordingUpdateRequest","scheduledRecordId","ntgVideoFeed","sendPersonalDataDeleteRequest","sendV8DataCollectionCollectorIdRequest","sendV8DataCollectionRequest","boDiscoveryRequest","sendVideofuturRequest","sendBORequest","newETag","convertToMilliseconds","ntgApiInstance","createNetgemApiLibraryInstance","updateDeviceSettings","updateDistributorAppKeys","appKeys","extractDistributorAppKeys","updateMainDistributor","updatePlayerStreamPriorities","_streamPriorities$spl","pList","buildPriorities","recFromBeginning","keepFromReplay","updateNpvrState","meshSetting","isMeshEnabled","updateMeshState","currentStateEnabled","currentStateFrequency","currentStateRampUp","navigationEnabled","playerStateEnabled","playerStateFrequency","playerStateRampUp","playerStateStreamTypes","turnOffEnabled","turnOnEnabled","getDataCollectionSettings","associatedDevices","updateAssociatedDevices","quotaPvr","updateQuotaPvr","updateBOSettings","REDUX_MSG_REQUEST_LOGOUT","REDUX_MSG_REQUEST_GET_ASSOCIATED_DEVICES","REDUX_MSG_REQUEST_GET_DEVICE_QUOTA_PVR","REDUX_MSG_REQUEST_PERSONAL_DATA_DELETE","REDUX_MSG_REQUEST_PERSONAL_DATA_GET","REDUX_MSG_REQUEST_PERSONAL_DATA_POST","REDUX_MSG_REQUEST_NPVR_RECORDINGS_DELETE","REDUX_MSG_REQUEST_NPVR_RECORDINGS_FUTURE","REDUX_MSG_REQUEST_NPVR_RECORDINGS_LIST","REDUX_MSG_REQUEST_NPVR_RECORDINGS_METADATA","REDUX_MSG_REQUEST_NPVR_RECORDINGS_QUOTA","REDUX_MSG_REQUEST_NPVR_RECORDINGS_RETRY","REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_CREATE","REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_DELETE","REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_LIST","REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_LIST_FULL","REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_METADATA","REDUX_MSG_REQUEST_NPVR_SCHEDULED_RECORDINGS_UPDATE","REDUX_MSG_REQUEST_BO_FAVORITE_LIST","REDUX_MSG_REQUEST_BO_FAVORITE_DELETE","I18nContext","I18nextProvider","i18n","Provider","getGamestreamTokenUrl","metadataImageWithVariantUrl","metadataProgramUrl","metadataScheduleUrl","npvrRecordingsDeleteUrl","npvrRecordingsFutureUrl","npvrRecordingsListUrl","npvrRecordingsMetadataUrl","npvrRecordingsQuotaUrl","npvrRecordingsRetryUrl","npvrRecordingsStopUrl","npvrScheduledRecordingsCreateUrl","npvrScheduledRecordingsDeleteUrl","npvrScheduledRecordingsListFullUrl","npvrScheduledRecordingsListUrl","npvrScheduledRecordingsMetadataUrl","npvrScheduledRecordingsUpdateUrl","personalDataDeleteUrl","personalDataGetUrl","personalDataListDeleteUrl","personalDataListGetUrl","personalDataListPostUrl","personalDataPostUrl","DefaultAction","boSettings","isDmsMeshEnabled","isSubscriberIdShown","REACT_APP_LEGAL_INFORMATION","REACT_APP_REALM","stringToExternalContentDisplayType","REACT_APP_SUBSCRIPTION_PRESENTATION_DISPLAY","tagListAliases","useScheduledRecordingsFullList","REDUX_MSG_CHANNELS_UPDATE","REDUX_MSG_DEBUG_MODE_TOGGLE","newIsDebugModeEnabled","TRACE","REDUX_MSG_DEBUG_MODE_UPDATE","REDUX_MSG_DEVICE_OS_UPDATE","REDUX_MSG_DEVICE_SETTINGS_UPDATE","REDUX_MSG_BO_SETTINGS_UPDATE","REDUX_MSG_BO_PRODUCT_ID_UPDATE","REDUX_MSG_DISTRIBUTOR_APPKEYS_UPDATE","REDUX_MSG_LIST_ALIAS_UPDATE","REDUX_MSG_MAIN_DISTRIBUTOR_UPDATE","REDUX_MSG_MESH_STATE_UPDATE","REDUX_MSG_PLAYER_STREAM_PRIORITIES_UPDATE","REDUX_MSG_APP_CONFIGURATION_UPDATE","webNoticeId","cipherText","secret","iv","aes","utf8","decryptDidomiKey","greenStreamingMaxMpbs","REDUX_MSG_ENABLE_PACK_PURCHASE_API","REDUX_MSG_PACK_PURCHASE_TOGGLE","REDUX_MSG_VOD_STATE_UPDATE","isBoRunning","REDUX_MSG_VERSION_BO_UPDATE","REDUX_MSG_VERSION_CRM_BACK_UPDATE","REDUX_MSG_VERSION_CRM_FRONT_UPDATE","REDUX_MSG_COMMERCIAL_OFFERS_UPDATE","REDUX_MSG_DEFAULT_RIGHTS_UPDATE","REDUX_MSG_USER_RIGHTS_UPDATE","REDUX_MSG_UTM_PARAMETERS_UPDATE","appRegistrationReducer","REACT_APP_CHARGEBEE_INSTANCE","updateToken","savedModalCard","ModalActionType","Show","newModal","sameModalIndex","Reopen","SaveAndHide","Hide","force","topModal","modalCard","clearPendingOperationFromCard","eTagsCache","npvrRecordingsFutureFeed","NpvrReducer","REDUX_MSG_NPVR_RECORDINGS_LIST_UPDATE","npvrRecordingsListETag","REDUX_MSG_NPVR_RECORDINGS_FUTURE_UPDATE","npvrRecordingsFutureETag","REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_LIST_UPDATE","scheduledRecordingList","scheduledRecordingListETag","scheduledRecordingETagList","REDUX_MSG_NPVR_SCHEDULED_RECORDINGS_LIST_FULL_UPDATE","npvrScheduledRecordingsListFull","scheduledRecordingListFullETag","REDUX_MSG_NPVR_STATE_UPDATE","REDUX_MSG_QUOTA_PVR_UPDATE","resetSettings","initializeUndefinedSettings","saveSettings","settingValue","getDefaultValueFromSetting","KEYS","favoriteListETag","myListsAvenueIndex","loadSettings","viewingHistoryETagCache","wishlistETagCache","uiReducer","REDUX_MSG_AVENUE_LIST_UPDATE","_draft$focusedAvenue","REDUX_MSG_FOCUSED_AVENUE_UPDATE","REDUX_MSG_UPDATE_SEARCH_STRING","REDUX_MSG_DELETE_SEARCH_HISTORY_TERM","deleteSearchString","REDUX_MSG_DELETE_SEARCH_HISTORY","REDUX_MSG_BACK_TO_FOCUSED_AVENUE","REDUX_MSG_DEFAULT_ACTIONS_UPDATE","REDUX_MSG_SETTING_RESET","REDUX_MSG_SETTING_UPDATE","REDUX_MSG_UPDATE_SECTION_PAGE_INDEX","REDUX_MSG_RESET_SECTION_PAGE_INDICES","REDUX_MSG_VIDEO_CAROUSEL_SOUND_UPDATE","REDUX_MSG_VIDEO_CAROUSEL_PLAY_UPDATE","REDUX_MSG_THEATER_MODE_UPDATE","REDUX_MSG_BO_FAVORITE_LIST_CLEAR","REDUX_MSG_BO_FAVORITE_LIST_UPDATE","REDUX_MSG_BO_PURCHASE_LIST_CLEAR","REDUX_MSG_BO_PURCHASE_LIST_FOR_DISTRIBUTOR_UPDATE","REDUX_MSG_BO_PURCHASE_LISTS_FOR_ALL_DISTRIBUTORS_UPDATE","_action$purchaseLists","purchaseLists","REDUX_MSG_VIEWING_HISTORY_RESET","REDUX_MSG_VIEWING_HISTORY_SET_ERROR","REDUX_MSG_VIEWING_HISTORY_ITEM_ETAG_DELETE","REDUX_MSG_VIEWING_HISTORY_ITEM_DELETE","REDUX_MSG_VIEWING_HISTORY_ITEM_UPDATE","itemETag","REDUX_MSG_VIEWING_HISTORY_UPDATE","viewingHistoryETag","REDUX_MSG_WISHLIST_ETAG_DELETE","REDUX_MSG_WISHLIST_RESET","REDUX_MSG_WISHLIST_SET_ERROR","REDUX_MSG_WISHLIST_UPDATE","wishlistETag","REDUX_MSG_UPDATE_GRID_SECTION_ID","REDUX_MSG_SET_DEEPLINK","REDUX_MSG_UPDATE_DISPLAY_PAYWALL_SUBSCRIPTION","isDisplayed","removeKeysWithPrefix","formatProdErrorMessage","symbol_observable_default","observable","randomString","actionTypes_default","INIT","REPLACE","PROBE_UNKNOWN_ACTION","createStore","reducer","preloadedState","enhancer","currentReducer","currentState","currentListeners","nextListeners","listenerIdCounter","isDispatching","ensureCanMutateNextListeners","isSubscribed","listenerId","replaceReducer","nextReducer","outerSubscribe","observeState","observerAsObserver","unsubscribe","combineReducers","reducers","reducerKeys","finalReducers","finalReducerKeys","shapeAssertionError","assertReducerShape","hasChanged","nextState","previousStateForKey","nextStateForKey","compose","funcs","appConfigurationReducer","modalReducer","netgemApiReducer","npvrReducer","createThunkMiddleware","extraArgument","thunk","withExtraArgument","composeWithDevTools","__REDUX_DEVTOOLS_EXTENSION_COMPOSE__","__REDUX_DEVTOOLS_EXTENSION__","Tuple","_Tuple","species","SHOULD_AUTOBATCH","createQueueWithTimer","buildGetDefaultEnhancers","middlewareEnhancer","autoBatch","enhancerArray","notifying","shouldNotifyAtEndOfTick","notificationQueued","queueCallback","queueMicrotask","queueNotification","notifyListeners","listener2","wrappedListener","autoBatchEnhancer","for","overriddenUrl","appConfigurationUrl","builtUri","htmlLoginUrl","SyntaxError","enableMapSet","getDefaultMiddleware","immutableCheck","serializableCheck","actionCreatorCheck","middlewareArray","thunkMiddleware","middleware","devTools","enhancers","rootReducer","finalMiddleware","isPlainObject2","finalCompose","compose2","middlewares","createStore2","middlewareAPI","chain","applyMiddleware","getDefaultEnhancers","configureStore","NetgemApiDefaultState","allReducers","ntgApiInitialize","checkCompatibleDevice","isRunningOnMobileBrowser","_window$navigator$use","uaDataIsMobile","userAgentData","mobile","isMobile","appState","getAppConfiguration","isResetRequested","cleanUpQueryString","updateDeviceOS","checkDebugMode","checkDeviceIdAndUserInfo","deviceAndUser","isAppConfigurationLoaded","AppConfFailure","updateUtmParameters","getUtmParameters","isSubscribeRequested","isSigninRequested","isSignupRequested","isRegistrationRequested","cleanUpStorageAndRegisterAsGuest","getQueryStringParameter","updateDebugMode","sendV8AppConfigurationRequest","fetchDeviceId","registeredAsGuest","setDeviceId","fetchStoredUserDeviceInfo","_browser$name","storedDeviceId","newDeviceId","verifyAndDecryptToken","isWhitelisted","lcUserAgent","ToastContainer","translations","de","translationDe","en","translationEn","fr","translationFr","APP_SUPPORTED_LANGUAGES","APP_LANGUAGES","getAppLanguages","APP_LANGUAGES_AS_STRING","APP_LANGUAGE","rootElement","createRoot","konamiCode","htmlUnicorn","unicornIndex","isAnimating","isUnicornized","getRootElement","deunicornize","unicornize","insertAdjacentHTML","tryParseResult","parseResponseHeaders","_result$status","_result$body","_result$code","_result$body2","PersonalDataKey","BadRequest","Conflict","PreconditionFailed","getRoundedDateToISOString","stringToInt","addISO8601Duration","regExpResult","getSeconds","setFullYear","timeRoundValue","MI","MO","HMS","feedIn","feedByChannel","splitFeedItemByChannels","sliceParams","feedOut","deepCopyRawItem","filterParams","filterOperator","createFilterOperator","processItem","filterItem","filteredItem","sliceFeed","sliceOp","slicedFeed","feeds","feedsCount","aggregatedFeed","clonedFeed","deepCopyItem","deepCopyFeed","setLocationsScore","updateSelectedLocation","calculateLocationScore","compareElementScore","inFeed","outFeed","getBestLocationForItem","itemScore","getAllLocationIds","locationIds","compareScore","score1","score2","str1","str2","elt1","elt2","compareLocationScore","loc1","loc2","filterOps","and","channelListInternal","not","or","parentalRating","playable","scheduledEventStartTime","scheduledEventEndTime","previewAvailability","rootItem","eltsOut","locsOut","eltsOutScore","locsOutScore","formatFilterOperator","filterObj","SelectionStrategy","getIdType","getFirstElement","selectionStrategy","FirstLocation","getFirstLocationForItem","selectedLocationScore","deepCopyElements","deepCopyLocations","deepCopyParentalGuidance","deepCopyFeedItemForChannel","selectedChannelId","clonedItem","deepCopyElementsForChannel","clonedLocations","deepCopyLocationsForChannel","filteredLocations","getFeedItemChannelIds","clonedParentalGuidance","itemElements","clonedLocation","findLocationInLocations","clonedElements","clonedSelectedLocation","findLocationOrDefault","itemLocations","defaultLocation","translatedText","getRecordingsMap","getScheduledRecordingsMap","eTags","requestedScheduledEventId","targetAssetId","getScheduledRecordingsMapV2","scheduledRecordingListFull","getCountAndDuration","statusItem","getRecordingsStatus","_headers$key","getLastPlayedTime","bestLocation","getBestLocation","bestProgramId","Smooth","HistoryOverflow","Contain","Season","NotPaid","PaymentDue","Pending","Posted","Expired","Valid","Stopped","showKeyboardShortcutsModal","showNpvrHelpModal","createSignedApiUrl","apiKeyIdValueGetter","channelGr2ChannelListValueGetter","tag2ChannelListValueGetter","tag2ListAliasValueGetter","channel2ChannelGrValueGetter","channelListValueGetter","selectedValueGetter","paramPrefix","getValueFromPrefix","settingsValueGetter","_getSettingValueByNam","orValueGetter","argValue","unionValueGetter","union","pushIfMissing","valueListGetter","dateValueGetter","paramName","paramRound","paramValue","deeplinkParameterValueGetter","defaultKeyValueGetter","langValueGetter","nowValueGetter","optionsValueGetter","getSettingSection","rangeValueGetter","realmValueGetter","boDeviceValueGetter","boDistributorValueGetter","boProductIdValueGetter","videostreamsValueGetter","defaultValueGetter","valueGetterMap","channel2ChannelGr","channelGr2ChannelList","selected","tag2ChannelList","tag2ListAlias","valueList","vfDevice","vfDistributor","vfProductId","unsignedUrl","httpMethod","hmacSHA256","Base64","filterAndSortPlaybackUrls","newArgs","settingId","sendPersonalDataListGetRequest","listId","sendPersonalDataListPostRequest","VIEWING_HISTORY_CLEAN_UP_INTERVAL","validateViewingHistory","resetViewingHistory","setViewingHistoryError","validatedViewingHistory","viewingHistoryItem","isSecondAttempt","existingItemETag","updateViewingHistoryWithETag","updateViewingHistoryItem","deleteViewingHistoryItemETag","deleteWholeViewingHistory","deleteViewingHistory","initialListETag","initialItemETag","deleteViewingHistoryWithETag","eTagError","sendPersonalDataListDeleteRequest","deleteViewingHistoryItem","checkPlayedItems","allLocationIds","allowedTypes","updatedPlayedItems","hasBeenUpdated","updatedViewingHistory","obsoleteItemIds","updatedEpisodes","deleteCount","updateCount","WishlistItemKind","getWishlistTypeFromId","validateWishlist","resetWishlist","setWishlistError","validatedWishlist","findAssetId","acceptNotMatchingChannelId","deleteWishlistETag","sendWishlistUpdateRequest","assetIdIndex","pendingRequests","NOT_FOUND_MAX_AGE","getSize","getUri","metadataImageUrl","imageVariant","variant","getVariant","cachedImage","pendingRequest","sendV8MetadataImageRequest","Variant","_response$result","_response$result$loca","_response$result$loca2","addAvailabilityStartDate","matchingLocation","addDistributorId","getResponse","deleteRecordings","recordingId","sendV8ScheduledRecordingListFullRequest","updateScheduledRecordingsFull","getAllScheduledRecordingsV2","initialNpvrScheduledRecordingsList","getMetadataForAllScheduledRecordings","unchangedScheduledRecordings","getAllScheduledRecordingsV1","npvrScheduledRecordingListETag","filteredResults","deleteChildren","deleteScheduledRecordings","scheduledRecordingIds","matadataResponse","deleteOrStopFutureScheduledRecordings","singleScheduledRecordingIds","seriesScheduledRecordingIds","singlePromises","innerResult","retryIfNeeded","skipRefresh","updateBOFavoriteList","apiMethodName","methodName","buildBOHeaders","headersConf","deleteSearchHistory","exports","ReflectOwnKeys","ReflectApply","getOwnPropertySymbols","NumberIsNaN","emitter","errorListener","eventTargetAgnosticAddListener","addErrorHandlerIfEventEmitter","_eventsCount","_maxListeners","defaultMaxListeners","checkListener","_getMaxListeners","that","_addListener","existing","newListener","warned","onceWrapper","fired","wrapFn","_onceWrap","unwrap","evlistener","unwrapListeners","arrayClone","listenerCount","wrapListener","RangeError","setMaxListeners","getMaxListeners","doError","er","prependListener","prependOnceListener","originalListener","spliceOne","removeAllListeners","rawListeners","eventNames","reverseMapCache","getReverseMap","enumObject","reverseMap","newReverseMap","EnumPrototype","Enum","EnumMirroredPrototype","Mirrored","isMounted","enqueueForceUpdate","enqueueReplaceState","enqueueSetState","refs","isReactComponent","forceUpdate","isPureReactComponent","__self","__source","$$typeof","_owner","_result","ReactCurrentDispatcher","ReactCurrentBatchConfig","ReactCurrentOwner","Children","toArray","only","Profiler","PureComponent","StrictMode","Suspense","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","act","cloneElement","_currentValue","_currentValue2","_threadCount","Consumer","_defaultValue","_globalName","createFactory","createRef","isValidElement","lazy","startTransition","unstable_act","useContext","useDebugValue","useDeferredValue","useId","useInsertionEffect","useLayoutEffect","useReducer","useSyncExternalStore","useTransition","_getRequireWildcardCache","_interopRequireWildcard","_theme","_clsx","updateClassName","_Picto","_extends","PictoAndroid","delegated","PictoApple","PictoBack","PictoBackToLive","PictoBurger","PictoBuy","_ref12","_ref13","_ref14","_ref15","_ref16","_ref17","_ref18","_ref19","_ref20","strokeLinecap","strokeLinejoin","strokeMiterlimit","_ref21","_ref22","PictoEye","_ref23","PictoFacebook","_ref24","_ref25","_ref26","_ref27","_ref28","_ref29","PictoGem","_ref30","_ref31","_ref32","_ref33","_ref34","PictoInstagram","_ref35","_ref36","PictoMinus","_ref37","PictoMoreInfo","_ref38","PictoNext","_ref39","_ref40","_ref41","_ref42","PictoQuestionMark","_ref43","PictoPrevious","_ref44","_ref45","PictoLogOut","_ref46","_ref47","_ref48","_ref49","_ref50","_ref51","_ref52","_ref53","_ref54","_ref55","PictoShare","_ref56","_ref57","PictoTwitter","_ref58","_ref59","_ref60","_ref61","_ref62","_ref63","_ref64","_ref65","PictoYouTube","_ref66","_ref67","dataCustom","ReactPropTypesSecret","emptyFunction","emptyFunctionWithReset","resetWarningCache","shim","propName","propFullName","getShim","isRequired","ReactPropTypes","bigint","bool","symbol","any","arrayOf","instanceOf","objectOf","oneOf","oneOfType","shape","exact","checkPropTypes","getWindow","isElement","isHTMLElement","isShadowRoot","ShadowRoot","getUAString","uaData","brands","brand","isLayoutViewport","includeScale","isFixedStrategy","clientRect","scaleX","scaleY","visualViewport","addVisualOffsets","getWindowScroll","win","scrollLeft","pageXOffset","pageYOffset","getNodeName","nodeName","getDocumentElement","getWindowScrollBarX","isScrollParent","_getComputedStyle","overflow","overflowX","overflowY","getCompositeRect","elementOrVirtualElement","offsetParent","isFixed","isOffsetParentAnElement","offsetParentIsScaled","isElementScaled","getNodeScroll","clientLeft","clientTop","getLayoutRect","getParentNode","assignedSlot","getScrollParent","listScrollParents","_element$ownerDocumen","scrollParent","isBody","updatedList","isTableElement","getTrueOffsetParent","getOffsetParent","isFirefox","currentNode","perspective","contain","willChange","getContainingBlock","auto","basePlacements","viewport","popper","variationPlacements","placements","modifierPhases","visited","requires","requiresIfExists","dep","depModifier","DEFAULT_OPTIONS","strategy","areValidElements","popperGenerator","generatorOptions","_generatorOptions","_generatorOptions$def","defaultModifiers","_generatorOptions$def2","defaultOptions","reference","orderedModifiers","modifiersData","effectCleanupFns","isDestroyed","setOptionsAction","cleanupModifierEffects","scrollParents","contextElement","phase","orderModifiers","mergeByName","_ref$options","effect","cleanupFn","noopFn","_state$elements","_state$orderedModifie","_state$orderedModifie2","onFirstUpdate","getBasePlacement","getVariation","getMainAxisFromPlacement","computeOffsets","basePlacement","variation","commonX","commonY","mainAxis","unsetSides","mapToStyles","_Object$assign2","popperRect","gpuAcceleration","adaptive","roundOffsets","_offsets$x","_offsets$y","hasX","hasY","sideX","sideY","heightProp","widthProp","_Object$assign","commonStyles","roundOffsetsByDPR","initialStyles","arrow","attribute","_options$offset","invertDistance","skidding","distanceAndSkiddingToXY","_data$state$placement","popperOffsets","getOppositePlacement","getOppositeVariationPlacement","rootNode","getRootNode","isSameNode","rectToClientRect","getClientRectFromMixedType","clippingParent","html","layoutViewport","getViewportRect","getInnerBoundingClientRect","winScroll","scrollWidth","getDocumentRect","getClippingRect","boundary","rootBoundary","mainClippingParents","clippingParents","clipperElement","getClippingParents","firstClippingParent","clippingRect","accRect","mergePaddingObject","paddingObject","expandToHashMap","hashMap","detectOverflow","_options$placement","_options$strategy","_options$boundary","_options$rootBoundary","_options$elementConte","elementContext","_options$altBoundary","altBoundary","_options$padding","altContext","clippingClientRect","referenceClientRect","popperClientRect","elementClientRect","overflowOffsets","offsetData","multiply","within","mathMax","mathMin","_options$mainAxis","checkMainAxis","_options$altAxis","altAxis","checkAltAxis","_options$tether","tether","_options$tetherOffset","tetherOffset","isBasePlacement","referenceRect","tetherOffsetValue","normalizedTetherOffsetValue","offsetModifierState","_offsetModifierState$","mainSide","altSide","additive","minLen","maxLen","arrowElement","arrowRect","arrowPaddingObject","arrowPaddingMin","arrowPaddingMax","arrowLen","minOffset","maxOffset","arrowOffsetParent","clientOffset","offsetModifierValue","tetherMax","preventedOffset","_offsetModifierState$2","_mainSide","_altSide","_offset","_min","_max","isOriginSide","_offsetModifierValue","_tetherMin","_tetherMax","_preventedOffset","withinMaxClamp","_state$modifiersData$","toPaddingObject","minProp","maxProp","endDiff","startDiff","clientSize","centerToReference","axisProp","centerOffset","_options$element","getSideOffsets","preventedOffsets","isAnySideFullyClipped","side","createPopper","_options$scroll","_options$resize","_options$gpuAccelerat","_options$adaptive","_options$roundOffsets","applyStyles","specifiedFallbackPlacements","fallbackPlacements","_options$flipVariatio","flipVariations","allowedAutoPlacements","preferredPlacement","oppositePlacement","getExpandedFallbackPlacements","_options$allowedAutoP","allPlacements","allowedPlacements","overflows","computeAutoPlacement","checksMap","makeFallbackChecks","firstFittingPlacement","_basePlacement","isStartVariation","isVertical","mainVariationSide","altVariationSide","checks","check","_i","fittingPlacement","preventOverflow","referenceOverflow","popperAltOverflow","referenceClippingOffsets","popperEscapeOffsets","isReferenceHidden","hasPopperEscaped","CONTENT_CLASS","BACKDROP_CLASS","ARROW_CLASS","SVG_ARROW_CLASS","TOUCH_OPTIONS","TIPPY_DEFAULT_APPEND_TO","getValueAtIndexOrReturn","isType","invokeWithArgsOrReturn","normalizeToArray","pushIfUnique","arrayFrom","removeUndefinedProps","isMouseEvent","isReferenceElement","_tippy","getArrayOfElements","isNodeList","setTransitionDuration","els","transitionDuration","setVisibilityState","getOwnerDocument","elementOrElements","updateTransitionEndListener","actualContains","_target$getRootNode","currentInput","lastMouseMoveTime","onDocumentTouchStart","onDocumentMouseMove","onWindowBlur","blur","isIE11","pluginProps","animateFill","followCursor","inlinePositioning","sticky","aria","expanded","getReferenceClientRect","ignoreAttributes","interactiveBorder","interactiveDebounce","moveTransition","onAfterUpdate","onBeforeUpdate","onCreate","onDestroy","onMount","onUntrigger","onClickOutside","popperOptions","showOnCreate","touch","triggerTarget","inertia","defaultKeys","getExtendedPassedProps","passedProps","evaluateProps","valueAsString","getDataAttributeProps","dangerouslySetInnerHTML","createArrowElement","setContent","textContent","getChildren","firstElementChild","boxChildren","onUpdate","nextProps","_getChildren","$$tippy","idCounter","mouseMoveListeners","mountedInstances","createTippy","showTimeout","hideTimeout","scheduleHideAnimationFrame","lastTriggerEvent","currentTransitionEndListener","isVisibleFromClick","didHideDueToDocumentMouseDown","didTouchMove","ignoreOnFirstUpdate","debouncedOnMouseMove","popperInstance","isShown","clearDelayTimeouts","partialProps","invokeHook","removeListeners","addListeners","cleanupInteractiveMouseListeners","handleAriaExpandedAttribute","handleStyles","createPopperInstance","getNestedPopperTree","nestedPopper","isAlreadyVisible","isTouchAndTouchDisabled","getCurrentTarget","hasAttribute","getIsDefaultRenderFn","visibility","addDocumentPress","_getDefaultTemplateCh2","getDefaultTemplateChildren","_instance$popperInsta2","_getDefaultTemplateCh3","_box","_content","handleAriaContentAttribute","onTransitionedIn","mount","isAlreadyHidden","removeDocumentPress","_getDefaultTemplateCh4","onTransitionedOut","unmount","hideWithInteractivity","getDocument","destroyPopperInstance","_props$render","pluginsHooks","hasAriaExpanded","scheduleShow","getNormalizedTouchSettings","getIsCustomTouchBehavior","_instance$props$rende","isShow","fromHide","shouldInvokePropsHook","_instance$props","pluginHooks","nextValue","onDocumentPress","actualTarget","onTouchMove","onTouchStart","onBlurOrFocusOut","_lastTriggerEvent","shouldScheduleClickHide","isEventListenerStopped","wasFocused","scheduleHide","isCursorOverReferenceOrPopper","popperTreeData","_instance$popperInsta","popperState","topDistance","bottomDistance","leftDistance","rightDistance","exceedsTop","exceedsBottom","exceedsLeft","exceedsRight","isCursorOutsideInteractiveBorder","relatedTarget","_instance$props2","computedReference","tippyModifier","_getNormalizedTouchSe","touchValue","touchDelay","tippy","targets","optionalProps","setDefaultProps","isBrowser","preserveRef","ssrSafeCreateDiv","deepEqual","uniqueByShape","outputItem","deepPreserveProps","instanceProps","componentProps","_instanceProps$popper","_componentProps$poppe","useIsomorphicLayoutEffect","useMutableBox","initialValue","classNames","classNamePlugin","isDefaultRenderFn","TippyGenerator","singleton","_ref$disabled","_ref$ignoreAttributes","restOfNativeProps","_objectWithoutPropertiesLoose","isControlledMode","isSingletonMode","_useState","mounted","setMounted","_useState2","setAttrs","_useState3","singletonContent","setSingletonContent","mutableBox","renders","computedProps","$$activeSingletonInstance","deps","_instance$props$poppe","_state$modifiersData","hideData","referenceHidden","escaped","createPortal","dataAttrs","toDataAttributes","forwardRef$1","CryptoJS","BlockCipher","lib","C_algo","algo","SBOX","INV_SBOX","SUB_MIX_0","SUB_MIX_1","SUB_MIX_2","SUB_MIX_3","INV_SUB_MIX_0","INV_SUB_MIX_1","INV_SUB_MIX_2","INV_SUB_MIX_3","xi","sx","x4","x8","RCON","AES","extend","_doReset","_nRounds","_keyPriorReset","keyWords","words","keySize","sigBytes","ksRows","keySchedule","_keySchedule","ksRow","invKeySchedule","_invKeySchedule","invKsRow","encryptBlock","_doCryptBlock","decryptBlock","nRounds","s0","s3","t0","t1","t2","t3","_createHelper","Cipher","C_lib","Base","WordArray","BufferedBlockAlgorithm","C_enc","enc","Utf8","EvpKDF","createEncryptor","_ENC_XFORM_MODE","createDecryptor","_DEC_XFORM_MODE","xformMode","_xformMode","dataUpdate","_append","finalize","_doFinalize","ivSize","selectCipherStrategy","PasswordBasedCipher","SerializableCipher","cipher","encrypt","decrypt","ciphertext","C_mode","StreamCipher","BlockCipherMode","Encryptor","Decryptor","_cipher","_iv","CBC","xorBlock","block","_prevBlock","processBlock","thisBlock","Pkcs7","pad","blockSizeBytes","nPaddingBytes","paddingWord","paddingWords","unpad","CipherParams","modeCreator","_minBufferSize","__creator","_doProcessBlock","finalProcessedBlocks","cipherParams","mixIn","OpenSSLFormatter","OpenSSL","salt","openSSLStr","ciphertextWords","encryptor","cipherCfg","_parse","OpenSSLKdf","kdf","execute","password","hasher","compute","derivedParams","self","cryptoSecureRandomInt","Uint32Array","randomBytes","readInt32LE","subtype","$super","propertyName","Hex","wordArray","thisWords","thatWords","thisSigBytes","thatSigBytes","thatByte","nBytes","hexChars","bite","hexStr","hexStrLength","substr","Latin1","latin1Chars","latin1Str","latin1StrLength","utf8Str","unescape","_nDataBytes","doFlush","processedWords","dataWords","dataSigBytes","nBlocksReady","nWordsReady","nBytesReady","Hasher","messageUpdate","_createHmacHelper","HMAC","factory","parseLoop","base64Str","base64StrLength","bitsCombined","_map","base64Chars","triplet","paddingChar","_reverseMap","paddingIndex","MD5","iterations","derivedKey","derivedKeyWords","HmacSHA1","HmacSHA256","_hasher","hasherBlockSize","hasherBlockSizeBytes","oKey","_oKey","iKey","_iKey","oKeyWords","iKeyWords","innerHash","_hash","offset_i","M_offset_i","M_offset_0","M_offset_1","M_offset_2","M_offset_3","M_offset_4","M_offset_5","M_offset_6","M_offset_7","M_offset_8","M_offset_9","M_offset_10","M_offset_11","M_offset_12","M_offset_13","M_offset_14","M_offset_15","FF","GG","HH","II","nBitsTotal","nBitsLeft","nBitsTotalH","nBitsTotalL","H_i","HmacMD5","SHA1","isPrime","sqrtN","getFractionalBits","nPrime","SHA256","gamma0x","gamma0","gamma1x","gamma1","maj","sigma0","weekdays","utcOffset","$L","utc","$u","$x","$offset","$d","UTC","$y","$M","$D","$W","$H","$m","$s","$ms","getMilliseconds","$utils","isSame","isAfter","isBefore","$g","unix","toDate","$locale","weekStart","$set","daysInMonth","subtract","invalidDate","meridiem","monthsShort","weekdaysMin","weekdaysShort","toUTCString","$i","isDayjs","Ls","weekYear","isoWeekYear","offsetName","LTS","LT","LL","LLL","LLLL","zone","afternoon","SS","SSS","ss","mm","hh","DD","Do","ww","MM","MMM","MMMM","YY","YYYY","ZZ","customParseFormat","parseTwoDigitYear","define","undefinedType","isIE","logMethods","_loggersByName","defaultLogger","bindMethod","traceForIE","realMethod","replaceLoggingMethods","methodFactory","SILENT","enableLoggingWhenConsoleArrives","defaultMethodFactory","_loggerName","inheritedLevel","defaultLevel","userLevel","storageKey","persistLevelIfPossible","levelNum","levelName","ignore","getPersistedLevel","storedLevel","cookieName","clearPersistedLevel","normalizeLevel","persist","setDefaultLevel","resetLevel","enableAll","disableAll","rebuild","childName","initialLevel","getLogger","_log","noConflict","getLoggers","svgNS","locationHref","_useWebWorker","initialDefaultFrame","setWebWorker","getWebWorker","setLocationHref","createTag","extendPrototype","destination","sourcePrototype","getDescriptor","createProxyFunction","ProxyFunction","audioControllerFactory","AudioController","audioFactory","audios","_volume","_isMuted","addAudio","resume","setRate","rateValue","createAudio","assetPath","Howl","setAudioFactory","_updateVolume","unmute","getVolume","createTypedArray","createRegularArray","Uint8ClampedArray","Float32Array","Int16Array","createSizedArray","_typeof$6","subframeEnabled","expressionsPlugin","expressionsInterfaces","idPrefix$1","isSafari","_shouldRoundValues","bmPow","bmSqrt","bmFloor","bmMax","bmMin","BMMath","ProjectInterface$1","propertyNames","absArr","defaultCurveSegments","degToRads","roundCorner","roundValues","bmRnd","styleDiv","transformOrigin","webkitTransformOrigin","backfaceVisibility","webkitBackfaceVisibility","transformStyle","webkitTransformStyle","mozTransformStyle","BMEnterFrameEvent","frameMultiplier","BMCompleteEvent","BMCompleteLoopEvent","totalLoops","currentLoop","BMSegmentStartEvent","firstFrame","totalFrames","BMDestroyEvent","BMRenderFrameErrorEvent","nativeError","BMConfigErrorEvent","BMAnimationConfigErrorEvent","createElementID","_count","HSVtoRGB","RGBtoHSV","addSaturationToRGB","hsv","addBrightnessToRGB","addHueToRGB","rgbToHex","colorMap","setSubframeEnabled","getSubframeEnabled","setExpressionsPlugin","getExpressionsPlugin","setExpressionInterfaces","getExpressionInterfaces","setDefaultCurveSegments","getDefaultCurveSegments","setIdPrefix","getIdPrefix","createNS","createElementNS","_typeof$5","dataManager","workerFn","workerInstance","_counterId","processes","workerProxy","onmessage","_workerSelf","setupWorker","Worker","blob","createWorker","completeLayers","comps","layerData","jLen","kLen","completed","hasMask","maskProps","masksProperties","convertPathsToAbsoluteValues","ty","findCompLayers","refId","completeShapes","shapes","completeText","comp","findComp","__used","ks","minimum","animVersionString","animVersion","checkText","minimumVersion","updateTextLayer","textLayer","documentData","iterateLayers","assets","checkChars","charData","ip","sk","sa","checkPathProperties","pathData","checkColors","iterateShapes","checkShapes","completeClosingShapes","closed","cl","moduleOb","__complete","completeChars","dataFunctionManager","assetLoader","formatResponse","contentTypeHeader","fullPath","completeData","onError","createProcess","loadAnimation","processId","completeAnimation","ImagePreloader","proxyImage","imageLoaded","loadedAssets","totalImages","loadedFootagesCount","totalFootages","imagesLoadedCb","footageLoaded","getAssetsPath","assetData","assetsPath","originalPath","imagePath","testImageLoaded","getBBox","_imageLoaded","createFootageData","ob","footageData","_footageLoaded","ImagePreloaderFactory","loadAssets","_createImageData","setAssetsPath","loadedImages","loadedFootages","getAsset","createImgData","crossOrigin","createImageData","setAttributeNS","_elementHelper","setCacheType","elementHelper","BaseEvent","triggerEvent","_cbs","markerParser","parsePayloadLines","keysCount","_markers","markers","_marker","markerData","tm","dr","cm","__","ProjectInterface","registerComposition","compositions","_thisProjectFunction","nm","prepareFrame","currentFrame","compInterface","renderers","registerRenderer","getRenderer","getRegisteredRenderer","_typeof$4","AnimationItem","isLoaded","currentRawFrame","frameMult","playSpeed","playDirection","playCount","animationID","timeCompleted","segmentPos","isSubframeEnabled","_idle","_completedLoop","projectInterface","imagePreloader","audioController","configAnimation","onSetupError","onSegmentComplete","drawnFrameEvent","setParams","animType","RendererClass","globalData","defs","setProjectInterface","autoloadSegments","initialSegment","setupAnimation","fileName","setData","wrapperAttributes","getNamedItem","prerender","includeLayers","newLayers","fonts","fontManager","addChars","addFonts","initExpressions","loadNextSegment","segmentPath","loadSegments","imagesLoaded","checkLoaded","preloadImages","animData","searchExtraCompositions","updaFrameModifier","waitForFontsLoaded","triggerConfigError","rendererType","initItems","gotoFrame","_width","_height","updateContainerSize","setSubframe","renderFrame","resetFrame","triggerRenderFrameError","togglePause","setCurrentRawFrameValue","getMarkerData","markerName","marker","goToAndStop","isFrame","numValue","frameModifier","goToAndPlay","playSegments","advanceTime","_isComplete","checkSegments","adjustSegment","setSpeed","setDirection","setSegment","pendingFrame","forceFlag","resetSegments","onEnterFrame","onLoopComplete","onSegmentStart","setLoop","isLooping","getAssetData","getDuration","updateDocumentData","getElementByPath","animationManager","registeredAnimations","initTime","playingAnimationsNum","_stopped","_isFrozen","removeElement","animItem","subtractPlayingCount","registerAnimation","addPlayingCount","activate","nowTime","elapsedTime","searchAnimations","animElements","lenAnims","unfreeze","getRegisteredAnimations","BezierFactory","beziers","bezEasing","BezierEasing","kSplineTableSize","kSampleStepSize","float32ArraySupported","aA1","aA2","calcBezier","aT","getSlope","_p","_mSampleValues","_precomputed","mX1","mY1","mX2","mY2","_precompute","_getTForX","_calcSampleValues","aX","mSampleValues","intervalStart","currentSample","lastSample","guessForT","initialSlope","aGuessT","currentSlope","newtonRaphsonIterate","aA","aB","currentX","currentT","binarySubdivide","pooling","poolFactory","initialLength","_create","_release","pool","newElement","bezierLengthPool","addedLength","percents","lengths","segmentsLengthPool","bezFunction","math","pointOnLine2D","det1","getBezierLength","pt3","pt4","ptCoord","perc","ptDistance","curveSegments","lengthData","BezierData","segmentLength","PointData","partial","partialLength","buildBezierData","storedData","bezierName","bezierData","getDistancePerc","initPos","lengthPos","lPerc","bezierSegmentPoints","getSegmentsLength","shapeData","segmentsLength","pathV","pathO","pathI","getNewSegment","startPerc","endPerc","u0","u1","u0u0u0","t0u0u0_3","t0t0u0_3","t0t0t0","u0u0u1","t0u0u1_3","t0t0u1_3","t0t0t1","u0u1u1","t0u1u1_3","t0t1u1_3","t0t1t1","u1u1u1","t1u1u1_3","t1t1u1_3","t1t1t1","getPointInSegment","pointOnLine3D","z1","z2","z3","diffDist","dist1","dist2","dist3","bez","initFrame","mathAbs","interpolateValue","frameNum","caching","offsetTime","propType","pv","nextKeyData","keyframeMetadata","fnc","iterationIndex","keyframes","keyframesMetadata","nextKeyTime","keyTime","ind","__fnct","getBezierEasing","segmentPerc","distanceInLine","lastFrame","_lastKeyframeIndex","_lastAddedLength","_lastPoint","outX","outY","inX","inY","keyValue","sh","quaternionToEuler","slerp","createQuaternion","omega","cosom","sinom","scale0","scale1","ax","ay","az","aw","bx","by","bw","acos","quat","qx","qy","qz","qw","heading","attitude","bank","c3","getValueAtCurrentTime","renderedFrame","_caching","renderResult","setVValue","multipliedValue","mult","_mdf","processEffectsSequence","frameId","effectsSequence","lock","_isFirstFrame","finalValue","kf","addEffect","effectFunction","addDynamicProperty","ValueProperty","vel","MultiDimensionalProperty","KeyframedValueProperty","KeyframedMultidimensionalProperty","arrLen","PropertyFactory","getProp","slotManager","DynamicPropertyContainer","dynamicProperties","_isAnimated","iterateDynamicProperties","initDynamicPropertyContainer","pointPool","ShapePath","setPathData","setLength","doubleArrayLength","setXYAt","setTripleAt","vX","vY","oX","oY","iX","iY","newPath","vertices","outPoints","inPoints","cnt","shapePool","shapePath","cloned","ShapeCollection","addShape","releaseShapes","shapeCollectionPool","newShapeCollection","shapeCollection","ShapePropertyFactory","interpolateShape","keyPropS","keyPropE","isHold","vertexValue","interpolateShapeCurrentTime","resetShape","paths","localShapeCollection","shape1","shape2","shapesEqual","ShapeProperty","KeyframedShapeProperty","EllShapeProperty","cPoint","EllShapePropertyFactory","convertEllToPath","_cw","_v","StarShapeProperty","StarShapePropertyFactory","sy","ir","is","convertToPath","convertStarToPath","convertPolygonToPath","roundness","perimSegment","numPts","longFlag","longRad","shortRad","longRound","shortRound","longPerimSegment","shortPerimSegment","currentAng","ox","oy","RectShapeProperty","RectShapePropertyFactory","convertRectToPath","Matrix","_cos","_sin","_tan","_rnd","mCos","mSin","rotateX","rotateY","rotateZ","shear","skew","skewFromAxis","sz","tx","b2","e2","f2","g2","i2","j2","k2","m2","n2","o2","_identityCalculated","b1","e1","f1","g1","i1","j1","k1","m1","n1","o1","matrix","matrixProps","isIdentity","_identity","equals","matr","cloneFromProps","applyToPoint","applyToX","applyToY","applyToZ","getInverseMatrix","determinant","inverseMatrix","inversePoint","applyToPointArray","inversePoints","pts","retPts","applyToTriplePoints","p5","p12","p13","applyToPointStringified","toCSS","cssValue","roundMatrixProperty","to2dCSS","_typeof$3","setLocation","setSubframeRendering","setPrefix","setQuality","inBrowser","installPlugin","getFactory","checkReady","readyStateCheckInterval","getQueryVariable","variable","vars","queryString","pair","useWebWorker","setIDPrefix","__getFactory","myScript","ShapeModifiers","registerModifier","getModifier","ShapeModifier","TrimModifier","PuckerAndBloatModifier","initModifierProperties","addShapeToModifier","setAsAnimated","processKeys","sValue","eValue","pathsData","calculateShapeEdges","shapeLength","totalModifierLength","segmentOb","shapeSegments","shapeS","shapeE","releasePathsData","processShapes","shapePaths","_s","totalShapeLength","edges","newShapesData","addShapes","lastShape","addPaths","newPaths","addSegment","newShape","addSegmentFromArray","shapeSegment","currentLengthData","segmentCount","processPath","centerPoint","pathLength","clonedPath","TransformPropertyFactory","defaultVector","TransformProperty","pre","appliedTransformations","px","py","pz","rx","ry","rz","_isDirty","applyToMatrix","mat","forceRender","precalculateMatrix","autoOriented","getValueAtTime","autoOrient","_addDynamicProperty","getTransformProperty","RepeaterModifier","RoundCornersModifier","floatEqual","floatZero","lerp","lerpPoint","quadRoots","singleRoot","polynomialCoefficients","p3","singlePoint","PolynomialBezier","linearize","pointEqual","coeffx","coeffy","extrema","intersectData","boundingBox","splitData","boxIntersect","intersectsImpl","intersections","maxRecursion","d1s","d2s","crossProduct","lineIntersection","start1","end1","start2","end2","v3","v4","polarOffset","pointDistance","hypot","ZigZagModifier","setPoint","outputBezier","amplitude","outAmplitude","inAmplitude","angO","angI","getPerpendicularVector","vector","getProjectingAngle","pVector","zigZagCorner","pointType","prevPoint","nextPoint","prevDist","nextDist","zigZagSegment","normalAngle","linearOffset","offsetSegment","p1a","p1b","p2a","joinLines","seg1","seg2","miterLimit","angleOut","tangentAngle","angleIn","intersection","getIntersection","pruneSegmentIntersection","outa","outb","pruneIntersections","offsetSegmentSplit","flex","inflectionPoints","OffsetPathModifier","getFontProperties","fontData","fStyle","fWeight","tr","so","pMatrix","rMatrix","sMatrix","tMatrix","applyTransforms","inv","elemsData","_currentCopies","_elements","_groups","resetElements","_processed","cloneElements","newElements","changeGroupRender","renderFlag","_render","itemsTransform","cont","hasReloaded","copies","group","ix","reloadShapes","elems","transformData","offsetModulo","roundOffset","pProps","rProps","sProps","iteration","mProps","rd","currentV","currentI","currentO","closerV","newPosPerc","derivative","denom","tcusp","square","p10","p11","p20","p21","shapeSegmentInverted","pointsType","ml","lj","inputBezier","multiSegments","lastSeg","multiSegment","FontManager","emptyChar","combinedCharacters","BLACK_FLAG_CODE_POINT","surrogateModifiers","setUpNode","fontFamily","fontVariant","fontStyle","fontWeight","letterSpacing","familyArray","enabledFamilies","trimFontOptions","createHelper","def","helper","engine","fontProps","tHelper","fFamily","fClass","tCanvasHelper","getComputedTextLength","getCodePoint","codePoint","isRegionalCode","Font","typekitLoaded","_warned","setIsLoadedBinded","setIsLoaded","checkLoadedFontsBinded","checkLoadedFonts","isModifier","firstCharCode","secondCharCode","isZeroWidthJoiner","charCode","isFlagEmoji","isCombinedCharacter","_char3","isRegionalFlag","isVariationSelector","fontPrototype","ch","fontArr","_pendingFonts","loadedSelector","shouldLoadFont","monoCase","sansCase","fPath","fOrigin","sc","getCharData","_char","getFontByName","fName","_char2","fontName","doubleSize","singleSize","loadedCount","SlotManager","slotFactory","RenderableElement","slots","initRenderable","isInRange","isTransparent","renderableComponents","addRenderableComponent","removeRenderableComponent","prepareRenderableFrame","checkLayerLimits","checkTransparency","finalTransform","mProp","renderConfig","hideOnTransparent","renderRenderable","sourceRectAtTime","getLayerSize","textData","getBlendMode","blendModeEnums","SliderEffect","AngleEffect","ColorEffect","PointEffect","LayerIndexEffect","MaskIndexEffect","CheckboxEffect","NoValueEffect","EffectsManager","ef","effectElements","effectItem","GroupEffect","BaseElement","FrameElement","FootageElement","imageLoader","initBaseData","AudioElement","_isPlaying","_canPlay","_currentTime","_volumeMultiplier","_previousVolume","_placeholder","lv","au","BaseRenderer","eff","checkMasks","LayerExpressionInterface","EffectsExpressionInterface","ShapeExpressionInterface","TextExpressionInterface","CompExpressionInterface","layerInterface","maskManager","registerMaskInterface","effectsInterface","createEffectsInterface","registerEffectsInterface","shapeInterface","shapesData","itemsData","textInterface","setBlendMode","blendModeValue","bm","baseElement","layerElement","layerId","effectsManager","prepareProperties","_isParent","getBaseElement","FootageInterface","getFootageData","timeRemapped","totalVolume","volumeValue","checkLayers","buildItem","checkPendingElements","createItem","layer","createImage","createComp","createSolid","createNull","createShape","createText","createCamera","createFootage","buildAllItems","pInterface","buildElementParenting","parentName","hierarchy","setAsParent","setHierarchy","addPendingElement","pendingElements","pathValue","setupGlobalData","fontsContainer","animationItem","compSize","effectTypes","TRANSFORM_EFFECT","TransformElement","MaskElement","viewData","solidPath","expansor","feMorph","currentMasks","maskType","maskRef","getShapeProp","filterID","expan","lastOperator","filterId","lastRadius","mask","createLayerSolidPath","invRect","drawPath","maskedElement","initTransform","_matMdf","_localMatMdf","_opMdf","localMat","localOpacity","ao","renderTransform","finalMat","renderLocalTransform","localTransforms","lmat","localOp","searchEffectTransforms","renderableEffectsManager","transformEffects","getEffects","globalToLocal","transforms","ptNew","mHelper","getMaskProperty","isFirstFrame","getMaskelement","pathNodes","pathString","pathShapeValue","filtersFactory","filId","skipCoordinates","fil","feColorMatrix","featureSupport","svgLumaHidden","offscreenCanvas","registeredEffects$1","idPrefix","SVGEffects","filterManager","createFilter","filters","Effect","countsAsEffect","registerEffect$1","SVGBaseElement","HierarchyElement","RenderableDOMElement","IImageElement","initElement","sourceRect","ProcessedElement","IShapeElement","initRendererElement","createContainerElements","matteElement","transformedElement","_sizeChanged","layerElementParent","td","matteMasks","gg","ln","hd","cp","clipId","cpGroup","renderElement","destroyBaseElement","createRenderableComponents","getMatte","matteType","useElement","masker","createAlphaToLuminanceFilter","maskGroup","maskGrouper","feCTr","feFunc","alphaRect","setMatte","initHierarchy","checkParenting","createContent","renderInnerContent","innerElem","pr","imagePreserveAspectRatio","addShapeToModifiers","shapeModifiers","isShapeInAnimatedModifiers","isAnimatedWithShape","renderModifiers","searchProcessedElement","processedElements","addProcessedElement","lineCapEnum","lineJoinEnum","SVGShapeData","transformers","lStr","SVGStyleData","pElem","msElem","DashProperty","dataProps","dashStr","dashArray","dashoffset","SVGStrokeStyleData","styleOb","SVGFillStyleData","SVGNoStyleData","GradientProperty","cLength","_cmdf","_omdf","_collapsable","checkCollapsable","_hasOpacity","SVGGradientFillStyleData","initGradientData","SVGGradientStrokeStyleData","ShapeGroupData","prevViewData","gr","SVGTransformData","comparePoints","stops","setGradientData","setGradientOpacity","pathElement","gradientId","gfill","gf","cst","opacityId","maskId","opFill","lc","ost","buildShapeString","shapeString","SVGElementsRenderer","_identityMatrix","_matrixHelper","renderContentTransform","styleData","renderNoop","renderPath","pathStringTransformed","lLen","renderFill","styleElem","renderGradientStroke","renderGradient","renderStroke","hasOpacity","attr1","attr2","cValues","oValues","ang","createRenderFunction","SVGShapeElement","stylesList","animatedContents","LetterProps","sw","TextProperty","_frameId","keysIndex","canResize","minimumFontSize","ascent","defaultBoxWidth","justifyOffset","lh","lineWidths","ls","ps","fillColorAnim","strokeColorAnim","strokeWidthAnim","finalSize","finalText","finalLineHeight","copyData","searchProperty","completeTextData","initSecondaryElement","identityMatrix","buildExpressionInterface","searchShapes","filterUniqueShapes","tempShapes","areAnimated","setShapesAsAnimated","createStyleElement","elementData","addToAnimatedContents","createGroupElement","createTransformElement","transformProperty","createShapeElement","ownTransformers","setElementStyles","currentTransform","processedPos","ownStyles","ownModifiers","renderShape","animatedContent","setCurrentData","searchKeyframes","getKeyframeValue","_finalValue","textKeys","buildFinalText","charactersArray","shouldCombine","shouldCombineNext","currentChars","newLineFlag","letters","anchorGrouping","currentSize","currentPos","currentLine","trackingOffset","currentHeight","lastSpaceIndex","currentChar","uncollapsedSpaces","an","anIndexes","animatorJustifyOffset","animatorData","letterData","based","animators","indexes","fh","fs","rn","totalChars","newInd","currentInd","dData","recalculate","canResizeFont","_canResize","setMinimumFontSize","_fontValue","TextSelectorProp","TextSelectorPropFactory","_currentTextLength","finalS","finalE","xe","ne","sm","getMult","textProperty","easer","tot","smoothness","newCharsFlag","divisor","getTextSelectorProp","TextAnimatorDataProperty","animatorProps","textAnimatorAnimatables","TextAnimatorProperty","renderType","_hasMaskedPath","_textData","_renderType","_elem","_animatorsData","_pathData","_moreOptions","renderedLetters","lettersChangedFlag","ITextElement","searchProperties","getMeasures","xPos","yPos","pathInfo","currentLength","currentPoint","pointInd","segmentInd","tanAngle","matrixHelper","renderedLettersCount","tLength","pi","letterValue","yOff","firstLine","offf","xPathPos","yPathPos","elemOpacity","letterSw","letterSc","letterFc","letterO","initPathPos","initSegmentInd","initPointInd","letterM","letterP","defaultPropsArray","animatorFirstCharOffset","justifyOffsetMult","isNewLine","animatorOffset","atan","textAnimator","createPathShape","shapeStr","_fontSize","applyTextPropertiesToMatrix","lineNumber","buildColor","colorData","emptyProp","validateText","buildNewText","emptyShapeData","SVGTextLottieElement","textSpans","ISolidElement","NullElement","SVGRendererBase","ICompElement","SVGCompElement","supports3d","SVGRenderer","svgElement","titleId","descElement","descId","preserveAspectRatio","contentVisibility","viewBoxOnly","viewBoxSize","focusable","filterSize","runExpressions","destroyed","ShapeTransformManager","sequences","sequenceList","transform_key_count","singleShape","textContainer","buildTextContents","textArray","textContents","currentTextContent","buildShapeData","shapeItem","tSpan","usesGlyphs","cachedSpansLength","glyph","glyphElement","_debug","tElement","justify","textBox","bbox","renderedLetter","textSpan","findIndexByInd","appendElementInPos","elementIndex","matteMask","nextElement","setElements","destroyElements","addTransformSequence","sequence","processSequence","processSequences","getNewKey","lumaLoader","lumaBuffer","lumaBufferCtx","svg","loadLuma","_svg","createLumaSvgFilter","createCanvas","loadLumaCanvas","getLumaCanvas","registeredEffects","CVEffects","registerEffect","CVMaskElement","hasMasks","CVBaseElement","canvasContext","operationsMap","CVShapeData","transformsManager","styledShapes","styledShape","trNodes","CVShapeElement","CVTextElement","currentRender","sWidth","fValue","CVImageElement","CVSolidElement","CanvasRendererBase","CanvasContext","CVContextData","cArrPos","cTr","nativeContext","transformMat","currentOpacity","currentFillStyle","appliedFillStyle","currentStrokeStyle","appliedStrokeStyle","currentLineWidth","appliedLineWidth","currentLineCap","appliedLineCap","currentLineJoin","appliedLineJoin","appliedMiterLimit","currentMiterLimit","CVCompElement","CanvasRenderer","currentGlobalAlpha","contextData","ctxTransform","ctxOpacity","ctxFillStyle","ctxStrokeStyle","ctxLineWidth","ctxLineCap","ctxLineJoin","ctxMiterLimit","ctxFill","ctxFillRect","ctxStroke","HBaseElement","HSolidElement","HShapeElement","shapesContainer","currentBBox","HTextElement","textPaths","isMasked","HCameraElement","pe","_prevMat","HImageElement","HybridRendererBase","threeDElements","camera","HCompElement","HybridRenderer","createElements","bufferCanvas","bufferCanvas2","_isProxy","transformCanvas","blendMode","globalCompositeOperation","hideElement","showElement","prepareLayer","bufferCtx","getTransform","exitLayer","forceRealStack","transformHelper","dashResetter","preTransforms","wi","da","addTransformToStyleList","removeTransformFromStyleList","closeStyles","shouldRender","ownTransforms","_shouldRender","renderShapeTransform","parentTransform","groupTransform","drawLayer","nodes","currentStyle","coOp","grd","renderGradientFill","renderStyledShape","shapeNodes","groupTransformMat","createLinearGradient","createRadialGradient","addColorStop","hasFill","hasStroke","commands","pathArr","commandsCounter","lastFill","lastStroke","lastStrokeW","widthCrop","heightCrop","imgW","imgH","imgRel","canvasRel","par","actionFlag","mozTransformOrigin","isDashed","elementRel","animationRel","fillType","duplicate","newLength","forceRestore","currentContext","prevStack","saveOnNativeFlag","currentStack","newStack","setOpacity","trProps","checkBlendMode","tg","transformedElementStyle","matrixValue","webkitTransform","addEffects","_renderShapeFrame","shapeCont","getTransformedPoint","calculateShapeBoundingBox","vPoint","oPoint","nextIPoint","nextVPoint","checkBounds","getBoundsOfCurve","shapeBoundingBox","tempBoundingBox","b2ac","calculateF","calculateBoundingBox","expandStrokeBoundingBox","widthProperty","kfw","currentBoxContains","shapeStyle","shapeTransform","compW","compH","innerElemStyle","tParent","tCont","tContStyle","tContTranslation","tStyle","tSpanTranslation","svgStyle","textPath","svgTransform","perspectiveStyle","perspectiveElem","webkitPerspective","mTransf","diffVector","mag","lookDir","lookLengthOnXZ","mRotationX","mRotationY","hasMatrixChanged","matValue","imageElem","newDOMElement","ddd","addTo3dContainer","nextDOMElement","nextLayer","getThreeDContainerByPos","startPos","endPos","createThreeDContainer","threeDContainerData","build3dContainers","lastThreeDContainerData","currentContainer","resizerElem","cWidth","cHeight","floatingContainer","_createBaseContainerElements","_thisLayerFunction","pixelAspect","displayStartTime","numLayers","_typeof$2","seedRandom","rngname","startdenom","significance","ARC4","keylen","flatten","mixkey","smear","stringseed","tostring","shortseed","entropy","autoseed","arc4","prng","int32","quick","is_math_call","initialize$2","SHAPE","_typeof$1","ExpressionManager","_lottieGlobal","$bm_isInstanceOfArray","isNumerable","tOfV","$bm_neg","tOfA","lenA","retArr","easeInBez","easeOutBez","easeInOutBez","tOfB","lenB","mul","mod","$bm_sum","$bm_sub","$bm_mul","$bm_div","$bm_mod","radiansToDegrees","radians_to_degrees","degreesToRadians","degrees_to_radians","helperLengthArray","arr1","arr2","vec","rgbToHsl","hue2rgb","hslToRgb","tMin","tMax","value1","value2","_tMin","rnd","createPath","inTangents","outTangents","inVertexPoint","outVertexPoint","arrPlaceholder","initiateExpression","noOp","needsVelocity","_needsRandom","elemType","$bm_transform","thisProperty","valueAtTime","inPoint","outPoint","loopIn","loop_in","loopOut","loop_out","smooth","toWorld","fromWorld","fromComp","toComp","fromCompToSurface","anchorPoint","thisLayer","thisComp","velocityAtTime","scoped_bm_rt","expression_function","eval","numKeys","wiggle","freq","amp","iWiggle","lenWiggle","addedAmps","periods","loopInDuration","loopOutDuration","getVelocityAtTime","textIndex","textTotal","selectorValue","lookAt","elem1","elem2","fVec","pitch","easeOut","applyEase","easeIn","ease","lenKey","nearestKey","obKey","framesToTime","fps","timeToFrames","seedrandom","randSeed","posterizeTime","framesPerSecond","executeExpression","frameExpressionId","__preventDeadCodeRemoval","Expressions","registers","pushExpression","popExpression","releaseInstances","registerExpressionProperty","expression","MaskManagerInterface","MaskInterface","_mask","_masksInterfaces","ExpressionPropertyInterface","defaultUnidimensionalValue","defaultMultidimensionalValue","completeProperty","expressionValue","valueProp","speedAtTime","getSpeedAtTime","propertyGroup","defaultGetter","UnidimensionalPropertyInterface","arrValue","MultidimensionalPropertyInterface","TransformExpressionInterface","_thisFunction","xRotation","yRotation","xPosition","yPosition","zPosition","_px","_py","_pz","_transformFactory","getMatrix","toWorldMat","toWorldVec","applyPoint","fromWorldVec","invertPoint","sampleImage","transformInterface","anchorPointDescriptor","anchor_point","propertyGroupFactory","interfaceFunction","parentPropertyGroup","PropertyInterface","createGroupInterface","groupInterface","mn","_propertyGroup","createValueInterface","numProperties","np","expressionProperty","setGroupProperty","effectsData","ShapePathInterface","propertyIndex","iterateElements","groupInterfaceFactory","fillInterfaceFactory","strokeInterfaceFactory","trimInterfaceFactory","ellipseInterfaceFactory","starInterfaceFactory","rectInterfaceFactory","roundedInterfaceFactory","repeaterInterfaceFactory","gradientFillInterfaceFactory","interfaces","transformInterfaceFactory","cix","contentsInterfaceFactory","startPoint","endPoint","_dashPropertyGroup","dashOb","addPropertyToDashOb","skewAxis","outerRoundness","innerRoundness","_interfaceFunction","_sourceText","sourceText","stringValue","fillColor","dataInterfaceFactory","outlineInterface","currentPropertyName","currentProperty","propertyNameIndex","outlineInterfaceFactory","dataInterface","footage","getInterface","expressionHelpers","searchExpressions","speed","_cachingAtTime","getStaticValueAtTime","addPropertyDecorator","durationFlag","cycleDuration","firstKeyFrame","lastKeyFrame","initV","endV","repeats","lastValue","nextLastValue","firstValue","nextFirstValue","samples","sampleValue","sampleFrequency","getTransformValueAtTime","_transformCachingAtTime","anchor","rotationZ","rotationY","rotationX","orientation","positionX","positionY","positionZ","getTransformStaticValueAtTime","propertyGetProp","ShapePropertyConstructorFunction","getConstructorFunction","KeyframedShapePropertyConstructorFunction","getKeyframedConstructorFunction","ShapeExpressions","pointOnPath","_segmentsLength","accumulatedLength","initIndex","vectorOnPath","vectorType","xLength","yLength","magnitude","tangentOnPath","normalOnPath","shapeValue","lastTime","propertyGetShapeProp","trims","initialize$1","addDecorator","getExpressionValue","calculateExpression","isKeyframed","hasExpressions","SVGComposableEffect","createMergeNode","resultId","ins","feMergeNode","feMerge","linearFilterValue","SVGTintFilter","linearFilter","matrixFilter","SVGFillFilter","SVGStrokeEffect","initialized","SVGTritoneFilter","feComponentTransfer","feFuncR","feFuncG","feFuncB","SVGProLevelsFilter","createFeFunc","feFuncA","feFuncRComposed","feFuncGComposed","feFuncBComposed","SVGDropShadowEffect","globalFilterSize","feGaussianBlur","feOffset","feFlood","feComposite","colorBlack","colorWhite","groupPath","elemChildren","childNodes","pathMasker","dasharrayValue","getTotalLength","lineLength","units","color1","color2","color3","tableR","tableG","tableB","getTableValue","inputBlack","inputWhite","gamma","outputBlack","outputWhite","colorValue","outputDelta","inputDelta","_svgMatteSymbols","SVGMatte3Effect","filterElem","SVGGaussianBlurEffect","TransformEffect","SVGTransformEffect","CVTransformEffect","findSymbol","replaceInParent","symbolId","nextChild","useElem","setElementAsMask","sigma","sigmaX","sigmaY","edgeMode","forceFrame","isUniformScale","scaleHeight","scaleWidth","aa","ca","ea","ha","ia","ja","ka","la","ma","acceptsBooleans","attributeName","attributeNamespace","mustUseProperty","sanitizeURL","removeEmptyString","ra","ta","pa","qa","oa","xlinkHref","va","wa","ya","za","Aa","Ba","Ca","Da","Ea","Fa","Ga","Ha","Ia","Ja","Ka","La","Ma","Na","Oa","prepareStackTrace","construct","Pa","Qa","Ra","Sa","Ta","Va","_valueTracker","setValue","stopTracking","Ua","Wa","checked","Xa","Ya","defaultChecked","_wrapperState","initialChecked","Za","controlled","ab","bb","db","eb","defaultSelected","gb","hb","ib","jb","kb","lb","mb","namespaceURI","MSApp","execUnsafeLocalFunction","lastChild","nodeType","nodeValue","animationIterationCount","borderImageOutset","borderImageSlice","borderImageWidth","boxFlex","boxFlexGroup","boxOrdinalGroup","columnCount","columns","flexGrow","flexPositive","flexShrink","flexNegative","flexOrder","gridArea","gridRow","gridRowEnd","gridRowSpan","gridRowStart","gridColumn","gridColumnEnd","gridColumnSpan","gridColumnStart","lineClamp","orphans","tabSize","widows","fillOpacity","floodOpacity","stopOpacity","strokeDasharray","strokeOpacity","qb","rb","sb","tb","menuitem","br","embed","hr","keygen","wbr","ub","vb","wb","xb","srcElement","correspondingUseElement","yb","zb","Ab","Bb","Cb","stateNode","Db","Eb","Fb","Gb","Hb","Ib","Jb","Kb","Lb","Mb","Nb","Ob","Pb","Qb","Rb","Sb","Tb","Vb","alternate","return","Wb","memoizedState","dehydrated","Xb","Zb","sibling","Yb","$b","ac","unstable_scheduleCallback","bc","unstable_cancelCallback","cc","unstable_shouldYield","dc","unstable_requestPaint","unstable_now","ec","unstable_getCurrentPriorityLevel","unstable_ImmediatePriority","unstable_UserBlockingPriority","hc","unstable_NormalPriority","ic","unstable_LowPriority","jc","unstable_IdlePriority","kc","oc","clz32","pc","qc","LN2","rc","tc","uc","pendingLanes","suspendedLanes","pingedLanes","entangledLanes","entanglements","vc","xc","yc","zc","Ac","eventTimes","Cc","Dc","Ec","Fc","Gc","Hc","Ic","Jc","Kc","Lc","Mc","Nc","Oc","Pc","Qc","Rc","Sc","pointerId","Tc","blockedOn","domEventName","eventSystemFlags","targetContainers","Vc","Wc","priority","isDehydrated","containerInfo","Xc","Yc","dispatchEvent","Zc","$c","ad","bd","cd","dd","ed","fd","gd","Uc","jd","kd","ld","md","nd","od","pd","qd","_reactName","_targetInst","isDefaultPrevented","defaultPrevented","isPropagationStopped","cancelBubble","isPersistent","wd","xd","yd","sd","eventPhase","bubbles","isTrusted","ud","vd","Ad","screenX","screenY","pageX","pageY","metaKey","getModifierState","zd","button","fromElement","toElement","movementX","movementY","Bd","Dd","dataTransfer","Fd","Hd","animationName","pseudoElement","Id","clipboardData","Jd","Ld","Md","Esc","Spacebar","Left","Up","Right","Down","Del","Win","Menu","Apps","Scroll","MozPrintableKey","Nd","Od","Alt","Control","Meta","Pd","Qd","repeat","which","Rd","Td","pressure","tangentialPressure","tiltX","tiltY","twist","isPrimary","Vd","targetTouches","changedTouches","Xd","wheelDeltaX","wheelDeltaY","wheelDelta","deltaZ","deltaMode","Zd","ae","be","documentMode","ce","ee","fe","ge","he","ie","le","tel","oe","qe","re","se","te","ue","ve","we","ye","ze","oninput","Ae","detachEvent","Be","Ce","De","Ee","Fe","He","Ie","Je","Ke","nextSibling","Le","compareDocumentPosition","Me","HTMLIFrameElement","Ne","contentEditable","Oe","focusedElem","selectionRange","selectionStart","selectionEnd","getSelection","rangeCount","anchorNode","anchorOffset","focusNode","focusOffset","createRange","setStart","removeAllRanges","addRange","setEnd","Pe","Re","Se","Te","Ue","Ve","We","animationend","animationiteration","animationstart","transitionend","Ye","Ze","$e","af","bf","cf","df","ff","hf","lf","mf","nf","Ub","pf","qf","rf","sf","tf","uf","parentWindow","vf","wf","xa","$a","ba","je","ke","xf","yf","zf","Af","Bf","Cf","Df","Ef","__html","Ff","Gf","Hf","Jf","If","Kf","Lf","Mf","previousSibling","Nf","Of","Pf","Qf","Rf","Sf","Tf","Uf","Vf","Wf","Xf","Yf","contextTypes","__reactInternalMemoizedUnmaskedChildContext","__reactInternalMemoizedMaskedChildContext","Zf","childContextTypes","$f","ag","bg","getChildContext","cg","__reactInternalMemoizedMergedChildContext","dg","eg","fg","hg","jg","kg","lg","mg","ng","og","qg","rg","sg","ug","vg","wg","xg","yg","zg","Ag","Bg","deletions","Cg","pendingProps","treeContext","retryLane","Dg","Eg","Fg","Gg","memoizedProps","Hg","Ig","Jg","Kg","Lg","_stringRef","Mg","Ng","Og","Pg","Qg","Rg","Sg","Tg","Ug","Vg","Wg","Xg","Yg","Zg","ah","bh","childLanes","dependencies","firstContext","lanes","dh","eh","memoizedValue","gh","interleaved","ih","jh","kh","updateQueue","baseState","firstBaseUpdate","lastBaseUpdate","mh","eventTime","lane","nh","oh","ph","qh","rh","th","uh","vh","wh","xh","yh","zh","Ah","Bh","Ch","revealOrder","Dh","Eh","_workInProgressVersionPrimary","Fh","Gh","Hh","Ih","Jh","Kh","Lh","Mh","Nh","Oh","Ph","Qh","Rh","Sh","Th","baseQueue","Uh","Vh","Wh","lastRenderedReducer","hasEagerState","eagerState","lastRenderedState","Xh","Yh","Zh","$h","ai","bi","ci","di","lastEffect","stores","ei","fi","gi","ji","mi","ni","oi","qi","ri","si","vi","yi","zi","Ai","Bi","readContext","useMutableSource","unstable_isNewReconciler","identifierPrefix","Ci","Di","Ei","_reactInternals","Fi","shouldComponentUpdate","Gi","contextType","Hi","componentWillReceiveProps","UNSAFE_componentWillReceiveProps","Ii","getDerivedStateFromProps","getSnapshotBeforeUpdate","UNSAFE_componentWillMount","componentWillMount","Ji","digest","Ki","Li","Mi","Ni","Oi","Pi","Qi","Ri","componentStack","Si","pingCache","Ti","Ui","Vi","Wi","Xi","Yi","Zi","aj","bj","cj","dj","baseLanes","cachePool","transitions","ej","fj","gj","hj","ij","UNSAFE_componentWillUpdate","componentWillUpdate","jj","kj","pendingContext","zj","Aj","Bj","Cj","mj","nj","oj","pj","qj","sj","dgst","tj","uj","_reactRetry","rj","subtreeFlags","vj","wj","isBackwards","rendering","renderingStartTime","tail","tailMode","xj","Dj","Ej","Fj","wasMultiple","multiple","suppressHydrationWarning","onclick","autoFocus","Gj","Hj","Ij","Jj","Kj","Lj","Mj","Nj","Pj","Qj","Rj","Sj","Tj","Uj","Vj","_reactRootContainer","Wj","Xj","Yj","Zj","onCommitFiberUnmount","ak","bk","ck","dk","ek","gk","hk","ik","jk","kk","__reactInternalSnapshotBeforeUpdate","Vk","lk","mk","pk","qk","rk","tk","uk","vk","wk","xk","yk","zk","Ak","Bk","Ck","Dk","callbackNode","expirationTimes","expiredLanes","wc","callbackPriority","ig","Ek","Fk","Gk","Hk","Ik","Jk","Kk","Lk","Mk","Nk","Ok","finishedWork","finishedLanes","Pk","timeoutHandle","Qk","Rk","Sk","Tk","Uk","mutableReadLanes","Bc","Oj","onCommitFiberRoot","mc","onRecoverableError","Wk","onPostCommitFiberRoot","Xk","Yk","$k","pendingChildren","al","mutableSourceEagerHydrationData","bl","pendingSuspenseBoundaries","dl","fl","gl","hl","il","yj","Zk","kl","reportError","ll","_internalRoot","nl","ol","pl","rl","ql","unstable_scheduleHydration","form","sl","usingClientEntryPoint","Events","findFiberByHostInstance","bundleType","rendererPackageName","ul","rendererConfig","overrideHookState","overrideHookStateDeletePath","overrideHookStateRenamePath","overrideProps","overridePropsDeletePath","overridePropsRenamePath","setErrorHandler","setSuspenseHandler","scheduleUpdate","currentDispatcherRef","findHostInstanceByFiber","findHostInstancesForRefresh","scheduleRefresh","scheduleRoot","setRefreshHandler","getCurrentFiber","reconcilerVersion","__REACT_DEVTOOLS_GLOBAL_HOOK__","vl","supportsFiber","inject","unstable_strictMode","findDOMNode","flushSync","hydrate","hydrateRoot","hydratedSources","_getVersion","_source","unmountComponentAtNode","unstable_batchedUpdates","unstable_renderSubtreeIntoContainer","checkDCE","sortIndex","setImmediate","priorityLevel","scheduling","isInputPending","MessageChannel","port2","port1","unstable_Profiling","unstable_continueExecution","unstable_forceFrameRate","unstable_getFirstCallbackNode","unstable_next","unstable_pauseExecution","unstable_runWithPriority","unstable_wrapCallback","objectIs","useSyncExternalStoreWithSelector","getServerSnapshot","selector","isEqual","instRef","memoizedSelector","nextSnapshot","hasMemo","memoizedSnapshot","memoizedSelection","nextSelection","maybeGetServerSnapshot","getRawTag","symToStringTag","trimmedEndIndex","reTrimStart","freeGlobal","objectProto","nativeObjectToString","isOwn","unmasked","freeSelf","reWhitespace","toNumber","nativeMax","nativeMin","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","invokeFunc","shouldInvoke","timeSinceLastCall","timerExpired","trailingEdge","timeWaiting","remainingWait","debounced","isInvoking","leadingEdge","baseGetTag","isObjectLike","baseTrim","isSymbol","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","isBinary","_setPrototypeOf","CAN_USE_DOM","memoized","canUsePassiveEventListeners","supportsPassiveOption","testPassiveEventListeners","ensureCanMutateNextEventHandlers","nextHandlers","TargetEventHandlers","getEventHandlers","normalizedEventOptions","EVENT_HANDLERS_KEY","eventOptions","normalizeEventOptions","computeOffsetPixels","contextHeight","pixelOffset","percentOffset","parseOffsetAsPercentage","ABOVE","INSIDE","BELOW","INVISIBLE","isDOMElement","timeoutQueue","onNextTick","hasWindow","scrollableAncestor","topOffset","bottomOffset","onPositionChange","_React$PureComponent","_proto","cancelOnNextTick","_this2$props","ensureRefIsProvidedByChild","_handleScroll","_findScrollableAncestor","scrollEventListenerUnsubscribe","resizeEventListenerUnsubscribe","_this$props","resolveScrollableAncestorProp","_getBounds","currentPosition","viewportBottom","viewportTop","waypointTop","waypointBottom","getCurrentPosition","_previousPosition","_this$props2","callbackArg","contextScrollTop","_this$props3","_this$_ref$getBoundin","_this$props4","_this4","isForwardRef","innerRef","above","below","invisible","jsx","jsxs","throw","createEvent","initCustomEvent","seal","execScript","minTotalBytes","minBytes","fastHalfLife","slowHalfLife","getBandwidthEstimate","removeAll","unlisten","listenOnce","NEVER","ALWAYS","IF_PREFERRED_TEXT_LANGUAGE","IF_SUBTITLES_MAY_BE_NEEDED","decodeURI","byteLength","isView","byteOffset","Uint16Array","DataView","BYTES_PER_ELEMENT","severity","toDataView","toUint16","toUint8","toArrayBuffer","equal","keyId","keyIds","licenseServerUri","distinctiveIdentifierRequired","persistentStateRequired","serverCertificateUri","Severity","RECOVERABLE","CRITICAL","NETWORK","TEXT","MANIFEST","STREAMING","DRM","PLAYER","CAST","STORAGE","ADS","UNSUPPORTED_SCHEME","BAD_HTTP_STATUS","HTTP_ERROR","TIMEOUT","MALFORMED_DATA_URI","REQUEST_FILTER_ERROR","RESPONSE_FILTER_ERROR","MALFORMED_TEST_URI","UNEXPECTED_TEST_REQUEST","ATTEMPTS_EXHAUSTED","SEGMENT_MISSING","INVALID_TEXT_HEADER","INVALID_TEXT_CUE","UNABLE_TO_DETECT_ENCODING","BAD_ENCODING","INVALID_XML","INVALID_MP4_TTML","INVALID_MP4_VTT","UNABLE_TO_EXTRACT_CUE_START_TIME","INVALID_MP4_CEA","TEXT_COULD_NOT_GUESS_MIME_TYPE","CANNOT_ADD_EXTERNAL_TEXT_TO_SRC_EQUALS","TEXT_ONLY_WEBVTT_SRC_EQUALS","MISSING_TEXT_PLUGIN","CHAPTERS_TRACK_FAILED","UNSUPPORTED_EXTERNAL_THUMBNAILS_URI","BUFFER_READ_OUT_OF_BOUNDS","JS_INTEGER_OVERFLOW","EBML_OVERFLOW","EBML_BAD_FLOATING_POINT_SIZE","MP4_SIDX_WRONG_BOX_TYPE","MP4_SIDX_INVALID_TIMESCALE","MP4_SIDX_TYPE_NOT_SUPPORTED","WEBM_CUES_ELEMENT_MISSING","WEBM_EBML_HEADER_ELEMENT_MISSING","WEBM_SEGMENT_ELEMENT_MISSING","WEBM_INFO_ELEMENT_MISSING","WEBM_DURATION_ELEMENT_MISSING","WEBM_CUE_TRACK_POSITIONS_ELEMENT_MISSING","WEBM_CUE_TIME_ELEMENT_MISSING","MEDIA_SOURCE_OPERATION_FAILED","MEDIA_SOURCE_OPERATION_THREW","QUOTA_EXCEEDED_ERROR","TRANSMUXING_FAILED","CONTENT_TRANSFORMATION_FAILED","MSS_MISSING_DATA_FOR_TRANSMUXING","MSS_TRANSMUXING_FAILED","TRANSMUXING_NO_VIDEO_DATA","STREAMING_NOT_ALLOWED","UNABLE_TO_GUESS_MANIFEST_TYPE","DASH_INVALID_XML","DASH_NO_SEGMENT_INFO","DASH_EMPTY_ADAPTATION_SET","DASH_EMPTY_PERIOD","DASH_WEBM_MISSING_INIT","DASH_UNSUPPORTED_CONTAINER","DASH_PSSH_BAD_ENCODING","DASH_NO_COMMON_KEY_SYSTEM","DASH_MULTIPLE_KEY_IDS_NOT_SUPPORTED","DASH_CONFLICTING_KEY_IDS","RESTRICTIONS_CANNOT_BE_MET","HLS_PLAYLIST_HEADER_MISSING","INVALID_HLS_TAG","HLS_INVALID_PLAYLIST_HIERARCHY","DASH_DUPLICATE_REPRESENTATION_ID","HLS_MULTIPLE_MEDIA_INIT_SECTIONS_FOUND","HLS_REQUIRED_ATTRIBUTE_MISSING","HLS_REQUIRED_TAG_MISSING","HLS_COULD_NOT_GUESS_CODECS","HLS_KEYFORMATS_NOT_SUPPORTED","DASH_UNSUPPORTED_XLINK_ACTUATE","DASH_XLINK_DEPTH_LIMIT","CONTENT_UNSUPPORTED_BY_BROWSER","CANNOT_ADD_EXTERNAL_TEXT_TO_LIVE_STREAM","NO_VARIANTS","PERIOD_FLATTENING_FAILED","INCONSISTENT_DRM_ACROSS_PERIODS","HLS_VARIABLE_NOT_FOUND","HLS_MSE_ENCRYPTED_MP2T_NOT_SUPPORTED","HLS_MSE_ENCRYPTED_LEGACY_APPLE_MEDIA_KEYS_NOT_SUPPORTED","NO_WEB_CRYPTO_API","CANNOT_ADD_EXTERNAL_THUMBNAILS_TO_LIVE_STREAM","MSS_INVALID_XML","MSS_LIVE_CONTENT_NOT_SUPPORTED","AES_128_INVALID_IV_LENGTH","AES_128_INVALID_KEY_LENGTH","DASH_CONFLICTING_AES_128","DASH_UNSUPPORTED_AES_128","DASH_INVALID_PATCH","HLS_EMPTY_MEDIA_PLAYLIST","DASH_MSE_ENCRYPTED_LEGACY_APPLE_MEDIA_KEYS_NOT_SUPPORTED","STREAMING_ENGINE_STARTUP_INVALID_STATE","NO_RECOGNIZED_KEY_SYSTEMS","REQUESTED_KEY_SYSTEM_CONFIG_UNAVAILABLE","FAILED_TO_CREATE_CDM","FAILED_TO_ATTACH_TO_VIDEO","INVALID_SERVER_CERTIFICATE","FAILED_TO_CREATE_SESSION","FAILED_TO_GENERATE_LICENSE_REQUEST","LICENSE_REQUEST_FAILED","LICENSE_RESPONSE_REJECTED","ENCRYPTED_CONTENT_WITHOUT_DRM_INFO","NO_LICENSE_SERVER_GIVEN","OFFLINE_SESSION_REMOVED","EXPIRED","SERVER_CERTIFICATE_REQUIRED","INIT_DATA_TRANSFORM_ERROR","SERVER_CERTIFICATE_REQUEST_FAILED","MIN_HDCP_VERSION_NOT_MATCH","ERROR_CHECKING_HDCP_VERSION","MISSING_EME_SUPPORT","LOAD_INTERRUPTED","OPERATION_ABORTED","NO_VIDEO_ELEMENT","OBJECT_DESTROYED","CONTENT_NOT_LOADED","SRC_EQUALS_PRELOAD_NOT_SUPPORTED","PRELOAD_DESTROYED","CAST_API_UNAVAILABLE","NO_CAST_RECEIVERS","ALREADY_CASTING","UNEXPECTED_CAST_ERROR","CAST_CANCELED_BY_USER","CAST_CONNECTION_TIMED_OUT","CAST_RECEIVER_APP_UNAVAILABLE","STORAGE_NOT_SUPPORTED","INDEXED_DB_ERROR","DEPRECATED_OPERATION_ABORTED","REQUESTED_ITEM_NOT_FOUND","MALFORMED_OFFLINE_URI","CANNOT_STORE_LIVE_OFFLINE","NO_INIT_DATA_FOR_OFFLINE","LOCAL_PLAYER_INSTANCE_REQUIRED","NEW_KEY_OPERATION_NOT_SUPPORTED","KEY_NOT_FOUND","MISSING_STORAGE_CELL","STORAGE_LIMIT_REACHED","DOWNLOAD_SIZE_CALLBACK_ERROR","MODIFY_OPERATION_NOT_SUPPORTED","INDEXED_DB_INIT_TIMED_OUT","CS_IMA_SDK_MISSING","CS_AD_MANAGER_NOT_INITIALIZED","SS_IMA_SDK_MISSING","SS_AD_MANAGER_NOT_INITIALIZED","CURRENT_DAI_REQUEST_NOT_FINISHED","MT_AD_MANAGER_NOT_INITIALIZED","INTERSTITIAL_AD_MANAGER_NOT_INITIALIZED","VAST_INVALID_XML","ManagedMediaSource","MediaSource","canPlayType","nc","maxTouchPoints","__platform__","canDisplayType","webapis","systeminfo","getMaxVideoResolution","productinfo","is8KPanelSupported","isUdPanelSupported","PalmSystem","screenHeight","Hisense_Get4KSupportState","Windows","hostObjects","sync","Media","Protection","ProtectionCapabilities","ProtectionCapabilityResult","maybe","probably","msdk","getDisplayInfo","resolution","getDisplayInfoImmediate","tickEvery","tickAfter","tickNow","getUint16","setUint16","fromCodePoint","resetFromCharCode","toUTF16","fromUTF16","encryptionScheme","sessionType","keySystemUris","kid","kids","toHex","fromHex","libDPIModule","LCEVCdec","LcevcDil","SupportObject","SupportStatus","SupportError","HTMLCanvasElement","webGLSupport","baseOriginalId","appendBuffer","codecs","ManagedSourceBuffer","SourceBuffer","changeType","setLiveSeekableRange","clearLiveSeekableRange","packet","findDecoder","unregisterDecoder","registerDecoder","findParser","unregisterParser","registerParser","regionAnchorY","regionAnchorX","viewportAnchorY","viewportAnchorX","viewportAnchorUnits","widthUnits","heightUnits","PX","PERCENTAGE","LINES","Cd","Ed","Gd","Kd","scrollMode","NONE","Ud","Sd","Wd","sel","region","positionAlign","writingMode","lineInterpretation","lineAlign","Ge","displayAlign","linePadding","textCombineUpright","textDecoration","textShadow","wrapLine","nestedCues","lineBreak","isContainer","rubyTag","cellResolution","rows","parseCuePayload","CENTER","AUTO","START","BEFORE","AFTER","HORIZONTAL_LEFT_TO_RIGHT","HORIZONTAL_RIGHT_TO_LEFT","HORIZONTAL_TOP_TO_BOTTOM","VERTICAL_LEFT_TO_RIGHT","VERTICAL_RIGHT_TO_LEFT","LINE_NUMBER","white","magenta","defaultTextColor","bg_white","bg_lime","bg_cyan","bg_red","bg_yellow","bg_magenta","bg_blue","bg_black","defaultTextBackgroundColor","NORMAL","BOLD","ITALIC","OBLIQUE","UNDERLINE","LINE_THROUGH","OVERLINE","jf","isSupported","findTransmuxer","unregisterTransmuxer","registerTransmuxer","convertCodecs","hdr","PluginPriority","FALLBACK","PREFERRED_SECONDARY","PREFERRED","APPLICATION","getFullTypeWithAllCodecs","getFullType","findClosestLocale","getLocaleForVariant","getLocaleForText","getBase","relatedness","areSiblings","isSiblingOf","isParentOf","areLanguageCompatible","areLocaleCompatible","fastSwitching","dependencyStream","channelsCount","audioSamplingRate","groupId","textStreams","variants","decodingInfos","vp8","avc","vp9","vp09","hevc","av01","vvc","minWidth","minPixels","maxPixels","minFrameRate","maxFrameRate","minChannelsCount","maxChannelsCount","minBandwidth","offlineSessionIds","imageStreams","supported","keySystemAccess","encrypted","powerEfficient","mediaCapabilities","decodingInfo","keySystemConfiguration","fullMimeTypes","samplerate","spatialRendering","framerate","transferFunction","colorGamut","spatialAudio","drmInfos","persistentState","distinctiveIdentifier","sessionTypes","pixelAspectRatio","videoLayout","primary","audioRoles","audioGroupId","tilesLayout","originalTextId","originalImageId","originalLanguage","originalId","segmentIndex","__shaka_id","allowedByApplication","allowedByKeySystem","disabledUntilTime","trickModeVideo","autoShowText","meetsRestrictions","useNetworkInformation","chooseVariant","onLine","clearBufferSwitch","safeMarginSwitch","restrictToElementSize","restrictToScreenSize","documentPictureInPicture","switchInterval","minTimeToSwitch","ignoreDevicePixelRatio","pictureInPictureElement","bandwidthDowngradeTarget","bandwidthUpgradeTarget","segmentDownloaded","cacheLoadThreshold","trySuggestStreams","defaultBandwidthEstimate","downlink","preferNetworkInformationBandwidth","setVariants","playbackRateChanged","setMediaElement","pictureInPictureWindow","setCmsdManager","baseDelay","backoffFactor","fuzzFactor","stallTimeout","connectionTimeout","KEEP","RESET","RESET_TO_ENCRYPTED","notAbortable","failed","$j","Metadata","uris","allowCrossSiteCredentials","licenseRequestType","streamDataCallback","requestStartTime","packetNumber","timeToFirstByte","minBytesForProgressEvents","timeMs","fromCache","defaultRetryParameters","clearCommonAccessTokenMap","clearAllResponseFilters","unregisterResponseFilter","clearAllRequestFilters","unregisterRequestFilter","unregisterScheme","registerScheme","setForceHTTPS","setForceHTTP","NumBytesRemainingClass","PendingRequest","SEGMENT","APP","TIMING","SERVER_CERTIFICATE","CONTENT_STEERING","AdvancedRequestType","INIT_SEGMENT","MEDIA_SEGMENT","MEDIA_PLAYLIST","MASTER_PLAYLIST","MPD","MPD_PATCH","MEDIATAILOR_SESSION_INFO","MEDIATAILOR_TRACKING_INFO","MEDIATAILOR_STATIC_RESOURCE","MEDIATAILOR_TRACKING_EVENT","INTERSTITIAL_ASSET_LIST","INTERSTITIAL_AD_URL","getLength","getUint8","getUint32","getInt32","readTerminatedString","rewind","readBytes","readUint64","readInt32","readUint32","readUint16","readUint8","hasMoreData","reader","partialOkay","has64BitSize","Endianness","BIG_ENDIAN","LITTLE_ENDIAN","headerSize","typeToString","allData","audioSampleEntry","visualSampleEntry","sampleDescription","parseNext","fullBox","setUint32","onExpirationUpdated","setMediaKeys","persistentSessionsMetadata","clearKeys","keySystemsMapping","defaultAudioRobustnessForWidevine","defaultVideoRobustnessForWidevine","preferredKeySystems","ignoreDuplicateInitData","createSession","delayLicenseRequestUntilPlayed","logLicenseExchange","generateRequest","systemCode","createMediaKeys","minHdcpVersion","getStatusForPolicy","isPreload","setServerCertificate","persistentSessionOnlinePlayback","individualizationServer","keyStatuses","updateExpirationTime","remote","parseInbandPsshEnabled","RELOAD","SMOOTH","dontChooseCodecs","preferredVideoCodecs","preferredAudioCodecs","preferredDecodingAttributes","preferredTextFormats","hasAppRestrictions","missingKeys","restrictedKeyStatuses","unregisterParserByMime","registerParserByMime","registerParserByExtension","AccessibilityPurpose","timescale","aesKey","timestampOffset","appendWindowStart","appendWindowEnd","thumbnailSprite","getEndByte","getStartByte","getStartTime","getSegmentData","setSegmentData","syncAgainst","getThumbnailSprite","setThumbnailSprite","hasByterangeOptimization","markAsByterangeOptimization","isLastPartial","markAsLastPartial","isPartial","markAsPartial","isIndependent","markAsNonIndependent","markAsPreload","markAsUnavailable","getTileDuration","getTilesLayout","getEndTime","getUris","pictureType","trackId","baseMediaDecodeTime","codec","packetLength","dts","nalus","Status","removeAllChildren","getID3Data","getID3Frames","clearData","fullData","getMetadata","cueTime","syncOffset","getVideoInfo","getVideoResolution","getVideoNalus","getCodecs","getVideoData","getAudioData","parseNalus","parseAvcNalus","Timescale","disableRemotePlayback","revokeObjectURL","createSegmentIndex","getNumReferences","forceTransmux","addExtraFeaturesToSourceBuffer","addSourceBuffer","modifyCueCallback","setSequenceMode","setManifestType","parseInit","periodStart","vttOffset","parseMedia","getOriginalMimeType","onMetadata","emsgSchemeIdUris","dispatchAllEmsgBoxes","schemeIdUri","presentationTimeDelta","eventDuration","wallClockTime","programStartDate","cue","transmux","insertFakeEncryptionInInit","codecSwitchingStrategy","ready","removeSourceBuffer","sourceBuffers","isAudioMuxedInVideo","endOfStream","stallEnabled","stallSkip","stallThreshold","gapJumpTimerTime","seeking","gapDetectionThreshold","gapPadding","HTMLMediaElement","HAVE_NOTHING","getAvailabilityTimeOffset","setAvailabilityTimeOffset","usingPresentationStartTime","getSeekRangeEnd","getSeekRangeStart","getSafeSeekRangeStart","getSegmentAvailabilityEnd","setUserSeekStart","getSegmentAvailabilityStart","isInProgress","notifyMaxSegmentDuration","notifyMinSegmentStartTime","getInitialProgramDateTime","setInitialProgramDateTime","isStartTimeLocked","lockStartTime","getMaxSegmentEndTime","notifyPeriodDuration","notifySegments","notifyTimeRange","setDelay","getSegmentAvailabilityDuration","setSegmentAvailabilityDuration","setStatic","setClockOffset","getPresentationStartTime","setPresentationStartTime","getMaxSegmentDuration","HAVE_METADATA","HAVE_CURRENT_DATA","HAVE_FUTURE_DATA","HAVE_ENOUGH_DATA","jl","durationBackoff","safeSeekOffset","safeSeekEndOffset","wl","xl","yl","Cl","Dl","El","Fl","Gl","Hl","Il","Jl","Kl","Ll","Ml","Nl","Ol","Pl","Ql","Rl","Tl","closedCaptions","Ul","Vl","Wl","Yl","fetchKey","firstMediaSequenceNumber","blockCipherMode","Zl","Range","$l","am","projection","hfov","lm","om","Sl","sequenceMode","closeSegmentIndex","im","qm","rm","jm","isTextVisible","alwaysStreamText","hm","dm","disableVideoPrefetch","disableAudioPrefetch","disableTextPrefetch","segmentPrefetchLimit","um","vm","pm","wm","ym","updateIntervalSeconds","inaccurateManifestTolerance","zm","crossBoundaryStrategy","Am","Jm","Gm","Km","Dm","ReadableStream","lowLatencyMode","isLowLatency","Em","Fm","maxDisabledTime","disableStream","avoidEvictionOnQuotaExceededError","Im","Hm","Bm","Cm","xm","shouldFixTimestampOffset","evictionGoal","minTimeBetweenRecoveries","allowMediaSourceRecoveries","Lm","Mm","Nm","Om","Pm","isEqualNode","Qm","Rm","Sm","Tm","Um","Vm","saveData","shakaMediaKeysPolyfill","availabilityWindowOverride","disableAudio","disableVideo","disableText","disableThumbnails","disableIFrames","defaultPresentationDelay","segmentRelativeVttTiming","raiseFatalErrorOnManifestUpdateRequestFailure","continueLoadingWhenPaused","ignoreSupplementalCodecs","updatePeriod","ignoreDrmInfo","clockSyncUri","disableXlinkProcessing","xlinkFailGracefully","ignoreMinBufferTime","autoCorrectDrift","initialSegmentLimit","ignoreSuggestedPresentationDelay","ignoreEmptyAdaptationSet","ignoreMaxSegmentDuration","keySystemsByURI","manifestPreprocessor","gn","manifestPreprocessorTXml","hn","multiTypeVariantsAllowed","useStreamOnceInPeriodFlattening","enableFastSwitching","hls","ignoreImageStreamFailures","defaultAudioCodec","defaultVideoCodec","ignoreManifestProgramDateTime","ignoreManifestProgramDateTimeForTypes","mediaPlaylistFullMimeType","liveSegmentsDelay","ignoreManifestTimestampsInSegmentsMode","disableCodecGuessing","disableClosedCaptionsDetection","allowLowLatencyByteRangeOptimization","allowRangeRequestsToGuessMimeType","mss","keySystemsBySystemId","startAtSegmentBoundary","useNativeHlsForFairPlay","forceHTTP","forceHTTPS","preferNativeDash","preferNativeHls","observeQualityChanges","prefetchAudioLanguages","liveSync","targetLatency","targetLatencyTolerance","maxPlaybackRate","minPlaybackRate","panicMode","panicThreshold","dynamicTargetLatency","stabilityThreshold","rebufferIncrement","maxLatency","minLatency","vodDynamicPlaybackRate","vodDynamicPlaybackRateLowBufferRate","vodDynamicPlaybackRateBufferRatio","preloadNextUrlWindow","loadTimeout","clearDecodingCache","downloadSizeCallback","estimate","usePersistentLicense","numberOfParallelDownloads","manifest","mediaSource","abrFactory","adaptationSetCriteriaFactory","abr","preferredAudioLabel","preferredVariantRole","preferredTextRole","preferredAudioChannelCount","preferredVideoHdrLevel","preferredVideoLayout","preferredVideoLabel","preferForcedSubs","preferSpatialAudio","playRangeStart","playRangeEnd","textDisplayer","captionsUpdatePeriod","fontScaleFactor","textDisplayFactory","cmcd","rtpSafetyFactor","useHeaders","includeKeys","cmsd","applyMaximumSuggestedBitrate","estimatedThroughputWeightRatio","lcevc","dynamicPerformanceScaling","drawLogo","ads","customPlayheadTracker","skipPlayDetection","supportsMultipleMediaElements","disableHLSInterstitial","disableDASHInterstitial","allowPreloadOnDomElements","ignoreHardwareResolution","matchMedia","jn","kn","nn","pn","qn","fromAdaptation","sn","networkingEngine","tn","vn","Bn","En","Cn","Gn","Hn","In","Jn","Kn","Ln","getNumEvicted","forSingleSegment","getIteratorForTime","updateEvery","evict","mergeAndEvict","markImmutable","resetToLastIndependent","setReverse","forEachTopLevelReference","em","updateDuration","gm","getDifferenceFromConfigObjects","convertToConfigObject","mergeConfigObjects","commonFairPlayResponse","originalRequest","CkcMessage","License","muxFairPlayRequest","expressplayFairPlayRequest","conaxFairPlayRequest","ezdrmFairPlayRequest","verimatrixFairPlayRequest","muxInitDataTransform","expressplayInitDataTransform","conaxInitDataTransform","ezdrmInitDataTransform","verimatrixInitDataTransform","defaultGetContentId","isFairPlaySupported","Wm","Xm","Ym","Zm","bn","cn","dn","createDefaultForLL","createDefault","Fn","An","Dn","waitForFinish","getPrefetchedTextTrack","getPrefetchedVariantTrack","Mn","Nn","On","Pn","reduceRight","Qn","VTTCue","snapToLines","ho","jo","addTextTrack","io","cues","removeCue","ko","flexDirection","alignItems","justifyContent","mo","no","qo","whiteSpace","webkitTextStrokeColor","webkitTextStrokeWidth","backgroundRepeat","backgroundSize","backgroundPosition","uo","cssFloat","webkitWritingMode","ro","wo","Ho","cid","mtp","No","Oo","Jo","bs","su","Fo","ltc","msd","Po","nor","nrr","rtp","Lo","Qo","Mo","Wo","getCurrentTime","addCue","setTextVisibility","setTextLanguage","enableTextDisplayer","xo","Ko","Io","So","Uo","Ao","Bo","Co","Yo","OTHER","Zo","$o","ap","bp","getRoundTripTime","getResponseDelay","getEstimatedThroughput","getMaxBitrate","dp","fp","gp","hp","jp","saveLivePosition","kp","lp","mp","qp","rp","sp","Ep","Fp","zp","yp","Gp","makeTextStreamsForClosedCaptions","Hp","onTimelineRegionAdded","isLowLatencyMode","newDrmInfo","onManifestUpdated","onHLSInterstitialMetadata","Ip","addFont","Jp","onDashTimedMetadata","onDASHInterstitialMetadata","Kp","quality","Lp","Mp","Np","wp","Op","onHlsTimedMetadata","emsg","Pp","Qp","Rp","Sp","activeCues","onCueMetadataChange","mq","Tp","nq","Ro","Vo","Xo","banLocation","$p","pq","xp","oq","iq","qq","pp","vp","dq","Vp","sq","rq","tq","sprite","kq","hq","yq","zq","Aq","Bq","Cq","srclang","vo","serviceDescription","fq","Wp","setLevelSwitching","setContainerFormat","setStreamingFormat","Dq","Eq","Fq","vq","Gq","uq","bq","cq","eventElement","eventNode","up","msExtendedCode","xq","wq","onAssetUnload","Ap","xn","Bp","yn","wn","zn","defaultPlaybackRate","zl","Bl","Al","Xp","onInitialVariantChosen","zo","Eo","fm","Yp","Zp","aq","nextUrl","Cp","un","gq","webkitSupportsFullscreen","webkitPresentationMode","Go","jq","lq","Dp","forceTransmuxTS","useNativeHlsOnSafari","liveSyncMinLatency","liveSyncMaxLatency","liveSyncTargetLatency","liveSyncTargetLatencyTolerance","liveSyncPlaybackRate","liveSyncMinPlaybackRate","liveSyncPanicMode","liveSyncPanicThreshold","sourceBufferExtraFeatures","useSafariBehaviorForLive","parsePrftBox","enableAudioGroups","seekable","getAudioTracks","currentSrc","km","getStartDate","streamBandwidth","manifestSizeBytes","bytesDownloaded","nonFatalErrorCount","manifestPeriodCount","manifestGapCount","switchHistory","stateHistory","getVideoPlaybackQuality","totalVideoFrames","droppedVideoFrames","corruptedVideoFrames","periodCount","gapCount","getCuePoints","FontFace","isEnded","isRemotePlayback","getFetchedPlaybackInfo","getManifestParserFactory","retryStreaming","setMaxHardwareResolution","addChaptersTrack","addThumbnailsTrack","getPresentationStartTimeAsDate","getChapters","getChaptersTracks","isTextTrackVisible","selectVariantsByLabel","selectTextLanguage","getTextLanguages","getAudioLanguages","getTextLanguagesAndRoles","selectAudioTrack","selectVariantTrack","getThumbnails","getAllThumbnails","getImageTracks","cancelTrickPlay","trickPlay","getPlaybackRate","getKeyStatuses","getActiveSessionsMetadata","getExpiration","isFullyLoaded","isAudioOnly","getAdManager","getAssetUri","getMediaElement","getManifestType","getLoadMode","resetConfiguration","getNonDefaultConfiguration","getConfigurationForLowLatency","configurationForLowLatency","releaseAllMutexes","destroyAllPreloads","detachAndSavePreload","unloadAndSavePreload","unload","attachCanvas","probeSupport","MediaKeys","MediaKeySystemAccess","encryptionSchemes","videoRobustnessLevels","audioRobustnessLevels","minHdcpVersions","media","hardwareResolution","setAdManagerFactory","registerSupportPlugin","LoadMode","DESTROYED","NOT_LOADED","MEDIA_SOURCE","SRC_EQUALS","Hq","Iq","Jq","Kq","google","ima","AdEvent","Type","PAUSED","RESUMED","Lq","Mq","Nq","creativeType","minSuggestedDuration","isSkippable","skipOffset","skipFor","canJump","resumeOffset","playoutLimit","timelineRange","overlay","displayOnBackground","currentVideo","skipoffset","delivery","apiFramework","Oq","setLocale","setDisableCustomPlaybackForIOS10Plus","AdDisplayContainer","AdsLoader","getSettings","setPlayerType","setPlayerVersion","AdsRenderingSettings","AdsManagerLoadedEvent","ADS_MANAGER_LOADED","getAdsManager","setMuted","AdErrorEvent","AD_ERROR","Qq","CONTENT_PAUSE_REQUESTED","Uq","STARTED","FIRST_QUARTILE","MIDPOINT","THIRD_QUARTILE","COMPLETE","CONTENT_RESUME_REQUESTED","Rq","ALL_ADS_COMPLETED","SKIPPED","VOLUME_CHANGED","VOLUME_MUTED","SKIPPABLE_STATE_CHANGED","CLICK","AD_PROGRESS","AD_BUFFERING","IMPRESSION","DURATION_CHANGE","USER_CLOSE","LOADED","LINEAR_CHANGED","AD_METADATA","LOG","AD_BREAK_READY","INTERACTION","Sq","Tq","ViewMode","FULLSCREEN","Pq","contentComplete","getError","webkitDisplayingFullscreen","getAd","isLinear","Vq","Wq","Xq","Yq","Zq","$q","cr","cancelVideoFrameCallback","mr","ASSETS","URI","jr","kr","requestVideoFrameCallback","objectFit","canSkipNow","getRemainingTime","as","qr","rr","vr","staticResource","xr","apps","adId","adParameters","adSystem","adTitle","creativeAdId","creativeId","creativeSequence","zr","yr","Ar","Br","nonLinearAdsList","nonLinearAdList","getPositionInSequence","getSequenceLength","trackingEvents","adBreakTrackingEvents","beaconUrls","Cr","Dr","dai","api","UiSettings","StreamManager","StreamEvent","getStreamData","streamTimeForContentTime","previousCuePointForStreamTime","played","Er","AD_BREAK_STARTED","AD_BREAK_ENDED","adProgressData","CUEPOINTS_CHANGED","cuepoints","Fr","Gr","__type__","contents","TimeRanges","Hr","Ir","needsSkipUI","isClientRendering","hasCustomClick","isUsingAnotherMediaElement","getMinSuggestedDuration","getSkipTimeOffset","getTimeUntilSkippable","getAdSkippableState","getAdPodInfo","getTotalAds","getAdPosition","getDescription","getVastMediaBitrate","getVastMediaHeight","getVastMediaWidth","getAdId","getCreativeAdId","getAdvertiserName","getMediaUrl","getTimeOffset","getPodIndex","ADS_LOADED","AD_STARTED","AD_FIRST_QUARTILE","AD_MIDPOINT","AD_THIRD_QUARTILE","AD_COMPLETE","AD_STOPPED","AD_SKIPPED","AD_VOLUME_CHANGED","AD_MUTED","AD_PAUSED","AD_RESUMED","AD_SKIP_STATE_CHANGED","IMA_AD_MANAGER_LOADED","IMA_STREAM_MANAGER_LOADED","AD_CLICKED","AD_IMPRESSION","AD_DURATION_CHANGED","AD_CLOSED","AD_LOADED","AD_LINEAR_CHANGED","AD_RECOVERABLE_ERROR","AD_INTERACTION","AD_CONTENT_PAUSE_REQUESTED","AD_CONTENT_RESUME_REQUESTED","AD_CONTENT_ATTACH_REQUESTED","addAdUrlInterstitial","timeOffset","avails","wr","onTimedMetadata","initInterstitial","initClientSide","requestClientSideAds","requestAds","updateClientSideAdsRenderingSettings","updateAdsRenderingSettings","initMediaTailor","requestMediaTailorStream","ur","addMediaTailorTrackingUrl","initServerSide","requestServerSideStream","adTagParameters","mpt","mpv","LiveStreamRequest","requestStream","replaceServerSideAdTagParameters","replaceAdTagParameters","getServerSideCuePoints","loadTimes","averageLoadTime","overlayAds","playedCompletely","skipped","processMetadata","lr","addCustomInterstitial","getInterstitialPlayer","Jr","Kr","Lr","Mr","Nr","Or","Pr","Qr","Rr","Sr","Tr","Ur","Vr","Wr","$r","Yr","addUpdateListener","addMessageListener","es","initState","appData","Zr","removeUpdateListener","removeMessageListener","Xr","friendlyName","sendMessage","SessionRequest","ApiConfig","SessionStatus","STOPPED","__onGCastApiAvailable","cs","ds","requestSession","hs","js","qs","rs","playerAfterLoad","ts","CastReceiverManager","onSenderConnected","vs","onSenderDisconnected","onSystemVolumeChanged","getSystemVolume","ws","getCastMessageBus","onMessage","Ds","Gs","requestId","xs","Es","setSystemVolumeLevel","setSystemVolumeMuted","senderId","Hs","ys","zs","As","Bs","us","getSenders","Cs","Fs","getCastChannel","broadcast","mediaSessionId","Is","Js","Ks","supportedMediaCommands","changeReceiverId","forceDisconnect","suggestDisconnect","setAppData","receiverName","canCast","getPlayer","getVideo","metadataType","MetadataType","GENERIC","MUSIC_TRACK","setContentArtist","setContentImage","setContentTitle","clearContentMetadata","setContentMetadata","isIdle","Ms","Ns","Os","Ps","Qs","Rs","Ss","Ts","Us","Vs","Ws","Xs","Ys","Zs","jt","qt","Ct","Gt","Ht","Pt","Qt","IV","keyUriTemplate","licenseUrl","Lic_type","bu","cu","timeline","du","ga","fu","eu","gu","hu","iu","ju","ku","mu","log2","nu","pu","qu","ru","tu","xu","vu","uu","wu","getFloat32","getFloat64","ou","yu","zu","indexRange","Cu","Au","Bu","Du","Eu","Fu","Gu","Hu","BigInt","Iu","Ju","Ku","Lu","Mu","Nu","Ou","Pu","Qu","VERSION","TTL","Ru","Su","Tu","Uu","Vu","audioStreams","Wu","videoStreams","Xu","Yu","Zu","dv","av","fv","gv","variantIds","matchedStreams","mv","nv","hv","jv","kv","bv","cv","ov","qv","rv","sv","tv","uv","vv","wv","xv","yv","zv","Av","Bv","Cv","setUseStreamOnce","setAllowMultiTypeVariants","combinePeriods","deleteStream","getImageStreams","getTextStreams","getVariants","Fv","DOMParser","Ev","parseFromString","createNodeIterator","NodeFilter","SHOW_ALL","nextNode","SVGElement","Dv","trustedTypes","createPolicy","createHTML","Gv","profiles","Hv","Yv","$v","originalUri","outerHTML","mpdId","kw","lw","mw","fw","cw","dw","serviceLocation","defaultServiceLocation","ew","gw","hw","scheme","Bw","iw","jw","ow","pw","rw","tw","uw","supplementalId","xw","bitsKey","yw","vw","dependencyId","queryTemplate","Zv","sar","zw","Aw","Cw","Dw","Ew","Fw","ISOBoxer","Allowed","Gw","Hw","Iw","Jw","Kw","Mw","Nw","Ow","Pw","Qw","Rw","Sw","Tw","Uw","Vw","Ww","Xw","Yw","Zw","$w","dx","nx","hx","fx","ux","vx","wx","mx","Px","Qx","Vx","Sx","Yx","Rx","fy","dy","ey","Xx","yx","Ix","Jx","gy","Kx","hy","jx","xx","lx","my","iy","Mx","Nx","Ox","Lx","Ux","Tx","jy","ky","Zx","ly","ny","Xl","zx","Ax","Bx","Cx","Dx","Ex","Fx","Gx","Wx","Hx","gx","kx","uy","vy","wy","yy","zy","Ay","By","Cy","Dy","Ey","Fy","Gy","Hy","Iy","Jy","Ky","Ly","My","Ny","Oy","Py","Qy","Ry","Sy","Ty","Uy","Vy","Wy","Xy","Yy","Zy","SystemID","mssPrivateData","codecPrivateData","Subtype","FourCC","cz","CodecPrivateData","dz","ez","fz","Url","hz","iz","jz","kz","lz","nz","oz","mz","onabort","uz","onprogress","lengthComputable","vz","wz","xz","yz","zz","Az","Bz","Cz","Ez","Fz","Gz","Iz","objectStore","oncomplete","Jz","openCursor","onsuccess","continue","Kz","Lz","Mz","Nz","Oz","Pz","Qz","Sz","Tz","Vz","getCells","hasFixedKeySpace","Xz","Uz","addSegments","removeSegments","getSegments","addManifests","updateManifest","updateManifestExpiration","put","removeManifests","getManifests","getAllManifests","getAll","bA","cA","dA","initSegmentUri","fA","presentationTimeOffset","initSegmentKey","eA","gA","hA","iA","jA","lA","mA","nA","oA","qA","pA","sessionIds","sA","rA","tA","uA","vA","wA","xA","yA","licenseUri","zA","CA","BA","isIncomplete","DA","EA","FA","GA","HA","IA","UA","XA","pendingSegmentRefId","pendingInitSegmentRefId","VA","WA","TA","eB","cB","getEmeSessionCell","Zz","fB","dB","gB","kB","mB","nB","NA","LA","jB","creationTime","Rz","indexedDB","objectStoreNames","onupgradeneeded","createObjectStore","autoIncrement","erase","deleteDatabase","onblocked","kA","MA","lB","OA","PA","mime","YA","QA","AA","Dz","ZA","$A","RA","Hz","SA","JA","KA","bB","Yz","hB","Wz","iB","deleteAll","$z","removeEmeSessions","oB","pB","qB","rB","sB","tB","uB","vB","wB","xB","yB","Document","mozRequestFullScreen","msRequestFullscreen","webkitRequestFullscreen","mozCancelFullScreen","msExitFullscreen","webkitCancelFullScreen","mozFullScreenElement","msFullscreenElement","webkitCurrentFullScreenElement","webkitFullscreenElement","mozFullScreenEnabled","msFullscreenEnabled","webkitFullscreenEnabled","zB","initEvent","AB","BB","CB","DB","HB","GB","EB","FB","Aria","EncryptionScheme","Fullscreen","MediaCapabilities","originalMcap","VB","WB","XB","YB","ZB","$B","IB","JB","KB","LB","MB","NB","OB","PB","QB","unlock","TB","SB","UB","aC","HTMLVideoElement","bC","cC","dC","eC","fC","gC","hC","NOT_SUPPORTED_ERR","webkitSetMediaKeys","iC","jC","kC","Orientation","lockOrientation","mozLockOrientation","msLockOrientation","unlockOrientation","mozUnlockOrientation","msUnlockOrientation","WebKitMediaKeyError","MEDIA_KEYERR_OUTPUT","MEDIA_KEYERR_HARDWARECHANGE","lC","mC","nC","oC","pC","webkitGenerateKeyRequest","qC","generateKeyRequest","rC","sC","tC","uC","vC","wC","xC","yC","MediaKeyError","zC","AC","BC","CC","DC","PatchedMediaKeysCert","PatchedMediaKeysWebkit","EC","FC","requestPictureInPicture","exitPictureInPicture","webkitSupportsPresentationMode","pictureInPictureEnabled","GC","HC","IC","JC","KC","webkitSetPresentationMode","LC","MC","NC","OC","PC","QC","RC","SC","TC","UC","VC","webkitDroppedFrameCount","webkitDecodedFrameCount","totalFrameDelay","WC","XC","TextTrackCue","YC","ZC","$C","PiPWebkit","RandomUUID","VideoPlayPromise","VideoPlaybackQuality","aD","bD","cD","iD","jD","kD","begin","dur","lD","mD","sD","tD","uD","rD","vD","wD","imageType","imagetype","qD","xD","yD","nD","hD","oD","pD","eD","zD","AD","BD","CD","ED","FD","GD","fD","dD","gD","ID","JD","KD","LD","MD","ND","OD","PD","QD","RD","XD","Fontname","Fontsize","PrimaryColour","YD","BackColour","Bold","Italic","Underline","Spacing","Alignment","AlphaLevel","WD","ZD","srt2webvtt","TD","UD","VD","End","Style","aE","bE","dE","eE","fE","gE","hE","iE","kE","mE","nE","oE","pE","qE","rE","sE","tE","uE","vE","wE","xE","yE","zE","AE","_procFullBox","_procField","_procFieldArray","_procEntries","sample_count","_procEntryField","_procSubEntries","NumberOfEntries","addBoxProcessor","entry_count","default_sample_info_size","usertype","CE","BE","parseBuffer","track_ID","createFullBox","_parent","sample_info_size","data_offset","write","EE","FE","GE","isKeyframe","lE","jE","cE","Iv","Jv","$E","Kv","Rn","Lv","Sn","Tn","Un","aF","Mv","Vn","Nv","Wn","Xn","Yn","bF","Ov","Pv","Zn","$n","Qv","cF","Rv","Sv","Tv","Uv","bo","dF","eF","Vv","fF","Wv","gF","Xv","hF","JE","TE","HE","IE","KE","emeEncryptionSchemePolyfilled","LE","assert","ME","NE","OE","PE","QE","RE","SE","UE","mediaCapabilitiesEncryptionSchemePolyfilled","VE","WE","XE","YE","ZE","iF","jF","kF","lF","mF","exportTo","innerGlobal","getOppositeMode","getThemedImageFromVariant","windowName","cleanLanguage","Locale","langDic","languageList","cleanedLanguages","HTMLMetaElement","_Localizer","_helper","_i18nextXhrBackend","_interopRequireDefault","_i18next","_reactI18next","checkUpdatePageTitle","file","initReactI18next","supportedLanguages","appLanguages","cleanLanguageList","allStrings","localizedString","_messenger","_messengerEvents","LOG_OUT","_Messenger","replaceUnderscoreByNbsp","_error","timeOutCallback","hasTimedOut","_defineProperties","addQueryString","ajax","queryStringParams","ActiveXObject","crossDomain","overrideMimeType","getDefaults","loadPath","addPath","allowMultiLoading","parsePayload","Backend","_classCallCheck","loadUrl","isCallable","tryToString","$TypeError","argument","wellKnownSymbol","UNSCOPABLES","ArrayPrototype","$String","toIndexedObject","toAbsoluteIndex","lengthOfArrayLike","createMethod","IS_INCLUDES","$this","fromIndex","uncurryThis","stringSlice","hasOwn","getOwnPropertyDescriptorModule","definePropertyModule","DESCRIPTORS","createPropertyDescriptor","bitmap","makeBuiltIn","defineGlobalProperty","simple","unsafe","nonConfigurable","nonWritable","fails","EXISTS","Deno","versions","v8","createNonEnumerableProperty","defineBuiltIn","copyConstructorProperties","targetProperty","sourceProperty","TARGET","GLOBAL","STATIC","stat","dontCallGetSet","sham","NATIVE_BIND","FunctionPrototype","PROPER","CONFIGURABLE","uncurryThisWithBind","aCallable","isNullOrUndefined","toObject","getBuiltIn","classof","$Object","propertyIsEnumerable","functionToString","inspectSource","NATIVE_WEAK_MAP","sharedKey","hiddenKeys","OBJECT_ALREADY_INITIALIZED","facade","enforce","getterFor","TYPE","documentAll","replacement","POLYFILL","NATIVE","USE_SYMBOL_AS_UID","$Symbol","toLength","CONFIGURABLE_FUNCTION_NAME","InternalStateModule","enforceInternalState","getInternalState","CONFIGURABLE_LENGTH","TEMPLATE","setter","arity","activeXDocument","anObject","definePropertiesModule","enumBugKeys","documentCreateElement","PROTOTYPE","SCRIPT","IE_PROTO","EmptyConstructor","scriptTag","NullProtoObjectViaActiveX","NullProtoObject","iframeDocument","iframe","JS","NullProtoObjectViaIFrame","Properties","V8_PROTOTYPE_DEFINE_BUG","objectKeys","IE8_DOM_DEFINE","$defineProperty","$getOwnPropertyDescriptor","ENUMERABLE","WRITABLE","Attributes","propertyIsEnumerableModule","internalObjectKeys","$propertyIsEnumerable","NASHORN_BUG","pref","getOwnPropertyNamesModule","getOwnPropertySymbolsModule","IS_PURE","SHARED","copyright","V8_VERSION","toIntegerOrInfinity","integer","IndexedObject","requireObjectCoercible","getMethod","ordinaryToPrimitive","TO_PRIMITIVE","exoticToPrim","postfix","NATIVE_SYMBOL","WellKnownSymbolsStore","createWellKnownSymbol","withoutSetter","$includes","addToUnscopables","isPossiblePrototype","Prototype","NAME","Constructor","NATIVE_ARRAY_BUFFER","defineBuiltInAccessor","Int8Array","Int8ArrayPrototype","Uint8ClampedArrayPrototype","TypedArray","TypedArrayPrototype","ObjectPrototype","TO_STRING_TAG","TYPED_ARRAY_TAG","TYPED_ARRAY_CONSTRUCTOR","NATIVE_ARRAY_BUFFER_VIEWS","opera","TYPED_ARRAY_TAG_REQUIRED","TypedArrayConstructorsList","Int32Array","Float64Array","BigIntArrayConstructorsList","BigInt64Array","BigUint64Array","getTypedArrayConstructor","isTypedArray","klass","aTypedArray","aTypedArrayConstructor","exportTypedArrayMethod","ARRAY","TypedArrayConstructor","error2","exportTypedArrayStaticMethod","argumentsLength","arraySpeciesCreate","IS_MAP","IS_FILTER","IS_SOME","IS_EVERY","IS_FIND_INDEX","IS_FILTER_REJECT","NO_HOLES","callbackfn","specificCreate","boundFunction","filterReject","arraySlice","comparefn","middle","llength","rlength","lindex","rindex","isConstructor","SPECIES","$Array","originalArray","arraySpeciesConstructor","MapHelpers","iterate","mapHas","mapSet","resolverFunction","ITERATOR","SAFE_CLOSING","iteratorWithReturn","SKIP_CLOSING","ITERATION_SUPPORT","TO_STRING_TAG_SUPPORT","classofRaw","CORRECT_ARGUMENTS","tryGet","callee","adder","ENTRY","mapFn","mapping","nextItem","defineBuiltIns","anInstance","defineIterator","createIterResultObject","setSpecies","fastKey","setInternalState","internalStateGetterFor","getConstructor","CONSTRUCTOR_NAME","ADDER","iterable","AS_ENTRIES","getEntry","setStrong","ITERATOR_NAME","getInternalCollectionState","getInternalIteratorState","iterated","getWeakData","ArrayIterationModule","uncaughtFrozenStore","frozen","UncaughtFrozenStore","findUncaughtFrozen","InternalMetadataModule","checkCorrectnessOfIteration","setToStringTag","inheritIfRequired","IS_WEAK","NativeConstructor","NativePrototype","exported","fixMethod","uncurriedNativeMethod","HASNT_CHAINING","THROWS_ON_PRIMITIVES","ACCEPT_ITERABLES","BUGGY_ZERO","$instance","dummy","Node","primitives","objectsByIndex","initializer","IS_OBJECT","ENVIRONMENT","userAgentStartsWith","Bun","preventExtensions","Iterators","getIteratorMethod","usingIterator","iteratorMethod","getIteratorDirect","INVALID_SIZE","$RangeError","SetRecord","intSize","getIterator","numSize","Wrapper","NewTarget","NewTargetPrototype","getOwnPropertyNamesExternalModule","FREEZING","REQUIRED","METADATA","setMetadata","objectID","weakData","onFreeze","constructorRegExp","INCORRECT_TO_STRING","isConstructorModern","isConstructorLegacy","ITERATOR_INSTEAD_OF_RECORD","isArrayIteratorMethod","iteratorClose","Result","stopped","ResultPrototype","unboundFunction","iterFn","IS_RECORD","IS_ITERATOR","INTERRUPTED","callFn","innerError","IteratorPrototype","returnThis","IteratorConstructor","ENUMERABLE_NEXT","FunctionName","createIteratorConstructor","IteratorsCore","PROPER_FUNCTION_NAME","BUGGY_SAFARI_ITERATORS","VALUES","ENTRIES","Iterable","DEFAULT","IS_SET","FORCED","CurrentIteratorPrototype","methods","getIterationMethod","KIND","defaultIterator","IterablePrototype","INCORRECT_VALUES_NAME","nativeIterator","anyNativeIterator","PrototypeOfArrayIteratorPrototype","arrayIterator","MapPrototype","iterateSimple","interruptible","roundTiesToEven","FLOAT_EPSILON","FLOAT_MAX_VALUE","FLOAT_MIN_VALUE","absolute","floatRound","fround","INVERSE_EPSILON","inLow","inHigh","outLow","outHigh","nInLow","nInHigh","nOutLow","nOutHigh","PromiseCapability","$$resolve","$$reject","globalIsFinite","$getOwnPropertyNames","windowNames","getWindowNames","CORRECT_PROTOTYPE_GETTER","ARRAY_BUFFER_NON_EXTENSIBLE","$isExtensible","FAILS_ON_PRIMITIVES","uncurryThisAccessor","aPossiblePrototype","CORRECT_SETTER","getOrCreateMetadataMap","targetKey","targetMetadata","keyMetadata","getMap","MetadataKey","metadataMap","MetadataValue","toKey","hasIndices","ignoreCase","multiline","dotAll","unicode","unicodeSets","USER_AGENT","validateArgumentsLength","WRAP","scheduler","hasTimeArg","firstParamIndex","boundArgs","SetHelpers","aSet","getSetRecord","iterateSet","otherRec","SetPrototype","keysIter","TAG","CONVERT_TO_STRING","codeAt","$location","IS_IOS","IS_NODE","clearImmediate","Dispatch","ONREADYSTATECHANGE","run","runner","eventListener","globalPostMessageDefer","nextTick","importScripts","prim","toPositiveInteger","BYTES","isIterable","isSetLike","passed","required","WeakMapPrototype","WeakSetPrototype","wrappedWellKnownSymbolModule","collection","DOES_NOT_WORK_WITH_PRIMITIVES","groupBy","newPromiseCapabilityModule","perform","ACCEPT_ARGUMENTS","promiseCapability","regExpFlags","RegExpPrototype","INDICES_SUPPORT","calls","addGetter","chr","pairs","ArrayBufferViewCore","$fill","toBigInt","actualValue","toOffset","WORKS_WITH_OBJECTS_AND_GENERIC_ON_TYPED_ARRAYS","TO_OBJECT_BUG","arrayLike","internalSort","IE_OR_EDGE","V8","WEBKIT","nativeSort","ACCEPT_INCORRECT_ARGUMENTS","STABLE_SORT","getSortCompare","InternalWeakMap","collectionWeak","isFrozen","isSealed","IS_IE11","$WeakMap","nativeSet","nativeDelete","nativeHas","nativeGet","frozenArray","arrayIntegrityLevel","getCompositeKeyNode","compositeKey","compositeSymbol","aMap","real","wasDeleted","allDeleted","newMap","findKey","createCollectionFrom","sameValueZero","searchElement","keyBy","keyDerivative","keyOf","mapKeys","mapValues","createCollectionOf","noInitial","accumulator","isPresentInMap","aNumber","notANaN","sameValue","$min","$max","DEG_PER_RAD","fscale","iaddh","x0","y0","$x0","$y0","imulh","UINT16","isubh","numberIsFinite","SEEDED_RANDOM","SEEDED_RANDOM_GENERATOR","$SeededRandomGenerator","seededPRNG","signbit","umulh","INVALID_NUMBER_REPRESENTATION","$SyntaxError","$parseInt","numberToString","fromString","radix","mathNum","hostReportErrors","$$OBSERVABLE","OBSERVABLE","SUBSCRIPTION","SUBSCRIPTION_OBSERVER","getObservableInternalState","getSubscriptionInternalState","getSubscriptionObserverInternalState","SubscriptionState","subscriptionObserver","subscription","Subscription","subscriber","subscriptionState","SubscriptionObserver","nextMethod","errorMethod","completeMethod","$Observable","ObservablePrototype","Observable","observableMethod","ReflectMetadataModule","toMetadataKey","ordinaryDefineOwnMetadata","defineMetadata","metadataKey","metadataValue","deleteMetadata","arrayUniqueBy","ordinaryOwnMetadataKeys","ordinaryMetadataKeys","oKeys","pKeys","getMetadataKeys","ordinaryHasOwnMetadata","ordinaryGetOwnMetadata","ordinaryGetMetadata","getOwnMetadataKeys","getOwnMetadata","ordinaryHasMetadata","hasMetadata","hasOwnMetadata","addAll","toSetLike","$difference","difference","newSet","$intersection","$isDisjointFrom","isDisjointFrom","$isSubsetOf","isSubsetOf","$isSupersetOf","isSupersetOf","arrayJoin","$symmetricDifference","symmetricDifference","$union","relativeIndex","StringMultibyteModule","STRING_ITERATOR","$StringIterator","codePoints","defineWellKnownSymbol","aWeakMap","WeakMapHelpers","aWeakSet","WeakSetHelpers","setTask","schedulersFix","NOTHING","DRAFTABLE","DRAFT_STATE","die","isDraft","isDraftable","isMap","isSet","objectCtorString","Ctor","iter","getArchtype","type_","propOrOldValue","latest","copy_","base_","shallowCopy","strict","isPlain","getOwnPropertyDescriptors","desc","dontMutateFrozenCollections","pluginKey","loadPlugin","usePatchesInScope","patchListener","patches_","inversePatches_","patchListener_","revokeScope","leaveScope","drafts_","revokeDraft","parent_","enterScope","immer2","immer_","canAutoFreeze_","unfinalizedDrafts_","revoke_","revoked_","processResult","baseDraft","modified_","maybeFreeze","generateReplacementPatches_","rootScope","childValue","finalizeProperty","scope_","finalized_","resultEach","isSet2","generatePatches_","parentState","targetObject","rootPath","targetIsSet","assigned_","autoFreeze_","objectTraps","getDescriptorFromProto","draft_","readPropFromProto","peek","prepareCopy","createProxy","current2","markChanged","owner","arrayTraps","useStrictShallowCopy_","proxyMap_","proxySet_","isManual_","traps","revoke","revocable","createProxyProxy","currentImpl","DraftMap","assertUnrevoked","prepareMapCopy","DraftSet","prepareSetCopy","immer","recipe","defaultBase","base2","hasError","produceWithPatches","patches","inversePatches","autoFreeze","setAutoFreeze","useStrictShallowCopy","setUseStrictShallowCopy","createDraft","finishDraft","applyPatches","patch","applyPatchesImpl","applyPatches_","IS_REACT_19","REACT_ELEMENT_TYPE","REACT_PORTAL_TYPE","REACT_FRAGMENT_TYPE","REACT_STRICT_MODE_TYPE","REACT_PROFILER_TYPE","REACT_CONSUMER_TYPE","REACT_CONTEXT_TYPE","REACT_FORWARD_REF_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_MEMO_TYPE","REACT_LAZY_TYPE","ForwardRef","Memo","typeOf","pureFinalPropsSelectorFactory","mapStateToProps","mapDispatchToProps","mergeProps","ownProps","stateProps","dispatchProps","mergedProps","areStatesEqual","areOwnPropsEqual","areStatePropsEqual","hasRunAtLeastOnce","handleSubsequentCalls","nextOwnProps","propsChanged","stateChanged","dependsOnOwnProps","nextStateProps","statePropsChanged","handleNewState","wrapMapToPropsConstant","getConstant","constant","constantSelector","getDependsOnOwnProps","mapToProps","wrapMapToPropsFunc","stateOrDispatch","createInvalidArgFactory","wrappedComponentName","defaultMergeProps","defaultNoopBatch","nullListeners","createSubscription","parentSub","subscriptionsAmount","selfSubscribed","handleChangeWrapper","onStateChange","trySubscribe","addNestedSub","createListenerCollection","tryUnsubscribe","cleanupListener","notifyNestedSubs","getListeners","isDOM","canUseDOM","isReactNative","isRunningInReactNative","getUseIsomorphicLayoutEffect","shallowEqual","objA","objB","keysA","keysB","REACT_STATICS","getDefaultProps","mixins","KNOWN_STATICS","caller","MEMO_STATICS","TYPE_STATICS","getStatics","objectPrototype","hoistNonReactStatics","targetComponent","sourceComponent","inheritedComponent","targetStatics","sourceStatics","ContextKey","gT","contextMap","realContext","ReactReduxContext","NO_SUBSCRIPTION_ARRAY","captureWrapperProps","lastWrapperProps","lastChildProps","renderIsScheduled","wrapperProps","childPropsFromStoreUpdate","strictEqual","connect_default","pure","areMergedPropsEqual","Context","initMapStateToProps","mapStateToPropsFactory","initMapDispatchToProps","actionCreators","boundActionCreators","actionCreator","bindActionCreators","mapDispatchToPropsFactory","initMergeProps","hasRunOnce","nextMergedProps","wrapMergePropsFunc","mergePropsFactory","shouldHandleStateChanges","WrappedComponent","selectorFactoryOptions","ConnectFunction","propsContext","reactReduxForwardedRef","reactReduxForwardedRef2","wrapperProps2","ContextToUse","contextValue","didStoreComeFromProps","didStoreComeFromContext","getServerState","childPropsSelector","finalPropsSelectorFactory","subscription2","notifyNestedSubs2","overriddenContextValue","latestSubscriptionCallbackError","actualChildPropsSelector","subscribeForReact","reactListener","additionalSubscribeListener","didUnsubscribe","lastThrownError","checkForUpdates","latestStoreState","newChildProps","unsubscribeWrapper","subscribeUpdates","effectFunc","effectArgs","actualChildProps","renderedWrappedComponent","Connect","forwarded","Provider_default","providerProps","serverState","previousState","createReduxContextHook","useReduxContext","createStoreHook","useReduxContext2","useStore2","useStore","withTypes","createDispatchHook","useDispatch2","refEquality","createSelectorHook","useSelector2","equalityFnOrOptions","equalityFn","reduxContext","wrappedSelector","selectedState","voidElement","comment","alreadyWarned","warnOnce","loadedClb","getDisplayName","matchHtmlEntity","htmlEntities","unescapeHtmlEntity","bindI18n","bindI18nStore","transEmptyNodeValue","transSupportBasicHtmlNodes","transWrapTextNodes","transKeepBasicHtmlNodesFor","useSuspense","setDefaults","i18nInstance","setI18n","getI18n","hasChildren","checkLength","i18nIsDynamicList","getAsArray","nodesToString","i18nOptions","i18nKey","stringNode","childrenArray","keepArray","childIndex","childPropsCount","shouldKeepChild","childChildren","renderNodes","targetString","combinedTOpts","shouldUnescape","emptyChildrenButNeedsHandling","keep","childs","ast","HTML","renderInner","rootReactNode","mappedChildren","mapAST","hasValidReactChildren","pushTranslatedJSX","isVoid","reactNode","astNode","reactNodes","translationContent","newTarget","isValidTranslationWithChildren","isEmptyTransWithHTML","isKnownComponent","wrapTextNodes","fixComponentProps","componentKey","generateComponents","generateArrayComponents","generateObjectComponents","componentMap","Trans","tOptions","i18nFromProps","tFromProps","additionalProps","reactI18nextOptions","react","nodeAsString","hashTransKey","interpolationOverride","generatedComponents","useAsParent","defaultTransParent","ReportNamespaces","usedNamespaces","addUsedNamespaces","getUsedNamespaces","composeInitialProps","ForComponent","getInitialProps","reportNamespaces","initialI18nStore","initialLanguage","i18nFromContext","defaultNSFromContext","TransWithoutContext","alwaysNewT","useTranslation","notReadyT","optsOrDefaultValue","retNotReady","memoGetT","useMemoizedT","nsMode","getT","getNewT","setT","joinedNS","previousJoinedNS","usePrevious","boundReset","withTranslation","I18nextWithTranslation","forwardedRef","passDownProps","tReady","withRef","forwardRefReact","Translation","useSSR","lngResources","initializedLanguageOnce","withSSR","I18nextWithSSR","plural","selectOrdinal","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","amdO","leafPrototypes","getProto","chunkId","miniCssF","dataWebpackPrefix","needAttach","onScriptComplete","doneFns","loadStylesheet","fullhref","existingLinkTags","dataHref","existingStyleTags","findStylesheet","oldTag","linkTag","nonce","errorType","realHref","createStylesheet","installedCssChunks","miniCss","installedChunks","installedChunkData","realSrc","webpackJsonpCallback","parentChunkLoadingFunction","chunkIds","moreModules","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""}